art-bd-ui 1.0.30 → 1.0.32

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 (282) hide show
  1. package/dist/cjs/_virtual/index.js +3 -7
  2. package/dist/cjs/_virtual/index2.js +7 -3
  3. package/dist/cjs/_virtual/index3.js +2 -8
  4. package/dist/cjs/_virtual/index4.js +8 -2
  5. package/dist/cjs/_virtual/index5.js +8 -2
  6. package/dist/cjs/_virtual/index6.js +4 -4
  7. package/dist/cjs/_virtual/index7.js +2 -8
  8. package/dist/cjs/_virtual/uniqueId.js +11 -0
  9. package/dist/cjs/components/forms/input-number/input-number.js +3 -3
  10. package/dist/cjs/components/forms/input-number/step-buttons.js +1 -1
  11. package/dist/cjs/components/forms/select/select.js +14 -10
  12. package/dist/cjs/components/quiz/builder/components/question-card/question-card.js +44 -0
  13. package/dist/cjs/components/quiz/builder/components/question-prompt-editor/question-prompt-editor.js +33 -0
  14. package/dist/cjs/components/quiz/builder/components/questions-sidebar/questions-sidebar.js +68 -0
  15. package/dist/cjs/components/quiz/builder/components/quiz-settings/quiz-settings.js +34 -0
  16. package/dist/cjs/components/quiz/builder/components/use-scroll-spy.js +109 -0
  17. package/dist/cjs/components/quiz/builder/editors/choice-task-editor.js +119 -0
  18. package/dist/cjs/components/quiz/builder/editors/code-task-editor.js +31 -0
  19. package/dist/cjs/components/quiz/builder/editors/fill-in-blank-task-editor.js +62 -0
  20. package/dist/cjs/components/quiz/builder/editors/match-pairs-task-editor.js +33 -0
  21. package/dist/cjs/components/quiz/builder/editors/open-answer-task-editor.js +37 -0
  22. package/dist/cjs/components/quiz/builder/editors/sequence-task-editor.js +85 -0
  23. package/dist/cjs/components/quiz/builder/question-type-options.js +21 -0
  24. package/dist/cjs/components/quiz/builder/quiz-builder.js +191 -0
  25. package/dist/cjs/components/quiz/runner/question/question.js +34 -1
  26. package/dist/cjs/components/quiz/runner/quiz-runner.js +111 -28
  27. package/dist/cjs/components/quiz/runner/viewers/match-pairs-viewer/match-pairs-viewer.js +6 -3
  28. package/dist/cjs/components/quiz/runner/viewers/multi-choice-viewer/multi-choice-viewer.js +7 -3
  29. package/dist/cjs/components/quiz/runner/viewers/sequence-viewer/sequence-viewer.js +7 -4
  30. package/dist/cjs/components/quiz/runner/viewers/single-choice-viewer/single-choice-viewer.js +7 -3
  31. package/dist/cjs/components/quiz/utils/choice-option.js +8 -0
  32. package/dist/cjs/components/quiz/utils/prompt.js +36 -0
  33. package/dist/cjs/components/quiz/utils/shuffle.js +12 -0
  34. package/dist/cjs/components/ui/carousel/carousel.js +7 -43
  35. package/dist/cjs/components/ui/course-composer/components/action-buttons.js +31 -0
  36. package/dist/cjs/components/ui/course-composer/components/course-composer-actions.js +18 -0
  37. package/dist/cjs/components/ui/course-composer/components/course-composer-content-tab.js +55 -0
  38. package/dist/cjs/components/ui/course-composer/components/course-composer-empty-state.js +10 -0
  39. package/dist/cjs/components/ui/course-composer/components/course-composer-general-tab.js +22 -0
  40. package/dist/cjs/components/ui/course-composer/components/course-composer-lesson-content-editor.js +36 -0
  41. package/dist/cjs/components/ui/course-composer/components/course-composer-settings-tab.js +30 -0
  42. package/dist/cjs/components/ui/course-composer/components/course-structure-sidebar.js +34 -0
  43. package/dist/cjs/components/ui/course-composer/components/empty-chapter-droppable.js +22 -0
  44. package/dist/cjs/components/ui/course-composer/components/sortable-tree-row.js +94 -0
  45. package/dist/cjs/components/ui/course-composer/components/sortable-tree.js +72 -0
  46. package/dist/cjs/components/ui/course-composer/components/sortable-tree.utils.js +138 -0
  47. package/dist/cjs/components/ui/course-composer/constants.js +11 -0
  48. package/dist/cjs/components/ui/course-composer/course-composer.js +24 -0
  49. package/dist/cjs/components/ui/course-composer/course-composer.utils.js +207 -0
  50. package/dist/cjs/components/ui/course-composer/hooks/use-course-composer-state.js +104 -0
  51. package/dist/cjs/components/ui/pdf-viewer/pdf-viewer.js +2 -2
  52. package/dist/cjs/components/ui/pdf-viewer/pdf-worker-client.js +24 -0
  53. package/dist/cjs/components/ui/pdf-viewer/pdf.worker.js +26768 -0
  54. package/dist/cjs/components/ui/pdf-viewer/use-filled-pdf.js +6 -4
  55. package/dist/cjs/components/ui/rich-editor/bubble-menus/carousel-bubble-menu.js +413 -0
  56. package/dist/cjs/components/ui/rich-editor/bubble-menus/code-block-bubble-menu.js +74 -0
  57. package/dist/cjs/components/ui/rich-editor/bubble-menus/columns-bubble-menu.js +59 -0
  58. package/dist/cjs/components/ui/rich-editor/bubble-menus/floating-bubble-controls.js +15 -0
  59. package/dist/cjs/components/ui/rich-editor/bubble-menus/image-bubble-menu.js +34 -0
  60. package/dist/cjs/components/ui/rich-editor/bubble-menus/link-bubble-menu.js +70 -0
  61. package/dist/cjs/components/ui/rich-editor/bubble-menus/shared.js +85 -0
  62. package/dist/cjs/components/ui/rich-editor/bubble-menus/text-selection-bubble-menu.js +155 -0
  63. package/dist/cjs/components/ui/rich-editor/extensions/carousel/config.js +187 -0
  64. package/dist/cjs/components/ui/rich-editor/extensions/carousel/editor.js +51 -0
  65. package/dist/cjs/components/ui/rich-editor/extensions/carousel/extension.js +123 -0
  66. package/dist/cjs/components/ui/rich-editor/extensions/carousel/node-view.js +99 -0
  67. package/dist/cjs/components/ui/rich-editor/extensions/carousel/shared.js +137 -0
  68. package/dist/cjs/components/ui/rich-editor/extensions/carousel/view.js +14 -0
  69. package/dist/cjs/components/ui/rich-editor/extensions/code-block-lowlight-base.js +108 -0
  70. package/dist/cjs/components/ui/rich-editor/extensions/code-block-lowlight.js +27 -0
  71. package/dist/cjs/components/ui/rich-editor/extensions/code-block-utils.js +159 -0
  72. package/dist/cjs/components/ui/rich-editor/extensions/code.js +9 -0
  73. package/dist/cjs/components/ui/rich-editor/extensions/columns-utils.js +76 -0
  74. package/dist/cjs/components/ui/rich-editor/extensions/columns.js +184 -39
  75. package/dist/cjs/components/ui/rich-editor/extensions/table/table-actions-extension.js +54 -12
  76. package/dist/cjs/components/ui/rich-editor/extensions/table/table-cell-style.js +79 -0
  77. package/dist/cjs/components/ui/rich-editor/extensions/table/table-floating-controls.js +223 -198
  78. package/dist/cjs/components/ui/rich-editor/extensions/table/table-hover-extension.js +128 -25
  79. package/dist/cjs/components/ui/rich-editor/extensions/table/table-selection-overlay.js +39 -54
  80. package/dist/cjs/components/ui/rich-editor/extensions/table-cell.js +11 -5
  81. package/dist/cjs/components/ui/rich-editor/extensions/table-header.js +11 -5
  82. package/dist/cjs/components/ui/rich-editor/extensions/table-kit.js +58 -0
  83. package/dist/cjs/components/ui/rich-editor/extensions/table-row.js +4 -7
  84. package/dist/cjs/components/ui/rich-editor/extensions/table.js +12 -14
  85. package/dist/cjs/components/ui/rich-editor/extensions.js +195 -0
  86. package/dist/cjs/components/ui/rich-editor/rich-content-renderer.js +42 -465
  87. package/dist/cjs/components/ui/rich-editor/rich-editor.js +67 -166
  88. package/dist/cjs/components/ui/rich-editor/toolbar.js +2 -1
  89. package/dist/cjs/components/ui/rich-editor/views/code-block-node-view.js +63 -0
  90. package/dist/cjs/components/ui/rich-editor/views/resize-handle.js +12 -0
  91. package/dist/cjs/components/ui/rich-editor/views/use-node-resize.js +52 -0
  92. package/dist/cjs/index.js +14 -2
  93. package/dist/cjs/main.js +483 -0
  94. package/dist/cjs/node_modules/@ckeditor/ckeditor5-mention/dist/index.js +1 -1
  95. package/dist/cjs/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js +1 -1
  96. package/dist/cjs/node_modules/@ckeditor/ckeditor5-ui/dist/index.js +1 -1
  97. package/dist/cjs/node_modules/@dnd-kit/abstract/index.js +1550 -0
  98. package/dist/cjs/node_modules/@dnd-kit/abstract/modifiers.js +84 -0
  99. package/dist/cjs/node_modules/@dnd-kit/collision/dist/index.js +90 -0
  100. package/dist/cjs/node_modules/@dnd-kit/dom/index.js +2283 -0
  101. package/dist/cjs/node_modules/@dnd-kit/dom/sortable.js +922 -0
  102. package/dist/cjs/node_modules/@dnd-kit/dom/utilities.js +1503 -0
  103. package/dist/cjs/node_modules/@dnd-kit/geometry/dist/index.js +309 -0
  104. package/dist/cjs/node_modules/@dnd-kit/helpers/dist/index.js +188 -0
  105. package/dist/cjs/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js +38 -3
  106. package/dist/cjs/node_modules/@dnd-kit/react/hooks.js +133 -0
  107. package/dist/cjs/node_modules/@dnd-kit/react/index.js +427 -0
  108. package/dist/cjs/node_modules/@dnd-kit/react/sortable.js +177 -0
  109. package/dist/cjs/node_modules/@dnd-kit/react/utilities.js +18 -0
  110. package/dist/cjs/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -77
  111. package/dist/cjs/node_modules/@dnd-kit/state/dist/index.js +279 -0
  112. package/dist/cjs/node_modules/@preact/signals-core/dist/signals-core.js +12 -0
  113. package/dist/cjs/node_modules/@radix-ui/react-menu/dist/index.js +49 -49
  114. package/dist/cjs/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +1 -1
  115. package/dist/cjs/node_modules/@tiptap/core/dist/index.js +363 -91
  116. package/dist/cjs/node_modules/@tiptap/extension-code-block/dist/index.js +325 -0
  117. package/dist/cjs/node_modules/@tiptap/extension-code-block-lowlight/dist/index.js +152 -0
  118. package/dist/cjs/node_modules/@tiptap/react/dist/index.js +5 -1
  119. package/dist/cjs/node_modules/@tiptap/static-renderer/dist/pm/html-string/index.js +312 -0
  120. package/dist/cjs/node_modules/@tiptap/static-renderer/dist/pm/react/index.js +362 -0
  121. package/dist/cjs/node_modules/color-parse/index.js +1 -1
  122. package/dist/cjs/node_modules/comlink/dist/esm/comlink.js +360 -0
  123. package/dist/cjs/node_modules/lodash/uniqueId.js +42 -0
  124. package/dist/cjs/node_modules/prettier/plugins/babel.js +22 -0
  125. package/dist/cjs/node_modules/prettier/plugins/estree.js +45 -0
  126. package/dist/cjs/node_modules/prettier/plugins/html.js +32 -0
  127. package/dist/cjs/node_modules/prettier/plugins/markdown.js +73 -0
  128. package/dist/cjs/node_modules/prettier/plugins/postcss.js +64 -0
  129. package/dist/cjs/node_modules/prettier/plugins/typescript.js +27 -0
  130. package/dist/cjs/node_modules/prettier/plugins/yaml.js +171 -0
  131. package/dist/cjs/node_modules/prettier/standalone.js +50 -0
  132. package/dist/cjs/node_modules/prop-types/index.js +1 -1
  133. package/dist/cjs/node_modules/react-dropzone/dist/es/index.js +1 -1
  134. package/dist/cjs/node_modules/react-dropzone/dist/es/utils/index.js +1 -1
  135. package/dist/cjs/node_modules/use-sync-external-store/shim/index.js +1 -1
  136. package/dist/cjs/utils/file.js +45 -0
  137. package/dist/cjs/worker.js +25 -0
  138. package/dist/esm/_virtual/index.js +3 -5
  139. package/dist/esm/_virtual/index2.js +5 -3
  140. package/dist/esm/_virtual/index3.js +2 -6
  141. package/dist/esm/_virtual/index4.js +6 -2
  142. package/dist/esm/_virtual/index5.js +6 -2
  143. package/dist/esm/_virtual/index6.js +4 -4
  144. package/dist/esm/_virtual/index7.js +2 -6
  145. package/dist/esm/_virtual/uniqueId.js +7 -0
  146. package/dist/esm/components/forms/input-number/input-number.js +4 -4
  147. package/dist/esm/components/forms/input-number/step-buttons.js +1 -1
  148. package/dist/esm/components/forms/select/select.js +15 -11
  149. package/dist/esm/components/quiz/builder/components/question-card/question-card.js +42 -0
  150. package/dist/esm/components/quiz/builder/components/question-prompt-editor/question-prompt-editor.js +31 -0
  151. package/dist/esm/components/quiz/builder/components/questions-sidebar/questions-sidebar.js +47 -0
  152. package/dist/esm/components/quiz/builder/components/quiz-settings/quiz-settings.js +32 -0
  153. package/dist/esm/components/quiz/builder/components/use-scroll-spy.js +88 -0
  154. package/dist/esm/components/quiz/builder/editors/choice-task-editor.js +98 -0
  155. package/dist/esm/components/quiz/builder/editors/code-task-editor.js +29 -0
  156. package/dist/esm/components/quiz/builder/editors/fill-in-blank-task-editor.js +60 -0
  157. package/dist/esm/components/quiz/builder/editors/match-pairs-task-editor.js +31 -0
  158. package/dist/esm/components/quiz/builder/editors/open-answer-task-editor.js +35 -0
  159. package/dist/esm/components/quiz/builder/editors/sequence-task-editor.js +64 -0
  160. package/dist/esm/components/quiz/builder/question-type-options.js +19 -0
  161. package/dist/esm/components/quiz/builder/quiz-builder.js +170 -0
  162. package/dist/esm/components/quiz/runner/question/question.js +34 -1
  163. package/dist/esm/components/quiz/runner/quiz-runner.js +111 -28
  164. package/dist/esm/components/quiz/runner/viewers/match-pairs-viewer/match-pairs-viewer.js +6 -3
  165. package/dist/esm/components/quiz/runner/viewers/multi-choice-viewer/multi-choice-viewer.js +7 -3
  166. package/dist/esm/components/quiz/runner/viewers/sequence-viewer/sequence-viewer.js +7 -4
  167. package/dist/esm/components/quiz/runner/viewers/single-choice-viewer/single-choice-viewer.js +7 -3
  168. package/dist/esm/components/quiz/utils/choice-option.js +6 -0
  169. package/dist/esm/components/quiz/utils/prompt.js +33 -0
  170. package/dist/esm/components/quiz/utils/shuffle.js +10 -0
  171. package/dist/esm/components/ui/carousel/carousel.js +7 -43
  172. package/dist/esm/components/ui/course-composer/components/action-buttons.js +26 -0
  173. package/dist/esm/components/ui/course-composer/components/course-composer-actions.js +16 -0
  174. package/dist/esm/components/ui/course-composer/components/course-composer-content-tab.js +34 -0
  175. package/dist/esm/components/ui/course-composer/components/course-composer-empty-state.js +8 -0
  176. package/dist/esm/components/ui/course-composer/components/course-composer-general-tab.js +20 -0
  177. package/dist/esm/components/ui/course-composer/components/course-composer-lesson-content-editor.js +34 -0
  178. package/dist/esm/components/ui/course-composer/components/course-composer-settings-tab.js +28 -0
  179. package/dist/esm/components/ui/course-composer/components/course-structure-sidebar.js +32 -0
  180. package/dist/esm/components/ui/course-composer/components/empty-chapter-droppable.js +20 -0
  181. package/dist/esm/components/ui/course-composer/components/sortable-tree-row.js +72 -0
  182. package/dist/esm/components/ui/course-composer/components/sortable-tree.js +70 -0
  183. package/dist/esm/components/ui/course-composer/components/sortable-tree.utils.js +134 -0
  184. package/dist/esm/components/ui/course-composer/constants.js +8 -0
  185. package/dist/esm/components/ui/course-composer/course-composer.js +18 -0
  186. package/dist/esm/components/ui/course-composer/course-composer.utils.js +195 -0
  187. package/dist/esm/components/ui/course-composer/hooks/use-course-composer-state.js +83 -0
  188. package/dist/esm/components/ui/dropdown-menu/dropdown-menu.js +1 -1
  189. package/dist/esm/components/ui/pdf-viewer/pdf-viewer.js +2 -2
  190. package/dist/esm/components/ui/pdf-viewer/pdf-worker-client.js +21 -0
  191. package/dist/esm/components/ui/pdf-viewer/pdf.worker.js +26768 -0
  192. package/dist/esm/components/ui/pdf-viewer/use-filled-pdf.js +6 -4
  193. package/dist/esm/components/ui/poll-builder/poll-builder.js +2 -2
  194. package/dist/esm/components/ui/rich-editor/bubble-menus/carousel-bubble-menu.js +411 -0
  195. package/dist/esm/components/ui/rich-editor/bubble-menus/code-block-bubble-menu.js +72 -0
  196. package/dist/esm/components/ui/rich-editor/bubble-menus/columns-bubble-menu.js +57 -0
  197. package/dist/esm/components/ui/rich-editor/bubble-menus/floating-bubble-controls.js +13 -0
  198. package/dist/esm/components/ui/rich-editor/bubble-menus/image-bubble-menu.js +32 -0
  199. package/dist/esm/components/ui/rich-editor/bubble-menus/link-bubble-menu.js +68 -0
  200. package/dist/esm/components/ui/rich-editor/bubble-menus/shared.js +71 -0
  201. package/dist/esm/components/ui/rich-editor/bubble-menus/text-selection-bubble-menu.js +153 -0
  202. package/dist/esm/components/ui/rich-editor/extensions/carousel/config.js +181 -0
  203. package/dist/esm/components/ui/rich-editor/extensions/carousel/editor.js +46 -0
  204. package/dist/esm/components/ui/rich-editor/extensions/carousel/extension.js +118 -0
  205. package/dist/esm/components/ui/rich-editor/extensions/carousel/node-view.js +97 -0
  206. package/dist/esm/components/ui/rich-editor/extensions/carousel/shared.js +116 -0
  207. package/dist/esm/components/ui/rich-editor/extensions/carousel/view.js +12 -0
  208. package/dist/esm/components/ui/rich-editor/extensions/code-block-lowlight-base.js +106 -0
  209. package/dist/esm/components/ui/rich-editor/extensions/code-block-lowlight.js +14 -0
  210. package/dist/esm/components/ui/rich-editor/extensions/code-block-utils.js +148 -0
  211. package/dist/esm/components/ui/rich-editor/extensions/code.js +9 -0
  212. package/dist/esm/components/ui/rich-editor/extensions/columns-utils.js +73 -0
  213. package/dist/esm/components/ui/rich-editor/extensions/columns.js +182 -37
  214. package/dist/esm/components/ui/rich-editor/extensions/table/table-actions-extension.js +55 -13
  215. package/dist/esm/components/ui/rich-editor/extensions/table/table-cell-style.js +77 -0
  216. package/dist/esm/components/ui/rich-editor/extensions/table/table-floating-controls.js +223 -198
  217. package/dist/esm/components/ui/rich-editor/extensions/table/table-hover-extension.js +129 -26
  218. package/dist/esm/components/ui/rich-editor/extensions/table/table-selection-overlay.js +39 -53
  219. package/dist/esm/components/ui/rich-editor/extensions/table-cell.js +11 -5
  220. package/dist/esm/components/ui/rich-editor/extensions/table-header.js +11 -5
  221. package/dist/esm/components/ui/rich-editor/extensions/table-kit.js +56 -0
  222. package/dist/esm/components/ui/rich-editor/extensions/table-row.js +4 -7
  223. package/dist/esm/components/ui/rich-editor/extensions/table.js +12 -14
  224. package/dist/esm/components/ui/rich-editor/extensions.js +191 -0
  225. package/dist/esm/components/ui/rich-editor/rich-content-renderer.js +43 -448
  226. package/dist/esm/components/ui/rich-editor/rich-editor.js +62 -161
  227. package/dist/esm/components/ui/rich-editor/toolbar.js +2 -1
  228. package/dist/esm/components/ui/rich-editor/views/code-block-node-view.js +42 -0
  229. package/dist/esm/components/ui/rich-editor/views/resize-handle.js +10 -0
  230. package/dist/esm/components/ui/rich-editor/views/use-node-resize.js +50 -0
  231. package/dist/esm/index.js +6 -2
  232. package/dist/esm/main.js +125 -0
  233. package/dist/esm/node_modules/@ckeditor/ckeditor5-mention/dist/index.js +1 -1
  234. package/dist/esm/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js +1 -1
  235. package/dist/esm/node_modules/@ckeditor/ckeditor5-ui/dist/index.js +1 -1
  236. package/dist/esm/node_modules/@dnd-kit/abstract/index.js +1531 -0
  237. package/dist/esm/node_modules/@dnd-kit/abstract/modifiers.js +81 -0
  238. package/dist/esm/node_modules/@dnd-kit/collision/dist/index.js +85 -0
  239. package/dist/esm/node_modules/@dnd-kit/core/dist/core.esm.js +2 -2
  240. package/dist/esm/node_modules/@dnd-kit/dom/index.js +2266 -0
  241. package/dist/esm/node_modules/@dnd-kit/dom/sortable.js +913 -0
  242. package/dist/esm/node_modules/@dnd-kit/dom/utilities.js +1450 -0
  243. package/dist/esm/node_modules/@dnd-kit/geometry/dist/index.js +302 -0
  244. package/dist/esm/node_modules/@dnd-kit/helpers/dist/index.js +185 -0
  245. package/dist/esm/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js +37 -3
  246. package/dist/esm/node_modules/@dnd-kit/react/hooks.js +125 -0
  247. package/dist/esm/node_modules/@dnd-kit/react/index.js +421 -0
  248. package/dist/esm/node_modules/@dnd-kit/react/sortable.js +174 -0
  249. package/dist/esm/node_modules/@dnd-kit/react/utilities.js +16 -0
  250. package/dist/esm/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +4 -80
  251. package/dist/esm/node_modules/@dnd-kit/state/dist/index.js +265 -0
  252. package/dist/esm/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +1 -1
  253. package/dist/esm/node_modules/@preact/signals-core/dist/signals-core.js +3 -0
  254. package/dist/esm/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +1 -1
  255. package/dist/esm/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +1 -1
  256. package/dist/esm/node_modules/@tiptap/core/dist/index.js +361 -93
  257. package/dist/esm/node_modules/@tiptap/extension-code-block/dist/index.js +318 -0
  258. package/dist/esm/node_modules/@tiptap/extension-code-block-lowlight/dist/index.js +147 -0
  259. package/dist/esm/node_modules/@tiptap/react/dist/index.js +2 -2
  260. package/dist/esm/node_modules/@tiptap/static-renderer/dist/pm/html-string/index.js +304 -0
  261. package/dist/esm/node_modules/@tiptap/static-renderer/dist/pm/react/index.js +355 -0
  262. package/dist/esm/node_modules/color-parse/index.js +1 -1
  263. package/dist/esm/node_modules/comlink/dist/esm/comlink.js +350 -0
  264. package/dist/esm/node_modules/lodash/uniqueId.js +40 -0
  265. package/dist/esm/node_modules/prettier/plugins/babel.js +17 -0
  266. package/dist/esm/node_modules/prettier/plugins/estree.js +38 -0
  267. package/dist/esm/node_modules/prettier/plugins/html.js +24 -0
  268. package/dist/esm/node_modules/prettier/plugins/markdown.js +65 -0
  269. package/dist/esm/node_modules/prettier/plugins/postcss.js +56 -0
  270. package/dist/esm/node_modules/prettier/plugins/typescript.js +22 -0
  271. package/dist/esm/node_modules/prettier/plugins/yaml.js +163 -0
  272. package/dist/esm/node_modules/prettier/standalone.js +41 -0
  273. package/dist/esm/node_modules/prop-types/index.js +1 -1
  274. package/dist/esm/node_modules/prosemirror-tables/dist/index.js +1 -1
  275. package/dist/esm/node_modules/react-dropzone/dist/es/index.js +1 -1
  276. package/dist/esm/node_modules/react-dropzone/dist/es/utils/index.js +1 -1
  277. package/dist/esm/node_modules/use-sync-external-store/shim/index.js +1 -1
  278. package/dist/esm/utils/file.js +45 -1
  279. package/dist/esm/worker.js +23 -0
  280. package/dist/styles.css +491 -311
  281. package/dist/types/index.d.ts +299 -207
  282. package/package.json +4 -1
@@ -1,11 +1,7 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
3
+ var index = require('../node_modules/use-sync-external-store/shim/index.js');
4
4
 
5
- var _commonjsHelpers = require('./_commonjsHelpers.js');
6
- var index = require('../node_modules/prop-types/index.js');
5
+ var shimExports = index.__require();
7
6
 
8
- var propTypesExports = /*@__PURE__*/ index.__require();
9
- var PropTypes = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(propTypesExports);
10
-
11
- exports.default = PropTypes;
7
+ exports.shimExports = shimExports;
@@ -1,7 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var index = require('../node_modules/use-sync-external-store/shim/index.js');
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var shimExports = index.__require();
5
+ var _commonjsHelpers = require('./_commonjsHelpers.js');
6
+ var index = require('../node_modules/prop-types/index.js');
6
7
 
7
- exports.shimExports = shimExports;
8
+ var propTypesExports = /*@__PURE__*/ index.__require();
9
+ var PropTypes = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(propTypesExports);
10
+
11
+ exports.default = PropTypes;
@@ -1,11 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
3
+ var shim = {exports: {}};
4
4
 
5
- var _commonjsHelpers = require('./_commonjsHelpers.js');
6
- var index = require('../node_modules/attr-accept/dist/es/index.js');
7
-
8
- var esExports = index.__require();
9
- var _accepts = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(esExports);
10
-
11
- exports.default = _accepts;
5
+ exports.__module = shim;
@@ -1,5 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var shim = {exports: {}};
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- exports.__module = shim;
5
+ var _commonjsHelpers = require('./_commonjsHelpers.js');
6
+ var index = require('../node_modules/attr-accept/dist/es/index.js');
7
+
8
+ var esExports = index.__require();
9
+ var _accepts = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(esExports);
10
+
11
+ exports.default = _accepts;
@@ -1,5 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var propTypes = {exports: {}};
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- exports.__module = propTypes;
5
+ var _commonjsHelpers = require('./_commonjsHelpers.js');
6
+ var index = require('../node_modules/color-name/index.js');
7
+
8
+ var colorNameExports = index.__require();
9
+ var names = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(colorNameExports);
10
+
11
+ exports.default = names;
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _commonjsHelpers = require('./_commonjsHelpers.js');
6
- var index = require('../node_modules/color-name/index.js');
6
+ var index$1 = require('../node_modules/color-convert/index.js');
7
7
 
8
- var colorNameExports = index.__require();
9
- var names = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(colorNameExports);
8
+ var colorConvertExports = index$1.__require();
9
+ var index = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(colorConvertExports);
10
10
 
11
- exports.default = names;
11
+ exports.default = index;
@@ -1,11 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
3
+ var propTypes = {exports: {}};
4
4
 
5
- var _commonjsHelpers = require('./_commonjsHelpers.js');
6
- var index$1 = require('../node_modules/color-convert/index.js');
7
-
8
- var colorConvertExports = index$1.__require();
9
- var index = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(colorConvertExports);
10
-
11
- exports.default = index;
5
+ exports.__module = propTypes;
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _commonjsHelpers = require('./_commonjsHelpers.js');
6
+ var uniqueId = require('../node_modules/lodash/uniqueId.js');
7
+
8
+ var uniqueIdExports = uniqueId.__require();
9
+ var uid = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(uniqueIdExports);
10
+
11
+ exports.default = uid;
@@ -9,8 +9,8 @@ var stepButtons = require('./step-buttons.js');
9
9
  var useUpdateEffect = require('../../../hooks/use-update-effect.js');
10
10
  require('../../../_virtual/throttle.js');
11
11
  require('../../../_virtual/isEqual.js');
12
- var buttonGroup = require('../../buttons/button-group/button-group.js');
13
12
  var inputGroup = require('../input-group/input-group.js');
13
+ var utils$1 = require('../../../lib/utils.js');
14
14
 
15
15
  const noop = () => { };
16
16
  const getFormatter = (decimalScale, locale) => new Intl.NumberFormat(locale, {
@@ -19,7 +19,7 @@ const getFormatter = (decimalScale, locale) => new Intl.NumberFormat(locale, {
19
19
  maximumFractionDigits: decimalScale,
20
20
  });
21
21
  const InputNumber = React.forwardRef((_a, ref) => {
22
- var { value, onChange = noop, step = 1, min = -Infinity, max = Infinity, precision = 0, withControls = true, readOnly = false, disabled = false } = _a, rest = tslib_es6.__rest(_a, ["value", "onChange", "step", "min", "max", "precision", "withControls", "readOnly", "disabled"]);
22
+ var { value, onChange = noop, step = 1, min = -Infinity, max = Infinity, precision = 0, withControls = true, readOnly = false, disabled = false, className } = _a, rest = tslib_es6.__rest(_a, ["value", "onChange", "step", "min", "max", "precision", "withControls", "readOnly", "disabled", "className"]);
23
23
  // caret tracking
24
24
  const cursorPosition = React.useRef(0);
25
25
  const inputRef = React.useRef(null);
@@ -83,7 +83,7 @@ const InputNumber = React.forwardRef((_a, ref) => {
83
83
  // controls visibility and disabled state
84
84
  const disableUp = disabled || next(1) === utils.clamp(base, min, max);
85
85
  const disableDown = disabled || next(-1) === utils.clamp(base, min, max);
86
- return (jsxRuntime.jsxs(buttonGroup.ButtonGroup, { groupGap: "none", children: [jsxRuntime.jsx(inputGroup.InputGroupInput, Object.assign({}, rest, { ref: inputRef, type: "text", inputMode: precision > 0 ? "decimal" : "numeric", pattern: "[0-9]*(\\.[0-9]+)?", readOnly: readOnly || false, disabled: disabled, value: display, onChange: handleChange, onBlur: handleBlur, onKeyDown: handleKeyDown })), withControls && (jsxRuntime.jsx(stepButtons.StepButtons, { onIncrease: stepUp, onDecrease: stepDown, disableUp: disableUp, disableDown: disableDown }))] }));
86
+ return (jsxRuntime.jsxs(inputGroup.InputGroup, { className: utils$1.cn("bg-background text-sm overflow-hidden", className), children: [jsxRuntime.jsx(inputGroup.InputGroupInput, Object.assign({}, rest, { ref: inputRef, type: "text", inputMode: precision > 0 ? "decimal" : "numeric", pattern: "[0-9]*(\\\\.[0-9]+)?", readOnly: readOnly || false, disabled: disabled, value: display, onChange: handleChange, onBlur: handleBlur, onKeyDown: handleKeyDown })), withControls && (jsxRuntime.jsx(stepButtons.StepButtons, { onIncrease: stepUp, onDecrease: stepDown, disableUp: disableUp, disableDown: disableDown }))] }));
87
87
  });
88
88
  InputNumber.displayName = "InputNumber";
89
89
 
@@ -11,7 +11,7 @@ var utils = require('../../../lib/utils.js');
11
11
 
12
12
  const StepButton = ({ direction, disabled = false, onClick }) => (jsxRuntime.jsx(button.Button, { variant: "ghost", tabIndex: -1, "aria-hidden": true, className: utils.cn("flex items-center justify-center w-8 h-1/2 p-0 rounded-l-none hover:bg-accent cursor-pointer", disabled && "opacity-40 cursor-not-allowed"), onClick: disabled ? undefined : onClick, children: jsxRuntime.jsx(icon.Icon, { name: direction === "down" ? "chevron-down" : "chevron-up", size: 16 }) }));
13
13
  StepButton.displayName = "StepButton";
14
- const StepButtons = ({ onIncrease, onDecrease, disableUp, disableDown }) => (jsxRuntime.jsxs(buttonGroup.ButtonGroup, { orientation: "vertical", className: "select-none border rounded-md", children: [jsxRuntime.jsx(StepButton, { direction: "up", disabled: disableUp, onClick: onIncrease }), jsxRuntime.jsx(buttonGroup.ButtonGroupSeparator, { orientation: "horizontal" }), jsxRuntime.jsx(StepButton, { direction: "down", disabled: disableDown, onClick: onDecrease })] }));
14
+ const StepButtons = ({ onIncrease, onDecrease, disableUp, disableDown, className }) => (jsxRuntime.jsxs(buttonGroup.ButtonGroup, { orientation: "vertical", className: utils.cn("h-full shrink-0 p-0 select-none rounded-none border-0 border-l border-input", className), children: [jsxRuntime.jsx(StepButton, { direction: "up", disabled: disableUp, onClick: onIncrease }), jsxRuntime.jsx(buttonGroup.ButtonGroupSeparator, { orientation: "horizontal" }), jsxRuntime.jsx(StepButton, { direction: "down", disabled: disableDown, onClick: onDecrease })] }));
15
15
  StepButtons.displayName = "StepButtons";
16
16
 
17
17
  exports.StepButtons = StepButtons;
@@ -45,16 +45,20 @@ const SelectScrollDownButton = (_a) => {
45
45
  };
46
46
  SelectScrollDownButton.displayName = "SelectScrollDownButton";
47
47
  const SelectContent = (_a) => {
48
- var { className, children, position = "popper" } = _a, props = tslib_es6.__rest(_a, ["className", "children", "position"]);
49
- return (jsxRuntime.jsx(index.Portal, { children: jsxRuntime.jsxs(index.Content, Object.assign({ "data-slot": "select-content", className: utils.cn([
50
- "overlay-appearance-animation",
51
- "overlay-zoom-animation",
52
- "overlay-slide-animation",
53
- "max-h-(--radix-select-content-available-height)",
54
- "origin-(--radix-select-content-transform-origin)",
55
- ], "relative z-50 min-w-[8rem] bg-popover text-popover-foreground overflow-x-hidden overflow-y-auto rounded-md border shadow-md", position === "popper" &&
56
- "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position }, props, { children: [jsxRuntime.jsx(SelectScrollUpButton, {}), jsxRuntime.jsx(index.Viewport, { className: utils.cn("p-1", position === "popper" &&
57
- "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"), children: children }), jsxRuntime.jsx(SelectScrollDownButton, {})] })) }));
48
+ var { className, children, position = "popper", portal = true, portalContainer } = _a, props = tslib_es6.__rest(_a, ["className", "children", "position", "portal", "portalContainer"]);
49
+ const content = (jsxRuntime.jsxs(index.Content, Object.assign({ "data-slot": "select-content", className: utils.cn([
50
+ "overlay-appearance-animation",
51
+ "overlay-zoom-animation",
52
+ "overlay-slide-animation",
53
+ "max-h-(--radix-select-content-available-height)",
54
+ "origin-(--radix-select-content-transform-origin)",
55
+ ], "relative z-50 min-w-[8rem] bg-popover text-popover-foreground overflow-x-hidden overflow-y-auto rounded-md border shadow-md", position === "popper" &&
56
+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className), position: position }, props, { children: [jsxRuntime.jsx(SelectScrollUpButton, {}), jsxRuntime.jsx(index.Viewport, { className: utils.cn("p-1", position === "popper" &&
57
+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"), children: children }), jsxRuntime.jsx(SelectScrollDownButton, {})] })));
58
+ if (!portal) {
59
+ return content;
60
+ }
61
+ return jsxRuntime.jsx(index.Portal, { container: portalContainer, children: content });
58
62
  };
59
63
  SelectContent.displayName = "SelectContent";
60
64
  const SelectLabel = (_a) => {
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var questionTypeOptions = require('../../question-type-options.js');
6
+ var choiceTaskEditor = require('../../editors/choice-task-editor.js');
7
+ var openAnswerTaskEditor = require('../../editors/open-answer-task-editor.js');
8
+ var matchPairsTaskEditor = require('../../editors/match-pairs-task-editor.js');
9
+ var fillInBlankTaskEditor = require('../../editors/fill-in-blank-task-editor.js');
10
+ var sequenceTaskEditor = require('../../editors/sequence-task-editor.js');
11
+ var codeTaskEditor = require('../../editors/code-task-editor.js');
12
+ var questionPromptEditor = require('../question-prompt-editor/question-prompt-editor.js');
13
+ var card = require('../../../../ui/card/card.js');
14
+ var button = require('../../../../buttons/button/button.js');
15
+ var label = require('../../../../forms/label/label.js');
16
+ var select = require('../../../../forms/select/select.js');
17
+ var dropdownMenu = require('../../../../ui/dropdown-menu/dropdown-menu.js');
18
+ require('../../../../forms/checkbox/checkbox.js');
19
+ require('../../../../forms/dropzone/dropzone.js');
20
+ require('../../../../../node_modules/tslib/tslib.es6.js');
21
+ require('react');
22
+ require('../../../../utility/separator/separator.js');
23
+ require('../../../../forms/file-upload/file-upload.js');
24
+ require('../../../../forms/form/form.js');
25
+ require('../../../../forms/input/input.js');
26
+ require('../../../../forms/textarea/textarea.js');
27
+ var inputNumber = require('../../../../forms/input-number/input-number.js');
28
+ require('../../../../forms/radio/radio.js');
29
+ require('../../../../forms/switch/switch.js');
30
+ var icon = require('../../../../media/icon/icon.js');
31
+ var ellipsis = require('../../../../../node_modules/lucide-react/dist/esm/icons/ellipsis.js');
32
+ var copy = require('../../../../../node_modules/lucide-react/dist/esm/icons/copy.js');
33
+ var trash2 = require('../../../../../node_modules/lucide-react/dist/esm/icons/trash-2.js');
34
+
35
+ const QuestionCard = ({ index, question, onChange, onDelete, onDuplicate, onTypeChange }) => {
36
+ var _a, _b, _c, _d;
37
+ const updateSettings = (patch) => {
38
+ var _a;
39
+ onChange(Object.assign(Object.assign({}, question), { settings: Object.assign(Object.assign({}, ((_a = question.settings) !== null && _a !== void 0 ? _a : {})), patch) }));
40
+ };
41
+ return (jsxRuntime.jsxs(card.Card, { children: [jsxRuntime.jsxs(card.CardHeader, { className: "flex flex-row items-center justify-between space-y-0", children: [jsxRuntime.jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [jsxRuntime.jsxs(card.CardTitle, { className: "text-base shrink-0", children: ["Question ", index + 1] }), jsxRuntime.jsxs(select.Select, { value: question.type, onValueChange: (v) => onTypeChange(v), children: [jsxRuntime.jsx(select.SelectTrigger, { className: "w-[200px]", children: jsxRuntime.jsx(select.SelectValue, { placeholder: "Type" }) }), jsxRuntime.jsx(select.SelectContent, { children: questionTypeOptions.QUESTION_TYPE_OPTIONS.map((option) => (jsxRuntime.jsx(select.SelectItem, { value: option.type, children: option.label }, option.type))) })] }), jsxRuntime.jsxs("div", { className: "relative w-[120px]", children: [jsxRuntime.jsx(label.Label, { htmlFor: `points_${question.id}`, className: "sr-only", children: "Points" }), jsxRuntime.jsx(inputNumber.InputNumber, { id: `points_${question.id}`, prefix: jsxRuntime.jsx(icon.Icon, { name: "trophy" }), min: 0, step: 1, className: "w-12", value: (_a = question.points) !== null && _a !== void 0 ? _a : 1, onChange: (newNumber) => onChange(Object.assign(Object.assign({}, question), { points: newNumber })) })] })] }), jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: jsxRuntime.jsx(button.Button, { variant: "ghost", size: "icon", "aria-label": "Question menu", children: jsxRuntime.jsx(ellipsis.default, { className: "size-4" }) }) }), jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", className: "w-56", children: [jsxRuntime.jsx(dropdownMenu.DropdownMenuLabel, { children: "Settings" }), jsxRuntime.jsxs(dropdownMenu.DropdownMenuGroup, { children: [jsxRuntime.jsx(dropdownMenu.DropdownMenuCheckboxItem, { checked: !!((_b = question.settings) === null || _b === void 0 ? void 0 : _b.shuffleOptions), onCheckedChange: (checked) => updateSettings({ shuffleOptions: Boolean(checked) }), children: "Shuffle options" }), jsxRuntime.jsx(dropdownMenu.DropdownMenuCheckboxItem, { checked: (_d = (_c = question.settings) === null || _c === void 0 ? void 0 : _c.showFeedback) !== null && _d !== void 0 ? _d : true, onCheckedChange: (checked) => updateSettings({ showFeedback: Boolean(checked) }), children: "Show feedback" })] }), jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, {}), jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { onClick: onDuplicate, children: [jsxRuntime.jsx(copy.default, { className: "mr-2 size-4" }), "Duplicate"] }), jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: "text-destructive", onClick: onDelete, children: [jsxRuntime.jsx(trash2.default, { className: "mr-2 size-4" }), "Delete"] })] })] })] }), jsxRuntime.jsxs(card.CardContent, { className: "space-y-4", children: [jsxRuntime.jsx(questionPromptEditor.QuestionPromptEditor, { questionId: question.id, value: question.prompt, onChange: (prompt) => onChange(Object.assign(Object.assign({}, question), { prompt })) }), (question.type === "single-choice" || question.type === "multi-choice") && (jsxRuntime.jsx(choiceTaskEditor.ChoiceTaskEditor, { mode: question.type === "single-choice" ? "single" : "multi", options: question.options, onChange: (opts) => onChange(Object.assign(Object.assign({}, question), { options: opts })) })), question.type === "open-answer" && (jsxRuntime.jsx(openAnswerTaskEditor.OpenAnswerTaskEditor, { question: question, onChange: (q) => onChange(q) })), question.type === "match-pairs" && (jsxRuntime.jsx(matchPairsTaskEditor.MatchPairsTaskEditor, { question: question, onChange: (q) => onChange(q) })), question.type === "fill-in-blank" && (jsxRuntime.jsx(fillInBlankTaskEditor.FillInBlankTaskEditor, { question: question, onChange: (q) => onChange(q) })), question.type === "sequence" && (jsxRuntime.jsx(sequenceTaskEditor.SequenceTaskEditor, { question: question, onChange: (q) => onChange(q) })), question.type === "code-task" && (jsxRuntime.jsx(codeTaskEditor.CodeTaskEditor, { question: question, onChange: (q) => onChange(q) }))] })] }));
42
+ };
43
+
44
+ exports.QuestionCard = QuestionCard;
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var label = require('../../../../forms/label/label.js');
6
+ var textarea = require('../../../../forms/textarea/textarea.js');
7
+ var richEditor = require('../../../../ui/rich-editor/rich-editor.js');
8
+ require('react');
9
+ require('../../../../ui/rich-editor/extensions.js');
10
+ require('../../../../ui/rich-editor/extensions/carousel/extension.js');
11
+ require('../../../../ui/rich-editor/extensions/carousel/editor.js');
12
+ require('../../../../ui/carousel/carousel.js');
13
+ require('../../../../../node_modules/tslib/tslib.es6.js');
14
+ require('../../../../forms/file-upload/file-upload.js');
15
+
16
+ const PROMPT_TOOLBAR_ACTIONS = [
17
+ "history",
18
+ "heading",
19
+ "bold",
20
+ "italic",
21
+ "underline",
22
+ "strike",
23
+ "link",
24
+ "bulletList",
25
+ "orderedList",
26
+ "blockquote",
27
+ "clearFormatting",
28
+ ];
29
+ const QuestionPromptEditor = ({ questionId, value, onChange, placeholder = "Type the question prompt…", mode = "rich", }) => {
30
+ return (jsxRuntime.jsxs("div", { className: "space-y-2", children: [jsxRuntime.jsx(label.Label, { htmlFor: mode === "plain" ? `prompt_${questionId}` : undefined, children: "Prompt" }), mode === "rich" ? (jsxRuntime.jsx(richEditor.RichEditor, { value: value, onChange: onChange, placeholder: placeholder, toolbarActions: [...PROMPT_TOOLBAR_ACTIONS], showBubbleMenu: false, showFooter: false, editorContentClassName: "min-h-[120px] py-3" })) : (jsxRuntime.jsx(textarea.Textarea, { id: `prompt_${questionId}`, placeholder: placeholder, value: value, onChange: (event) => onChange(event.target.value) }))] }));
31
+ };
32
+
33
+ exports.QuestionPromptEditor = QuestionPromptEditor;
@@ -0,0 +1,68 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var React = require('react');
6
+ var core_esm = require('../../../../../node_modules/@dnd-kit/core/dist/core.esm.js');
7
+ var sortable_esm = require('../../../../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js');
8
+ var utilities_esm = require('../../../../../node_modules/@dnd-kit/utilities/dist/utilities.esm.js');
9
+ var modifiers_esm = require('../../../../../node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js');
10
+ var utils = require('../../../../../lib/utils.js');
11
+ var gripVertical = require('../../../../../node_modules/lucide-react/dist/esm/icons/grip-vertical.js');
12
+
13
+ function _interopNamespaceDefault(e) {
14
+ var n = Object.create(null);
15
+ if (e) {
16
+ Object.keys(e).forEach(function (k) {
17
+ if (k !== 'default') {
18
+ var d = Object.getOwnPropertyDescriptor(e, k);
19
+ Object.defineProperty(n, k, d.get ? d : {
20
+ enumerable: true,
21
+ get: function () { return e[k]; }
22
+ });
23
+ }
24
+ });
25
+ }
26
+ n.default = e;
27
+ return Object.freeze(n);
28
+ }
29
+
30
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
31
+
32
+ const QuestionsSidebar = ({ items, onReorder, onJump, activeId }) => {
33
+ const sensors = core_esm.useSensors(core_esm.useSensor(core_esm.PointerSensor, { activationConstraint: { distance: 6 } }));
34
+ const [dragging, setDragging] = React__namespace.useState(false);
35
+ const scrollRef = React__namespace.useRef(null);
36
+ const onDragEnd = (e) => {
37
+ setDragging(false);
38
+ const { active, over } = e;
39
+ if (!over || active.id === over.id)
40
+ return;
41
+ const oldIndex = items.findIndex((x) => x.id === active.id);
42
+ const newIndex = items.findIndex((x) => x.id === over.id);
43
+ if (oldIndex < 0 || newIndex < 0)
44
+ return;
45
+ const next = sortable_esm.arrayMove(items, oldIndex, newIndex);
46
+ onReorder(next.map((n) => n.id), active.id);
47
+ };
48
+ return (jsxRuntime.jsxs("div", { className: "rounded-lg border bg-card", children: [jsxRuntime.jsx("div", { className: "px-3 pt-2 text-sm font-medium", children: "Questions" }), jsxRuntime.jsx("div", { ref: scrollRef, className: utils.cn("px-2 py-2", "overflow-y-auto overscroll-contain",
49
+ // prevent text selection + touch scrolling glitches while dragging
50
+ dragging ? "select-none touch-none" : ""),
51
+ // Block wheel scroll from propagating to the page while dragging
52
+ onWheelCapture: (e) => {
53
+ if (dragging)
54
+ e.stopPropagation();
55
+ }, children: jsxRuntime.jsx(core_esm.DndContext, { sensors: sensors, collisionDetection: core_esm.closestCenter,
56
+ // Keep dnd constrained to this scroll container
57
+ modifiers: [modifiers_esm.restrictToVerticalAxis, modifiers_esm.restrictToFirstScrollableAncestor], onDragStart: () => setDragging(true), onDragCancel: () => setDragging(false), onDragEnd: onDragEnd, autoScroll: false, children: jsxRuntime.jsx(sortable_esm.SortableContext, { items: items.map((x) => x.id), strategy: sortable_esm.verticalListSortingStrategy, children: jsxRuntime.jsx("ul", { className: "space-y-1", children: items.map((it, idx) => (jsxRuntime.jsx(SidebarRow, { item: it, index: idx, onJump: () => {
58
+ console.log("onJump", it.id);
59
+ onJump(it.id);
60
+ }, active: activeId === it.id }, it.id))) }) }) }) })] }));
61
+ };
62
+ const SidebarRow = ({ item, index, onJump, active }) => {
63
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = sortable_esm.useSortable({ id: item.id });
64
+ const style = { transform: utilities_esm.CSS.Transform.toString(transform), transition };
65
+ return (jsxRuntime.jsxs("li", { ref: setNodeRef, style: style, className: utils.cn("flex items-center gap-2 rounded-md border px-2 py-1 text-sm bg-background", "focus-within:ring-2 focus-within:ring-primary", active && "ring-2 ring-primary", isDragging && "opacity-70"), children: [jsxRuntime.jsx("button", Object.assign({ className: "p-1 rounded-md border bg-background hover:bg-accent", "aria-label": "Drag to reorder" }, attributes, listeners, { children: jsxRuntime.jsx(gripVertical.default, { className: "size-4 opacity-70" }) })), jsxRuntime.jsx("button", { type: "button", onClick: onJump, className: "flex-1 text-left truncate hover:underline", title: item.label || `Question ${index + 1}`, children: item.label || `Question ${index + 1}` }), jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: item.type })] }));
66
+ };
67
+
68
+ exports.QuestionsSidebar = QuestionsSidebar;
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var card = require('../../../../ui/card/card.js');
6
+ var label = require('../../../../forms/label/label.js');
7
+ var input = require('../../../../forms/input/input.js');
8
+ var _switch = require('../../../../forms/switch/switch.js');
9
+ var utils = require('../../../../../lib/utils.js');
10
+
11
+ const QuizSettingsPanel = ({ value, onChange, className }) => {
12
+ var _a, _b, _c, _d, _e;
13
+ const set = (patch) => onChange(Object.assign(Object.assign({}, value), patch));
14
+ return (jsxRuntime.jsxs(card.Card, { className: utils.cn(
15
+ // Compact look & feel
16
+ "p-3 md:p-3 rounded-lg border bg-card", className), children: [jsxRuntime.jsx("div", { className: "text-xs font-medium text-muted-foreground mb-2", children: "Quiz settings" }), jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-2 md:flex md:items-center md:gap-4", children: [jsxRuntime.jsx(ToggleItem, { id: "shuffle", label: "Shuffle questions", checked: !!value.shuffleQuestions, onCheckedChange: (v) => set({ shuffleQuestions: v }) }), jsxRuntime.jsx(ToggleItem, { id: "sequential", label: "Sequential mode", checked: !!value.sequentialMode, onCheckedChange: (v) => set({ sequentialMode: v }) }), jsxRuntime.jsx(ToggleItem, { id: "breakdown", label: "Show breakdown", checked: (_a = value.showResultBreakdown) !== null && _a !== void 0 ? _a : true, onCheckedChange: (v) => set({ showResultBreakdown: v }) })] }), jsxRuntime.jsxs("div", { className: "mt-2 grid grid-cols-2 md:grid-cols-4 gap-2", children: [jsxRuntime.jsx(Num, { id: "failfast", miniLabel: "Incorrect streak", value: (_b = value.failFastIncorrectStreak) !== null && _b !== void 0 ? _b : 0, min: 0, step: 1, onChange: (n) => set({ failFastIncorrectStreak: Math.max(0, n) }) }), jsxRuntime.jsx(Num, { id: "attempts", miniLabel: "Attempts", value: (_c = value.attemptsAllowed) !== null && _c !== void 0 ? _c : 0, min: 0, step: 1, suffix: value.attemptsAllowed === 0 ? "∞" : undefined, onChange: (n) => set({ attemptsAllowed: Math.max(0, n) }) }), jsxRuntime.jsx(Num, { id: "timelimit", miniLabel: "Total time", value: (_d = value.timeLimitSeconds) !== null && _d !== void 0 ? _d : 0, min: 0, step: 30, suffix: "sec", onChange: (n) => set({ timeLimitSeconds: Math.max(0, n) }) }), jsxRuntime.jsx(Num, { id: "perquestion", miniLabel: "Per question", value: (_e = value.perQuestionDefaultSeconds) !== null && _e !== void 0 ? _e : 0, min: 0, step: 10, suffix: "sec", onChange: (n) => set({ perQuestionDefaultSeconds: Math.max(0, n) }) })] })] }));
17
+ };
18
+ /* ——— UI bits —————————————————————————————— */
19
+ const ToggleItem = ({ id, label, checked, onCheckedChange }) => {
20
+ return (jsxRuntime.jsxs("label", { htmlFor: id, className: utils.cn("group inline-flex items-center justify-between gap-2", "rounded-md border px-2 py-1.5 bg-background hover:bg-accent/50", "cursor-pointer select-none"), children: [jsxRuntime.jsx("span", { className: "text-xs md:text-sm", children: label }), jsxRuntime.jsx(_switch.Switch, { id: id, checked: checked, onCheckedChange: onCheckedChange })] }));
21
+ };
22
+ const Num = ({ id, miniLabel, value, min = 0, step = 1, suffix, onChange }) => {
23
+ return (jsxRuntime.jsxs("div", { className: "space-y-1", children: [jsxRuntime.jsx(label.Label, { htmlFor: id, className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: miniLabel }), jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx(input.Input, { id: id, type: "number", inputMode: "numeric", min: min, step: step, className: utils.cn("h-8 pr-12", // reserve space for suffix chip
24
+ "text-sm"), value: Number.isFinite(value) ? value : 0, onChange: (e) => onChange(safeNum(e.currentTarget.value, min)), "aria-label": miniLabel }), suffix && (jsxRuntime.jsx("span", { className: utils.cn("pointer-events-none absolute right-1 top-1/2 -translate-y-1/2", "rounded-md border px-1.5 py-0.5 text-[10px] text-muted-foreground bg-background"), children: suffix }))] })] }));
25
+ };
26
+ /* ——— utils —————————————————————————————— */
27
+ function safeNum(v, min = 0) {
28
+ const n = Number(v);
29
+ if (Number.isNaN(n))
30
+ return min;
31
+ return n;
32
+ }
33
+
34
+ exports.QuizSettingsPanel = QuizSettingsPanel;
@@ -0,0 +1,109 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
24
+
25
+ function useScrollSpy(ids) {
26
+ const [activeId, setActiveId] = React__namespace.useState(null);
27
+ const observerRef = React__namespace.useRef(null);
28
+ React__namespace.useEffect(() => {
29
+ // Clean up previous observer
30
+ if (observerRef.current) {
31
+ observerRef.current.disconnect();
32
+ }
33
+ // Get all elements
34
+ const elements = ids.map((id) => document.querySelector(`[data-spy-id="${id}"]`)).filter((el) => el !== null);
35
+ if (elements.length === 0) {
36
+ setActiveId(null);
37
+ return;
38
+ }
39
+ // Store visibility state for all elements
40
+ const visibilityMap = new Map();
41
+ const updateActiveElement = () => {
42
+ // Check if we're near the bottom of the page
43
+ const scrollableHeight = document.documentElement.scrollHeight - window.innerHeight;
44
+ const currentScroll = window.scrollY;
45
+ const isNearBottom = scrollableHeight - currentScroll < 100;
46
+ // If near bottom, always activate the last element
47
+ if (isNearBottom && elements.length > 0) {
48
+ const lastElement = elements[elements.length - 1];
49
+ const lastId = lastElement.dataset.spyId;
50
+ if (lastId) {
51
+ setActiveId(lastId);
52
+ return;
53
+ }
54
+ }
55
+ // Get all visible entries with their ratios
56
+ const visibleEntries = Array.from(visibilityMap.entries())
57
+ .filter(([_, ratio]) => ratio > 0)
58
+ .map(([element, ratio]) => ({
59
+ element,
60
+ id: element.dataset.spyId,
61
+ ratio,
62
+ }));
63
+ if (visibleEntries.length === 0) {
64
+ return;
65
+ }
66
+ // Simply find the element with the highest intersection ratio
67
+ // This means the element with the most content visible on screen
68
+ const winner = visibleEntries.reduce((max, current) => (current.ratio > max.ratio ? current : max));
69
+ setActiveId(winner.id);
70
+ };
71
+ // Create observer with zero margins - pure visibility tracking
72
+ observerRef.current = new IntersectionObserver((entries) => {
73
+ // Update visibility map with current ratios
74
+ entries.forEach((entry) => {
75
+ if (entry.isIntersecting && entry.intersectionRatio > 0) {
76
+ visibilityMap.set(entry.target, entry.intersectionRatio);
77
+ }
78
+ else {
79
+ visibilityMap.delete(entry.target);
80
+ }
81
+ });
82
+ // Find which element has the most content visible
83
+ updateActiveElement();
84
+ }, {
85
+ // Zero margins - just track what's actually visible
86
+ rootMargin: "0px",
87
+ // Fine-grained thresholds for accurate ratio tracking
88
+ threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
89
+ });
90
+ // Observe all elements
91
+ elements.forEach((el) => observerRef.current.observe(el));
92
+ // Add scroll listener to detect bottom
93
+ const handleScroll = () => {
94
+ updateActiveElement();
95
+ };
96
+ window.addEventListener("scroll", handleScroll, { passive: true });
97
+ // Cleanup
98
+ return () => {
99
+ if (observerRef.current) {
100
+ observerRef.current.disconnect();
101
+ }
102
+ window.removeEventListener("scroll", handleScroll);
103
+ visibilityMap.clear();
104
+ };
105
+ }, [ids.join(",")]);
106
+ return activeId;
107
+ }
108
+
109
+ exports.useScrollSpy = useScrollSpy;