@object-ui/components 5.0.2 → 5.2.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/CHANGELOG.md CHANGED
@@ -1,5 +1,206 @@
1
1
  # @object-ui/components
2
2
 
3
+ ## 5.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - @object-ui/types@5.2.1
8
+ - @object-ui/core@5.2.1
9
+ - @object-ui/i18n@5.2.1
10
+ - @object-ui/react@5.2.1
11
+
12
+ ## 5.2.0
13
+
14
+ ### Minor Changes
15
+
16
+ - 87bc8ff: `DataEmptyState` (re-exported as `EmptyState`) is now the canonical
17
+ platform primitive for "no records / no data" states. Two new props
18
+ keep it flexible enough to absorb the hand-rolled variants that lived
19
+ in `plugin-list`, `plugin-kanban`, and `plugin-dashboard`:
20
+ - `showIcon?: boolean` — drops the icon container entirely. Used by the
21
+ kanban board-level empty banner, which is a status banner rather than
22
+ a true empty-state.
23
+ - `iconWrapperClassName?: string` — overrides the default muted rounded
24
+ square. Pass `""` to render the icon raw (used by `ListView`'s grid
25
+ empty state, which uses a large standalone glyph).
26
+
27
+ Adopters:
28
+ - `plugin-list` (`ListView` grid empty-state) — preserves the existing
29
+ large icon, title, message, add-record button and `data-testid`s,
30
+ but delegates the structural markup to `DataEmptyState`.
31
+ - `plugin-kanban` (board-level "all columns empty" banner) — keeps the
32
+ dashed border + `role="status"` / `aria-live="polite"` semantics.
33
+ - `plugin-dashboard` (`PivotTable` zero-rows branch) — keeps the
34
+ custom 4-quad SVG icon and `pivot-empty-state` test id.
35
+
36
+ No public-API change for consumers; the older inline markup is gone
37
+ but the rendered output, translation keys, and test hooks are
38
+ preserved.
39
+
40
+ - a8d12ec: `page:header` subtitle and title-format interpolation now translates
41
+ enum field values through the i18n option-label dictionary.
42
+
43
+ A schema like `subtitle: "{industry} · {type}"` previously rendered the
44
+ raw enum values (`"technology · customer"`) regardless of locale or
45
+ authored option labels. The interpolator now looks up the current
46
+ record's `objectSchema.fields` and routes each token through
47
+ `useSafeFieldLabel().fieldOptionLabel(...)`, so the same template
48
+ renders as `"科技 · 正式客户"` in zh-CN and `"Technology · Customer"`
49
+ in en — without authors having to write per-locale subtitle templates.
50
+
51
+ The change is transparent for tokens that resolve to non-enum field
52
+ values; only fields with an `options` array are remapped.
53
+
54
+ ### Patch Changes
55
+
56
+ - Updated dependencies [de0c5e6]
57
+ - Updated dependencies [9997cae]
58
+ - Updated dependencies [321294c]
59
+ - Updated dependencies [b2d1704]
60
+ - Updated dependencies [0a644f0]
61
+ - Updated dependencies [a3cb88f]
62
+ - Updated dependencies [5425608]
63
+ - Updated dependencies [3ebba63]
64
+ - Updated dependencies [e919433]
65
+ - Updated dependencies [70b5570]
66
+ - Updated dependencies [aa063db]
67
+ - Updated dependencies [d9c3bae]
68
+ - Updated dependencies [d1442e3]
69
+ - Updated dependencies [7c7400a]
70
+ - @object-ui/types@5.2.0
71
+ - @object-ui/core@5.2.0
72
+ - @object-ui/i18n@5.2.0
73
+ - @object-ui/react@5.2.0
74
+
75
+ ## 5.1.1
76
+
77
+ ### Patch Changes
78
+
79
+ - 8955b9c: fix(empty): render `action` schema via `SchemaRenderer` instead of leaking the raw object
80
+
81
+ The `empty` renderer was spreading the schema's `action` prop straight onto
82
+ `DataEmptyState`, which renders `{action}` as a child. That worked for React
83
+ nodes but blew up on production builds when the docs site fed it a schema
84
+ shape like `action: { type: 'button', label: 'Create', variant: 'default' }`
85
+ (error: "Objects are not valid as a React child").
86
+
87
+ The renderer now passes `schema.action` through `SchemaRenderer` to turn it
88
+ into a real React element, and explicitly strips `action`/`icon` from the
89
+ spread so schema-shaped objects don't reach DOM attributes.
90
+ - @object-ui/types@5.1.1
91
+ - @object-ui/core@5.1.1
92
+ - @object-ui/i18n@5.1.1
93
+ - @object-ui/react@5.1.1
94
+
95
+ ## 5.1.0
96
+
97
+ ### Minor Changes
98
+
99
+ - cf30cc2: Polish Lightning record detail page layout.
100
+ - `record:details` sections now render with Card chrome by default when a `title` is present, restoring visual grouping that was missing on pages like the opportunity detail page.
101
+ - Section labels can be translated via the `{ns}.objects.{objectName}._sections.{name}.label` convention. Author each section with a stable `name` (e.g. `info`, `forecast`) and the renderer picks up the locale-specific label automatically. Falls back to the literal `label` when no translation exists.
102
+ - The `page:header` action toolbar now collapses into a `⋯` overflow menu when more than two actions are present. The first business action stays inline; secondary system actions (Edit / Share / Delete) move into the menu, with destructive styling applied to Delete.
103
+ - Header action labels resolve via the `{ns}.objects.{objectName}._actions.{name}.label` convention.
104
+ - Removed the meaningless field-count Badge from collapsible section headers (the `2` chip next to "Description"). Field-count metadata wasn't useful in the header and added visual noise.
105
+ - Synth-path `sys_delete` now carries `variant: 'destructive'` so the overflow menu can color it appropriately.
106
+
107
+ ### Patch Changes
108
+
109
+ - bd8447d: Three platform-wide detail polish items.
110
+
111
+ **Tighter page rhythm**
112
+ - Outer `PageRenderer` padding `p-4 md:p-6 lg:p-8` → `p-3 md:p-4 lg:p-6`
113
+ and outer body wrap `space-y-8` → `space-y-6` so list / detail / home
114
+ pages share the same edge rhythm. Cuts ~16px of edge slack on lg.
115
+
116
+ **Highlights KPI treatment**
117
+ - `HeaderHighlight` now renders numeric / currency / percent / decimal
118
+ values as KPI numbers (`text-xl md:text-2xl font-semibold tabular-nums`)
119
+ instead of the uniform `text-sm font-semibold`, so amount / probability
120
+ / count fields read as headline stats — Salesforce-style key facts.
121
+
122
+ **Discussion footer upgrade**
123
+ - `RecordActivityTimeline` now uses `RichTextCommentInput` (bold / italic /
124
+ list / code, `@`-mention autocomplete, preview toggle, Send) instead of
125
+ a bare `<textarea>`.
126
+ - `DiscussionContext` gains an optional `mentionSuggestions` array that
127
+ hosts can wire (e.g. team member directory). Falls back to free-text
128
+ `@mention` when omitted.
129
+ - `RecordChatterPanel` threads `mentionSuggestions` through both inline
130
+ and sidebar positions.
131
+
132
+ - fbd5052: Tighten record-detail visual rhythm. Section card titles were rendering at
133
+ Shadcn's default `text-2xl` which dominated the page; the related-list
134
+ accordion in flush mode dropped all per-item borders so the collapsed
135
+ "Quotes / Products / Open Tasks" triggers stacked with zero visual
136
+ separation.
137
+ - `@object-ui/plugin-detail` `DetailSection`: override the `CardTitle`
138
+ className to `text-base font-semibold tracking-tight`, slim down
139
+ `CardHeader` padding (`py-3 px-4 sm:py-4 sm:px-6`) and `CardContent`
140
+ vertical padding so titles + content read as a single tight block
141
+ rather than a billboard. Demoted the section description from `text-sm
142
+ mt-1.5` to `text-xs mt-1` for the same reason.
143
+ - `@object-ui/components` `PageAccordionRenderer`: in the default
144
+ `flush` variant restore a subtle `border-b last:border-b-0` divider
145
+ between accordion items so collapsed siblings get a separator, and
146
+ style the trigger as `text-sm font-semibold tracking-tight
147
+ hover:no-underline` (Shadcn's hover-underline default looks busy on
148
+ CRM-style related-list lists).
149
+
150
+ - d51a577: feat(platform): Discussion attachments + @mention directory + Reference Rail aside
151
+ - **Discussion attachments** — `RichTextCommentInput` now accepts an `extraSlot`
152
+ and a `canSubmitEmpty` flag so hosts can mount the existing
153
+ `CommentAttachment` composer beneath the editor without forking the toolbar.
154
+ `RecordActivityTimeline` plumbs the attachments through
155
+ `DiscussionContext.onUploadAttachments` and submits attachment-only comments.
156
+ - **@mention directory** — `DiscussionContext` gains a `mentionSuggestions`
157
+ field; `RecordDetailView` populates it from the host `sys_user` collection so
158
+ `@` autocomplete in the composer now resolves against real users.
159
+ - **Reference Rail** — New `record:reference_rail` renderer + a dedicated
160
+ `aside` region emitted by `buildDefaultPageSchema` whenever a record has
161
+ ≥ 2 related lists. The rail surfaces a Salesforce/HubSpot-style snapshot
162
+ of related collections (count badge + top 3 records) on `xl+` viewports.
163
+ - **Layout** — `PageRenderer`'s structured-layout `<aside>` wrappers now honor
164
+ `aside.className`, letting schemas attach responsive utilities like
165
+ `hidden xl:flex` to the rail region.
166
+
167
+ - d1ec6a2: Fold inline-edit into the page-header overflow menu (HubSpot/Lightning
168
+ pattern) and remove the orphan "Edit fields" toolbar row that previously
169
+ floated between the tab strip and the first detail section.
170
+ - `@object-ui/app-shell` `RecordDetailView`: injects a new `sys_inline_edit`
171
+ system action that appears in the ⋯ overflow menu and dispatches a
172
+ `objectui:record:inline-edit-toggle` window CustomEvent (filtered by
173
+ recordId + objectName).
174
+ - `@object-ui/plugin-detail` `DetailView`: listens for that event to
175
+ toggle inline-edit mode; the in-page toolbar now renders only during
176
+ active editing / save error / locked states, so the idle layout flows
177
+ tabs → first section card with no orphan row.
178
+ - `@object-ui/components` layout containers: extended `KNOWN_LABEL_DICT`
179
+ with zh-CN + zh-TW translations for common CRM related-list labels
180
+ (Quotes / Products / Contacts / Accounts / Leads / Opportunities /
181
+ Cases / Campaigns / Approvals / Documents / Emails / Calls / Meetings
182
+ / Open Tasks / Closed Tasks), so authored English labels auto-translate
183
+ in `page:accordion` / `page:tabs` items.
184
+
185
+ - d548d6b: Unify empty-state visuals across timeline + registered `empty` renderer.
186
+ - `RecordActivityTimeline` and `ActivityTimeline` now use `DataEmptyState`
187
+ instead of a bare `<p>` so empty timelines match list/related-list visuals
188
+ (muted icon badge + centered copy).
189
+ - The `ui:empty` schema renderer now delegates to `DataEmptyState`, giving
190
+ schema-driven empty regions the same chrome as ad-hoc consumers.
191
+
192
+ - Updated dependencies [bd8447d]
193
+ - Updated dependencies [d51a577]
194
+ - Updated dependencies [1976691]
195
+ - Updated dependencies [cf30cc2]
196
+ - Updated dependencies [5b80cfd]
197
+ - Updated dependencies [49b1760]
198
+ - Updated dependencies [c0b236f]
199
+ - @object-ui/react@5.1.0
200
+ - @object-ui/i18n@5.1.0
201
+ - @object-ui/types@5.1.0
202
+ - @object-ui/core@5.1.0
203
+
3
204
  ## 5.0.2
4
205
 
5
206
  ### Patch Changes
package/dist/index.css CHANGED
@@ -982,6 +982,9 @@
982
982
  .w-40 {
983
983
  width: calc(var(--spacing) * 40);
984
984
  }
985
+ .w-44 {
986
+ width: calc(var(--spacing) * 44);
987
+ }
985
988
  .w-64 {
986
989
  width: calc(var(--spacing) * 64);
987
990
  }
@@ -1654,10 +1657,6 @@
1654
1657
  --tw-border-style: dashed;
1655
1658
  border-style: dashed;
1656
1659
  }
1657
- .border-none {
1658
- --tw-border-style: none;
1659
- border-style: none;
1660
- }
1661
1660
  .border-\(--color-border\) {
1662
1661
  border-color: var(--color-border);
1663
1662
  }
@@ -3170,6 +3169,12 @@
3170
3169
  border-bottom-right-radius: var(--radius-md);
3171
3170
  }
3172
3171
  }
3172
+ .last\:border-b-0 {
3173
+ &:last-child {
3174
+ border-bottom-style: var(--tw-border-style);
3175
+ border-bottom-width: 0px;
3176
+ }
3177
+ }
3173
3178
  .focus-within\:ring-2 {
3174
3179
  &:focus-within {
3175
3180
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
@@ -3425,6 +3430,13 @@
3425
3430
  }
3426
3431
  }
3427
3432
  }
3433
+ .hover\:no-underline {
3434
+ &:hover {
3435
+ @media (hover: hover) {
3436
+ text-decoration-line: none;
3437
+ }
3438
+ }
3439
+ }
3428
3440
  .hover\:underline {
3429
3441
  &:hover {
3430
3442
  @media (hover: hover) {
@@ -3536,6 +3548,14 @@
3536
3548
  background-color: var(--color-accent);
3537
3549
  }
3538
3550
  }
3551
+ .focus\:bg-destructive\/10 {
3552
+ &:focus {
3553
+ background-color: color-mix(in srgb, hsl(var(--destructive)) 10%, transparent);
3554
+ @supports (color: color-mix(in lab, red, red)) {
3555
+ background-color: color-mix(in oklab, var(--color-destructive) 10%, transparent);
3556
+ }
3557
+ }
3558
+ }
3539
3559
  .focus\:text-accent-foreground {
3540
3560
  &:focus {
3541
3561
  color: var(--color-accent-foreground);
@@ -4429,6 +4449,48 @@
4429
4449
  }
4430
4450
  }
4431
4451
  }
4452
+ .motion-safe\:bg-\[linear-gradient\(90deg\,hsl\(var\(--muted\)\)_0\%\,hsl\(var\(--muted-foreground\)\/0\.12\)_50\%\,hsl\(var\(--muted\)\)_100\%\)\] {
4453
+ @media (prefers-reduced-motion: no-preference) {
4454
+ background-image: linear-gradient(90deg,hsl(var(--muted)) 0%,hsl(var(--muted-foreground)/0.12) 50%,hsl(var(--muted)) 100%);
4455
+ }
4456
+ }
4457
+ .motion-safe\:bg-\[length\:200\%_100\%\] {
4458
+ @media (prefers-reduced-motion: no-preference) {
4459
+ background-size: 200% 100%;
4460
+ }
4461
+ }
4462
+ .motion-safe\:duration-300 {
4463
+ @media (prefers-reduced-motion: no-preference) {
4464
+ --tw-duration: 300ms;
4465
+ transition-duration: 300ms;
4466
+ }
4467
+ }
4468
+ .motion-safe\:animate-in {
4469
+ @media (prefers-reduced-motion: no-preference) {
4470
+ animation-name: enter;
4471
+ animation-duration: 150ms;
4472
+ --tw-enter-opacity: initial;
4473
+ --tw-enter-scale: initial;
4474
+ --tw-enter-rotate: initial;
4475
+ --tw-enter-translate-x: initial;
4476
+ --tw-enter-translate-y: initial;
4477
+ }
4478
+ }
4479
+ .motion-safe\:duration-300 {
4480
+ @media (prefers-reduced-motion: no-preference) {
4481
+ animation-duration: 300ms;
4482
+ }
4483
+ }
4484
+ .motion-safe\:fade-in-0 {
4485
+ @media (prefers-reduced-motion: no-preference) {
4486
+ --tw-enter-opacity: 0;
4487
+ }
4488
+ }
4489
+ .motion-safe\:zoom-in-95 {
4490
+ @media (prefers-reduced-motion: no-preference) {
4491
+ --tw-enter-scale: .95;
4492
+ }
4493
+ }
4432
4494
  .sm\:relative {
4433
4495
  @media (width >= 40rem) {
4434
4496
  position: relative;
@@ -4826,11 +4888,21 @@
4826
4888
  padding-inline: calc(var(--spacing) * 4);
4827
4889
  }
4828
4890
  }
4891
+ .sm\:px-6 {
4892
+ @media (width >= 40rem) {
4893
+ padding-inline: calc(var(--spacing) * 6);
4894
+ }
4895
+ }
4829
4896
  .sm\:py-1 {
4830
4897
  @media (width >= 40rem) {
4831
4898
  padding-block: calc(var(--spacing) * 1);
4832
4899
  }
4833
4900
  }
4901
+ .sm\:py-4 {
4902
+ @media (width >= 40rem) {
4903
+ padding-block: calc(var(--spacing) * 4);
4904
+ }
4905
+ }
4834
4906
  .sm\:text-left {
4835
4907
  @media (width >= 40rem) {
4836
4908
  text-align: left;
@@ -5086,6 +5158,12 @@
5086
5158
  padding-block: calc(var(--spacing) * 0);
5087
5159
  }
5088
5160
  }
5161
+ .md\:text-2xl {
5162
+ @media (width >= 48rem) {
5163
+ font-size: var(--text-2xl);
5164
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
5165
+ }
5166
+ }
5089
5167
  .md\:text-sm {
5090
5168
  @media (width >= 48rem) {
5091
5169
  font-size: var(--text-sm);
@@ -5235,6 +5313,11 @@
5235
5313
  grid-template-columns: repeat(12, minmax(0, 1fr));
5236
5314
  }
5237
5315
  }
5316
+ .lg\:p-6 {
5317
+ @media (width >= 64rem) {
5318
+ padding: calc(var(--spacing) * 6);
5319
+ }
5320
+ }
5238
5321
  .lg\:p-8 {
5239
5322
  @media (width >= 64rem) {
5240
5323
  padding: calc(var(--spacing) * 8);
@@ -5261,6 +5344,11 @@
5261
5344
  grid-column: span 4 / span 4;
5262
5345
  }
5263
5346
  }
5347
+ .xl\:flex {
5348
+ @media (width >= 80rem) {
5349
+ display: flex;
5350
+ }
5351
+ }
5264
5352
  .xl\:grid-cols-1 {
5265
5353
  @media (width >= 80rem) {
5266
5354
  grid-template-columns: repeat(1, minmax(0, 1fr));
@@ -5635,6 +5723,16 @@
5635
5723
  height: calc(var(--spacing) * 4);
5636
5724
  }
5637
5725
  }
5726
+ .\[\&_svg\]\:max-h-40 {
5727
+ & svg {
5728
+ max-height: calc(var(--spacing) * 40);
5729
+ }
5730
+ }
5731
+ .\[\&_svg\]\:w-auto {
5732
+ & svg {
5733
+ width: auto;
5734
+ }
5735
+ }
5638
5736
  .\[\&_svg\]\:shrink-0 {
5639
5737
  & svg {
5640
5738
  flex-shrink: 0;