@usetheo/ui 0.1.0-next.0 → 0.3.0-next.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 (146) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +116 -9
  3. package/dist/index.d.ts +242 -16
  4. package/dist/index.js +436 -131
  5. package/dist/index.js.map +1 -1
  6. package/dist/plugin-Atb0VKtr.d.ts +172 -0
  7. package/dist/slide/index.d.ts +212 -0
  8. package/dist/slide/index.js +714 -0
  9. package/dist/slide/index.js.map +1 -0
  10. package/dist/slide/plugins/emoji/index.d.ts +29 -0
  11. package/dist/slide/plugins/emoji/index.js +157 -0
  12. package/dist/slide/plugins/emoji/index.js.map +1 -0
  13. package/dist/slide/plugins/math/index.d.ts +13 -0
  14. package/dist/slide/plugins/math/index.js +145 -0
  15. package/dist/slide/plugins/math/index.js.map +1 -0
  16. package/dist/slide/plugins/mermaid/index.d.ts +55 -0
  17. package/dist/slide/plugins/mermaid/index.js +218 -0
  18. package/dist/slide/plugins/mermaid/index.js.map +1 -0
  19. package/dist/slide/plugins/shiki/index.d.ts +18 -0
  20. package/dist/slide/plugins/shiki/index.js +87 -0
  21. package/dist/slide/plugins/shiki/index.js.map +1 -0
  22. package/dist/slide/themes/default.css +256 -0
  23. package/dist/slide/themes/layouts.css +143 -0
  24. package/dist/slide/themes/violet-forge.css +256 -0
  25. package/dist/slide-deck/index.css +52 -0
  26. package/dist/slide-deck/index.css.map +1 -0
  27. package/dist/slide-deck/index.d.ts +377 -0
  28. package/dist/slide-deck/index.js +1797 -0
  29. package/dist/slide-deck/index.js.map +1 -0
  30. package/dist/whiteboard/index.d.ts +258 -0
  31. package/dist/whiteboard/index.js +738 -0
  32. package/dist/whiteboard/index.js.map +1 -0
  33. package/package.json +126 -6
  34. package/registry/index.json +42 -0
  35. package/registry/r/agent-composer.json +4 -4
  36. package/registry/r/agent-editor.json +9 -9
  37. package/registry/r/agent-error-card.json +2 -2
  38. package/registry/r/agent-event.json +4 -4
  39. package/registry/r/agent-handoff.json +2 -2
  40. package/registry/r/agent-profile.json +2 -2
  41. package/registry/r/agent-starting-state.json +2 -2
  42. package/registry/r/agent-stream.json +9 -9
  43. package/registry/r/agent-streaming.json +2 -2
  44. package/registry/r/agent-timeline.json +4 -4
  45. package/registry/r/approval-card.json +4 -4
  46. package/registry/r/artifact-preview.json +2 -2
  47. package/registry/r/attachment-chip.json +4 -4
  48. package/registry/r/audit-log-entry.json +3 -3
  49. package/registry/r/auto-compact-notice.json +2 -2
  50. package/registry/r/avatar.json +2 -2
  51. package/registry/r/badge.json +3 -3
  52. package/registry/r/browser-controls.json +2 -2
  53. package/registry/r/build-log-stream.json +2 -2
  54. package/registry/r/button.json +3 -3
  55. package/registry/r/capability-indicator.json +3 -3
  56. package/registry/r/card.json +3 -3
  57. package/registry/r/chat-composer.json +3 -3
  58. package/registry/r/chat-message.json +3 -3
  59. package/registry/r/chat-thread.json +2 -2
  60. package/registry/r/checkbox.json +4 -3
  61. package/registry/r/cn.json +1 -1
  62. package/registry/r/command-palette.json +4 -4
  63. package/registry/r/context-card.json +3 -3
  64. package/registry/r/context-window-bar.json +2 -2
  65. package/registry/r/cost-meter.json +2 -2
  66. package/registry/r/created-files-card.json +3 -3
  67. package/registry/r/cron-job-card.json +2 -2
  68. package/registry/r/cron-jobs-list.json +3 -3
  69. package/registry/r/deployment-row.json +3 -3
  70. package/registry/r/dialog.json +2 -2
  71. package/registry/r/diff-viewer.json +2 -2
  72. package/registry/r/domain-config.json +6 -6
  73. package/registry/r/empty-state.json +3 -3
  74. package/registry/r/env-var-editor.json +5 -5
  75. package/registry/r/folder-context-card.json +3 -3
  76. package/registry/r/folder-selector.json +2 -2
  77. package/registry/r/form-field.json +3 -3
  78. package/registry/r/hook-config.json +2 -2
  79. package/registry/r/hook-event-log.json +2 -2
  80. package/registry/r/input.json +6 -3
  81. package/registry/r/intent-selector.json +3 -3
  82. package/registry/r/label.json +2 -2
  83. package/registry/r/lane-board.json +2 -2
  84. package/registry/r/login-split.json +2 -2
  85. package/registry/r/mcp-server-card.json +2 -2
  86. package/registry/r/mcp-server-list.json +3 -3
  87. package/registry/r/memory-editor.json +3 -3
  88. package/registry/r/mention-menu.json +3 -3
  89. package/registry/r/metrics-panel.json +2 -2
  90. package/registry/r/model-card.json +3 -3
  91. package/registry/r/model-selector.json +2 -2
  92. package/registry/r/permission-matrix.json +2 -2
  93. package/registry/r/permission-modal.json +4 -4
  94. package/registry/r/preview-env-card.json +5 -5
  95. package/registry/r/preview-panel.json +3 -3
  96. package/registry/r/progress-checklist.json +3 -3
  97. package/registry/r/project-card.json +5 -5
  98. package/registry/r/project-switcher.json +2 -2
  99. package/registry/r/quick-action-chips.json +3 -3
  100. package/registry/r/radio-group.json +2 -2
  101. package/registry/r/recent-folders-list.json +2 -2
  102. package/registry/r/rollback-ui.json +4 -4
  103. package/registry/r/rule-card.json +3 -3
  104. package/registry/r/rule-editor.json +10 -10
  105. package/registry/r/rule-types.json +1 -1
  106. package/registry/r/run-stats.json +2 -2
  107. package/registry/r/running-tasks-panel.json +2 -2
  108. package/registry/r/scroll-area.json +2 -2
  109. package/registry/r/select.json +4 -3
  110. package/registry/r/session-list-item.json +2 -2
  111. package/registry/r/session-timeline.json +2 -2
  112. package/registry/r/sheet.json +2 -2
  113. package/registry/r/sidebar.json +2 -2
  114. package/registry/r/skeleton.json +2 -2
  115. package/registry/r/skill-card.json +4 -4
  116. package/registry/r/skill-editor.json +10 -10
  117. package/registry/r/skills-list.json +3 -3
  118. package/registry/r/slide-deck.json +130 -0
  119. package/registry/r/slide-plugin-emoji.json +28 -0
  120. package/registry/r/slide-plugin-math.json +24 -0
  121. package/registry/r/slide-plugin-mermaid.json +23 -0
  122. package/registry/r/slide-plugin-shiki.json +23 -0
  123. package/registry/r/slide.json +123 -0
  124. package/registry/r/social-auth-row.json +3 -3
  125. package/registry/r/steps-rail.json +2 -2
  126. package/registry/r/sub-agent-dispatch.json +2 -2
  127. package/registry/r/switch.json +5 -4
  128. package/registry/r/system-prompt-editor.json +2 -2
  129. package/registry/r/tabs.json +2 -2
  130. package/registry/r/tailwind-preset.json +1 -1
  131. package/registry/r/task-header.json +4 -4
  132. package/registry/r/task-plan.json +2 -2
  133. package/registry/r/terminal-panel.json +2 -2
  134. package/registry/r/textarea.json +6 -3
  135. package/registry/r/theme-provider.json +4 -4
  136. package/registry/r/theme-script.json +1 -1
  137. package/registry/r/theo-ui-provider.json +2 -2
  138. package/registry/r/toast.json +3 -3
  139. package/registry/r/token-usage-chart.json +2 -2
  140. package/registry/r/tool-call-card.json +3 -3
  141. package/registry/r/tool-call.json +2 -2
  142. package/registry/r/tool-result.json +2 -2
  143. package/registry/r/tools-list.json +3 -3
  144. package/registry/r/tooltip.json +2 -2
  145. package/registry/r/topnav.json +2 -2
  146. package/registry/r/whiteboard.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/primitives/whiteboard/seed.ts","../../src/components/primitives/whiteboard/render/freedraw.tsx","../../src/components/primitives/whiteboard/render/rough-paths.ts","../../src/components/primitives/whiteboard/render/style.ts","../../src/components/primitives/whiteboard/render/line.tsx","../../src/components/primitives/whiteboard/render/shape.tsx","../../src/components/primitives/whiteboard/render/text.tsx","../../src/components/primitives/whiteboard/render/scene.tsx","../../src/components/primitives/whiteboard/schema.ts","../../src/components/primitives/whiteboard/validate.ts","../../src/components/primitives/whiteboard/viewport/use-pointer-pan.ts","../../src/components/primitives/whiteboard/viewport/use-viewport.ts","../../src/components/primitives/whiteboard/whiteboard.tsx"],"names":["strokeStyle","jsx","jsxs","align","fontFamily","z","useCallback","useMemo","useEffect","useRef"],"mappings":";;;;;;;;;AASA,IAAM,mBAAA,GAAsB,UAAA;AAC5B,IAAM,YAAA,GAAe,QAAA;AAGd,SAAS,QAAQ,KAAA,EAAuB;AAC7C,EAAA,IAAI,IAAA,GAAO,mBAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,IAAA,IAAQ,KAAA,CAAM,WAAW,CAAC,CAAA;AAE1B,IAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,IAAA,GAAO,CAAA;AAChB;AAaO,SAAS,WAAW,EAAA,EAA2B;AACpD,EAAA,IAAI,OAAO,GAAG,IAAA,KAAS,QAAA,IAAY,OAAO,QAAA,CAAS,EAAA,CAAG,IAAI,CAAA,EAAG;AAC3D,IAAA,OAAO,GAAG,IAAA,GAAO,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,GAAA,GAAM,GAAG,EAAA,CAAG,IAAI,IAAI,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAA,IAAK,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,EAAE,CAAA,CAAA,EAAI,EAAA,CAAG,KAAA,IAAS,EAAE,CAAA,CAAA;AACpF,EAAA,OAAO,QAAQ,GAAG,CAAA;AACpB;ACxCA,IAAM,sBAAA,GAAyB;AAAA,EAC7B,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,GAAA;AAAA,EACV,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAEA,SAAS,IAAI,CAAA,EAA+B;AAC1C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AACtE;AAEA,SAAS,kBAAkB,MAAA,EAA4B;AACrD,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,EAAC;AAC5B,EAAA,IAAI,CAAA,GAAI,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,EAAC;AACxB,IAAA,CAAA,IAAK,CAAA,GAAA,EAAM,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAA;AAAA,EACnC;AACA,EAAA,CAAA,IAAK,IAAA;AACL,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,eAAe,EAAA,EAAsC;AACnE,EAAA,MAAM,IAAA,GAAA,CAAQ,EAAA,CAAG,WAAA,IAAe,GAAA,IAAO,CAAA;AACvC,EAAA,MAAM,WAAA,GAAc,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA,KAAM;AACtD,IAAA,MAAM,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA;AAClB,IAAA,MAAM,EAAA,GAAK,GAAG,CAAA,GAAI,CAAA;AAClB,IAAA,OAAO,QAAA,KAAa,SAAY,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAC,EAAA,EAAI,EAAA,EAAI,QAAQ,CAAA;AAAA,EAC9D,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,UAAU,WAAA,EAAa;AAAA,IACpC,GAAG,sBAAA;AAAA,IACH;AAAA,GACD,CAAA;AACD,EAAA,MAAM,CAAA,GAAI,kBAAkB,MAAoB,CAAA;AAChD,EAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,WAAW,CAAA,EACxB,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAM,MAAM,EAAA,CAAG,MAAA,IAAU,cAAA,EAAgB,MAAA,EAAO,QAAO,CAAA,EAC/D,CAAA;AAEJ;;;ACzBO,SAAS,YAAA,CAAa,WAA2B,QAAA,EAAiC;AACvF,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACxC,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,GAAG,CAAA,CAAE,CAAA;AAAA,IACL,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,MAAM,CAAA,CAAE;AAAA,GACV,CAAE,CAAA;AACJ;;;ACXA,IAAM,cAAA,GAAiB,cAAA;AAEhB,SAAS,YAAA,CAAa,KAAkB,IAAA,EAAuB;AACpE,EAAA,MAAM,CAAA,GAAa;AAAA,IACjB,IAAA;AAAA,IACA,MAAA,EAAQ,IAAI,MAAA,IAAU,cAAA;AAAA,IACtB,WAAA,EAAa,IAAI,WAAA,IAAe,GAAA;AAAA,IAChC,SAAA,EAAW,IAAI,SAAA,IAAa;AAAA,GAC9B;AACA,EAAA,IAAI,IAAI,WAAA,KAAgB,QAAA,IAAY,cAAA,GAAiB,CAAC,IAAI,CAAC,CAAA;AAAA,OAAA,IAClD,IAAI,WAAA,KAAgB,QAAA,IAAY,cAAA,GAAiB,CAAC,GAAG,CAAC,CAAA;AAC/D,EAAA,IAAI,GAAA,CAAI,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,GAAA,CAAI,IAAA;AAC3B,EAAA,IAAI,GAAA,CAAI,SAAA,EAAW,CAAA,CAAE,SAAA,GAAY,GAAA,CAAI,SAAA;AACrC,EAAA,OAAO,CAAA;AACT;AASO,SAAS,eAAA,CACdA,cACA,WAAA,EACoB;AACpB,EAAA,IAAIA,iBAAgB,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAC,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,CAAC,CAAA;AACvC,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,EACvB;AACA,EAAA,IAAIA,iBAAgB,QAAA,EAAU;AAG5B,IAAA,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,WAAA,GAAc,GAAG,CAAA,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AChDA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,cAAA,GAAiB,KAAK,EAAA,GAAK,CAAA;AAWjC,SAAS,iBAAA,CACP,KAAA,EACA,KAAA,EACA,GAAA,EACA,KACA,WAAA,EACiB;AACjB,EAAA,MAAM,KAAK,GAAA,GAAM,KAAA;AACjB,EAAA,MAAM,KAAK,GAAA,GAAM,KAAA;AACjB,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AACxC,EAAA,IAAI,IAAA,KAAS,GAAG,OAAO,IAAA;AACvB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAE/B,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,eAAe,WAAA,GAAc,CAAA,EAAG,OAAO,GAAG,CAAA;AACnE,EAAA,MAAM,QAAQ,GAAA,GAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC7D,EAAA,MAAM,QAAQ,GAAA,GAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC7D,EAAA,MAAM,SAAS,GAAA,GAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC9D,EAAA,MAAM,SAAS,GAAA,GAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAc,CAAA;AAC9D,EAAA,OAAO,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAA,EAAO;AAChE;AAEA,SAAS,QAAA,CACP,GAAA,EACA,EAAA,EACA,IAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAA,EAAI,IAAI,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,IAAA,CAAK,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,EAAA,CAAG,CAAC,GAAG,IAAI,CAAA;AAC9D,EAAA,MAAM,OAAO,eAAA,CAAgB,EAAA,CAAG,WAAA,EAAa,EAAA,CAAG,eAAe,GAAG,CAAA;AAClE,EAAA,OAAO,YAAA,CAAa,KAAK,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBACzCC,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAGC,GAAG,CAAA,CAAE,CAAA;AAAA,MACL,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,IAAA,EAAK,MAAA;AAAA,MACL,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAiB;AAAA,KAAA;AAAA,IAPZ,QAAQ,CAAC,CAAA;AAAA,GASjB,CAAA;AACH;AAEA,SAAS,SAAA,CACP,KACA,KAAA,EACA,KAAA,EACA,KACA,GAAA,EACA,IAAA,EACA,IACA,IAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,kBAAkB,KAAA,EAAO,KAAA,EAAO,KAAK,GAAA,EAAK,EAAA,CAAG,eAAe,GAAG,CAAA;AAC5E,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAA,EAAI,IAAI,CAAA;AAElC,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAI,CAAA;AAClF,EAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AACrF,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,EAAK,YAAY,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,EAAK,aAAa,CAAA;AAClD,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,SAAA,CAAU,SAAQ,EAAG;AACxC,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,GAAG,CAAA,CAAE,CAAA;AAAA,UACL,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,IAAA,EAAK,MAAA;AAAA,UACL,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,gBAAA,EAAe;AAAA,SAAA;AAAA,QAPV,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,CAAC,CAAA;AAAA;AAQrB,KACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,UAAA,CAAW,SAAQ,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA;AAAA,sBACJA,GAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,GAAG,CAAA,CAAE,CAAA;AAAA,UACL,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,aAAa,CAAA,CAAE,WAAA;AAAA,UACf,IAAA,EAAK,MAAA;AAAA,UACL,aAAA,EAAc,OAAA;AAAA,UACd,cAAA,EAAe,OAAA;AAAA,UACf,gBAAA,EAAe;AAAA,SAAA;AAAA,QAPV,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,CAAC,CAAA;AAAA;AAQrB,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,UAAA,CAAW,KAAqB,EAAA,EAAkC;AAChF,EAAA,uBAAOA,GAAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,OAAA,IAAW,CAAA,EAAI,QAAA,EAAA,QAAA,CAAS,GAAA,EAAK,EAAA,EAAI,EAAA,CAAG,IAAA,IAAQ,CAAC,CAAA,EAAE,CAAA;AACvE;AAEO,SAAS,WAAA,CAAY,KAAqB,EAAA,EAAmC;AAClF,EAAA,MAAM,IAAA,GAAO,GAAG,IAAA,IAAQ,CAAA;AACxB,EAAA,MAAM,QAA2B,CAAC,GAAG,SAAS,GAAA,EAAK,EAAA,EAAI,IAAI,CAAC,CAAA;AAC5D,EAAA,IAAI,EAAA,CAAG,YAAY,KAAA,EAAO;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,SAAA,CAAU,GAAA,EAAK,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,EACnF;AACA,EAAA,IAAI,GAAG,SAAA,EAAW;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,SAAA,CAAU,GAAA,EAAK,GAAG,EAAA,CAAG,CAAC,GAAG,EAAA,CAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,GAAG,EAAA,CAAG,CAAA,EAAG,OAAO,CAAA,EAAG,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,EACrF;AACA,EAAA,IAAI,KAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,GAAG,KAAA,EAAO;AACZ,IAAA,MAAM,QAAQ,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AACjC,IAAA,MAAM,QAAQ,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA;AAEjC,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAA;AACzB,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,IAAA;AACjB,IAAA,MAAM,KAAK,EAAA,GAAK,IAAA;AAChB,IAAA,MAAM,MAAA,GAAS,EAAA;AACf,IAAA,KAAA,mBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAG,OAAO,EAAA,GAAK,MAAA;AAAA,QACf,CAAA,EAAG,OAAO,EAAA,GAAK,MAAA;AAAA,QACf,UAAA,EAAW,QAAA;AAAA,QACX,gBAAA,EAAiB,SAAA;AAAA,QACjB,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAW,sCAAA;AAAA,QACX,IAAA,EAAM,GAAG,MAAA,IAAU,cAAA;AAAA,QACnB,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAO;AAAA,QAE9B,QAAA,EAAA,EAAA,CAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,WAAW,CAAA,EACvB,QAAA,EAAA;AAAA,IAAA,KAAA;AAAA,IACA;AAAA,GAAA,EACH,CAAA;AAEJ;AChJA,SAAS,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,QAAO,EAAe;AACpD,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,CAAA,EAAG,EAAA;AAAA,MACH,CAAA,EAAG,EAAA;AAAA,MACH,UAAA,EAAW,QAAA;AAAA,MACX,gBAAA,EAAiB,SAAA;AAAA,MACjB,QAAA,EAAU,EAAA;AAAA,MACV,UAAA,EAAW,sCAAA;AAAA,MACX,MAAM,MAAA,IAAU,cAAA;AAAA,MAChB,KAAA,EAAO,EAAE,aAAA,EAAe,MAAA,EAAO;AAAA,MAE9B,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,iBAAA,CACP,KAAA,EACA,SAAA,EACA,aAAA,EACA,SAAA,EACmB;AACnB,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAKzB,IAAA,MAAM,SAAA,GAAY,EAAE,MAAA,KAAW,aAAA;AAC/B,IAAA,uBACEA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QAGC,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,IAAA,EAAM,EAAE,IAAA,IAAQ,MAAA;AAAA,QAChB,aAAA,EAAc,OAAA;AAAA,QACd,cAAA,EAAe,OAAA;AAAA,QACf,eAAA,EAAiB,YAAY,SAAA,GAAY;AAAA,OAAA;AAAA,MAPpC,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAQxB;AAAA,EAEJ,CAAC,CAAA;AACH;AAEO,SAAS,UAAA,CAAW,KAAqB,EAAA,EAAkC;AAChF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAC,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,IAAI,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAO,eAAA,CAAgB,EAAA,CAAG,WAAA,EAAa,EAAA,CAAG,eAAe,GAAG,CAAA;AAClE,EAAA,uBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,WAAW,CAAA,EACvB,QAAA,EAAA;AAAA,IAAA,iBAAA,CAAkB,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAkB,IAAI,CAAA;AAAA,IAC5D,EAAA,CAAG,wBACFD,GAAAA,CAAC,SAAM,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,IAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA,GACnF;AAAA,GAAA,EACN,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,KAAqB,EAAA,EAAqC;AACtF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAC,CAAA;AAE1C,EAAA,MAAM,WAAW,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,CAAG,GAAG,IAAI,CAAA;AAC/E,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAO,eAAA,CAAgB,EAAA,CAAG,WAAA,EAAa,EAAA,CAAG,eAAe,GAAG,CAAA;AAClE,EAAA,uBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,WAAW,CAAA,EACvB,QAAA,EAAA;AAAA,IAAA,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,MAAA,EAAkB,IAAI,CAAA;AAAA,IAC/D,EAAA,CAAG,wBACFD,GAAAA,CAAC,SAAM,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,IAAI,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA,GACnF;AAAA,GAAA,EACN,CAAA;AAEJ;AAEO,SAAS,aAAA,CAAc,KAAqB,EAAA,EAAqC;AACtF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,EAAA,EAAI,EAAA,CAAG,QAAQ,CAAC,CAAA;AAC1C,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AACzB,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAA;AACzB,EAAA,MAAM,MAAA,GAA6B;AAAA,IACjC,CAAC,EAAA,EAAI,EAAA,CAAG,CAAC,CAAA;AAAA;AAAA,IACT,CAAC,EAAA,CAAG,CAAA,GAAI,EAAA,CAAG,GAAG,EAAE,CAAA;AAAA;AAAA,IAChB,CAAC,EAAA,EAAI,EAAA,CAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA;AAAA,IAChB,CAAC,EAAA,CAAG,CAAA,EAAG,EAAE;AAAA;AAAA,GACX;AACA,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,QAAQ,CAAA;AACxC,EAAA,MAAM,OAAO,eAAA,CAAgB,EAAA,CAAG,WAAA,EAAa,EAAA,CAAG,eAAe,GAAG,CAAA;AAClE,EAAA,uBACEC,IAAAA,CAAC,GAAA,EAAA,EAAE,OAAA,EAAS,EAAA,CAAG,WAAW,CAAA,EACvB,QAAA,EAAA;AAAA,IAAA,iBAAA,CAAkB,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,MAAA,EAAkB,IAAI,CAAA;AAAA,IAC/D,EAAA,CAAG,KAAA,mBAAQD,GAAAA,CAAC,KAAA,EAAA,EAAM,EAAA,EAAQ,EAAA,EAAQ,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,MAAA,EAAQ,EAAA,CAAG,QAAQ,CAAA,GAAK;AAAA,GAAA,EAC9E,CAAA;AAEJ;ACzGA,IAAM,WAAA,GAAsE;AAAA,EAC1E,IAAA,EAAM,sCAAA;AAAA,EACN,KAAA,EAAO,0BAAA;AAAA,EACP,IAAA,EAAM,gDAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,WAAWE,MAAAA,EAAyD;AAC3E,EAAA,IAAIA,MAAAA,KAAU,UAAU,OAAO,QAAA;AAC/B,EAAA,IAAIA,MAAAA,KAAU,SAAS,OAAO,KAAA;AAC9B,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,WAAW,EAAA,EAAkC;AAC3D,EAAA,MAAM,QAAA,GAAW,GAAG,QAAA,IAAY,EAAA;AAChC,EAAA,MAAMC,WAAAA,GAAa,WAAA,CAAY,EAAA,CAAG,UAAA,IAAc,MAAM,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,EAAA,CAAG,KAAK,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAEhC,EAAA,uBACEH,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAS,EAAA,CAAG,OAAA,IAAW,GACxB,QAAA,kBAAAA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,GAAG,EAAA,CAAG,CAAA;AAAA,MACN,UAAA,EAAY,MAAA;AAAA,MACZ,gBAAA,EAAiB,SAAA;AAAA,MACjB,QAAA;AAAA,MACA,UAAA,EAAYG,WAAAA;AAAA,MACZ,IAAA,EAAM,GAAG,MAAA,IAAU,cAAA;AAAA,MAElB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA;AAAA;AAAA,wBAEhBH,GAAAA,CAAC,OAAA,EAAA,EAAc,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,EAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,QAAA,GAAW,GAAA,EAClD,kBADS,CAEZ;AAAA,OACD;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;ACjCA,SAAS,gBAA6C,EAAA,EAAU;AAC9D,EAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU,OAAO,EAAA;AACxC,EAAA,OAAO,EAAE,GAAG,EAAA,EAAI,IAAA,EAAM,UAAA,CAAW,EAAE,CAAA,EAAE;AACvC;AAEA,SAAS,aAAA,CAAc,IAAuB,GAAA,EAAsC;AAClF,EAAA,QAAQ,GAAG,IAAA;AAAM,IACf,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,GAAA,EAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IAC5C,KAAK,SAAA;AACH,MAAA,OAAO,aAAA,CAAc,GAAA,EAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IAC/C,KAAK,SAAA;AACH,MAAA,OAAO,aAAA,CAAc,GAAA,EAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IAC/C,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,GAAA,EAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IAC5C,KAAK,OAAA;AACH,MAAA,OAAO,WAAA,CAAY,GAAA,EAAK,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IAC7C,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA,IACvC,KAAK,UAAA;AACH,MAAA,OAAO,cAAA,CAAe,eAAA,CAAgB,EAAE,CAAC,CAAA;AAAA;AAE/C;AAEO,SAAS,WAAA,CAAY,OAAwB,GAAA,EAAsC;AACxF,EAAA,uBACEA,IAAA,QAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,CAAC,EAAA,EAAI,CAAA,qBACvBA,GAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MAEC,iBAAA,EAAiB,EAAA,CAAG,EAAA,IAAM,MAAA,CAAO,CAAC,CAAA;AAAA,MAClC,qBAAmB,EAAA,CAAG,IAAA;AAAA,MAErB,QAAA,EAAA,aAAA,CAAc,IAAI,GAAG;AAAA,KAAA;AAAA,IAJjB,EAAA,CAAG,EAAA,IAAM,CAAA,MAAA,EAAS,CAAC,CAAA;AAAA,GAM3B,CAAA,EACH,CAAA;AAEJ;AClCA,IAAM,YAAA,GAAe,CAAA,CAAE,MAAA,EAAO,CAAE,MAAA,EAAO;AACvC,IAAM,cAAA,GAAiB,aAAa,QAAA,EAAS;AAE7C,IAAM,cAAc,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAC,CAAA;AACxD,IAAM,SAAA,GAAY,EAAE,IAAA,CAAK,CAAC,WAAW,OAAA,EAAS,aAAA,EAAe,QAAQ,CAAC,CAAA;AACtE,IAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,CAAA;AAChD,IAAM,UAAA,GAAa,EAAE,IAAA,CAAK,CAAC,QAAQ,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC3D,IAAM,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAE3C,IAAM,WAAA,GAAc,EAAE,MAAA,CAAO;AAAA,EAC3B,IAAI,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,GAAG,EAAE,QAAA,EAAS;AAAA,EACjC,CAAA,EAAG,YAAA;AAAA,EACH,CAAA,EAAG,YAAA;AAAA,EACH,QAAQ,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EACpC,WAAA,EAAa,cAAA,CAAe,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EAC7C,WAAA,EAAa,YAAY,QAAA,EAAS;AAAA,EAClC,MAAM,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW,UAAU,QAAA,EAAS;AAAA,EAC9B,OAAA,EAAS,aAAa,GAAA,CAAI,CAAC,EAAE,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EAC7C,SAAA,EAAW,aAAa,GAAA,CAAI,CAAC,EAAE,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EAC/C,IAAA,EAAM,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,MAAA,GAAS,QAAA;AAClC,CAAC,CAAA;AAED,IAAM,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,GAAK,CAAA;AACpC,IAAM,SAAA,GAAY,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,GAAG,CAAA;AAEpC,IAAM,WAAA,GAAc,YAAY,MAAA,CAAO;AAAA,EACrC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,KAAA,EAAO,UAAU,QAAA,EAAS;AAAA,EAC1B,SAAA,EAAW,UAAU,QAAA;AACvB,CAAC,CAAA;AAED,IAAM,cAAA,GAAiB,YAAY,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,KAAA,EAAO,UAAU,QAAA;AACnB,CAAC,CAAA;AAED,IAAM,cAAA,GAAiB,YAAY,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA;AAAA,EACzB,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,KAAA,EAAO,UAAU,QAAA;AACnB,CAAC,CAAA;AAED,IAAM,SAAS,CAAA,CAAE,KAAA,CAAM,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAEnD,IAAM,WAAA,GAAc,YAAY,MAAA,CAAO;AAAA,EACrC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,EAAA,EAAI;AACN,CAAC,CAAA;AAED,IAAM,YAAA,GAAe,YAAY,MAAA,CAAO;AAAA,EACtC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvB,EAAA,EAAI,MAAA;AAAA,EACJ,KAAA,EAAO,UAAU,QAAA,EAAS;AAAA,EAC1B,SAAA,EAAW,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAChC,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI;AACnC,CAAC,CAAA;AAED,IAAM,WAAA,GAAc,YAAY,MAAA,CAAO;AAAA,EACrC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EACtB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,GAAI,CAAA;AAAA,EACzB,QAAA,EAAU,cAAA,CAAe,GAAA,CAAI,GAAG,EAAE,QAAA,EAAS;AAAA,EAC3C,KAAA,EAAO,MAAM,QAAA,EAAS;AAAA,EACtB,UAAA,EAAY,WAAW,QAAA;AACzB,CAAC,CAAA;AAED,IAAM,aAAA,GAAgB,EAAE,KAAA,CAAM,CAAC,cAAc,YAAA,EAAc,YAAA,CAAa,QAAA,EAAU,CAAC,CAAA;AAEnF,IAAM,eAAA,GAAkB,YAAY,MAAA,CAAO;AAAA,EACzC,IAAA,EAAM,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,EAC1B,MAAA,EAAQ,EAAE,KAAA,CAAM,aAAa,EAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI;AAChD,CAAC,CAAA;AAEM,IAAM,iBAAA,GAAoB,CAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA,EAC5D,WAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EACpB,KAAA,EAAO,GAAA;AAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA;AAAA,EACR,YAAY,CAAA,CAAE,MAAA,GAAS,GAAA,CAAI,EAAE,EAAE,QAAA,EAAS;AAAA,EACxC,UAAU,CAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,CAAE,IAAI,GAAI;AAC/C,CAAC,CAAA;;;AC1ED,SAAS,WAAA,CAAY,OAAgB,IAAA,EAA+C;AAClF,EAAA,IAAI,MAAA,GAAkB,KAAA;AACtB,EAAA,KAAA,MAAW,WAAW,IAAA,EAAM;AAC1B,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,MAAA;AAC1D,IAAA,MAAA,GAAU,OAA4C,OAAO,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,OAAqB,KAAA,EAAiC;AACzE,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,IACzB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,MAAM,KAAA,CAAM;AAAA,GACd;AAIA,EAAA,IAAI,UAAA,IAAc,KAAA,IAAS,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW;AACvD,IAAA,KAAA,CAAM,MAAM,KAAA,CAAM,QAAA;AAAA,EACpB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,EAAO,KAAA,CAAM,IAAI,CAAA;AAC3C,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,GAAA,GAAM,KAAA;AAAA,EACvC;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,cAAc,KAAA,EAAkC;AAC9D,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,SAAA,CAAU,KAAK,CAAA;AAC9C,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,EACxC;AACA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,KAAA,KACtC,WAAA,CAAY,KAAA,EAAkC,KAAK;AAAA,GACrD;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAC7B;AC1DO,SAAS,aAAA,CACd,GAAA,EACA,QAAA,EACA,IAAA,EAMA;AACA,EAAA,MAAM,OAAA,GAAU,OAAyB,IAAI,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,OAAO,KAAK,CAAA;AAKjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAkB;AACjC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAEhC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA;AACjC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA;AAClC,MAAA,QAAA,CAAS,MAAA,CAAO,SAAS,MAAA,EAAQ,MAAA,GAAS,QAAQ,CAAC,CAAA,CAAE,MAAA,GAAS,IAAA,EAAO,IAAI,CAAA;AAAA,IAC3E,CAAA;AACA,IAAA,EAAA,CAAG,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACxD,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,GAAA,EAAK,QAAA,EAAU,IAAI,CAAC,CAAA;AAGxB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAqB;AACjC,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACjD,CAAA;AACA,IAAA,MAAM,EAAA,GAAK,CAAC,CAAA,KAAqB;AAC/B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,OAAA,EAAS,YAAA,CAAa,OAAA,GAAU,KAAA;AAAA,IACjD,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,IAAI,CAAA;AACvC,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,EAAE,CAAA;AACnC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAC1C,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,EAAE,CAAA;AAAA,IACxC,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,CAAA,KAAyC;AAG1E,IAAA,IAAI,CAAA,CAAE,kBAAkB,OAAA,IAAW,CAAC,EAAE,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG;AAExE,IAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,EAAE,MAAA,KAAW,CAAA;AACrD,IAAA,IAAI,CAAC,aAAA,IAAiB,CAAA,CAAE,WAAA,KAAgB,OAAA,EAAS;AACjD,IAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,CAAC,YAAA,CAAa,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AAC1F,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,OAAA,GAAU,EAAE,SAAA,EAAW,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA,CAAE,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,OAAA,EAAQ;AAC/E,IAAA,CAAA,CAAE,aAAA,CAAc,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,CAAA,KAAyC;AACxC,MAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAA,KAAc,EAAE,SAAA,EAAW;AAC7C,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAC5B,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA;AACjC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA;AAClC,MAAA,QAAA,CAAS,GAAA,CAAI,EAAA,GAAK,MAAA,EAAQ,EAAA,GAAK,MAAM,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,QAAA,EAAU,IAAI;AAAA,GACtB;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAyC;AACxE,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAA,KAAc,EAAE,SAAA,EAAW;AAC7C,IAAA,IAAI;AACF,MAAA,CAAA,CAAE,aAAA,CAAc,qBAAA,CAAsB,CAAA,CAAE,SAAS,CAAA;AAAA,IACnD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA,EAAa,WAAA;AAAA,IACb,eAAA,EAAiB;AAAA,GACnB;AACF;AC9FO,IAAM,QAAA,GAAW,GAAA;AACjB,IAAM,QAAA,GAAW,CAAA;AAqCxB,SAAS,UAAUI,EAAAA,EAAmB;AACpC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAASA,EAAC,GAAG,OAAO,CAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,QAAA,EAAU,KAAK,GAAA,CAAI,QAAA,EAAUA,EAAC,CAAC,CAAA;AACjD;AAEO,SAAS,YAAY,IAAA,EAA4C;AACtE,EAAA,MAAM,OAAA,GAAyB,QAAQ,MAAM;AAC3C,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,WAAA,IAAe,CAAC,CAAA;AAC5C,IAAA,IAAI,KAAK,aAAA,EAAe;AAEtB,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,aAAA;AACtB,MAAA,OAAO;AAAA,QACL,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,KAAA,IAAS,CAAA,GAAI,IAAA,CAAA;AAAA,QAC1B,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,IAAA,CAAA;AAAA,QAC3B;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,IAAA,EAAK;AAAA,EAC5B,CAAA,EAAG,CAAC,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,aAAa,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAElE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,OAAO,CAAA;AAEzD,EAAA,MAAM,GAAA,GAAMC,WAAAA,CAAY,CAAC,EAAA,EAAY,EAAA,KAAe;AAClD,IAAA,QAAA,CAAS,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,GAAG,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,GAAK,IAAA,CAAK,MAAK,CAAE,CAAA;AAAA,EAC1F,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,IAAA,KAAiB;AAC5C,IAAA,QAAA,CAAS,CAAC,UAAU,EAAE,GAAG,MAAM,IAAA,EAAM,SAAA,CAAU,IAAI,CAAA,EAAE,CAAE,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,CAAC,OAAA,EAAiB,OAAA,EAAiB,KAAA,EAAe,KAAA,KAAwB;AACxE,MAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,QAAA,MAAM,UAAU,IAAA,CAAK,IAAA;AACrB,QAAA,MAAM,UAAU,SAAA,CAAU,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AACrD,QAAA,IAAI,OAAA,KAAY,SAAS,OAAO,IAAA;AAEhC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,OAAA,GAAU,OAAA;AAClC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,OAAA,GAAU,OAAA;AAGlC,QAAA,OAAO;AAAA,UACL,CAAA,EAAG,SAAS,OAAA,GAAU,OAAA;AAAA,UACtB,CAAA,EAAG,SAAS,OAAA,GAAU,OAAA;AAAA,UACtB,IAAA,EAAM;AAAA,SACR;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM,QAAA,CAAS,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQA,WAAAA,CAAY,CAAC,MAAA,EAAwB,IAAA,KAAuB;AACxE,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,IAAA,GAAO,OAAO,IAAI,CAAA;AACvD,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,IAAA,GAAO,OAAO,IAAI,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,GAAQ,SAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,GAAS,UAAA;AAC5B,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC,CAAA;AAC7C,IAAA,MAAM,EAAA,GAAA,CAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,CAAA;AACzC,IAAA,MAAM,EAAA,GAAA,CAAM,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,IAAA,IAAQ,CAAA;AACzC,IAAA,QAAA,CAAS;AAAA,MACP,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,KAAA,IAAS,CAAA,GAAI,IAAA,CAAA;AAAA,MAC1B,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,MAAA,IAAU,CAAA,GAAI,IAAA,CAAA;AAAA,MAC3B;AAAA,KACD,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,CAAC,IAAA,KACC,CAAA,EAAG,KAAA,CAAM,CAAC,IAAI,KAAA,CAAM,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAI,IAAI,IAAA,CAAK,MAAA,GAAS,MAAM,IAAI,CAAA,CAAA;AAAA,IAC9E,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,SAAS,MAAA,EAAQ,KAAA,EAAO,OAAO,OAAA,EAAQ;AAC9D;AC3FA,SAAS,cAAc,KAAA,EAKd;AACP,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,EAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,EAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,EAAA,IAAI,OAAO,MAAA,CAAO,iBAAA;AAClB,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,QAAA,EAAU;AAC/B,IAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,IAAA,MAAM,KAAK,EAAA,CAAG,CAAA;AACd,IAAA,IAAI,KAAK,EAAA,CAAG,CAAA;AACZ,IAAA,IAAI,KAAK,EAAA,CAAG,CAAA;AACZ,IAAA,IAAI,EAAA,CAAG,SAAS,MAAA,IAAU,EAAA,CAAG,SAAS,SAAA,IAAa,EAAA,CAAG,SAAS,SAAA,EAAW;AACxE,MAAA,EAAA,GAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AACf,MAAA,EAAA,GAAK,EAAA,CAAG,IAAI,EAAA,CAAG,CAAA;AAAA,IACjB,WAAW,EAAA,CAAG,IAAA,KAAS,MAAA,IAAU,EAAA,CAAG,SAAS,OAAA,EAAS;AACpD,MAAA,EAAA,GAAK,EAAA,CAAG,GAAG,CAAC,CAAA;AACZ,MAAA,EAAA,GAAK,EAAA,CAAG,GAAG,CAAC,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,GAAG,MAAA,EAAQ;AAChC,QAAA,MAAM,EAAA,GAAK,GAAG,CAAA,GAAI,EAAA;AAClB,QAAA,MAAM,EAAA,GAAK,GAAG,CAAA,GAAI,EAAA;AAClB,QAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,QAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,QAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,QAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AAAA,MACxB;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AAAA,EACxB;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AACnC,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAClC;AAEO,SAAS,UAAA,CAAW;AAAA,EACzB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA,EAAc;AAChB,CAAA,EAAoB;AAClB,EAAA,MAAM,UAAA,GAAaC,QAAQ,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,EAAA,GAAK,UAAA,CAAW,KAAA,GAAQ,IAAA;AAGjD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,CAAW,EAAA,IAAM,iBAAA,EAAmB;AACvC,MAAA,iBAAA,CAAkB,WAAW,MAAM,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,iBAAiB,CAAC,CAAA;AAGlC,EAAA,MAAM,SAAA,GAAmCD,QAAQ,MAAM;AACrD,IAAA,IAAI,OAAO,UAAA,KAAe,WAAA,EAAa,OAAO,IAAA;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA,EAAU;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAa,OAAO,KAAA,IAAS,GAAA;AACnC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,IAAU,GAAA;AACrC,EAAA,MAAM,kBAAkB,KAAA,EAAO,UAAA;AAE/B,EAAA,MAAM,WAAW,WAAA,CAAY;AAAA,IAC3B,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ,WAAA;AAAA,IACR,WAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAASE,OAA6B,IAAI,CAAA;AAEhD,EAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AAEvB,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,KAAA,EAAO;AAC1B,IAAA,MAAM,MAAA,GAAS,cAAc,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,KAAA,CAAM,QAAQ,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,aAAa,CAAA;AAAA,EAC1D,GAAG,CAAC,SAAA,EAAW,OAAO,UAAA,EAAY,WAAA,EAAa,KAAK,CAAC,CAAA;AAErD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,EAAQ,QAAA,EAAU;AAAA,IAC/C,KAAA,EAAO,UAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,MAAM,QAAQ,SAAA,IAAa,oBAAA;AAE3B,EAAA,uBACEN,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,SAAS,OAAA,CAAQ,EAAE,OAAO,UAAA,EAAY,MAAA,EAAQ,aAAa,CAAA;AAAA,MACpE,KAAA,EAAO,UAAA;AAAA,MACP,MAAA,EAAQ,WAAA;AAAA,MACR,SAAA;AAAA,MACA,IAAA,EAAK,KAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,KAAA,EAAM,4BAAA;AAAA,MACN,uBAAA,EAAuB,QAAQ,IAAA,GAAO,SAAA;AAAA,MACtC,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,EAAQ,YAAY,MAAA,EAAO;AAAA,MAChD,GAAG,QAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,WAAO,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACb,kCACCA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAG,CAAA;AAAA,YACH,CAAA,EAAG,CAAA;AAAA,YACH,KAAA,EAAO,UAAA;AAAA,YACP,MAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAM,eAAA;AAAA,YACN,YAAA,EAAW;AAAA;AAAA,SACb,GACE,IAAA;AAAA,QACH,KAAA,IAAS,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,SAAS,CAAA,GAAI;AAAA;AAAA;AAAA,GACxD;AAEJ","file":"index.js","sourcesContent":["/**\n * Deterministic seed derivation for rough.js — see ADR D9.\n *\n * rough.js uses pseudo-randomness to produce the hand-drawn look. Without a\n * stable seed every render shifts the strokes slightly, breaking snapshot\n * tests, causing SSR hydration mismatches, and visible jitter when the parent\n * re-renders. FNV-1a 32-bit gives us a fast, dependency-free hash.\n */\n\nconst FNV_OFFSET_BASIS_32 = 0x811c9dc5;\nconst FNV_PRIME_32 = 0x01000193;\n\n/** FNV-1a 32-bit hash. Returns a signed 32-bit integer. */\nexport function fnv1a32(input: string): number {\n let hash = FNV_OFFSET_BASIS_32;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n // Multiply by the FNV prime, but keep within 32-bit unsigned range.\n hash = Math.imul(hash, FNV_PRIME_32);\n }\n // Cast to signed 32-bit via `| 0`.\n return hash | 0;\n}\n\ninterface SeedableShape {\n type: string;\n x: number;\n y: number;\n w?: number;\n h?: number;\n label?: string;\n seed?: number;\n}\n\n/** Return the element's explicit `seed` or derive a stable one from its props. */\nexport function deriveSeed(el: SeedableShape): number {\n if (typeof el.seed === \"number\" && Number.isFinite(el.seed)) {\n return el.seed | 0;\n }\n // Compose a key from the dimensions that visually define the shape. Other\n // fields (colors, opacity) don't change the underlying rough.js geometry.\n const key = `${el.type}|${el.x}|${el.y}|${el.w ?? \"\"}|${el.h ?? \"\"}|${el.label ?? \"\"}`;\n return fnv1a32(key);\n}\n","import { getStroke } from \"perfect-freehand\";\nimport type { FreedrawElement } from \"../schema.js\";\n\nconst DEFAULT_STROKE_OPTIONS = {\n size: 8,\n thinning: 0.5,\n smoothing: 0.5,\n streamline: 0.5,\n};\n\nfunction fmt(n: number | undefined): string {\n return typeof n === \"number\" && Number.isFinite(n) ? n.toFixed(2) : \"0\";\n}\n\nfunction svgPathFromStroke(points: number[][]): string {\n if (points.length === 0) return \"\";\n const first = points[0] ?? [];\n let d = `M ${fmt(first[0])} ${fmt(first[1])}`;\n for (let i = 1; i < points.length; i++) {\n const p = points[i] ?? [];\n d += ` L ${fmt(p[0])} ${fmt(p[1])}`;\n }\n d += \" Z\";\n return d;\n}\n\nexport function renderFreedraw(el: FreedrawElement): React.ReactNode {\n const size = (el.strokeWidth ?? 1.5) * 5;\n const inputPoints = el.points.map(([x, y, pressure]) => {\n const tx = el.x + x;\n const ty = el.y + y;\n return pressure === undefined ? [tx, ty] : [tx, ty, pressure];\n });\n const stroke = getStroke(inputPoints, {\n ...DEFAULT_STROKE_OPTIONS,\n size,\n });\n const d = svgPathFromStroke(stroke as number[][]);\n return (\n <g opacity={el.opacity ?? 1}>\n <path d={d} fill={el.stroke ?? \"currentColor\"} stroke=\"none\" />\n </g>\n );\n}\n","/**\n * Thin adapter over `roughjs` — converts a `Drawable` into the array of\n * `<path>` descriptors we render in SVG. The actual `rough.generator()`\n * instance is created once per scene and reused across elements.\n */\nimport type { Drawable, Options } from \"roughjs/bin/core.js\";\nimport type { RoughGenerator } from \"roughjs/bin/generator.js\";\n\nexport interface RoughPath {\n d: string;\n stroke: string;\n strokeWidth: number;\n fill?: string;\n}\n\nexport type RoughOptions = Options;\n\n/** Convert a rough.js Drawable into renderable SVG path descriptors. */\nexport function toRoughPaths(generator: RoughGenerator, drawable: Drawable): RoughPath[] {\n const paths = generator.toPaths(drawable);\n return paths.map((p) => ({\n d: p.d,\n stroke: p.stroke,\n strokeWidth: p.strokeWidth,\n fill: p.fill,\n }));\n}\n","/**\n * Maps a `WhiteboardElement` style props onto rough.js `Options`.\n */\nimport type { Options } from \"roughjs/bin/core.js\";\n\ninterface StyleSource {\n stroke?: string;\n strokeWidth?: number;\n strokeStyle?: \"solid\" | \"dashed\" | \"dotted\";\n fill?: string;\n fillStyle?: \"hachure\" | \"solid\" | \"cross-hatch\" | \"zigzag\";\n opacity?: number;\n roughness?: number;\n}\n\nconst DEFAULT_STROKE = \"currentColor\";\n\nexport function buildOptions(src: StyleSource, seed: number): Options {\n const o: Options = {\n seed,\n stroke: src.stroke ?? DEFAULT_STROKE,\n strokeWidth: src.strokeWidth ?? 1.5,\n roughness: src.roughness ?? 1.2,\n };\n if (src.strokeStyle === \"dashed\") o.strokeLineDash = [10, 6];\n else if (src.strokeStyle === \"dotted\") o.strokeLineDash = [2, 4];\n if (src.fill) o.fill = src.fill;\n if (src.fillStyle) o.fillStyle = src.fillStyle;\n return o;\n}\n\n/**\n * SVG `stroke-dasharray` value for a logical strokeStyle. rough.js's\n * `RoughGenerator.toPaths()` does NOT propagate `strokeLineDash` into the\n * returned `PathInfo` — only the canvas / direct-SVG backends apply it. We\n * must set the attribute ourselves on the rendered `<path>`. Returns\n * `undefined` for `solid` and any unknown value.\n */\nexport function strokeDashArray(\n strokeStyle: StyleSource[\"strokeStyle\"],\n strokeWidth: number,\n): string | undefined {\n if (strokeStyle === \"dashed\") {\n const dash = Math.max(8, strokeWidth * 6);\n const gap = Math.max(5, strokeWidth * 4);\n return `${dash} ${gap}`;\n }\n if (strokeStyle === \"dotted\") {\n // 1×strokeWidth dot, ~2×strokeWidth gap. Round end caps make these look\n // like dots instead of squares.\n return `${strokeWidth} ${strokeWidth * 2.5}`;\n }\n return undefined;\n}\n\nexport { DEFAULT_STROKE };\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { ArrowElement, LineElement } from \"../schema.js\";\nimport { toRoughPaths } from \"./rough-paths.js\";\nimport { buildOptions, strokeDashArray } from \"./style.js\";\n\nconst HEAD_BASE_PX = 12;\nconst HEAD_ANGLE_RAD = Math.PI / 7; // ~25°\n\ninterface HeadGeom {\n apexX: number;\n apexY: number;\n leftX: number;\n leftY: number;\n rightX: number;\n rightY: number;\n}\n\nfunction arrowHeadGeometry(\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n strokeWidth: number,\n): HeadGeom | null {\n const dx = toX - fromX;\n const dy = toY - fromY;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist === 0) return null;\n const angle = Math.atan2(dy, dx);\n // EC-7: clamp head length so it never exceeds 40% of the segment.\n const headLen = Math.min(HEAD_BASE_PX + strokeWidth * 2, dist * 0.4);\n const leftX = toX - headLen * Math.cos(angle - HEAD_ANGLE_RAD);\n const leftY = toY - headLen * Math.sin(angle - HEAD_ANGLE_RAD);\n const rightX = toX - headLen * Math.cos(angle + HEAD_ANGLE_RAD);\n const rightY = toY - headLen * Math.sin(angle + HEAD_ANGLE_RAD);\n return { apexX: toX, apexY: toY, leftX, leftY, rightX, rightY };\n}\n\nfunction lineBody(\n gen: RoughGenerator,\n el: LineElement | ArrowElement,\n seed: number,\n): React.ReactNode[] {\n const opts = buildOptions(el, seed);\n const drawable = gen.line(el.x, el.y, el.to[0], el.to[1], opts);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return toRoughPaths(gen, drawable).map((p, i) => (\n <path\n // biome-ignore lint/suspicious/noArrayIndexKey: stable rough.js path order\n key={`body-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={dash}\n />\n ));\n}\n\nfunction arrowHead(\n gen: RoughGenerator,\n fromX: number,\n fromY: number,\n toX: number,\n toY: number,\n seed: number,\n el: ArrowElement,\n side: \"start\" | \"end\",\n): React.ReactNode[] {\n const geom = arrowHeadGeometry(fromX, fromY, toX, toY, el.strokeWidth ?? 1.5);\n if (!geom) return [];\n const opts = buildOptions(el, seed);\n // Two short rough-drawn segments forming the V.\n const leftDrawable = gen.line(geom.apexX, geom.apexY, geom.leftX, geom.leftY, opts);\n const rightDrawable = gen.line(geom.apexX, geom.apexY, geom.rightX, geom.rightY, opts);\n const leftPaths = toRoughPaths(gen, leftDrawable);\n const rightPaths = toRoughPaths(gen, rightDrawable);\n const nodes: React.ReactNode[] = [];\n for (const [i, p] of leftPaths.entries()) {\n nodes.push(\n <path\n key={`${side}-l-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n data-line-part=\"arrowhead\"\n />,\n );\n }\n for (const [i, p] of rightPaths.entries()) {\n nodes.push(\n <path\n key={`${side}-r-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n data-line-part=\"arrowhead\"\n />,\n );\n }\n return nodes;\n}\n\nexport function renderLine(gen: RoughGenerator, el: LineElement): React.ReactNode {\n return <g opacity={el.opacity ?? 1}>{lineBody(gen, el, el.seed ?? 0)}</g>;\n}\n\nexport function renderArrow(gen: RoughGenerator, el: ArrowElement): React.ReactNode {\n const seed = el.seed ?? 0;\n const nodes: React.ReactNode[] = [...lineBody(gen, el, seed)];\n if (el.headEnd !== false) {\n nodes.push(...arrowHead(gen, el.x, el.y, el.to[0], el.to[1], seed + 1, el, \"end\"));\n }\n if (el.headStart) {\n nodes.push(...arrowHead(gen, el.to[0], el.to[1], el.x, el.y, seed + 2, el, \"start\"));\n }\n let label: React.ReactNode = null;\n if (el.label) {\n const midX = (el.x + el.to[0]) / 2;\n const midY = (el.y + el.to[1]) / 2;\n // Offset perpendicular to the line so label doesn't sit on the stroke.\n const dx = el.to[0] - el.x;\n const dy = el.to[1] - el.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n const nx = -dy / dist;\n const ny = dx / dist;\n const offset = 12;\n label = (\n <text\n x={midX + nx * offset}\n y={midY + ny * offset}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={14}\n fontFamily=\"ui-sans-serif, system-ui, sans-serif\"\n fill={el.stroke ?? \"currentColor\"}\n style={{ pointerEvents: \"none\" }}\n >\n {el.label}\n </text>\n );\n }\n return (\n <g opacity={el.opacity ?? 1}>\n {nodes}\n {label}\n </g>\n );\n}\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { DiamondElement, EllipseElement, RectElement } from \"../schema.js\";\nimport { toRoughPaths } from \"./rough-paths.js\";\nimport { buildOptions, strokeDashArray } from \"./style.js\";\n\ninterface LabelProps {\n cx: number;\n cy: number;\n label: string;\n stroke?: string;\n}\n\nfunction Label({ cx, cy, label, stroke }: LabelProps) {\n return (\n <text\n x={cx}\n y={cy}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fontSize={16}\n fontFamily=\"ui-sans-serif, system-ui, sans-serif\"\n fill={stroke ?? \"currentColor\"}\n style={{ pointerEvents: \"none\" }}\n >\n {label}\n </text>\n );\n}\n\nfunction pathsToReactNodes(\n paths: ReturnType<typeof toRoughPaths>,\n keyPrefix: string,\n outlineStroke: string,\n dashArray?: string,\n): React.ReactNode[] {\n return paths.map((p, i) => {\n // Apply stroke-dasharray only to paths whose stroke matches the outline\n // color — this avoids dashing hachure/cross-hatch fill lines (which are\n // stroked in the fill color, not the outline color) when a shape mixes\n // fillStyle with strokeStyle.\n const isOutline = p.stroke === outlineStroke;\n return (\n <path\n // biome-ignore lint/suspicious/noArrayIndexKey: rough.js path order is stable for a given (geometry, seed) tuple — index is the most precise key.\n key={`${keyPrefix}-${i}`}\n d={p.d}\n stroke={p.stroke}\n strokeWidth={p.strokeWidth}\n fill={p.fill ?? \"none\"}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeDasharray={isOutline ? dashArray : undefined}\n />\n );\n });\n}\n\nexport function renderRect(gen: RoughGenerator, el: RectElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n const drawable = gen.rectangle(el.x, el.y, el.w, el.h, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"rect\", opts.stroke as string, dash)}\n {el.label ? (\n <Label cx={el.x + el.w / 2} cy={el.y + el.h / 2} label={el.label} stroke={el.stroke} />\n ) : null}\n </g>\n );\n}\n\nexport function renderEllipse(gen: RoughGenerator, el: EllipseElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n // rough.js ellipse takes center + width + height.\n const drawable = gen.ellipse(el.x + el.w / 2, el.y + el.h / 2, el.w, el.h, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"ellipse\", opts.stroke as string, dash)}\n {el.label ? (\n <Label cx={el.x + el.w / 2} cy={el.y + el.h / 2} label={el.label} stroke={el.stroke} />\n ) : null}\n </g>\n );\n}\n\nexport function renderDiamond(gen: RoughGenerator, el: DiamondElement): React.ReactNode {\n const opts = buildOptions(el, el.seed ?? 0);\n const cx = el.x + el.w / 2;\n const cy = el.y + el.h / 2;\n const points: [number, number][] = [\n [cx, el.y], // top\n [el.x + el.w, cy], // right\n [cx, el.y + el.h], // bottom\n [el.x, cy], // left\n ];\n const drawable = gen.polygon(points, opts);\n const paths = toRoughPaths(gen, drawable);\n const dash = strokeDashArray(el.strokeStyle, el.strokeWidth ?? 1.5);\n return (\n <g opacity={el.opacity ?? 1}>\n {pathsToReactNodes(paths, \"diamond\", opts.stroke as string, dash)}\n {el.label ? <Label cx={cx} cy={cy} label={el.label} stroke={el.stroke} /> : null}\n </g>\n );\n}\n","import type { TextElement } from \"../schema.js\";\n\nconst FONT_STACKS: Record<NonNullable<TextElement[\"fontFamily\"]>, string> = {\n sans: \"ui-sans-serif, system-ui, sans-serif\",\n serif: \"ui-serif, Georgia, serif\",\n mono: \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n hand: '\"Virgil\", \"Caveat\", \"Comic Sans MS\", cursive',\n};\n\nfunction textAnchor(align: TextElement[\"align\"]): \"start\" | \"middle\" | \"end\" {\n if (align === \"center\") return \"middle\";\n if (align === \"right\") return \"end\";\n return \"start\";\n}\n\nexport function renderText(el: TextElement): React.ReactNode {\n const fontSize = el.fontSize ?? 18;\n const fontFamily = FONT_STACKS[el.fontFamily ?? \"hand\"];\n const anchor = textAnchor(el.align);\n const lines = el.text.split(\"\\n\");\n // dy: first tspan at 0, subsequent at fontSize * 1.2 line-height.\n return (\n <g opacity={el.opacity ?? 1}>\n <text\n x={el.x}\n y={el.y}\n textAnchor={anchor}\n dominantBaseline=\"hanging\"\n fontSize={fontSize}\n fontFamily={fontFamily}\n fill={el.stroke ?? \"currentColor\"}\n >\n {lines.map((line, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: text is split deterministically on '\\n' so the line index is the most stable key.\n <tspan key={i} x={el.x} dy={i === 0 ? 0 : fontSize * 1.2}>\n {line}\n </tspan>\n ))}\n </text>\n </g>\n );\n}\n","import type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport type { WhiteboardElement, WhiteboardScene } from \"../schema.js\";\nimport { deriveSeed } from \"../seed.js\";\nimport { renderFreedraw } from \"./freedraw.js\";\nimport { renderArrow, renderLine } from \"./line.js\";\nimport { renderDiamond, renderEllipse, renderRect } from \"./shape.js\";\nimport { renderText } from \"./text.js\";\n\nfunction elementWithSeed<T extends WhiteboardElement>(el: T): T {\n if (typeof el.seed === \"number\") return el;\n return { ...el, seed: deriveSeed(el) } as T;\n}\n\nfunction renderElement(el: WhiteboardElement, gen: RoughGenerator): React.ReactNode {\n switch (el.type) {\n case \"rect\":\n return renderRect(gen, elementWithSeed(el));\n case \"ellipse\":\n return renderEllipse(gen, elementWithSeed(el));\n case \"diamond\":\n return renderDiamond(gen, elementWithSeed(el));\n case \"line\":\n return renderLine(gen, elementWithSeed(el));\n case \"arrow\":\n return renderArrow(gen, elementWithSeed(el));\n case \"text\":\n return renderText(elementWithSeed(el));\n case \"freedraw\":\n return renderFreedraw(elementWithSeed(el));\n }\n}\n\nexport function renderScene(scene: WhiteboardScene, gen: RoughGenerator): React.ReactNode {\n return (\n <>\n {scene.elements.map((el, i) => (\n <g\n key={el.id ?? `__idx-${i}`}\n data-element-id={el.id ?? String(i)}\n data-element-type={el.type}\n >\n {renderElement(el, gen)}\n </g>\n ))}\n </>\n );\n}\n","/**\n * Zod schema for the Whiteboard JSON v1 (`WhiteboardScene`).\n *\n * Design goals (see RFC 0001 §4 and ADR D4 in the plan):\n * - LLM-friendly: minimal fields per element.\n * - Discriminated union by `type` for exhaustive typing in TS.\n * - Defensive against LLM mistakes:\n * - EC-3: `.finite()` everywhere — rejects NaN / Infinity.\n * - EC-4: `.max()` on dimensions to cap absurd values from the model.\n */\nimport { z } from \"zod\";\n\nconst finiteNumber = z.number().finite();\nconst finitePositive = finiteNumber.positive();\n\nconst strokeStyle = z.enum([\"solid\", \"dashed\", \"dotted\"]);\nconst fillStyle = z.enum([\"hachure\", \"solid\", \"cross-hatch\", \"zigzag\"]);\nconst align = z.enum([\"left\", \"center\", \"right\"]);\nconst fontFamily = z.enum([\"sans\", \"serif\", \"mono\", \"hand\"]);\nconst roundness = z.enum([\"sharp\", \"round\"]);\n\nconst baseElement = z.object({\n id: z.string().max(120).optional(),\n x: finiteNumber,\n y: finiteNumber,\n stroke: z.string().max(64).optional(),\n strokeWidth: finitePositive.max(50).optional(),\n strokeStyle: strokeStyle.optional(),\n fill: z.string().max(64).optional(),\n fillStyle: fillStyle.optional(),\n opacity: finiteNumber.min(0).max(1).optional(),\n roughness: finiteNumber.min(0).max(3).optional(),\n seed: z.number().int().finite().optional(),\n});\n\nconst dim = finitePositive.max(20000);\nconst labelText = z.string().max(500);\n\nconst rectElement = baseElement.extend({\n type: z.literal(\"rect\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n roundness: roundness.optional(),\n});\n\nconst ellipseElement = baseElement.extend({\n type: z.literal(\"ellipse\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n});\n\nconst diamondElement = baseElement.extend({\n type: z.literal(\"diamond\"),\n w: dim,\n h: dim,\n label: labelText.optional(),\n});\n\nconst point2 = z.tuple([finiteNumber, finiteNumber]);\n\nconst lineElement = baseElement.extend({\n type: z.literal(\"line\"),\n to: point2,\n});\n\nconst arrowElement = baseElement.extend({\n type: z.literal(\"arrow\"),\n to: point2,\n label: labelText.optional(),\n headStart: z.boolean().optional(),\n headEnd: z.boolean().default(true),\n});\n\nconst textElement = baseElement.extend({\n type: z.literal(\"text\"),\n text: z.string().max(5000),\n fontSize: finitePositive.max(500).optional(),\n align: align.optional(),\n fontFamily: fontFamily.optional(),\n});\n\nconst freedrawPoint = z.tuple([finiteNumber, finiteNumber, finiteNumber.optional()]);\n\nconst freedrawElement = baseElement.extend({\n type: z.literal(\"freedraw\"),\n points: z.array(freedrawPoint).min(2).max(5000),\n});\n\nexport const whiteboardElement = z.discriminatedUnion(\"type\", [\n rectElement,\n ellipseElement,\n diamondElement,\n lineElement,\n arrowElement,\n textElement,\n freedrawElement,\n]);\n\nexport const whiteboardScene = z.object({\n version: z.literal(1),\n width: dim, // EC-4: clamped 1..20000\n height: dim, // EC-4: clamped 1..20000\n background: z.string().max(64).optional(),\n elements: z.array(whiteboardElement).max(5000),\n});\n\n// Internal \"parsed\" types (defaults applied) — used inside the renderer.\nexport type WhiteboardElement = z.output<typeof whiteboardElement>;\nexport type WhiteboardScene = z.output<typeof whiteboardScene>;\nexport type RectElement = z.output<typeof rectElement>;\nexport type EllipseElement = z.output<typeof ellipseElement>;\nexport type DiamondElement = z.output<typeof diamondElement>;\nexport type LineElement = z.output<typeof lineElement>;\nexport type ArrowElement = z.output<typeof arrowElement>;\nexport type TextElement = z.output<typeof textElement>;\nexport type FreedrawElement = z.output<typeof freedrawElement>;\n\n// Public \"input\" types (defaults optional) — used by consumers passing data.\nexport type WhiteboardElementInput = z.input<typeof whiteboardElement>;\nexport type WhiteboardSceneInput = z.input<typeof whiteboardScene>;\n","/**\n * Public validator for `WhiteboardScene` JSON. Wraps Zod and converts errors\n * into a structured shape that an LLM can consume to self-correct.\n *\n * Returns `{ ok: true, scene }` on success or `{ ok: false, errors }` with\n * each error carrying `{ path, message, code, got? }`. See RFC 0001 §4.\n */\nimport { type WhiteboardScene, whiteboardScene } from \"./schema.js\";\n\nexport interface ValidationError {\n /** Dot-joined Zod path, e.g. \"elements.2.type\" or \"width\". */\n path: string;\n /** Human-readable explanation (passes through Zod's message). */\n message: string;\n /** Zod issue code: `invalid_type`, `too_small`, `invalid_literal`, ... */\n code: string;\n /** Actual value received at `path`. Populated for type mismatches, discriminator mismatches, and any issue where Zod's `received` is absent but the value can be recovered by walking the original input along `path`. */\n got?: unknown;\n}\n\nexport type ValidationResult =\n | { ok: true; scene: WhiteboardScene }\n | { ok: false; errors: ValidationError[] };\n\ninterface ZodLikeIssue {\n path: ReadonlyArray<string | number>;\n message: string;\n code: string;\n received?: unknown;\n}\n\n/** Walk `input` following the issue path and return the offending value. */\nfunction valueAtPath(input: unknown, path: ReadonlyArray<string | number>): unknown {\n let cursor: unknown = input;\n for (const segment of path) {\n if (cursor === null || typeof cursor !== \"object\") return undefined;\n cursor = (cursor as Record<string | number, unknown>)[segment];\n }\n return cursor;\n}\n\nfunction formatIssue(issue: ZodLikeIssue, input: unknown): ValidationError {\n const error: ValidationError = {\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n };\n // Populate `got` from the issue when Zod provides it (invalid_type), or by\n // walking the original input along the path (invalid_union / invalid_value).\n // LLM auto-correction benefits from seeing what was actually emitted.\n if (\"received\" in issue && issue.received !== undefined) {\n error.got = issue.received;\n } else if (issue.path.length > 0) {\n const value = valueAtPath(input, issue.path);\n if (value !== undefined) error.got = value;\n }\n return error;\n}\n\nexport function validateScene(input: unknown): ValidationResult {\n const result = whiteboardScene.safeParse(input);\n if (result.success) {\n return { ok: true, scene: result.data };\n }\n const errors = result.error.issues.map((issue) =>\n formatIssue(issue as unknown as ZodLikeIssue, input),\n );\n return { ok: false, errors };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport type { ViewportControls } from \"./use-viewport.js\";\n\ninterface DragState {\n pointerId: number;\n lastX: number;\n lastY: number;\n}\n\n/** Attaches pan + zoom listeners to an SVG element. */\nexport function usePointerPan(\n ref: React.RefObject<SVGSVGElement | null>,\n viewport: ViewportControls,\n size: { width: number; height: number },\n): {\n onPointerDown: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerMove: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerUp: (e: React.PointerEvent<SVGSVGElement>) => void;\n onPointerCancel: (e: React.PointerEvent<SVGSVGElement>) => void;\n} {\n const dragRef = useRef<DragState | null>(null);\n const spaceHeldRef = useRef(false);\n\n // EC-2: wheel events on React's JSX onWheel are passive — `preventDefault`\n // does nothing, which causes the page to scroll while the user tries to\n // zoom. We must attach the wheel handler imperatively with `{passive:false}`.\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const handler = (e: WheelEvent) => {\n e.preventDefault();\n const rect = el.getBoundingClientRect();\n const localX = e.clientX - rect.left;\n const localY = e.clientY - rect.top;\n // Map screen-px → viewBox coords by ratio of rect to size.\n const scaleX = size.width / rect.width;\n const scaleY = size.height / rect.height;\n viewport.zoomAt(localX * scaleX, localY * scaleY, -e.deltaY * 0.001, size);\n };\n el.addEventListener(\"wheel\", handler, { passive: false });\n return () => el.removeEventListener(\"wheel\", handler);\n }, [ref, viewport, size]);\n\n // Track Space key for pan-with-any-button (Excalidraw \"hand\" mode).\n useEffect(() => {\n const down = (e: KeyboardEvent) => {\n if (e.code === \"Space\") spaceHeldRef.current = true;\n };\n const up = (e: KeyboardEvent) => {\n if (e.code === \"Space\") spaceHeldRef.current = false;\n };\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n };\n }, []);\n\n const onPointerDown = useCallback((e: React.PointerEvent<SVGSVGElement>) => {\n // EC-10: only start drag when the down event is on our SVG, not on a\n // child rendered via portal/etc. event.currentTarget guarantees this.\n if (e.target instanceof Element && !e.currentTarget.contains(e.target)) return;\n // Left button (0) or middle (1) or Space-held pan.\n const isMouseButton = e.button === 0 || e.button === 1;\n if (!isMouseButton && e.pointerType === \"mouse\") return;\n if (e.pointerType === \"mouse\" && e.button !== 1 && !spaceHeldRef.current && e.button !== 0) {\n return;\n }\n dragRef.current = { pointerId: e.pointerId, lastX: e.clientX, lastY: e.clientY };\n e.currentTarget.setPointerCapture(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n const dx = e.clientX - drag.lastX;\n const dy = e.clientY - drag.lastY;\n drag.lastX = e.clientX;\n drag.lastY = e.clientY;\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const scaleX = size.width / rect.width;\n const scaleY = size.height / rect.height;\n viewport.pan(dx * scaleX, dy * scaleY);\n },\n [ref, viewport, size],\n );\n\n const releaseDrag = useCallback((e: React.PointerEvent<SVGSVGElement>) => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== e.pointerId) return;\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // Already released — ignore.\n }\n dragRef.current = null;\n }, []);\n\n return {\n onPointerDown,\n onPointerMove,\n onPointerUp: releaseDrag,\n onPointerCancel: releaseDrag,\n };\n}\n","/**\n * Viewport state and helpers — pan via (x, y) and zoom via a scalar.\n *\n * Coordinate system:\n * - World space: where elements are defined (the JSON `x`, `y` etc.).\n * - Screen space: the rendered SVG bounding box on the page.\n * - viewBox: `${x} ${y} ${width/zoom} ${height/zoom}`. Increasing zoom\n * SHRINKS the viewBox dimensions, magnifying the rendered content.\n *\n * `zoomAt(screenX, screenY, delta, viewportSize)` keeps the world point under\n * the cursor stable while zooming (see test for invariant).\n */\nimport { useCallback, useMemo, useState } from \"react\";\n\nexport const MIN_ZOOM = 0.1;\nexport const MAX_ZOOM = 8;\n\nexport interface ViewportState {\n x: number;\n y: number;\n zoom: number;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ViewportBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface UseViewportOptions {\n width: number;\n height: number;\n initialZoom?: number;\n initialCenter?: [number, number];\n}\n\nexport interface ViewportControls {\n state: ViewportState;\n pan: (dx: number, dy: number) => void;\n setZoom: (zoom: number) => void;\n zoomAt: (screenX: number, screenY: number, delta: number, size: ViewportSize) => void;\n reset: () => void;\n fitTo: (bounds: ViewportBounds, size: ViewportSize) => void;\n viewBox: (size: ViewportSize) => string;\n}\n\nfunction clampZoom(z: number): number {\n if (!Number.isFinite(z)) return 1;\n return Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, z));\n}\n\nexport function useViewport(opts: UseViewportOptions): ViewportControls {\n const initial: ViewportState = useMemo(() => {\n const zoom = clampZoom(opts.initialZoom ?? 1);\n if (opts.initialCenter) {\n // Position viewBox so initialCenter sits at the visual center.\n const [cx, cy] = opts.initialCenter;\n return {\n x: cx - opts.width / (2 * zoom),\n y: cy - opts.height / (2 * zoom),\n zoom,\n };\n }\n return { x: 0, y: 0, zoom };\n }, [opts.initialCenter, opts.initialZoom, opts.width, opts.height]);\n\n const [state, setState] = useState<ViewportState>(initial);\n\n const pan = useCallback((dx: number, dy: number) => {\n setState((prev) => ({ ...prev, x: prev.x - dx / prev.zoom, y: prev.y - dy / prev.zoom }));\n }, []);\n\n const setZoom = useCallback((zoom: number) => {\n setState((prev) => ({ ...prev, zoom: clampZoom(zoom) }));\n }, []);\n\n const zoomAt = useCallback(\n (screenX: number, screenY: number, delta: number, _size: ViewportSize) => {\n setState((prev) => {\n const oldZoom = prev.zoom;\n const newZoom = clampZoom(prev.zoom * Math.exp(delta));\n if (newZoom === oldZoom) return prev;\n // World coordinate currently under cursor.\n const worldX = prev.x + screenX / oldZoom;\n const worldY = prev.y + screenY / oldZoom;\n // After zoom, we want the same screen point to map to the same world point.\n // viewBox.x + (screenX / newZoom) === worldX → x = worldX - screenX/newZoom.\n return {\n x: worldX - screenX / newZoom,\n y: worldY - screenY / newZoom,\n zoom: newZoom,\n };\n });\n },\n [],\n );\n\n const reset = useCallback(() => setState(initial), [initial]);\n\n const fitTo = useCallback((bounds: ViewportBounds, size: ViewportSize) => {\n const bboxWidth = Math.max(1, bounds.maxX - bounds.minX);\n const bboxHeight = Math.max(1, bounds.maxY - bounds.minY);\n const zoomX = size.width / bboxWidth;\n const zoomY = size.height / bboxHeight;\n const zoom = clampZoom(Math.min(zoomX, zoomY));\n const cx = (bounds.minX + bounds.maxX) / 2;\n const cy = (bounds.minY + bounds.maxY) / 2;\n setState({\n x: cx - size.width / (2 * zoom),\n y: cy - size.height / (2 * zoom),\n zoom,\n });\n }, []);\n\n const viewBox = useCallback(\n (size: ViewportSize) =>\n `${state.x} ${state.y} ${size.width / state.zoom} ${size.height / state.zoom}`,\n [state],\n );\n\n return { state, pan, setZoom, zoomAt, reset, fitTo, viewBox };\n}\n","import { useEffect, useMemo, useRef } from \"react\";\n/**\n * `<Whiteboard>` — view-only primitive that turns a JSON scene into a\n * hand-drawn SVG. Lives in the isolated subpath `@usetheo/ui/whiteboard`.\n *\n * See RFC 0001 (`docs/rfcs/0001-whiteboard.md`) and the plan in\n * `.claude/knowledge-base/plans/whiteboard-view-primitive-plan.md`.\n */\nimport rough from \"roughjs\";\nimport type { RoughGenerator } from \"roughjs/bin/generator.js\";\nimport { renderScene } from \"./render/scene.js\";\nimport type { WhiteboardScene, WhiteboardSceneInput } from \"./schema.js\";\nimport { type ValidationError, validateScene } from \"./validate.js\";\nimport { usePointerPan } from \"./viewport/use-pointer-pan.js\";\nimport { useViewport } from \"./viewport/use-viewport.js\";\n\n/** Input type accepted by the component (defaults like `headEnd` are optional). */\nexport type WhiteboardData = WhiteboardSceneInput;\nexport type { ValidationError } from \"./validate.js\";\n\nexport interface WhiteboardProps {\n /** The scene to render. Validated with Zod on every change. */\n data: WhiteboardData | unknown;\n className?: string;\n /** Starting zoom level (clamped 0.1–8). Default 1. */\n initialZoom?: number;\n /** World coordinate centered in the viewport on first render. */\n initialCenter?: [number, number];\n /** When true, computes a bounding box of all elements and zooms to fit. */\n fitOnLoad?: boolean;\n /** Called once per validation failure with the list of errors (EC-6: in useEffect, not render). */\n onValidationError?: (errors: ValidationError[]) => void;\n /** Accessible label for the SVG (defaults to \"Whiteboard diagram\"). */\n \"aria-label\"?: string;\n}\n\nfunction computeBounds(scene: WhiteboardScene): {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n} | null {\n if (scene.elements.length === 0) return null;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (const el of scene.elements) {\n const x1 = el.x;\n const y1 = el.y;\n let x2 = el.x;\n let y2 = el.y;\n if (el.type === \"rect\" || el.type === \"ellipse\" || el.type === \"diamond\") {\n x2 = el.x + el.w;\n y2 = el.y + el.h;\n } else if (el.type === \"line\" || el.type === \"arrow\") {\n x2 = el.to[0];\n y2 = el.to[1];\n } else if (el.type === \"freedraw\") {\n for (const [px, py] of el.points) {\n const tx = el.x + px;\n const ty = el.y + py;\n if (tx < minX) minX = tx;\n if (ty < minY) minY = ty;\n if (tx > maxX) maxX = tx;\n if (ty > maxY) maxY = ty;\n }\n continue;\n }\n if (x1 < minX) minX = x1;\n if (y1 < minY) minY = y1;\n if (x2 < minX) minX = x2;\n if (y2 < minY) minY = y2;\n if (x1 > maxX) maxX = x1;\n if (y1 > maxY) maxY = y1;\n if (x2 > maxX) maxX = x2;\n if (y2 > maxY) maxY = y2;\n }\n if (!Number.isFinite(minX)) return null;\n return { minX, minY, maxX, maxY };\n}\n\nexport function Whiteboard({\n data,\n className,\n initialZoom,\n initialCenter,\n fitOnLoad,\n onValidationError,\n \"aria-label\": ariaLabel,\n}: WhiteboardProps) {\n const validation = useMemo(() => validateScene(data), [data]);\n const scene = validation.ok ? validation.scene : null;\n\n // EC-6: side effects only inside useEffect — never call user callbacks in render.\n useEffect(() => {\n if (!validation.ok && onValidationError) {\n onValidationError(validation.errors);\n }\n }, [validation, onValidationError]);\n\n // Stable rough.js generator across renders.\n const generator: RoughGenerator | null = useMemo(() => {\n if (typeof globalThis === \"undefined\") return null;\n try {\n return rough.generator();\n } catch {\n return null;\n }\n }, []);\n\n // Fallback dimensions for invalid scenes (still render a valid svg).\n const sceneWidth = scene?.width ?? 400;\n const sceneHeight = scene?.height ?? 300;\n const sceneBackground = scene?.background;\n\n const viewport = useViewport({\n width: sceneWidth,\n height: sceneHeight,\n initialZoom,\n initialCenter,\n });\n\n const svgRef = useRef<SVGSVGElement | null>(null);\n\n const fitTo = viewport.fitTo;\n // EC-14: fitOnLoad must run in useEffect (after mount), not during render.\n useEffect(() => {\n if (!fitOnLoad || !scene) return;\n const bounds = computeBounds(scene);\n if (!bounds) return;\n fitTo(bounds, { width: sceneWidth, height: sceneHeight });\n }, [fitOnLoad, scene, sceneWidth, sceneHeight, fitTo]);\n\n const handlers = usePointerPan(svgRef, viewport, {\n width: sceneWidth,\n height: sceneHeight,\n });\n\n const label = ariaLabel ?? \"Whiteboard diagram\";\n\n return (\n <svg\n ref={svgRef}\n viewBox={viewport.viewBox({ width: sceneWidth, height: sceneHeight })}\n width={sceneWidth}\n height={sceneHeight}\n className={className}\n role=\"img\"\n aria-label={label}\n xmlns=\"http://www.w3.org/2000/svg\"\n data-whiteboard-state={scene ? \"ok\" : \"invalid\"}\n style={{ touchAction: \"none\", userSelect: \"none\" }}\n {...handlers}\n >\n <title>{label}</title>\n {sceneBackground ? (\n <rect\n x={0}\n y={0}\n width={sceneWidth}\n height={sceneHeight}\n fill={sceneBackground}\n data-layer=\"background\"\n />\n ) : null}\n {scene && generator ? renderScene(scene, generator) : null}\n </svg>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@usetheo/ui",
3
- "version": "0.1.0-next.0",
4
- "description": "Theo UI — framework-agnostic React component library with the Violet Forge design system. Focused on AI-agent interfaces, PaaS dashboards, and developer-tooling surfaces.",
3
+ "version": "0.3.0-next.0",
4
+ "description": "Theo UI — framework-agnostic React component library with the Violet Forge design system. Focused on AI-agent interfaces, cloud dashboards, and developer-tooling surfaces.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "sideEffects": ["**/*.css"],
@@ -14,6 +14,8 @@
14
14
  "./tokens.css": "./dist/tokens.css",
15
15
  "./fonts.css": "./dist/fonts.css",
16
16
  "./fonts-cdn.css": "./dist/fonts-cdn.css",
17
+ "./slide/themes/default.css": "./dist/slide/themes/default.css",
18
+ "./slide/themes/violet-forge.css": "./dist/slide/themes/violet-forge.css",
17
19
  "./agent-composer": {
18
20
  "types": "./dist/index.d.ts",
19
21
  "import": "./dist/index.js"
@@ -409,6 +411,34 @@
409
411
  "./topnav": {
410
412
  "types": "./dist/index.d.ts",
411
413
  "import": "./dist/index.js"
414
+ },
415
+ "./whiteboard": {
416
+ "types": "./dist/whiteboard/index.d.ts",
417
+ "import": "./dist/whiteboard/index.js"
418
+ },
419
+ "./slide": {
420
+ "types": "./dist/slide/index.d.ts",
421
+ "import": "./dist/slide/index.js"
422
+ },
423
+ "./slide/plugins/shiki": {
424
+ "types": "./dist/slide/plugins/shiki/index.d.ts",
425
+ "import": "./dist/slide/plugins/shiki/index.js"
426
+ },
427
+ "./slide/plugins/math": {
428
+ "types": "./dist/slide/plugins/math/index.d.ts",
429
+ "import": "./dist/slide/plugins/math/index.js"
430
+ },
431
+ "./slide/plugins/mermaid": {
432
+ "types": "./dist/slide/plugins/mermaid/index.d.ts",
433
+ "import": "./dist/slide/plugins/mermaid/index.js"
434
+ },
435
+ "./slide/plugins/emoji": {
436
+ "types": "./dist/slide/plugins/emoji/index.d.ts",
437
+ "import": "./dist/slide/plugins/emoji/index.js"
438
+ },
439
+ "./slide-deck": {
440
+ "types": "./dist/slide-deck/index.d.ts",
441
+ "import": "./dist/slide-deck/index.js"
412
442
  }
413
443
  },
414
444
  "files": ["dist", "registry/r", "registry/index.json", "LICENSE", "CHANGELOG.md"],
@@ -439,12 +469,86 @@
439
469
  "quality:bundle": "tsx scripts/validate-bundle-size.ts",
440
470
  "quality:bundle:update": "tsx scripts/validate-bundle-size.ts --update",
441
471
  "quality:a11y": "vitest run src/test/ladle-axe.test.tsx",
442
- "quality:gates": "pnpm format:check && pnpm lint:ci && pnpm typecheck && pnpm test && pnpm build && pnpm registry:build && pnpm registry:validate && pnpm quality:structure && pnpm quality:bundle && pnpm quality:a11y && pnpm ladle:build",
472
+ "dogfood:whiteboard": "tsx scripts/dogfood-whiteboard.ts",
473
+ "dogfood:slide": "tsx scripts/dogfood-slide.ts",
474
+ "dogfood:slide-deck": "tsx scripts/dogfood-slide-deck.ts",
475
+ "dogfood:slide-rich": "tsx scripts/dogfood-slide-rich.ts",
476
+ "quality:gates": "pnpm format:check && pnpm lint:ci && pnpm typecheck && pnpm test && pnpm build && pnpm registry:build && pnpm registry:validate && pnpm quality:structure && pnpm quality:bundle && pnpm quality:a11y && pnpm ladle:build && pnpm dogfood:whiteboard && pnpm dogfood:slide && pnpm dogfood:slide-deck && pnpm dogfood:slide-rich",
443
477
  "quality:gates:fast": "pnpm format:check && pnpm lint:ci && pnpm typecheck && pnpm registry:build && pnpm registry:validate && pnpm quality:structure"
444
478
  },
445
479
  "peerDependencies": {
480
+ "hast-util-from-html": "^2.0.0",
481
+ "hast-util-sanitize": "^5.0.0",
482
+ "hast-util-to-jsx-runtime": "^2.0.0",
483
+ "katex": "^0.16.0",
484
+ "mdast-util-from-markdown": "^2.0.0",
485
+ "mdast-util-gfm": "^3.0.0",
486
+ "mdast-util-math": "^3.0.0",
487
+ "mdast-util-to-hast": "^13.0.0",
488
+ "mermaid": "^11.0.0",
489
+ "micromark-extension-gfm": "^3.0.0",
490
+ "micromark-extension-math": "^3.0.0",
491
+ "perfect-freehand": "^1.2.0",
446
492
  "react": ">=18.2.0 <20",
447
- "react-dom": ">=18.2.0 <20"
493
+ "react-dom": ">=18.2.0 <20",
494
+ "roughjs": "^4.6.0",
495
+ "shiki": "^1.0.0",
496
+ "unist-util-visit": "^5.0.0",
497
+ "unist-util-visit-parents": "^6.0.0",
498
+ "yaml": "^2.0.0"
499
+ },
500
+ "peerDependenciesMeta": {
501
+ "roughjs": {
502
+ "optional": true
503
+ },
504
+ "perfect-freehand": {
505
+ "optional": true
506
+ },
507
+ "mdast-util-from-markdown": {
508
+ "optional": true
509
+ },
510
+ "mdast-util-gfm": {
511
+ "optional": true
512
+ },
513
+ "micromark-extension-gfm": {
514
+ "optional": true
515
+ },
516
+ "mdast-util-to-hast": {
517
+ "optional": true
518
+ },
519
+ "hast-util-sanitize": {
520
+ "optional": true
521
+ },
522
+ "hast-util-to-jsx-runtime": {
523
+ "optional": true
524
+ },
525
+ "hast-util-from-html": {
526
+ "optional": true
527
+ },
528
+ "unist-util-visit": {
529
+ "optional": true
530
+ },
531
+ "unist-util-visit-parents": {
532
+ "optional": true
533
+ },
534
+ "yaml": {
535
+ "optional": true
536
+ },
537
+ "shiki": {
538
+ "optional": true
539
+ },
540
+ "katex": {
541
+ "optional": true
542
+ },
543
+ "micromark-extension-math": {
544
+ "optional": true
545
+ },
546
+ "mdast-util-math": {
547
+ "optional": true
548
+ },
549
+ "mermaid": {
550
+ "optional": true
551
+ }
448
552
  },
449
553
  "dependencies": {
450
554
  "@radix-ui/react-avatar": "^1.1.11",
@@ -465,7 +569,8 @@
465
569
  "cmdk": "^1.1.1",
466
570
  "lucide-react": "^0.471.0",
467
571
  "tailwind-merge": "^2.5.5",
468
- "tailwindcss-animate": "^1.0.7"
572
+ "tailwindcss-animate": "^1.0.7",
573
+ "zod": "^4.4.3"
469
574
  },
470
575
  "devDependencies": {
471
576
  "@biomejs/biome": "^1.9.4",
@@ -474,23 +579,38 @@
474
579
  "@testing-library/jest-dom": "^6.6.3",
475
580
  "@testing-library/react": "^16.1.0",
476
581
  "@testing-library/user-event": "^14.5.2",
582
+ "@types/hast": "^3.0.4",
583
+ "@types/mdast": "^4.0.4",
477
584
  "@types/node": "^22.10.5",
478
585
  "@types/react": "^18.3.18",
479
586
  "@types/react-dom": "^18.3.5",
480
587
  "@vitejs/plugin-react": "^4.7.0",
588
+ "@vitest/coverage-v8": "2.1.9",
481
589
  "autoprefixer": "^10.4.20",
482
590
  "geist": "^1.7.0",
483
591
  "happy-dom": "^20.9.0",
592
+ "hast-util-from-html": "^2.0.3",
593
+ "hast-util-sanitize": "^5.0.2",
594
+ "hast-util-to-jsx-runtime": "^2.3.6",
595
+ "mdast-util-from-markdown": "^2.0.3",
596
+ "mdast-util-gfm": "^3.1.0",
597
+ "mdast-util-to-hast": "^13.2.1",
598
+ "micromark-extension-gfm": "^3.0.0",
599
+ "perfect-freehand": "1.2.3",
484
600
  "postcss": "^8.5.14",
485
601
  "react": "^18.3.1",
486
602
  "react-dom": "^18.3.1",
603
+ "roughjs": "4.6.6",
487
604
  "tailwindcss": "^3.4.17",
488
605
  "tsup": "^8.3.5",
489
606
  "tsx": "^4.19.2",
490
607
  "typescript": "^5.7.3",
608
+ "unist-util-visit": "^5.0.0",
609
+ "unist-util-visit-parents": "^6.0.0",
491
610
  "vite": "^5.4.21",
492
611
  "vitest": "^2.1.8",
493
- "vitest-axe": "^0.1.0"
612
+ "vitest-axe": "^0.1.0",
613
+ "yaml": "^2.9.0"
494
614
  },
495
615
  "engines": {
496
616
  "node": ">=20"
@@ -546,6 +546,42 @@
546
546
  "title": "SkillsList",
547
547
  "description": "Grid of SkillCards with optional search + source filter chips."
548
548
  },
549
+ {
550
+ "name": "slide-deck",
551
+ "type": "registry:block",
552
+ "title": "SlideDeck",
553
+ "description": "Composite engine that orchestrates N <Slide> primitives. Keyboard / touch / hash routing, thumbnails, presenter view, fullscreen, CSS transitions, Marpit-style fragments, PDF export. Subpath-isolated bundle in @usetheo/ui."
554
+ },
555
+ {
556
+ "name": "slide-plugin-emoji",
557
+ "type": "registry:ui",
558
+ "title": "Slide plugin · Emoji",
559
+ "description": "Tier 2 Slide plugin that replaces :shortcode: with Unicode emoji. Ancestor-aware: skips replacement inside <code> / <pre> to preserve type hints and YAML keys. Zero peer-deps."
560
+ },
561
+ {
562
+ "name": "slide-plugin-math",
563
+ "type": "registry:ui",
564
+ "title": "Slide plugin · Math",
565
+ "description": "Tier 2 Slide plugin that renders $inline$ and $$block$$ math via KaTeX. Peer-deps katex + hast-util-from-html are opt-in."
566
+ },
567
+ {
568
+ "name": "slide-plugin-mermaid",
569
+ "type": "registry:ui",
570
+ "title": "Slide plugin · Mermaid",
571
+ "description": "Tier 2 Slide plugin that converts <code class=\"language-mermaid\"> blocks into Mermaid SVG diagrams (lazy-loaded). Peer-dep mermaid is opt-in."
572
+ },
573
+ {
574
+ "name": "slide-plugin-shiki",
575
+ "type": "registry:ui",
576
+ "title": "Slide plugin · Shiki",
577
+ "description": "Tier 2 Slide plugin that pre-renders fenced code blocks with Shiki's dual-theme highlighter. Peer-dep shiki is opt-in."
578
+ },
579
+ {
580
+ "name": "slide",
581
+ "type": "registry:ui",
582
+ "title": "Slide",
583
+ "description": "View-only primitive that renders Markdown + YAML frontmatter as a themed slide surface (Marp-inspired). Sanitized hast pipeline, two built-in themes, opt-in plugin system. Subpath-isolated bundle in @usetheo/ui."
584
+ },
549
585
  {
550
586
  "name": "social-auth-row",
551
587
  "type": "registry:ui",
@@ -695,6 +731,12 @@
695
731
  "type": "registry:lib",
696
732
  "title": "Theo UI shared types",
697
733
  "description": "Shared TypeScript helper types (IconComponent, etc.) used across Theo UI."
734
+ },
735
+ {
736
+ "name": "whiteboard",
737
+ "type": "registry:ui",
738
+ "title": "Whiteboard",
739
+ "description": "View-only primitive that renders a declarative JSON scene as SVG with a hand-drawn aesthetic. Pan + zoom built-in; no editor surface. Subpath-isolated bundle in @usetheo/ui."
698
740
  }
699
741
  ]
700
742
  }
@@ -6,10 +6,10 @@
6
6
  "description": "ChatComposer + slash-command / @file / #memory triggers.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "chat-composer",
10
- "cn",
11
- "mention-menu",
12
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/chat-composer.json",
10
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
11
+ "https://usetheodev.github.io/theo-ui/r/mention-menu.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -6,15 +6,15 @@
6
6
  "description": "Form for creating or editing an Agent persona.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "agent-profile",
10
- "button",
11
- "cn",
12
- "form-field",
13
- "input",
14
- "mode-types",
15
- "select",
16
- "tailwind-preset",
17
- "textarea"
9
+ "https://usetheodev.github.io/theo-ui/r/agent-profile.json",
10
+ "https://usetheodev.github.io/theo-ui/r/button.json",
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/form-field.json",
13
+ "https://usetheodev.github.io/theo-ui/r/input.json",
14
+ "https://usetheodev.github.io/theo-ui/r/mode-types.json",
15
+ "https://usetheodev.github.io/theo-ui/r/select.json",
16
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
17
+ "https://usetheodev.github.io/theo-ui/r/textarea.json"
18
18
  ],
19
19
  "files": [
20
20
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,10 +8,10 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "agent-types",
12
- "cn",
13
- "tailwind-preset",
14
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/agent-types.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
14
+ "https://usetheodev.github.io/theo-ui/r/types.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -9,8 +9,8 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "cn",
13
- "tailwind-preset"
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
14
14
  ],
15
15
  "files": [
16
16
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -6,15 +6,15 @@
6
6
  "description": "The canonical conversation surface for a code agent.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "agent-error-card",
10
- "agent-streaming",
11
- "approval-card",
12
- "chat-message",
13
- "chat-types",
14
- "cn",
15
- "tailwind-preset",
16
- "tool-call-card",
17
- "types"
9
+ "https://usetheodev.github.io/theo-ui/r/agent-error-card.json",
10
+ "https://usetheodev.github.io/theo-ui/r/agent-streaming.json",
11
+ "https://usetheodev.github.io/theo-ui/r/approval-card.json",
12
+ "https://usetheodev.github.io/theo-ui/r/chat-message.json",
13
+ "https://usetheodev.github.io/theo-ui/r/chat-types.json",
14
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
15
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
16
+ "https://usetheodev.github.io/theo-ui/r/tool-call-card.json",
17
+ "https://usetheodev.github.io/theo-ui/r/types.json"
18
18
  ],
19
19
  "files": [
20
20
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -6,10 +6,10 @@
6
6
  "description": "Vertical list of agent events.",
7
7
  "dependencies": [],
8
8
  "registryDependencies": [
9
- "agent-event",
10
- "agent-types",
11
- "cn",
12
- "tailwind-preset"
9
+ "https://usetheodev.github.io/theo-ui/r/agent-event.json",
10
+ "https://usetheodev.github.io/theo-ui/r/agent-types.json",
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -9,10 +9,10 @@
9
9
  "lucide-react"
10
10
  ],
11
11
  "registryDependencies": [
12
- "button",
13
- "cn",
14
- "tailwind-preset",
15
- "types"
12
+ "https://usetheodev.github.io/theo-ui/r/button.json",
13
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
14
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
15
+ "https://usetheodev.github.io/theo-ui/r/types.json"
16
16
  ],
17
17
  "files": [
18
18
  {
@@ -8,8 +8,8 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json"
13
13
  ],
14
14
  "files": [
15
15
  {
@@ -8,10 +8,10 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "chat-types",
12
- "cn",
13
- "tailwind-preset",
14
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/chat-types.json",
12
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
13
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
14
+ "https://usetheodev.github.io/theo-ui/r/types.json"
15
15
  ],
16
16
  "files": [
17
17
  {
@@ -8,9 +8,9 @@
8
8
  "lucide-react"
9
9
  ],
10
10
  "registryDependencies": [
11
- "cn",
12
- "tailwind-preset",
13
- "types"
11
+ "https://usetheodev.github.io/theo-ui/r/cn.json",
12
+ "https://usetheodev.github.io/theo-ui/r/tailwind-preset.json",
13
+ "https://usetheodev.github.io/theo-ui/r/types.json"
14
14
  ],
15
15
  "files": [
16
16
  {