@threadlabs/looma 0.26.10 → 0.26.12

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.
@@ -95,6 +95,16 @@
95
95
  --_ui-callout-icon-size: var(--ui-callout-icon-size);
96
96
 
97
97
  --_callout-surface: var(--ui-info-soft);
98
+ --_ui-selection-context-surface: light-dark(
99
+ oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l - 0.045) calc(max(c, min(0.045, c * 3))) h),
100
+ oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l + 0.045) calc(max(c, min(0.045, c * 3))) h)
101
+ );
102
+ --_ui-selection-context-border: light-dark(
103
+ oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l - 0.085) calc(max(c, min(0.045, c * 3))) h),
104
+ oklch(from var(--ui-callout-surface, var(--_callout-surface)) calc(l + 0.085) calc(max(c, min(0.045, c * 3))) h)
105
+ );
106
+ --_ui-selection-context-text: var(--ui-text-primary);
107
+
98
108
  --_callout-border: var(--ui-info-solid);
99
109
  --_callout-icon: var(--ui-info-solid);
100
110
 
@@ -138,6 +148,9 @@
138
148
  }
139
149
 
140
150
  :host([tone="neutral"]), :host([tone="note"]) {
151
+ --_ui-selection-context-surface: initial;
152
+ --_ui-selection-context-border: initial;
153
+ --_ui-selection-context-text: initial;
141
154
  --_callout-surface: var(--ui-surface-muted);
142
155
  --_callout-border: var(--ui-border-strong);
143
156
  --_callout-icon: var(--ui-text-secondary);
@@ -8,8 +8,8 @@
8
8
  <prop name="padding" type="keyword" values="xs, sm, md, lg" default="md"
9
9
  >The space inside the card: xs is compact (0.5rem), sm is snug (0.75rem), md is the default (1.5rem), and lg is roomy (2rem).</prop>
10
10
  <prop name="tone" type="keyword" values="neutral, accent, info, success, warning, danger" default="neutral"
11
- >accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Tone never changes child
12
- controls.</prop>
11
+ >accent, info, success and warning add a quiet semantic surface. danger retains its strong leading edge for consequential content. Row highlights follow the
12
+ surface hue; action controls retain their own intent.</prop>
13
13
  <prop name="as" type="keyword" values="div, section, article, aside" default="div"
14
14
  >The native element the card renders. Choose the one that names the content: a section of a page, a self-contained article, or an aside.</prop>
15
15
  </defs>
@@ -23,6 +23,10 @@
23
23
  /* A surface that groups content. Its children stack with even space between them, so a card
24
24
  needs no layout of its own. */
25
25
  :host {
26
+ --_ui-card-surface: var(--ui-surface-raised);
27
+ --_ui-selection-context-surface: initial;
28
+ --_ui-selection-context-border: initial;
29
+ --_ui-selection-context-text: initial;
26
30
  display: flex;
27
31
  flex-direction: column;
28
32
  gap: var(--ui-space-4);
@@ -31,7 +35,7 @@
31
35
  padding: var(--ui-space-5);
32
36
  border: var(--ui-border-width) solid var(--ui-border-strong);
33
37
  border-radius: var(--ui-radius-lg);
34
- background: var(--ui-surface-raised);
38
+ background: var(--_ui-card-surface);
35
39
  color: var(--ui-text-primary);
36
40
  }
37
41
 
@@ -50,7 +54,7 @@
50
54
 
51
55
  :host([variant="subtle"]) {
52
56
  border-color: transparent;
53
- background: var(--ui-surface-muted);
57
+ --_ui-card-surface: var(--ui-surface-muted);
54
58
  }
55
59
 
56
60
  :host([variant="elevated"]) {
@@ -60,22 +64,22 @@
60
64
 
61
65
  :host([tone="accent"]) {
62
66
  border-color: color-mix(in srgb, var(--ui-accent) 25%, var(--ui-border-default));
63
- background: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
67
+ --_ui-card-surface: color-mix(in srgb, var(--ui-accent) 6%, var(--ui-surface-default));
64
68
  }
65
69
 
66
70
  :host([tone="info"]) {
67
71
  border-color: color-mix(in srgb, var(--ui-info) 25%, var(--ui-border-default));
68
- background: color-mix(in srgb, var(--ui-info) 6%, var(--ui-surface-default));
72
+ --_ui-card-surface: color-mix(in srgb, var(--ui-info) 6%, var(--ui-surface-default));
69
73
  }
70
74
 
71
75
  :host([tone="success"]) {
72
76
  border-color: color-mix(in srgb, var(--ui-success) 25%, var(--ui-border-default));
73
- background: color-mix(in srgb, var(--ui-success) 6%, var(--ui-surface-default));
77
+ --_ui-card-surface: color-mix(in srgb, var(--ui-success) 6%, var(--ui-surface-default));
74
78
  }
75
79
 
76
80
  :host([tone="warning"]) {
77
81
  border-color: color-mix(in srgb, var(--ui-warning) 25%, var(--ui-border-default));
78
- background: color-mix(in srgb, var(--ui-warning) 6%, var(--ui-surface-default));
82
+ --_ui-card-surface: color-mix(in srgb, var(--ui-warning) 6%, var(--ui-surface-default));
79
83
  }
80
84
 
81
85
  :host([variant="subtle"]:is([tone="accent"], [tone="info"], [tone="success"], [tone="warning"])) {
@@ -85,7 +89,20 @@
85
89
  :host([tone="danger"]) {
86
90
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
87
91
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
88
- background: var(--ui-danger-soft);
92
+ --_ui-card-surface: var(--ui-danger-soft);
93
+ }
94
+
95
+ /* A colored panel shades rows in its own hue, without changing button intent. */
96
+ :host([tone="accent"]), :host([tone="info"]), :host([tone="success"]), :host([tone="warning"]), :host([tone="danger"]) {
97
+ --_ui-selection-context-surface: light-dark(
98
+ oklch(from var(--_ui-card-surface) calc(l - 0.045) calc(max(c, min(0.045, c * 3))) h),
99
+ oklch(from var(--_ui-card-surface) calc(l + 0.045) calc(max(c, min(0.045, c * 3))) h)
100
+ );
101
+ --_ui-selection-context-border: light-dark(
102
+ oklch(from var(--_ui-card-surface) calc(l - 0.085) calc(max(c, min(0.045, c * 3))) h),
103
+ oklch(from var(--_ui-card-surface) calc(l + 0.085) calc(max(c, min(0.045, c * 3))) h)
104
+ );
105
+ --_ui-selection-context-text: var(--ui-text-primary);
89
106
  }
90
107
 
91
108
  :host([size="sm"]) {
@@ -83,8 +83,8 @@
83
83
  :host:where(:has(.title a[href])):hover,
84
84
  :host([highlighted]),
85
85
  :host([current]) {
86
- background: var(--ui-selection-surface);
87
- box-shadow: inset 0 0 0 var(--ui-border-width) var(--ui-selection-border);
86
+ background: var(--_ui-selection-context-surface, var(--ui-selection-surface));
87
+ box-shadow: inset 0 0 0 var(--ui-border-width) var(--_ui-selection-context-border, var(--ui-selection-border));
88
88
  }
89
89
 
90
90
  :host([variant="card"]):where(:has(.title a[href])):hover {
@@ -92,7 +92,7 @@
92
92
  }
93
93
 
94
94
  :host([current]) {
95
- color: var(--ui-selection-text);
95
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
96
96
  }
97
97
 
98
98
  /* Framed cards already have their own edge; the stronger focus ring stays separate. */
@@ -118,7 +118,7 @@
118
118
  }
119
119
 
120
120
  :host([current]) .leading {
121
- color: var(--ui-selection-text);
121
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
122
122
  }
123
123
 
124
124
  /* An explicitly independent leading control sits above the stretched row link. */
@@ -97,7 +97,7 @@
97
97
  }
98
98
 
99
99
  :host:hover:not([aria-current]) {
100
- background: var(--ui-nav-hover-surface);
100
+ background: var(--_ui-selection-context-surface, var(--ui-nav-hover-surface));
101
101
  color: var(--ui-text-primary);
102
102
  }
103
103
 
@@ -109,13 +109,13 @@
109
109
  }
110
110
 
111
111
  :host[aria-current] {
112
- background: var(--ui-nav-item-current-surface, var(--ui-selection-surface));
113
- color: var(--ui-selection-text);
112
+ background: var(--ui-nav-item-current-surface, var(--_ui-selection-context-surface, var(--ui-selection-surface)));
113
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
114
114
  }
115
115
 
116
116
  /* A complete inset edge separates pale fills without changing rail geometry. */
117
117
  :host([variant="surface"]):is(:hover, [aria-current]) {
118
- box-shadow: inset 0 0 0 var(--ui-border-width) var(--ui-selection-border);
118
+ box-shadow: inset 0 0 0 var(--ui-border-width) var(--_ui-selection-context-border, var(--ui-selection-border));
119
119
  }
120
120
 
121
121
  :host([variant="line"]) {
@@ -92,15 +92,15 @@
92
92
  }
93
93
 
94
94
  :host:hover:enabled {
95
- background: var(--ui-search-result-row-hover-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%));
95
+ background: var(--ui-search-result-row-hover-surface, var(--_ui-selection-context-surface, color-mix(in srgb, var(--ui-surface) 85%, black 3%)));
96
96
  }
97
97
 
98
98
  :host([selected]) {
99
99
  background: var(
100
100
  --ui-search-result-row-selected-bg,
101
- var(--ui-selection-surface)
101
+ var(--_ui-selection-context-surface, var(--ui-selection-surface))
102
102
  );
103
- color: var(--ui-selection-text);
103
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
104
104
  }
105
105
 
106
106
  :host:focus-visible {
@@ -29,6 +29,9 @@
29
29
  }
30
30
 
31
31
  :host([variant="card"]) {
32
+ --_ui-selection-context-surface: initial;
33
+ --_ui-selection-context-border: initial;
34
+ --_ui-selection-context-text: initial;
32
35
  padding: var(--ui-space-5);
33
36
  border: var(--ui-border-width) solid var(--ui-border-strong);
34
37
  border-radius: var(--ui-radius-lg);
@@ -41,6 +44,15 @@
41
44
  }
42
45
 
43
46
  :host([variant="card"][tone="danger"]) {
47
+ --_ui-selection-context-surface: light-dark(
48
+ oklch(from var(--ui-danger-soft) calc(l - 0.045) calc(max(c, min(0.045, c * 3))) h),
49
+ oklch(from var(--ui-danger-soft) calc(l + 0.045) calc(max(c, min(0.045, c * 3))) h)
50
+ );
51
+ --_ui-selection-context-border: light-dark(
52
+ oklch(from var(--ui-danger-soft) calc(l - 0.085) calc(max(c, min(0.045, c * 3))) h),
53
+ oklch(from var(--ui-danger-soft) calc(l + 0.085) calc(max(c, min(0.045, c * 3))) h)
54
+ );
55
+ --_ui-selection-context-text: var(--ui-text-primary);
44
56
  border-color: color-mix(in srgb, var(--ui-danger) 45%, var(--ui-border-default));
45
57
  border-inline-start: var(--ui-accent-line-width) solid var(--ui-danger);
46
58
  background: var(--ui-danger-soft);
@@ -178,18 +178,18 @@
178
178
  .row:hover,
179
179
  .row:focus-within {
180
180
  color: var(--ui-text-primary);
181
- background: var(--ui-surface-muted);
182
- box-shadow: inset 0 0 0 var(--ui-border-width) var(--ui-selection-border);
181
+ background: var(--_ui-selection-context-surface, var(--ui-surface-muted));
182
+ box-shadow: inset 0 0 0 var(--ui-border-width) var(--_ui-selection-context-border, var(--ui-selection-border));
183
183
  }
184
184
 
185
185
  /* Selection is the same surface recipe as destination and choice rows. */
186
186
  :host([selected]) > .row {
187
- color: var(--ui-selection-text);
188
- background: var(--ui-selection-surface);
189
- box-shadow: inset 0 0 0 var(--ui-border-width) var(--ui-selection-border);
187
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
188
+ background: var(--_ui-selection-context-surface, var(--ui-selection-surface));
189
+ box-shadow: inset 0 0 0 var(--ui-border-width) var(--_ui-selection-context-border, var(--ui-selection-border));
190
190
  }
191
191
  :host([selected]):not([aria-disabled="true"]) > .row > .leading {
192
- color: var(--ui-selection-text);
192
+ color: var(--_ui-selection-context-text, var(--ui-selection-text));
193
193
  }
194
194
 
195
195
  :host([disabled]) .row {