@tipp/ui 2.1.5 → 2.1.7

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 (84) hide show
  1. package/dist/app/index.cjs.map +1 -1
  2. package/dist/app/index.js +8 -8
  3. package/dist/app/platform/edit-coaching-time.cjs.map +1 -1
  4. package/dist/app/platform/edit-coaching-time.js +8 -8
  5. package/dist/app/platform/edit-service-type.cjs.map +1 -1
  6. package/dist/app/platform/edit-service-type.js +8 -8
  7. package/dist/app/platform/goal-manage-card-edit.cjs.map +1 -1
  8. package/dist/app/platform/goal-manage-card-edit.js +8 -8
  9. package/dist/app/platform/on-offline-radio-card.cjs.map +1 -1
  10. package/dist/app/platform/on-offline-radio-card.js +8 -8
  11. package/dist/app/platform/reservation-card.cjs.map +1 -1
  12. package/dist/app/platform/reservation-card.js +8 -8
  13. package/dist/app/platform/session-card.cjs.map +1 -1
  14. package/dist/app/platform/session-card.js +8 -8
  15. package/dist/chunk-2DJALSMS.js +89 -0
  16. package/dist/chunk-2DJALSMS.js.map +1 -0
  17. package/dist/chunk-4QIUPPBA.js +123 -0
  18. package/dist/chunk-4QIUPPBA.js.map +1 -0
  19. package/dist/chunk-5HDK2O77.js +59 -0
  20. package/dist/chunk-5HDK2O77.js.map +1 -0
  21. package/dist/chunk-AF5OLZPB.js +89 -0
  22. package/dist/chunk-AF5OLZPB.js.map +1 -0
  23. package/dist/chunk-B4FBF3HZ.js +123 -0
  24. package/dist/chunk-B4FBF3HZ.js.map +1 -0
  25. package/dist/chunk-DOGV5ZUB.js +59 -0
  26. package/dist/chunk-DOGV5ZUB.js.map +1 -0
  27. package/dist/chunk-FU6KLVGQ.js +59 -0
  28. package/dist/chunk-FU6KLVGQ.js.map +1 -0
  29. package/dist/chunk-IIL23OC5.js +59 -0
  30. package/dist/chunk-IIL23OC5.js.map +1 -0
  31. package/dist/chunk-J7CUTDKS.js +59 -0
  32. package/dist/chunk-J7CUTDKS.js.map +1 -0
  33. package/dist/chunk-JWDN6DTS.js +123 -0
  34. package/dist/chunk-JWDN6DTS.js.map +1 -0
  35. package/dist/chunk-MU6BQEBB.js +61 -0
  36. package/dist/chunk-MU6BQEBB.js.map +1 -0
  37. package/dist/chunk-OHA7BIRX.js +61 -0
  38. package/dist/chunk-OHA7BIRX.js.map +1 -0
  39. package/dist/chunk-PIDMAX55.js +123 -0
  40. package/dist/chunk-PIDMAX55.js.map +1 -0
  41. package/dist/chunk-RGADLWN7.js +59 -0
  42. package/dist/chunk-RGADLWN7.js.map +1 -0
  43. package/dist/chunk-RLWHEE4V.js +123 -0
  44. package/dist/chunk-RLWHEE4V.js.map +1 -0
  45. package/dist/chunk-TNQWK4FE.js +30 -0
  46. package/dist/chunk-TNQWK4FE.js.map +1 -0
  47. package/dist/chunk-VE7XSAWU.js +123 -0
  48. package/dist/chunk-VE7XSAWU.js.map +1 -0
  49. package/dist/chunk-YHT7DP6A.js +89 -0
  50. package/dist/chunk-YHT7DP6A.js.map +1 -0
  51. package/dist/chunk-YN4SHJ2O.js +143 -0
  52. package/dist/chunk-YN4SHJ2O.js.map +1 -0
  53. package/dist/index.cjs +10 -4
  54. package/dist/index.cjs.map +1 -1
  55. package/dist/index.js +12 -12
  56. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.cjs +0 -1
  57. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.cjs.map +1 -1
  58. package/dist/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.js +1 -1
  59. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.cjs +1 -2
  60. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.cjs.map +1 -1
  61. package/dist/molecules/curriculumV2/CurriculumContents/curriculum-review.js +3 -3
  62. package/dist/molecules/curriculumV2/CurriculumContents/index.cjs +1 -2
  63. package/dist/molecules/curriculumV2/CurriculumContents/index.cjs.map +1 -1
  64. package/dist/molecules/curriculumV2/CurriculumContents/index.js +4 -4
  65. package/dist/molecules/curriculumV2/CurriculumSidebar/index.cjs.map +1 -1
  66. package/dist/molecules/curriculumV2/CurriculumSidebar/index.js +2 -2
  67. package/dist/molecules/curriculumV2/curriculum-context.cjs +9 -2
  68. package/dist/molecules/curriculumV2/curriculum-context.cjs.map +1 -1
  69. package/dist/molecules/curriculumV2/curriculum-context.d.cts +2 -0
  70. package/dist/molecules/curriculumV2/curriculum-context.d.ts +2 -0
  71. package/dist/molecules/curriculumV2/curriculum-context.js +1 -1
  72. package/dist/molecules/curriculumV2/curriculum-sub-nav.cjs.map +1 -1
  73. package/dist/molecules/curriculumV2/curriculum-sub-nav.js +2 -2
  74. package/dist/molecules/curriculumV2/index.cjs +10 -4
  75. package/dist/molecules/curriculumV2/index.cjs.map +1 -1
  76. package/dist/molecules/curriculumV2/index.js +6 -6
  77. package/dist/molecules/index.cjs +10 -4
  78. package/dist/molecules/index.cjs.map +1 -1
  79. package/dist/molecules/index.js +11 -11
  80. package/dist/types/index.js +1 -1
  81. package/package.json +3 -3
  82. package/src/molecules/curriculumV2/CurriculumContents/CurriculumReviewSteps/index.tsx +0 -2
  83. package/src/molecules/curriculumV2/CurriculumContents/curriculum-review.tsx +2 -2
  84. package/src/molecules/curriculumV2/curriculum-context.tsx +16 -2
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  CurriculumSidebar
3
- } from "../../../chunk-XJFILYJ7.js";
3
+ } from "../../../chunk-OHA7BIRX.js";
4
4
  import "../../../chunk-OSM7B4AJ.js";
5
5
  import "../../../chunk-LRKARLHL.js";
6
6
  import "../../../chunk-4BKYFOTB.js";
7
7
  import "../../../chunk-22HJDAZH.js";
8
8
  import "../../../chunk-HFXODPRR.js";
9
- import "../../../chunk-4G7AM6OU.js";
9
+ import "../../../chunk-YN4SHJ2O.js";
10
10
  import "../../../chunk-AI7EZKUN.js";
11
11
  import "../../../chunk-A6W2ZWYA.js";
12
12
  import "../../../chunk-QD5ZSFPG.js";
@@ -38,7 +38,8 @@ function CurriculumProvider(props) {
38
38
  onReviewValueChange,
39
39
  curriculumReviewAnswers,
40
40
  tempCurriculumReviewAnswers,
41
- curriculumCompleteMap
41
+ curriculumCompleteMap,
42
+ onChangeSelectedContent
42
43
  } = props;
43
44
  const sidebarRef = (0, import_react.useRef)(null);
44
45
  const scrollNavItem = (0, import_react.useCallback)((index) => {
@@ -112,11 +113,17 @@ function CurriculumProvider(props) {
112
113
  },
113
114
  [list, selectedIndexState]
114
115
  );
116
+ const selectedItem = (0, import_react.useMemo)(() => {
117
+ return list[selectedIndexState];
118
+ }, [list, selectedIndexState]);
115
119
  const selectedSectionTitle = (0, import_react.useMemo)(() => {
116
120
  var _a2;
117
121
  const prevItems = list.slice(0, selectedIndexState).reverse();
118
122
  return (_a2 = prevItems.find((item) => item.type === "sectionTitle")) != null ? _a2 : null;
119
123
  }, [list, selectedIndexState]);
124
+ (0, import_react.useEffect)(() => {
125
+ onChangeSelectedContent == null ? void 0 : onChangeSelectedContent(selectedItem);
126
+ }, [selectedItem]);
120
127
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CurriculumContext.Provider, { value: {
121
128
  curriculum,
122
129
  scrollNavItem,
@@ -128,7 +135,7 @@ function CurriculumProvider(props) {
128
135
  selectPrev,
129
136
  selectNext,
130
137
  selectedSectionTitle,
131
- selectedItem: list[selectedIndexState],
138
+ selectedItem,
132
139
  scrollAreaRef: sidebarRef,
133
140
  onReviewSubmit,
134
141
  onReviewValueChange,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/molecules/curriculumV2/curriculum-context.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useMemo,\n useCallback,\n useRef,\n} from 'react';\nimport { \n type CurriculumSectionTitleContents,\n} from '@/types/curriculumContents.type';\nimport type { Curriculum, CurriculumListContents } from '@/types/curriculum.type';\n\n\nexport interface CurriculumContextValue {\n curriculum: Curriculum;\n selectedIndex: number;\n setSelectedIndex: (idx: number) => void;\n selectedId: string;\n hasPrev: boolean;\n hasNext: boolean;\n selectPrev: (cb?: (moveIndex: number) => void) => void;\n selectNext: (cb?: (moveIndex: number) => void) => void;\n selectedItem: CurriculumListContents;\n /** 선택된 아이템의 이전 아이템 중 가장 가까운 섹션 타이틀 */\n selectedSectionTitle: CurriculumSectionTitleContents | null;\n /** 컨텐츠 목록 스크롤 이동 함수 */\n scrollNavItem: (uuid: string) => void;\n /** 스크롤 영역 참조 */\n scrollAreaRef: React.RefObject<HTMLDivElement | null>;\n /** 리뷰 제출 함수 */\n onReviewSubmit: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => Promise<boolean>;\n /** 리뷰 응답 값 변경 시 호출 */\n onReviewValueChange: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => void;\n /** 과제 완료 후 저장된 값 */\n curriculumReviewAnswers: Record<string, string>;\n /** 과제 완료 전 임시 저장된 값 */\n tempCurriculumReviewAnswers: Record<string, string>; \n /** 항목 수강 완료 여부 */\n curriculumCompleteMap: Record<string, boolean>;\n}\n\nconst CurriculumContext = createContext<CurriculumContextValue | undefined>(\n undefined\n);\n\nexport interface CurriculumProviderProps extends Pick<CurriculumContextValue, 'curriculum' | 'onReviewSubmit' | 'onReviewValueChange' | 'curriculumReviewAnswers' | 'tempCurriculumReviewAnswers' | 'curriculumCompleteMap'> {\n children: React.ReactNode; \n onReviewValueChange: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => void; \n}\n\nexport function CurriculumProvider(props: CurriculumProviderProps): React.ReactElement {\n const {\n children,\n curriculum,\n onReviewSubmit, \n onReviewValueChange,\n curriculumReviewAnswers,\n tempCurriculumReviewAnswers, \n curriculumCompleteMap\n } = props;\n const sidebarRef = useRef<HTMLDivElement>(null);\n\n const scrollNavItem = useCallback((index: string) => {\n const element = sidebarRef.current?.querySelector(\n `[data-curriculum-item-index=\"${index}\"]`\n );\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, []);\n\n const list = curriculum.contents.list;\n // 선택 가능한 인덱스만 추출\n const selectableIndexes = useMemo(\n () =>\n list\n .map((item, i) => (item.type !== 'sectionTitle' ? i : null))\n .filter((i): i is number => i !== null),\n [list]\n );\n // 최초 선택값: 첫 번째 선택 가능한 인덱스\n const [selectedIndexState, setSelectedIndexState] = useState<number>(\n selectableIndexes[0] ?? 0\n );\n\n // 선택 인덱스 보정 함수\n const setSelectedIndex = useCallback(\n (idx: number) => {\n if (selectableIndexes.includes(idx)) {\n setSelectedIndexState(idx);\n } else {\n // idx가 선택 불가면, selectableIndexes에서 가장 가까운 다음 인덱스 선택\n const next = selectableIndexes.find((i) => i > idx);\n const prev = [...selectableIndexes].reverse().find((i) => i < idx);\n if (next !== undefined) setSelectedIndexState(next);\n else if (prev !== undefined) setSelectedIndexState(prev);\n }\n },\n [selectableIndexes]\n );\n\n // 현재 선택 인덱스가 selectableIndexes 내 몇 번째인지\n const selectablePos = useMemo(\n () => selectableIndexes.indexOf(selectedIndexState),\n [selectableIndexes, selectedIndexState]\n );\n const hasPrev = selectablePos > 0;\n const hasNext = selectablePos < selectableIndexes.length - 1;\n\n const selectPrev = useCallback(\n (cb?: (moveIndex: number) => void) => {\n setSelectedIndexState((cur) => {\n let prevIndex = cur;\n const pos = selectableIndexes.indexOf(cur);\n if (pos > 0) {\n prevIndex = selectableIndexes[pos - 1];\n }\n if (cb) cb(prevIndex);\n return prevIndex;\n });\n },\n [selectableIndexes]\n );\n const selectNext = useCallback(\n (cb?: (moveIndex: number) => void) => {\n setSelectedIndexState((cur) => {\n let nextIndex = cur;\n const pos = selectableIndexes.indexOf(cur);\n if (pos < selectableIndexes.length - 1) {\n nextIndex = selectableIndexes[pos + 1];\n }\n if (cb) cb(nextIndex);\n return nextIndex;\n });\n },\n [selectableIndexes]\n );\n\n const selectedId = useMemo(\n () => list[selectedIndexState]?.uuid ?? '',\n [list, selectedIndexState]\n );\n\n const selectedSectionTitle = useMemo(() => {\n // selectedIndexState 이전 인덱스 중 가장 가까운 섹션 타이틀 찾기\n const prevItems = list.slice(0, selectedIndexState).reverse();\n return prevItems.find((item) => item.type === 'sectionTitle') ?? null;\n }, [list, selectedIndexState]);\n \n\n return (\n <CurriculumContext.Provider value={{\n curriculum,\n scrollNavItem,\n selectedIndex: selectedIndexState,\n setSelectedIndex,\n selectedId,\n hasPrev,\n hasNext,\n selectPrev,\n selectNext,\n selectedSectionTitle,\n selectedItem: list[selectedIndexState],\n scrollAreaRef: sidebarRef,\n onReviewSubmit, \n onReviewValueChange,\n curriculumReviewAnswers,\n tempCurriculumReviewAnswers, \n curriculumCompleteMap\n }}>\n {children}\n </CurriculumContext.Provider>\n );\n}\n\nexport function useCurriculumContext(): CurriculumContextValue {\n const ctx = useContext(CurriculumContext);\n if (!ctx)\n throw new Error(\n 'useCurriculumContext must be used within CurriculumProvider'\n );\n return ctx;\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../../../src/molecules/curriculumV2/curriculum-context.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useMemo,\n useCallback,\n useRef,\n useEffect,\n} from 'react';\nimport { \n type CurriculumSectionTitleContents,\n} from '@/types/curriculumContents.type';\nimport type { Curriculum, CurriculumListContents } from '@/types/curriculum.type';\n\n\nexport interface CurriculumContextValue {\n curriculum: Curriculum;\n selectedIndex: number;\n setSelectedIndex: (idx: number) => void;\n selectedId: string;\n hasPrev: boolean;\n hasNext: boolean;\n selectPrev: (cb?: (moveIndex: number) => void) => void;\n selectNext: (cb?: (moveIndex: number) => void) => void;\n selectedItem: CurriculumListContents;\n /** 선택된 아이템의 이전 아이템 중 가장 가까운 섹션 타이틀 */\n selectedSectionTitle: CurriculumSectionTitleContents | null;\n /** 컨텐츠 목록 스크롤 이동 함수 */\n scrollNavItem: (uuid: string) => void;\n /** 스크롤 영역 참조 */\n scrollAreaRef: React.RefObject<HTMLDivElement | null>;\n /** 리뷰 제출 함수 */\n onReviewSubmit: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => Promise<boolean>;\n /** 리뷰 응답 값 변경 시 호출 */\n onReviewValueChange: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => void;\n /** 과제 완료 후 저장된 값 */\n curriculumReviewAnswers: Record<string, string>;\n /** 과제 완료 전 임시 저장된 값 */\n tempCurriculumReviewAnswers: Record<string, string>; \n /** 항목 수강 완료 여부 */\n curriculumCompleteMap: Record<string, boolean>;\n}\n\nconst CurriculumContext = createContext<CurriculumContextValue | undefined>(\n undefined\n);\n\nexport interface CurriculumProviderProps extends Pick<CurriculumContextValue, 'curriculum' | 'onReviewSubmit' | 'onReviewValueChange' | 'curriculumReviewAnswers' | 'tempCurriculumReviewAnswers' | 'curriculumCompleteMap'> {\n children: React.ReactNode; \n onReviewValueChange: ({\n reviewId,\n answer,\n }: {\n reviewId: string;\n answer: Record<string, string>;\n }) => void; \n\n /** 현재 화면에 표시 중인 컨텐츠 인덱스 변경 시 호출 */\n onChangeSelectedContent?: (item: CurriculumListContents) => void;\n}\n\nexport function CurriculumProvider(props: CurriculumProviderProps): React.ReactElement {\n const {\n children,\n curriculum,\n onReviewSubmit, \n onReviewValueChange,\n curriculumReviewAnswers,\n tempCurriculumReviewAnswers, \n curriculumCompleteMap,\n onChangeSelectedContent\n } = props;\n const sidebarRef = useRef<HTMLDivElement>(null);\n\n const scrollNavItem = useCallback((index: string) => {\n const element = sidebarRef.current?.querySelector(\n `[data-curriculum-item-index=\"${index}\"]`\n );\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, []);\n\n const list = curriculum.contents.list;\n // 선택 가능한 인덱스만 추출\n const selectableIndexes = useMemo(\n () =>\n list\n .map((item, i) => (item.type !== 'sectionTitle' ? i : null))\n .filter((i): i is number => i !== null),\n [list]\n );\n // 최초 선택값: 첫 번째 선택 가능한 인덱스\n const [selectedIndexState, setSelectedIndexState] = useState<number>(\n selectableIndexes[0] ?? 0\n );\n\n // 선택 인덱스 보정 함수\n const setSelectedIndex = useCallback(\n (idx: number) => {\n if (selectableIndexes.includes(idx)) {\n setSelectedIndexState(idx);\n } else {\n // idx가 선택 불가면, selectableIndexes에서 가장 가까운 다음 인덱스 선택\n const next = selectableIndexes.find((i) => i > idx);\n const prev = [...selectableIndexes].reverse().find((i) => i < idx);\n if (next !== undefined) setSelectedIndexState(next);\n else if (prev !== undefined) setSelectedIndexState(prev);\n }\n },\n [selectableIndexes]\n );\n\n // 현재 선택 인덱스가 selectableIndexes 내 몇 번째인지\n const selectablePos = useMemo(\n () => selectableIndexes.indexOf(selectedIndexState),\n [selectableIndexes, selectedIndexState]\n );\n const hasPrev = selectablePos > 0;\n const hasNext = selectablePos < selectableIndexes.length - 1;\n\n const selectPrev = useCallback(\n (cb?: (moveIndex: number) => void) => {\n setSelectedIndexState((cur) => {\n let prevIndex = cur;\n const pos = selectableIndexes.indexOf(cur);\n if (pos > 0) {\n prevIndex = selectableIndexes[pos - 1];\n }\n if (cb) cb(prevIndex);\n return prevIndex;\n });\n },\n [selectableIndexes]\n );\n const selectNext = useCallback(\n (cb?: (moveIndex: number) => void) => {\n setSelectedIndexState((cur) => {\n let nextIndex = cur;\n const pos = selectableIndexes.indexOf(cur);\n if (pos < selectableIndexes.length - 1) {\n nextIndex = selectableIndexes[pos + 1];\n }\n if (cb) cb(nextIndex);\n return nextIndex;\n });\n },\n [selectableIndexes]\n );\n\n const selectedId = useMemo(\n () => list[selectedIndexState]?.uuid ?? '',\n [list, selectedIndexState]\n );\n\n const selectedItem = useMemo(()=>{\n return list[selectedIndexState];\n },[list,selectedIndexState])\n\n const selectedSectionTitle = useMemo(() => {\n // selectedIndexState 이전 인덱스 중 가장 가까운 섹션 타이틀 찾기\n const prevItems = list.slice(0, selectedIndexState).reverse();\n return prevItems.find((item) => item.type === 'sectionTitle') ?? null;\n }, [list, selectedIndexState]);\n \n\n useEffect(()=>{\n onChangeSelectedContent?.(selectedItem);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- useEffect 호출 최적화\n },[selectedItem])\n\n return (\n <CurriculumContext.Provider value={{\n curriculum,\n scrollNavItem,\n selectedIndex: selectedIndexState,\n setSelectedIndex,\n selectedId,\n hasPrev,\n hasNext,\n selectPrev,\n selectNext,\n selectedSectionTitle,\n selectedItem,\n scrollAreaRef: sidebarRef,\n onReviewSubmit, \n onReviewValueChange,\n curriculumReviewAnswers,\n tempCurriculumReviewAnswers, \n curriculumCompleteMap\n }}>\n {children}\n </CurriculumContext.Provider>\n );\n}\n\nexport function useCurriculumContext(): CurriculumContextValue {\n const ctx = useContext(CurriculumContext);\n if (!ctx)\n throw new Error(\n 'useCurriculumContext must be used within CurriculumProvider'\n );\n return ctx;\n}\n"],"mappings":"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","names":["_a"]}
@@ -41,6 +41,8 @@ interface CurriculumProviderProps extends Pick<CurriculumContextValue, 'curricul
41
41
  reviewId: string;
42
42
  answer: Record<string, string>;
43
43
  }) => void;
44
+ /** 현재 화면에 표시 중인 컨텐츠 인덱스 변경 시 호출 */
45
+ onChangeSelectedContent?: (item: CurriculumListContents) => void;
44
46
  }
45
47
  declare function CurriculumProvider(props: CurriculumProviderProps): React__default.ReactElement;
46
48
  declare function useCurriculumContext(): CurriculumContextValue;
@@ -41,6 +41,8 @@ interface CurriculumProviderProps extends Pick<CurriculumContextValue, 'curricul
41
41
  reviewId: string;
42
42
  answer: Record<string, string>;
43
43
  }) => void;
44
+ /** 현재 화면에 표시 중인 컨텐츠 인덱스 변경 시 호출 */
45
+ onChangeSelectedContent?: (item: CurriculumListContents) => void;
44
46
  }
45
47
  declare function CurriculumProvider(props: CurriculumProviderProps): React__default.ReactElement;
46
48
  declare function useCurriculumContext(): CurriculumContextValue;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CurriculumProvider,
3
3
  useCurriculumContext
4
- } from "../../chunk-4G7AM6OU.js";
4
+ } from "../../chunk-YN4SHJ2O.js";
5
5
  import "../../chunk-2NMEKWO5.js";
6
6
  export {
7
7
  CurriculumProvider,