@neuravision/construct 2.1.4 → 2.1.6

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
@@ -5,6 +5,31 @@ All notable changes to `@neuravision/construct` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.1.6] - 2026-07-19
9
+
10
+ ### Fixed
11
+
12
+ - Datum registration marks on `ct-datum-frame` and `ct-card--datum` now establish an
13
+ isolated component stacking context and render above component-local chrome. Opaque,
14
+ positioned headers (such as terminal captions at `z-index: 1`) previously painted over
15
+ the orange corner even though `ct-datum-frame` explicitly supports code samples. The
16
+ mark remains contained below global overlays, and the Storybook contract now covers a
17
+ clipped, rounded code frame with layered chrome.
18
+
19
+ ## [2.1.5] - 2026-07-17
20
+
21
+ ### Fixed
22
+
23
+ - **Card & Modal: the 2.1.4 `[hidden]` slot guards are replaced with `:not(:has(*))`
24
+ empty-slot rules — update immediately if you are on 2.1.4.** The attribute guards
25
+ trusted the wrapper's projection detection; ng-construct's `AfCard`/`AfModal` detection
26
+ (`contentChild('[header]')` resolves a template reference name, never a CSS selector)
27
+ reports "empty" for every slot, so 2.1.4 blanked out populated card headers/footers and
28
+ every modal footer in consuming apps. The slots now decide visibility purely in CSS:
29
+ a header/footer wrapper with no projected element hides itself, one with content always
30
+ renders — regardless of what the wrapper's `hidden` attribute claims. The original
31
+ 2.1.4 goal (no ghost divider under footerless cards/modals) is preserved.
32
+
8
33
  ## [2.1.4] - 2026-07-17
9
34
 
10
35
  ### Fixed
@@ -46,12 +46,12 @@
46
46
  border-top: var(--border-thin) solid var(--color-border-subtle);
47
47
  }
48
48
 
49
- /* Wrappers hide empty slots via the `hidden` attribute (e.g. framework
50
- integrations when no content is projected). The display rules above would
51
- otherwise override the UA stylesheet's `[hidden] { display: none }` and
52
- leave a ghost divider + spacing behind. */
53
- .ct-card__header[hidden],
54
- .ct-card__footer[hidden] {
49
+ /* Slot wrappers render even when no content is projected into them (framework
50
+ wrappers cannot reliably detect projection, and the `hidden` attribute they
51
+ set is overridden by the display rules above). Hide slots without projected
52
+ content so an empty header/footer leaves no ghost spacing or divider. */
53
+ .ct-card__header:not(:has(*)),
54
+ .ct-card__footer:not(:has(*)) {
55
55
  display: none;
56
56
  }
57
57
 
@@ -110,6 +110,9 @@
110
110
  Both are opt-in and additive — they don't change default cards. */
111
111
  .ct-card--datum {
112
112
  position: relative;
113
+ /* Contain the datum's internal paint layer so it cannot overlap adjacent
114
+ cards or consumer overlays. */
115
+ isolation: isolate;
113
116
  }
114
117
 
115
118
  .ct-card--datum::before {
@@ -122,6 +125,8 @@
122
125
  border-block-start: var(--border-medium) solid var(--color-brand-accent);
123
126
  border-inline-start: var(--border-medium) solid var(--color-brand-accent);
124
127
  border-start-start-radius: var(--radius-lg);
128
+ /* Card chrome may use layer 1; the registration mark stays above it. */
129
+ z-index: 2;
125
130
  pointer-events: none;
126
131
  }
127
132
 
@@ -255,6 +255,9 @@
255
255
  forced colors keeps the borders via CanvasText automatically. */
256
256
  .ct-datum-frame {
257
257
  position: relative;
258
+ /* Keep the datum's internal paint layer above local figure chrome without
259
+ allowing it to participate in the consumer's global overlay stack. */
260
+ isolation: isolate;
258
261
  }
259
262
 
260
263
  .ct-datum-frame::before {
@@ -267,6 +270,9 @@
267
270
  border-block-start: var(--border-medium) solid var(--color-brand-accent);
268
271
  border-inline-start: var(--border-medium) solid var(--color-brand-accent);
269
272
  border-start-start-radius: var(--radius-lg);
273
+ /* Code-frame headers commonly occupy layer 1. The datum must remain visible
274
+ above that chrome because it is the frame's registration mark. */
275
+ z-index: 2;
270
276
  pointer-events: none;
271
277
  }
272
278
 
@@ -64,10 +64,10 @@
64
64
  flex-wrap: wrap;
65
65
  }
66
66
 
67
- /* Wrappers hide the footer via the `hidden` attribute when no content is
68
- projected; `display: flex` above would otherwise override the UA
69
- stylesheet's `[hidden]` rule and leave a ghost divider behind. */
70
- .ct-modal__footer[hidden] {
67
+ /* The footer wrapper renders even when no content is projected into it
68
+ (framework wrappers cannot reliably detect projection). Hide it when
69
+ empty so footerless modals leave no ghost divider behind. */
70
+ .ct-modal__footer:not(:has(*)) {
71
71
  display: none;
72
72
  }
73
73
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neuravision/construct",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "description": "Construct Design System - Accessible, token-based design system for modern web applications",
5
5
  "license": "MIT",
6
6
  "repository": {