@c2-markdown-ui/react 0.4.3 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +6 -24
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +3733 -4365
  5. package/dist/lib/MarkdownUI.d.ts +10 -0
  6. package/dist/lib/MarkdownUI.d.ts.map +1 -0
  7. package/dist/lib/index.d.ts +4 -0
  8. package/dist/lib/index.d.ts.map +1 -0
  9. package/dist/widgets/Button.d.ts +15 -0
  10. package/dist/widgets/Button.d.ts.map +1 -0
  11. package/dist/widgets/ButtonGroup.d.ts +11 -0
  12. package/dist/widgets/ButtonGroup.d.ts.map +1 -0
  13. package/dist/widgets/Cascader.d.ts +34 -0
  14. package/dist/widgets/Cascader.d.ts.map +1 -0
  15. package/dist/widgets/Chart.d.ts +20 -0
  16. package/dist/widgets/Chart.d.ts.map +1 -0
  17. package/dist/widgets/DatePicker.d.ts +28 -0
  18. package/dist/widgets/DatePicker.d.ts.map +1 -0
  19. package/dist/widgets/Form.d.ts +47 -0
  20. package/dist/widgets/Form.d.ts.map +1 -0
  21. package/dist/widgets/Incomplete.d.ts +3 -0
  22. package/dist/widgets/Incomplete.d.ts.map +1 -0
  23. package/dist/widgets/MultipleChoiceQuestion.d.ts +15 -0
  24. package/dist/widgets/MultipleChoiceQuestion.d.ts.map +1 -0
  25. package/dist/widgets/NumberInput.d.ts +26 -0
  26. package/dist/widgets/NumberInput.d.ts.map +1 -0
  27. package/dist/widgets/Quiz.d.ts +37 -0
  28. package/dist/widgets/Quiz.d.ts.map +1 -0
  29. package/dist/widgets/Radio.d.ts +24 -0
  30. package/dist/widgets/Radio.d.ts.map +1 -0
  31. package/dist/widgets/Select.d.ts +15 -0
  32. package/dist/widgets/Select.d.ts.map +1 -0
  33. package/dist/widgets/SelectMulti.d.ts +20 -0
  34. package/dist/widgets/SelectMulti.d.ts.map +1 -0
  35. package/dist/widgets/ShortAnswerQuestion.d.ts +16 -0
  36. package/dist/widgets/ShortAnswerQuestion.d.ts.map +1 -0
  37. package/dist/widgets/Slider.d.ts +13 -0
  38. package/dist/widgets/Slider.d.ts.map +1 -0
  39. package/dist/widgets/Switch.d.ts +17 -0
  40. package/dist/widgets/Switch.d.ts.map +1 -0
  41. package/dist/widgets/TextInput.d.ts +11 -0
  42. package/dist/widgets/TextInput.d.ts.map +1 -0
  43. package/dist/widgets/Widget.d.ts +7 -0
  44. package/dist/widgets/Widget.d.ts.map +1 -0
  45. package/dist/widgets/chartRemoteData.d.ts +18 -0
  46. package/dist/widgets/chartRemoteData.d.ts.map +1 -0
  47. package/dist/widgets/choiceUtils.d.ts +24 -0
  48. package/dist/widgets/choiceUtils.d.ts.map +1 -0
  49. package/dist/widgets/index.d.ts +18 -0
  50. package/dist/widgets/index.d.ts.map +1 -0
  51. package/package.json +2 -2
  52. package/src/lib/MarkdownUI.tsx +9 -47
  53. package/src/lib/widgets.css +1372 -2188
  54. package/src/widgets/Button.tsx +39 -39
  55. package/src/widgets/ButtonGroup.tsx +47 -47
  56. package/src/widgets/Cascader.tsx +2 -3
  57. package/src/widgets/Chart.tsx +237 -237
  58. package/src/widgets/DatePicker.tsx +434 -451
  59. package/src/widgets/Form.tsx +372 -512
  60. package/src/widgets/Incomplete.tsx +3 -3
  61. package/src/widgets/MultipleChoiceQuestion.tsx +82 -82
  62. package/src/widgets/Quiz.tsx +320 -320
  63. package/src/widgets/Radio.tsx +26 -57
  64. package/src/widgets/Select.tsx +142 -178
  65. package/src/widgets/SelectMulti.tsx +72 -105
  66. package/src/widgets/ShortAnswerQuestion.tsx +101 -101
  67. package/src/widgets/Slider.tsx +56 -70
  68. package/src/widgets/Switch.tsx +2 -14
  69. package/src/widgets/TextInput.tsx +38 -76
  70. package/src/widgets/Widget.tsx +82 -130
  71. package/src/widgets/choiceUtils.ts +45 -90
  72. package/src/widgets/index.ts +16 -17
  73. package/src/widgets/TreeSelect.tsx +0 -649
@@ -15,12 +15,12 @@ const styles = `
15
15
  display: flex;
16
16
  align-items: center;
17
17
  padding: 8px 12px;
18
- background-color: rgba(0, 0, 0, 0.04);
19
- border: 1px solid #f0f0f0;
18
+ background-color: #f5f5f5;
19
+ border: 1px solid #ddd;
20
20
  border-radius: 4px;
21
21
  font-family: system-ui, -apple-system, sans-serif;
22
22
  font-size: 14px;
23
- color: rgba(0, 0, 0, 0.65);
23
+ color: #666;
24
24
  }
25
25
 
26
26
  .loading-indicator {
@@ -1,82 +1,82 @@
1
- import React, { useState } from 'react';
2
- import { parseChoices } from './choiceUtils';
3
-
4
- export interface MultipleChoiceQuestionProps {
5
- question: string;
6
- choices: string[];
7
- correctAnswer?: string;
8
- showFeedback?: boolean;
9
- /** 是否禁用:禁用后选项不可点击 */
10
- disabled?: boolean;
11
- onchange: (value: { answer: string; isCorrect?: boolean }) => void;
12
- }
13
-
14
- export const MultipleChoiceQuestion: React.FC<MultipleChoiceQuestionProps> = ({
15
- question,
16
- choices,
17
- correctAnswer,
18
- showFeedback = false,
19
- disabled = false,
20
- onchange
21
- }) => {
22
- // choices 支持 key:label 格式:value(key) 是取值,label 是展示文案
23
- const items = parseChoices(choices);
24
- const [selectedAnswer, setSelectedAnswer] = useState<string>('');
25
- const [hasAnswered, setHasAnswered] = useState(false);
26
-
27
- const handleAnswerSelect = (answer: string) => {
28
- if (disabled) return;
29
- setSelectedAnswer(answer);
30
- setHasAnswered(true);
31
-
32
- const isCorrect = correctAnswer ? answer === correctAnswer : undefined;
33
- onchange({ answer, isCorrect });
34
- };
35
-
36
- const getChoiceClassName = (value: string) => {
37
- let className = 'mcq-choice';
38
-
39
- if (hasAnswered && showFeedback && correctAnswer) {
40
- if (value === correctAnswer) {
41
- className += ' mcq-choice-correct';
42
- } else if (value === selectedAnswer && value !== correctAnswer) {
43
- className += ' mcq-choice-incorrect';
44
- }
45
- } else if (value === selectedAnswer) {
46
- className += ' mcq-choice-selected';
47
- }
48
-
49
- return className;
50
- };
51
-
52
- // 反馈文案:correctAnswer 是 key,展示时映射回 label
53
- const correctLabel = correctAnswer
54
- ? (items.find(i => i.value === correctAnswer)?.label ?? correctAnswer)
55
- : '';
56
-
57
- return (
58
- <div className="widget-mcq">
59
- <div className="mcq-question">{question}</div>
60
- <div className="mcq-choices">
61
- {items.map((item, index) => (
62
- <button
63
- key={index}
64
- className={getChoiceClassName(item.value)}
65
- onClick={() => handleAnswerSelect(item.value)}
66
- disabled={disabled || (hasAnswered && showFeedback)}
67
- >
68
- {item.label}
69
- </button>
70
- ))}
71
- </div>
72
- {hasAnswered && showFeedback && selectedAnswer && (
73
- <div className={`mcq-feedback ${selectedAnswer === correctAnswer ? 'correct' : 'incorrect'}`}>
74
- {correctAnswer ?
75
- (selectedAnswer === correctAnswer ? '✓ Correct!' : `✗ Incorrect. The correct answer is: ${correctLabel}`) :
76
- `You selected: ${selectedAnswer}`
77
- }
78
- </div>
79
- )}
80
- </div>
81
- );
82
- };
1
+ import React, { useState } from 'react';
2
+ import { parseChoices } from './choiceUtils';
3
+
4
+ export interface MultipleChoiceQuestionProps {
5
+ question: string;
6
+ choices: string[];
7
+ correctAnswer?: string;
8
+ showFeedback?: boolean;
9
+ /** 是否禁用:禁用后选项不可点击 */
10
+ disabled?: boolean;
11
+ onchange: (value: { answer: string; isCorrect?: boolean }) => void;
12
+ }
13
+
14
+ export const MultipleChoiceQuestion: React.FC<MultipleChoiceQuestionProps> = ({
15
+ question,
16
+ choices,
17
+ correctAnswer,
18
+ showFeedback = false,
19
+ disabled = false,
20
+ onchange
21
+ }) => {
22
+ // choices 支持 key:label 格式:value(key) 是取值,label 是展示文案
23
+ const items = parseChoices(choices);
24
+ const [selectedAnswer, setSelectedAnswer] = useState<string>('');
25
+ const [hasAnswered, setHasAnswered] = useState(false);
26
+
27
+ const handleAnswerSelect = (answer: string) => {
28
+ if (disabled) return;
29
+ setSelectedAnswer(answer);
30
+ setHasAnswered(true);
31
+
32
+ const isCorrect = correctAnswer ? answer === correctAnswer : undefined;
33
+ onchange({ answer, isCorrect });
34
+ };
35
+
36
+ const getChoiceClassName = (value: string) => {
37
+ let className = 'mcq-choice';
38
+
39
+ if (hasAnswered && showFeedback && correctAnswer) {
40
+ if (value === correctAnswer) {
41
+ className += ' mcq-choice-correct';
42
+ } else if (value === selectedAnswer && value !== correctAnswer) {
43
+ className += ' mcq-choice-incorrect';
44
+ }
45
+ } else if (value === selectedAnswer) {
46
+ className += ' mcq-choice-selected';
47
+ }
48
+
49
+ return className;
50
+ };
51
+
52
+ // 反馈文案:correctAnswer 是 key,展示时映射回 label
53
+ const correctLabel = correctAnswer
54
+ ? (items.find(i => i.value === correctAnswer)?.label ?? correctAnswer)
55
+ : '';
56
+
57
+ return (
58
+ <div className="widget-mcq">
59
+ <div className="mcq-question">{question}</div>
60
+ <div className="mcq-choices">
61
+ {items.map((item, index) => (
62
+ <button
63
+ key={index}
64
+ className={getChoiceClassName(item.value)}
65
+ onClick={() => handleAnswerSelect(item.value)}
66
+ disabled={disabled || (hasAnswered && showFeedback)}
67
+ >
68
+ {item.label}
69
+ </button>
70
+ ))}
71
+ </div>
72
+ {hasAnswered && showFeedback && selectedAnswer && (
73
+ <div className={`mcq-feedback ${selectedAnswer === correctAnswer ? 'correct' : 'incorrect'}`}>
74
+ {correctAnswer ?
75
+ (selectedAnswer === correctAnswer ? '✓ Correct!' : `✗ Incorrect. The correct answer is: ${correctLabel}`) :
76
+ `You selected: ${selectedAnswer}`
77
+ }
78
+ </div>
79
+ )}
80
+ </div>
81
+ );
82
+ };