@heyramzi/ui 2.8.0 → 2.10.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 (426) hide show
  1. package/COMPONENTS.md +1 -1
  2. package/README.md +1 -1
  3. package/dist/agents/helpers.js +52 -0
  4. package/dist/agents/index.js +3 -0
  5. package/dist/agents/page-state.js +65 -0
  6. package/dist/agents/types.js +1 -0
  7. package/dist/agents/vendor/color.js +149 -0
  8. package/dist/agents/vendor/draw.js +548 -0
  9. package/dist/agents/vendor/engine.js +632 -0
  10. package/dist/agents/vendor/mesh.js +727 -0
  11. package/dist/agents/vendor/plastic.js +3273 -0
  12. package/dist/agents/vendor/presets.js +171 -0
  13. package/dist/agents/vendor/shapes.js +24 -0
  14. package/dist/agents/vendor/ticker.js +56 -0
  15. package/dist/agents/vendor/types.js +0 -0
  16. package/dist/agents/vendor/wear.js +1525 -0
  17. package/dist/ai/ai-button/index.js +2 -0
  18. package/dist/ai/confirmation/confirmation-context.svelte.js +12 -0
  19. package/dist/ai/confirmation/index.js +9 -0
  20. package/dist/ai/generation-progress/index.js +2 -0
  21. package/dist/ai/index.js +11 -0
  22. package/dist/ai/loading-state/index.js +3 -0
  23. package/dist/ai/prompt-input/index.js +6 -0
  24. package/dist/ai/reasoning/index.js +4 -0
  25. package/dist/ai/reasoning/reasoning-context.svelte.js +12 -0
  26. package/dist/ai/response/index.js +3 -0
  27. package/dist/ai/suggestion/index.js +3 -0
  28. package/dist/ai/thinking-dots/index.js +3 -0
  29. package/dist/ai/typing-dots/index.js +2 -0
  30. package/dist/ai/voice-waveform/index.js +3 -0
  31. package/dist/animations/text-swap.js +30 -0
  32. package/dist/brand/index.js +65 -0
  33. package/dist/canvas/card/resize.js +10 -0
  34. package/dist/canvas/edges/edge-path.js +284 -0
  35. package/dist/canvas/editor/context-menu.js +42 -0
  36. package/dist/canvas/editor/dispatch.svelte.js +157 -0
  37. package/dist/canvas/editor/editor-context.js +8 -0
  38. package/dist/canvas/editor/editor-mode.js +0 -0
  39. package/dist/canvas/editor/frame.js +87 -0
  40. package/dist/canvas/editor/hand-context.js +8 -0
  41. package/dist/canvas/editor/history-core.js +221 -0
  42. package/dist/canvas/editor/keymap.js +193 -0
  43. package/dist/canvas/editor/layout-actions.js +170 -0
  44. package/dist/canvas/editor/lock.js +65 -0
  45. package/dist/canvas/editor/rebase.js +279 -0
  46. package/dist/canvas/editor/style.js +174 -0
  47. package/dist/canvas/editor/text-field-context.js +8 -0
  48. package/dist/canvas/editor/z-order.js +82 -0
  49. package/dist/canvas/headless/alignment.js +20 -0
  50. package/dist/canvas/headless/break-apart-find.js +324 -0
  51. package/dist/canvas/headless/break-apart-pieces.js +74 -0
  52. package/dist/canvas/headless/break-apart-plan.js +378 -0
  53. package/dist/canvas/headless/break-apart-style.js +93 -0
  54. package/dist/canvas/headless/break-apart.js +206 -0
  55. package/dist/canvas/headless/canvas-cleanup.js +70 -0
  56. package/dist/canvas/headless/edge-anchors.js +134 -0
  57. package/dist/canvas/headless/edge-memo.js +28 -0
  58. package/dist/canvas/headless/edge-serialization.js +31 -0
  59. package/dist/canvas/headless/figure-geometry.js +331 -0
  60. package/dist/canvas/headless/fit-viewport.js +82 -0
  61. package/dist/canvas/headless/grid.js +96 -0
  62. package/dist/canvas/headless/icon-node.js +45 -0
  63. package/dist/canvas/headless/index.js +1 -0
  64. package/dist/canvas/headless/linkify.js +25 -0
  65. package/dist/canvas/headless/pen-marks.js +115 -0
  66. package/dist/canvas/headless/sketch.js +250 -0
  67. package/dist/canvas/headless/snap-guides.js +100 -0
  68. package/dist/canvas/headless/svg-figure.js +137 -0
  69. package/dist/canvas/headless/table-layout.js +161 -0
  70. package/dist/canvas/index.js +25 -0
  71. package/dist/canvas/lod/lod-mode.svelte.js +22 -0
  72. package/dist/canvas/lod/render-all.svelte.js +45 -0
  73. package/dist/canvas/ops/arrange.js +83 -0
  74. package/dist/canvas/ops/ops.js +318 -0
  75. package/dist/canvas/pen/colors.js +41 -0
  76. package/dist/canvas/pen/eraser.js +35 -0
  77. package/dist/canvas/pen/geometry.js +143 -0
  78. package/dist/canvas/pen/index.js +9 -0
  79. package/dist/canvas/pen/ops.js +15 -0
  80. package/dist/canvas/pen/pen-session.js +171 -0
  81. package/dist/canvas/pen/plugin.js +129 -0
  82. package/dist/canvas/pen/shapes.js +80 -0
  83. package/dist/canvas/pen/stroke-path.js +37 -0
  84. package/dist/canvas/pen/types.js +30 -0
  85. package/dist/canvas/pen/ui.js +20 -0
  86. package/dist/canvas/plugin.js +51 -0
  87. package/dist/canvas/screen/glyphs.js +24 -0
  88. package/dist/canvas/screen/labels.js +24 -0
  89. package/dist/canvas/screen/parts.js +140 -0
  90. package/dist/canvas/screen/plugin.js +71 -0
  91. package/dist/canvas/screen/types.js +44 -0
  92. package/dist/canvas/screen/ui.js +13 -0
  93. package/dist/canvas/test-utils.js +18 -0
  94. package/dist/canvas/types.js +0 -0
  95. package/dist/canvas/ui/forward-wheel.js +27 -0
  96. package/dist/canvas/ui/icons.js +133 -0
  97. package/dist/canvas/ui/place-panel.js +57 -0
  98. package/dist/canvas/ui/shortcut-tip.js +18 -0
  99. package/dist/canvas/ui/tools.js +411 -0
  100. package/dist/charts/dashboard/chart.js +1 -0
  101. package/dist/charts/dashboard/data-table.js +7 -0
  102. package/dist/charts/dashboard/index.js +13 -0
  103. package/dist/charts/dashboard/windows.js +5 -0
  104. package/dist/charts/edge-fade.js +7 -0
  105. package/dist/charts/hover-band.js +13 -0
  106. package/dist/charts/index.js +19 -0
  107. package/dist/charts/motion.js +15 -0
  108. package/dist/charts/primitives/chart-utils.js +22 -0
  109. package/dist/charts/primitives/index.js +4 -0
  110. package/dist/components/copy/clipboard.js +38 -0
  111. package/dist/components/copy/copied.svelte.js +26 -0
  112. package/dist/components/copy/index.js +3 -0
  113. package/dist/components/data-table/data-table.js +55 -0
  114. package/dist/components/data-table/index.js +7 -0
  115. package/dist/components/docs/index.js +3 -0
  116. package/dist/components/docs/scroll-spy.svelte.js +71 -0
  117. package/dist/components/field-row/index.js +1 -0
  118. package/dist/components/hold-to-confirm/index.js +1 -0
  119. package/dist/components/icon/index.js +1 -0
  120. package/dist/components/language-flag/index.js +1 -0
  121. package/dist/components/list-page/filter-section.js +4 -0
  122. package/dist/components/list-page/index.js +25 -0
  123. package/dist/components/list-page/list-table.js +5 -0
  124. package/dist/components/list-page/queue-rail.js +3 -0
  125. package/dist/components/list-page/section-host.js +8 -0
  126. package/dist/components/list-page/step.js +5 -0
  127. package/dist/components/list-page/types.js +0 -0
  128. package/dist/components/locale-switch/index.js +1 -0
  129. package/dist/components/mark/index.js +1 -0
  130. package/dist/components/open-in/index.js +1 -0
  131. package/dist/components/picker/index.js +3 -0
  132. package/dist/components/picker/trigger.js +33 -0
  133. package/dist/components/picker/types.js +0 -0
  134. package/dist/components/section-card/index.js +1 -0
  135. package/dist/components/section-header/index.js +2 -0
  136. package/dist/components/segmented/collapse.js +32 -0
  137. package/dist/components/segmented/index.js +8 -0
  138. package/dist/components/segmented/segmented.js +50 -0
  139. package/dist/components/star-rating-input/index.js +2 -0
  140. package/dist/components/svg/index.js +1 -0
  141. package/dist/components/table-view/index.js +1 -0
  142. package/dist/components/table-view/types.js +0 -0
  143. package/dist/components/tags-input/index.js +2 -0
  144. package/dist/components/tags-input/tags.js +90 -0
  145. package/dist/components/theme/index.js +3 -0
  146. package/dist/components/toolbar/index.js +3 -0
  147. package/dist/components/toolbar/toolbar-trigger.js +4 -0
  148. package/dist/editor/anchors.js +17 -0
  149. package/dist/editor/block-id.js +62 -0
  150. package/dist/editor/block-ops.js +105 -0
  151. package/dist/editor/doc-blocks.js +181 -0
  152. package/dist/editor/extensions.js +200 -0
  153. package/dist/editor/index.js +4 -0
  154. package/dist/editor/markdown-test-helpers.js +6 -0
  155. package/dist/editor/markdown.js +486 -0
  156. package/dist/editor/serializer.js +268 -0
  157. package/dist/editor/slash-items.js +104 -0
  158. package/dist/editor/youtube-url.js +27 -0
  159. package/dist/effects/animated-beam/index.js +1 -0
  160. package/dist/effects/animated-beam/path-calculator.svelte.js +42 -0
  161. package/dist/effects/animated-beam/types.js +0 -0
  162. package/dist/effects/border-beam/css.js +420 -0
  163. package/dist/effects/border-beam/presets.js +1792 -0
  164. package/dist/effects/border-beam/register-properties.js +39 -0
  165. package/dist/effects/border-beam/types.js +0 -0
  166. package/dist/effects/image-comparison/compare.js +4 -0
  167. package/dist/effects/image-reveal/index.js +1 -0
  168. package/dist/effects/image-reveal/types.js +0 -0
  169. package/dist/effects/magnetic/magnetic.js +54 -0
  170. package/dist/effects/reveal/index.js +4 -0
  171. package/dist/effects/reveal/observe.js +43 -0
  172. package/dist/effects/reveal/types.js +0 -0
  173. package/dist/effects/shader-gradient/color.js +34 -0
  174. package/dist/effects/shader-gradient/index.js +1 -0
  175. package/dist/effects/shader-gradient/renderer.js +320 -0
  176. package/dist/effects/shader-gradient/shaders.js +280 -0
  177. package/dist/effects/shader-gradient/types.js +0 -0
  178. package/dist/icons/apple-symbol-exports.js +126 -0
  179. package/dist/icons/sf-symbols.js +465 -0
  180. package/dist/icons/trades.js +34 -0
  181. package/dist/inbox/index.js +4 -0
  182. package/dist/inbox/logic.js +156 -0
  183. package/dist/inbox/types.js +46 -0
  184. package/dist/index.js +18 -0
  185. package/dist/lib/arrive.js +13 -0
  186. package/dist/lib/icon-types.js +0 -0
  187. package/dist/lib/initials.js +17 -0
  188. package/dist/lib/layout.js +1 -0
  189. package/dist/lib/panel.js +3 -0
  190. package/dist/lib/result.js +26 -0
  191. package/dist/lib/sliding-pill.js +45 -0
  192. package/dist/lib/theme-transition.js +53 -0
  193. package/dist/lib/tone.js +32 -0
  194. package/dist/lib/utils.js +5 -0
  195. package/dist/onboarding/define-tours.js +28 -0
  196. package/dist/onboarding/index.js +4 -0
  197. package/dist/onboarding/onboarding.svelte.js +15 -0
  198. package/dist/onboarding/pick.js +16 -0
  199. package/dist/onboarding/stores.js +50 -0
  200. package/dist/onboarding/types.js +1 -0
  201. package/dist/onboarding/wait.js +25 -0
  202. package/dist/panel/index.js +1 -0
  203. package/dist/panel/side-panel-types.js +0 -0
  204. package/dist/record/demo-data.js +512 -0
  205. package/dist/record/fields.js +148 -0
  206. package/dist/record/format.js +97 -0
  207. package/dist/record/gutter.js +1 -0
  208. package/dist/record/index.js +15 -0
  209. package/dist/record/kinds.js +110 -0
  210. package/dist/record/logic.js +255 -0
  211. package/dist/record/types.js +52 -0
  212. package/dist/shadcn/accordion/index.js +5 -0
  213. package/dist/shadcn/alert/index.js +5 -0
  214. package/dist/shadcn/alert-dialog/index.js +12 -0
  215. package/dist/shadcn/attachment/index.js +10 -0
  216. package/dist/shadcn/avatar/index.js +7 -0
  217. package/dist/shadcn/badge/index.js +2 -0
  218. package/dist/shadcn/breadcrumb/index.js +8 -0
  219. package/dist/shadcn/bubble/index.js +5 -0
  220. package/dist/shadcn/button/index.js +2 -0
  221. package/dist/shadcn/calendar/index.js +19 -0
  222. package/dist/shadcn/card/index.js +8 -0
  223. package/dist/shadcn/checkbox/index.js +2 -0
  224. package/dist/shadcn/code-block/index.js +9 -0
  225. package/dist/shadcn/collapsible/index.js +4 -0
  226. package/dist/shadcn/command/index.js +13 -0
  227. package/dist/shadcn/context-menu/index.js +17 -0
  228. package/dist/shadcn/dialog/index.js +11 -0
  229. package/dist/shadcn/dropdown-menu/index.js +19 -0
  230. package/dist/shadcn/dropdown-menu/menu-item.js +23 -0
  231. package/dist/shadcn/empty/index.js +7 -0
  232. package/dist/shadcn/field/index.js +12 -0
  233. package/dist/shadcn/hooks/highlighter.js +92 -0
  234. package/dist/shadcn/hooks/is-mobile.svelte.js +7 -0
  235. package/dist/shadcn/hooks/use-highlighted-code.svelte.js +65 -0
  236. package/dist/shadcn/hover-card/index.js +5 -0
  237. package/dist/shadcn/input/index.js +3 -0
  238. package/dist/shadcn/input-otp/index.js +5 -0
  239. package/dist/shadcn/kbd/index.js +3 -0
  240. package/dist/shadcn/label/index.js +2 -0
  241. package/dist/shadcn/marker/index.js +4 -0
  242. package/dist/shadcn/message/index.js +7 -0
  243. package/dist/shadcn/message-scroller/index.js +8 -0
  244. package/dist/shadcn/popover/index.js +9 -0
  245. package/dist/shadcn/progress/index.js +2 -0
  246. package/dist/shadcn/progress/tone.js +11 -0
  247. package/dist/shadcn/radio-group/index.js +3 -0
  248. package/dist/shadcn/scroll-area/index.js +3 -0
  249. package/dist/shadcn/select/index.js +12 -0
  250. package/dist/shadcn/separator/index.js +2 -0
  251. package/dist/shadcn/sheet/index.js +11 -0
  252. package/dist/shadcn/sidebar/constants.js +6 -0
  253. package/dist/shadcn/sidebar/context.svelte.js +38 -0
  254. package/dist/shadcn/sidebar/index.js +25 -0
  255. package/dist/shadcn/skeleton/index.js +2 -0
  256. package/dist/shadcn/slider/index.js +2 -0
  257. package/dist/shadcn/sonner/index.js +1 -0
  258. package/dist/shadcn/spinner/index.js +1 -0
  259. package/dist/shadcn/switch/index.js +2 -0
  260. package/dist/shadcn/table/index.js +9 -0
  261. package/dist/shadcn/tabs/index.js +5 -0
  262. package/dist/shadcn/textarea/index.js +2 -0
  263. package/dist/shadcn/toggle/index.js +3 -0
  264. package/dist/shadcn/toggle-group/index.js +3 -0
  265. package/dist/shadcn/tooltip/context.js +8 -0
  266. package/dist/shadcn/tooltip/index.js +6 -0
  267. package/dist/shadcn/trace/index.js +9 -0
  268. package/dist/slides/bridges.js +66 -0
  269. package/dist/slides/deck-controller.svelte.js +221 -0
  270. package/dist/slides/export/capture.js +81 -0
  271. package/dist/slides/export/ffmpeg.js +85 -0
  272. package/dist/slides/export/index.js +4 -0
  273. package/dist/slides/export/launch.js +8 -0
  274. package/dist/slides/export/pdf.js +78 -0
  275. package/dist/slides/export/types.js +0 -0
  276. package/dist/slides/index.js +7 -0
  277. package/dist/slides/labels.js +26 -0
  278. package/dist/slides/layout.js +47 -0
  279. package/dist/slides/model.js +9 -0
  280. package/dist/slides/navigation.js +89 -0
  281. package/dist/slides/types.js +6 -0
  282. package/dist/status/define-statuses.js +16 -0
  283. package/dist/status/index.js +4 -0
  284. package/dist/status/status-types.js +0 -0
  285. package/dist/test-setup.js +26 -0
  286. package/dist/thread/index.js +3 -0
  287. package/dist/thread/logic.js +94 -0
  288. package/dist/thread/types.js +23 -0
  289. package/dist/work/board-order.js +109 -0
  290. package/dist/work/dates.js +19 -0
  291. package/dist/work/detail/detail-types.js +20 -0
  292. package/dist/work/docs/edited.js +39 -0
  293. package/dist/work/docs/index.js +7 -0
  294. package/dist/work/docs/labels.js +38 -0
  295. package/dist/work/docs/menu.js +121 -0
  296. package/dist/work/docs/outline.js +39 -0
  297. package/dist/work/gantt/logic.js +260 -0
  298. package/dist/work/inbox/inbox-logic.js +94 -0
  299. package/dist/work/inbox/inbox-statuses.js +86 -0
  300. package/dist/work/inbox/inbox-types.js +0 -0
  301. package/dist/work/inbox/index.js +1 -0
  302. package/dist/work/index.js +21 -0
  303. package/dist/work/kanban-drag.js +25 -0
  304. package/dist/work/kanban-types.js +0 -0
  305. package/dist/work/presets/sales.js +35 -0
  306. package/dist/work/reorder.js +10 -0
  307. package/dist/work/task-types.js +0 -0
  308. package/dist/work/time/duration.js +60 -0
  309. package/dist/work/time/time-types.js +25 -0
  310. package/dist/work/use-kanban-dnd.svelte.js +128 -0
  311. package/package.json +102 -76
  312. package/src/agents/vendor/draw.ts +4 -4
  313. package/src/canvas/headless/canvas-cleanup.test.ts +1 -1
  314. package/src/canvas/ops/ops.ts +1 -1
  315. package/src/charts/area-chart.svelte +11 -1
  316. package/src/charts/bar-chart.svelte +18 -3
  317. package/src/charts/line-chart.svelte +11 -1
  318. package/src/components/data-table/data-table.ts +4 -5
  319. package/src/components/data-table/pagination.svelte +5 -3
  320. package/src/components/docs/on-this-page.svelte +82 -5
  321. package/src/components/docs/scroll-spy.svelte.ts +6 -1
  322. package/src/components/list-page/detail-header.svelte +7 -3
  323. package/src/components/list-page/empty-state.svelte +3 -1
  324. package/src/components/list-page/filter-popover.svelte +2 -2
  325. package/src/components/list-page/rail-row.svelte +5 -2
  326. package/src/components/mark/mark.svelte +2 -1
  327. package/src/components/section-card/section-card.svelte +3 -1
  328. package/src/components/section-header/section-header.svelte +5 -5
  329. package/src/components/segmented/segment.svelte +1 -1
  330. package/src/components/table-view/table-view.svelte +6 -1
  331. package/src/components/tags-input/tags-input.svelte +1 -1
  332. package/src/components/toolbar/toolbar-trigger.ts +8 -2
  333. package/src/components/toolbar/toolbar.svelte +1 -1
  334. package/src/editor/anchors.ts +28 -0
  335. package/src/editor/doc-blocks.ts +168 -0
  336. package/src/editor/doc-page.css +389 -0
  337. package/src/editor/editor.svelte +47 -5
  338. package/src/editor/extensions.ts +26 -2
  339. package/src/editor/markdown.ts +27 -2
  340. package/src/editor/slash-items.ts +18 -0
  341. package/src/icons/trades.ts +1 -1
  342. package/src/inbox/README.md +6 -4
  343. package/src/inbox/inbox.test.ts +1 -1
  344. package/src/inbox/index.ts +2 -2
  345. package/src/inbox/logic.ts +29 -5
  346. package/src/inbox/thread-inbox.svelte +219 -92
  347. package/src/inbox/types.ts +27 -1
  348. package/src/lib/initials.test.ts +25 -0
  349. package/src/lib/initials.ts +29 -0
  350. package/src/modules.test.ts +4 -64
  351. package/src/panel/README.md +1 -1
  352. package/src/record/README.md +1 -1
  353. package/src/record/demo-data.ts +4 -4
  354. package/src/record/info-list.svelte +5 -4
  355. package/src/record/next-up.svelte +1 -1
  356. package/src/record/project-list.svelte +1 -1
  357. package/src/record/record-demo.svelte +2 -2
  358. package/src/record/steps-rail.svelte +3 -3
  359. package/src/shadcn/badge/badge.svelte +1 -1
  360. package/src/shadcn/card/card-title.svelte +1 -5
  361. package/src/shadcn/empty/empty-description.svelte +1 -1
  362. package/src/shadcn/progress/progress.svelte +8 -1
  363. package/src/shadcn/table/table-cell.svelte +10 -2
  364. package/src/status/README.md +1 -1
  365. package/src/thread/README.md +2 -0
  366. package/src/thread/index.ts +9 -1
  367. package/src/thread/logic.ts +33 -3
  368. package/src/thread/thread-body.svelte +37 -0
  369. package/src/thread/thread-events.svelte +30 -0
  370. package/src/thread/thread.svelte +74 -59
  371. package/src/thread/types.ts +21 -0
  372. package/src/{tasks → work}/README.md +11 -8
  373. package/src/{tasks → work}/detail/task-thread.svelte +8 -15
  374. package/src/work/docs/doc-editor-page.svelte +194 -0
  375. package/src/work/docs/doc-menu.svelte +333 -0
  376. package/src/work/docs/docs-demo.svelte +227 -0
  377. package/src/work/docs/edited-chip.svelte +125 -0
  378. package/src/work/docs/edited.ts +54 -0
  379. package/src/work/docs/index.ts +38 -0
  380. package/src/work/docs/labels.ts +70 -0
  381. package/src/work/docs/menu.ts +127 -0
  382. package/src/work/docs/outline.ts +60 -0
  383. package/src/{tasks → work}/gantt/gantt-group-row.svelte +1 -1
  384. package/src/{tasks → work}/inbox/inbox-card.svelte +113 -50
  385. package/src/work/inbox/inbox-logic.ts +98 -0
  386. package/src/work/inbox/inbox-trace.svelte +58 -0
  387. package/src/{tasks → work}/inbox/inbox-types.ts +2 -0
  388. package/src/{tasks → work}/index.ts +0 -10
  389. package/src/{tasks → work}/kanban-board.svelte +1 -1
  390. package/src/{tasks → work}/task-list.svelte +1 -1
  391. package/src/{tasks → work}/time/time-tracker.svelte +2 -5
  392. package/src/tasks/inbox/inbox-logic.ts +0 -21
  393. package/src/tasks/inbox/inbox-trace.svelte +0 -51
  394. /package/src/{tasks → work}/ambient.d.ts +0 -0
  395. /package/src/{tasks → work}/board-order.ts +0 -0
  396. /package/src/{tasks → work}/dates.ts +0 -0
  397. /package/src/{tasks → work}/demo.svelte +0 -0
  398. /package/src/{tasks → work}/detail/detail-demo.svelte +0 -0
  399. /package/src/{tasks → work}/detail/detail-types.ts +0 -0
  400. /package/src/{tasks → work}/detail/task-chip.svelte +0 -0
  401. /package/src/{tasks → work}/detail/task-detail.svelte +0 -0
  402. /package/src/{tasks → work}/detail/task-property.svelte +0 -0
  403. /package/src/{tasks → work}/gantt/gantt-bar.svelte +0 -0
  404. /package/src/{tasks → work}/gantt/gantt-grid.svelte +0 -0
  405. /package/src/{tasks → work}/gantt/gantt-header.svelte +0 -0
  406. /package/src/{tasks → work}/gantt/gantt-task-row.svelte +0 -0
  407. /package/src/{tasks → work}/gantt/gantt.css +0 -0
  408. /package/src/{tasks → work}/gantt/gantt.test.ts +0 -0
  409. /package/src/{tasks → work}/gantt/logic.test.ts +0 -0
  410. /package/src/{tasks → work}/gantt/logic.ts +0 -0
  411. /package/src/{tasks → work}/inbox/inbox-draft.svelte +0 -0
  412. /package/src/{tasks → work}/inbox/inbox-statuses.ts +0 -0
  413. /package/src/{tasks → work}/inbox/index.ts +0 -0
  414. /package/src/{tasks → work}/kanban-column.svelte +0 -0
  415. /package/src/{tasks → work}/kanban-drag.ts +0 -0
  416. /package/src/{tasks → work}/kanban-types.ts +0 -0
  417. /package/src/{tasks → work}/presets/sales.ts +0 -0
  418. /package/src/{tasks → work}/reorder.ts +0 -0
  419. /package/src/{tasks → work}/task-gantt.svelte +0 -0
  420. /package/src/{tasks → work}/task-types.ts +0 -0
  421. /package/src/{tasks → work}/time/duration.ts +0 -0
  422. /package/src/{tasks → work}/time/time-chip.svelte +0 -0
  423. /package/src/{tasks → work}/time/time-dot.svelte +0 -0
  424. /package/src/{tasks → work}/time/time-ring.svelte +0 -0
  425. /package/src/{tasks → work}/time/time-types.ts +0 -0
  426. /package/src/{tasks → work}/use-kanban-dnd.svelte.ts +0 -0
@@ -0,0 +1,632 @@
1
+ export const STATES = [
2
+ "default",
3
+ "working",
4
+ "sleeping"
5
+ ];
6
+ const HOP_T = 0.68;
7
+ const HOP_SPIN_H = 26;
8
+ const FLIP_PRE = 0.2;
9
+ const FLIP_POST = 0.66;
10
+ export const JUMP_DEFAULTS = {
11
+ height: HOP_SPIN_H,
12
+ time: HOP_T,
13
+ stretch: 1,
14
+ squash: 1.15,
15
+ squashTime: 0.37,
16
+ squashEase: "pulse",
17
+ groundTime: 0.11,
18
+ groundEase: "pulse",
19
+ riseTime: 0.33,
20
+ riseEase: "pulse",
21
+ clickSquashTime: 0.24,
22
+ spin: 1,
23
+ lean: 6,
24
+ every: 8,
25
+ land: 0
26
+ };
27
+ const flipPre = (j, poked)=>poked ? j.clickSquashTime : FLIP_PRE * j.time;
28
+ const flipDuration = (j, poked)=>flipPre(j, poked) + j.time + SQUASH_PEAK[j.squashEase] * (poked ? j.clickSquashTime : j.squashTime) + Math.max(0, j.groundTime) + j.riseTime + Math.max(0, j.land) + 0.05;
29
+ const SQUASH_PEAK = {
30
+ sharp: 0,
31
+ pulse: 2 / 7,
32
+ soft: 0.5,
33
+ bouncy: 0.144
34
+ };
35
+ const risePulse = (v, ease)=>{
36
+ if (v <= 0) return 1;
37
+ if (v >= 1) return 0;
38
+ switch(ease){
39
+ case "sharp":
40
+ return (1 - v) * (1 - v);
41
+ case "soft":
42
+ return 0.5 + 0.5 * Math.cos(Math.PI * v);
43
+ case "bouncy":
44
+ return Math.exp(-3.2 * v) * Math.cos(5.4 * v) - v * v * v * 0.026;
45
+ default:
46
+ {
47
+ const k = 4.2 * v;
48
+ return (1 + k) * Math.exp(-k) - v * v * v * 0.078;
49
+ }
50
+ }
51
+ };
52
+ const groundShape = (v, ease)=>1 + 0.25 * squashPulse(v, ease);
53
+ const squashPulse = (u, ease)=>{
54
+ if (u <= 0 || u >= 1) return 0;
55
+ let x;
56
+ switch(ease){
57
+ case "sharp":
58
+ x = (1 - u) * (1 - u);
59
+ break;
60
+ case "soft":
61
+ x = Math.sin(Math.PI * u) ** 2;
62
+ break;
63
+ case "bouncy":
64
+ x = Math.exp(-3.15 * u) * Math.sin(8.43 * u) / 0.596;
65
+ break;
66
+ default:
67
+ {
68
+ const k = 7 * u;
69
+ x = k * k * Math.exp(2 - k) / 4;
70
+ }
71
+ }
72
+ const tail = u > 0.85 ? 1 - (u - 0.85) / 0.15 : 1;
73
+ return x * tail * tail * (3 - 2 * tail);
74
+ };
75
+ const hopSquash = (a)=>Math.exp(-Math.pow(Math.min(Math.abs(a), Math.abs(a - 1)) / 0.11, 2));
76
+ const DEG = Math.PI / 180;
77
+ const TAU = Math.PI * 2;
78
+ const SWITCH_TO = {
79
+ default: 1.2,
80
+ working: 0.7,
81
+ sleeping: 1.4
82
+ };
83
+ const SWITCH_FROM_SLEEP = 1;
84
+ function rng(seed) {
85
+ let a = seed * 0x9e3779b1 >>> 0 || 1;
86
+ return ()=>{
87
+ a = a + 0x6d2b79f5 >>> 0;
88
+ let t = a;
89
+ t = Math.imul(t ^ t >>> 15, t | 1);
90
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
91
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
92
+ };
93
+ }
94
+ function approach(cur, target, rate, dt) {
95
+ return cur + (target - cur) * (1 - Math.exp(-rate * dt));
96
+ }
97
+ const easeInOut = (p)=>p < 0.5 ? 4 * p * p * p : 1 - Math.pow(-2 * p + 2, 3) / 2;
98
+ const easeSine = (p)=>0.5 - 0.5 * Math.cos(Math.PI * p);
99
+ class Wander {
100
+ rand;
101
+ amp;
102
+ holdMin;
103
+ holdMax;
104
+ rate;
105
+ spring;
106
+ value = 0;
107
+ vel = 0;
108
+ target = 0;
109
+ next = 0;
110
+ constructor(rand, amp, holdMin, holdMax, rate, spring = false){
111
+ this.rand = rand;
112
+ this.amp = amp;
113
+ this.holdMin = holdMin;
114
+ this.holdMax = holdMax;
115
+ this.rate = rate;
116
+ this.spring = spring;
117
+ }
118
+ update(t, dt) {
119
+ if (t >= this.next) {
120
+ this.target = (this.rand() * 2 - 1) * this.amp;
121
+ this.next = t + this.holdMin + this.rand() * (this.holdMax - this.holdMin);
122
+ }
123
+ if (this.spring) {
124
+ const w = this.rate * 1.6, z = 0.9;
125
+ this.vel += (w * w * (this.target - this.value) - 2 * z * w * this.vel) * dt;
126
+ this.value += this.vel * dt;
127
+ } else this.value = approach(this.value, this.target, this.rate, dt);
128
+ }
129
+ aim(v) {
130
+ this.target = v;
131
+ this.next = Infinity;
132
+ }
133
+ set(amp, holdMin, holdMax, rate) {
134
+ this.amp = amp;
135
+ this.holdMin = holdMin;
136
+ this.holdMax = holdMax;
137
+ this.rate = rate;
138
+ this.next = 0;
139
+ }
140
+ }
141
+ class Event {
142
+ duration;
143
+ p = -1;
144
+ constructor(duration){
145
+ this.duration = duration;
146
+ }
147
+ fire() {
148
+ this.p = 0;
149
+ }
150
+ get active() {
151
+ return this.p >= 0;
152
+ }
153
+ update(dt) {
154
+ if (this.p < 0) return;
155
+ this.p += dt / this.duration;
156
+ if (this.p >= 1) this.p = -1;
157
+ }
158
+ }
159
+ const GAZE_YAW = 35 * DEG;
160
+ const GAZE_PITCH = 14 * DEG;
161
+ const GAZE_ROLL = 3.2 * DEG;
162
+ const GAZE_HOLD_MIN = 2.6;
163
+ const GAZE_HOLD_MAX = 4.4;
164
+ const REST = {
165
+ default: {
166
+ pitch: 0,
167
+ roll: 0,
168
+ y: 0,
169
+ lookX: 0,
170
+ lookY: 0
171
+ },
172
+ working: {
173
+ pitch: 5 * DEG,
174
+ roll: 0,
175
+ y: 0,
176
+ lookX: 0,
177
+ lookY: 0
178
+ },
179
+ sleeping: {
180
+ pitch: -16 * DEG,
181
+ roll: 6 * DEG,
182
+ y: 3,
183
+ lookX: 0,
184
+ lookY: 1
185
+ }
186
+ };
187
+ export class Sim {
188
+ pose = {
189
+ yaw: 0,
190
+ pitch: 0,
191
+ roll: 0,
192
+ x: 0,
193
+ y: 0,
194
+ sx: 1,
195
+ sy: 1,
196
+ eyeOpen: 1,
197
+ blinkL: 0,
198
+ blinkR: 0,
199
+ lookX: 0,
200
+ lookY: 0,
201
+ breath: 0,
202
+ laugh: 0,
203
+ whirl: 0,
204
+ whirlAngle: 0,
205
+ w: [
206
+ 1,
207
+ 0,
208
+ 0
209
+ ]
210
+ };
211
+ state = "default";
212
+ rand;
213
+ t = 0;
214
+ wFrom = [
215
+ 1,
216
+ 0,
217
+ 0
218
+ ];
219
+ tr = 1;
220
+ trDuration = 1.2;
221
+ yawW;
222
+ pitchW;
223
+ rollW;
224
+ lookXW;
225
+ lookYW;
226
+ blink = new Event(0.17);
227
+ blinkAt;
228
+ blinkAgain = false;
229
+ dart = new Event(0.12);
230
+ dartAt;
231
+ dartX = 0;
232
+ dartY = 0;
233
+ flip = new Event(flipDuration(JUMP_DEFAULTS, false));
234
+ flipPoked = false;
235
+ jump = {
236
+ ...JUMP_DEFAULTS
237
+ };
238
+ flipAt;
239
+ flipSide = 1;
240
+ nod = new Event(1.7);
241
+ nodAt;
242
+ hopPhase = 0;
243
+ hopCount = 0;
244
+ hopGain = 0;
245
+ laughEv = new Event(0.8);
246
+ laughAt;
247
+ prevYaw = 0;
248
+ jelly = 0;
249
+ jellyV = 0;
250
+ gazeLead = 0;
251
+ gazeDir = [
252
+ 0,
253
+ 0
254
+ ];
255
+ gazeAt = 0;
256
+ turnK = 1;
257
+ breathPhase = 0;
258
+ ptrX = 0;
259
+ ptrY = 0;
260
+ ptrS = 0;
261
+ ptrTargetX = 0;
262
+ ptrTargetY = 0;
263
+ ptrTargetS = 0;
264
+ baseYaw = 0;
265
+ constructor(seed, state = "default"){
266
+ this.rand = rng(Math.floor(seed * 1e6) + 1);
267
+ const r = this.rand;
268
+ this.yawW = new Wander(r, 36 * DEG, 1.1, 2.6, 3, true);
269
+ this.pitchW = new Wander(r, 10 * DEG, 1.1, 2.6, 2.6, true);
270
+ this.rollW = new Wander(r, 5 * DEG, 1.6, 3.2, 2, true);
271
+ this.lookXW = new Wander(r, 3.6, 0.5, 2, 14);
272
+ this.lookYW = new Wander(r, 2.4, 0.5, 2, 14);
273
+ this.t = r() * 10;
274
+ this.hopPhase = r();
275
+ this.breathPhase = r();
276
+ this.blinkAt = this.t + 1 + r() * 3;
277
+ this.flipAt = this.nextFlip(this.t, 1);
278
+ this.nodAt = this.t + 3 + r() * 4;
279
+ this.dartAt = this.t + 1 + r() * 2;
280
+ this.laughAt = this.t + 0.6 + r() * 1.5;
281
+ this.setState(state, true);
282
+ }
283
+ setState(next, immediate = false) {
284
+ if (next === this.state && !immediate) return;
285
+ const from = this.state;
286
+ this.state = next;
287
+ const w = this.pose.w;
288
+ if (immediate) {
289
+ for(let i = 0; i < 3; i++)w[i] = STATES[i] === next ? 1 : 0;
290
+ this.tr = 1;
291
+ } else {
292
+ this.wFrom = [
293
+ w[0],
294
+ w[1],
295
+ w[2]
296
+ ];
297
+ this.tr = 0;
298
+ this.trDuration = from === "sleeping" ? SWITCH_FROM_SLEEP : SWITCH_TO[next];
299
+ }
300
+ switch(next){
301
+ case "default":
302
+ this.yawW.set(GAZE_YAW, 2.6, 5.4, 2);
303
+ this.pitchW.set(GAZE_PITCH, 2.8, 5.8, 1.8);
304
+ this.rollW.set(GAZE_ROLL, 3.4, 6.6, 1.5);
305
+ this.gazeAt = 0;
306
+ this.gazeDir = [
307
+ 0,
308
+ 0
309
+ ];
310
+ this.lookXW.set(3.6, 0.6, 2.2, 13);
311
+ this.lookYW.set(2.4, 0.6, 2.2, 13);
312
+ this.flipAt = this.nextFlip(this.t, 0.6);
313
+ break;
314
+ case "working":
315
+ this.yawW.set(16 * DEG, 0.9, 1.8, 4);
316
+ this.pitchW.set(3 * DEG, 1.2, 2.4, 3);
317
+ this.rollW.set(0, 1, 2, 3);
318
+ this.lookXW.set(2, 0.5, 1.2, 12);
319
+ this.lookYW.set(1, 0.5, 1.2, 12);
320
+ this.hopPhase = 0;
321
+ this.hopCount = 0;
322
+ this.laughAt = this.t + 0.5 + this.rand() * 1.2;
323
+ break;
324
+ case "sleeping":
325
+ this.yawW.set(7 * DEG, 3, 6, 0.7);
326
+ this.pitchW.set(3 * DEG, 3, 6, 0.7);
327
+ this.rollW.set(2 * DEG, 3, 6, 0.6);
328
+ this.lookXW.set(0, 2, 4, 2);
329
+ this.lookYW.set(0, 2, 4, 2);
330
+ this.nodAt = this.t + 2.5 + this.rand() * 4;
331
+ break;
332
+ }
333
+ }
334
+ setPointer(x, y, strength) {
335
+ this.ptrTargetX = Math.max(-1.2, Math.min(1.2, x));
336
+ this.ptrTargetY = Math.max(-1.2, Math.min(1.2, y));
337
+ this.ptrTargetS = Math.max(0, Math.min(1, strength));
338
+ }
339
+ poke() {
340
+ if (this.flip.active && this.flip.p < 0.6) return;
341
+ this.flipPoked = true;
342
+ this.flip.duration = flipDuration(this.jump, true);
343
+ this.flipSide = this.rand() < 0.5 ? -1 : 1;
344
+ this.flip.fire();
345
+ this.flipAt = this.nextFlip(this.t, 1.1);
346
+ }
347
+ setTurn(k) {
348
+ const next = Math.max(0, k);
349
+ if (next === this.turnK) return;
350
+ this.turnK = next;
351
+ if (this.state === "default") this.gazeAt = 0;
352
+ }
353
+ setJump(j) {
354
+ const every = this.jump.every;
355
+ Object.assign(this.jump, j);
356
+ if (j.every !== undefined && j.every !== every) this.flipAt = this.nextFlip(this.t, 1);
357
+ }
358
+ nextGaze() {
359
+ const r = this.rand;
360
+ const [px, py] = this.gazeDir;
361
+ if (px !== 0 || py !== 0) {
362
+ const p = r();
363
+ if (p < 0.66) return [
364
+ -px,
365
+ -py
366
+ ];
367
+ if (p < 0.85) return [
368
+ -px,
369
+ py
370
+ ];
371
+ return [
372
+ 0,
373
+ 0
374
+ ];
375
+ }
376
+ const corners = [
377
+ [
378
+ 1,
379
+ -1
380
+ ],
381
+ [
382
+ -1,
383
+ 1
384
+ ],
385
+ [
386
+ -1,
387
+ -1
388
+ ],
389
+ [
390
+ 1,
391
+ 1
392
+ ]
393
+ ];
394
+ return corners[Math.floor(r() * corners.length)];
395
+ }
396
+ nextFlip(t, k) {
397
+ const every = this.jump.every;
398
+ return every > 0 ? t + every * k * (0.625 + this.rand() * 0.75) : Infinity;
399
+ }
400
+ update(dt) {
401
+ dt = Math.min(dt, 0.05);
402
+ this.t += dt;
403
+ const t = this.t;
404
+ const p = this.pose;
405
+ const w = p.w;
406
+ if (this.tr < 1) {
407
+ this.tr = Math.min(1, this.tr + dt / this.trDuration);
408
+ const e = easeSine(this.tr);
409
+ for(let i = 0; i < 3; i++){
410
+ const target = STATES[i] === this.state ? 1 : 0;
411
+ w[i] = this.wFrom[i] + (target - this.wFrom[i]) * e;
412
+ }
413
+ }
414
+ const [wd, ww, ws] = w;
415
+ const rest = {
416
+ pitch: 0,
417
+ roll: 0,
418
+ y: 0,
419
+ lookX: 0,
420
+ lookY: 0
421
+ };
422
+ for(let i = 0; i < 3; i++){
423
+ const r = REST[STATES[i]];
424
+ rest.pitch += r.pitch * w[i];
425
+ rest.roll += r.roll * w[i];
426
+ rest.y += r.y * w[i];
427
+ rest.lookX += r.lookX * w[i];
428
+ rest.lookY += r.lookY * w[i];
429
+ }
430
+ if (this.state === "default" && t >= this.gazeAt) {
431
+ const [gx, gy] = this.nextGaze();
432
+ this.gazeDir = [
433
+ gx,
434
+ gy
435
+ ];
436
+ const reach = 0.84 + this.rand() * 0.16;
437
+ this.yawW.aim(gx * GAZE_YAW * reach * this.turnK);
438
+ this.pitchW.aim(gy * GAZE_PITCH * reach);
439
+ this.rollW.aim(gx * GAZE_ROLL * reach * this.turnK);
440
+ this.gazeAt = t + GAZE_HOLD_MIN + this.rand() * (GAZE_HOLD_MAX - GAZE_HOLD_MIN);
441
+ }
442
+ this.yawW.update(t, dt);
443
+ this.pitchW.update(t, dt);
444
+ this.rollW.update(t, dt);
445
+ this.lookXW.update(t, dt);
446
+ this.lookYW.update(t, dt);
447
+ this.ptrS = approach(this.ptrS, this.ptrTargetS, 8, dt);
448
+ this.ptrX = approach(this.ptrX, this.ptrTargetX, 14, dt);
449
+ this.ptrY = approach(this.ptrY, this.ptrTargetY, 14, dt);
450
+ const ps = this.ptrS;
451
+ const quiet = 1 - 0.75 * ps;
452
+ this.baseYaw = approach(this.baseYaw, this.yawW.value * quiet + 22 * DEG * this.ptrX * ps, 5, dt);
453
+ const basePitch = rest.pitch + this.pitchW.value * quiet - 12 * DEG * this.ptrY * ps;
454
+ const baseRoll = rest.roll + this.rollW.value * quiet;
455
+ const baseY = rest.y;
456
+ const baseLookX = rest.lookX + this.lookXW.value * quiet + 4.5 * this.ptrX * ps;
457
+ const baseLookY = rest.lookY + this.lookYW.value * quiet + 3 * this.ptrY * ps;
458
+ let spin = 0, hopY = 0, sx = 1, sy = 1, pitchAdd = 0, rollAdd = 0, blinkClose = 0, lookXAdd = 0, lookYAdd = 0, laugh = 0;
459
+ let whirl = 0, whirlAngle = 0;
460
+ const smooth = (a, b, v)=>{
461
+ const x = Math.min(1, Math.max(0, (v - a) / (b - a)));
462
+ return x * x * (3 - 2 * x);
463
+ };
464
+ const envelope = (q)=>smooth(0.1, 0.26, q) * (1 - smooth(0.66, 0.9, q));
465
+ const ringAngle = (q)=>TAU * (1.5 * q + 0.9 * easeInOut(q));
466
+ if (t >= this.blinkAt && !this.blink.active && wd + ww > 0.5) {
467
+ this.blink.fire();
468
+ this.blinkAgain = !this.blinkAgain && this.rand() < 0.22;
469
+ this.blinkAt = t + (this.blinkAgain ? 0.28 : 2.2 + this.rand() * 2.6);
470
+ }
471
+ this.blink.update(dt);
472
+ if (this.blink.active) blinkClose = Math.sin(Math.PI * this.blink.p);
473
+ if (t >= this.dartAt && !this.dart.active && wd + ww > 0.5) {
474
+ this.dart.fire();
475
+ this.dartX = (this.rand() * 2 - 1) * 4;
476
+ this.dartY = (this.rand() * 2 - 1) * 2;
477
+ this.dart.duration = 0.25 + this.rand() * 0.45;
478
+ this.dartAt = t + 1.2 + this.rand() * 2.6;
479
+ }
480
+ this.dart.update(dt);
481
+ if (this.dart.active) {
482
+ const q = this.dart.p;
483
+ const hold = q < 0.15 ? q / 0.15 : q > 0.8 ? (1 - q) / 0.2 : 1;
484
+ lookXAdd += this.dartX * hold * (wd + ww);
485
+ lookYAdd += this.dartY * hold * (wd + ww);
486
+ }
487
+ if (this.state === "default" && t >= this.flipAt && !this.flip.active) {
488
+ this.flipPoked = false;
489
+ this.flip.duration = flipDuration(this.jump, false);
490
+ this.flipSide = this.rand() < 0.5 ? -1 : 1;
491
+ this.flip.fire();
492
+ this.flipAt = this.nextFlip(t, 1);
493
+ }
494
+ this.flip.update(dt);
495
+ if (this.flip.active) {
496
+ const J = this.jump;
497
+ const preS = flipPre(J, this.flipPoked);
498
+ const a = (this.flip.p * this.flip.duration - preS) / J.time;
499
+ const q = Math.min(1, Math.max(0, a));
500
+ const arc = Math.sin(Math.PI * q);
501
+ spin += TAU * J.spin * easeInOut(q);
502
+ hopY -= J.height * arc;
503
+ const tl = (a - 1) * J.time - J.land;
504
+ const squashTime = this.flipPoked ? J.clickSquashTime : J.squashTime;
505
+ const crouch = (u)=>this.flipPoked ? u * u * (3 - 2 * u) : hopSquash(u - 1);
506
+ const hold = Math.max(0, J.groundTime);
507
+ const peakT = SQUASH_PEAK[J.squashEase] * squashTime;
508
+ const rise = tl - peakT - hold;
509
+ const depth = tl <= peakT ? squashPulse(tl / squashTime, J.squashEase) : rise <= 0 ? groundShape((tl - peakT) / hold, J.groundEase) : risePulse(rise / J.riseTime, J.riseEase);
510
+ const land = (a < 0 ? crouch(Math.max(0, 1 + a * J.time / preS)) : tl > 0 ? depth : a < 0.2 ? hopSquash(a) : 0) * J.squash;
511
+ sx += 0.16 * land - 0.06 * arc * J.stretch;
512
+ sy += -0.18 * land + 0.09 * arc * J.stretch;
513
+ rollAdd += this.flipSide * J.lean * DEG * arc;
514
+ if (J.spin > 0) {
515
+ laugh = Math.max(laugh, arc);
516
+ whirl = Math.max(whirl, envelope(q));
517
+ whirlAngle = ringAngle(q);
518
+ }
519
+ }
520
+ const J = this.jump;
521
+ const exitHold = Math.max(0, J.groundTime);
522
+ const exitFor = exitHold + J.riseTime;
523
+ if (this.state === "working") this.hopGain = ww;
524
+ if (this.hopGain > 0.02 && (this.state === "working" || this.hopPhase > 0)) {
525
+ this.hopPhase += dt / HOP_T;
526
+ if (this.hopPhase >= 1) {
527
+ if (this.state === "working") {
528
+ this.hopPhase -= 1;
529
+ this.hopCount += 1;
530
+ } else if ((this.hopPhase - 1) * HOP_T >= exitFor) {
531
+ this.hopPhase = 0;
532
+ this.hopGain = 0;
533
+ }
534
+ }
535
+ const g = this.hopGain;
536
+ const q = Math.min(1, this.hopPhase);
537
+ const arc = Math.sin(Math.PI * q);
538
+ const spinning = this.hopCount % 3 === 2;
539
+ const h = spinning ? HOP_SPIN_H : 18;
540
+ hopY -= h * arc * g;
541
+ const exitT = this.state !== "working" && this.hopPhase > 1 ? (this.hopPhase - 1) * HOP_T : -1;
542
+ const land = exitT < 0 ? hopSquash(this.hopPhase) : exitT < exitHold ? groundShape(exitT / exitHold, J.groundEase) : risePulse((exitT - exitHold) / J.riseTime, J.riseEase);
543
+ sx += (0.16 * land - 0.06 * arc) * g;
544
+ sy += (-0.18 * land + 0.09 * arc) * g;
545
+ if (spinning) {
546
+ spin += TAU * easeInOut(q) * g;
547
+ laugh = Math.max(laugh, arc * g);
548
+ if (envelope(q) * g > whirl) {
549
+ whirl = envelope(q) * g;
550
+ whirlAngle = ringAngle(q);
551
+ }
552
+ }
553
+ rollAdd += (this.hopCount % 2 === 0 ? 1 : -1) * 6 * DEG * arc * g;
554
+ }
555
+ if (this.state === "working" && t >= this.laughAt && !this.laughEv.active) {
556
+ this.laughEv.fire();
557
+ this.laughEv.duration = 0.6 + this.rand() * 0.5;
558
+ this.laughAt = t + 1.6 + this.rand() * 2.2;
559
+ }
560
+ this.laughEv.update(dt);
561
+ if (this.laughEv.active) {
562
+ const q = this.laughEv.p;
563
+ laugh = Math.max(laugh, q < 0.18 ? q / 0.18 : q > 0.78 ? (1 - q) / 0.22 : 1);
564
+ }
565
+ if (this.state === "sleeping" && t >= this.nodAt && !this.nod.active) {
566
+ this.nod.fire();
567
+ this.nodAt = t + 4 + this.rand() * 4;
568
+ }
569
+ this.nod.update(dt);
570
+ if (this.nod.active) {
571
+ const q = this.nod.p;
572
+ const dip = q < 0.72 ? easeInOut(q / 0.72) : 1 - easeInOut((q - 0.72) / 0.28);
573
+ pitchAdd -= 13 * DEG * dip * ws;
574
+ }
575
+ this.breathPhase += dt / (3.6 + 1.2 * ws);
576
+ const breath = Math.sin(this.breathPhase * TAU);
577
+ p.breath = breath;
578
+ sx += breath * (0.008 + 0.014 * ws);
579
+ sy += breath * (0.012 + 0.02 * ws);
580
+ const bob = Math.sin(t * TAU / 3.4) * 2 * (1 - ws);
581
+ p.yaw = this.baseYaw + spin;
582
+ let dyaw = this.baseYaw - this.prevYaw;
583
+ dyaw = ((dyaw + Math.PI) % TAU + TAU) % TAU - Math.PI;
584
+ this.prevYaw = this.baseYaw;
585
+ const rate = dt > 0 ? Math.abs(dyaw) / dt : 0;
586
+ const leadTarget = dt > 0 ? Math.max(-2.2, Math.min(2.2, dyaw / dt * 2.4)) : 0;
587
+ this.gazeLead = approach(this.gazeLead, leadTarget, 9, dt);
588
+ const jellyTarget = Math.min(0.22, 0.055 * rate);
589
+ const omega = 16, zeta = 0.45;
590
+ this.jellyV += (omega * omega * (jellyTarget - this.jelly) - 2 * zeta * omega * this.jellyV) * dt;
591
+ this.jelly += this.jellyV * dt;
592
+ const jelly = Math.max(-0.08, Math.min(0.28, this.jelly)) * 0.6;
593
+ sx *= 1 + jelly;
594
+ sy *= 1 - 0.55 * jelly;
595
+ p.pitch = basePitch + pitchAdd;
596
+ p.roll = baseRoll + rollAdd;
597
+ p.x = 0;
598
+ p.y = baseY + hopY + bob;
599
+ p.sx = sx;
600
+ p.sy = sy;
601
+ p.eyeOpen = 1;
602
+ p.laugh = approach(p.laugh, laugh, 30, dt);
603
+ p.blinkL = blinkClose;
604
+ p.blinkR = blinkClose;
605
+ p.lookX = baseLookX + lookXAdd + this.gazeLead;
606
+ p.lookY = baseLookY + lookYAdd;
607
+ p.whirl = whirl;
608
+ p.whirlAngle = whirlAngle;
609
+ }
610
+ }
611
+ export function restPose(state) {
612
+ const r = REST[state];
613
+ return {
614
+ yaw: 0,
615
+ pitch: r.pitch,
616
+ roll: r.roll,
617
+ x: 0,
618
+ y: r.y,
619
+ sx: 1,
620
+ sy: 1,
621
+ eyeOpen: 1,
622
+ blinkL: 0,
623
+ blinkR: 0,
624
+ lookX: r.lookX,
625
+ lookY: r.lookY,
626
+ breath: 0,
627
+ laugh: 0,
628
+ whirl: 0,
629
+ whirlAngle: 0,
630
+ w: STATES.map((s)=>s === state ? 1 : 0)
631
+ };
632
+ }