@adia-ai/web-components 0.0.22 → 0.0.24

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.
@@ -90,10 +90,7 @@
90
90
  box-shadow: var(--tree-focus-ring);
91
91
  }
92
92
 
93
- :scope[selected] > [slot="row"] {
94
- background: var(--tree-bg-selected);
95
- color: var(--tree-fg);
96
- }
93
+ /* :scope[selected] rules moved outside @scope — see tree-ui Safari note at end of file. */
97
94
 
98
95
  /* ── Chevron ── */
99
96
  [slot="chevron"] {
@@ -120,9 +117,7 @@
120
117
  flex-shrink: 0;
121
118
  }
122
119
 
123
- :scope[selected] > [slot="row"] [slot="icon"] {
124
- color: var(--tree-fg);
125
- }
120
+ /* :scope[selected] icon override moved outside @scope — see Safari note at end of file. */
126
121
 
127
122
  /* ── Text ── */
128
123
  [slot="text"] {
@@ -142,13 +137,30 @@
142
137
  transition: opacity var(--tree-duration) var(--tree-easing);
143
138
  }
144
139
 
145
- [slot="row"]:hover [slot="actions"],
146
- :scope[selected] > [slot="row"] [slot="actions"] {
140
+ [slot="row"]:hover [slot="actions"] {
147
141
  opacity: 1;
148
142
  }
143
+ /* :scope[selected] > [slot="row"] [slot="actions"] moved outside @scope. */
149
144
 
150
145
  /* ── Children — collapsed state ── */
151
146
  :scope:not([open]) > tree-item-ui {
152
147
  display: none;
153
148
  }
154
149
  }
150
+
151
+ /* Safari 17.x bug: `:scope[selected]` (Flavor B — attribute-removal restyle)
152
+ doesn't restyle on attribute removal inside `@scope`. Selectors moved
153
+ out as plain `tree-ui[selected] …` rules (the @scope is `(tree-ui)`, so
154
+ `:scope` resolved to `tree-ui`). Custom-property tokens from
155
+ `:where(:scope)` still resolve via inheritance. See
156
+ docs/BROWSER-COMPAT.md §3a. */
157
+ tree-ui[selected] > [slot="row"] {
158
+ background: var(--tree-bg-selected);
159
+ color: var(--tree-fg);
160
+ }
161
+ tree-ui[selected] > [slot="row"] [slot="icon"] {
162
+ color: var(--tree-fg);
163
+ }
164
+ tree-ui[selected] > [slot="row"] [slot="actions"] {
165
+ opacity: 1;
166
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adia-ai/web-components",
3
- "version": "0.0.22",
3
+ "version": "0.0.24",
4
4
  "description": "AdiaUI web components — vanilla custom elements. A2UI runtime (renderer, registry, streams, wiring) lives in @adia-ai/a2ui-utils.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -71,6 +71,7 @@ class AdiaAppNav extends AdiaElement {
71
71
  const item = e.target.closest('app-nav-item-ui');
72
72
  if (item && this.contains(item)) {
73
73
  this.select(item);
74
+ this.#flushHoverState();
74
75
  return;
75
76
  }
76
77
 
@@ -88,6 +89,18 @@ class AdiaAppNav extends AdiaElement {
88
89
  }
89
90
  };
90
91
 
92
+ // Safari macOS leaves `:hover` stuck on items the cursor passed through
93
+ // when the DOM mutates during click+route navigation (no `mouseleave`
94
+ // fires). Toggling pointer-events on the container forces Safari to
95
+ // re-evaluate hover state on next paint without flickering layout.
96
+ // Documented in docs/BROWSER-COMPAT.md §3a.
97
+ #flushHoverState() {
98
+ this.style.pointerEvents = 'none';
99
+ requestAnimationFrame(() => {
100
+ this.style.pointerEvents = '';
101
+ });
102
+ }
103
+
91
104
  disconnected() {
92
105
  this.removeEventListener('click', this.#onClick);
93
106
  this.#ro?.disconnect();
@@ -1,3 +1,33 @@
1
+ /* Safari 17.x bug: `:scope:hover` (Flavor A) and `:scope[selected]`
2
+ (Flavor B — attribute-removal restyle) both fail inside `@scope`.
3
+ Selectors moved out — custom props from `:where(:scope)` are still set
4
+ on the element via inheritance. Specificity (0,1,1 / 0,2,1) preserved.
5
+ Safari < 18 is below the §1 floor (ADR-0007); fix protects opt-in
6
+ consumers extending below the floor and is harmlessly redundant on
7
+ engines without the bug. */
8
+ app-nav-item-ui:hover {
9
+ background: var(--nav-item-bg-hover);
10
+ color: var(--nav-item-fg-hover);
11
+ }
12
+ app-nav-item-ui:hover [slot="icon"] {
13
+ color: var(--nav-item-fg-hover);
14
+ }
15
+ app-nav-item-ui[selected] {
16
+ background: var(--nav-item-bg-selected);
17
+ color: var(--nav-item-fg-selected);
18
+ font-weight: var(--nav-item-selected-weight);
19
+ }
20
+ app-nav-item-ui[selected] [slot="icon"] {
21
+ color: var(--nav-item-icon-fg-selected);
22
+ }
23
+ app-nav-item-ui[selected] [slot="icon"]:empty::before {
24
+ content: '';
25
+ width: 2px;
26
+ height: 1em;
27
+ border-radius: 1px;
28
+ background: var(--nav-item-accent);
29
+ }
30
+
1
31
  @scope (app-nav-item-ui) {
2
32
  :where(:scope) {
3
33
  --nav-item-accent: var(--a-accent);
@@ -40,30 +70,13 @@
40
70
  outline: none;
41
71
  }
42
72
 
43
- :scope:hover {
44
- background: var(--nav-item-bg-hover);
45
- color: var(--nav-item-fg-hover);
46
- }
47
-
48
- :scope:hover [slot="icon"] {
49
- color: var(--nav-item-fg-hover);
50
- }
51
-
52
73
  :scope:focus-visible {
53
74
  background: var(--nav-item-bg-hover);
54
75
  color: var(--nav-item-fg-hover);
55
76
  outline: none;
56
77
  }
57
78
 
58
- :scope[selected] {
59
- background: var(--nav-item-bg-selected);
60
- color: var(--nav-item-fg-selected);
61
- font-weight: var(--nav-item-selected-weight);
62
- }
63
-
64
- :scope[selected] [slot="icon"] {
65
- color: var(--nav-item-icon-fg-selected);
66
- }
79
+ /* :scope[selected] rules moved outside @scope — see Safari 17.x bug note at top. */
67
80
 
68
81
  /* Icon slot — always present, reserves space even when empty */
69
82
  [slot="icon"] {
@@ -81,14 +94,7 @@
81
94
  --a-icon-size: calc(var(--nav-item-icon-font-size) + 2px);
82
95
  }
83
96
 
84
- /* Selected accent line — shown on empty icon slot */
85
- :scope[selected] [slot="icon"]:empty::before {
86
- content: '';
87
- width: 2px;
88
- height: 1em;
89
- border-radius: 1px;
90
- background: var(--nav-item-accent);
91
- }
97
+ /* Selected accent line on empty icon slot moved outside @scope — see Safari 17.x bug note at top. */
92
98
 
93
99
  [slot="text"] {
94
100
  flex: 1;
@@ -1,3 +1,33 @@
1
+ /* Safari 17.x bug: `:scope:hover` (Flavor A) and `:scope[selected]`
2
+ (Flavor B — attribute-removal restyle) both fail inside `@scope`.
3
+ Selectors moved out. `:focus-visible` matches correctly inside `@scope`,
4
+ so the combined `:hover, :focus-visible` rule was split — `:hover`
5
+ moves out, `:focus-visible` stays. See docs/BROWSER-COMPAT.md §3a. */
6
+ section-nav-item-ui:hover:not([disabled]) {
7
+ background: var(--section-nav-item-bg-hover);
8
+ color: var(--section-nav-item-fg-hover);
9
+ }
10
+ section-nav-item-ui:hover:not([disabled]) > icon-ui {
11
+ color: var(--section-nav-item-fg-hover);
12
+ }
13
+ section-nav-item-ui[selected] {
14
+ background: var(--section-nav-item-bg-selected);
15
+ color: var(--section-nav-item-fg-selected);
16
+ font-weight: var(--section-nav-item-selected-weight);
17
+ }
18
+ section-nav-item-ui[selected] > icon-ui {
19
+ color: var(--section-nav-item-icon-fg-selected);
20
+ }
21
+ section-nav-item-ui[selected]:not(:has(> icon-ui))::before {
22
+ content: '';
23
+ position: absolute;
24
+ inset-inline-start: calc(var(--section-nav-item-row-px) - var(--a-space-1));
25
+ inset-block: 25%;
26
+ width: 2px;
27
+ border-radius: 1px;
28
+ background: var(--section-nav-item-accent);
29
+ }
30
+
1
31
  @scope (section-nav-item-ui) {
2
32
  :where(:scope) {
3
33
  --section-nav-item-row-height: var(--a-size);
@@ -58,35 +88,15 @@
58
88
  text-overflow: ellipsis;
59
89
  }
60
90
 
61
- :scope:hover:not([disabled]),
62
91
  :scope:focus-visible:not([disabled]) {
63
92
  background: var(--section-nav-item-bg-hover);
64
93
  color: var(--section-nav-item-fg-hover);
65
94
  }
66
- :scope:hover:not([disabled]) > icon-ui,
67
95
  :scope:focus-visible:not([disabled]) > icon-ui {
68
96
  color: var(--section-nav-item-fg-hover);
69
97
  }
70
98
 
71
- :scope[selected] {
72
- background: var(--section-nav-item-bg-selected);
73
- color: var(--section-nav-item-fg-selected);
74
- font-weight: var(--section-nav-item-selected-weight);
75
- }
76
- :scope[selected] > icon-ui {
77
- color: var(--section-nav-item-icon-fg-selected);
78
- }
79
-
80
- /* Selected accent bar — shown only when no leading icon */
81
- :scope[selected]:not(:has(> icon-ui))::before {
82
- content: '';
83
- position: absolute;
84
- inset-inline-start: calc(var(--section-nav-item-row-px) - var(--a-space-1));
85
- inset-block: 25%;
86
- width: 2px;
87
- border-radius: 1px;
88
- background: var(--section-nav-item-accent);
89
- }
99
+ /* :scope[selected] rules moved outside @scope — see Safari 17.x bug note at top. */
90
100
 
91
101
  :scope[disabled] {
92
102
  color: var(--section-nav-item-fg-disabled);