Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0363d5f422 | ||
|
|
cfd382e3df | ||
|
|
bbcff40401 | ||
|
|
01001d0980 | ||
|
|
4ac7180cda | ||
|
|
e1683ef09d | ||
|
|
f89fb21502 | ||
|
|
ec147cd1ba |
|
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 310 KiB After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 148 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 334 KiB After Width: | Height: | Size: 333 KiB |
|
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 245 KiB |
|
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 270 KiB |
|
Before Width: | Height: | Size: 354 KiB After Width: | Height: | Size: 357 KiB |
|
Before Width: | Height: | Size: 338 KiB After Width: | Height: | Size: 343 KiB |
|
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 229 KiB |
|
Before Width: | Height: | Size: 254 KiB After Width: | Height: | Size: 253 KiB |
|
Before Width: | Height: | Size: 239 KiB After Width: | Height: | Size: 238 KiB |
|
Before Width: | Height: | Size: 245 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 244 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 218 KiB |
|
Before Width: | Height: | Size: 228 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
@@ -371,9 +371,9 @@ test('en projektgruppe kan foldes, fyldes og slettes uden at tage projekterne me
|
||||
await sidebar.getByLabel('Gruppens navn').fill('Arbejde');
|
||||
await sidebar.getByLabel('Gruppens navn').press('Enter');
|
||||
|
||||
// The name is a link to the group's own page; the chevron beside it is a
|
||||
// The name is a link to the group's own page; the folder icon beside it is a
|
||||
// separate button that folds. Two intentions, two targets — the single one they
|
||||
// used to share could only ever serve the smaller.
|
||||
// used to share could only ever serve the smaller, and neither wears an arrow.
|
||||
//
|
||||
// `exact` on the link, because a group's name is a user-chosen word that can
|
||||
// turn up inside another control's name, and Playwright matches an accessible
|
||||
@@ -389,13 +389,14 @@ test('en projektgruppe kan foldes, fyldes og slettes uden at tage projekterne me
|
||||
// The clipping half is here because it was once broken: "Omdøb" and "Slet" sat
|
||||
// in the flow reserving their width even while invisible, so ARBEJDE was drawn
|
||||
// as "ARBE". The alignment half changed meaning with the redesign: a group now
|
||||
// carries a fold chevron and a section icon just like "Projekter" above it, and
|
||||
// belongs to that heading tier rather than to the project rows below.
|
||||
// carries a section icon just like "Projekter" above it, and belongs to that
|
||||
// heading tier rather than to the project rows below.
|
||||
const shape = await sidebar.locator('.folder-head').evaluate((el) => {
|
||||
const link = el.querySelector('h2 a');
|
||||
// The leading mark is now the section icon, the same folder/funnel/tag glyph
|
||||
// the system headings carry — a group and a section read identically.
|
||||
const name = { ...link.querySelector('.head-icon').getBoundingClientRect().toJSON() };
|
||||
// The leading mark is the section icon in its own fold button, the same
|
||||
// folder/funnel/tag glyph the system headings carry — a group and a section
|
||||
// read identically, and the icon sits before the name, not inside the link.
|
||||
const name = { ...el.querySelector('.head-icon').getBoundingClientRect().toJSON() };
|
||||
return {
|
||||
clipped: link.scrollWidth > link.clientWidth + 1,
|
||||
left: name.left,
|
||||
@@ -408,7 +409,7 @@ test('en projektgruppe kan foldes, fyldes og slettes uden at tage projekterne me
|
||||
expect(shape.count, 'navnet og tallet overlapper').toBeGreaterThanOrEqual(shape.right);
|
||||
|
||||
// A group is a heading, not a project row: it belongs to the same tier as
|
||||
// "Projekter" and the other system sections — chevron, icon, bold name — and
|
||||
// "Projekter" and the other system sections — icon, bold name, no arrow — and
|
||||
// starts where they start, not where the projects filed under it do. Measured
|
||||
// icon to icon, the one mark both headings share.
|
||||
const sectionLeft = await sidebar
|
||||
@@ -440,13 +441,13 @@ test('en projektgruppe kan foldes, fyldes og slettes uden at tage projekterne me
|
||||
'false'
|
||||
);
|
||||
|
||||
// A group's chevron is in the flow now, the same one the system sections carry —
|
||||
// no absolute mark with a --surface field behind it, so a folded group no longer
|
||||
// leaves a pale square beside its name on the sunken bar.
|
||||
const chevronBg = await sidebar
|
||||
.locator('.folder-head .chevron-button')
|
||||
// The fold control is the bare folder icon now — no chevron, and no --surface
|
||||
// field behind it, so a folded group leaves no pale square beside its name on
|
||||
// the sunken bar.
|
||||
const foldBg = await sidebar
|
||||
.locator('.folder-head .fold-icon')
|
||||
.evaluate((el) => getComputedStyle(el).backgroundColor);
|
||||
expect(chevronBg, 'chevronen har en firkant bag sig').toBe('rgba(0, 0, 0, 0)');
|
||||
expect(foldBg, 'foldeknappen har en firkant bag sig').toBe('rgba(0, 0, 0, 0)');
|
||||
|
||||
await sidebar.getByRole('button', { name: /^Fold Arbejde/ }).click();
|
||||
|
||||
|
||||
@@ -682,13 +682,14 @@
|
||||
<!--
|
||||
A fixed heading that folds, the same way a project group's does.
|
||||
|
||||
One snippet for all four rather than four copies of a chevron and an aria
|
||||
One snippet for all four rather than four copies of an icon and an aria
|
||||
attribute: they have to behave identically, and the group heading is already
|
||||
the proof that they drift otherwise — it grew a fold, a colour and two
|
||||
actions while these stayed plain text.
|
||||
|
||||
The whole heading is the target, not the chevron. At this size a lone chevron
|
||||
is something you miss, and the name is where the eye already is.
|
||||
The whole heading is the target, and the icon is the mark: no arrow beside it.
|
||||
At this size an extra glyph is clutter, and the name is where the eye already
|
||||
is.
|
||||
-->
|
||||
<!-- One monochrome mark per kind of heading, so a section and a group read as the
|
||||
same kind of thing — a folder of projects, a funnel of filters, a tag of
|
||||
@@ -749,19 +750,15 @@
|
||||
{/snippet}
|
||||
|
||||
{#snippet foldHeading(key, label)}
|
||||
<!-- No chevron: a system section has no page and nothing to rename, so the
|
||||
whole heading is one button that folds it. The icon and the bold name are
|
||||
the whole control — an arrow beside them was only ever saying "clickable"
|
||||
twice. -->
|
||||
<h2 class="fold">
|
||||
<button
|
||||
onclick={() => app.toggleSection(key)}
|
||||
aria-expanded={!app.sectionCollapsed(key)}
|
||||
>
|
||||
<svg
|
||||
class="chevron"
|
||||
class:collapsed={app.sectionCollapsed(key)}
|
||||
viewBox="0 0 24 24"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<path d="M6 9l6 6 6-6" />
|
||||
</svg>
|
||||
{@render sectionIcon(key)}
|
||||
{label}
|
||||
</button>
|
||||
@@ -930,31 +927,22 @@
|
||||
</div>
|
||||
</form>
|
||||
{:else}
|
||||
<!-- The button sits inside the heading, not around it, the same way a
|
||||
project's title does: a group *is* a heading in the sidebar, and
|
||||
wrapping an h2 in a button both invalidates the markup and takes
|
||||
the heading away from a screen reader. The whole heading folds —
|
||||
at this size a lone chevron is a target you miss, and the name is
|
||||
where the eye already is. -->
|
||||
<!-- The chevron folds; the name opens the group's own page. Two
|
||||
targets in one heading, because they are two different intentions
|
||||
and the old single one could only ever serve the smaller. -->
|
||||
<!-- No chevron: the folder icon itself folds the group, and the name
|
||||
beside it opens the group's own page. Two intentions, two targets,
|
||||
but no arrow to clutter the rail — the icon a section carries is
|
||||
the same one that folds it here. The button sits inside the
|
||||
heading, not around it: a group *is* a heading, and wrapping an h2
|
||||
in a button both invalidates the markup and takes the heading from
|
||||
a screen reader. -->
|
||||
<button
|
||||
class="chevron-button"
|
||||
class="fold-icon"
|
||||
onclick={() => app.toggleGroup(group.id)}
|
||||
aria-expanded={!group.collapsed}
|
||||
aria-label={group.collapsed
|
||||
? t('sidebar.unfold', { name: group.name })
|
||||
: t('sidebar.fold', { name: group.name })}
|
||||
>
|
||||
<svg
|
||||
class="chevron"
|
||||
class:collapsed={group.collapsed}
|
||||
viewBox="0 0 24 24"
|
||||
aria-hidden="true"
|
||||
>
|
||||
<path d="M6 9l6 6 6-6" />
|
||||
</svg>
|
||||
{@render sectionIcon('group')}
|
||||
</button>
|
||||
<h2 class="fold">
|
||||
<!-- Navigation waits two tenths of a second for a second click. A
|
||||
@@ -975,7 +963,6 @@
|
||||
}, 200);
|
||||
}}
|
||||
>
|
||||
{@render sectionIcon('group')}
|
||||
{group.name}
|
||||
</a>
|
||||
</h2>
|
||||
@@ -1425,35 +1412,17 @@
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
/* The chevron on its own, so the name beside it can be a link to the group's
|
||||
page. Sized as a target rather than as a glyph: 11px of arrow is something
|
||||
you miss. */
|
||||
/* The chevron sits on top of the group's dot rather than before it. In the flow
|
||||
it pushed the name 22px further in than a project's, so groups read as if
|
||||
they were filed under the projects above them — the opposite of what they
|
||||
are. Out of the flow, a group's name starts exactly where a project's does.
|
||||
The dot is the resting state; the chevron takes over on hover or focus, and
|
||||
stays put while the group is folded, so a folded group still shows the way
|
||||
back open. */
|
||||
/* Uden baggrund. Knappen dækkede prikken med et felt i --surface, og på den
|
||||
sænkede bjælke er det en lys firkant: en foldet gruppe stod med en hvid
|
||||
klods ud for navnet permanent, fordi chevronen bliver stående, når gruppen
|
||||
er lukket. Prikken tones ud i stedet for at blive dækket — det er samme
|
||||
skifte, uden noget at male henover den med. */
|
||||
/* A group folds from its own chevron, the same one the system sections carry —
|
||||
in the flow before the name now, not an absolute mark that appeared on hover,
|
||||
so a group and a section read identically at rest. The name beside it is still
|
||||
a link to the group's page; the chevron is the second intention. */
|
||||
.chevron-button {
|
||||
/* The folder icon is the fold toggle now — no chevron beside it. A bare icon
|
||||
button the size of the icon it holds: the name next to it opens the group's
|
||||
page, this folds it, and neither wears an arrow to say so. */
|
||||
.fold-icon {
|
||||
flex: none;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.chevron-button:hover {
|
||||
.fold-icon:hover {
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
@@ -1482,22 +1451,6 @@
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.chevron {
|
||||
width: 11px;
|
||||
height: 11px;
|
||||
flex: none;
|
||||
fill: none;
|
||||
stroke: currentColor;
|
||||
stroke-width: 2.4;
|
||||
stroke-linecap: round;
|
||||
stroke-linejoin: round;
|
||||
transition: transform var(--fast) var(--ease);
|
||||
}
|
||||
|
||||
.chevron.collapsed {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
/* Hidden until the heading is hovered, like the section actions on a project
|
||||
page: two buttons permanently beside a label stop it reading as a label. */
|
||||
.folder-head .count {
|
||||
|
||||
@@ -285,7 +285,7 @@
|
||||
<p class="hint">{t('data.doneHint')}</p>
|
||||
</header>
|
||||
<div class="row">
|
||||
<a class="ghost" href="/faerdige">{t('data.openDone')}</a>
|
||||
<a class="link" href="/faerdige">{t('data.openDone')}</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -810,7 +810,11 @@
|
||||
</svg>
|
||||
</span>
|
||||
{:else}
|
||||
<span class="mark" class:closed={folded.has(group.key)} aria-hidden="true">▾</span>
|
||||
<!-- No arrow, to match the sidebar: the box folds on a click,
|
||||
the star and the people icon are the marks that mean
|
||||
something, and a date group has none — an empty spacer, so
|
||||
every label still starts at the same place. -->
|
||||
<span class="mark" aria-hidden="true"></span>
|
||||
{/if}
|
||||
{group.label}
|
||||
<span class="count">{group.notes.length}</span>
|
||||
@@ -1367,43 +1371,48 @@
|
||||
*
|
||||
* Baggrunden er ikke gennemsigtig. En klæbende overskrift uden en er en
|
||||
* overskrift med rækkerne kørende igennem sig. */
|
||||
/* One design with the sidebar headings: a rounded box, the same corner as an
|
||||
active menu item, filled just enough to separate one group of notes from the
|
||||
next. The hard rule underneath is gone — the box is the separation now. */
|
||||
h3.group {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
margin: 0;
|
||||
margin: 0 0 var(--s1);
|
||||
background: var(--ground);
|
||||
border-bottom: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
/* Bold and plainly cased, in the reading ink — the faint uppercase label read as
|
||||
a different app's heading beside the sidebar's. Menu size, so the two tiers of
|
||||
heading in front of the eye at once are the same size. */
|
||||
h3.group button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: var(--s2);
|
||||
width: 100%;
|
||||
padding: var(--s2) var(--s2);
|
||||
font-size: var(--text-xs);
|
||||
font-size: var(--menu-size);
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.07em;
|
||||
text-transform: uppercase;
|
||||
color: var(--ink-faint);
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
color: var(--ink);
|
||||
border-radius: var(--radius);
|
||||
}
|
||||
|
||||
h3.group button:hover {
|
||||
color: var(--ink-muted);
|
||||
background: var(--surface-sunken);
|
||||
}
|
||||
|
||||
/* The mark, or an empty box the same width where a date group has none, so every
|
||||
label starts at the same place. The star and the people icon fill it; the
|
||||
arrow that used to is gone — the box folds on a click. */
|
||||
h3.group .mark {
|
||||
flex: none;
|
||||
width: 0.75em;
|
||||
font-size: 0.85em;
|
||||
line-height: 1;
|
||||
color: var(--ink-faint);
|
||||
transition: transform var(--fast) var(--ease);
|
||||
}
|
||||
|
||||
h3.group .mark.closed {
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
|
||||
/* Sit eget navn og ikke `.star`. Rækkens favoritknap hedder også det og er
|
||||
@@ -1419,6 +1428,7 @@
|
||||
margin-left: auto;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0;
|
||||
color: var(--ink-muted);
|
||||
}
|
||||
|
||||
/* Stregen mellem rækkerne er væk.
|
||||
|
||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 12 KiB |
@@ -1,9 +1,13 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<!-- Wunjo, the rune Verdande's name begins with. Drawn as strokes rather than
|
||||
as a filled glyph so it stays legible at 16px in a browser tab. -->
|
||||
as a filled glyph so it stays legible at 16px in a browser tab. Bigger and
|
||||
heavier than it was, to read clearly as a home-screen icon, and nudged right
|
||||
of the geometric centre so the heavy stave and the light flag balance about
|
||||
the middle of the tile — a bounding box centred on 32 leaves the stave
|
||||
looking left-hung. -->
|
||||
<rect width="64" height="64" rx="14" fill="#111312"/>
|
||||
<g fill="none" stroke="#5fbf8f" stroke-width="4.5" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M22 14v36"/>
|
||||
<path d="M22 17l17 8-17 8"/>
|
||||
<g fill="none" stroke="#5fbf8f" stroke-width="6.5" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M26 11v42"/>
|
||||
<path d="M26 15l17 9.5L26 34"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 447 B After Width: | Height: | Size: 734 B |