@praxisui/table 9.0.4-rc.9 → 9.0.4

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/README.md CHANGED
@@ -99,6 +99,40 @@ Use `resourcePath` when the host wants the table to enter backend schema/data mo
99
99
 
100
100
  `resourcePath` is enough only when the host already provides the Praxis API/CRUD wiring expected by the table runtime. In remote mode, the table derives columns from the backend schema contract and data from the backend resource/filter contract.
101
101
 
102
+ For schema-governed tables that need only a few editorial differences, keep
103
+ `columns: []` and declare a schema projection. The runtime derives every visible
104
+ column from `/schemas/filtered` and reapplies the overrides by canonical field
105
+ name whenever the schema changes:
106
+
107
+ ```ts
108
+ const config: TableConfig = {
109
+ columns: [],
110
+ columnProjection: {
111
+ source: 'schema',
112
+ include: ['competencia', 'salarioBruto', 'salarioLiquido'],
113
+ overrides: {
114
+ salarioLiquido: { sticky: 'end', width: '160px' },
115
+ },
116
+ },
117
+ };
118
+ ```
119
+
120
+ An unknown override never creates a client-only column, and the override cannot
121
+ change the canonical `field`. Use explicit `columns` only when the page really
122
+ owns a complete local projection rather than schema-derived defaults.
123
+
124
+ The table editor keeps the expanded columns only in memory. On apply/save and
125
+ in `configChange`, it serializes the contract back to `include` plus the actual
126
+ `overrides`. Computed or other genuinely client-owned columns are preserved in
127
+ `columnProjection.additions`; an addition cannot shadow a canonical schema
128
+ field. This round-trip prevents customization from turning the compact page
129
+ contract back into a schema copy.
130
+
131
+ `include` is an ordered allowlist. Omit it only when every field marked as table
132
+ visible by the backend belongs in the experience. Prefer it for financial,
133
+ personal, or otherwise sensitive resources so future schema fields are not
134
+ published implicitly.
135
+
102
136
  Optional collection operations such as export are not implied by a base route. Expose them only when backend capabilities or HATEOAS links prove that the operation is available.
103
137
 
104
138
  When the collection response exposes `_links.create` or a collection `capabilities` snapshot with create support, `PraxisTable` can materialize the canonical `create` toolbar action without requiring each host screen to duplicate labels, disabled state, schema URLs, or submit URLs. If the host provides `surface.open`, the action opens the create form as a governed collection surface; otherwise the table emits `toolbarAction` with the enriched action metadata for the composed host to handle.
@@ -218,23 +252,22 @@ The package exports both the table runtime and `PraxisFilter` integration surfac
218
252
  - Row actions can be declared in `config.actions.row.actions`.
219
253
  - Contextual row discovery can use backend HATEOAS/capabilities when enabled.
220
254
  - `visibleWhen` and `disabledWhen` use canonical JSON Logic.
255
+ - Inline and overflow actions preserve their actionable origin. Overflow menus finish closing and restore the trigger before emitting the action, allowing dialogs and drawers with `restoreFocus` to return keyboard focus to the correct table control.
221
256
 
222
257
  The filter field manager follows the compact inline visual language and can be themed by hosts through
223
258
  `--pfx-field-manager-surface`, `--pfx-field-manager-on-surface`,
224
259
  `--pfx-field-manager-on-surface-muted`, `--pfx-field-manager-outline`,
225
- `--pfx-field-manager-focus-outline`, `--pfx-field-manager-search-surface`,
226
- `--pfx-field-manager-search-on-surface`, `--pfx-field-manager-search-placeholder`,
227
- `--pfx-field-manager-search-height`, `--pfx-field-manager-search-radius`,
228
- `--pfx-field-manager-search-font-size`, `--pfx-field-manager-search-line-height`,
229
- `--pfx-field-manager-search-font-weight`, `--pfx-field-manager-search-icon-size`,
260
+ `--pfx-field-manager-focus-outline`, the shared `--praxis-collection-search-*` contract,
230
261
  `--pfx-field-manager-scrollbar-thumb`, `--pfx-field-manager-scrollbar-thumb-hover`,
231
262
  `--pfx-field-manager-scrollbar-track`, and `--pfx-field-manager-scrollbar-size`. Their defaults inherit
232
- the corresponding `--pdx-inline-*` tokens when available, then the semantic `--praxis-theme-*` roles,
233
- and finally Material system
234
- tokens; `--pfx-field-manager-search-radius` intentionally defaults to Material's full corner radius so
235
- the search focus ring and field share the same pill geometry. The runtime resolves every public
236
- `--pfx-field-manager-*` token from the host before applying its private fallback, so overrides take
237
- effect without CSS specificity workarounds. The scrollable field list reserves a stable scrollbar gutter
263
+ the semantic `--praxis-theme-*` roles and finally Material system tokens. Collection searches in Table
264
+ and Dynamic Fields share surface, foreground, placeholder, outline, focus, height, compact height,
265
+ padding, gap, radius, icon/clear target, typography and motion variables. Set
266
+ `--praxis-collection-search-radius: 0`, an intermediate radius such as `8px`, or `999px` on the global
267
+ theme scope to select square, corporate-rounded or pill geometry without targeting internal selectors.
268
+ The former Table-only `--pfx-field-manager-search-*` family is removed during beta so it cannot become
269
+ a competing public contract. The runtime resolves every remaining public `--pfx-field-manager-*` token
270
+ from the host before applying its private fallback. The scrollable field list reserves a stable scrollbar gutter
238
271
  and derives a contrasting thumb from the manager surface and on-surface roles, so its overflow affordance
239
272
  does not depend on application-global scrollbar styles. Native scrollbar auto-hide preferences can still
240
273
  control when the operating system displays the thumb. Because the manager renders in a CDK overlay, define host overrides on a global theme scope
@@ -299,6 +332,8 @@ The package also exports `PRAXIS_TABLE_AUTHORING_MANIFEST` for governed AI edits
299
332
  The table can materialize analytic table projections produced by the canonical `x-ui.analytics` decision in `@praxisui/core`. Services such as `AnalyticsTableContractService` help hosts resolve analytic table contracts and data without reimplementing that projection.
300
333
 
301
334
  Detail rows can host governed rich content surfaces. Rich content semantics belong to the shared rich content/core contracts; the table provides the row-detail shell and host-mediated dispatch.
335
+ When the actions column header combines an icon and a label, the table materializes that rich content with inline, non-wrapping layout. Column width may still be governed by the table contract, but the icon is not allowed to force the label onto a second line.
336
+ When no bottom paginator or footer toolbar follows the data surface, the table closes its lower corners. When a bottom surface is present, the table keeps square lower corners so the stack remains visually continuous.
302
337
  Governed embed nodes (`formRef`, `tableRef`, `chartRef`, `templateRef`, `diagramEmbed`) default to `renderMode: "reference"` when the field is omitted.
303
338
  `renderMode: "inline"` is an explicit intent for an owning runtime/provider to materialize the referenced surface inside the detail row; hosts must still keep the reference shell as the accessible fallback when the provider, data, or capability is unavailable.
304
339
  For charts, use `chartDocumentRef` or a governed `chartDocument` payload that follows the canonical `x-ui.chart` contract; do not place raw chart-engine options directly inside the table detail schema.