Spaces:
Running
Running
Commit History
5 days ago
-
add timeList prop: page interiors by date (newest first) with prev/next arrows
Verified signature216548e -
Upload src/PhotoViewer.jsx
Verified signaturea9b7720
13 days ago
-
PhotoViewer: a vai-avatar photograph is not a product, even though it carries a sku
Verified signature`isProduct` drove the alt text, the gallery check, the price/spec caption and the detail title, and it was keyed on `Boolean(photo.sku)`. avatar-interiors.js gives every photograph published on vai-avatar a namespaced `sku` (`avatarimg:<id>`) so it travels the same code path as a catalogue product, so all of these photographs were announced as "Sản phẩm (avatarimg:b68dc779370dc70e)" and rendered with the product caption. `avatarImageId` distinguishes them: present only on records read from the vai-avatar interior index. detailOf() derives the same flag, and the two now agree because they read the same field.fbd38cf
15 days ago
-
viewer: share through the platform's own sheet, and drop the origin
ML InternTwo changes to the same panel, one reason: the viewer was a place to look at a photograph and to leave the app, and it was doing neither job well. The share control was an <a target="_blank">, which opens a browser tab. That is not sharing. navigator.share is where the platform's share sheet lives, and on a phone it is the sheet with the reader's real apps on it -- Messages, Zalo, Telegram -- which no anchor can reach. It is now a <button> that calls navigator.share with the photograph's canonical URL and title, falling back to the clipboard where share is missing (desktop Firefox, older Safari) or the permission is refused, so the action never dead-ends. The confirmation goes into the button's own label for 1.8s rather than into an alert(). The viewer is full-screen; a modal dialog stacked on top of the photograph is a worse outcome than the share failing quietly. A dismissed sheet rejects with AbortError, which is a reader saying no rather than an error, so it is caught and ignored…cd00894 -
note why detail.description cannot gate the panel
ML InternMeasured rather than assumed: adding it to hasDetail takes ambient tiles from 0 to 180 shown, and every one of them would hold only the single fixed sentence describeInterior falls back to. All 1,222 real interiors already pass the gate on their own metadata, so nothing is gained.9c69ff8 -
Share link on every photograph, a real description, no source button
ML InternThree things the viewer was missing, all reported from using it. A share link on each photograph in the field. Every tile now carries one, pointing at the same public address the viewer's toolbar link does: /share/i/<id> for an interior photograph, /share/p/<slug> for a catalogue product. All 1,222 interiors and all 11,704 products resolve to one; the 180 ambient tiles in collection.json resolve too, because they carry ids. Hidden until hover, except the top three results, which show theirs outright -- 150 photographs each wearing a button turns the plane into a control panel. The button is aria-hidden and tabIndex -1, nested inside the tile's <button>. Nesting an <a> in a <button> is not valid HTML, so it is a pointer affordance only: the reachable share is the named link in the viewer. Clicking it opens a new tab -- navigating away would destroy the search, and the field has no route to come back to. Getting it clickable took three fixes, each measured rather than guessed: The sh…4641f85 -
viewer: name, describe and link every photo the search finds
ML InternOpening a photograph in the viewer showed nothing but the picture: no title, no room, no categories, no link back to the article it came from. The record carried all four -- worker.js spreads the whole image-embeddings.json row into each search hit, so title, categories and source arrive with the photograph. But nothing downstream ever kept them. ImageField creates one DOM node per photograph and reuses it across searches; the node's onclick closed over the record it was built from, and on first paint that record is the ambient entry from collection.json, which holds only id/url/ar/blur. A node's position was refreshed on every layout pass, its record was not. So any photograph that had been on screen before you searched -- 180 of the 1,222 -- kept opening with none of its metadata, no matter that it matched and now carried a title and a source. Layout now writes node.image alongside node.target, and the click handler reads it at click time. Adds src/detail.js, restored from ffe2656 …29ed8a3
16 days ago
-
feat: product share links + repair Malloca/Hafele misbranding
Verified signatureTwo things. Share links. vai-avatar served share pages for interior images and chat answers but nothing for products, so a product link had nowhere to point. A /share/p/<sku> route now exists there and resolves against VAIX_PRODUCTS, the 11,704-row catalogue that Space already loads. A "Xem thêm" button in the viewer toolbar links products to it and interiors to the existing /share/i/. The link is keyed on the photo, not the image, so paging a gallery still shares the product rather than one of its photographs. Misbranding. 99 rows are named "Malloca | ..." while their brand field says Hafele, and all 1,011 of their image URLs point at Hafele's CDN rather than the Malloca storefront. Hafele resells Malloca, so these are Malloca products catalogued under the wrong brand. 77 now show a real Malloca photograph and the remaining 22, which have no Malloca row anywhere in the file, keep their photo with the brand corrected. No product is dropped and no non-Malloca row is touched. Matching…9bf56b3
17 days ago
-
Restore full PhotoViewer (undo accidental truncation)
Verified signature2c4780a -
Upload src/PhotoViewer.jsx
Verified signatured0d6710
18 days ago
-
Fix product gallery paging: resolve the displayed frame from position
Verified signature6d8d43b -
Upload src/PhotoViewer.jsx
Verified signaturedbf4bb9 -
Upload src/PhotoViewer.jsx
Verified signature3fd59f3 -
feat(viewer): let the photo viewer open product photos with gallery navigation and product caption
Verified signaturea0cb914
19 days ago
-
Deploy Vietnamese interior image field (1222 imgs, multilingual CLIP text tower)
Verified signaturec9e39f3