openvibers/openvibe.design Commits
Rules: eleven decisions of 2026-11-10 (#251)
Changes
@@@ -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.'),
@@ -180,6 +180,21 @@ const RULES = Object.freeze([
@@ -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.',
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.',
'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."'),
'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 ──
// ── Phones first ──
R('works-at-320', 'phone', 'Every page fits a 320 px screen without sideways scrolling.',
R('works-at-320', 'phone', 'Every page fits a 320 px screen without sideways scrolling.',
@@ -209,6 +224,18 @@ const RULES = Object.freeze([
@@ -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.',
'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.',
'2026-10-30', 'Phones cut columns or scrolled the page sideways.',
[{ label: 'Wide tables become labelled cards', href: '/patterns/labelled-cards' }]),
[{ 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 ──
// ── Words ──
R('plain-words', 'words', 'Use plain words; keep machinery out of people’s screens.',
R('plain-words', 'words', 'Use plain words; keep machinery out of people’s screens.',
@@ -327,6 +354,12 @@ const RULES = Object.freeze([
@@ -327,6 +354,12 @@ const RULES = Object.freeze([
R('first-paint-alone', 'building', 'First paint never depends on another service.',
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.',
'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.'),
'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.',
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.',
'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.'),
'2026-11-07', 'Menus shipped but browsers kept the old files.'),