@c2-markdown-ui/react 0.4.4 → 0.4.5

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 +24 -6
  2. package/dist/index.js +4365 -3733
  3. package/package.json +2 -2
  4. package/src/lib/MarkdownUI.tsx +47 -9
  5. package/src/lib/widgets.css +2188 -1372
  6. package/src/widgets/Button.tsx +39 -39
  7. package/src/widgets/ButtonGroup.tsx +47 -47
  8. package/src/widgets/Cascader.tsx +3 -2
  9. package/src/widgets/Chart.tsx +237 -237
  10. package/src/widgets/DatePicker.tsx +451 -434
  11. package/src/widgets/Form.tsx +512 -372
  12. package/src/widgets/Incomplete.tsx +3 -3
  13. package/src/widgets/MultipleChoiceQuestion.tsx +82 -82
  14. package/src/widgets/Quiz.tsx +320 -320
  15. package/src/widgets/Radio.tsx +57 -26
  16. package/src/widgets/Select.tsx +178 -142
  17. package/src/widgets/SelectMulti.tsx +105 -72
  18. package/src/widgets/ShortAnswerQuestion.tsx +101 -101
  19. package/src/widgets/Slider.tsx +70 -56
  20. package/src/widgets/Switch.tsx +14 -2
  21. package/src/widgets/TextInput.tsx +76 -38
  22. package/src/widgets/TreeSelect.tsx +649 -0
  23. package/src/widgets/Widget.tsx +130 -82
  24. package/src/widgets/choiceUtils.ts +90 -45
  25. package/src/widgets/index.ts +17 -16
  26. package/dist/index.d.ts +0 -2
  27. package/dist/index.d.ts.map +0 -1
  28. package/dist/lib/MarkdownUI.d.ts +0 -10
  29. package/dist/lib/MarkdownUI.d.ts.map +0 -1
  30. package/dist/lib/index.d.ts +0 -4
  31. package/dist/lib/index.d.ts.map +0 -1
  32. package/dist/widgets/Button.d.ts +0 -15
  33. package/dist/widgets/Button.d.ts.map +0 -1
  34. package/dist/widgets/ButtonGroup.d.ts +0 -11
  35. package/dist/widgets/ButtonGroup.d.ts.map +0 -1
  36. package/dist/widgets/Cascader.d.ts +0 -34
  37. package/dist/widgets/Cascader.d.ts.map +0 -1
  38. package/dist/widgets/Chart.d.ts +0 -20
  39. package/dist/widgets/Chart.d.ts.map +0 -1
  40. package/dist/widgets/DatePicker.d.ts +0 -28
  41. package/dist/widgets/DatePicker.d.ts.map +0 -1
  42. package/dist/widgets/Form.d.ts +0 -47
  43. package/dist/widgets/Form.d.ts.map +0 -1
  44. package/dist/widgets/Incomplete.d.ts +0 -3
  45. package/dist/widgets/Incomplete.d.ts.map +0 -1
  46. package/dist/widgets/MultipleChoiceQuestion.d.ts +0 -15
  47. package/dist/widgets/MultipleChoiceQuestion.d.ts.map +0 -1
  48. package/dist/widgets/NumberInput.d.ts +0 -26
  49. package/dist/widgets/NumberInput.d.ts.map +0 -1
  50. package/dist/widgets/Quiz.d.ts +0 -37
  51. package/dist/widgets/Quiz.d.ts.map +0 -1
  52. package/dist/widgets/Radio.d.ts +0 -24
  53. package/dist/widgets/Radio.d.ts.map +0 -1
  54. package/dist/widgets/Select.d.ts +0 -15
  55. package/dist/widgets/Select.d.ts.map +0 -1
  56. package/dist/widgets/SelectMulti.d.ts +0 -20
  57. package/dist/widgets/SelectMulti.d.ts.map +0 -1
  58. package/dist/widgets/ShortAnswerQuestion.d.ts +0 -16
  59. package/dist/widgets/ShortAnswerQuestion.d.ts.map +0 -1
  60. package/dist/widgets/Slider.d.ts +0 -13
  61. package/dist/widgets/Slider.d.ts.map +0 -1
  62. package/dist/widgets/Switch.d.ts +0 -17
  63. package/dist/widgets/Switch.d.ts.map +0 -1
  64. package/dist/widgets/TextInput.d.ts +0 -11
  65. package/dist/widgets/TextInput.d.ts.map +0 -1
  66. package/dist/widgets/Widget.d.ts +0 -7
  67. package/dist/widgets/Widget.d.ts.map +0 -1
  68. package/dist/widgets/chartRemoteData.d.ts +0 -18
  69. package/dist/widgets/chartRemoteData.d.ts.map +0 -1
  70. package/dist/widgets/choiceUtils.d.ts +0 -24
  71. package/dist/widgets/choiceUtils.d.ts.map +0 -1
  72. package/dist/widgets/index.d.ts +0 -18
  73. package/dist/widgets/index.d.ts.map +0 -1
@@ -15,12 +15,12 @@ const styles = `
15
15
  display: flex;
16
16
  align-items: center;
17
17
  padding: 8px 12px;
18
- background-color: #f5f5f5;
19
- border: 1px solid #ddd;
18
+ background-color: rgba(0, 0, 0, 0.04);
19
+ border: 1px solid #f0f0f0;
20
20
  border-radius: 4px;
21
21
  font-family: system-ui, -apple-system, sans-serif;
22
22
  font-size: 14px;
23
- color: #666;
23
+ color: rgba(0, 0, 0, 0.65);
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
+ };