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.
- package/dist/cjs/_virtual/index.js +3 -7
- package/dist/cjs/_virtual/index2.js +7 -3
- package/dist/cjs/_virtual/index3.js +2 -8
- package/dist/cjs/_virtual/index4.js +8 -2
- package/dist/cjs/_virtual/index5.js +8 -2
- package/dist/cjs/_virtual/index6.js +4 -4
- package/dist/cjs/_virtual/index7.js +2 -8
- package/dist/cjs/_virtual/uniqueId.js +11 -0
- package/dist/cjs/components/forms/input-number/input-number.js +3 -3
- package/dist/cjs/components/forms/input-number/step-buttons.js +1 -1
- package/dist/cjs/components/forms/select/select.js +14 -10
- package/dist/cjs/components/quiz/builder/components/question-card/question-card.js +44 -0
- package/dist/cjs/components/quiz/builder/components/question-prompt-editor/question-prompt-editor.js +33 -0
- package/dist/cjs/components/quiz/builder/components/questions-sidebar/questions-sidebar.js +68 -0
- package/dist/cjs/components/quiz/builder/components/quiz-settings/quiz-settings.js +34 -0
- package/dist/cjs/components/quiz/builder/components/use-scroll-spy.js +109 -0
- package/dist/cjs/components/quiz/builder/editors/choice-task-editor.js +119 -0
- package/dist/cjs/components/quiz/builder/editors/code-task-editor.js +31 -0
- package/dist/cjs/components/quiz/builder/editors/fill-in-blank-task-editor.js +62 -0
- package/dist/cjs/components/quiz/builder/editors/match-pairs-task-editor.js +33 -0
- package/dist/cjs/components/quiz/builder/editors/open-answer-task-editor.js +37 -0
- package/dist/cjs/components/quiz/builder/editors/sequence-task-editor.js +85 -0
- package/dist/cjs/components/quiz/builder/question-type-options.js +21 -0
- package/dist/cjs/components/quiz/builder/quiz-builder.js +191 -0
- package/dist/cjs/components/quiz/runner/question/question.js +34 -1
- package/dist/cjs/components/quiz/runner/quiz-runner.js +111 -28
- package/dist/cjs/components/quiz/runner/viewers/match-pairs-viewer/match-pairs-viewer.js +6 -3
- package/dist/cjs/components/quiz/runner/viewers/multi-choice-viewer/multi-choice-viewer.js +7 -3
- package/dist/cjs/components/quiz/runner/viewers/sequence-viewer/sequence-viewer.js +7 -4
- package/dist/cjs/components/quiz/runner/viewers/single-choice-viewer/single-choice-viewer.js +7 -3
- package/dist/cjs/components/quiz/utils/choice-option.js +8 -0
- package/dist/cjs/components/quiz/utils/prompt.js +36 -0
- package/dist/cjs/components/quiz/utils/shuffle.js +12 -0
- package/dist/cjs/components/ui/carousel/carousel.js +7 -43
- package/dist/cjs/components/ui/course-composer/components/action-buttons.js +31 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-actions.js +18 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-content-tab.js +55 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-empty-state.js +10 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-general-tab.js +22 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-lesson-content-editor.js +36 -0
- package/dist/cjs/components/ui/course-composer/components/course-composer-settings-tab.js +30 -0
- package/dist/cjs/components/ui/course-composer/components/course-structure-sidebar.js +34 -0
- package/dist/cjs/components/ui/course-composer/components/empty-chapter-droppable.js +22 -0
- package/dist/cjs/components/ui/course-composer/components/sortable-tree-row.js +94 -0
- package/dist/cjs/components/ui/course-composer/components/sortable-tree.js +72 -0
- package/dist/cjs/components/ui/course-composer/components/sortable-tree.utils.js +138 -0
- package/dist/cjs/components/ui/course-composer/constants.js +11 -0
- package/dist/cjs/components/ui/course-composer/course-composer.js +24 -0
- package/dist/cjs/components/ui/course-composer/course-composer.utils.js +207 -0
- package/dist/cjs/components/ui/course-composer/hooks/use-course-composer-state.js +104 -0
- package/dist/cjs/components/ui/pdf-viewer/pdf-viewer.js +2 -2
- package/dist/cjs/components/ui/pdf-viewer/pdf-worker-client.js +24 -0
- package/dist/cjs/components/ui/pdf-viewer/pdf.worker.js +26768 -0
- package/dist/cjs/components/ui/pdf-viewer/use-filled-pdf.js +6 -4
- package/dist/cjs/components/ui/rich-editor/bubble-menus/carousel-bubble-menu.js +413 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/code-block-bubble-menu.js +74 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/columns-bubble-menu.js +59 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/floating-bubble-controls.js +15 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/image-bubble-menu.js +34 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/link-bubble-menu.js +70 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/shared.js +85 -0
- package/dist/cjs/components/ui/rich-editor/bubble-menus/text-selection-bubble-menu.js +155 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/config.js +187 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/editor.js +51 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/extension.js +123 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/node-view.js +99 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/shared.js +137 -0
- package/dist/cjs/components/ui/rich-editor/extensions/carousel/view.js +14 -0
- package/dist/cjs/components/ui/rich-editor/extensions/code-block-lowlight-base.js +108 -0
- package/dist/cjs/components/ui/rich-editor/extensions/code-block-lowlight.js +27 -0
- package/dist/cjs/components/ui/rich-editor/extensions/code-block-utils.js +159 -0
- package/dist/cjs/components/ui/rich-editor/extensions/code.js +9 -0
- package/dist/cjs/components/ui/rich-editor/extensions/columns-utils.js +76 -0
- package/dist/cjs/components/ui/rich-editor/extensions/columns.js +184 -39
- package/dist/cjs/components/ui/rich-editor/extensions/table/table-actions-extension.js +54 -12
- package/dist/cjs/components/ui/rich-editor/extensions/table/table-cell-style.js +79 -0
- package/dist/cjs/components/ui/rich-editor/extensions/table/table-floating-controls.js +223 -198
- package/dist/cjs/components/ui/rich-editor/extensions/table/table-hover-extension.js +128 -25
- package/dist/cjs/components/ui/rich-editor/extensions/table/table-selection-overlay.js +39 -54
- package/dist/cjs/components/ui/rich-editor/extensions/table-cell.js +11 -5
- package/dist/cjs/components/ui/rich-editor/extensions/table-header.js +11 -5
- package/dist/cjs/components/ui/rich-editor/extensions/table-kit.js +58 -0
- package/dist/cjs/components/ui/rich-editor/extensions/table-row.js +4 -7
- package/dist/cjs/components/ui/rich-editor/extensions/table.js +12 -14
- package/dist/cjs/components/ui/rich-editor/extensions.js +195 -0
- package/dist/cjs/components/ui/rich-editor/rich-content-renderer.js +42 -465
- package/dist/cjs/components/ui/rich-editor/rich-editor.js +67 -166
- package/dist/cjs/components/ui/rich-editor/toolbar.js +2 -1
- package/dist/cjs/components/ui/rich-editor/views/code-block-node-view.js +63 -0
- package/dist/cjs/components/ui/rich-editor/views/resize-handle.js +12 -0
- package/dist/cjs/components/ui/rich-editor/views/use-node-resize.js +52 -0
- package/dist/cjs/index.js +14 -2
- package/dist/cjs/main.js +483 -0
- package/dist/cjs/node_modules/@ckeditor/ckeditor5-mention/dist/index.js +1 -1
- package/dist/cjs/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js +1 -1
- package/dist/cjs/node_modules/@ckeditor/ckeditor5-ui/dist/index.js +1 -1
- package/dist/cjs/node_modules/@dnd-kit/abstract/index.js +1550 -0
- package/dist/cjs/node_modules/@dnd-kit/abstract/modifiers.js +84 -0
- package/dist/cjs/node_modules/@dnd-kit/collision/dist/index.js +90 -0
- package/dist/cjs/node_modules/@dnd-kit/dom/index.js +2283 -0
- package/dist/cjs/node_modules/@dnd-kit/dom/sortable.js +922 -0
- package/dist/cjs/node_modules/@dnd-kit/dom/utilities.js +1503 -0
- package/dist/cjs/node_modules/@dnd-kit/geometry/dist/index.js +309 -0
- package/dist/cjs/node_modules/@dnd-kit/helpers/dist/index.js +188 -0
- package/dist/cjs/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js +38 -3
- package/dist/cjs/node_modules/@dnd-kit/react/hooks.js +133 -0
- package/dist/cjs/node_modules/@dnd-kit/react/index.js +427 -0
- package/dist/cjs/node_modules/@dnd-kit/react/sortable.js +177 -0
- package/dist/cjs/node_modules/@dnd-kit/react/utilities.js +18 -0
- package/dist/cjs/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -77
- package/dist/cjs/node_modules/@dnd-kit/state/dist/index.js +279 -0
- package/dist/cjs/node_modules/@preact/signals-core/dist/signals-core.js +12 -0
- package/dist/cjs/node_modules/@radix-ui/react-menu/dist/index.js +49 -49
- package/dist/cjs/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +1 -1
- package/dist/cjs/node_modules/@tiptap/core/dist/index.js +363 -91
- package/dist/cjs/node_modules/@tiptap/extension-code-block/dist/index.js +325 -0
- package/dist/cjs/node_modules/@tiptap/extension-code-block-lowlight/dist/index.js +152 -0
- package/dist/cjs/node_modules/@tiptap/react/dist/index.js +5 -1
- package/dist/cjs/node_modules/@tiptap/static-renderer/dist/pm/html-string/index.js +312 -0
- package/dist/cjs/node_modules/@tiptap/static-renderer/dist/pm/react/index.js +362 -0
- package/dist/cjs/node_modules/color-parse/index.js +1 -1
- package/dist/cjs/node_modules/comlink/dist/esm/comlink.js +360 -0
- package/dist/cjs/node_modules/lodash/uniqueId.js +42 -0
- package/dist/cjs/node_modules/prettier/plugins/babel.js +22 -0
- package/dist/cjs/node_modules/prettier/plugins/estree.js +45 -0
- package/dist/cjs/node_modules/prettier/plugins/html.js +32 -0
- package/dist/cjs/node_modules/prettier/plugins/markdown.js +73 -0
- package/dist/cjs/node_modules/prettier/plugins/postcss.js +64 -0
- package/dist/cjs/node_modules/prettier/plugins/typescript.js +27 -0
- package/dist/cjs/node_modules/prettier/plugins/yaml.js +171 -0
- package/dist/cjs/node_modules/prettier/standalone.js +50 -0
- package/dist/cjs/node_modules/prop-types/index.js +1 -1
- package/dist/cjs/node_modules/react-dropzone/dist/es/index.js +1 -1
- package/dist/cjs/node_modules/react-dropzone/dist/es/utils/index.js +1 -1
- package/dist/cjs/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/cjs/utils/file.js +45 -0
- package/dist/cjs/worker.js +25 -0
- package/dist/esm/_virtual/index.js +3 -5
- package/dist/esm/_virtual/index2.js +5 -3
- package/dist/esm/_virtual/index3.js +2 -6
- package/dist/esm/_virtual/index4.js +6 -2
- package/dist/esm/_virtual/index5.js +6 -2
- package/dist/esm/_virtual/index6.js +4 -4
- package/dist/esm/_virtual/index7.js +2 -6
- package/dist/esm/_virtual/uniqueId.js +7 -0
- package/dist/esm/components/forms/input-number/input-number.js +4 -4
- package/dist/esm/components/forms/input-number/step-buttons.js +1 -1
- package/dist/esm/components/forms/select/select.js +15 -11
- package/dist/esm/components/quiz/builder/components/question-card/question-card.js +42 -0
- package/dist/esm/components/quiz/builder/components/question-prompt-editor/question-prompt-editor.js +31 -0
- package/dist/esm/components/quiz/builder/components/questions-sidebar/questions-sidebar.js +47 -0
- package/dist/esm/components/quiz/builder/components/quiz-settings/quiz-settings.js +32 -0
- package/dist/esm/components/quiz/builder/components/use-scroll-spy.js +88 -0
- package/dist/esm/components/quiz/builder/editors/choice-task-editor.js +98 -0
- package/dist/esm/components/quiz/builder/editors/code-task-editor.js +29 -0
- package/dist/esm/components/quiz/builder/editors/fill-in-blank-task-editor.js +60 -0
- package/dist/esm/components/quiz/builder/editors/match-pairs-task-editor.js +31 -0
- package/dist/esm/components/quiz/builder/editors/open-answer-task-editor.js +35 -0
- package/dist/esm/components/quiz/builder/editors/sequence-task-editor.js +64 -0
- package/dist/esm/components/quiz/builder/question-type-options.js +19 -0
- package/dist/esm/components/quiz/builder/quiz-builder.js +170 -0
- package/dist/esm/components/quiz/runner/question/question.js +34 -1
- package/dist/esm/components/quiz/runner/quiz-runner.js +111 -28
- package/dist/esm/components/quiz/runner/viewers/match-pairs-viewer/match-pairs-viewer.js +6 -3
- package/dist/esm/components/quiz/runner/viewers/multi-choice-viewer/multi-choice-viewer.js +7 -3
- package/dist/esm/components/quiz/runner/viewers/sequence-viewer/sequence-viewer.js +7 -4
- package/dist/esm/components/quiz/runner/viewers/single-choice-viewer/single-choice-viewer.js +7 -3
- package/dist/esm/components/quiz/utils/choice-option.js +6 -0
- package/dist/esm/components/quiz/utils/prompt.js +33 -0
- package/dist/esm/components/quiz/utils/shuffle.js +10 -0
- package/dist/esm/components/ui/carousel/carousel.js +7 -43
- package/dist/esm/components/ui/course-composer/components/action-buttons.js +26 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-actions.js +16 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-content-tab.js +34 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-empty-state.js +8 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-general-tab.js +20 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-lesson-content-editor.js +34 -0
- package/dist/esm/components/ui/course-composer/components/course-composer-settings-tab.js +28 -0
- package/dist/esm/components/ui/course-composer/components/course-structure-sidebar.js +32 -0
- package/dist/esm/components/ui/course-composer/components/empty-chapter-droppable.js +20 -0
- package/dist/esm/components/ui/course-composer/components/sortable-tree-row.js +72 -0
- package/dist/esm/components/ui/course-composer/components/sortable-tree.js +70 -0
- package/dist/esm/components/ui/course-composer/components/sortable-tree.utils.js +134 -0
- package/dist/esm/components/ui/course-composer/constants.js +8 -0
- package/dist/esm/components/ui/course-composer/course-composer.js +18 -0
- package/dist/esm/components/ui/course-composer/course-composer.utils.js +195 -0
- package/dist/esm/components/ui/course-composer/hooks/use-course-composer-state.js +83 -0
- package/dist/esm/components/ui/dropdown-menu/dropdown-menu.js +1 -1
- package/dist/esm/components/ui/pdf-viewer/pdf-viewer.js +2 -2
- package/dist/esm/components/ui/pdf-viewer/pdf-worker-client.js +21 -0
- package/dist/esm/components/ui/pdf-viewer/pdf.worker.js +26768 -0
- package/dist/esm/components/ui/pdf-viewer/use-filled-pdf.js +6 -4
- package/dist/esm/components/ui/poll-builder/poll-builder.js +2 -2
- package/dist/esm/components/ui/rich-editor/bubble-menus/carousel-bubble-menu.js +411 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/code-block-bubble-menu.js +72 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/columns-bubble-menu.js +57 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/floating-bubble-controls.js +13 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/image-bubble-menu.js +32 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/link-bubble-menu.js +68 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/shared.js +71 -0
- package/dist/esm/components/ui/rich-editor/bubble-menus/text-selection-bubble-menu.js +153 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/config.js +181 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/editor.js +46 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/extension.js +118 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/node-view.js +97 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/shared.js +116 -0
- package/dist/esm/components/ui/rich-editor/extensions/carousel/view.js +12 -0
- package/dist/esm/components/ui/rich-editor/extensions/code-block-lowlight-base.js +106 -0
- package/dist/esm/components/ui/rich-editor/extensions/code-block-lowlight.js +14 -0
- package/dist/esm/components/ui/rich-editor/extensions/code-block-utils.js +148 -0
- package/dist/esm/components/ui/rich-editor/extensions/code.js +9 -0
- package/dist/esm/components/ui/rich-editor/extensions/columns-utils.js +73 -0
- package/dist/esm/components/ui/rich-editor/extensions/columns.js +182 -37
- package/dist/esm/components/ui/rich-editor/extensions/table/table-actions-extension.js +55 -13
- package/dist/esm/components/ui/rich-editor/extensions/table/table-cell-style.js +77 -0
- package/dist/esm/components/ui/rich-editor/extensions/table/table-floating-controls.js +223 -198
- package/dist/esm/components/ui/rich-editor/extensions/table/table-hover-extension.js +129 -26
- package/dist/esm/components/ui/rich-editor/extensions/table/table-selection-overlay.js +39 -53
- package/dist/esm/components/ui/rich-editor/extensions/table-cell.js +11 -5
- package/dist/esm/components/ui/rich-editor/extensions/table-header.js +11 -5
- package/dist/esm/components/ui/rich-editor/extensions/table-kit.js +56 -0
- package/dist/esm/components/ui/rich-editor/extensions/table-row.js +4 -7
- package/dist/esm/components/ui/rich-editor/extensions/table.js +12 -14
- package/dist/esm/components/ui/rich-editor/extensions.js +191 -0
- package/dist/esm/components/ui/rich-editor/rich-content-renderer.js +43 -448
- package/dist/esm/components/ui/rich-editor/rich-editor.js +62 -161
- package/dist/esm/components/ui/rich-editor/toolbar.js +2 -1
- package/dist/esm/components/ui/rich-editor/views/code-block-node-view.js +42 -0
- package/dist/esm/components/ui/rich-editor/views/resize-handle.js +10 -0
- package/dist/esm/components/ui/rich-editor/views/use-node-resize.js +50 -0
- package/dist/esm/index.js +6 -2
- package/dist/esm/main.js +125 -0
- package/dist/esm/node_modules/@ckeditor/ckeditor5-mention/dist/index.js +1 -1
- package/dist/esm/node_modules/@ckeditor/ckeditor5-paragraph/dist/index.js +1 -1
- package/dist/esm/node_modules/@ckeditor/ckeditor5-ui/dist/index.js +1 -1
- package/dist/esm/node_modules/@dnd-kit/abstract/index.js +1531 -0
- package/dist/esm/node_modules/@dnd-kit/abstract/modifiers.js +81 -0
- package/dist/esm/node_modules/@dnd-kit/collision/dist/index.js +85 -0
- package/dist/esm/node_modules/@dnd-kit/core/dist/core.esm.js +2 -2
- package/dist/esm/node_modules/@dnd-kit/dom/index.js +2266 -0
- package/dist/esm/node_modules/@dnd-kit/dom/sortable.js +913 -0
- package/dist/esm/node_modules/@dnd-kit/dom/utilities.js +1450 -0
- package/dist/esm/node_modules/@dnd-kit/geometry/dist/index.js +302 -0
- package/dist/esm/node_modules/@dnd-kit/helpers/dist/index.js +185 -0
- package/dist/esm/node_modules/@dnd-kit/modifiers/dist/modifiers.esm.js +37 -3
- package/dist/esm/node_modules/@dnd-kit/react/hooks.js +125 -0
- package/dist/esm/node_modules/@dnd-kit/react/index.js +421 -0
- package/dist/esm/node_modules/@dnd-kit/react/sortable.js +174 -0
- package/dist/esm/node_modules/@dnd-kit/react/utilities.js +16 -0
- package/dist/esm/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +4 -80
- package/dist/esm/node_modules/@dnd-kit/state/dist/index.js +265 -0
- package/dist/esm/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +1 -1
- package/dist/esm/node_modules/@preact/signals-core/dist/signals-core.js +3 -0
- package/dist/esm/node_modules/@radix-ui/react-dropdown-menu/dist/index.js +1 -1
- package/dist/esm/node_modules/@radix-ui/react-use-is-hydrated/dist/index.js +1 -1
- package/dist/esm/node_modules/@tiptap/core/dist/index.js +361 -93
- package/dist/esm/node_modules/@tiptap/extension-code-block/dist/index.js +318 -0
- package/dist/esm/node_modules/@tiptap/extension-code-block-lowlight/dist/index.js +147 -0
- package/dist/esm/node_modules/@tiptap/react/dist/index.js +2 -2
- package/dist/esm/node_modules/@tiptap/static-renderer/dist/pm/html-string/index.js +304 -0
- package/dist/esm/node_modules/@tiptap/static-renderer/dist/pm/react/index.js +355 -0
- package/dist/esm/node_modules/color-parse/index.js +1 -1
- package/dist/esm/node_modules/comlink/dist/esm/comlink.js +350 -0
- package/dist/esm/node_modules/lodash/uniqueId.js +40 -0
- package/dist/esm/node_modules/prettier/plugins/babel.js +17 -0
- package/dist/esm/node_modules/prettier/plugins/estree.js +38 -0
- package/dist/esm/node_modules/prettier/plugins/html.js +24 -0
- package/dist/esm/node_modules/prettier/plugins/markdown.js +65 -0
- package/dist/esm/node_modules/prettier/plugins/postcss.js +56 -0
- package/dist/esm/node_modules/prettier/plugins/typescript.js +22 -0
- package/dist/esm/node_modules/prettier/plugins/yaml.js +163 -0
- package/dist/esm/node_modules/prettier/standalone.js +41 -0
- package/dist/esm/node_modules/prop-types/index.js +1 -1
- package/dist/esm/node_modules/prosemirror-tables/dist/index.js +1 -1
- package/dist/esm/node_modules/react-dropzone/dist/es/index.js +1 -1
- package/dist/esm/node_modules/react-dropzone/dist/es/utils/index.js +1 -1
- package/dist/esm/node_modules/use-sync-external-store/shim/index.js +1 -1
- package/dist/esm/utils/file.js +45 -1
- package/dist/esm/worker.js +23 -0
- package/dist/styles.css +491 -311
- package/dist/types/index.d.ts +299 -207
- package/package.json +4 -1
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var index = require('../node_modules/use-sync-external-store/shim/index.js');
|
|
4
4
|
|
|
5
|
-
var
|
|
6
|
-
var index = require('../node_modules/prop-types/index.js');
|
|
5
|
+
var shimExports = index.__require();
|
|
7
6
|
|
|
8
|
-
|
|
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
|
-
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _commonjsHelpers = require('./_commonjsHelpers.js');
|
|
6
|
+
var index = require('../node_modules/prop-types/index.js');
|
|
6
7
|
|
|
7
|
-
|
|
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
|
-
|
|
3
|
+
var shim = {exports: {}};
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
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');
|
|
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-
|
|
6
|
+
var index$1 = require('../node_modules/color-convert/index.js');
|
|
7
7
|
|
|
8
|
-
var
|
|
9
|
-
var
|
|
8
|
+
var colorConvertExports = index$1.__require();
|
|
9
|
+
var index = /*@__PURE__*/_commonjsHelpers.getDefaultExportFromCjs(colorConvertExports);
|
|
10
10
|
|
|
11
|
-
exports.default =
|
|
11
|
+
exports.default = index;
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var propTypes = {exports: {}};
|
|
4
4
|
|
|
5
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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;
|
package/dist/cjs/components/quiz/builder/components/question-prompt-editor/question-prompt-editor.js
ADDED
|
@@ -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;
|