@tenphi/renderer 0.30.1 → 0.30.2
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/client/navigation.js +0 -7
- package/dist/client/navigation.js.map +1 -1
- package/dist/components/MobileMenuFooter.styles.js +2 -2
- package/dist/components/MobileNavigationTabs.astro +30 -28
- package/dist/components/MobileNavigationTabs.styles.js +36 -59
- package/dist/components/SelectPopover.astro +15 -4
- package/dist/components/Sidebar.styles.js +28 -6
- package/dist/components/ThemeSelect.styles.js +1 -1
- package/dist/components/select-popover-styles.js +9 -4
- package/dist/eslint-plugin.js +2 -1
- package/dist/eslint-plugin.js.map +1 -1
- package/dist/overrides/Sidebar.astro +30 -28
- package/dist/theme/defaults.d.ts.map +1 -1
- package/dist/theme/defaults.js +7 -1
- package/dist/theme/defaults.js.map +1 -1
- package/package.json +2 -2
|
@@ -44,13 +44,6 @@ var CookbookSidebarPane = class extends HTMLElement {
|
|
|
44
44
|
}, { signal });
|
|
45
45
|
this.addEventListener("keydown", (event) => {
|
|
46
46
|
if (desktop.matches || !this.matches(":popover-open")) return;
|
|
47
|
-
const sections = this.querySelector("[data-element=MobileNavigationTabs] details[open]");
|
|
48
|
-
if (event.key === "Escape" && sections) {
|
|
49
|
-
event.preventDefault();
|
|
50
|
-
sections.open = false;
|
|
51
|
-
sections.querySelector("summary")?.focus();
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
47
|
if (event.key !== "Tab") return;
|
|
55
48
|
const focusable = Array.from(this.querySelectorAll("a[href], button:not([disabled]), select:not([disabled]), input:not([disabled]), summary, [tabindex=\"0\"]")).filter((element) => element.tabIndex >= 0 && element.getClientRects().length > 0);
|
|
56
49
|
const first = focusable[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","names":[],"sources":["../../src/client/navigation.ts"],"sourcesContent":["import { initializePopoverMotion } from \"./popover-motion.js\";\n\nclass CookbookSidebarPane extends HTMLElement {\n #listeners?: AbortController;\n #inert = new Map<HTMLElement, boolean>();\n #trigger: HTMLButtonElement | undefined;\n\n connectedCallback() {\n this.#listeners?.abort();\n this.#listeners = new AbortController();\n const { signal } = this.#listeners;\n this.#trigger =\n document.querySelector<HTMLButtonElement>(\n '[data-element=MobileMenuToggle][popovertarget=\"cookbook__sidebar\"]',\n ) ?? undefined;\n const desktop = matchMedia(\"(min-width: 50rem)\");\n const syncViewport = () => {\n if (desktop.matches) {\n if (this.matches(\":popover-open\")) this.hidePopover();\n this.#release();\n this.popover = null;\n this.removeAttribute(\"role\");\n this.removeAttribute(\"aria-modal\");\n } else {\n this.popover = \"auto\";\n this.setAttribute(\"role\", \"dialog\");\n this.setAttribute(\"aria-modal\", \"true\");\n }\n };\n syncViewport();\n desktop.addEventListener(\"change\", syncViewport, { signal });\n this.addEventListener(\n \"toggle\",\n () => {\n const open = !desktop.matches && this.matches(\":popover-open\");\n this.#trigger?.setAttribute(\"aria-expanded\", String(open));\n if (open) {\n // Establish the closed position after the popover enters the top\n // layer so its attribute change transitions from an actual layout.\n // Tasty's global SSR renderer does not preserve @starting-style.\n this.getBoundingClientRect();\n this.setAttribute(\"data-open\", \"\");\n for (const element of document.querySelectorAll<HTMLElement>(\n \"[data-element=HeaderFrame], [data-element=MainFrame], [data-element=SkipLink]\",\n )) {\n this.#inert.set(element, element.inert);\n element.inert = true;\n }\n // The browser focuses [autofocus] as the popover opens, but this\n // event arrives later; never pull back focus that moved on since.\n if (!this.contains(document.activeElement))\n this.querySelector<HTMLElement>(\"[autofocus]\")?.focus({\n preventScroll: true,\n });\n } else {\n const restoreFocus =\n this.contains(document.activeElement) ||\n document.activeElement === document.body;\n this.#release();\n if (restoreFocus && !desktop.matches) this.#trigger?.focus();\n }\n },\n { signal },\n );\n this.addEventListener(\n \"keydown\",\n (event) => {\n if (desktop.matches || !this.matches(\":popover-open\")) return;\n
|
|
1
|
+
{"version":3,"file":"navigation.js","names":[],"sources":["../../src/client/navigation.ts"],"sourcesContent":["import { initializePopoverMotion } from \"./popover-motion.js\";\n\nclass CookbookSidebarPane extends HTMLElement {\n #listeners?: AbortController;\n #inert = new Map<HTMLElement, boolean>();\n #trigger: HTMLButtonElement | undefined;\n\n connectedCallback() {\n this.#listeners?.abort();\n this.#listeners = new AbortController();\n const { signal } = this.#listeners;\n this.#trigger =\n document.querySelector<HTMLButtonElement>(\n '[data-element=MobileMenuToggle][popovertarget=\"cookbook__sidebar\"]',\n ) ?? undefined;\n const desktop = matchMedia(\"(min-width: 50rem)\");\n const syncViewport = () => {\n if (desktop.matches) {\n if (this.matches(\":popover-open\")) this.hidePopover();\n this.#release();\n this.popover = null;\n this.removeAttribute(\"role\");\n this.removeAttribute(\"aria-modal\");\n } else {\n this.popover = \"auto\";\n this.setAttribute(\"role\", \"dialog\");\n this.setAttribute(\"aria-modal\", \"true\");\n }\n };\n syncViewport();\n desktop.addEventListener(\"change\", syncViewport, { signal });\n this.addEventListener(\n \"toggle\",\n () => {\n const open = !desktop.matches && this.matches(\":popover-open\");\n this.#trigger?.setAttribute(\"aria-expanded\", String(open));\n if (open) {\n // Establish the closed position after the popover enters the top\n // layer so its attribute change transitions from an actual layout.\n // Tasty's global SSR renderer does not preserve @starting-style.\n this.getBoundingClientRect();\n this.setAttribute(\"data-open\", \"\");\n for (const element of document.querySelectorAll<HTMLElement>(\n \"[data-element=HeaderFrame], [data-element=MainFrame], [data-element=SkipLink]\",\n )) {\n this.#inert.set(element, element.inert);\n element.inert = true;\n }\n // The browser focuses [autofocus] as the popover opens, but this\n // event arrives later; never pull back focus that moved on since.\n if (!this.contains(document.activeElement))\n this.querySelector<HTMLElement>(\"[autofocus]\")?.focus({\n preventScroll: true,\n });\n } else {\n const restoreFocus =\n this.contains(document.activeElement) ||\n document.activeElement === document.body;\n this.#release();\n if (restoreFocus && !desktop.matches) this.#trigger?.focus();\n }\n },\n { signal },\n );\n this.addEventListener(\n \"keydown\",\n (event) => {\n if (desktop.matches || !this.matches(\":popover-open\")) return;\n if (event.key !== \"Tab\") return;\n const focusable = Array.from(\n this.querySelectorAll<HTMLElement>(\n 'a[href], button:not([disabled]), select:not([disabled]), input:not([disabled]), summary, [tabindex=\"0\"]',\n ),\n ).filter(\n (element) =>\n element.tabIndex >= 0 && element.getClientRects().length > 0,\n );\n const first = focusable[0];\n const last = focusable.at(-1);\n if (!first || !last) {\n event.preventDefault();\n this.focus();\n return;\n }\n if (\n event.shiftKey &&\n (document.activeElement === first || document.activeElement === this)\n ) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n },\n { signal },\n );\n this.addEventListener(\n \"click\",\n (event) => {\n if (\n !event.defaultPrevented &&\n event.target instanceof Element &&\n event.target.closest(\"a[href]\") &&\n this.matches(\":popover-open\")\n )\n this.hidePopover();\n },\n { signal },\n );\n }\n\n #release() {\n this.removeAttribute(\"data-open\");\n for (const [element, inert] of this.#inert) element.inert = inert;\n this.#inert.clear();\n this.#trigger?.setAttribute(\"aria-expanded\", \"false\");\n }\n\n disconnectedCallback() {\n this.#listeners?.abort();\n this.#release();\n }\n}\n\nclass CookbookHeaderLinks extends HTMLElement {\n #listeners?: AbortController;\n connectedCallback() {\n this.#listeners?.abort();\n this.#listeners = new AbortController();\n const { signal } = this.#listeners;\n const panel = this.querySelector<HTMLElement>(\"[popover]\");\n const desktop = matchMedia(\"(min-width: 50rem)\");\n const close = () => {\n if (panel?.matches(\":popover-open\")) panel.hidePopover();\n };\n if (panel) initializePopoverMotion(panel, signal);\n desktop.addEventListener(\n \"change\",\n () => {\n if (desktop.matches) close();\n },\n { signal },\n );\n panel?.addEventListener(\n \"click\",\n (event) => {\n if (event.target instanceof Element && event.target.closest(\"a[href]\"))\n close();\n },\n { signal },\n );\n }\n disconnectedCallback() {\n this.#listeners?.abort();\n }\n}\n\nif (!customElements.get(\"cookbook-sidebar-pane\"))\n customElements.define(\"cookbook-sidebar-pane\", CookbookSidebarPane);\nif (!customElements.get(\"cookbook-header-links\"))\n customElements.define(\"cookbook-header-links\", CookbookHeaderLinks);\n"],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ export const MobileMenuFooterRoot = defineComponent("MobileMenuFooter", {
|
|
|
12
12
|
justifyContent: "space-between",
|
|
13
13
|
flow: "row wrap",
|
|
14
14
|
gap: "2x",
|
|
15
|
-
|
|
15
|
+
padding: "1x $docs-sidebar-pad-x",
|
|
16
16
|
blockBorder: "1bw solid #border start",
|
|
17
17
|
Social: {
|
|
18
18
|
$: "Social",
|
|
@@ -21,7 +21,7 @@ export const MobileMenuFooterRoot = defineComponent("MobileMenuFooter", {
|
|
|
21
21
|
alignItems: "center",
|
|
22
22
|
gap: "2x",
|
|
23
23
|
inlineMargin: "auto end",
|
|
24
|
-
blockPadding: "
|
|
24
|
+
blockPadding: "1x",
|
|
25
25
|
},
|
|
26
26
|
},
|
|
27
27
|
});
|
|
@@ -9,6 +9,7 @@ import { content } from "virtual:cookbook/config";
|
|
|
9
9
|
import { layout as configuredLayout } from "virtual:cookbook/layout";
|
|
10
10
|
import { activeNavigationTab, navigationPath } from "../navigation.js";
|
|
11
11
|
import { MobileNavigationTabsRoot } from "./MobileNavigationTabs.styles.js";
|
|
12
|
+
import SelectPopover from "./SelectPopover.astro";
|
|
12
13
|
|
|
13
14
|
interface Props {
|
|
14
15
|
base?: string;
|
|
@@ -45,35 +46,36 @@ const ui = messages(Astro.locals.cookbookRoute?.lang ?? "en", content);
|
|
|
45
46
|
<MobileNavigationTabsRoot
|
|
46
47
|
className="td-mobile-tabs"
|
|
47
48
|
data-print-hidden=""
|
|
48
|
-
|
|
49
|
+
non-modal=""
|
|
50
|
+
focus-on-open="false"
|
|
49
51
|
>
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
/>
|
|
62
|
-
</svg>
|
|
63
|
-
</summary>
|
|
64
|
-
<ul>
|
|
65
|
-
{layout.tabs.map((tab, index) => (
|
|
66
|
-
<li>
|
|
67
|
-
<a
|
|
68
|
-
href={tabHref(tab.link)}
|
|
69
|
-
aria-current={index === activeTab ? "page" : undefined}
|
|
70
|
-
>
|
|
71
|
-
{tab.label}
|
|
72
|
-
</a>
|
|
73
|
-
</li>
|
|
74
|
-
))}
|
|
75
|
-
</ul>
|
|
76
|
-
</details>
|
|
52
|
+
<SelectPopover
|
|
53
|
+
managed
|
|
54
|
+
triggerLabel={ui.chooseSection}
|
|
55
|
+
selectedLabel={layout.tabs[activeTab]?.label ?? ui.sections}
|
|
56
|
+
title={ui.sections}
|
|
57
|
+
options={layout.tabs.map((tab, index) => ({
|
|
58
|
+
href: tabHref(tab.link),
|
|
59
|
+
label: tab.label,
|
|
60
|
+
current: index === activeTab,
|
|
61
|
+
}))}
|
|
62
|
+
/>
|
|
77
63
|
</MobileNavigationTabsRoot>
|
|
78
64
|
)
|
|
79
65
|
}
|
|
66
|
+
|
|
67
|
+
<script>
|
|
68
|
+
// The section selector is mobile-only. Keep the behavior runtime out of
|
|
69
|
+
// desktop page loads, including when a reader later narrows the viewport.
|
|
70
|
+
const mobile = matchMedia("(width < 50rem)");
|
|
71
|
+
const initialize = () => {
|
|
72
|
+
if (
|
|
73
|
+
mobile.matches &&
|
|
74
|
+
document.querySelector("cb-popover[data-element=MobileNavigationTabs]")
|
|
75
|
+
)
|
|
76
|
+
void import("../client/elements.js");
|
|
77
|
+
};
|
|
78
|
+
mobile.addEventListener("change", initialize);
|
|
79
|
+
document.addEventListener("astro:page-load", initialize);
|
|
80
|
+
initialize();
|
|
81
|
+
</script>
|
|
@@ -1,86 +1,63 @@
|
|
|
1
|
+
import { selectPopoverStyles } from "./select-popover-styles.js";
|
|
1
2
|
import { configureCookbookStates } from "./tasty-states.js";
|
|
2
3
|
import { defineComponent } from "../define-component.js";
|
|
3
4
|
|
|
4
5
|
configureCookbookStates();
|
|
5
6
|
|
|
7
|
+
const sectionSelectStyles = selectPopoverStyles({
|
|
8
|
+
option: "Link",
|
|
9
|
+
hoverOption: "HoverLink",
|
|
10
|
+
currentOption: "CurrentLink",
|
|
11
|
+
});
|
|
12
|
+
|
|
6
13
|
export const MobileNavigationTabsRoot = defineComponent(
|
|
7
14
|
"MobileNavigationTabs",
|
|
8
15
|
{
|
|
9
|
-
as: "
|
|
16
|
+
as: "cb-popover",
|
|
10
17
|
"data-element": "MobileNavigationTabs",
|
|
11
18
|
styles: {
|
|
19
|
+
// Reuse the shared, server-only popover anatomy.
|
|
20
|
+
// eslint-disable-next-line tasty/no-style-spread
|
|
21
|
+
...sectionSelectStyles,
|
|
12
22
|
display: "grid",
|
|
13
23
|
hide: { "": false, "@md": true },
|
|
14
|
-
|
|
24
|
+
inlineSize: "min 0",
|
|
15
25
|
blockMargin: "0",
|
|
16
|
-
Label: {
|
|
17
|
-
$: "Label",
|
|
18
|
-
overflow: "hidden",
|
|
19
|
-
textOverflow: "ellipsis",
|
|
20
|
-
whiteSpace: "nowrap",
|
|
21
|
-
},
|
|
22
26
|
Trigger: {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
// Reuse the shared, server-only popover anatomy.
|
|
28
|
+
// eslint-disable-next-line tasty/no-style-spread
|
|
29
|
+
...sectionSelectStyles.Trigger,
|
|
26
30
|
justifyContent: "space-between",
|
|
27
|
-
|
|
31
|
+
inlineSize: "100%",
|
|
28
32
|
blockSize: "min 2.75rem",
|
|
29
33
|
padding: "1x 1.25x",
|
|
30
34
|
border: true,
|
|
31
35
|
radius: "1r",
|
|
32
|
-
color: "#text-soft",
|
|
33
36
|
fill: "#surface",
|
|
34
37
|
preset: "navigation",
|
|
35
|
-
|
|
36
|
-
},
|
|
37
|
-
Marker: {
|
|
38
|
-
$: "summary::marker, summary::-webkit-details-marker",
|
|
39
|
-
hide: true,
|
|
40
|
-
},
|
|
41
|
-
Caret: { $: "summary > svg", flexShrink: "0" },
|
|
42
|
-
ExpandedCaret: {
|
|
43
|
-
$: "details > summary > svg",
|
|
44
|
-
rotate: {
|
|
45
|
-
"": null,
|
|
46
|
-
"@own(:is([open] > summary >))": "180deg",
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
List: {
|
|
50
|
-
$: "ul",
|
|
51
|
-
display: "grid",
|
|
52
|
-
gap: "1bw",
|
|
53
|
-
padding: "1x",
|
|
54
|
-
margin: "1x top",
|
|
55
|
-
listStyle: "none",
|
|
56
|
-
border: true,
|
|
57
|
-
radius: "1r",
|
|
58
|
-
fill: "#surface",
|
|
38
|
+
anchorName: "--section-trigger",
|
|
59
39
|
},
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
textDecoration: "none",
|
|
70
|
-
radius: "1r",
|
|
40
|
+
Panel: {
|
|
41
|
+
// Reuse the shared, server-only popover anatomy.
|
|
42
|
+
// eslint-disable-next-line tasty/no-style-spread
|
|
43
|
+
...sectionSelectStyles.Panel,
|
|
44
|
+
positionAnchor: "--section-trigger",
|
|
45
|
+
blockInset: "(anchor(bottom) + 1x) start, auto end",
|
|
46
|
+
inlineInset: "anchor(start) start, auto end",
|
|
47
|
+
inlineSize: "anchor-size(width)",
|
|
48
|
+
blockSize: "max (100dvh - anchor(bottom) - 2x)",
|
|
71
49
|
},
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
50
|
+
// Keep the original disclosure's customization names on the Select anatomy.
|
|
51
|
+
Label: {
|
|
52
|
+
// eslint-disable-next-line tasty/no-style-spread -- shared label anatomy, retained under its original customization name.
|
|
53
|
+
...sectionSelectStyles.TriggerLabel,
|
|
76
54
|
},
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
},
|
|
55
|
+
List: { $: "> Panel > nav" },
|
|
56
|
+
Item: { $: "> Panel > nav > a" },
|
|
57
|
+
Marker: { $: "> button::marker" },
|
|
58
|
+
ExpandedCaret: {
|
|
59
|
+
$: "> button > Caret",
|
|
60
|
+
rotate: { "": null, ":has([popover]:popover-open)": "180deg" },
|
|
84
61
|
},
|
|
85
62
|
},
|
|
86
63
|
},
|
|
@@ -15,15 +15,25 @@ interface Props {
|
|
|
15
15
|
title: string;
|
|
16
16
|
options: Option[];
|
|
17
17
|
icon?: string;
|
|
18
|
+
/** UniAria owns behavior when rendered inside a cb-popover host. */
|
|
19
|
+
managed?: boolean;
|
|
18
20
|
}
|
|
19
21
|
|
|
20
|
-
const {
|
|
22
|
+
const {
|
|
23
|
+
triggerLabel,
|
|
24
|
+
selectedLabel,
|
|
25
|
+
title,
|
|
26
|
+
options,
|
|
27
|
+
icon,
|
|
28
|
+
managed = false,
|
|
29
|
+
} = Astro.props;
|
|
21
30
|
const id = `select-${crypto.randomUUID()}`;
|
|
22
31
|
---
|
|
23
32
|
|
|
24
33
|
<button
|
|
25
34
|
type="button"
|
|
26
|
-
popovertarget={id}
|
|
35
|
+
popovertarget={managed ? undefined : id}
|
|
36
|
+
data-uni-part={managed ? "popover-trigger" : undefined}
|
|
27
37
|
aria-label={triggerLabel}
|
|
28
38
|
title={title}
|
|
29
39
|
>
|
|
@@ -34,10 +44,11 @@ const id = `select-${crypto.randomUUID()}`;
|
|
|
34
44
|
<div
|
|
35
45
|
id={id}
|
|
36
46
|
data-element="Panel"
|
|
37
|
-
popover="auto"
|
|
47
|
+
popover={managed ? "manual" : "auto"}
|
|
48
|
+
data-uni={managed ? "popover" : undefined}
|
|
38
49
|
role="group"
|
|
39
50
|
aria-label={title}
|
|
40
|
-
data-select-popover-panel
|
|
51
|
+
data-select-popover-panel={managed ? undefined : ""}
|
|
41
52
|
>
|
|
42
53
|
<div data-element="PanelTitle">{title}</div>
|
|
43
54
|
<nav aria-label={title}>
|
|
@@ -31,7 +31,7 @@ export const SidebarRoot = defineComponent("Sidebar", {
|
|
|
31
31
|
border: "0",
|
|
32
32
|
color: "#text",
|
|
33
33
|
overflowY: "auto",
|
|
34
|
-
scrollbar: "auto stable",
|
|
34
|
+
scrollbar: { "": "auto stable", "!@md": "auto" },
|
|
35
35
|
fill: "#surface",
|
|
36
36
|
overscrollBehavior: "contain",
|
|
37
37
|
shadow: { "": "none", "!@md": "0.25rem 0 1rem #shadow" },
|
|
@@ -59,6 +59,14 @@ export const SidebarRoot = defineComponent("Sidebar", {
|
|
|
59
59
|
$: "&::backdrop",
|
|
60
60
|
opacity: { "": null, ":popover-open & [data-open]": "1" },
|
|
61
61
|
},
|
|
62
|
+
MobileHeader: {
|
|
63
|
+
display: "grid",
|
|
64
|
+
hide: { "": true, "!@md": false },
|
|
65
|
+
flexShrink: "0",
|
|
66
|
+
gap: "2x",
|
|
67
|
+
padding: "2x $docs-sidebar-pad-x",
|
|
68
|
+
blockBorder: "1bw solid #border end",
|
|
69
|
+
},
|
|
62
70
|
MobileHeading: {
|
|
63
71
|
$: "MobileHeading",
|
|
64
72
|
display: "flex",
|
|
@@ -135,15 +143,29 @@ export const SidebarRoot = defineComponent("Sidebar", {
|
|
|
135
143
|
$: "Content",
|
|
136
144
|
display: "flex",
|
|
137
145
|
flow: "column",
|
|
138
|
-
blockSize: "min 100%",
|
|
139
|
-
inlinePadding: "$docs-sidebar-pad-x",
|
|
140
|
-
gap: "2x",
|
|
146
|
+
blockSize: { "": "min 100%", "!@md": "100%" },
|
|
147
|
+
inlinePadding: { "": "$docs-sidebar-pad-x", "!@md": "0" },
|
|
148
|
+
gap: { "": "2x", "!@md": "0" },
|
|
141
149
|
blockPadding: {
|
|
142
150
|
"": "3x start, 6x end",
|
|
143
|
-
"!@md": "
|
|
151
|
+
"!@md": "0",
|
|
144
152
|
},
|
|
145
153
|
},
|
|
146
|
-
Tree: {
|
|
154
|
+
Tree: {
|
|
155
|
+
$: "cookbook-sidebar",
|
|
156
|
+
display: "block",
|
|
157
|
+
flexGrow: { "": null, "!@md": "1" },
|
|
158
|
+
flexBasis: { "": null, "!@md": "0" },
|
|
159
|
+
blockSize: { "": null, "!@md": "min 0" },
|
|
160
|
+
padding: { "": null, "!@md": "2x $docs-sidebar-pad-x" },
|
|
161
|
+
overflowY: { "": null, "!@md": "auto" },
|
|
162
|
+
scrollbar: { "": null, "!@md": "auto stable" },
|
|
163
|
+
overscrollBehavior: { "": null, "!@md": "contain" },
|
|
164
|
+
},
|
|
165
|
+
MobileFooter: {
|
|
166
|
+
hide: { "": true, "!@md": false },
|
|
167
|
+
flexShrink: "0",
|
|
168
|
+
},
|
|
147
169
|
List: {
|
|
148
170
|
$: "cookbook-sidebar ul",
|
|
149
171
|
display: "grid",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Shared server-side styles for the language and
|
|
1
|
+
/** Shared server-side styles for the language, version, and section selectors. */
|
|
2
2
|
export function selectPopoverStyles({
|
|
3
3
|
option = "Option",
|
|
4
4
|
hoverOption = "HoverOption",
|
|
@@ -65,17 +65,22 @@ export function selectPopoverStyles({
|
|
|
65
65
|
},
|
|
66
66
|
OpenPanel: {
|
|
67
67
|
$: '> [data-element="Panel"]',
|
|
68
|
+
// UniAria clears data-entering after two frames in the top layer,
|
|
69
|
+
// giving the closed opacity and scale a painted starting point.
|
|
68
70
|
opacity: {
|
|
69
71
|
"": null,
|
|
70
|
-
"@own(:popover-open & [data-open])": "1",
|
|
72
|
+
"@own(:popover-open & [data-open] & ![data-entering])": "1",
|
|
73
|
+
},
|
|
74
|
+
scale: {
|
|
75
|
+
"": null,
|
|
76
|
+
"@own(:popover-open & [data-open] & ![data-entering])": "1",
|
|
71
77
|
},
|
|
72
|
-
scale: { "": null, "@own(:popover-open & [data-open])": "1" },
|
|
73
78
|
},
|
|
74
79
|
PanelTitle: {
|
|
75
80
|
$: "PanelTitle",
|
|
76
81
|
padding: "0.75x 1x",
|
|
77
82
|
color: "#text-muted",
|
|
78
|
-
preset: "
|
|
83
|
+
preset: "control-label / strong",
|
|
79
84
|
},
|
|
80
85
|
Options: { $: "nav", display: "grid", gap: "0.25x" },
|
|
81
86
|
[option]: {
|
package/dist/eslint-plugin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eslint-plugin.js","names":["validationConfig"],"sources":["../src/tasty.config.ts","../src/eslint-plugin.ts"],"sourcesContent":["import type { TastyValidationConfig } from \"@tenphi/eslint-plugin-tasty\";\n\nexport default {\n importSources: [\n \"@tenphi/cookbook/styling\",\n \"@tenphi/renderer/styling\",\n \"./component-styles.js\",\n \"../define-component.js\",\n ],\n styleFunctions: {\n defineComponent: { argument: 1, kind: \"options\" },\n extendComponent: { argument: 2, kind: \"options\", partial: true },\n resolveComponentStyles: { argument: 1, kind: \"styles\" },\n },\n tokens: [\n \"$gap\",\n \"$margin-block-start\",\n \"$margin-block-end\",\n \"$padding-block-start\",\n \"$padding-block-end\",\n \"$radius\",\n \"$header-control-radius\",\n \"$card-radius\",\n \"$border-width\",\n \"$outline-width\",\n \"$outline-offset\",\n \"$layout-width\",\n \"$content-width\",\n \"$sidebar-width\",\n \"$control-height\",\n \"$transition\",\n \"$sharp-radius\",\n \"$bold-font-weight\",\n \"#white\",\n \"#black\",\n \"#clear\",\n \"#current\",\n \"#surface\",\n \"#header\",\n \"#heading\",\n \"#surface-2\",\n \"#surface-3\",\n \"#surface-2-hover\",\n \"#surface-2-pressed\",\n \"#surface-3-hover\",\n \"#surface-3-pressed\",\n \"#text\",\n \"#text-soft\",\n \"#text-muted\",\n \"#sidebar-text\",\n \"#border\",\n \"#border-strong\",\n \"#accent-text\",\n \"#accent-surface\",\n \"#accent-surface-text\",\n \"#logo-surface\",\n \"#logo-mark\",\n \"#accent-surface-subtle\",\n \"#accent-surface-2-subtle\",\n \"#focus\",\n \"#shadow\",\n \"#overlay\",\n \"#syntax-bg\",\n \"#syntax-text\",\n \"#syntax-comment\",\n \"#syntax-punctuation\",\n \"#syntax-keyword\",\n \"#syntax-string\",\n \"#syntax-token\",\n \"#syntax-property\",\n \"#syntax-number\",\n \"#syntax-function\",\n \"#syntax-value\",\n \"#syntax-operator\",\n \"#info\",\n \"#info-surface\",\n \"#info-text\",\n \"#success\",\n \"#success-surface\",\n \"#success-text\",\n \"#warning\",\n \"#warning-surface\",\n \"#warning-text\",\n \"#danger\",\n \"#danger-surface\",\n \"#danger-text\",\n \"#orange-surface\",\n \"#orange\",\n \"#orange-text\",\n \"#green-surface\",\n \"#green\",\n \"#green-text\",\n \"#blue-surface\",\n \"#blue\",\n \"#blue-text\",\n \"#purple-surface\",\n \"#purple\",\n \"#purple-text\",\n \"#red-surface\",\n \"#red\",\n \"#red-text\",\n ],\n units: [\"x\", \"r\", \"cr\", \"bw\"],\n states: [\n \"@system-light\",\n \"@system-dark\",\n \"@light\",\n \"@dark\",\n \"@sm\",\n \"@md\",\n \"@lg\",\n \"@reduced-motion\",\n \"@prose\",\n \"@prose-block\",\n \"@prose-heading\",\n ],\n presets: [\n \"body\",\n \"heading\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"navigation\",\n \"small\",\n \"code\",\n \"hero-title\",\n \"hero-tagline\",\n \"prose\",\n \"inline-code\",\n ],\n} satisfies TastyValidationConfig;\n","export { default, recommended, strict } from \"@tenphi/eslint-plugin-tasty\";\nexport type {\n ResolvedConfig,\n StyleFunctionConfig,\n TastyValidationConfig,\n} from \"@tenphi/eslint-plugin-tasty\";\nexport { default as validationConfig } from \"./tasty.config.js\";\n\nimport type { ThemeConfig } from \"@tenphi/docs\";\nimport type { TastyValidationConfig } from \"@tenphi/eslint-plugin-tasty\";\nimport validationConfig from \"./tasty.config.js\";\n\n/** Keep editor/linter names aligned with a Cookbook theme. */\nexport function createValidationConfig(\n theme: ThemeConfig = {},\n): TastyValidationConfig {\n return {\n ...validationConfig,\n tokens: [\n ...validationConfig.tokens,\n ...Object.keys(theme.tokens ?? {}),\n ...Object.keys(theme.palette ?? {}).map((name) => `#${name}`),\n ],\n units: [...validationConfig.units, ...Object.keys(theme.units ?? {})],\n states: [...validationConfig.states, ...Object.keys(theme.states ?? {})],\n presets: [...validationConfig.presets, ...Object.keys(theme.presets ?? {})],\n recipes: Object.keys(theme.recipes ?? {}),\n };\n}\n"],"mappings":";;AAEA,IAAA,uBAAe;CACb,eAAe;EACb;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd,iBAAiB;GAAE,UAAU;GAAG,MAAM;EAAU;EAChD,iBAAiB;GAAE,UAAU;GAAG,MAAM;GAAW,SAAS;EAAK;EAC/D,wBAAwB;GAAE,UAAU;GAAG,MAAM;EAAS;CACxD;CACA,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO;EAAC;EAAK;EAAK;EAAM;CAAI;CAC5B,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;
|
|
1
|
+
{"version":3,"file":"eslint-plugin.js","names":["validationConfig"],"sources":["../src/tasty.config.ts","../src/eslint-plugin.ts"],"sourcesContent":["import type { TastyValidationConfig } from \"@tenphi/eslint-plugin-tasty\";\n\nexport default {\n importSources: [\n \"@tenphi/cookbook/styling\",\n \"@tenphi/renderer/styling\",\n \"./component-styles.js\",\n \"../define-component.js\",\n ],\n styleFunctions: {\n defineComponent: { argument: 1, kind: \"options\" },\n extendComponent: { argument: 2, kind: \"options\", partial: true },\n resolveComponentStyles: { argument: 1, kind: \"styles\" },\n },\n tokens: [\n \"$gap\",\n \"$margin-block-start\",\n \"$margin-block-end\",\n \"$padding-block-start\",\n \"$padding-block-end\",\n \"$radius\",\n \"$header-control-radius\",\n \"$card-radius\",\n \"$border-width\",\n \"$outline-width\",\n \"$outline-offset\",\n \"$layout-width\",\n \"$content-width\",\n \"$sidebar-width\",\n \"$control-height\",\n \"$transition\",\n \"$sharp-radius\",\n \"$bold-font-weight\",\n \"#white\",\n \"#black\",\n \"#clear\",\n \"#current\",\n \"#surface\",\n \"#header\",\n \"#heading\",\n \"#surface-2\",\n \"#surface-3\",\n \"#surface-2-hover\",\n \"#surface-2-pressed\",\n \"#surface-3-hover\",\n \"#surface-3-pressed\",\n \"#text\",\n \"#text-soft\",\n \"#text-muted\",\n \"#sidebar-text\",\n \"#border\",\n \"#border-strong\",\n \"#accent-text\",\n \"#accent-surface\",\n \"#accent-surface-text\",\n \"#logo-surface\",\n \"#logo-mark\",\n \"#accent-surface-subtle\",\n \"#accent-surface-2-subtle\",\n \"#focus\",\n \"#shadow\",\n \"#overlay\",\n \"#syntax-bg\",\n \"#syntax-text\",\n \"#syntax-comment\",\n \"#syntax-punctuation\",\n \"#syntax-keyword\",\n \"#syntax-string\",\n \"#syntax-token\",\n \"#syntax-property\",\n \"#syntax-number\",\n \"#syntax-function\",\n \"#syntax-value\",\n \"#syntax-operator\",\n \"#info\",\n \"#info-surface\",\n \"#info-text\",\n \"#success\",\n \"#success-surface\",\n \"#success-text\",\n \"#warning\",\n \"#warning-surface\",\n \"#warning-text\",\n \"#danger\",\n \"#danger-surface\",\n \"#danger-text\",\n \"#orange-surface\",\n \"#orange\",\n \"#orange-text\",\n \"#green-surface\",\n \"#green\",\n \"#green-text\",\n \"#blue-surface\",\n \"#blue\",\n \"#blue-text\",\n \"#purple-surface\",\n \"#purple\",\n \"#purple-text\",\n \"#red-surface\",\n \"#red\",\n \"#red-text\",\n ],\n units: [\"x\", \"r\", \"cr\", \"bw\"],\n states: [\n \"@system-light\",\n \"@system-dark\",\n \"@light\",\n \"@dark\",\n \"@sm\",\n \"@md\",\n \"@lg\",\n \"@reduced-motion\",\n \"@prose\",\n \"@prose-block\",\n \"@prose-heading\",\n ],\n presets: [\n \"body\",\n \"heading\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"navigation\",\n \"small\",\n \"code\",\n \"hero-title\",\n \"hero-tagline\",\n \"prose\",\n \"inline-code\",\n \"control-label\",\n ],\n} satisfies TastyValidationConfig;\n","export { default, recommended, strict } from \"@tenphi/eslint-plugin-tasty\";\nexport type {\n ResolvedConfig,\n StyleFunctionConfig,\n TastyValidationConfig,\n} from \"@tenphi/eslint-plugin-tasty\";\nexport { default as validationConfig } from \"./tasty.config.js\";\n\nimport type { ThemeConfig } from \"@tenphi/docs\";\nimport type { TastyValidationConfig } from \"@tenphi/eslint-plugin-tasty\";\nimport validationConfig from \"./tasty.config.js\";\n\n/** Keep editor/linter names aligned with a Cookbook theme. */\nexport function createValidationConfig(\n theme: ThemeConfig = {},\n): TastyValidationConfig {\n return {\n ...validationConfig,\n tokens: [\n ...validationConfig.tokens,\n ...Object.keys(theme.tokens ?? {}),\n ...Object.keys(theme.palette ?? {}).map((name) => `#${name}`),\n ],\n units: [...validationConfig.units, ...Object.keys(theme.units ?? {})],\n states: [...validationConfig.states, ...Object.keys(theme.states ?? {})],\n presets: [...validationConfig.presets, ...Object.keys(theme.presets ?? {})],\n recipes: Object.keys(theme.recipes ?? {}),\n };\n}\n"],"mappings":";;AAEA,IAAA,uBAAe;CACb,eAAe;EACb;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd,iBAAiB;GAAE,UAAU;GAAG,MAAM;EAAU;EAChD,iBAAiB;GAAE,UAAU;GAAG,MAAM;GAAW,SAAS;EAAK;EAC/D,wBAAwB;GAAE,UAAU;GAAG,MAAM;EAAS;CACxD;CACA,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO;EAAC;EAAK;EAAK;EAAM;CAAI;CAC5B,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;;;ACzHA,SAAgB,uBACd,QAAqB,CAAC,GACC;CACvB,OAAO;EACL,GAAGA;EACH,QAAQ;GACN,GAAGA,qBAAiB;GACpB,GAAG,OAAO,KAAK,MAAM,UAAU,CAAC,CAAC;GACjC,GAAG,OAAO,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM;EAC9D;EACA,OAAO,CAAC,GAAGA,qBAAiB,OAAO,GAAG,OAAO,KAAK,MAAM,SAAS,CAAC,CAAC,CAAC;EACpE,QAAQ,CAAC,GAAGA,qBAAiB,QAAQ,GAAG,OAAO,KAAK,MAAM,UAAU,CAAC,CAAC,CAAC;EACvE,SAAS,CAAC,GAAGA,qBAAiB,SAAS,GAAG,OAAO,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC;EAC1E,SAAS,OAAO,KAAK,MAAM,WAAW,CAAC,CAAC;CAC1C;AACF"}
|
|
@@ -46,35 +46,37 @@ const sidebar =
|
|
|
46
46
|
const ui = messages(Astro.locals.cookbookRoute?.lang ?? "en", content);
|
|
47
47
|
---
|
|
48
48
|
|
|
49
|
-
<div data-element="
|
|
50
|
-
<
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
<Logo />
|
|
61
|
-
<span data-element="HomeLabel" data-site-title
|
|
62
|
-
>{Astro.locals.cookbookRoute.siteTitle}</span
|
|
49
|
+
<div data-element="MobileHeader">
|
|
50
|
+
<div data-element="MobileHeading">
|
|
51
|
+
<a
|
|
52
|
+
data-element="HomeLink"
|
|
53
|
+
href={localeHref(
|
|
54
|
+
(content.logo && content.logo.href) || "/",
|
|
55
|
+
currentPath,
|
|
56
|
+
content.routes,
|
|
57
|
+
content,
|
|
58
|
+
content.base,
|
|
59
|
+
)}
|
|
63
60
|
>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
61
|
+
<Logo />
|
|
62
|
+
<span data-element="HomeLabel" data-site-title
|
|
63
|
+
>{Astro.locals.cookbookRoute.siteTitle}</span
|
|
64
|
+
>
|
|
65
|
+
</a>
|
|
66
|
+
<button
|
|
67
|
+
type="button"
|
|
68
|
+
popovertarget="cookbook__sidebar"
|
|
69
|
+
popovertargetaction="hide"
|
|
70
|
+
aria-label={ui.closeNavigation}
|
|
71
|
+
autofocus><Icon name="close" /></button
|
|
72
|
+
>
|
|
73
|
+
</div>
|
|
73
74
|
|
|
74
|
-
<MobileNavigationTabs
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
/>
|
|
75
|
+
<MobileNavigationTabs
|
|
76
|
+
base={import.meta.env.BASE_URL}
|
|
77
|
+
currentPath={Astro.url.pathname}
|
|
78
|
+
/>
|
|
79
|
+
</div>
|
|
78
80
|
|
|
79
81
|
<cookbook-sidebar
|
|
80
82
|
data-storage-key={`cookbook-sidebar:${import.meta.env.BASE_URL}:${groupIndex ?? "all"}`}
|
|
@@ -82,7 +84,7 @@ const ui = messages(Astro.locals.cookbookRoute?.lang ?? "en", content);
|
|
|
82
84
|
<SidebarList entries={sidebar} />
|
|
83
85
|
</cookbook-sidebar>
|
|
84
86
|
|
|
85
|
-
<div data-mobile="">
|
|
87
|
+
<div data-element="MobileFooter" data-mobile="">
|
|
86
88
|
<MobileMenuFooter />
|
|
87
89
|
</div>
|
|
88
90
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","names":[],"sources":["../../src/theme/defaults.ts"],"mappings":";;cAMa;;;;;;;;;;;;;cAmBA,4BAA4B,eAAe;
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","names":[],"sources":["../../src/theme/defaults.ts"],"mappings":";;cAMa;;;;;;;;;;;;;cAmBA,4BAA4B,eAAe;iBAkFxC,mBAAmB,SAAQ,cAAmB;iBAI9C,yBACd,UAAS,mBACT,eAAc,QAAQ,+CACrB,eAAe"}
|
package/dist/theme/defaults.js
CHANGED
|
@@ -66,7 +66,13 @@ const DEFAULT_TYPOGRAPHY_PRESETS = {
|
|
|
66
66
|
lineHeight: 1.55
|
|
67
67
|
}),
|
|
68
68
|
prose: derivedPreset("body", { fontSize: "1.025rem" }),
|
|
69
|
-
"inline-code": derivedPreset("code", { fontSize: "0.875em" })
|
|
69
|
+
"inline-code": derivedPreset("code", { fontSize: "0.875em" }),
|
|
70
|
+
"control-label": derivedPreset("small", {
|
|
71
|
+
fontSize: "0.75rem",
|
|
72
|
+
lineHeight: 1.4,
|
|
73
|
+
letterSpacing: "0.06em",
|
|
74
|
+
textTransform: "uppercase"
|
|
75
|
+
})
|
|
70
76
|
};
|
|
71
77
|
/** Keep specialized typography linked to user-configured base presets. */
|
|
72
78
|
function derivedPreset(base, overrides) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","names":[],"sources":["../../src/theme/defaults.ts"],"sourcesContent":["import type {\n ThemeTokens,\n TypographyPreset,\n TypographyPresets,\n} from \"@tenphi/docs\";\n\nexport const DEFAULT_THEME_TOKENS = {\n $gap: \"0.5rem\",\n $radius: \"8px\",\n \"$header-control-radius\": \"999px\",\n \"$card-radius\": \"16px\",\n \"$border-width\": \"1px\",\n \"$outline-width\": \"2px\",\n \"$outline-offset\": \"2px\",\n \"$layout-width\": \"87.5rem\",\n \"$content-width\": \"58rem\",\n \"$sidebar-width\": \"17.5rem\",\n \"$control-height\": \"2.5rem\",\n} satisfies ThemeTokens;\n\nconst BODY_FONT =\n \"'Onest Variable', Onest, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\nconst MONO_FONT =\n \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nexport const DEFAULT_TYPOGRAPHY_PRESETS: Record<string, TypographyPreset> = {\n body: {\n fontFamily: BODY_FONT,\n fontSize: \"1rem\",\n lineHeight: 1.65,\n letterSpacing: \"0\",\n fontWeight: 400,\n boldFontWeight: 640,\n },\n heading: {\n fontFamily: BODY_FONT,\n fontSize: \"1rem\",\n lineHeight: 1.15,\n letterSpacing: \"-0.006em\",\n fontWeight: 610,\n boldFontWeight: 720,\n },\n h1: heading(\"clamp(2.5rem, 5vw, 3.25rem)\", 1.05, \"-0.015em\"),\n h2: heading(\"clamp(1.75rem, 3vw, 2.125rem)\", 1.1, \"-0.01em\"),\n h3: heading(\"1.5rem\", 1.15, \"-0.006em\"),\n h4: heading(\"1.25rem\", 1.2, \"-0.003em\"),\n h5: heading(\"1.125rem\", 1.25, \"0\"),\n h6: heading(\"1rem\", 1.3, \"0\"),\n navigation: {\n fontFamily: \"var(--body-font-family)\",\n fontSize: \"0.9375rem\",\n lineHeight: 1.4,\n letterSpacing: \"0\",\n fontWeight: 450,\n boldFontWeight: 580,\n },\n small: {\n fontFamily: \"var(--body-font-family)\",\n fontSize: \"0.875rem\",\n lineHeight: 1.45,\n letterSpacing: \"-0.002em\",\n fontWeight: 420,\n boldFontWeight: 600,\n },\n code: {\n fontFamily: MONO_FONT,\n fontSize: \"0.875rem\",\n lineHeight: 1.65,\n letterSpacing: \"0\",\n fontWeight: 400,\n boldFontWeight: 650,\n },\n \"hero-title\": derivedPreset(\"h1\", {\n fontSize: \"clamp(2.75rem, 7vw, 4.75rem)\",\n }),\n \"hero-tagline\": derivedPreset(\"body\", {\n fontSize: \"clamp(1.05rem, 2.5vw, 1.35rem)\",\n lineHeight: 1.55,\n }),\n prose: derivedPreset(\"body\", { fontSize: \"1.025rem\" }),\n \"inline-code\": derivedPreset(\"code\", { fontSize: \"0.875em\" }),\n};\n\n/** Keep specialized typography linked to user-configured base presets. */\nfunction derivedPreset(\n base: string,\n overrides: TypographyPreset,\n): TypographyPreset {\n return {\n fontFamily: `var(--${base}-font-family)`,\n fontSize: `var(--${base}-font-size)`,\n lineHeight: `var(--${base}-line-height)`,\n letterSpacing: `var(--${base}-letter-spacing)`,\n fontWeight: `var(--${base}-font-weight)`,\n boldFontWeight: `var(--${base}-bold-font-weight)`,\n fontStyle: `var(--${base}-font-style, var(--default-font-style))`,\n textTransform: `var(--${base}-text-transform, var(--default-text-transform))`,\n ...overrides,\n };\n}\n\nexport function resolveThemeTokens(tokens: ThemeTokens = {}): ThemeTokens {\n return { ...DEFAULT_THEME_TOKENS, ...tokens };\n}\n\nexport function resolveTypographyPresets(\n presets: TypographyPresets = {},\n fontFamilies: Partial<Record<\"body\" | \"heading\" | \"code\", string>> = {},\n): Record<string, TypographyPreset> {\n const body = DEFAULT_TYPOGRAPHY_PRESETS.body;\n if (!body) throw new Error(\"The body typography preset is required.\");\n const names = new Set([\n ...Object.keys(DEFAULT_TYPOGRAPHY_PRESETS),\n ...Object.keys(presets),\n ]);\n return Object.fromEntries(\n [...names].map((name) => [\n name,\n {\n ...(DEFAULT_TYPOGRAPHY_PRESETS[name] ?? body),\n ...(name in fontFamilies\n ? { fontFamily: fontFamilies[name as keyof typeof fontFamilies] }\n : {}),\n ...(presets[name] ?? {}),\n },\n ]),\n );\n}\n\nfunction heading(\n fontSize: string,\n lineHeight: number,\n letterSpacing: string,\n): TypographyPreset {\n return {\n fontFamily: \"var(--heading-font-family)\",\n fontSize,\n lineHeight,\n letterSpacing,\n fontWeight: \"var(--heading-font-weight)\",\n boldFontWeight: \"var(--heading-bold-font-weight)\",\n };\n}\n"],"mappings":";AAMA,MAAa,uBAAuB;CAClC,MAAM;CACN,SAAS;CACT,0BAA0B;CAC1B,gBAAgB;CAChB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;AACrB;AAEA,MAAM,YACJ;AAIF,MAAa,6BAA+D;CAC1E,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,SAAS;EACP,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,IAAI,QAAQ,+BAA+B,MAAM,UAAU;CAC3D,IAAI,QAAQ,iCAAiC,KAAK,SAAS;CAC3D,IAAI,QAAQ,UAAU,MAAM,UAAU;CACtC,IAAI,QAAQ,WAAW,KAAK,UAAU;CACtC,IAAI,QAAQ,YAAY,MAAM,GAAG;CACjC,IAAI,QAAQ,QAAQ,KAAK,GAAG;CAC5B,YAAY;EACV,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,OAAO;EACL,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,cAAc,cAAc,MAAM,EAChC,UAAU,+BACZ,CAAC;CACD,gBAAgB,cAAc,QAAQ;EACpC,UAAU;EACV,YAAY;CACd,CAAC;CACD,OAAO,cAAc,QAAQ,EAAE,UAAU,WAAW,CAAC;CACrD,eAAe,cAAc,QAAQ,EAAE,UAAU,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"defaults.js","names":[],"sources":["../../src/theme/defaults.ts"],"sourcesContent":["import type {\n ThemeTokens,\n TypographyPreset,\n TypographyPresets,\n} from \"@tenphi/docs\";\n\nexport const DEFAULT_THEME_TOKENS = {\n $gap: \"0.5rem\",\n $radius: \"8px\",\n \"$header-control-radius\": \"999px\",\n \"$card-radius\": \"16px\",\n \"$border-width\": \"1px\",\n \"$outline-width\": \"2px\",\n \"$outline-offset\": \"2px\",\n \"$layout-width\": \"87.5rem\",\n \"$content-width\": \"58rem\",\n \"$sidebar-width\": \"17.5rem\",\n \"$control-height\": \"2.5rem\",\n} satisfies ThemeTokens;\n\nconst BODY_FONT =\n \"'Onest Variable', Onest, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\nconst MONO_FONT =\n \"'JetBrains Mono Variable', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\";\n\nexport const DEFAULT_TYPOGRAPHY_PRESETS: Record<string, TypographyPreset> = {\n body: {\n fontFamily: BODY_FONT,\n fontSize: \"1rem\",\n lineHeight: 1.65,\n letterSpacing: \"0\",\n fontWeight: 400,\n boldFontWeight: 640,\n },\n heading: {\n fontFamily: BODY_FONT,\n fontSize: \"1rem\",\n lineHeight: 1.15,\n letterSpacing: \"-0.006em\",\n fontWeight: 610,\n boldFontWeight: 720,\n },\n h1: heading(\"clamp(2.5rem, 5vw, 3.25rem)\", 1.05, \"-0.015em\"),\n h2: heading(\"clamp(1.75rem, 3vw, 2.125rem)\", 1.1, \"-0.01em\"),\n h3: heading(\"1.5rem\", 1.15, \"-0.006em\"),\n h4: heading(\"1.25rem\", 1.2, \"-0.003em\"),\n h5: heading(\"1.125rem\", 1.25, \"0\"),\n h6: heading(\"1rem\", 1.3, \"0\"),\n navigation: {\n fontFamily: \"var(--body-font-family)\",\n fontSize: \"0.9375rem\",\n lineHeight: 1.4,\n letterSpacing: \"0\",\n fontWeight: 450,\n boldFontWeight: 580,\n },\n small: {\n fontFamily: \"var(--body-font-family)\",\n fontSize: \"0.875rem\",\n lineHeight: 1.45,\n letterSpacing: \"-0.002em\",\n fontWeight: 420,\n boldFontWeight: 600,\n },\n code: {\n fontFamily: MONO_FONT,\n fontSize: \"0.875rem\",\n lineHeight: 1.65,\n letterSpacing: \"0\",\n fontWeight: 400,\n boldFontWeight: 650,\n },\n \"hero-title\": derivedPreset(\"h1\", {\n fontSize: \"clamp(2.75rem, 7vw, 4.75rem)\",\n }),\n \"hero-tagline\": derivedPreset(\"body\", {\n fontSize: \"clamp(1.05rem, 2.5vw, 1.35rem)\",\n lineHeight: 1.55,\n }),\n prose: derivedPreset(\"body\", { fontSize: \"1.025rem\" }),\n \"inline-code\": derivedPreset(\"code\", { fontSize: \"0.875em\" }),\n \"control-label\": derivedPreset(\"small\", {\n fontSize: \"0.75rem\",\n lineHeight: 1.4,\n letterSpacing: \"0.06em\",\n textTransform: \"uppercase\",\n }),\n};\n\n/** Keep specialized typography linked to user-configured base presets. */\nfunction derivedPreset(\n base: string,\n overrides: TypographyPreset,\n): TypographyPreset {\n return {\n fontFamily: `var(--${base}-font-family)`,\n fontSize: `var(--${base}-font-size)`,\n lineHeight: `var(--${base}-line-height)`,\n letterSpacing: `var(--${base}-letter-spacing)`,\n fontWeight: `var(--${base}-font-weight)`,\n boldFontWeight: `var(--${base}-bold-font-weight)`,\n fontStyle: `var(--${base}-font-style, var(--default-font-style))`,\n textTransform: `var(--${base}-text-transform, var(--default-text-transform))`,\n ...overrides,\n };\n}\n\nexport function resolveThemeTokens(tokens: ThemeTokens = {}): ThemeTokens {\n return { ...DEFAULT_THEME_TOKENS, ...tokens };\n}\n\nexport function resolveTypographyPresets(\n presets: TypographyPresets = {},\n fontFamilies: Partial<Record<\"body\" | \"heading\" | \"code\", string>> = {},\n): Record<string, TypographyPreset> {\n const body = DEFAULT_TYPOGRAPHY_PRESETS.body;\n if (!body) throw new Error(\"The body typography preset is required.\");\n const names = new Set([\n ...Object.keys(DEFAULT_TYPOGRAPHY_PRESETS),\n ...Object.keys(presets),\n ]);\n return Object.fromEntries(\n [...names].map((name) => [\n name,\n {\n ...(DEFAULT_TYPOGRAPHY_PRESETS[name] ?? body),\n ...(name in fontFamilies\n ? { fontFamily: fontFamilies[name as keyof typeof fontFamilies] }\n : {}),\n ...(presets[name] ?? {}),\n },\n ]),\n );\n}\n\nfunction heading(\n fontSize: string,\n lineHeight: number,\n letterSpacing: string,\n): TypographyPreset {\n return {\n fontFamily: \"var(--heading-font-family)\",\n fontSize,\n lineHeight,\n letterSpacing,\n fontWeight: \"var(--heading-font-weight)\",\n boldFontWeight: \"var(--heading-bold-font-weight)\",\n };\n}\n"],"mappings":";AAMA,MAAa,uBAAuB;CAClC,MAAM;CACN,SAAS;CACT,0BAA0B;CAC1B,gBAAgB;CAChB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,iBAAiB;CACjB,kBAAkB;CAClB,kBAAkB;CAClB,mBAAmB;AACrB;AAEA,MAAM,YACJ;AAIF,MAAa,6BAA+D;CAC1E,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,SAAS;EACP,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,IAAI,QAAQ,+BAA+B,MAAM,UAAU;CAC3D,IAAI,QAAQ,iCAAiC,KAAK,SAAS;CAC3D,IAAI,QAAQ,UAAU,MAAM,UAAU;CACtC,IAAI,QAAQ,WAAW,KAAK,UAAU;CACtC,IAAI,QAAQ,YAAY,MAAM,GAAG;CACjC,IAAI,QAAQ,QAAQ,KAAK,GAAG;CAC5B,YAAY;EACV,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,OAAO;EACL,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,eAAe;EACf,YAAY;EACZ,gBAAgB;CAClB;CACA,cAAc,cAAc,MAAM,EAChC,UAAU,+BACZ,CAAC;CACD,gBAAgB,cAAc,QAAQ;EACpC,UAAU;EACV,YAAY;CACd,CAAC;CACD,OAAO,cAAc,QAAQ,EAAE,UAAU,WAAW,CAAC;CACrD,eAAe,cAAc,QAAQ,EAAE,UAAU,UAAU,CAAC;CAC5D,iBAAiB,cAAc,SAAS;EACtC,UAAU;EACV,YAAY;EACZ,eAAe;EACf,eAAe;CACjB,CAAC;AACH;;AAGA,SAAS,cACP,MACA,WACkB;CAClB,OAAO;EACL,YAAY,SAAS,KAAK;EAC1B,UAAU,SAAS,KAAK;EACxB,YAAY,SAAS,KAAK;EAC1B,eAAe,SAAS,KAAK;EAC7B,YAAY,SAAS,KAAK;EAC1B,gBAAgB,SAAS,KAAK;EAC9B,WAAW,SAAS,KAAK;EACzB,eAAe,SAAS,KAAK;EAC7B,GAAG;CACL;AACF;AAEA,SAAgB,mBAAmB,SAAsB,CAAC,GAAgB;CACxE,OAAO;EAAE,GAAG;EAAsB,GAAG;CAAO;AAC9C;AAEA,SAAgB,yBACd,UAA6B,CAAC,GAC9B,eAAqE,CAAC,GACpC;CAClC,MAAM,OAAO,2BAA2B;CACxC,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,yCAAyC;CACpE,MAAM,wBAAQ,IAAI,IAAI,CACpB,GAAG,OAAO,KAAK,0BAA0B,GACzC,GAAG,OAAO,KAAK,OAAO,CACxB,CAAC;CACD,OAAO,OAAO,YACZ,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,SAAS,CACvB,MACA;EACE,GAAI,2BAA2B,SAAS;EACxC,GAAI,QAAQ,eACR,EAAE,YAAY,aAAa,MAAmC,IAC9D,CAAC;EACL,GAAI,QAAQ,SAAS,CAAC;CACxB,CACF,CAAC,CACH;AACF;AAEA,SAAS,QACP,UACA,YACA,eACkB;CAClB,OAAO;EACL,YAAY;EACZ;EACA;EACA;EACA,YAAY;EACZ,gBAAgB;CAClB;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenphi/renderer",
|
|
3
|
-
"version": "0.30.
|
|
3
|
+
"version": "0.30.2",
|
|
4
4
|
"description": "Astro renderer and Tasty theme for Cookbook",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": [
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"@fontsource-variable/jetbrains-mono": "^5.3.0",
|
|
62
62
|
"@fontsource-variable/onest": "^5.3.0",
|
|
63
63
|
"@pagefind/default-ui": "1.5.2",
|
|
64
|
-
"@tenphi/docs": "0.30.
|
|
64
|
+
"@tenphi/docs": "0.30.2",
|
|
65
65
|
"@tenphi/eslint-plugin-tasty": "1.12.0",
|
|
66
66
|
"@tenphi/glaze": "2.0.1",
|
|
67
67
|
"@tenphi/tasty": "3.14.0",
|