@hydralms/components 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/StudentProfile-BVfZMbnV.cjs +1 -0
- package/dist/StudentProfile-DeMxdrL3.js +3275 -0
- package/dist/assessment-toolbar/assessment-toolbar.d.ts +1 -1
- package/dist/assessment-toolbar/index.d.ts +5 -1
- package/dist/assessment-toolbar/question-header-bar.d.ts +2 -0
- package/dist/assessment-toolbar/question-materials-drawer.d.ts +2 -0
- package/dist/assessment-toolbar/question-navigator.d.ts +1 -1
- package/dist/assessment-toolbar/timer-display.d.ts +1 -1
- package/dist/assessment-toolbar/types.d.ts +52 -4
- package/dist/assessment-toolbar/use-countdown.d.ts +43 -0
- package/dist/common/index.d.ts +3 -1
- package/dist/common/pagination.d.ts +26 -0
- package/dist/common/stepper.d.ts +6 -0
- package/dist/common/types.d.ts +38 -0
- package/dist/components.css +1 -1
- package/dist/content/attachment-list.d.ts +6 -0
- package/dist/content/audio-player.d.ts +22 -0
- package/dist/content/code-block.d.ts +30 -0
- package/dist/content/content-block.d.ts +1 -1
- package/dist/content/embed-block.d.ts +28 -0
- package/dist/content/index.d.ts +8 -1
- package/dist/content/types.d.ts +63 -0
- package/dist/curriculum/course-card.d.ts +51 -0
- package/dist/curriculum/curriculum-item.d.ts +1 -1
- package/dist/curriculum/index.d.ts +2 -0
- package/dist/curriculum/types.d.ts +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +597 -308
- package/dist/license/HydraContext.d.ts +16 -0
- package/dist/license/ProBadge.d.ts +6 -0
- package/dist/license/index.d.ts +7 -0
- package/dist/license/tiers.d.ts +3 -0
- package/dist/license/useHydraLicense.d.ts +6 -0
- package/dist/license/validate.d.ts +13 -0
- package/dist/license/withProGate.d.ts +6 -0
- package/dist/modules/AssignmentModule/AssignmentModule.d.ts +5 -0
- package/dist/modules/AssignmentModule/types.d.ts +69 -0
- package/dist/modules/CertificateModule/CertificateModule.d.ts +5 -0
- package/dist/modules/CertificateModule/types.d.ts +51 -0
- package/dist/modules/CourseCatalogModule/CourseCatalogModule.d.ts +5 -0
- package/dist/modules/CourseCatalogModule/types.d.ts +43 -0
- package/dist/modules/CoursePlayer/CoursePlayer.d.ts +4 -1
- package/dist/modules/DiscussionModule/DiscussionModule.d.ts +5 -0
- package/dist/modules/DiscussionModule/types.d.ts +47 -0
- package/dist/modules/ExamModule/ExamModule.d.ts +5 -0
- package/dist/modules/ExamModule/types.d.ts +55 -0
- package/dist/modules/FlashcardLab/FlashcardLab.d.ts +4 -1
- package/dist/modules/FlashcardLab/types.d.ts +2 -0
- package/dist/modules/GradeCenterModule/GradeCenterModule.d.ts +5 -0
- package/dist/modules/GradeCenterModule/types.d.ts +56 -0
- package/dist/modules/QuizModule/QuizModule.d.ts +4 -1
- package/dist/modules/QuizModule/types.d.ts +10 -14
- package/dist/modules/StudentDashboardModule/StudentDashboardModule.d.ts +5 -0
- package/dist/modules/StudentDashboardModule/types.d.ts +54 -0
- package/dist/modules/StudentProfileModule/StudentProfileModule.d.ts +5 -0
- package/dist/modules/StudentProfileModule/types.d.ts +43 -0
- package/dist/modules/SurveyModule/SurveyModule.d.ts +5 -0
- package/dist/modules/SurveyModule/types.d.ts +51 -0
- package/dist/modules/_shared/assessment-intro.d.ts +16 -0
- package/dist/modules/_shared/assessment-results.d.ts +23 -0
- package/dist/modules/_shared/types.d.ts +10 -0
- package/dist/modules/_shared/use-timer.d.ts +9 -0
- package/dist/modules/index.d.ts +18 -0
- package/dist/modules.cjs +1 -0
- package/dist/modules.js +1834 -0
- package/dist/progress/achievement-badge.d.ts +6 -0
- package/dist/progress/activity-timeline.d.ts +6 -0
- package/dist/progress/index.d.ts +4 -1
- package/dist/progress/stat-card.d.ts +1 -1
- package/dist/progress/streak-badge.d.ts +6 -0
- package/dist/progress/types.d.ts +99 -0
- package/dist/provider/HydraProvider.d.ts +5 -1
- package/dist/questions/choice.d.ts +1 -1
- package/dist/questions/confidence-indicator.d.ts +37 -0
- package/dist/questions/essay.d.ts +2 -2
- package/dist/questions/fill-in-the-blank.d.ts +1 -1
- package/dist/questions/hotspot.d.ts +21 -0
- package/dist/questions/index.d.ts +11 -1
- package/dist/questions/inline-choice.d.ts +21 -0
- package/dist/questions/matching.d.ts +22 -0
- package/dist/questions/multiple-choice.d.ts +1 -1
- package/dist/questions/numeric.d.ts +11 -0
- package/dist/questions/ordering.d.ts +12 -0
- package/dist/questions/question-renderer.d.ts +1 -1
- package/dist/questions/scenario.d.ts +23 -0
- package/dist/questions/scoring.d.ts +22 -0
- package/dist/questions/spreadsheet.d.ts +29 -0
- package/dist/questions/true-false.d.ts +1 -1
- package/dist/questions/types.d.ts +106 -1
- package/dist/questions/use-drag-reorder.d.ts +17 -0
- package/dist/sections/AnnouncementFeed/AnnouncementFeed.d.ts +1 -1
- package/dist/sections/AnnouncementFeed/types.d.ts +15 -1
- package/dist/sections/AssessmentReview/AssessmentReview.d.ts +1 -1
- package/dist/sections/AssessmentReview/types.d.ts +6 -0
- package/dist/sections/AssignmentSubmission/AssignmentSubmission.d.ts +1 -1
- package/dist/sections/AssignmentSubmission/types.d.ts +6 -0
- package/dist/sections/CertificateViewer/CertificateViewer.d.ts +1 -1
- package/dist/sections/CertificateViewer/certificate-variants.d.ts +42 -0
- package/dist/sections/CertificateViewer/types.d.ts +13 -5
- package/dist/sections/CourseCatalog/CourseCatalog.d.ts +2 -0
- package/dist/sections/CourseCatalog/types.d.ts +80 -0
- package/dist/sections/CourseOutline/CourseOutline.d.ts +1 -1
- package/dist/sections/CourseOutline/types.d.ts +6 -0
- package/dist/sections/DiscussionThread/DiscussionThread.d.ts +1 -1
- package/dist/sections/DiscussionThread/types.d.ts +6 -0
- package/dist/sections/EnrollmentWizard/EnrollmentWizard.d.ts +2 -0
- package/dist/sections/EnrollmentWizard/types.d.ts +66 -0
- package/dist/sections/ExamSession/ExamSession.d.ts +1 -1
- package/dist/sections/ExamSession/types.d.ts +12 -1
- package/dist/sections/FlashcardStudySession/FlashcardStudySession.d.ts +1 -1
- package/dist/sections/FlashcardStudySession/types.d.ts +6 -0
- package/dist/sections/ForumBoard/ForumBoard.d.ts +8 -0
- package/dist/sections/ForumBoard/types.d.ts +78 -0
- package/dist/sections/GradebookTable/GradebookTable.d.ts +1 -1
- package/dist/sections/GradebookTable/types.d.ts +14 -0
- package/dist/sections/LecturePlayer/LecturePlayer.d.ts +1 -1
- package/dist/sections/LecturePlayer/types.d.ts +8 -0
- package/dist/sections/LessonPage/LessonPage.d.ts +1 -1
- package/dist/sections/LessonPage/types.d.ts +6 -0
- package/dist/sections/PracticeQuiz/PracticeQuiz.d.ts +1 -1
- package/dist/sections/PracticeQuiz/types.d.ts +6 -0
- package/dist/sections/ProgressDashboard/ProgressDashboard.d.ts +1 -1
- package/dist/sections/ProgressDashboard/types.d.ts +6 -0
- package/dist/sections/QuizSession/QuizSession.d.ts +1 -1
- package/dist/sections/QuizSession/types.d.ts +12 -1
- package/dist/sections/RequirementsChecklist/RequirementsChecklist.d.ts +8 -0
- package/dist/sections/RequirementsChecklist/types.d.ts +43 -0
- package/dist/sections/ResourceLibrary/ResourceLibrary.d.ts +1 -1
- package/dist/sections/ResourceLibrary/types.d.ts +15 -1
- package/dist/sections/RubricView/RubricView.d.ts +9 -0
- package/dist/sections/RubricView/types.d.ts +56 -0
- package/dist/sections/ScrollableQuiz/ScrollableQuiz.d.ts +1 -1
- package/dist/sections/ScrollableQuiz/types.d.ts +6 -0
- package/dist/sections/StudentProfile/StudentProfile.d.ts +2 -0
- package/dist/sections/StudentProfile/types.d.ts +98 -0
- package/dist/sections/SurveyForm/SurveyForm.d.ts +1 -1
- package/dist/sections/SurveyForm/types.d.ts +6 -0
- package/dist/sections/_shared/merge-answers.d.ts +9 -0
- package/dist/sections/_shared/section-shell.d.ts +20 -0
- package/dist/sections/_shared/use-assessment-session.d.ts +30 -0
- package/dist/sections/index.d.ts +13 -1
- package/dist/sections.cjs +1 -1
- package/dist/sections.js +282 -1786
- package/dist/social/post-card.d.ts +1 -1
- package/dist/tabs-BsfVo2Bl.cjs +173 -0
- package/dist/tabs-BuY1iNJE.js +22305 -0
- package/dist/ui/alert.d.ts +1 -1
- package/dist/ui/badge.d.ts +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/drawer.d.ts +84 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/progress.d.ts +1 -1
- package/dist/ui/rich-text-editor.d.ts +32 -0
- package/dist/ui/rich-text-toolbar.d.ts +8 -0
- package/dist/ui/toast.d.ts +43 -0
- package/dist/utils/array-utils.d.ts +4 -0
- package/dist/utils/debounce.d.ts +5 -1
- package/dist/utils/flatten-leaves.d.ts +6 -0
- package/dist/utils/format-file-size.d.ts +1 -0
- package/dist/utils/format-timestamp.d.ts +1 -0
- package/dist/utils/is-empty-html.d.ts +5 -0
- package/dist/utils/pick-palette-color.d.ts +19 -0
- package/dist/utils/shuffle.d.ts +1 -0
- package/dist/utils/string-utils.d.ts +12 -0
- package/dist/video/types.d.ts +15 -0
- package/dist/video/video-bookmark.d.ts +1 -1
- package/dist/video/video-player.d.ts +1 -1
- package/dist/video/video-playlist-item.d.ts +1 -1
- package/dist/withProGate-BWqcKdPM.js +137 -0
- package/dist/withProGate-DX6XqKLp.cjs +1 -0
- package/package.json +40 -137
- package/src/assessment-toolbar/assessment-toolbar.tsx +54 -49
- package/src/assessment-toolbar/index.ts +6 -0
- package/src/assessment-toolbar/question-header-bar.tsx +61 -0
- package/src/assessment-toolbar/question-materials-drawer.tsx +55 -0
- package/src/assessment-toolbar/question-navigator.tsx +13 -36
- package/src/assessment-toolbar/timer-display.tsx +6 -5
- package/src/assessment-toolbar/types.ts +54 -4
- package/src/assessment-toolbar/use-countdown.ts +153 -0
- package/src/common/empty-state.tsx +1 -0
- package/src/common/index.ts +5 -0
- package/src/common/pagination.tsx +135 -0
- package/src/common/search-input.tsx +8 -6
- package/src/common/stepper.tsx +100 -0
- package/src/common/types.ts +41 -0
- package/src/content/attachment-list.tsx +92 -0
- package/src/content/audio-player.tsx +196 -0
- package/src/content/code-block.tsx +113 -0
- package/src/content/content-block.tsx +68 -2
- package/src/content/embed-block.tsx +78 -0
- package/src/content/file-upload-zone.tsx +11 -6
- package/src/content/index.ts +9 -0
- package/src/content/types.ts +46 -0
- package/src/curriculum/course-card.tsx +199 -0
- package/src/curriculum/curriculum-item.tsx +9 -5
- package/src/curriculum/curriculum-tree.tsx +20 -13
- package/src/curriculum/index.ts +2 -0
- package/src/curriculum/types.ts +2 -2
- package/src/feedback/feedback-banner.tsx +12 -14
- package/src/flashcards/flashcard-deck.tsx +1 -9
- package/src/flashcards/flashcard.tsx +29 -9
- package/src/index.ts +3 -0
- package/src/license/HydraContext.tsx +62 -0
- package/src/license/ProBadge.tsx +43 -0
- package/src/license/index.ts +7 -0
- package/src/license/tiers.ts +24 -0
- package/src/license/useHydraLicense.ts +10 -0
- package/src/license/validate.ts +90 -0
- package/src/license/withProGate.tsx +21 -0
- package/src/modules/AssignmentModule/AssignmentModule.tsx +314 -0
- package/src/modules/AssignmentModule/types.ts +77 -0
- package/src/modules/CertificateModule/CertificateModule.tsx +173 -0
- package/src/modules/CertificateModule/types.ts +49 -0
- package/src/modules/CourseCatalogModule/CourseCatalogModule.tsx +126 -0
- package/src/modules/CourseCatalogModule/types.ts +47 -0
- package/src/modules/CoursePlayer/CoursePlayer.tsx +80 -69
- package/src/modules/DiscussionModule/DiscussionModule.tsx +145 -0
- package/src/modules/DiscussionModule/types.ts +54 -0
- package/src/modules/ExamModule/ExamModule.tsx +151 -0
- package/src/modules/ExamModule/types.ts +57 -0
- package/src/modules/FlashcardLab/FlashcardLab.tsx +39 -21
- package/src/modules/FlashcardLab/types.ts +2 -0
- package/src/modules/GradeCenterModule/GradeCenterModule.tsx +174 -0
- package/src/modules/GradeCenterModule/types.ts +65 -0
- package/src/modules/QuizModule/QuizModule.tsx +58 -178
- package/src/modules/QuizModule/types.ts +10 -15
- package/src/modules/StudentDashboardModule/StudentDashboardModule.tsx +117 -0
- package/src/modules/StudentDashboardModule/types.ts +56 -0
- package/src/modules/StudentProfileModule/StudentProfileModule.tsx +289 -0
- package/src/modules/StudentProfileModule/types.ts +45 -0
- package/src/modules/SurveyModule/SurveyModule.tsx +185 -0
- package/src/modules/SurveyModule/types.ts +53 -0
- package/src/modules/_shared/assessment-intro.tsx +75 -0
- package/src/modules/_shared/assessment-results.tsx +133 -0
- package/src/modules/_shared/types.ts +11 -0
- package/src/modules/_shared/use-timer.ts +49 -0
- package/src/modules/index.ts +33 -0
- package/src/progress/achievement-badge.tsx +52 -0
- package/src/progress/activity-timeline.tsx +84 -0
- package/src/progress/grade-indicator.tsx +9 -1
- package/src/progress/index.ts +7 -0
- package/src/progress/progress-ring.tsx +2 -1
- package/src/progress/stat-card.tsx +37 -18
- package/src/progress/streak-badge.tsx +35 -0
- package/src/progress/types.ts +103 -0
- package/src/provider/HydraProvider.tsx +15 -6
- package/src/questions/choice.tsx +19 -14
- package/src/questions/confidence-indicator.tsx +107 -0
- package/src/questions/essay.tsx +28 -28
- package/src/questions/fill-in-the-blank.tsx +20 -19
- package/src/questions/hotspot.tsx +154 -0
- package/src/questions/index.ts +18 -0
- package/src/questions/inline-choice.tsx +152 -0
- package/src/questions/matching.tsx +229 -0
- package/src/questions/multiple-choice.tsx +19 -14
- package/src/questions/numeric.tsx +106 -0
- package/src/questions/ordering.tsx +167 -0
- package/src/questions/question-renderer.tsx +24 -2
- package/src/questions/scenario.tsx +140 -0
- package/src/questions/scoring.ts +201 -0
- package/src/questions/spreadsheet.tsx +260 -0
- package/src/questions/true-false.tsx +19 -14
- package/src/questions/types.ts +123 -1
- package/src/questions/use-drag-reorder.ts +80 -0
- package/src/sections/AnnouncementFeed/AnnouncementFeed.tsx +66 -23
- package/src/sections/AnnouncementFeed/types.ts +15 -1
- package/src/sections/AssessmentReview/AssessmentReview.tsx +50 -2
- package/src/sections/AssessmentReview/types.ts +6 -0
- package/src/sections/AssignmentSubmission/AssignmentSubmission.tsx +44 -6
- package/src/sections/AssignmentSubmission/types.ts +6 -0
- package/src/sections/CertificateViewer/CertificateViewer.tsx +215 -60
- package/src/sections/CertificateViewer/certificate-variants.tsx +170 -0
- package/src/sections/CertificateViewer/types.ts +19 -5
- package/src/sections/CourseCatalog/CourseCatalog.tsx +220 -0
- package/src/sections/CourseCatalog/types.ts +76 -0
- package/src/sections/CourseOutline/CourseOutline.tsx +45 -14
- package/src/sections/CourseOutline/types.ts +6 -0
- package/src/sections/DiscussionThread/DiscussionThread.tsx +55 -11
- package/src/sections/DiscussionThread/types.ts +6 -0
- package/src/sections/EnrollmentWizard/EnrollmentWizard.tsx +343 -0
- package/src/sections/EnrollmentWizard/types.ts +65 -0
- package/src/sections/ExamSession/ExamSession.tsx +125 -82
- package/src/sections/ExamSession/types.ts +12 -1
- package/src/sections/FlashcardStudySession/FlashcardStudySession.tsx +53 -36
- package/src/sections/FlashcardStudySession/types.ts +6 -0
- package/src/sections/ForumBoard/ForumBoard.tsx +342 -0
- package/src/sections/ForumBoard/types.ts +81 -0
- package/src/sections/GradebookTable/GradebookTable.tsx +55 -2
- package/src/sections/GradebookTable/types.ts +14 -0
- package/src/sections/LecturePlayer/LecturePlayer.tsx +63 -37
- package/src/sections/LecturePlayer/types.ts +8 -0
- package/src/sections/LessonPage/LessonPage.tsx +40 -13
- package/src/sections/LessonPage/types.ts +6 -0
- package/src/sections/PracticeQuiz/PracticeQuiz.tsx +119 -98
- package/src/sections/PracticeQuiz/types.ts +6 -0
- package/src/sections/ProgressDashboard/ProgressDashboard.tsx +121 -67
- package/src/sections/ProgressDashboard/types.ts +6 -0
- package/src/sections/QuizSession/QuizSession.tsx +115 -67
- package/src/sections/QuizSession/types.ts +12 -1
- package/src/sections/RequirementsChecklist/RequirementsChecklist.tsx +147 -0
- package/src/sections/RequirementsChecklist/types.ts +44 -0
- package/src/sections/ResourceLibrary/ResourceLibrary.tsx +68 -17
- package/src/sections/ResourceLibrary/types.ts +15 -1
- package/src/sections/RubricView/RubricView.tsx +174 -0
- package/src/sections/RubricView/types.ts +58 -0
- package/src/sections/ScrollableQuiz/ScrollableQuiz.tsx +58 -23
- package/src/sections/ScrollableQuiz/types.ts +6 -0
- package/src/sections/StudentProfile/StudentProfile.tsx +279 -0
- package/src/sections/StudentProfile/types.ts +99 -0
- package/src/sections/SurveyForm/SurveyForm.tsx +40 -10
- package/src/sections/SurveyForm/types.ts +6 -0
- package/src/sections/_shared/merge-answers.ts +22 -0
- package/src/sections/_shared/section-shell.tsx +64 -0
- package/src/sections/_shared/use-assessment-session.ts +125 -0
- package/src/sections/index.ts +42 -1
- package/src/social/post-card.tsx +8 -19
- package/src/social/user-avatar.tsx +10 -5
- package/src/styles/globals.css +52 -41
- package/src/ui/badge.tsx +8 -0
- package/src/ui/drawer.tsx +600 -0
- package/src/ui/index.ts +21 -0
- package/src/ui/progress.tsx +4 -0
- package/src/ui/rich-text-editor.tsx +119 -0
- package/src/ui/rich-text-toolbar.tsx +157 -0
- package/src/ui/toast.tsx +170 -0
- package/src/utils/array-utils.ts +17 -0
- package/src/utils/debounce.ts +8 -2
- package/src/utils/flatten-leaves.ts +17 -0
- package/src/utils/format-file-size.ts +5 -0
- package/src/utils/format-timestamp.ts +13 -0
- package/src/utils/is-empty-html.ts +7 -0
- package/src/utils/pick-palette-color.ts +33 -0
- package/src/utils/shuffle.ts +8 -0
- package/src/utils/string-utils.ts +30 -0
- package/src/video/types.ts +16 -0
- package/src/video/video-bookmark.tsx +4 -3
- package/src/video/video-chapter-list.tsx +9 -4
- package/src/video/video-player.tsx +24 -5
- package/src/video/video-playlist-item.tsx +8 -3
- package/src/video/video-thumbnail-card.tsx +4 -0
- package/src/video/video-transcript.tsx +8 -5
- package/dist/table-BrS5cDQu.js +0 -2510
- package/dist/table-D6AkBBEo.cjs +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { AssessmentToolbarProps } from './types';
|
|
2
|
-
export declare const AssessmentToolbar: ({ currentQuestionIndex, totalQuestions, hasNext, hasPrevious, onNext, onPrevious, onSubmit, timeElapsedSeconds, timeLimitSeconds, questions, onNavigateToQuestion,
|
|
2
|
+
export declare const AssessmentToolbar: ({ currentQuestionIndex, totalQuestions, hasNext, hasPrevious, onNext, onPrevious, onSubmit, timeElapsedSeconds, timeLimitSeconds, questions, onNavigateToQuestion, currentQuestionUid, isCompleted, isSubmitting, readOnly, }: AssessmentToolbarProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export { AssessmentToolbar } from './assessment-toolbar';
|
|
2
2
|
export { TimerDisplay } from './timer-display';
|
|
3
3
|
export { QuestionNavigator } from './question-navigator';
|
|
4
|
-
export
|
|
4
|
+
export { QuestionHeaderBar } from './question-header-bar';
|
|
5
|
+
export { QuestionMaterialsDrawer } from './question-materials-drawer';
|
|
6
|
+
export { useCountdown } from './use-countdown';
|
|
7
|
+
export type { AssessmentToolbarProps, TimerDisplayProps, QuestionNavigatorProps, QuestionNavigatorItem, QuestionHeaderBarProps, QuestionMaterialsDrawerProps, } from './types';
|
|
8
|
+
export type { UseCountdownOptions, UseCountdownReturn } from './use-countdown';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { QuestionNavigatorProps } from './types';
|
|
2
|
-
export declare const QuestionNavigator:
|
|
2
|
+
export declare const QuestionNavigator: import('react').NamedExoticComponent<QuestionNavigatorProps>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { TimerDisplayProps } from './types';
|
|
2
|
-
export declare const TimerDisplay:
|
|
2
|
+
export declare const TimerDisplay: import('react').NamedExoticComponent<TimerDisplayProps>;
|
|
@@ -37,8 +37,6 @@ export interface AssessmentToolbarProps {
|
|
|
37
37
|
questions?: QuestionNavigatorItem[];
|
|
38
38
|
/** Called when the user navigates to a specific question via the navigator */
|
|
39
39
|
onNavigateToQuestion?: (questionUid: string) => void;
|
|
40
|
-
/** Called when the user flags or unflags a question */
|
|
41
|
-
onToggleFlag?: (questionUid: string) => void;
|
|
42
40
|
/** UID of the currently active question */
|
|
43
41
|
currentQuestionUid?: string;
|
|
44
42
|
/** Whether the assessment has been completed/submitted */
|
|
@@ -70,14 +68,12 @@ export interface TimerDisplayProps {
|
|
|
70
68
|
* questions={questions}
|
|
71
69
|
* currentQuestionUid={currentUid}
|
|
72
70
|
* onNavigate={handleNavigate}
|
|
73
|
-
* onToggleFlag={handleFlag}
|
|
74
71
|
* />
|
|
75
72
|
*/
|
|
76
73
|
export interface QuestionNavigatorProps {
|
|
77
74
|
questions: QuestionNavigatorItem[];
|
|
78
75
|
currentQuestionUid?: string;
|
|
79
76
|
onNavigate?: (questionUid: string) => void;
|
|
80
|
-
onToggleFlag?: (questionUid: string) => void;
|
|
81
77
|
readOnly?: boolean;
|
|
82
78
|
}
|
|
83
79
|
export interface QuestionNavigatorItem {
|
|
@@ -87,3 +83,55 @@ export interface QuestionNavigatorItem {
|
|
|
87
83
|
isAnswered: boolean;
|
|
88
84
|
isSkipped: boolean;
|
|
89
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* QuestionHeaderBar displays question number, flag toggle, and optional
|
|
88
|
+
* materials button inside the question Card above the QuestionRenderer.
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* <QuestionHeaderBar
|
|
92
|
+
* questionNumber={3}
|
|
93
|
+
* totalQuestions={10}
|
|
94
|
+
* isFlagged={false}
|
|
95
|
+
* onToggleFlag={() => toggleFlag(questionUid)}
|
|
96
|
+
* hasMaterials
|
|
97
|
+
* onOpenMaterials={() => setDrawerOpen(true)}
|
|
98
|
+
* />
|
|
99
|
+
*/
|
|
100
|
+
export interface QuestionHeaderBarProps {
|
|
101
|
+
/** 1-based question number */
|
|
102
|
+
questionNumber: number;
|
|
103
|
+
/** Total number of questions */
|
|
104
|
+
totalQuestions: number;
|
|
105
|
+
/** Whether this question is currently flagged */
|
|
106
|
+
isFlagged: boolean;
|
|
107
|
+
/** Called when the user toggles the flag */
|
|
108
|
+
onToggleFlag?: () => void;
|
|
109
|
+
/** Whether the current question has related materials available */
|
|
110
|
+
hasMaterials?: boolean;
|
|
111
|
+
/** Called when the user clicks the materials button */
|
|
112
|
+
onOpenMaterials?: () => void;
|
|
113
|
+
/** When true, hides interactive elements */
|
|
114
|
+
readOnly?: boolean;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* QuestionMaterialsDrawer renders a slide-in panel with content blocks
|
|
118
|
+
* linked to the current question for open-book reference.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* <QuestionMaterialsDrawer
|
|
122
|
+
* open={open}
|
|
123
|
+
* onOpenChange={setOpen}
|
|
124
|
+
* materials={currentMaterials}
|
|
125
|
+
* questionNumber={3}
|
|
126
|
+
* />
|
|
127
|
+
*/
|
|
128
|
+
export interface QuestionMaterialsDrawerProps {
|
|
129
|
+
/** Whether the drawer is open */
|
|
130
|
+
open: boolean;
|
|
131
|
+
/** Called when the drawer should open or close */
|
|
132
|
+
onOpenChange: (open: boolean) => void;
|
|
133
|
+
/** One or more material groups to display in the drawer */
|
|
134
|
+
materials: import('../questions/types').QuestionMaterial[];
|
|
135
|
+
/** Question number for the title display */
|
|
136
|
+
questionNumber?: number;
|
|
137
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface UseCountdownOptions {
|
|
2
|
+
/** Total countdown duration in seconds */
|
|
3
|
+
durationSeconds: number;
|
|
4
|
+
/** Seconds remaining at which to trigger warning state. @default 60 */
|
|
5
|
+
warningThresholdSeconds?: number;
|
|
6
|
+
/** Called once when the countdown reaches zero */
|
|
7
|
+
onExpire?: () => void;
|
|
8
|
+
/** Called once when the countdown enters warning territory */
|
|
9
|
+
onWarning?: () => void;
|
|
10
|
+
/** Whether to start the countdown immediately. @default false */
|
|
11
|
+
autoStart?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface UseCountdownReturn {
|
|
14
|
+
/** Seconds remaining in the countdown */
|
|
15
|
+
timeRemaining: number;
|
|
16
|
+
/** Whether the countdown is actively running */
|
|
17
|
+
isRunning: boolean;
|
|
18
|
+
/** Whether the countdown has been paused */
|
|
19
|
+
isPaused: boolean;
|
|
20
|
+
/** Whether the countdown has reached zero */
|
|
21
|
+
isExpired: boolean;
|
|
22
|
+
/** Whether the countdown is within the warning threshold */
|
|
23
|
+
isWarning: boolean;
|
|
24
|
+
/** Start or restart the countdown */
|
|
25
|
+
start: () => void;
|
|
26
|
+
/** Pause the countdown */
|
|
27
|
+
pause: () => void;
|
|
28
|
+
/** Resume after pausing */
|
|
29
|
+
resume: () => void;
|
|
30
|
+
/** Reset to the original duration, stopped */
|
|
31
|
+
reset: () => void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* useCountdown manages a countdown timer lifecycle with warning and expiry callbacks.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* const { timeRemaining, isWarning, start } = useCountdown({
|
|
38
|
+
* durationSeconds: 300,
|
|
39
|
+
* warningThresholdSeconds: 60,
|
|
40
|
+
* onExpire: () => handleAutoSubmit(),
|
|
41
|
+
* });
|
|
42
|
+
*/
|
|
43
|
+
export declare function useCountdown({ durationSeconds, warningThresholdSeconds, onExpire, onWarning, autoStart, }: UseCountdownOptions): UseCountdownReturn;
|
package/dist/common/index.d.ts
CHANGED
|
@@ -3,4 +3,6 @@ export { ConfirmDialog } from './confirm-dialog';
|
|
|
3
3
|
export { SearchInput } from './search-input';
|
|
4
4
|
export { StatusBadge } from './status-badge';
|
|
5
5
|
export { DueDateDisplay } from './due-date-display';
|
|
6
|
-
export
|
|
6
|
+
export { Stepper } from './stepper';
|
|
7
|
+
export { Pagination } from './pagination';
|
|
8
|
+
export type { EmptyStateProps, ConfirmDialogProps, SearchInputProps, StatusBadgeProps, DueDateDisplayProps, StepperProps, StepDefinition, PaginationProps, } from './types';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pagination provides page navigation controls with page numbers,
|
|
3
|
+
* previous/next buttons, and ellipsis for large page ranges.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* <Pagination
|
|
7
|
+
* currentPage={3}
|
|
8
|
+
* totalPages={10}
|
|
9
|
+
* onPageChange={(page) => setPage(page)}
|
|
10
|
+
* />
|
|
11
|
+
*/
|
|
12
|
+
export interface PaginationProps {
|
|
13
|
+
/** Current active page (1-indexed) */
|
|
14
|
+
currentPage: number;
|
|
15
|
+
/** Total number of pages */
|
|
16
|
+
totalPages: number;
|
|
17
|
+
/** Called when the user navigates to a page */
|
|
18
|
+
onPageChange: (page: number) => void;
|
|
19
|
+
/** Number of page buttons shown on each side of the current page (default 1) */
|
|
20
|
+
siblingCount?: number;
|
|
21
|
+
/** CSS class name for the root element */
|
|
22
|
+
className?: string;
|
|
23
|
+
/** Inline styles for the root element */
|
|
24
|
+
style?: React.CSSProperties;
|
|
25
|
+
}
|
|
26
|
+
export declare const Pagination: import('react').NamedExoticComponent<PaginationProps>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StepperProps } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Stepper renders a visual step indicator for multi-step flows,
|
|
4
|
+
* showing completed, current, and upcoming steps with labels.
|
|
5
|
+
*/
|
|
6
|
+
export declare function Stepper({ steps, currentStep, orientation, variant, className, style, }: StepperProps): import("react/jsx-runtime").JSX.Element;
|
package/dist/common/types.d.ts
CHANGED
|
@@ -122,3 +122,41 @@ export interface DueDateDisplayProps {
|
|
|
122
122
|
/** Inline styles for the root element */
|
|
123
123
|
style?: React.CSSProperties;
|
|
124
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* A single step definition used by the Stepper component.
|
|
127
|
+
*/
|
|
128
|
+
export interface StepDefinition {
|
|
129
|
+
/** Step label text */
|
|
130
|
+
label: string;
|
|
131
|
+
/** Optional secondary description */
|
|
132
|
+
description?: string;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Stepper renders a visual step indicator for multi-step flows,
|
|
136
|
+
* showing completed, current, and upcoming steps with labels.
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* <Stepper
|
|
140
|
+
* steps={[
|
|
141
|
+
* { label: "Setup" },
|
|
142
|
+
* { label: "Questions" },
|
|
143
|
+
* { label: "Results" },
|
|
144
|
+
* ]}
|
|
145
|
+
* currentStep={1}
|
|
146
|
+
* />
|
|
147
|
+
*/
|
|
148
|
+
export interface StepperProps {
|
|
149
|
+
/** Ordered list of steps to display */
|
|
150
|
+
steps: StepDefinition[];
|
|
151
|
+
/** Zero-based index of the currently active step */
|
|
152
|
+
currentStep: number;
|
|
153
|
+
/** Layout orientation. @default 'horizontal' */
|
|
154
|
+
orientation?: "horizontal" | "vertical";
|
|
155
|
+
/** Visual density variant. @default 'default' */
|
|
156
|
+
variant?: "default" | "compact";
|
|
157
|
+
/** CSS class name for the root element */
|
|
158
|
+
className?: string;
|
|
159
|
+
/** Inline styles for the root element */
|
|
160
|
+
style?: React.CSSProperties;
|
|
161
|
+
}
|
|
162
|
+
export type { PaginationProps } from './pagination';
|
package/dist/components.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-800:oklch(44.8% .119 151.328);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-950:oklch(26.2% .051 172.552);--color-blue-50:oklch(97% .014 254.604);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-950:oklch(28.2% .091 267.935);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-950:oklch(28.3% .141 291.089);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-950:oklch(27.1% .105 12.094);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.-right-0\.5{right:calc(var(--spacing) * -.5)}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-10{z-index:10}.z-50{z-index:50}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.m-auto{margin:auto}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.-ml-px{margin-left:-1px}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-px{margin-left:1px}.line-clamp-\(--preview-lines\){-webkit-line-clamp:var(--preview-lines);-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.aspect-square{aspect-ratio:1}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-12{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.h-6{height:calc(var(--spacing) * 6)}.h-6\.5{height:calc(var(--spacing) * 6.5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-15{height:calc(var(--spacing) * 15)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-15{min-height:calc(var(--spacing) * 15)}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-30{min-height:calc(var(--spacing) * 30)}.min-h-45{min-height:calc(var(--spacing) * 45)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-50{width:calc(var(--spacing) * 50)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-50{max-width:calc(var(--spacing) * 50)}.max-w-60{max-width:calc(var(--spacing) * 60)}.max-w-80{max-width:calc(var(--spacing) * 80)}.max-w-200{max-width:calc(var(--spacing) * 200)}.max-w-\[360px\]{max-width:360px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-4{min-width:calc(var(--spacing) * 4)}.min-w-9{min-width:calc(var(--spacing) * 9)}.min-w-10{min-width:calc(var(--spacing) * 10)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform-\[rotateY\(180deg\)\]{transform:rotateY(180deg)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(140px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}.grid-cols-\[repeat\(auto-fill\,minmax\(240px\,1fr\)\)\]{grid-template-columns:repeat(auto-fill,minmax(240px,1fr))}.grid-cols-\[repeat\(auto-fit\,minmax\(160px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-px{gap:1px}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-lg{border-top-left-radius:var(--radius);border-top-right-radius:var(--radius)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[3px\]{border-style:var(--tw-border-style);border-width:3px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-double{--tw-border-style:double;border-style:double}.border-none{--tw-border-style:none;border-style:none}.border-amber-200{border-color:var(--color-amber-200)}.border-background{border-color:var(--background)}.border-blue-200{border-color:var(--color-blue-200)}.border-border{border-color:var(--border)}.border-current{border-color:currentColor}.border-destructive,.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/30{border-color:color-mix(in oklab,var(--destructive) 30%,transparent)}}.border-destructive\/50{border-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--destructive) 50%,transparent)}}.border-emerald-200{border-color:var(--color-emerald-200)}.border-green-200{border-color:var(--color-green-200)}.border-info,.border-info\/50{border-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.border-info\/50{border-color:color-mix(in oklab,var(--info) 50%,transparent)}}.border-input{border-color:var(--input)}.border-primary{border-color:var(--primary)}.border-rose-200{border-color:var(--color-rose-200)}.border-success,.border-success\/30{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/30{border-color:color-mix(in oklab,var(--success) 30%,transparent)}}.border-success\/50{border-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.border-success\/50{border-color:color-mix(in oklab,var(--success) 50%,transparent)}}.border-transparent{border-color:#0000}.border-violet-200{border-color:var(--color-violet-200)}.border-warning,.border-warning\/30{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/30{border-color:color-mix(in oklab,var(--warning) 30%,transparent)}}.border-warning\/50{border-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.border-warning\/50{border-color:color-mix(in oklab,var(--warning) 50%,transparent)}}.border-t-transparent{border-top-color:#0000}.border-l-warning{border-left-color:var(--warning)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-200{background-color:var(--color-amber-200)}.bg-background{background-color:var(--background)}.bg-black\/0{background-color:#0000}@supports (color:color-mix(in lab,red,red)){.bg-black\/0{background-color:color-mix(in oklab,var(--color-black) 0%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black) 30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive,.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/5{background-color:color-mix(in oklab,var(--destructive) 5%,transparent)}}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.bg-destructive\/10{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-200{background-color:var(--color-emerald-200)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-200{background-color:var(--color-green-200)}.bg-info,.bg-info\/5{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/5{background-color:color-mix(in oklab,var(--info) 5%,transparent)}}.bg-info\/15{background-color:var(--info)}@supports (color:color-mix(in lab,red,red)){.bg-info\/15{background-color:color-mix(in oklab,var(--info) 15%,transparent)}}.bg-muted{background-color:var(--muted)}.bg-muted-foreground\/10{background-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.bg-muted-foreground\/10{background-color:color-mix(in oklab,var(--muted-foreground) 10%,transparent)}}.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.bg-muted\/50{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.bg-primary\/10{background-color:color-mix(in oklab,var(--primary) 10%,transparent)}}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-secondary{background-color:var(--secondary)}.bg-success,.bg-success\/5{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/5{background-color:color-mix(in oklab,var(--success) 5%,transparent)}}.bg-success\/10{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/10{background-color:color-mix(in oklab,var(--success) 10%,transparent)}}.bg-success\/15{background-color:var(--success)}@supports (color:color-mix(in lab,red,red)){.bg-success\/15{background-color:color-mix(in oklab,var(--success) 15%,transparent)}}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-200{background-color:var(--color-violet-200)}.bg-warning,.bg-warning\/5{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/5{background-color:color-mix(in oklab,var(--warning) 5%,transparent)}}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/10{background-color:color-mix(in oklab,var(--warning) 10%,transparent)}}.bg-warning\/15{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.bg-warning\/15{background-color:color-mix(in oklab,var(--warning) 15%,transparent)}}.bg-linear-to-br{--tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab,red,red)){.bg-linear-to-br{--tw-gradient-position:to bottom right in oklab}}.bg-linear-to-br{background-image:linear-gradient(var(--tw-gradient-stops))}.bg-linear-to-t{--tw-gradient-position:to top}@supports (background-image:linear-gradient(in lab,red,red)){.bg-linear-to-t{--tw-gradient-position:to top in oklab}}.bg-linear-to-t{background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[\#fff5f5\]{--tw-gradient-from:#fff5f5;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-\[\#fffbe6\]{--tw-gradient-from:#fffbe6;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-black\/60{--tw-gradient-from:#0009}@supports (color:color-mix(in lab,red,red)){.from-black\/60{--tw-gradient-from:color-mix(in oklab, var(--color-black) 60%, transparent)}}.from-black\/60{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[\#fee2e2\]{--tw-gradient-to:#fee2e2;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-\[\#fff8e1\]{--tw-gradient-to:#fff8e1;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing) * 0)}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[3px\]{--tw-tracking:3px;letter-spacing:3px}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground,.text-foreground\/70{color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.text-foreground\/70{color:color-mix(in oklab,var(--foreground) 70%,transparent)}}.text-info{color:var(--info)}.text-info-foreground{color:var(--info-foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground,.text-primary-foreground\/60{color:var(--primary-foreground)}@supports (color:color-mix(in lab,red,red)){.text-primary-foreground\/60{color:color-mix(in oklab,var(--primary-foreground) 60%,transparent)}}.text-secondary-foreground{color:var(--secondary-foreground)}.text-success{color:var(--success)}.text-success-foreground{color:var(--success-foreground)}.text-warning{color:var(--warning)}.text-warning-foreground{color:var(--warning-foreground)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.accent-primary{accent-color:var(--primary)}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-85{opacity:.85}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.backface-hidden{backface-visibility:hidden}.perspective-\[1000px\]{perspective:1000px}.transform-3d{transform-style:preserve-3d}@media(hover:hover){.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:bg-black\/20:is(:where(.group):hover *){background-color:#0003}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-black\/20:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.selection\:bg-primary ::selection{background-color:var(--primary)}.selection\:bg-primary::selection{background-color:var(--primary)}.selection\:text-primary-foreground ::selection{color:var(--primary-foreground)}.selection\:text-primary-foreground::selection{color:var(--primary-foreground)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-7::file-selector-button{height:calc(var(--spacing) * 7)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.first\:ml-0:first-child{margin-left:calc(var(--spacing) * 0)}.first\:rounded-l-md:first-child{border-top-left-radius:calc(var(--radius) - 2px);border-bottom-left-radius:calc(var(--radius) - 2px)}.last\:rounded-r-md:last-child{border-top-right-radius:calc(var(--radius) - 2px);border-bottom-right-radius:calc(var(--radius) - 2px)}.focus-within\:border-ring:focus-within{border-color:var(--ring)}.focus-within\:ring-\[3px\]:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-ring\/50:focus-within{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-within\:ring-ring\/50:focus-within{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}@media(hover:hover){.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-muted-foreground\/30:hover{border-color:var(--muted-foreground)}@supports (color:color-mix(in lab,red,red)){.hover\:border-muted-foreground\/30:hover{border-color:color-mix(in oklab,var(--muted-foreground) 30%,transparent)}}.hover\:border-primary:hover,.hover\:border-primary\/50:hover{border-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:border-primary\/50:hover{border-color:color-mix(in oklab,var(--primary) 50%,transparent)}}.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab,var(--destructive) 10%,transparent)}}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab,var(--destructive) 90%,transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab,var(--muted) 50%,transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,var(--primary) 90%,transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab,var(--secondary) 80%,transparent)}}.hover\:bg-warning\/90:hover{background-color:var(--warning)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-warning\/90:hover{background-color:color-mix(in oklab,var(--warning) 90%,transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-primary-foreground:hover{color:var(--primary-foreground)}.hover\:text-warning:hover{color:var(--warning)}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.has-data-\[slot\=card-action\]\:flex-row:has([data-slot=card-action]){flex-direction:row}.has-data-\[slot\=card-action\]\:items-center:has([data-slot=card-action]){align-items:center}.has-data-\[slot\=card-action\]\:justify-between:has([data-slot=card-action]){justify-content:space-between}.has-\[input\:disabled\]\:cursor-default:has(:is(input:disabled)){cursor:default}.has-\[input\:disabled\]\:opacity-60:has(:is(input:disabled)){opacity:.6}.has-\[\>svg\]\:px-1\.5:has(>svg){padding-inline:calc(var(--spacing) * 1.5)}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-selected\:bg-background[data-selected]{background-color:var(--background)}.data-selected\:text-foreground[data-selected]{color:var(--foreground)}.data-selected\:shadow-sm[data-selected]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}@media(min-width:40rem){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:text-left{text-align:left}}@media(min-width:48rem){.md\:block{display:block}.md\:p-6{padding:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.dark\:border-amber-800:is(.dark *){border-color:var(--color-amber-800)}.dark\:border-blue-800:is(.dark *){border-color:var(--color-blue-800)}.dark\:border-emerald-800:is(.dark *){border-color:var(--color-emerald-800)}.dark\:border-green-800:is(.dark *){border-color:var(--color-green-800)}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:border-rose-800:is(.dark *){border-color:var(--color-rose-800)}.dark\:border-violet-800:is(.dark *){border-color:var(--color-violet-800)}.dark\:bg-amber-800:is(.dark *){background-color:var(--color-amber-800)}.dark\:bg-amber-950\/40:is(.dark *){background-color:#46190166}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-950) 40%,transparent)}}.dark\:bg-blue-800:is(.dark *){background-color:var(--color-blue-800)}.dark\:bg-blue-950\/40:is(.dark *){background-color:#16245666}@supports (color:color-mix(in lab,red,red)){.dark\:bg-blue-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-950) 40%,transparent)}}.dark\:bg-destructive\/60:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-destructive\/60:is(.dark *){background-color:color-mix(in oklab,var(--destructive) 60%,transparent)}}.dark\:bg-emerald-800:is(.dark *){background-color:var(--color-emerald-800)}.dark\:bg-emerald-950\/40:is(.dark *){background-color:#002c2266}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-emerald-950) 40%,transparent)}}.dark\:bg-green-800:is(.dark *){background-color:var(--color-green-800)}.dark\:bg-green-950\/40:is(.dark *){background-color:#032e1566}@supports (color:color-mix(in lab,red,red)){.dark\:bg-green-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-green-950) 40%,transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab,var(--input) 30%,transparent)}}.dark\:bg-rose-800:is(.dark *){background-color:var(--color-rose-800)}.dark\:bg-rose-950\/40:is(.dark *){background-color:#4d021866}@supports (color:color-mix(in lab,red,red)){.dark\:bg-rose-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-rose-950) 40%,transparent)}}.dark\:bg-violet-800:is(.dark *){background-color:var(--color-violet-800)}.dark\:bg-violet-950\/40:is(.dark *){background-color:#2f0d6866}@supports (color:color-mix(in lab,red,red)){.dark\:bg-violet-950\/40:is(.dark *){background-color:color-mix(in oklab,var(--color-violet-950) 40%,transparent)}}@media(hover:hover){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-accent\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--accent) 50%,transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab,red,red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab,var(--input) 50%,transparent)}}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab,red,red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.\[\&_ol\]\:pl-\[1\.5em\] ol{padding-left:1.5em}.\[\&_p\]\:mb-\[1\.5em\] p{margin-bottom:1.5em}.\[\&_p\]\:leading-relaxed p{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&_ul\]\:pl-\[1\.5em\] ul{padding-left:1.5em}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:calc(var(--spacing) * 0)}.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox]{--tw-translate-y:2px;translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>svg\]\:size-6>svg{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.\[\&\>svg\]\:size-12>svg{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12)}.\[\&\>svg\]\:shrink-0>svg{flex-shrink:0}.\[\&\>svg\]\:translate-y-0\.5>svg{--tw-translate-y:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.\[\&\>svg\]\:text-destructive>svg{color:var(--destructive)}.\[\&\>svg\]\:text-info>svg{color:var(--info)}.\[\&\>svg\]\:text-success>svg{color:var(--success)}.\[\&\>svg\]\:text-warning>svg{color:var(--warning)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}.hydra-root{--radius:.625rem;--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(52% .22 22);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(96.1% .01 22);--secondary-foreground:oklch(40% .12 22);--muted:oklch(96.1% .005 22);--muted-foreground:oklch(50% .02 22);--accent:oklch(95.2% .012 22);--accent-foreground:oklch(40% .12 22);--destructive:oklch(57.7% .245 27.325);--destructive-foreground:oklch(98.5% 0 0);--border:oklch(90.5% .008 22);--input:oklch(90.5% .008 22);--ring:oklch(52% .22 22);--success:oklch(72.3% .191 142.5);--success-foreground:oklch(96.2% .044 156);--warning:oklch(70.2% .183 55);--warning-foreground:oklch(98% .016 73);--info:oklch(62.3% .214 259);--info-foreground:oklch(97% .014 254);--purple:oklch(62.7% .265 303);--teal:oklch(69.7% .146 182);color:var(--foreground);background:var(--background);font-family:system-ui,-apple-system,sans-serif}.hydra-root.dark,.dark .hydra-root{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% .008 22);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% .008 22);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .2 22);--primary-foreground:oklch(14.5% 0 0);--secondary:oklch(26.9% .015 22);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% .015 22);--muted-foreground:oklch(65% .02 22);--accent:oklch(26.9% .015 22);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--destructive-foreground:oklch(14.5% 0 0);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(68% .2 22);--success:oklch(72.3% .191 142.5);--success-foreground:oklch(15% .05 150);--warning:oklch(70.2% .183 55);--warning-foreground:oklch(15% .05 60);--info:oklch(62.3% .214 259);--info-foreground:oklch(15% .05 255);--purple:oklch(62.7% .265 303);--teal:oklch(69.7% .146 182)}.flashcard-back-content ul,.flashcard-back-content ol{margin:.25em 0;padding-left:1.25em}.flashcard-back-content ul{list-style-type:disc}.flashcard-back-content ol{list-style-type:decimal}.flashcard-back-content li{margin:.15em 0}.flashcard-back-content p{margin:.25em 0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
1
|
+
.hydra-root{--radius: .625rem;--background: oklch(1 0 0);--foreground: oklch(.145 0 0);--card: oklch(1 0 0);--card-foreground: oklch(.145 0 0);--popover: oklch(1 0 0);--popover-foreground: oklch(.145 0 0);--primary: oklch(.52 .22 22);--primary-foreground: oklch(.985 0 0);--secondary: oklch(.961 .01 22);--secondary-foreground: oklch(.4 .12 22);--muted: oklch(.961 .005 22);--muted-foreground: oklch(.5 .02 22);--accent: oklch(.952 .012 22);--accent-foreground: oklch(.4 .12 22);--destructive: oklch(.577 .245 27.325);--destructive-foreground: oklch(.985 0 0);--border: oklch(.905 .008 22);--input: oklch(.905 .008 22);--ring: oklch(.52 .22 22);--success: oklch(.723 .191 142.5);--success-foreground: oklch(.962 .044 156);--warning: oklch(.702 .183 55);--warning-foreground: oklch(.98 .016 73);--info: oklch(.623 .214 259);--info-foreground: oklch(.97 .014 254);--palette-0: oklch(.627 .265 303);--palette-0-foreground: oklch(.985 0 0);--palette-1: oklch(.68 .162 195);--palette-1-foreground: oklch(.985 0 0);--palette-2: oklch(.72 .185 130);--palette-2-foreground: oklch(.985 0 0);--palette-3: oklch(.7 .18 70);--palette-3-foreground: oklch(.15 0 0);color:var(--foreground);background:var(--background);font-family:system-ui,-apple-system,sans-serif}.hydra-root.dark,.dark .hydra-root{--background: oklch(.145 0 0);--foreground: oklch(.985 0 0);--card: oklch(.205 .008 22);--card-foreground: oklch(.985 0 0);--popover: oklch(.205 .008 22);--popover-foreground: oklch(.985 0 0);--primary: oklch(.68 .2 22);--primary-foreground: oklch(.145 0 0);--secondary: oklch(.269 .015 22);--secondary-foreground: oklch(.985 0 0);--muted: oklch(.269 .015 22);--muted-foreground: oklch(.65 .02 22);--accent: oklch(.269 .015 22);--accent-foreground: oklch(.985 0 0);--destructive: oklch(.704 .191 22.216);--destructive-foreground: oklch(.145 0 0);--border: oklch(1 0 0 / 10%);--input: oklch(1 0 0 / 15%);--ring: oklch(.68 .2 22);--success: oklch(.723 .191 142.5);--success-foreground: oklch(.15 .05 150);--warning: oklch(.702 .183 55);--warning-foreground: oklch(.15 .05 60);--info: oklch(.623 .214 259);--info-foreground: oklch(.15 .05 255);--palette-0: oklch(.7 .2 303);--palette-0-foreground: oklch(.15 0 0);--palette-1: oklch(.73 .15 195);--palette-1-foreground: oklch(.15 0 0);--palette-2: oklch(.76 .17 130);--palette-2-foreground: oklch(.15 0 0);--palette-3: oklch(.74 .165 70);--palette-3-foreground: oklch(.15 0 0)}.flashcard-back-content ul,.flashcard-back-content ol{padding-left:1.25em;margin:.25em 0}.flashcard-back-content ul{list-style-type:disc}.flashcard-back-content ol{list-style-type:decimal}.flashcard-back-content li{margin:.15em 0}.flashcard-back-content p{margin:.25em 0}.tiptap:focus{outline:none}.tiptap p.is-editor-empty:first-child:before{color:var(--muted-foreground);content:attr(data-placeholder);float:left;height:0;pointer-events:none}@media(prefers-reduced-motion:reduce){.hydra-root *,.hydra-root *:before,.hydra-root *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AttachmentListProps } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* AttachmentList displays a read-only list of file attachments
|
|
4
|
+
* with type icons, formatted sizes, and optional download/remove actions.
|
|
5
|
+
*/
|
|
6
|
+
export declare function AttachmentList({ files, onDownload, onRemove, readOnly, className, style, }: AttachmentListProps): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AudioPlayer provides an HTML5 audio player with custom controls
|
|
3
|
+
* including play/pause, seek, speed adjustment, and mute toggle.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* <AudioPlayer src="/audio/lecture-1.mp3" title="Lecture 1: Introduction" />
|
|
7
|
+
*/
|
|
8
|
+
export interface AudioPlayerProps {
|
|
9
|
+
/** Audio source URL */
|
|
10
|
+
src: string;
|
|
11
|
+
/** Optional title displayed above the player */
|
|
12
|
+
title?: string;
|
|
13
|
+
/** Called when playback ends */
|
|
14
|
+
onEnded?: () => void;
|
|
15
|
+
/** Called on time update with current time and duration */
|
|
16
|
+
onTimeUpdate?: (currentTime: number, duration: number) => void;
|
|
17
|
+
/** CSS class name for the root element */
|
|
18
|
+
className?: string;
|
|
19
|
+
/** Inline styles for the root element */
|
|
20
|
+
style?: React.CSSProperties;
|
|
21
|
+
}
|
|
22
|
+
export declare const AudioPlayer: import('react').NamedExoticComponent<AudioPlayerProps>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodeBlock renders source code with optional line numbers, a filename header,
|
|
3
|
+
* and a copy-to-clipboard button. Does not bundle a syntax highlighter —
|
|
4
|
+
* consumers can apply their own (Prism, Shiki, etc.) via the `language-*` class on the `<code>` element.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* <CodeBlock
|
|
8
|
+
* code="console.log('hello');"
|
|
9
|
+
* language="javascript"
|
|
10
|
+
* filename="example.js"
|
|
11
|
+
* showLineNumbers
|
|
12
|
+
* />
|
|
13
|
+
*/
|
|
14
|
+
export interface CodeBlockProps {
|
|
15
|
+
/** The code content to display */
|
|
16
|
+
code: string;
|
|
17
|
+
/** Programming language identifier (applied as `language-*` class on `<code>`) */
|
|
18
|
+
language?: string;
|
|
19
|
+
/** Optional filename shown in the header bar */
|
|
20
|
+
filename?: string;
|
|
21
|
+
/** Whether to display line numbers */
|
|
22
|
+
showLineNumbers?: boolean;
|
|
23
|
+
/** Called after code is copied to clipboard */
|
|
24
|
+
onCopy?: () => void;
|
|
25
|
+
/** CSS class name for the root element */
|
|
26
|
+
className?: string;
|
|
27
|
+
/** Inline styles for the root element */
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
export declare const CodeBlock: import('react').NamedExoticComponent<CodeBlockProps>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { ContentBlockProps } from './types';
|
|
2
|
-
export declare
|
|
2
|
+
export declare const ContentBlock: import('react').NamedExoticComponent<ContentBlockProps>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type EmbedAspectRatio = "16/9" | "4/3" | "1/1";
|
|
2
|
+
/**
|
|
3
|
+
* EmbedBlock renders a responsive iframe wrapper with an optional title bar
|
|
4
|
+
* and loading skeleton. Ideal for embedding YouTube videos, SCORM objects,
|
|
5
|
+
* Google Slides, and other external content.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* <EmbedBlock
|
|
9
|
+
* src="https://www.youtube.com/embed/dQw4w9WgXcQ"
|
|
10
|
+
* title="Introduction Video"
|
|
11
|
+
* aspectRatio="16/9"
|
|
12
|
+
* />
|
|
13
|
+
*/
|
|
14
|
+
export interface EmbedBlockProps {
|
|
15
|
+
/** iframe source URL */
|
|
16
|
+
src: string;
|
|
17
|
+
/** Optional title for the embed */
|
|
18
|
+
title?: string;
|
|
19
|
+
/** Aspect ratio of the embed container */
|
|
20
|
+
aspectRatio?: EmbedAspectRatio;
|
|
21
|
+
/** Whether to allow fullscreen */
|
|
22
|
+
allowFullscreen?: boolean;
|
|
23
|
+
/** CSS class name for the root element */
|
|
24
|
+
className?: string;
|
|
25
|
+
/** Inline styles for the root element */
|
|
26
|
+
style?: React.CSSProperties;
|
|
27
|
+
}
|
|
28
|
+
export declare const EmbedBlock: import('react').NamedExoticComponent<EmbedBlockProps>;
|
package/dist/content/index.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
1
|
export { ContentBlock } from './content-block';
|
|
2
2
|
export { FileUploadZone } from './file-upload-zone';
|
|
3
|
-
export
|
|
3
|
+
export { AttachmentList } from './attachment-list';
|
|
4
|
+
export type { LessonBlock, ContentBlockProps, FileUploadZoneProps, AttachmentListProps, AttachmentFile, } from './types';
|
|
5
|
+
export { AudioPlayer } from './audio-player';
|
|
6
|
+
export type { AudioPlayerProps } from './audio-player';
|
|
7
|
+
export { CodeBlock } from './code-block';
|
|
8
|
+
export type { CodeBlockProps } from './code-block';
|
|
9
|
+
export { EmbedBlock } from './embed-block';
|
|
10
|
+
export type { EmbedBlockProps, EmbedAspectRatio } from './embed-block';
|
package/dist/content/types.d.ts
CHANGED
|
@@ -31,6 +31,30 @@ export type LessonBlock = {
|
|
|
31
31
|
type: "flashcards";
|
|
32
32
|
cards: FlashcardData[];
|
|
33
33
|
deckName?: string;
|
|
34
|
+
} | {
|
|
35
|
+
type: "audio";
|
|
36
|
+
src: string;
|
|
37
|
+
title?: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: "code";
|
|
40
|
+
code: string;
|
|
41
|
+
language?: string;
|
|
42
|
+
filename?: string;
|
|
43
|
+
showLineNumbers?: boolean;
|
|
44
|
+
} | {
|
|
45
|
+
type: "embed";
|
|
46
|
+
src: string;
|
|
47
|
+
title?: string;
|
|
48
|
+
aspectRatio?: "16/9" | "4/3" | "1/1";
|
|
49
|
+
allowFullscreen?: boolean;
|
|
50
|
+
} | {
|
|
51
|
+
type: "table";
|
|
52
|
+
headers: string[];
|
|
53
|
+
rows: string[][];
|
|
54
|
+
caption?: string;
|
|
55
|
+
} | {
|
|
56
|
+
type: "file";
|
|
57
|
+
files: AttachmentFile[];
|
|
34
58
|
} | {
|
|
35
59
|
type: "divider";
|
|
36
60
|
} | {
|
|
@@ -93,3 +117,42 @@ export interface FileUploadZoneProps {
|
|
|
93
117
|
/** Inline styles for the root element */
|
|
94
118
|
style?: React.CSSProperties;
|
|
95
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* A single file attachment for display in AttachmentList.
|
|
122
|
+
*/
|
|
123
|
+
export interface AttachmentFile {
|
|
124
|
+
/** File name with extension */
|
|
125
|
+
name: string;
|
|
126
|
+
/** File size in bytes */
|
|
127
|
+
size: number;
|
|
128
|
+
/** MIME type (e.g. "application/pdf", "image/png") */
|
|
129
|
+
type: string;
|
|
130
|
+
/** Optional download URL */
|
|
131
|
+
url?: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* AttachmentList displays a read-only list of file attachments
|
|
135
|
+
* with type icons, formatted sizes, and optional download/remove actions.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* <AttachmentList
|
|
139
|
+
* files={[
|
|
140
|
+
* { name: "syllabus.pdf", size: 245000, type: "application/pdf", url: "/files/syllabus.pdf" },
|
|
141
|
+
* ]}
|
|
142
|
+
* onDownload={(file) => window.open(file.url)}
|
|
143
|
+
* />
|
|
144
|
+
*/
|
|
145
|
+
export interface AttachmentListProps {
|
|
146
|
+
/** List of file attachments to display */
|
|
147
|
+
files: AttachmentFile[];
|
|
148
|
+
/** Called when the user clicks a file's download action */
|
|
149
|
+
onDownload?: (file: AttachmentFile) => void;
|
|
150
|
+
/** Called when the user clicks a file's remove button (only shown when not readOnly) */
|
|
151
|
+
onRemove?: (file: AttachmentFile) => void;
|
|
152
|
+
/** When true, hides the remove button. @default true */
|
|
153
|
+
readOnly?: boolean;
|
|
154
|
+
/** CSS class name for the root element */
|
|
155
|
+
className?: string;
|
|
156
|
+
/** Inline styles for the root element */
|
|
157
|
+
style?: React.CSSProperties;
|
|
158
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CourseCard displays course info in a card — thumbnail, title, instructor,
|
|
3
|
+
* progress, category, enrollment status, and CTA.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* <CourseCard
|
|
7
|
+
* uid="course-1"
|
|
8
|
+
* title="React Fundamentals"
|
|
9
|
+
* description="Learn the basics of React."
|
|
10
|
+
* instructor={{ displayName: "Jane Doe" }}
|
|
11
|
+
* progress={65}
|
|
12
|
+
* enrollmentStatus="enrolled"
|
|
13
|
+
* onClick={() => navigate("/courses/course-1")}
|
|
14
|
+
* />
|
|
15
|
+
*/
|
|
16
|
+
export interface CourseCardProps {
|
|
17
|
+
/** Unique identifier */
|
|
18
|
+
uid: string;
|
|
19
|
+
/** Course title */
|
|
20
|
+
title: string;
|
|
21
|
+
/** Course description */
|
|
22
|
+
description?: string;
|
|
23
|
+
/** Thumbnail image URL */
|
|
24
|
+
thumbnailUrl?: string;
|
|
25
|
+
/** Instructor info */
|
|
26
|
+
instructor?: {
|
|
27
|
+
displayName: string;
|
|
28
|
+
avatarUrl?: string;
|
|
29
|
+
};
|
|
30
|
+
/** Category label */
|
|
31
|
+
category?: string;
|
|
32
|
+
/** Progress percentage (0-100), shown when enrolled/completed */
|
|
33
|
+
progress?: number;
|
|
34
|
+
/** Enrollment status */
|
|
35
|
+
enrollmentStatus?: "enrolled" | "completed" | "available" | "locked";
|
|
36
|
+
/** Number of enrolled students */
|
|
37
|
+
studentCount?: number;
|
|
38
|
+
/** Estimated duration (e.g. "12 hours") */
|
|
39
|
+
duration?: string;
|
|
40
|
+
/** Called when the card is clicked */
|
|
41
|
+
onClick?: () => void;
|
|
42
|
+
/** Called when the enroll button is clicked */
|
|
43
|
+
onEnroll?: () => void;
|
|
44
|
+
/** Layout orientation */
|
|
45
|
+
layout?: "vertical" | "horizontal";
|
|
46
|
+
/** CSS class name for the root element */
|
|
47
|
+
className?: string;
|
|
48
|
+
/** Inline styles for the root element */
|
|
49
|
+
style?: React.CSSProperties;
|
|
50
|
+
}
|
|
51
|
+
export declare const CourseCard: import('react').NamedExoticComponent<CourseCardProps>;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { CurriculumItemRowProps } from './types';
|
|
2
|
-
export declare const CurriculumItemRow:
|
|
2
|
+
export declare const CurriculumItemRow: import('react').NamedExoticComponent<CurriculumItemRowProps>;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { CurriculumTree } from './curriculum-tree';
|
|
2
2
|
export { CurriculumItemRow } from './curriculum-item';
|
|
3
3
|
export { LearningObjectIcon } from './learning-object-icon';
|
|
4
|
+
export { CourseCard } from './course-card';
|
|
4
5
|
export type { CurriculumItem, CurriculumItemProgress, CurriculumTreeProps, CurriculumItemRowProps, LearningObjectIconProps, } from './types';
|
|
6
|
+
export type { CourseCardProps } from './course-card';
|
|
@@ -46,8 +46,8 @@ export interface CurriculumItemRowProps {
|
|
|
46
46
|
isCompleted?: boolean;
|
|
47
47
|
isExpanded?: boolean;
|
|
48
48
|
hasChildren: boolean;
|
|
49
|
-
onToggleExpand?: () => void;
|
|
50
|
-
onClick?: () => void;
|
|
49
|
+
onToggleExpand?: (uid: string) => void;
|
|
50
|
+
onClick?: (item: CurriculumItem) => void;
|
|
51
51
|
showDuration?: boolean;
|
|
52
52
|
showIcon?: boolean;
|
|
53
53
|
showProgress?: boolean;
|