@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenide-io/the-old-ui-theme",
3
- "version": "0.6.3",
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-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
- /* Slack-style scroll edge: the page background the title sits on, and how
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 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. */
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
- /* Sticky page title (SuitePageHeader sticky) — Slack behaviour: the title
259
- holds its position on the page background and never becomes its own bar.
260
- No surface tint, border or blur; content scrolls underneath and dissolves
261
- into the same background through the scrim below. */
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: 0;
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: var(--suite-scroll-scrim);
291
+ background: transparent;
271
292
  }
272
293
 
273
- /* The fade content scrolls into, pinned to the title's bottom edge. */
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: 100%;
279
- height: var(--suite-scroll-fade);
280
- background: linear-gradient(
281
- to bottom,
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
- .suite-page-header-sticky[data-stuck="true"] {
304
- /* Only when pinned under the scroll edge — keeps resting titles aligned. */
305
- padding-top: var(--suite-space-2);
306
- }
307
-
308
- /* Sticky title chrome is for Today only — workspace pages scroll normally. */
309
- .suite-app-layout__main:not(:has([data-test="today-page"])) .suite-page-header-sticky {
310
- position: static;
311
- top: auto;
312
- z-index: auto;
313
- margin-left: 0;
314
- margin-right: 0;
315
- padding-left: 0;
316
- padding-right: 0;
317
- background: none;
318
- }
319
- .suite-app-layout__main:not(:has([data-test="today-page"]))
320
- .suite-page-header-sticky::after {
321
- content: none;
322
- }
323
- .suite-app-layout__main:not(:has([data-test="today-page"]))
324
- .suite-page-header-sticky[data-stuck="true"] {
325
- padding-top: 0;
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.