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,459 @@
1
+ {
2
+ "language.label": "Lingua",
3
+ "chrome.pages": "Pagine",
4
+ "account.signIn": "Accedi",
5
+ "account.signOut": "Esci",
6
+ "account.signedInAs": "Accesso effettuato come {name}",
7
+ "ecosystem.tools": "Strumenti",
8
+ "ecosystem.menuHeading": "I nostri strumenti, tutti nel browser",
9
+ "ecosystem.otherTools": "I nostri altri strumenti",
10
+ "ecosystem.youAreHere": "si trova qui",
11
+ "ecosystem.group.basics.label": "Fondamenti di chimica",
12
+ "ecosystem.group.basics.blurb": "Da dove comincia un corso, e a cosa si torna.",
13
+ "ecosystem.group.practice.label": "Esercitazione",
14
+ "ecosystem.group.practice.blurb": "Dove si affronta un primo corso, una serie graduata alla volta.",
15
+ "ecosystem.group.structures.label": "Strutture e notazione",
16
+ "ecosystem.group.structures.blurb": "Disegnare una molecola, convertirla fra notazioni, vederla nello spazio.",
17
+ "ecosystem.group.spectra.label": "Spettri",
18
+ "ecosystem.group.spectra.blurb": "Elaborare una misura, e risalire alla struttura che c'è dietro.",
19
+ "ecosystem.group.research.label": "Ricerca e dati",
20
+ "ecosystem.group.research.blurb": "Lavoro specialistico: dati reali, e molecole che nessuno ha mai fatto.",
21
+ "ecosystem.group.computing.label": "Informatica e didattica",
22
+ "ecosystem.group.computing.blurb": "Attorno alla chimica: costruire un corso, comporlo, analizzarlo.",
23
+ "site.learn.tagline": "Riunire gli strumenti in un corso e distribuirne il link.",
24
+ "site.inchi.tagline": "InChI e InChIKey da una struttura, nel browser.",
25
+ "site.vcl.tagline": "Combinare uno scheletro e frammenti in una libreria filtrata.",
26
+ "site.smiles.tagline": "Disegnare una struttura, leggerne lo SMILES, imparare la notazione.",
27
+ "site.openbabel.tagline": "Convertire una struttura fra qualsiasi coppia di formati di file chimici.",
28
+ "site.chemcalc.tagline": "Formula molecolare, massa esatta e distribuzione isotopica.",
29
+ "site.dbe.tagline": "Contare cicli e doppi legami a partire da una formula o da una struttura.",
30
+ "site.nmrium.tagline": "Elaborare e assegnare spettri NMR nel browser.",
31
+ "site.metabo.tagline": "Trasformare una serie di spettri NMR in una mappa dei propri campioni.",
32
+ "site.derepflow.tagline": "Identificare i costituenti di una miscela dal suo spettro ¹³C.",
33
+ "site.surge.tagline": "Tutti gli isomeri costituzionali di una formula molecolare.",
34
+ "site.tex.tagline": "Formule LaTeX rese in SVG o PNG a partire da un URL.",
35
+ "site.lcao.tagline": "Combinare orbitali atomici in orbitali molecolari.",
36
+ "site.regexp.tagline": "Imparare le espressioni regolari in un ambiente interattivo.",
37
+ "site.pdb.tagline": "Uno sguardo rapido a qualsiasi voce della Protein Data Bank.",
38
+ "site.elucidation.tagline": "Una struttura da uno spettro NMR 1H e da una formula.",
39
+ "site.equilibrium.tagline": "Equilibri chimici: pH, speciazione e curve di titolazione.",
40
+ "site.polycarp.tagline": "Prevedere la microstruttura di una copolimerizzazione radicalica.",
41
+ "site.3d.tagline": "Conformeri in 3D a partire da una struttura che si disegna.",
42
+ "site.periodic-table.tagline": "La tavola periodica, colorata, rappresentata e smontata.",
43
+ "site.database.tagline": "Interrogare un vero insieme di dati chimici in SQL e in Mango.",
44
+ "site.symmetry.tagline": "Trovare la simmetria di una molecola, di un cristallo o di un motivo.",
45
+ "site.osiris.tagline": "Rischi di tossicità e proprietà previsti, per una molecola o per molte.",
46
+ "site.atoms.tagline": "Elettroni, neutroni, strutture di Lewis e numeri di ossidazione.",
47
+ "site.moles.tagline": "Bilanciare una reazione e calcolarne la composizione in massa.",
48
+ "site.inorganic.tagline": "Nominare un composto inorganico e scriverne la formula.",
49
+ "share.button": "Condividi",
50
+ "share.buttonTitle": "Condividere un link a questa pagina, o incorporarla nel proprio sito",
51
+ "share.dialogTitle": "Condividere o incorporare",
52
+ "share.lead": "Un link a {title} così come è configurato ora.",
53
+ "share.layout": "Disposizione",
54
+ "share.embed": "Incorporare in un'altra pagina",
55
+ "share.embedHint": "Toglie l'intestazione del sito e la sua navigazione, così la pagina sta dentro una pagina propria.",
56
+ "share.showOnPage": "Mostra nella pagina",
57
+ "share.custom": "Personalizzato",
58
+ "share.link": "Link",
59
+ "share.copyLink": "Copia il link",
60
+ "share.openInNewTab": "Apri in una nuova scheda",
61
+ "share.iframe": "Iframe",
62
+ "share.copyIframe": "Copia l'iframe",
63
+ "share.done": "Fatto",
64
+ "cite.button": "Cita",
65
+ "cite.copyReferenceAs": "Copia il riferimento come",
66
+ "cite.pleaseCiteBoth": "Si prega di citare entrambi i lavori",
67
+ "cite.pleaseCiteEvery": "Si prega di citare tutti i lavori",
68
+ "cite.copyBothAs": "Copia entrambi i riferimenti come",
69
+ "cite.copyEveryAs": "Copia tutti i riferimenti come",
70
+ "cite.importIntoManager": "Importa in un gestore di riferimenti",
71
+ "cite.openArticle": "Apri l'articolo",
72
+ "cite.copyThisAs": "Copia questo riferimento come",
73
+ "cite.importThis": "Importa questo riferimento",
74
+ "cite.copied": "copiato",
75
+ "cite.copyFailed": "copia non riuscita",
76
+ "cite.format.doi": "Link DOI",
77
+ "cite.download.ris": "File RIS",
78
+ "cite.download.bibtex": "File BibTeX",
79
+ "clipboard.copied": "Copiato",
80
+ "clipboard.failed": "Copia non riuscita",
81
+ "clipboard.copy": "Copia",
82
+ "clipboard.copyThe": "Copia {what}",
83
+ "clipboard.copyValue": "Copia {value}",
84
+ "clipboard.copyToClipboard": "Copia negli appunti",
85
+ "about.providedBy": "Offerto da",
86
+ "about.whatYouCanDo": "Cosa si può fare qui",
87
+ "about.builtOn": "Costruito su",
88
+ "about.howToCite": "Come citare",
89
+ "about.licenceAndSource": "Licenza e codice sorgente",
90
+ "about.licence": "{license}, © cheminfo. Si può usare in un corso, farne un fork, o riprenderne un pezzo per altro. Il codice è su {sources}.",
91
+ "about.foundAProblem": "Ha trovato un problema?",
92
+ "about.reportIt": "Ce lo dica: una segnalazione che indichi cosa ha scritto e cosa ha ottenuto è la correzione più rapida che esista. {tracker}.",
93
+ "about.citeWork": "Citare {what}",
94
+ "about.built": "Compilato {builtAt}.",
95
+ "about.builtFromCommit": "Compilato {builtAt} dal commit {commit}.",
96
+ "about.nameList": "{names} e {last}",
97
+ "credits.openbabel.description": "legge e scrive i formati di file chimici, ed esegue la conversione stessa.",
98
+ "credits.openchemlib.description": "legge e scrive strutture, e ne calcola le proprietà nel browser.",
99
+ "credits.openchemlib-utils.description": "le utilità per le strutture costruite su OpenChemLib.",
100
+ "credits.osiris-property-explorer.description": "le previsioni originali di tossicità e proprietà, di Thomas Sander ad Actelion, oggi Idorsia.",
101
+ "credits.react-ocl.description": "l'editor di strutture in cui si disegna, e il rendering 2D.",
102
+ "credits.react-mf.description": "compone una formula molecolare, con pedici, isotopi e cariche.",
103
+ "credits.mass-tools.description": "analizza le formule molecolari e calcola masse e distribuzioni isotopiche.",
104
+ "credits.chem-equilibrium.description": "costruisce il sistema di bilancio di materia di una soluzione e ne trova la radice.",
105
+ "credits.ml-matrix.description": "l'algebra lineare dietro i numeri della pagina.",
106
+ "credits.ml-xsadd.description": "il generatore con seme da cui si estrae una serie riproducibile.",
107
+ "credits.cif-to-json.description": "il lettore che trasforma un file cristallografico in dati.",
108
+ "credits.ml-spectra-processing.description": "le operazioni su vettori e spettri attraverso cui passano i dati.",
109
+ "credits.occ.description": "l'implementazione di GFN2-xTB da cui provengono le geometrie e le energie raffinate.",
110
+ "credits.xtb-wasm.description": "GFN2-xTB compilato in WebAssembly, guidato da un gruppo di web worker.",
111
+ "credits.molstar.description": "il visualizzatore 3D, le sue rappresentazioni e le sue superfici.",
112
+ "credits.blueprint.description": "i componenti d'interfaccia — schede, finestre di dialogo, campi, tabelle ed etichette.",
113
+ "credits.react-science.description": "l'impalcatura applicativa scientifica condivisa da questa famiglia di siti.",
114
+ "credits.react-cheminfo.description": "l'impalcatura e le convenzioni condivise dai siti cheminfo.",
115
+ "credits.cheminfo-font.description": "i glifi di chimica con cui sono disegnate le barre degli strumenti.",
116
+ "credits.nivo.description": "disegna i grafici — le curve, i diagrammi e gli assi.",
117
+ "credits.mathjax.description": "compone la matematica, da LaTeX a ciò che si legge.",
118
+ "credits.lexical.description": "l'editor in cui una pagina scritta viene composta e salvata.",
119
+ "credits.katex.description": "compone la matematica dentro una pagina scritta.",
120
+ "credits.dnd-kit.description": "il trascinamento che mette le cose in un ordine.",
121
+ "credits.react-roi.description": "il riquadro con cui si traccia una regione di un'immagine.",
122
+ "credits.file-collection.description": "il lettore che raccoglie i file, le cartelle e gli archivi trascinati.",
123
+ "credits.zip-js.description": "gli archivi ZIP che vengono letti e scritti nel browser.",
124
+ "credits.preact-signals.description": "lo stato che le pagine leggono, senza un archivio attorno.",
125
+ "credits.fastify.description": "il server che risponde all'API e serve la pagina.",
126
+ "credits.sqlite.description": "la banca dati, un solo file, letta dal modulo integrato di Node.",
127
+ "credits.sqlite-wasm.description": "esegue lo stesso motore nella pagina, compilato in WebAssembly.",
128
+ "credits.pouchdb.description": "risponde ai selettori Mango come li risponde CouchDB.",
129
+ "credits.chemexper.description": "il catalogo da cui provengono i composti e i loro spettri.",
130
+ "credits.react.description": "il modello a componenti in cui sono scritte le pagine.",
131
+ "credits.vite.description": "costruisce e serve il sito statico.",
132
+ "help.label": "Aiuto",
133
+ "help.learnMore": "Scopri di più",
134
+ "help.on": "su",
135
+ "confirm.delete": "Elimina",
136
+ "confirm.cancel": "Annulla",
137
+ "error.title": "Qualcosa è andato storto",
138
+ "error.tryAgain": "Riprova",
139
+ "error.noMessage": "Non è stato fornito alcun messaggio.",
140
+ "capsule.filter": "Filtro",
141
+ "color.scales": "Scale",
142
+ "color.done": "Fatto",
143
+ "color.custom": "Personalizzata",
144
+ "color.customEllipsis": "Personalizzata…",
145
+ "color.inUse": "in uso",
146
+ "color.colourScale": "Scala di colore",
147
+ "color.legendLabel": "{what} da {low} a {high}",
148
+ "color.scaleBeingEdited": "La scala in corso di modifica",
149
+ "color.anchorColour": "Colore dell'ancora {index}",
150
+ "color.anchorPosition": "Posizione dell'ancora {index}",
151
+ "color.removeAnchor": "Rimuovi l'ancora {index}",
152
+ "color.addColour": "Aggiungi un colore",
153
+ "color.path": "Percorso fra due ancore",
154
+ "color.interpolation.rgb": "RGB — mescolare i canali",
155
+ "color.interpolation.hsv": "HSV — girare dal lato corto",
156
+ "color.interpolation.hsv-long": "HSV — girare dal lato lungo",
157
+ "color.kind.sequential": "Dal basso all'alto",
158
+ "color.kind.diverging": "Ai due lati di un centro",
159
+ "color.kind.cyclic": "Attorno alla ruota",
160
+ "color.scale.viridis.label": "Viridis",
161
+ "color.scale.viridis.description": "Da viola a giallo. Si stampa in grigio e si legge con il daltonismo.",
162
+ "color.scale.plasma.label": "Plasma",
163
+ "color.scale.plasma.description": "Da blu a giallo passando per il magenta, più viva di viridis.",
164
+ "color.scale.magma.label": "Magma",
165
+ "color.scale.magma.description": "Da nero a crema passando per il viola e l'arancione.",
166
+ "color.scale.inferno.label": "Inferno",
167
+ "color.scale.inferno.description": "Da nero a giallo pallido passando per il rosso.",
168
+ "color.scale.cividis.label": "Cividis",
169
+ "color.scale.cividis.description": "Da blu a giallo, fatta per leggersi allo stesso modo con la deuteranopia.",
170
+ "color.scale.turbo.label": "Turbo",
171
+ "color.scale.turbo.description": "Colori dell'arcobaleno, ordinati perché la luminosità continui a salire.",
172
+ "color.scale.greys.label": "Grigi",
173
+ "color.scale.greys.description": "Da chiaro a nero, per una figura che verrà fotocopiata.",
174
+ "color.scale.cool-warm.label": "Dal freddo al caldo",
175
+ "color.scale.cool-warm.description": "Da blu a rosso passando per il giallo pallido.",
176
+ "color.scale.blue-red.label": "Da blu a rosso",
177
+ "color.scale.blue-red.description": "Da blu a rosso passando per il bianco, il centro più pallido.",
178
+ "color.scale.rainbow.label": "Arcobaleno",
179
+ "color.scale.rainbow.description": "Da blu a rosso passando per il verde e il giallo. In grigio non ordina nulla.",
180
+ "download.save": "Salva",
181
+ "download.saveFigure": "Salva la figura",
182
+ "download.saveThisFigure": "Salva questa figura",
183
+ "download.format": "Formato",
184
+ "download.formatHelp": "Un PNG è un'immagine della figura, ed è ciò che accettano una diapositiva, una finestra di chat o una segnalazione. Un SVG è la figura stessa: ogni linea resta nitida per quanto si ingrandisca, e si può ancora modificare dopo.",
185
+ "download.resolution": "Risoluzione",
186
+ "download.resolutionHelp": "Quante volte la figura sullo schermo misura il file. Un PNG riceve altrettanti pixel in più: due va bene per una diapositiva, tre o quattro per la stampa. Un SVG resta nitido a qualsiasi dimensione, e si apre altrettante volte più grande.",
187
+ "download.resolutionExample": "Una figura larga 640 pixel sullo schermo viene salvata larga 1280 pixel.",
188
+ "download.noFigure": "Non c'è ancora nessuna figura nella pagina da salvare.",
189
+ "download.hintRasterSvg": "Un SVG che contiene un'immagine di {pixels}: una scena 3D non ha forma vettoriale.",
190
+ "download.hintSvg": "Si apre a {pixels}, e resta nitido a qualsiasi dimensione.",
191
+ "download.hintPng": "Salvato {pixels}.",
192
+ "download.size": "Dimensione",
193
+ "download.sizeHelp": "La forma con cui la figura viene disegnata per il file. Viene ricomposta, così gli assi e le etichette si adattano a quella forma invece di essere stirati. Una colonna di rivista è larga 8,5 cm, e il suo testo si stampa alla dimensione con cui si legge sullo schermo.",
194
+ "download.sizeScreen": "Come mostrata",
195
+ "download.sizeColumn": "Colonna di rivista",
196
+ "download.sizeCustom": "Personalizzata",
197
+ "download.customSize": "Larghezza × altezza",
198
+ "download.width": "Larghezza",
199
+ "download.height": "Altezza",
200
+ "pedagogy.check": "Verifica",
201
+ "pedagogy.revealHint": "Mostra un suggerimento",
202
+ "pedagogy.revealHintCount": "Mostra un suggerimento ({revealed}/{total})",
203
+ "pedagogy.revealHintLadder": "{label} ({open}/{total})",
204
+ "pedagogy.hideSolution": "Nascondi la soluzione",
205
+ "pedagogy.revealSolution": "Mostra la soluzione",
206
+ "pedagogy.reset": "Ricomincia",
207
+ "pedagogy.hints": "Suggerimenti",
208
+ "pedagogy.solvedCount": "{solved} / {total} risolti",
209
+ "pedagogy.clearAll": "Cancella tutte le risposte",
210
+ "pedagogy.keepAnswers": "Conserva le mie risposte",
211
+ "pedagogy.clearEverything": "Cancella tutto",
212
+ "pedagogy.clearWarning": "Questo dimentica ogni risposta, ogni suggerimento mostrato e ogni esercizio risolto, su questo browser. Non si può annullare.",
213
+ "pedagogy.filterTerms": "Filtra i termini…",
214
+ "pedagogy.noTermDefined": "Non è ancora definito alcun termine.",
215
+ "pedagogy.noTermMatches": "Nessun termine corrisponde a «{query}».",
216
+ "pedagogy.example": "Esempio",
217
+ "pedagogy.input": "Ingresso",
218
+ "pedagogy.previous": "Precedente",
219
+ "pedagogy.next": "Successivo",
220
+ "pedagogy.stepOf": "Passo {step} di {total}",
221
+ "slides.exit": "Esci",
222
+ "slides.previousSlide": "Diapositiva precedente",
223
+ "slides.nextSlide": "Diapositiva successiva",
224
+ "slides.toggleFullscreen": "Attiva o disattiva lo schermo intero",
225
+ "slides.backToSlides": "Torna alle diapositive",
226
+ "slides.backToSlide": "Torna alla diapositiva {slide}",
227
+ "slides.noAddress": "Questa diapositiva inquadra uno strumento, ma non indica alcun indirizzo.",
228
+ "slides.liveDemos": "Dimostrazioni dal vivo:",
229
+ "slides.noTalkYet": "Non c'è ancora nessuna presentazione.",
230
+ "overlay.options": "Opzioni",
231
+ "overlay.whatAmILookingAt": "Che cosa sto guardando?",
232
+ "overlay.reset": "Ricomincia",
233
+ "overlay.hoverAName": "Passare il puntatore su un nome per vedere cosa fa.",
234
+ "overlay.dismiss": "Chiudi",
235
+ "delimited.copyTable": "Copia la tabella",
236
+ "delimited.copyOrDownload": "Copiare o scaricare i dati",
237
+ "delimited.close": "Chiudi",
238
+ "delimited.separator": "Separatore",
239
+ "delimited.save": "Salva",
240
+ "delimited.copy": "Copia",
241
+ "delimited.tableAsText": "La tabella, in testo",
242
+ "chart.measurement": "Misura {name}",
243
+ "chart.measurements": "Misure",
244
+ "delimited.descriptionOne": "{count} riga, una per linea. Copiarla e incollarla in un foglio di calcolo.",
245
+ "delimited.descriptionMany": "{count} righe, una per linea. Copiarle e incollarle in un foglio di calcolo.",
246
+ "structure.guide.atom.title": "Puntatore su un atomo",
247
+ "structure.guide.atom.element": "Trasformarlo in Na",
248
+ "structure.guide.atom.group": "Aggiungere un fenile; Me, Et, Boc, TMS… funzionano anche",
249
+ "structure.guide.atom.applyOrForget": "Applicare o dimenticare quanto è stato scritto",
250
+ "structure.guide.atom.chain": "Aggiungere una catena di quel numero di carboni",
251
+ "structure.guide.atom.charge": "Alzare o abbassare la carica",
252
+ "structure.guide.atom.radical": "Aggiungere o togliere un radicale",
253
+ "structure.guide.atom.spin": "Trasformarlo in tripletto, poi in singoletto",
254
+ "structure.guide.atom.attachment": "Trasformarlo in un punto di attacco",
255
+ "structure.guide.atom.query": "Modificare i suoi criteri di ricerca",
256
+ "structure.guide.atom.halogen": "Accettare qualsiasi alogeno",
257
+ "structure.guide.atom.delete": "Cancellarlo",
258
+ "structure.guide.atom.note": "Ciò che si scrive appare in nero per un elemento, in blu per un gruppo, in grigio finché è incompleto e in rosso quando è sconosciuto.",
259
+ "structure.guide.bond.title": "Puntatore su un legame",
260
+ "structure.guide.bond.order": "Semplice, doppio o triplo",
261
+ "structure.guide.bond.zeroOrder": "Legame di ordine zero (metallo–legante)",
262
+ "structure.guide.bond.stereo": "Legame stereo verso l'osservatore o lontano da esso",
263
+ "structure.guide.bond.unknownGeometry": "Doppio legame di geometria sconosciuta",
264
+ "structure.guide.bond.threeRing": "Fondere un ciclo a 3 termini",
265
+ "structure.guide.bond.ring": "Fondere un ciclo di quella dimensione",
266
+ "structure.guide.bond.benzene": "Fondere un anello benzenico",
267
+ "structure.guide.bond.query": "Modificare i suoi criteri di ricerca",
268
+ "structure.guide.bond.delete": "Cancellarlo",
269
+ "structure.guide.anywhere.title": "In qualsiasi punto",
270
+ "structure.guide.anywhere.undo": "Annullare",
271
+ "structure.guide.anywhere.copy": "Copiare la struttura",
272
+ "structure.guide.anywhere.paste": "Incollare un molfile, uno SMILES o un idCode",
273
+ "structure.guide.anywhere.deleteSelection": "Cancellare la selezione",
274
+ "structure.guide.anywhere.flip": "Ribaltare in orizzontale o in verticale",
275
+ "structure.guide.anywhere.help": "Aprire questa guida",
276
+ "structure.guide.anywhere.note": "I tasti agiscono dopo che si è fatto clic sul disegno. Su una tela vuota, un tasto sceglie lo strumento il cui suggerimento lo indica.",
277
+ "structure.guide.selecting.title": "Selezionare",
278
+ "structure.guide.selecting.lasso": "Selezionare ciò che il lazo racchiude",
279
+ "structure.guide.selecting.rectangle": "Selezionare un rettangolo",
280
+ "structure.guide.selecting.add": "Aggiungere alla selezione",
281
+ "structure.guide.selecting.move": "Spostarla",
282
+ "structure.guide.selecting.duplicate": "Copiarla",
283
+ "structure.guide.selecting.queryFeatures": "Modificare i criteri di ricerca di un atomo, di un legame o della selezione",
284
+ "structure.guide.selecting.note": "Questo richiede lo strumento di selezione, che la barra spaziatrice sceglie.",
285
+ "structure.guide.stereochemistry.title": "Stereochimica",
286
+ "structure.guide.stereochemistry.note": "I legami rosa segnalano uno stereocentro con informazioni insufficienti o eccessive. Tracciare un legame verso l'osservatore o lontano da esso con la punta stretta sul centro, e usare poi lo strumento di stereochimica estesa per dire se il disegno è questo enantiomero (abs), entrambi (&) o uno dei due (or).",
287
+ "structure.input.type": "Scrivere",
288
+ "structure.input.or": "o",
289
+ "structure.input.drag": "Trascinare",
290
+ "structure.input.plusDrag": "+ trascinare",
291
+ "structure.input.dragSelection": "Trascinare la selezione",
292
+ "structure.input.plusDragSelection": "+ trascinare la selezione",
293
+ "structure.input.doubleClick": "Doppio clic",
294
+ "structure.docs.toolsAndKeys": "Strumenti e tasti",
295
+ "structure.docs.atomProperties": "Proprietà degli atomi",
296
+ "structure.docs.stereochemistry": "Stereochimica",
297
+ "structure.help.hoverToolbar": "Passare il puntatore su un pulsante della barra degli strumenti per vedere cosa fa e quale è il suo tasto.",
298
+ "structure.help.learnMore": "Scopri di più:",
299
+ "structure.mouseAndKeyboard": "Mouse e tastiera",
300
+ "structure.tool.clear.name": "Cancella",
301
+ "structure.tool.clear.description": "Cancellare tutto il disegno.",
302
+ "structure.tool.cleanUp.name": "Riordina",
303
+ "structure.tool.cleanUp.description": "Ridisegnare la struttura con coordinate 2D nuove. Se una parte è selezionata, il resto conserva la sua disposizione.",
304
+ "structure.tool.select.name": "Seleziona",
305
+ "structure.tool.select.description": "Trascinare attorno agli atomi per selezionarli: tenere Alt per un rettangolo, Maiusc per aggiungere alla selezione. Trascinare una selezione per spostarla, Maiusc-trascinare per copiarla.",
306
+ "structure.tool.unknownConfiguration.name": "Configurazione sconosciuta",
307
+ "structure.tool.unknownConfiguration.description": "Fare clic su uno stereocentro per segnarne la configurazione come sconosciuta; un altro clic lo annulla.",
308
+ "structure.tool.delete.name": "Cancella",
309
+ "structure.tool.delete.description": "Fare clic su un atomo o su un legame per cancellarlo.",
310
+ "structure.tool.singleBond.name": "Legame semplice",
311
+ "structure.tool.singleBond.description": "Fare clic su uno spazio vuoto per un nuovo legame, o trascinare da un atomo. Fare di nuovo clic su un legame lo rende doppio, poi triplo.",
312
+ "structure.tool.upBond.name": "Legame in avanti",
313
+ "structure.tool.upBond.description": "Legame stereo a cuneo, che punta verso l'osservatore. La sua punta stretta va sullo stereocentro.",
314
+ "structure.tool.positiveCharge.name": "Carica positiva",
315
+ "structure.tool.positiveCharge.description": "Fare clic su un atomo per alzarne la carica di una unità.",
316
+ "structure.tool.undo.name": "Annulla",
317
+ "structure.tool.undo.description": "Annullare l'ultima modifica.",
318
+ "structure.tool.zoomAndRotate.name": "Ingrandisci e ruota",
319
+ "structure.tool.zoomAndRotate.description": "Premere dove deve stare il centro, e trascinare poi in alto o in basso per ingrandire e di lato per ruotare. Con una selezione, si muove solo quella parte.",
320
+ "structure.tool.atomMapping.name": "Corrispondenza fra atomi",
321
+ "structure.tool.atomMapping.description": "Trascinare da un atomo del reagente allo stesso atomo del prodotto: entrambi ricevono lo stesso numero. Fare clic su un atomo numerato per togliergli il numero.",
322
+ "structure.tool.enhancedStereo.name": "Stereochimica estesa",
323
+ "structure.tool.enhancedStereo.description": "Fare clic su un legame stereo per dire cosa significa il suo centro: abs, questo enantiomero; &, entrambi (racemico); or, uno dei due. Premere di nuovo il pulsante per passare da uno all'altro.",
324
+ "structure.tool.text.name": "Testo",
325
+ "structure.tool.text.description": "Collocare un'etichetta di testo nel disegno.",
326
+ "structure.tool.chain.name": "Catena",
327
+ "structure.tool.chain.description": "Trascinare da uno spazio vuoto o da un atomo per tracciare una catena carboniosa a zigzag.",
328
+ "structure.tool.downBond.name": "Legame indietro",
329
+ "structure.tool.downBond.description": "Legame stereo tratteggiato, che punta lontano dall'osservatore. La sua punta stretta va sullo stereocentro.",
330
+ "structure.tool.negativeCharge.name": "Carica negativa",
331
+ "structure.tool.negativeCharge.description": "Fare clic su un atomo per abbassarne la carica di una unità.",
332
+ "structure.tool.anyAtom.name": "Atomo qualsiasi",
333
+ "structure.tool.anyAtom.description": "Scegliere qualsiasi elemento, isotopo, valenza o radicale in una finestra di dialogo, e fare poi clic per collocarlo o per cambiare un atomo. Alt-clic su un atomo ne modifica le proprietà.",
334
+ "structure.tool.ring3.name": "Ciclo a 3 termini",
335
+ "structure.tool.ring3.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
336
+ "structure.tool.ring5.name": "Ciclo a 5 termini",
337
+ "structure.tool.ring5.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
338
+ "structure.tool.ring7.name": "Ciclo a 7 termini",
339
+ "structure.tool.ring7.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
340
+ "structure.tool.ring4.name": "Ciclo a 4 termini",
341
+ "structure.tool.ring4.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
342
+ "structure.tool.ring6.name": "Ciclo a 6 termini",
343
+ "structure.tool.ring6.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
344
+ "structure.tool.benzene.name": "Anello benzenico",
345
+ "structure.tool.benzene.description": "Fare clic su uno spazio vuoto per un nuovo ciclo, su un legame per fonderne uno su di esso, o su un atomo per un ciclo spiro.",
346
+ "structure.tool.carbon.name": "Carbonio",
347
+ "structure.tool.carbon.description": "Fare clic su uno spazio vuoto per un nuovo atomo di C, o su un atomo per trasformarlo in C.",
348
+ "structure.tool.nitrogen.name": "Azoto",
349
+ "structure.tool.nitrogen.description": "Fare clic su uno spazio vuoto per un nuovo atomo di N, o su un atomo per trasformarlo in N.",
350
+ "structure.tool.oxygen.name": "Ossigeno",
351
+ "structure.tool.oxygen.description": "Fare clic su uno spazio vuoto per un nuovo atomo di O, o su un atomo per trasformarlo in O.",
352
+ "structure.tool.fluorine.name": "Fluoro",
353
+ "structure.tool.fluorine.description": "Fare clic su uno spazio vuoto per un nuovo atomo di F, o su un atomo per trasformarlo in F.",
354
+ "structure.tool.bromine.name": "Bromo",
355
+ "structure.tool.bromine.description": "Fare clic su uno spazio vuoto per un nuovo atomo di Br, o su un atomo per trasformarlo in Br.",
356
+ "structure.tool.hydrogen.name": "Idrogeno",
357
+ "structure.tool.hydrogen.description": "Fare clic su uno spazio vuoto per un nuovo atomo di H, o su un atomo per trasformarlo in H.",
358
+ "structure.tool.silicon.name": "Silicio",
359
+ "structure.tool.silicon.description": "Fare clic su uno spazio vuoto per un nuovo atomo di Si, o su un atomo per trasformarlo in Si.",
360
+ "structure.tool.phosphorus.name": "Fosforo",
361
+ "structure.tool.phosphorus.description": "Fare clic su uno spazio vuoto per un nuovo atomo di P, o su un atomo per trasformarlo in P.",
362
+ "structure.tool.sulfur.name": "Zolfo",
363
+ "structure.tool.sulfur.description": "Fare clic su uno spazio vuoto per un nuovo atomo di S, o su un atomo per trasformarlo in S.",
364
+ "structure.tool.chlorine.name": "Cloro",
365
+ "structure.tool.chlorine.description": "Fare clic su uno spazio vuoto per un nuovo atomo di Cl, o su un atomo per trasformarlo in Cl.",
366
+ "structure.tool.iodine.name": "Iodio",
367
+ "structure.tool.iodine.description": "Fare clic su uno spazio vuoto per un nuovo atomo di I, o su un atomo per trasformarlo in I.",
368
+ "structure.tool.reactionOnly": "Solo quando si disegna una reazione.",
369
+ "structure.tool.unavailable": "Non disponibile in questo editor.",
370
+ "structure.loadingEditor": "Caricamento dell'editor…",
371
+ "periodic.table": "Tavola periodica",
372
+ "periodic.group": "Gruppo {group}",
373
+ "periodic.period": "Periodo {period}",
374
+ "periodic.cellLabel": "{name} ({symbol}, Z = {atomicNumber})",
375
+ "periodic.category.alkali-metal": "Metallo alcalino",
376
+ "periodic.category.alkaline-earth-metal": "Alcalino terroso",
377
+ "periodic.category.transition-metal": "Metallo di transizione",
378
+ "periodic.category.post-transition-metal": "Metallo del blocco p",
379
+ "periodic.category.metalloid": "Metalloide",
380
+ "periodic.category.nonmetal": "Non metallo",
381
+ "periodic.category.halogen": "Alogeno",
382
+ "periodic.category.noble-gas": "Gas nobile",
383
+ "periodic.category.lanthanoid": "Lantanide",
384
+ "periodic.category.actinoid": "Attinide",
385
+ "molecule3d.view": "Vista",
386
+ "molecule3d.resetView": "Reimposta la vista",
387
+ "molecule3d.spin": "Rotazione continua",
388
+ "molecule3d.surface": "Superficie",
389
+ "molecule3d.molecularSurface": "Superficie molecolare",
390
+ "molecule3d.displayOptions": "Opzioni di visualizzazione",
391
+ "molecule3d.exportImage": "Esporta l'immagine",
392
+ "molecule3d.measure": "Misura",
393
+ "molecule3d.clearMeasurements": "Togli tutte le misure",
394
+ "molecule3d.measurement.distance": "Distanza",
395
+ "molecule3d.measurement.angle": "Angolo",
396
+ "molecule3d.measurement.dihedral": "Angolo diedro",
397
+ "molecule3d.measurementTooltip": "{what}: fare clic su {atoms} atomi",
398
+ "molecule3d.representation.ball-and-stick": "Sfere e bastoncini",
399
+ "molecule3d.representation.spacefill": "Sfere compatte",
400
+ "molecule3d.representation.stick": "Bastoncini",
401
+ "molecule3d.size": "Dimensione",
402
+ "molecule3d.surfaceOpacity": "Opacità della superficie",
403
+ "molecule3d.solventProbe": "Sonda di solvente [Å]",
404
+ "molecule3d.solventProbeHelp": "Raggio della sfera di solvente fatta rotolare sugli atomi. 1,4 Å corrisponde a una molecola d'acqua; una sonda più grande liscia la superficie e chiude le tasche strette.",
405
+ "molecule3d.surfaceColour": "Colore della superficie",
406
+ "molecule3d.colour": "Colore",
407
+ "molecule3d.coloring.uniform": "Uniforme",
408
+ "molecule3d.coloring.element": "Elemento",
409
+ "molecule3d.coloring.polarity": "Polarità",
410
+ "molecule3d.neutral": "neutro",
411
+ "molecule3d.tpsaHelp": "Superficie polare topologica (Ertl): l'area che apportano l'azoto, l'ossigeno e i loro idrogeni, calcolata dalla struttura da openchemlib. Non dipende dal conformero né dalla sonda.",
412
+ "molecule3d.loadingViewer": "Caricamento del visualizzatore 3D…",
413
+ "molecule3d.couldNotDraw": "Il visualizzatore non ha potuto disegnare questo",
414
+ "molecule3d.gesture.rotate": "Ruotare",
415
+ "molecule3d.gesture.rollDrag": "Ruotare nel piano dello schermo",
416
+ "molecule3d.gesture.rollKeys": "Ruotare nel piano, mentre si tiene premuto",
417
+ "molecule3d.gesture.moveDrag": "Spostare",
418
+ "molecule3d.gesture.moveCtrl": "Spostare",
419
+ "molecule3d.gesture.zoom": "Ingrandire",
420
+ "molecule3d.gesture.clip": "Tagliare attorno al centro",
421
+ "molecule3d.gesture.centreAtom": "Centrarsi su di esso",
422
+ "molecule3d.gesture.centreMolecule": "Centrarsi sulla molecola",
423
+ "molecule3d.input.drag": "Trascinare",
424
+ "molecule3d.input.plus": "+",
425
+ "molecule3d.input.plusDrag": "+ trascinare",
426
+ "molecule3d.input.plusScroll": "+ rotella",
427
+ "molecule3d.input.or": "o",
428
+ "molecule3d.input.rightDrag": "Trascinare con il tasto destro",
429
+ "molecule3d.input.scroll": "Rotella",
430
+ "molecule3d.input.clickAtom": "Fare clic su un atomo",
431
+ "molecule3d.input.clickBackground": "Fare clic sullo sfondo",
432
+ "molecule3d.helpNote": "I tasti agiscono mentre il puntatore è sopra la molecola. Su un Mac, Ctrl è il tasto Control, non ⌘. Con uno strumento di misura attivo, un clic sceglie un atomo.",
433
+ "orbital.couldNotDraw": "Non è stato possibile disegnare questo orbitale",
434
+ "orbital.sampling": "Campionamento…",
435
+ "orbital.showAxes": "Mostra gli assi x, y, z",
436
+ "orbital.axesTitle": "Assi cartesiani",
437
+ "orbital.axesBody": "Tracciare x, y e z attraverso il nucleo. L'etichetta nomina un orbitale in base a dove stanno i suoi lobi rispetto a essi.",
438
+ "orbital.axesExample": "quattro lobi fra gli assi y e z, nessuno su uno dei due.",
439
+ "orbital.spin": "Far ruotare l'orbitale",
440
+ "orbital.spinTitle": "Rotazione",
441
+ "orbital.spinBody": "Far ruotare lentamente l'orbitale sul suo asse verticale. Un angolo fisso nasconde quali lobi puntano verso di lei; uno che ruota, no.",
442
+ "orbital.resetTitle": "Reimposta la vista",
443
+ "orbital.resetBody": "Torna all'angolo e allo zoom con cui l'orbitale si è aperto. Un cambio di orbitale conserva la vista in cui lo si è girato.",
444
+ "viewer.capability.noWindow": "Il visualizzatore 3D richiede una finestra del browser.",
445
+ "viewer.capability.noContext": "Questo browser non ha potuto creare un contesto WebGL, quindi il visualizzatore 3D non può partire. Attivare l'accelerazione hardware, o aggiornare il driver grafico.",
446
+ "viewer.capability.noFloatTextures": "Questo driver grafico non ha texture in virgola mobile, perciò gli orbitali calcolati vengono costruiti sul processore. Tutto funziona, ma ogni orbitale richiede qualche secondo.",
447
+ "viewer.capability.ready": "Questo browser può mostrare il visualizzatore 3D e gli orbitali calcolati.",
448
+ "conformers.strategy.adaptive-random": "Casuale adattativo",
449
+ "conformers.strategy.likely-random": "Casuale ponderato",
450
+ "conformers.strategy.pure-random": "Casuale puro",
451
+ "conformers.strategy.likely-systematic": "Sistematico ponderato",
452
+ "conformers.strategyDetail.adaptive-random": "Estrae le torsioni a caso ma si allontana dalle combinazioni che hanno già portato a collisioni, il che copre più rapidamente una molecola flessibile.",
453
+ "conformers.strategyDetail.likely-random": "Estrae le torsioni a caso dalla banca dati delle torsioni, pesate per la frequenza con cui ogni angolo si osserva nelle strutture cristalline.",
454
+ "conformers.strategyDetail.pure-random": "Estrae ogni torsione in modo uniforme, senza tenere conto della probabilità dell'angolo: la dispersione più ampia e l'insieme meno realistico.",
455
+ "conformers.strategyDetail.likely-systematic": "Percorre le combinazioni di torsioni per probabilità decrescente, così i primi conformeri sono i più probabili e l'insieme è riproducibile.",
456
+ "conformers.minimisation.none": "Nessuna (senza energie)",
457
+ "number.increment": "Aumenta",
458
+ "number.decrement": "Diminuisci"
459
+ }
@@ -0,0 +1,6 @@
1
+ export {
2
+ isPartialNumber,
3
+ numberText,
4
+ readNumber,
5
+ stepNumber,
6
+ } from './numberText.ts';
@@ -0,0 +1,91 @@
1
+ /**
2
+ * The number a box of text reads as, and the text a number is shown with.
3
+ *
4
+ * A box that hands its text straight to `Number` is a box nobody can type a
5
+ * decimal into: `0.` reads as `0`, and a control rendered from that number
6
+ * writes `0` back over the dot before the next keystroke arrives. So the text
7
+ * and the number are two values here, and the text is the one the reader owns.
8
+ */
9
+
10
+ /** Text that reads as a finite number, comma or dot. */
11
+ const NUMBER = /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
12
+
13
+ /** Text a reader is partway through: `-`, `0.`, `1e`, `1e-`, or empty. */
14
+ const PARTIAL = /^[+-]?(?:\d+(?:\.\d*)?|\.\d*)(?:e[+-]?\d*)?$/i;
15
+
16
+ /** A sign on its own, which is where typing a negative number starts. */
17
+ const SIGN = /^[+-]?$/;
18
+
19
+ /** Decimals `roundTo` can keep, and the most a step is rounded to. */
20
+ const MAXIMUM_DECIMALS = 15;
21
+
22
+ /**
23
+ * The number some text reads as.
24
+ *
25
+ * A decimal comma is read as a decimal point, because a keyboard laid out for
26
+ * French or German puts a comma where the number pad's decimal key is and a
27
+ * reader typing `0,2` means two tenths.
28
+ * @param text - What is in the box.
29
+ * @param integer - Whether only whole numbers are wanted. Defaults to `false`.
30
+ * @returns The number, or undefined while the text does not read as one.
31
+ */
32
+ export function readNumber(text: string, integer = false): number | undefined {
33
+ const trimmed = text.trim().replace(',', '.');
34
+ if (!NUMBER.test(trimmed)) return undefined;
35
+ const parsed = Number(trimmed);
36
+ if (!Number.isFinite(parsed)) return undefined;
37
+ if (integer && !Number.isInteger(parsed)) return undefined;
38
+ return parsed;
39
+ }
40
+
41
+ /**
42
+ * Whether the text can still become a number as more is typed.
43
+ *
44
+ * `0.`, `-` and `1e-` are all on the way to a number and must not be reported
45
+ * as mistakes; `0.2x` is not, and a box may say so while it is being typed.
46
+ * @param text - What is in the box.
47
+ * @returns Whether anything typed so far rules a number out.
48
+ */
49
+ export function isPartialNumber(text: string): boolean {
50
+ const trimmed = text.trim().replace(',', '.');
51
+ return SIGN.test(trimmed) || PARTIAL.test(trimmed);
52
+ }
53
+
54
+ /**
55
+ * The text a number is shown with.
56
+ * @param value - The number, or nothing when the box is empty.
57
+ * @returns Its text, empty when there is no number.
58
+ */
59
+ export function numberText(value: number | undefined): string {
60
+ return value === undefined || !Number.isFinite(value) ? '' : String(value);
61
+ }
62
+
63
+ /**
64
+ * A number moved by one press of an arrow key or a stepper button.
65
+ *
66
+ * The result is rounded to the decimals the two operands carry, so stepping
67
+ * `0.1` up by `0.2` lands on `0.3` rather than on `0.30000000000000004` — a
68
+ * value that is then shown, shared in a link and stored in full.
69
+ * @param value - Where the box is now.
70
+ * @param delta - What the press adds; negative going down.
71
+ * @returns The number the box moves to.
72
+ */
73
+ export function stepNumber(value: number, delta: number): number {
74
+ const decimals = Math.max(decimalsOf(value), decimalsOf(delta));
75
+ const moved = value + delta;
76
+ if (decimals === 0) return moved;
77
+ const factor = 10 ** decimals;
78
+ return Math.round(moved * factor) / factor;
79
+ }
80
+
81
+ /**
82
+ * How many decimals a number is written with.
83
+ * @param value - The number.
84
+ * @returns Its count of decimals, `0` for anything written in exponent form.
85
+ */
86
+ function decimalsOf(value: number): number {
87
+ const text = String(Math.abs(value));
88
+ const dot = text.indexOf('.');
89
+ if (dot === -1 || text.includes('e')) return 0;
90
+ return Math.min(text.length - dot - 1, MAXIMUM_DECIMALS);
91
+ }