diff --git a/TrimSP.html b/TrimSP.html
index 1d11d41..cfb02ce 100644
--- a/TrimSP.html
+++ b/TrimSP.html
@@ -2,8 +2,8 @@
+
-
-
TRIMSP-NL Workbench
-
-
-
-
-
Layers
-
Scans
-
Plots
-
Other Parameters
+
+
+
+ Layers
+ Scan
+ Results
+ Advanced
+
+
+
+
+
+ TRIMSP-NL Workbench
+ Low-energy implantation simulation
+
+
+
Run simulation
-
+
+
+
+
+ Transport model
+
Advanced parameters
+
+
+
-
- For further details see:
- W. Eckstein, Computer Simulation of Ion-Solid Interactions ,
- Springer Series in Materials Science, Vol. 10 (Springer-Verlag, Berlin, 1991).
-
- https://doi.org/10.1007/978-3-642-73513-4
-
-
-
- If you use this software in published work, please cite the relevant
- TRIM.SP references and the TRIMSP-NL Workbench paper.
-
-
- Source repository:
-
- gitea.psi.ch/LMU/TRIMSP
-
-
+
+
+
+ Documentation
+ Reference & citation
+
+ For model details, see W. Eckstein,
+ Computer Simulation of Ion-Solid Interactions , Springer Series
+ in Materials Science, Vol. 10 (Springer-Verlag, Berlin, 1991).
+
+
+ doi.org/10.1007/978-3-642-73513-4
+
+
+ If you use this software in published work, please cite the relevant
+ TRIM.SP references and the TRIMSP-NL Workbench paper.
+
+
+ Source repository
+
+ gitea.psi.ch/LMU/TRIMSP
+
+
+
-
-
-
+
+
Folder: -
Backend: -
@@ -429,12 +448,8 @@
if (webOrApp) {
console.log('this script is not running in Node.js');
// Run as a web app
- //let row = document.getElementById("FileRow");
- //row.parentNode.removeChild(row);
- //row = document.getElementById("FolderRow");
- //row.parentNode.removeChild(row);
- document.getElementById("FileRow").style.visibility = "hidden";;
- document.getElementById("FolderRow").style.visibility = "hidden";;
+ document.getElementById("FileRow").hidden = true;
+ document.getElementById("FolderRow").hidden = true;
} else {
console.log('this script is running in Node.js');
// Run as standalone app
diff --git a/ZGUI.css b/ZGUI.css
index 388ae22..b970e28 100644
--- a/ZGUI.css
+++ b/ZGUI.css
@@ -2,371 +2,613 @@
box-sizing: border-box;
}
+:root {
+ --trim-bg: #e9eef0;
+ --trim-panel: #fffdf8;
+ --trim-panel-soft: #f3f6f4;
+ --trim-ink: #1d2b32;
+ --trim-muted: #617077;
+ --trim-deep: #173943;
+ --trim-accent: #bd5f37;
+ --trim-accent-hover: #9f4827;
+ --trim-border: #c8d3d5;
+ --trim-focus: #2d7888;
+ --trim-status-height: 38px;
+}
+
+html {
+ height: 100%;
+}
+
+body {
+ background:
+ radial-gradient(circle at 8% 5%, rgba(189, 95, 55, 0.16), transparent 28rem),
+ linear-gradient(145deg, #f5f1e9 0%, var(--trim-bg) 58%, #dce6e7 100%);
+ color: var(--trim-ink);
+ font-family: "Trebuchet MS", "Lucida Sans", Geneva, sans-serif;
+ height: 100vh;
+ height: 100dvh;
+ margin: 0;
+ overflow: hidden;
+ padding: 8px 10px calc(var(--trim-status-height) + 8px);
+}
+
td {
- white-space: wrap;
+ white-space: normal;
}
-.guitable {
- background-color: #DDDDDD;
- border: 1px solid #000000;
- /* border-collapse: collapse; */
- border-radius: 10px;
- border: none;
- border-spacing: 0px;
- padding: 5px;
- margin-left: auto;
- margin-right: auto;
- margin-top: 0.5em;
- margin-bottom: 0.5em;
+button,
+input,
+select {
+ font: inherit;
}
-.guitable tr:last-child td:first-child {
- border-bottom-left-radius: 12px;
+input[type="text"],
+input[type="number"],
+select {
+ background: #fff;
+ border: 1px solid #aebdc0;
+ border-radius: 5px;
+ color: var(--trim-ink);
+ min-height: 29px;
+ padding: 3px 7px;
}
-.guitable tr:last-child td:last-child {
- border-bottom-right-radius: 12px;
+input[type="text"]:focus,
+input[type="number"]:focus,
+select:focus,
+button:focus-visible,
+input[type="button"]:focus-visible {
+ border-color: var(--trim-focus);
+ box-shadow: 0 0 0 3px rgba(45, 120, 136, 0.17);
+ outline: none;
}
-.guitable tr:first-child td:first-child {
- border-top-left-radius: 12px;
+input:disabled {
+ background: #e8edef;
+ color: #59676d;
+ cursor: not-allowed;
}
-.guitable tr:first-child td:last-child {
- border-top-right-radius: 12px;
+button,
+input[type="button"] {
+ background: #fff;
+ border: 1px solid #8da5aa;
+ border-radius: 5px;
+ color: var(--trim-deep);
+ cursor: pointer;
+ font-weight: 700;
+ padding: 6px 11px;
}
-.guitable tr:nth-child(odd) {
- background-color: #DDDDDD;
+button:hover,
+input[type="button"]:hover {
+ background: #eaf1f1;
}
-.guitable tr:nth-child(even) {
- background-color: #DDDDDD;
-}
-
-/* For mobile phones: */
-[class*="col-"] {
+.app-shell {
+ height: 100%;
+ margin: 0 auto;
+ max-width: 1240px;
+ min-height: 0;
width: 100%;
}
-@media only screen and (min-width: 700px) {
+.app-card {
+ background: linear-gradient(180deg, var(--trim-panel) 0%, #fafbf8 100%);
+ border: 1px solid rgba(97, 112, 119, 0.3);
+ border-radius: 13px;
+ box-shadow: 0 18px 45px rgba(29, 43, 50, 0.17);
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ min-height: 0;
+ overflow: hidden;
+}
- /* For tablets: */
- .col-s-1 {
- width: 50%;
- background-color: #DDDDDD;
+.tab {
+ background: var(--trim-deep);
+ display: flex;
+ flex: 0 0 auto;
+ gap: 3px;
+ overflow-x: auto;
+ padding: 4px 6px;
+}
+
+.tab button {
+ background: transparent;
+ border: 0;
+ border-radius: 6px;
+ color: #dce8e9;
+ font-size: 0.93rem;
+ padding: 6px 11px;
+ transition: background 0.16s ease, color 0.16s ease;
+ white-space: nowrap;
+}
+
+.tab button:hover {
+ background: rgba(255, 255, 255, 0.13);
+ color: #fff;
+}
+
+.tab button.active {
+ background: var(--trim-panel);
+ color: var(--trim-deep);
+}
+
+.main-action-bar {
+ align-items: center;
+ background: var(--trim-panel-soft);
+ border-bottom: 1px solid var(--trim-border);
+ box-shadow: 0 5px 15px rgba(29, 43, 50, 0.07);
+ display: flex;
+ flex: 0 0 auto;
+ gap: 16px;
+ justify-content: space-between;
+ padding: 7px 12px;
+ z-index: 10;
+}
+
+.action-bar-title {
+ align-items: center;
+ display: flex;
+ gap: 10px;
+ min-width: 0;
+}
+
+.app-brand-icon {
+ border-radius: 7px;
+ flex: 0 0 auto;
+ height: 32px;
+ width: 32px;
+}
+
+.action-bar-title strong {
+ color: var(--trim-deep);
+ display: block;
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: 1rem;
+}
+
+.action-bar-eyebrow {
+ color: var(--trim-muted);
+ display: block;
+ font-size: 0.7rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.run-action {
+ background: var(--trim-accent);
+ border-color: var(--trim-accent);
+ color: #fff;
+ flex: 0 0 auto;
+ min-width: 145px;
+ padding: 8px 14px;
+}
+
+.run-action:hover {
+ background: var(--trim-accent-hover);
+}
+
+.tabcontent {
+ background: var(--trim-panel);
+ border: 0;
+ flex: 1 1 auto;
+ min-height: 0;
+ overflow: auto;
+ padding: 10px 12px 14px;
+}
+
+/* Compact configuration panels keep the default window free of scrollbars. */
+.output-settings {
+ align-items: end;
+ display: grid;
+ gap: 10px;
+ grid-template-columns: minmax(180px, 0.8fr) minmax(320px, 1.8fr);
+ margin-bottom: 9px;
+}
+
+.compact-field,
+.settings-field {
+ min-width: 0;
+}
+
+.compact-field > span,
+.compact-field > label,
+.settings-field > span {
+ color: var(--trim-muted);
+ display: block;
+ font-size: 0.75rem;
+ font-weight: 700;
+ margin-bottom: 2px;
+}
+
+.compact-field > input,
+.settings-field > input,
+.settings-field > select {
+ width: 100%;
+}
+
+.field-with-action {
+ display: flex;
+ gap: 6px;
+}
+
+.field-with-action input[type="text"] {
+ flex: 1 1 auto;
+ min-width: 0;
+}
+
+.layers-workspace {
+ align-items: start;
+ display: grid;
+ gap: 10px;
+ grid-template-columns: minmax(0, 1.15fr) minmax(300px, 0.85fr);
+}
+
+.settings-panel,
+.reference-panel {
+ background: #fff;
+ border: 1px solid var(--trim-border);
+ border-radius: 9px;
+ min-width: 0;
+ padding: 9px 10px;
+}
+
+.section-heading {
+ align-items: center;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 6px;
+ min-height: 32px;
+}
+
+.section-heading h2,
+.reference-panel h2 {
+ color: var(--trim-deep);
+ font-family: Georgia, "Times New Roman", serif;
+ font-size: 1rem;
+ line-height: 1.15;
+ margin: 0;
+}
+
+.section-eyebrow {
+ color: var(--trim-accent);
+ display: block;
+ font-size: 0.67rem;
+ font-weight: 700;
+ letter-spacing: 0.08em;
+ margin-bottom: 1px;
+ text-transform: uppercase;
+}
+
+.layer-count {
+ align-items: center;
+ color: var(--trim-muted);
+ display: flex;
+ font-size: 0.75rem;
+ font-weight: 700;
+ gap: 6px;
+}
+
+.layer-count input {
+ width: 58px;
+}
+
+.layer-table-wrap {
+ overflow-x: auto;
+}
+
+.projectile-grid {
+ display: grid;
+ gap: 6px 9px;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+#Plots > table {
+ border-collapse: separate;
+ border-spacing: 0;
+ width: 100%;
+}
+
+#LTable {
+ border: 0;
+ border-collapse: separate;
+ border-spacing: 0;
+ overflow: hidden;
+ width: 100%;
+}
+
+#LTable td {
+ border-bottom: 1px solid var(--trim-border);
+ border-left: 0;
+ border-right: 0;
+ border-top: 0;
+ padding: 5px 6px;
+}
+
+#LTable tr:first-child td {
+ background: #e7eeed;
+ color: var(--trim-deep);
+ font-size: 0.84rem;
+}
+
+#LTable tr:not(:first-child):hover td {
+ background: #f5f8f5;
+}
+
+#ScansControls,
+#ScansLine,
+#ScansTable {
+ margin-top: 12px;
+}
+
+#ScansControls table,
+#ScansTable {
+ background: var(--trim-panel-soft);
+ border: 1px solid var(--trim-border);
+ border-radius: 8px;
+ padding: 8px;
+}
+
+#ScansControls td,
+#ScansTable td {
+ padding: 6px;
+}
+
+#Plots > table td {
+ padding: 8px;
+ vertical-align: top;
+ width: 50%;
+}
+
+.advanced-layout {
+ align-items: start;
+ display: grid;
+ gap: 10px;
+ grid-template-columns: minmax(560px, 2.2fr) minmax(240px, 0.8fr);
+}
+
+.advanced-parameters > table {
+ border-collapse: separate;
+ border-spacing: 5px 2px;
+ width: 100%;
+}
+
+.advanced-parameters {
+ padding: 7px 9px;
+}
+
+.advanced-parameters .section-heading {
+ margin-bottom: 2px;
+}
+
+.advanced-parameters > table td {
+ padding: 2px 3px;
+}
+
+.advanced-parameters > table td:nth-child(odd) {
+ color: var(--trim-deep);
+ font-size: 0.8rem;
+ font-weight: 700;
+}
+
+.advanced-parameters input {
+ min-height: 27px;
+ max-width: 94px;
+ width: 100%;
+}
+
+.reference-panel {
+ background:
+ linear-gradient(145deg, rgba(189, 95, 55, 0.08), transparent 55%),
+ var(--trim-panel-soft);
+ color: #46565d;
+ font-size: 0.75rem;
+ line-height: 1.32;
+ padding: 8px 9px;
+}
+
+.reference-panel p {
+ margin: 6px 0;
+}
+
+.reference-link {
+ color: #1f6675;
+ display: block;
+ overflow-wrap: anywhere;
+}
+
+.reference-divider {
+ border-top: 1px solid var(--trim-border);
+ margin: 7px 0 6px;
+}
+
+.reference-label {
+ color: var(--trim-deep);
+ display: block;
+ font-size: 0.7rem;
+ font-weight: 700;
+ margin-bottom: 3px;
+ text-transform: uppercase;
+}
+
+.tooltip {
+ cursor: help;
+ position: relative;
+}
+
+.tooltip .tooltiptext {
+ background: #142d35;
+ border-radius: 7px;
+ box-shadow: 0 8px 24px rgba(17, 34, 40, 0.25);
+ color: #fff;
+ font-weight: 400;
+ left: 0;
+ line-height: 1.35;
+ padding: 9px 11px;
+ position: absolute;
+ text-align: left;
+ top: calc(100% + 5px);
+ display: none;
+ width: 330px;
+ z-index: 100;
+}
+
+.tooltip:hover .tooltiptext,
+.tooltip:focus-within .tooltiptext {
+ display: block;
+}
+
+.transient-warning {
+ background: #fff1c9;
+ border: 1px solid #c79824;
+ border-radius: 7px;
+ box-shadow: 0 7px 20px rgba(29, 43, 50, 0.17);
+ color: #523c08;
+ line-height: 1.35;
+ max-width: 380px;
+ opacity: 0;
+ padding: 9px 12px;
+ pointer-events: none;
+ position: fixed;
+ transition: opacity 0.2s ease;
+ z-index: 1000;
+}
+
+.transient-warning.visible {
+ opacity: 1;
+}
+
+.estimated-density {
+ background: #fff1c9 !important;
+ border-color: #c79824 !important;
+}
+
+.status-bar {
+ align-items: center;
+ background: #edf2f2;
+ border-top: 1px solid #aebec1;
+ bottom: 0;
+ box-shadow: 0 -3px 12px rgba(29, 43, 50, 0.1);
+ color: var(--trim-ink);
+ display: flex;
+ flex-wrap: nowrap;
+ font-size: 0.82rem;
+ gap: 14px;
+ left: 0;
+ min-height: var(--trim-status-height);
+ padding: 5px 12px;
+ position: fixed;
+ right: 0;
+ z-index: 900;
+}
+
+.status-item {
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.status-item strong {
+ color: var(--trim-deep);
+}
+
+.status-progress {
+ flex: 1 1 220px;
+ min-width: 150px;
+}
+
+.status-progress-track {
+ background: #d3dcde;
+ border: 1px solid #aebec1;
+ border-radius: 999px;
+ height: 18px;
+ overflow: hidden;
+ width: 100%;
+}
+
+.status-progress-fill {
+ background: linear-gradient(90deg, #2d7888, #45a0a6);
+ color: #fff;
+ font-size: 0.72rem;
+ font-weight: 700;
+ height: 100%;
+ line-height: 16px;
+ padding: 0 4px;
+ text-align: center;
+ transition: width 0.2s ease;
+ width: 0%;
+}
+
+@media only screen and (max-width: 760px) {
+ body {
+ padding: 0 0 var(--trim-status-height);
}
- .col-s-2 {
- width: 50%;
- background-color: #DDDDDD;
+ .app-card {
+ border: 0;
+ border-radius: 0;
}
- .col-s-full {
- width: 100%;
- background-color: #F2F2F2;
+ .main-action-bar {
+ align-items: stretch;
+ flex-direction: column;
+ gap: 8px;
}
- [class*="col-"] {
- width: 100%;
+ .run-action {
+ width: 100%;
}
- @media only screen and (min-width: 990px) {
-
- /* For desktop: */
- .col-1 {
- width: 50%;
- background-color: #F2F2F2;
- }
-
- .col-2 {
- width: 50%;
- background-color: #F2F2F2;
- }
-
- .col-full {
- width: 100%;
- background-color: #F2F2F2;
- }
+ .output-settings,
+ .layers-workspace,
+ .projectile-grid {
+ grid-template-columns: 1fr;
}
- [class*="col-"] {
- float: left;
- padding: 5px;
- border: none;
+ .advanced-layout {
+ grid-template-columns: 1fr;
}
- .row::after {
- content: "";
- clear: both;
- display: table;
+ .advanced-parameters {
+ overflow-x: auto;
}
- .transient-warning {
- position: fixed;
- max-width: 360px;
- padding: 10px 14px;
- background-color: #fff4cc;
- border: 1px solid #c5a100;
- border-radius: 8px;
- color: #4d3b00;
- box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);
- font-size: 0.95rem;
- line-height: 1.35;
- opacity: 0;
- pointer-events: none;
- transition: opacity 0.25s ease;
- z-index: 1000;
+ #Plots > table,
+ #Plots > table > tbody,
+ #Plots > table > tbody > tr,
+ #Plots > table > tbody > tr > td {
+ display: block;
+ width: 100%;
}
- .transient-warning.visible {
- opacity: 1;
- }
-
- .estimated-density {
- background-color: #fff4cc;
- border: 1px solid #c5a100;
- }
-
- .status-bar {
- position: fixed;
- left: 0;
- right: 0;
- bottom: 0;
- display: flex;
- flex-wrap: wrap;
- gap: 8px 16px;
- align-items: center;
- padding: 8px 14px;
- background-color: #eef2f5;
- border-top: 1px solid #b8c3cc;
- color: #23313d;
- font-size: 0.88rem;
- box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.08);
- z-index: 900;
- }
-
- .status-item {
- min-width: 180px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .status-item strong {
- color: #10202c;
+ .status-item:nth-child(-n+3) {
+ display: none;
}
.status-progress {
- flex: 1 1 260px;
- min-width: 220px;
+ min-width: 120px;
+ }
+}
+
+@media only screen and (min-width: 761px) and (max-width: 900px) {
+ .advanced-layout {
+ grid-template-columns: 1fr;
}
- .status-progress-track {
- width: 100%;
- height: 22px;
- background-color: #d7dee5;
- border-radius: 8px;
- overflow: hidden;
- border: 1px solid #b8c3cc;
+ .reference-panel {
+ display: grid;
+ gap: 8px 14px;
+ grid-template-columns: 1fr 1fr;
}
- .status-progress-fill {
- width: 0%;
- height: 100%;
- background-color: #2e8b57;
- color: black;
- padding-left: 3px;
- text-align: center;
- line-height: 20px;
- font-size: 0.78rem;
- font-weight: 600;
- transition: width 0.2s ease;
+ .reference-panel .section-eyebrow,
+ .reference-panel h2,
+ .reference-divider {
+ grid-column: 1 / -1;
}
-
- .group_name {
- padding-left: 1em;
- padding-right: 1em;
- font-size: 105%;
- font-weight: bold;
- width: 1%;
- white-space: nowrap;
- /* text-align: center; */
- }
-
- .yellow_td {
- padding-left: 1em;
- padding-right: 1em;
- background-color: yellow;
- width: 1%;
- white-space: nowrap;
- }
-
- .gray_td {
- padding-left: 1em;
- padding-right: 1em;
- background-color: gray;
- width: 1%;
- white-space: nowrap;
- }
-
- .nocol_td {
- padding-left: 1em;
- padding-right: 1em;
- width: 1%;
- white-space: nowrap;
- }
-
- /* Style the tab */
- .tab {
- overflow: hidden;
- border: 1px solid #ccc;
- background-color: #f1f1f1;
- }
-
- /* Style the buttons that are used to open the tab content */
- .tab button {
- background-color: inherit;
- float: left;
- border: none;
- outline: none;
- cursor: pointer;
- padding: 14px 16px;
- transition: 0.3s;
- font-size: 105%;
- font-weight: bold;
- }
-
- /* Change background color of buttons on hover */
- .tab button:hover {
- background-color: #ddd;
- }
-
- /* Create an active/current tablink class */
- .tab button.active {
- background-color: #ccc;
- }
-
- /* Style the tab content */
- .tabcontent {
- display: none;
- padding: 6px 12px;
- border: 1px solid #ccc;
- border-top: none;
- }
-
- /* Go from zero to full opacity */
- @keyframes fadeEffect {
- from {
- opacity: 0;
- }
-
- to {
- opacity: 1;
- }
- }
-
- /* Chrome, Safari, Opera */
- @-webkit-keyframes example {
- 0% {
- background-color: red;
- left: 20px;
- top: 0px;
- }
-
- 25% {
- background-color: orange;
- left: 25px;
- top: 0px;
- }
-
- 50% {
- background-color: green;
- left: 30px;
- top: 0px;
- }
-
- 75% {
- background-color: orange;
- left: 25px;
- top: 0px;
- }
-
- 100% {
- background-color: red;
- left: 20px;
- top: 0px;
- }
- }
-
- /* Standard syntax */
- @keyframes example {
- 0% {
- background-color: red;
- left: 20px;
- top: 0px;
- }
-
- 25% {
- background-color: orange;
- left: 25px;
- top: 0px;
- }
-
- 50% {
- background-color: green;
- left: 30px;
- top: 0px;
- }
-
- 75% {
- background-color: orange;
- left: 25px;
- top: 0px;
- }
-
- 100% {
- background-color: red;
- left: 20px;
- top: 0px;
- }
- }
-
- #myBar {
- width: 10%;
- height: 30px;
- background-color: #4CAF50;
- text-align: center;
- /* To center it horizontally (if you want) */
- line-height: 30px;
- /* To center it vertically */
- color: white;
- }
-
- /* Tooltip container */
- .tooltip {
- position: relative;
- display: inline-block;
- /* border-bottom: 1px dotted black; /* If you want dots under the hoverable text */
- }
-
- /* Tooltip text */
- .tooltip .tooltiptext {
- visibility: hidden;
- width: 320px;
- background-color: black;
- color: #fff;
- text-align: left;
- padding: 5px;
- border-radius: 6px;
-
- /* Position the tooltip text - see examples below! */
- position: absolute;
- z-index: 1;
- }
-
- /* Show the tooltip text when you mouse over the tooltip container */
- .tooltip:hover .tooltiptext {
- visibility: visible;
- }
-}
\ No newline at end of file
+}