openvibers/openvibe.design Commits

Rules: eleven decisions of 2026-11-10 (#251)

OP OpenVibers committed 3 days ago · 5fad904a84 · 1 file, +33 −0

Changes

ddiff --git a/server/rules/register.js b/server/rules/register.js
iindex dc5ffae..759975b 100644
---- a/server/rules/register.js
++++ b/server/rules/register.js
@@@ -180,6 +180,21 @@ const RULES = Object.freeze([
R('account-in-the-menu', 'navigation', 'The account lives in the menu\'s You tab, not in a dropdown.',
'The picture is the last thing in the bar and opens the menu on You: who you are, your other accounts, add an account, settings, sign out, this site\'s own items and Display.',
'2026-11-10', 'The owner: "this user drop down is just redundant … move it into the You tab of the menu … consolidate the two into one menu."'),
++ R('menu-button-at-the-right', 'navigation', 'The menu button is at the right end of the bar on every width.',
++ 'The left end is the logo, which opens the network\'s sites, and the site\'s name, which opens its pages; the right end is the menu button and then the person. The same on a phone and a computer.',
++ '2026-11-10', 'The owner: "The menu button should be on the right, even on desktop … there\'s like a duplicated icon."'),
++ R('the-name-opens-its-pages', 'navigation', 'The site\'s name in the bar opens that site\'s pages, Home first.',
++ 'One small list drops from the name, with each page\'s icon and the present page marked. It is the network\'s one dropdown, used wherever a short list opens from what was pressed.',
++ '2026-11-10', 'The owner: "clicking the actual name of the domain should have a sleek little minimalist drop down … that just shows the pages … have the home button as an option."'),
++ R('the-bar-holds-one-row', 'navigation', 'The bar holds one row at every width.',
++ 'When the row is too narrow its last links step out whole into More, then labels shorten; nothing wraps under the bar and the site\'s name is never cut mid-word.',
++ '2026-11-10', 'Chrome\'s desktop mode on a phone put "Global chat" on two lines and dropped the bell under the bar.'),
++ R('two-badges-two-meanings', 'navigation', 'A count means it is for you; a dot means there is something new.',
++ 'The bell carries a red number for things addressed to you. The feed carries a small calm dot in the theme\'s colour, with no number, that goes when the feed is opened.',
++ '2026-11-10', 'The owner: "don\'t make the badge red for the feed … the actual notifications bell … should be [the] red badge. The other one should be … not as bothersome to the eye."'),
++ R('shipped-means-every-site', 'navigation', 'A change to the Frame is shipped when every site shows it.',
++ 'A release of the shared library is followed by its pin on every site the same day; the plan names any site still behind and why.',
++ '2026-11-10', 'The owner: "how come the new nav bar … aren\'t deployed to all sites? It\'s … a mix-match." Twenty-five sites were held back by a size budget.'),
// ── Phones first ──
R('works-at-320', 'phone', 'Every page fits a 320 px screen without sideways scrolling.',
@@@ -209,6 +224,18 @@ const RULES = Object.freeze([
'Each row is a card; its first cell is the title and every other value says what it is. Nothing is dropped.',
'2026-10-30', 'Phones cut columns or scrolled the page sideways.',
[{ label: 'Wide tables become labelled cards', href: '/patterns/labelled-cards' }]),
++ R('video-first', 'phone', 'On a watch page the video is first, and stays in view on a phone.',
++ 'The player runs edge to edge under the bar and stays there while the page moves under it; an upright picture is not pinned. Lists of more to watch are rows beside the player on a computer and come last on a phone.',
++ '2026-11-10', 'The owner: "why is the video not at the top … more device aware and viewport aware." A list added the day before stood above the player.'),
++ R('every-piece-has-a-place', 'phone', 'Every piece of a page has a named place in its one-column order.',
++ 'A page that reorders itself for a phone lists every piece; a test fails when a new piece has no place, because a piece without one goes first.',
++ '2026-11-10', '"More from this channel" had no place in the order and took the top of the page, above the video.'),
++ R('two-levels-in-a-messenger', 'phone', 'A messenger on a phone has two levels: the list, then the conversation.',
++ 'The list level has the rail of places, the list beside it and the app\'s bar. A conversation is the whole screen: the way back first in its head, the composer at the bottom edge, no strip of places and no bottom bar.',
++ '2026-11-10', 'The owner, with Chat beside Discord: "it\'s a little overwhelming having both the bottom and the side and top tabs."'),
++ R('the-video-comes-along', 'phone', 'A video that keeps playing while you browse plays in our own small player.',
++ 'The player\'s button takes the video along to the rest of the site, from the same second, with its title, a way back and a close. One sound at a time: a page\'s own video starting closes it.',
++ '2026-11-10', 'The browser\'s floating window sat over the page it came from. The owner: "should … actually [be] like YouTube where it moves that video."'),
// ── Words ──
R('plain-words', 'words', 'Use plain words; keep machinery out of people’s screens.',
@@@ -327,6 +354,12 @@ const RULES = Object.freeze([
R('first-paint-alone', 'building', 'First paint never depends on another service.',
'The theme’s first frame is inline; shared scripts load deferred, so a Network deploy cannot blank another site.',
'2026-09-17', 'Pages opened white while the Network restarted.'),
++ R('mail-is-one-frame', 'building', 'Every mail is one frame, in the reader\'s theme, and says what to do.',
++ 'A title that says what happened and where, plain sentences, the facts as a list, one button and quieter links, what happens next, and why you got it. Text only, safe links only, no emoji for a logo.',
++ '2026-11-10', 'An alert said "Browser check failed · domains · 1 failing check" and nothing else. The owner: "I don\'t even understand … explain more details … what they can do, what they can click."'),
++ R('ask-before-the-camera', 'building', 'A page asks for the camera, microphone or screen only when a person presses for it.',
++ 'Never on load, on a route change or from a remembered setting; a remembered choice may select the device, not open it.',
++ '2026-11-10', 'The owner: "the camera shouldn\'t automatically request permission when you … refresh … You should have to click allow."'),
R('content-hashed-assets', 'building', 'Assets are addressed by their content, so people always get the current one.',
'Hashed file names, never a hand-written ?v=; a shared sibling file is busted by its own hash.',
'2026-11-07', 'Menus shipped but browsers kept the old files.'),