@octane-xplat/ui 0.2.1 → 0.4.0
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 +46 -0
- package/dist/native/octane-client-build.json +1 -1
- package/dist/native/ui.js +52 -19
- package/dist/native/ui10.js +25 -45
- package/dist/native/ui11.js +52 -57
- package/dist/native/ui12.js +47 -16
- package/dist/native/ui13.js +24 -18
- package/dist/native/ui14.js +117 -12
- package/dist/native/ui15.js +78 -17
- package/dist/native/ui16.js +88 -115
- package/dist/native/ui17.js +29 -19
- package/dist/native/ui18.js +34 -12
- package/dist/native/ui19.js +244 -8
- package/dist/native/ui2.js +10 -48
- package/dist/native/ui20.js +28 -0
- package/dist/native/ui21.js +383 -0
- package/dist/native/ui22.js +36 -0
- package/dist/native/ui23.js +55 -0
- package/dist/native/ui24.js +83 -0
- package/dist/native/ui25.js +141 -0
- package/dist/native/ui26.js +12 -0
- package/dist/native/ui27.js +61 -0
- package/dist/native/ui28.js +40 -0
- package/dist/native/ui29.js +108 -0
- package/dist/native/ui3.js +17 -20
- package/dist/native/ui30.js +18 -0
- package/dist/native/ui31.js +58 -0
- package/dist/native/ui32.js +58 -0
- package/dist/native/ui33.js +38 -0
- package/dist/native/ui34.js +53 -0
- package/dist/native/ui35.js +105 -0
- package/dist/native/ui36.js +10 -0
- package/dist/native/ui37.js +44 -0
- package/dist/native/ui38.js +197 -0
- package/dist/native/ui39.js +105 -0
- package/dist/native/ui4.js +23 -48
- package/dist/native/ui40.js +58 -0
- package/dist/native/ui41.js +19 -0
- package/dist/native/ui42.js +8 -0
- package/dist/native/ui43.js +38 -0
- package/dist/native/ui44.js +267 -0
- package/dist/native/ui45.js +28 -0
- package/dist/native/ui46.js +35 -0
- package/dist/native/ui47.js +41 -0
- package/dist/native/ui48.js +72 -0
- package/dist/native/ui49.js +66 -0
- package/dist/native/ui5.js +37 -34
- package/dist/native/ui50.js +27 -0
- package/dist/native/ui51.js +13 -0
- package/dist/native/ui52.js +92 -0
- package/dist/native/ui53.js +34 -0
- package/dist/native/ui54.js +17 -0
- package/dist/native/ui55.js +156 -0
- package/dist/native/ui56.js +33 -0
- package/dist/native/ui57.js +14 -0
- package/dist/native/ui58.js +22 -0
- package/dist/native/ui59.js +8 -0
- package/dist/native/ui6.js +79 -20
- package/dist/native/ui60.js +108 -0
- package/dist/native/ui61.js +76 -0
- package/dist/native/ui7.js +44 -65
- package/dist/native/ui8.js +25 -17
- package/dist/native/ui9.js +24 -12
- package/dist/web/octane-client-build.json +1 -1
- package/dist/web/ui.js +51 -19
- package/dist/web/ui10.js +33 -30
- package/dist/web/ui11.js +40 -55
- package/dist/web/ui12.js +36 -15
- package/dist/web/ui13.js +212 -20
- package/dist/web/ui14.js +84 -14
- package/dist/web/ui15.js +425 -46
- package/dist/web/ui16.js +12 -93
- package/dist/web/ui17.js +246 -28
- package/dist/web/ui18.js +238 -15
- package/dist/web/ui19.js +36 -8
- package/dist/web/ui2.js +15 -103
- package/dist/web/ui20.js +85 -0
- package/dist/web/ui21.js +111 -0
- package/dist/web/ui22.js +108 -0
- package/dist/web/ui23.js +96 -0
- package/dist/web/ui24.js +32 -0
- package/dist/web/ui25.js +108 -0
- package/dist/web/ui26.js +45 -0
- package/dist/web/ui27.js +16 -0
- package/dist/web/ui28.js +11 -0
- package/dist/web/ui29.js +58 -0
- package/dist/web/ui3.js +30 -27
- package/dist/web/ui30.js +34 -0
- package/dist/web/ui31.js +123 -0
- package/dist/web/ui32.js +44 -0
- package/dist/web/ui33.js +159 -0
- package/dist/web/ui34.js +70 -0
- package/dist/web/ui35.js +57 -0
- package/dist/web/ui36.js +22 -0
- package/dist/web/ui37.js +7 -0
- package/dist/web/ui38.js +38 -0
- package/dist/web/ui39.js +154 -0
- package/dist/web/ui4.js +46 -24
- package/dist/web/ui40.js +43 -0
- package/dist/web/ui41.js +42 -0
- package/dist/web/ui42.js +76 -0
- package/dist/web/ui43.js +42 -0
- package/dist/web/ui44.js +62 -0
- package/dist/web/ui45.js +9 -0
- package/dist/web/ui46.js +45 -0
- package/dist/web/ui47.js +13 -0
- package/dist/web/ui48.js +63 -0
- package/dist/web/ui49.js +47 -0
- package/dist/web/ui5.js +158 -52
- package/dist/web/ui50.js +17 -0
- package/dist/web/ui51.js +149 -0
- package/dist/web/ui52.js +42 -0
- package/dist/web/ui53.js +17 -0
- package/dist/web/ui54.js +9 -0
- package/dist/web/ui55.js +22 -0
- package/dist/web/ui56.js +8 -0
- package/dist/web/ui57.js +44 -0
- package/dist/web/ui58.js +46 -0
- package/dist/web/ui6.js +85 -22
- package/dist/web/ui7.js +46 -41
- package/dist/web/ui8.js +28 -11
- package/dist/web/ui9.js +32 -13
- package/package.json +18 -6
- package/src/theme/tokens.css +444 -47
- package/types/index.d.ts +180 -29
- package/types/props.d.ts +553 -8
package/src/theme/tokens.css
CHANGED
|
@@ -3,108 +3,505 @@
|
|
|
3
3
|
|
|
4
4
|
:root,
|
|
5
5
|
.ns-root {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
--color-primary: #4f46e5;
|
|
7
|
+
--color-on-primary: #ffffff;
|
|
8
|
+
--color-surface: #ffffff;
|
|
9
|
+
--color-text: #111827;
|
|
10
|
+
--space-4: 16px;
|
|
11
|
+
/* Corner scale — rounded-rectangle radii. Smooth (squircle) corners are
|
|
12
|
+
the default corner treatment: every class that consumes a token also
|
|
13
|
+
declares `corner-shape: squircle`. Full-radius circles opt out —
|
|
14
|
+
`corner-shape` would reshape them into squircle disks on iOS/Chromium. */
|
|
15
|
+
--radius-sm: 6px;
|
|
16
|
+
--radius-md: 8px;
|
|
17
|
+
--radius-lg: 12px;
|
|
18
|
+
--radius-xl: 16px;
|
|
11
19
|
}
|
|
12
20
|
|
|
13
21
|
.ns-dark,
|
|
14
22
|
.dark {
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
--color-surface: #0f172a;
|
|
24
|
+
--color-text: #f8fafc;
|
|
17
25
|
}
|
|
18
26
|
|
|
19
27
|
/* vocabulary base styles */
|
|
20
28
|
|
|
21
29
|
.vx-view,
|
|
22
30
|
.vx-row {
|
|
23
|
-
|
|
31
|
+
display: flex;
|
|
24
32
|
}
|
|
25
33
|
|
|
26
34
|
.vx-view {
|
|
27
|
-
|
|
35
|
+
flex-direction: column;
|
|
28
36
|
}
|
|
29
37
|
|
|
38
|
+
/* Safe-area values are zero when the viewport has no display cutout. */
|
|
39
|
+
.vx-safe-area {
|
|
40
|
+
padding-top: constant(safe-area-inset-top);
|
|
41
|
+
padding-right: constant(safe-area-inset-right);
|
|
42
|
+
padding-bottom: constant(safe-area-inset-bottom);
|
|
43
|
+
padding-left: constant(safe-area-inset-left);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.vx-safe-area {
|
|
47
|
+
padding-top: env(safe-area-inset-top);
|
|
48
|
+
padding-right: env(safe-area-inset-right);
|
|
49
|
+
padding-bottom: env(safe-area-inset-bottom);
|
|
50
|
+
padding-left: env(safe-area-inset-left);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.vx-keyboard-avoiding {
|
|
54
|
+
display: flex;
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
}
|
|
57
|
+
/* xplat-web-only:start — the native Drawer leaf is the ui-drawer widget;
|
|
58
|
+
these rules style the web DOM drawer overlay */
|
|
59
|
+
.vx-drawer {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: row;
|
|
62
|
+
position: relative;
|
|
63
|
+
overflow: hidden;
|
|
64
|
+
}
|
|
65
|
+
.vx-drawer-main {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex: 1;
|
|
68
|
+
min-width: 0;
|
|
69
|
+
}
|
|
70
|
+
.vx-drawer-backdrop {
|
|
71
|
+
position: absolute;
|
|
72
|
+
inset: 0;
|
|
73
|
+
background: rgba(15, 23, 42, 0.35);
|
|
74
|
+
}
|
|
75
|
+
.vx-drawer-panel {
|
|
76
|
+
position: absolute;
|
|
77
|
+
z-index: 1;
|
|
78
|
+
top: 0;
|
|
79
|
+
bottom: 0;
|
|
80
|
+
left: 0;
|
|
81
|
+
width: 280px;
|
|
82
|
+
overflow: auto;
|
|
83
|
+
background: var(--color-surface);
|
|
84
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
85
|
+
}
|
|
86
|
+
/* xplat-web-only:end */
|
|
87
|
+
|
|
30
88
|
.vx-row {
|
|
31
|
-
|
|
89
|
+
flex-direction: row;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.vx-grid,
|
|
93
|
+
.vx-stack {
|
|
94
|
+
display: grid;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.vx-stack > * {
|
|
98
|
+
grid-area: 1 / 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/* xplat-web-only:start — Absolute's native leaf is absolutelayout; CSS
|
|
102
|
+
positioning is web-only (children position via left/top props) */
|
|
103
|
+
.vx-absolute {
|
|
104
|
+
position: relative;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.vx-absolute > * {
|
|
108
|
+
position: absolute;
|
|
109
|
+
}
|
|
110
|
+
/* xplat-web-only:end */
|
|
111
|
+
|
|
112
|
+
.vx-spacer {
|
|
113
|
+
flex-grow: 1;
|
|
32
114
|
}
|
|
33
115
|
|
|
34
116
|
.vx-pressable {
|
|
35
|
-
|
|
117
|
+
display: flex;
|
|
118
|
+
flex-direction: column;
|
|
119
|
+
user-select: none;
|
|
36
120
|
}
|
|
37
121
|
|
|
38
122
|
/* web press feedback */
|
|
39
123
|
.vx-pressable:active {
|
|
40
|
-
|
|
124
|
+
opacity: 0.85;
|
|
125
|
+
}
|
|
126
|
+
.vx-pressable-no-feedback:active {
|
|
127
|
+
opacity: 1;
|
|
41
128
|
}
|
|
42
129
|
/* native press feedback (NS pseudo — dead rule on web, and vice versa) */
|
|
43
130
|
.vx-pressable:pressed {
|
|
44
|
-
|
|
131
|
+
opacity: 0.85;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* xplat-web-only:start — overlays/toasts/popovers render through RootLayout
|
|
135
|
+
or showModal on native; these portal/positioning rules are web-only */
|
|
136
|
+
.vx-overlay {
|
|
137
|
+
z-index: 1000;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.vx-overlay-shade {
|
|
141
|
+
position: absolute;
|
|
142
|
+
inset: 0;
|
|
143
|
+
background-color: rgba(0, 0, 0, 0.45);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.vx-overlay-content {
|
|
147
|
+
position: relative;
|
|
148
|
+
z-index: 1;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.vx-popover {
|
|
152
|
+
z-index: 1001;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.vx-popover-backdrop {
|
|
156
|
+
background-color: transparent;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.vx-toast-host {
|
|
160
|
+
position: fixed;
|
|
161
|
+
z-index: 1002;
|
|
162
|
+
left: 0;
|
|
163
|
+
right: 0;
|
|
164
|
+
display: flex;
|
|
165
|
+
justify-content: center;
|
|
166
|
+
pointer-events: none;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.vx-toast-top {
|
|
170
|
+
top: 24px;
|
|
171
|
+
}
|
|
172
|
+
.vx-toast-bottom {
|
|
173
|
+
bottom: 24px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.vx-toast {
|
|
177
|
+
pointer-events: auto;
|
|
178
|
+
}
|
|
179
|
+
/* xplat-web-only:end */
|
|
180
|
+
|
|
181
|
+
/* auto-grow owns height — the manual resize handle has no native analog */
|
|
182
|
+
/* xplat-web-only:start */
|
|
183
|
+
.vx-textarea {
|
|
184
|
+
resize: none;
|
|
185
|
+
}
|
|
186
|
+
/* xplat-web-only:end */
|
|
187
|
+
|
|
188
|
+
/* Modal is a real top-layer dialog on web. Presentation variants keep their
|
|
189
|
+
sizing and anchoring in tokens so both the component and openModal share it. */
|
|
190
|
+
/* xplat-web-only:start */
|
|
191
|
+
.vx-modal {
|
|
192
|
+
width: 480px;
|
|
193
|
+
max-width: 90%;
|
|
194
|
+
max-height: 90%;
|
|
195
|
+
padding: 24px;
|
|
196
|
+
border: 0;
|
|
197
|
+
border-radius: var(--radius-xl);
|
|
198
|
+
corner-shape: squircle;
|
|
199
|
+
color: var(--color-text);
|
|
200
|
+
background-color: var(--color-surface);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.vx-modal::backdrop {
|
|
204
|
+
background: rgba(15, 23, 42, 0.45);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
.vx-modal--dialog {
|
|
208
|
+
width: 480px;
|
|
209
|
+
max-width: 90%;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.vx-modal--sheet {
|
|
213
|
+
width: 100%;
|
|
214
|
+
max-width: none;
|
|
215
|
+
max-height: 85%;
|
|
216
|
+
position: fixed;
|
|
217
|
+
inset: auto 0 0;
|
|
218
|
+
margin: 0;
|
|
219
|
+
border-top-left-radius: var(--radius-xl);
|
|
220
|
+
border-top-right-radius: var(--radius-xl);
|
|
221
|
+
corner-shape: squircle;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.vx-modal--fullscreen {
|
|
225
|
+
width: 100%;
|
|
226
|
+
max-width: none;
|
|
227
|
+
height: 100%;
|
|
228
|
+
max-height: none;
|
|
229
|
+
margin: 0;
|
|
230
|
+
border-radius: 0;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Modal ROUTES (pushRoute presentation:'modal') — the URL stays underneath,
|
|
234
|
+
so the overlay is a fixed layer over the shell rather than a dialog. */
|
|
235
|
+
.vx-modalroute {
|
|
236
|
+
position: fixed;
|
|
237
|
+
inset: 0;
|
|
238
|
+
z-index: 1000;
|
|
239
|
+
display: flex;
|
|
240
|
+
align-items: stretch;
|
|
241
|
+
justify-content: stretch;
|
|
45
242
|
}
|
|
46
243
|
|
|
244
|
+
.vx-modalroute-shade {
|
|
245
|
+
position: absolute;
|
|
246
|
+
inset: 0;
|
|
247
|
+
border: 0;
|
|
248
|
+
padding: 0;
|
|
249
|
+
background: rgba(15, 23, 42, 0.45);
|
|
250
|
+
cursor: default;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.vx-modalroute-body {
|
|
254
|
+
position: relative;
|
|
255
|
+
flex: 1;
|
|
256
|
+
min-width: 0;
|
|
257
|
+
overflow: auto;
|
|
258
|
+
color: var(--color-text);
|
|
259
|
+
background-color: var(--color-surface);
|
|
260
|
+
}
|
|
261
|
+
/* xplat-web-only:end */
|
|
262
|
+
|
|
263
|
+
/* xplat-web-only:start — placeholder pseudos are DOM-only */
|
|
264
|
+
input::placeholder,
|
|
265
|
+
textarea::placeholder {
|
|
266
|
+
color: var(--placeholder-color, currentColor);
|
|
267
|
+
}
|
|
268
|
+
/* xplat-web-only:end */
|
|
269
|
+
|
|
270
|
+
/* xplat-web-only:start — native ActivityIndicator is the NS widget */
|
|
271
|
+
.vx-spinner {
|
|
272
|
+
display: inline-block;
|
|
273
|
+
width: 1em;
|
|
274
|
+
height: 1em;
|
|
275
|
+
box-sizing: border-box;
|
|
276
|
+
border: 2px solid currentColor;
|
|
277
|
+
border-right-color: transparent;
|
|
278
|
+
border-radius: 50%;
|
|
279
|
+
animation: vx-spinner-turn 0.8s linear infinite;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
@keyframes vx-spinner-turn {
|
|
283
|
+
to {
|
|
284
|
+
transform: rotate(360deg);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/* xplat-web-only:end */
|
|
288
|
+
|
|
289
|
+
.vx-h1 {
|
|
290
|
+
font-size: 2em;
|
|
291
|
+
font-weight: bold;
|
|
292
|
+
}
|
|
293
|
+
.vx-h2 {
|
|
294
|
+
font-size: 1.5em;
|
|
295
|
+
font-weight: bold;
|
|
296
|
+
}
|
|
297
|
+
.vx-h3 {
|
|
298
|
+
font-size: 1.17em;
|
|
299
|
+
font-weight: bold;
|
|
300
|
+
}
|
|
301
|
+
.vx-h4 {
|
|
302
|
+
font-size: 1em;
|
|
303
|
+
font-weight: bold;
|
|
304
|
+
}
|
|
305
|
+
.vx-h5 {
|
|
306
|
+
font-size: 0.83em;
|
|
307
|
+
font-weight: bold;
|
|
308
|
+
}
|
|
309
|
+
.vx-h6 {
|
|
310
|
+
font-size: 0.67em;
|
|
311
|
+
font-weight: bold;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* xplat-web-only:start — glass material is real on iOS 26+; web approximates
|
|
315
|
+
with backdrop-filter. The class also lands on native elements (inert) so
|
|
316
|
+
apps can style their own fallback — but these rules are DOM-only. */
|
|
317
|
+
.vx-glass {
|
|
318
|
+
background-color: color-mix(in srgb, var(--color-surface) 30%, transparent);
|
|
319
|
+
border: 1px solid rgba(255, 255, 255, 0.25);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
323
|
+
.vx-glass {
|
|
324
|
+
background-color: color-mix(in srgb, var(--color-surface) 20%, transparent);
|
|
325
|
+
-webkit-backdrop-filter: blur(20px) saturate(1.6);
|
|
326
|
+
backdrop-filter: blur(20px) saturate(1.6);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.vx-glass--clear {
|
|
331
|
+
background-color: color-mix(in srgb, var(--color-surface) 12%, transparent);
|
|
332
|
+
border-color: rgba(255, 255, 255, 0.15);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
|
|
336
|
+
.vx-glass--clear {
|
|
337
|
+
-webkit-backdrop-filter: blur(8px) saturate(1.3);
|
|
338
|
+
backdrop-filter: blur(8px) saturate(1.3);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/* xplat-web-only:end */
|
|
342
|
+
|
|
47
343
|
/* utilities (hand-written subset for the harness; Tailwind later) */
|
|
48
344
|
|
|
49
|
-
.flex-1 {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
345
|
+
.flex-1 {
|
|
346
|
+
flex-grow: 1;
|
|
347
|
+
}
|
|
348
|
+
/* Flex divergence guards — NS FlexboxLayout diverges from web flexbox on
|
|
349
|
+
* shrinkability: grow children never shrink below intrinsic width, fixed
|
|
350
|
+
* children get crushed, and auto-height rows re-measure grow children at
|
|
351
|
+
* zero height. min-w-0/min-h-0 let a grow child shrink; shrink-0 protects
|
|
352
|
+
* a fixed-size child. All three are plain CSS on web. */
|
|
353
|
+
.min-w-0 {
|
|
354
|
+
min-width: 0;
|
|
355
|
+
}
|
|
356
|
+
.min-h-0 {
|
|
357
|
+
min-height: 0;
|
|
358
|
+
}
|
|
359
|
+
.shrink-0 {
|
|
360
|
+
flex-shrink: 0;
|
|
361
|
+
}
|
|
362
|
+
.grow {
|
|
363
|
+
flex-grow: 1;
|
|
364
|
+
}
|
|
365
|
+
.items-center {
|
|
366
|
+
align-items: center;
|
|
367
|
+
}
|
|
368
|
+
.justify-center {
|
|
369
|
+
justify-content: center;
|
|
370
|
+
}
|
|
371
|
+
.gap-4 {
|
|
372
|
+
gap: 16px;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
.text-xl {
|
|
376
|
+
font-size: 20px;
|
|
377
|
+
}
|
|
378
|
+
.font-bold {
|
|
379
|
+
font-weight: bold;
|
|
380
|
+
}
|
|
53
381
|
|
|
54
|
-
|
|
55
|
-
.
|
|
382
|
+
/* Corner utilities — consume the --radius-* scale and carry the smooth
|
|
383
|
+
(squircle) corner treatment. Circles stay circular: .rounded-full omits
|
|
384
|
+
corner-shape deliberately (squircle at full radius = a squircle disk,
|
|
385
|
+
not a circle). Opt out per element with `corner-shape: round`. */
|
|
386
|
+
.rounded-sm {
|
|
387
|
+
border-radius: var(--radius-sm);
|
|
388
|
+
corner-shape: squircle;
|
|
389
|
+
}
|
|
390
|
+
.rounded-md {
|
|
391
|
+
border-radius: var(--radius-md);
|
|
392
|
+
corner-shape: squircle;
|
|
393
|
+
}
|
|
394
|
+
.rounded-lg {
|
|
395
|
+
border-radius: var(--radius-lg);
|
|
396
|
+
corner-shape: squircle;
|
|
397
|
+
}
|
|
398
|
+
.rounded-xl {
|
|
399
|
+
border-radius: var(--radius-xl);
|
|
400
|
+
corner-shape: squircle;
|
|
401
|
+
}
|
|
402
|
+
.rounded-full {
|
|
403
|
+
border-radius: 9999px;
|
|
404
|
+
}
|
|
56
405
|
|
|
57
|
-
.bg-primary {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
.
|
|
406
|
+
.bg-primary {
|
|
407
|
+
background-color: var(--color-primary);
|
|
408
|
+
}
|
|
409
|
+
.text-onprimary {
|
|
410
|
+
color: var(--color-on-primary);
|
|
411
|
+
}
|
|
412
|
+
.bg-danger {
|
|
413
|
+
background-color: #dc2626;
|
|
414
|
+
}
|
|
415
|
+
/* xplat-web-only:start — box-shadow is inert on native (elevation is
|
|
416
|
+
Android-only; no shared mapping yet) */
|
|
417
|
+
.shadow-2 {
|
|
418
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
419
|
+
}
|
|
420
|
+
/* xplat-web-only:end */
|
|
61
421
|
|
|
62
422
|
.btn {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
423
|
+
padding-top: 12px;
|
|
424
|
+
padding-right: 20px;
|
|
425
|
+
padding-bottom: 12px;
|
|
426
|
+
padding-left: 20px;
|
|
427
|
+
border-radius: var(--radius-md);
|
|
428
|
+
corner-shape: squircle;
|
|
68
429
|
}
|
|
69
430
|
|
|
70
431
|
/* harness experiment styles */
|
|
71
432
|
|
|
72
433
|
.vx-app {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
434
|
+
padding: 24px;
|
|
435
|
+
background-color: var(--color-surface);
|
|
436
|
+
color: var(--color-text);
|
|
76
437
|
}
|
|
77
438
|
|
|
78
439
|
.vx-app .text-xl,
|
|
79
440
|
.vx-app Text,
|
|
80
441
|
.vx-app label {
|
|
81
|
-
|
|
442
|
+
color: var(--color-text);
|
|
82
443
|
}
|
|
83
444
|
|
|
84
445
|
.input {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
446
|
+
padding: 10px;
|
|
447
|
+
border-width: 1px;
|
|
448
|
+
border-color: #94a3b8;
|
|
449
|
+
border-radius: var(--radius-sm);
|
|
450
|
+
corner-shape: squircle;
|
|
451
|
+
font-size: 16px;
|
|
90
452
|
}
|
|
91
453
|
|
|
92
454
|
.chip {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
455
|
+
background-color: var(--color-primary);
|
|
456
|
+
color: var(--color-on-primary);
|
|
457
|
+
padding: 4px 10px;
|
|
458
|
+
border-radius: var(--radius-lg);
|
|
459
|
+
corner-shape: squircle;
|
|
460
|
+
font-size: 13px;
|
|
98
461
|
}
|
|
99
462
|
|
|
100
463
|
.cell {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
464
|
+
padding: 12px;
|
|
465
|
+
border-bottom-width: 1px;
|
|
466
|
+
border-bottom-color: #e2e8f0;
|
|
104
467
|
}
|
|
105
468
|
|
|
106
469
|
.vx-list {
|
|
107
|
-
|
|
470
|
+
flex-grow: 1;
|
|
108
471
|
}
|
|
109
472
|
|
|
110
|
-
.gap-2 {
|
|
473
|
+
.gap-2 {
|
|
474
|
+
gap: 8px;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* In-window sheet — bottom-anchored panel (matches the native RootLayout
|
|
478
|
+
sheet). Layer is pointer-events:none; backdrop + panel re-enable. */
|
|
479
|
+
.vx-sheet-layer {
|
|
480
|
+
position: fixed;
|
|
481
|
+
inset: 0;
|
|
482
|
+
z-index: 1100;
|
|
483
|
+
pointer-events: none;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.vx-sheet-backdrop {
|
|
487
|
+
position: absolute;
|
|
488
|
+
inset: 0;
|
|
489
|
+
background: rgba(15, 23, 42, 0.45);
|
|
490
|
+
pointer-events: auto;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
.vx-sheet {
|
|
494
|
+
position: absolute;
|
|
495
|
+
left: 0;
|
|
496
|
+
right: 0;
|
|
497
|
+
bottom: 0;
|
|
498
|
+
max-height: 85%;
|
|
499
|
+
padding: 24px;
|
|
500
|
+
overflow: auto;
|
|
501
|
+
border-top-left-radius: var(--radius-xl);
|
|
502
|
+
border-top-right-radius: var(--radius-xl);
|
|
503
|
+
corner-shape: squircle;
|
|
504
|
+
background-color: var(--color-surface);
|
|
505
|
+
color: var(--color-text);
|
|
506
|
+
pointer-events: auto;
|
|
507
|
+
}
|