@xenide-io/the-old-ui-theme 0.6.3 → 0.6.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/dist/suite.d.mts +7 -4
- package/dist/suite.d.ts +7 -4
- package/dist/suite.js +378 -181
- package/dist/suite.mjs +390 -182
- package/package.json +1 -1
- package/src/styles/suite-skin.css +136 -45
- package/src/suite/components/ai-panel.tsx +306 -137
- package/src/suite/components/suite-layout.test.tsx +5 -0
- package/src/suite/components/suite-layout.tsx +22 -12
- package/src/suite/components/suite-sidebar.tsx +3 -1
- package/src/suite/components/suite-user-menu.tsx +43 -7
- package/src/suite/components/today-page-frame.tsx +4 -5
- package/src/suite/lib/apps.ts +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xenide-io/the-old-ui-theme",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.6",
|
|
4
4
|
"description": "Props-driven React components and theme tokens inspired by classic interface design \u2014 optimized for Next.js apps and internal tools.",
|
|
5
5
|
"author": "Xenide",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,17 +27,14 @@ html {
|
|
|
27
27
|
--suite-page-pad-x: var(--suite-space-4);
|
|
28
28
|
--suite-page-pad-x-sm: var(--suite-space-5);
|
|
29
29
|
--suite-page-pad-x-lg: var(--suite-space-6);
|
|
30
|
-
--suite-page-pad-y-top: var(--suite-space-
|
|
31
|
-
--suite-page-pad-y-top-sm: var(--suite-space-
|
|
30
|
+
--suite-page-pad-y-top: var(--suite-space-4);
|
|
31
|
+
--suite-page-pad-y-top-sm: var(--suite-space-5);
|
|
32
32
|
--suite-page-pad-y-bottom: 20px;
|
|
33
33
|
--suite-page-pad-y-bottom-sm: var(--suite-space-5);
|
|
34
34
|
/* Today needs a calmer opening rhythm than dense workspace screens. */
|
|
35
35
|
--suite-today-pad-y-top: var(--suite-space-4);
|
|
36
36
|
--suite-today-pad-y-top-sm: var(--suite-space-5);
|
|
37
|
-
|
|
38
|
-
far content dissolves into it before it reaches the title. */
|
|
39
|
-
--suite-scroll-scrim: var(--ph-canvas);
|
|
40
|
-
--suite-scroll-fade: var(--suite-space-6);
|
|
37
|
+
--suite-scroll-fade: var(--suite-space-5);
|
|
41
38
|
--suite-section-gap: var(--suite-space-5);
|
|
42
39
|
--suite-header-gap: var(--suite-space-4);
|
|
43
40
|
--suite-content-max: 96rem; /* used only by content/narrow caps, not default pages */
|
|
@@ -136,9 +133,25 @@ body {
|
|
|
136
133
|
}
|
|
137
134
|
}
|
|
138
135
|
|
|
139
|
-
/* Today visual treatment — shared geometry, colours supplied by each app
|
|
136
|
+
/* Today visual treatment — shared geometry, colours supplied by each app
|
|
137
|
+
theme. The backdrop is sticky so the original glow/cloud composition stays
|
|
138
|
+
fixed while only the page content scrolls. */
|
|
140
139
|
.today-page-frame {
|
|
141
140
|
background-color: var(--ph-canvas);
|
|
141
|
+
/* clip does not create a scroll container, so the title can stick to
|
|
142
|
+
#main-content. overflow-x: hidden would trap sticky inside the frame. */
|
|
143
|
+
overflow-x: clip;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.today-page-frame__backdrop {
|
|
147
|
+
position: sticky;
|
|
148
|
+
top: 0;
|
|
149
|
+
width: 100%;
|
|
150
|
+
/* Pinned to the scrollport top; height in vh (not %) so the cancelling
|
|
151
|
+
negative margin below matches it — % margins resolve against width. */
|
|
152
|
+
height: 100vh;
|
|
153
|
+
flex: none;
|
|
154
|
+
margin-bottom: -100vh;
|
|
142
155
|
}
|
|
143
156
|
|
|
144
157
|
.today-page-frame__glow {
|
|
@@ -255,42 +268,57 @@ html.dark .today-page-frame__cloud--2 {
|
|
|
255
268
|
color: var(--ph-canvas);
|
|
256
269
|
}
|
|
257
270
|
|
|
258
|
-
/*
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
271
|
+
/* ── Page title parks at the top of the scrollport ──────────────────────
|
|
272
|
+
Every product page, not just Today. Which element actually scrolls varies:
|
|
273
|
+
`#main-content` on normal pages, `.today-page-frame` on Today, and an inner
|
|
274
|
+
pane on screens that lock main scroll (settings, kanban, editors) — where
|
|
275
|
+
the title simply never moves. Sticky resolves against whichever of those is
|
|
276
|
+
the nearest scroll container, so one rule covers all three.
|
|
277
|
+
|
|
278
|
+
The sticky offset equals the title's resting page inset, so the title never
|
|
279
|
+
shifts upward before it sticks. ::before bleeds up over that inset and out
|
|
280
|
+
to the page edges, so content dissolves behind the title instead of sliding
|
|
281
|
+
through the gap above it. */
|
|
262
282
|
.suite-page-header-sticky {
|
|
263
283
|
position: sticky;
|
|
264
|
-
top:
|
|
284
|
+
top: var(--suite-page-pad-y-top);
|
|
265
285
|
z-index: 20;
|
|
286
|
+
isolation: isolate;
|
|
266
287
|
margin-left: calc(-1 * var(--suite-page-pad-x));
|
|
267
288
|
margin-right: calc(-1 * var(--suite-page-pad-x));
|
|
268
289
|
padding-left: var(--suite-page-pad-x);
|
|
269
290
|
padding-right: var(--suite-page-pad-x);
|
|
270
|
-
background:
|
|
291
|
+
background: transparent;
|
|
271
292
|
}
|
|
272
293
|
|
|
273
|
-
|
|
274
|
-
.suite-page-header-sticky::after {
|
|
294
|
+
.suite-page-header-sticky::before {
|
|
275
295
|
content: "";
|
|
276
296
|
position: absolute;
|
|
277
297
|
inset-inline: 0;
|
|
278
|
-
top:
|
|
279
|
-
height: var(--suite-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
var(--suite-scroll-scrim),
|
|
283
|
-
transparent
|
|
284
|
-
);
|
|
298
|
+
top: calc(-1 * var(--suite-page-pad-y-top));
|
|
299
|
+
height: calc(100% + var(--suite-page-pad-y-top));
|
|
300
|
+
z-index: -1;
|
|
301
|
+
background: var(--ph-canvas);
|
|
285
302
|
pointer-events: none;
|
|
286
303
|
}
|
|
304
|
+
|
|
305
|
+
/* Hairline appears only once content has actually travelled under the title. */
|
|
306
|
+
.suite-page-header-sticky[data-stuck="true"]::before {
|
|
307
|
+
box-shadow: 0 1px 0 var(--ph-border-subtle);
|
|
308
|
+
}
|
|
309
|
+
|
|
287
310
|
@media (min-width: 640px) {
|
|
288
311
|
.suite-page-header-sticky {
|
|
312
|
+
top: var(--suite-page-pad-y-top-sm);
|
|
289
313
|
margin-left: calc(-1 * var(--suite-page-pad-x-sm));
|
|
290
314
|
margin-right: calc(-1 * var(--suite-page-pad-x-sm));
|
|
291
315
|
padding-left: var(--suite-page-pad-x-sm);
|
|
292
316
|
padding-right: var(--suite-page-pad-x-sm);
|
|
293
317
|
}
|
|
318
|
+
.suite-page-header-sticky::before {
|
|
319
|
+
top: calc(-1 * var(--suite-page-pad-y-top-sm));
|
|
320
|
+
height: calc(100% + var(--suite-page-pad-y-top-sm));
|
|
321
|
+
}
|
|
294
322
|
}
|
|
295
323
|
@media (min-width: 1024px) {
|
|
296
324
|
.suite-page-header-sticky {
|
|
@@ -300,29 +328,92 @@ html.dark .today-page-frame__cloud--2 {
|
|
|
300
328
|
padding-right: var(--suite-page-pad-x-lg);
|
|
301
329
|
}
|
|
302
330
|
}
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
.suite-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
331
|
+
|
|
332
|
+
/* Lock-scroll pages (tracker, reports, boards, settings, Ask): the page
|
|
333
|
+
stage is the sticky containing block, so the header's static position is
|
|
334
|
+
already after the page inset. The default `top` would double-count that
|
|
335
|
+
inset, jump the title down, and paint over the first content. */
|
|
336
|
+
#main-content[data-lock-scroll] .suite-page-header-sticky,
|
|
337
|
+
.suite-page-stage.overflow-hidden > .suite-page-header-sticky {
|
|
338
|
+
top: 0;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* Today only: the title sits on the fixed sky, so it stays transparent and
|
|
342
|
+
content dissolves into the backdrop instead of meeting an opaque edge. */
|
|
343
|
+
.today-page-frame .suite-page-header-sticky {
|
|
344
|
+
top: var(--suite-today-pad-y-top);
|
|
345
|
+
}
|
|
346
|
+
.today-page-frame .suite-page-header-sticky::before {
|
|
347
|
+
top: calc(-1 * var(--suite-today-pad-y-top));
|
|
348
|
+
height: calc(100% + var(--suite-today-pad-y-top) + var(--suite-scroll-fade));
|
|
349
|
+
background: linear-gradient(
|
|
350
|
+
to bottom,
|
|
351
|
+
color-mix(in srgb, var(--ph-canvas) 18%, transparent)
|
|
352
|
+
calc(100% - var(--suite-scroll-fade)),
|
|
353
|
+
transparent
|
|
354
|
+
);
|
|
355
|
+
-webkit-backdrop-filter: blur(8px);
|
|
356
|
+
backdrop-filter: blur(8px);
|
|
357
|
+
-webkit-mask-image: linear-gradient(
|
|
358
|
+
to bottom,
|
|
359
|
+
#000 calc(100% - var(--suite-scroll-fade)),
|
|
360
|
+
transparent
|
|
361
|
+
);
|
|
362
|
+
mask-image: linear-gradient(
|
|
363
|
+
to bottom,
|
|
364
|
+
#000 calc(100% - var(--suite-scroll-fade)),
|
|
365
|
+
transparent
|
|
366
|
+
);
|
|
367
|
+
box-shadow: none;
|
|
368
|
+
}
|
|
369
|
+
.today-page-frame .suite-page-header-sticky[data-stuck="true"]::before {
|
|
370
|
+
box-shadow: none;
|
|
371
|
+
}
|
|
372
|
+
@media (min-width: 640px) {
|
|
373
|
+
.today-page-frame .suite-page-header-sticky {
|
|
374
|
+
top: var(--suite-today-pad-y-top-sm);
|
|
375
|
+
}
|
|
376
|
+
.today-page-frame .suite-page-header-sticky::before {
|
|
377
|
+
top: calc(-1 * var(--suite-today-pad-y-top-sm));
|
|
378
|
+
height: calc(
|
|
379
|
+
100% + var(--suite-today-pad-y-top-sm) + var(--suite-scroll-fade)
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/* Public landing nav — same sit-on-the-page fade as Today. No bar, no border;
|
|
385
|
+
the page background shows through and only scrolling content dissolves. */
|
|
386
|
+
.landing-page-nav {
|
|
387
|
+
isolation: isolate;
|
|
388
|
+
background: transparent;
|
|
389
|
+
border-bottom: none;
|
|
390
|
+
}
|
|
391
|
+
.landing-page-nav::before {
|
|
392
|
+
content: "";
|
|
393
|
+
position: absolute;
|
|
394
|
+
inset-inline: 0;
|
|
395
|
+
top: 0;
|
|
396
|
+
height: calc(100% + var(--suite-scroll-fade));
|
|
397
|
+
z-index: -1;
|
|
398
|
+
background: linear-gradient(
|
|
399
|
+
to bottom,
|
|
400
|
+
color-mix(in srgb, var(--ph-canvas) 18%, transparent)
|
|
401
|
+
calc(100% - var(--suite-scroll-fade)),
|
|
402
|
+
transparent
|
|
403
|
+
);
|
|
404
|
+
-webkit-backdrop-filter: blur(8px);
|
|
405
|
+
backdrop-filter: blur(8px);
|
|
406
|
+
-webkit-mask-image: linear-gradient(
|
|
407
|
+
to bottom,
|
|
408
|
+
#000 calc(100% - var(--suite-scroll-fade)),
|
|
409
|
+
transparent
|
|
410
|
+
);
|
|
411
|
+
mask-image: linear-gradient(
|
|
412
|
+
to bottom,
|
|
413
|
+
#000 calc(100% - var(--suite-scroll-fade)),
|
|
414
|
+
transparent
|
|
415
|
+
);
|
|
416
|
+
pointer-events: none;
|
|
326
417
|
}
|
|
327
418
|
|
|
328
419
|
/* Page stage — ONE layout standard for every suite app.
|