@praxisui/core 9.0.68-rc.0 → 9.0.68-rc.2

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
@@ -21,7 +21,18 @@ Use this package directly when a host application or library needs Praxis UI typ
21
21
  `appearance.body.padding: "0"` (and hide the header if the content owns its title).
22
22
  Persist the preset `id` in `WidgetShellConfig.preset` and
23
23
  use the descriptor for authoring labels and previews. Do not maintain a
24
- second preset list in consumers.
24
+ second preset list in consumers. The builtin Portuguese and English shell labels
25
+ and descriptions are Core fallbacks in `PraxisI18nService`; consumers do not need a
26
+ Page Builder i18n provider. Host/ancestor dictionaries and translators take precedence.
27
+ Published IDs `dark-glass`, `light-neutral`, `graphite`, `data-panel`,
28
+ `chart-panel`, `metric-panel`, `executive-card` and `filter-bar` remain resolvable in the same catalog. Their finishes were recalibrated after visual review;
29
+ ID compatibility does not promise pixel-for-pixel historical appearance. `BUILTIN_SHELL_PRESETS` provides the
30
+ public ID-to-appearance record derived from that catalog. Configure host overrides
31
+ through `context.ui.shell.presets`, then widget-specific `appearance`; use CSS
32
+ variables there for corporate theming. The `dark-glass` and `graphite` material palettes remain dark by default;
33
+ adaptive finishes follow the host Material tokens. Do not mutate either exported catalog to configure an application.
34
+ The deliberate `frameless` inset improvement differs from 9.0.67: persist
35
+ `appearance.body.padding: "0"` when the original edge-to-edge layout is required.
25
36
  - `WidgetShellConfig.stickyHeader: true` retains the existing composition-derived
26
37
  header within its widget during page scrolling. Omission/false keeps normal flow.
27
38
  This differs from `bodyLayout: 'scroll'`, which governs body scrolling. No second
@@ -938,3 +949,88 @@ selected section without remounting the provider or moving focus out of the navi
938
949
  On editable canvases, content-only widgets expose contextual actions above the north resize
939
950
  handle, with reserved space at the top of the canvas. Both controls remain pointer-accessible
940
951
  when the widget is narrow.
952
+
953
+ The `dark-glass` preset uses a fixed dark material palette with explicit header/body
954
+ foreground pairs, including in light application themes. Projected content inherits
955
+ the shell foreground when it does not define its own surface.
956
+
957
+ ### Shared page preset resolution
958
+
959
+ `resolveWidgetPageLayoutPreset(page)` exposes the same organization resolution used by
960
+ `DynamicWidgetPageComponent`: a recognized, trimmed `layoutPreset` wins; otherwise the
961
+ runtime uses the existing `layoutPresetOptions.presetFamily`. It reads the existing
962
+ `WidgetPageDefinition` fields and returns the builtin catalog definition without modifying
963
+ the page. Page editors use it to explain inherited organization and its suggested theme.
964
+ An explicit `themePreset` still takes precedence over `defaultThemePreset`. This extraction
965
+ adds no page field, domain semantics, dependency on another library, or persistence behavior.
966
+
967
+ ### Selection-bound workflow forms
968
+
969
+ `ResourceActionOpenAdapterService` projects the existing collection action's
970
+ `selection.idsField` and, for `SELECTION_MAP`, `selection.versionsField` into
971
+ `groupedCommand.contextFields`. The form layout retains these schema fields in
972
+ runtime metadata and submit data even when hidden, while excluding them from the
973
+ interactive layout. Primitive arrays such as selected IDs remain FormControl
974
+ values; object collections declared by `arrayInput` or `array` use FormArray.
975
+ A `PER_ITEM` action suppresses generic HTTP-success notifications: its opening
976
+ consumer must present the per-item outcome rather than claim all items succeeded.
977
+
978
+ ### Shell materials and faithful editor preview
979
+
980
+ `WidgetShellConfig.appearance.card.backdropFilter` accepts a CSS backdrop effect such as
981
+ `blur(16px) saturate(125%)`. Pair translucent backgrounds with an opaque
982
+ `appearance.card.fallbackBackground`. The shell uses that fallback when backdrop filters
983
+ are unsupported, the user requests reduced transparency, or the card is expanded/fullscreen.
984
+ A sticky glass header uses the same opaque fallback for legibility over scrolling content.
985
+ `none` disables a backdrop effect; `kind: 'none'` still disables the entire external surface.
986
+
987
+ The runtime resolves a widget preset, the inherited page/theme preset, custom context presets,
988
+ and explicit appearance overrides in that order of responsibility. Widget appearance fields
989
+ win over the chosen preset. The editor receives the resolved inherited context; it never
990
+ persists the theme-derived preset as an explicit widget or page choice just to render its preview.
991
+ The original ID `light-neutral` now has the honest adaptive-neutral label. Presets style the shell;
992
+ charts, tables and rich content retain ownership of their internal appearance and behavior.
993
+
994
+ Token ownership: host Material tokens → canonical `widget-shell-presets.ts` → shell appearance
995
+ bindings → `WidgetShellComponent`; Page Builder thumbnails and live previews consume the same
996
+ catalog. Fixed glass/graphite palettes are material defaults in that catalog, overridable through
997
+ existing context presets or explicit appearance. No host CSS patch is required.
998
+
999
+
1000
+ ### Shell border widths, strokes and layered backgrounds
1001
+
1002
+ `appearance.card.borderWidth` and `borderStyle` accept CSS border values, including
1003
+ per-side shorthands such as `1px 1px 1px 6px` and `solid dashed dotted double`.
1004
+ `appearance.header.borderWidth` and `borderStyle` control the bottom divider only
1005
+ (single values). Omitted values retain the existing `1px solid` geometry. `none`
1006
+ removes the corresponding stroke; `kind: 'none'` disables the complete shell.
1007
+ The same fields participate in preset/context inheritance and explicit override precedence.
1008
+
1009
+ Backgrounds already accept solid colors, gradients and CSS background layers. For a
1010
+ rounded gradient border, use a transparent solid border and two background layers:
1011
+
1012
+ ```json
1013
+ {
1014
+ "card": {
1015
+ "background": "linear-gradient(#102c46,#102c46) padding-box,linear-gradient(125deg,#b9d9ec,#ffd38a) border-box",
1016
+ "borderColor": "transparent",
1017
+ "borderWidth": "3px",
1018
+ "borderStyle": "solid",
1019
+ "borderRadius": "16px"
1020
+ },
1021
+ "header": { "background": "transparent", "titleColor": "#ffffff", "subtitleColor": "#ffffff", "iconColor": "#ffffff" },
1022
+ "body": { "background": "transparent", "textColor": "#ffffff" }
1023
+ }
1024
+ ```
1025
+
1026
+ The background layer is continuous: a transparent dashed/dotted/double border does
1027
+ not cut gaps into that gradient. Use a colored stroke and another fill for visibly
1028
+ dashed/dotted/double outlines. `borderStyle: 'none'` hides the gradient border area.
1029
+ Authoring valid CSS does not certify contrast: consumers must pair foregrounds,
1030
+ backgrounds and opaque alternatives appropriately. Inner component surfaces keep
1031
+ ownership of their own colors and interaction states.
1032
+
1033
+ Nested shells isolate their material CSS properties: an outer thick/dashed border or
1034
+ blur does not become an inner widget's default. Intentional inheritance through
1035
+ `context.ui.shell.preset/presets` remains supported. This isolation does not remove
1036
+ the host's shared theme tokens.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-09-09T10:03:24.330Z",
3
+ "generatedAt": "2026-09-10T01:25:13.157Z",
4
4
  "packageName": "@praxisui/core",
5
- "packageVersion": "9.0.68-rc.0",
5
+ "packageVersion": "9.0.68-rc.2",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,
@@ -4295,9 +4295,9 @@
4295
4295
  {
4296
4296
  "chunkIndex": 121,
4297
4297
  "chunkKind": "recipe",
4298
- "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2]\",\"fragmentPath\":\"authoringPlan.widgets[2]\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"folder_shared\",\"title\":\"${state.detailTitle}\",\"subtitle\":\"${state.detailSubtitle}\",\"stickyHeader\":true,\"bodyLayout\":\"fill\",\"windowActions\":{\"fullscreen\":true,\"collapsible\":true}},\"bindingOrder\":[\"tabsId\",\"componentInstanceId\",\"configPersistenceStrategy\",\"config\",\"selectedIndex\"]}}",
4298
+ "content": "{\"componentId\":\"praxis-dynamic-page\",\"chunkSection\":\"authoringPlan.widgets[2]\",\"fragmentPath\":\"authoringPlan.widgets[2]\",\"fragmentIdentity\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\"},\"fragment\":{\"key\":\"workspace\",\"componentId\":\"praxis-tabs\",\"shell\":{\"kind\":\"dashboard-card\",\"icon\":\"folder_shared\",\"title\":\"${state.detailTitle}\",\"subtitle\":\"${state.detailSubtitle}\",\"stickyHeader\":true,\"windowActions\":{\"fullscreen\":true,\"collapsible\":true}},\"bindingOrder\":[\"tabsId\",\"componentInstanceId\",\"configPersistenceStrategy\",\"config\",\"selectedIndex\"]}}",
4299
4299
  "sourcePointer": "examples/ai-recipes/praxis-dynamic-page.ergon-archetype-master-detail-tabs.json",
4300
- "contentHash": "2d5640538744ae254de35cbc8e8e084db8ae3a82be7cb9457626923452248edf",
4300
+ "contentHash": "ed933eab963f703ec2ad55930d7d890566285c420076b267c6161e97ebfb759c",
4301
4301
  "sourceKind": "component_definition",
4302
4302
  "sourceId": "praxis-dynamic-page",
4303
4303
  "corpusVersion": "1.0.0"