@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.
@@ -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, the hairline that comes with it) does not apply.
2935
- Every condition it used to announce now lives on the field it concerns,
2936
- with a dot on the rail saying which section to look in. */}
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, but its
2940
- only affordance used to sit in the Files section, which scoped the
2941
- discoverability to that section: from anywhere else on the page
2942
- (or from 3,975px above it) nothing said the record took files at
2943
- all, and a whole-record drop target nobody can see is an
2944
- accelerator, never an entry point. The Files register keeps its own
2945
- Add a register's Add belongs under its register this is the
2946
- record-level way in. A template composition for now; it earns a kit
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 — and that distinction is the whole
3169
- reason this stopped being a `Timeline`.
3170
-
3171
- `Timeline` puts its label INSIDE the row's press target. That
3172
- is right for an event ("Stage changed to Won") whose text is
3173
- derived and read-only. It is wrong here, because the gist is
3174
- the one thing on an entry a person WROTE, and text inside a
3175
- button can never be edited where it sits. Four repairs came out
3176
- of working around that the verbs moved off the row, the label
3177
- learned to un-clamp, the body's copy of the gist came out, and
3178
- the Edit verb ended up a scroll away from the sentence it
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 — a second SET, and therefore the other SURFACE.
3716
-
3717
- Files above is a row LIST because a shipping document is identified by
3718
- its NAME: a PDF thumbnail is a grey page identical to every other grey
3719
- page, so a grid of them is a wall of one tile. A photo is identified
3720
- by its CONTENT `IMG_4471.jpg` tells nobody anything so the tile IS
3721
- the identity and a grid puts twelve on screen at once.
3722
- (AGENTS.md: documents get a LIST, images get a GRID.)
3723
-
3724
- BOTH SURFACES SHOW THE WHOLE COLLECTION — they are two LENSES over
3725
- one set, not two sets. Files answers "what is on this record" in a
3726
- scannable column; Photos answers "what did it LOOK like" at a glance.
3727
- A reader who guesses wrong still finds the artifact instead of
3728
- concluding it was never filed, and nobody has to know a file's FORMAT
3729
- before they know where to look for it.
3730
-
3731
- The grid used to filter to `image/*`. That made the split a fact about
3732
- MIME rather than about reading, and it put the signed delivery note in
3733
- a different section from the photos of the same hand-over while this
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
- convention, which is the kit's. It replaces the
4152
- DrawerFooter that used to pin it.
4153
-
4154
- Solid `danger`, which is the destructive convention
4155
- page-wide (composition rule 9) not a text-weight act.
4156
- A quiet destructive verb had been tried here and the
4157
- surface-less rung is gone: an act now always carries a
4158
- control, and only NAVIGATION is underlined text. The trash
4159
- glyph stays off "Remove fee" already names the object,
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>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lotics/ui",
3
- "version": "43.7.0",
3
+ "version": "43.7.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./vite": {