Skip to content

Commit b5a2565

Browse files
committed
v2.14.1 — rack-drag polish, thumbnail drag-lock, .ttag Windows fix
Changed: - Reorder card minimum-stock control now matches the buy-link / price buttons (full-width .ro-shop-btn with a bell icon, value + pencil once set); dropped the now-unused .ro-price-shown CSS. Fixed: - Spool/product thumbnails can no longer be picked up as a native ghost image in the inventory grid/list or Favorites (img { -webkit-user-drag: none }). - Rack view: removed the whole-panel amber drop-void glow that fired during a normal rack-to-rack move (kept the void-drop un-rack function). - Rack view: empty slots stay neutral during a drag; only the hovered slot (.rp-slot--drop) highlights. - .ttag import overlay no longer pops up mid-drag on Windows (a spool drag containing an <img> leaked "Files" into dataTransfer.types) — dragstart guard.
1 parent caa3da3 commit b5a2565

12 files changed

Lines changed: 168 additions & 57 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,21 @@ Versions follow [Semantic Versioning](https://semver.org/).
55

66
---
77

8+
## v2.14.1 — 2026-07-23
9+
10+
### Changed
11+
12+
- **The reorder card's minimum-stock control now matches the buy-link / price buttons.** It was a read-only text field + an always-visible pencil; it is now the same full-width `.ro-shop-btn` (`#roMinBtn`) — a bell icon + "Add a minimum" when empty (click to add), the value when set, with the pencil (`#roMinEdit`) revealed only once a minimum is set and the button flipping to `.ro-shop-btn--active`. Clicking anywhere on the button opens the inline editor, like `#roPriceBtn`. Dropped the now-unused `.ro-price-shown` / `.ro-price-shown--empty` CSS — `renderer/inventory.js`, `renderer/css/70-detail-misc.css`.
13+
14+
### Fixed
15+
16+
- **Spool / product thumbnails can no longer be picked up and dragged as a ghost image** in the inventory grid/list or Favorites (no drag is intended there). `<img>` elements are native drag sources by default, so a thumbnail could be grabbed and dragged with no drop, looking broken. Disabled globally via `img { -webkit-user-drag: none }`; every intended drag (rack slots, list/cart reorder, friends) uses a draggable `<div>`/`<span>` handle, never an `<img>`, so nothing else is affected — `renderer/css/00-base.css`.
17+
- **Rack view: the whole panel no longer glows amber while dragging a spool between racks.** Hovering a dragged spool over any empty area of the rack view (gaps between racks, the zone edges) added `rp-view--drop-void` to `#invRackView`, whose `box-shadow: inset 0 0 0 2px rgba(234,179,8,.35)` lit up the entire panel — a "drop here to un-rack" cue that fired constantly during a normal rack-to-rack move. Removed the glow; the void-drop *function* (release on empty space → un-rack) is unchanged, and un-racking also stays available via the unranked side panel and the toolbox "remove from rack" button — `renderer/css/40-printers.css`.
18+
- **Rack view: dragging a spool no longer paints every empty slot orange.** The ambient "drop-zone" treatment gave each empty unlocked slot an orange dashed border + soft-orange fill + a `rp-slot-pulse` animation, so a card full of empty slots read as one big orange glow. Empty slots now stay neutral during a drag; only the slot directly under the cursor (`.rp-slot--drop`) highlights. Locked slots still dim. Also removed the dead `body.is-dragging-spool .rp-rack { transition: box-shadow }` — `renderer/css/30-racks.css`.
19+
- **The `.ttag` import overlay no longer pops up mid-drag when moving a spool in Grid/Rack view (Windows).** The full-window drop hint used `dataTransfer.types.includes("Files")` to tell a real file drag from the storage view's internal spool DnD, but on Windows/Chromium dragging an element containing an `<img>` (a spool thumbnail) leaks `"Files"` into the drag types, so an internal drag was mistaken for a dropped file (intermittent, image-load-dependent; never reproduced on macOS). Added a `dragstart`/`dragend` guard — an OS file drag never fires `dragstart` inside the document, so any active internal drag now suppresses the overlay reliably — `renderer/inventory.js` (`_wireTtagDropZone`).
20+
21+
---
22+
823
## v2.14.0 — 2026-07-23
924

1025
### Added

‎FEATURES.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Tiger Studio Manager — Feature Catalogue
22

3-
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier, live 3D-printer integration across six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.14.0**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
3+
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier, live 3D-printer integration across six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.14.1**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
44

55
---
66

‎WORKLOG.md‎

Lines changed: 6 additions & 13 deletions
Large diffs are not rendered by default.

‎data/release-notes/v2.14.1.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## Fixed
2+
3+
- Fixed spool thumbnails being accidentally "picked up" and dragged around in the Inventory (grid and list) and Favorites views, where dragging isn't meant to do anything.
4+
- In the rack view, moving a spool from one rack to another no longer lights up the whole panel while you drag — it stays calm, and only the slot you're about to drop into is highlighted.
5+
- On Windows, the import window no longer pops up by mistake while you drag a spool around in the grid or rack view.
6+
7+
## Changed
8+
9+
- The **minimum-stock** button now looks and behaves like the "Add a buy link" and "Add a price" buttons — one tidy button to set it, with the value and an edit pencil once it's set.
10+
11+
---
12+
13+
📖 **[Full changelog](https://github.com/TigerTag-Project/TigerTag-Studio-Manager/blob/main/CHANGELOG.md)** · ⬇️ Grab the installer for your OS from the **Assets** below (macOS `.dmg`, Windows `Setup .exe`, Linux `.AppImage`).

‎data/whatsnew.json‎

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6867,5 +6867,85 @@
68676867
}
68686868
}
68696869
]
6870+
},
6871+
"2.14.1": {
6872+
"date": "2026-07-23",
6873+
"items": [
6874+
{
6875+
"icon": "rack-grid",
6876+
"title": {
6877+
"en": "Moving spools is calm now",
6878+
"fr": "Ranger tes bobines, en toute sérénité",
6879+
"de": "Spulen umräumen, ganz entspannt",
6880+
"es": "Mover bobinas, con toda la calma",
6881+
"it": "Spostare bobine, in tutta calma",
6882+
"zh": "挪动料卷,安安静静",
6883+
"pt": "Mexer nas bobinas, com calma",
6884+
"pt-pt": "Arrumar bobinas, com toda a calma",
6885+
"pl": "Przekładanie szpul, na spokojnie"
6886+
},
6887+
"body": {
6888+
"en": "Shuffling a spool from one rack to another no longer sets the whole board flashing — it stays calm, and only the exact slot you're aiming for lights up.",
6889+
"fr": "Déplacer une bobine d'un rack à l'autre ne fait plus clignoter tout le tableau — c'est calme, et seul le slot que tu vises s'allume.",
6890+
"de": "Eine Spule von einem Rack ins andere zu schieben lässt nicht mehr das ganze Board blinken — es bleibt ruhig, und nur das anvisierte Fach leuchtet auf.",
6891+
"es": "Pasar una bobina de un estante a otro ya no hace parpadear todo el tablero — se queda tranquilo, y solo se ilumina la casilla a la que apuntas.",
6892+
"it": "Spostare una bobina da un rack all'altro non fa più lampeggiare tutta la scacchiera — resta tranquilla, e si illumina solo lo slot che stai puntando.",
6893+
"zh": "把料卷从一个料架挪到另一个,不再让整块面板闪烁了——它保持安静,只有你瞄准的那个格子会亮起。",
6894+
"pt": "Passar uma bobina de uma prateleira para outra não faz mais o painel inteiro piscar — fica calmo, e só o slot que você mira acende.",
6895+
"pt-pt": "Passar uma bobina de uma prateleira para outra já não faz o painel inteiro piscar — fica calmo, e só o slot que apontas acende.",
6896+
"pl": "Przeniesienie szpuli z jednego regału na drugi nie rozmiga już całej planszy — jest spokojnie, a podświetla się tylko slot, w który celujesz."
6897+
}
6898+
},
6899+
{
6900+
"icon": "image",
6901+
"title": {
6902+
"en": "Thumbnails stay put",
6903+
"fr": "Les vignettes restent en place",
6904+
"de": "Vorschaubilder bleiben, wo sie sind",
6905+
"es": "Las miniaturas se quedan quietas",
6906+
"it": "Le miniature restano al loro posto",
6907+
"zh": "缩略图乖乖待着",
6908+
"pt": "As miniaturas ficam no lugar",
6909+
"pt-pt": "As miniaturas ficam no sítio",
6910+
"pl": "Miniatury zostają na miejscu"
6911+
},
6912+
"body": {
6913+
"en": "Spool pictures no longer come loose when you click them in your inventory or favorites — they stay where they belong instead of trailing after your cursor.",
6914+
"fr": "Les images de tes bobines ne se décollent plus quand tu cliques dessus dans l'inventaire ou les favoris — elles restent à leur place au lieu de suivre ton curseur.",
6915+
"de": "Spulenbilder lösen sich nicht mehr, wenn du im Bestand oder in den Favoriten draufklickst — sie bleiben an ihrem Platz, statt deinem Cursor hinterherzuziehen.",
6916+
"es": "Las imágenes de las bobinas ya no se despegan cuando haces clic en el inventario o en favoritos — se quedan en su sitio en vez de seguir a tu cursor.",
6917+
"it": "Le immagini delle bobine non si staccano più quando ci clicchi nell'inventario o nei preferiti — restano al loro posto invece di inseguire il cursore.",
6918+
"zh": "在库存或收藏里点料卷图片时,它们不再被拽出来了——安安分分待在原位,而不是跟着光标跑。",
6919+
"pt": "As imagens das bobinas não se soltam mais quando você clica no inventário ou nos favoritos — ficam no lugar em vez de seguir o cursor.",
6920+
"pt-pt": "As imagens das bobinas já não se soltam quando clicas no inventário ou nos favoritos — ficam no lugar em vez de seguir o cursor.",
6921+
"pl": "Zdjęcia szpul nie odrywają się już, gdy klikasz je w magazynie lub ulubionych — zostają na miejscu, zamiast wlec się za kursorem."
6922+
}
6923+
},
6924+
{
6925+
"icon": "backup",
6926+
"title": {
6927+
"en": "No surprise import window (Windows)",
6928+
"fr": "Plus de fenêtre d'import surprise (Windows)",
6929+
"de": "Kein überraschendes Import-Fenster (Windows)",
6930+
"es": "Sin ventana de importación sorpresa (Windows)",
6931+
"it": "Niente finestra di import a sorpresa (Windows)",
6932+
"zh": "不再蹦出导入窗口(Windows)",
6933+
"pt": "Sem janela de importação surpresa (Windows)",
6934+
"pt-pt": "Sem janela de importação surpresa (Windows)",
6935+
"pl": "Koniec z niespodziewanym oknem importu (Windows)"
6936+
},
6937+
"body": {
6938+
"en": "On Windows, dragging a spool around no longer makes the import window pop up out of nowhere — it only shows up when you actually bring a file in.",
6939+
"fr": "Sous Windows, déplacer une bobine ne fait plus surgir la fenêtre d'import de nulle part — elle n'apparaît que quand tu apportes vraiment un fichier.",
6940+
"de": "Unter Windows lässt das Verschieben einer Spule nicht mehr das Import-Fenster aus dem Nichts aufpoppen — es erscheint nur, wenn du wirklich eine Datei hereinziehst.",
6941+
"es": "En Windows, mover una bobina ya no hace aparecer la ventana de importación de la nada — solo sale cuando de verdad traes un archivo.",
6942+
"it": "Su Windows, spostare una bobina non fa più comparire dal nulla la finestra di importazione — appare solo quando porti davvero un file.",
6943+
"zh": "在 Windows 上,挪动料卷不会再无缘无故弹出导入窗口了——只有当你真的拖入文件时它才出现。",
6944+
"pt": "No Windows, arrastar uma bobina não faz mais a janela de importação aparecer do nada — ela só surge quando você realmente traz um arquivo.",
6945+
"pt-pt": "No Windows, arrastar uma bobina já não faz a janela de importação aparecer do nada — só surge quando trazes mesmo um ficheiro.",
6946+
"pl": "Na Windows przeciąganie szpuli nie wywołuje już znikąd okna importu — pojawia się tylko wtedy, gdy naprawdę wciągasz plik."
6947+
}
6948+
}
6949+
]
68706950
}
68716951
}

‎llms.txt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ It is neutral and agnostic by design: TigerTag takes no side between filament br
1010
distributors. The protocol is open and anyone can build a different ecosystem on it; nothing in this repo is a
1111
prerequisite for doing so.
1212

13-
Current version: **2.14.0** — macOS (Intel + Apple Silicon, signed & notarized), Windows, Linux.
13+
Current version: **2.14.1** — macOS (Intel + Apple Silicon, signed & notarized), Windows, Linux.
1414

1515
## Architecture
1616

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tigertag-inventory",
3-
"version": "2.14.0",
3+
"version": "2.14.1",
44
"description": "Tiger Studio Manager — desktop app",
55
"main": "main.js",
66
"engines": {

‎renderer/css/00-base.css‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,12 @@
3939
pre, code, .selectable, .selectable * {
4040
-webkit-user-select: text; user-select: text;
4141
}
42+
/* Images are never a native drag source. Otherwise a spool/product thumbnail
43+
in the inventory grid/list or Favorites can be "picked up" and dragged as a
44+
ghost image — there's no drop, so it just looks broken. Every INTENDED drag
45+
(rack slots, list/cart reorder, friends) uses a draggable <div>/<span>
46+
handle, never an <img>, so disabling image-drag here breaks nothing. */
47+
img { -webkit-user-drag: none; user-drag: none; }
4248

4349
/* ── .circle-center — content optically centred inside a round badge ──────
4450
Reach for this on ANY circle holding a character, a number or a glyph

‎renderer/css/30-racks.css‎

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -373,24 +373,13 @@
373373
.rv-stat--orange.rv-stat--active .rv-stat-lbl { color: #fff; }
374374

375375
/* ── Drop-zone visibility while dragging a spool ──────────────────────── */
376-
/* When body.is-dragging-spool is set, paint the rack to make targets clear:
377-
- empty unlocked slots: pulse + colored dashed bg → "drop here"
378-
- filled slots: stay normal (drop = swap is valid)
379-
- locked slots: dim red so they read as forbidden */
380-
body.is-dragging-spool .rp-slot:not(.rp-slot--filled):not(.rp-slot--locked) {
381-
border-color: rgba(249,115,22,.55);
382-
background: var(--primary-soft, rgba(249,115,22,.06));
383-
animation: rp-slot-pulse 1.6s ease-in-out infinite;
384-
}
385-
/* Subtle pulse — kept low-contrast so the actively-hovered slot pops above */
386-
@keyframes rp-slot-pulse {
387-
0%, 100% { background: rgba(249,115,22,.04); }
388-
50% { background: rgba(249,115,22,.12); }
389-
}
376+
/* Keep the rack NEUTRAL during a drag: no ambient orange flood on every empty
377+
slot — lighting up every empty slot at once made the whole card read as
378+
"illuminated". Only the slot directly under the cursor (.rp-slot--drop)
379+
highlights; locked slots just dim so they read as forbidden. */
390380
body.is-dragging-spool .rp-slot--locked {
391381
opacity: .35;
392382
}
393-
body.is-dragging-spool .rp-rack { transition: box-shadow .15s; }
394383

395384
/* ── Bounce-in for newly placed slots ─────────────────────────────────── */
396385
/* Triggered by .rp-slot--just-placed — scale 0.6 → 1.08 → 1.0 with a soft

‎renderer/css/40-printers.css‎

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -310,15 +310,13 @@
310310
font-weight: 700;
311311
}
312312

313-
/* Visual cue when a dragged spool hovers an empty area of the rack
314-
view — drop here to unassign / send to the unranked panel. Soft
315-
amber glow so it reads as "drop = remove from rack" without
316-
looking destructive (the actual delete uses a red trash button
317-
elsewhere). */
318-
#invRackView.rp-view--drop-void {
319-
box-shadow: inset 0 0 0 2px rgba(234, 179, 8, .35);
320-
transition: box-shadow .12s ease;
321-
}
313+
/* Void-drop (drag a spool onto empty rack-view space → un-rack it) is still
314+
wired, but its whole-view amber glow was REMOVED by request: it fired on
315+
every dragover of empty space — i.e. constantly while moving a spool from
316+
one rack to another, passing over the gaps — so the entire card appeared to
317+
"illuminate near the edge". The class is left inert (no visual); the drop
318+
itself only fires on a deliberate release in empty space, never mid-move
319+
(a normal rack-to-rack move ends on a slot, not the void). */
322320

323321
/* (Custom eject-ghost / receiving-pulse animations removed — the
324322
void-drop now reuses the existing rp-slot-cascade-out keyframe

0 commit comments

Comments
 (0)