@xenide-io/the-old-ui-theme 0.6.2 → 0.6.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenide-io/the-old-ui-theme",
3
- "version": "0.6.2",
3
+ "version": "0.6.5",
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,13 +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-2);
31
- --suite-page-pad-y-top-sm: var(--suite-space-3);
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
+ --suite-scroll-fade: var(--suite-space-5);
37
38
  --suite-section-gap: var(--suite-space-5);
38
39
  --suite-header-gap: var(--suite-space-4);
39
40
  --suite-content-max: 96rem; /* used only by content/narrow caps, not default pages */
@@ -132,9 +133,25 @@ body {
132
133
  }
133
134
  }
134
135
 
135
- /* Today visual treatment — shared geometry, colours supplied by each app theme. */
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. */
136
139
  .today-page-frame {
137
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;
138
155
  }
139
156
 
140
157
  .today-page-frame__glow {
@@ -251,28 +268,57 @@ html.dark .today-page-frame__cloud--2 {
251
268
  color: var(--ph-canvas);
252
269
  }
253
270
 
254
- /* Desktop sticky page title chrome (SuitePageHeader sticky). */
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. */
255
282
  .suite-page-header-sticky {
256
283
  position: sticky;
257
- top: 0;
284
+ top: var(--suite-page-pad-y-top);
258
285
  z-index: 20;
286
+ isolation: isolate;
259
287
  margin-left: calc(-1 * var(--suite-page-pad-x));
260
288
  margin-right: calc(-1 * var(--suite-page-pad-x));
261
289
  padding-left: var(--suite-page-pad-x);
262
290
  padding-right: var(--suite-page-pad-x);
263
- background: color-mix(in oklab, var(--ph-canvas) 88%, transparent);
264
- -webkit-backdrop-filter: blur(12px) saturate(1.4);
265
- backdrop-filter: blur(12px) saturate(1.4);
266
- border-bottom: 1px solid transparent;
267
- transition: border-color 160ms ease;
291
+ background: transparent;
292
+ }
293
+
294
+ .suite-page-header-sticky::before {
295
+ content: "";
296
+ position: absolute;
297
+ inset-inline: 0;
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);
302
+ pointer-events: none;
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);
268
308
  }
309
+
269
310
  @media (min-width: 640px) {
270
311
  .suite-page-header-sticky {
312
+ top: var(--suite-page-pad-y-top-sm);
271
313
  margin-left: calc(-1 * var(--suite-page-pad-x-sm));
272
314
  margin-right: calc(-1 * var(--suite-page-pad-x-sm));
273
315
  padding-left: var(--suite-page-pad-x-sm);
274
316
  padding-right: var(--suite-page-pad-x-sm);
275
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
+ }
276
322
  }
277
323
  @media (min-width: 1024px) {
278
324
  .suite-page-header-sticky {
@@ -282,34 +328,92 @@ html.dark .today-page-frame__cloud--2 {
282
328
  padding-right: var(--suite-page-pad-x-lg);
283
329
  }
284
330
  }
285
- .suite-page-header-sticky[data-stuck="true"] {
286
- border-bottom-color: var(--ph-border-subtle);
287
- /* Only when pinned under the scroll edge — keeps resting titles aligned. */
288
- padding-top: var(--suite-space-2);
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;
289
339
  }
290
- @supports not (backdrop-filter: blur(1px)) {
291
- .suite-page-header-sticky {
292
- background: var(--ph-canvas);
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
+ );
293
381
  }
294
382
  }
295
383
 
296
- /* Sticky title chrome is for Today only — workspace pages scroll normally. */
297
- .suite-app-layout__main:not(:has([data-test="today-page"])) .suite-page-header-sticky {
298
- position: static;
299
- top: auto;
300
- z-index: auto;
301
- margin-left: 0;
302
- margin-right: 0;
303
- padding-left: 0;
304
- padding-right: 0;
305
- background: none;
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;
306
389
  border-bottom: none;
307
- -webkit-backdrop-filter: none;
308
- backdrop-filter: none;
309
390
  }
310
- .suite-app-layout__main:not(:has([data-test="today-page"]))
311
- .suite-page-header-sticky[data-stuck="true"] {
312
- padding-top: 0;
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;
313
417
  }
314
418
 
315
419
  /* Page stage — ONE layout standard for every suite app.