@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.
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 +5706 -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 +4683 -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 +3686 -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 +168 -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 +5703 -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-2TOASXPK.js +131 -0
  123. package/dist/chunk-2TOASXPK.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-T7LKMJVA.js +142 -0
  154. package/dist/chunk-T7LKMJVA.js.map +1 -0
  155. package/dist/chunk-TFJJKM3W.js +261 -0
  156. package/dist/chunk-TFJJKM3W.js.map +1 -0
  157. package/dist/{chunk-KQ3ME6XY.js → chunk-U2EAXN3Y.js} +4 -4
  158. package/dist/chunk-UXAEOCOH.js +150 -0
  159. package/dist/chunk-UXAEOCOH.js.map +1 -0
  160. package/dist/chunk-XM4GWPXC.js +236 -0
  161. package/dist/chunk-XM4GWPXC.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 +255 -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,264 @@
1
+ import {
2
+ stepCode,
3
+ stepColor,
4
+ stepGradeLabel,
5
+ stepRatio,
6
+ stepScoreText,
7
+ stepVars
8
+ } from "./chunk-4YAA25AV.js";
9
+ import {
10
+ Progress
11
+ } from "./chunk-TNNF5Q62.js";
12
+ import {
13
+ Box
14
+ } from "./chunk-4Y5BEXVN.js";
15
+ import {
16
+ Typo
17
+ } from "./chunk-L4QQGIYQ.js";
18
+ import {
19
+ Flex
20
+ } from "./chunk-25HMMI7R.js";
21
+
22
+ // src/app/roleplay/parts/section-nav.tsx
23
+ import { useEffect, useState } from "react";
24
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
25
+ var NAV_ICONS = {
26
+ "score-summary": /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx("path", { d: "m12 14 4-4" }),
28
+ /* @__PURE__ */ jsx("path", { d: "M3.34 19a10 10 0 1 1 17.32 0" })
29
+ ] }),
30
+ strengths: /* @__PURE__ */ jsx("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" }),
31
+ improvements: /* @__PURE__ */ jsxs(Fragment, { children: [
32
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" }),
33
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "5" }),
34
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "1.5" })
35
+ ] }),
36
+ "score-trend": /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ /* @__PURE__ */ jsx("path", { d: "M3 3v18h18" }),
38
+ /* @__PURE__ */ jsx("path", { d: "m19 8-5 5-4-4-4 4" })
39
+ ] }),
40
+ "step-summary": /* @__PURE__ */ jsx("path", { d: "M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z" }),
41
+ "step-detail": /* @__PURE__ */ jsxs(Fragment, { children: [
42
+ /* @__PURE__ */ jsx("line", { x1: "8", x2: "21", y1: "6", y2: "6" }),
43
+ /* @__PURE__ */ jsx("line", { x1: "8", x2: "21", y1: "12", y2: "12" }),
44
+ /* @__PURE__ */ jsx("line", { x1: "8", x2: "21", y1: "18", y2: "18" }),
45
+ /* @__PURE__ */ jsx("path", { d: "M3 6h.01M3 12h.01M3 18h.01" })
46
+ ] }),
47
+ coaching: /* @__PURE__ */ jsx("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" })
48
+ };
49
+ function NavIcon({ children }) {
50
+ return /* @__PURE__ */ jsx(
51
+ "svg",
52
+ {
53
+ "aria-hidden": "true",
54
+ fill: "none",
55
+ height: "13",
56
+ stroke: "currentColor",
57
+ strokeLinecap: "round",
58
+ strokeLinejoin: "round",
59
+ strokeWidth: "1.8",
60
+ style: { flexShrink: 0 },
61
+ viewBox: "0 0 24 24",
62
+ width: "13",
63
+ children
64
+ }
65
+ );
66
+ }
67
+ function StepMetricBadge({ step }) {
68
+ const scoreText = stepScoreText(step);
69
+ if (scoreText !== null) {
70
+ return /* @__PURE__ */ jsx(
71
+ Typo,
72
+ {
73
+ as: "span",
74
+ mono: true,
75
+ style: { flexShrink: 0, color: "var(--gray-11)" },
76
+ variant: "body",
77
+ weight: "medium",
78
+ children: scoreText
79
+ }
80
+ );
81
+ }
82
+ const gradeLabel = stepGradeLabel(step);
83
+ if (gradeLabel !== null) {
84
+ return /* @__PURE__ */ jsx(
85
+ Typo,
86
+ {
87
+ as: "span",
88
+ mono: true,
89
+ style: { flexShrink: 0, color: stepVars(step).fg },
90
+ variant: "body",
91
+ weight: "medium",
92
+ children: gradeLabel
93
+ }
94
+ );
95
+ }
96
+ return null;
97
+ }
98
+ function useScrollSpy(ids) {
99
+ const [activeId, setActiveId] = useState(null);
100
+ const watchKey = ids.join(",");
101
+ useEffect(() => {
102
+ const els = ids.map((id) => document.getElementById(id)).filter((el) => el !== null);
103
+ if (els.length === 0) return;
104
+ const observer = new IntersectionObserver(
105
+ (entries) => {
106
+ const visible = entries.filter((e) => e.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);
107
+ if (visible[0]) setActiveId(visible[0].target.id);
108
+ },
109
+ { rootMargin: "0px 0px -72% 0px", threshold: 0 }
110
+ );
111
+ els.forEach((el) => {
112
+ observer.observe(el);
113
+ });
114
+ return () => {
115
+ observer.disconnect();
116
+ };
117
+ }, [watchKey]);
118
+ return activeId;
119
+ }
120
+ function scrollToId(id) {
121
+ var _a;
122
+ (_a = document.getElementById(id)) == null ? void 0 : _a.scrollIntoView({ behavior: "smooth", block: "start" });
123
+ }
124
+ function SectionNav({ items, steps }) {
125
+ const activeId = useScrollSpy(items.map((i) => i.id));
126
+ const stepDetailActive = activeId === "step-summary" || activeId === "step-detail";
127
+ return /* @__PURE__ */ jsx(Box, { asChild: true, className: "rp-section-nav", children: /* @__PURE__ */ jsx("aside", { children: /* @__PURE__ */ jsxs(Box, { children: [
128
+ /* @__PURE__ */ jsx(
129
+ Typo,
130
+ {
131
+ as: "p",
132
+ color: "gray",
133
+ style: {
134
+ paddingLeft: "calc(var(--space-3) + 2px)",
135
+ paddingBottom: "var(--space-1)"
136
+ },
137
+ variant: "body",
138
+ weight: "medium",
139
+ children: "\uBAA9\uCC28"
140
+ }
141
+ ),
142
+ /* @__PURE__ */ jsx(Box, { asChild: true, children: /* @__PURE__ */ jsx("ul", { style: { listStyle: "none", margin: 0, padding: 0 }, children: items.map((item) => {
143
+ const active = activeId === item.id;
144
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
145
+ "button",
146
+ {
147
+ "aria-current": active ? "true" : void 0,
148
+ className: "rp-nav-btn",
149
+ onClick: () => {
150
+ scrollToId(item.id);
151
+ },
152
+ style: active ? {
153
+ borderLeftColor: "var(--accent-9)",
154
+ background: "var(--accent-a2)"
155
+ } : void 0,
156
+ type: "button",
157
+ children: [
158
+ /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", style: { minWidth: 0 }, children: [
159
+ NAV_ICONS[item.id] ? /* @__PURE__ */ jsx(NavIcon, { children: NAV_ICONS[item.id] }) : null,
160
+ /* @__PURE__ */ jsx(
161
+ Typo,
162
+ {
163
+ as: "span",
164
+ truncate: true,
165
+ variant: "body",
166
+ weight: active ? "medium" : "regular",
167
+ children: item.label
168
+ }
169
+ )
170
+ ] }),
171
+ typeof item.score === "number" ? /* @__PURE__ */ jsxs(Typo, { as: "span", mono: true, style: { flexShrink: 0 }, variant: "body", children: [
172
+ /* @__PURE__ */ jsx(
173
+ Typo,
174
+ {
175
+ as: "span",
176
+ style: {
177
+ color: active ? "var(--gray-12)" : "var(--gray-11)"
178
+ },
179
+ variant: "body",
180
+ weight: "medium",
181
+ children: item.score
182
+ }
183
+ ),
184
+ /* @__PURE__ */ jsxs(Typo, { as: "span", style: { color: "var(--gray-9)" }, variant: "body", children: [
185
+ "/",
186
+ item.max
187
+ ] })
188
+ ] }) : null
189
+ ]
190
+ }
191
+ ) }, item.id);
192
+ }) }) }),
193
+ steps.length > 0 && /* @__PURE__ */ jsxs(Box, { mt: "3", pt: "3", style: { borderTop: "1px solid var(--gray-4)" }, children: [
194
+ /* @__PURE__ */ jsx(Box, { pb: "1", px: "3", children: /* @__PURE__ */ jsx(
195
+ Typo,
196
+ {
197
+ as: "span",
198
+ style: {
199
+ color: stepDetailActive ? "var(--gray-12)" : "var(--gray-10)"
200
+ },
201
+ variant: "body",
202
+ weight: "medium",
203
+ children: "\uB2E8\uACC4\uBCC4 \uC810\uC218"
204
+ }
205
+ ) }),
206
+ /* @__PURE__ */ jsx(Box, { asChild: true, children: /* @__PURE__ */ jsx("ul", { style: { listStyle: "none", margin: 0, padding: 0 }, children: steps.map((step) => {
207
+ const ratio = stepRatio(step);
208
+ return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
209
+ "button",
210
+ {
211
+ className: "rp-jump-btn",
212
+ onClick: () => {
213
+ scrollToId(`step-${step.key}`);
214
+ },
215
+ type: "button",
216
+ children: [
217
+ /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", justify: "between", children: [
218
+ /* @__PURE__ */ jsxs(
219
+ Typo,
220
+ {
221
+ as: "span",
222
+ style: { minWidth: 0 },
223
+ truncate: true,
224
+ variant: "body",
225
+ children: [
226
+ /* @__PURE__ */ jsx(
227
+ Typo,
228
+ {
229
+ as: "span",
230
+ mono: true,
231
+ style: { color: "var(--gray-11)" },
232
+ variant: "body",
233
+ weight: "medium",
234
+ children: stepCode(step)
235
+ }
236
+ ),
237
+ " ",
238
+ /* @__PURE__ */ jsx(
239
+ Typo,
240
+ {
241
+ as: "span",
242
+ style: { color: "var(--gray-9)" },
243
+ variant: "body",
244
+ children: step.label
245
+ }
246
+ )
247
+ ]
248
+ }
249
+ ),
250
+ /* @__PURE__ */ jsx(StepMetricBadge, { step })
251
+ ] }),
252
+ ratio !== null ? /* @__PURE__ */ jsx(Box, { mt: "1", children: /* @__PURE__ */ jsx(Progress, { color: stepColor(step), size: "1", value: ratio * 100 }) }) : null
253
+ ]
254
+ }
255
+ ) }, step.key);
256
+ }) }) })
257
+ ] })
258
+ ] }) }) });
259
+ }
260
+
261
+ export {
262
+ SectionNav
263
+ };
264
+ //# sourceMappingURL=chunk-NKW6BO5R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/roleplay/parts/section-nav.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport { Box, Flex, Progress, Typo } from '../../../atoms';\nimport type { RpReportStep } from '../utils/report-parse';\nimport {\n stepCode,\n stepColor,\n stepGradeLabel,\n stepRatio,\n stepScoreText,\n stepVars,\n} from '../utils/session-utils';\n\nexport interface SectionNavItem {\n id: string;\n label: string;\n score?: number | null;\n max?: number;\n}\n\nexport interface SectionNavProps {\n items: SectionNavItem[];\n steps: RpReportStep[];\n}\n\nconst NAV_ICONS: Record<string, React.ReactNode> = {\n 'score-summary': (\n <>\n <path d=\"m12 14 4-4\" />\n <path d=\"M3.34 19a10 10 0 1 1 17.32 0\" />\n </>\n ),\n strengths: (\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n ),\n improvements: (\n <>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.5\" />\n </>\n ),\n 'score-trend': (\n <>\n <path d=\"M3 3v18h18\" />\n <path d=\"m19 8-5 5-4-4-4 4\" />\n </>\n ),\n 'step-summary': (\n <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n ),\n 'step-detail': (\n <>\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <path d=\"M3 6h.01M3 12h.01M3 18h.01\" />\n </>\n ),\n coaching: <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />,\n};\n\nfunction NavIcon({ children }: { children: React.ReactNode }): React.ReactElement {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"13\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.8\"\n style={{ flexShrink: 0 }}\n viewBox=\"0 0 24 24\"\n width=\"13\"\n >\n {children}\n </svg>\n );\n}\n\nfunction StepMetricBadge({ step }: { step: RpReportStep }): React.ReactElement | null {\n const scoreText = stepScoreText(step);\n if (scoreText !== null) {\n return (\n <Typo\n as=\"span\"\n mono\n style={{ flexShrink: 0, color: 'var(--gray-11)' }}\n variant=\"body\"\n weight=\"medium\"\n >\n {scoreText}\n </Typo>\n );\n }\n const gradeLabel = stepGradeLabel(step);\n if (gradeLabel !== null) {\n return (\n <Typo\n as=\"span\"\n mono\n style={{ flexShrink: 0, color: stepVars(step).fg }}\n variant=\"body\"\n weight=\"medium\"\n >\n {gradeLabel}\n </Typo>\n );\n }\n return null;\n}\n\nfunction useScrollSpy(ids: string[]): string | null {\n const [activeId, setActiveId] = useState<string | null>(null);\n const watchKey = ids.join(',');\n\n useEffect(() => {\n const els = ids\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n if (els.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\n if (visible[0]) setActiveId(visible[0].target.id);\n },\n { rootMargin: '0px 0px -72% 0px', threshold: 0 }\n );\n els.forEach((el) => {\n observer.observe(el);\n });\n return () => {\n observer.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- watchKey가 ids 변경을 대표한다\n }, [watchKey]);\n\n return activeId;\n}\n\nfunction scrollToId(id: string): void {\n document.getElementById(id)?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n}\n\nexport function SectionNav({ items, steps }: SectionNavProps): React.ReactElement {\n const activeId = useScrollSpy(items.map((i) => i.id));\n const stepDetailActive = activeId === 'step-summary' || activeId === 'step-detail';\n\n return (\n <Box asChild className=\"rp-section-nav\">\n <aside>\n <Box>\n <Typo\n as=\"p\"\n color=\"gray\"\n style={{\n paddingLeft: 'calc(var(--space-3) + 2px)',\n paddingBottom: 'var(--space-1)',\n }}\n variant=\"body\"\n weight=\"medium\"\n >\n 목차\n </Typo>\n <Box asChild>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {items.map((item) => {\n const active = activeId === item.id;\n return (\n <li key={item.id}>\n <button\n aria-current={active ? 'true' : undefined}\n className=\"rp-nav-btn\"\n onClick={() => {\n scrollToId(item.id);\n }}\n style={\n active\n ? {\n borderLeftColor: 'var(--accent-9)',\n background: 'var(--accent-a2)',\n }\n : undefined\n }\n type=\"button\"\n >\n <Flex align=\"center\" gap=\"2\" style={{ minWidth: 0 }}>\n {NAV_ICONS[item.id] ? (\n <NavIcon>{NAV_ICONS[item.id]}</NavIcon>\n ) : null}\n <Typo\n as=\"span\"\n truncate\n variant=\"body\"\n weight={active ? 'medium' : 'regular'}\n >\n {item.label}\n </Typo>\n </Flex>\n {typeof item.score === 'number' ? (\n <Typo as=\"span\" mono style={{ flexShrink: 0 }} variant=\"body\">\n <Typo\n as=\"span\"\n style={{\n color: active ? 'var(--gray-12)' : 'var(--gray-11)',\n }}\n variant=\"body\"\n weight=\"medium\"\n >\n {item.score}\n </Typo>\n <Typo as=\"span\" style={{ color: 'var(--gray-9)' }} variant=\"body\">\n /{item.max}\n </Typo>\n </Typo>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n </Box>\n\n {steps.length > 0 && (\n <Box mt=\"3\" pt=\"3\" style={{ borderTop: '1px solid var(--gray-4)' }}>\n <Box pb=\"1\" px=\"3\">\n <Typo\n as=\"span\"\n style={{\n color: stepDetailActive ? 'var(--gray-12)' : 'var(--gray-10)',\n }}\n variant=\"body\"\n weight=\"medium\"\n >\n 단계별 점수\n </Typo>\n </Box>\n <Box asChild>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {steps.map((step) => {\n const ratio = stepRatio(step);\n return (\n <li key={step.key}>\n <button\n className=\"rp-jump-btn\"\n onClick={() => {\n scrollToId(`step-${step.key}`);\n }}\n type=\"button\"\n >\n <Flex align=\"center\" gap=\"2\" justify=\"between\">\n <Typo\n as=\"span\"\n style={{ minWidth: 0 }}\n truncate\n variant=\"body\"\n >\n <Typo\n as=\"span\"\n mono\n style={{ color: 'var(--gray-11)' }}\n variant=\"body\"\n weight=\"medium\"\n >\n {stepCode(step)}\n </Typo>{' '}\n <Typo\n as=\"span\"\n style={{ color: 'var(--gray-9)' }}\n variant=\"body\"\n >\n {step.label}\n </Typo>\n </Typo>\n <StepMetricBadge step={step} />\n </Flex>\n {ratio !== null ? (\n <Box mt=\"1\">\n <Progress color={stepColor(step)} size=\"1\" value={ratio * 100} />\n </Box>\n ) : null}\n </button>\n </li>\n );\n })}\n </ul>\n </Box>\n </Box>\n )}\n </Box>\n </aside>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CurriculumReviewSteps_default
3
- } from "./chunk-TQTCT7DC.js";
3
+ } from "./chunk-LRNO4W2P.js";
4
4
  import {
5
5
  useCurriculumContext
6
6
  } from "./chunk-WA5A2GB4.js";
@@ -193,4 +193,4 @@ var curriculum_review_default = CurriculumReview;
193
193
  export {
194
194
  curriculum_review_default
195
195
  };
196
- //# sourceMappingURL=chunk-R5UDNKV2.js.map
196
+ //# sourceMappingURL=chunk-O332K3SW.js.map
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-OUP3VFXG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,190 @@
1
+ import {
2
+ formatDate,
3
+ formatDuration,
4
+ statusLabelOf
5
+ } from "./chunk-4YAA25AV.js";
6
+ import {
7
+ Heading
8
+ } from "./chunk-USGOLLYO.js";
9
+ import {
10
+ Box
11
+ } from "./chunk-4Y5BEXVN.js";
12
+ import {
13
+ Typo
14
+ } from "./chunk-L4QQGIYQ.js";
15
+ import {
16
+ Flex
17
+ } from "./chunk-25HMMI7R.js";
18
+ import {
19
+ Button
20
+ } from "./chunk-2LCH3PDF.js";
21
+ import {
22
+ Badge
23
+ } from "./chunk-BK74U562.js";
24
+
25
+ // src/app/roleplay/parts/header.tsx
26
+ import { jsx, jsxs } from "react/jsx-runtime";
27
+ function PdfIcon() {
28
+ return /* @__PURE__ */ jsxs(
29
+ "svg",
30
+ {
31
+ "aria-hidden": "true",
32
+ fill: "none",
33
+ height: "13",
34
+ stroke: "currentColor",
35
+ strokeLinecap: "round",
36
+ strokeLinejoin: "round",
37
+ strokeWidth: "2",
38
+ viewBox: "0 0 24 24",
39
+ width: "13",
40
+ children: [
41
+ /* @__PURE__ */ jsx("path", { d: "M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z" }),
42
+ /* @__PURE__ */ jsx("path", { d: "M14 3v5h5" }),
43
+ /* @__PURE__ */ jsx("path", { d: "M12 12v5" }),
44
+ /* @__PURE__ */ jsx("path", { d: "M9.5 14.5 12 17l2.5-2.5" })
45
+ ]
46
+ }
47
+ );
48
+ }
49
+ function VideoIcon() {
50
+ return /* @__PURE__ */ jsxs(
51
+ "svg",
52
+ {
53
+ "aria-hidden": "true",
54
+ fill: "none",
55
+ height: "13",
56
+ stroke: "currentColor",
57
+ strokeLinecap: "round",
58
+ strokeLinejoin: "round",
59
+ strokeWidth: "2",
60
+ viewBox: "0 0 24 24",
61
+ width: "13",
62
+ children: [
63
+ /* @__PURE__ */ jsx("rect", { height: "12", rx: "2", width: "13", x: "2", y: "6" }),
64
+ /* @__PURE__ */ jsx("path", { d: "m15 10 6-3v10l-6-3z" })
65
+ ]
66
+ }
67
+ );
68
+ }
69
+ function Header({
70
+ detail,
71
+ hasScript,
72
+ onOpenReplay,
73
+ onResolveMediaUrl
74
+ }) {
75
+ var _a;
76
+ const pdfHref = detail.trainingLogURL;
77
+ const hasReplayMedia = Boolean(
78
+ detail.trainingVideoURL || detail.trainingAudioURL
79
+ );
80
+ const handlePdfClick = () => {
81
+ if (!pdfHref || !onResolveMediaUrl) return;
82
+ void Promise.resolve(
83
+ onResolveMediaUrl(pdfHref, { disposition: "attachment" })
84
+ ).then((url) => {
85
+ window.open(url, "_blank");
86
+ });
87
+ };
88
+ const replayActive = hasScript && hasReplayMedia;
89
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
90
+ Flex,
91
+ {
92
+ align: { md: "start" },
93
+ direction: { initial: "column", md: "row" },
94
+ gap: "4",
95
+ justify: "between",
96
+ children: [
97
+ /* @__PURE__ */ jsxs(Box, { style: { minWidth: 0 }, children: [
98
+ /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "2", mb: "2", wrap: "wrap", children: [
99
+ /* @__PURE__ */ jsx(Badge, { color: "neutral", size: "small", variant: "soft", children: statusLabelOf(detail.status) }),
100
+ /* @__PURE__ */ jsxs(Typo, { as: "span", style: { color: "var(--gray-11)" }, variant: "body", children: [
101
+ detail.trainingSessionNum,
102
+ "\uD68C\uCC28",
103
+ detail.characterTitle ? ` \xB7 ${detail.characterTitle}` : ""
104
+ ] })
105
+ ] }),
106
+ /* @__PURE__ */ jsx(
107
+ Heading,
108
+ {
109
+ size: { initial: "5", md: "7" },
110
+ style: { textWrap: "balance" },
111
+ weight: "bold",
112
+ children: (_a = detail.scenarioTitle) != null ? _a : "\uB864\uD50C\uB808\uC789 \uC138\uC158"
113
+ }
114
+ ),
115
+ /* @__PURE__ */ jsxs(Typo, { as: "p", color: "gray", mono: true, mt: "1", variant: "body", children: [
116
+ formatDate(detail.createdAt),
117
+ " \xB7 ",
118
+ formatDuration(detail.trainingTime)
119
+ ] })
120
+ ] }),
121
+ /* @__PURE__ */ jsxs(
122
+ Flex,
123
+ {
124
+ gap: "2",
125
+ justify: { initial: "start", md: "end" },
126
+ style: { flexShrink: 0 },
127
+ wrap: "wrap",
128
+ children: [
129
+ onResolveMediaUrl ? /* @__PURE__ */ jsxs(
130
+ Button,
131
+ {
132
+ color: "gray",
133
+ disabled: !pdfHref,
134
+ onClick: pdfHref ? handlePdfClick : void 0,
135
+ size: { initial: "small", md: "medium" },
136
+ title: pdfHref ? void 0 : "\uC0B0\uCD9C\uBB3C \uC5C6\uC74C",
137
+ type: "button",
138
+ variant: "outline",
139
+ children: [
140
+ /* @__PURE__ */ jsx(PdfIcon, {}),
141
+ /* @__PURE__ */ jsx("span", { style: { whiteSpace: "nowrap" }, children: "PDF \uB2E4\uC6B4\uB85C\uB4DC" })
142
+ ]
143
+ }
144
+ ) : /* @__PURE__ */ jsx(
145
+ Button,
146
+ {
147
+ asChild: Boolean(pdfHref),
148
+ color: "gray",
149
+ disabled: !pdfHref,
150
+ size: { initial: "small", md: "medium" },
151
+ title: pdfHref ? void 0 : "\uC0B0\uCD9C\uBB3C \uC5C6\uC74C",
152
+ type: "button",
153
+ variant: "outline",
154
+ children: pdfHref ? /* @__PURE__ */ jsxs("a", { href: pdfHref, rel: "noopener noreferrer", target: "_blank", children: [
155
+ /* @__PURE__ */ jsx(PdfIcon, {}),
156
+ /* @__PURE__ */ jsx("span", { style: { whiteSpace: "nowrap" }, children: "PDF \uB2E4\uC6B4\uB85C\uB4DC" })
157
+ ] }) : /* @__PURE__ */ jsxs("span", { children: [
158
+ /* @__PURE__ */ jsx(PdfIcon, {}),
159
+ /* @__PURE__ */ jsx("span", { style: { whiteSpace: "nowrap" }, children: "PDF \uB2E4\uC6B4\uB85C\uB4DC" })
160
+ ] })
161
+ }
162
+ ),
163
+ hasScript ? /* @__PURE__ */ jsxs(
164
+ Button,
165
+ {
166
+ color: "gray",
167
+ disabled: !replayActive,
168
+ onClick: onOpenReplay,
169
+ size: { initial: "small", md: "medium" },
170
+ title: replayActive ? void 0 : "\uB2E4\uC2DC\uBCF4\uAE30 \uC5C6\uC74C",
171
+ type: "button",
172
+ variant: "outline",
173
+ children: [
174
+ /* @__PURE__ */ jsx(VideoIcon, {}),
175
+ /* @__PURE__ */ jsx("span", { style: { whiteSpace: "nowrap" }, children: "\uC601\uC0C1" })
176
+ ]
177
+ }
178
+ ) : null
179
+ ]
180
+ }
181
+ )
182
+ ]
183
+ }
184
+ ) });
185
+ }
186
+
187
+ export {
188
+ Header
189
+ };
190
+ //# sourceMappingURL=chunk-QMAINJ4G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/roleplay/parts/header.tsx"],"sourcesContent":["'use client';\n\nimport { Badge, Box, Button, Flex, Heading, Typo } from '../../../atoms';\nimport type { RpSessionDetailData } from '../types';\nimport { formatDate, formatDuration, statusLabelOf } from '../utils/session-utils';\n\nexport interface HeaderProps {\n detail: RpSessionDetailData;\n hasScript: boolean;\n onOpenReplay: () => void;\n onResolveMediaUrl?: (\n rawUrl: string,\n options: { disposition: 'inline' | 'attachment' }\n ) => string | Promise<string>;\n}\n\nfunction PdfIcon(): React.ReactElement {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"13\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"13\"\n >\n <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" />\n <path d=\"M14 3v5h5\" />\n <path d=\"M12 12v5\" />\n <path d=\"M9.5 14.5 12 17l2.5-2.5\" />\n </svg>\n );\n}\n\nfunction VideoIcon(): React.ReactElement {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n height=\"13\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n viewBox=\"0 0 24 24\"\n width=\"13\"\n >\n <rect height=\"12\" rx=\"2\" width=\"13\" x=\"2\" y=\"6\" />\n <path d=\"m15 10 6-3v10l-6-3z\" />\n </svg>\n );\n}\n\nexport function Header({\n detail,\n hasScript,\n onOpenReplay,\n onResolveMediaUrl,\n}: HeaderProps): React.ReactElement {\n const pdfHref = detail.trainingLogURL;\n const hasReplayMedia = Boolean(\n detail.trainingVideoURL || detail.trainingAudioURL\n );\n\n const handlePdfClick = (): void => {\n if (!pdfHref || !onResolveMediaUrl) return;\n void Promise.resolve(\n onResolveMediaUrl(pdfHref, { disposition: 'attachment' })\n ).then((url) => {\n window.open(url, '_blank');\n });\n };\n\n const replayActive = hasScript && hasReplayMedia;\n\n return (\n <Box>\n <Flex\n align={{ md: 'start' }}\n direction={{ initial: 'column', md: 'row' }}\n gap=\"4\"\n justify=\"between\"\n >\n <Box style={{ minWidth: 0 }}>\n <Flex align=\"center\" gap=\"2\" mb=\"2\" wrap=\"wrap\">\n <Badge color=\"neutral\" size=\"small\" variant=\"soft\">\n {statusLabelOf(detail.status)}\n </Badge>\n <Typo as=\"span\" style={{ color: 'var(--gray-11)' }} variant=\"body\">\n {detail.trainingSessionNum}회차\n {detail.characterTitle ? ` · ${detail.characterTitle}` : ''}\n </Typo>\n </Flex>\n <Heading\n size={{ initial: '5', md: '7' }}\n style={{ textWrap: 'balance' }}\n weight=\"bold\"\n >\n {detail.scenarioTitle ?? '롤플레잉 세션'}\n </Heading>\n <Typo as=\"p\" color=\"gray\" mono mt=\"1\" variant=\"body\">\n {formatDate(detail.createdAt)} · {formatDuration(detail.trainingTime)}\n </Typo>\n </Box>\n <Flex\n gap=\"2\"\n justify={{ initial: 'start', md: 'end' }}\n style={{ flexShrink: 0 }}\n wrap=\"wrap\"\n >\n {onResolveMediaUrl ? (\n <Button\n color=\"gray\"\n disabled={!pdfHref}\n onClick={pdfHref ? handlePdfClick : undefined}\n size={{ initial: 'small', md: 'medium' }}\n title={pdfHref ? undefined : '산출물 없음'}\n type=\"button\"\n variant=\"outline\"\n >\n <PdfIcon />\n <span style={{ whiteSpace: 'nowrap' }}>PDF 다운로드</span>\n </Button>\n ) : (\n <Button\n asChild={Boolean(pdfHref)}\n color=\"gray\"\n disabled={!pdfHref}\n size={{ initial: 'small', md: 'medium' }}\n title={pdfHref ? undefined : '산출물 없음'}\n type=\"button\"\n variant=\"outline\"\n >\n {pdfHref ? (\n <a href={pdfHref} rel=\"noopener noreferrer\" target=\"_blank\">\n <PdfIcon />\n <span style={{ whiteSpace: 'nowrap' }}>PDF 다운로드</span>\n </a>\n ) : (\n <span>\n <PdfIcon />\n <span style={{ whiteSpace: 'nowrap' }}>PDF 다운로드</span>\n </span>\n )}\n </Button>\n )}\n {hasScript ? (\n <Button\n color=\"gray\"\n disabled={!replayActive}\n onClick={onOpenReplay}\n size={{ initial: 'small', md: 'medium' }}\n title={replayActive ? undefined : '다시보기 없음'}\n type=\"button\"\n variant=\"outline\"\n >\n <VideoIcon />\n <span style={{ whiteSpace: 'nowrap' }}>영상</span>\n </Button>\n ) : null}\n </Flex>\n </Flex>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,15 +1,15 @@
1
+ import {
2
+ review_question_body_default
3
+ } from "./chunk-U2EAXN3Y.js";
4
+ import {
5
+ review_question_footer_default
6
+ } from "./chunk-GE4M5GOQ.js";
1
7
  import {
2
8
  review_question_header_default
3
9
  } from "./chunk-G3KQN32M.js";
4
10
  import {
5
11
  review_question_layout_default
6
12
  } from "./chunk-VK6INFSB.js";
7
- import {
8
- review_question_body_default
9
- } from "./chunk-KQ3ME6XY.js";
10
- import {
11
- review_question_footer_default
12
- } from "./chunk-GE4M5GOQ.js";
13
13
 
14
14
  // src/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/ReviewQuestion/index.tsx
15
15
  import { jsx } from "react/jsx-runtime";
@@ -60,4 +60,4 @@ var ReviewQuestion_default = ReviewQuestion;
60
60
  export {
61
61
  ReviewQuestion_default
62
62
  };
63
- //# sourceMappingURL=chunk-KLJVIEFW.js.map
63
+ //# sourceMappingURL=chunk-SOKGYD5B.js.map