The tag goes at the top of the card, where it gets looked at
CI & Build / Build now, or wait for Android? (push) Successful in 3s
CI & Build / Python lint (push) Successful in 3s
CI & Build / TypeScript typecheck (push) Successful in 6s
CI & Build / Python tests (push) Successful in 12s
CI & Build / integration (push) Successful in 19s
CI & Build / Build & push image (push) Skipped
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 2m58s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 5m21s
Desktop (Tauri) / Update manifest (push) Successful in 4s
Android / Kotlin + Rust (APK) (push) Successful in 8m6s
CI & Build / Build now, or wait for Android? (push) Successful in 3s
CI & Build / Python lint (push) Successful in 3s
CI & Build / TypeScript typecheck (push) Successful in 6s
CI & Build / Python tests (push) Successful in 12s
CI & Build / integration (push) Successful in 19s
CI & Build / Build & push image (push) Skipped
Desktop (Tauri) / Windows installer (cross-compiled) (push) Successful in 2m58s
Desktop (Tauri) / Tauri desktop (Linux) (push) Successful in 5m21s
Desktop (Tauri) / Update manifest (push) Successful in 4s
Android / Kotlin + Rust (APK) (push) Successful in 8m6s
Label chips sat under the body, the checklist, the attachments and the link previews. On a tall note that puts the one thing saying what a note IS below the fold of a glance — and a board is scanned, not read. "Which of these is about the thing I am looking for" should be the first thing the eye lands on. Above the body rather than beside it: the body's first line is the note's NAME (M13 steps 3 and 4), and a chip floated next to it would compete with the thing that identifies the note. A row of its own costs one line, and only on notes that carry tags. Both surfaces, same order. Does not depend on tag lifting, which is a much larger change — see the task. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -58,9 +58,23 @@ fun NoteCard(
|
|||||||
.border(1.dp, if (dark) CARD_EDGE_DARK else CARD_EDGE_LIGHT, RoundedCornerShape(CARD_RADIUS))
|
.border(1.dp, if (dark) CARD_EDGE_DARK else CARD_EDGE_LIGHT, RoundedCornerShape(CARD_RADIUS))
|
||||||
.padding(12.dp),
|
.padding(12.dp),
|
||||||
) {
|
) {
|
||||||
// Body then checklist, in order — a note can carry both (M13 step 2), and
|
// TAGS FIRST. They used to sit under everything else, which on a tall note put
|
||||||
// nothing above them: the first line of the body IS the note's name, at the
|
// the one thing that says what a note IS below the fold of a glance. A board is
|
||||||
// same weight as the rest of it (M13 steps 3 and 4).
|
// scanned, not read, and the answer to "which of these is about the thing I am
|
||||||
|
// looking for" should be the first thing the eye lands on rather than the last.
|
||||||
|
//
|
||||||
|
// Above the body rather than beside it, because the body's first line is the
|
||||||
|
// note's NAME (M13 steps 3 and 4) and a chip floated next to it would compete
|
||||||
|
// with the thing that identifies the note. A row of its own costs one line and
|
||||||
|
// only on notes that have tags at all.
|
||||||
|
if (note.labels.isNotEmpty()) {
|
||||||
|
LabelChips(labels = note.labels)
|
||||||
|
Spacer(Modifier.height(8.dp))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Body then checklist, in order — a note can carry both (M13 step 2). The
|
||||||
|
// first line of the body IS the note's name, at the same weight as the rest of
|
||||||
|
// it (M13 steps 3 and 4).
|
||||||
if (note.body.isNotBlank()) {
|
if (note.body.isNotBlank()) {
|
||||||
NoteBody(note = note, onToggleItem = onToggleItem)
|
NoteBody(note = note, onToggleItem = onToggleItem)
|
||||||
}
|
}
|
||||||
@@ -76,11 +90,6 @@ fun NoteCard(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (note.labels.isNotEmpty()) {
|
|
||||||
Spacer(Modifier.height(8.dp))
|
|
||||||
LabelChips(labels = note.labels)
|
|
||||||
}
|
|
||||||
|
|
||||||
note.remindAt?.let { at ->
|
note.remindAt?.let { at ->
|
||||||
Spacer(Modifier.height(8.dp))
|
Spacer(Modifier.height(8.dp))
|
||||||
ReminderChip(instant = at, recurrence = note.recurrence)
|
ReminderChip(instant = at, recurrence = note.recurrence)
|
||||||
|
|||||||
@@ -259,6 +259,24 @@ onBeforeUnmount(() => document.removeEventListener("mousedown", onDocMousedown))
|
|||||||
|
|
||||||
`shadow-sm`, back down from `shadow`: the border is the boundary again, so the
|
`shadow-sm`, back down from `shadow`: the border is the boundary again, so the
|
||||||
shadow is only depth. -->
|
shadow is only depth. -->
|
||||||
|
<!-- TAGS FIRST. They used to sit under everything else, which on a tall note put
|
||||||
|
the one thing that says what a note IS below the fold of a glance. A board is
|
||||||
|
scanned, not read, and the answer to "which of these is about the thing I am
|
||||||
|
looking for" should be the first thing the eye lands on rather than the last.
|
||||||
|
|
||||||
|
Above the image and the body rather than beside them, because the body's first
|
||||||
|
line is the note's NAME (M13 steps 3 and 4) and a chip floated next to it would
|
||||||
|
compete with the thing that identifies the note. -->
|
||||||
|
<div v-if="note.labels.length" class="mb-2 flex flex-wrap gap-1">
|
||||||
|
<span
|
||||||
|
v-for="lb in note.labels"
|
||||||
|
:key="lb.id"
|
||||||
|
class="rounded-full px-2 py-0.5 text-xs"
|
||||||
|
:class="labelChip(lb)"
|
||||||
|
>{{ lb.via_tag ? "#" + lb.name : lb.name }}</span
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
<img
|
<img
|
||||||
v-if="firstImage"
|
v-if="firstImage"
|
||||||
:src="firstImage.url"
|
:src="firstImage.url"
|
||||||
@@ -317,16 +335,6 @@ onBeforeUnmount(() => document.removeEventListener("mousedown", onDocMousedown))
|
|||||||
two paragraphs instead of always after them. Rendering both would have shown
|
two paragraphs instead of always after them. Rendering both would have shown
|
||||||
every list twice. -->
|
every list twice. -->
|
||||||
|
|
||||||
<div v-if="note.labels.length" class="mt-2 flex flex-wrap gap-1">
|
|
||||||
<span
|
|
||||||
v-for="lb in note.labels"
|
|
||||||
:key="lb.id"
|
|
||||||
class="rounded-full px-2 py-0.5 text-xs"
|
|
||||||
:class="labelChip(lb)"
|
|
||||||
>{{ lb.via_tag ? "#" + lb.name : lb.name }}</span
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="note.remind_at" class="mt-2 flex flex-wrap items-center gap-1.5">
|
<div v-if="note.remind_at" class="mt-2 flex flex-wrap items-center gap-1.5">
|
||||||
<span
|
<span
|
||||||
class="inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs"
|
class="inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs"
|
||||||
|
|||||||
Reference in New Issue
Block a user