@cuemath/leap 3.2.1-pd-1 → 3.2.1-ppa-0.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 (72) hide show
  1. package/dist/assets/illustrations/illustrations.js +0 -1
  2. package/dist/assets/illustrations/illustrations.js.map +1 -1
  3. package/dist/assets/line-icons/icons/hint-fill.js +35 -0
  4. package/dist/assets/line-icons/icons/hint-fill.js.map +1 -0
  5. package/dist/assets/lottie/lottie.js +0 -6
  6. package/dist/assets/lottie/lottie.js.map +1 -1
  7. package/dist/features/communication/pub-sub/constants.js +4 -7
  8. package/dist/features/communication/pub-sub/constants.js.map +1 -1
  9. package/dist/features/homework/homework-card-view.js +100 -87
  10. package/dist/features/homework/homework-card-view.js.map +1 -1
  11. package/dist/features/puzzles/app/puzzle-app-styled.js +115 -0
  12. package/dist/features/puzzles/app/puzzle-app-styled.js.map +1 -0
  13. package/dist/features/puzzles/app/puzzle-app-view.js +116 -0
  14. package/dist/features/puzzles/app/puzzle-app-view.js.map +1 -0
  15. package/dist/features/puzzles/app/puzzle-app.js +63 -0
  16. package/dist/features/puzzles/app/puzzle-app.js.map +1 -0
  17. package/dist/features/puzzles/comps/puzzle-card-styled.js +69 -24
  18. package/dist/features/puzzles/comps/puzzle-card-styled.js.map +1 -1
  19. package/dist/features/puzzles/comps/puzzle-card.js +30 -53
  20. package/dist/features/puzzles/comps/puzzle-card.js.map +1 -1
  21. package/dist/features/puzzles/puzzle-container/puzzle-container-styled.js +25 -55
  22. package/dist/features/puzzles/puzzle-container/puzzle-container-styled.js.map +1 -1
  23. package/dist/features/puzzles/puzzle-container/puzzle-container.js +107 -89
  24. package/dist/features/puzzles/puzzle-container/puzzle-container.js.map +1 -1
  25. package/dist/features/puzzles/utils/puzzle-pattern.js +13 -28
  26. package/dist/features/puzzles/utils/puzzle-pattern.js.map +1 -1
  27. package/dist/features/worksheet/worksheet/worksheet-helpers.js +19 -20
  28. package/dist/features/worksheet/worksheet/worksheet-helpers.js.map +1 -1
  29. package/dist/features/worksheet/worksheet/worksheet-question/learnosity-question.js +25 -29
  30. package/dist/features/worksheet/worksheet/worksheet-question/learnosity-question.js.map +1 -1
  31. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question-styled.js +47 -97
  32. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question-styled.js.map +1 -1
  33. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js +163 -166
  34. package/dist/features/worksheet/worksheet/worksheet-question/worksheet-question.js.map +1 -1
  35. package/dist/features/worksheet/worksheet/worksheet-styled.js +34 -34
  36. package/dist/features/worksheet/worksheet/worksheet-styled.js.map +1 -1
  37. package/dist/features/worksheet/worksheet/worksheet.js +309 -303
  38. package/dist/features/worksheet/worksheet/worksheet.js.map +1 -1
  39. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js +1 -1
  40. package/dist/features/worksheet/worksheet-preview/hooks/use-worksheet-layout.js.map +1 -1
  41. package/dist/features/worksheet/worksheet-preview/worksheet-preview.js +16 -17
  42. package/dist/features/worksheet/worksheet-preview/worksheet-preview.js.map +1 -1
  43. package/dist/index.d.ts +18 -34
  44. package/dist/index.js +523 -521
  45. package/dist/index.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/features/puzzles/api/puzzle-dashboard.js +0 -10
  48. package/dist/features/puzzles/api/puzzle-dashboard.js.map +0 -1
  49. package/dist/features/puzzles/constants/puzzle-container.js +0 -8
  50. package/dist/features/puzzles/constants/puzzle-container.js.map +0 -1
  51. package/dist/features/puzzles/puzzle-container/puzzle-container-view.js +0 -45
  52. package/dist/features/puzzles/puzzle-container/puzzle-container-view.js.map +0 -1
  53. package/dist/features/puzzles/puzzle-dashboard/puzzle-dashboard-styled.js +0 -30
  54. package/dist/features/puzzles/puzzle-dashboard/puzzle-dashboard-styled.js.map +0 -1
  55. package/dist/features/puzzles/puzzle-dashboard/puzzle-dashboard.js +0 -84
  56. package/dist/features/puzzles/puzzle-dashboard/puzzle-dashboard.js.map +0 -1
  57. package/dist/static/arm-mechanical.7561628e.json +0 -4428
  58. package/dist/static/cent-emoji.3a07ef13.json +0 -5576
  59. package/dist/static/clap-emoji.aa0b824b.json +0 -12684
  60. package/dist/static/gem-stone.8c91431a.json +0 -6716
  61. package/dist/static/partyball.e19caed6.json +0 -11578
  62. package/dist/static/partypopper.9f7992e8.json +0 -6416
  63. package/dist/static/puzzle-blue-lottie.7017e2e8.json +0 -1
  64. package/dist/static/puzzle-blue-lottie.bf64ebc5.json +0 -12760
  65. package/dist/static/puzzle-dashboard-banner.b7956519.svg +0 -1
  66. package/dist/static/puzzle-green-lottie.1da90698.json +0 -1
  67. package/dist/static/puzzle-orange-lottie.cfcf3724.json +0 -1
  68. package/dist/static/puzzle-purple-lottie.e70de110.json +0 -9860
  69. package/dist/static/puzzle-yellow-lottie.275b5cf4.json +0 -1
  70. package/dist/static/slotmachine.ba8014dd.json +0 -7779
  71. package/dist/static/super-emoji.7fad19f6.json +0 -3720
  72. package/dist/static/victory-emoji.2ca41d92.json +0 -9959
@@ -0,0 +1,115 @@
1
+ import o from "styled-components";
2
+ import n from "../../../assets/line-icons/icons/hint-fill.js";
3
+ import e from "../../ui/layout/flex-view.js";
4
+ import r from "../../ui/text/text.js";
5
+ import { getPuzzleCardPattern as p } from "../utils/puzzle-pattern.js";
6
+ const d = o(e)(({ theme: t, $visible: i }) => {
7
+ const { gutter: l } = t.layout;
8
+ return i ? `
9
+ padding-top: ${l * 1.5}px;
10
+ padding-bottom: ${l * 2}px;
11
+ ` : "";
12
+ }), g = o(e)`
13
+ position: relative;
14
+ margin: 0 auto;
15
+ box-shadow: inset 0px 0px 0px 4px ${({ theme: t, $imageHue: i }) => t.colors[`${i}_4`]};
16
+ max-width: 343px;
17
+ width: 100%;
18
+ max-height: 412px;
19
+ height: 100%;
20
+ aspect-ratio: 343 / 412;
21
+ overflow: hidden;
22
+
23
+ &::before {
24
+ content: '';
25
+ position: absolute;
26
+ top: 0;
27
+ left: 0;
28
+ right: 0;
29
+ bottom: 0;
30
+ background-image: ${({ $imageHue: t }) => `url(${p(t)})`};
31
+ background-size: cover;
32
+ opacity: 0.3;
33
+ }
34
+ `, x = o(e)`
35
+ background-color: transparent;
36
+
37
+ .puzzle-question-content {
38
+ font-size: 16px;
39
+ line-height: 1.6em;
40
+ color: ${({ theme: t }) => t.colors.BLACK};
41
+ font-family: 'Noto Serif', serif;
42
+
43
+ em {
44
+ font-style: italic;
45
+ }
46
+
47
+ ul,
48
+ ol {
49
+ list-style-type: initial;
50
+ padding-left: 32px;
51
+ }
52
+
53
+ ol {
54
+ list-style-type: decimal;
55
+ }
56
+
57
+ p {
58
+ margin: 12px 0;
59
+ }
60
+
61
+ li {
62
+ margin: 4px 0;
63
+ }
64
+ }
65
+ `, u = o(n)`
66
+ color: ${({ theme: t }) => t.colors.BLACK_1};
67
+
68
+ & .hint-fill-icon-path {
69
+ fill: ${({ theme: t }) => t.colors.WHITE_1};
70
+ }
71
+ `, h = o(r)`
72
+ & span {
73
+ font-weight: 700;
74
+ margin-right: 4px;
75
+ }
76
+ `, y = o.div`
77
+ color: ${({ theme: t }) => t.colors.BLACK};
78
+ font-size: 14px;
79
+ line-height: 1.2;
80
+ font-family: 'Athletics';
81
+
82
+ font-weight: 400;
83
+ font-style: normal;
84
+
85
+ em {
86
+ font-style: italic;
87
+ }
88
+
89
+ ul,
90
+ ol {
91
+ list-style-type: initial;
92
+ padding-left: 32px;
93
+ }
94
+
95
+ ol {
96
+ list-style-type: decimal;
97
+ }
98
+
99
+ p {
100
+ margin: 0;
101
+ }
102
+
103
+ li {
104
+ margin: 4px 0;
105
+ }
106
+ `;
107
+ export {
108
+ d as PuzzleAppWrapper,
109
+ g as PuzzleContainer,
110
+ y as PuzzleQuestionWrapper,
111
+ x as QuestionCard,
112
+ h as StyledFeedbackText,
113
+ u as StyledHintFillIcon
114
+ };
115
+ //# sourceMappingURL=puzzle-app-styled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puzzle-app-styled.js","sources":["../../../../src/features/puzzles/app/puzzle-app-styled.tsx"],"sourcesContent":["import type { THueNames } from '../../ui/types';\n\nimport styled from 'styled-components';\n\nimport HintFillIcon from '../../../assets/line-icons/icons/hint-fill';\nimport FlexView from '../../ui/layout/flex-view';\nimport Text from '../../ui/text/text';\nimport { getPuzzleCardPattern } from '../utils/puzzle-pattern';\n\nconst PuzzleAppWrapper = styled(FlexView)<{ $visible: boolean }>(({ theme, $visible }) => {\n const { gutter } = theme.layout;\n\n if (!$visible) {\n return ``;\n }\n\n return `\n padding-top: ${gutter * 1.5}px;\n padding-bottom: ${gutter * 2}px;\n `;\n});\n\nconst PuzzleContainer = styled(FlexView)<{ $imageHue: THueNames; $backgroundOpacity?: number }>`\n position: relative;\n margin: 0 auto;\n box-shadow: inset 0px 0px 0px 4px ${({ theme, $imageHue }) => theme.colors[`${$imageHue}_4`]};\n max-width: 343px;\n width: 100%;\n max-height: 412px;\n height: 100%;\n aspect-ratio: 343 / 412;\n overflow: hidden;\n\n &::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-image: ${({ $imageHue }) => `url(${getPuzzleCardPattern($imageHue)})`};\n background-size: cover;\n opacity: 0.3;\n }\n`;\n\nconst QuestionCard = styled(FlexView)`\n background-color: transparent;\n\n .puzzle-question-content {\n font-size: 16px;\n line-height: 1.6em;\n color: ${({ theme }) => theme.colors.BLACK};\n font-family: 'Noto Serif', serif;\n\n em {\n font-style: italic;\n }\n\n ul,\n ol {\n list-style-type: initial;\n padding-left: 32px;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n p {\n margin: 12px 0;\n }\n\n li {\n margin: 4px 0;\n }\n }\n`;\n\nconst StyledHintFillIcon = styled(HintFillIcon)`\n color: ${({ theme }) => theme.colors.BLACK_1};\n\n & .hint-fill-icon-path {\n fill: ${({ theme }) => theme.colors.WHITE_1};\n }\n`;\n\nconst StyledFeedbackText = styled(Text)`\n & span {\n font-weight: 700;\n margin-right: 4px;\n }\n`;\n\nconst PuzzleQuestionWrapper = styled.div`\n color: ${({ theme }) => theme.colors.BLACK};\n font-size: 14px;\n line-height: 1.2;\n font-family: 'Athletics';\n\n font-weight: 400;\n font-style: normal;\n\n em {\n font-style: italic;\n }\n\n ul,\n ol {\n list-style-type: initial;\n padding-left: 32px;\n }\n\n ol {\n list-style-type: decimal;\n }\n\n p {\n margin: 0;\n }\n\n li {\n margin: 4px 0;\n }\n`;\n\nexport {\n PuzzleAppWrapper,\n PuzzleContainer,\n QuestionCard,\n StyledFeedbackText,\n StyledHintFillIcon,\n PuzzleQuestionWrapper,\n};\n"],"names":["PuzzleAppWrapper","styled","FlexView","theme","$visible","gutter","PuzzleContainer","$imageHue","getPuzzleCardPattern","QuestionCard","StyledHintFillIcon","HintFillIcon","StyledFeedbackText","Text","PuzzleQuestionWrapper"],"mappings":";;;;;AASM,MAAAA,IAAmBC,EAAOC,CAAQ,EAAyB,CAAC,EAAE,OAAAC,GAAO,UAAAC,QAAe;AAClF,QAAA,EAAE,QAAAC,EAAO,IAAIF,EAAM;AAEzB,SAAKC,IAIE;AAAA,mBACUC,IAAS,GAAG;AAAA,sBACTA,IAAS,CAAC;AAAA,MALrB;AAOX,CAAC,GAEKC,IAAkBL,EAAOC,CAAQ;AAAA;AAAA;AAAA,sCAGD,CAAC,EAAE,OAAAC,GAAO,WAAAI,QAAgBJ,EAAM,OAAO,GAAGI,CAAS,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAetE,CAAC,EAAE,WAAAA,EAAU,MAAM,OAAOC,EAAqBD,CAAS,CAAC,GAAG;AAAA;AAAA;AAAA;AAAA,GAM9EE,IAAeR,EAAOC,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAMvB,CAAC,EAAE,OAAAC,EAAA,MAAYA,EAAM,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2BxCO,IAAqBT,EAAOU,CAAY;AAAA,WACnC,CAAC,EAAE,OAAAR,EAAA,MAAYA,EAAM,OAAO,OAAO;AAAA;AAAA;AAAA,YAGlC,CAAC,EAAE,OAAAA,EAAA,MAAYA,EAAM,OAAO,OAAO;AAAA;AAAA,GAIzCS,IAAqBX,EAAOY,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAOhCC,IAAwBb,EAAO;AAAA,WAC1B,CAAC,EAAE,OAAAE,EAAA,MAAYA,EAAM,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -0,0 +1,116 @@
1
+ import { jsxs as S, jsx as i } from "react/jsx-runtime";
2
+ import { memo as T, useRef as A, useCallback as _, useEffect as p, useMemo as H } from "react";
3
+ import Q from "../../ui/image/image.js";
4
+ import $ from "../../ui/separator/separator.js";
5
+ import h from "../../worksheet/constants/events.js";
6
+ import M from "../../worksheet/worksheet/hooks/use-learnosity.js";
7
+ import V from "../../worksheet/worksheet/hooks/use-worksheet-data-helper.js";
8
+ import { getQuestionsFromItems as x } from "../../worksheet/worksheet/worksheet-helpers.js";
9
+ import { QuestionCard as C, PuzzleQuestionWrapper as L, PuzzleContainer as N } from "./puzzle-app-styled.js";
10
+ const P = (a) => {
11
+ if (!a) return null;
12
+ const t = a.match(/<img[^>]+src="([^">]+)"/);
13
+ return t ? t[1] : null;
14
+ }, j = ({
15
+ worksheetData: a,
16
+ loggerRef: t,
17
+ onWorksheetErrored: u,
18
+ imageHue: I,
19
+ onLoaded: d
20
+ }) => {
21
+ const { signed_request: z, questions_signed_request: E } = a, w = A(null), {
22
+ loadingState: r,
23
+ data: o,
24
+ error: m
25
+ } = V({
26
+ attemptId: void 0,
27
+ signedRequest: z,
28
+ loggerRef: t
29
+ }), y = _(
30
+ (s) => {
31
+ u({
32
+ code: s.code,
33
+ message: s.detail
34
+ });
35
+ },
36
+ [u]
37
+ ), { learnosity: n } = M(E, y, t);
38
+ p(() => {
39
+ r === "error" && u({
40
+ message: m ?? "Error loading worksheet"
41
+ });
42
+ }, [r, u, m]), p(() => {
43
+ n && t.current(h.WORKSHEET_V3_LEARNOSITY_INITIALIZED);
44
+ }, [n, t]), p(() => {
45
+ n && r === "success" && d && (t.current(h.WORKSHEET_V3_READY), d());
46
+ }, [n, r, t, d]);
47
+ const c = H(() => r === "success" && (o != null && o.learnosityItems) ? (t.current(h.WORKSHEET_V3_READY), x(o.learnosityItems, {
48
+ sectioned: !1,
49
+ adaptive: !1
50
+ }).map((e) => ({
51
+ response_id: e.response_id,
52
+ type: e.type,
53
+ stimulus: e.stimulus,
54
+ template: e.template,
55
+ stimulus_review: e.stimulus_review,
56
+ options: e.options,
57
+ metadata: e.metadata,
58
+ validation: e.validation
59
+ // Add other properties as needed
60
+ }))) : r === "error" || m ? [] : [], [r, o, m, t]);
61
+ p(() => {
62
+ if (n && c.length > 0) {
63
+ const l = requestAnimationFrame(() => {
64
+ try {
65
+ n.renderMath("mathjax");
66
+ } catch {
67
+ }
68
+ });
69
+ return () => {
70
+ cancelAnimationFrame(l);
71
+ };
72
+ }
73
+ }, [n, c]);
74
+ const g = _((s) => {
75
+ const { stimulus: l = "", template: e = "", response_id: v } = s, f = P(l);
76
+ return /* @__PURE__ */ S(
77
+ C,
78
+ {
79
+ $alignItems: "center",
80
+ className: "puzzle-app-view-question-card",
81
+ children: [
82
+ f && /* @__PURE__ */ i(
83
+ Q,
84
+ {
85
+ src: f,
86
+ alt: "Puzzle illustration",
87
+ width: 183,
88
+ height: 183,
89
+ withLoader: !0
90
+ }
91
+ ),
92
+ /* @__PURE__ */ i($, { heightX: 1 }),
93
+ e && /* @__PURE__ */ i(L, { children: /* @__PURE__ */ i("div", { dangerouslySetInnerHTML: { __html: e } }) })
94
+ ]
95
+ },
96
+ v
97
+ );
98
+ }, []);
99
+ return c.length ? /* @__PURE__ */ i(
100
+ N,
101
+ {
102
+ ref: w,
103
+ $gapX: 1,
104
+ $gutterX: 1,
105
+ $imageHue: I,
106
+ $background: "WHITE_1",
107
+ className: "puzzle-app-view-container",
108
+ $justifyContent: "center",
109
+ children: c.map((s) => /* @__PURE__ */ i("div", { children: g(s) }, `question-${s.response_id}`))
110
+ }
111
+ ) : null;
112
+ }, Y = T(j);
113
+ export {
114
+ Y as default
115
+ };
116
+ //# sourceMappingURL=puzzle-app-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puzzle-app-view.js","sources":["../../../../src/features/puzzles/app/puzzle-app-view.tsx"],"sourcesContent":["import type {\n ILearnosityError,\n ILearnosityQuestion,\n} from '../../worksheet/worksheet/worksheet-types';\nimport type { IPuzzleAppViewProps } from './puzzle-app-types';\nimport type { FC } from 'react';\n\nimport { memo, useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport Image from '../../ui/image/image';\nimport Separator from '../../ui/separator/separator';\nimport EVENTS from '../../worksheet/constants/events';\nimport useLearnosity from '../../worksheet/worksheet/hooks/use-learnosity';\nimport useWorksheetDataHelper from '../../worksheet/worksheet/hooks/use-worksheet-data-helper';\nimport { getQuestionsFromItems } from '../../worksheet/worksheet/worksheet-helpers';\nimport * as Styled from './puzzle-app-styled';\n\nconst extractImageFromHTML = (htmlString: string) => {\n if (!htmlString) return null;\n\n const imgMatch = htmlString.match(/<img[^>]+src=\"([^\">]+)\"/);\n\n return imgMatch ? imgMatch[1] : null;\n};\n\nconst PuzzleAppView: FC<IPuzzleAppViewProps> = ({\n worksheetData,\n loggerRef,\n onWorksheetErrored,\n imageHue,\n onLoaded,\n}) => {\n const { signed_request: itemsSignedRequest, questions_signed_request: questionSignedRequest } =\n worksheetData;\n\n // Ref for the container to trigger MathJax rendering\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Get Learnosity items using the signed_request (not questions_signed_request)\n const {\n loadingState,\n data: learnosityData,\n error: worksheetError,\n } = useWorksheetDataHelper({\n attemptId: undefined,\n signedRequest: itemsSignedRequest,\n loggerRef,\n });\n\n const onLearnosityErrored = useCallback(\n (err: ILearnosityError) => {\n onWorksheetErrored({\n code: err.code,\n message: err.detail,\n });\n },\n [onWorksheetErrored],\n );\n\n // Initialize Learnosity using questions_signed_request (needed for interactive questions)\n const { learnosity } = useLearnosity(questionSignedRequest, onLearnosityErrored, loggerRef);\n\n useEffect(() => {\n if (loadingState === 'error') {\n onWorksheetErrored({\n message: worksheetError ?? 'Error loading worksheet',\n });\n }\n }, [loadingState, onWorksheetErrored, worksheetError]);\n\n // Log when learnosity is ready for future interactive features\n useEffect(() => {\n if (learnosity) {\n loggerRef.current(EVENTS.WORKSHEET_V3_LEARNOSITY_INITIALIZED);\n }\n }, [learnosity, loggerRef]);\n\n useEffect(() => {\n if (learnosity && loadingState === 'success' && onLoaded) {\n loggerRef.current(EVENTS.WORKSHEET_V3_READY);\n onLoaded();\n }\n }, [learnosity, loadingState, loggerRef, onLoaded]);\n\n // Memoize questions processing to prevent re-render loops\n const questions = useMemo(() => {\n // Extract questions from Learnosity items when data is loaded successfully\n if (loadingState === 'success' && learnosityData?.learnosityItems) {\n loggerRef.current(EVENTS.WORKSHEET_V3_READY);\n\n // Convert learnosityItems to questions using the worksheet helper\n const worksheetQuestions = getQuestionsFromItems(learnosityData.learnosityItems, {\n sectioned: false,\n adaptive: false,\n });\n\n // Extract just the Learnosity questions from worksheet questions\n const learnosityQuestions: ILearnosityQuestion[] = worksheetQuestions.map(q => ({\n response_id: q.response_id,\n type: q.type,\n stimulus: q.stimulus,\n template: q.template,\n stimulus_review: q.stimulus_review,\n options: q.options,\n metadata: q.metadata,\n validation: q.validation,\n // Add other properties as needed\n }));\n\n return learnosityQuestions;\n }\n\n if (loadingState === 'error' || worksheetError) {\n return [];\n }\n\n return [];\n }, [loadingState, learnosityData, worksheetError, loggerRef]);\n\n // Force MathJax rendering after questions are loaded and rendered\n // Similar to how useLearnosityAppend does it\n useEffect(() => {\n if (learnosity && questions.length > 0) {\n // Use requestAnimationFrame to ensure DOM is updated before rendering math\n const renderMath = () => {\n try {\n learnosity.renderMath('mathjax');\n } catch (error) {\n // Fallback - MathJax rendering will happen automatically via global config\n // or when the content is processed by the browser\n }\n };\n\n const animationId = requestAnimationFrame(renderMath);\n\n return () => {\n cancelAnimationFrame(animationId);\n };\n }\n }, [learnosity, questions]);\n\n const renderQuestionContent = useCallback((question: ILearnosityQuestion) => {\n const { stimulus = '', template = '', response_id: responseId } = question;\n const imageUrl = extractImageFromHTML(stimulus);\n\n return (\n <Styled.QuestionCard\n key={responseId}\n $alignItems=\"center\"\n className=\"puzzle-app-view-question-card\"\n >\n {/* Main Image or Interactive Content */}\n {imageUrl && (\n <Image\n src={imageUrl}\n alt=\"Puzzle illustration\"\n width={183}\n height={183}\n withLoader={true}\n />\n )}\n\n <Separator heightX={1} />\n\n {/* Question HTML Content */}\n {template && (\n <Styled.PuzzleQuestionWrapper>\n <div dangerouslySetInnerHTML={{ __html: template }} />\n </Styled.PuzzleQuestionWrapper>\n )}\n </Styled.QuestionCard>\n );\n }, []);\n\n if (!questions.length) return null;\n\n return (\n <Styled.PuzzleContainer\n ref={containerRef}\n $gapX={1}\n $gutterX={1}\n $imageHue={imageHue}\n $background=\"WHITE_1\"\n className=\"puzzle-app-view-container\"\n $justifyContent=\"center\"\n >\n {questions.map(question => (\n <div key={`question-${question.response_id}`}>{renderQuestionContent(question)}</div>\n ))}\n </Styled.PuzzleContainer>\n );\n};\n\nexport default memo(PuzzleAppView);\n"],"names":["extractImageFromHTML","htmlString","imgMatch","PuzzleAppView","worksheetData","loggerRef","onWorksheetErrored","imageHue","onLoaded","itemsSignedRequest","questionSignedRequest","containerRef","useRef","loadingState","learnosityData","worksheetError","useWorksheetDataHelper","onLearnosityErrored","useCallback","err","learnosity","useLearnosity","useEffect","EVENTS","questions","useMemo","getQuestionsFromItems","q","animationId","renderQuestionContent","question","stimulus","template","responseId","imageUrl","jsxs","Styled.QuestionCard","jsx","Image","Separator","Styled.PuzzleQuestionWrapper","Styled.PuzzleContainer","PuzzleAppView$1","memo"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { jsx as e, jsxs as o, Fragment as W } from "react/jsx-runtime";
2
+ import { memo as P, useState as d, useRef as v, useCallback as n, useEffect as y } from "react";
3
+ import R from "../../ui/error/error.js";
4
+ import h from "../../ui/layout/flex-view.js";
5
+ import F from "../../ui/loader/app-loader/app-loader.js";
6
+ import p from "../../ui/text/text.js";
7
+ import { usePreviewWorksheetGet as I } from "../../worksheet/worksheet-preview/api/get-preview-worksheet.js";
8
+ import { PuzzleAppWrapper as L, StyledFeedbackText as T, StyledHintFillIcon as j } from "./puzzle-app-styled.js";
9
+ import C from "./puzzle-app-view.js";
10
+ const D = ({ itemRef: s, title: m, imageHue: i, feedbackComments: l, tip: f }) => {
11
+ const [u, $] = d(), [r, g] = d(!1), { isProcessing: k, get: a, data: c, error: w } = I(), z = v(() => null), A = f || "Celebrate persistence more than correct answers - it's a life skill worth building.", t = n(() => {
12
+ a("test", {
13
+ action: "review",
14
+ node_type: "PUZZLE_CARD",
15
+ items: [s]
16
+ });
17
+ }, [a, s]);
18
+ y(() => {
19
+ t();
20
+ }, [t]);
21
+ const b = n((E) => {
22
+ $(E.message);
23
+ }, []), x = n(() => {
24
+ g(!0);
25
+ }, []);
26
+ return u || w ? /* @__PURE__ */ e(R, { height: "100vh", onTryAgain: t }) : k ? /* @__PURE__ */ e(F, { height: "100vh" }) : /* @__PURE__ */ o(
27
+ L,
28
+ {
29
+ className: "puzzle-app-container",
30
+ $background: `${i}_2`,
31
+ $alignItems: "center",
32
+ $justifyContent: "center",
33
+ $flexGapX: 1,
34
+ $gutterX: 1,
35
+ $height: "100%",
36
+ $visible: r,
37
+ children: [
38
+ r && /* @__PURE__ */ e(p, { $renderAs: "ab1-bold", children: m }),
39
+ c && /* @__PURE__ */ e(
40
+ C,
41
+ {
42
+ onWorksheetErrored: b,
43
+ worksheetData: c,
44
+ loggerRef: z,
45
+ imageHue: i,
46
+ onLoaded: x
47
+ }
48
+ ),
49
+ r && /* @__PURE__ */ e(W, { children: l ? /* @__PURE__ */ o(T, { $renderAs: "ab2", children: [
50
+ /* @__PURE__ */ e("span", { children: "Tutor Remark:" }),
51
+ l
52
+ ] }) : /* @__PURE__ */ o(h, { $flexDirection: "row", $alignItems: "center", $flexGap: 8, children: [
53
+ /* @__PURE__ */ e(h, { $width: 24, $height: 24, children: /* @__PURE__ */ e(j, {}) }),
54
+ /* @__PURE__ */ e(p, { $renderAs: "ab2", children: A })
55
+ ] }) })
56
+ ]
57
+ }
58
+ );
59
+ }, B = P(D);
60
+ export {
61
+ B as default
62
+ };
63
+ //# sourceMappingURL=puzzle-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puzzle-app.js","sources":["../../../../src/features/puzzles/app/puzzle-app.tsx"],"sourcesContent":["import type { IPuzzleAppProps } from './puzzle-app-types';\nimport type { FC } from 'react';\n\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\n\nimport Error from '../../ui/error/error';\nimport FlexView from '../../ui/layout/flex-view';\nimport AppLoader from '../../ui/loader/app-loader/app-loader';\nimport Text from '../../ui/text/text';\nimport { usePreviewWorksheetGet } from '../../worksheet/worksheet-preview/api/get-preview-worksheet';\nimport * as Styled from './puzzle-app-styled';\nimport PuzzleAppView from './puzzle-app-view';\n\nconst PuzzleApp: FC<IPuzzleAppProps> = ({ itemRef, title, imageHue, feedbackComments, tip }) => {\n const [error, setError] = useState<string>();\n const [worksheetRendered, setWorksheetRendered] = useState<boolean>(false);\n\n const { isProcessing, get, data: worksheetData, error: fetchError } = usePreviewWorksheetGet();\n const loggerRef = useRef(() => null);\n\n const tipInfo =\n tip || `Celebrate persistence more than correct answers - it's a life skill worth building.`;\n\n const fetchWorksheet = useCallback(() => {\n get('test', {\n action: 'review',\n node_type: 'PUZZLE_CARD',\n items: [itemRef],\n });\n }, [get, itemRef]);\n\n useEffect(() => {\n fetchWorksheet();\n }, [fetchWorksheet]);\n\n const handleWorksheetErrored = useCallback((err: { code?: number; message: string }) => {\n setError(err.message);\n }, []);\n\n const handleWorksheetLoaded = useCallback(() => {\n setWorksheetRendered(true);\n }, []);\n\n if (error || fetchError) {\n return <Error height=\"100vh\" onTryAgain={fetchWorksheet} />;\n }\n\n if (isProcessing) {\n return <AppLoader height=\"100vh\" />;\n }\n\n return (\n <Styled.PuzzleAppWrapper\n className=\"puzzle-app-container\"\n $background={`${imageHue}_2`}\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $flexGapX={1}\n $gutterX={1}\n $height=\"100%\"\n $visible={worksheetRendered}\n >\n {worksheetRendered && <Text $renderAs=\"ab1-bold\">{title}</Text>}\n\n {worksheetData && (\n <PuzzleAppView\n onWorksheetErrored={handleWorksheetErrored}\n worksheetData={worksheetData}\n loggerRef={loggerRef}\n imageHue={imageHue}\n onLoaded={handleWorksheetLoaded}\n />\n )}\n\n {worksheetRendered && (\n <>\n {feedbackComments ? (\n <Styled.StyledFeedbackText $renderAs=\"ab2\">\n <span>Tutor Remark:</span>\n {feedbackComments}\n </Styled.StyledFeedbackText>\n ) : (\n <FlexView $flexDirection=\"row\" $alignItems=\"center\" $flexGap={8}>\n <FlexView $width={24} $height={24}>\n <Styled.StyledHintFillIcon />\n </FlexView>\n <Text $renderAs=\"ab2\">{tipInfo}</Text>\n </FlexView>\n )}\n </>\n )}\n </Styled.PuzzleAppWrapper>\n );\n};\n\nexport default memo(PuzzleApp);\n"],"names":["PuzzleApp","itemRef","title","imageHue","feedbackComments","tip","error","setError","useState","worksheetRendered","setWorksheetRendered","isProcessing","get","worksheetData","fetchError","usePreviewWorksheetGet","loggerRef","useRef","tipInfo","fetchWorksheet","useCallback","useEffect","handleWorksheetErrored","err","handleWorksheetLoaded","jsx","Error","AppLoader","jsxs","Styled.PuzzleAppWrapper","Text","PuzzleAppView","Styled.StyledFeedbackText","FlexView","Styled.StyledHintFillIcon","puzzleApp","memo"],"mappings":";;;;;;;;;AAaA,MAAMA,IAAiC,CAAC,EAAE,SAAAC,GAAS,OAAAC,GAAO,UAAAC,GAAU,kBAAAC,GAAkB,KAAAC,QAAU;AAC9F,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAiB,GACrC,CAACC,GAAmBC,CAAoB,IAAIF,EAAkB,EAAK,GAEnE,EAAE,cAAAG,GAAc,KAAAC,GAAK,MAAMC,GAAe,OAAOC,MAAeC,KAChEC,IAAYC,EAAO,MAAM,IAAI,GAE7BC,IACJb,KAAO,uFAEHc,IAAiBC,EAAY,MAAM;AACvC,IAAAR,EAAI,QAAQ;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO,CAACX,CAAO;AAAA,IAAA,CAChB;AAAA,EAAA,GACA,CAACW,GAAKX,CAAO,CAAC;AAEjB,EAAAoB,EAAU,MAAM;AACC,IAAAF;EAAA,GACd,CAACA,CAAc,CAAC;AAEb,QAAAG,IAAyBF,EAAY,CAACG,MAA4C;AACtF,IAAAhB,EAASgB,EAAI,OAAO;AAAA,EACtB,GAAG,CAAE,CAAA,GAECC,IAAwBJ,EAAY,MAAM;AAC9C,IAAAV,EAAqB,EAAI;AAAA,EAC3B,GAAG,CAAE,CAAA;AAEL,SAAIJ,KAASQ,IACH,gBAAAW,EAAAC,GAAA,EAAM,QAAO,SAAQ,YAAYP,EAAgB,CAAA,IAGvDR,IACK,gBAAAc,EAACE,GAAU,EAAA,QAAO,QAAQ,CAAA,IAIjC,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,aAAa,GAAG1B,CAAQ;AAAA,MACxB,aAAY;AAAA,MACZ,iBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAQ;AAAA,MACR,UAAUM;AAAA,MAET,UAAA;AAAA,QAAAA,KAAsB,gBAAAgB,EAAAK,GAAA,EAAK,WAAU,YAAY,UAAM5B,GAAA;AAAA,QAEvDW,KACC,gBAAAY;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,oBAAoBT;AAAA,YACpB,eAAAT;AAAA,YACA,WAAAG;AAAA,YACA,UAAAb;AAAA,YACA,UAAUqB;AAAA,UAAA;AAAA,QACZ;AAAA,QAGDf,4BAEI,UACCL,IAAA,gBAAAwB,EAACI,GAAA,EAA0B,WAAU,OACnC,UAAA;AAAA,UAAA,gBAAAP,EAAC,UAAK,UAAa,gBAAA,CAAA;AAAA,UAClBrB;AAAA,QACH,EAAA,CAAA,sBAEC6B,GAAS,EAAA,gBAAe,OAAM,aAAY,UAAS,UAAU,GAC5D,UAAA;AAAA,UAAC,gBAAAR,EAAAQ,GAAA,EAAS,QAAQ,IAAI,SAAS,IAC7B,UAAC,gBAAAR,EAAAS,GAAA,CAAA,CAA0B,EAC7B,CAAA;AAAA,UACC,gBAAAT,EAAAK,GAAA,EAAK,WAAU,OAAO,UAAQZ,GAAA;AAAA,QAAA,EAAA,CACjC,EAEJ,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,GAEeiB,IAAAC,EAAKpC,CAAS;"}
@@ -1,34 +1,79 @@
1
- import e from "styled-components";
2
- import r from "../../ui/layout/flex-view.js";
3
- import i from "../../ui/text/text.js";
4
- import { getPuzzleCardPattern as p } from "../utils/puzzle-pattern.js";
5
- const n = e(r)`
1
+ import e, { keyframes as a, css as r } from "styled-components";
2
+ import n from "../../ui/layout/flex-view.js";
3
+ import { getPuzzleCardPattern as l } from "../utils/puzzle-pattern.js";
4
+ const m = a`
5
+ from { transform: translateY(-100%); }
6
+ to { transform: translateY(0); }
7
+ `, o = a`
8
+ from { transform: rotateY(0deg); }
9
+ to { transform: rotateY(360deg); }
10
+ `, c = a`
11
+ from { transform: translateY(0); opacity: 1; }
12
+ to { transform: translateY(-100%); opacity: 0; }
13
+ `, d = e(n)`
6
14
  position: relative;
7
- cursor: pointer;
8
15
 
9
- box-shadow: inset 0px 0px 0px 4px ${({ theme: o, $imageHue: t }) => o.colors[`${t}_4`]};
16
+ box-shadow: inset 0px 0px 0px 4px ${({ theme: t, $imageHue: i }) => t.colors[`${i}_4`]};
10
17
 
11
- background-image: ${({ $imageHue: o }) => `url(${p(o)})`};
18
+ background-image: ${({ $imageHue: t }) => `url(${l(t)})`};
12
19
  background-size: cover;
13
20
 
14
- &:hover {
15
- outline: 1px solid ${({ theme: o }) => o.colors.BLACK_1};
21
+ ${({ $animationPhase: t }) => t && r`
22
+ transform-style: preserve-3d;
23
+ opacity: 0;
24
+ visibility: hidden;
25
+ transform: translateY(-100%);
26
+ `}
27
+
28
+ ${({ $animationPhase: t, theme: i, $imageHue: s }) => {
29
+ switch (t) {
30
+ case "movingIn":
31
+ return r`
32
+ visibility: visible;
33
+ opacity: 1;
34
+ animation: ${m} 0.5s ease-out forwards;
35
+ `;
36
+ case "revealing":
37
+ return r`
38
+ visibility: visible;
39
+ opacity: 1;
40
+ transform: translateY(0); /* Position after moveIn */
41
+ animation: ${o} 1s ease-in-out forwards;
42
+ `;
43
+ case "visible":
44
+ return r`
45
+ visibility: visible;
46
+ opacity: 1;
47
+ transform: translateY(0) rotateY(360deg);
48
+ background-color: ${i.colors[`${s}_2`]};
49
+ transition: background-color 0.2s ease-in;
50
+ `;
51
+ case "assigning":
52
+ return r`
53
+ visibility: visible;
54
+ opacity: 1;
55
+ transform: translateY(0); /* Reset rotation for this animation */
56
+ animation: ${o} 1s ease-in-out forwards;
57
+ `;
58
+ case "assigned":
59
+ return r`
60
+ visibility: visible;
61
+ opacity: 1;
62
+ transform: translateY(0) rotateY(360deg);
63
+ `;
64
+ case "movingOut":
65
+ return r`
66
+ visibility: visible;
67
+ opacity: 1;
68
+ transform: translateY(0); /* Start from final position */
69
+ animation: ${c} 0.5s ease-in forwards;
70
+ `;
71
+ default:
72
+ return "";
16
73
  }
17
- `, x = e(i)`
18
- display: -webkit-box;
19
- -webkit-line-clamp: 2;
20
- -webkit-box-orient: vertical;
21
- overflow: hidden;
22
- text-overflow: ellipsis;
23
- white-space: break-spaces;
24
- `, b = e(r)`
25
- position: absolute;
26
- top: -10px;
27
- right: -10px;
74
+ }}
28
75
  `;
29
76
  export {
30
- n as PuzzleWrapper,
31
- b as StickerWrapper,
32
- x as Title
77
+ d as PuzzleWrapper
33
78
  };
34
79
  //# sourceMappingURL=puzzle-card-styled.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"puzzle-card-styled.js","sources":["../../../../src/features/puzzles/comps/puzzle-card-styled.tsx"],"sourcesContent":["import type { THueNames } from '../../ui/types';\n\nimport styled from 'styled-components';\n\nimport FlexView from '../../ui/layout/flex-view';\nimport Text from '../../ui/text/text';\nimport { getPuzzleCardPattern } from '../utils/puzzle-pattern';\n\nconst PuzzleWrapper = styled(FlexView)<{ $animationPhase?: string; $imageHue: THueNames }>`\n position: relative;\n cursor: pointer;\n\n box-shadow: inset 0px 0px 0px 4px ${({ theme, $imageHue }) => theme.colors[`${$imageHue}_4`]};\n\n background-image: ${({ $imageHue }) => `url(${getPuzzleCardPattern($imageHue)})`};\n background-size: cover;\n\n &:hover {\n outline: 1px solid ${({ theme }) => theme.colors.BLACK_1};\n }\n`;\n\nconst Title = styled(Text)`\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: break-spaces;\n`;\n\nconst StickerWrapper = styled(FlexView)`\n position: absolute;\n top: -10px;\n right: -10px;\n`;\n\nexport { PuzzleWrapper, Title, StickerWrapper };\n"],"names":["PuzzleWrapper","styled","FlexView","theme","$imageHue","getPuzzleCardPattern","Title","Text","StickerWrapper"],"mappings":";;;;AAQM,MAAAA,IAAgBC,EAAOC,CAAQ;AAAA;AAAA;AAAA;AAAA,sCAIC,CAAC,EAAE,OAAAC,GAAO,WAAAC,QAAgBD,EAAM,OAAO,GAAGC,CAAS,IAAI,CAAC;AAAA;AAAA,sBAExE,CAAC,EAAE,WAAAA,EAAU,MAAM,OAAOC,EAAqBD,CAAS,CAAC,GAAG;AAAA;AAAA;AAAA;AAAA,yBAIzD,CAAC,EAAE,OAAAD,EAAA,MAAYA,EAAM,OAAO,OAAO;AAAA;AAAA,GAItDG,IAAQL,EAAOM,CAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GASnBC,IAAiBP,EAAOC,CAAQ;AAAA;AAAA;AAAA;AAAA;"}
1
+ {"version":3,"file":"puzzle-card-styled.js","sources":["../../../../src/features/puzzles/comps/puzzle-card-styled.tsx"],"sourcesContent":["import type { THueNames } from '../../ui/types';\n\nimport styled, { css, keyframes } from 'styled-components';\n\nimport FlexView from '../../ui/layout/flex-view';\nimport { getPuzzleCardPattern } from '../utils/puzzle-pattern';\n\n// --- Keyframes for each animation step ---\nconst moveInAnim = keyframes`\n from { transform: translateY(-100%); }\n to { transform: translateY(0); }\n`;\n\nconst rotateYAnim = keyframes`\n from { transform: rotateY(0deg); }\n to { transform: rotateY(360deg); }\n`;\n\nconst moveOutAnim = keyframes`\n from { transform: translateY(0); opacity: 1; }\n to { transform: translateY(-100%); opacity: 0; }\n`;\n\nconst PuzzleWrapper = styled(FlexView)<{ $animationPhase?: string; $imageHue: THueNames }>`\n position: relative;\n\n box-shadow: inset 0px 0px 0px 4px ${({ theme, $imageHue }) => theme.colors[`${$imageHue}_4`]};\n\n background-image: ${({ $imageHue }) => `url(${getPuzzleCardPattern($imageHue)})`};\n background-size: cover;\n\n ${({ $animationPhase }) =>\n $animationPhase &&\n css`\n transform-style: preserve-3d;\n opacity: 0;\n visibility: hidden;\n transform: translateY(-100%);\n `}\n\n ${({ $animationPhase, theme, $imageHue }) => {\n switch ($animationPhase) {\n case 'movingIn':\n return css`\n visibility: visible;\n opacity: 1;\n animation: ${moveInAnim} 0.5s ease-out forwards;\n `;\n case 'revealing':\n return css`\n visibility: visible;\n opacity: 1;\n transform: translateY(0); /* Position after moveIn */\n animation: ${rotateYAnim} 1s ease-in-out forwards;\n `;\n case 'visible':\n return css`\n visibility: visible;\n opacity: 1;\n transform: translateY(0) rotateY(360deg);\n background-color: ${theme.colors[`${$imageHue}_2`]};\n transition: background-color 0.2s ease-in;\n `;\n case 'assigning':\n return css`\n visibility: visible;\n opacity: 1;\n transform: translateY(0); /* Reset rotation for this animation */\n animation: ${rotateYAnim} 1s ease-in-out forwards;\n `;\n case 'assigned':\n return css`\n visibility: visible;\n opacity: 1;\n transform: translateY(0) rotateY(360deg);\n `;\n case 'movingOut':\n return css`\n visibility: visible;\n opacity: 1;\n transform: translateY(0); /* Start from final position */\n animation: ${moveOutAnim} 0.5s ease-in forwards;\n `;\n default:\n return '';\n }\n }}\n`;\n\nexport { PuzzleWrapper };\n"],"names":["moveInAnim","keyframes","rotateYAnim","moveOutAnim","PuzzleWrapper","styled","FlexView","theme","$imageHue","getPuzzleCardPattern","$animationPhase","css"],"mappings":";;;AAQA,MAAMA,IAAaC;AAAA;AAAA;AAAA,GAKbC,IAAcD;AAAA;AAAA;AAAA,GAKdE,IAAcF;AAAA;AAAA;AAAA,GAKdG,IAAgBC,EAAOC,CAAQ;AAAA;AAAA;AAAA,sCAGC,CAAC,EAAE,OAAAC,GAAO,WAAAC,QAAgBD,EAAM,OAAO,GAAGC,CAAS,IAAI,CAAC;AAAA;AAAA,sBAExE,CAAC,EAAE,WAAAA,EAAU,MAAM,OAAOC,EAAqBD,CAAS,CAAC,GAAG;AAAA;AAAA;AAAA,IAG9E,CAAC,EAAE,iBAAAE,QACHA,KACAC;AAAA;AAAA;AAAA;AAAA;AAAA,KAKC;AAAA;AAAA,IAED,CAAC,EAAE,iBAAAD,GAAiB,OAAAH,GAAO,WAAAC,QAAgB;AAC3C,UAAQE,GAAiB;AAAA,IACvB,KAAK;AACI,aAAAC;AAAA;AAAA;AAAA,uBAGQX,CAAU;AAAA;AAAA,IAE3B,KAAK;AACI,aAAAW;AAAA;AAAA;AAAA;AAAA,uBAIQT,CAAW;AAAA;AAAA,IAE5B,KAAK;AACI,aAAAS;AAAA;AAAA;AAAA;AAAA,8BAIeJ,EAAM,OAAO,GAAGC,CAAS,IAAI,CAAC;AAAA;AAAA;AAAA,IAGtD,KAAK;AACI,aAAAG;AAAA;AAAA;AAAA;AAAA,uBAIQT,CAAW;AAAA;AAAA,IAE5B,KAAK;AACI,aAAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKT,KAAK;AACI,aAAAA;AAAA;AAAA;AAAA;AAAA,uBAIQR,CAAW;AAAA;AAAA,IAE5B;AACS,aAAA;AAAA,EACX;AACF,CAAC;AAAA;"}
@@ -1,58 +1,35 @@
1
- import { jsxs as c, jsx as e } from "react/jsx-runtime";
2
- import { memo as f, useCallback as $ } from "react";
3
- import g from "../../ui/image/image.js";
4
- import z from "../../ui/layout/flex-view.js";
5
- import u from "../../ui/lottie-animation/lottie-animation.js";
6
- import { getPuzzleStickerLottie as d } from "../utils/puzzle-feedback-celebration.js";
7
- import { PuzzleWrapper as x, Title as L, StickerWrapper as S } from "./puzzle-card-styled.js";
8
- const j = {
9
- autoplay: !1,
10
- loop: !1,
11
- renderer: "canvas"
12
- }, W = f(
1
+ import { jsx as h } from "react/jsx-runtime";
2
+ import { memo as p } from "react";
3
+ import { PuzzleWrapper as s } from "./puzzle-card-styled.js";
4
+ const c = p(
13
5
  ({
14
- imageHue: o,
15
- imageUrl: m,
16
- title: h,
17
- height: s = "100%",
18
- width: a = "100%",
19
- onCardClick: t,
20
- userNodeId: i,
21
- rewards: r
22
- }) => {
23
- const { sticker: n } = (r == null ? void 0 : r[0]) || {}, l = n ? d(n) : void 0, p = $(() => {
24
- i && (t == null || t(i));
25
- }, [t, i]);
26
- return /* @__PURE__ */ c(
27
- x,
28
- {
29
- $width: a,
30
- $height: s,
31
- $justifyContent: "center",
32
- $alignItems: "center",
33
- $imageHue: o,
34
- $background: `${o}_2`,
35
- onClick: p,
36
- children: [
37
- /* @__PURE__ */ c(z, { $justifyContent: "center", $alignItems: "center", $flexGap: 12, children: [
38
- /* @__PURE__ */ e(g, { src: m ?? "", width: 68, height: 68, withLoader: !1, alt: "Puzzle" }),
39
- /* @__PURE__ */ e(L, { $renderAs: "ab3", $align: "center", $width: "80%", children: h })
40
- ] }),
41
- l && /* @__PURE__ */ e(S, { $widthX: 2.5, $heightX: 2.5, children: /* @__PURE__ */ e(
42
- u,
43
- {
44
- width: 40,
45
- height: 40,
46
- src: l,
47
- settings: j
48
- }
49
- ) })
50
- ]
51
- }
52
- );
53
- }
6
+ children: e,
7
+ imageHue: t,
8
+ onAnimationEnd: r,
9
+ animationPhase: o,
10
+ width: i,
11
+ widthX: m,
12
+ height: n,
13
+ heightX: $,
14
+ backgroundColor: a
15
+ }) => /* @__PURE__ */ h(
16
+ s,
17
+ {
18
+ $animationPhase: o,
19
+ onAnimationEnd: r,
20
+ $width: i,
21
+ $height: n,
22
+ $widthX: m,
23
+ $heightX: $,
24
+ $alignItems: "center",
25
+ $justifyContent: "center",
26
+ $imageHue: t,
27
+ $background: a ?? `${t}_6`,
28
+ children: e
29
+ }
30
+ )
54
31
  );
55
32
  export {
56
- W as default
33
+ c as default
57
34
  };
58
35
  //# sourceMappingURL=puzzle-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"puzzle-card.js","sources":["../../../../src/features/puzzles/comps/puzzle-card.tsx"],"sourcesContent":["import type { IPuzzleCardProps } from './puzzle-card-types';\nimport type { FC } from 'react';\n\nimport { memo, useCallback } from 'react';\n\nimport Image from '../../ui/image/image';\nimport FlexView from '../../ui/layout/flex-view';\nimport LottieAnimation from '../../ui/lottie-animation/lottie-animation';\nimport { getPuzzleStickerLottie } from '../utils/puzzle-feedback-celebration';\nimport * as Styled from './puzzle-card-styled';\n\nconst puzzleStickerLottieSettings = {\n autoplay: false,\n loop: false,\n renderer: 'canvas',\n};\n\nconst PuzzleCard: FC<IPuzzleCardProps> = memo(\n ({\n imageHue,\n imageUrl,\n title,\n height = '100%',\n width = '100%',\n onCardClick,\n userNodeId,\n rewards,\n }) => {\n const { sticker } = rewards?.[0] || {};\n\n const puzzleStickerLottie = sticker ? getPuzzleStickerLottie(sticker) : undefined;\n\n const handleCardClick = useCallback(() => {\n if (userNodeId) {\n onCardClick?.(userNodeId);\n }\n }, [onCardClick, userNodeId]);\n\n return (\n <Styled.PuzzleWrapper\n $width={width}\n $height={height}\n $justifyContent=\"center\"\n $alignItems=\"center\"\n $imageHue={imageHue}\n $background={`${imageHue}_2`}\n onClick={handleCardClick}\n >\n <FlexView $justifyContent=\"center\" $alignItems=\"center\" $flexGap={12}>\n <Image src={imageUrl ?? ''} width={68} height={68} withLoader={false} alt=\"Puzzle\" />\n\n <Styled.Title $renderAs=\"ab3\" $align=\"center\" $width=\"80%\">\n {title}\n </Styled.Title>\n </FlexView>\n\n {puzzleStickerLottie && (\n <Styled.StickerWrapper $widthX={2.5} $heightX={2.5}>\n <LottieAnimation\n width={40}\n height={40}\n src={puzzleStickerLottie}\n settings={puzzleStickerLottieSettings}\n />\n </Styled.StickerWrapper>\n )}\n </Styled.PuzzleWrapper>\n );\n },\n);\n\nexport default PuzzleCard;\n"],"names":["puzzleStickerLottieSettings","PuzzleCard","memo","imageHue","imageUrl","title","height","width","onCardClick","userNodeId","rewards","sticker","puzzleStickerLottie","getPuzzleStickerLottie","handleCardClick","useCallback","jsxs","Styled.PuzzleWrapper","FlexView","jsx","Image","Styled.Title","Styled.StickerWrapper","LottieAnimation"],"mappings":";;;;;;;AAWA,MAAMA,IAA8B;AAAA,EAClC,UAAU;AAAA,EACV,MAAM;AAAA,EACN,UAAU;AACZ,GAEMC,IAAmCC;AAAA,EACvC,CAAC;AAAA,IACC,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,OAAAC,IAAQ;AAAA,IACR,aAAAC;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,EAAA,MACI;AACJ,UAAM,EAAE,SAAAC,EAAQ,KAAID,KAAA,gBAAAA,EAAU,OAAM,CAAA,GAE9BE,IAAsBD,IAAUE,EAAuBF,CAAO,IAAI,QAElEG,IAAkBC,EAAY,MAAM;AACxC,MAAIN,MACFD,KAAA,QAAAA,EAAcC;AAAA,IAChB,GACC,CAACD,GAAaC,CAAU,CAAC;AAG1B,WAAA,gBAAAO;AAAA,MAACC;AAAAA,MAAA;AAAA,QACC,QAAQV;AAAA,QACR,SAASD;AAAA,QACT,iBAAgB;AAAA,QAChB,aAAY;AAAA,QACZ,WAAWH;AAAA,QACX,aAAa,GAAGA,CAAQ;AAAA,QACxB,SAASW;AAAA,QAET,UAAA;AAAA,UAAA,gBAAAE,EAACE,KAAS,iBAAgB,UAAS,aAAY,UAAS,UAAU,IAChE,UAAA;AAAA,YAAC,gBAAAC,EAAAC,GAAA,EAAM,KAAKhB,KAAY,IAAI,OAAO,IAAI,QAAQ,IAAI,YAAY,IAAO,KAAI,SAAS,CAAA;AAAA,YAEnF,gBAAAe,EAACE,GAAA,EAAa,WAAU,OAAM,QAAO,UAAS,QAAO,OAClD,UACHhB,EAAA,CAAA;AAAA,UAAA,GACF;AAAA,UAECO,uBACEU,GAAA,EAAsB,SAAS,KAAK,UAAU,KAC7C,UAAA,gBAAAH;AAAA,YAACI;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,KAAKX;AAAA,cACL,UAAUZ;AAAA,YAAA;AAAA,UAAA,GAEd;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;"}
1
+ {"version":3,"file":"puzzle-card.js","sources":["../../../../src/features/puzzles/comps/puzzle-card.tsx"],"sourcesContent":["import type { IPuzzleCardProps } from './puzzle-card-types';\nimport type { FC } from 'react';\n\nimport { memo } from 'react';\n\nimport * as Styled from './puzzle-card-styled';\n\nconst PuzzleCard: FC<IPuzzleCardProps> = memo(\n ({\n children,\n imageHue,\n onAnimationEnd,\n animationPhase,\n width,\n widthX,\n height,\n heightX,\n backgroundColor,\n }) => {\n return (\n <Styled.PuzzleWrapper\n $animationPhase={animationPhase}\n onAnimationEnd={onAnimationEnd}\n $width={width}\n $height={height}\n $widthX={widthX}\n $heightX={heightX}\n $alignItems=\"center\"\n $justifyContent=\"center\"\n $imageHue={imageHue}\n $background={backgroundColor ?? `${imageHue}_6`}\n >\n {children}\n </Styled.PuzzleWrapper>\n );\n },\n);\n\nexport default PuzzleCard;\n"],"names":["PuzzleCard","memo","children","imageHue","onAnimationEnd","animationPhase","width","widthX","height","heightX","backgroundColor","jsx","Styled.PuzzleWrapper"],"mappings":";;;AAOA,MAAMA,IAAmCC;AAAA,EACvC,CAAC;AAAA,IACC,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,iBAAAC;AAAA,EAAA,MAGE,gBAAAC;AAAA,IAACC;AAAAA,IAAA;AAAA,MACC,iBAAiBP;AAAA,MACjB,gBAAAD;AAAA,MACA,QAAQE;AAAA,MACR,SAASE;AAAA,MACT,SAASD;AAAA,MACT,UAAUE;AAAA,MACV,aAAY;AAAA,MACZ,iBAAgB;AAAA,MAChB,WAAWN;AAAA,MACX,aAAaO,KAAmB,GAAGP,CAAQ;AAAA,MAE1C,UAAAD;AAAA,IAAA;AAAA,EAAA;AAIT;"}