@charcuterie/ui 4.1.0 → 4.2.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/README.md CHANGED
@@ -27,12 +27,13 @@ an accordion panel is [a `group` rather than a landmark](../../docs/decisions/20
27
27
  and [not every boolean is a state kind](../../docs/decisions/2026-07-31-not-every-boolean-is-a-state-kind.md).
28
28
  Full write-up: [M6a handoff](../../docs/2026-07-31-m6a-the-p1-components.md).
29
29
 
30
- **The link family** — `TextLink` and `ButtonLink` — closes the gap that had seven repos
30
+ **The link family** — `TextLink`, `ButtonLink`, and `UnstyledLink` — closes the gap that had seven repos
31
31
  hand-rolling a `←` back-link, plex-channels navigating with
32
32
  `<button onClick={() => navigate(…)}>`, and mux-magic reloading the page through 14 raw
33
33
  `<a href>`. Buttons are for on-page actions; links are for navigation, and both of these
34
34
  render a real `<a href>` so middle-click, ctrl-click, open-in-new-tab and copy-link-address
35
- work. They differ in **paint, not semantics**
35
+ work. The first two differ in **paint, not semantics**. `UnstyledLink` owns no paint and
36
+ preserves an established app-owned treatment while still using the same router seam
36
37
  ([decision](../../docs/decisions/2026-08-10-buttons-are-actions-links-are-navigation.md)).
37
38
  The router is **injected** rather than depended on — `RouterLinkProvider` at the app root,
38
39
  with `@charcuterie/ui/react-router` as an optional subpath adapter and a plain `<a>` when
@@ -80,6 +80,39 @@ export type MainProps = ComponentPropsWithRef<"main"> & {
80
80
  * an app's own fixed chrome belongs in `Shell`, beside `Main`
81
81
  * rather than in it.
82
82
  *
83
+ * ## `relative` — the scrollport has to be the containing block
84
+ *
85
+ * `<main>` is the page's only vertical scrollport, so everything
86
+ * in it is supposed to scroll *inside* it. An absolutely
87
+ * positioned descendant does not, unless this element is its
88
+ * containing block: with `position: static` here, the nearest
89
+ * positioned ancestor is `Shell`, which is **outside** the
90
+ * scrollport. The box then resolves against `Shell`, `<main>`'s
91
+ * `overflow-y` has no authority over it, and its static position —
92
+ * a couple of thousand pixels down a long document — becomes
93
+ * scrollable overflow on `documentElement`. The page grows to
94
+ * reach it and the reader gets a **second scrollbar** beside the
95
+ * one `<main>` already has.
96
+ *
97
+ * The box does not have to be exotic. Tailwind's `sr-only` is
98
+ * `position: absolute`, so the visually hidden
99
+ * `<span>(opens in a new tab)</span>` on one link in a document
100
+ * footer is enough. Measured on Folio at 1440x900: `<main>` was
101
+ * 835px tall and `document.documentElement.scrollHeight` read
102
+ * 2085, which is exactly where that span sat.
103
+ *
104
+ * `overflow-x: hidden` comes with it and is not decoration.
105
+ * `relative` moves every absolutely positioned descendant's
106
+ * containing block from `Shell` to here, which also moves what
107
+ * clips them **sideways**: `Shell`'s `overflow-x: clip` no longer
108
+ * reaches them, so a drawer parked at `translateX(110%)` inside
109
+ * `Main` would draw a horizontal scrollbar on the scrollport
110
+ * instead of being clipped. `hidden` rather than `clip` because
111
+ * this element already scrolls on the other axis — a `clip` beside
112
+ * an `auto` computes to `hidden` anyway, and writing what the
113
+ * browser will use is the honest spelling. `Shell`'s note on the
114
+ * clip explains the other half.
115
+ *
83
116
  * ## It remembers where each history entry was scrolled to
84
117
  *
85
118
  * `Shell` gives this element the page's only vertical scrollport,
@@ -1 +1 @@
1
- {"version":3,"file":"Main.d.ts","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAGf,MAAM,OAAO,CAAA;AAEd,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,0BAA0B,CAAA;AAMjC,MAAM,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,GAAG;IACtD,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0IG;AACH,eAAO,MAAM,IAAI,GAAI,8DAOlB,SAAS,KAAG,SA0Dd,CAAA"}
1
+ {"version":3,"file":"Main.d.ts","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EAGf,MAAM,OAAO,CAAA;AAEd,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,0BAA0B,CAAA;AAMjC,MAAM,MAAM,SAAS,GAAG,qBAAqB,CAAC,MAAM,CAAC,GAAG;IACtD,YAAY,CAAC,EAAE,YAAY,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2KG;AACH,eAAO,MAAM,IAAI,GAAI,8DAOlB,SAAS,KAAG,SA0Dd,CAAA"}
package/dist/Main/Main.js CHANGED
@@ -83,6 +83,39 @@ import { useScrollMemory } from "./useScrollMemory.js";
83
83
  * an app's own fixed chrome belongs in `Shell`, beside `Main`
84
84
  * rather than in it.
85
85
  *
86
+ * ## `relative` — the scrollport has to be the containing block
87
+ *
88
+ * `<main>` is the page's only vertical scrollport, so everything
89
+ * in it is supposed to scroll *inside* it. An absolutely
90
+ * positioned descendant does not, unless this element is its
91
+ * containing block: with `position: static` here, the nearest
92
+ * positioned ancestor is `Shell`, which is **outside** the
93
+ * scrollport. The box then resolves against `Shell`, `<main>`'s
94
+ * `overflow-y` has no authority over it, and its static position —
95
+ * a couple of thousand pixels down a long document — becomes
96
+ * scrollable overflow on `documentElement`. The page grows to
97
+ * reach it and the reader gets a **second scrollbar** beside the
98
+ * one `<main>` already has.
99
+ *
100
+ * The box does not have to be exotic. Tailwind's `sr-only` is
101
+ * `position: absolute`, so the visually hidden
102
+ * `<span>(opens in a new tab)</span>` on one link in a document
103
+ * footer is enough. Measured on Folio at 1440x900: `<main>` was
104
+ * 835px tall and `document.documentElement.scrollHeight` read
105
+ * 2085, which is exactly where that span sat.
106
+ *
107
+ * `overflow-x: hidden` comes with it and is not decoration.
108
+ * `relative` moves every absolutely positioned descendant's
109
+ * containing block from `Shell` to here, which also moves what
110
+ * clips them **sideways**: `Shell`'s `overflow-x: clip` no longer
111
+ * reaches them, so a drawer parked at `translateX(110%)` inside
112
+ * `Main` would draw a horizontal scrollbar on the scrollport
113
+ * instead of being clipped. `hidden` rather than `clip` because
114
+ * this element already scrolls on the other axis — a `clip` beside
115
+ * an `auto` computes to `hidden` anyway, and writing what the
116
+ * browser will use is the honest spelling. `Shell`'s note on the
117
+ * clip explains the other half.
118
+ *
86
119
  * ## It remembers where each history entry was scrolled to
87
120
  *
88
121
  * `Shell` gives this element the page's only vertical scrollport,
@@ -155,7 +188,7 @@ export const Main = ({ children, className, contentWidth, id, ref, ...mainProps
155
188
  const maxInlineSize = toMaxInlineSize(contentWidth ??
156
189
  shell?.contentWidth ??
157
190
  DEFAULT_CONTENT_WIDTH);
158
- 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,
191
+ return (_jsx("main", { ...mainProps, className: toClassName("charcuterie-scrollbar relative col-start-1 row-start-3 min-h-0 min-w-0 overflow-x-hidden overflow-y-auto md:col-start-2 md:row-start-2", className), id: id ?? shell?.mainId ?? fallbackId,
159
192
  // A caller's `ref` is a subscription, not a value, so the
160
193
  // scroll memory composes with it rather than replacing it.
161
194
  //
@@ -1 +1 @@
1
- {"version":3,"file":"Main.js","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,SAAS,EACT,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAIL,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;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAMtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0IG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,EAAE,EACF,GAAG,EACH,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACnD,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAElD,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;QACrC,0DAA0D;QAC1D,2DAA2D;QAC3D,EAAE;QACF,yDAAyD;QACzD,8DAA8D;QAC9D,qBAAqB;QACrB,GAAG,EACD,GAAG;YACD,CAAC,CAAE,SAAS,CACR,GAAmB,EACnB,aAAa,CACe;YAChC,CAAC,CAAC,aAAa,EAEnB,QAAQ,EAAE,CAAC,CAAC,YAaZ,cACE,SAAS,EAAC,uFAAuF,EACjG,KAAK,EAAE,EAAE,aAAa,EAAE,YAEvB,QAAQ,GACL,GACD,CACR,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"Main.js","sourceRoot":"","sources":["../../src/Main/Main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAEL,SAAS,EACT,WAAW,GACZ,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAIL,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;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAMtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2KG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,EACnB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,EAAE,EACF,GAAG,EACH,GAAG,SAAS,EACF,EAAa,EAAE;IACzB,MAAM,KAAK,GAAG,UAAU,CAAC,YAAY,CAAC,CAAA;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;IACnD,MAAM,aAAa,GAAG,eAAe,CAAC,WAAW,CAAC,CAAA;IAElD,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,wIAAwI,EACxI,SAAS,CACV,EACD,EAAE,EAAE,EAAE,IAAI,KAAK,EAAE,MAAM,IAAI,UAAU;QACrC,0DAA0D;QAC1D,2DAA2D;QAC3D,EAAE;QACF,yDAAyD;QACzD,8DAA8D;QAC9D,qBAAqB;QACrB,GAAG,EACD,GAAG;YACD,CAAC,CAAE,SAAS,CACR,GAAmB,EACnB,aAAa,CACe;YAChC,CAAC,CAAC,aAAa,EAEnB,QAAQ,EAAE,CAAC,CAAC,YAaZ,cACE,SAAS,EAAC,uFAAuF,EACjG,KAAK,EAAE,EAAE,aAAa,EAAE,YAEvB,QAAQ,GACL,GACD,CACR,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ import { type RouterLinkProps } from "./routerLink.ts";
3
+ export type UnstyledLinkProps = RouterLinkProps;
4
+ /**
5
+ * A router-aware link that owns no paint.
6
+ *
7
+ * Use this only when the caller already owns the complete visual
8
+ * treatment. `TextLink` and `ButtonLink` remain the defaults for the
9
+ * two link appearances the library owns.
10
+ *
11
+ * An in-app destination goes through the injected router. Another
12
+ * origin, another scheme, or a same-page fragment stays a platform
13
+ * anchor. With no provider, the injected component is `AnchorLink`,
14
+ * so this remains a working `<a href>` in Storybook and tests.
15
+ */
16
+ export declare const UnstyledLink: ({ href, ...linkProps }: UnstyledLinkProps) => ReactNode;
17
+ //# sourceMappingURL=UnstyledLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnstyledLink.d.ts","sourceRoot":"","sources":["../../src/RouterLink/UnstyledLink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAA;AAExB,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GAAI,wBAG1B,iBAAiB,KAAG,SAOtB,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { AnchorLink } from "./AnchorLink.js";
3
+ import { useRouterLink } from "./RouterLinkProvider.js";
4
+ import { getIsRoutedHref, } from "./routerLink.js";
5
+ /**
6
+ * A router-aware link that owns no paint.
7
+ *
8
+ * Use this only when the caller already owns the complete visual
9
+ * treatment. `TextLink` and `ButtonLink` remain the defaults for the
10
+ * two link appearances the library owns.
11
+ *
12
+ * An in-app destination goes through the injected router. Another
13
+ * origin, another scheme, or a same-page fragment stays a platform
14
+ * anchor. With no provider, the injected component is `AnchorLink`,
15
+ * so this remains a working `<a href>` in Storybook and tests.
16
+ */
17
+ export const UnstyledLink = ({ href, ...linkProps }) => {
18
+ const RouterLink = useRouterLink();
19
+ const LinkElement = getIsRoutedHref(href)
20
+ ? RouterLink
21
+ : AnchorLink;
22
+ return _jsx(LinkElement, { ...linkProps, href: href });
23
+ };
24
+ //# sourceMappingURL=UnstyledLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnstyledLink.js","sourceRoot":"","sources":["../../src/RouterLink/UnstyledLink.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAA0B,CAAA;AACxD,OAAO,EACL,eAAe,GAEhB,MAAM,iBAAiB,CAAA;AAIxB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAC3B,IAAI,EACJ,GAAG,SAAS,EACM,EAAa,EAAE;IACjC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAA;IAClC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC;QACvC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,CAAA;IAEd,OAAO,KAAC,WAAW,OAAK,SAAS,EAAE,IAAI,EAAE,IAAI,GAAI,CAAA;AACnD,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -169,6 +169,8 @@ export { AnchorLink } from "./RouterLink/AnchorLink.tsx";
169
169
  export { RouterLinkProvider, useRouterLink, } from "./RouterLink/RouterLinkProvider.tsx";
170
170
  export type { RouterLinkComponent, RouterLinkProps, } from "./RouterLink/routerLink.ts";
171
171
  export { getIsRoutedHref } from "./RouterLink/routerLink.ts";
172
+ export type { UnstyledLinkProps } from "./RouterLink/UnstyledLink.tsx";
173
+ export { UnstyledLink } from "./RouterLink/UnstyledLink.tsx";
172
174
  export type { SearchInputProps } from "./SearchInput/SearchInput.tsx";
173
175
  export { SearchInput } from "./SearchInput/SearchInput.tsx";
174
176
  export type { SegmentedControlProps, SegmentedItem, } from "./SegmentedControl/SegmentedControl.tsx";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -99,6 +99,7 @@ export { ReorderList } from "./ReorderList/ReorderList.js";
99
99
  export { AnchorLink } from "./RouterLink/AnchorLink.js";
100
100
  export { RouterLinkProvider, useRouterLink, } from "./RouterLink/RouterLinkProvider.js";
101
101
  export { getIsRoutedHref } from "./RouterLink/routerLink.js";
102
+ export { UnstyledLink } from "./RouterLink/UnstyledLink.js";
102
103
  export { SearchInput } from "./SearchInput/SearchInput.js";
103
104
  export { SegmentedControl } from "./SegmentedControl/SegmentedControl.js";
104
105
  export { Select } from "./Select/Select.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAOH,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA2B,CAAA;AAMrD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAE9D,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AAKxC,OAAO,EACL,6BAA6B,EAC7B,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,GAC1B,MAAM,sCAAsC,CAAA;AAK7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAKzC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAGzC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAK3D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AASzC,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AAMxD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAiB,CAAA;AAGtC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA+C,CAAA;AAKnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA2C,CAAA;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAKlD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EACL,4BAA4B,EAC5B,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,oBAAoB,CAAA;AAO3B,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA2B,CAAA;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAMlE,OAAO,EACL,2BAA2B,EAC3B,cAAc,GACf,MAAM,gCAAgC,CAAA;AAMvC,OAAO,EACL,OAAO,EACP,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,yBAAyB,EACzB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,SAAS,GACV,MAAM,2BAA2B,CAAA;AAKlC,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,2CAA2C,CAAA;AAKlD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAK5C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAKlD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAwB,CAAA;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AAExD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAKlD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAK/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA+C,CAAA;AAKnF,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA2B,CAAA;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAiB,CAAA;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAiC,CAAA;AAMtE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAqC,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AAOtE,OAAO,EACL,WAAW,EACX,eAAe,GAChB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,kCAAkC,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAK9D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA2B,CAAA;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAK7D,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAiB,CAAA;AAEtC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAKzC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAe,CAAA;AAKnC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAO1B,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAKpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAK5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAM/C,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAmC,CAAA;AAKjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAE3D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,GAChB,MAAM,gCAAgC,CAAA;AAKvC,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAiC,CAAA;AAK9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AAMxD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAiB,CAAA;AAKtC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAO3D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA6B,CAAA;AACxD,OAAO,EACL,kBAAkB,EAClB,aAAa,GACd,MAAM,oCAAqC,CAAA;AAK5C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA+B,CAAA;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA+B,CAAA;AAK3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAyC,CAAA;AAY1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAM5C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAKzC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAKlD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAK5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA+C,CAAA;AAEnF,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAO/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAM/C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAqB,CAAA;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EACL,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAM1B,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAiB,CAAA;AAWtC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAyB,CAAA;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAmC,CAAA;AAMjE,OAAO,EACL,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAmB,CAAA;AAKzC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAyB,CAAA;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAA;AAOpE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAuB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAuC,CAAA;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAqC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@charcuterie/ui",
3
- "version": "4.1.0",
3
+ "version": "4.2.1",
4
4
  "description": "The Charcuterie components. Tokens for look, @charcuterie/logic for state, ARIA that agents can actually drive.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -173,12 +173,28 @@ same constant `RadioGroup`'s tile shape uses, and each of its three parts is loa
173
173
  class strings, so `` `grid-cols-[…${n}px…]` `` generates nothing, paints nothing and
174
174
  reports nothing.
175
175
 
176
+ ### The floor sizes the CONTAINER's tracks, not the tiles
177
+
178
+ `minTileInlineSize` is the narrowest a **track** may be, and `auto-fill` lays as many of
179
+ them as fit whether or not there are tiles to put in them. So the number to pick comes from
180
+ the width of the box the set is in, divided by how many tiles you want across it — not from
181
+ how many tiles you have.
182
+
183
+ Leave it at the 200px default in a 1024px container and the grid cuts four tracks. Two
184
+ tiles take the first two, the other half of the row is empty background, and the set reads
185
+ as a layout bug.
186
+
187
+ ⚠️ **Nothing reports this.** It type-checks, it lints, it passes every unit and e2e test,
188
+ and the DOM is correct — the tiles really are in a grid, and the grid really has the columns
189
+ it was asked for. Three apps shipped a half-empty row on the day they adopted this
190
+ component, and each one was caught by a screenshot. If a set has few tiles, look at it.
191
+
192
+ <Canvas of={ActionTilesStories.Responsive} />
193
+
176
194
  This is **not** `useAdaptiveColumns`. That hook buys a column with **height**, for an
177
195
  unbounded gallery that is going to scroll; a tile set is a bounded group inside a form section
178
196
  or a first step, where the only question is how many fit across the box it was given.
179
197
 
180
- <Canvas of={ActionTilesStories.Responsive} />
181
-
182
198
  ## What this deliberately does not do
183
199
 
184
200
  - **Hold a selection.** That is `RadioGroup itemShape="tile"`, and giving these tiles
package/src/Main/Main.mdx CHANGED
@@ -109,7 +109,9 @@ for a `getBoundingClientRect()` assertion to catch. That is why the gate asserts
109
109
  `document.documentElement.scrollWidth`, and why `Main.test.tsx` pins the computed value.
110
110
 
111
111
  That is the cheap half of the horizontal-scroll fix; the other halves are `minmax(0, 1fr)`
112
- and `overflow-x: clip` on `Shell`.
112
+ and `overflow-x: clip` on `Shell`, plus `overflow-x: hidden` here for anything absolutely
113
+ positioned **inside** the scrollport — the next section says why that one cannot be left to
114
+ the frame.
113
115
 
114
116
  A `<table>` is the one thing neither can save. Table columns have min-content widths that no
115
117
  `overflow-wrap` reaches, so a wide table goes in a scroll container:
@@ -140,6 +142,33 @@ satisfy it and the choice is not a matter of taste:
140
142
  `aria-label` on the container is worth it either way: it turns the scroller into a named
141
143
  region, so the table is announced as a thing rather than as loose content.
142
144
 
145
+ ## `relative`, and the second scrollbar
146
+
147
+ `<main>` is the page's only vertical scrollport, so the document itself must never scroll.
148
+ An absolutely positioned descendant breaks that unless `<main>` is its **containing block**.
149
+ With `position: static` the nearest positioned ancestor is `Shell`, which sits *outside* the
150
+ scrollport: the box resolves against the frame, `<main>`'s `overflow-y` has no authority over
151
+ it, and its static position — a couple of thousand pixels down a long document — lands as
152
+ scrollable overflow on `documentElement`. The page grows to reach it, and the reader gets a
153
+ **second scrollbar** beside the one `<main>` already has.
154
+
155
+ The box does not have to be exotic, which is what makes this hard to spot. Tailwind's
156
+ `sr-only` is `position: absolute`, so one visually hidden `(opens in a new tab)` span in a
157
+ document footer is enough. Measured on Folio at 1440x900 before this: `<main>` 835px tall,
158
+ `document.documentElement.scrollHeight` 2085 — the span's offset, exactly. Nothing on the
159
+ page looked wrong; there were simply two scrollbars.
160
+
161
+ `overflow-x: hidden` comes with the `relative` and is not decoration. Moving every
162
+ absolutely positioned descendant's containing block from `Shell` to `<main>` also moves what
163
+ clips them sideways, so `Shell`'s `overflow-x: clip` no longer reaches them — a drawer parked
164
+ at `translateX(110%)` **inside** `Main` would draw a horizontal scrollbar on the scrollport
165
+ instead of being clipped. `hidden` rather than `clip` because this element already scrolls on
166
+ the other axis: `clip` beside an `auto` computes to `hidden` anyway, so writing `hidden` is
167
+ writing what the browser will use.
168
+
169
+ An app's own parked chrome still belongs in `Shell`, beside `Main` rather than in it. That is
170
+ what `Shell`'s clip is for, and it is the arrangement `Shell.stories.tsx` demonstrates.
171
+
143
172
  ## `tabIndex={-1}`
144
173
 
145
174
  <Canvas of={MainStories.Interactive} />
@@ -10,10 +10,13 @@ import { toMaxInlineSize } from "../Shell/contentWidth.ts"
10
10
  import { Shell } from "../Shell/Shell.tsx"
11
11
  import { Spinner } from "../Spinner/Spinner.tsx"
12
12
  import {
13
+ ExternalLinkFooter,
13
14
  HeaderSchemeToggle,
14
15
  OverflowingContent,
15
16
  PageContent,
17
+ ParkedDrawer,
16
18
  RailNavigation,
19
+ ScrollFiller,
17
20
  } from "../shell.storyHelpers.tsx"
18
21
  import { Main } from "./Main.tsx"
19
22
  import { ScrollMemoryProvider } from "./ScrollMemoryProvider.tsx"
@@ -124,14 +127,29 @@ export const AllVariants: Story = {
124
127
  }
125
128
 
126
129
  /**
127
- * The 390px fixture. An unbroken 130-character path and a table
128
- * wider than the phone it is on, in one column.
130
+ * The 390px fixture: everything that tries to make the **page**
131
+ * scroll when only `<main>` should, in one column.
129
132
  *
130
- * The path wraps because `Main` sets `overflow-wrap: break-word`;
131
- * the table cannot wrap at all and lives in a labelled,
132
- * keyboard-reachable scroll container. Neither widens the page,
133
- * which is the assertion `Main.test.tsx` makes at a real 390px
134
- * viewport.
133
+ * Sideways, three ways. The path wraps because `Main` sets
134
+ * `overflow-wrap: anywhere`; the table cannot wrap at all and
135
+ * lives in a labelled, keyboard-reachable scroll container; and
136
+ * the drawer parked at `translateX(110%)` is clipped. The drawer
137
+ * is **inside** `Main` here, unlike `Shell.stories.tsx`, so the
138
+ * element clipping it is `Main` — `position: relative` moved that
139
+ * job in from the frame, and `overflow-x: hidden` is `Main`
140
+ * taking it.
141
+ *
142
+ * Downwards, once, and it is the shape nobody looks for: the
143
+ * footer link's `sr-only` "(opens in a new tab)" span is
144
+ * `position: absolute`, so it resolves against the nearest
145
+ * positioned ancestor. Before `Main` was one that was `Shell`,
146
+ * outside the scrollport, and the span's static position past the
147
+ * fold became scrollable overflow on the page. `ScrollFiller` is
148
+ * what puts it past the fold; without the height there is nothing
149
+ * to escape.
150
+ *
151
+ * The assertions are in `Main.test.tsx` at a real 390px viewport
152
+ * — a story is a demo.
135
153
  */
136
154
  export const Responsive: Story = {
137
155
  render: (mainProps) => (
@@ -139,7 +157,21 @@ export const Responsive: Story = {
139
157
  <Header heading="Transfers" />
140
158
 
141
159
  <Main {...mainProps}>
160
+ <ParkedDrawer />
161
+
142
162
  <OverflowingContent />
163
+
164
+ {/*
165
+ Twice. One is a few dozen pixels short of filling an
166
+ 844px phone, and the footer below has to sit past the
167
+ fold or there is nothing for its hidden span to escape
168
+ to.
169
+ */}
170
+ <ScrollFiller />
171
+
172
+ <ScrollFiller />
173
+
174
+ <ExternalLinkFooter />
143
175
  </Main>
144
176
  </Shell>
145
177
  ),
@@ -89,7 +89,7 @@ test("main is the query container its content responds to", async () => {
89
89
  ).toHaveLength(2)
90
90
  })
91
91
 
92
- test("neither an unbroken path nor a wide table widens the page at 390px", async () => {
92
+ test("nothing in the fixture widens the page at 390px", async () => {
93
93
  await setViewport(PHONE)
94
94
 
95
95
  const { canvas, canvasElement } =
@@ -131,6 +131,30 @@ test("neither an unbroken path nor a wide table widens the page at 390px", async
131
131
  scroller.clientWidth,
132
132
  )
133
133
 
134
+ // The drawer parked at `translateX(110%)`, which is inside
135
+ // `Main` in this story rather than beside it. `Shell`'s
136
+ // `overflow-x: clip` cannot reach it any more — `Main` is
137
+ // `position: relative`, so `Main` is its containing block and
138
+ // `Main`'s own `overflow-x` is the only thing between it and a
139
+ // horizontal scrollbar on the scrollport.
140
+ const parkedDrawer = canvasElement.querySelector(
141
+ "#parked-drawer",
142
+ ) as HTMLElement
143
+
144
+ const main = canvas.getByRole("main")
145
+
146
+ await expect(parkedDrawer.offsetParent).toBe(main)
147
+
148
+ // `hidden` rather than `clip`, and the browser decides that:
149
+ // `overflow-x: clip` beside an `overflow-y: auto` computes to
150
+ // `hidden`, so `Main` writes what will actually be used. It is
151
+ // also why the assertion is on the *page* below rather than on
152
+ // `main.scrollWidth` — a `hidden` box still reports the
153
+ // overflow it is refusing to scroll to.
154
+ await expect(
155
+ globalThis.getComputedStyle(main).overflowX,
156
+ ).toBe("hidden")
157
+
134
158
  const { documentElement } = document
135
159
 
136
160
  await expect(
@@ -140,6 +164,65 @@ test("neither an unbroken path nor a wide table widens the page at 390px", async
140
164
  await expectNoAxeViolations(canvasElement)
141
165
  })
142
166
 
167
+ /**
168
+ * The second scrollbar, and how cheaply it is bought.
169
+ *
170
+ * `<main>` is the page's only vertical scrollport, so the document
171
+ * itself must not scroll. An absolutely positioned descendant
172
+ * breaks that unless `<main>` is its containing block: resolve it
173
+ * against `Shell` instead — which is what `position: static` here
174
+ * used to mean — and the box keeps its static position, deep down
175
+ * a long document, while sitting outside the scrollport. The page
176
+ * grows to reach it.
177
+ *
178
+ * The box in this fixture is Tailwind's `sr-only`, one pixel of
179
+ * nothing on an "opens in a new tab" hint. Measured on Folio
180
+ * before this: `<main>` 835px tall,
181
+ * `document.documentElement.scrollHeight` 2085 — the span's
182
+ * offset, exactly.
183
+ */
184
+ test("a visually hidden span past the fold does not give the page a second scrollbar", async () => {
185
+ await setViewport(PHONE)
186
+
187
+ const { canvas, canvasElement } =
188
+ await mountStory(Responsive)
189
+
190
+ const main = canvas.getByRole("main")
191
+
192
+ // The fixture is only a fixture if `<main>` genuinely scrolls
193
+ // and the span genuinely sits past the fold. Without the
194
+ // height there is nothing for it to escape to, and every
195
+ // assertion below would pass against a short page.
196
+ await expect(main.scrollHeight).toBeGreaterThan(
197
+ main.clientHeight,
198
+ )
199
+
200
+ // By id rather than by text: the hint's words are part of the
201
+ // link's accessible name too, so a text query matches both the
202
+ // span and the anchor around it.
203
+ const hint = canvasElement.querySelector(
204
+ "#new-tab-hint",
205
+ ) as HTMLElement
206
+
207
+ await expect(
208
+ globalThis.getComputedStyle(hint).position,
209
+ ).toBe("absolute")
210
+
211
+ await expect(
212
+ hint.getBoundingClientRect().top,
213
+ ).toBeGreaterThan(main.getBoundingClientRect().bottom)
214
+
215
+ await expect(hint.offsetParent).toBe(main)
216
+
217
+ const { documentElement } = document
218
+
219
+ await expect(
220
+ documentElement.scrollHeight,
221
+ ).toBeLessThanOrEqual(documentElement.clientHeight)
222
+
223
+ await expectNoAxeViolations(canvasElement)
224
+ })
225
+
143
226
  /**
144
227
  * `tabIndex={-1}` is the difference between a skip link that
145
228
  * works and one that only scrolls. It must not put `<main>` in
package/src/Main/Main.tsx CHANGED
@@ -101,6 +101,39 @@ export type MainProps = ComponentPropsWithRef<"main"> & {
101
101
  * an app's own fixed chrome belongs in `Shell`, beside `Main`
102
102
  * rather than in it.
103
103
  *
104
+ * ## `relative` — the scrollport has to be the containing block
105
+ *
106
+ * `<main>` is the page's only vertical scrollport, so everything
107
+ * in it is supposed to scroll *inside* it. An absolutely
108
+ * positioned descendant does not, unless this element is its
109
+ * containing block: with `position: static` here, the nearest
110
+ * positioned ancestor is `Shell`, which is **outside** the
111
+ * scrollport. The box then resolves against `Shell`, `<main>`'s
112
+ * `overflow-y` has no authority over it, and its static position —
113
+ * a couple of thousand pixels down a long document — becomes
114
+ * scrollable overflow on `documentElement`. The page grows to
115
+ * reach it and the reader gets a **second scrollbar** beside the
116
+ * one `<main>` already has.
117
+ *
118
+ * The box does not have to be exotic. Tailwind's `sr-only` is
119
+ * `position: absolute`, so the visually hidden
120
+ * `<span>(opens in a new tab)</span>` on one link in a document
121
+ * footer is enough. Measured on Folio at 1440x900: `<main>` was
122
+ * 835px tall and `document.documentElement.scrollHeight` read
123
+ * 2085, which is exactly where that span sat.
124
+ *
125
+ * `overflow-x: hidden` comes with it and is not decoration.
126
+ * `relative` moves every absolutely positioned descendant's
127
+ * containing block from `Shell` to here, which also moves what
128
+ * clips them **sideways**: `Shell`'s `overflow-x: clip` no longer
129
+ * reaches them, so a drawer parked at `translateX(110%)` inside
130
+ * `Main` would draw a horizontal scrollbar on the scrollport
131
+ * instead of being clipped. `hidden` rather than `clip` because
132
+ * this element already scrolls on the other axis — a `clip` beside
133
+ * an `auto` computes to `hidden` anyway, and writing what the
134
+ * browser will use is the honest spelling. `Shell`'s note on the
135
+ * clip explains the other half.
136
+ *
104
137
  * ## It remembers where each history entry was scrolled to
105
138
  *
106
139
  * `Shell` gives this element the page's only vertical scrollport,
@@ -189,7 +222,7 @@ export const Main = ({
189
222
  <main
190
223
  {...mainProps}
191
224
  className={toClassName(
192
- "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",
225
+ "charcuterie-scrollbar relative col-start-1 row-start-3 min-h-0 min-w-0 overflow-x-hidden overflow-y-auto md:col-start-2 md:row-start-2",
193
226
  className,
194
227
  )}
195
228
  id={id ?? shell?.mainId ?? fallbackId}
@@ -4,10 +4,11 @@ import { Meta } from "@storybook/addon-docs/blocks";
4
4
 
5
5
  # Routing
6
6
 
7
- `TextLink` and `ButtonLink` render a real `<a href>`. That is already correct with no setup
8
- at all — it navigates, it can be middle-clicked, ctrl-clicked, opened in a new tab and
9
- copied — it just reloads the page. **One provider at the app root** upgrades every link in
10
- the tree to the app's own soft navigation, with no change at any call site.
7
+ `TextLink`, `ButtonLink`, and `UnstyledLink` render a real `<a href>`. That is already
8
+ correct with no setup at all — it navigates, it can be middle-clicked, ctrl-clicked, opened
9
+ in a new tab and copied — it just reloads the page. **One provider at the app root**
10
+ upgrades every link in the tree to the app's own soft navigation, with no change at any
11
+ call site.
11
12
 
12
13
  ## Why the library does not just import a router
13
14
 
@@ -107,6 +108,25 @@ export const ChannelCard = ({ channel }) => (
107
108
  )
108
109
  ```
109
110
 
111
+ `TextLink` owns the fleet's inline and standalone text-link paint. `ButtonLink` owns the
112
+ button-shaped paint. When an app already owns the complete appearance and must preserve it,
113
+ `UnstyledLink` supplies only the same routing behavior:
114
+
115
+ ```tsx
116
+ import { UnstyledLink } from "@charcuterie/ui"
117
+
118
+ <UnstyledLink
119
+ className="text-xs text-content-secondary hover:text-content-primary"
120
+ href="/jobs"
121
+ >
122
+ Jobs
123
+ </UnstyledLink>
124
+ ```
125
+
126
+ It adds no class and changes no target, relation, or accessible name. Prefer the two painted
127
+ components for new UI. Use `UnstyledLink` for an established app-owned treatment whose
128
+ appearance is not part of the change.
129
+
110
130
  ## Any other router
111
131
 
112
132
  The seam's contract is **a component that takes `href`**, so an adapter is a rename. There
@@ -208,6 +228,7 @@ what `Main.stories.tsx` does.
208
228
  | `useRouterLink()` | `@charcuterie/ui` | The injected component, or `AnchorLink`. For an app building its own link-shaped component. |
209
229
  | `RouterLinkComponent` / `RouterLinkProps` | `@charcuterie/ui` | The contract: `ComponentPropsWithRef<"a">` with `href` required. |
210
230
  | `AnchorLink` | `@charcuterie/ui` | The plain `<a href>` default. |
231
+ | `UnstyledLink` | `@charcuterie/ui` | The router-aware link seam with no library paint. |
211
232
  | `getIsRoutedHref(href)` | `@charcuterie/ui` | The destination test above. |
212
233
  | `ScrollMemoryProvider` | `@charcuterie/ui` | The scroll seam. `entry` is `{ key, path }` for the current history entry. |
213
234
  | `ScrollEntry` | `@charcuterie/ui` | That pair's type. |
@@ -0,0 +1,57 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import type { ReactNode } from "react"
3
+
4
+ import { RouterLinkProvider } from "./RouterLinkProvider.tsx"
5
+ import type { RouterLinkProps } from "./routerLink.ts"
6
+ import { UnstyledLink } from "./UnstyledLink.tsx"
7
+
8
+ const SoftRouterLink = ({
9
+ href,
10
+ ...linkProps
11
+ }: RouterLinkProps): ReactNode => (
12
+ <a {...linkProps} data-router="soft" href={href} />
13
+ )
14
+
15
+ const meta = {
16
+ title: "Utilities/UnstyledLink",
17
+ component: UnstyledLink,
18
+ parameters: { layout: "padded" },
19
+ args: {
20
+ children: "Jobs",
21
+ className:
22
+ "text-sm text-intent-accent-content hover:underline",
23
+ href: "/jobs",
24
+ },
25
+ } satisfies Meta<typeof UnstyledLink>
26
+
27
+ export default meta
28
+
29
+ type Story = StoryObj<typeof meta>
30
+
31
+ export const Default: Story = {}
32
+
33
+ export const Routed: Story = {
34
+ decorators: [
35
+ (Story) => (
36
+ <RouterLinkProvider link={SoftRouterLink}>
37
+ <Story />
38
+ </RouterLinkProvider>
39
+ ),
40
+ ],
41
+ render: (linkProps) => (
42
+ <div className="flex gap-4">
43
+ <UnstyledLink {...linkProps}>
44
+ Routed jobs
45
+ </UnstyledLink>
46
+ <UnstyledLink
47
+ {...linkProps}
48
+ href="https://example.com/jobs"
49
+ >
50
+ External jobs
51
+ </UnstyledLink>
52
+ <UnstyledLink {...linkProps} href="#jobs">
53
+ Jobs fragment
54
+ </UnstyledLink>
55
+ </div>
56
+ ),
57
+ }
@@ -0,0 +1,40 @@
1
+ import { composeStories } from "@storybook/react"
2
+ import { expect } from "storybook/test"
3
+ import { test } from "vitest"
4
+
5
+ import { mountStory } from "../mountStory.testHelpers.ts"
6
+ import { expectAgentDrivable } from "../testing/index.ts"
7
+ import * as stories from "./UnstyledLink.stories.tsx"
8
+
9
+ const { Default, Routed } = composeStories(stories)
10
+
11
+ test("keeps the caller's paint and works without a router", async () => {
12
+ const { canvas } = await mountStory(Default)
13
+ const link = expectAgentDrivable(canvas, {
14
+ name: "Jobs",
15
+ role: "link",
16
+ })
17
+
18
+ await expect(link).toHaveAttribute("href", "/jobs")
19
+ await expect(link).toHaveAttribute(
20
+ "class",
21
+ "text-sm text-intent-accent-content hover:underline",
22
+ )
23
+ await expect(link).not.toHaveAttribute("data-router")
24
+ })
25
+
26
+ test("routes only destinations the injected router can serve", async () => {
27
+ const { canvas } = await mountStory(Routed)
28
+
29
+ await expect(
30
+ canvas.getByRole("link", { name: "Routed jobs" }),
31
+ ).toHaveAttribute("data-router", "soft")
32
+
33
+ await expect(
34
+ canvas.getByRole("link", { name: "External jobs" }),
35
+ ).not.toHaveAttribute("data-router")
36
+
37
+ await expect(
38
+ canvas.getByRole("link", { name: "Jobs fragment" }),
39
+ ).not.toHaveAttribute("data-router")
40
+ })
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from "react"
2
+
3
+ import { AnchorLink } from "./AnchorLink.tsx"
4
+ import { useRouterLink } from "./RouterLinkProvider.tsx"
5
+ import {
6
+ getIsRoutedHref,
7
+ type RouterLinkProps,
8
+ } from "./routerLink.ts"
9
+
10
+ export type UnstyledLinkProps = RouterLinkProps
11
+
12
+ /**
13
+ * A router-aware link that owns no paint.
14
+ *
15
+ * Use this only when the caller already owns the complete visual
16
+ * treatment. `TextLink` and `ButtonLink` remain the defaults for the
17
+ * two link appearances the library owns.
18
+ *
19
+ * An in-app destination goes through the injected router. Another
20
+ * origin, another scheme, or a same-page fragment stays a platform
21
+ * anchor. With no provider, the injected component is `AnchorLink`,
22
+ * so this remains a working `<a href>` in Storybook and tests.
23
+ */
24
+ export const UnstyledLink = ({
25
+ href,
26
+ ...linkProps
27
+ }: UnstyledLinkProps): ReactNode => {
28
+ const RouterLink = useRouterLink()
29
+ const LinkElement = getIsRoutedHref(href)
30
+ ? RouterLink
31
+ : AnchorLink
32
+
33
+ return <LinkElement {...linkProps} href={href} />
34
+ }
@@ -8,6 +8,7 @@ import {
8
8
  HeaderSchemeToggle,
9
9
  OverflowingContent,
10
10
  PageContent,
11
+ ParkedDrawer,
11
12
  RailDetail,
12
13
  RailNavigation,
13
14
  ScrollFiller,
@@ -130,6 +131,14 @@ export const WithBothRails: Story = {
130
131
  * scrolls left and right today for the first reason; the second
131
132
  * is what an `overflow-wrap` alone cannot save.
132
133
  *
134
+ * The third shape is `ParkedDrawer`, and it sits **beside**
135
+ * `Main` rather than in it — an app's parked chrome is parked
136
+ * against the frame, which is the arrangement `Shell`'s
137
+ * `overflow-x: clip` exists for. Absolutely positioned children
138
+ * of a grid container take no track, so it costs the layout
139
+ * nothing. `Main.stories.tsx` renders the same drawer *inside*
140
+ * `Main`, where the clip that answers it is `Main`'s own.
141
+ *
133
142
  * `document.documentElement.scrollWidth <= clientWidth` at 390px
134
143
  * is the assertion, and it is in `Shell.test.tsx` rather than
135
144
  * here — a story is a demo.
@@ -150,6 +159,8 @@ export const Responsive: Story = {
150
159
  <OverflowingContent />
151
160
  </Main>
152
161
 
162
+ <ParkedDrawer />
163
+
153
164
  <Rail label="Job detail" side="end">
154
165
  <RailDetail />
155
166
  </Rail>
package/src/index.ts CHANGED
@@ -383,6 +383,8 @@ export type {
383
383
  RouterLinkProps,
384
384
  } from "./RouterLink/routerLink.ts"
385
385
  export { getIsRoutedHref } from "./RouterLink/routerLink.ts"
386
+ export type { UnstyledLinkProps } from "./RouterLink/UnstyledLink.tsx"
387
+ export { UnstyledLink } from "./RouterLink/UnstyledLink.tsx"
386
388
  export type { SearchInputProps } from "./SearchInput/SearchInput.tsx"
387
389
  export { SearchInput } from "./SearchInput/SearchInput.tsx"
388
390
  export type {
@@ -140,8 +140,73 @@ export const ScrollFiller = (): ReactNode => (
140
140
  )
141
141
 
142
142
  /**
143
- * The three things that actually make a page scroll sideways, and
144
- * each needs a different answer.
143
+ * A closed drawer parked off the inline edge by a transform — the
144
+ * third shape that makes a page scroll sideways, and the one that
145
+ * broke plex-channels.
146
+ *
147
+ * It is still laid out, still painted, and still part of the
148
+ * scrollable overflow region of whatever it resolves against: a
149
+ * transform does not remove a box from that region, and neither
150
+ * does `visibility: hidden`. So the page scrolls sideways to reach
151
+ * a panel nobody can see, and every `min-width: 0` in the tree is
152
+ * irrelevant. Only a clip on the box's containing block answers
153
+ * it.
154
+ *
155
+ * **Which element that is depends on where the drawer is
156
+ * rendered, and the two stories place it differently on purpose.**
157
+ * Beside `Main` it is `Shell`'s to clip, which is where an app's
158
+ * parked chrome belongs. Inside `Main` it is `Main`'s, because
159
+ * `Main` is `position: relative` — and that is why `Main` carries
160
+ * an `overflow-x: hidden` of its own rather than leaning on the
161
+ * frame's.
162
+ */
163
+ export const ParkedDrawer = (): ReactNode => (
164
+ <div
165
+ aria-hidden="true"
166
+ className="pointer-events-none absolute top-0 end-0 h-40 w-80 translate-x-[110%] rounded-lg border border-border-subtle bg-surface-raised"
167
+ id="parked-drawer"
168
+ />
169
+ )
170
+
171
+ /**
172
+ * The shape that makes a page scroll **down** when only `<main>`
173
+ * was supposed to: an ordinary external link whose "opens in a new
174
+ * tab" hint is visually hidden.
175
+ *
176
+ * `sr-only` is `position: absolute`. Nothing here looks like
177
+ * layout at all — the span is one pixel and paints nothing — and
178
+ * that is the point: whatever it resolves against inherits its
179
+ * static position, which is wherever the link happens to sit in a
180
+ * long document. Resolve it outside the scrollport and the page
181
+ * grows to reach it, which is a second scrollbar beside `Main`'s.
182
+ * Folio drew both.
183
+ *
184
+ * It goes at the END of a fixture, past the fold, or the escape it
185
+ * demonstrates has nowhere to escape to.
186
+ */
187
+ export const ExternalLinkFooter = (): ReactNode => (
188
+ <p className="text-content-secondary text-sm">
189
+ <a
190
+ className="text-intent-accent-content underline"
191
+ href="#runbook"
192
+ id="runbook-link"
193
+ rel="noreferrer"
194
+ target="_blank"
195
+ >
196
+ The transfer runbook
197
+ <span className="sr-only" id="new-tab-hint">
198
+ {" "}
199
+ (opens in a new tab)
200
+ </span>
201
+ </a>
202
+ </p>
203
+ )
204
+
205
+ /**
206
+ * The two shapes of *content* that make a page scroll sideways,
207
+ * and each needs a different answer. The third shape is a box
208
+ * rather than content and lives in `ParkedDrawer`, because where
209
+ * it is rendered is half of what it demonstrates.
145
210
  *
146
211
  * The **path** is content that *can* wrap and does not, because
147
212
  * nothing in it is a break opportunity. `Main`'s `wrap-anywhere`
@@ -166,23 +231,6 @@ export const ScrollFiller = (): ReactNode => (
166
231
  */
167
232
  export const OverflowingContent = (): ReactNode => (
168
233
  <>
169
- {/*
170
- The third shape, and the one that broke plex-channels: a
171
- closed drawer parked off the inline edge by a transform.
172
-
173
- It is still laid out, still painted, and still part of the
174
- document's scrollable overflow region — a transform does not
175
- remove a box from it, and neither does `visibility: hidden`.
176
- So the page scrolls sideways to reach a panel nobody can see,
177
- and every `min-width: 0` in the tree is irrelevant. `Shell`'s
178
- `overflow-x: clip` is what actually answers it.
179
- */}
180
- <div
181
- aria-hidden="true"
182
- className="pointer-events-none absolute top-0 end-0 h-40 w-80 translate-x-[110%] rounded-lg border border-border-subtle bg-surface-raised"
183
- id="parked-drawer"
184
- />
185
-
186
234
  <p className="text-content-secondary text-sm">
187
235
  /mnt/Bunnies/Family/Media/Television/Some-Very-Long-Show-Name/Season-01/Some-Very-Long-Show-Name-S01E01-Pilot-2160p-HDR-DTS-HD-MA.mkv
188
236
  </p>
@@ -382,11 +382,10 @@ test("the barrel is the only place components are re-exported", async () => {
382
382
  // back-link and made `Button` get used for navigation: `TextLink`
383
383
  // and `ButtonLink`, both a real `<a href>`, differing in paint
384
384
  // rather than semantics: +2 -> 38, on top of `AdaptiveGrid`'s 36.
385
- // `AnchorLink`,
385
+ // `AnchorLink`, `UnstyledLink`,
386
386
  // `RouterLinkProvider`, `ReactRouterLink`, `ScrollMemoryProvider`
387
387
  // and `ReactRouterAdapter` are the router seam rather
388
- // than components anybody stories, and live in `RouterLink/`,
389
- // `Main/` and
388
+ // than painted components, and live in `RouterLink/`, `Main/` and
390
389
  // `reactRouter/` — outside this count by the `<Name>/<Name>.tsx`
391
390
  // rule, exactly as `Overlay/`'s parts are.
392
391
  // The unified app shell adds four: `Shell`, `Header`, `Rail`,