@charcuterie/ui 3.27.0 → 3.28.1
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/Board/BoardCard.d.ts +2 -2
- package/dist/Board/BoardCard.d.ts.map +1 -1
- package/dist/Board/BoardCard.js +1 -1
- package/dist/Board/BoardCard.js.map +1 -1
- package/dist/Main/Main.js +1 -1
- package/dist/Main/Main.js.map +1 -1
- package/dist/Rail/Rail.js +1 -1
- package/dist/Rail/Rail.js.map +1 -1
- package/dist/Shell/Shell.js +1 -1
- package/dist/Shell/Shell.js.map +1 -1
- package/dist/Stepper/Stepper.d.ts +10 -1
- package/dist/Stepper/Stepper.d.ts.map +1 -1
- package/dist/Stepper/Stepper.js +25 -5
- package/dist/Stepper/Stepper.js.map +1 -1
- package/package.json +1 -1
- package/src/Board/Board.test.tsx +18 -0
- package/src/Board/BoardCard.tsx +9 -7
- package/src/Main/Main.tsx +1 -1
- package/src/Rail/Rail.tsx +1 -1
- package/src/Shell/Shell.mdx +8 -0
- package/src/Shell/Shell.stories.tsx +24 -0
- package/src/Shell/Shell.test.tsx +29 -0
- package/src/Shell/Shell.tsx +1 -1
- package/src/Stepper/Stepper.stories.tsx +27 -0
- package/src/Stepper/Stepper.test.tsx +17 -2
- package/src/Stepper/Stepper.tsx +51 -8
|
@@ -119,8 +119,8 @@ type BoardItemTitleLink = {
|
|
|
119
119
|
href?: never;
|
|
120
120
|
onSelect?: never;
|
|
121
121
|
/**
|
|
122
|
-
* Drawn instead of `title`, inside the card's own
|
|
123
|
-
* — so it
|
|
122
|
+
* Drawn instead of `title`, inside the card's own two-line
|
|
123
|
+
* clamping box — so it wraps the way every other card does.
|
|
124
124
|
*
|
|
125
125
|
* It **owns its navigation**: the board adds no link around it,
|
|
126
126
|
* which is why `href` and `onSelect` are refused beside it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BoardCard.d.ts","sourceRoot":"","sources":["../../src/Board/BoardCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAS/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD,KAAK,eAAe,GAAG;IACrB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,KAAK,eAAe,GAChB;IAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,UAAU,CAAA;CAAE,GACjD;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,kBAAkB,GACnB;IACE,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,YAAY,CAAC,EAAE,KAAK,CAAA;CACrB,GACD;IACE,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB;;;;;;;;OAQG;IACH,YAAY,EAAE,SAAS,CAAA;CACxB,CAAA;AAEL,MAAM,MAAM,SAAS,GAAG,eAAe,GACrC,eAAe,GACf,kBAAkB,CAAA;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,0DAA0D;IAC1D,WAAW,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACtD,8DAA8D;IAC9D,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,WAAW,GAAG,OAAO,CAAA;QACpC,SAAS,EAAE,MAAM,CAAA;KAClB,KAAK,IAAI,CAAA;CACX,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,eAAO,MAAM,SAAS,GAAI,kFAQvB,cAAc,KAAG,
|
|
1
|
+
{"version":3,"file":"BoardCard.d.ts","sourceRoot":"","sources":["../../src/Board/BoardCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAS/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD,KAAK,eAAe,GAAG;IACrB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;IACX;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB;;;;;;;OAOG;IACH,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,KAAK,eAAe,GAChB;IAAE,UAAU,CAAC,EAAE,KAAK,CAAC;IAAC,YAAY,CAAC,EAAE,UAAU,CAAA;CAAE,GACjD;IAAE,UAAU,EAAE,cAAc,CAAC;IAAC,YAAY,CAAC,EAAE,KAAK,CAAA;CAAE,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,kBAAkB,GACnB;IACE,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,YAAY,CAAC,EAAE,KAAK,CAAA;CACrB,GACD;IACE,IAAI,CAAC,EAAE,KAAK,CAAA;IACZ,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB;;;;;;;;OAQG;IACH,YAAY,EAAE,SAAS,CAAA;CACxB,CAAA;AAEL,MAAM,MAAM,SAAS,GAAG,eAAe,GACrC,eAAe,GACf,kBAAkB,CAAA;AAEpB,MAAM,MAAM,cAAc,GAAG;IAC3B;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,0DAA0D;IAC1D,WAAW,EAAE,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACtD,8DAA8D;IAC9D,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,WAAW,GAAG,OAAO,CAAA;QACpC,SAAS,EAAE,MAAM,CAAA;KAClB,KAAK,IAAI,CAAA;CACX,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,eAAO,MAAM,SAAS,GAAI,kFAQvB,cAAc,KAAG,SAoQnB,CAAA"}
|
package/dist/Board/BoardCard.js
CHANGED
|
@@ -103,7 +103,7 @@ export const BoardCard = ({ isInGrid, item, laneLabel, moveIcon, moveTargets, on
|
|
|
103
103
|
...(item.menuItems ?? []),
|
|
104
104
|
];
|
|
105
105
|
const menuLabel = isMovable ? "Move" : "More";
|
|
106
|
-
const titleBlock = (_jsx("span", { className: "line-clamp-2
|
|
106
|
+
const titleBlock = (_jsx("span", { className: "line-clamp-2 wrap-anywhere", children: item.titleContent ?? item.title }));
|
|
107
107
|
return (_jsxs("li", { className: toClassName("group relative flex gap-2 border-border-subtle border-b py-2 pe-1 last:border-b-0", isInGrid && "@container",
|
|
108
108
|
// At `cq-lg` the list stops being a list of rows: the
|
|
109
109
|
// divider goes and each card grows its own box. The *list*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BoardCard.js","sourceRoot":"","sources":["../../src/Board/BoardCard.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAsB,CAAA;AAE7C,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EACL,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAkB,CAAA;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAA0B,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAsC,CAAA;AAwKrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EACxB,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,WAAW,GACI,EAAa,EAAE;IAC9B,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,MAAM,SAAS,GACb,YAAY,IAAI,IAAI,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;IAChD,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;IACtD,MAAM,OAAO,GACX,YAAY,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,CAAA;IACrD,MAAM,SAAS,GAAuB;QACpC,GAAG,CAAC,SAAS;YACX,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,GAAG,EAAE;oBACb,YAAY,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC5B,CAAC;aACF,CAAC,CAAC;YACL,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,YAAY,IAAI,SAAS;YAC3B,CAAC,CAAC;gBACE;oBACE,GAAG,EAAE,qBAAqB;oBAC1B,IAAI,EAAE,WAAoB;iBAC3B;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;KAC1B,CAAA;IAED,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAE7C,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"BoardCard.js","sourceRoot":"","sources":["../../src/Board/BoardCard.tsx"],"names":[],"mappings":"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"}
|
package/dist/Main/Main.js
CHANGED
|
@@ -118,6 +118,6 @@ export const Main = ({ children, className, contentWidth, id, ...mainProps }) =>
|
|
|
118
118
|
const maxInlineSize = toMaxInlineSize(contentWidth ??
|
|
119
119
|
shell?.contentWidth ??
|
|
120
120
|
DEFAULT_CONTENT_WIDTH);
|
|
121
|
-
return (_jsx("main", { ...mainProps, className: toClassName("col-start-1 row-start-3 min-w-0 md:col-start-2 md:row-start-2", className), id: id ?? shell?.mainId ?? fallbackId, tabIndex: -1, children: _jsx("div", { className: "@container mx-auto flex w-full min-w-0 flex-col gap-6 wrap-anywhere px-4 py-6 sm:px-6", style: { maxInlineSize }, children: children }) }));
|
|
121
|
+
return (_jsx("main", { ...mainProps, className: toClassName("charcuterie-scrollbar col-start-1 row-start-3 min-h-0 min-w-0 overflow-y-auto md:col-start-2 md:row-start-2", className), id: id ?? shell?.mainId ?? fallbackId, tabIndex: -1, children: _jsx("div", { className: "@container mx-auto flex w-full min-w-0 flex-col gap-6 wrap-anywhere px-4 py-6 sm:px-6", style: { maxInlineSize }, children: children }) }));
|
|
122
122
|
};
|
|
123
123
|
//# sourceMappingURL=Main.js.map
|
package/dist/Main/Main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAA;AAEd,OAAO,EAEL,qBAAqB,EACrB,eAAe,GAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAM/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,EAAE,EACF,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAEtC,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,UAAU,GAAG,WAAW,EAAE,CAAA;IAEhC,MAAM,aAAa,GAAG,eAAe,CACnC,YAAY;QACV,KAAK,EAAE,YAAY;QACnB,qBAAqB,CACxB,CAAA;IAED,OAAO,CACL,kBACM,SAAS,EACb,SAAS,EAAE,WAAW,CACpB
|
|
1
|
+
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAGL,UAAU,GACX,MAAM,OAAO,CAAA;AAEd,OAAO,EAEL,qBAAqB,EACrB,eAAe,GAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAM/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyGG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,EAAE,EACF,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IAEtC,iEAAiE;IACjE,2DAA2D;IAC3D,MAAM,UAAU,GAAG,WAAW,EAAE,CAAA;IAEhC,MAAM,aAAa,GAAG,eAAe,CACnC,YAAY;QACV,KAAK,EAAE,YAAY;QACnB,qBAAqB,CACxB,CAAA;IAED,OAAO,CACL,kBACM,SAAS,EACb,SAAS,EAAE,WAAW,CACpB,6GAA6G,EAC7G,SAAS,CACV,EACD,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI,UAAU,EACrC,QAAQ,EAAE,CAAC,CAAC,YAaZ,cACE,SAAS,EAAC,uFAAuF,EACjG,KAAK,EAAE,EAAE,aAAa,EAAE,YAEvB,QAAQ,GACL,GACD,CACR,CAAA;AACH,CAAC,CAAA"}
|
package/dist/Rail/Rail.js
CHANGED
|
@@ -57,7 +57,7 @@ const LANDMARK_ELEMENT = {
|
|
|
57
57
|
*/
|
|
58
58
|
export const Rail = ({ children, className, label, landmark = "complementary", side = "start", ...railProps }) => {
|
|
59
59
|
const Element = LANDMARK_ELEMENT[landmark];
|
|
60
|
-
return (_jsx(Element, { ...railProps, "aria-label": label, className: toClassName("flex min-w-0 gap-2 overflow-x-auto border-border-subtle p-4 md:row-start-2 md:w-64 md:flex-col md:overflow-x-visible", side === "start"
|
|
60
|
+
return (_jsx(Element, { ...railProps, "aria-label": label, className: toClassName("flex min-w-0 gap-2 overflow-x-auto border-border-subtle p-4 md:row-start-2 md:min-h-0 md:w-64 md:flex-col md:overflow-x-visible", side === "start"
|
|
61
61
|
? "row-start-2 border-b md:col-start-1 md:border-b-0 md:border-e"
|
|
62
62
|
: "row-start-4 border-t md:col-start-3 md:border-t-0 md:border-s", className), children: children }));
|
|
63
63
|
};
|
package/dist/Rail/Rail.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rail.js","sourceRoot":"","sources":["../../src/Rail/Rail.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAY/C,MAAM,gBAAgB,GAGlB;IACF,aAAa,EAAE,OAAO;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,QAAQ,GAAG,eAAe,EAC1B,IAAI,GAAG,OAAO,EACd,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAE1C,OAAO,CACL,KAAC,OAAO,OACF,SAAS,gBACD,KAAK,EACjB,SAAS,EAAE,WAAW,CACpB,
|
|
1
|
+
{"version":3,"file":"Rail.js","sourceRoot":"","sources":["../../src/Rail/Rail.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAY/C,MAAM,gBAAgB,GAGlB;IACF,aAAa,EAAE,OAAO;IACtB,UAAU,EAAE,KAAK;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,QAAQ,GAAG,eAAe,EAC1B,IAAI,GAAG,OAAO,EACd,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAE1C,OAAO,CACL,KAAC,OAAO,OACF,SAAS,gBACD,KAAK,EACjB,SAAS,EAAE,WAAW,CACpB,iIAAiI,EACjI,IAAI,KAAK,OAAO;YACd,CAAC,CAAC,+DAA+D;YACjE,CAAC,CAAC,+DAA+D,EACnE,SAAS,CACV,YAEA,QAAQ,GACD,CACX,CAAA;AACH,CAAC,CAAA"}
|
package/dist/Shell/Shell.js
CHANGED
|
@@ -111,6 +111,6 @@ import { ShellContext } from "./shellContext.js";
|
|
|
111
111
|
export const Shell = ({ children, className, contentWidth = DEFAULT_CONTENT_WIDTH, skipLinkLabel = "Skip to main content", ...divProps }) => {
|
|
112
112
|
const mainId = useUniqueId();
|
|
113
113
|
const shellContext = useMemo(() => ({ contentWidth, mainId }), [contentWidth, mainId]);
|
|
114
|
-
return (_jsx(ShellContext.Provider, { value: shellContext, children: _jsxs("div", { ...divProps, className: toClassName("relative grid
|
|
114
|
+
return (_jsx(ShellContext.Provider, { value: shellContext, children: _jsxs("div", { ...divProps, className: toClassName("relative grid h-dvh grid-cols-1 grid-rows-[auto_auto_minmax(0,1fr)_auto] overflow-x-clip bg-surface-base text-content-primary md:grid-cols-[auto_minmax(0,1fr)_auto] md:grid-rows-[auto_minmax(0,1fr)]", className), children: [_jsx("a", { className: "fixed top-0 start-0 z-[var(--layer-toast)] m-3 -translate-y-24 rounded-md border border-border-subtle bg-surface-raised px-3 py-2 font-medium text-content-primary text-sm shadow-medium focus-visible:translate-y-0", href: `#${mainId}`, children: skipLinkLabel }), children] }) }));
|
|
115
115
|
};
|
|
116
116
|
//# sourceMappingURL=Shell.js.map
|
package/dist/Shell/Shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Shell.js","sourceRoot":"","sources":["../../src/Shell/Shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAGL,OAAO,GACR,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAEL,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAOhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,YAAY,GAAG,qBAAqB,EACpC,aAAa,GAAG,sBAAsB,EACtC,GAAG,QAAQ,EACA,EAAa,EAAE;IAC1B,MAAM,MAAM,GAAG,WAAW,EAAE,CAAA;IAE5B,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAChC,CAAC,YAAY,EAAE,MAAM,CAAC,CACvB,CAAA;IAED,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACxC,kBACM,QAAQ,EACZ,SAAS,EAAE,WAAW,CACpB,
|
|
1
|
+
{"version":3,"file":"Shell.js","sourceRoot":"","sources":["../../src/Shell/Shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAGL,OAAO,GACR,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAEL,qBAAqB,GACtB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAOhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,YAAY,GAAG,qBAAqB,EACpC,aAAa,GAAG,sBAAsB,EACtC,GAAG,QAAQ,EACA,EAAa,EAAE;IAC1B,MAAM,MAAM,GAAG,WAAW,EAAE,CAAA;IAE5B,MAAM,YAAY,GAAG,OAAO,CAC1B,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAChC,CAAC,YAAY,EAAE,MAAM,CAAC,CACvB,CAAA;IAED,OAAO,CACL,KAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACxC,kBACM,QAAQ,EACZ,SAAS,EAAE,WAAW,CACpB,wMAAwM,EACxM,SAAS,CACV,aAcD,YACE,SAAS,EAAC,sNAAsN,EAChO,IAAI,EAAE,IAAI,MAAM,EAAE,YAEjB,aAAa,GACZ,EAEH,QAAQ,IACL,GACgB,CACzB,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -31,6 +31,8 @@ export type Step = {
|
|
|
31
31
|
};
|
|
32
32
|
export type StepperOrientation = "horizontal" | "vertical";
|
|
33
33
|
export type StepperProps = {
|
|
34
|
+
/** `compact` is the dot-and-line ladder for short status labels in cards. */
|
|
35
|
+
readonly appearance?: "default" | "compact";
|
|
34
36
|
readonly className?: string;
|
|
35
37
|
/**
|
|
36
38
|
* What level the step labels are. The caller's, because only the
|
|
@@ -43,6 +45,13 @@ export type StepperProps = {
|
|
|
43
45
|
/** The list's accessible name. Required — an unnamed sequence of
|
|
44
46
|
* numbers is a sequence of numbers. */
|
|
45
47
|
readonly label: string;
|
|
48
|
+
/**
|
|
49
|
+
* Whether a requested horizontal sequence collapses below `cq-md`.
|
|
50
|
+
* Keep this on for prose-sized steps. Turn it off only when the
|
|
51
|
+
* caller supplies short labels that are designed to remain a compact
|
|
52
|
+
* ladder inside a card.
|
|
53
|
+
*/
|
|
54
|
+
readonly isResponsive?: boolean;
|
|
46
55
|
/**
|
|
47
56
|
* `horizontal` is a REQUEST, not a promise: it collapses to
|
|
48
57
|
* vertical below `cq-md`, because four steps side by side in a
|
|
@@ -85,5 +94,5 @@ export type StepperProps = {
|
|
|
85
94
|
* step drawing a connector into empty space, which is a
|
|
86
95
|
* `:not(:last-child)` selector nobody remembers to write.
|
|
87
96
|
*/
|
|
88
|
-
export declare const Stepper: ({ className, headingLevel, label, orientation, steps, }: StepperProps) => import("react").JSX.Element;
|
|
97
|
+
export declare const Stepper: ({ appearance, className, headingLevel, isResponsive, label, orientation, steps, }: StepperProps) => import("react").JSX.Element;
|
|
89
98
|
//# sourceMappingURL=Stepper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.d.ts","sourceRoot":"","sources":["../../src/Stepper/Stepper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,MAAM,GACN,UAAU,CAAA;AAEd,MAAM,MAAM,IAAI,GAAG;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB;uCACmC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAA;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrC;2CACuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,OAAO,GAAI,
|
|
1
|
+
{"version":3,"file":"Stepper.d.ts","sourceRoot":"","sources":["../../src/Stepper/Stepper.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC;;;;;;;;;GASG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,MAAM,GACN,UAAU,CAAA;AAEd,MAAM,MAAM,IAAI,GAAG;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB;uCACmC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAA;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,GAAG,SAAS,CAAA;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrC;2CACuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAA;CAChC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,OAAO,GAAI,mFAQrB,YAAY,gCAuKd,CAAA"}
|
package/dist/Stepper/Stepper.js
CHANGED
|
@@ -34,20 +34,26 @@ import { VisuallyHidden } from "../VisuallyHidden/VisuallyHidden.js";
|
|
|
34
34
|
* step drawing a connector into empty space, which is a
|
|
35
35
|
* `:not(:last-child)` selector nobody remembers to write.
|
|
36
36
|
*/
|
|
37
|
-
export const Stepper = ({ className, headingLevel = 3, label, orientation = "vertical", steps, }) => {
|
|
37
|
+
export const Stepper = ({ appearance = "default", className, headingLevel = 3, isResponsive = true, label, orientation = "vertical", steps, }) => {
|
|
38
38
|
const Heading = `h${headingLevel}`;
|
|
39
39
|
const isHorizontal = orientation === "horizontal";
|
|
40
|
+
const isCompact = appearance === "compact";
|
|
40
41
|
return (_jsx("div", { className: toClassName("@container", className), children: _jsx("ol", { "aria-label": label, className: toClassName("flex list-none flex-col gap-5 p-0",
|
|
41
42
|
// Horizontal is the WIDE answer only. Below `cq-md` this
|
|
42
43
|
// falls back to the column, which is the same rule
|
|
43
44
|
// `Board` follows and for the same reason: the owner
|
|
44
45
|
// browses zoomed in, so a window's width is not the
|
|
45
46
|
// number of pixels anything actually has.
|
|
46
|
-
isHorizontal &&
|
|
47
|
+
isHorizontal &&
|
|
48
|
+
(isResponsive
|
|
49
|
+
? "cq-md:flex-row cq-md:gap-0"
|
|
50
|
+
: "flex-row gap-0")), children: steps.map((step, index) => {
|
|
47
51
|
const status = step.status ?? "upcoming";
|
|
48
52
|
const isLast = index === steps.length - 1;
|
|
49
53
|
return (_jsxs("li", { [FLIP_KEY_ATTRIBUTE]: step.key, className: toClassName("relative grid grid-cols-[auto_minmax(0,1fr)] grid-rows-[auto_minmax(0,1fr)] gap-x-3", isHorizontal &&
|
|
50
|
-
|
|
54
|
+
(isResponsive
|
|
55
|
+
? "cq-md:flex cq-md:min-w-0 cq-md:flex-1 cq-md:flex-col cq-md:gap-y-2"
|
|
56
|
+
: "flex min-w-0 flex-1 flex-col gap-y-2"), isCompact && "gap-y-1",
|
|
51
57
|
// Blocked and upcoming recede; the step you can act
|
|
52
58
|
// on is the one that keeps full contrast. Opacity
|
|
53
59
|
// rather than a muted token so the step's own
|
|
@@ -55,14 +61,28 @@ export const Stepper = ({ className, headingLevel = 3, label, orientation = "ver
|
|
|
55
61
|
// under a dimmed heading reads as startable.
|
|
56
62
|
(status === "blocked" ||
|
|
57
63
|
status === "upcoming") &&
|
|
58
|
-
"opacity-70"), children: [_jsx("span", { className: toClassName(
|
|
64
|
+
"opacity-70"), children: [_jsx("span", { className: toClassName(isCompact
|
|
65
|
+
? "col-start-1 row-start-1 grid size-3 place-items-center rounded-full border text-xs tabular-nums"
|
|
66
|
+
: "col-start-1 row-start-1 grid size-7 place-items-center rounded-full border text-sm tabular-nums", STATUS_MARKER_CLASS[status], isHorizontal &&
|
|
67
|
+
(isResponsive
|
|
68
|
+
? "cq-md:col-start-1"
|
|
69
|
+
: "col-start-1")), children: isCompact ? (_jsx(VisuallyHidden, { children: step.marker ?? index + 1 })) : ((step.marker ?? index + 1)) }), isLast ? null : (_jsx("span", { "aria-hidden": true, className: toClassName("col-start-1 row-start-2 my-1 w-0.5 justify-self-center rounded-full",
|
|
59
70
|
// Solid behind finished work, dashed ahead of it
|
|
60
71
|
// — the second visual channel that keeps this
|
|
61
72
|
// from being colour alone.
|
|
62
73
|
status === "done"
|
|
63
74
|
? "bg-intent-success-solid"
|
|
64
75
|
: "bg-border-subtle", isHorizontal &&
|
|
65
|
-
|
|
76
|
+
(isCompact
|
|
77
|
+
? isResponsive
|
|
78
|
+
? "cq-md:absolute cq-md:top-1.5 cq-md:start-3 cq-md:my-0 cq-md:h-0.5 cq-md:w-[calc(100%-0.75rem)]"
|
|
79
|
+
: "absolute top-1.5 start-3 my-0 h-0.5 w-[calc(100%-0.75rem)]"
|
|
80
|
+
: isResponsive
|
|
81
|
+
? "cq-md:absolute cq-md:top-3.5 cq-md:start-7 cq-md:my-0 cq-md:h-0.5 cq-md:w-[calc(100%-1.75rem)]"
|
|
82
|
+
: "absolute top-3.5 start-7 my-0 h-0.5 w-[calc(100%-1.75rem)]")) })), _jsxs("div", { className: toClassName("col-start-2 row-span-2 row-start-1 min-w-0", isHorizontal &&
|
|
83
|
+
(isResponsive
|
|
84
|
+
? "cq-md:col-start-1"
|
|
85
|
+
: "col-start-1")), children: [_jsxs(Heading, { className: toClassName("m-0 flex flex-wrap items-center gap-2 font-medium text-content-primary", isCompact ? "text-xs" : "text-md"), children: [step.label, _jsx(VisuallyHidden, { children: STATUS_LABEL[status] })] }), step.description == null ? null : (_jsx("p", { className: "mt-0.5 mb-0 text-sm text-content-secondary", children: step.description })), step.content == null ? null : (_jsx("div", { className: "mt-2", children: step.content }))] })] }, step.key));
|
|
66
86
|
}) }) }));
|
|
67
87
|
};
|
|
68
88
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stepper.js","sourceRoot":"","sources":["../../src/Stepper/Stepper.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAsC,CAAA;
|
|
1
|
+
{"version":3,"file":"Stepper.js","sourceRoot":"","sources":["../../src/Stepper/Stepper.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Board/Board.test.tsx
CHANGED
|
@@ -76,6 +76,24 @@ test("a board wider than cq-lg shows every lane at once", async () => {
|
|
|
76
76
|
).toHaveLength(0)
|
|
77
77
|
})
|
|
78
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Width changes a card's chrome and metadata layout. It does not
|
|
81
|
+
* turn the task title back into one ellipsised line: a wider board
|
|
82
|
+
* is purchased to read more of the work, not less.
|
|
83
|
+
*/
|
|
84
|
+
test("wide Board cards keep task titles wrapped to two lines", async () => {
|
|
85
|
+
const { canvas } = await mountStory(MarkdownTitles)
|
|
86
|
+
|
|
87
|
+
const titleLink = canvas.getByRole("link", {
|
|
88
|
+
name: /deduplicate .*archive by content hash/i,
|
|
89
|
+
})
|
|
90
|
+
const title = titleLink.closest(".line-clamp-2")
|
|
91
|
+
|
|
92
|
+
await expect(title).toHaveClass("line-clamp-2")
|
|
93
|
+
await expect(title).toHaveClass("wrap-anywhere")
|
|
94
|
+
await expect(title).not.toHaveClass("truncate")
|
|
95
|
+
})
|
|
96
|
+
|
|
79
97
|
test("the row layout keeps every lane visible and grids the cards inside it", async () => {
|
|
80
98
|
const { canvas } = await mountStory(RowLayout)
|
|
81
99
|
|
package/src/Board/BoardCard.tsx
CHANGED
|
@@ -135,8 +135,8 @@ type BoardItemTitleLink =
|
|
|
135
135
|
href?: never
|
|
136
136
|
onSelect?: never
|
|
137
137
|
/**
|
|
138
|
-
* Drawn instead of `title`, inside the card's own
|
|
139
|
-
* — so it
|
|
138
|
+
* Drawn instead of `title`, inside the card's own two-line
|
|
139
|
+
* clamping box — so it wraps the way every other card does.
|
|
140
140
|
*
|
|
141
141
|
* It **owns its navigation**: the board adds no link around it,
|
|
142
142
|
* which is why `href` and `onSelect` are refused beside it.
|
|
@@ -294,13 +294,15 @@ export const BoardCard = ({
|
|
|
294
294
|
const menuLabel = isMovable ? "Move" : "More"
|
|
295
295
|
|
|
296
296
|
const titleBlock = (
|
|
297
|
-
// `line-clamp-none` before `truncate`, because `line-clamp-2`
|
|
298
|
-
// sets `display: -webkit-box` and `text-overflow` has nothing to
|
|
299
|
-
// ellipsise inside one.
|
|
300
|
-
//
|
|
301
297
|
// A `titleContent` is clamped by the same box as a plain one —
|
|
302
298
|
// it replaces the card's *words*, not the card's shape.
|
|
303
|
-
|
|
299
|
+
//
|
|
300
|
+
// A card gets more readable room as its lane grows. It must not
|
|
301
|
+
// spend that room by returning to a single ellipsised line: task
|
|
302
|
+
// titles are the card's primary text. Two lines cap card height,
|
|
303
|
+
// and `wrap-anywhere` keeps an unbroken URL or identifier from
|
|
304
|
+
// widening a row past its lane.
|
|
305
|
+
<span className="line-clamp-2 wrap-anywhere">
|
|
304
306
|
{item.titleContent ?? item.title}
|
|
305
307
|
</span>
|
|
306
308
|
)
|
package/src/Main/Main.tsx
CHANGED
|
@@ -146,7 +146,7 @@ export const Main = ({
|
|
|
146
146
|
<main
|
|
147
147
|
{...mainProps}
|
|
148
148
|
className={toClassName(
|
|
149
|
-
"col-start-1 row-start-3 min-w-0 md:col-start-2 md:row-start-2",
|
|
149
|
+
"charcuterie-scrollbar col-start-1 row-start-3 min-h-0 min-w-0 overflow-y-auto md:col-start-2 md:row-start-2",
|
|
150
150
|
className,
|
|
151
151
|
)}
|
|
152
152
|
id={id ?? shell?.mainId ?? fallbackId}
|
package/src/Rail/Rail.tsx
CHANGED
|
@@ -89,7 +89,7 @@ export const Rail = ({
|
|
|
89
89
|
{...railProps}
|
|
90
90
|
aria-label={label}
|
|
91
91
|
className={toClassName(
|
|
92
|
-
"flex min-w-0 gap-2 overflow-x-auto border-border-subtle p-4 md:row-start-2 md:w-64 md:flex-col md:overflow-x-visible",
|
|
92
|
+
"flex min-w-0 gap-2 overflow-x-auto border-border-subtle p-4 md:row-start-2 md:min-h-0 md:w-64 md:flex-col md:overflow-x-visible",
|
|
93
93
|
side === "start"
|
|
94
94
|
? "row-start-2 border-b md:col-start-1 md:border-b-0 md:border-e"
|
|
95
95
|
: "row-start-4 border-t md:col-start-3 md:border-t-0 md:border-s",
|
package/src/Shell/Shell.mdx
CHANGED
|
@@ -127,6 +127,14 @@ rail that only changes *position* uses a media query and nothing else.
|
|
|
127
127
|
|
|
128
128
|
<Canvas of={ShellStories.Responsive} />
|
|
129
129
|
|
|
130
|
+
## The page content scrolls; the frame stays available
|
|
131
|
+
|
|
132
|
+
The shell fills the viewport. `Main` is the only vertical scroll region, so a long page does
|
|
133
|
+
not scroll the header or either rail away. This keeps navigation actions available, including
|
|
134
|
+
an app's rail-collapse control. The rail is not a second vertical scroll area.
|
|
135
|
+
|
|
136
|
+
<Canvas of={ShellStories.Scrollable} />
|
|
137
|
+
|
|
130
138
|
## It does not scroll sideways, and that is a test
|
|
131
139
|
|
|
132
140
|
Plex Channels' narrow view scrolls left and right as wide as its content area. The usual
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
PageContent,
|
|
11
11
|
RailDetail,
|
|
12
12
|
RailNavigation,
|
|
13
|
+
ScrollFiller,
|
|
13
14
|
} from "../shell.storyHelpers.tsx"
|
|
14
15
|
import { Shell } from "./Shell.tsx"
|
|
15
16
|
|
|
@@ -183,3 +184,26 @@ export const Interactive: Story = {
|
|
|
183
184
|
</Shell>
|
|
184
185
|
),
|
|
185
186
|
}
|
|
187
|
+
|
|
188
|
+
/** A long page leaves the header and rail in place. */
|
|
189
|
+
export const Scrollable: Story = {
|
|
190
|
+
render: (shellProps) => (
|
|
191
|
+
<Shell {...shellProps}>
|
|
192
|
+
<Header
|
|
193
|
+
actions={<HeaderSchemeToggle />}
|
|
194
|
+
heading="Rip Deck"
|
|
195
|
+
/>
|
|
196
|
+
|
|
197
|
+
<Rail label="Sections" landmark="navigation">
|
|
198
|
+
<RailNavigation />
|
|
199
|
+
</Rail>
|
|
200
|
+
|
|
201
|
+
<Main>
|
|
202
|
+
<PageContent />
|
|
203
|
+
<div style={{ minBlockSize: "150vh" }}>
|
|
204
|
+
<ScrollFiller />
|
|
205
|
+
</div>
|
|
206
|
+
</Main>
|
|
207
|
+
</Shell>
|
|
208
|
+
),
|
|
209
|
+
}
|
package/src/Shell/Shell.test.tsx
CHANGED
|
@@ -16,6 +16,7 @@ const {
|
|
|
16
16
|
Default,
|
|
17
17
|
Interactive,
|
|
18
18
|
Responsive,
|
|
19
|
+
Scrollable,
|
|
19
20
|
WithBothRails,
|
|
20
21
|
WithStartRail,
|
|
21
22
|
} = composeStories(stories)
|
|
@@ -152,6 +153,34 @@ test("the shell fills the viewport at desktop width without overflowing it", asy
|
|
|
152
153
|
await expectNoHorizontalScroll()
|
|
153
154
|
})
|
|
154
155
|
|
|
156
|
+
test("only main scrolls vertically, keeping the rail available", async () => {
|
|
157
|
+
await setViewport(DESKTOP)
|
|
158
|
+
|
|
159
|
+
const { canvas, canvasElement } =
|
|
160
|
+
await mountStory(Scrollable)
|
|
161
|
+
|
|
162
|
+
const shell =
|
|
163
|
+
canvasElement.firstElementChild as HTMLElement
|
|
164
|
+
const main = canvas.getByRole("main")
|
|
165
|
+
const rail = canvas.getByRole("navigation", {
|
|
166
|
+
name: "Sections",
|
|
167
|
+
})
|
|
168
|
+
|
|
169
|
+
await expect(shell.clientHeight).toBe(DESKTOP.height)
|
|
170
|
+
await expect(main.scrollHeight).toBeGreaterThan(
|
|
171
|
+
main.clientHeight,
|
|
172
|
+
)
|
|
173
|
+
await expect(
|
|
174
|
+
globalThis.getComputedStyle(main).overflowY,
|
|
175
|
+
).toBe("auto")
|
|
176
|
+
|
|
177
|
+
main.scrollTo({ top: main.scrollHeight })
|
|
178
|
+
|
|
179
|
+
await expect(main.scrollTop).toBeGreaterThan(0)
|
|
180
|
+
await expect(rail.scrollTop).toBe(0)
|
|
181
|
+
await expectNoAxeViolations(canvasElement)
|
|
182
|
+
})
|
|
183
|
+
|
|
155
184
|
test("the shell is one banner, one main, and two uniquely-named rails", async () => {
|
|
156
185
|
const { canvas, canvasElement } =
|
|
157
186
|
await mountStory(WithBothRails)
|
package/src/Shell/Shell.tsx
CHANGED
|
@@ -140,7 +140,7 @@ export const Shell = ({
|
|
|
140
140
|
<div
|
|
141
141
|
{...divProps}
|
|
142
142
|
className={toClassName(
|
|
143
|
-
"relative grid
|
|
143
|
+
"relative grid h-dvh grid-cols-1 grid-rows-[auto_auto_minmax(0,1fr)_auto] overflow-x-clip bg-surface-base text-content-primary md:grid-cols-[auto_minmax(0,1fr)_auto] md:grid-rows-[auto_minmax(0,1fr)]",
|
|
144
144
|
className,
|
|
145
145
|
)}
|
|
146
146
|
>
|
|
@@ -170,6 +170,33 @@ export const Responsive: Story = {
|
|
|
170
170
|
),
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
/** Short labels can opt out of the collapse when the sequence is a
|
|
174
|
+
* compact status ladder inside a card. */
|
|
175
|
+
export const CompactCard: Story = {
|
|
176
|
+
args: {
|
|
177
|
+
appearance: "compact",
|
|
178
|
+
isResponsive: false,
|
|
179
|
+
orientation: "horizontal",
|
|
180
|
+
steps: [
|
|
181
|
+
{ key: "ordered", label: "Ordered", status: "done" },
|
|
182
|
+
{ key: "shipped", label: "Shipped", status: "done" },
|
|
183
|
+
{ key: "out", label: "Out today", status: "current" },
|
|
184
|
+
{
|
|
185
|
+
key: "delivered",
|
|
186
|
+
label: "Delivered",
|
|
187
|
+
status: "upcoming",
|
|
188
|
+
},
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
render: (stepperProps) => (
|
|
192
|
+
<div className="w-[22rem] max-w-full">
|
|
193
|
+
<Card>
|
|
194
|
+
<Stepper {...stepperProps} />
|
|
195
|
+
</Card>
|
|
196
|
+
</div>
|
|
197
|
+
),
|
|
198
|
+
}
|
|
199
|
+
|
|
173
200
|
/**
|
|
174
201
|
* The whole keyboard path, which is the point of the headings: a
|
|
175
202
|
* stepper is a document outline, not a widget. There is nothing to
|
|
@@ -6,8 +6,13 @@ import { expectNoAxeViolations } from "../expectNoAxeViolations.testHelpers.ts"
|
|
|
6
6
|
import { mountStory } from "../mountStory.testHelpers.ts"
|
|
7
7
|
import * as stories from "./Stepper.stories.tsx"
|
|
8
8
|
|
|
9
|
-
const {
|
|
10
|
-
|
|
9
|
+
const {
|
|
10
|
+
AllStates,
|
|
11
|
+
CompactCard,
|
|
12
|
+
Default,
|
|
13
|
+
Interactive,
|
|
14
|
+
Responsive,
|
|
15
|
+
} = composeStories(stories)
|
|
11
16
|
|
|
12
17
|
test("the sequence is an ordered list with a name", async () => {
|
|
13
18
|
const { canvas } = await mountStory(Default)
|
|
@@ -127,3 +132,13 @@ test("no axe violations, in either orientation", async () => {
|
|
|
127
132
|
|
|
128
133
|
await expectNoAxeViolations(horizontal.canvasElement)
|
|
129
134
|
})
|
|
135
|
+
|
|
136
|
+
test("a compact card can keep the horizontal ladder below cq-md", async () => {
|
|
137
|
+
const { canvas } = await mountStory(CompactCard)
|
|
138
|
+
|
|
139
|
+
await expect(
|
|
140
|
+
getComputedStyle(
|
|
141
|
+
canvas.getByRole("list", { name: "Ingest sequence" }),
|
|
142
|
+
).flexDirection,
|
|
143
|
+
).toBe("row")
|
|
144
|
+
})
|
package/src/Stepper/Stepper.tsx
CHANGED
|
@@ -43,6 +43,8 @@ export type Step = {
|
|
|
43
43
|
export type StepperOrientation = "horizontal" | "vertical"
|
|
44
44
|
|
|
45
45
|
export type StepperProps = {
|
|
46
|
+
/** `compact` is the dot-and-line ladder for short status labels in cards. */
|
|
47
|
+
readonly appearance?: "default" | "compact"
|
|
46
48
|
readonly className?: string
|
|
47
49
|
/**
|
|
48
50
|
* What level the step labels are. The caller's, because only the
|
|
@@ -55,6 +57,13 @@ export type StepperProps = {
|
|
|
55
57
|
/** The list's accessible name. Required — an unnamed sequence of
|
|
56
58
|
* numbers is a sequence of numbers. */
|
|
57
59
|
readonly label: string
|
|
60
|
+
/**
|
|
61
|
+
* Whether a requested horizontal sequence collapses below `cq-md`.
|
|
62
|
+
* Keep this on for prose-sized steps. Turn it off only when the
|
|
63
|
+
* caller supplies short labels that are designed to remain a compact
|
|
64
|
+
* ladder inside a card.
|
|
65
|
+
*/
|
|
66
|
+
readonly isResponsive?: boolean
|
|
58
67
|
/**
|
|
59
68
|
* `horizontal` is a REQUEST, not a promise: it collapses to
|
|
60
69
|
* vertical below `cq-md`, because four steps side by side in a
|
|
@@ -99,14 +108,17 @@ export type StepperProps = {
|
|
|
99
108
|
* `:not(:last-child)` selector nobody remembers to write.
|
|
100
109
|
*/
|
|
101
110
|
export const Stepper = ({
|
|
111
|
+
appearance = "default",
|
|
102
112
|
className,
|
|
103
113
|
headingLevel = 3,
|
|
114
|
+
isResponsive = true,
|
|
104
115
|
label,
|
|
105
116
|
orientation = "vertical",
|
|
106
117
|
steps,
|
|
107
118
|
}: StepperProps) => {
|
|
108
119
|
const Heading = `h${headingLevel}` as "h3"
|
|
109
120
|
const isHorizontal = orientation === "horizontal"
|
|
121
|
+
const isCompact = appearance === "compact"
|
|
110
122
|
|
|
111
123
|
return (
|
|
112
124
|
// The container is a WRAPPER, never the `<ol>` itself.
|
|
@@ -131,7 +143,10 @@ export const Stepper = ({
|
|
|
131
143
|
// `Board` follows and for the same reason: the owner
|
|
132
144
|
// browses zoomed in, so a window's width is not the
|
|
133
145
|
// number of pixels anything actually has.
|
|
134
|
-
isHorizontal &&
|
|
146
|
+
isHorizontal &&
|
|
147
|
+
(isResponsive
|
|
148
|
+
? "cq-md:flex-row cq-md:gap-0"
|
|
149
|
+
: "flex-row gap-0"),
|
|
135
150
|
)}
|
|
136
151
|
>
|
|
137
152
|
{steps.map((step, index) => {
|
|
@@ -163,7 +178,10 @@ export const Stepper = ({
|
|
|
163
178
|
className={toClassName(
|
|
164
179
|
"relative grid grid-cols-[auto_minmax(0,1fr)] grid-rows-[auto_minmax(0,1fr)] gap-x-3",
|
|
165
180
|
isHorizontal &&
|
|
166
|
-
|
|
181
|
+
(isResponsive
|
|
182
|
+
? "cq-md:flex cq-md:min-w-0 cq-md:flex-1 cq-md:flex-col cq-md:gap-y-2"
|
|
183
|
+
: "flex min-w-0 flex-1 flex-col gap-y-2"),
|
|
184
|
+
isCompact && "gap-y-1",
|
|
167
185
|
// Blocked and upcoming recede; the step you can act
|
|
168
186
|
// on is the one that keeps full contrast. Opacity
|
|
169
187
|
// rather than a muted token so the step's own
|
|
@@ -177,12 +195,23 @@ export const Stepper = ({
|
|
|
177
195
|
>
|
|
178
196
|
<span
|
|
179
197
|
className={toClassName(
|
|
180
|
-
|
|
198
|
+
isCompact
|
|
199
|
+
? "col-start-1 row-start-1 grid size-3 place-items-center rounded-full border text-xs tabular-nums"
|
|
200
|
+
: "col-start-1 row-start-1 grid size-7 place-items-center rounded-full border text-sm tabular-nums",
|
|
181
201
|
STATUS_MARKER_CLASS[status],
|
|
182
|
-
isHorizontal &&
|
|
202
|
+
isHorizontal &&
|
|
203
|
+
(isResponsive
|
|
204
|
+
? "cq-md:col-start-1"
|
|
205
|
+
: "col-start-1"),
|
|
183
206
|
)}
|
|
184
207
|
>
|
|
185
|
-
{
|
|
208
|
+
{isCompact ? (
|
|
209
|
+
<VisuallyHidden>
|
|
210
|
+
{step.marker ?? index + 1}
|
|
211
|
+
</VisuallyHidden>
|
|
212
|
+
) : (
|
|
213
|
+
(step.marker ?? index + 1)
|
|
214
|
+
)}
|
|
186
215
|
</span>
|
|
187
216
|
|
|
188
217
|
{/* Absent on the last step, so nothing draws a line
|
|
@@ -199,7 +228,13 @@ export const Stepper = ({
|
|
|
199
228
|
? "bg-intent-success-solid"
|
|
200
229
|
: "bg-border-subtle",
|
|
201
230
|
isHorizontal &&
|
|
202
|
-
|
|
231
|
+
(isCompact
|
|
232
|
+
? isResponsive
|
|
233
|
+
? "cq-md:absolute cq-md:top-1.5 cq-md:start-3 cq-md:my-0 cq-md:h-0.5 cq-md:w-[calc(100%-0.75rem)]"
|
|
234
|
+
: "absolute top-1.5 start-3 my-0 h-0.5 w-[calc(100%-0.75rem)]"
|
|
235
|
+
: isResponsive
|
|
236
|
+
? "cq-md:absolute cq-md:top-3.5 cq-md:start-7 cq-md:my-0 cq-md:h-0.5 cq-md:w-[calc(100%-1.75rem)]"
|
|
237
|
+
: "absolute top-3.5 start-7 my-0 h-0.5 w-[calc(100%-1.75rem)]"),
|
|
203
238
|
)}
|
|
204
239
|
/>
|
|
205
240
|
)}
|
|
@@ -207,10 +242,18 @@ export const Stepper = ({
|
|
|
207
242
|
<div
|
|
208
243
|
className={toClassName(
|
|
209
244
|
"col-start-2 row-span-2 row-start-1 min-w-0",
|
|
210
|
-
isHorizontal &&
|
|
245
|
+
isHorizontal &&
|
|
246
|
+
(isResponsive
|
|
247
|
+
? "cq-md:col-start-1"
|
|
248
|
+
: "col-start-1"),
|
|
211
249
|
)}
|
|
212
250
|
>
|
|
213
|
-
<Heading
|
|
251
|
+
<Heading
|
|
252
|
+
className={toClassName(
|
|
253
|
+
"m-0 flex flex-wrap items-center gap-2 font-medium text-content-primary",
|
|
254
|
+
isCompact ? "text-xs" : "text-md",
|
|
255
|
+
)}
|
|
256
|
+
>
|
|
214
257
|
{step.label}
|
|
215
258
|
|
|
216
259
|
{/* The status as a WORD. Four marker colours is
|