@doenet/doenetml 0.7.21-dev.416 → 0.7.21-dev.417

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 (133) hide show
  1. package/{AnswerResponseButton-Dd0HJDB-.js → AnswerResponseButton-DRQPLlOM.js} +2 -2
  2. package/{Description-CeSquB0w.js → Description-DzHJcqCq.js} +1 -1
  3. package/{GraphFrame-7iZnp0Pp.js → GraphFrame-BrgLBP-l.js} +2 -2
  4. package/{JSXGraphRenderer-CH3Etvtx.js → JSXGraphRenderer-3rMxl-PD.js} +3 -2
  5. package/{NonInlineMediaWrapper-BPKCeJoI.js → NonInlineMediaWrapper-CTSA5ztb.js} +1 -1
  6. package/Viewer/DocViewer.d.ts.map +1 -1
  7. package/Viewer/renderers/JSXGraphRenderer.d.ts.map +1 -1
  8. package/Viewer/renderers/_error.d.ts.map +1 -1
  9. package/Viewer/renderers/cell.d.ts.map +1 -1
  10. package/Viewer/renderers/feedback.d.ts.map +1 -1
  11. package/Viewer/renderers/fractionInput.d.ts.map +1 -1
  12. package/Viewer/renderers/hint.d.ts.map +1 -1
  13. package/Viewer/renderers/mathInput.d.ts.map +1 -1
  14. package/Viewer/renderers/mathquill/EditableMathField.d.ts.map +1 -1
  15. package/Viewer/renderers/matrixInput.d.ts.map +1 -1
  16. package/Viewer/renderers/orbitalDiagram.d.ts.map +1 -1
  17. package/Viewer/renderers/orbitalDiagramInput.d.ts.map +1 -1
  18. package/Viewer/renderers/prefigure.d.ts.map +1 -1
  19. package/Viewer/renderers/pretzel.d.ts.map +1 -1
  20. package/Viewer/renderers/row.d.ts.map +1 -1
  21. package/Viewer/renderers/section.d.ts.map +1 -1
  22. package/Viewer/renderers/sideBySide.d.ts.map +1 -1
  23. package/Viewer/renderers/slider.d.ts.map +1 -1
  24. package/Viewer/renderers/solution.d.ts.map +1 -1
  25. package/Viewer/renderers/spreadsheet.d.ts.map +1 -1
  26. package/Viewer/renderers/subsetOfRealsInput.d.ts.map +1 -1
  27. package/Viewer/renderers/summaryStatistics.d.ts.map +1 -1
  28. package/Viewer/renderers/textInput.d.ts.map +1 -1
  29. package/Viewer/renderers/utils/direction.d.ts +39 -0
  30. package/Viewer/renderers/utils/direction.d.ts.map +1 -0
  31. package/{_error-BpXkUOcQ.js → _error-BIkDYkum.js} +4 -3
  32. package/{alert-Dl4SKpDl.js → alert-40qlFB8j.js} +3 -3
  33. package/{angle-CHPAoa9_.js → angle-BOqYrXfU.js} +6 -6
  34. package/{answer-BfTY7xDk.js → answer-Dgwe0dei.js} +6 -6
  35. package/{asList-CIPYtO56.js → asList-B1sJDQs3.js} +2 -2
  36. package/{blockQuote-eD4WN8NB.js → blockQuote-BsG2geQs.js} +3 -3
  37. package/{boolean-AcXpBTjc.js → boolean-N29Fwify.js} +2 -2
  38. package/{booleanInput-D1KVVjD0.js → booleanInput-CcgJltzp.js} +7 -7
  39. package/{br-sGi9NZV-.js → br-BQAkKbws.js} +2 -2
  40. package/{button-zm1xKQ6P.js → button-D3QT17Wd.js} +4 -4
  41. package/{c-CS1KT-i7.js → c-Daf8CQwR.js} +3 -3
  42. package/{cell-DOy9dHlG.js → cell-BNmEKrA0.js} +3 -3
  43. package/{choiceInput-BGjmqGv1.js → choiceInput-DWcLPKV7.js} +8 -8
  44. package/{circle-CdXs4vCM.js → circle-L-xmtaHy.js} +6 -6
  45. package/{cobwebPolyline-nbaAuj6B.js → cobwebPolyline-BVdEUH2r.js} +4 -4
  46. package/{codeEditor-AH1NzGY5.js → codeEditor-D0xuKEXG.js} +2 -2
  47. package/{composites-_Ju1qHUH.js → composites-Dxl9i1nS.js} +1 -1
  48. package/{containerBlock-BJZA-hug.js → containerBlock-CdpPaxoi.js} +4 -4
  49. package/{containerInline-CErx1TlK.js → containerInline-DHFXTqAT.js} +4 -4
  50. package/{curve-CtGjIZZT.js → curve-5OW8O5t-.js} +4 -4
  51. package/direction-BwrU7jHk.js +9 -0
  52. package/{doenetml-CKC903On.js → doenetml-DynV7ZDD.js} +341 -102
  53. package/doenetml-external-worker.js +2 -2
  54. package/doenetml-inline-worker.js +2 -2
  55. package/doenetml.d.ts.map +1 -1
  56. package/{ellipsis-DfMIkq56.js → ellipsis-BJoPJy0v.js} +2 -2
  57. package/{em-C68xPdDA.js → em-C4h-YkRj.js} +3 -3
  58. package/{embed-EmlL532k.js → embed-CjlH0jbC.js} +2 -2
  59. package/{feedback-BWaksokN.js → feedback-EFnq4fTf.js} +6 -5
  60. package/{figure-DNohFiU-.js → figure-BiAWioqb.js} +3 -3
  61. package/{fillPatterns-BC4vIjlx.js → fillPatterns-DmAM78RG.js} +1 -1
  62. package/{footnote-C3cESiVn.js → footnote-U6eszrz5.js} +3 -3
  63. package/{fractionInput-CbT0Fr4D.js → fractionInput-Xkm2Vb3z.js} +7 -7
  64. package/{graph-Shoc8JnU.js → graph-BShdY7M2.js} +6 -6
  65. package/{hint-CNCxpEVu.js → hint-BJlVCHDc.js} +6 -5
  66. package/{hr-DccnD0xy.js → hr-D15XJLML.js} +2 -2
  67. package/{image-DKmanipP.js → image-unzIQyP1.js} +7 -7
  68. package/{index-dmesrz8k.js → index-D-0t5xCk.js} +1 -1
  69. package/{index.es-DEgUxk1r.js → index.es-B8Vdrw0-.js} +1 -1
  70. package/index.js +1 -1
  71. package/{label-iXHeUsem.js → label-D8LiLGZ0.js} +6 -6
  72. package/{labelWithLatex-DtXSmigp.js → labelWithLatex-VCThzoHG.js} +1 -1
  73. package/{legend-P8bA66Pn.js → legend-wHw8PHjz.js} +4 -4
  74. package/{line-DVW3oKW5.js → line-BcmltQzB.js} +6 -6
  75. package/{lineFamilyDragHandlers-Clzykt4r.js → lineFamilyDragHandlers-HSo2HwSH.js} +1 -1
  76. package/{lineSegment-CMfI8CzX.js → lineSegment-BYs7yPxL.js} +5 -5
  77. package/{list-D_mXsSXQ.js → list-79YU2kl7.js} +4 -4
  78. package/{lq-CyXQKGzw.js → lq-PHOAGpAp.js} +2 -2
  79. package/{lsq-CKkVotjY.js → lsq-DAA0vTFL.js} +2 -2
  80. package/{markupRenderer-D1tNv_Bq.js → markupRenderer-BJWUpWkE.js} +1 -1
  81. package/{math-DcMrHfiM.js → math-BVfjIEHd.js} +6 -6
  82. package/{mathInput-CM0oZNJB.js → mathInput-BtcN3WJR.js} +36 -19
  83. package/{matrixInput-FuKpVk_a.js → matrixInput-lugF0Kwk.js} +8 -8
  84. package/{mdash-BABxuRC_.js → mdash-DB7_sXiL.js} +2 -2
  85. package/{nbsp-CUYTxD8h.js → nbsp-j9m7y0-y.js} +2 -2
  86. package/{ndash-B-SHbaFG.js → ndash-COenOscW.js} +2 -2
  87. package/{number-BluUugiB.js → number-C5IDajKV.js} +6 -6
  88. package/{orbitalDiagram-CcsEMNH5.js → orbitalDiagram-LpaATJ7G.js} +10 -3
  89. package/{orbitalDiagramInput-BaR6FltQ.js → orbitalDiagramInput-CYnhgICY.js} +13 -6
  90. package/{p-DMbbK7I1.js → p-COajOvYn.js} +4 -4
  91. package/package.json +1 -1
  92. package/{paginatorControls-B-F1HpS4.js → paginatorControls-DzpHO-mO.js} +2 -2
  93. package/{pegboard-BGC31Eyq.js → pegboard-BdfertiY.js} +4 -4
  94. package/{point-BT1XGRo9.js → point-BLFxaE8O.js} +6 -6
  95. package/{polygon-Cfu9QrkP.js → polygon-DSoochqM.js} +6 -6
  96. package/{polyline-san0khs-.js → polyline-CTIot66d.js} +5 -5
  97. package/{pre-BHN7blJZ.js → pre-xCSl5oZL.js} +3 -3
  98. package/{prefigure-C7f9UcnA.js → prefigure-FCWzkIVy.js} +2 -1
  99. package/{pretzel-CmIYOB8F.js → pretzel-RAJStYo8.js} +9 -6
  100. package/{q-tXX3oDTu.js → q-DRh3HpI-.js} +3 -3
  101. package/{ray-BMK7xaAg.js → ray-CG-m02gI.js} +5 -5
  102. package/{ref-65DT_x0u.js → ref-C2DexbxV.js} +2 -2
  103. package/{regionBetweenCurveXAxis-BsTsPQRg.js → regionBetweenCurveXAxis-C1iatjqu.js} +5 -5
  104. package/{regionBetweenCurves-C_M-pjuM.js → regionBetweenCurves-Cv-DJCUB.js} +5 -5
  105. package/{row-DKwY5fZc.js → row-DUzsOO4i.js} +2 -2
  106. package/{rq-aLJVzNtD.js → rq-DBf5-NZS.js} +2 -2
  107. package/{rsq-Bi1u3srM.js → rsq-CRwgd5gN.js} +2 -2
  108. package/{section-C_bOjYSJ.js → section-CEh-TNeP.js} +47 -50
  109. package/{sha256-Bzrm4-tO-BdovCL5S.js → sha256-Bzrm4-tO-D5VzcQ6q.js} +1 -1
  110. package/{sideBySide-C5qw_QnB.js → sideBySide-C_9_ghNz.js} +8 -2
  111. package/{slider-CikiyeRf.js → slider-DOgzk4EE.js} +34 -25
  112. package/{solution-DiHy7pvG.js → solution-CKUSv0BJ.js} +6 -5
  113. package/{spreadsheet-B389Kps5.js → spreadsheet-P7U0r_qV.js} +3 -2
  114. package/{sq-BhDFF5Cb.js → sq-CTORexcM.js} +3 -3
  115. package/style.css +240 -176
  116. package/{subsetOfRealsInput-9DbCcLIh.js → subsetOfRealsInput-CsAQMYD4.js} +71 -61
  117. package/{summaryStatistics-DqJOzS1v.js → summaryStatistics-BBREeWvh.js} +4 -3
  118. package/{table-DgP2sNth.js → table-Bhb19es1.js} +2 -2
  119. package/{tabular-CqOenfoA.js → tabular-DBI3KqQP.js} +2 -2
  120. package/{tag-B2133YF1.js → tag-BtGckMpT.js} +2 -2
  121. package/{text-Glel7vRT.js → text-7k2wXfRf.js} +6 -6
  122. package/{textInput-fbHYsYbe.js → textInput-lbnI_I3U.js} +8 -8
  123. package/{tooltip-provider-uV4ynrST.js → tooltip-provider-C8VlkKT9.js} +1 -1
  124. package/{useAnchoredGraphDragHandler-CKCVFGYp.js → useAnchoredGraphDragHandler-CRPtaTJZ.js} +1 -1
  125. package/useDoenetRenderer-By1VsaDX.js +114 -0
  126. package/{useSubmitActionWithDelay-DhUttTXy.js → useSubmitActionWithDelay-DBCED73A.js} +2 -2
  127. package/utils/diagnostics.d.ts +7 -0
  128. package/utils/diagnostics.d.ts.map +1 -1
  129. package/utils/i18n.d.ts +67 -1
  130. package/utils/i18n.d.ts.map +1 -1
  131. package/{vector-B1xF7lTk.js → vector-lV5ajE68.js} +6 -6
  132. package/{video-DgvfU8N7.js → video-C-iSvsQk.js} +4 -4
  133. package/useDoenetRenderer-B-lvSi_Q.js +0 -114
package/style.css CHANGED
@@ -276,6 +276,10 @@ div.jxgbox input[type="checkbox"] {
276
276
 
277
277
  /* CSS rules for the navigation bar */
278
278
 
279
+ /*
280
+ * Physical `right`, because the board this sits in is pinned to `dir="ltr"` in
281
+ * `JSXGraphRenderer.tsx` — a graph is coordinate space and does not mirror.
282
+ */
279
283
  .JXG_navigation {
280
284
  position: absolute;
281
285
  right: 5px;
@@ -465,159 +469,178 @@ div.jxgbox input[type="checkbox"] {
465
469
  End JSXGraph styles
466
470
  **************************************************/
467
471
  .inline {
468
- display: inline;
472
+ display: inline;
469
473
  }
470
474
 
471
475
  .overline {
472
- text-decoration-line: overline;
476
+ text-decoration-line: overline;
473
477
  }
474
478
 
475
479
  .blur {
476
- --tw-blur: blur(8px);
477
- filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
480
+ --tw-blur: blur(8px);
481
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
478
482
  }
479
483
 
480
484
  .filter {
481
- filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
485
+ filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
482
486
  }
483
487
 
484
488
  .keyboard-button {
485
- display: inline-flex;
486
- height: 2.5rem;
487
- max-width: 4em;
488
- flex-grow: 1;
489
- flex-basis: 1rem;
490
- justify-content: center;
491
- align-items: center;
492
- border-radius: 0.375rem;
493
- border-width: 1px;
494
- --tw-border-opacity: 1;
495
- border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
489
+ display: inline-flex;
490
+ height: 2.5rem;
491
+ max-width: 4em;
492
+ flex-grow: 1;
493
+ flex-basis: 1rem;
494
+ justify-content: center;
495
+ align-items: center;
496
+ border-radius: 0.375rem;
497
+ border-width: 1px;
498
+ --tw-border-opacity: 1;
499
+ border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
496
500
  }
497
501
 
498
502
  .keyboard-button:hover {
499
- --tw-bg-opacity: 1;
500
- background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1));
503
+ --tw-bg-opacity: 1;
504
+ background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1));
501
505
  }
502
506
 
503
507
  .keyboard-button:active {
504
- --tw-bg-opacity: 1;
505
- background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
508
+ --tw-bg-opacity: 1;
509
+ background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
506
510
  }
507
511
 
508
512
  .special-button {
509
- --tw-border-opacity: 1;
510
- border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));
511
- --tw-bg-opacity: 1;
512
- background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
513
+ --tw-border-opacity: 1;
514
+ border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));
515
+ --tw-bg-opacity: 1;
516
+ background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
513
517
  }
514
518
 
515
519
  .special-button:hover {
516
- --tw-border-opacity: 1;
517
- border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
518
- --tw-bg-opacity: 1;
519
- background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
520
+ --tw-border-opacity: 1;
521
+ border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
522
+ --tw-bg-opacity: 1;
523
+ background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
520
524
  }
521
525
 
522
526
  .special-button:active {
523
- --tw-border-opacity: 1;
524
- border-color: rgb(148 163 184 / var(--tw-border-opacity, 1));
525
- --tw-bg-opacity: 1;
526
- background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1));
527
- --tw-text-opacity: 1;
528
- color: rgb(248 250 252 / var(--tw-text-opacity, 1));
527
+ --tw-border-opacity: 1;
528
+ border-color: rgb(148 163 184 / var(--tw-border-opacity, 1));
529
+ --tw-bg-opacity: 1;
530
+ background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1));
531
+ --tw-text-opacity: 1;
532
+ color: rgb(248 250 252 / var(--tw-text-opacity, 1));
533
+ }
534
+
535
+ /*
536
+ * The keys are mathematical notation, so they stay left-to-right even when the
537
+ * tray around them is right-to-left. Every row is a flex row and every region a
538
+ * grid, both of which reverse under `rtl`, so an Arabic reader would otherwise
539
+ * get a mirrored QWERTY and a numeric pad running 3-2-1. The cursor keys are
540
+ * the sharpest case: `.key-left` sends MathQuill a `Left` keystroke whatever
541
+ * the CSS says, so a reversed row would leave the `←` key sitting on the right
542
+ * and moving the caret the other way.
543
+ *
544
+ * Stated here rather than as a `dir` attribute because `Keyboard` returns a
545
+ * different element per style; one rule covers all of them. The tab strip is
546
+ * included: its labels are `123`, `f(x)`, `ABC`, `αβγ` and `$%∞`, none of which
547
+ * is prose.
548
+ */
549
+ .virtual-keyboard,
550
+ .virtual-keyboard-tab-list {
551
+ direction: ltr;
529
552
  }
530
553
 
531
554
  .virtual-keyboard {
532
- display: flex;
533
- max-width: 42rem;
534
- justify-content: center;
535
- row-gap: 0.25rem;
536
- -moz-column-gap: 0.75rem;
537
- column-gap: 0.75rem;
555
+ display: flex;
556
+ max-width: 42rem;
557
+ justify-content: center;
558
+ row-gap: 0.25rem;
559
+ -moz-column-gap: 0.75rem;
560
+ column-gap: 0.75rem;
538
561
  }
539
562
 
540
563
  @media (min-width: 640px) {
541
564
 
542
- .virtual-keyboard {
543
- row-gap: 0.5rem;
544
- }
565
+ .virtual-keyboard {
566
+ row-gap: 0.5rem;
567
+ }
545
568
  }
546
569
 
547
570
  .virtual-keyboard {
548
- flex-wrap: wrap;
571
+ flex-wrap: wrap;
549
572
  }
550
573
 
551
574
  @media (min-width: 640px) {
552
575
 
553
- .virtual-keyboard {
554
- flex-wrap: nowrap;
555
- }
576
+ .virtual-keyboard {
577
+ flex-wrap: nowrap;
578
+ }
556
579
  }
557
580
 
558
581
  .virtual-keyboard .row {
559
- display: flex;
560
- flex-basis: 100%;
561
- justify-content: center;
562
- -moz-column-gap: 0.25rem;
563
- column-gap: 0.25rem;
582
+ display: flex;
583
+ flex-basis: 100%;
584
+ justify-content: center;
585
+ -moz-column-gap: 0.25rem;
586
+ column-gap: 0.25rem;
564
587
  }
565
588
 
566
589
  @media (min-width: 640px) {
567
590
 
568
- .virtual-keyboard .row {
569
- -moz-column-gap: 0.5rem;
570
- column-gap: 0.5rem;
571
- }
591
+ .virtual-keyboard .row {
592
+ -moz-column-gap: 0.5rem;
593
+ column-gap: 0.5rem;
594
+ }
572
595
  }
573
596
 
574
597
  .virtual-keyboard .keyboard-region {
575
- display: grid;
576
- grid-template-columns: repeat(4, minmax(0, 1fr));
577
- -moz-column-gap: 0.25rem;
578
- column-gap: 0.25rem;
579
- row-gap: 0.25rem;
598
+ display: grid;
599
+ grid-template-columns: repeat(4, minmax(0, 1fr));
600
+ -moz-column-gap: 0.25rem;
601
+ column-gap: 0.25rem;
602
+ row-gap: 0.25rem;
580
603
  }
581
604
 
582
605
  @media (min-width: 640px) {
583
606
 
584
- .virtual-keyboard .keyboard-region {
585
- -moz-column-gap: 0.5rem;
586
- column-gap: 0.5rem;
587
- row-gap: 0.5rem;
588
- }
607
+ .virtual-keyboard .keyboard-region {
608
+ -moz-column-gap: 0.5rem;
609
+ column-gap: 0.5rem;
610
+ row-gap: 0.5rem;
611
+ }
589
612
  }
590
613
 
591
614
  .virtual-keyboard .keyboard-region .key {
592
- padding-left: 0.5rem;
593
- padding-right: 0.5rem;
615
+ padding-left: 0.5rem;
616
+ padding-right: 0.5rem;
594
617
  }
595
618
 
596
619
  @media (min-width: 640px) {
597
620
 
598
- .virtual-keyboard .keyboard-region .key {
599
- padding-left: 1rem;
600
- padding-right: 1rem;
601
- }
621
+ .virtual-keyboard .keyboard-region .key {
622
+ padding-left: 1rem;
623
+ padding-right: 1rem;
624
+ }
602
625
  }
603
626
 
604
627
  .virtual-keyboard .sub-keyboard {
605
- display: flex;
606
- max-width: 42rem;
607
- flex-wrap: wrap;
608
- justify-content: center;
609
- row-gap: 0.25rem;
628
+ display: flex;
629
+ max-width: 42rem;
630
+ flex-wrap: wrap;
631
+ justify-content: center;
632
+ row-gap: 0.25rem;
610
633
  }
611
634
 
612
635
  @media (min-width: 640px) {
613
636
 
614
- .virtual-keyboard .sub-keyboard {
615
- row-gap: 0.5rem;
616
- }
637
+ .virtual-keyboard .sub-keyboard {
638
+ row-gap: 0.5rem;
639
+ }
617
640
  }
618
641
 
619
642
  .virtual-keyboard .sub-keyboard {
620
- height: 100%;
643
+ height: 100%;
621
644
  }
622
645
 
623
646
  .virtual-keyboard button {
@@ -636,26 +659,26 @@ div.jxgbox input[type="checkbox"] {
636
659
  }
637
660
 
638
661
  .virtual-keyboard button:hover {
639
- --tw-bg-opacity: 1;
640
- background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1));
662
+ --tw-bg-opacity: 1;
663
+ background-color: rgb(241 245 249 / var(--tw-bg-opacity, 1));
641
664
  }
642
665
 
643
666
  .virtual-keyboard button:active {
644
- --tw-bg-opacity: 1;
645
- background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
667
+ --tw-bg-opacity: 1;
668
+ background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
646
669
  }
647
670
 
648
671
  .virtual-keyboard .break {
649
- height: 0px;
650
- flex-basis: 100%;
672
+ height: 0px;
673
+ flex-basis: 100%;
651
674
  }
652
675
 
653
676
  .virtual-keyboard .key {
654
- font-weight: 700;
677
+ font-weight: 700;
655
678
  }
656
679
 
657
680
  .virtual-keyboard .key.math {
658
- font-weight: 400;
681
+ font-weight: 400;
659
682
  }
660
683
 
661
684
  .virtual-keyboard .key-space,
@@ -664,10 +687,10 @@ div.jxgbox input[type="checkbox"] {
664
687
  .virtual-keyboard .key-right,
665
688
  .virtual-keyboard .key-shift,
666
689
  .virtual-keyboard .key-enter {
667
- --tw-border-opacity: 1;
668
- border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));
669
- --tw-bg-opacity: 1;
670
- background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
690
+ --tw-border-opacity: 1;
691
+ border-color: rgb(226 232 240 / var(--tw-border-opacity, 1));
692
+ --tw-bg-opacity: 1;
693
+ background-color: rgb(226 232 240 / var(--tw-bg-opacity, 1));
671
694
  }
672
695
 
673
696
  .virtual-keyboard .key-space:hover,
@@ -676,10 +699,10 @@ div.jxgbox input[type="checkbox"] {
676
699
  .virtual-keyboard .key-right:hover,
677
700
  .virtual-keyboard .key-shift:hover,
678
701
  .virtual-keyboard .key-enter:hover {
679
- --tw-border-opacity: 1;
680
- border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
681
- --tw-bg-opacity: 1;
682
- background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
702
+ --tw-border-opacity: 1;
703
+ border-color: rgb(203 213 225 / var(--tw-border-opacity, 1));
704
+ --tw-bg-opacity: 1;
705
+ background-color: rgb(203 213 225 / var(--tw-bg-opacity, 1));
683
706
  }
684
707
 
685
708
  .virtual-keyboard .key-space:active,
@@ -688,23 +711,23 @@ div.jxgbox input[type="checkbox"] {
688
711
  .virtual-keyboard .key-right:active,
689
712
  .virtual-keyboard .key-shift:active,
690
713
  .virtual-keyboard .key-enter:active {
691
- --tw-border-opacity: 1;
692
- border-color: rgb(148 163 184 / var(--tw-border-opacity, 1));
693
- --tw-bg-opacity: 1;
694
- background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1));
695
- --tw-text-opacity: 1;
696
- color: rgb(248 250 252 / var(--tw-text-opacity, 1));
714
+ --tw-border-opacity: 1;
715
+ border-color: rgb(148 163 184 / var(--tw-border-opacity, 1));
716
+ --tw-bg-opacity: 1;
717
+ background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1));
718
+ --tw-text-opacity: 1;
719
+ color: rgb(248 250 252 / var(--tw-text-opacity, 1));
697
720
  }
698
721
 
699
722
  .virtual-keyboard .key-shift,
700
723
  .virtual-keyboard .key-backspace {
701
- max-width: none;
702
- flex-grow: 1;
724
+ max-width: none;
725
+ flex-grow: 1;
703
726
  }
704
727
 
705
728
  .virtual-keyboard .key-space {
706
- max-width: none;
707
- flex-grow: 1;
729
+ max-width: none;
730
+ flex-grow: 1;
708
731
  }
709
732
 
710
733
  .virtual-keyboard .svg-inline--fa {
@@ -713,37 +736,37 @@ div.jxgbox input[type="checkbox"] {
713
736
  }
714
737
 
715
738
  .virtual-keyboard.numeric .key-backspace {
716
- max-width: 4em;
739
+ max-width: 4em;
717
740
  }
718
741
  .virtual-keyboard.alpha,
719
742
  .virtual-keyboard.greek {
720
- flex-wrap: wrap;
743
+ flex-wrap: wrap;
721
744
  }
722
745
  .virtual-keyboard.symbol .keyboard-region {
723
- grid-template-columns: repeat(5, minmax(0, 1fr));
746
+ grid-template-columns: repeat(5, minmax(0, 1fr));
724
747
  }
725
748
 
726
749
  .virtual-keyboard-tab-list {
727
- display: flex;
728
- flex-wrap: nowrap;
750
+ display: flex;
751
+ flex-wrap: nowrap;
729
752
  }
730
753
 
731
754
  .virtual-keyboard-tab-list button {
732
- margin-bottom: 0.75rem;
733
- border-bottom-width: 2px;
734
- padding: 0.25rem;
735
- padding-left: 0.25rem;
736
- padding-right: 0.25rem;
737
- padding-bottom: 0.25rem;
755
+ margin-bottom: 0.75rem;
756
+ border-bottom-width: 2px;
757
+ padding: 0.25rem;
758
+ padding-left: 0.25rem;
759
+ padding-right: 0.25rem;
760
+ padding-bottom: 0.25rem;
738
761
  }
739
762
 
740
763
  @media (min-width: 640px) {
741
764
 
742
- .virtual-keyboard-tab-list button {
743
- padding: 0.5rem;
744
- padding-left: 0.75rem;
745
- padding-right: 0.75rem;
746
- }
765
+ .virtual-keyboard-tab-list button {
766
+ padding: 0.5rem;
767
+ padding-left: 0.75rem;
768
+ padding-right: 0.75rem;
769
+ }
747
770
  }
748
771
 
749
772
  .virtual-keyboard-tab-list button {
@@ -755,10 +778,10 @@ div.jxgbox input[type="checkbox"] {
755
778
  }
756
779
 
757
780
  .virtual-keyboard-tab-list button[aria-selected="true"] {
758
- --tw-border-opacity: 1;
759
- border-color: rgb(96 165 250 / var(--tw-border-opacity, 1));
760
- --tw-text-opacity: 1;
761
- color: rgb(37 99 235 / var(--tw-text-opacity, 1));
781
+ --tw-border-opacity: 1;
782
+ border-color: rgb(96 165 250 / var(--tw-border-opacity, 1));
783
+ --tw-text-opacity: 1;
784
+ color: rgb(37 99 235 / var(--tw-text-opacity, 1));
762
785
  }
763
786
  /*
764
787
  Tailwind base is purposely not included because we want all styles to be prefixed. We manually copy in whatever is needed from tailwind preflight.
@@ -855,7 +878,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
855
878
  #virtual-keyboard-tray .close-keyboard-button {
856
879
  position: absolute;
857
880
  top: 0px;
858
- right: 0px;
881
+ inset-inline-end: 0px;
859
882
  margin: 0.5rem;
860
883
  border-radius: 0.25rem;
861
884
  }
@@ -881,17 +904,20 @@ Tailwind base is purposely not included because we want all styles to be prefixe
881
904
  }
882
905
 
883
906
  /*
884
- * Right-edge footprint of this button (w-12 + me-4 = 4rem) is mirrored
907
+ * Inline-end footprint of this button (w-12 + me-4 = 4rem) is mirrored
885
908
  * by `--keyboard-tab-reserve-width` in
886
909
  * `packages/doenetml/src/EditorViewer/editor-viewer.css` so the editor
887
- * footer can shift its rightmost element inward to clear it. Keep the
888
- * two values in sync.
910
+ * footer can shift its last element inward to clear it. Keep the two
911
+ * values in sync — and keep both on the *same* axis. `end-0` here pairs
912
+ * with `margin-inline-end` there; making one logical and leaving the
913
+ * other physical would send the tab and the space reserved for it to
914
+ * opposite edges under `rtl`, which is worse than either alone.
889
915
  */
890
916
 
891
917
  #virtual-keyboard-tray .open-keyboard-button {
892
918
  position: absolute;
893
919
  top: -1.5rem;
894
- right: 0px;
920
+ inset-inline-end: 0px;
895
921
  margin-inline-end: 1rem;
896
922
  border-top-left-radius: 0.25rem;
897
923
  border-top-right-radius: 0.25rem;
@@ -1130,19 +1156,18 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1130
1156
  &:not(.vertical) {
1131
1157
  flex-direction: row;
1132
1158
  .doenet-button {
1133
- margin-left: 0;
1134
- margin-right: 0;
1159
+ margin-inline: 0;
1135
1160
  /* Remove border radius on all but the first and last buttons */
1136
1161
  &:not(:first-child):not(:last-child) {
1137
1162
  border-radius: 0;
1138
1163
  }
1139
1164
  &:first-child {
1140
- border-top-right-radius: 0;
1141
- border-bottom-right-radius: 0;
1165
+ border-start-end-radius: 0;
1166
+ border-end-end-radius: 0;
1142
1167
  }
1143
1168
  &:last-child {
1144
- border-top-left-radius: 0;
1145
- border-bottom-left-radius: 0;
1169
+ border-start-start-radius: 0;
1170
+ border-end-start-radius: 0;
1146
1171
  }
1147
1172
  }
1148
1173
  }
@@ -1157,12 +1182,12 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1157
1182
  border-radius: 0;
1158
1183
  }
1159
1184
  &:first-child {
1160
- border-bottom-left-radius: 0;
1161
- border-bottom-right-radius: 0;
1185
+ border-end-start-radius: 0;
1186
+ border-end-end-radius: 0;
1162
1187
  }
1163
1188
  &:last-child {
1164
- border-top-left-radius: 0;
1165
- border-top-right-radius: 0;
1189
+ border-start-start-radius: 0;
1190
+ border-start-end-radius: 0;
1166
1191
  }
1167
1192
  }
1168
1193
  }
@@ -1255,14 +1280,14 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1255
1280
 
1256
1281
  svg {
1257
1282
  flex-shrink: 0;
1258
- margin-left: 1px;
1283
+ margin-inline-start: 1px;
1259
1284
  }
1260
1285
 
1261
1286
  &.vertical {
1262
1287
  width: 100%;
1263
1288
  height: 10px;
1264
1289
  svg {
1265
- margin-left: 0;
1290
+ margin-inline-start: 0;
1266
1291
  margin-top: 0.5px;
1267
1292
  }
1268
1293
  }
@@ -1377,6 +1402,13 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1377
1402
  text-decoration-color: #9061d1;
1378
1403
  }
1379
1404
 
1405
+ /*
1406
+ * The `border-left-color` rules below stay physical for two reasons: they
1407
+ * recolor an accent bar CodeMirror itself declares as `border-left`, and
1408
+ * mixing a logical override onto a physical declaration leaves the cascade
1409
+ * deciding between two properties that mean the same thing; and the editor
1410
+ * they sit in is pinned to `dir="ltr"` anyway, because it renders source.
1411
+ */
1380
1412
  .cm-tooltip-lint
1381
1413
  .cm-diagnostic.cm-diagnostic-warning:has(
1382
1414
  .cm-lint-tooltip .heading.accessibility-level-1
@@ -1853,7 +1885,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1853
1885
  }
1854
1886
  .variant-select {
1855
1887
  display: flex;
1856
- margin-left: 0.5rem;
1888
+ margin-inline-start: 0.5rem;
1857
1889
 
1858
1890
  * {
1859
1891
  box-sizing: border-box;
@@ -1871,19 +1903,19 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1871
1903
  .select-button {
1872
1904
  width: 12em;
1873
1905
  justify-content: space-between;
1874
- border-top-right-radius: 0;
1875
- border-bottom-right-radius: 0;
1876
- margin-right: 0;
1906
+ border-start-end-radius: 0;
1907
+ border-end-end-radius: 0;
1908
+ margin-inline-end: 0;
1877
1909
  }
1878
1910
  .prev-next-button {
1879
- border-top-left-radius: 0;
1880
- border-bottom-left-radius: 0;
1881
- margin-left: 0;
1911
+ border-start-start-radius: 0;
1912
+ border-end-start-radius: 0;
1913
+ margin-inline-start: 0;
1882
1914
  }
1883
1915
  /* Make all .prev-next-button buttons except for the last one have zero border radius */
1884
1916
  .prev-next-button:not(:last-child) {
1885
- border-top-right-radius: 0;
1886
- border-bottom-right-radius: 0;
1917
+ border-start-end-radius: 0;
1918
+ border-end-end-radius: 0;
1887
1919
  }
1888
1920
 
1889
1921
  .wrapper {
@@ -1990,8 +2022,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
1990
2022
  border-radius: 0.25rem;
1991
2023
  border-style: none;
1992
2024
  background-color: hsl(204 20% 94%);
1993
- padding-left: 1rem;
1994
- padding-right: 1rem;
2025
+ padding-inline: 1rem;
1995
2026
  font-size: 1rem;
1996
2027
  line-height: 1.5rem;
1997
2028
  color: black;
@@ -2039,7 +2070,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2039
2070
 
2040
2071
  .editor-panel .footer-menu-button {
2041
2072
  all: unset;
2042
- margin-left: auto;
2073
+ margin-inline-start: auto;
2043
2074
  display: inline-flex;
2044
2075
  align-items: center;
2045
2076
  justify-content: center;
@@ -2057,25 +2088,29 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2057
2088
  }
2058
2089
 
2059
2090
  /*
2060
- * When the footer's right edge meets the virtual keyboard's open-keyboard
2091
+ * When the footer's trailing edge meets the virtual keyboard's open-keyboard
2061
2092
  * tab (showViewer={false} or viewerLocation in {"left","top"} with the
2062
- * keyboard enabled), push the rightmost footer element inward so the icons
2063
- * stay clickable. The reservation must match the keyboard tab's right-edge
2093
+ * keyboard enabled), push the last footer element inward so the icons stay
2094
+ * clickable. The reservation must match the keyboard tab's inline-end
2064
2095
  * footprint (`w-12` + `me-4` = 3rem + 1rem) defined in
2065
2096
  * `packages/virtual-keyboard/src/virtual-keyboard/keyboard-tray.css`. Keep
2066
2097
  * this value in sync if that footprint changes. Very narrow viewports may
2067
2098
  * still let the tab and the icons collide; that's accepted.
2099
+ *
2100
+ * Logical, and it has to stay paired with the tab's own `end-0`: the tab is
2101
+ * portaled to `document.body`, so nothing but this axis agreement keeps the
2102
+ * space and the thing it is reserved for on the same side of the screen.
2068
2103
  */
2069
2104
  .editor-panel .editor-footer.reserve-keyboard-button-space {
2070
2105
  --keyboard-tab-reserve-width: 4rem;
2071
2106
  }
2072
2107
  .editor-panel .editor-footer.reserve-keyboard-button-space .footer-menu-button {
2073
- margin-right: var(--keyboard-tab-reserve-width);
2108
+ margin-inline-end: var(--keyboard-tab-reserve-width);
2074
2109
  }
2075
2110
  .editor-panel
2076
2111
  .editor-footer.reserve-keyboard-button-space:not(:has(.footer-menu-button))
2077
2112
  .footer-icons {
2078
- margin-right: var(--keyboard-tab-reserve-width);
2113
+ margin-inline-end: var(--keyboard-tab-reserve-width);
2079
2114
  }
2080
2115
 
2081
2116
  .editor-panel .footer-menu {
@@ -2168,7 +2203,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2168
2203
 
2169
2204
  .editor-panel .diagnostic-tab-count {
2170
2205
  min-width: 1.5ch;
2171
- text-align: right;
2206
+ text-align: end;
2172
2207
  font-variant-numeric: tabular-nums;
2173
2208
  }
2174
2209
 
@@ -2246,7 +2281,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2246
2281
 
2247
2282
  .editor-panel .diagnostic-entry-location {
2248
2283
  font-weight: 600;
2249
- margin-right: 0.35rem;
2284
+ margin-inline-end: 0.35rem;
2250
2285
  }
2251
2286
 
2252
2287
  /* Dark mode overrides for .diagnostic-entry-message code — see [data-theme="dark"] block below. */
@@ -2522,6 +2557,8 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2522
2557
  * Active-line gutter: CodeMirror base theme uses #e2f2ff (light blue), which
2523
2558
  * is garish on a dark gutter. Use a barely-lighter #363636 instead.
2524
2559
  */
2560
+ /* Physical, matching CodeMirror's own gutter rule; the editor renders source
2561
+ and is pinned to `dir="ltr"` in `CodeMirror.tsx`. */
2525
2562
  [data-theme="dark"] .editor-panel .cm-gutters {
2526
2563
  background-color: #1e1e1e;
2527
2564
  color: #8b949e;
@@ -2830,7 +2867,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2830
2867
  .doenet-viewer .radio-container {
2831
2868
  display: block;
2832
2869
  position: relative;
2833
- padding-left: 24px;
2870
+ padding-inline-start: 24px;
2834
2871
  margin-bottom: 4px;
2835
2872
  min-height: 24px;
2836
2873
  cursor: pointer;
@@ -2871,7 +2908,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2871
2908
  .doenet-viewer .radio-checkmark {
2872
2909
  position: absolute;
2873
2910
  top: 0;
2874
- left: 0;
2911
+ inset-inline-start: 0;
2875
2912
  height: 18px;
2876
2913
  width: 18px;
2877
2914
  background-color: var(--mainGray);
@@ -2934,7 +2971,14 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2934
2971
  display: block;
2935
2972
  }
2936
2973
 
2937
- /* Style the indicator (dot/circle) */
2974
+ /*
2975
+ * Style the indicator (dot/circle).
2976
+ *
2977
+ * Physical `left` on purpose: this centers a 6px dot in the 18px marker box
2978
+ * above, whose own position is what follows the direction. Inside a
2979
+ * fixed-size box the two are the same offset, and keeping it physical says
2980
+ * that the glyph itself is not what mirrors.
2981
+ */
2938
2982
  .doenet-viewer .radio-container .radio-checkmark:after {
2939
2983
  top: 6px;
2940
2984
  left: 6px;
@@ -2950,7 +2994,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2950
2994
  .doenet-viewer .checkbox-container {
2951
2995
  display: block;
2952
2996
  position: relative;
2953
- padding-left: 24px;
2997
+ padding-inline-start: 24px;
2954
2998
  margin-bottom: 4px;
2955
2999
  min-height: 24px;
2956
3000
  cursor: pointer;
@@ -2993,7 +3037,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
2993
3037
  .doenet-viewer .checkbox-checkmark {
2994
3038
  position: absolute;
2995
3039
  top: 0;
2996
- left: 0;
3040
+ inset-inline-start: 0;
2997
3041
  height: 18px;
2998
3042
  width: 18px;
2999
3043
  background-color: var(--mainGray);
@@ -3056,7 +3100,14 @@ Tailwind base is purposely not included because we want all styles to be prefixe
3056
3100
  display: block;
3057
3101
  }
3058
3102
 
3059
- /* Style the checkmark/indicator */
3103
+ /*
3104
+ * Style the checkmark/indicator.
3105
+ *
3106
+ * Physical `left` on purpose: the tick is two borders of a rotated box, and a
3107
+ * check mark is the same shape and sits at the same offset within its own box
3108
+ * in every language. The marker box around it is what follows the direction.
3109
+ * Same rule, same reason, as `booleanInput.css`.
3110
+ */
3060
3111
  .doenet-viewer .checkbox-container .checkbox-checkmark:after {
3061
3112
  left: 5px;
3062
3113
  top: 1px;
@@ -3141,10 +3192,10 @@ Tailwind base is purposely not included because we want all styles to be prefixe
3141
3192
  /* `display: inline-block` and `vertical-align` are set inline in
3142
3193
  booleanInput.tsx so the checkbox flows beside a wrapping label (#1245). */
3143
3194
  position: relative;
3144
- padding-left: 24px;
3195
+ padding-inline-start: 24px;
3145
3196
  margin-bottom: 4px;
3146
- margin-right: 2px; /* 2px less than other components (6px marginRight) due to the 2px marginLeft on label */
3147
- margin-left: 4px;
3197
+ margin-inline-end: 2px; /* 2px less than other components (6px inline-end margin) due to the 2px inline-start margin on label */
3198
+ margin-inline-start: 4px;
3148
3199
  cursor: pointer;
3149
3200
  -webkit-user-select: none;
3150
3201
  -moz-user-select: none;
@@ -3181,7 +3232,7 @@ Tailwind base is purposely not included because we want all styles to be prefixe
3181
3232
  .doenet-viewer .checkmark {
3182
3233
  position: absolute;
3183
3234
  top: 0;
3184
- left: 0;
3235
+ inset-inline-start: 0;
3185
3236
  height: 18px;
3186
3237
  width: 18px;
3187
3238
  background-color: var(--mainGray);
@@ -3239,7 +3290,13 @@ Tailwind base is purposely not included because we want all styles to be prefixe
3239
3290
  display: block;
3240
3291
  }
3241
3292
 
3242
- /* Style the checkmark/indicator */
3293
+ /*
3294
+ * Style the checkmark/indicator.
3295
+ *
3296
+ * Physical `left` on purpose: the tick is two borders of a rotated box, and a
3297
+ * check mark is the same shape and sits at the same offset within its own box
3298
+ * in every language. The marker box around it is what follows the direction.
3299
+ */
3243
3300
  .doenet-viewer .boolean-container .checkmark:after {
3244
3301
  left: 5px;
3245
3302
  top: 1px;
@@ -3968,6 +4025,13 @@ html body .mq-editable-field .mq-selection .mq-nthroot-container * {
3968
4025
  height: 1px;
3969
4026
  box-sizing: content-box;
3970
4027
  }
4028
+ /*
4029
+ * The brackets stay physical, and deliberately so: `matrixInput.tsx` pins this
4030
+ * element to `dir="ltr"`, because a matrix is notation and does not mirror.
4031
+ * There is no direction here for a logical property to follow, and writing one
4032
+ * would suggest the brackets could swap ends — which would leave the opening
4033
+ * bracket closing and the closing one opening.
4034
+ */
3971
4035
  .doenet-viewer .matrix-input {
3972
4036
  position: relative;
3973
4037
  margin: 6px;
@@ -4058,8 +4122,8 @@ html body .mq-editable-field .mq-selection .mq-nthroot-container * {
4058
4122
  .pretzelWrapper {
4059
4123
  display: grid;
4060
4124
  gap: 0px;
4061
- border-left: 1px solid var(--canvasText);
4062
- border-right: 1px solid var(--canvasText);
4125
+ /* Both sides, so the pair is the same either way round. */
4126
+ border-inline: 1px solid var(--canvasText);
4063
4127
  }
4064
4128
 
4065
4129
  .pretzelWrapperTop {