No + on the Signals folder's row, so it is like any folder's (#265)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -13,16 +13,16 @@ their Signals that has not heard about the item yet.
|
|||||||
## What someone sees
|
## What someone sees
|
||||||
|
|
||||||
- **The sidebar.** A Signals folder comes first in the feed list, under All Subscriptions (#255,
|
- **The sidebar.** A Signals folder comes first in the feed list, under All Subscriptions (#255,
|
||||||
#256). It is closed or open as an OPML's folder is, remembered in each browser. A + at the right
|
#256). It is closed or open as an OPML's folder is, remembered in each browser. Its row is like
|
||||||
of the folder's row opens New signal. Inside the folder are the person's Signals, each with its
|
any folder's (#265); New signal is the + on the folder's page. Inside the folder are the
|
||||||
words under its name and its unread count.
|
person's Signals, each with its items and unread counted under its name.
|
||||||
- **An icon of its own** (#261), chosen in the Signal's dialog from all of Font Awesome Free 7.3.1,
|
- **An icon of its own** (#261), chosen in the Signal's dialog from all of Font Awesome Free 7.3.1,
|
||||||
the set the page's own icons come from: 2,883 icons, solid, regular and brands, searched by name
|
the set the page's own icons come from: 2,883 icons, solid, regular and brands, searched by name
|
||||||
and Font Awesome's search terms ("ai" finds the robot). Without one, a Signal shows its initials.
|
and Font Awesome's search terms ("ai" finds the robot). Without one, a Signal shows its initials.
|
||||||
**Let Jev pick** asks Jev to choose (#263), and a Signal made without an icon gets Jev's pick by
|
**Let Jev pick** asks Jev to choose (#263), and a Signal made without an icon gets Jev's pick by
|
||||||
itself, a moment after it is made. Every Signal's tile is in the accent tint the folder has.
|
itself, a moment after it is made. Every Signal's tile is in the accent tint the folder has.
|
||||||
- **Each Signal's row** says "12 items · 3 unread", as a feed's row counts its own.
|
- **Each Signal's row** says "12 items · 3 unread", as a feed's row counts its own.
|
||||||
- **The folder's page** lists the Signals, as an OPML's page lists its feeds, with a + of its own.
|
- **The folder's page** lists the Signals, as an OPML's page lists its feeds, with the + for a new one.
|
||||||
- **A Signal's page** is an ordinary item list: All, Unread, Downloaded and Pinned, search and sort.
|
- **A Signal's page** is an ordinary item list: All, Unread, Downloaded and Pinned, search and sort.
|
||||||
Its header says what it listens for (the sentence, or the words), and that nothing is picked
|
Its header says what it listens for (the sentence, or the words), and that nothing is picked
|
||||||
out without a key. Edit changes the name, the words or the sentence; Delete removes the Signal
|
out without a key. Edit changes the name, the words or the sentence; Delete removes the Signal
|
||||||
|
|||||||
@@ -2079,8 +2079,9 @@ test('a Signal holds the items Jev says fit its keywords, read where they are re
|
|||||||
const { id: feed } = await (await page.request.post('/api/feeds', { data: { url: 'http://127.0.0.1:8792/signal.xml' } })).json();
|
const { id: feed } = await (await page.request.post('/api/feeds', { data: { url: 'http://127.0.0.1:8792/signal.xml' } })).json();
|
||||||
await page.reload();
|
await page.reload();
|
||||||
|
|
||||||
// The + on the folder's own row (#256); making one opens the folder to show it.
|
// The + on the folder's page (#265); making one opens the folder to show it.
|
||||||
await page.locator('#feedlist .sigs .sigadd').click();
|
await page.locator('#feedlist .sigs').click();
|
||||||
|
await page.locator('#content .acts [data-a="new"]').click();
|
||||||
await page.locator('#sgname').fill('F1');
|
await page.locator('#sgname').fill('F1');
|
||||||
await page.locator('#sgkwin').fill('monaco');
|
await page.locator('#sgkwin').fill('monaco');
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- Signals pick what matters out of the noise of every feed you subscribe to: New signal takes a name, the words to listen for and, if those are not enough, a sentence saying what you mean, and its page lists the items from your feeds that are about it, read and unread as in their own feeds. Settings takes your TypeSafe key, which Signals need (#254). They are kept in a Signals folder first in the feed list, under All Subscriptions, closed or open as an OPML is, with a + on its row for a new one and its own page listing them (#255, #256). Each can have an icon of its own, searched for among all of Font Awesome Free, in place of its initials (#261), or Jev's pick of one, which a Signal made without an icon gets by itself; each Signal's row counts its items and unread as a feed's does (#263).
|
- Signals pick what matters out of the noise of every feed you subscribe to: New signal takes a name, the words to listen for and, if those are not enough, a sentence saying what you mean, and its page lists the items from your feeds that are about it, read and unread as in their own feeds. Settings takes your TypeSafe key, which Signals need (#254). They are kept in a Signals folder first in the feed list, under All Subscriptions, closed or open as an OPML is, with its own page listing them and a + there for a new one (#255, #256, #265). Each can have an icon of its own, searched for among all of Font Awesome Free, in place of its initials (#261), or Jev's pick of one, which a Signal made without an icon gets by itself; each Signal's row counts its items and unread as a feed's does (#263).
|
||||||
- A list opens at once when you have seen it before or the page fetched it ahead: All Subscriptions and the feeds with something unread are fetched when the page loads, and a feed or filter as the pointer or a finger reaches it, then refreshed behind once shown. A list that has to be waited for shows a spinner instead of nothing (#247). Currently Listening and the Directory's front page are fetched ahead the same way and open at once (#248).
|
- A list opens at once when you have seen it before or the page fetched it ahead: All Subscriptions and the feeds with something unread are fetched when the page loads, and a feed or filter as the pointer or a finger reaches it, then refreshed behind once shown. A list that has to be waited for shows a spinner instead of nothing (#247). Currently Listening and the Directory's front page are fetched ahead the same way and open at once (#248).
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|||||||
@@ -607,9 +607,6 @@ input:focus,select:focus{outline:0;border-color:var(--accent)}
|
|||||||
.iconcell{height:40px;border-radius:8px;display:grid;place-items:center;color:var(--dim)}
|
.iconcell{height:40px;border-radius:8px;display:grid;place-items:center;color:var(--dim)}
|
||||||
.iconcell:hover,.iconcell[aria-selected="true"]{background:var(--raise);color:var(--fg)}
|
.iconcell:hover,.iconcell[aria-selected="true"]{background:var(--raise);color:var(--fg)}
|
||||||
.iconcell .ficon{width:20px;height:20px}
|
.iconcell .ficon{width:20px;height:20px}
|
||||||
/* New signal, on the folder's row before its count. */
|
|
||||||
.sigadd{width:26px;height:26px;margin-right:-4px}
|
|
||||||
.sigadd .i{width:12px;height:12px}
|
|
||||||
/* Only a folder has a triangle, hung in the margin so every feed's art lines up with the places
|
/* Only a folder has a triangle, hung in the margin so every feed's art lines up with the places
|
||||||
above it. The button is the row's full height and 24 px wide: a near miss used to open the
|
above it. The button is the row's full height and 24 px wide: a near miss used to open the
|
||||||
folder's page, and 16 px left the triangle cramped against the art. */
|
folder's page, and 16 px left the triangle cramped against the art. */
|
||||||
|
|||||||
@@ -50,13 +50,11 @@ function signalFolder(list: HTMLElement, q: string){
|
|||||||
list.appendChild(feedRow(SIGNALS,'sigs',
|
list.appendChild(feedRow(SIGNALS,'sigs',
|
||||||
`<button class="chev" aria-expanded="${open}" title="Show or hide your signals" aria-label="Show or hide your signals">${ICON.caret}</button>`+
|
`<button class="chev" aria-expanded="${open}" title="Show or hide your signals" aria-label="Show or hide your signals">${ICON.caret}</button>`+
|
||||||
sigArt()+`<div class="txt"><b>Signals</b><small>${n?plural(n,'signal'):'What matters, out of the noise'}</small></div>`+
|
sigArt()+`<div class="txt"><b>Signals</b><small>${n?plural(n,'signal'):'What matters, out of the noise'}</small></div>`+
|
||||||
// The + before the count, so the counts line up with the Signals' under it.
|
// No + of its own (#265): a row like any folder's. New signal is on the folder's page.
|
||||||
`<button class="iconbtn sigadd" title="New signal" aria-label="New signal">${ICON.plus}</button>`+
|
|
||||||
badgeHTML(S.signals.reduce((k,s)=>k+s.unread,0)),
|
badgeHTML(S.signals.reduce((k,s)=>k+s.unread,0)),
|
||||||
()=>selectFeed(SIGNALS)));
|
()=>selectFeed(SIGNALS)));
|
||||||
const row=list.lastElementChild!;
|
const row=list.lastElementChild!;
|
||||||
$('.chev',row).onclick=(ev: Event)=>{ ev.stopPropagation(); toggleGroup(SIGNALS); };
|
$('.chev',row).onclick=(ev: Event)=>{ ev.stopPropagation(); toggleGroup(SIGNALS); };
|
||||||
$('.sigadd',row).onclick=(ev: Event)=>{ ev.stopPropagation(); signalModal(); nav(false); };
|
|
||||||
if(!open) return;
|
if(!open) return;
|
||||||
for(const sg of mine){
|
for(const sg of mine){
|
||||||
const el=feedRow(':signal:'+sg.id,'child',
|
const el=feedRow(':signal:'+sg.id,'child',
|
||||||
|
|||||||
Reference in New Issue
Block a user