@helloimjolopez-pathway/pathway-tokens 11.1.0 → 11.3.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 +188 -20
- package/components/scrollbar/scrollbar.jsx +17 -15
- package/components/sidenav/sidenav.jsx +48 -39
- package/dist/README.md +1 -1
- package/dist/brands/newco/index.css +2 -2
- package/dist/brands/newco/layout-contextual.css +4 -1
- package/dist/brands/newco/themes/dark.css +1 -1
- package/dist/brands/newco/themes/light.css +1 -1
- package/dist/brands/newco/tokens.js +34 -1
- package/dist/breakpoints.css +2 -2
- package/dist/contract.json +2 -2
- package/dist/index.css +2 -2
- package/dist/layout-contextual.css +3 -3
- package/dist/layout-responsive.css +2 -2
- package/dist/layout.css +3 -3
- package/dist/motion.css +10 -10
- package/dist/primitives.css +3 -3
- package/dist/themes/amplify-dark.css +233 -0
- package/dist/themes/amplify-light.css +234 -0
- package/dist/themes/light.css +9 -4
- package/dist/themes/midnight.css +6 -3
- package/dist/tokens.json +24 -8
- package/dist/type.css +2 -2
- package/package.json +30 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SideNav
|
|
2
|
+
* SideNav, Pathway Design System
|
|
3
3
|
*
|
|
4
4
|
* Importable React component module. Source of truth for the SideNav
|
|
5
5
|
* implementation; the standalone demo (sidenav.html) and the Storybook
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
* drift, and wait. Do not resolve it by fetching Figma. See CLAUDE.md 1.1.
|
|
14
14
|
*
|
|
15
15
|
* Spec: components/sidenav/sidenav-spec.md
|
|
16
|
-
* Figma: https://www.figma.com/design/3sw45aVcngFAmpbP6cfrXP/?node-id=
|
|
16
|
+
* Figma: https://www.figma.com/design/3sw45aVcngFAmpbP6cfrXP/?node-id=40004059-1375
|
|
17
|
+
* SideNav.Container, a COMPONENT_SET. The id cited here until
|
|
18
|
+
* 2026-10-07, 40003951-2927, does not exist in the file.
|
|
17
19
|
*/
|
|
18
20
|
|
|
19
21
|
import React, { useState, useRef } from "react";
|
|
@@ -32,7 +34,7 @@ import ReactDOM from "react-dom";
|
|
|
32
34
|
* one theme into the bundle, so Midnight Mode could not work at all in the coded
|
|
33
35
|
* component no matter what the consumer did. `t()` also returns the token id
|
|
34
36
|
* unchanged when it cannot resolve a name, which emits invalid CSS that the
|
|
35
|
-
* browser silently drops
|
|
37
|
+
* browser silently drops: so a renamed token failed as a colour that quietly
|
|
36
38
|
* reverted to inherited, with no error anywhere.
|
|
37
39
|
*
|
|
38
40
|
* Referencing the custom property instead means the cascade resolves the value,
|
|
@@ -136,7 +138,7 @@ export const L = {
|
|
|
136
138
|
menuPadT: u("padding-tight"),
|
|
137
139
|
menuPadB: u("padding-xxwide"),
|
|
138
140
|
itemH: u("accessibility-touch-target-aa-height"),
|
|
139
|
-
iconWrap: 24, // no token in Figma
|
|
141
|
+
iconWrap: 24, // no token in Figma, leading icon wrapper
|
|
140
142
|
iconInner: 16, // Material Symbols Rounded frame size, per design-system-spec §7.2
|
|
141
143
|
rowPadH: u("padding-tight"),
|
|
142
144
|
// Collapsed rail: container.rowStart's padding-right in Figma. It is what
|
|
@@ -144,8 +146,8 @@ export const L = {
|
|
|
144
146
|
// the design.
|
|
145
147
|
railIconInset: u("padding-xxtight"),
|
|
146
148
|
textPad: u("padding-xtight"),
|
|
147
|
-
childIndent: 24, // no token in Figma
|
|
148
|
-
stripeW: 4, // no token in Figma
|
|
149
|
+
childIndent: 24, // no token in Figma, level-1 left indent
|
|
150
|
+
stripeW: 4, // no token in Figma, indicator stripe width
|
|
149
151
|
colPadL: u("padding-medium"),
|
|
150
152
|
colPadR: u("padding-tight"),
|
|
151
153
|
collapseGap: u("padding-xxtight"),
|
|
@@ -251,7 +253,7 @@ export function SideNavItem({
|
|
|
251
253
|
|
|
252
254
|
<IndicatorStripe visible={showStripe} />
|
|
253
255
|
|
|
254
|
-
{/* Leading icon
|
|
256
|
+
{/* Leading icon, Level 0 only */}
|
|
255
257
|
{!isChild && item.icon && (
|
|
256
258
|
<div style={{ width: L.iconWrap, height: L.iconWrap, display: "flex",
|
|
257
259
|
alignItems: "center", justifyContent: "center", flexShrink: 0,
|
|
@@ -270,7 +272,7 @@ export function SideNavItem({
|
|
|
270
272
|
? <span className="material-symbols-rounded" aria-hidden="true"
|
|
271
273
|
style={{ fontSize: L.iconInner, lineHeight: 1, color: iconColor,
|
|
272
274
|
// display:block so the glyph is laid out as a box rather than
|
|
273
|
-
// on a text baseline
|
|
275
|
+
// on a text baseline: an inline glyph in a flex-centred
|
|
274
276
|
// parent is centred by its line box, not by its own art, so
|
|
275
277
|
// it rode high inside the 24px wrap.
|
|
276
278
|
display: "block",
|
|
@@ -311,15 +313,22 @@ export function SideNavItem({
|
|
|
311
313
|
</p>
|
|
312
314
|
</div>
|
|
313
315
|
|
|
314
|
-
{/* Chevron
|
|
315
|
-
|
|
316
|
+
{/* Chevron, groupers only, and EXPANDED ONLY.
|
|
317
|
+
Figma's SideNavItem.Collapsed is indicator + Container.LeadingIcon
|
|
318
|
+
and nothing else: there is no chevron in the rail. Giving it
|
|
319
|
+
width 0 and max-width 0 was not enough, because the glyph still
|
|
320
|
+
painted outside its collapsed box, so the rail showed a second
|
|
321
|
+
column of 10px chevrons 17px to the right of the icons. Measured
|
|
322
|
+
2026-10-02: two distinct glyph centres, 28.8 and 45.8, where there
|
|
323
|
+
should be one. It is now not rendered at all when collapsed. */}
|
|
324
|
+
{!isChild && hasChildren && !isSidebarCollapsed && (
|
|
316
325
|
<div style={{ width: isSidebarCollapsed ? 0 : 40, height: L.iconWrap, display: "flex",
|
|
317
326
|
alignItems: "center", justifyContent: "center", flexShrink: 0,
|
|
318
327
|
maxWidth: isSidebarCollapsed ? 0 : 40,
|
|
319
328
|
opacity: isSidebarCollapsed ? 0 : 1,
|
|
320
329
|
overflow: "hidden",
|
|
321
330
|
transition: "max-width var(--motion-duration-6) var(--motion-easing-emphasized), opacity var(--motion-duration-3) var(--motion-easing-standard)" }}>
|
|
322
|
-
{/* Chevron rotation matches accordion timing
|
|
331
|
+
{/* Chevron rotation matches accordion timing, --motion-duration-5 + --motion-easing-accordion */}
|
|
323
332
|
<div style={{ transform: isExpanded ? "rotate(180deg)" : "rotate(0deg)",
|
|
324
333
|
transition: "transform var(--motion-duration-5) var(--motion-easing-accordion)" }}>
|
|
325
334
|
{chevronDown ? chevronDown({ size: 10, color: iconColor }) : <ChevDown size={10} color={iconColor} />}
|
|
@@ -385,7 +394,7 @@ export function SideNavTooltip({ label, anchorRect, onMouseEnter, onMouseLeave }
|
|
|
385
394
|
}
|
|
386
395
|
|
|
387
396
|
// ─── SectionLabel ─────────────────────────────────────────────────────────────
|
|
388
|
-
// Figma node 40006794-5977
|
|
397
|
+
// Figma node 40006794-5977, building block used in CollapsedPopover headers.
|
|
389
398
|
// Tokens: Foreground/Static/Neutral/Base (#313131), Label/Section/Small/Semibold
|
|
390
399
|
// (11px / 600 / 16px / 0.6px letter-spacing, uppercase)
|
|
391
400
|
// Padding: Padding/Tight (12px left), Padding/XTight (8px vertical)
|
|
@@ -414,7 +423,7 @@ export function CollapsedPopover({ item, onClick, anchorRect, onMouseEnter, onMo
|
|
|
414
423
|
boxShadow: c2("--elevation-widget"),
|
|
415
424
|
padding: "var(--semantic-layout-units-padding-xxtight)", minWidth: 200, pointerEvents: "auto",
|
|
416
425
|
animation: "popoverIn var(--motion-duration-3) var(--motion-easing-spring) forwards" }}>
|
|
417
|
-
{/* Section label
|
|
426
|
+
{/* Section label, Figma component 40006794-5977 */}
|
|
418
427
|
<div style={{ borderBottom: `0.5px solid ${c("stroke-static-neutral-faint")}` }}>
|
|
419
428
|
<SectionLabel label={item.label} />
|
|
420
429
|
</div>
|
|
@@ -453,11 +462,11 @@ export function PopoverRow({ item, onClick, activeId }) {
|
|
|
453
462
|
// ─── CollapseButton ───────────────────────────────────────────────────────────
|
|
454
463
|
// Redesigned in Figma (2026-05-12): now uses Slot.RowStart (Module.Mark icon)
|
|
455
464
|
// + Slot.RowEnd (Action Icon). The action icon uses Foreground/Action/Secondary/Rest
|
|
456
|
-
// (#6b6b6b)
|
|
465
|
+
// (#6b6b6b), different from nav item icons. SVG assets fetched from Figma directly.
|
|
457
466
|
export function CollapseButton({ isSidebarCollapsed, onToggle, collapseIcon, expandIcon }) {
|
|
458
467
|
const [h, setH] = useState(false);
|
|
459
468
|
const labelColor = h ? T.text.navHover : T.text.navBase;
|
|
460
|
-
const actionIconColor = T.icon.actionSecondary; // var(--semantic-color-stroke-action-field-hover)
|
|
469
|
+
const actionIconColor = T.icon.actionSecondary; // var(--semantic-color-stroke-action-field-hover), always static, no hover change
|
|
461
470
|
return (
|
|
462
471
|
<div style={{ width: "100%" }}>
|
|
463
472
|
<div style={{ height: 1, backgroundColor: T.fill.infoSubtle, marginBottom: L.collapseGap }} />
|
|
@@ -469,10 +478,10 @@ export function CollapseButton({ isSidebarCollapsed, onToggle, collapseIcon, exp
|
|
|
469
478
|
borderRadius: T.radius, backgroundColor: h ? T.fill.navHover : T.fill.navBase,
|
|
470
479
|
cursor: "pointer", transition: "background-color var(--motion-duration-3) var(--motion-easing-standard)", overflow: "hidden" }}>
|
|
471
480
|
|
|
472
|
-
{/* Slot.RowStart
|
|
481
|
+
{/* Slot.RowStart, 4px stripe column (structural, always present) */}
|
|
473
482
|
<div style={{ width: L.stripeW, alignSelf: "stretch", flexShrink: 0 }} />
|
|
474
483
|
|
|
475
|
-
{/* Container.Main
|
|
484
|
+
{/* Container.Main, label (hidden when collapsed) */}
|
|
476
485
|
<div style={{ flex: 1, paddingLeft: L.rowPadH,
|
|
477
486
|
maxWidth: isSidebarCollapsed ? 0 : 200,
|
|
478
487
|
opacity: isSidebarCollapsed ? 0 : 1,
|
|
@@ -486,7 +495,7 @@ export function CollapseButton({ isSidebarCollapsed, onToggle, collapseIcon, exp
|
|
|
486
495
|
</span>
|
|
487
496
|
</div>
|
|
488
497
|
|
|
489
|
-
{/* Slot.RowEnd
|
|
498
|
+
{/* Slot.RowEnd, Action Icon (right_panel_open / left_panel_open from Figma) */}
|
|
490
499
|
<div style={{ width: 40, height: L.iconWrap, display: "flex",
|
|
491
500
|
alignItems: "center", justifyContent: "center", flexShrink: 0,
|
|
492
501
|
marginLeft: isSidebarCollapsed ? "auto" : 0,
|
|
@@ -509,15 +518,15 @@ export function CollapseButton({ isSidebarCollapsed, onToggle, collapseIcon, exp
|
|
|
509
518
|
// Optional in-nav section heading. Figma: SideNav.SectionLabel (node 40006794:5975).
|
|
510
519
|
// Tokens: Label/Section/Small/Semibold (11px/600/16px/0.6px), Foreground/Static/Neutral/Base (#606060)
|
|
511
520
|
// Container: h-[40px], pl-[4px], pr-[4px], py-[8px]
|
|
512
|
-
// In collapsed rail: hidden
|
|
521
|
+
// In collapsed rail: hidden, replaced by a Divider (rendered by SideNav itself, see §2.3)
|
|
513
522
|
// ── NavHeader ────────────────────────────────────────────────────────────────
|
|
514
523
|
// Sits at the TOP of the SideNav. 48px row with the expand/collapse action icon
|
|
515
524
|
// in Slot.RowEnd (expanded) or centered (collapsed). Divider below.
|
|
516
525
|
// Matches Figma "Slot.NavHeader" (node 40007331:7794).
|
|
517
|
-
// Hidden on mobile (<768px)
|
|
526
|
+
// Hidden on mobile (<768px), TopNav hamburger is the sole toggle there.
|
|
518
527
|
export function NavHeader({ isSidebarCollapsed, onToggle, collapseIcon, expandIcon }) {
|
|
519
528
|
const [h, setH] = useState(false);
|
|
520
|
-
const actionIconColor = T.icon.actionSecondary; // var(--semantic-color-stroke-action-field-hover)
|
|
529
|
+
const actionIconColor = T.icon.actionSecondary; // var(--semantic-color-stroke-action-field-hover), always static
|
|
521
530
|
return (
|
|
522
531
|
<div style={{ width: "100%", flexShrink: 0 }}>
|
|
523
532
|
<div onClick={onToggle} onMouseEnter={() => setH(true)} onMouseLeave={() => setH(false)}
|
|
@@ -547,7 +556,7 @@ export function NavHeader({ isSidebarCollapsed, onToggle, collapseIcon, expandIc
|
|
|
547
556
|
</div>
|
|
548
557
|
)}
|
|
549
558
|
</div>
|
|
550
|
-
{/* Divider
|
|
559
|
+
{/* Divider, Stroke/Static/Neutral/Base, py-[2px] in Figma */}
|
|
551
560
|
<div style={{ padding: "2px 0" }}>
|
|
552
561
|
<div style={{ height: 1, backgroundColor: T.fill.infoSubtle }} />
|
|
553
562
|
</div>
|
|
@@ -571,7 +580,7 @@ export function NavSectionLabel({ label }) {
|
|
|
571
580
|
}
|
|
572
581
|
|
|
573
582
|
// ── BulletDot ────────────────────────────────────────────────────────────────
|
|
574
|
-
// 6px filled circle
|
|
583
|
+
// 6px filled circle, leading icon for SideNavListSection's ListItem.
|
|
575
584
|
// Color cycles Base / Hover / Active just like SideNavItem icons.
|
|
576
585
|
export function BulletDot({ color }) {
|
|
577
586
|
return (
|
|
@@ -618,7 +627,7 @@ export function ListItem({ item, isActive, onClick }) {
|
|
|
618
627
|
|
|
619
628
|
// ── SideNavListSection ───────────────────────────────────────────────────────
|
|
620
629
|
// Figma: SideNav.ListSection (node 40007332:8034). A labelled grouping of flat
|
|
621
|
-
// nav items
|
|
630
|
+
// nav items: no icons, no children, no expand/collapse. Used for contextual
|
|
622
631
|
// link lists (Recent Content, Pinned, Bookmarks). Only shown in expanded sidebar.
|
|
623
632
|
export function SideNavListSection({ label, items, activeId, onNavigate }) {
|
|
624
633
|
return (
|
|
@@ -727,7 +736,7 @@ export function SideNav({
|
|
|
727
736
|
anchorRect={popoverId === item.id ? popoverRect : null}
|
|
728
737
|
onPopoverEnter={onPopoverEnter} onPopoverLeave={onPopoverLeave}
|
|
729
738
|
activeId={activeId} />
|
|
730
|
-
{/* Level 1 children
|
|
739
|
+
{/* Level 1 children, animated accordion. grid-template-rows 0fr→1fr at
|
|
731
740
|
--motion-duration-5 + --motion-easing-accordion, with inner wrapper opacity
|
|
732
741
|
fade --motion-duration-4 (70ms delay on expand, no delay on collapse). */}
|
|
733
742
|
{hasChildren && !collapsed && (
|
|
@@ -767,12 +776,12 @@ export function SideNav({
|
|
|
767
776
|
paddingLeft: collapsed ? L.navColPadH : L.navPadH,
|
|
768
777
|
paddingRight: collapsed ? L.navColPadH : L.navPadH,
|
|
769
778
|
boxSizing: "border-box", flexShrink: 0,
|
|
770
|
-
// Smooth-spring curve
|
|
779
|
+
// Smooth-spring curve, soft personality, no overshoot.
|
|
771
780
|
transition: "width var(--motion-duration-6) var(--motion-easing-emphasized)",
|
|
772
781
|
borderRight: `0.5px solid ${T.fill.infoSubtle}`,
|
|
773
782
|
overflow: "hidden", // the inner menu scrolls; the nav itself does not
|
|
774
783
|
}}>
|
|
775
|
-
{/* NavHeader
|
|
784
|
+
{/* NavHeader, TOP of nav, PINNED (flexShrink:0) so it stays visible while the
|
|
776
785
|
item list scrolls beneath it. Hidden on mobile (<768px). */}
|
|
777
786
|
{(!hideCollapseButton || headerEnd) && (
|
|
778
787
|
<div style={{ flexShrink: 0 }}>
|
|
@@ -802,7 +811,7 @@ export function SideNav({
|
|
|
802
811
|
</div>
|
|
803
812
|
)}
|
|
804
813
|
|
|
805
|
-
{/* SideNavMenu
|
|
814
|
+
{/* SideNavMenu: the ONLY scroll region, wrapped in <Scrollable> so the custom
|
|
806
815
|
overlay scrollbar (identical on every OS, never affects layout/padding) handles
|
|
807
816
|
overflow. flex:1 + minHeight:0 lets it shrink below content height; the pinned
|
|
808
817
|
header above never moves. Applies in BOTH expanded (240px) and collapsed (72px) states. */}
|
|
@@ -810,7 +819,7 @@ export function SideNav({
|
|
|
810
819
|
style={{ flex: 1, minHeight: 0,
|
|
811
820
|
// Bleed the scroll region out to the nav's TRUE right edge so the overlay thumb
|
|
812
821
|
// hugs the edge in BOTH states (the nav's border-box paddingRight would otherwise
|
|
813
|
-
// inset the thumb by 16px expanded / 12px on the 72px rail
|
|
822
|
+
// inset the thumb by 16px expanded / 12px on the 72px rail, badly off on the rail).
|
|
814
823
|
// negated through calc() because these are var() references, and negating
|
|
815
824
|
// a string would produce NaN
|
|
816
825
|
marginRight: neg(collapsed ? L.navColPadH : L.navPadH) }}
|
|
@@ -818,11 +827,11 @@ export function SideNav({
|
|
|
818
827
|
paddingTop: L.menuPadT,
|
|
819
828
|
// Re-add the content's right inset INSIDE the scroll view so items keep their
|
|
820
829
|
// position; only the thumb moves to the edge. (Spec rule: padding on viewStyle,
|
|
821
|
-
// never on the wrapper
|
|
830
|
+
// never on the wrapper, keeps the thumb flush on any scroll surface.)
|
|
822
831
|
paddingRight: collapsed ? L.navColPadH : L.navPadH }}
|
|
823
832
|
>
|
|
824
833
|
|
|
825
|
-
{/* Sectioned render
|
|
834
|
+
{/* Sectioned render: when `sections` prop is provided */}
|
|
826
835
|
{sections && sections.map(({ section, items: secItems }, sIdx) => (
|
|
827
836
|
<div key={section} style={{ display: "flex", flexDirection: "column",
|
|
828
837
|
gap: L.menuGap, flexShrink: 0 }}>
|
|
@@ -846,10 +855,10 @@ export function SideNav({
|
|
|
846
855
|
</div>
|
|
847
856
|
))}
|
|
848
857
|
|
|
849
|
-
{/* Flat render
|
|
858
|
+
{/* Flat render: when only `items` is provided (backward compatibility) */}
|
|
850
859
|
{!sections && (items || []).map(renderItem)}
|
|
851
860
|
|
|
852
|
-
{/* SideNavListSection
|
|
861
|
+
{/* SideNavListSection, optional. Hidden in collapsed rail. */}
|
|
853
862
|
{listSection && (
|
|
854
863
|
<div style={{ opacity: collapsed ? 0 : 1,
|
|
855
864
|
maxHeight: collapsed ? 0 : 400, overflow: "hidden",
|
|
@@ -859,16 +868,16 @@ export function SideNav({
|
|
|
859
868
|
</div>
|
|
860
869
|
)}
|
|
861
870
|
|
|
862
|
-
{/* Body slot
|
|
871
|
+
{/* Body slot, scrolls with the item list, so it sits INSIDE
|
|
863
872
|
Scrollable and above the spacer. Use this for content that belongs
|
|
864
873
|
with the items; use `footer` for anything that must stay visible. */}
|
|
865
874
|
{children && <div style={{ flexShrink: 0 }}>{children}</div>}
|
|
866
875
|
|
|
867
|
-
{/* Bottom spacer
|
|
876
|
+
{/* Bottom spacer, fills remaining height */}
|
|
868
877
|
<div style={{ flex: 1, minHeight: L.menuPadB }} />
|
|
869
878
|
</Scrollable>
|
|
870
879
|
|
|
871
|
-
{/* Footer slot
|
|
880
|
+
{/* Footer slot, OUTSIDE Scrollable and flexShrink:0, so it is pinned to
|
|
872
881
|
the bottom of the nav and stays put while the list scrolls. The
|
|
873
882
|
divider only appears when the slot has content, so a nav without a
|
|
874
883
|
footer is unchanged. Padding drops to the rail's narrower inset when
|
|
@@ -906,7 +915,7 @@ function ChevUp({ size = 10, color }) {
|
|
|
906
915
|
|
|
907
916
|
// ─── Collapse / Expand action icons (fetched from Figma 2026-05-12) ──────────
|
|
908
917
|
//
|
|
909
|
-
// PINNED 2026-09-07
|
|
918
|
+
// PINNED 2026-09-07: DO NOT RE-SYNC THESE TWO FROM FIGMA.
|
|
910
919
|
//
|
|
911
920
|
// The Figma SideBar Expand/Collapse component was changed after this date to a
|
|
912
921
|
// different icon. Jo has explicitly rejected that change for the repo, for
|
|
@@ -919,7 +928,7 @@ function ChevUp({ size = 10, color }) {
|
|
|
919
928
|
// by pulling Figma, and do not silently re-fetch node 40006793:3783. Ask first
|
|
920
929
|
// if you think it should change.
|
|
921
930
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
922
|
-
// right_panel_open
|
|
931
|
+
// right_panel_open, used on the collapse button when sidebar is EXPANDED (click to collapse)
|
|
923
932
|
// Token: Foreground/Action/Secondary/Rest (#6b6b6b)
|
|
924
933
|
// Figma component: SideBar Expand/Collapse, Type=Collapse, node 40006793:3783
|
|
925
934
|
function RightPanelOpenIcon({ size = 12, color = T.icon.actionSecondary }) {
|
|
@@ -930,7 +939,7 @@ function RightPanelOpenIcon({ size = 12, color = T.icon.actionSecondary }) {
|
|
|
930
939
|
);
|
|
931
940
|
}
|
|
932
941
|
|
|
933
|
-
// left_panel_open
|
|
942
|
+
// left_panel_open, used on the collapse button when sidebar is COLLAPSED (click to expand)
|
|
934
943
|
// Token: Foreground/Action/Secondary/Rest (#6b6b6b)
|
|
935
944
|
// Figma component: SideBar Expand/Collapse, Type=Expand, node 40006793:3783
|
|
936
945
|
function LeftPanelOpenIcon({ size = 12, color = T.icon.actionSecondary }) {
|
package/dist/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
NewCo brand layer
|
|
2
|
+
NewCo brand layer, single entry point. Load AFTER the Pathway index and set data-brand="newco".
|
|
3
3
|
@imports every token file in load order (primitives first, so the themes that
|
|
4
|
-
reference it resolve). Generated
|
|
4
|
+
reference it resolve). Generated: do not edit. Run `npm run build-dist`.
|
|
5
5
|
*/
|
|
6
6
|
@import "./primitives.css";
|
|
7
7
|
@import "./themes/light.css";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* contextual-layout-units
|
|
2
|
+
* contextual-layout-units: one name per token, breakpoint resolved by media query.
|
|
3
3
|
* Generated by style-dictionary.config.js. Do not edit.
|
|
4
4
|
*
|
|
5
5
|
* [data-brand="newco"] is the desktop value. Narrower breakpoints override only what differs.
|
|
@@ -39,4 +39,7 @@
|
|
|
39
39
|
--contextual-layout-units-sidenav-width-collapsed: 84px;
|
|
40
40
|
--contextual-layout-units-sidenav-width-expanded: 256px;
|
|
41
41
|
--contextual-layout-units-topnav-height: 60px;
|
|
42
|
+
--contextual-layout-units-widget-minwidth-detail: 0px;
|
|
43
|
+
--contextual-layout-units-widget-minwidth-explore: 0px;
|
|
44
|
+
--contextual-layout-units-widget-minwidth-glance: 0px;
|
|
42
45
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Do not edit directly, this file was auto-generated.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
[data-brand="newco"][data-theme="dark"], [data-brand="newco"][data-theme="midnight"] {
|
|
5
|
+
[data-brand="newco"][data-theme="dark"], [data-brand="newco"][data-theme="midnight"], [data-theme="newco-dark"] {
|
|
6
6
|
--semantic-color-fill-action-disabled: var(--primitive-color-warm-neutral-350-8);
|
|
7
7
|
--semantic-color-fill-action-ghost-hover: var(--primitive-color-midnight-350-8);
|
|
8
8
|
--semantic-color-fill-action-ghost-pressed: var(--primitive-color-midnight-900-36);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Do not edit directly, this file was auto-generated.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
[data-brand="newco"], [data-brand="newco"][data-theme="light"] {
|
|
5
|
+
[data-brand="newco"], [data-brand="newco"][data-theme="light"], [data-theme="newco-light"] {
|
|
6
6
|
--semantic-color-fill-action-disabled: var(--primitive-color-warm-neutral-350-4);
|
|
7
7
|
--semantic-color-fill-action-ghost-hover: var(--primitive-color-brand-400-24);
|
|
8
8
|
--semantic-color-fill-action-ghost-pressed: var(--primitive-color-brand-400-50);
|
|
@@ -373,6 +373,39 @@ const tokens = {
|
|
|
373
373
|
"height"
|
|
374
374
|
]
|
|
375
375
|
},
|
|
376
|
+
"contextual-layout-units-widget-minwidth-detail": {
|
|
377
|
+
"value": 0,
|
|
378
|
+
"type": "number",
|
|
379
|
+
"path": [
|
|
380
|
+
"contextual-layout-units",
|
|
381
|
+
"newco",
|
|
382
|
+
"widget",
|
|
383
|
+
"minwidth",
|
|
384
|
+
"detail"
|
|
385
|
+
]
|
|
386
|
+
},
|
|
387
|
+
"contextual-layout-units-widget-minwidth-explore": {
|
|
388
|
+
"value": 0,
|
|
389
|
+
"type": "number",
|
|
390
|
+
"path": [
|
|
391
|
+
"contextual-layout-units",
|
|
392
|
+
"newco",
|
|
393
|
+
"widget",
|
|
394
|
+
"minwidth",
|
|
395
|
+
"explore"
|
|
396
|
+
]
|
|
397
|
+
},
|
|
398
|
+
"contextual-layout-units-widget-minwidth-glance": {
|
|
399
|
+
"value": 0,
|
|
400
|
+
"type": "number",
|
|
401
|
+
"path": [
|
|
402
|
+
"contextual-layout-units",
|
|
403
|
+
"newco",
|
|
404
|
+
"widget",
|
|
405
|
+
"minwidth",
|
|
406
|
+
"glance"
|
|
407
|
+
]
|
|
408
|
+
},
|
|
376
409
|
"primitive-color-amethyst-0": {
|
|
377
410
|
"value": "#faf9fc",
|
|
378
411
|
"type": "color",
|
|
@@ -4214,7 +4247,7 @@ const tokens = {
|
|
|
4214
4247
|
]
|
|
4215
4248
|
},
|
|
4216
4249
|
"primitive-color-seabreeze-300-70": {
|
|
4217
|
-
"value": "#
|
|
4250
|
+
"value": "#8598d7b3",
|
|
4218
4251
|
"type": "color",
|
|
4219
4252
|
"path": [
|
|
4220
4253
|
"primitive-color",
|
package/dist/breakpoints.css
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, CONTRACT
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
The breakpoint values. Name these freely.
|
|
7
7
|
|
|
8
8
|
Declares 5 custom properties.
|
|
9
|
-
Generated
|
|
9
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
10
10
|
==========================================================================
|
|
11
11
|
*/
|
|
12
12
|
:root {
|
package/dist/contract.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "The names a consumer may use. Generated from the emitted CSS by scripts/build-contract.js, do not hand-edit. Lint against `contract` if you want the boundary enforced; nothing here blocks a primitive.",
|
|
3
|
-
"version": "11.
|
|
4
|
-
"generated": "2026-10-
|
|
3
|
+
"version": "11.3.0",
|
|
4
|
+
"generated": "2026-10-20",
|
|
5
5
|
"counts": {
|
|
6
6
|
"contract": 360,
|
|
7
7
|
"infrastructure": 585,
|
package/dist/index.css
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*
|
|
2
|
-
Pathway design tokens
|
|
2
|
+
Pathway design tokens, single entry point.
|
|
3
3
|
@imports every token file in load order (primitives first, so the themes that
|
|
4
|
-
reference it resolve). Generated
|
|
4
|
+
reference it resolve). Generated: do not edit. Run `npm run build-dist`.
|
|
5
5
|
*/
|
|
6
6
|
@import "./primitives.css";
|
|
7
7
|
@import "./themes/light.css";
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, COMPONENT INTERNALS
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
Per-component metrics (Button, Card, NavItem, Page, focus ring).
|
|
7
7
|
|
|
8
|
-
This repo's own components use these. Product code generally should not
|
|
8
|
+
This repo's own components use these. Product code generally should not
|
|
9
9
|
prefer layout.css, which is the general spacing contract. These exist so a
|
|
10
10
|
component's geometry can be tuned without moving the whole scale.
|
|
11
11
|
|
|
12
12
|
Declares 37 custom properties.
|
|
13
|
-
Generated
|
|
13
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
14
14
|
==========================================================================
|
|
15
15
|
*/
|
|
16
16
|
:root {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, CONTRACT
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
The only layout tokens that change by breakpoint. Name these freely.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
columns; it says nothing about the chrome's padding.
|
|
16
16
|
|
|
17
17
|
Declares 23 custom properties.
|
|
18
|
-
Generated
|
|
18
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
19
19
|
==========================================================================
|
|
20
20
|
*/
|
|
21
21
|
:root {
|
package/dist/layout.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, CONTRACT
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
Spacing, radii and border widths. Name these freely.
|
|
7
7
|
|
|
8
|
-
Values already carry their unit, so use them directly
|
|
8
|
+
Values already carry their unit, so use them directly: do NOT wrap in
|
|
9
9
|
calc(... * 1px). That produces calc(4px * 1px), which is not a length, so
|
|
10
10
|
the browser silently drops the declaration.
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
putting the breakpoint in the property name, so one name works responsively.
|
|
14
14
|
|
|
15
15
|
Declares 76 custom properties.
|
|
16
|
-
Generated
|
|
16
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
17
17
|
==========================================================================
|
|
18
18
|
*/
|
|
19
19
|
:root {
|
package/dist/motion.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, CONTRACT
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
Durations and easings. Name these freely.
|
|
7
7
|
|
|
8
|
-
These are NOT in the Figma Variables panel
|
|
8
|
+
These are NOT in the Figma Variables panel: the panel has zero motion
|
|
9
9
|
variables. Their source of truth is docs/design-system-spec.md §2, and
|
|
10
10
|
scripts/sync-motion-tokens.js generates this file from it.
|
|
11
11
|
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
alone gets no motion at all, and no warning. Consume the package.
|
|
14
14
|
|
|
15
15
|
Declares 21 custom properties.
|
|
16
|
-
Generated
|
|
16
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
17
17
|
==========================================================================
|
|
18
18
|
*/
|
|
19
19
|
:root {
|
|
20
20
|
--motion-duration-1: 100ms; /** Instant tap feedback, tiny opacity flickers */
|
|
21
|
-
--motion-duration-2: 150ms; /** Hover fills, small opacity fades, colour transitions
|
|
21
|
+
--motion-duration-2: 150ms; /** Hover fills, small opacity fades, colour transitions: the most common micro-interaction timing */
|
|
22
22
|
--motion-duration-3: 200ms; /** Micro-interactions needing slightly more presence; small reveals, focus rings */
|
|
23
23
|
--motion-duration-4: 300ms; /** Chevron / disclosure rotation, dropdown & popover content, in-component state */
|
|
24
24
|
--motion-duration-5: 380ms; /** Panel state changes: accordions, expand/collapse, item enter/exit */
|
|
@@ -26,16 +26,16 @@
|
|
|
26
26
|
--motion-duration-7: 680ms; /** Cross-component transitions: page content sliding, large layout shifts */
|
|
27
27
|
--motion-duration-8: 1100ms; /** Slowest transition step: very large layout shifts, deliberate full-screen moves */
|
|
28
28
|
--motion-duration-loop: 1000ms; /** Standard continuous-loop period (standalone Spinner, skeleton shimmer) */
|
|
29
|
-
--motion-duration-loop-fast: 750ms; /** Tighter loop for embedded/inline contexts (in-button spinner
|
|
29
|
+
--motion-duration-loop-fast: 750ms; /** Tighter loop for embedded/inline contexts (in-button spinner, faster reads as more responsive feedback) */
|
|
30
30
|
--motion-easing-breath: cubic-bezier(0.37, 0, 0.63, 1);
|
|
31
31
|
--motion-easing-burst: cubic-bezier(0.30, 0, 0.5, 1.18);
|
|
32
|
-
--motion-easing-decelerate: cubic-bezier(0, 0, 0.2, 1); /** Enters where the element should glide in smoothly
|
|
32
|
+
--motion-easing-decelerate: cubic-bezier(0, 0, 0.2, 1); /** Enters where the element should glide in smoothly: overlay panels, popovers, anything appearing from outside. Pure ease-out, no bounce. */
|
|
33
33
|
--motion-easing-emphasized: cubic-bezier(0.32, 0.72, 0, 1); /** Large physical-scale transitions: full-panel width changes, SideNav width. Smooth glide, no overshoot. */
|
|
34
34
|
--motion-easing-inout: cubic-bezier(0.62, 0.02, 0.23, 1);
|
|
35
|
-
--motion-easing-spring: cubic-bezier(0.34, 1.04, 0.64, 1); /** Signature Pathway curve. Interactive element entrances: dropdown/popover panel opens. A whisper of overshoot (y2=1.04)
|
|
35
|
+
--motion-easing-spring: cubic-bezier(0.34, 1.04, 0.64, 1); /** Signature Pathway curve. Interactive element entrances: dropdown/popover panel opens. A whisper of overshoot (y2=1.04), easeful, only *ever so slightly* alive. Softened 2026-06-08 from 1.08, which read as too bouncy. Not for chevrons, see chevron rule below. */
|
|
36
36
|
--motion-easing-spring-soft: cubic-bezier(0.30, 1.05, 0.40, 1);
|
|
37
|
-
--motion-easing-standard: cubic-bezier(0.4, 0, 0.2, 1); /** Most transitions
|
|
38
|
-
--motion-easing-accelerate: cubic-bezier(0.4, 0, 1, 1); /** Exits where the element leaves cleanly
|
|
39
|
-
--motion-easing-accordion: cubic-bezier(0.33, 1.03, 0.68, 1); /** Accordion settle
|
|
37
|
+
--motion-easing-standard: cubic-bezier(0.4, 0, 0.2, 1); /** Most transitions, enters AND exits. Smooth, no overshoot. Default for colour, fill, opacity, focus rings. */
|
|
38
|
+
--motion-easing-accelerate: cubic-bezier(0.4, 0, 1, 1); /** Exits where the element leaves cleanly, dismissing overlays, scaling down. */
|
|
39
|
+
--motion-easing-accordion: cubic-bezier(0.33, 1.03, 0.68, 1); /** Accordion settle, content reveal/hide, chevron rotation. The gentlest overshoot in the system (y2=1.03). Softened 2026-06-08 from 0.22,1.12,0.36,1, which was visibly bouncy. */
|
|
40
40
|
--motion-easing-linear: cubic-bezier(0, 0, 1, 1); /** Continuous loops only (spinners, shimmer). Never for bounded transitions. */
|
|
41
41
|
}
|
package/dist/primitives.css
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/*
|
|
2
2
|
==========================================================================
|
|
3
|
-
PATHWAY DESIGN TOKENS
|
|
3
|
+
PATHWAY DESIGN TOKENS, INFRASTRUCTURE
|
|
4
4
|
==========================================================================
|
|
5
5
|
|
|
6
6
|
The raw colour ramps. NOT part of the token contract.
|
|
7
7
|
|
|
8
|
-
You must LOAD this file
|
|
8
|
+
You must LOAD this file: every semantic token resolves through it, so
|
|
9
9
|
without it all colour resolves to nothing and the page renders unstyled
|
|
10
10
|
with no console error. But product code should not NAME these.
|
|
11
11
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
Nothing blocks you. It is an escape hatch with a stated cost.
|
|
20
20
|
|
|
21
21
|
Declares 548 custom properties.
|
|
22
|
-
Generated
|
|
22
|
+
Generated: do not edit. Run `npm run build-tokens`.
|
|
23
23
|
==========================================================================
|
|
24
24
|
*/
|
|
25
25
|
:root {
|