@tipp/ui 2.9.0 → 2.10.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/app/index.js +17 -17
- package/dist/app/platform/edit-coaching-time.js +17 -17
- package/dist/app/platform/edit-service-type.js +17 -17
- package/dist/app/platform/goal-manage-card-edit.js +17 -17
- package/dist/app/platform/on-offline-radio-card.js +17 -17
- package/dist/app/platform/reservation-card.js +17 -17
- package/dist/app/platform/session-card.js +17 -17
- package/dist/app/roleplay/chart/session-chart.cjs +351 -0
- package/dist/app/roleplay/chart/session-chart.cjs.map +1 -0
- package/dist/app/roleplay/chart/session-chart.d.cts +16 -0
- package/dist/app/roleplay/chart/session-chart.d.ts +16 -0
- package/dist/app/roleplay/chart/session-chart.js +14 -0
- package/dist/app/roleplay/chart/session-chart.js.map +1 -0
- package/dist/app/roleplay/index.cjs +5706 -0
- package/dist/app/roleplay/index.cjs.map +1 -0
- package/dist/app/roleplay/index.d.cts +4 -0
- package/dist/app/roleplay/index.d.ts +4 -0
- package/dist/app/roleplay/index.js +182 -0
- package/dist/app/roleplay/index.js.map +1 -0
- package/dist/app/roleplay/parts/analysis-section.cjs +2178 -0
- package/dist/app/roleplay/parts/analysis-section.cjs.map +1 -0
- package/dist/app/roleplay/parts/analysis-section.d.cts +17 -0
- package/dist/app/roleplay/parts/analysis-section.d.ts +17 -0
- package/dist/app/roleplay/parts/analysis-section.js +97 -0
- package/dist/app/roleplay/parts/analysis-section.js.map +1 -0
- package/dist/app/roleplay/parts/coaching-panel.cjs +2191 -0
- package/dist/app/roleplay/parts/coaching-panel.cjs.map +1 -0
- package/dist/app/roleplay/parts/coaching-panel.d.cts +8 -0
- package/dist/app/roleplay/parts/coaching-panel.d.ts +8 -0
- package/dist/app/roleplay/parts/coaching-panel.js +95 -0
- package/dist/app/roleplay/parts/coaching-panel.js.map +1 -0
- package/dist/app/roleplay/parts/content.cjs +4683 -0
- package/dist/app/roleplay/parts/content.cjs.map +1 -0
- package/dist/app/roleplay/parts/content.d.cts +15 -0
- package/dist/app/roleplay/parts/content.d.ts +15 -0
- package/dist/app/roleplay/parts/content.js +174 -0
- package/dist/app/roleplay/parts/content.js.map +1 -0
- package/dist/app/roleplay/parts/header.cjs +2300 -0
- package/dist/app/roleplay/parts/header.cjs.map +1 -0
- package/dist/app/roleplay/parts/header.d.cts +13 -0
- package/dist/app/roleplay/parts/header.d.ts +13 -0
- package/dist/app/roleplay/parts/header.js +96 -0
- package/dist/app/roleplay/parts/header.js.map +1 -0
- package/dist/app/roleplay/parts/score-summary.cjs +2276 -0
- package/dist/app/roleplay/parts/score-summary.cjs.map +1 -0
- package/dist/app/roleplay/parts/score-summary.d.cts +12 -0
- package/dist/app/roleplay/parts/score-summary.d.ts +12 -0
- package/dist/app/roleplay/parts/score-summary.js +96 -0
- package/dist/app/roleplay/parts/score-summary.js.map +1 -0
- package/dist/app/roleplay/parts/score-trend-section.cjs +3686 -0
- package/dist/app/roleplay/parts/score-trend-section.cjs.map +1 -0
- package/dist/app/roleplay/parts/score-trend-section.d.cts +14 -0
- package/dist/app/roleplay/parts/score-trend-section.d.ts +14 -0
- package/dist/app/roleplay/parts/score-trend-section.js +168 -0
- package/dist/app/roleplay/parts/score-trend-section.js.map +1 -0
- package/dist/app/roleplay/parts/script-transcript.cjs +2288 -0
- package/dist/app/roleplay/parts/script-transcript.cjs.map +1 -0
- package/dist/app/roleplay/parts/script-transcript.d.cts +15 -0
- package/dist/app/roleplay/parts/script-transcript.d.ts +15 -0
- package/dist/app/roleplay/parts/script-transcript.js +96 -0
- package/dist/app/roleplay/parts/script-transcript.js.map +1 -0
- package/dist/app/roleplay/parts/section-nav.cjs +2433 -0
- package/dist/app/roleplay/parts/section-nav.cjs.map +1 -0
- package/dist/app/roleplay/parts/section-nav.d.cts +15 -0
- package/dist/app/roleplay/parts/section-nav.d.ts +15 -0
- package/dist/app/roleplay/parts/section-nav.js +96 -0
- package/dist/app/roleplay/parts/section-nav.js.map +1 -0
- package/dist/app/roleplay/parts/session-replay-dialog.cjs +2598 -0
- package/dist/app/roleplay/parts/session-replay-dialog.cjs.map +1 -0
- package/dist/app/roleplay/parts/session-replay-dialog.d.cts +14 -0
- package/dist/app/roleplay/parts/session-replay-dialog.d.ts +14 -0
- package/dist/app/roleplay/parts/session-replay-dialog.js +97 -0
- package/dist/app/roleplay/parts/session-replay-dialog.js.map +1 -0
- package/dist/app/roleplay/parts/step-detail.cjs +2311 -0
- package/dist/app/roleplay/parts/step-detail.cjs.map +1 -0
- package/dist/app/roleplay/parts/step-detail.d.cts +9 -0
- package/dist/app/roleplay/parts/step-detail.d.ts +9 -0
- package/dist/app/roleplay/parts/step-detail.js +96 -0
- package/dist/app/roleplay/parts/step-detail.js.map +1 -0
- package/dist/app/roleplay/parts/step-radar.cjs +463 -0
- package/dist/app/roleplay/parts/step-radar.cjs.map +1 -0
- package/dist/app/roleplay/parts/step-radar.d.cts +8 -0
- package/dist/app/roleplay/parts/step-radar.d.ts +8 -0
- package/dist/app/roleplay/parts/step-radar.js +14 -0
- package/dist/app/roleplay/parts/step-radar.js.map +1 -0
- package/dist/app/roleplay/parts/step-summary.cjs +2651 -0
- package/dist/app/roleplay/parts/step-summary.cjs.map +1 -0
- package/dist/app/roleplay/parts/step-summary.d.cts +8 -0
- package/dist/app/roleplay/parts/step-summary.d.ts +8 -0
- package/dist/app/roleplay/parts/step-summary.js +101 -0
- package/dist/app/roleplay/parts/step-summary.js.map +1 -0
- package/dist/app/roleplay/rp-session-detail.cjs +5703 -0
- package/dist/app/roleplay/rp-session-detail.cjs.map +1 -0
- package/dist/app/roleplay/rp-session-detail.d.cts +17 -0
- package/dist/app/roleplay/rp-session-detail.d.ts +17 -0
- package/dist/app/roleplay/rp-session-detail.js +179 -0
- package/dist/app/roleplay/rp-session-detail.js.map +1 -0
- package/dist/app/roleplay/types.cjs +19 -0
- package/dist/app/roleplay/types.cjs.map +1 -0
- package/dist/app/roleplay/types.d.cts +42 -0
- package/dist/app/roleplay/types.d.ts +42 -0
- package/dist/app/roleplay/types.js +2 -0
- package/dist/app/roleplay/types.js.map +1 -0
- package/dist/app/roleplay/utils/report-parse.cjs +285 -0
- package/dist/app/roleplay/utils/report-parse.cjs.map +1 -0
- package/dist/app/roleplay/utils/report-parse.d.cts +57 -0
- package/dist/app/roleplay/utils/report-parse.d.ts +57 -0
- package/dist/app/roleplay/utils/report-parse.js +8 -0
- package/dist/app/roleplay/utils/report-parse.js.map +1 -0
- package/dist/app/roleplay/utils/report-parse.test.cjs +491 -0
- package/dist/app/roleplay/utils/report-parse.test.cjs.map +1 -0
- package/dist/app/roleplay/utils/report-parse.test.d.cts +2 -0
- package/dist/app/roleplay/utils/report-parse.test.d.ts +2 -0
- package/dist/app/roleplay/utils/report-parse.test.js +237 -0
- package/dist/app/roleplay/utils/report-parse.test.js.map +1 -0
- package/dist/app/roleplay/utils/session-utils.cjs +204 -0
- package/dist/app/roleplay/utils/session-utils.cjs.map +1 -0
- package/dist/app/roleplay/utils/session-utils.d.cts +38 -0
- package/dist/app/roleplay/utils/session-utils.d.ts +38 -0
- package/dist/app/roleplay/utils/session-utils.js +46 -0
- package/dist/app/roleplay/utils/session-utils.js.map +1 -0
- package/dist/chunk-2TOASXPK.js +131 -0
- package/dist/chunk-2TOASXPK.js.map +1 -0
- package/dist/chunk-3UGBMKSQ.js +166 -0
- package/dist/chunk-3UGBMKSQ.js.map +1 -0
- package/dist/chunk-4YAA25AV.js +161 -0
- package/dist/chunk-4YAA25AV.js.map +1 -0
- package/dist/chunk-5QIT4URV.js +87 -0
- package/dist/chunk-5QIT4URV.js.map +1 -0
- package/dist/chunk-6YIKOYBQ.js +185 -0
- package/dist/chunk-6YIKOYBQ.js.map +1 -0
- package/dist/chunk-7MXY3D3Z.js +84 -0
- package/dist/chunk-7MXY3D3Z.js.map +1 -0
- package/dist/chunk-EBFQFOUQ.js +138 -0
- package/dist/chunk-EBFQFOUQ.js.map +1 -0
- package/dist/chunk-EHDUKUML.js +183 -0
- package/dist/chunk-EHDUKUML.js.map +1 -0
- package/dist/{chunk-NEJCZABQ.js → chunk-FJEDSUGU.js} +7 -7
- package/dist/chunk-GA6W62DO.js +101 -0
- package/dist/chunk-GA6W62DO.js.map +1 -0
- package/dist/chunk-KJPBBBVK.js +142 -0
- package/dist/chunk-KJPBBBVK.js.map +1 -0
- package/dist/{chunk-TQTCT7DC.js → chunk-LRNO4W2P.js} +5 -5
- package/dist/{chunk-6DWUGXSY.js → chunk-N242VJOP.js} +2 -2
- package/dist/chunk-NKW6BO5R.js +264 -0
- package/dist/chunk-NKW6BO5R.js.map +1 -0
- package/dist/{chunk-R5UDNKV2.js → chunk-O332K3SW.js} +2 -2
- package/dist/chunk-OUP3VFXG.js +1 -0
- package/dist/chunk-OUP3VFXG.js.map +1 -0
- package/dist/chunk-QMAINJ4G.js +190 -0
- package/dist/chunk-QMAINJ4G.js.map +1 -0
- package/dist/{chunk-KLJVIEFW.js → chunk-SOKGYD5B.js} +7 -7
- package/dist/chunk-T7LKMJVA.js +142 -0
- package/dist/chunk-T7LKMJVA.js.map +1 -0
- package/dist/chunk-TFJJKM3W.js +261 -0
- package/dist/chunk-TFJJKM3W.js.map +1 -0
- package/dist/{chunk-KQ3ME6XY.js → chunk-U2EAXN3Y.js} +4 -4
- package/dist/chunk-UXAEOCOH.js +150 -0
- package/dist/chunk-UXAEOCOH.js.map +1 -0
- package/dist/chunk-XM4GWPXC.js +236 -0
- package/dist/chunk-XM4GWPXC.js.map +1 -0
- package/dist/index.css +76 -0
- package/dist/index.js +32 -32
- package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.js +5 -5
- package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/review-question-body.js +2 -2
- package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +7 -7
- package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +8 -8
- package/dist/molecules/curriculumV2/CurriculumContents/index.js +9 -9
- package/dist/molecules/curriculumV2/index.js +11 -11
- package/dist/molecules/dynamic-form-editor.js +2 -2
- package/dist/molecules/index.js +29 -29
- package/package.json +28 -2
- package/src/app/roleplay/chart/session-chart.tsx +185 -0
- package/src/app/roleplay/index.ts +8 -0
- package/src/app/roleplay/parts/analysis-section.tsx +98 -0
- package/src/app/roleplay/parts/coaching-panel.tsx +101 -0
- package/src/app/roleplay/parts/content.tsx +146 -0
- package/src/app/roleplay/parts/header.tsx +168 -0
- package/src/app/roleplay/parts/score-summary.tsx +158 -0
- package/src/app/roleplay/parts/score-trend-section.tsx +255 -0
- package/src/app/roleplay/parts/script-transcript.tsx +190 -0
- package/src/app/roleplay/parts/section-nav.tsx +299 -0
- package/src/app/roleplay/parts/session-replay-dialog.tsx +168 -0
- package/src/app/roleplay/parts/step-detail.tsx +173 -0
- package/src/app/roleplay/parts/step-radar.tsx +80 -0
- package/src/app/roleplay/parts/step-summary.tsx +149 -0
- package/src/app/roleplay/rp-session-detail.tsx +176 -0
- package/src/app/roleplay/types.ts +61 -0
- package/src/app/roleplay/utils/report-parse.test.ts +268 -0
- package/src/app/roleplay/utils/report-parse.ts +443 -0
- package/src/app/roleplay/utils/session-utils.ts +215 -0
- package/src/constrant/trainingLog.dummy.json +1 -0
- /package/dist/{chunk-NEJCZABQ.js.map → chunk-FJEDSUGU.js.map} +0 -0
- /package/dist/{chunk-TQTCT7DC.js.map → chunk-LRNO4W2P.js.map} +0 -0
- /package/dist/{chunk-6DWUGXSY.js.map → chunk-N242VJOP.js.map} +0 -0
- /package/dist/{chunk-R5UDNKV2.js.map → chunk-O332K3SW.js.map} +0 -0
- /package/dist/{chunk-KLJVIEFW.js.map → chunk-SOKGYD5B.js.map} +0 -0
- /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,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":[]}
|