@lotics/ui 43.7.0 → 43.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/examples/tpl_record.tsx +51 -103
- package/package.json +1 -1
package/examples/tpl_record.tsx
CHANGED
|
@@ -2931,20 +2931,19 @@ export function TplRecord({ chrome = "page", code = "RC-2026-0418", openSection
|
|
|
2931
2931
|
divider above the section for every section before it. */}
|
|
2932
2932
|
{/* The header band sits ABOVE the stack, on the canvas beat — it is the
|
|
2933
2933
|
record's IDENTITY, not a section, so the 56px between-sections rhythm
|
|
2934
|
-
(and, in scroll mode,
|
|
2935
|
-
|
|
2936
|
-
|
|
2934
|
+
(and, in scroll mode, its hairline) does not apply. A condition belongs
|
|
2935
|
+
on the FIELD it concerns, with a dot on the rail naming the section to
|
|
2936
|
+
look in — never announced up here away from what it is about. */}
|
|
2937
2937
|
<View style={{ flex: 1, minWidth: 0, gap: 28 }}>
|
|
2938
2938
|
{/* The record's own ACTS live here, beside its identity — not inside a
|
|
2939
|
-
section. Dropping a file is something you do TO THE RECORD,
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
|
|
2943
|
-
|
|
2944
|
-
|
|
2945
|
-
|
|
2946
|
-
|
|
2947
|
-
slot on RecordSummary at its second consumer. */}
|
|
2939
|
+
section. Dropping a file is something you do TO THE RECORD, so an
|
|
2940
|
+
affordance for it that lives only in the Files section is scoped to
|
|
2941
|
+
that section: from anywhere else on a long page nothing says the
|
|
2942
|
+
record takes files at all, and a whole-record drop target nobody can
|
|
2943
|
+
see is an accelerator, never an entry point. The Files register keeps
|
|
2944
|
+
its own Add — a register's Add belongs under its register — and this
|
|
2945
|
+
is the record-level way in. A template composition for now; it earns a
|
|
2946
|
+
kit slot on RecordSummary at its second consumer. */}
|
|
2948
2947
|
<View style={{ flexDirection: "row", alignItems: "flex-start", gap: 16 }}>
|
|
2949
2948
|
<View style={{ flex: 1, minWidth: 0 }}>
|
|
2950
2949
|
{/* The SUBJECT leads, the key goes under it. A reader talks about
|
|
@@ -3165,31 +3164,17 @@ export function TplRecord({ chrome = "page", code = "RC-2026-0418", openSection
|
|
|
3165
3164
|
/>
|
|
3166
3165
|
) : (
|
|
3167
3166
|
<>
|
|
3168
|
-
{/* AN ENTRY, NOT A LOG LINE —
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
the
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
edits. They were never independent: each one was the
|
|
3180
|
-
arrangement pushing back.
|
|
3181
|
-
|
|
3182
|
-
So the gist is not a label. It is a RESIDENT field — always
|
|
3183
|
-
editable, in place, no mode and no Edit button, the same as
|
|
3184
|
-
every other authored value on this record. The old argument
|
|
3185
|
-
against a resident editor here ("the gist is already the row's
|
|
3186
|
-
label, so it renders the sentence twice") disappears the moment
|
|
3187
|
-
it stops being one.
|
|
3188
|
-
|
|
3189
|
-
What is left is the shape every comment UI converged on: a
|
|
3190
|
-
metadata header, the prose under it, the row's own actions at
|
|
3191
|
-
the TOP RIGHT beside the text they act on, and the heavy
|
|
3192
|
-
artifacts behind their own disclosure. */}
|
|
3167
|
+
{/* AN ENTRY, NOT A LOG LINE — which is why this is not a `Timeline`.
|
|
3168
|
+
`Timeline` puts its label INSIDE the row's press target, right
|
|
3169
|
+
for a derived read-only event ("Stage changed to Won") and wrong
|
|
3170
|
+
for a sentence a person WROTE: text inside a button cannot be
|
|
3171
|
+
edited where it sits.
|
|
3172
|
+
|
|
3173
|
+
So the gist is a RESIDENT field — always editable in place, no
|
|
3174
|
+
mode, no Edit button, like every other authored value here. The
|
|
3175
|
+
shape every comment UI converges on: a metadata header, the prose
|
|
3176
|
+
under it, the row's actions at the TOP RIGHT beside the text they
|
|
3177
|
+
act on, and heavy artifacts behind their own disclosure. */}
|
|
3193
3178
|
<View style={{ gap: 20 }}>
|
|
3194
3179
|
{(showAllActivity ? activity : activity.slice(0, ACTIVITY_FOLD)).map((a) => (
|
|
3195
3180
|
<ActivityEntryRow
|
|
@@ -3712,52 +3697,25 @@ export function TplRecord({ chrome = "page", code = "RC-2026-0418", openSection
|
|
|
3712
3697
|
</Section>
|
|
3713
3698
|
</View>
|
|
3714
3699
|
|
|
3715
|
-
{/* PHOTOS —
|
|
3716
|
-
|
|
3717
|
-
|
|
3718
|
-
|
|
3719
|
-
|
|
3720
|
-
|
|
3721
|
-
|
|
3722
|
-
|
|
3723
|
-
|
|
3724
|
-
|
|
3725
|
-
|
|
3726
|
-
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3733
|
-
|
|
3734
|
-
very comment promised that the odd `.docx` among forty phone photos
|
|
3735
|
-
would stay in the grid. It could not: the filter forbade what the
|
|
3736
|
-
sentence described. `FileThumbnail` already renders a non-image as a
|
|
3737
|
-
doc tile (badge + filename), so nothing had to be built — only the
|
|
3738
|
-
filter that hid it had to go.
|
|
3739
|
-
|
|
3740
|
-
THE COST IS REAL AND DELIBERATE: every file now appears twice. The
|
|
3741
|
-
trade is that duplication is cheap to skim past, whereas an artifact
|
|
3742
|
-
filed under the wrong lens looks like an artifact that was never
|
|
3743
|
-
filed. A record whose attachments are overwhelmingly paperwork should
|
|
3744
|
-
drop the grid entirely rather than carry a wall of identical tiles —
|
|
3745
|
-
the choice is per-record-TYPE, made once, not per file.
|
|
3746
|
-
|
|
3747
|
-
Ordering follows the collection, so a record heavy in documents leads
|
|
3748
|
-
this grid with grey tiles. If that reads badly for your record type,
|
|
3749
|
-
sort images first rather than reinstating the filter.
|
|
3750
|
-
|
|
3751
|
-
The tiles are mixed by construction now, so the FIXTURE has to be
|
|
3752
|
-
mixed too — a grid of eight JPGs never once renders the doc tile it
|
|
3753
|
-
has always been able to render, which is how the gap survived.
|
|
3754
|
-
|
|
3755
|
-
The ADD rides the heading row, right edge, exactly as it does on Files
|
|
3756
|
-
and Fees — a section's add sits in the same spot whether the section
|
|
3757
|
-
holds nought or forty. Note it is a plain `Button` + `pickFiles`, not
|
|
3758
|
-
`FilesEditorUpload`: that verb reads the `FilesEditor` context, and the
|
|
3759
|
-
heading is OUTSIDE the editor by construction, so a compound's own
|
|
3760
|
-
upload button can never reach the one place the law puts it. */}
|
|
3700
|
+
{/* PHOTOS — two LENSES over ONE set, not two sets. Files answers "what is
|
|
3701
|
+
on this record" in a scannable column; this answers "what did it LOOK
|
|
3702
|
+
like" at a glance. (List for documents, grid for images: AGENTS.md.)
|
|
3703
|
+
|
|
3704
|
+
BOTH show the WHOLE collection, unfiltered. A reader who guesses wrong
|
|
3705
|
+
still finds the artifact instead of concluding it was never filed, and
|
|
3706
|
+
nobody has to know a file's FORMAT before knowing where to look. The
|
|
3707
|
+
cost is real: every file appears twice. Duplication is cheap to skim
|
|
3708
|
+
past; an artifact filed under the wrong lens reads as missing.
|
|
3709
|
+
|
|
3710
|
+
Ordering follows the collection, so a document-heavy record leads with
|
|
3711
|
+
grey tiles — sort images first if that reads badly, and drop the grid
|
|
3712
|
+
entirely for a record type that is overwhelmingly paperwork. That
|
|
3713
|
+
choice is per record TYPE, made once, never per file.
|
|
3714
|
+
|
|
3715
|
+
The add is a plain `Button` + `pickFiles`, NOT `FilesEditorUpload`:
|
|
3716
|
+
that verb reads the `FilesEditor` context and the heading row sits
|
|
3717
|
+
outside the editor by construction, so the compound's own upload
|
|
3718
|
+
button cannot reach the one place the law puts it. */}
|
|
3761
3719
|
<View onLayout={nav.register("photos")}>
|
|
3762
3720
|
<Section>
|
|
3763
3721
|
<SectionHeading>
|
|
@@ -4147,26 +4105,16 @@ export function TplRecord({ chrome = "page", code = "RC-2026-0418", openSection
|
|
|
4147
4105
|
<InlineTextInput value={f.note} onSave={persist((v: string) => patchFee(f.id, { note: v }))} placeholder="Add a note…" accessibilityLabel="Fee note" />
|
|
4148
4106
|
</DetailRow>
|
|
4149
4107
|
</DetailTable>
|
|
4150
|
-
{/* The destructive verb, LEFT — the peek footer's
|
|
4151
|
-
|
|
4152
|
-
|
|
4153
|
-
|
|
4154
|
-
|
|
4155
|
-
|
|
4156
|
-
|
|
4157
|
-
|
|
4158
|
-
|
|
4159
|
-
|
|
4160
|
-
which is the safeguard the icon was only decorating.
|
|
4161
|
-
|
|
4162
|
-
NO Divider. Every hairline a `Table` draws is
|
|
4163
|
-
full-bleed (the row `Divider`s carry no padding, the
|
|
4164
|
-
header band's border spans its whole box), so one
|
|
4165
|
-
inset by ROW_GUTTER puts two hairline lengths in the
|
|
4166
|
-
same vertical run — and it would be saying twice what
|
|
4167
|
-
the expanded row's own wash already says. The row
|
|
4168
|
-
wrapper is required, not decoration: a `Button` alone
|
|
4169
|
-
in a column View stretches to full width. */}
|
|
4108
|
+
{/* The destructive verb, LEFT — the peek footer's convention.
|
|
4109
|
+
Solid `danger` per composition rule 9; no trash glyph,
|
|
4110
|
+
because "Remove fee" already names the object the icon
|
|
4111
|
+
was only decorating.
|
|
4112
|
+
|
|
4113
|
+
NO Divider. Every hairline a `Table` draws is full-bleed,
|
|
4114
|
+
so one inset by ROW_GUTTER puts two hairline lengths in
|
|
4115
|
+
the same vertical run — and it repeats what the expanded
|
|
4116
|
+
row's wash already says. The row wrapper IS required: a
|
|
4117
|
+
`Button` alone in a column View stretches full width. */}
|
|
4170
4118
|
<View style={{ flexDirection: "row" }}>
|
|
4171
4119
|
<Button title="Remove fee" color="danger" onPress={() => deleteFee(f)} />
|
|
4172
4120
|
</View>
|