@tipp/ui 2.9.0 → 2.10.1

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 (198) hide show
  1. package/dist/app/index.js +17 -17
  2. package/dist/app/platform/edit-coaching-time.js +17 -17
  3. package/dist/app/platform/edit-service-type.js +17 -17
  4. package/dist/app/platform/goal-manage-card-edit.js +17 -17
  5. package/dist/app/platform/on-offline-radio-card.js +17 -17
  6. package/dist/app/platform/reservation-card.js +17 -17
  7. package/dist/app/platform/session-card.js +17 -17
  8. package/dist/app/roleplay/chart/session-chart.cjs +351 -0
  9. package/dist/app/roleplay/chart/session-chart.cjs.map +1 -0
  10. package/dist/app/roleplay/chart/session-chart.d.cts +16 -0
  11. package/dist/app/roleplay/chart/session-chart.d.ts +16 -0
  12. package/dist/app/roleplay/chart/session-chart.js +14 -0
  13. package/dist/app/roleplay/chart/session-chart.js.map +1 -0
  14. package/dist/app/roleplay/index.cjs +5715 -0
  15. package/dist/app/roleplay/index.cjs.map +1 -0
  16. package/dist/app/roleplay/index.d.cts +4 -0
  17. package/dist/app/roleplay/index.d.ts +4 -0
  18. package/dist/app/roleplay/index.js +182 -0
  19. package/dist/app/roleplay/index.js.map +1 -0
  20. package/dist/app/roleplay/parts/analysis-section.cjs +2178 -0
  21. package/dist/app/roleplay/parts/analysis-section.cjs.map +1 -0
  22. package/dist/app/roleplay/parts/analysis-section.d.cts +17 -0
  23. package/dist/app/roleplay/parts/analysis-section.d.ts +17 -0
  24. package/dist/app/roleplay/parts/analysis-section.js +97 -0
  25. package/dist/app/roleplay/parts/analysis-section.js.map +1 -0
  26. package/dist/app/roleplay/parts/coaching-panel.cjs +2191 -0
  27. package/dist/app/roleplay/parts/coaching-panel.cjs.map +1 -0
  28. package/dist/app/roleplay/parts/coaching-panel.d.cts +8 -0
  29. package/dist/app/roleplay/parts/coaching-panel.d.ts +8 -0
  30. package/dist/app/roleplay/parts/coaching-panel.js +95 -0
  31. package/dist/app/roleplay/parts/coaching-panel.js.map +1 -0
  32. package/dist/app/roleplay/parts/content.cjs +4687 -0
  33. package/dist/app/roleplay/parts/content.cjs.map +1 -0
  34. package/dist/app/roleplay/parts/content.d.cts +15 -0
  35. package/dist/app/roleplay/parts/content.d.ts +15 -0
  36. package/dist/app/roleplay/parts/content.js +174 -0
  37. package/dist/app/roleplay/parts/content.js.map +1 -0
  38. package/dist/app/roleplay/parts/header.cjs +2300 -0
  39. package/dist/app/roleplay/parts/header.cjs.map +1 -0
  40. package/dist/app/roleplay/parts/header.d.cts +13 -0
  41. package/dist/app/roleplay/parts/header.d.ts +13 -0
  42. package/dist/app/roleplay/parts/header.js +96 -0
  43. package/dist/app/roleplay/parts/header.js.map +1 -0
  44. package/dist/app/roleplay/parts/score-summary.cjs +2276 -0
  45. package/dist/app/roleplay/parts/score-summary.cjs.map +1 -0
  46. package/dist/app/roleplay/parts/score-summary.d.cts +12 -0
  47. package/dist/app/roleplay/parts/score-summary.d.ts +12 -0
  48. package/dist/app/roleplay/parts/score-summary.js +96 -0
  49. package/dist/app/roleplay/parts/score-summary.js.map +1 -0
  50. package/dist/app/roleplay/parts/score-trend-section.cjs +3687 -0
  51. package/dist/app/roleplay/parts/score-trend-section.cjs.map +1 -0
  52. package/dist/app/roleplay/parts/score-trend-section.d.cts +14 -0
  53. package/dist/app/roleplay/parts/score-trend-section.d.ts +14 -0
  54. package/dist/app/roleplay/parts/score-trend-section.js +167 -0
  55. package/dist/app/roleplay/parts/score-trend-section.js.map +1 -0
  56. package/dist/app/roleplay/parts/script-transcript.cjs +2288 -0
  57. package/dist/app/roleplay/parts/script-transcript.cjs.map +1 -0
  58. package/dist/app/roleplay/parts/script-transcript.d.cts +15 -0
  59. package/dist/app/roleplay/parts/script-transcript.d.ts +15 -0
  60. package/dist/app/roleplay/parts/script-transcript.js +96 -0
  61. package/dist/app/roleplay/parts/script-transcript.js.map +1 -0
  62. package/dist/app/roleplay/parts/section-nav.cjs +2433 -0
  63. package/dist/app/roleplay/parts/section-nav.cjs.map +1 -0
  64. package/dist/app/roleplay/parts/section-nav.d.cts +15 -0
  65. package/dist/app/roleplay/parts/section-nav.d.ts +15 -0
  66. package/dist/app/roleplay/parts/section-nav.js +96 -0
  67. package/dist/app/roleplay/parts/section-nav.js.map +1 -0
  68. package/dist/app/roleplay/parts/session-replay-dialog.cjs +2598 -0
  69. package/dist/app/roleplay/parts/session-replay-dialog.cjs.map +1 -0
  70. package/dist/app/roleplay/parts/session-replay-dialog.d.cts +14 -0
  71. package/dist/app/roleplay/parts/session-replay-dialog.d.ts +14 -0
  72. package/dist/app/roleplay/parts/session-replay-dialog.js +97 -0
  73. package/dist/app/roleplay/parts/session-replay-dialog.js.map +1 -0
  74. package/dist/app/roleplay/parts/step-detail.cjs +2311 -0
  75. package/dist/app/roleplay/parts/step-detail.cjs.map +1 -0
  76. package/dist/app/roleplay/parts/step-detail.d.cts +9 -0
  77. package/dist/app/roleplay/parts/step-detail.d.ts +9 -0
  78. package/dist/app/roleplay/parts/step-detail.js +96 -0
  79. package/dist/app/roleplay/parts/step-detail.js.map +1 -0
  80. package/dist/app/roleplay/parts/step-radar.cjs +463 -0
  81. package/dist/app/roleplay/parts/step-radar.cjs.map +1 -0
  82. package/dist/app/roleplay/parts/step-radar.d.cts +8 -0
  83. package/dist/app/roleplay/parts/step-radar.d.ts +8 -0
  84. package/dist/app/roleplay/parts/step-radar.js +14 -0
  85. package/dist/app/roleplay/parts/step-radar.js.map +1 -0
  86. package/dist/app/roleplay/parts/step-summary.cjs +2651 -0
  87. package/dist/app/roleplay/parts/step-summary.cjs.map +1 -0
  88. package/dist/app/roleplay/parts/step-summary.d.cts +8 -0
  89. package/dist/app/roleplay/parts/step-summary.d.ts +8 -0
  90. package/dist/app/roleplay/parts/step-summary.js +101 -0
  91. package/dist/app/roleplay/parts/step-summary.js.map +1 -0
  92. package/dist/app/roleplay/rp-session-detail.cjs +5712 -0
  93. package/dist/app/roleplay/rp-session-detail.cjs.map +1 -0
  94. package/dist/app/roleplay/rp-session-detail.d.cts +17 -0
  95. package/dist/app/roleplay/rp-session-detail.d.ts +17 -0
  96. package/dist/app/roleplay/rp-session-detail.js +179 -0
  97. package/dist/app/roleplay/rp-session-detail.js.map +1 -0
  98. package/dist/app/roleplay/types.cjs +19 -0
  99. package/dist/app/roleplay/types.cjs.map +1 -0
  100. package/dist/app/roleplay/types.d.cts +42 -0
  101. package/dist/app/roleplay/types.d.ts +42 -0
  102. package/dist/app/roleplay/types.js +2 -0
  103. package/dist/app/roleplay/types.js.map +1 -0
  104. package/dist/app/roleplay/utils/report-parse.cjs +285 -0
  105. package/dist/app/roleplay/utils/report-parse.cjs.map +1 -0
  106. package/dist/app/roleplay/utils/report-parse.d.cts +57 -0
  107. package/dist/app/roleplay/utils/report-parse.d.ts +57 -0
  108. package/dist/app/roleplay/utils/report-parse.js +8 -0
  109. package/dist/app/roleplay/utils/report-parse.js.map +1 -0
  110. package/dist/app/roleplay/utils/report-parse.test.cjs +491 -0
  111. package/dist/app/roleplay/utils/report-parse.test.cjs.map +1 -0
  112. package/dist/app/roleplay/utils/report-parse.test.d.cts +2 -0
  113. package/dist/app/roleplay/utils/report-parse.test.d.ts +2 -0
  114. package/dist/app/roleplay/utils/report-parse.test.js +237 -0
  115. package/dist/app/roleplay/utils/report-parse.test.js.map +1 -0
  116. package/dist/app/roleplay/utils/session-utils.cjs +204 -0
  117. package/dist/app/roleplay/utils/session-utils.cjs.map +1 -0
  118. package/dist/app/roleplay/utils/session-utils.d.cts +38 -0
  119. package/dist/app/roleplay/utils/session-utils.d.ts +38 -0
  120. package/dist/app/roleplay/utils/session-utils.js +46 -0
  121. package/dist/app/roleplay/utils/session-utils.js.map +1 -0
  122. package/dist/chunk-32WIS4L7.js +131 -0
  123. package/dist/chunk-32WIS4L7.js.map +1 -0
  124. package/dist/chunk-3UGBMKSQ.js +166 -0
  125. package/dist/chunk-3UGBMKSQ.js.map +1 -0
  126. package/dist/chunk-4YAA25AV.js +161 -0
  127. package/dist/chunk-4YAA25AV.js.map +1 -0
  128. package/dist/chunk-5QIT4URV.js +87 -0
  129. package/dist/chunk-5QIT4URV.js.map +1 -0
  130. package/dist/chunk-6YIKOYBQ.js +185 -0
  131. package/dist/chunk-6YIKOYBQ.js.map +1 -0
  132. package/dist/chunk-7MXY3D3Z.js +84 -0
  133. package/dist/chunk-7MXY3D3Z.js.map +1 -0
  134. package/dist/chunk-EBFQFOUQ.js +138 -0
  135. package/dist/chunk-EBFQFOUQ.js.map +1 -0
  136. package/dist/chunk-EHDUKUML.js +183 -0
  137. package/dist/chunk-EHDUKUML.js.map +1 -0
  138. package/dist/{chunk-NEJCZABQ.js → chunk-FJEDSUGU.js} +7 -7
  139. package/dist/chunk-GA6W62DO.js +101 -0
  140. package/dist/chunk-GA6W62DO.js.map +1 -0
  141. package/dist/chunk-KJPBBBVK.js +142 -0
  142. package/dist/chunk-KJPBBBVK.js.map +1 -0
  143. package/dist/{chunk-TQTCT7DC.js → chunk-LRNO4W2P.js} +5 -5
  144. package/dist/{chunk-6DWUGXSY.js → chunk-N242VJOP.js} +2 -2
  145. package/dist/chunk-NKW6BO5R.js +264 -0
  146. package/dist/chunk-NKW6BO5R.js.map +1 -0
  147. package/dist/{chunk-R5UDNKV2.js → chunk-O332K3SW.js} +2 -2
  148. package/dist/chunk-OUP3VFXG.js +1 -0
  149. package/dist/chunk-OUP3VFXG.js.map +1 -0
  150. package/dist/chunk-QMAINJ4G.js +190 -0
  151. package/dist/chunk-QMAINJ4G.js.map +1 -0
  152. package/dist/{chunk-KLJVIEFW.js → chunk-SOKGYD5B.js} +7 -7
  153. package/dist/chunk-TFJJKM3W.js +261 -0
  154. package/dist/chunk-TFJJKM3W.js.map +1 -0
  155. package/dist/{chunk-KQ3ME6XY.js → chunk-U2EAXN3Y.js} +4 -4
  156. package/dist/chunk-UXAEOCOH.js +150 -0
  157. package/dist/chunk-UXAEOCOH.js.map +1 -0
  158. package/dist/chunk-YHP75Y5K.js +242 -0
  159. package/dist/chunk-YHP75Y5K.js.map +1 -0
  160. package/dist/chunk-ZE36DFOC.js +142 -0
  161. package/dist/chunk-ZE36DFOC.js.map +1 -0
  162. package/dist/index.css +76 -0
  163. package/dist/index.js +32 -32
  164. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.js +5 -5
  165. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.js +2 -2
  166. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +7 -7
  167. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +8 -8
  168. package/dist/molecules/curriculumV2/CurriculumContents/index.js +9 -9
  169. package/dist/molecules/curriculumV2/index.js +11 -11
  170. package/dist/molecules/dynamic-form-editor.js +2 -2
  171. package/dist/molecules/index.js +29 -29
  172. package/package.json +28 -2
  173. package/src/app/roleplay/chart/session-chart.tsx +185 -0
  174. package/src/app/roleplay/index.ts +8 -0
  175. package/src/app/roleplay/parts/analysis-section.tsx +98 -0
  176. package/src/app/roleplay/parts/coaching-panel.tsx +101 -0
  177. package/src/app/roleplay/parts/content.tsx +146 -0
  178. package/src/app/roleplay/parts/header.tsx +168 -0
  179. package/src/app/roleplay/parts/score-summary.tsx +158 -0
  180. package/src/app/roleplay/parts/score-trend-section.tsx +265 -0
  181. package/src/app/roleplay/parts/script-transcript.tsx +190 -0
  182. package/src/app/roleplay/parts/section-nav.tsx +299 -0
  183. package/src/app/roleplay/parts/session-replay-dialog.tsx +168 -0
  184. package/src/app/roleplay/parts/step-detail.tsx +173 -0
  185. package/src/app/roleplay/parts/step-radar.tsx +80 -0
  186. package/src/app/roleplay/parts/step-summary.tsx +149 -0
  187. package/src/app/roleplay/rp-session-detail.tsx +176 -0
  188. package/src/app/roleplay/types.ts +61 -0
  189. package/src/app/roleplay/utils/report-parse.test.ts +268 -0
  190. package/src/app/roleplay/utils/report-parse.ts +443 -0
  191. package/src/app/roleplay/utils/session-utils.ts +215 -0
  192. package/src/constrant/trainingLog.dummy.json +1 -0
  193. /package/dist/{chunk-NEJCZABQ.js.map → chunk-FJEDSUGU.js.map} +0 -0
  194. /package/dist/{chunk-TQTCT7DC.js.map → chunk-LRNO4W2P.js.map} +0 -0
  195. /package/dist/{chunk-6DWUGXSY.js.map → chunk-N242VJOP.js.map} +0 -0
  196. /package/dist/{chunk-R5UDNKV2.js.map → chunk-O332K3SW.js.map} +0 -0
  197. /package/dist/{chunk-KLJVIEFW.js.map → chunk-SOKGYD5B.js.map} +0 -0
  198. /package/dist/{chunk-KQ3ME6XY.js.map → chunk-U2EAXN3Y.js.map} +0 -0
@@ -0,0 +1,463 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __defProps = Object.defineProperties;
6
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
8
+ var __getOwnPropNames = Object.getOwnPropertyNames;
9
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
10
+ var __getProtoOf = Object.getPrototypeOf;
11
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
12
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __spreadValues = (a, b) => {
15
+ for (var prop in b || (b = {}))
16
+ if (__hasOwnProp.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ if (__getOwnPropSymbols)
19
+ for (var prop of __getOwnPropSymbols(b)) {
20
+ if (__propIsEnum.call(b, prop))
21
+ __defNormalProp(a, prop, b[prop]);
22
+ }
23
+ return a;
24
+ };
25
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
26
+ var __objRest = (source, exclude) => {
27
+ var target = {};
28
+ for (var prop in source)
29
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
30
+ target[prop] = source[prop];
31
+ if (source != null && __getOwnPropSymbols)
32
+ for (var prop of __getOwnPropSymbols(source)) {
33
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
34
+ target[prop] = source[prop];
35
+ }
36
+ return target;
37
+ };
38
+ var __export = (target, all) => {
39
+ for (var name in all)
40
+ __defProp(target, name, { get: all[name], enumerable: true });
41
+ };
42
+ var __copyProps = (to, from, except, desc) => {
43
+ if (from && typeof from === "object" || typeof from === "function") {
44
+ for (let key of __getOwnPropNames(from))
45
+ if (!__hasOwnProp.call(to, key) && key !== except)
46
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
47
+ }
48
+ return to;
49
+ };
50
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
51
+ // If the importer is in node compatibility mode or this is not an ESM
52
+ // file that has been converted to a CommonJS file using a Babel-
53
+ // compatible transform (i.e. "__esModule" has not been set), then set
54
+ // "default" to the CommonJS "module.exports" for node compatibility.
55
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
56
+ mod
57
+ ));
58
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
59
+
60
+ // src/app/roleplay/parts/step-radar.tsx
61
+ var step_radar_exports = {};
62
+ __export(step_radar_exports, {
63
+ StepRadar: () => StepRadar
64
+ });
65
+ module.exports = __toCommonJS(step_radar_exports);
66
+
67
+ // src/app/roleplay/utils/session-utils.ts
68
+ var import_date_fns = require("date-fns");
69
+ var QUALITY_RATIO = {
70
+ \uCDA9\uC871: 1,
71
+ \uBD80\uBD84\uCDA9\uC871: 0.6,
72
+ \uBBF8\uD761: 0.3
73
+ };
74
+ function qualityRatio(quality) {
75
+ return quality === null ? null : QUALITY_RATIO[quality];
76
+ }
77
+ function stepRatio(step) {
78
+ if (step.maxScore !== null && step.maxScore > 0 && step.score !== null) {
79
+ return Math.max(0, Math.min(1, step.score / step.maxScore));
80
+ }
81
+ return qualityRatio(step.quality);
82
+ }
83
+ function stepScoreText(step) {
84
+ if (step.score === null) return null;
85
+ return step.maxScore !== null ? `${step.score}/${step.maxScore}` : `${step.score}`;
86
+ }
87
+ function stepGradeLabel(step) {
88
+ return step.qualityLabel;
89
+ }
90
+ var LETTER_RE = /[A-Za-z]/;
91
+ function stepCode(step) {
92
+ if (step.initial !== null && step.initial.trim().length > 0) {
93
+ return step.initial.trim();
94
+ }
95
+ const label = step.label.trim();
96
+ const first = label.charAt(0);
97
+ const second = label.charAt(1);
98
+ if (LETTER_RE.test(first) && (second === " " || second === "\u2014" || second === "-")) {
99
+ return first.toUpperCase();
100
+ }
101
+ if (first === "[" && LETTER_RE.test(second) && label.charAt(2) === "]") {
102
+ return second.toUpperCase();
103
+ }
104
+ return step.key.split("_")[0].slice(0, 4).toUpperCase();
105
+ }
106
+
107
+ // src/app/roleplay/chart/session-chart.tsx
108
+ var import_react = require("react");
109
+ var import_react_resize_detector = require("react-resize-detector");
110
+ var echarts = __toESM(require("echarts/core"), 1);
111
+ var ReactEChartsCoreNs = __toESM(require("echarts-for-react/lib/core"), 1);
112
+ var import_charts = require("echarts/charts");
113
+ var import_renderers = require("echarts/renderers");
114
+ var import_components = require("echarts/components");
115
+
116
+ // src/charts/horizontal-bar-chart.tsx
117
+ var import_jsx_runtime = require("react/jsx-runtime");
118
+
119
+ // src/charts/chart-theme.json
120
+ var chart_theme_default = {
121
+ version: 1,
122
+ themeName: "customed",
123
+ theme: {
124
+ seriesCnt: "5",
125
+ backgroundColor: "rgba(0,0,0,0)",
126
+ titleColor: "#1c2024",
127
+ subtitleColor: "#8d8d8d",
128
+ textColorShow: false,
129
+ textColor: "#333",
130
+ markTextColor: "#ffffff",
131
+ color: [
132
+ "#ffe629",
133
+ "#3e63dd",
134
+ "#ec9455",
135
+ "#5bb98b",
136
+ "#cb1d63",
137
+ "#3ba272",
138
+ "#fc8452",
139
+ "#9a60b4",
140
+ "#ea7ccc"
141
+ ],
142
+ borderColor: "#8d8d8d",
143
+ borderWidth: 0,
144
+ visualMapColor: ["#bf444c", "#d88273", "#f6efa6"],
145
+ legendTextColor: "#1c2024",
146
+ kColor: "#eb5454",
147
+ kColor0: "#47b262",
148
+ kBorderColor: "#eb5454",
149
+ kBorderColor0: "#47b262",
150
+ kBorderWidth: 1,
151
+ lineWidth: 2,
152
+ symbolSize: 4,
153
+ symbol: "emptyCircle",
154
+ symbolBorderWidth: 1,
155
+ lineSmooth: false,
156
+ graphLineWidth: 1,
157
+ graphLineColor: "#aaa",
158
+ mapLabelColor: "#000",
159
+ mapLabelColorE: "rgb(100,0,0)",
160
+ mapBorderColor: "#444",
161
+ mapBorderColorE: "#444",
162
+ mapBorderWidth: 0.5,
163
+ mapBorderWidthE: 1,
164
+ mapAreaColor: "#eee",
165
+ mapAreaColorE: "rgba(255,215,0,0.8)",
166
+ axes: [
167
+ {
168
+ type: "all",
169
+ name: "\u901A\u7528\u5750\u6807\u8F74",
170
+ axisLineShow: true,
171
+ axisLineColor: "#6E7079",
172
+ axisTickShow: true,
173
+ axisTickColor: "#6E7079",
174
+ axisLabelShow: true,
175
+ axisLabelColor: "#6E7079",
176
+ splitLineShow: true,
177
+ splitLineColor: ["#E0E6F1"],
178
+ splitAreaShow: false,
179
+ splitAreaColor: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]
180
+ },
181
+ {
182
+ type: "category",
183
+ name: "\u7C7B\u76EE\u5750\u6807\u8F74",
184
+ axisLineShow: true,
185
+ axisLineColor: "#6E7079",
186
+ axisTickShow: true,
187
+ axisTickColor: "#6E7079",
188
+ axisLabelShow: true,
189
+ axisLabelColor: "#6E7079",
190
+ splitLineShow: false,
191
+ splitLineColor: ["#E0E6F1"],
192
+ splitAreaShow: false,
193
+ splitAreaColor: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]
194
+ },
195
+ {
196
+ type: "value",
197
+ name: "\u6570\u503C\u5750\u6807\u8F74",
198
+ axisLineShow: false,
199
+ axisLineColor: "#6E7079",
200
+ axisTickShow: false,
201
+ axisTickColor: "#6E7079",
202
+ axisLabelShow: true,
203
+ axisLabelColor: "#6E7079",
204
+ splitLineShow: true,
205
+ splitLineColor: ["#E0E6F1"],
206
+ splitAreaShow: false,
207
+ splitAreaColor: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]
208
+ },
209
+ {
210
+ type: "log",
211
+ name: "\u5BF9\u6570\u5750\u6807\u8F74",
212
+ axisLineShow: false,
213
+ axisLineColor: "#6E7079",
214
+ axisTickShow: false,
215
+ axisTickColor: "#6E7079",
216
+ axisLabelShow: true,
217
+ axisLabelColor: "#6E7079",
218
+ splitLineShow: true,
219
+ splitLineColor: ["#E0E6F1"],
220
+ splitAreaShow: false,
221
+ splitAreaColor: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]
222
+ },
223
+ {
224
+ type: "time",
225
+ name: "\u65F6\u95F4\u5750\u6807\u8F74",
226
+ axisLineShow: true,
227
+ axisLineColor: "#6E7079",
228
+ axisTickShow: true,
229
+ axisTickColor: "#6E7079",
230
+ axisLabelShow: true,
231
+ axisLabelColor: "#6E7079",
232
+ splitLineShow: false,
233
+ splitLineColor: ["#E0E6F1"],
234
+ splitAreaShow: false,
235
+ splitAreaColor: ["rgba(250,250,250,0.2)", "rgba(210,219,238,0.2)"]
236
+ }
237
+ ],
238
+ axisSeperateSetting: true,
239
+ toolboxColor: "#8d8d8d",
240
+ toolboxEmphasisColor: "#1c2024",
241
+ tooltipAxisColor: "#cccccc",
242
+ tooltipAxisWidth: 1,
243
+ timelineLineColor: "#dae1f5",
244
+ timelineLineWidth: 2,
245
+ timelineItemColor: "#a4b1d7",
246
+ timelineItemColorE: "#ffffff",
247
+ timelineCheckColor: "#316bf3",
248
+ timelineCheckBorderColor: "#ffffff",
249
+ timelineItemBorderWidth: 1,
250
+ timelineControlColor: "#a4b1d7",
251
+ timelineControlBorderColor: "#a4b1d7",
252
+ timelineControlBorderWidth: 1,
253
+ timelineLabelColor: "#a4b1d7"
254
+ }
255
+ };
256
+
257
+ // src/charts/chart-default-props.tsx
258
+ var EchartDefaultProps = {
259
+ opts: { renderer: "svg" },
260
+ theme: chart_theme_default,
261
+ option: {
262
+ textStyle: { fontFamily: "Pretendard Variable" },
263
+ tooltip: { textStyle: { fontSize: 16 } }
264
+ }
265
+ };
266
+
267
+ // src/app/roleplay/chart/session-chart.tsx
268
+ var import_jsx_runtime2 = require("react/jsx-runtime");
269
+ function unwrapDefault(mod) {
270
+ let current = mod;
271
+ while (current !== null && typeof current === "object" && "default" in current) {
272
+ current = current.default;
273
+ }
274
+ return current;
275
+ }
276
+ function isComponentType(value) {
277
+ return typeof value === "function";
278
+ }
279
+ var unwrappedChart = unwrapDefault(ReactEChartsCoreNs);
280
+ var ReactEChartsCore = isComponentType(unwrappedChart) ? unwrappedChart : ReactEChartsCoreNs.default;
281
+ echarts.use([
282
+ import_renderers.SVGRenderer,
283
+ import_charts.LineChart,
284
+ import_charts.RadarChart,
285
+ import_components.TooltipComponent,
286
+ import_components.GridComponent,
287
+ import_components.LegendComponent,
288
+ import_components.AriaComponent,
289
+ import_components.AxisPointerComponent,
290
+ import_components.PolarComponent,
291
+ import_components.RadarComponent
292
+ ]);
293
+ function deepMerge(base, override) {
294
+ if (!override) return base;
295
+ if (typeof base !== "object" || !base || Array.isArray(base) || typeof override !== "object" || Array.isArray(override)) {
296
+ return override;
297
+ }
298
+ const out = __spreadValues({}, base);
299
+ for (const [k, v] of Object.entries(override)) {
300
+ out[k] = k in out ? deepMerge(out[k], v) : v;
301
+ }
302
+ return out;
303
+ }
304
+ function Chart(_a) {
305
+ var _b = _a, {
306
+ option: optionProp
307
+ } = _b, rest = __objRest(_b, [
308
+ "option"
309
+ ]);
310
+ const { width, height, ref } = (0, import_react_resize_detector.useResizeDetector)({
311
+ handleHeight: true,
312
+ refreshMode: "debounce",
313
+ refreshRate: 100
314
+ });
315
+ const [mounted, setMounted] = (0, import_react.useState)(false);
316
+ (0, import_react.useEffect)(() => {
317
+ setMounted(true);
318
+ }, []);
319
+ const option = (0, import_react.useMemo)(() => {
320
+ const baseOption = {
321
+ textStyle: { fontFamily: "var(--default-font-family, 'Noto Sans KR')" },
322
+ tooltip: { textStyle: { fontSize: 13 } },
323
+ // ds-allow: chart-lib
324
+ animation: false
325
+ };
326
+ return deepMerge(baseOption, optionProp);
327
+ }, [optionProp]);
328
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { ref, style: { width: "100%", height: "100%" }, children: mounted ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
329
+ ReactEChartsCore,
330
+ __spreadProps(__spreadValues(__spreadProps(__spreadValues({}, EchartDefaultProps), {
331
+ echarts,
332
+ opts: { renderer: "svg" },
333
+ style: { height, width }
334
+ }), rest), {
335
+ option
336
+ })
337
+ ) : null });
338
+ }
339
+ function normalizeColor(value, fallback) {
340
+ const v = value.trim();
341
+ if (!v) return fallback;
342
+ if (/^#|^rgb|^hsl/i.test(v)) return v;
343
+ try {
344
+ const canvas = document.createElement("canvas");
345
+ const ctx = canvas.getContext("2d");
346
+ if (!ctx) return fallback;
347
+ ctx.fillStyle = "#000";
348
+ ctx.fillStyle = v;
349
+ const out = ctx.fillStyle;
350
+ return /color\(|^$/i.test(out) ? fallback : out;
351
+ } catch (e) {
352
+ return fallback;
353
+ }
354
+ }
355
+ function useTokenColors(vars) {
356
+ const probeRef = (0, import_react.useRef)(null);
357
+ const fallbacks = (0, import_react.useMemo)(() => {
358
+ const f = {};
359
+ for (const k of Object.keys(vars)) f[k] = vars[k][1];
360
+ return f;
361
+ }, [vars]);
362
+ const [resolved, setResolved] = (0, import_react.useState)(fallbacks);
363
+ const key = JSON.stringify(vars);
364
+ const varsRef = (0, import_react.useRef)(vars);
365
+ varsRef.current = vars;
366
+ (0, import_react.useEffect)(() => {
367
+ const el = probeRef.current;
368
+ if (!el) return;
369
+ const cs = getComputedStyle(el);
370
+ const next = {};
371
+ for (const k of Object.keys(varsRef.current)) {
372
+ const [cssVar, fallback] = varsRef.current[k];
373
+ next[k] = normalizeColor(cs.getPropertyValue(cssVar), fallback);
374
+ }
375
+ setResolved(next);
376
+ }, [key]);
377
+ const probe = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
378
+ "span",
379
+ {
380
+ "aria-hidden": true,
381
+ ref: probeRef,
382
+ style: { position: "absolute", width: 0, height: 0, overflow: "hidden" }
383
+ }
384
+ );
385
+ return { colors: resolved, probe };
386
+ }
387
+
388
+ // src/app/roleplay/parts/step-radar.tsx
389
+ var import_jsx_runtime3 = require("react/jsx-runtime");
390
+ function StepRadar({ steps }) {
391
+ const { colors, probe } = useTokenColors({
392
+ accent: ["--accent-9", "#5b5bd6"],
393
+ grid: ["--gray-5", "#e0e0e0"],
394
+ label: ["--gray-11", "#646464"]
395
+ });
396
+ const indicator = steps.map((s) => ({ name: stepCode(s), max: 1 }));
397
+ const values = steps.map((s) => {
398
+ var _a;
399
+ return (_a = stepRatio(s)) != null ? _a : 0;
400
+ });
401
+ const option = {
402
+ tooltip: {
403
+ trigger: "item",
404
+ formatter: () => steps.map(
405
+ (s) => {
406
+ var _a, _b;
407
+ return `${stepCode(s)} ${(_b = (_a = stepScoreText(s)) != null ? _a : stepGradeLabel(s)) != null ? _b : "\u2014"}`;
408
+ }
409
+ ).join("<br/>")
410
+ },
411
+ radar: {
412
+ indicator,
413
+ radius: "66%",
414
+ center: ["50%", "50%"],
415
+ splitNumber: 4,
416
+ axisName: { color: colors.label, fontSize: 10, fontWeight: "bold" },
417
+ // ds-allow: chart-lib
418
+ splitLine: { lineStyle: { color: colors.grid } },
419
+ splitArea: { show: false },
420
+ axisLine: { lineStyle: { color: colors.grid } }
421
+ },
422
+ series: [
423
+ {
424
+ type: "radar",
425
+ data: [
426
+ {
427
+ value: values,
428
+ name: "\uC774\uBC88 \uC138\uC158",
429
+ areaStyle: { color: colors.accent, opacity: 0.18 },
430
+ lineStyle: { color: colors.accent, width: 2 },
431
+ itemStyle: { color: colors.accent },
432
+ symbolSize: 4
433
+ }
434
+ ]
435
+ }
436
+ ]
437
+ };
438
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
439
+ "div",
440
+ {
441
+ "aria-label": "\uD3C9\uAC00 \uB2E8\uACC4 \uB808\uC774\uB354 \uCC28\uD2B8",
442
+ role: "img",
443
+ style: {
444
+ position: "relative",
445
+ display: "flex",
446
+ alignItems: "center",
447
+ justifyContent: "center",
448
+ height: "100%",
449
+ minWidth: 0,
450
+ overflow: "hidden"
451
+ },
452
+ children: [
453
+ probe,
454
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: { width: "100%", maxWidth: 300, height: 280 }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Chart, { option }) })
455
+ ]
456
+ }
457
+ );
458
+ }
459
+ // Annotate the CommonJS export names for ESM import in node:
460
+ 0 && (module.exports = {
461
+ StepRadar
462
+ });
463
+ //# sourceMappingURL=step-radar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/app/roleplay/parts/step-radar.tsx","../../../../src/app/roleplay/utils/session-utils.ts","../../../../src/app/roleplay/chart/session-chart.tsx","../../../../src/charts/horizontal-bar-chart.tsx","../../../../src/charts/chart-theme.json","../../../../src/charts/chart-default-props.tsx"],"sourcesContent":["'use client';\n\nimport type { EChartsOption } from 'echarts';\nimport type { RpReportStep } from '../utils/report-parse';\nimport { stepCode, stepGradeLabel, stepRatio, stepScoreText } from '../utils/session-utils';\nimport { Chart, useTokenColors } from '../chart/session-chart';\n\nexport interface StepRadarProps {\n steps: RpReportStep[];\n}\n\nexport function StepRadar({ steps }: StepRadarProps): React.ReactElement {\n const { colors, probe } = useTokenColors({\n accent: ['--accent-9', '#5b5bd6'],\n grid: ['--gray-5', '#e0e0e0'],\n label: ['--gray-11', '#646464'],\n });\n\n const indicator = steps.map((s) => ({ name: stepCode(s), max: 1 }));\n const values = steps.map((s) => stepRatio(s) ?? 0);\n\n const option: EChartsOption = {\n tooltip: {\n trigger: 'item',\n formatter: () =>\n steps\n .map(\n (s) =>\n `${stepCode(s)} ${stepScoreText(s) ?? stepGradeLabel(s) ?? '—'}`\n )\n .join('<br/>'),\n },\n radar: {\n indicator,\n radius: '66%',\n center: ['50%', '50%'],\n splitNumber: 4,\n axisName: { color: colors.label, fontSize: 10, fontWeight: 'bold' }, // ds-allow: chart-lib\n splitLine: { lineStyle: { color: colors.grid } },\n splitArea: { show: false },\n axisLine: { lineStyle: { color: colors.grid } },\n },\n series: [\n {\n type: 'radar',\n data: [\n {\n value: values,\n name: '이번 세션',\n areaStyle: { color: colors.accent, opacity: 0.18 },\n lineStyle: { color: colors.accent, width: 2 },\n itemStyle: { color: colors.accent },\n symbolSize: 4,\n },\n ],\n },\n ],\n };\n\n return (\n <div\n aria-label=\"평가 단계 레이더 차트\"\n role=\"img\"\n style={{\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n minWidth: 0,\n overflow: 'hidden',\n }}\n >\n {probe}\n <div style={{ width: '100%', maxWidth: 300, height: 280 }}>\n <Chart option={option} />\n </div>\n </div>\n );\n}\n","// 롤플레잉 세션 상세 순수 유틸 함수 모음.\n// 원본: website/src/modules/customer/roleplay/pages/RpSessionDetail/RpSessionDetail.tsx\n// 'use client' 없음 — 순수 함수, 클라이언트 전용 아님.\n\nimport { format } from 'date-fns';\nimport type { RpSessionScriptLine } from '../types';\nimport type { RpQuality, RpReportStep } from './report-parse';\n\n/* ───────────────────────── 타입 ───────────────────────── */\n\nexport interface SpeechShare { userPct: number; partnerPct: number }\n\nexport type QColor = 'green' | 'amber' | 'red' | 'gray';\n\n/* ───────────────────────── 색 변수 ───────────────────────── */\n\nexport const COLOR_VARS: Record<QColor, { fg: string; bg: string; border: string }> = {\n green: {\n fg: 'var(--green-11)',\n bg: 'var(--green-a3)',\n border: 'var(--green-a6)',\n },\n amber: {\n fg: 'var(--amber-11)',\n bg: 'var(--amber-a3)',\n border: 'var(--amber-a6)',\n },\n red: { fg: 'var(--red-11)', bg: 'var(--red-a3)', border: 'var(--red-a6)' },\n gray: { fg: 'var(--gray-9)', bg: 'var(--gray-a3)', border: 'var(--gray-5)' },\n};\n\n/* ───────────────────────── 등급 색 ───────────────────────── */\n\nexport function qualityColor(quality: RpQuality | null): QColor {\n switch (quality) {\n case '충족':\n return 'green';\n case '부분충족':\n return 'amber';\n case '미흡':\n return 'red';\n default:\n return 'gray';\n }\n}\n\nexport const QUALITY_RATIO: Record<RpQuality, number> = {\n 충족: 1,\n 부분충족: 0.6,\n 미흡: 0.3,\n} as const;\n\nexport function qualityRatio(quality: RpQuality | null): number | null {\n return quality === null ? null : QUALITY_RATIO[quality];\n}\n\n// 표준 등급이 아닌 자유 등급 문자열에서 색만 키워드로 추정(비율은 산출하지 않음).\nexport function gradeColorFromLabel(label: string | null): QColor {\n if (!label) return 'gray';\n if (\n label.includes('미흡') ||\n label.includes('부족') ||\n label.includes('미달')\n )\n return 'red';\n if (label.includes('부분') || label.includes('보통')) return 'amber';\n if (\n label.includes('충족') ||\n label.includes('우수') ||\n label.includes('충분')\n )\n return 'green';\n return 'gray';\n}\n\n/* ───────────────────────── 단계(Step) 헬퍼 ───────────────────────── */\n\n// 단계 색: 표준 등급 우선, 없으면 라벨 키워드 추정.\nexport function stepColor(step: RpReportStep): QColor {\n return step.quality !== null\n ? qualityColor(step.quality)\n : gradeColorFromLabel(step.qualityLabel);\n}\n\nexport function stepVars(step: RpReportStep): { fg: string; bg: string; border: string } {\n return COLOR_VARS[stepColor(step)];\n}\n\n// progress/radar 정규화 비율(0~1). score/maxScore 우선, 없으면 표준 등급 비율, 둘 다 없으면 null.\nexport function stepRatio(step: RpReportStep): number | null {\n if (step.maxScore !== null && step.maxScore > 0 && step.score !== null) {\n return Math.max(0, Math.min(1, step.score / step.maxScore));\n }\n return qualityRatio(step.quality);\n}\n\n// 점수 텍스트: max 있으면 'score/max', 없으면 'score', score 없으면 null.\nexport function stepScoreText(step: RpReportStep): string | null {\n if (step.score === null) return null;\n return step.maxScore !== null\n ? `${step.score}/${step.maxScore}`\n : `${step.score}`;\n}\n\n// 표시할 등급 라벨(자유 문자열 포함). 없으면 null.\nexport function stepGradeLabel(step: RpReportStep): string | null {\n return step.qualityLabel;\n}\n\n// 단계에 표시할 평가 정보가 하나라도 있는지(점수 또는 등급).\nexport function hasStepSignal(step: RpReportStep): boolean {\n return step.score !== null || step.qualityLabel !== null;\n}\n\n// radar 축/요약 라벨용 짧은 코드.\n// displayMeta.steps.initial 이 지정돼 있으면 최우선(이니셜 충돌 해소).\n// 없으면 기존 휴리스틱: acronym 프레임워크는 선두 글자, 아니면 키 약식.\nconst LETTER_RE = /[A-Za-z]/;\n\nexport function stepCode(step: RpReportStep): string {\n if (step.initial !== null && step.initial.trim().length > 0) {\n return step.initial.trim();\n }\n const label = step.label.trim();\n const first = label.charAt(0);\n const second = label.charAt(1);\n // \"O — Opening\" / \"O - Opening\" / \"O Opening\" 형태\n if (\n LETTER_RE.test(first) &&\n (second === ' ' || second === '—' || second === '-')\n ) {\n return first.toUpperCase();\n }\n // \"[I] Introduction\" 형태\n if (first === '[' && LETTER_RE.test(second) && label.charAt(2) === ']') {\n return second.toUpperCase();\n }\n return step.key.split('_')[0].slice(0, 4).toUpperCase();\n}\n\n/* ───────────────────────── 포맷 유틸 ───────────────────────── */\n\nexport function formatDuration(seconds: number | null): string {\n if (seconds === null) return '—';\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return `${m}분 ${String(s).padStart(2, '0')}초`;\n}\n\nexport function formatDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n return format(d, 'M/d HH:mm');\n}\n\nexport function formatTimestamp(ms: number): string {\n const total = Math.floor(ms / 1000);\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `${m}:${String(s).padStart(2, '0')}`;\n}\n\n/* ───────────────────────── 미디어 싱크 ───────────────────────── */\n\n// 미디어 길이와 STT 길이가 이 비율 이내로 가까우면 싱크(클릭 seek/재생 하이라이트) 활성.\nexport const SYNC_TOLERANCE = 0.05;\n\nexport function isLengthClose(mediaSec: number | null, sttSec: number): boolean {\n if (!mediaSec || mediaSec <= 0 || sttSec <= 0) {\n return false;\n }\n return (\n Math.abs(mediaSec - sttSec) / Math.max(mediaSec, sttSec) <= SYNC_TOLERANCE\n );\n}\n\n/* ───────────────────────── 발화량 ───────────────────────── */\n\n// 내 발화량이 이 비율을 넘으면 과다 발화로 간주(빨간 막대 + 주의 문구).\nexport const SPEECH_OVERTALK_THRESHOLD = 40;\n\n// 화자별 발화량 비율. 기준은 공백·개행 제거 글자 수(실제 말한 양에 근접, 공백 패턴 왜곡 방지).\n// 발화 글자가 전혀 없으면 null → 미표시.\nexport function computeSpeechShare(lines: RpSessionScriptLine[]): SpeechShare | null {\n let userChars = 0;\n let partnerChars = 0;\n for (const line of lines) {\n const count = line.text.replace(/\\s/g, '').length;\n if (line.speaker === 'user') {\n userChars += count;\n } else {\n partnerChars += count;\n }\n }\n const total = userChars + partnerChars;\n if (total === 0) {\n return null;\n }\n const userPct = Math.round((userChars / total) * 100);\n return { userPct, partnerPct: 100 - userPct };\n}\n\n/* ───────────────────────── 세션 상태 ───────────────────────── */\n\nconst STATUS_LABEL: Record<string, string> = {\n complete: '분석 완료',\n completed: '분석 완료',\n analyzing: 'AI 분석 중',\n partial: '일부 산출물 없음',\n};\n\nexport function statusLabelOf(status: string | null): string {\n if (!status) return '세션';\n return STATUS_LABEL[status] ?? status;\n}\n","'use client';\n\n// echarts 기반 Chart 래퍼 + 토큰 색 해석 훅.\n// echarts 본체/echarts-for-react/react-resize-detector 는 @tipp/ui 의 optional peerDependency.\n// 이 모듈은 subpath(@tipp/ui/roleplay)로만 노출되어 메인 번들에서 격리된다.\n// SSR 안전: echarts/ResizeObserver 는 클라이언트 전용이라 마운트 이후에만 렌더한다.\n\nimport React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\nimport type { EChartsOption } from 'echarts';\nimport * as echarts from 'echarts/core';\nimport * as ReactEChartsCoreNs from 'echarts-for-react/lib/core';\nimport { LineChart, RadarChart } from 'echarts/charts';\nimport { SVGRenderer } from 'echarts/renderers';\nimport {\n AxisPointerComponent,\n AriaComponent,\n TooltipComponent,\n GridComponent,\n LegendComponent,\n PolarComponent,\n RadarComponent,\n} from 'echarts/components';\nimport { EchartDefaultProps } from '../../../charts';\n\n// CJS/ESM interop 정규화.\n// echarts-for-react/lib/core 는 CJS(exports.default = 클래스)이고 @tipp/ui 는 strict ESM(\"type\":\"module\")\n// 이라, 번들러/런타임에 따라 실제 컴포넌트가 default 로 0~2 겹 감싸진다. 특히 webpack 이 __esModule 를\n// 무시하면 module.exports 를 한 번 더 감싸 ReactEChartsCoreNs.default.default 에 클래스가 들어가고,\n// 그대로 렌더하면 React 가 \"Element type is invalid (got: object)\" 로 던진다.\n// 함수(클래스/함수형 컴포넌트)가 나올 때까지 default 를 풀어 정규화한다.\ntype EChartsComponentType = typeof ReactEChartsCoreNs.default;\n\nfunction unwrapDefault(mod: unknown): unknown {\n let current = mod;\n while (current !== null && typeof current === 'object' && 'default' in current) {\n current = current.default;\n }\n return current;\n}\n\nfunction isComponentType(value: unknown): value is EChartsComponentType {\n return typeof value === 'function';\n}\n\nconst unwrappedChart = unwrapDefault(ReactEChartsCoreNs);\nconst ReactEChartsCore: EChartsComponentType = isComponentType(unwrappedChart)\n ? unwrappedChart\n : ReactEChartsCoreNs.default;\n\necharts.use([\n SVGRenderer,\n LineChart,\n RadarChart,\n TooltipComponent,\n GridComponent,\n LegendComponent,\n AriaComponent,\n AxisPointerComponent,\n PolarComponent,\n RadarComponent,\n]);\n\n// base/option 깊은 병합 (배열은 option 우선)\nfunction deepMerge<T>(base: T, override: unknown): T {\n if (!override) return base;\n if (\n typeof base !== 'object' ||\n !base ||\n Array.isArray(base) ||\n typeof override !== 'object' ||\n Array.isArray(override)\n ) {\n return override as T;\n }\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(override as Record<string, unknown>)) {\n out[k] = k in out ? deepMerge(out[k], v) : v;\n }\n return out as T;\n}\n\nexport type ChartProps = Omit<\n React.ComponentProps<typeof ReactEChartsCore>,\n 'option' | 'echarts'\n> & {\n option: EChartsOption;\n};\n\nexport function Chart({\n option: optionProp,\n ...rest\n}: ChartProps): React.ReactElement {\n const { width, height, ref } = useResizeDetector({\n handleHeight: true,\n refreshMode: 'debounce',\n refreshRate: 100,\n });\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const option = useMemo(() => {\n const baseOption: EChartsOption = {\n textStyle: { fontFamily: \"var(--default-font-family, 'Noto Sans KR')\" },\n tooltip: { textStyle: { fontSize: 13 } }, // ds-allow: chart-lib\n animation: false,\n };\n return deepMerge(baseOption, optionProp);\n }, [optionProp]);\n\n return (\n <div ref={ref} style={{ width: '100%', height: '100%' }}>\n {mounted ? (\n <ReactEChartsCore\n {...EchartDefaultProps}\n echarts={echarts}\n opts={{ renderer: 'svg' }}\n style={{ height, width }}\n {...rest}\n option={option}\n />\n ) : null}\n </div>\n );\n}\n\n// 임의의 CSS 색 문자열을 echarts(zrender)가 파싱 가능한 rgb(a)로 정규화한다.\nfunction normalizeColor(value: string, fallback: string): string {\n const v = value.trim();\n if (!v) return fallback;\n if (/^#|^rgb|^hsl/i.test(v)) return v;\n try {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return fallback;\n ctx.fillStyle = '#000';\n ctx.fillStyle = v;\n const out = ctx.fillStyle;\n return /color\\(|^$/i.test(out) ? fallback : out;\n } catch {\n return fallback;\n }\n}\n\n// @tipp/ui 토큰(CSS 변수)을 echarts 가 먹을 수 있는 실제 색 문자열로 해석하는 훅.\nexport function useTokenColors<K extends string>(\n vars: Record<K, [cssVar: string, fallback: string]>\n): {\n colors: Record<K, string>;\n probe: React.ReactNode;\n} {\n const probeRef = useRef<HTMLSpanElement | null>(null);\n const fallbacks = useMemo(() => {\n const f = {} as Record<K, string>;\n for (const k of Object.keys(vars) as K[]) f[k] = vars[k][1];\n return f;\n }, [vars]);\n const [resolved, setResolved] = useState<Record<K, string>>(fallbacks);\n const key = JSON.stringify(vars);\n // vars 객체는 매 렌더 새 참조라 deps에 직접 넣을 수 없어 ref로 최신값을 참조하고,\n // 실제 변경 추적은 직렬화한 key 로 한다.\n const varsRef = useRef(vars);\n varsRef.current = vars;\n useEffect(() => {\n const el = probeRef.current;\n if (!el) return;\n const cs = getComputedStyle(el);\n const next = {} as Record<K, string>;\n for (const k of Object.keys(varsRef.current) as K[]) {\n const [cssVar, fallback] = varsRef.current[k];\n next[k] = normalizeColor(cs.getPropertyValue(cssVar), fallback);\n }\n setResolved(next);\n }, [key]);\n const probe = (\n <span\n aria-hidden\n ref={probeRef}\n style={{ position: 'absolute', width: 0, height: 0, overflow: 'hidden' }}\n />\n );\n return { colors: resolved, probe };\n}\n","import React from 'react';\n\nexport interface HorizontalBarChartProps {\n /** 100% 바가 뜻하는 전체 값 */\n total: number;\n /** 화면에 채워져보이는 값 */\n value: number;\n /** 배경 색상 */\n backgroundColor?: string;\n /** 바의 색상 */\n barColor?: string;\n /** 바의 높이 */\n height?: number;\n /**\n * 바의 모서리 둥글기. 숫자는 px로 처리된다.\n * 생략 시 완전히 둥근 형태(pill), `0`이면 완전 사각형.\n */\n borderRadius?: number | string;\n}\n\nexport function HorizontalBarChart(\n props: HorizontalBarChartProps\n): React.ReactNode {\n const { total, value, backgroundColor, barColor, height, borderRadius } =\n props;\n return (\n <div\n className=\"tipp_horizontal-bar-chart bar-wrapper\"\n style={{ height, backgroundColor, borderRadius }}\n >\n <div\n style={{\n width: `${Math.round((value / total) * 100)}%`,\n height: '100%',\n }}\n >\n <div className=\"bar\" style={{ backgroundColor: barColor }} />\n </div>\n </div>\n );\n}\n","{\n \"version\": 1,\n \"themeName\": \"customed\",\n \"theme\": {\n \"seriesCnt\": \"5\",\n \"backgroundColor\": \"rgba(0,0,0,0)\",\n \"titleColor\": \"#1c2024\",\n \"subtitleColor\": \"#8d8d8d\",\n \"textColorShow\": false,\n \"textColor\": \"#333\",\n \"markTextColor\": \"#ffffff\",\n \"color\": [\n \"#ffe629\",\n \"#3e63dd\",\n \"#ec9455\",\n \"#5bb98b\",\n \"#cb1d63\",\n \"#3ba272\",\n \"#fc8452\",\n \"#9a60b4\",\n \"#ea7ccc\"\n ],\n \"borderColor\": \"#8d8d8d\",\n \"borderWidth\": 0,\n \"visualMapColor\": [\"#bf444c\", \"#d88273\", \"#f6efa6\"],\n \"legendTextColor\": \"#1c2024\",\n \"kColor\": \"#eb5454\",\n \"kColor0\": \"#47b262\",\n \"kBorderColor\": \"#eb5454\",\n \"kBorderColor0\": \"#47b262\",\n \"kBorderWidth\": 1,\n \"lineWidth\": 2,\n \"symbolSize\": 4,\n \"symbol\": \"emptyCircle\",\n \"symbolBorderWidth\": 1,\n \"lineSmooth\": false,\n \"graphLineWidth\": 1,\n \"graphLineColor\": \"#aaa\",\n \"mapLabelColor\": \"#000\",\n \"mapLabelColorE\": \"rgb(100,0,0)\",\n \"mapBorderColor\": \"#444\",\n \"mapBorderColorE\": \"#444\",\n \"mapBorderWidth\": 0.5,\n \"mapBorderWidthE\": 1,\n \"mapAreaColor\": \"#eee\",\n \"mapAreaColorE\": \"rgba(255,215,0,0.8)\",\n \"axes\": [\n {\n \"type\": \"all\",\n \"name\": \"通用坐标轴\",\n \"axisLineShow\": true,\n \"axisLineColor\": \"#6E7079\",\n \"axisTickShow\": true,\n \"axisTickColor\": \"#6E7079\",\n \"axisLabelShow\": true,\n \"axisLabelColor\": \"#6E7079\",\n \"splitLineShow\": true,\n \"splitLineColor\": [\"#E0E6F1\"],\n \"splitAreaShow\": false,\n \"splitAreaColor\": [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"]\n },\n {\n \"type\": \"category\",\n \"name\": \"类目坐标轴\",\n \"axisLineShow\": true,\n \"axisLineColor\": \"#6E7079\",\n \"axisTickShow\": true,\n \"axisTickColor\": \"#6E7079\",\n \"axisLabelShow\": true,\n \"axisLabelColor\": \"#6E7079\",\n \"splitLineShow\": false,\n \"splitLineColor\": [\"#E0E6F1\"],\n \"splitAreaShow\": false,\n \"splitAreaColor\": [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"]\n },\n {\n \"type\": \"value\",\n \"name\": \"数值坐标轴\",\n \"axisLineShow\": false,\n \"axisLineColor\": \"#6E7079\",\n \"axisTickShow\": false,\n \"axisTickColor\": \"#6E7079\",\n \"axisLabelShow\": true,\n \"axisLabelColor\": \"#6E7079\",\n \"splitLineShow\": true,\n \"splitLineColor\": [\"#E0E6F1\"],\n \"splitAreaShow\": false,\n \"splitAreaColor\": [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"]\n },\n {\n \"type\": \"log\",\n \"name\": \"对数坐标轴\",\n \"axisLineShow\": false,\n \"axisLineColor\": \"#6E7079\",\n \"axisTickShow\": false,\n \"axisTickColor\": \"#6E7079\",\n \"axisLabelShow\": true,\n \"axisLabelColor\": \"#6E7079\",\n \"splitLineShow\": true,\n \"splitLineColor\": [\"#E0E6F1\"],\n \"splitAreaShow\": false,\n \"splitAreaColor\": [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"]\n },\n {\n \"type\": \"time\",\n \"name\": \"时间坐标轴\",\n \"axisLineShow\": true,\n \"axisLineColor\": \"#6E7079\",\n \"axisTickShow\": true,\n \"axisTickColor\": \"#6E7079\",\n \"axisLabelShow\": true,\n \"axisLabelColor\": \"#6E7079\",\n \"splitLineShow\": false,\n \"splitLineColor\": [\"#E0E6F1\"],\n \"splitAreaShow\": false,\n \"splitAreaColor\": [\"rgba(250,250,250,0.2)\", \"rgba(210,219,238,0.2)\"]\n }\n ],\n \"axisSeperateSetting\": true,\n \"toolboxColor\": \"#8d8d8d\",\n \"toolboxEmphasisColor\": \"#1c2024\",\n \"tooltipAxisColor\": \"#cccccc\",\n \"tooltipAxisWidth\": 1,\n \"timelineLineColor\": \"#dae1f5\",\n \"timelineLineWidth\": 2,\n \"timelineItemColor\": \"#a4b1d7\",\n \"timelineItemColorE\": \"#ffffff\",\n \"timelineCheckColor\": \"#316bf3\",\n \"timelineCheckBorderColor\": \"#ffffff\",\n \"timelineItemBorderWidth\": 1,\n \"timelineControlColor\": \"#a4b1d7\",\n \"timelineControlBorderColor\": \"#a4b1d7\",\n \"timelineControlBorderWidth\": 1,\n \"timelineLabelColor\": \"#a4b1d7\"\n }\n}\n","import chartTheme from './chart-theme.json';\n\nexport const EchartDefaultProps = {\n opts: { renderer: 'svg' as const },\n theme: chartTheme,\n option: {\n textStyle: { fontFamily: 'Pretendard Variable' },\n tooltip: { textStyle: { fontSize: 16 } },\n },\n} as const;\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime"]}
@@ -0,0 +1,8 @@
1
+ import { RpReportStep } from '../utils/report-parse.cjs';
2
+
3
+ interface StepRadarProps {
4
+ steps: RpReportStep[];
5
+ }
6
+ declare function StepRadar({ steps }: StepRadarProps): React.ReactElement;
7
+
8
+ export { StepRadar, type StepRadarProps };
@@ -0,0 +1,8 @@
1
+ import { RpReportStep } from '../utils/report-parse.js';
2
+
3
+ interface StepRadarProps {
4
+ steps: RpReportStep[];
5
+ }
6
+ declare function StepRadar({ steps }: StepRadarProps): React.ReactElement;
7
+
8
+ export { StepRadar, type StepRadarProps };
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ StepRadar
4
+ } from "../../../chunk-5QIT4URV.js";
5
+ import "../../../chunk-4YAA25AV.js";
6
+ import "../../../chunk-UXAEOCOH.js";
7
+ import "../../../chunk-PSINRHYW.js";
8
+ import "../../../chunk-WSWSAPSS.js";
9
+ import "../../../chunk-RXK3JM34.js";
10
+ import "../../../chunk-CRTRMMJ7.js";
11
+ export {
12
+ StepRadar
13
+ };
14
+ //# sourceMappingURL=step-radar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}