@doenet/v06-to-v07 0.7.25-dev.533 → 0.7.25-dev.535

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.
@@ -47272,7 +47272,7 @@ async function cidFromArrayBuffer(data) {
47272
47272
  await crypto.subtle.digest("SHA-256", new Uint8Array());
47273
47273
  digest = (data2) => crypto.subtle.digest("SHA-256", data2);
47274
47274
  } catch (e22) {
47275
- const sha256 = (await import("./sha256-DT5xJ2Hv-DKty3xQ2-KH0qtYEU.js").then((n2) => n2.s)).default;
47275
+ const sha256 = (await import("./sha256-DT5xJ2Hv-BVeLgYWQ-CHOh3hgV.js").then((n2) => n2.s)).default;
47276
47276
  digest = (data2) => sha256(data2, {
47277
47277
  asBytes: true
47278
47278
  });
@@ -74769,12 +74769,69 @@ function returnLocalizedDefaultStateVariableDefinition({
74769
74769
  }
74770
74770
  };
74771
74771
  }
74772
+ const BLANK_PLACEHOLDER = "_";
74773
+ function latexWithBlanksAsPlaceholders(latex) {
74774
+ return latex.split(MATH_BLANK_LATEX).join(BLANK_PLACEHOLDER);
74775
+ }
74776
+ function convertLatexWithBlanks(latex, convert) {
74777
+ return convert(latexWithBlanksAsPlaceholders(latex));
74778
+ }
74779
+ function embeddedChildContent(child) {
74780
+ const sv = child?.stateValues ?? {};
74781
+ if (typeof sv.latex === "string") {
74782
+ return sv.latex.trim();
74783
+ }
74784
+ if (typeof sv.text === "string") {
74785
+ return sv.text.trim();
74786
+ }
74787
+ if (Array.isArray(sv.selectedValues)) {
74788
+ return sv.selectedValues.map(
74789
+ (value) => typeof value?.toLatex === "function" ? value.toLatex() : String(value ?? "")
74790
+ ).filter((value) => value.trim() !== "").join(", ");
74791
+ }
74792
+ return "";
74793
+ }
74772
74794
  function returnScoredContainerAncestorDependency(...variableNames) {
74773
74795
  return {
74774
74796
  dependencyType: "ancestor",
74775
74797
  variableNames
74776
74798
  };
74777
74799
  }
74800
+ function mathTreeIsBlank(tree) {
74801
+ if (tree === BLANK_PLACEHOLDER) {
74802
+ return true;
74803
+ }
74804
+ if (Array.isArray(tree) && tree[0] === "matrix") {
74805
+ return matrixEntriesAreBlank(tree[2]);
74806
+ }
74807
+ return false;
74808
+ }
74809
+ function matrixEntriesAreBlank(tuple2) {
74810
+ return Array.isArray(tuple2) && tuple2[0] === "tuple" && tuple2.slice(1).every(
74811
+ (entry) => entry === BLANK_PLACEHOLDER || matrixEntriesAreBlank(entry)
74812
+ );
74813
+ }
74814
+ function responseIsBlank(response) {
74815
+ if (response === null || response === void 0) {
74816
+ return true;
74817
+ }
74818
+ if (typeof response === "string") {
74819
+ return response.trim() === "";
74820
+ }
74821
+ if (typeof response === "number") {
74822
+ return Number.isNaN(response);
74823
+ }
74824
+ if (Array.isArray(response)) {
74825
+ return response.every(responseIsBlank);
74826
+ }
74827
+ if (typeof response === "object" && "tree" in response) {
74828
+ return mathTreeIsBlank(response.tree);
74829
+ }
74830
+ return false;
74831
+ }
74832
+ function submittedResponsesAreBlank(submittedResponses) {
74833
+ return submittedResponses.every(responseIsBlank);
74834
+ }
74778
74835
  function returnStandardAnswerAttributes() {
74779
74836
  return {
74780
74837
  weight: {
@@ -75056,6 +75113,49 @@ function returnStandardAnswerStateVariableDefinition() {
75056
75113
  };
75057
75114
  }
75058
75115
  };
75116
+ stateVariableDefinitions.creditAchievedForProgress = {
75117
+ description: "The credit this answer contributes when deciding whether the content around it has been completed, as a `<cascade>` does. Equal to `creditAchieved`, except that a hand-graded answer counts as fully correct once a non-blank response has been submitted.",
75118
+ stateVariablesDeterminingDependencies: ["handGraded"],
75119
+ returnDependencies({ stateValues }) {
75120
+ const dependencies2 = {
75121
+ handGraded: {
75122
+ dependencyType: "stateVariable",
75123
+ variableName: "handGraded"
75124
+ }
75125
+ };
75126
+ if (stateValues.handGraded) {
75127
+ dependencies2.responseHasBeenSubmitted = {
75128
+ dependencyType: "stateVariable",
75129
+ variableName: "responseHasBeenSubmitted"
75130
+ };
75131
+ dependencies2.submittedResponses = {
75132
+ dependencyType: "stateVariable",
75133
+ variableName: "submittedResponses"
75134
+ };
75135
+ } else {
75136
+ dependencies2.creditAchieved = {
75137
+ dependencyType: "stateVariable",
75138
+ variableName: "creditAchieved"
75139
+ };
75140
+ }
75141
+ return dependencies2;
75142
+ },
75143
+ definition({ dependencyValues }) {
75144
+ if (!dependencyValues.handGraded) {
75145
+ return {
75146
+ setValue: {
75147
+ creditAchievedForProgress: dependencyValues.creditAchieved
75148
+ }
75149
+ };
75150
+ }
75151
+ const responded = dependencyValues.responseHasBeenSubmitted && !submittedResponsesAreBlank(
75152
+ dependencyValues.submittedResponses
75153
+ );
75154
+ return {
75155
+ setValue: { creditAchievedForProgress: responded ? 1 : 0 }
75156
+ };
75157
+ }
75158
+ };
75059
75159
  stateVariableDefinitions.autoSubmit = {
75060
75160
  returnDependencies: () => ({
75061
75161
  autoSubmit: {
@@ -83383,6 +83483,43 @@ class MathList extends CompositeComponent {
83383
83483
  return { replacementChanges, diagnostics: diagnostics2, nComponents };
83384
83484
  }
83385
83485
  }
83486
+ function returnAggregateCreditDependencies(variableName) {
83487
+ return function({ stateValues }) {
83488
+ const dependencies2 = {
83489
+ aggregateScores: {
83490
+ dependencyType: "stateVariable",
83491
+ variableName: "aggregateScores"
83492
+ }
83493
+ };
83494
+ if (stateValues.aggregateScores) {
83495
+ dependencies2.scoredDescendants = {
83496
+ dependencyType: "stateVariable",
83497
+ variableName: "scoredDescendants"
83498
+ };
83499
+ for (let [
83500
+ ind,
83501
+ descendant
83502
+ ] of stateValues.scoredDescendants.entries()) {
83503
+ dependencies2[variableName + ind] = {
83504
+ dependencyType: "stateVariable",
83505
+ componentIdx: descendant.componentIdx,
83506
+ variableName
83507
+ };
83508
+ }
83509
+ }
83510
+ return dependencies2;
83511
+ };
83512
+ }
83513
+ function aggregateCreditOverScoredDescendants(dependencyValues, variableName, creditWhenNothingScored = 1) {
83514
+ let creditSum = 0;
83515
+ let totalWeight = 0;
83516
+ for (let [ind, component] of dependencyValues.scoredDescendants.entries()) {
83517
+ const weight = component.stateValues.weight;
83518
+ creditSum += dependencyValues[variableName + ind] * weight;
83519
+ totalWeight += weight;
83520
+ }
83521
+ return totalWeight > 0 ? creditSum / totalWeight : creditWhenNothingScored;
83522
+ }
83386
83523
  function returnScoredSectionAttributes() {
83387
83524
  return {
83388
83525
  aggregateScores: {
@@ -83791,31 +83928,7 @@ function returnScoredSectionStateVariableDefinition() {
83791
83928
  "aggregateScores",
83792
83929
  "scoredDescendants"
83793
83930
  ],
83794
- returnDependencies({ stateValues }) {
83795
- let dependencies2 = {
83796
- aggregateScores: {
83797
- dependencyType: "stateVariable",
83798
- variableName: "aggregateScores"
83799
- }
83800
- };
83801
- if (stateValues.aggregateScores) {
83802
- dependencies2.scoredDescendants = {
83803
- dependencyType: "stateVariable",
83804
- variableName: "scoredDescendants"
83805
- };
83806
- for (let [
83807
- ind,
83808
- descendant
83809
- ] of stateValues.scoredDescendants.entries()) {
83810
- dependencies2["creditAchieved" + ind] = {
83811
- dependencyType: "stateVariable",
83812
- componentIdx: descendant.componentIdx,
83813
- variableName: "creditAchieved"
83814
- };
83815
- }
83816
- }
83817
- return dependencies2;
83818
- },
83931
+ returnDependencies: returnAggregateCreditDependencies("creditAchieved"),
83819
83932
  definition({ dependencyValues }) {
83820
83933
  if (!dependencyValues.aggregateScores) {
83821
83934
  return {
@@ -83825,57 +83938,51 @@ function returnScoredSectionStateVariableDefinition() {
83825
83938
  }
83826
83939
  };
83827
83940
  }
83828
- let creditSum = 0;
83829
- let totalWeight = 0;
83830
- for (let [
83831
- ind,
83832
- component
83833
- ] of dependencyValues.scoredDescendants.entries()) {
83834
- let weight = component.stateValues.weight;
83835
- creditSum += dependencyValues["creditAchieved" + ind] * weight;
83836
- totalWeight += weight;
83837
- }
83838
- let creditAchieved;
83839
- if (totalWeight > 0) {
83840
- creditAchieved = creditSum / totalWeight;
83841
- } else {
83842
- creditAchieved = 1;
83843
- }
83844
- let percentCreditAchieved = creditAchieved * 100;
83845
- return { setValue: { creditAchieved, percentCreditAchieved } };
83941
+ const creditAchieved = aggregateCreditOverScoredDescendants(
83942
+ dependencyValues,
83943
+ "creditAchieved"
83944
+ );
83945
+ return {
83946
+ setValue: {
83947
+ creditAchieved,
83948
+ percentCreditAchieved: creditAchieved * 100
83949
+ }
83950
+ };
83846
83951
  }
83847
83952
  };
83848
- stateVariableDefinitions.creditAchievedIfSubmit = {
83953
+ stateVariableDefinitions.creditAchievedForProgress = {
83954
+ description: "Aggregate credit achieved (between 0 and 1) for scored descendants of this section, used when deciding whether the section has been completed. Differs from `creditAchieved` only in that a hand-graded answer counts as fully correct once a non-blank response has been submitted.",
83849
83955
  defaultValue: 0,
83850
83956
  stateVariablesDeterminingDependencies: [
83851
83957
  "aggregateScores",
83852
83958
  "scoredDescendants"
83853
83959
  ],
83854
- returnDependencies({ stateValues }) {
83855
- let dependencies2 = {
83856
- aggregateScores: {
83857
- dependencyType: "stateVariable",
83858
- variableName: "aggregateScores"
83960
+ returnDependencies: returnAggregateCreditDependencies(
83961
+ "creditAchievedForProgress"
83962
+ ),
83963
+ definition({ dependencyValues }) {
83964
+ if (!dependencyValues.aggregateScores) {
83965
+ return { setValue: { creditAchievedForProgress: 0 } };
83966
+ }
83967
+ return {
83968
+ setValue: {
83969
+ creditAchievedForProgress: aggregateCreditOverScoredDescendants(
83970
+ dependencyValues,
83971
+ "creditAchievedForProgress"
83972
+ )
83859
83973
  }
83860
83974
  };
83861
- if (stateValues.aggregateScores) {
83862
- dependencies2.scoredDescendants = {
83863
- dependencyType: "stateVariable",
83864
- variableName: "scoredDescendants"
83865
- };
83866
- for (let [
83867
- ind,
83868
- descendant
83869
- ] of stateValues.scoredDescendants.entries()) {
83870
- dependencies2["creditAchievedIfSubmit" + ind] = {
83871
- dependencyType: "stateVariable",
83872
- componentIdx: descendant.componentIdx,
83873
- variableName: "creditAchievedIfSubmit"
83874
- };
83875
- }
83876
- }
83877
- return dependencies2;
83878
- },
83975
+ }
83976
+ };
83977
+ stateVariableDefinitions.creditAchievedIfSubmit = {
83978
+ defaultValue: 0,
83979
+ stateVariablesDeterminingDependencies: [
83980
+ "aggregateScores",
83981
+ "scoredDescendants"
83982
+ ],
83983
+ returnDependencies: returnAggregateCreditDependencies(
83984
+ "creditAchievedIfSubmit"
83985
+ ),
83879
83986
  definition({ dependencyValues }) {
83880
83987
  if (!dependencyValues.aggregateScores) {
83881
83988
  return {
@@ -83884,18 +83991,21 @@ function returnScoredSectionStateVariableDefinition() {
83884
83991
  }
83885
83992
  };
83886
83993
  }
83887
- let creditSum = 0;
83888
- let totalWeight = 0;
83889
- for (let [
83890
- ind,
83891
- component
83892
- ] of dependencyValues.scoredDescendants.entries()) {
83893
- let weight = component.stateValues.weight;
83894
- creditSum += dependencyValues["creditAchievedIfSubmit" + ind] * weight;
83895
- totalWeight += weight;
83896
- }
83897
- let creditAchievedIfSubmit = creditSum / totalWeight;
83898
- return { setValue: { creditAchievedIfSubmit } };
83994
+ return {
83995
+ setValue: {
83996
+ creditAchievedIfSubmit: aggregateCreditOverScoredDescendants(
83997
+ dependencyValues,
83998
+ "creditAchievedIfSubmit",
83999
+ // A section with nothing scored has always left
84000
+ // this at NaN — the `0 / 0` of the average it used
84001
+ // to take inline where `creditAchieved` gives
84002
+ // full credit. Passed explicitly so extracting the
84003
+ // shared helper preserves the behavior rather than
84004
+ // quietly changing it.
84005
+ NaN
84006
+ )
84007
+ }
84008
+ };
83899
84009
  }
83900
84010
  };
83901
84011
  stateVariableDefinitions.createSubmitAllButton = {
@@ -84729,28 +84839,6 @@ const Aliases = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
84729
84839
  YLabel,
84730
84840
  cascadeMessage
84731
84841
  }, Symbol.toStringTag, { value: "Module" }));
84732
- const BLANK_PLACEHOLDER = "_";
84733
- function latexWithBlanksAsPlaceholders(latex) {
84734
- return latex.split(MATH_BLANK_LATEX).join(BLANK_PLACEHOLDER);
84735
- }
84736
- function convertLatexWithBlanks(latex, convert) {
84737
- return convert(latexWithBlanksAsPlaceholders(latex));
84738
- }
84739
- function embeddedChildContent(child) {
84740
- const sv = child?.stateValues ?? {};
84741
- if (typeof sv.latex === "string") {
84742
- return sv.latex.trim();
84743
- }
84744
- if (typeof sv.text === "string") {
84745
- return sv.text.trim();
84746
- }
84747
- if (Array.isArray(sv.selectedValues)) {
84748
- return sv.selectedValues.map(
84749
- (value) => typeof value?.toLatex === "function" ? value.toLatex() : String(value ?? "")
84750
- ).filter((value) => value.trim() !== "").join(", ");
84751
- }
84752
- return "";
84753
- }
84754
84842
  let M$3 = class M extends InlineComponent {
84755
84843
  constructor(args) {
84756
84844
  super(args);
@@ -98940,6 +99028,16 @@ class SectioningComponent extends BlockComponent {
98940
99028
  defaultValue: "var(--lightGreen)",
98941
99029
  description: "Color used to indicate this section has been completed."
98942
99030
  };
99031
+ attributes.completedColorRequiresCredit = {
99032
+ createComponentOfType: "boolean",
99033
+ createStateVariable: "completedColorRequiresCreditPreliminary",
99034
+ // See the note on `showCorrectness` in
99035
+ // `returnScoredSectionAttributes`: this default is shown to authors
99036
+ // but is not what resolves the value, which falls back to the
99037
+ // enclosing section before reaching it.
99038
+ defaultValue: false,
99039
+ description: "Whether the completed color requires full `creditAchieved`, so that a section holding a hand-graded answer is not colored as completed until an instructor grades it. By default a hand-graded answer counts as completed once a non-blank response has been submitted. Affects only the color, not when a `<cascade>` advances."
99040
+ };
98943
99041
  attributes.inProgressColor = {
98944
99042
  createComponentOfType: "text",
98945
99043
  createStateVariable: "inProgressColor",
@@ -99570,6 +99668,30 @@ class SectioningComponent extends BlockComponent {
99570
99668
  return { setValue: { title, titlePrefix } };
99571
99669
  }
99572
99670
  };
99671
+ stateVariableDefinitions.completedColorRequiresCredit = {
99672
+ description: "Whether the heading bar's completion state is driven by the real `creditAchieved` rather than by progress, so that a hand-graded answer keeps the section from being colored as completed until an instructor grades it.",
99673
+ public: true,
99674
+ shadowingInstructions: {
99675
+ createComponentOfType: "boolean"
99676
+ },
99677
+ returnDependencies: () => ({
99678
+ completedColorRequiresCreditPreliminary: {
99679
+ dependencyType: "stateVariable",
99680
+ variableName: "completedColorRequiresCreditPreliminary"
99681
+ },
99682
+ completedColorRequiresCreditAncestor: {
99683
+ dependencyType: "ancestor",
99684
+ variableNames: ["completedColorRequiresCredit"]
99685
+ }
99686
+ }),
99687
+ definition({ dependencyValues, usedDefault }) {
99688
+ let completedColorRequiresCredit = dependencyValues.completedColorRequiresCreditPreliminary;
99689
+ if (usedDefault.completedColorRequiresCreditPreliminary && dependencyValues.completedColorRequiresCreditAncestor) {
99690
+ completedColorRequiresCredit = dependencyValues.completedColorRequiresCreditAncestor.stateValues.completedColorRequiresCredit;
99691
+ }
99692
+ return { setValue: { completedColorRequiresCredit } };
99693
+ }
99694
+ };
99573
99695
  stateVariableDefinitions.sectionTitleStateColors = {
99574
99696
  additionalStateVariablesDefined: [
99575
99697
  "sectionTitleStateColorsDarkMode",
@@ -99714,6 +99836,14 @@ class SectioningComponent extends BlockComponent {
99714
99836
  dependencyType: "stateVariable",
99715
99837
  variableName: "creditAchieved"
99716
99838
  },
99839
+ creditAchievedForProgress: {
99840
+ dependencyType: "stateVariable",
99841
+ variableName: "creditAchievedForProgress"
99842
+ },
99843
+ completedColorRequiresCredit: {
99844
+ dependencyType: "stateVariable",
99845
+ variableName: "completedColorRequiresCredit"
99846
+ },
99717
99847
  boxed: {
99718
99848
  dependencyType: "stateVariable",
99719
99849
  variableName: "boxed"
@@ -99725,7 +99855,7 @@ class SectioningComponent extends BlockComponent {
99725
99855
  }),
99726
99856
  definition({ dependencyValues }) {
99727
99857
  const titleStateKey = titleStateKeyFromCredit(
99728
- dependencyValues.creditAchieved
99858
+ dependencyValues.completedColorRequiresCredit ? dependencyValues.creditAchieved : dependencyValues.creditAchievedForProgress
99729
99859
  );
99730
99860
  const titleColor = dependencyValues.sectionTitleStateColors[titleStateKey];
99731
99861
  const titleColorDarkMode = dependencyValues.sectionTitleStateColorsDarkMode[titleStateKey];
@@ -125723,6 +125853,7 @@ class Document extends BaseComponent {
125723
125853
  returnScoredSectionStateVariableDefinition()
125724
125854
  );
125725
125855
  delete stateVariableDefinitions.aggregateScores;
125856
+ delete stateVariableDefinitions.creditAchievedForProgress;
125726
125857
  Object.assign(
125727
125858
  stateVariableDefinitions,
125728
125859
  returnSubmitLabelStateVariableDefinitions({
@@ -232285,13 +232416,13 @@ class Cascade extends SectioningComponent {
232285
232416
  children: {
232286
232417
  dependencyType: "child",
232287
232418
  childGroups: ["anything"],
232288
- variableNames: ["creditAchieved"],
232419
+ variableNames: ["creditAchievedForProgress"],
232289
232420
  variablesOptional: true
232290
232421
  }
232291
232422
  }),
232292
232423
  definition({ dependencyValues }) {
232293
232424
  const childCreditAchieved = dependencyValues.children.map(
232294
- (child) => child.stateValues?.creditAchieved ?? null
232425
+ (child) => child.stateValues?.creditAchievedForProgress ?? null
232295
232426
  );
232296
232427
  return { setValue: { childCreditAchieved } };
232297
232428
  }
@@ -239338,4 +239469,4 @@ export {
239338
239469
  getDefaultExportFromCjs$1 as g,
239339
239470
  updateSyntaxFromV06toV07 as u
239340
239471
  };
239341
- //# sourceMappingURL=index-6Spw9Yfi.js.map
239472
+ //# sourceMappingURL=index-Bin7pIAp.js.map