@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
@@ -1,23 +1,10 @@
1
- import React, { useRef, useEffect, useMemo } from 'react';
1
+ import React, { useRef, useEffect } from 'react';
2
2
  import { createRoot, Root } from 'react-dom/client';
3
3
  import { Widget } from '../widgets/Widget';
4
4
 
5
5
  export interface MarkdownUIProps {
6
6
  html: string;
7
- /** 表单初始值:{ 字段id: 值 },作用于页面中所有 form widget(仅取各自 fields 声明的 id);优先级高于字段 default */
8
- data?: Record<string, unknown>;
9
7
  onWidgetEvent?: (event: CustomEvent<{id: string, value: unknown}>) => void;
10
- /** 表单提交事件:form 校验通过并点击提交时触发(独立于 onWidgetEvent 的 change 流) */
11
- onSubmit?: (event: CustomEvent<{id: string, value: unknown}>) => void;
12
- /** 表单字段级统计事件:任一表单项被填写时触发,detail.stats 含 visibleCount / filledCount / values */
13
- onFormChange?: (event: CustomEvent<{id: string, stats: {visibleCount: number, filledCount: number, values: Record<string, unknown>}}>) => void;
14
- }
15
-
16
- /** 向 <markdown-ui-widget> 占位标签注入 data-widget-data 属性,把外部初始值带过 custom element 边界 */
17
- function injectWidgetData(html: string, data?: Record<string, unknown>): string {
18
- if (!data || Object.keys(data).length === 0) return html;
19
- const encoded = encodeURIComponent(JSON.stringify(data));
20
- return html.replace(/<markdown-ui-widget\b/g, `<markdown-ui-widget data-widget-data="${encoded}"`);
21
8
  }
22
9
 
23
10
  // Custom element definition for markdown-ui-widget (browser only)
@@ -30,18 +17,17 @@ if (typeof HTMLElement !== 'undefined') {
30
17
  connectedCallback() {
31
18
  const id = this.getAttribute('id') || '';
32
19
  const content = this.getAttribute('content') || '';
33
- const data = this.getAttribute('data-widget-data') || '';
34
-
20
+
35
21
  console.log('🏗️ Custom element connected', { id, content });
36
-
22
+
37
23
  // Create a React component instance
38
24
  this.innerHTML = '';
39
25
  const div = document.createElement('div');
40
26
  this.appendChild(div);
41
-
27
+
42
28
  // Use React 18+ createRoot API
43
29
  this.reactRoot = createRoot(div);
44
- this.reactRoot.render(React.createElement(Widget, { id, content, data }));
30
+ this.reactRoot.render(React.createElement(Widget, { id, content }));
45
31
  }
46
32
 
47
33
  disconnectedCallback() {
@@ -58,15 +44,9 @@ if (typeof HTMLElement !== 'undefined') {
58
44
  }
59
45
  }
60
46
 
61
- export const MarkdownUI: React.FC<MarkdownUIProps> = ({ html, data, onWidgetEvent, onSubmit, onFormChange }) => {
47
+ export const MarkdownUI: React.FC<MarkdownUIProps> = ({ html, onWidgetEvent }) => {
62
48
  const containerRef = useRef<HTMLDivElement>(null);
63
49
 
64
- const processedHtml = useMemo(() => injectWidgetData(html, data), [html, data]);
65
-
66
- // dangerouslySetInnerHTML 的 prop 对象必须引用稳定:React DOM 对该 prop 只做外层对象引用对比,
67
- // 每次渲染新建 { __html } 会导致 innerHTML 全量重写 → custom element 重建 → 组件内部状态丢失
68
- const innerHtmlProp = useMemo(() => ({ __html: processedHtml }), [processedHtml]);
69
-
70
50
  useEffect(() => {
71
51
  const handleWidgetEvent = (e: Event) => {
72
52
  const customEvent = e as CustomEvent<{id: string, value: unknown}>;
@@ -75,37 +55,19 @@ export const MarkdownUI: React.FC<MarkdownUIProps> = ({ html, data, onWidgetEven
75
55
  }
76
56
  };
77
57
 
78
- const handleSubmit = (e: Event) => {
79
- const customEvent = e as CustomEvent<{id: string, value: unknown}>;
80
- if (onSubmit) {
81
- onSubmit(customEvent);
82
- }
83
- };
84
-
85
- const handleFormChange = (e: Event) => {
86
- const customEvent = e as CustomEvent<{id: string, stats: {visibleCount: number, filledCount: number, values: Record<string, unknown>}}>;
87
- if (onFormChange) {
88
- onFormChange(customEvent);
89
- }
90
- };
91
-
92
58
  const container = containerRef.current;
93
59
  if (container) {
94
60
  container.addEventListener('widget-event', handleWidgetEvent);
95
- container.addEventListener('widget-submit', handleSubmit);
96
- container.addEventListener('widget-form-change', handleFormChange);
97
-
61
+
98
62
  return () => {
99
63
  container.removeEventListener('widget-event', handleWidgetEvent);
100
- container.removeEventListener('widget-submit', handleSubmit);
101
- container.removeEventListener('widget-form-change', handleFormChange);
102
64
  };
103
65
  }
104
- }, [onWidgetEvent, onSubmit, onFormChange]);
66
+ }, [onWidgetEvent]);
105
67
 
106
68
  return (
107
69
  <div ref={containerRef} className="widget-container">
108
- <div dangerouslySetInnerHTML={innerHtmlProp} />
70
+ <div dangerouslySetInnerHTML={{ __html: html }} />
109
71
  </div>
110
72
  );
111
73
  };