@rtkelly-labs/design-system 0.0.0-bootstrap.0 → 0.16.0-dev.0.37dedac
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/CHANGELOG.md +347 -0
- package/LICENSE +21 -0
- package/README.md +317 -2
- package/dist/components/AlertDialog.js +95 -0
- package/dist/components/AlertDialog.js.map +1 -0
- package/dist/components/AppShell.js +261 -0
- package/dist/components/AppShell.js.map +1 -0
- package/dist/components/AsciiDivider.js +8 -0
- package/dist/components/AsciiDivider.js.map +1 -0
- package/dist/components/AsciiGauge.js +130 -0
- package/dist/components/AsciiGauge.js.map +1 -0
- package/dist/components/Avatar.js +87 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Badge.js +25 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/BarChart.js +288 -0
- package/dist/components/BarChart.js.map +1 -0
- package/dist/components/BracketText.js +23 -0
- package/dist/components/BracketText.js.map +1 -0
- package/dist/components/BulletChart.js +50 -0
- package/dist/components/BulletChart.js.map +1 -0
- package/dist/components/Button.js +130 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Card.js +181 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/ChartTooltip.js +54 -0
- package/dist/components/ChartTooltip.js.map +1 -0
- package/dist/components/Checkbox.js +55 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/ColophonCard.js +122 -0
- package/dist/components/ColophonCard.js.map +1 -0
- package/dist/components/DataTable.js +299 -0
- package/dist/components/DataTable.js.map +1 -0
- package/dist/components/Divider.js +42 -0
- package/dist/components/Divider.js.map +1 -0
- package/dist/components/Drawer.js +81 -0
- package/dist/components/Drawer.js.map +1 -0
- package/dist/components/EmptyState.js +39 -0
- package/dist/components/EmptyState.js.map +1 -0
- package/dist/components/ErrorSummary.js +122 -0
- package/dist/components/ErrorSummary.js.map +1 -0
- package/dist/components/Fieldset.js +37 -0
- package/dist/components/Fieldset.js.map +1 -0
- package/dist/components/Glyph.js +60 -0
- package/dist/components/Glyph.js.map +1 -0
- package/dist/components/Input.js +111 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/LinkProvider.js +76 -0
- package/dist/components/LinkProvider.js.map +1 -0
- package/dist/components/Menu.js +144 -0
- package/dist/components/Menu.js.map +1 -0
- package/dist/components/MetadataGrid.js +184 -0
- package/dist/components/MetadataGrid.js.map +1 -0
- package/dist/components/MobileNav.js +120 -0
- package/dist/components/MobileNav.js.map +1 -0
- package/dist/components/Modal.js +79 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NerdIcon.js +177 -0
- package/dist/components/NerdIcon.js.map +1 -0
- package/dist/components/NoteBlock.js +84 -0
- package/dist/components/NoteBlock.js.map +1 -0
- package/dist/components/PageHeader.js +34 -0
- package/dist/components/PageHeader.js.map +1 -0
- package/dist/components/PageTitle.js +21 -0
- package/dist/components/PageTitle.js.map +1 -0
- package/dist/components/Pagination.js +96 -0
- package/dist/components/Pagination.js.map +1 -0
- package/dist/components/Popover.js +87 -0
- package/dist/components/Popover.js.map +1 -0
- package/dist/components/Progress.js +83 -0
- package/dist/components/Progress.js.map +1 -0
- package/dist/components/RadioGroup.js +74 -0
- package/dist/components/RadioGroup.js.map +1 -0
- package/dist/components/ReportDocument.js +75 -0
- package/dist/components/ReportDocument.js.map +1 -0
- package/dist/components/SectionContainer.js +18 -0
- package/dist/components/SectionContainer.js.map +1 -0
- package/dist/components/Select.js +199 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/SiteFooter.js +29 -0
- package/dist/components/SiteFooter.js.map +1 -0
- package/dist/components/SiteHeader.js +59 -0
- package/dist/components/SiteHeader.js.map +1 -0
- package/dist/components/SiteNav.js +141 -0
- package/dist/components/SiteNav.js.map +1 -0
- package/dist/components/Skeleton.js +51 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/SocialIcon.js +77 -0
- package/dist/components/SocialIcon.js.map +1 -0
- package/dist/components/Sparkline.js +104 -0
- package/dist/components/Sparkline.js.map +1 -0
- package/dist/components/Spinner.js +65 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/StatCard.js +53 -0
- package/dist/components/StatCard.js.map +1 -0
- package/dist/components/StatusPage.js +99 -0
- package/dist/components/StatusPage.js.map +1 -0
- package/dist/components/Swatch.js +55 -0
- package/dist/components/Swatch.js.map +1 -0
- package/dist/components/Switch.js +53 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/TLDR.js +53 -0
- package/dist/components/TLDR.js.map +1 -0
- package/dist/components/Table.js +155 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Tabs.js +325 -0
- package/dist/components/Tabs.js.map +1 -0
- package/dist/components/Tag.js +19 -0
- package/dist/components/Tag.js.map +1 -0
- package/dist/components/TelemetryGauge.js +112 -0
- package/dist/components/TelemetryGauge.js.map +1 -0
- package/dist/components/ThemeProvider.js +87 -0
- package/dist/components/ThemeProvider.js.map +1 -0
- package/dist/components/TickerTape.js +196 -0
- package/dist/components/TickerTape.js.map +1 -0
- package/dist/components/Toast.js +200 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Tooltip.js +69 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/TrackCard.js +206 -0
- package/dist/components/TrackCard.js.map +1 -0
- package/dist/components/blog/BlogPost.js +116 -0
- package/dist/components/blog/BlogPost.js.map +1 -0
- package/dist/components/blog/LoremIpsumPost.js +62 -0
- package/dist/components/blog/LoremIpsumPost.js.map +1 -0
- package/dist/components/blog/author.js +25 -0
- package/dist/components/blog/author.js.map +1 -0
- package/dist/components/booleanControl.js +50 -0
- package/dist/components/booleanControl.js.map +1 -0
- package/dist/components/dialogPopupRef.js +28 -0
- package/dist/components/dialogPopupRef.js.map +1 -0
- package/dist/components/dialogSurface.js +75 -0
- package/dist/components/dialogSurface.js.map +1 -0
- package/dist/components/docs/AnchorHeading.js +80 -0
- package/dist/components/docs/AnchorHeading.js.map +1 -0
- package/dist/components/docs/Breadcrumbs.js +26 -0
- package/dist/components/docs/Breadcrumbs.js.map +1 -0
- package/dist/components/docs/CodeBlock.js +63 -0
- package/dist/components/docs/CodeBlock.js.map +1 -0
- package/dist/components/docs/CodeTabs.js +71 -0
- package/dist/components/docs/CodeTabs.js.map +1 -0
- package/dist/components/docs/DocPager.js +28 -0
- package/dist/components/docs/DocPager.js.map +1 -0
- package/dist/components/docs/DocsHeader.js +124 -0
- package/dist/components/docs/DocsHeader.js.map +1 -0
- package/dist/components/docs/DocsLayout.js +61 -0
- package/dist/components/docs/DocsLayout.js.map +1 -0
- package/dist/components/docs/DocsLinkProvider.js +25 -0
- package/dist/components/docs/DocsLinkProvider.js.map +1 -0
- package/dist/components/docs/DocsSidebar.js +147 -0
- package/dist/components/docs/DocsSidebar.js.map +1 -0
- package/dist/components/docs/Prose.js +56 -0
- package/dist/components/docs/Prose.js.map +1 -0
- package/dist/components/docs/TableOfContents.js +71 -0
- package/dist/components/docs/TableOfContents.js.map +1 -0
- package/dist/components/docs/codeTabsStore.js +75 -0
- package/dist/components/docs/codeTabsStore.js.map +1 -0
- package/dist/components/docs/figures/ActivityGrid.js +116 -0
- package/dist/components/docs/figures/ActivityGrid.js.map +1 -0
- package/dist/components/docs/figures/BeforeAfter.js +64 -0
- package/dist/components/docs/figures/BeforeAfter.js.map +1 -0
- package/dist/components/docs/figures/ChangeSummary.js +74 -0
- package/dist/components/docs/figures/ChangeSummary.js.map +1 -0
- package/dist/components/docs/figures/Decision.js +34 -0
- package/dist/components/docs/figures/Decision.js.map +1 -0
- package/dist/components/docs/figures/DrawingSheet.js +37 -0
- package/dist/components/docs/figures/DrawingSheet.js.map +1 -0
- package/dist/components/docs/figures/FigureFrame.js +226 -0
- package/dist/components/docs/figures/FigureFrame.js.map +1 -0
- package/dist/components/docs/figures/FileChangeTree.js +134 -0
- package/dist/components/docs/figures/FileChangeTree.js.map +1 -0
- package/dist/components/docs/figures/FlowDiagram.js +82 -0
- package/dist/components/docs/figures/FlowDiagram.js.map +1 -0
- package/dist/components/docs/figures/GanttChart.js +79 -0
- package/dist/components/docs/figures/GanttChart.js.map +1 -0
- package/dist/components/docs/figures/IndexedSection.js +45 -0
- package/dist/components/docs/figures/IndexedSection.js.map +1 -0
- package/dist/components/docs/figures/MetricStrip.js +23 -0
- package/dist/components/docs/figures/MetricStrip.js.map +1 -0
- package/dist/components/docs/figures/Steps.js +58 -0
- package/dist/components/docs/figures/Steps.js.map +1 -0
- package/dist/components/docs/figures/SwatchCompare.js +42 -0
- package/dist/components/docs/figures/SwatchCompare.js.map +1 -0
- package/dist/components/docs/figures/TermGrid.js +22 -0
- package/dist/components/docs/figures/TermGrid.js.map +1 -0
- package/dist/components/docs/figures/Terminal.js +37 -0
- package/dist/components/docs/figures/Terminal.js.map +1 -0
- package/dist/components/docs/figures/Timeline.js +61 -0
- package/dist/components/docs/figures/Timeline.js.map +1 -0
- package/dist/components/docs/figures/TokenTable.js +42 -0
- package/dist/components/docs/figures/TokenTable.js.map +1 -0
- package/dist/components/docs/figures/TreeDiagram.js +76 -0
- package/dist/components/docs/figures/TreeDiagram.js.map +1 -0
- package/dist/components/docs/figures/UptimeStrip.js +68 -0
- package/dist/components/docs/figures/UptimeStrip.js.map +1 -0
- package/dist/components/docs/figures/index.js +24 -0
- package/dist/components/docs/figures/index.js.map +1 -0
- package/dist/components/docs/index.js +15 -0
- package/dist/components/docs/index.js.map +1 -0
- package/dist/components/docs/mdxComponents.js +108 -0
- package/dist/components/docs/mdxComponents.js.map +1 -0
- package/dist/components/experiments/DesignSandbox.js +206 -0
- package/dist/components/experiments/DesignSandbox.js.map +1 -0
- package/dist/components/experiments/ExperimentsView.js +138 -0
- package/dist/components/experiments/ExperimentsView.js.map +1 -0
- package/dist/components/fieldFrame.js +200 -0
- package/dist/components/fieldFrame.js.map +1 -0
- package/dist/components/floatingSurface.js +35 -0
- package/dist/components/floatingSurface.js.map +1 -0
- package/dist/components/marketing/CTASection.js +47 -0
- package/dist/components/marketing/CTASection.js.map +1 -0
- package/dist/components/marketing/FeatureGrid.js +49 -0
- package/dist/components/marketing/FeatureGrid.js.map +1 -0
- package/dist/components/marketing/Hero.js +44 -0
- package/dist/components/marketing/Hero.js.map +1 -0
- package/dist/components/marketing/PricingGrid.js +65 -0
- package/dist/components/marketing/PricingGrid.js.map +1 -0
- package/dist/components/marketing/SectionGrid.js +51 -0
- package/dist/components/marketing/SectionGrid.js.map +1 -0
- package/dist/components/paginationRange.js +28 -0
- package/dist/components/paginationRange.js.map +1 -0
- package/dist/components/portalTheme.js +14 -0
- package/dist/components/portalTheme.js.map +1 -0
- package/dist/components/saas/SaasLandingPage.js +201 -0
- package/dist/components/saas/SaasLandingPage.js.map +1 -0
- package/dist/components/siteNavContext.js +24 -0
- package/dist/components/siteNavContext.js.map +1 -0
- package/dist/components/slides/Slide.js +84 -0
- package/dist/components/slides/Slide.js.map +1 -0
- package/dist/components/slides/SlideDeck.js +228 -0
- package/dist/components/slides/SlideDeck.js.map +1 -0
- package/dist/components/themeInitScript.js +16 -0
- package/dist/components/themeInitScript.js.map +1 -0
- package/dist/components/themeScope.js +9 -0
- package/dist/components/themeScope.js.map +1 -0
- package/dist/components/toastLifetime.js +21 -0
- package/dist/components/toastLifetime.js.map +1 -0
- package/dist/fonts/DSSymbols-OFL.txt +98 -0
- package/dist/fonts/DSSymbols-Regular.woff2 +0 -0
- package/dist/fonts/SymbolsNerdFontMono-Regular.woff2 +0 -0
- package/dist/hooks/useActiveHeading.js +59 -0
- package/dist/hooks/useActiveHeading.js.map +1 -0
- package/dist/hooks/useCopyToClipboard.js +58 -0
- package/dist/hooks/useCopyToClipboard.js.map +1 -0
- package/dist/index.d.ts +6394 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accentClasses.js +87 -0
- package/dist/lib/accentClasses.js.map +1 -0
- package/dist/lib/recipe.js +33 -0
- package/dist/lib/recipe.js.map +1 -0
- package/dist/lib/slug.js +39 -0
- package/dist/lib/slug.js.map +1 -0
- package/dist/lib/theme.js +76 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/tokenRules.js +51 -0
- package/dist/lib/tokenRules.js.map +1 -0
- package/dist/prose.css +766 -0
- package/dist/styles.css +203 -0
- package/dist/theme/ansi.js +77 -0
- package/dist/theme/ansi.js.map +1 -0
- package/dist/theme/contrast.js +342 -0
- package/dist/theme/contrast.js.map +1 -0
- package/dist/theme/levels.js +234 -0
- package/dist/theme/levels.js.map +1 -0
- package/dist/theme/media.js +115 -0
- package/dist/theme/media.js.map +1 -0
- package/dist/theme/recommended.js +105 -0
- package/dist/theme/recommended.js.map +1 -0
- package/dist/theme.css +538 -0
- package/dist/tokens.js +1 -0
- package/dist/tokens.js.map +1 -0
- package/package.json +209 -6
- package/skills/design-system-usage/SKILL.md +75 -0
- package/terminal/rtk-midnight.alacritty.toml +33 -0
- package/terminal/rtk-midnight.ghostty.conf +24 -0
- package/terminal/rtk-midnight.itermcolors +167 -0
- package/terminal/rtk-midnight.windows-terminal.json +23 -0
- package/terminal/rtk-sketch.alacritty.toml +33 -0
- package/terminal/rtk-sketch.ghostty.conf +24 -0
- package/terminal/rtk-sketch.itermcolors +167 -0
- package/terminal/rtk-sketch.windows-terminal.json +23 -0
- package/tokens/palette.midnight.tokens.json +477 -0
- package/tokens/palette.sketch.tokens.json +477 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// src/components/Card.tsx
|
|
2
|
+
import { forwardRef } from "react";
|
|
3
|
+
import { cn } from "../lib/recipe.js";
|
|
4
|
+
import { accentVar, semanticTokens } from "../lib/theme.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var Card = forwardRef(function Card2({
|
|
7
|
+
title,
|
|
8
|
+
description,
|
|
9
|
+
imgSrc,
|
|
10
|
+
href,
|
|
11
|
+
asciiArt,
|
|
12
|
+
filename,
|
|
13
|
+
children,
|
|
14
|
+
className = "",
|
|
15
|
+
accent,
|
|
16
|
+
badge,
|
|
17
|
+
panel = false,
|
|
18
|
+
variant,
|
|
19
|
+
style,
|
|
20
|
+
...props
|
|
21
|
+
}, ref) {
|
|
22
|
+
const accentColor = accent ? accentVar(accent) : void 0;
|
|
23
|
+
const form = variant ?? (panel || !title && children ? "panel" : "card");
|
|
24
|
+
const baseCardStyle = {
|
|
25
|
+
backgroundColor: semanticTokens.surface.base,
|
|
26
|
+
color: semanticTokens.text.primary,
|
|
27
|
+
border: `2px solid ${semanticTokens.border.strong}`,
|
|
28
|
+
transition: "transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease",
|
|
29
|
+
...accentColor ? { borderLeftWidth: "4px", borderLeftColor: accentColor } : {},
|
|
30
|
+
...style
|
|
31
|
+
};
|
|
32
|
+
if (form === "panel") {
|
|
33
|
+
return /* @__PURE__ */ jsxs(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
"data-slot": "card",
|
|
37
|
+
ref,
|
|
38
|
+
className: cn(className),
|
|
39
|
+
style: { ...baseCardStyle, padding: "1.5rem" },
|
|
40
|
+
...props,
|
|
41
|
+
children: [
|
|
42
|
+
badge && /* @__PURE__ */ jsx(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
45
|
+
style: {
|
|
46
|
+
display: "inline-block",
|
|
47
|
+
padding: "0.15rem 0.5rem",
|
|
48
|
+
fontSize: "0.65rem",
|
|
49
|
+
fontFamily: semanticTokens.font.mono,
|
|
50
|
+
fontWeight: 700,
|
|
51
|
+
textTransform: "uppercase",
|
|
52
|
+
color: "var(--ds-text-inverse)",
|
|
53
|
+
backgroundColor: accentColor ?? semanticTokens.accent.tertiary,
|
|
54
|
+
marginBottom: "0.75rem"
|
|
55
|
+
},
|
|
56
|
+
children: badge
|
|
57
|
+
}
|
|
58
|
+
),
|
|
59
|
+
title && /* @__PURE__ */ jsx(
|
|
60
|
+
"h3",
|
|
61
|
+
{
|
|
62
|
+
style: {
|
|
63
|
+
fontFamily: semanticTokens.font.display,
|
|
64
|
+
fontSize: "1.1rem",
|
|
65
|
+
fontWeight: 800,
|
|
66
|
+
textTransform: "uppercase",
|
|
67
|
+
color: accentColor || semanticTokens.text.primary,
|
|
68
|
+
marginBottom: "0.75rem",
|
|
69
|
+
letterSpacing: "0.025em"
|
|
70
|
+
},
|
|
71
|
+
children: title
|
|
72
|
+
}
|
|
73
|
+
),
|
|
74
|
+
description && /* @__PURE__ */ jsx("p", { style: { fontFamily: semanticTokens.font.mono, fontSize: "0.85rem", color: semanticTokens.text.primary, opacity: 0.9, lineHeight: 1.6 }, children: description }),
|
|
75
|
+
children
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
const computedFilename = filename || (title ? `${title.toLowerCase().replace(/\s+/g, "_")}.md` : "card.md");
|
|
81
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "card", ref, className: cn("p-4 md:w-1/2", className), style: { maxWidth: "544px" }, ...props, children: /* @__PURE__ */ jsxs(
|
|
82
|
+
"div",
|
|
83
|
+
{
|
|
84
|
+
style: {
|
|
85
|
+
height: "100%",
|
|
86
|
+
...baseCardStyle
|
|
87
|
+
},
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsxs(
|
|
90
|
+
"div",
|
|
91
|
+
{
|
|
92
|
+
style: {
|
|
93
|
+
borderBottom: `2px solid ${semanticTokens.border.strong}`,
|
|
94
|
+
padding: "0.5rem 1rem",
|
|
95
|
+
display: "flex",
|
|
96
|
+
justifyContent: "space-between",
|
|
97
|
+
alignItems: "center",
|
|
98
|
+
backgroundColor: semanticTokens.surface.base
|
|
99
|
+
},
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"span",
|
|
103
|
+
{
|
|
104
|
+
style: {
|
|
105
|
+
fontFamily: semanticTokens.font.mono,
|
|
106
|
+
fontSize: "0.85rem",
|
|
107
|
+
color: semanticTokens.accent.secondary,
|
|
108
|
+
fontWeight: 700,
|
|
109
|
+
textTransform: "uppercase",
|
|
110
|
+
// A file name is one unbreakable token: in a narrow card it must wrap inside the
|
|
111
|
+
// header strip, not run out past the card border.
|
|
112
|
+
minWidth: 0,
|
|
113
|
+
overflowWrap: "anywhere"
|
|
114
|
+
},
|
|
115
|
+
children: computedFilename
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
asciiArt && /* @__PURE__ */ jsx("pre", { style: { fontSize: "0.7rem", color: semanticTokens.accent.primary, lineHeight: 1 }, children: asciiArt })
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
),
|
|
122
|
+
imgSrc && /* @__PURE__ */ jsx("div", { style: { borderBottom: `2px solid ${semanticTokens.border.strong}` }, children: href ? /* @__PURE__ */ jsx("a", { href, "aria-label": `Link to ${title || "card"}`, children: /* @__PURE__ */ jsx(
|
|
123
|
+
"img",
|
|
124
|
+
{
|
|
125
|
+
alt: title || "Card Image",
|
|
126
|
+
src: imgSrc,
|
|
127
|
+
style: { objectFit: "cover", objectPosition: "center", width: "100%", maxHeight: "192px" }
|
|
128
|
+
}
|
|
129
|
+
) }) : /* @__PURE__ */ jsx(
|
|
130
|
+
"img",
|
|
131
|
+
{
|
|
132
|
+
alt: title || "Card Image",
|
|
133
|
+
src: imgSrc,
|
|
134
|
+
style: { objectFit: "cover", objectPosition: "center", width: "100%", maxHeight: "192px" }
|
|
135
|
+
}
|
|
136
|
+
) }),
|
|
137
|
+
/* @__PURE__ */ jsxs("div", { style: { padding: "1.5rem" }, children: [
|
|
138
|
+
title && /* @__PURE__ */ jsx(
|
|
139
|
+
"h2",
|
|
140
|
+
{
|
|
141
|
+
style: {
|
|
142
|
+
marginBottom: "0.75rem",
|
|
143
|
+
fontSize: "1.5rem",
|
|
144
|
+
fontFamily: semanticTokens.font.display,
|
|
145
|
+
fontWeight: 700,
|
|
146
|
+
lineHeight: 1.3,
|
|
147
|
+
letterSpacing: "-0.01em",
|
|
148
|
+
textTransform: "uppercase",
|
|
149
|
+
color: semanticTokens.text.primary
|
|
150
|
+
},
|
|
151
|
+
children: href ? /* @__PURE__ */ jsx("a", { href, "aria-label": `Link to ${title}`, style: { color: "inherit", textDecoration: "none" }, children: title }) : title
|
|
152
|
+
}
|
|
153
|
+
),
|
|
154
|
+
description && /* @__PURE__ */ jsx("p", { style: { marginBottom: "0.75rem", fontFamily: semanticTokens.font.body, fontSize: "0.9rem", color: semanticTokens.text.primary, opacity: 0.7, lineHeight: 1.6 }, children: description }),
|
|
155
|
+
children,
|
|
156
|
+
href && /* @__PURE__ */ jsx(
|
|
157
|
+
"a",
|
|
158
|
+
{
|
|
159
|
+
href,
|
|
160
|
+
style: {
|
|
161
|
+
fontFamily: semanticTokens.font.mono,
|
|
162
|
+
fontWeight: 700,
|
|
163
|
+
color: semanticTokens.accent.primary,
|
|
164
|
+
textDecoration: "none",
|
|
165
|
+
textTransform: "uppercase",
|
|
166
|
+
display: "inline-block",
|
|
167
|
+
transition: "transform 0.15s ease"
|
|
168
|
+
},
|
|
169
|
+
"aria-label": `Link to ${title || "details"}`,
|
|
170
|
+
children: "[ Learn More \u2192 ]"
|
|
171
|
+
}
|
|
172
|
+
)
|
|
173
|
+
] })
|
|
174
|
+
]
|
|
175
|
+
}
|
|
176
|
+
) });
|
|
177
|
+
});
|
|
178
|
+
export {
|
|
179
|
+
Card
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Card.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport type { ReactNode, HTMLAttributes, CSSProperties } from 'react';\nimport { cn } from '../lib/recipe';\nimport { accentVar, semanticTokens } from '../lib/theme';\nimport type { AccentToken } from '../lib/theme';\n\n\n/**\n * The two shapes a `Card` renders.\n *\n * `panel` is the general container — border, padding, optional accent stripe.\n * `card` is the blog/project card: a filename bar, an optional cover image and\n * a `[ Learn More → ]` footer, carrying its own width and float classes.\n */\nexport type CardVariant = 'panel' | 'card';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Card heading. With no `variant` set, its presence is also what selects the\n * full card form over the panel form — see the note on `variant`.\n */\n title?: string;\n /**\n * The standfirst under the title — one or two sentences saying what the card\n * is about. Longer body copy belongs in `children`, which is not constrained\n * to a paragraph.\n */\n description?: string;\n /**\n * A cover image above the card's text. Mutually exclusive with `asciiArt` in\n * practice rather than in types: both occupy the same slot, and a card given\n * both shows the image.\n */\n imgSrc?: string;\n /**\n * Turns the card into a link to here, rendered as a trailing affordance\n * rather than by wrapping the whole card — so the title stays selectable and\n * nested controls keep their own click targets.\n */\n href?: string;\n /**\n * Monospace art rendered in place of an image. The reason the mono face is\n * latin-only by deliberate choice: box-drawing characters must land on the\n * same advance width or the art shears.\n */\n asciiArt?: string;\n /**\n * Shown in the card's header strip as a file name would be in an editor\n * tab. A label for the card's provenance, not a download.\n */\n filename?: string;\n /**\n * The card's body. Whatever `title` and `description` cannot say — a list, a\n * chart, controls. With no `title` and no `variant`, supplying this is what\n * selects the panel form; see the note on `variant`.\n */\n children?: ReactNode;\n /**\n * Merged into the recipe's classes. For placement and span — a grid cell, a\n * width — rather than for restyling the surface.\n */\n className?: string;\n /** Semantic accent for the left border highlight. */\n accent?: AccentToken;\n /** Badge text shown in the card header */\n badge?: string;\n /**\n * Render the plain panel.\n *\n * @deprecated Use `variant=\"panel\"`. This is kept because it is what existing\n * call sites pass, and `variant` takes precedence over it.\n */\n panel?: boolean;\n /**\n * Which of the component's two forms to render.\n *\n * Setting it is the whole point: with `variant` omitted the form is\n * *inferred* — panel when there is no `title`, full card otherwise — so a\n * panel that later gains a title silently becomes a floated blog card with a\n * filename bar. Nothing in the diff that adds the title says so.\n *\n * Omitting it keeps that inference exactly as it was, for the call sites that\n * already rely on it. New code should say which form it wants.\n */\n variant?: CardVariant;\n}\n\n/**\n * A bordered container, in two forms.\n *\n * **`variant=\"panel\"`** is the general one: border, 1.5rem of padding, an\n * optional accent stripe down the left edge, and whatever you put in it. Reach\n * for this unless you specifically want the other.\n *\n * **`variant=\"card\"`** is the blog/project card — a filename bar across the top\n * reading `some_title.md`, an optional cover image, then title, description and\n * a `[ Learn More → ]` link. It is opinionated on purpose and carries its own\n * width and float classes, so it belongs in a card grid rather than as a\n * general-purpose box.\n *\n * **Say which one you want.** With `variant` omitted the form is inferred from\n * whether a `title` is present, which means adding a title to a panel silently\n * turns it into a floated blog card. The inference is kept for the call sites\n * that predate `variant`; new code should not rely on it.\n *\n * The accent is a *stripe*, not a fill: `accent` thickens the left border to\n * 4px and colours it. That is the whole colour budget of the component, which\n * is why a card conveys category rather than status.\n *\n * ```tsx\n * <Card variant=\"panel\" accent=\"info\" badge=\"DRAFT\">\n * <p>Anything.</p>\n * </Card>\n *\n * <Card variant=\"card\" title=\"Where a theme stops applying\" href=\"/posts/theme\" />\n * ```\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card({\n title,\n description,\n imgSrc,\n href,\n asciiArt,\n filename,\n children,\n className = '',\n accent,\n badge,\n panel = false,\n variant,\n style,\n ...props\n}, ref) {\n const accentColor = accent ? accentVar(accent) : undefined;\n\n /**\n * An explicit `variant` decides; otherwise fall back to the historical\n * inference, unchanged, so nothing that renders today renders differently.\n *\n * Written as one resolved value rather than left inline in the branch below,\n * because the inference is the part worth being able to point at — and worth\n * being able to delete in one place when it goes in a major.\n */\n const form: CardVariant = variant ?? (panel || (!title && children) ? 'panel' : 'card');\n\n const baseCardStyle: CSSProperties = {\n backgroundColor: semanticTokens.surface.base,\n color: semanticTokens.text.primary,\n border: `2px solid ${semanticTokens.border.strong}`,\n transition: 'transform 0.15s ease, box-shadow 0.15s ease, border-color 0.15s ease',\n ...(accentColor ? { borderLeftWidth: '4px', borderLeftColor: accentColor } : {}),\n ...style,\n };\n\n // Simple panel mode: no filename header, no width constraints\n if (form === 'panel') {\n return (\n <div data-slot=\"card\"\n ref={ref}\n className={cn(className)}\n style={{ ...baseCardStyle, padding: '1.5rem' }}\n {...props}\n >\n {badge && (\n <span\n style={{\n display: 'inline-block',\n padding: '0.15rem 0.5rem',\n fontSize: '0.65rem',\n fontFamily: semanticTokens.font.mono,\n fontWeight: 700,\n textTransform: 'uppercase',\n color: 'var(--ds-text-inverse)',\n backgroundColor: accentColor ?? semanticTokens.accent.tertiary,\n marginBottom: '0.75rem',\n }}\n >\n {badge}\n </span>\n )}\n {title && (\n <h3\n style={{\n fontFamily: semanticTokens.font.display,\n fontSize: '1.1rem',\n fontWeight: 800,\n textTransform: 'uppercase',\n color: accentColor || semanticTokens.text.primary,\n marginBottom: '0.75rem',\n letterSpacing: '0.025em',\n }}\n >\n {title}\n </h3>\n )}\n {description && (\n <p style={{ fontFamily: semanticTokens.font.mono, fontSize: '0.85rem', color: semanticTokens.text.primary, opacity: 0.9, lineHeight: 1.6 }}>\n {description}\n </p>\n )}\n {children}\n </div>\n );\n }\n\n // Full card mode with filename header bar (blog/project card style)\n const computedFilename = filename || (title ? `${title.toLowerCase().replace(/\\s+/g, '_')}.md` : 'card.md');\n\n return (\n <div data-slot=\"card\" ref={ref} className={cn('p-4 md:w-1/2', className)} style={{ maxWidth: '544px' }} {...props}>\n <div\n style={{\n height: '100%',\n ...baseCardStyle,\n }}\n >\n <div\n style={{\n borderBottom: `2px solid ${semanticTokens.border.strong}`,\n padding: '0.5rem 1rem',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n backgroundColor: semanticTokens.surface.base,\n }}\n >\n <span\n style={{\n fontFamily: semanticTokens.font.mono,\n fontSize: '0.85rem',\n color: semanticTokens.accent.secondary,\n fontWeight: 700,\n textTransform: 'uppercase',\n // A file name is one unbreakable token: in a narrow card it must wrap inside the\n // header strip, not run out past the card border.\n minWidth: 0,\n overflowWrap: 'anywhere',\n }}\n >\n {computedFilename}\n </span>\n {asciiArt && (\n <pre style={{ fontSize: '0.7rem', color: semanticTokens.accent.primary, lineHeight: 1 }}>\n {asciiArt}\n </pre>\n )}\n </div>\n\n {imgSrc && (\n <div style={{ borderBottom: `2px solid ${semanticTokens.border.strong}` }}>\n {href ? (\n <a href={href} aria-label={`Link to ${title || 'card'}`}>\n <img\n alt={title || 'Card Image'}\n src={imgSrc}\n style={{ objectFit: 'cover', objectPosition: 'center', width: '100%', maxHeight: '192px' }}\n />\n </a>\n ) : (\n <img\n alt={title || 'Card Image'}\n src={imgSrc}\n style={{ objectFit: 'cover', objectPosition: 'center', width: '100%', maxHeight: '192px' }}\n />\n )}\n </div>\n )}\n\n <div style={{ padding: '1.5rem' }}>\n {title && (\n <h2\n style={{\n marginBottom: '0.75rem',\n fontSize: '1.5rem',\n fontFamily: semanticTokens.font.display,\n fontWeight: 700,\n lineHeight: 1.3,\n letterSpacing: '-0.01em',\n textTransform: 'uppercase',\n color: semanticTokens.text.primary,\n }}\n >\n {href ? (\n <a href={href} aria-label={`Link to ${title}`} style={{ color: 'inherit', textDecoration: 'none' }}>\n {title}\n </a>\n ) : (\n title\n )}\n </h2>\n )}\n {description && (\n <p style={{ marginBottom: '0.75rem', fontFamily: semanticTokens.font.body, fontSize: '0.9rem', color: semanticTokens.text.primary, opacity: 0.7, lineHeight: 1.6 }}>\n {description}\n </p>\n )}\n {children}\n {href && (\n <a\n href={href}\n style={{\n fontFamily: semanticTokens.font.mono,\n fontWeight: 700,\n color: semanticTokens.accent.primary,\n textDecoration: 'none',\n textTransform: 'uppercase',\n display: 'inline-block',\n transition: 'transform 0.15s ease',\n }}\n aria-label={`Link to ${title || 'details'}`}\n >\n [ Learn More → ]\n </a>\n )}\n </div>\n </div>\n </div>\n );\n});\n"],"mappings":";AAAA,SAAS,kBAAkB;AAE3B,SAAS,UAAU;AACnB,SAAS,WAAW,sBAAsB;AA0JpC,SAOI,KAPJ;AAxCC,IAAM,OAAO,WAAsC,SAASA,MAAK;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AACN,QAAM,cAAc,SAAS,UAAU,MAAM,IAAI;AAUjD,QAAM,OAAoB,YAAY,SAAU,CAAC,SAAS,WAAY,UAAU;AAEhF,QAAM,gBAA+B;AAAA,IACnC,iBAAiB,eAAe,QAAQ;AAAA,IACxC,OAAO,eAAe,KAAK;AAAA,IAC3B,QAAQ,aAAa,eAAe,OAAO,MAAM;AAAA,IACjD,YAAY;AAAA,IACZ,GAAI,cAAc,EAAE,iBAAiB,OAAO,iBAAiB,YAAY,IAAI,CAAC;AAAA,IAC9E,GAAG;AAAA,EACL;AAGA,MAAI,SAAS,SAAS;AACpB,WACE;AAAA,MAAC;AAAA;AAAA,QAAI,aAAU;AAAA,QACb;AAAA,QACA,WAAW,GAAG,SAAS;AAAA,QACvB,OAAO,EAAE,GAAG,eAAe,SAAS,SAAS;AAAA,QAC5C,GAAG;AAAA,QAEH;AAAA,mBACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY,eAAe,KAAK;AAAA,gBAChC,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO;AAAA,gBACP,iBAAiB,eAAe,eAAe,OAAO;AAAA,gBACtD,cAAc;AAAA,cAChB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAED,SACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY,eAAe,KAAK;AAAA,gBAChC,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,OAAO,eAAe,eAAe,KAAK;AAAA,gBAC1C,cAAc;AAAA,gBACd,eAAe;AAAA,cACjB;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,UAED,eACC,oBAAC,OAAE,OAAO,EAAE,YAAY,eAAe,KAAK,MAAM,UAAU,WAAW,OAAO,eAAe,KAAK,SAAS,SAAS,KAAK,YAAY,IAAI,GACtI,uBACH;AAAA,UAED;AAAA;AAAA;AAAA,IACH;AAAA,EAEJ;AAGA,QAAM,mBAAmB,aAAa,QAAQ,GAAG,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG,CAAC,QAAQ;AAEjG,SACE,oBAAC,SAAI,aAAU,QAAO,KAAU,WAAW,GAAG,gBAAgB,SAAS,GAAG,OAAO,EAAE,UAAU,QAAQ,GAAI,GAAG,OAC1G;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,GAAG;AAAA,MACL;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,cAAc,aAAa,eAAe,OAAO,MAAM;AAAA,cACvD,SAAS;AAAA,cACT,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,iBAAiB,eAAe,QAAQ;AAAA,YAC1C;AAAA,YAEA;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,YAAY,eAAe,KAAK;AAAA,oBAChC,UAAU;AAAA,oBACV,OAAO,eAAe,OAAO;AAAA,oBAC7B,YAAY;AAAA,oBACZ,eAAe;AAAA;AAAA;AAAA,oBAGf,UAAU;AAAA,oBACV,cAAc;AAAA,kBAChB;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cACC,YACC,oBAAC,SAAI,OAAO,EAAE,UAAU,UAAU,OAAO,eAAe,OAAO,SAAS,YAAY,EAAE,GACnF,oBACH;AAAA;AAAA;AAAA,QAEJ;AAAA,QAEC,UACC,oBAAC,SAAI,OAAO,EAAE,cAAc,aAAa,eAAe,OAAO,MAAM,GAAG,GACrE,iBACC,oBAAC,OAAE,MAAY,cAAY,WAAW,SAAS,MAAM,IACnD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,SAAS;AAAA,YACd,KAAK;AAAA,YACL,OAAO,EAAE,WAAW,SAAS,gBAAgB,UAAU,OAAO,QAAQ,WAAW,QAAQ;AAAA;AAAA,QAC3F,GACF,IAEA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,SAAS;AAAA,YACd,KAAK;AAAA,YACL,OAAO,EAAE,WAAW,SAAS,gBAAgB,UAAU,OAAO,QAAQ,WAAW,QAAQ;AAAA;AAAA,QAC3F,GAEJ;AAAA,QAGF,qBAAC,SAAI,OAAO,EAAE,SAAS,SAAS,GAC7B;AAAA,mBACC;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,YAAY,eAAe,KAAK;AAAA,gBAChC,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,OAAO,eAAe,KAAK;AAAA,cAC7B;AAAA,cAEC,iBACC,oBAAC,OAAE,MAAY,cAAY,WAAW,KAAK,IAAI,OAAO,EAAE,OAAO,WAAW,gBAAgB,OAAO,GAC9F,iBACH,IAEA;AAAA;AAAA,UAEJ;AAAA,UAED,eACC,oBAAC,OAAE,OAAO,EAAE,cAAc,WAAW,YAAY,eAAe,KAAK,MAAM,UAAU,UAAU,OAAO,eAAe,KAAK,SAAS,SAAS,KAAK,YAAY,IAAI,GAC9J,uBACH;AAAA,UAED;AAAA,UACA,QACC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,OAAO;AAAA,gBACL,YAAY,eAAe,KAAK;AAAA,gBAChC,YAAY;AAAA,gBACZ,OAAO,eAAe,OAAO;AAAA,gBAC7B,gBAAgB;AAAA,gBAChB,eAAe;AAAA,gBACf,SAAS;AAAA,gBACT,YAAY;AAAA,cACd;AAAA,cACA,cAAY,WAAW,SAAS,SAAS;AAAA,cAC1C;AAAA;AAAA,UAED;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF,GACF;AAEJ,CAAC;","names":["Card"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/ChartTooltip.tsx
|
|
4
|
+
import { TooltipWithBounds, useTooltip } from "@visx/tooltip";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
import { cn } from "../lib/recipe.js";
|
|
7
|
+
import { Card } from "./Card.js";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
var ChartTooltip = forwardRef(
|
|
10
|
+
function ChartTooltip2({ title, accent = "primary", top, left, children, className, ...props }, ref) {
|
|
11
|
+
const content = /* @__PURE__ */ jsx(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
ref,
|
|
15
|
+
"data-slot": "chart-tooltip",
|
|
16
|
+
className: cn("pointer-events-none inline-block align-top", className),
|
|
17
|
+
...props,
|
|
18
|
+
children: /* @__PURE__ */ jsxs(
|
|
19
|
+
Card,
|
|
20
|
+
{
|
|
21
|
+
variant: "panel",
|
|
22
|
+
accent,
|
|
23
|
+
className: cn("min-w-32 p-2.5 font-mono text-xs shadow-hard-sm", className),
|
|
24
|
+
children: [
|
|
25
|
+
title && /* @__PURE__ */ jsxs(
|
|
26
|
+
"div",
|
|
27
|
+
{
|
|
28
|
+
"data-slot": "chart-tooltip-title",
|
|
29
|
+
className: "mb-1 border-b border-edge-subtle pb-1 font-bold uppercase tracking-wider text-content-muted",
|
|
30
|
+
children: [
|
|
31
|
+
"[ ",
|
|
32
|
+
title,
|
|
33
|
+
" ]"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ jsx("div", { "data-slot": "chart-tooltip-body", className: "space-y-0.5 text-content-primary", children })
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
if (top !== void 0 && left !== void 0) {
|
|
44
|
+
return /* @__PURE__ */ jsx(TooltipWithBounds, { top, left, unstyled: true, children: content });
|
|
45
|
+
}
|
|
46
|
+
return content;
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
ChartTooltip.displayName = "ChartTooltip";
|
|
50
|
+
export {
|
|
51
|
+
ChartTooltip,
|
|
52
|
+
useTooltip as useChartTooltip
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=ChartTooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/ChartTooltip.tsx"],"sourcesContent":["'use client';\n\nimport { TooltipWithBounds, useTooltip } from '@visx/tooltip';\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../lib/recipe';\nimport type { AccentToken } from '../lib/theme';\nimport { Card } from './Card';\n\nexport { useTooltip as useChartTooltip };\n\nexport interface ChartTooltipProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: ReactNode;\n accent?: AccentToken;\n top?: number;\n left?: number;\n children: ReactNode;\n}\n\n/**\n * Themed container for chart inspection overlays.\n *\n * Renders an elevated card with brutalist borders and hard shadows\n * to display data point details on hover or focus without obscuring context.\n */\nexport const ChartTooltip = forwardRef<HTMLDivElement, ChartTooltipProps>(\n function ChartTooltip(\n { title, accent = 'primary', top, left, children, className, ...props },\n ref,\n ) {\n const content = (\n <div\n ref={ref}\n data-slot=\"chart-tooltip\"\n className={cn('pointer-events-none inline-block align-top', className)}\n {...props}\n >\n <Card\n variant=\"panel\"\n accent={accent}\n className={cn('min-w-32 p-2.5 font-mono text-xs shadow-hard-sm', className)}\n >\n {title && (\n <div\n data-slot=\"chart-tooltip-title\"\n className=\"mb-1 border-b border-edge-subtle pb-1 font-bold uppercase tracking-wider text-content-muted\"\n >\n [ {title} ]\n </div>\n )}\n <div data-slot=\"chart-tooltip-body\" className=\"space-y-0.5 text-content-primary\">\n {children}\n </div>\n </Card>\n </div>\n );\n\n if (top !== undefined && left !== undefined) {\n return (\n <TooltipWithBounds top={top} left={left} unstyled>\n {content}\n </TooltipWithBounds>\n );\n }\n\n return content;\n },\n);\n\nChartTooltip.displayName = 'ChartTooltip';\n"],"mappings":";;;AAEA,SAAS,mBAAmB,kBAAkB;AAC9C,SAAS,kBAAuD;AAChE,SAAS,UAAU;AAEnB,SAAS,YAAY;AAoCT,SAOF,KAPE;AAlBL,IAAM,eAAe;AAAA,EAC1B,SAASA,cACP,EAAE,OAAO,SAAS,WAAW,KAAK,MAAM,UAAU,WAAW,GAAG,MAAM,GACtE,KACA;AACA,UAAM,UACJ;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAU;AAAA,QACV,WAAW,GAAG,8CAA8C,SAAS;AAAA,QACpE,GAAG;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR;AAAA,YACA,WAAW,GAAG,mDAAmD,SAAS;AAAA,YAEzE;AAAA,uBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBACX;AAAA;AAAA,oBACI;AAAA,oBAAM;AAAA;AAAA;AAAA,cACX;AAAA,cAEF,oBAAC,SAAI,aAAU,sBAAqB,WAAU,oCAC3C,UACH;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAGF,QAAI,QAAQ,UAAa,SAAS,QAAW;AAC3C,aACE,oBAAC,qBAAkB,KAAU,MAAY,UAAQ,MAC9C,mBACH;AAAA,IAEJ;AAEA,WAAO;AAAA,EACT;AACF;AAEA,aAAa,cAAc;","names":["ChartTooltip"]}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/components/Checkbox.tsx
|
|
4
|
+
import { forwardRef } from "react";
|
|
5
|
+
import { Checkbox as BaseCheckbox } from "@base-ui/react/checkbox";
|
|
6
|
+
import { cn } from "../lib/recipe.js";
|
|
7
|
+
import { booleanControl } from "./booleanControl.js";
|
|
8
|
+
import { FieldFrame, accentStyle } from "./fieldFrame.js";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
var Checkbox = forwardRef(function Checkbox2({
|
|
11
|
+
label,
|
|
12
|
+
error,
|
|
13
|
+
helperText,
|
|
14
|
+
accent = "primary",
|
|
15
|
+
className = "",
|
|
16
|
+
style,
|
|
17
|
+
indeterminate = false,
|
|
18
|
+
checked,
|
|
19
|
+
defaultChecked,
|
|
20
|
+
onCheckedChange,
|
|
21
|
+
name,
|
|
22
|
+
value,
|
|
23
|
+
disabled,
|
|
24
|
+
readOnly,
|
|
25
|
+
required,
|
|
26
|
+
id,
|
|
27
|
+
...props
|
|
28
|
+
}, ref) {
|
|
29
|
+
const styles = booleanControl({ shape: "box" });
|
|
30
|
+
return /* @__PURE__ */ jsx(FieldFrame, { label, error, helperText, disabled, layout: "inline", children: /* @__PURE__ */ jsx(
|
|
31
|
+
BaseCheckbox.Root,
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
id,
|
|
35
|
+
name,
|
|
36
|
+
value,
|
|
37
|
+
checked,
|
|
38
|
+
defaultChecked,
|
|
39
|
+
indeterminate,
|
|
40
|
+
disabled,
|
|
41
|
+
readOnly,
|
|
42
|
+
required,
|
|
43
|
+
onCheckedChange: (next) => onCheckedChange?.(next),
|
|
44
|
+
"data-slot": "checkbox",
|
|
45
|
+
style: accentStyle(accent, style),
|
|
46
|
+
className: cn(styles.control(), className),
|
|
47
|
+
...props,
|
|
48
|
+
children: /* @__PURE__ */ jsx(BaseCheckbox.Indicator, { "data-slot": "checkbox-indicator", className: styles.mark(), children: /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: indeterminate ? "-" : "X" }) })
|
|
49
|
+
}
|
|
50
|
+
) });
|
|
51
|
+
});
|
|
52
|
+
export {
|
|
53
|
+
Checkbox
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/Checkbox.tsx"],"sourcesContent":["'use client';\n\nimport { forwardRef } from 'react';\nimport { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport { cn } from '../lib/recipe';\nimport { booleanControl } from './booleanControl';\nimport { FieldFrame, accentStyle } from './fieldFrame';\nimport type { BooleanFieldProps } from './fieldFrame';\n\nexport interface CheckboxProps extends BooleanFieldProps {\n /**\n * The third state: neither ticked nor unticked.\n *\n * It is a prop rather than a value `checked` can take, because that is what\n * the platform does — `input.indeterminate` is separate from `input.checked`\n * and a form submits the underlying `checked`. Base UI sets the DOM property\n * and renders `aria-checked=\"mixed\"`; nothing here tracks it.\n */\n indeterminate?: boolean;\n}\n\n/**\n * A checkbox, with its label, description and error as one unit.\n *\n * Reach for it to choose *many* from a set, or to answer one yes/no that the\n * form submits. `Switch` is the same boolean where the change takes effect\n * immediately and there is nothing to submit — a setting rather than an answer.\n *\n * It composes the same `Field` the text controls use, so `error` does three\n * things at once here too: the message, `aria-invalid`, and the danger border.\n * `CheckboxRootState extends FieldRootState`, so `disabled`, `touched`,\n * `dirty`, `valid`, `filled` and `focused` arrive as data attributes on the\n * control without either the field or the control being told about the other.\n *\n * Everything a hand-rolled checkbox gets wrong is Base UI's here and not\n * written in this file: the generated `id` and its label association, the\n * composed `aria-describedby`, `aria-checked=\"mixed\"`, the `indeterminate` DOM\n * property, and the hidden input that makes the control appear in `FormData`\n * under its `name`.\n *\n * ```tsx\n * <Checkbox name=\"terms\" label=\"Accept the terms\" required />\n * ```\n */\nexport const Checkbox = forwardRef<HTMLSpanElement, CheckboxProps>(function Checkbox(\n {\n label,\n error,\n helperText,\n accent = 'primary',\n className = '',\n style,\n indeterminate = false,\n checked,\n defaultChecked,\n onCheckedChange,\n name,\n value,\n disabled,\n readOnly,\n required,\n id,\n ...props\n },\n ref,\n) {\n const styles = booleanControl({ shape: 'box' });\n\n return (\n <FieldFrame label={label} error={error} helperText={helperText} disabled={disabled} layout=\"inline\">\n <BaseCheckbox.Root\n ref={ref}\n id={id}\n name={name}\n value={value}\n checked={checked}\n defaultChecked={defaultChecked}\n indeterminate={indeterminate}\n disabled={disabled}\n readOnly={readOnly}\n required={required}\n // Base UI's handler takes event details as a second argument. Dropping\n // them is the confinement rule: forwarding the object would name a Base\n // UI type in the published `.d.ts`.\n onCheckedChange={(next) => onCheckedChange?.(next)}\n data-slot=\"checkbox\"\n style={accentStyle(accent, style)}\n // `cn`, not an appended string: the merge is what makes a caller's\n // utility actually replace the recipe's rather than race it in CSS\n // source order. Same composition `Modal` uses over `dialogSurface`.\n className={cn(styles.control(), className)}\n {...props}\n >\n <BaseCheckbox.Indicator data-slot=\"checkbox-indicator\" className={styles.mark()}>\n {/*\n * ASCII, not an icon: the mark is a glyph in the same mono face the\n * rest of the system sets, so it scales with the type rather than\n * being a second unit of measure. `aria-hidden` because the control\n * announces itself through `aria-checked` — the glyph would\n * otherwise be read as part of the name.\n */}\n <span aria-hidden=\"true\">{indeterminate ? '-' : 'X'}</span>\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n </FieldFrame>\n );\n});\n"],"mappings":";;;AAEA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,oBAAoB;AACzC,SAAS,UAAU;AACnB,SAAS,sBAAsB;AAC/B,SAAS,YAAY,mBAAmB;AA+F9B;AAzDH,IAAM,WAAW,WAA2C,SAASA,UAC1E;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,YAAY;AAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AACA,QAAM,SAAS,eAAe,EAAE,OAAO,MAAM,CAAC;AAE9C,SACE,oBAAC,cAAW,OAAc,OAAc,YAAwB,UAAoB,QAAO,UACzF;AAAA,IAAC,aAAa;AAAA,IAAb;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAIA,iBAAiB,CAAC,SAAS,kBAAkB,IAAI;AAAA,MACjD,aAAU;AAAA,MACV,OAAO,YAAY,QAAQ,KAAK;AAAA,MAIhC,WAAW,GAAG,OAAO,QAAQ,GAAG,SAAS;AAAA,MACxC,GAAG;AAAA,MAEJ,8BAAC,aAAa,WAAb,EAAuB,aAAU,sBAAqB,WAAW,OAAO,KAAK,GAQ5E,8BAAC,UAAK,eAAY,QAAQ,0BAAgB,MAAM,KAAI,GACtD;AAAA;AAAA,EACF,GACF;AAEJ,CAAC;","names":["Checkbox"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// src/components/ColophonCard.tsx
|
|
2
|
+
import { ArrowUpRight, Code2, Globe, Rss, Share2 } from "lucide-react";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { cn } from "../lib/recipe.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var ICON_MAP = {
|
|
7
|
+
code: Code2,
|
|
8
|
+
globe: Globe,
|
|
9
|
+
share: Share2,
|
|
10
|
+
rss: Rss,
|
|
11
|
+
external: ArrowUpRight
|
|
12
|
+
};
|
|
13
|
+
var ColophonCard = forwardRef(
|
|
14
|
+
function ColophonCard2({
|
|
15
|
+
authorName = "RYAN KELLY",
|
|
16
|
+
authorRole = "STAFF ENGINEER // DISTRIBUTED SYSTEMS & TOOLING",
|
|
17
|
+
bio = "I build high-throughput data engines, compiler extensions, and retro-brutalist developer tooling.",
|
|
18
|
+
sectionMarker = "\xA7",
|
|
19
|
+
links = [
|
|
20
|
+
{ label: "GITHUB", href: "https://github.com/rtkelly13", icon: "code" },
|
|
21
|
+
{ label: "BLOG", href: "https://ryankelly.dev", icon: "globe" },
|
|
22
|
+
{ label: "SHARE", href: "https://twitter.com", icon: "share" },
|
|
23
|
+
{ label: "RSS FEED", href: "/feed.xml", icon: "rss" }
|
|
24
|
+
],
|
|
25
|
+
className,
|
|
26
|
+
...props
|
|
27
|
+
}, ref) {
|
|
28
|
+
return /* @__PURE__ */ jsxs(
|
|
29
|
+
"aside",
|
|
30
|
+
{
|
|
31
|
+
ref,
|
|
32
|
+
"data-slot": "colophon-card",
|
|
33
|
+
className: cn(
|
|
34
|
+
"border-2 border-edge-strong bg-surface-base font-mono text-content-primary p-6 shadow-hard-md relative overflow-hidden",
|
|
35
|
+
className
|
|
36
|
+
),
|
|
37
|
+
...props,
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ jsx(
|
|
40
|
+
"div",
|
|
41
|
+
{
|
|
42
|
+
"data-slot": "colophon-card-watermark",
|
|
43
|
+
className: "absolute -right-2 -bottom-6 text-9xl font-black text-content-primary/5 select-none pointer-events-none font-serif",
|
|
44
|
+
"aria-hidden": "true",
|
|
45
|
+
children: sectionMarker
|
|
46
|
+
}
|
|
47
|
+
),
|
|
48
|
+
/* @__PURE__ */ jsxs("div", { className: "relative z-10 flex flex-col md:flex-row gap-6 items-start", children: [
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
"div",
|
|
51
|
+
{
|
|
52
|
+
"data-slot": "colophon-card-marker",
|
|
53
|
+
className: "w-12 h-12 shrink-0 border-2 border-accent-primary bg-surface-raised flex items-center justify-center text-accent-primary font-black text-2xl shadow-hard-sm",
|
|
54
|
+
children: sectionMarker
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-3", children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
59
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"h4",
|
|
62
|
+
{
|
|
63
|
+
"data-slot": "colophon-card-name",
|
|
64
|
+
className: "text-sm font-black tracking-widest text-content-primary uppercase",
|
|
65
|
+
children: authorName
|
|
66
|
+
}
|
|
67
|
+
),
|
|
68
|
+
/* @__PURE__ */ jsx("span", { className: "w-1.5 h-3 bg-accent-primary animate-pulse" })
|
|
69
|
+
] }),
|
|
70
|
+
/* @__PURE__ */ jsx(
|
|
71
|
+
"div",
|
|
72
|
+
{
|
|
73
|
+
"data-slot": "colophon-card-role",
|
|
74
|
+
className: "text-xs font-bold text-accent-secondary",
|
|
75
|
+
children: authorRole
|
|
76
|
+
}
|
|
77
|
+
)
|
|
78
|
+
] }),
|
|
79
|
+
/* @__PURE__ */ jsx(
|
|
80
|
+
"p",
|
|
81
|
+
{
|
|
82
|
+
"data-slot": "colophon-card-bio",
|
|
83
|
+
className: "font-sans text-sm text-content-secondary leading-relaxed max-w-2xl",
|
|
84
|
+
children: bio
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
links && links.length > 0 && /* @__PURE__ */ jsx(
|
|
88
|
+
"div",
|
|
89
|
+
{
|
|
90
|
+
"data-slot": "colophon-card-links",
|
|
91
|
+
className: "flex flex-wrap gap-2 pt-2",
|
|
92
|
+
children: links.map((link) => {
|
|
93
|
+
const Icon = link.icon ? ICON_MAP[link.icon] : ArrowUpRight;
|
|
94
|
+
return /* @__PURE__ */ jsxs(
|
|
95
|
+
"a",
|
|
96
|
+
{
|
|
97
|
+
href: link.href,
|
|
98
|
+
target: "_blank",
|
|
99
|
+
rel: "noopener noreferrer",
|
|
100
|
+
className: "group inline-flex items-center gap-1.5 px-3 py-1.5 border border-edge-default bg-surface-raised text-xs font-bold text-content-primary hover:bg-surface-overlay hover:text-content-inverse hover:border-edge-strong transition-all shadow-hard-sm hover:-translate-x-0.5 hover:-translate-y-0.5",
|
|
101
|
+
children: [
|
|
102
|
+
/* @__PURE__ */ jsx(Icon, { size: 12, className: "group-hover:stroke-[2.5]" }),
|
|
103
|
+
/* @__PURE__ */ jsx("span", { children: link.label })
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
link.label
|
|
107
|
+
);
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] })
|
|
112
|
+
] })
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
ColophonCard.displayName = "ColophonCard";
|
|
119
|
+
export {
|
|
120
|
+
ColophonCard
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=ColophonCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/ColophonCard.tsx"],"sourcesContent":["import { ArrowUpRight, Code2, Globe, Rss, Share2 } from 'lucide-react';\nimport { forwardRef, type HTMLAttributes } from 'react';\nimport { cn } from '../lib/recipe';\n\nexport interface ColophonLink {\n /** Display label for the link chip. */\n label: string;\n /** Destination URL. */\n href: string;\n /** Predefined glyph category icon. */\n icon?: 'code' | 'globe' | 'share' | 'rss' | 'external';\n}\n\nexport interface ColophonCardProps extends HTMLAttributes<HTMLElement> {\n /** Author name heading (default 'RYAN KELLY'). */\n authorName?: string;\n /** Technical role or title (default 'STAFF ENGINEER // DISTRIBUTED SYSTEMS & TOOLING'). */\n authorRole?: string;\n /** Biographic prose summary. */\n bio?: string;\n /** Oversized background watermark and emblem glyph (default '§'). */\n sectionMarker?: string;\n /** Array of social, source, or feed links. */\n links?: ColophonLink[];\n}\n\nconst ICON_MAP = {\n code: Code2,\n globe: Globe,\n share: Share2,\n rss: Rss,\n external: ArrowUpRight,\n};\n\n/**\n * Editorial author endnote colophon card.\n *\n * Implements a literary and technical signoff block placed at the end of essays\n * and articles. Features a prominent section mark (§), monospace bio block,\n * and brutalist action chips with hover lift.\n *\n * @example\n * ```tsx\n * <ColophonCard\n * authorName=\"RYAN KELLY\"\n * authorRole=\"STAFF ENGINEER\"\n * bio=\"Distributed systems engineer building retro-brutalist tooling.\"\n * links={[{ label: 'GITHUB', href: 'https://github.com/rtkelly13', icon: 'code' }]}\n * />\n * ```\n */\nexport const ColophonCard = forwardRef<HTMLElement, ColophonCardProps>(\n function ColophonCard(\n {\n authorName = 'RYAN KELLY',\n authorRole = 'STAFF ENGINEER // DISTRIBUTED SYSTEMS & TOOLING',\n bio = 'I build high-throughput data engines, compiler extensions, and retro-brutalist developer tooling.',\n sectionMarker = '§',\n links = [\n { label: 'GITHUB', href: 'https://github.com/rtkelly13', icon: 'code' },\n { label: 'BLOG', href: 'https://ryankelly.dev', icon: 'globe' },\n { label: 'SHARE', href: 'https://twitter.com', icon: 'share' },\n { label: 'RSS FEED', href: '/feed.xml', icon: 'rss' },\n ],\n className,\n ...props\n },\n ref,\n ) {\n return (\n <aside\n ref={ref}\n data-slot=\"colophon-card\"\n className={cn(\n 'border-2 border-edge-strong bg-surface-base font-mono text-content-primary p-6 shadow-hard-md relative overflow-hidden',\n className,\n )}\n {...props}\n >\n {/* Background oversized section watermark */}\n <div\n data-slot=\"colophon-card-watermark\"\n className=\"absolute -right-2 -bottom-6 text-9xl font-black text-content-primary/5 select-none pointer-events-none font-serif\"\n aria-hidden=\"true\"\n >\n {sectionMarker}\n </div>\n\n <div className=\"relative z-10 flex flex-col md:flex-row gap-6 items-start\">\n {/* Section glyph marker box */}\n <div\n data-slot=\"colophon-card-marker\"\n className=\"w-12 h-12 shrink-0 border-2 border-accent-primary bg-surface-raised flex items-center justify-center text-accent-primary font-black text-2xl shadow-hard-sm\"\n >\n {sectionMarker}\n </div>\n\n {/* Content & Bio block */}\n <div className=\"flex-1 space-y-3\">\n <div className=\"space-y-1\">\n <div className=\"flex items-center gap-2\">\n <h4\n data-slot=\"colophon-card-name\"\n className=\"text-sm font-black tracking-widest text-content-primary uppercase\"\n >\n {authorName}\n </h4>\n <span className=\"w-1.5 h-3 bg-accent-primary animate-pulse\" />\n </div>\n <div\n data-slot=\"colophon-card-role\"\n className=\"text-xs font-bold text-accent-secondary\"\n >\n {authorRole}\n </div>\n </div>\n\n <p\n data-slot=\"colophon-card-bio\"\n className=\"font-sans text-sm text-content-secondary leading-relaxed max-w-2xl\"\n >\n {bio}\n </p>\n\n {/* Action Chips */}\n {links && links.length > 0 && (\n <div\n data-slot=\"colophon-card-links\"\n className=\"flex flex-wrap gap-2 pt-2\"\n >\n {links.map((link) => {\n const Icon = link.icon ? ICON_MAP[link.icon] : ArrowUpRight;\n return (\n <a\n key={link.label}\n href={link.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"group inline-flex items-center gap-1.5 px-3 py-1.5 border border-edge-default bg-surface-raised text-xs font-bold text-content-primary hover:bg-surface-overlay hover:text-content-inverse hover:border-edge-strong transition-all shadow-hard-sm hover:-translate-x-0.5 hover:-translate-y-0.5\"\n >\n <Icon size={12} className=\"group-hover:stroke-[2.5]\" />\n <span>{link.label}</span>\n </a>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </aside>\n );\n },\n);\n\nColophonCard.displayName = 'ColophonCard';\n"],"mappings":";AAAA,SAAS,cAAc,OAAO,OAAO,KAAK,cAAc;AACxD,SAAS,kBAAuC;AAChD,SAAS,UAAU;AA8EX,cAoBM,YApBN;AAtDR,IAAM,WAAW;AAAA,EACf,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,KAAK;AAAA,EACL,UAAU;AACZ;AAmBO,IAAM,eAAe;AAAA,EAC1B,SAASA,cACP;AAAA,IACE,aAAa;AAAA,IACb,aAAa;AAAA,IACb,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,QAAQ;AAAA,MACN,EAAE,OAAO,UAAU,MAAM,gCAAgC,MAAM,OAAO;AAAA,MACtE,EAAE,OAAO,QAAQ,MAAM,yBAAyB,MAAM,QAAQ;AAAA,MAC9D,EAAE,OAAO,SAAS,MAAM,uBAAuB,MAAM,QAAQ;AAAA,MAC7D,EAAE,OAAO,YAAY,MAAM,aAAa,MAAM,MAAM;AAAA,IACtD;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,KACA;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAU;AAAA,QACV,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAGJ;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,aAAU;AAAA,cACV,WAAU;AAAA,cACV,eAAY;AAAA,cAEX;AAAA;AAAA,UACH;AAAA,UAEA,qBAAC,SAAI,WAAU,6DAEb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAU;AAAA,gBACV,WAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,YAGA,qBAAC,SAAI,WAAU,oBACb;AAAA,mCAAC,SAAI,WAAU,aACb;AAAA,qCAAC,SAAI,WAAU,2BACb;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,aAAU;AAAA,sBACV,WAAU;AAAA,sBAET;AAAA;AAAA,kBACH;AAAA,kBACA,oBAAC,UAAK,WAAU,6CAA4C;AAAA,mBAC9D;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,aAAU;AAAA,oBACV,WAAU;AAAA,oBAET;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cAEA;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBAET;AAAA;AAAA,cACH;AAAA,cAGC,SAAS,MAAM,SAAS,KACvB;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAU;AAAA,kBACV,WAAU;AAAA,kBAET,gBAAM,IAAI,CAAC,SAAS;AACnB,0BAAM,OAAO,KAAK,OAAO,SAAS,KAAK,IAAI,IAAI;AAC/C,2BACE;AAAA,sBAAC;AAAA;AAAA,wBAEC,MAAM,KAAK;AAAA,wBACX,QAAO;AAAA,wBACP,KAAI;AAAA,wBACJ,WAAU;AAAA,wBAEV;AAAA,8CAAC,QAAK,MAAM,IAAI,WAAU,4BAA2B;AAAA,0BACrD,oBAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,sBAPb,KAAK;AAAA,oBAQZ;AAAA,kBAEJ,CAAC;AAAA;AAAA,cACH;AAAA,eAEJ;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,aAAa,cAAc;","names":["ColophonCard"]}
|