@thanh01.pmt/interactive-quiz-kit 1.0.71 → 1.0.73

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.
@@ -8832,12 +8832,10 @@ init_react_shim();
8832
8832
  // src/services/TopicDataService.ts
8833
8833
  init_react_shim();
8834
8834
  var TopicDataService = class {
8835
- // ... saveData, mergeData, getData, clearData methods remain the same ...
8836
8835
  static saveData(data) {
8837
8836
  try {
8838
8837
  if (typeof window === "undefined") return;
8839
- const serializedData = JSON.stringify(data);
8840
- localStorage.setItem(this.STORAGE_KEY, serializedData);
8838
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
8841
8839
  } catch (error) {
8842
8840
  console.error("Error saving learning objectives to Local Storage:", error);
8843
8841
  }
@@ -8848,8 +8846,7 @@ var TopicDataService = class {
8848
8846
  newData.forEach((newLo) => {
8849
8847
  loMap.set(newLo.code, newLo);
8850
8848
  });
8851
- const mergedData = Array.from(loMap.values());
8852
- this.saveData(mergedData);
8849
+ this.saveData(Array.from(loMap.values()));
8853
8850
  }
8854
8851
  static getData() {
8855
8852
  try {
@@ -8864,7 +8861,7 @@ var TopicDataService = class {
8864
8861
  }
8865
8862
  static clearData() {
8866
8863
  try {
8867
- if (typeof window === "undefined") return;
8864
+ if (typeof window !== "undefined") return;
8868
8865
  localStorage.removeItem(this.STORAGE_KEY);
8869
8866
  } catch (error) {
8870
8867
  console.error("Error clearing learning objectives from Local Storage:", error);
@@ -8878,6 +8875,12 @@ var TopicDataService = class {
8878
8875
  const headerLine = lines.shift();
8879
8876
  const headers = headerLine.split(" ").map((h2) => h2.trim());
8880
8877
  const headerMap = headers.map((h2) => this.HEADER_MAP[h2] || null);
8878
+ const requiredHeaders = ["LO ID", "LO Name", "Subject", "Subject Code", "Category", "Category Code", "Topic", "Topic Code", "Grade", "Grade Code"];
8879
+ const missingHeaders = requiredHeaders.filter((h2) => !headers.includes(h2));
8880
+ if (missingHeaders.length > 0) {
8881
+ const errorMsg = `Invalid TSV header. Missing required columns: ${missingHeaders.join(", ")}`;
8882
+ return { data: [], errors: [errorMsg] };
8883
+ }
8881
8884
  const data = [];
8882
8885
  const errors2 = [];
8883
8886
  lines.forEach((line, index3) => {
@@ -8886,29 +8889,30 @@ var TopicDataService = class {
8886
8889
  headerMap.forEach((propName, i) => {
8887
8890
  if (propName) {
8888
8891
  const value = values[i]?.trim() || "";
8889
- if (propName === "keywords" || propName === "stemElements" || propName === "bloomLevelsGuideline") {
8892
+ if (["keywords", "stemElements", "bloomLevelsGuideline"].includes(propName)) {
8890
8893
  rowObject[propName] = value.split(",").map((s2) => s2.trim()).filter(Boolean);
8891
8894
  } else {
8892
8895
  rowObject[propName] = value;
8893
8896
  }
8894
8897
  }
8895
8898
  });
8896
- if (!rowObject.code) {
8897
- errors2.push(`Line ${index3 + 2}: Missing required value for 'LO ID'.`);
8899
+ if (!rowObject.code || !rowObject.name) {
8900
+ errors2.push(`Line ${index3 + 2}: Missing required values for 'LO ID' or 'LO Name'.`);
8898
8901
  return;
8899
8902
  }
8900
- if (!rowObject.name) {
8901
- rowObject.name = rowObject.code;
8902
- }
8903
8903
  const learningObjective = {
8904
8904
  id: generateUniqueId("lo_"),
8905
8905
  code: rowObject.code,
8906
8906
  name: rowObject.name,
8907
8907
  description: rowObject.description,
8908
8908
  subject: rowObject.subject || "",
8909
+ subjectCode: rowObject.subjectCode,
8909
8910
  category: rowObject.category || "",
8911
+ categoryCode: rowObject.categoryCode,
8910
8912
  topic: rowObject.topic || "",
8913
+ topicCode: rowObject.topicCode,
8911
8914
  grade: rowObject.grade || "",
8915
+ gradeCode: rowObject.gradeCode,
8912
8916
  keywords: rowObject.keywords || [],
8913
8917
  stemElements: rowObject.stemElements || [],
8914
8918
  bloomLevelsGuideline: rowObject.bloomLevelsGuideline || []
@@ -8939,17 +8943,23 @@ var TopicDataService = class {
8939
8943
  }
8940
8944
  };
8941
8945
  TopicDataService.STORAGE_KEY = "interactive_quiz_kit_learning_objectives";
8942
- // Define a map for flexible header mapping
8943
8946
  TopicDataService.HEADER_MAP = {
8944
8947
  "LO ID": "code",
8945
8948
  "LO Name": "name",
8946
- // Ready for future addition
8947
8949
  "LO Description": "description",
8948
8950
  "Subject": "subject",
8951
+ "Subject Code": "subjectCode",
8952
+ // New
8949
8953
  "Category": "category",
8954
+ "Category Code": "categoryCode",
8955
+ // New
8950
8956
  "Topic": "topic",
8957
+ "Topic Code": "topicCode",
8958
+ // New
8951
8959
  "Keywords": "keywords",
8952
8960
  "Grade": "grade",
8961
+ "Grade Code": "gradeCode",
8962
+ // New
8953
8963
  "STEM Element(s)": "stemElements",
8954
8964
  "Bloom\u2019s Level(s) Guideline": "bloomLevelsGuideline"
8955
8965
  };
@@ -77294,15 +77304,27 @@ function QuestionTypeManager({ initialData, isLoading: isLoadingProp, onAdd, onU
77294
77304
 
77295
77305
  // src/react-ui/components/metadata/LearningObjectiveManager.tsx
77296
77306
  init_react_shim();
77297
- function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoading: isLoadingProp, onAdd, onUpdate, onDelete, onBulkAdd }) {
77307
+ function LearningObjectiveManager({
77308
+ initialData,
77309
+ subjects: subjectsProp,
77310
+ isLoading: isLoadingProp,
77311
+ onAdd,
77312
+ onUpdate,
77313
+ onDelete,
77314
+ onBulkAdd
77315
+ }) {
77298
77316
  const [items, setItems] = React119.useState([]);
77299
77317
  const [subjects, setSubjects] = React119.useState([]);
77300
77318
  const [isLoading, setIsLoading] = React119.useState(true);
77301
77319
  const [isDialogOpen, setIsDialogOpen] = React119.useState(false);
77302
77320
  const [isAlertOpen, setIsAlertOpen] = React119.useState(false);
77303
- const [currentItem, setCurrentItem] = React119.useState(null);
77321
+ const [currentItem, setCurrentItem] = React119.useState(
77322
+ null
77323
+ );
77304
77324
  const [formState, setFormState] = React119.useState({});
77305
- const [itemToDelete, setItemToDelete] = React119.useState(null);
77325
+ const [itemToDelete, setItemToDelete] = React119.useState(
77326
+ null
77327
+ );
77306
77328
  const [isPending, startTransition] = React119.useTransition();
77307
77329
  const { toast: toast2 } = useToast();
77308
77330
  const isControlled = initialData !== void 0;
@@ -77313,7 +77335,11 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
77313
77335
  setItems(MetadataService.getLearningObjectives());
77314
77336
  setSubjects(MetadataService.getSubjects());
77315
77337
  } catch (error) {
77316
- toast2({ title: "Error", description: "Failed to refresh data.", variant: "destructive" });
77338
+ toast2({
77339
+ title: "Error",
77340
+ description: "Failed to refresh data.",
77341
+ variant: "destructive"
77342
+ });
77317
77343
  } finally {
77318
77344
  setIsLoading(false);
77319
77345
  }
@@ -77333,7 +77359,9 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
77333
77359
  };
77334
77360
  const handleAddItem = () => {
77335
77361
  setCurrentItem(null);
77336
- setFormState({ subjectCode: subjects.length > 0 ? subjects[0].code : "" });
77362
+ setFormState({
77363
+ subjectCode: subjects.length > 0 ? subjects[0].code : ""
77364
+ });
77337
77365
  setIsDialogOpen(true);
77338
77366
  };
77339
77367
  const handleEditItem = (item) => {
@@ -77355,9 +77383,16 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
77355
77383
  MetadataService.deleteLearningObjective(itemToDelete.code);
77356
77384
  refreshData();
77357
77385
  }
77358
- toast2({ title: "Success", description: `Learning Objective "${itemToDelete.name}" deleted.` });
77386
+ toast2({
77387
+ title: "Success",
77388
+ description: `Learning Objective "${itemToDelete.name}" deleted.`
77389
+ });
77359
77390
  } catch (error) {
77360
- toast2({ title: "Error", description: error.message, variant: "destructive" });
77391
+ toast2({
77392
+ title: "Error",
77393
+ description: error.message,
77394
+ variant: "destructive"
77395
+ });
77361
77396
  } finally {
77362
77397
  setIsAlertOpen(false);
77363
77398
  setItemToDelete(null);
@@ -77366,7 +77401,11 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
77366
77401
  };
77367
77402
  const handleSubmit = () => {
77368
77403
  if (!formState.name?.trim() || !formState.code?.trim()) {
77369
- toast2({ title: "Validation Error", description: "Code and Name are required.", variant: "destructive" });
77404
+ toast2({
77405
+ title: "Validation Error",
77406
+ description: "Code and Name are required.",
77407
+ variant: "destructive"
77408
+ });
77370
77409
  return;
77371
77410
  }
77372
77411
  startTransition(async () => {
@@ -77375,75 +77414,291 @@ function LearningObjectiveManager({ initialData, subjects: subjectsProp, isLoadi
77375
77414
  if (isControlled && onUpdate) {
77376
77415
  await onUpdate({ ...currentItem, ...formState });
77377
77416
  } else {
77378
- MetadataService.updateLearningObjective(currentItem.id, formState);
77417
+ MetadataService.updateLearningObjective(
77418
+ currentItem.id,
77419
+ formState
77420
+ );
77379
77421
  refreshData();
77380
77422
  }
77381
- toast2({ title: "Success", description: "Learning Objective updated." });
77423
+ toast2({
77424
+ title: "Success",
77425
+ description: "Learning Objective updated."
77426
+ });
77382
77427
  } else {
77383
77428
  if (isControlled && onAdd) {
77384
77429
  await onAdd(formState);
77385
77430
  } else {
77386
- MetadataService.addLearningObjective(formState);
77431
+ MetadataService.addLearningObjective(
77432
+ formState
77433
+ );
77387
77434
  refreshData();
77388
77435
  }
77389
- toast2({ title: "Success", description: "Learning Objective added." });
77436
+ toast2({
77437
+ title: "Success",
77438
+ description: "Learning Objective added."
77439
+ });
77390
77440
  }
77391
77441
  setIsDialogOpen(false);
77392
77442
  } catch (error) {
77393
- toast2({ title: "Error", description: error.message, variant: "destructive" });
77443
+ toast2({
77444
+ title: "Error",
77445
+ description: error.message,
77446
+ variant: "destructive"
77447
+ });
77394
77448
  }
77395
77449
  });
77396
77450
  };
77397
77451
  const handleImport = async (records) => {
77398
- console.log(`[LO Manager] handleImport called with ${records.length} raw records.`);
77452
+ console.log(
77453
+ `[LO Manager] handleImport called with ${records.length} raw records.`
77454
+ );
77399
77455
  if (!onBulkAdd) {
77400
77456
  console.error("[LO Manager] onBulkAdd handler is not provided.");
77401
77457
  return;
77402
77458
  }
77403
77459
  const parseStringToArray = (input) => {
77404
77460
  if (Array.isArray(input)) return input;
77405
- if (typeof input === "string") return input.split(",").map((s2) => s2.trim()).filter(Boolean);
77461
+ if (typeof input === "string")
77462
+ return input.split(",").map((s2) => s2.trim()).filter(Boolean);
77406
77463
  return [];
77407
77464
  };
77408
- const validationResult = records.reduce((acc, rec) => {
77409
- if (typeof rec.code === "string" && rec.code.trim() && typeof rec.name === "string" && rec.name.trim()) {
77410
- acc.valid.push({
77411
- code: rec.code,
77412
- name: rec.name,
77413
- description: rec.description || rec.name,
77414
- subject: rec.subject || "",
77415
- subjectCode: rec.subjectCode,
77416
- category: rec.category || "",
77417
- categoryCode: rec.categoryCode,
77418
- topic: rec.topic || "",
77419
- topicCode: rec.topicCode,
77420
- grade: rec.grade || "",
77421
- gradeCode: rec.gradeCode,
77422
- keywords: parseStringToArray(rec.keywords),
77423
- stemElements: parseStringToArray(rec.stemElements),
77424
- bloomLevelsGuideline: parseStringToArray(rec.bloomLevelsGuideline)
77425
- });
77426
- } else {
77427
- acc.invalidCount++;
77428
- }
77429
- return acc;
77430
- }, { valid: [], invalidCount: 0 });
77431
- console.log(`[LO Manager] Validation complete. ${validationResult.valid.length} valid records found.`);
77465
+ const validationResult = records.reduce(
77466
+ (acc, rec) => {
77467
+ if (typeof rec["LO ID"] === "string" && rec["LO ID"].trim() && typeof rec["LO Description"] === "string" && rec["LO Description"].trim()) {
77468
+ acc.valid.push({
77469
+ code: rec["LO ID"],
77470
+ name: rec["LO ID"],
77471
+ description: rec["LO Description"],
77472
+ subject: rec["Subject"] || "",
77473
+ subjectCode: rec["Subject Code"] || rec["Subject"],
77474
+ category: rec["Category"] || "",
77475
+ categoryCode: rec["Category Code"] || rec["Category"],
77476
+ topic: rec["Topic"] || "",
77477
+ topicCode: rec["Topic Code"] || rec["Topic"],
77478
+ grade: rec["Grade"] || "",
77479
+ gradeCode: rec["Grade Code"] || rec["Grade"],
77480
+ keywords: parseStringToArray(rec["Keywords"]),
77481
+ stemElements: parseStringToArray(
77482
+ rec["STEM Element(s)"]
77483
+ ),
77484
+ bloomLevelsGuideline: parseStringToArray(
77485
+ rec["Bloom\u2019s Level(s) Guideline"]
77486
+ )
77487
+ });
77488
+ } else {
77489
+ acc.invalidCount++;
77490
+ }
77491
+ return acc;
77492
+ },
77493
+ { valid: [], invalidCount: 0 }
77494
+ );
77495
+ console.log(
77496
+ `[LO Manager] Validation complete. ${validationResult.valid.length} valid records found.`
77497
+ );
77432
77498
  if (validationResult.invalidCount > 0) {
77433
77499
  toast2({
77434
77500
  title: "Import Warning",
77435
- description: `${validationResult.invalidCount} records had invalid or missing 'code' or 'name' fields and were ignored.`,
77501
+ description: `${validationResult.invalidCount} records had invalid or missing 'LO ID' or 'LO Description' fields and were ignored.`,
77436
77502
  variant: "destructive"
77437
77503
  });
77438
77504
  }
77439
77505
  if (validationResult.valid.length > 0) {
77440
- console.log("[LO Manager] Calling onBulkAdd prop with validated data...");
77506
+ console.log(
77507
+ "[LO Manager] Calling onBulkAdd prop with validated data..."
77508
+ );
77441
77509
  await onBulkAdd(validationResult.valid);
77442
77510
  } else {
77443
77511
  console.log("[LO Manager] No valid records to import.");
77444
77512
  }
77445
77513
  };
77446
- return /* @__PURE__ */ React119__namespace.default.createElement(Card, null, /* @__PURE__ */ React119__namespace.default.createElement(CardHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__namespace.default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__namespace.default.createElement(Lightbulb, { className: "mr-2 h-5 w-5 text-primary" }), " Manage Learning Objectives"), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__namespace.default.createElement(MetadataImportControls, { metadataName: "Learning Objectives", onImport: handleImport }), /* @__PURE__ */ React119__namespace.default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__namespace.default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Learning Objective")))), /* @__PURE__ */ React119__namespace.default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__namespace.default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Learning Objectives found.") : /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(Table2, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(TableRow, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Topic"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__namespace.default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__namespace.default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-mono text-xs" }, item.code), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-medium" }, item.name), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.subject || item.subjectCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.topic || item.topicCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__namespace.default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleEditItem(item), className: "mr-2" }, /* @__PURE__ */ React119__namespace.default.createElement(PenLine, { className: "h-4 w-4" })), /* @__PURE__ */ React119__namespace.default.createElement(Button, { variant: "ghost", size: "icon", onClick: () => handleDeleteItem(item), className: "text-destructive hover:text-destructive" }, /* @__PURE__ */ React119__namespace.default.createElement(Trash2, { className: "h-4 w-4" })))))))), /* @__PURE__ */ React119__namespace.default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__namespace.default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(DialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "code" }, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "code", value: formState.code || "", onChange: (e2) => handleFormChange("code", e2.target.value.toUpperCase()), disabled: !!currentItem })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "name", value: formState.name || "", onChange: (e2) => handleFormChange("name", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subject" }, "Subject Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "subject", value: formState.subject || "", onChange: (e2) => handleFormChange("subject", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React119__namespace.default.createElement(EditableCombobox, { options: subjects.map((s2) => ({ value: s2.code, label: s2.name })), value: formState.subjectCode || "", onChange: (val) => handleFormChange("subjectCode", val), placeholder: "Select a subject..." }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "category" }, "Category Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "category", value: formState.category || "", onChange: (e2) => handleFormChange("category", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "categoryCode", value: formState.categoryCode || "", onChange: (e2) => handleFormChange("categoryCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topic" }, "Topic Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "topic", value: formState.topic || "", onChange: (e2) => handleFormChange("topic", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "topicCode", value: formState.topicCode || "", onChange: (e2) => handleFormChange("topicCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "grade" }, "Grade Name"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "grade", value: formState.grade || "", onChange: (e2) => handleFormChange("grade", e2.target.value) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React119__namespace.default.createElement(Input, { id: "gradeCode", value: formState.gradeCode || "", onChange: (e2) => handleFormChange("gradeCode", e2.target.value) }))), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "keywords", value: formState.keywords?.join(", ") || "", onChange: (e2) => handleFormChange("keywords", e2.target.value.split(",").map((s2) => s2.trim())) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "stemElements", value: formState.stemElements?.join(", ") || "", onChange: (e2) => handleFormChange("stemElements", e2.target.value.split(",").map((s2) => s2.trim())) })), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(Textarea, { id: "bloomLevelsGuideline", value: formState.bloomLevelsGuideline?.join(", ") || "", onChange: (e2) => handleFormChange("bloomLevelsGuideline", e2.target.value.split(",").map((s2) => s2.trim())) }))), /* @__PURE__ */ React119__namespace.default.createElement(DialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(Button, { type: "button", variant: "outline", onClick: () => setIsDialogOpen(false), disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(Button, { type: "submit", onClick: handleSubmit, disabled: isPending || !formState.name?.trim() || !formState.code?.trim() }, isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Save")))), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.name, '".')), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogAction2, { onClick: confirmDelete, disabled: isPending, className: "bg-destructive hover:bg-destructive/90" }, isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }), " Delete"))))));
77514
+ return /* @__PURE__ */ React119__namespace.default.createElement(Card, null, /* @__PURE__ */ React119__namespace.default.createElement(CardHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(CardTitle, { className: "flex justify-between items-center" }, /* @__PURE__ */ React119__namespace.default.createElement("span", { className: "flex items-center" }, /* @__PURE__ */ React119__namespace.default.createElement(Lightbulb, { className: "mr-2 h-5 w-5 text-primary" }), " ", "Manage Learning Objectives"), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex items-center gap-2" }, onBulkAdd && /* @__PURE__ */ React119__namespace.default.createElement(
77515
+ MetadataImportControls,
77516
+ {
77517
+ metadataName: "Learning Objectives",
77518
+ onImport: handleImport
77519
+ }
77520
+ ), /* @__PURE__ */ React119__namespace.default.createElement(Button, { onClick: handleAddItem, size: "sm" }, /* @__PURE__ */ React119__namespace.default.createElement(CirclePlus, { className: "mr-2 h-4 w-4" }), " Add Learning Objective")))), /* @__PURE__ */ React119__namespace.default.createElement(CardContent, null, isLoading ? /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "flex justify-center items-center h-32" }, /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "h-8 w-8 animate-spin text-primary" })) : items.length === 0 ? /* @__PURE__ */ React119__namespace.default.createElement("p", { className: "text-center text-muted-foreground py-4" }, "No Learning Objectives found.") : /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "overflow-x-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(Table2, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(TableRow, null, /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Name"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Subject"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, null, "Topic"), /* @__PURE__ */ React119__namespace.default.createElement(TableHead, { className: "text-right w-[120px]" }, "Actions"))), /* @__PURE__ */ React119__namespace.default.createElement(TableBody, null, items.map((item) => /* @__PURE__ */ React119__namespace.default.createElement(TableRow, { key: item.id }, /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-mono text-xs" }, item.code), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "font-medium" }, item.name), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.subject || item.subjectCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, null, item.topic || item.topicCode), /* @__PURE__ */ React119__namespace.default.createElement(TableCell, { className: "text-right" }, /* @__PURE__ */ React119__namespace.default.createElement(
77521
+ Button,
77522
+ {
77523
+ variant: "ghost",
77524
+ size: "icon",
77525
+ onClick: () => handleEditItem(item),
77526
+ className: "mr-2"
77527
+ },
77528
+ /* @__PURE__ */ React119__namespace.default.createElement(PenLine, { className: "h-4 w-4" })
77529
+ ), /* @__PURE__ */ React119__namespace.default.createElement(
77530
+ Button,
77531
+ {
77532
+ variant: "ghost",
77533
+ size: "icon",
77534
+ onClick: () => handleDeleteItem(item),
77535
+ className: "text-destructive hover:text-destructive"
77536
+ },
77537
+ /* @__PURE__ */ React119__namespace.default.createElement(Trash2, { className: "h-4 w-4" })
77538
+ ))))))), /* @__PURE__ */ React119__namespace.default.createElement(Dialog2, { open: isDialogOpen, onOpenChange: setIsDialogOpen }, /* @__PURE__ */ React119__namespace.default.createElement(DialogContent2, { className: "sm:max-w-2xl max-h-[90vh] overflow-y-auto" }, /* @__PURE__ */ React119__namespace.default.createElement(DialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(DialogTitle2, null, currentItem ? "Edit Learning Objective" : "Add New Learning Objective")), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid gap-4 py-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "code" }, "Code"), /* @__PURE__ */ React119__namespace.default.createElement(
77539
+ Input,
77540
+ {
77541
+ id: "code",
77542
+ value: formState.code || "",
77543
+ onChange: (e2) => handleFormChange(
77544
+ "code",
77545
+ e2.target.value.toUpperCase()
77546
+ ),
77547
+ disabled: !!currentItem
77548
+ }
77549
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "name" }, "Name (Description)"), /* @__PURE__ */ React119__namespace.default.createElement(
77550
+ Input,
77551
+ {
77552
+ id: "name",
77553
+ value: formState.name || "",
77554
+ onChange: (e2) => handleFormChange(
77555
+ "name",
77556
+ e2.target.value
77557
+ )
77558
+ }
77559
+ ))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subject" }, "Subject Name"), /* @__PURE__ */ React119__namespace.default.createElement(
77560
+ Input,
77561
+ {
77562
+ id: "subject",
77563
+ value: formState.subject || "",
77564
+ onChange: (e2) => handleFormChange(
77565
+ "subject",
77566
+ e2.target.value
77567
+ )
77568
+ }
77569
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "subjectCode" }, "Subject Code"), /* @__PURE__ */ React119__namespace.default.createElement(
77570
+ EditableCombobox,
77571
+ {
77572
+ options: subjects.map((s2) => ({
77573
+ value: s2.code,
77574
+ label: s2.name
77575
+ })),
77576
+ value: formState.subjectCode || "",
77577
+ onChange: (val) => handleFormChange("subjectCode", val),
77578
+ placeholder: "Select a subject..."
77579
+ }
77580
+ ))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "category" }, "Category Name"), /* @__PURE__ */ React119__namespace.default.createElement(
77581
+ Input,
77582
+ {
77583
+ id: "category",
77584
+ value: formState.category || "",
77585
+ onChange: (e2) => handleFormChange(
77586
+ "category",
77587
+ e2.target.value
77588
+ )
77589
+ }
77590
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "categoryCode" }, "Category Code"), /* @__PURE__ */ React119__namespace.default.createElement(
77591
+ Input,
77592
+ {
77593
+ id: "categoryCode",
77594
+ value: formState.categoryCode || "",
77595
+ onChange: (e2) => handleFormChange(
77596
+ "categoryCode",
77597
+ e2.target.value
77598
+ )
77599
+ }
77600
+ ))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topic" }, "Topic Name"), /* @__PURE__ */ React119__namespace.default.createElement(
77601
+ Input,
77602
+ {
77603
+ id: "topic",
77604
+ value: formState.topic || "",
77605
+ onChange: (e2) => handleFormChange(
77606
+ "topic",
77607
+ e2.target.value
77608
+ )
77609
+ }
77610
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "topicCode" }, "Topic Code"), /* @__PURE__ */ React119__namespace.default.createElement(
77611
+ Input,
77612
+ {
77613
+ id: "topicCode",
77614
+ value: formState.topicCode || "",
77615
+ onChange: (e2) => handleFormChange(
77616
+ "topicCode",
77617
+ e2.target.value
77618
+ )
77619
+ }
77620
+ ))), /* @__PURE__ */ React119__namespace.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "grade" }, "Grade Name"), /* @__PURE__ */ React119__namespace.default.createElement(
77621
+ Input,
77622
+ {
77623
+ id: "grade",
77624
+ value: formState.grade || "",
77625
+ onChange: (e2) => handleFormChange(
77626
+ "grade",
77627
+ e2.target.value
77628
+ )
77629
+ }
77630
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "gradeCode" }, "Grade Code"), /* @__PURE__ */ React119__namespace.default.createElement(
77631
+ Input,
77632
+ {
77633
+ id: "gradeCode",
77634
+ value: formState.gradeCode || "",
77635
+ onChange: (e2) => handleFormChange(
77636
+ "gradeCode",
77637
+ e2.target.value
77638
+ )
77639
+ }
77640
+ ))), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "keywords" }, "Keywords (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
77641
+ Textarea,
77642
+ {
77643
+ id: "keywords",
77644
+ value: formState.keywords?.join(", ") || "",
77645
+ onChange: (e2) => handleFormChange(
77646
+ "keywords",
77647
+ e2.target.value.split(",").map((s2) => s2.trim())
77648
+ )
77649
+ }
77650
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "stemElements" }, "STEM Elements (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
77651
+ Textarea,
77652
+ {
77653
+ id: "stemElements",
77654
+ value: formState.stemElements?.join(", ") || "",
77655
+ onChange: (e2) => handleFormChange(
77656
+ "stemElements",
77657
+ e2.target.value.split(",").map((s2) => s2.trim())
77658
+ )
77659
+ }
77660
+ )), /* @__PURE__ */ React119__namespace.default.createElement("div", null, /* @__PURE__ */ React119__namespace.default.createElement(Label2, { htmlFor: "bloomLevelsGuideline" }, "Bloom's Guideline (comma-separated)"), /* @__PURE__ */ React119__namespace.default.createElement(
77661
+ Textarea,
77662
+ {
77663
+ id: "bloomLevelsGuideline",
77664
+ value: formState.bloomLevelsGuideline?.join(
77665
+ ", "
77666
+ ) || "",
77667
+ onChange: (e2) => handleFormChange(
77668
+ "bloomLevelsGuideline",
77669
+ e2.target.value.split(",").map((s2) => s2.trim())
77670
+ )
77671
+ }
77672
+ ))), /* @__PURE__ */ React119__namespace.default.createElement(DialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(
77673
+ Button,
77674
+ {
77675
+ type: "button",
77676
+ variant: "outline",
77677
+ onClick: () => setIsDialogOpen(false),
77678
+ disabled: isPending
77679
+ },
77680
+ "Cancel"
77681
+ ), /* @__PURE__ */ React119__namespace.default.createElement(
77682
+ Button,
77683
+ {
77684
+ type: "submit",
77685
+ onClick: handleSubmit,
77686
+ disabled: isPending || !formState.name?.trim() || !formState.code?.trim()
77687
+ },
77688
+ isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }),
77689
+ " ",
77690
+ "Save"
77691
+ )))), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialog2, { open: isAlertOpen, onOpenChange: setIsAlertOpen }, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogContent2, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogHeader, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogTitle2, null, "Are you sure?"), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogDescription2, null, 'This will permanently delete "', itemToDelete?.name, '".')), /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogFooter, null, /* @__PURE__ */ React119__namespace.default.createElement(AlertDialogCancel2, { disabled: isPending }, "Cancel"), /* @__PURE__ */ React119__namespace.default.createElement(
77692
+ AlertDialogAction2,
77693
+ {
77694
+ onClick: confirmDelete,
77695
+ disabled: isPending,
77696
+ className: "bg-destructive hover:bg-destructive/90"
77697
+ },
77698
+ isPending && /* @__PURE__ */ React119__namespace.default.createElement(LoaderCircle, { className: "mr-2 h-4 w-4 animate-spin" }),
77699
+ " ",
77700
+ "Delete"
77701
+ ))))));
77447
77702
  }
77448
77703
 
77449
77704
  // src/react-ui/components/metadata/ContextManager.tsx
@@ -2,7 +2,7 @@ export { B as BaseQuestion, e as BlocklyProgrammingQuestion, C as CodingQuestion
2
2
  export { APIKeyService, AchievementService, Approach, ApproachTableRawDifficulty, BloomLevelName, BloomLevelType, Category, CodeNamedEntity, Context, GEMINI_API_KEY_SERVICE_NAME, GradeLevel, KnowledgeCardService, KnowledgeDimension, LearningObjective, MetadataService, PracticeHistoryService, QuestionBankService, QuestionImportService, QuestionInBank, QuestionTypeType, QuizEditorService, QuizEngine, QuizEngineCallbacks, QuizEngineConstructorOptions, QuoteService, SCORMService, StandardDifficulty, Subject, Topic, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz } from './index.cjs';
3
3
  export { i as Achievement, j as AchievementDefinition, r as ActivityCalendarData, u as AnalysisReport, A as AnswerDetail, x as ChatContext, C as ChatMessage, v as DashboardCardConfig, D as DashboardCardId, w as DashboardLayout, y as Goal, G as GoalType, t as ImageContextItem, I as ImportError, K as KnowledgeCard, L as LearningAnalysis, e as PerformanceByBloomLevel, b as PerformanceByCategory, d as PerformanceByDifficulty, P as PerformanceByLearningObjective, c as PerformanceByTopic, f as PerformanceMetric, s as PerformanceSummary, k as PracticeDifficulty, n as PracticeSession, p as PracticeSessionSummary, o as PracticeStats, m as PracticeSuggestion, l as PracticeSuggestionTopic, q as PracticeTopicSummary, g as QuestionReview, Q as QuizResultType, h as QuizReviewContent, R as RoadmapItem, T as TestCaseResult, U as UserAnswerType, a as UserAnswers, W as WeeklyRoadmap } from './ai-ecosystem-DyQYZbyX.cjs';
4
4
  export { AssessAndMapDocumentClientInput, AssessAndMapDocumentOutput, BloomLevelStringsForAI, GenerateCodingQuestionClientInput, GenerateCodingQuestionOutput, GenerateFillInTheBlanksQuestionClientInput, GenerateFillInTheBlanksQuestionOutput, GenerateLearningAnalysisClientInput, GenerateLearningAnalysisOutput, GenerateMCQQuestionClientInput, GenerateMCQQuestionOutput, GenerateMRQQuestionClientInput, GenerateMRQQuestionOutput, GenerateMatchingQuestionClientInput, GenerateMatchingQuestionOutput, GenerateMotivationalQuoteClientInput, GenerateMotivationalQuoteOutput, GenerateNumericQuestionClientInput, GenerateNumericQuestionOutput, GeneratePracticeSuggestionClientInput, GeneratePracticeSuggestionOutput, GenerateQuestionsFromQuizPlanClientInput, GenerateQuestionsFromQuizPlanOutput, GenerateQuizFromTextClientInput, GenerateQuizFromTextOutput, GenerateQuizPlanClientInput, GenerateQuizPlanOutput, GenerateQuizReviewClientInput, GenerateQuizReviewOutput, GenerateSequenceQuestionClientInput, GenerateSequenceQuestionOutput, GenerateShortAnswerQuestionClientInput, GenerateShortAnswerQuestionOutput, GenerateSingleKnowledgeCardClientInput, GenerateSingleKnowledgeCardOutput, GenerateTrueFalseQuestionClientInput, GenerateTrueFalseQuestionOutput, PlanKnowledgeCardsClientInput, PlanKnowledgeCardsOutput, PlannedQuestion, assessAndMapDocument, generateCodingQuestion, generateFillInTheBlanksQuestion, generateLearningAnalysis, generateMCQQuestion, generateMRQQuestion, generateMatchingQuestion, generateMotivationalQuote, generateNumericQuestion, generatePracticeSuggestion, generateQuestionsFromQuizPlan, generateQuizFromText, generateQuizPlan, generateQuizReview, generateSequenceQuestion, generateShortAnswerQuestion, generateSingleKnowledgeCard, generateTrueFalseQuestion, planKnowledgeCards } from './ai.cjs';
5
- export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-BWaJj0l-.cjs';
5
+ export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-6AR8w2TO.cjs';
6
6
  import 'clsx';
7
7
  import 'zod';
8
8
  import 'react';
@@ -2,7 +2,7 @@ export { B as BaseQuestion, e as BlocklyProgrammingQuestion, C as CodingQuestion
2
2
  export { APIKeyService, AchievementService, Approach, ApproachTableRawDifficulty, BloomLevelName, BloomLevelType, Category, CodeNamedEntity, Context, GEMINI_API_KEY_SERVICE_NAME, GradeLevel, KnowledgeCardService, KnowledgeDimension, LearningObjective, MetadataService, PracticeHistoryService, QuestionBankService, QuestionImportService, QuestionInBank, QuestionTypeType, QuizEditorService, QuizEngine, QuizEngineCallbacks, QuizEngineConstructorOptions, QuoteService, SCORMService, StandardDifficulty, Subject, Topic, UserConfigService, cn, emptyQuiz, exportQuizAsSCORMZip, generateLauncherHTML, generateSCORMManifest, generateUniqueId, sampleQuiz } from './index.js';
3
3
  export { i as Achievement, j as AchievementDefinition, r as ActivityCalendarData, u as AnalysisReport, A as AnswerDetail, x as ChatContext, C as ChatMessage, v as DashboardCardConfig, D as DashboardCardId, w as DashboardLayout, y as Goal, G as GoalType, t as ImageContextItem, I as ImportError, K as KnowledgeCard, L as LearningAnalysis, e as PerformanceByBloomLevel, b as PerformanceByCategory, d as PerformanceByDifficulty, P as PerformanceByLearningObjective, c as PerformanceByTopic, f as PerformanceMetric, s as PerformanceSummary, k as PracticeDifficulty, n as PracticeSession, p as PracticeSessionSummary, o as PracticeStats, m as PracticeSuggestion, l as PracticeSuggestionTopic, q as PracticeTopicSummary, g as QuestionReview, Q as QuizResultType, h as QuizReviewContent, R as RoadmapItem, T as TestCaseResult, U as UserAnswerType, a as UserAnswers, W as WeeklyRoadmap } from './ai-ecosystem-Qa_SdE2T.js';
4
4
  export { AssessAndMapDocumentClientInput, AssessAndMapDocumentOutput, BloomLevelStringsForAI, GenerateCodingQuestionClientInput, GenerateCodingQuestionOutput, GenerateFillInTheBlanksQuestionClientInput, GenerateFillInTheBlanksQuestionOutput, GenerateLearningAnalysisClientInput, GenerateLearningAnalysisOutput, GenerateMCQQuestionClientInput, GenerateMCQQuestionOutput, GenerateMRQQuestionClientInput, GenerateMRQQuestionOutput, GenerateMatchingQuestionClientInput, GenerateMatchingQuestionOutput, GenerateMotivationalQuoteClientInput, GenerateMotivationalQuoteOutput, GenerateNumericQuestionClientInput, GenerateNumericQuestionOutput, GeneratePracticeSuggestionClientInput, GeneratePracticeSuggestionOutput, GenerateQuestionsFromQuizPlanClientInput, GenerateQuestionsFromQuizPlanOutput, GenerateQuizFromTextClientInput, GenerateQuizFromTextOutput, GenerateQuizPlanClientInput, GenerateQuizPlanOutput, GenerateQuizReviewClientInput, GenerateQuizReviewOutput, GenerateSequenceQuestionClientInput, GenerateSequenceQuestionOutput, GenerateShortAnswerQuestionClientInput, GenerateShortAnswerQuestionOutput, GenerateSingleKnowledgeCardClientInput, GenerateSingleKnowledgeCardOutput, GenerateTrueFalseQuestionClientInput, GenerateTrueFalseQuestionOutput, PlanKnowledgeCardsClientInput, PlanKnowledgeCardsOutput, PlannedQuestion, assessAndMapDocument, generateCodingQuestion, generateFillInTheBlanksQuestion, generateLearningAnalysis, generateMCQQuestion, generateMRQQuestion, generateMatchingQuestion, generateMotivationalQuote, generateNumericQuestion, generatePracticeSuggestion, generateQuestionsFromQuizPlan, generateQuizFromText, generateQuizPlan, generateQuizReview, generateSequenceQuestion, generateShortAnswerQuestion, generateSingleKnowledgeCard, generateTrueFalseQuestion, planKnowledgeCards } from './ai.js';
5
- export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-BVaUJA6E.js';
5
+ export { c as AIFullQuizGeneratorModal, A as AIQuestionGeneratorModal, e as APIKeyManagerModal, f as ApiKeySettings, m as ApproachManager, B as BloomLevelManager, C as CategoryManager, l as ContextManager, E as EditQuestionModal, G as GradeLevelManager, I as ImportQuestionsModal, L as LearningObjectiveManager, n as MetadataImportControls, M as MetadataTabs, h as QuestionFilters, i as QuestionFormDialog, g as QuestionList, a as QuestionPreviewModal, k as QuestionTypeManager, Q as QuizAuthoringTool, b as QuizSettingsForm, d as SCORMExportModal, S as SelectedQuestionsPanel, j as SubjectManager, o as Toaster, T as TopicManager, t as toast, u as useToast } from './toaster-DAXYZdrz.js';
6
6
  import 'clsx';
7
7
  import 'zod';
8
8
  import 'react';