react-cheminfo 0.31.0 → 0.33.0

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 (103) hide show
  1. package/README.md +1 -0
  2. package/lib/core.d.ts +1 -0
  3. package/lib/core.d.ts.map +1 -1
  4. package/lib/core.js +1 -0
  5. package/lib/core.js.map +1 -1
  6. package/lib/i18n/core/chromeCatalog.d.ts +2 -2
  7. package/lib/i18n/core/chromeCatalog.d.ts.map +1 -1
  8. package/lib/i18n/core/chromeCatalog.js +10 -4
  9. package/lib/i18n/core/chromeCatalog.js.map +1 -1
  10. package/lib/i18n/core/index.d.ts +2 -0
  11. package/lib/i18n/core/index.d.ts.map +1 -1
  12. package/lib/i18n/core/index.js +1 -0
  13. package/lib/i18n/core/index.js.map +1 -1
  14. package/lib/i18n/core/languages.d.ts +4 -4
  15. package/lib/i18n/core/languages.d.ts.map +1 -1
  16. package/lib/i18n/core/languages.js +5 -4
  17. package/lib/i18n/core/languages.js.map +1 -1
  18. package/lib/i18n/core/prose.d.ts +32 -0
  19. package/lib/i18n/core/prose.d.ts.map +1 -0
  20. package/lib/i18n/core/prose.js +45 -0
  21. package/lib/i18n/core/prose.js.map +1 -0
  22. package/lib/i18n/ui/Prose.d.ts +28 -0
  23. package/lib/i18n/ui/Prose.d.ts.map +1 -0
  24. package/lib/i18n/ui/Prose.js +14 -0
  25. package/lib/i18n/ui/Prose.js.map +1 -0
  26. package/lib/i18n/ui/index.d.ts +2 -0
  27. package/lib/i18n/ui/index.d.ts.map +1 -1
  28. package/lib/i18n/ui/index.js +1 -0
  29. package/lib/i18n/ui/index.js.map +1 -1
  30. package/lib/locales/de.json +7 -1
  31. package/lib/locales/en.json +7 -1
  32. package/lib/locales/es.json +7 -1
  33. package/lib/locales/fr.json +7 -1
  34. package/lib/locales/it.json +459 -0
  35. package/lib/number/core/index.d.ts +2 -0
  36. package/lib/number/core/index.d.ts.map +1 -0
  37. package/lib/number/core/index.js +2 -0
  38. package/lib/number/core/index.js.map +1 -0
  39. package/lib/number/core/numberText.d.ts +46 -0
  40. package/lib/number/core/numberText.d.ts.map +1 -0
  41. package/lib/number/core/numberText.js +88 -0
  42. package/lib/number/core/numberText.js.map +1 -0
  43. package/lib/number/ui/NumberInput.d.ts +113 -0
  44. package/lib/number/ui/NumberInput.d.ts.map +1 -0
  45. package/lib/number/ui/NumberInput.js +100 -0
  46. package/lib/number/ui/NumberInput.js.map +1 -0
  47. package/lib/number/ui/index.d.ts +3 -0
  48. package/lib/number/ui/index.d.ts.map +1 -0
  49. package/lib/number/ui/index.js +2 -0
  50. package/lib/number/ui/index.js.map +1 -0
  51. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts +12 -2
  52. package/lib/orbital/ui/AtomicOrbitalCanvas.d.ts.map +1 -1
  53. package/lib/orbital/ui/AtomicOrbitalCanvas.js +17 -3
  54. package/lib/orbital/ui/AtomicOrbitalCanvas.js.map +1 -1
  55. package/lib/orbital/ui/AtomicOrbitalControls.d.ts +10 -5
  56. package/lib/orbital/ui/AtomicOrbitalControls.d.ts.map +1 -1
  57. package/lib/orbital/ui/AtomicOrbitalControls.js +12 -7
  58. package/lib/orbital/ui/AtomicOrbitalControls.js.map +1 -1
  59. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts +8 -1
  60. package/lib/orbital/ui/AtomicOrbitalViewer.d.ts.map +1 -1
  61. package/lib/orbital/ui/AtomicOrbitalViewer.js.map +1 -1
  62. package/lib/periodic/ui/ElementCell.d.ts +10 -0
  63. package/lib/periodic/ui/ElementCell.d.ts.map +1 -1
  64. package/lib/periodic/ui/ElementCell.js +124 -14
  65. package/lib/periodic/ui/ElementCell.js.map +1 -1
  66. package/lib/periodic/ui/PeriodicTable.d.ts.map +1 -1
  67. package/lib/periodic/ui/PeriodicTable.js +46 -19
  68. package/lib/periodic/ui/PeriodicTable.js.map +1 -1
  69. package/lib/periodic/ui/PeriodicTableChrome.js +2 -2
  70. package/lib/periodic/ui/PeriodicTableChrome.js.map +1 -1
  71. package/lib/spectra/ui/NumberField.d.ts +2 -5
  72. package/lib/spectra/ui/NumberField.d.ts.map +1 -1
  73. package/lib/spectra/ui/NumberField.js +4 -54
  74. package/lib/spectra/ui/NumberField.js.map +1 -1
  75. package/lib/ui.d.ts +1 -0
  76. package/lib/ui.d.ts.map +1 -1
  77. package/lib/ui.js +1 -0
  78. package/lib/ui.js.map +1 -1
  79. package/package.json +1 -1
  80. package/src/core.ts +1 -0
  81. package/src/i18n/core/chromeCatalog.ts +10 -4
  82. package/src/i18n/core/index.ts +2 -0
  83. package/src/i18n/core/languages.ts +5 -4
  84. package/src/i18n/core/prose.ts +53 -0
  85. package/src/i18n/ui/Prose.tsx +47 -0
  86. package/src/i18n/ui/index.ts +2 -0
  87. package/src/locales/de.json +7 -1
  88. package/src/locales/en.json +7 -1
  89. package/src/locales/es.json +7 -1
  90. package/src/locales/fr.json +7 -1
  91. package/src/locales/it.json +459 -0
  92. package/src/number/core/index.ts +6 -0
  93. package/src/number/core/numberText.ts +91 -0
  94. package/src/number/ui/NumberInput.tsx +300 -0
  95. package/src/number/ui/index.ts +7 -0
  96. package/src/orbital/ui/AtomicOrbitalCanvas.tsx +32 -5
  97. package/src/orbital/ui/AtomicOrbitalControls.tsx +26 -6
  98. package/src/orbital/ui/AtomicOrbitalViewer.tsx +8 -1
  99. package/src/periodic/ui/ElementCell.tsx +153 -14
  100. package/src/periodic/ui/PeriodicTable.tsx +51 -22
  101. package/src/periodic/ui/PeriodicTableChrome.tsx +2 -2
  102. package/src/spectra/ui/NumberField.tsx +11 -58
  103. package/src/ui.ts +1 -0
@@ -0,0 +1,113 @@
1
+ import type { CSSProperties, ReactElement } from 'react';
2
+ /** What every number box takes, whether or not it can be left empty. */
3
+ export interface NumberInputBaseProps {
4
+ /**
5
+ * Smallest accepted value, applied when the box is left rather than while it
6
+ * is typed in.
7
+ * @default undefined — unbounded below
8
+ */
9
+ min?: number;
10
+ /**
11
+ * Largest accepted value, applied when the box is left.
12
+ * @default undefined — unbounded above
13
+ */
14
+ max?: number;
15
+ /**
16
+ * What one press of an arrow key or a stepper button adds; Shift multiplies
17
+ * it by ten and Alt divides it by ten.
18
+ * @default 1
19
+ */
20
+ step?: number;
21
+ /**
22
+ * Whether only whole numbers are wanted. A typed decimal is rounded when the
23
+ * box is left.
24
+ * @default false
25
+ */
26
+ integer?: boolean;
27
+ /**
28
+ * Whether the up and down buttons are drawn beside the box.
29
+ * @default true
30
+ */
31
+ buttons?: boolean;
32
+ /**
33
+ * Grey text shown while the box is empty.
34
+ * @default undefined — the box carries no placeholder
35
+ */
36
+ placeholder?: string;
37
+ /** @default false */
38
+ disabled?: boolean;
39
+ /**
40
+ * Whether the control takes the whole width it is given.
41
+ * @default false
42
+ */
43
+ fill?: boolean;
44
+ /** @default 'medium' */
45
+ size?: 'small' | 'medium' | 'large';
46
+ /**
47
+ * Accessible name, for a box no `<label>` points at.
48
+ * @default undefined — the box is named by its label
49
+ */
50
+ ariaLabel?: string;
51
+ /**
52
+ * The box's id, for a `<label htmlFor>` elsewhere in the form.
53
+ * @default undefined
54
+ */
55
+ id?: string;
56
+ /**
57
+ * A name a test finds the box by, written as `data-testid`.
58
+ * @default undefined
59
+ */
60
+ testId?: string;
61
+ /**
62
+ * Drawn inside the box at its left — a unit, a prefix such as `10⁻`.
63
+ * @default undefined
64
+ */
65
+ leftElement?: ReactElement;
66
+ /**
67
+ * Drawn inside the box at its right — a unit, a small button.
68
+ * @default undefined
69
+ */
70
+ rightElement?: ReactElement;
71
+ /** @default undefined */
72
+ className?: string;
73
+ /** @default undefined */
74
+ style?: CSSProperties;
75
+ }
76
+ /** A box that always holds a number. */
77
+ export interface RequiredNumberInputProps extends NumberInputBaseProps {
78
+ /** The number the box shows. */
79
+ value: number;
80
+ /**
81
+ * Whether an emptied box hands up nothing. A required box keeps the number
82
+ * it had and shows it again when the box is left.
83
+ * @default false
84
+ */
85
+ allowEmpty?: false;
86
+ /** Called with the new number, never while the text is half-typed. */
87
+ onChange: (value: number) => void;
88
+ }
89
+ /** A box that may be left empty, which hands up `undefined`. */
90
+ export interface OptionalNumberInputProps extends NumberInputBaseProps {
91
+ /** The number the box shows, or nothing when it is empty. */
92
+ value: number | undefined;
93
+ allowEmpty: true;
94
+ /** Called with the new number, or with `undefined` when the box is emptied. */
95
+ onChange: (value: number | undefined) => void;
96
+ }
97
+ /** See {@link NumberInput}. */
98
+ export type NumberInputProps = RequiredNumberInputProps | OptionalNumberInputProps;
99
+ /**
100
+ * A number typed into a box.
101
+ *
102
+ * The box keeps what was typed rather than what parsed. A reader halfway
103
+ * through `0.2` has typed `0.`, which reads as zero, and a box rendered from
104
+ * that number would write `0` back over the dot before the `2` arrives —
105
+ * which is why Blueprint's `NumericInput` cannot be given a number to show and
106
+ * is never used directly on our sites. Nothing is handed up until the text
107
+ * reads as a number, so a calculation never sees a half-typed value, and the
108
+ * bounds are applied when the box is left rather than under the caret.
109
+ * @param props - See {@link NumberInputProps}.
110
+ * @returns The box, with its stepper buttons unless they are turned off.
111
+ */
112
+ export declare function NumberInput(props: NumberInputProps): ReactElement;
113
+ //# sourceMappingURL=NumberInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../../src/number/ui/NumberInput.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAYxE,wEAAwE;AACxE,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,wBAAwB;IACxB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED,wCAAwC;AACxC,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,sEAAsE;IACtE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,gEAAgE;AAChE,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,6DAA6D;IAC7D,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,EAAE,IAAI,CAAC;IACjB,+EAA+E;IAC/E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CAC/C;AAED,+BAA+B;AAC/B,MAAM,MAAM,gBAAgB,GAC1B,wBAAwB,GAAG,wBAAwB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA8IjE"}
@@ -0,0 +1,100 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, ButtonGroup, Classes, ControlGroup, InputGroup, } from '@blueprintjs/core';
3
+ import { useState } from 'react';
4
+ import { clamp } from "../../format/core/clamp.js";
5
+ import { useChromeT } from "../../i18n/ui/useT.js";
6
+ import { isPartialNumber, numberText, readNumber, stepNumber, } from "../core/numberText.js";
7
+ /**
8
+ * A number typed into a box.
9
+ *
10
+ * The box keeps what was typed rather than what parsed. A reader halfway
11
+ * through `0.2` has typed `0.`, which reads as zero, and a box rendered from
12
+ * that number would write `0` back over the dot before the `2` arrives —
13
+ * which is why Blueprint's `NumericInput` cannot be given a number to show and
14
+ * is never used directly on our sites. Nothing is handed up until the text
15
+ * reads as a number, so a calculation never sees a half-typed value, and the
16
+ * bounds are applied when the box is left rather than under the caret.
17
+ * @param props - See {@link NumberInputProps}.
18
+ * @returns The box, with its stepper buttons unless they are turned off.
19
+ */
20
+ export function NumberInput(props) {
21
+ const { value, min, max, step = 1, integer = false, allowEmpty = false, buttons = true, placeholder, disabled = false, fill = false, size = 'medium', ariaLabel, id, testId, leftElement, rightElement, className, style, } = props;
22
+ const t = useChromeT();
23
+ const onChange = props.onChange;
24
+ const [draft, setDraft] = useState(() => ({
25
+ text: numberText(value),
26
+ held: value,
27
+ }));
28
+ // The number changed elsewhere — a preset, a reset, a link — so the box has
29
+ // to follow. `held` is what this box last handed up, not the prop it was
30
+ // rendered with: comparing against the prop would make the box's own edit
31
+ // look external and rewrite `-0.` as `0` under the caret.
32
+ if (draft.held !== value)
33
+ setDraft({ text: numberText(value), held: value });
34
+ function hold(text, held) {
35
+ setDraft({ text, held });
36
+ }
37
+ function commit(next) {
38
+ hold(numberText(next), next);
39
+ onChange(next);
40
+ }
41
+ function type(text) {
42
+ const emptied = text.trim() === '';
43
+ const parsed = readNumber(text, integer);
44
+ hold(text, emptied && allowEmpty ? undefined : (parsed ?? value));
45
+ if (emptied) {
46
+ if (allowEmpty)
47
+ onChange(undefined);
48
+ }
49
+ else if (parsed !== undefined) {
50
+ onChange(parsed);
51
+ }
52
+ }
53
+ function leave() {
54
+ if (draft.text.trim() === '') {
55
+ if (!allowEmpty)
56
+ hold(numberText(value), value);
57
+ return;
58
+ }
59
+ const parsed = readNumber(draft.text);
60
+ if (parsed === undefined) {
61
+ hold(numberText(value), value);
62
+ return;
63
+ }
64
+ const settled = settle(parsed, integer, min, max);
65
+ if (settled !== parsed || !Object.is(settled, value))
66
+ commit(settled);
67
+ }
68
+ function press(event) {
69
+ const direction = event.key === 'ArrowUp' ? 1 : event.key === 'ArrowDown' ? -1 : 0;
70
+ if (direction === 0 || disabled)
71
+ return;
72
+ event.preventDefault();
73
+ const scale = event.shiftKey ? 10 : event.altKey ? 0.1 : 1;
74
+ move(direction * scale);
75
+ }
76
+ function move(scale) {
77
+ const from = readNumber(draft.text) ?? value ?? 0;
78
+ commit(settle(stepNumber(from, step * scale), integer, min, max));
79
+ }
80
+ const box = (_jsx(InputGroup, { id: id, size: size, fill: fill, disabled: disabled, placeholder: placeholder, value: draft.text, intent: isPartialNumber(draft.text) ? 'none' : 'danger', inputMode: integer ? 'numeric' : 'decimal', spellCheck: false, autoComplete: "off", autoCorrect: "off", autoCapitalize: "off", "aria-label": ariaLabel, "data-testid": testId, leftElement: leftElement, rightElement: rightElement, className: buttons ? undefined : className, style: buttons ? undefined : style, onValueChange: type, onKeyDown: press, onBlur: leave }));
81
+ if (!buttons)
82
+ return box;
83
+ const shown = readNumber(draft.text) ?? value;
84
+ return (_jsxs(ControlGroup, { fill: fill, style: style, className: [Classes.NUMERIC_INPUT, className].filter(Boolean).join(' '), children: [box, _jsxs(ButtonGroup, { className: Classes.FIXED, vertical: true, children: [_jsx(Button, { icon: "chevron-up", size: size, "aria-label": t('number.increment'), disabled: disabled ||
85
+ (max !== undefined && shown !== undefined && shown >= max), onClick: () => move(1) }), _jsx(Button, { icon: "chevron-down", size: size, "aria-label": t('number.decrement'), disabled: disabled ||
86
+ (min !== undefined && shown !== undefined && shown <= min), onClick: () => move(-1) })] })] }));
87
+ }
88
+ /**
89
+ * The number a box settles on once it is left or stepped.
90
+ * @param value - What the text read as.
91
+ * @param integer - Whether only whole numbers are wanted.
92
+ * @param min - Smallest accepted value, when there is one.
93
+ * @param max - Largest accepted value, when there is one.
94
+ * @returns The rounded, bounded number.
95
+ */
96
+ function settle(value, integer, min, max) {
97
+ const rounded = integer ? Math.round(value) : value;
98
+ return clamp(rounded, min ?? Number.NEGATIVE_INFINITY, max ?? Number.POSITIVE_INFINITY, rounded);
99
+ }
100
+ //# sourceMappingURL=NumberInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberInput.js","sourceRoot":"","sources":["../../../src/number/ui/NumberInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { NumberInputBaseProps, NumberInputProps, OptionalNumberInputProps, RequiredNumberInputProps, } from './NumberInput.tsx';
2
+ export { NumberInput } from './NumberInput.tsx';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/number/ui/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { NumberInput } from "./NumberInput.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/number/ui/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAmB,CAAC"}
@@ -48,11 +48,21 @@ interface AtomicOrbitalCanvasProps {
48
48
  */
49
49
  onAxesChange?: (axes: boolean) => void;
50
50
  /**
51
- * Whether the scene turns on its own, which is what makes a still screenshot
52
- * of a 3D shape readable.
51
+ * Whether the scene turns on its own when the canvas opens, which is what
52
+ * makes a still screenshot of a 3D shape readable.
53
+ *
54
+ * The canvas owns the state from then on: the button in its corner flips it,
55
+ * and {@link AtomicOrbitalCanvasProps.onSpinningChange} reports the new value
56
+ * to a site that wants to remember it for the next mount.
53
57
  * @default false
54
58
  */
55
59
  spinning?: boolean;
60
+ /**
61
+ * Called when the student flips the spin, with its new state — so a site can
62
+ * persist the choice and pass it back as `spinning`.
63
+ * @default undefined
64
+ */
65
+ onSpinningChange?: (spinning: boolean) => void;
56
66
  /**
57
67
  * How fast it turns, in molstar's own spin unit. Lower is slower.
58
68
  * @default 0.3
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalCanvas.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalCanvas.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAOzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASvD,4CAA4C;AAC5C,UAAU,wBAAwB;IAChC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CAmHd"}
1
+ {"version":3,"file":"AtomicOrbitalCanvas.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalCanvas.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAOzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASvD,4CAA4C;AAC5C,UAAU,wBAAwB;IAChC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC;;;;;;;;;;OAUG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CACpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CAoId"}
@@ -16,7 +16,7 @@ import { createOrbitalViewer } from "./viewer.js";
16
16
  * @returns The canvas, with a progress note while it samples.
17
17
  */
18
18
  export function AtomicOrbitalCanvas(props) {
19
- const { atomicNumber, orbitalId, palette = PHASE_PALETTES.textbook, resolution = DEFAULT_RESOLUTION, axes: initialAxes = true, spinning = false, spinSpeed = DEFAULT_SPIN_SPEED, sample = sampleInProcess, onAxesChange, onNodeRadii, onFailureChange, } = props;
19
+ const { atomicNumber, orbitalId, palette = PHASE_PALETTES.textbook, resolution = DEFAULT_RESOLUTION, axes: initialAxes = true, spinning: initialSpinning = false, spinSpeed = DEFAULT_SPIN_SPEED, sample = sampleInProcess, onAxesChange, onSpinningChange, onNodeRadii, onFailureChange, } = props;
20
20
  const t = useChromeT();
21
21
  const containerRef = useRef(null);
22
22
  const viewerRef = useRef(null);
@@ -28,15 +28,26 @@ export function AtomicOrbitalCanvas(props) {
28
28
  const reachRef = useRef(null);
29
29
  const axesRef = useRef(initialAxes);
30
30
  const [axes, setAxes] = useState(initialAxes);
31
+ const [spinning, setSpinning] = useState(initialSpinning);
31
32
  // What the canvas is being asked to show. Comparing it with what it *is*
32
33
  // showing gives the progress note without a state write on every prop change.
33
34
  const wanted = `${atomicNumber}|${orbitalId}|${resolutionKey(resolution)}|${palette.id}`;
34
35
  const busy = drawn !== wanted;
35
36
  // Callbacks are read through refs so a caller passing an inline arrow does
36
37
  // not re-sample the orbital on every render of its parent.
37
- const callbacks = useRef({ onAxesChange, onNodeRadii, onFailureChange });
38
+ const callbacks = useRef({
39
+ onAxesChange,
40
+ onSpinningChange,
41
+ onNodeRadii,
42
+ onFailureChange,
43
+ });
38
44
  useEffect(() => {
39
- callbacks.current = { onAxesChange, onNodeRadii, onFailureChange };
45
+ callbacks.current = {
46
+ onAxesChange,
47
+ onSpinningChange,
48
+ onNodeRadii,
49
+ onFailureChange,
50
+ };
40
51
  });
41
52
  // Created and disposed once per mount. React 19 runs this twice in
42
53
  // development; `createOrbitalViewer` is synchronous so the first canvas is
@@ -101,6 +112,9 @@ export function AtomicOrbitalCanvas(props) {
101
112
  return (_jsxs("div", { ref: containerRef, style: CANVAS_STYLE, children: [busy && _jsx("div", { style: BUSY_STYLE, children: t('orbital.sampling') }), _jsx(AtomicOrbitalControls, { axes: axes, onToggleAxes: () => {
102
113
  setAxes(!axes);
103
114
  callbacks.current.onAxesChange?.(!axes);
115
+ }, spinning: spinning, onToggleSpin: () => {
116
+ setSpinning(!spinning);
117
+ callbacks.current.onSpinningChange?.(!spinning);
104
118
  }, onResetView: () => {
105
119
  void viewerRef.current?.resetView();
106
120
  } })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalCanvas.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalCanvas.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AtomicOrbitalCanvas.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalCanvas.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /**
2
- * The two controls an orbital canvas owns: the cartesian frame, and the way
3
- * back to the framing the orbital opened on — a change of orbital keeps
4
- * whatever angle and zoom the student is on.
2
+ * The three controls an orbital canvas owns: the cartesian frame, the slow
3
+ * spin that makes a 3D shape readable on a flat screen, and the way back to the
4
+ * framing the orbital opened on — a change of orbital keeps whatever angle and
5
+ * zoom the student is on.
5
6
  */
6
7
  import type { ReactElement } from 'react';
7
8
  /** Props of {@link AtomicOrbitalControls}. */
@@ -10,13 +11,17 @@ interface AtomicOrbitalControlsProps {
10
11
  axes: boolean;
11
12
  /** Called when the frame button is pressed. */
12
13
  onToggleAxes: () => void;
14
+ /** Whether the scene is turning. */
15
+ spinning: boolean;
16
+ /** Called when the spin button is pressed. */
17
+ onToggleSpin: () => void;
13
18
  /** Called when the reset button is pressed. */
14
19
  onResetView: () => void;
15
20
  }
16
21
  /**
17
- * The frame and reset buttons, in the canvas's top-right corner.
22
+ * The frame, spin and reset buttons, in the canvas's top-right corner.
18
23
  * @param props - See {@link AtomicOrbitalControlsProps}.
19
- * @returns The two buttons.
24
+ * @returns The three buttons.
20
25
  */
21
26
  export declare function AtomicOrbitalControls(props: AtomicOrbitalControlsProps): ReactElement;
22
27
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalControls.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalControls.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAMzD,8CAA8C;AAC9C,UAAU,0BAA0B;IAClC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CAoCd"}
1
+ {"version":3,"file":"AtomicOrbitalControls.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalControls.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAMzD,8CAA8C;AAC9C,UAAU,0BAA0B;IAClC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,+CAA+C;IAC/C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,oCAAoC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,8CAA8C;IAC9C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,YAAY,CAmDd"}
@@ -1,30 +1,35 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
- * The two controls an orbital canvas owns: the cartesian frame, and the way
4
- * back to the framing the orbital opened on — a change of orbital keeps
5
- * whatever angle and zoom the student is on.
3
+ * The three controls an orbital canvas owns: the cartesian frame, the slow
4
+ * spin that makes a 3D shape readable on a flat screen, and the way back to the
5
+ * framing the orbital opened on — a change of orbital keeps whatever angle and
6
+ * zoom the student is on.
6
7
  */
7
8
  import { Button } from '@blueprintjs/core';
8
9
  import { HelpTooltip } from "../../help/ui/HelpTooltip.js";
9
10
  import { useChromeT } from "../../i18n/ui/useT.js";
10
11
  /**
11
- * The frame and reset buttons, in the canvas's top-right corner.
12
+ * The frame, spin and reset buttons, in the canvas's top-right corner.
12
13
  * @param props - See {@link AtomicOrbitalControlsProps}.
13
- * @returns The two buttons.
14
+ * @returns The three buttons.
14
15
  */
15
16
  export function AtomicOrbitalControls(props) {
16
- const { axes, onToggleAxes, onResetView } = props;
17
+ const { axes, onToggleAxes, spinning, onToggleSpin, onResetView } = props;
17
18
  const t = useChromeT();
18
19
  const axesHelp = {
19
20
  title: t('orbital.axesTitle'),
20
21
  body: t('orbital.axesBody'),
21
22
  example: { code: '3d_yz', note: t('orbital.axesExample') },
22
23
  };
24
+ const spinHelp = {
25
+ title: t('orbital.spinTitle'),
26
+ body: t('orbital.spinBody'),
27
+ };
23
28
  const resetHelp = {
24
29
  title: t('orbital.resetTitle'),
25
30
  body: t('orbital.resetBody'),
26
31
  };
27
- return (_jsxs("div", { style: CONTROLS_STYLE, children: [_jsx(HelpTooltip, { content: axesHelp, placement: "bottom", children: _jsx(Button, { variant: "minimal", size: "small", icon: "grid", active: axes, "aria-label": t('orbital.showAxes'), "aria-pressed": axes, onClick: onToggleAxes }) }), _jsx(HelpTooltip, { content: resetHelp, placement: "bottom", children: _jsx(Button, { variant: "minimal", size: "small", icon: "zoom-to-fit", "aria-label": t('orbital.resetTitle'), onClick: onResetView }) })] }));
32
+ return (_jsxs("div", { style: CONTROLS_STYLE, children: [_jsx(HelpTooltip, { content: axesHelp, placement: "bottom", children: _jsx(Button, { variant: "minimal", size: "small", icon: "grid", active: axes, "aria-label": t('orbital.showAxes'), "aria-pressed": axes, onClick: onToggleAxes }) }), _jsx(HelpTooltip, { content: spinHelp, placement: "bottom", children: _jsx(Button, { variant: "minimal", size: "small", icon: "refresh", active: spinning, "aria-label": t('orbital.spin'), "aria-pressed": spinning, onClick: onToggleSpin }) }), _jsx(HelpTooltip, { content: resetHelp, placement: "bottom", children: _jsx(Button, { variant: "minimal", size: "small", icon: "zoom-to-fit", "aria-label": t('orbital.resetTitle'), onClick: onResetView }) })] }));
28
33
  }
29
34
  const CONTROLS_STYLE = {
30
35
  position: 'absolute',
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalControls.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalControls.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAYnD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE;KAC3D,CAAC;IACF,MAAM,SAAS,GAAgB;QAC7B,KAAK,EAAE,CAAC,CAAC,oBAAoB,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC;KAC7B,CAAC;IACF,OAAO,CACL,eAAK,KAAK,EAAE,cAAc,aACxB,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,QAAQ,YAChD,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,IAAI,gBACA,CAAC,CAAC,kBAAkB,CAAC,kBACnB,IAAI,EAClB,OAAO,EAAE,YAAY,GACrB,GACU,EACd,KAAC,WAAW,IAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAC,QAAQ,YACjD,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,aAAa,gBACN,CAAC,CAAC,oBAAoB,CAAC,EACnC,OAAO,EAAE,WAAW,GACpB,GACU,IACV,CACP,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,MAAM;IACf,GAAG,EAAE,CAAC;CACP,CAAC"}
1
+ {"version":3,"file":"AtomicOrbitalControls.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalControls.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAgBnD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC1E,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE;KAC3D,CAAC;IACF,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC;QAC7B,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC;KAC5B,CAAC;IACF,MAAM,SAAS,GAAgB;QAC7B,KAAK,EAAE,CAAC,CAAC,oBAAoB,CAAC;QAC9B,IAAI,EAAE,CAAC,CAAC,mBAAmB,CAAC;KAC7B,CAAC;IACF,OAAO,CACL,eAAK,KAAK,EAAE,cAAc,aACxB,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,QAAQ,YAChD,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,IAAI,gBACA,CAAC,CAAC,kBAAkB,CAAC,kBACnB,IAAI,EAClB,OAAO,EAAE,YAAY,GACrB,GACU,EACd,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAC,QAAQ,YAChD,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,SAAS,EACd,MAAM,EAAE,QAAQ,gBACJ,CAAC,CAAC,cAAc,CAAC,kBACf,QAAQ,EACtB,OAAO,EAAE,YAAY,GACrB,GACU,EACd,KAAC,WAAW,IAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAC,QAAQ,YACjD,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,aAAa,gBACN,CAAC,CAAC,oBAAoB,CAAC,EACnC,OAAO,EAAE,WAAW,GACpB,GACU,IACV,CACP,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAkB;IACpC,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,MAAM;IACf,GAAG,EAAE,CAAC;CACP,CAAC"}
@@ -52,10 +52,17 @@ export interface AtomicOrbitalViewerProps {
52
52
  */
53
53
  onAxesChange?: (axes: boolean) => void;
54
54
  /**
55
- * Whether the scene turns on its own.
55
+ * Whether the scene turns on its own when the canvas opens. The button in the
56
+ * canvas's corner flips it from there.
56
57
  * @default false
57
58
  */
58
59
  spinning?: boolean;
60
+ /**
61
+ * Called when the student flips the spin, with its new state — so a site can
62
+ * persist the choice and pass it back as `spinning`.
63
+ * @default undefined
64
+ */
65
+ onSpinningChange?: (spinning: boolean) => void;
59
66
  /**
60
67
  * How fast it turns, in molstar's own spin unit. Lower is slower.
61
68
  * @default 0.3
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalViewer.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalViewer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQxD,4CAA4C;AAC5C,MAAM,WAAW,wBAAwB;IACvC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,SAAS,CAAC;IAChE;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CAiCd"}
1
+ {"version":3,"file":"AtomicOrbitalViewer.d.ts","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalViewer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQxD,4CAA4C;AAC5C,MAAM,WAAW,wBAAwB;IACvC,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,SAAS,CAAC;IAChE;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,wBAAwB,GAC9B,YAAY,CAiCd"}
@@ -1 +1 @@
1
- {"version":3,"file":"AtomicOrbitalViewer.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalViewer.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAQ1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;IAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,0BAA2B,CAAC,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC;AACjD,CAAC,CAAC,CAAC;AA4EH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,CACL,KAAC,OAAO,IAAC,MAAM,EAAC,SAAS,EAAC,OAAO,QAAC,SAAS,EAAE,SAAS,YACnD,iBAAiB,EAAE,CAAC,UAAU,CAAC;gBAC9B,CAAC,CAAC,EAAE,CAAC,qBAAqB,UAAU,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,GAC5D,CACX,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,aAC1C,KAAC,QAAQ,IACP,QAAQ,EACN,cAAK,KAAK,EAAE,UAAU,YACnB,QAAQ,IAAI,CAAC,CAAC,0BAA0B,CAAC,GACtC,YAGR,KAAC,mBAAmB,OAAK,MAAM,EAAE,eAAe,EAAE,UAAU,GAAI,GACvD,EACV,OAAO,KAAK,IAAI,IAAI,CACnB,KAAC,OAAO,IAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,QAAC,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,YAC9D,OAAO,GACA,CACX,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,GAAG,EAAE,CAAC;IACN,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,KAAK,CAAC,aAAa;IAC/B,KAAK,EAAE,KAAK,CAAC,SAAS;IACtB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,QAAQ;CACpB,CAAC"}
1
+ {"version":3,"file":"AtomicOrbitalViewer.js","sourceRoot":"","sources":["../../../src/orbital/ui/AtomicOrbitalViewer.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAQ1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE;IAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,0BAA2B,CAAC,CAAC;IACzD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC;AACjD,CAAC,CAAC,CAAC;AAmFH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,KAA+B;IAE/B,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;IACpE,MAAM,CAAC,GAAG,UAAU,EAAE,CAAC;IACvB,MAAM,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAE5D,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,CACL,KAAC,OAAO,IAAC,MAAM,EAAC,SAAS,EAAC,OAAO,QAAC,SAAS,EAAE,SAAS,YACnD,iBAAiB,EAAE,CAAC,UAAU,CAAC;gBAC9B,CAAC,CAAC,EAAE,CAAC,qBAAqB,UAAU,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,OAAO,CAAC,GAC5D,CACX,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,aAC1C,KAAC,QAAQ,IACP,QAAQ,EACN,cAAK,KAAK,EAAE,UAAU,YACnB,QAAQ,IAAI,CAAC,CAAC,0BAA0B,CAAC,GACtC,YAGR,KAAC,mBAAmB,OAAK,MAAM,EAAE,eAAe,EAAE,UAAU,GAAI,GACvD,EACV,OAAO,KAAK,IAAI,IAAI,CACnB,KAAC,OAAO,IAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,QAAC,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC,YAC9D,OAAO,GACA,CACX,IACG,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,QAAQ;IACvB,GAAG,EAAE,CAAC;IACN,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF,MAAM,UAAU,GAAkB;IAChC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,SAAS,EAAE,GAAG;IACd,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,KAAK,CAAC,aAAa;IAC/B,KAAK,EAAE,KAAK,CAAC,SAAS;IACtB,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,QAAQ;CACpB,CAAC"}
@@ -4,6 +4,10 @@
4
4
  *
5
5
  * A cell is a real `<button>`, so Tab reaches it, Enter and Space activate it,
6
6
  * and a screen reader reads the element's name rather than its symbol.
7
+ *
8
+ * Everything written in it is sized in container-query units, so a cell shows
9
+ * the same proportions at 280px beside a chart and across a lecture-hall
10
+ * screen — the table a class reads is the same drawing, larger.
7
11
  */
8
12
  import type { ReactElement } from 'react';
9
13
  import type { Swatch } from '../../color/core/interpolate.ts';
@@ -28,6 +32,12 @@ export interface ElementCellProps {
28
32
  * @default '' — nothing is written
29
33
  */
30
34
  detail?: string;
35
+ /**
36
+ * Whether the table this cell belongs to writes a third line at all. A table
37
+ * that writes none gives the room to the symbol, and its rows are shorter.
38
+ * @default whether this cell has one
39
+ */
40
+ writesDetail?: boolean;
31
41
  /**
32
42
  * Whether the cell is the one the tools are pointed at.
33
43
  * @default false
@@ -1 +1 @@
1
- {"version":3,"file":"ElementCell.d.ts","sourceRoot":"","sources":["../../../src/periodic/ui/ElementCell.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAG9D,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAoDjE"}
1
+ {"version":3,"file":"ElementCell.d.ts","sourceRoot":"","sources":["../../../src/periodic/ui/ElementCell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAG9D,0DAA0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,YAAY,CA8EjE"}