The bookmark form is rebuilt around one read of the page, tag suggestions reach every place a tag is set, and the grid stops dropping to one column on any narrow window. Leads the What's new window, and v1.13.1, v1.13.5 and v1.13.6, recorded but held back until now, are shown there as well.
Bookmark form
- new — one column, in the order it is filled in. Address, name, a preview card, tags, page › category with the shortcut, pin and checking, note. The two side-by-side groups are gone, and so are the icon-URL field, Set URL and the separate Fetch button. The form is split into
bookmark-form-card.js,bookmark-form-title.jsandbookmark-form-place.jsunderstatic/js/bookmark-form/; the hidden page and category selects and the icon input stay as the data model, so the save path is unchanged. - new — one read of the page after the address. Leaving the address field makes a single
/api/bookmark-previewcall that fills the icon, a name suggestion (the host when the page has no title), the card and the keywords for tag suggestions. A changed address starts a new read and only the latest one counts (fetchSeq); a fetched icon is replaced, an uploaded or stored one is kept. The card says Reading the page… while a slow site answers, explains itself before there is an address, and says No preview with Try again when the read gave nothing. Create + New resets it. A form opened with an address already in it — a paste, the inbox,:new <url>, the extension — reads the page at once. - new — the icon's ✎ menu: Upload…, Fetch again, Clear.
- new — a name suggestion. An empty name field shows the page's title as Suggested from the page · Clear; a typed name gets Page: … · Use under it instead.
- new — suggested tags in the form. Chips from
TagSuggestLive.forDraftunder the tags field: the collection is the evidence, the page's keywords the last source, and a bookmark being edited gets its stored keywords from/api/tags/keywordswithout reading the page. + adds, ✕ refuses for the site everywhere (dismissedTagSuggestions), ↻ asks again. Config → Tag suggestions follows every change throughTagSuggestLive.changedandonTagEvidenceChanged. - new — page › category in one field. It opens the Move to… popover (
move-popover) with a filter; arrows andEnterpick, andEnterwith one match takes it. Its first rows hand off to the form's existingInlineCreateRowfor a new category or page, and a new page opens its first-category row. - new — ⓘ on tags, shortcut and checking, the check group's own button, with the text as the field's
aria-describedby. - new — save guards. No page: a notice. No category: Save without / Choose a category. The same link on another page: Already saved · Save anyway. The same link on this page: a notice naming the bookmark that has it, where it used to fail with Could not create bookmark.
- new — keyboard-only use. The form opens with the cursor in the address field, adding and editing (
keyboardNavigation.disable()now runs before the render, which stole the focus). While it is open the form ownsTab: its own controls in order, wrapping at both ends, so focus can no longer walk out to the What's new ★ or the page tabs. The tag list no longer pre-selects its first entry when nothing is typed, soTabmoves on.Escapecloses the tag list, the icon menu, the place popover and the create row before the form, and a dialog on top of the form (z-index10300) takes the focus through its fade (modal.jsretries_focusInitialElement). - fix — the dashboard no longer scrolls behind the form (
ScrollLock.acquire('bookmark-form-modal'),overscroll-behavior: contain), and a render while it is open no longer aborts the form's fetch timer. - The legacy form's title fill in
search-commands-new.jsis removed; the bookmark form does it now.
Tags
- new — suggestions in the Config → Bookmarks side panel. Up to three chips under the tags field of a single bookmark; + writes the tag through
commitWorkbenchField, ✕ refuses. A selection of several gets none. - new — a Suggested section in Shift+T (
forDashBookmark, top three) and in the multi-select Tags popover. Each selection offer counts the rows it fits (on 1 of 2), andapplyTagToSelection(tag, mode, { onlyKeys })writes, rolls back and undoes only those rows. - new — one chip component.
TagSuggestChips.renderandrefuseinstatic/js/shared/tag-suggest-chips.js, used by the form, the side panel, the inbox and Kept. - fix — Shift+T opens at the top of its list. It focused the row's first tag on open, so a long library scrolled it 1250px down and hid the header, the row's tags and the suggestions. It now starts on the first item; the ✓ still marks the row's tags.
Previews
- fix — page titles no longer carry HTML entities.
extractTitleFromHTMLreturned the<title>text raw, so Q&A reached every reader as written; the meta values were already decoded. Previews cached before this fix keep the old title until they expire or are refreshed.
Dashboard
- fix — as many columns as fit. Below 768px every window dropped to one column, and between 768 and 991px
responsive.cssforced two with!importantand a flex rule that broke the packed masonry grid.getEffectiveColumnsPerRownow takes the configured count, capped by how many columns of--dashboard-column-minfit in the grid's container;shouldStackDashboardCategoriesis true only for a touch screen held upright below 768px. A resize that changes the count re-renders the grid. The forced rules inresponsive.cssandmobile-experience.cssare removed, and the wide-category reset follows the stack attribute instead of the width. - fix — the What's new ★ is hidden below 768px on any window, not only on a touch phone.
Docs
- MANUAL §5.2 rewritten. It described two groups side by side and a title and icon fetched on paste; it now describes the one column, the one read, the ✎ menu, the name suggestion, the chips, the place field, the ⓘ, the save guards and the keyboard. §7.5, §10.1 and §10.4 name the suggestions in Shift+T, the side panel and the selection's tag picker; §15.4 the side panel's chips; the grid and Columns per row say how many columns a narrow window keeps; the ★ line says it is hidden on a phone-width window.
- Help → Bookmarks, in six languages, describes the form, the side panel's suggestions and where else suggestions appear.
- Translations: the 27 strings the form and the popovers added are translated into Dutch, German, French, Spanish and Chinese.
- Config → Overview and About → News & features gain A bookmark form that reads the page and Suggested tags wherever you tag.
- The comment above the release tokens in
whats-new-stub.jsnamed v1.13.3 as the release the modal leads with; it names v1.13.7.
Tests
- New:
bookmark-form-redesign,bookmark-form-keyboard,bookmark-form-save-guards,tag-suggest-draft,tag-popover-suggested,config-bookmarks-panel-suggest,multi-select-suggested-tags,dashboard-columns-fit,whats-new-btn-narrow, andpreview_title_test.go(gofmt'd after CI'sfmt-checkcaught its alignment). About twenty form specs moved todata-fieldselectors and theanswerNoCategoryhelper;view-resize-layoutexpects columns rather than stacking on a desktop window. - CI fixes after the push:
bookmark-form-modal-fithovers the check group's ⓘ bydata-info-for, since the tags and shortcut ⓘ share its class;unsorted-view-isolationfills the name field bydata-field, not the form's first input, which is the address now. Three flaky ones are steadied:backlog-batch-twoawaits the inbox'screateItemElement, which the loader's proxy answers with a promise until the module lands;config-bookmarks-groupingpolls the row's widths instead of reading them once; and the firsttag-popover-suggestedtest seeds a host of its own and waits for the seeds to reachallBookmarks. - fix — Config → Bookmarks no longer throws when a repaint comes before its renderers.
repaintBookmarksListcalledrenderBookmarksListwhile the lazily loaded workbench file was still on its way, and logged renderBookmarksList is not a function (caught byconfig-section-smokeon a loaded CI runner). It now waits forensureBookmarkRenderersand repaints once they land;config-bookmarks-lazy.spec.jsholds the file back and asks for a repaint in that gap. - Seven more flaky specs wait for what they use instead of racing it:
bookmark-form-modal-fit,inbox-promote-pagesandsearch-shortcut-miss-hintawaitSearchLoader.ensureReady()before readingsearchComponent;dashboard-command-palette-configtypes once the panel is listening, not straight after:;grid-bookmark-shortcutsreads the cursor once it stands on a row;unsorted-keyboard-and-exportrepeats the arrow until the Kept list's keys are wired;row-highlightawaitsopenConfigViewbefore switching the tab. And four more from the next run:inbox-promote-pagesloads the inbox list again rather than trusting the view's copy;escape-ownershiplets the list settle before its right-click; the secondtag-popover-suggestedtest waits for its seeds inallBookmarks;config-log-settings-popoversaves the glass depth until the reloaded page shows it, since another worker on the same server can write the setting in between. - fix — opening the bookmark form before the search code has arrived. The form lives in the lazily loaded search bundle, and inbox Promote, paste-a-URL, the toolbar's add button, the empty state, Health's Edit and Config → Bookmarks' Add and Edit each read its handler straight off
searchComponent. In the seconds before the bundle landed they said Could not open bookmark form or did nothing.Dashboard.newBookmarkHandler()fetches the bundle first when the handler is not there yet, and every route goes through it;inbox-promote-pages.spec.jsholds the bundle back and promotes in that gap. - fix — Statistics asked for the health report twice when you left the Health tab and came back while the first request was still out. Each loader's field stays
undefineduntil its answer arrives, so the tab's return started another; the loaders now run once per load (_statsInFlight).config-stats-range-and-lazy.spec.jsslows the report and goes back and forth. - Two more specs steadied:
config-trash-search-bulkwaits for the tab's own trash load before drawing its fixture, anddashboard-command-palette-configpresses Enter only once the first row answers the whole query. After that:search-shortcut-miss-hintand the:trashtest inbacklog-batch-twoawaitSearchLoader.ensureReady(), anddashboard-check-mode-menuright-clicks a row only once its menu is wired (data-context-menu-bound).