@heyramzi/ui 2.11.0 → 2.11.2

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 (267) hide show
  1. package/dist/agents/helpers.js +38 -38
  2. package/dist/agents/page-state.js +49 -50
  3. package/dist/agents/vendor/color.js +146 -127
  4. package/dist/agents/vendor/draw.js +617 -508
  5. package/dist/agents/vendor/engine.js +698 -599
  6. package/dist/agents/vendor/mesh.js +653 -683
  7. package/dist/agents/vendor/plastic.js +3913 -3112
  8. package/dist/agents/vendor/presets.js +163 -164
  9. package/dist/agents/vendor/shapes.js +21 -20
  10. package/dist/agents/vendor/ticker.js +41 -42
  11. package/dist/agents/vendor/types.js +1 -0
  12. package/dist/agents/vendor/wear.js +1421 -1448
  13. package/dist/ai/confirmation/confirmation-context.svelte.js +6 -6
  14. package/dist/ai/confirmation/index.js +3 -1
  15. package/dist/ai/index.js +33 -0
  16. package/dist/ai/prompt-input/index.js +3 -1
  17. package/dist/ai/reasoning/index.js +3 -1
  18. package/dist/ai/reasoning/reasoning-context.svelte.js +6 -6
  19. package/dist/ai/suggestion/index.js +3 -1
  20. package/dist/ai/typing-dots/index.js +3 -1
  21. package/dist/animations/text-swap.js +24 -24
  22. package/dist/brand/index.js +54 -48
  23. package/dist/canvas/card/resize.js +5 -3
  24. package/dist/canvas/edges/edge-path.js +255 -242
  25. package/dist/canvas/editor/context-menu.js +39 -36
  26. package/dist/canvas/editor/dispatch.svelte.js +154 -151
  27. package/dist/canvas/editor/editor-context.js +7 -2
  28. package/dist/canvas/editor/editor-mode.js +1 -0
  29. package/dist/canvas/editor/frame.js +73 -76
  30. package/dist/canvas/editor/hand-context.js +5 -2
  31. package/dist/canvas/editor/history-core.js +163 -191
  32. package/dist/canvas/editor/keymap.js +95 -169
  33. package/dist/canvas/editor/layout-actions.js +143 -144
  34. package/dist/canvas/editor/lock.js +52 -51
  35. package/dist/canvas/editor/rebase.js +217 -240
  36. package/dist/canvas/editor/style.js +132 -137
  37. package/dist/canvas/editor/text-field-context.js +7 -2
  38. package/dist/canvas/editor/z-order.js +65 -70
  39. package/dist/canvas/headless/alignment.js +22 -16
  40. package/dist/canvas/headless/break-apart-find.js +286 -279
  41. package/dist/canvas/headless/break-apart-pieces.js +62 -58
  42. package/dist/canvas/headless/break-apart-plan.js +299 -325
  43. package/dist/canvas/headless/break-apart-style.js +75 -70
  44. package/dist/canvas/headless/break-apart.js +188 -181
  45. package/dist/canvas/headless/canvas-cleanup.js +78 -58
  46. package/dist/canvas/headless/edge-anchors.js +115 -116
  47. package/dist/canvas/headless/edge-memo.js +24 -22
  48. package/dist/canvas/headless/edge-serialization.js +17 -27
  49. package/dist/canvas/headless/figure-geometry.js +232 -264
  50. package/dist/canvas/headless/fit-viewport.js +84 -67
  51. package/dist/canvas/headless/grid.js +88 -86
  52. package/dist/canvas/headless/icon-node.js +44 -36
  53. package/dist/canvas/headless/index.js +1 -0
  54. package/dist/canvas/headless/linkify.js +17 -19
  55. package/dist/canvas/headless/pen-marks.js +101 -95
  56. package/dist/canvas/headless/sketch.js +231 -209
  57. package/dist/canvas/headless/snap-guides.js +99 -83
  58. package/dist/canvas/headless/svg-figure.js +133 -117
  59. package/dist/canvas/headless/table-layout.js +146 -107
  60. package/dist/canvas/index.js +2 -0
  61. package/dist/canvas/lod/lod-mode.svelte.js +20 -18
  62. package/dist/canvas/lod/render-all.svelte.js +36 -39
  63. package/dist/canvas/ops/arrange.js +78 -71
  64. package/dist/canvas/ops/ops.js +260 -255
  65. package/dist/canvas/pen/colors.js +37 -35
  66. package/dist/canvas/pen/eraser.js +28 -27
  67. package/dist/canvas/pen/geometry.js +120 -130
  68. package/dist/canvas/pen/index.js +1 -0
  69. package/dist/canvas/pen/ops.js +11 -11
  70. package/dist/canvas/pen/pen-session.js +150 -159
  71. package/dist/canvas/pen/plugin.js +107 -104
  72. package/dist/canvas/pen/shapes.js +73 -68
  73. package/dist/canvas/pen/stroke-path.js +32 -30
  74. package/dist/canvas/pen/types.js +21 -21
  75. package/dist/canvas/pen/ui.js +10 -8
  76. package/dist/canvas/plugin.js +46 -46
  77. package/dist/canvas/screen/glyphs.js +12 -11
  78. package/dist/canvas/screen/labels.js +22 -22
  79. package/dist/canvas/screen/parts.js +98 -111
  80. package/dist/canvas/screen/plugin.js +47 -56
  81. package/dist/canvas/screen/types.js +30 -35
  82. package/dist/canvas/screen/ui.js +7 -7
  83. package/dist/canvas/test-utils.js +14 -14
  84. package/dist/canvas/types.js +1 -0
  85. package/dist/canvas/ui/forward-wheel.js +24 -25
  86. package/dist/canvas/ui/icons.js +64 -131
  87. package/dist/canvas/ui/place-panel.js +58 -49
  88. package/dist/canvas/ui/shortcut-tip.js +14 -12
  89. package/dist/canvas/ui/tools.js +300 -385
  90. package/dist/charts/dashboard/chart.js +4 -0
  91. package/dist/charts/dashboard/data-table.js +11 -0
  92. package/dist/charts/dashboard/windows.js +8 -3
  93. package/dist/charts/edge-fade.js +10 -5
  94. package/dist/charts/hover-band.js +16 -11
  95. package/dist/charts/index.js +0 -1
  96. package/dist/charts/motion.js +11 -7
  97. package/dist/charts/primitives/chart-utils.js +12 -12
  98. package/dist/components/copy/clipboard.js +32 -32
  99. package/dist/components/copy/copied.svelte.js +31 -23
  100. package/dist/components/data-table/data-table.js +39 -39
  101. package/dist/components/docs/index.js +4 -0
  102. package/dist/components/docs/scroll-spy.svelte.js +73 -68
  103. package/dist/components/list-page/filter-section.js +4 -1
  104. package/dist/components/list-page/index.js +2 -0
  105. package/dist/components/list-page/list-table.js +7 -2
  106. package/dist/components/list-page/queue-rail.js +14 -0
  107. package/dist/components/list-page/section-host.js +4 -2
  108. package/dist/components/list-page/step.js +4 -3
  109. package/dist/components/list-page/types.js +1 -0
  110. package/dist/components/picker/trigger.js +48 -30
  111. package/dist/components/picker/types.js +1 -0
  112. package/dist/components/segmented/collapse.js +38 -27
  113. package/dist/components/segmented/index.js +8 -0
  114. package/dist/components/segmented/segmented.js +67 -42
  115. package/dist/components/star-rating-input/index.js +3 -1
  116. package/dist/components/table-view/types.js +1 -0
  117. package/dist/components/tags-input/tags.js +81 -69
  118. package/dist/components/theme/index.js +4 -0
  119. package/dist/components/toolbar/index.js +4 -0
  120. package/dist/components/toolbar/toolbar-trigger.js +14 -1
  121. package/dist/editor/anchors.js +17 -13
  122. package/dist/editor/block-id.js +52 -51
  123. package/dist/editor/block-ops.js +108 -80
  124. package/dist/editor/doc-blocks.js +155 -166
  125. package/dist/editor/extensions.js +139 -180
  126. package/dist/editor/index.js +4 -0
  127. package/dist/editor/markdown-test-helpers.js +4 -2
  128. package/dist/editor/markdown.js +420 -408
  129. package/dist/editor/serializer.js +204 -200
  130. package/dist/editor/slash-items.js +89 -101
  131. package/dist/editor/youtube-url.js +25 -20
  132. package/dist/effects/animated-beam/path-calculator.svelte.js +43 -38
  133. package/dist/effects/animated-beam/types.js +1 -0
  134. package/dist/effects/border-beam/css.js +92 -78
  135. package/dist/effects/border-beam/presets.js +1705 -1720
  136. package/dist/effects/border-beam/register-properties.js +43 -33
  137. package/dist/effects/border-beam/types.js +1 -0
  138. package/dist/effects/image-comparison/compare.js +3 -2
  139. package/dist/effects/image-reveal/types.js +1 -0
  140. package/dist/effects/magnetic/magnetic.js +58 -52
  141. package/dist/effects/reveal/observe.js +50 -40
  142. package/dist/effects/reveal/types.js +1 -0
  143. package/dist/effects/shader-gradient/color.js +36 -29
  144. package/dist/effects/shader-gradient/renderer.js +384 -295
  145. package/dist/effects/shader-gradient/shaders.js +31 -0
  146. package/dist/effects/shader-gradient/types.js +1 -0
  147. package/dist/icons/apple-symbol-exports.js +99 -124
  148. package/dist/icons/sf-symbols.js +357 -461
  149. package/dist/icons/trades.js +43 -28
  150. package/dist/inbox/index.js +1 -0
  151. package/dist/inbox/logic.js +126 -122
  152. package/dist/inbox/types.js +43 -43
  153. package/dist/lib/arrive.js +19 -12
  154. package/dist/lib/icon-types.js +1 -0
  155. package/dist/lib/initials.js +16 -10
  156. package/dist/lib/layout.js +5 -0
  157. package/dist/lib/panel.js +13 -0
  158. package/dist/lib/result.js +22 -22
  159. package/dist/lib/sliding-pill.js +59 -44
  160. package/dist/lib/theme-transition.js +43 -43
  161. package/dist/lib/tone.js +31 -24
  162. package/dist/lib/utils.js +3 -1
  163. package/dist/onboarding/define-tours.js +24 -23
  164. package/dist/onboarding/onboarding.svelte.js +16 -12
  165. package/dist/onboarding/pick.js +10 -6
  166. package/dist/onboarding/stores.js +40 -41
  167. package/dist/onboarding/wait.js +24 -23
  168. package/dist/panel/side-panel-types.js +1 -0
  169. package/dist/record/demo-data.js +459 -486
  170. package/dist/record/fields.js +129 -131
  171. package/dist/record/format.js +70 -82
  172. package/dist/record/gutter.js +1 -0
  173. package/dist/record/kinds.js +95 -105
  174. package/dist/record/logic.js +238 -219
  175. package/dist/record/types.js +49 -48
  176. package/dist/shadcn/accordion/index.js +3 -1
  177. package/dist/shadcn/alert/index.js +3 -1
  178. package/dist/shadcn/alert-dialog/index.js +3 -1
  179. package/dist/shadcn/attachment/index.js +3 -1
  180. package/dist/shadcn/avatar/index.js +3 -1
  181. package/dist/shadcn/breadcrumb/index.js +3 -1
  182. package/dist/shadcn/bubble/index.js +3 -1
  183. package/dist/shadcn/button/index.js +3 -1
  184. package/dist/shadcn/calendar/index.js +3 -1
  185. package/dist/shadcn/card/index.js +3 -1
  186. package/dist/shadcn/checkbox/index.js +3 -1
  187. package/dist/shadcn/code-block/index.js +3 -1
  188. package/dist/shadcn/collapsible/index.js +3 -1
  189. package/dist/shadcn/command/index.js +4 -1
  190. package/dist/shadcn/context-menu/index.js +3 -1
  191. package/dist/shadcn/dialog/index.js +3 -1
  192. package/dist/shadcn/dropdown-menu/menu-item.js +40 -20
  193. package/dist/shadcn/empty/index.js +3 -1
  194. package/dist/shadcn/field/index.js +3 -1
  195. package/dist/shadcn/hooks/highlighter.js +77 -75
  196. package/dist/shadcn/hooks/is-mobile.svelte.js +3 -3
  197. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +62 -62
  198. package/dist/shadcn/input/index.js +3 -1
  199. package/dist/shadcn/kbd/index.js +3 -1
  200. package/dist/shadcn/label/index.js +3 -1
  201. package/dist/shadcn/marker/index.js +3 -1
  202. package/dist/shadcn/message/index.js +3 -1
  203. package/dist/shadcn/message-scroller/index.js +3 -1
  204. package/dist/shadcn/popover/index.js +3 -1
  205. package/dist/shadcn/progress/index.js +3 -1
  206. package/dist/shadcn/progress/tone.js +8 -7
  207. package/dist/shadcn/radio-group/index.js +3 -1
  208. package/dist/shadcn/scroll-area/index.js +3 -1
  209. package/dist/shadcn/select/index.js +3 -1
  210. package/dist/shadcn/separator/index.js +3 -1
  211. package/dist/shadcn/sheet/index.js +3 -1
  212. package/dist/shadcn/sidebar/context.svelte.js +42 -28
  213. package/dist/shadcn/sidebar/index.js +3 -1
  214. package/dist/shadcn/skeleton/index.js +3 -1
  215. package/dist/shadcn/slider/index.js +3 -1
  216. package/dist/shadcn/switch/index.js +3 -1
  217. package/dist/shadcn/table/index.js +3 -1
  218. package/dist/shadcn/tabs/index.js +3 -1
  219. package/dist/shadcn/textarea/index.js +3 -1
  220. package/dist/shadcn/toggle/index.js +3 -1
  221. package/dist/shadcn/toggle-group/index.js +3 -1
  222. package/dist/shadcn/tooltip/context.js +7 -2
  223. package/dist/shadcn/tooltip/index.js +3 -1
  224. package/dist/shadcn/trace/index.js +3 -1
  225. package/dist/slides/bridges.js +65 -59
  226. package/dist/slides/deck-controller.svelte.js +210 -207
  227. package/dist/slides/export/capture.js +66 -71
  228. package/dist/slides/export/ffmpeg.js +76 -72
  229. package/dist/slides/export/index.js +3 -0
  230. package/dist/slides/export/launch.js +9 -6
  231. package/dist/slides/export/pdf.js +60 -54
  232. package/dist/slides/export/types.js +1 -0
  233. package/dist/slides/labels.js +24 -24
  234. package/dist/slides/layout.js +39 -41
  235. package/dist/slides/model.js +9 -7
  236. package/dist/slides/navigation.js +78 -73
  237. package/dist/slides/types.js +2 -2
  238. package/dist/status/define-statuses.js +18 -14
  239. package/dist/status/status-types.js +1 -0
  240. package/dist/test-setup.js +24 -20
  241. package/dist/thread/logic.js +73 -77
  242. package/dist/thread/types.js +21 -21
  243. package/dist/work/board-order.js +94 -90
  244. package/dist/work/dates.js +16 -9
  245. package/dist/work/detail/detail-types.js +18 -18
  246. package/dist/work/docs/edited.js +32 -29
  247. package/dist/work/docs/index.js +4 -0
  248. package/dist/work/docs/labels.js +34 -34
  249. package/dist/work/docs/menu.js +113 -106
  250. package/dist/work/docs/outline.js +39 -29
  251. package/dist/work/gantt/logic.js +211 -235
  252. package/dist/work/inbox/inbox-logic.js +71 -75
  253. package/dist/work/inbox/inbox-statuses.js +75 -72
  254. package/dist/work/inbox/inbox-types.js +1 -0
  255. package/dist/work/kanban-drag.js +27 -22
  256. package/dist/work/kanban-types.js +1 -0
  257. package/dist/work/presets/sales.js +36 -32
  258. package/dist/work/reorder.js +9 -8
  259. package/dist/work/task-types.js +1 -0
  260. package/dist/work/time/duration.js +51 -46
  261. package/dist/work/time/time-types.js +23 -23
  262. package/dist/work/use-kanban-dnd.svelte.js +126 -125
  263. package/package.json +3 -1
  264. package/src/components/list-page/master-detail.svelte +3 -1
  265. package/src/components/list-page/rail-row.svelte +4 -4
  266. package/src/components/tags-input/tags-input.svelte +2 -0
  267. package/src/editor/markdown.ts +30 -35
@@ -1,512 +1,485 @@
1
+ /** The demo's clock, so a screenshot reads the same on any day. */
1
2
  export const DEMO_NOW = new Date("2026-10-21T12:00:00Z");
2
3
  export const DEMO_TODAY = "2026-10-21";
3
4
  export const stages = [
4
- {
5
- key: "lead",
6
- label: "Lead",
7
- tone: "neutral",
8
- category: "open"
9
- },
10
- {
11
- key: "sent",
12
- label: "Proposal sent",
13
- tone: "info",
14
- category: "proposal"
15
- },
16
- {
17
- key: "build",
18
- label: "In build",
19
- tone: "accent",
20
- category: "ongoing"
21
- },
22
- {
23
- key: "paid",
24
- label: "Paid",
25
- tone: "success",
26
- category: "completed"
27
- },
28
- {
29
- key: "lost",
30
- label: "Lost",
31
- tone: "destructive",
32
- category: "lost"
33
- }
34
- ];
35
- export const stepGroups = [
36
- {
37
- key: "sales",
38
- label: "Sales"
39
- },
40
- {
41
- key: "delivery",
42
- label: "Delivery"
43
- }
5
+ {
6
+ key: "lead",
7
+ label: "Lead",
8
+ tone: "neutral",
9
+ category: "open"
10
+ },
11
+ {
12
+ key: "sent",
13
+ label: "Proposal sent",
14
+ tone: "info",
15
+ category: "proposal"
16
+ },
17
+ {
18
+ key: "build",
19
+ label: "In build",
20
+ tone: "accent",
21
+ category: "ongoing"
22
+ },
23
+ {
24
+ key: "paid",
25
+ label: "Paid",
26
+ tone: "success",
27
+ category: "completed"
28
+ },
29
+ {
30
+ key: "lost",
31
+ label: "Lost",
32
+ tone: "destructive",
33
+ category: "lost"
34
+ }
44
35
  ];
36
+ export const stepGroups = [{
37
+ key: "sales",
38
+ label: "Sales"
39
+ }, {
40
+ key: "delivery",
41
+ label: "Delivery"
42
+ }];
45
43
  export const websiteSteps = [
46
- {
47
- id: "s1",
48
- label: "Discovery call",
49
- done: true,
50
- group: "sales",
51
- start: "2026-10-03"
52
- },
53
- {
54
- id: "s2",
55
- label: "Proposal",
56
- done: false,
57
- group: "sales",
58
- start: "2026-10-21"
59
- },
60
- {
61
- id: "s3",
62
- label: "Kickoff",
63
- done: false,
64
- group: "delivery",
65
- start: "2026-10-26"
66
- },
67
- {
68
- id: "s4",
69
- label: "Design review",
70
- done: false,
71
- group: "delivery",
72
- start: "2026-11-10"
73
- },
74
- {
75
- id: "s5",
76
- label: "Build",
77
- done: false,
78
- group: "delivery",
79
- start: "2026-11-12",
80
- end: "2026-12-04"
81
- },
82
- {
83
- id: "s6",
84
- label: "Cutover",
85
- done: false,
86
- group: "delivery",
87
- start: "2026-12-12",
88
- end: "2026-12-13"
89
- },
90
- {
91
- id: "s7",
92
- label: "Training",
93
- done: false,
94
- group: "delivery",
95
- hidden: true
96
- }
97
- ];
98
- export const projectSections = [
99
- {
100
- key: "scope",
101
- label: "Scope"
102
- },
103
- {
104
- key: "loss",
105
- label: "Loss"
106
- }
44
+ {
45
+ id: "s1",
46
+ label: "Discovery call",
47
+ done: true,
48
+ group: "sales",
49
+ start: "2026-10-03"
50
+ },
51
+ {
52
+ id: "s2",
53
+ label: "Proposal",
54
+ done: false,
55
+ group: "sales",
56
+ start: "2026-10-21"
57
+ },
58
+ {
59
+ id: "s3",
60
+ label: "Kickoff",
61
+ done: false,
62
+ group: "delivery",
63
+ start: "2026-10-26"
64
+ },
65
+ {
66
+ id: "s4",
67
+ label: "Design review",
68
+ done: false,
69
+ group: "delivery",
70
+ start: "2026-11-10"
71
+ },
72
+ {
73
+ id: "s5",
74
+ label: "Build",
75
+ done: false,
76
+ group: "delivery",
77
+ start: "2026-11-12",
78
+ end: "2026-12-04"
79
+ },
80
+ {
81
+ id: "s6",
82
+ label: "Cutover",
83
+ done: false,
84
+ group: "delivery",
85
+ start: "2026-12-12",
86
+ end: "2026-12-13"
87
+ },
88
+ {
89
+ id: "s7",
90
+ label: "Training",
91
+ done: false,
92
+ group: "delivery",
93
+ hidden: true
94
+ }
107
95
  ];
96
+ export const projectSections = [{
97
+ key: "scope",
98
+ label: "Scope"
99
+ }, {
100
+ key: "loss",
101
+ label: "Loss"
102
+ }];
108
103
  export const projectFields = [
109
- {
110
- key: "type",
111
- label: "Type",
112
- type: "choice",
113
- section: "scope",
114
- options: [
115
- {
116
- key: "strategy",
117
- label: "Strategy"
118
- },
119
- {
120
- key: "implementation",
121
- label: "Implementation"
122
- }
123
- ]
124
- },
125
- {
126
- key: "budget",
127
- label: "Budget",
128
- type: "money",
129
- section: "scope"
130
- },
131
- {
132
- key: "urgency",
133
- label: "Urgency",
134
- type: "choice",
135
- section: "scope",
136
- options: [
137
- {
138
- key: "low",
139
- label: "Low",
140
- tone: "neutral"
141
- },
142
- {
143
- key: "high",
144
- label: "High",
145
- tone: "warning"
146
- }
147
- ]
148
- },
149
- {
150
- key: "goLive",
151
- label: "Go live",
152
- type: "date",
153
- section: "scope"
154
- },
155
- {
156
- key: "context",
157
- label: "Context",
158
- type: "longtext",
159
- section: "scope"
160
- },
161
- {
162
- key: "reason",
163
- label: "Reason",
164
- type: "choice",
165
- section: "loss",
166
- showWhen: {
167
- key: "lossReasonOn",
168
- equals: "yes"
169
- },
170
- options: [
171
- {
172
- key: "price",
173
- label: "Price"
174
- }
175
- ]
176
- }
177
- ];
178
- export const clientSections = [
179
- {
180
- key: "about",
181
- label: "About"
182
- }
104
+ {
105
+ key: "type",
106
+ label: "Type",
107
+ type: "choice",
108
+ section: "scope",
109
+ options: [{
110
+ key: "strategy",
111
+ label: "Strategy"
112
+ }, {
113
+ key: "implementation",
114
+ label: "Implementation"
115
+ }]
116
+ },
117
+ {
118
+ key: "budget",
119
+ label: "Budget",
120
+ type: "money",
121
+ section: "scope"
122
+ },
123
+ {
124
+ key: "urgency",
125
+ label: "Urgency",
126
+ type: "choice",
127
+ section: "scope",
128
+ options: [{
129
+ key: "low",
130
+ label: "Low",
131
+ tone: "neutral"
132
+ }, {
133
+ key: "high",
134
+ label: "High",
135
+ tone: "warning"
136
+ }]
137
+ },
138
+ {
139
+ key: "goLive",
140
+ label: "Go live",
141
+ type: "date",
142
+ section: "scope"
143
+ },
144
+ {
145
+ key: "context",
146
+ label: "Context",
147
+ type: "longtext",
148
+ section: "scope"
149
+ },
150
+ {
151
+ key: "reason",
152
+ label: "Reason",
153
+ type: "choice",
154
+ section: "loss",
155
+ showWhen: {
156
+ key: "lossReasonOn",
157
+ equals: "yes"
158
+ },
159
+ options: [{
160
+ key: "price",
161
+ label: "Price"
162
+ }]
163
+ }
183
164
  ];
165
+ export const clientSections = [{
166
+ key: "about",
167
+ label: "About"
168
+ }];
184
169
  export const clientFields = [
185
- {
186
- key: "business",
187
- label: "Business",
188
- type: "longtext",
189
- section: "about"
190
- },
191
- {
192
- key: "size",
193
- label: "Size",
194
- type: "choice",
195
- section: "about",
196
- options: [
197
- {
198
- key: "1-10",
199
- label: "1 to 10"
200
- },
201
- {
202
- key: "11-50",
203
- label: "11 to 50"
204
- },
205
- {
206
- key: "51+",
207
- label: "51 or more"
208
- }
209
- ]
210
- },
211
- {
212
- key: "sector",
213
- label: "Sector",
214
- type: "choice",
215
- section: "about",
216
- options: [
217
- "Dental",
218
- "Legal",
219
- "Retail",
220
- "Logistics",
221
- "Education",
222
- "Finance",
223
- "Health",
224
- "Hospitality",
225
- "Media"
226
- ].map((label)=>({
227
- key: label.toLowerCase(),
228
- label
229
- }))
230
- },
231
- {
232
- key: "needs",
233
- label: "Needs",
234
- type: "multi",
235
- section: "about",
236
- options: [
237
- {
238
- key: "site",
239
- label: "Website"
240
- },
241
- {
242
- key: "booking",
243
- label: "Booking"
244
- },
245
- {
246
- key: "crm",
247
- label: "CRM"
248
- },
249
- {
250
- key: "old",
251
- label: "Print",
252
- archived: true
253
- }
254
- ]
255
- },
256
- {
257
- key: "site",
258
- label: "Website",
259
- type: "url",
260
- section: "about"
261
- },
262
- {
263
- key: "email",
264
- label: "Email",
265
- type: "email",
266
- section: "about"
267
- },
268
- {
269
- key: "tz",
270
- label: "Time zone",
271
- type: "timezone",
272
- section: "about"
273
- }
170
+ {
171
+ key: "business",
172
+ label: "Business",
173
+ type: "longtext",
174
+ section: "about"
175
+ },
176
+ {
177
+ key: "size",
178
+ label: "Size",
179
+ type: "choice",
180
+ section: "about",
181
+ options: [
182
+ {
183
+ key: "1-10",
184
+ label: "1 to 10"
185
+ },
186
+ {
187
+ key: "11-50",
188
+ label: "11 to 50"
189
+ },
190
+ {
191
+ key: "51+",
192
+ label: "51 or more"
193
+ }
194
+ ]
195
+ },
196
+ {
197
+ key: "sector",
198
+ label: "Sector",
199
+ type: "choice",
200
+ section: "about",
201
+ options: [
202
+ "Dental",
203
+ "Legal",
204
+ "Retail",
205
+ "Logistics",
206
+ "Education",
207
+ "Finance",
208
+ "Health",
209
+ "Hospitality",
210
+ "Media"
211
+ ].map((label) => ({
212
+ key: label.toLowerCase(),
213
+ label
214
+ }))
215
+ },
216
+ {
217
+ key: "needs",
218
+ label: "Needs",
219
+ type: "multi",
220
+ section: "about",
221
+ options: [
222
+ {
223
+ key: "site",
224
+ label: "Website"
225
+ },
226
+ {
227
+ key: "booking",
228
+ label: "Booking"
229
+ },
230
+ {
231
+ key: "crm",
232
+ label: "CRM"
233
+ },
234
+ {
235
+ key: "old",
236
+ label: "Print",
237
+ archived: true
238
+ }
239
+ ]
240
+ },
241
+ {
242
+ key: "site",
243
+ label: "Website",
244
+ type: "url",
245
+ section: "about"
246
+ },
247
+ {
248
+ key: "email",
249
+ label: "Email",
250
+ type: "email",
251
+ section: "about"
252
+ },
253
+ {
254
+ key: "tz",
255
+ label: "Time zone",
256
+ type: "timezone",
257
+ section: "about"
258
+ }
274
259
  ];
275
260
  export const websiteValues = {
276
- type: "implementation",
277
- budget: 12000,
278
- urgency: "high",
279
- goLive: "2026-12-14",
280
- context: "Replace the brochure site. Booking stays on the old tool until spring."
261
+ type: "implementation",
262
+ budget: 12e3,
263
+ urgency: "high",
264
+ goLive: "2026-12-14",
265
+ context: "Replace the brochure site. Booking stays on the old tool until spring."
281
266
  };
282
267
  export const clientValues = {
283
- business: "A dental group in Lyon with 3 clinics and a shared front desk.",
284
- size: "11-50",
285
- sector: "dental",
286
- needs: [
287
- "site",
288
- "booking",
289
- "old"
290
- ],
291
- site: "https://marlowfinch.example",
292
- email: "jane@marlowfinch.example",
293
- tz: "Europe/Paris"
268
+ business: "A dental group in Lyon with 3 clinics and a shared front desk.",
269
+ size: "11-50",
270
+ sector: "dental",
271
+ needs: [
272
+ "site",
273
+ "booking",
274
+ "old"
275
+ ],
276
+ site: "https://marlowfinch.example",
277
+ email: "jane@marlowfinch.example",
278
+ tz: "Europe/Paris"
294
279
  };
295
- const note = (id, at, title, body)=>({
296
- id,
297
- kind: "note",
298
- occurredAt: at,
299
- title,
300
- body,
301
- actor: "Ramzi"
302
- });
280
+ const note = (id, at, title, body) => ({
281
+ id,
282
+ kind: "note",
283
+ occurredAt: at,
284
+ title,
285
+ body,
286
+ actor: "Ramzi"
287
+ });
303
288
  export const websiteEvents = [
304
- {
305
- id: "w1",
306
- kind: "status",
307
- occurredAt: "2026-10-18T09:30:00Z",
308
- title: "Sent SOW v2, legal is reviewing",
309
- body: "The payment terms have 2 redlines. Sofia answers Monday and asks for the signature by the 26th, so the kickoff holds.",
310
- actor: "Sofia"
311
- },
312
- {
313
- id: "w2",
314
- kind: "call",
315
- occurredAt: "2026-10-21T08:15:00Z",
316
- title: "Scoping review",
317
- body: "45 minutes with Jane and the clinic manager. Booking stays out of scope. They want the new site to carry the clinic pages and nothing else.",
318
- details: [
319
- {
320
- label: "Length",
321
- value: "45 min"
322
- },
323
- {
324
- label: "With",
325
- value: "Jane Roe, Tom Bell"
326
- }
327
- ],
328
- href: "#"
329
- },
330
- {
331
- id: "w3",
332
- kind: "stage",
333
- occurredAt: "2026-10-12T14:00:00Z",
334
- title: "Stage set to Proposal sent",
335
- actor: "Sofia"
336
- },
337
- note("w4", "2026-10-09T16:40:00Z", "Their fear is another agency that vanishes", "Said it twice. Lead the proposal with who answers the phone."),
338
- {
339
- id: "w5",
340
- kind: "invoice.sent",
341
- occurredAt: "2026-10-06T10:00:00Z",
342
- title: "Deposit invoice",
343
- amount: 3600,
344
- currency: "EUR"
345
- },
346
- {
347
- id: "w6",
348
- kind: "call",
349
- occurredAt: "2026-10-03T13:00:00Z",
350
- title: "Discovery call",
351
- body: "Jane runs 3 clinics and the site is 4 years old."
352
- },
353
- {
354
- id: "w7",
355
- kind: "milestone.done",
356
- occurredAt: "2026-10-03T15:00:00Z",
357
- title: "Discovery call done"
358
- },
359
- ...Array.from({
360
- length: 34
361
- }, (_, i)=>({
362
- id: `old${i}`,
363
- kind: i % 3 === 0 ? "email" : "note",
364
- occurredAt: new Date(Date.UTC(2026, 8, 28 - i, 9, 0)).toISOString(),
365
- title: i % 3 === 0 ? "Re: clinic pages" : "Warm intro follow-up",
366
- actor: "Ramzi"
367
- }))
289
+ {
290
+ id: "w1",
291
+ kind: "status",
292
+ occurredAt: "2026-10-18T09:30:00Z",
293
+ title: "Sent SOW v2, legal is reviewing",
294
+ body: "The payment terms have 2 redlines. Sofia answers Monday and asks for the signature by the 26th, so the kickoff holds.",
295
+ actor: "Sofia"
296
+ },
297
+ {
298
+ id: "w2",
299
+ kind: "call",
300
+ occurredAt: "2026-10-21T08:15:00Z",
301
+ title: "Scoping review",
302
+ body: "45 minutes with Jane and the clinic manager. Booking stays out of scope. They want the new site to carry the clinic pages and nothing else.",
303
+ details: [{
304
+ label: "Length",
305
+ value: "45 min"
306
+ }, {
307
+ label: "With",
308
+ value: "Jane Roe, Tom Bell"
309
+ }],
310
+ href: "#"
311
+ },
312
+ {
313
+ id: "w3",
314
+ kind: "stage",
315
+ occurredAt: "2026-10-12T14:00:00Z",
316
+ title: "Stage set to Proposal sent",
317
+ actor: "Sofia"
318
+ },
319
+ note("w4", "2026-10-09T16:40:00Z", "Their fear is another agency that vanishes", "Said it twice. Lead the proposal with who answers the phone."),
320
+ {
321
+ id: "w5",
322
+ kind: "invoice.sent",
323
+ occurredAt: "2026-10-06T10:00:00Z",
324
+ title: "Deposit invoice",
325
+ amount: 3600,
326
+ currency: "EUR"
327
+ },
328
+ {
329
+ id: "w6",
330
+ kind: "call",
331
+ occurredAt: "2026-10-03T13:00:00Z",
332
+ title: "Discovery call",
333
+ body: "Jane runs 3 clinics and the site is 4 years old."
334
+ },
335
+ {
336
+ id: "w7",
337
+ kind: "milestone.done",
338
+ occurredAt: "2026-10-03T15:00:00Z",
339
+ title: "Discovery call done"
340
+ },
341
+ ...Array.from({ length: 34 }, (_, i) => ({
342
+ id: `old${i}`,
343
+ kind: i % 3 === 0 ? "email" : "note",
344
+ occurredAt: new Date(Date.UTC(2026, 8, 28 - i, 9, 0)).toISOString(),
345
+ title: i % 3 === 0 ? "Re: clinic pages" : "Warm intro follow-up",
346
+ actor: "Ramzi"
347
+ }))
368
348
  ];
369
349
  export const website = {
370
- id: "p-web",
371
- name: "Website rebuild",
372
- href: "#",
373
- stageKey: "sent",
374
- value: 12000,
375
- currency: "EUR",
376
- startDate: "2026-11-01",
377
- endDate: "2026-12-15",
378
- whereWeAre: {
379
- text: "Sent SOW v2, legal is reviewing. The payment terms have 2 redlines, Sofia answers Monday and asks for the signature by the 26th, so the kickoff holds.",
380
- at: "2026-10-18T09:30:00Z",
381
- actor: "Sofia",
382
- health: {
383
- label: "Waiting",
384
- tone: "warning"
385
- }
386
- },
387
- next: {
388
- label: "Kickoff call",
389
- date: "2026-10-26",
390
- owner: "Ramzi"
391
- },
392
- lastCallAt: "2026-10-21T08:15:00Z",
393
- lastTouchAt: "2026-10-21T08:15:00Z",
394
- progress: {
395
- done: 1,
396
- total: 6
397
- }
350
+ id: "p-web",
351
+ name: "Website rebuild",
352
+ href: "#",
353
+ stageKey: "sent",
354
+ value: 12e3,
355
+ currency: "EUR",
356
+ startDate: "2026-11-01",
357
+ endDate: "2026-12-15",
358
+ whereWeAre: {
359
+ text: "Sent SOW v2, legal is reviewing. The payment terms have 2 redlines, Sofia answers Monday and asks for the signature by the 26th, so the kickoff holds.",
360
+ at: "2026-10-18T09:30:00Z",
361
+ actor: "Sofia",
362
+ health: {
363
+ label: "Waiting",
364
+ tone: "warning"
365
+ }
366
+ },
367
+ next: {
368
+ label: "Kickoff call",
369
+ date: "2026-10-26",
370
+ owner: "Ramzi"
371
+ },
372
+ lastCallAt: "2026-10-21T08:15:00Z",
373
+ lastTouchAt: "2026-10-21T08:15:00Z",
374
+ progress: {
375
+ done: 1,
376
+ total: 6
377
+ }
398
378
  };
399
379
  export const audit = {
400
- id: "p-audit",
401
- name: "Brand audit",
402
- href: "#",
403
- stageKey: "lost",
404
- stageDetail: "Price",
405
- value: 4500,
406
- currency: "EUR",
407
- whereWeAre: {
408
- text: "They went with a freelancer at half the fee.",
409
- at: "2026-06-11T10:00:00Z",
410
- actor: "Sofia"
411
- },
412
- lastCallAt: "2026-06-04T10:00:00Z",
413
- lastTouchAt: "2026-06-11T10:00:00Z",
414
- progress: {
415
- done: 1,
416
- total: 3
417
- }
380
+ id: "p-audit",
381
+ name: "Brand audit",
382
+ href: "#",
383
+ stageKey: "lost",
384
+ stageDetail: "Price",
385
+ value: 4500,
386
+ currency: "EUR",
387
+ whereWeAre: {
388
+ text: "They went with a freelancer at half the fee.",
389
+ at: "2026-06-11T10:00:00Z",
390
+ actor: "Sofia"
391
+ },
392
+ lastCallAt: "2026-06-04T10:00:00Z",
393
+ lastTouchAt: "2026-06-11T10:00:00Z",
394
+ progress: {
395
+ done: 1,
396
+ total: 3
397
+ }
418
398
  };
419
399
  export const portal = {
420
- id: "p-portal",
421
- name: "Booking portal",
422
- href: "#",
423
- stageKey: "paid",
424
- value: 18000,
425
- paid: 18000,
426
- currency: "EUR",
427
- whereWeAre: {
428
- text: "Live since March. Final invoice paid.",
429
- at: "2026-04-02T10:00:00Z",
430
- actor: "Ramzi"
431
- },
432
- lastCallAt: "2026-03-20T10:00:00Z",
433
- lastTouchAt: "2026-04-02T10:00:00Z",
434
- progress: {
435
- done: 5,
436
- total: 5
437
- }
400
+ id: "p-portal",
401
+ name: "Booking portal",
402
+ href: "#",
403
+ stageKey: "paid",
404
+ value: 18e3,
405
+ paid: 18e3,
406
+ currency: "EUR",
407
+ whereWeAre: {
408
+ text: "Live since March. Final invoice paid.",
409
+ at: "2026-04-02T10:00:00Z",
410
+ actor: "Ramzi"
411
+ },
412
+ lastCallAt: "2026-03-20T10:00:00Z",
413
+ lastTouchAt: "2026-04-02T10:00:00Z",
414
+ progress: {
415
+ done: 5,
416
+ total: 5
417
+ }
438
418
  };
439
- export const auditEvents = [
440
- {
441
- id: "a1",
442
- kind: "stage",
443
- occurredAt: "2026-06-11T10:00:00Z",
444
- title: "Stage set to Lost",
445
- actor: "Sofia",
446
- details: [
447
- {
448
- label: "Reason",
449
- value: "Price"
450
- },
451
- {
452
- label: "In their words",
453
- value: "A freelancer quoted half."
454
- }
455
- ]
456
- },
457
- {
458
- id: "a2",
459
- kind: "call",
460
- occurredAt: "2026-06-04T10:00:00Z",
461
- title: "Proposal walk-through",
462
- body: "Jane liked the audit and balked at the fee."
463
- }
464
- ];
419
+ export const auditEvents = [{
420
+ id: "a1",
421
+ kind: "stage",
422
+ occurredAt: "2026-06-11T10:00:00Z",
423
+ title: "Stage set to Lost",
424
+ actor: "Sofia",
425
+ details: [{
426
+ label: "Reason",
427
+ value: "Price"
428
+ }, {
429
+ label: "In their words",
430
+ value: "A freelancer quoted half."
431
+ }]
432
+ }, {
433
+ id: "a2",
434
+ kind: "call",
435
+ occurredAt: "2026-06-04T10:00:00Z",
436
+ title: "Proposal walk-through",
437
+ body: "Jane liked the audit and balked at the fee."
438
+ }];
465
439
  export const portalEvents = [
466
- {
467
- id: "b1",
468
- kind: "payment",
469
- occurredAt: "2026-04-02T10:00:00Z",
470
- title: "Final invoice paid",
471
- amount: 9000,
472
- currency: "EUR"
473
- },
474
- {
475
- id: "b2",
476
- kind: "payment",
477
- occurredAt: "2026-02-10T10:00:00Z",
478
- title: "First instalment paid",
479
- amount: 9000,
480
- currency: "EUR"
481
- },
482
- {
483
- id: "b3",
484
- kind: "call",
485
- occurredAt: "2026-03-20T10:00:00Z",
486
- title: "Launch check",
487
- body: "Live. A few copy fixes after."
488
- }
489
- ];
490
- export const clientOnlyEvents = [
491
- {
492
- id: "c1",
493
- kind: "form",
494
- occurredAt: "2026-02-01T09:00:00Z",
495
- title: "Contact form: asked about online booking",
496
- body: "Calls pile up at lunch and the front desk can't keep up."
497
- }
440
+ {
441
+ id: "b1",
442
+ kind: "payment",
443
+ occurredAt: "2026-04-02T10:00:00Z",
444
+ title: "Final invoice paid",
445
+ amount: 9e3,
446
+ currency: "EUR"
447
+ },
448
+ {
449
+ id: "b2",
450
+ kind: "payment",
451
+ occurredAt: "2026-02-10T10:00:00Z",
452
+ title: "First instalment paid",
453
+ amount: 9e3,
454
+ currency: "EUR"
455
+ },
456
+ {
457
+ id: "b3",
458
+ kind: "call",
459
+ occurredAt: "2026-03-20T10:00:00Z",
460
+ title: "Launch check",
461
+ body: "Live. A few copy fixes after."
462
+ }
498
463
  ];
464
+ /** Something that happened before any project existed: it belongs to the client. */
465
+ export const clientOnlyEvents = [{
466
+ id: "c1",
467
+ kind: "form",
468
+ occurredAt: "2026-02-01T09:00:00Z",
469
+ title: "Contact form: asked about online booking",
470
+ body: "Calls pile up at lunch and the front desk can't keep up."
471
+ }];
499
472
  export const clientProjects = [
500
- {
501
- summary: website,
502
- events: websiteEvents
503
- },
504
- {
505
- summary: audit,
506
- events: auditEvents
507
- },
508
- {
509
- summary: portal,
510
- events: portalEvents
511
- }
473
+ {
474
+ summary: website,
475
+ events: websiteEvents
476
+ },
477
+ {
478
+ summary: audit,
479
+ events: auditEvents
480
+ },
481
+ {
482
+ summary: portal,
483
+ events: portalEvents
484
+ }
512
485
  ];