diff --git a/app/src/App.css b/app/src/App.css
index f6ee8494..4955af5e 100644
--- a/app/src/App.css
+++ b/app/src/App.css
@@ -122,10 +122,42 @@ input:checked + .slider:before {
color: rgba(0, 0, 0, 0.85) !important;
}
-div.full-height {
+/* File preview Modal.Actions toolbar.
+ Single layout that works at every viewport — buttons keep their order at any width.
+ On narrow screens, the tags selector wraps to its own line while the button groups stay together. */
+.preview-toolbar {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.5em;
+}
+
+.preview-toolbar-group {
+ display: flex;
+ align-items: center;
+ gap: 0.25em;
+ flex: 0 0 auto;
+}
+
+.preview-toolbar-tags {
+ flex: 1 1 200px;
+ min-width: 0;
+}
+
+/* Caps preview content to fit inside the file-preview Modal.
+ 300px reserves room for pathContent
, Modal.Header, Modal.Actions row,
+ inner content (e.g. STL dimensions banner), and modal padding.
+ Use 100dvh so mobile browser chrome (URL bar) is accounted for. */
+.preview-fit {
+ width: 100%;
+ height: calc(100dvh - 300px);
+ max-height: calc(100dvh - 300px);
+ min-height: 240px;
overflow: hidden;
- padding-top: 100%;
position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
}
td.file-path {
diff --git a/app/src/Tags.js b/app/src/Tags.js
index ffa18498..6e6fbc41 100644
--- a/app/src/Tags.js
+++ b/app/src/Tags.js
@@ -405,6 +405,7 @@ export function AddTagsButton({
limit = null,
disabled = false,
filterByOverlap = false,
+ color = 'violet',
}) {
// A button which displays a modal in which the user can add or remove tags.
@@ -556,7 +557,7 @@ export function AddTagsButton({
return <>