@nationaldesignstudio/react 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accordion/index.d.ts +95 -0
- package/dist/accordion/index.js +143 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/background/index.d.ts +149 -0
- package/dist/background/index.js +200 -0
- package/dist/background/index.js.map +1 -0
- package/dist/banner/index.d.ts +101 -0
- package/dist/banner/index.js +81 -0
- package/dist/banner/index.js.map +1 -0
- package/dist/blurred-video-backdrop/index.d.ts +233 -0
- package/dist/blurred-video-backdrop/index.js +266 -0
- package/dist/blurred-video-backdrop/index.js.map +1 -0
- package/dist/button/index.d.ts +180 -0
- package/dist/button/index.js +169 -0
- package/dist/button/index.js.map +1 -0
- package/dist/button-B2g5fH9b.d.ts +152 -0
- package/dist/card/index.d.ts +406 -0
- package/dist/card/index.js +219 -0
- package/dist/card/index.js.map +1 -0
- package/dist/card-grid/index.d.ts +90 -0
- package/dist/card-grid/index.js +74 -0
- package/dist/card-grid/index.js.map +1 -0
- package/dist/component-registry.md +136 -2
- package/dist/dev-toolbar/index.d.ts +8 -0
- package/dist/dev-toolbar/index.js +206 -0
- package/dist/dev-toolbar/index.js.map +1 -0
- package/dist/dialog/index.d.ts +268 -0
- package/dist/dialog/index.js +288 -0
- package/dist/dialog/index.js.map +1 -0
- package/dist/faq-section/index.d.ts +47 -0
- package/dist/faq-section/index.js +152 -0
- package/dist/faq-section/index.js.map +1 -0
- package/dist/grid-overlay/index.d.ts +10 -0
- package/dist/grid-overlay/index.js +38 -0
- package/dist/grid-overlay/index.js.map +1 -0
- package/dist/hero/index.d.ts +462 -0
- package/dist/hero/index.js +494 -0
- package/dist/hero/index.js.map +1 -0
- package/dist/hooks/index.d.ts +150 -0
- package/dist/hooks/index.js +339 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +46 -5339
- package/dist/index.js +157 -4080
- package/dist/index.js.map +1 -1
- package/dist/input/index.d.ts +404 -0
- package/dist/input/index.js +393 -0
- package/dist/input/index.js.map +1 -0
- package/dist/navbar/index.d.ts +68 -0
- package/dist/navbar/index.js +227 -0
- package/dist/navbar/index.js.map +1 -0
- package/dist/ndstudio-footer/index.d.ts +32 -0
- package/dist/ndstudio-footer/index.js +35 -0
- package/dist/ndstudio-footer/index.js.map +1 -0
- package/dist/pager-control/index.d.ts +173 -0
- package/dist/pager-control/index.js +267 -0
- package/dist/pager-control/index.js.map +1 -0
- package/dist/popover/index.d.ts +200 -0
- package/dist/popover/index.js +290 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/prose/index.d.ts +39 -0
- package/dist/prose/index.js +56 -0
- package/dist/prose/index.js.map +1 -0
- package/dist/quote-block/index.d.ts +156 -0
- package/dist/quote-block/index.js +321 -0
- package/dist/quote-block/index.js.map +1 -0
- package/dist/river/index.d.ts +100 -0
- package/dist/river/index.js +107 -0
- package/dist/river/index.js.map +1 -0
- package/dist/select/index.d.ts +188 -0
- package/dist/select/index.js +295 -0
- package/dist/select/index.js.map +1 -0
- package/dist/theme/index.d.ts +149 -0
- package/dist/theme/index.js +211 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme-CzBPUlh_.d.ts +332 -0
- package/dist/tooltip/index.d.ts +166 -0
- package/dist/tooltip/index.js +200 -0
- package/dist/tooltip/index.js.map +1 -0
- package/dist/tout/index.d.ts +157 -0
- package/dist/tout/index.js +315 -0
- package/dist/tout/index.js.map +1 -0
- package/dist/two-column-section/index.d.ts +122 -0
- package/dist/two-column-section/index.js +121 -0
- package/dist/two-column-section/index.js.map +1 -0
- package/dist/us-gov-banner/index.d.ts +141 -0
- package/dist/us-gov-banner/index.js +74 -0
- package/dist/us-gov-banner/index.js.map +1 -0
- package/dist/use-captions-AkKlJhov.d.ts +71 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +12 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/video-dialog/index.d.ts +106 -0
- package/dist/video-dialog/index.js +1305 -0
- package/dist/video-dialog/index.js.map +1 -0
- package/dist/video-player/index.d.ts +115 -0
- package/dist/video-player/index.js +879 -0
- package/dist/video-player/index.js.map +1 -0
- package/dist/video-player-qxf-BURH.d.ts +236 -0
- package/dist/video-with-backdrop/index.d.ts +267 -0
- package/dist/video-with-backdrop/index.js +1284 -0
- package/dist/video-with-backdrop/index.js.map +1 -0
- package/package.json +13 -2
- package/src/components/organisms/us-gov-banner/us-gov-banner.tsx +5 -27
- package/src/theme/hooks.ts +2 -0
- package/src/theme/index.ts +2 -0
- package/src/theme/theme-provider.tsx +2 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Dialog } from '@base-ui-components/react/dialog';
|
|
3
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { clsx } from 'clsx';
|
|
6
|
+
import { cnBase } from 'tailwind-variants';
|
|
7
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
// src/components/organisms/navbar/navbar.tsx
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return cnBase(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
var NavbarContext = React.createContext({
|
|
14
|
+
isMobileMenuOpen: false,
|
|
15
|
+
setIsMobileMenuOpen: () => {
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
var Navbar = React.forwardRef(
|
|
19
|
+
({ className, children, ...props }, ref) => {
|
|
20
|
+
const [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false);
|
|
21
|
+
const navRef = React.useRef(null);
|
|
22
|
+
React.useEffect(() => {
|
|
23
|
+
const updateHeight = () => {
|
|
24
|
+
if (navRef.current) {
|
|
25
|
+
const height = navRef.current.offsetHeight;
|
|
26
|
+
document.documentElement.style.setProperty(
|
|
27
|
+
"--navbar-height",
|
|
28
|
+
`${height}px`
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
updateHeight();
|
|
33
|
+
window.addEventListener("resize", updateHeight);
|
|
34
|
+
return () => window.removeEventListener("resize", updateHeight);
|
|
35
|
+
}, []);
|
|
36
|
+
const mergedRef = React.useCallback(
|
|
37
|
+
(node) => {
|
|
38
|
+
navRef.current = node;
|
|
39
|
+
if (typeof ref === "function") {
|
|
40
|
+
ref(node);
|
|
41
|
+
} else if (ref) {
|
|
42
|
+
ref.current = node;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
[ref]
|
|
46
|
+
);
|
|
47
|
+
return /* @__PURE__ */ jsx(NavbarContext.Provider, { value: { isMobileMenuOpen, setIsMobileMenuOpen }, children: /* @__PURE__ */ jsx(
|
|
48
|
+
"nav",
|
|
49
|
+
{
|
|
50
|
+
ref: mergedRef,
|
|
51
|
+
className: cn("relative z-50 w-full bg-gray-50", className),
|
|
52
|
+
...props,
|
|
53
|
+
children: /* @__PURE__ */ jsx(
|
|
54
|
+
"div",
|
|
55
|
+
{
|
|
56
|
+
className: cn(
|
|
57
|
+
"flex w-full items-center justify-between",
|
|
58
|
+
// Mobile
|
|
59
|
+
"px-spatial-component-navbar-padding-x-mobile py-spatial-component-navbar-padding-y-mobile",
|
|
60
|
+
// Tablet
|
|
61
|
+
"md:px-spatial-component-navbar-padding-x-tablet md:py-spatial-component-navbar-padding-y-tablet",
|
|
62
|
+
// Desktop
|
|
63
|
+
"xl:px-spatial-component-navbar-padding-x-desktop xl:py-spatial-component-navbar-padding-y-desktop"
|
|
64
|
+
),
|
|
65
|
+
children
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
) });
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
Navbar.displayName = "Navbar";
|
|
73
|
+
var NavbarBrand = React.forwardRef(
|
|
74
|
+
({ className, asChild = false, ...props }, ref) => {
|
|
75
|
+
const Comp = asChild ? Slot : "div";
|
|
76
|
+
return /* @__PURE__ */ jsx(Comp, { ref, className: cn("shrink-0", className), ...props });
|
|
77
|
+
}
|
|
78
|
+
);
|
|
79
|
+
NavbarBrand.displayName = "NavbarBrand";
|
|
80
|
+
var NavbarLinks = React.forwardRef(
|
|
81
|
+
({ className, ...props }, ref) => {
|
|
82
|
+
return /* @__PURE__ */ jsx(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
ref,
|
|
86
|
+
className: cn(
|
|
87
|
+
"hidden items-center gap-spatial-component-navbar-gap-links md:flex",
|
|
88
|
+
className
|
|
89
|
+
),
|
|
90
|
+
...props
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
);
|
|
95
|
+
NavbarLinks.displayName = "NavbarLinks";
|
|
96
|
+
var NavbarLink = React.forwardRef(
|
|
97
|
+
({ className, asChild = false, active, ...props }, ref) => {
|
|
98
|
+
const Comp = asChild ? Slot : "a";
|
|
99
|
+
return /* @__PURE__ */ jsx(
|
|
100
|
+
Comp,
|
|
101
|
+
{
|
|
102
|
+
ref,
|
|
103
|
+
className: cn(
|
|
104
|
+
"typography-body-small font-medium text-gray-900 transition-colors hover:text-gray-700",
|
|
105
|
+
active && "text-gray-1100",
|
|
106
|
+
className
|
|
107
|
+
),
|
|
108
|
+
...props
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
NavbarLink.displayName = "NavbarLink";
|
|
114
|
+
var NavbarActions = React.forwardRef(
|
|
115
|
+
({ className, ...props }, ref) => {
|
|
116
|
+
return /* @__PURE__ */ jsx(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
ref,
|
|
120
|
+
className: cn(
|
|
121
|
+
"flex items-center gap-spatial-component-navbar-gap-actions",
|
|
122
|
+
className
|
|
123
|
+
),
|
|
124
|
+
...props
|
|
125
|
+
}
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
NavbarActions.displayName = "NavbarActions";
|
|
130
|
+
var NavbarMobileMenu = React.forwardRef(({ className, children, ...props }, ref) => {
|
|
131
|
+
const { isMobileMenuOpen, setIsMobileMenuOpen } = React.useContext(NavbarContext);
|
|
132
|
+
return /* @__PURE__ */ jsx(Dialog.Root, { open: isMobileMenuOpen, onOpenChange: setIsMobileMenuOpen, children: /* @__PURE__ */ jsx(Dialog.Portal, { children: /* @__PURE__ */ jsxs(
|
|
133
|
+
Dialog.Popup,
|
|
134
|
+
{
|
|
135
|
+
ref,
|
|
136
|
+
className: cn(
|
|
137
|
+
"fixed inset-0 z-50 bg-gray-50 md:hidden",
|
|
138
|
+
// Position below navbar
|
|
139
|
+
"pt-[calc(var(--navbar-height,60px)+1px)]",
|
|
140
|
+
// Smooth transition
|
|
141
|
+
"transition-opacity duration-200",
|
|
142
|
+
className
|
|
143
|
+
),
|
|
144
|
+
...props,
|
|
145
|
+
children: [
|
|
146
|
+
/* @__PURE__ */ jsx(Dialog.Title, { className: "sr-only", children: "Navigation menu" }),
|
|
147
|
+
/* @__PURE__ */ jsx(
|
|
148
|
+
"div",
|
|
149
|
+
{
|
|
150
|
+
className: cn(
|
|
151
|
+
"flex flex-col",
|
|
152
|
+
// Padding matching navbar
|
|
153
|
+
"px-spatial-component-navbar-padding-x-mobile py-spatial-component-navbar-padding-y-tablet",
|
|
154
|
+
// Gap between links
|
|
155
|
+
"gap-spatial-component-navbar-gap-mobile-menu"
|
|
156
|
+
),
|
|
157
|
+
children
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
) }) });
|
|
163
|
+
});
|
|
164
|
+
NavbarMobileMenu.displayName = "NavbarMobileMenu";
|
|
165
|
+
var NavbarMobileMenuButton = React.forwardRef(({ className, asChild = false, children, ...props }, ref) => {
|
|
166
|
+
const { isMobileMenuOpen, setIsMobileMenuOpen } = React.useContext(NavbarContext);
|
|
167
|
+
const handleClick = () => {
|
|
168
|
+
setIsMobileMenuOpen(!isMobileMenuOpen);
|
|
169
|
+
};
|
|
170
|
+
if (asChild) {
|
|
171
|
+
return /* @__PURE__ */ jsx(
|
|
172
|
+
Slot,
|
|
173
|
+
{
|
|
174
|
+
ref,
|
|
175
|
+
"aria-label": "Toggle navigation menu",
|
|
176
|
+
"aria-expanded": isMobileMenuOpen,
|
|
177
|
+
"aria-controls": "navbar-mobile-menu",
|
|
178
|
+
onClick: handleClick,
|
|
179
|
+
className,
|
|
180
|
+
...props,
|
|
181
|
+
children
|
|
182
|
+
}
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return /* @__PURE__ */ jsx(
|
|
186
|
+
"button",
|
|
187
|
+
{
|
|
188
|
+
ref,
|
|
189
|
+
type: "button",
|
|
190
|
+
"aria-label": "Toggle navigation menu",
|
|
191
|
+
"aria-expanded": isMobileMenuOpen,
|
|
192
|
+
"aria-controls": "navbar-mobile-menu",
|
|
193
|
+
onClick: handleClick,
|
|
194
|
+
className: cn("transition-colors", className),
|
|
195
|
+
...props,
|
|
196
|
+
children
|
|
197
|
+
}
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
NavbarMobileMenuButton.displayName = "NavbarMobileMenuButton";
|
|
201
|
+
var NavbarMobileMenuLink = React.forwardRef(({ className, asChild = false, active, onClick, ...props }, ref) => {
|
|
202
|
+
const { setIsMobileMenuOpen } = React.useContext(NavbarContext);
|
|
203
|
+
const Comp = asChild ? Slot : "a";
|
|
204
|
+
const handleClick = (event) => {
|
|
205
|
+
setIsMobileMenuOpen(false);
|
|
206
|
+
onClick?.(event);
|
|
207
|
+
};
|
|
208
|
+
return /* @__PURE__ */ jsx(
|
|
209
|
+
Comp,
|
|
210
|
+
{
|
|
211
|
+
ref,
|
|
212
|
+
className: cn(
|
|
213
|
+
"typography-body-medium font-medium text-gray-900 transition-colors hover:text-gray-700",
|
|
214
|
+
"py-spatial-component-navbar-padding-y-mobile",
|
|
215
|
+
active && "text-gray-1100",
|
|
216
|
+
className
|
|
217
|
+
),
|
|
218
|
+
onClick: handleClick,
|
|
219
|
+
...props
|
|
220
|
+
}
|
|
221
|
+
);
|
|
222
|
+
});
|
|
223
|
+
NavbarMobileMenuLink.displayName = "NavbarMobileMenuLink";
|
|
224
|
+
|
|
225
|
+
export { Navbar, NavbarActions, NavbarBrand, NavbarLink, NavbarLinks, NavbarMobileMenu, NavbarMobileMenuButton, NavbarMobileMenuLink };
|
|
226
|
+
//# sourceMappingURL=index.js.map
|
|
227
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/components/organisms/navbar/navbar.tsx"],"names":["twMerge"],"mappings":"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","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { cnBase as twMerge } from \"tailwind-variants\";\n\nexport { twMerge };\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","\"use client\";\n\nimport { Dialog } from \"@base-ui-components/react/dialog\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n// Context for mobile menu state\nconst NavbarContext = React.createContext<{\n\tisMobileMenuOpen: boolean;\n\tsetIsMobileMenuOpen: (open: boolean) => void;\n}>({\n\tisMobileMenuOpen: false,\n\tsetIsMobileMenuOpen: () => {},\n});\n\nexport interface NavbarProps extends React.HTMLAttributes<HTMLElement> {}\n\n/**\n * Main navigation bar container.\n * Provides responsive layout for brand, links, and actions.\n */\nconst Navbar = React.forwardRef<HTMLElement, NavbarProps>(\n\t({ className, children, ...props }, ref) => {\n\t\tconst [isMobileMenuOpen, setIsMobileMenuOpen] = React.useState(false);\n\t\tconst navRef = React.useRef<HTMLElement>(null);\n\n\t\t// Set navbar height CSS variable for mobile menu positioning\n\t\tReact.useEffect(() => {\n\t\t\tconst updateHeight = () => {\n\t\t\t\tif (navRef.current) {\n\t\t\t\t\tconst height = navRef.current.offsetHeight;\n\t\t\t\t\tdocument.documentElement.style.setProperty(\n\t\t\t\t\t\t\"--navbar-height\",\n\t\t\t\t\t\t`${height}px`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tupdateHeight();\n\t\t\twindow.addEventListener(\"resize\", updateHeight);\n\t\t\treturn () => window.removeEventListener(\"resize\", updateHeight);\n\t\t}, []);\n\n\t\t// Merge refs\n\t\tconst mergedRef = React.useCallback(\n\t\t\t(node: HTMLElement | null) => {\n\t\t\t\t(navRef as React.MutableRefObject<HTMLElement | null>).current = node;\n\t\t\t\tif (typeof ref === \"function\") {\n\t\t\t\t\tref(node);\n\t\t\t\t} else if (ref) {\n\t\t\t\t\tref.current = node;\n\t\t\t\t}\n\t\t\t},\n\t\t\t[ref],\n\t\t);\n\n\t\treturn (\n\t\t\t<NavbarContext.Provider value={{ isMobileMenuOpen, setIsMobileMenuOpen }}>\n\t\t\t\t<nav\n\t\t\t\t\tref={mergedRef}\n\t\t\t\t\tclassName={cn(\"relative z-50 w-full bg-gray-50\", className)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex w-full items-center justify-between\",\n\t\t\t\t\t\t\t// Mobile\n\t\t\t\t\t\t\t\"px-spatial-component-navbar-padding-x-mobile py-spatial-component-navbar-padding-y-mobile\",\n\t\t\t\t\t\t\t// Tablet\n\t\t\t\t\t\t\t\"md:px-spatial-component-navbar-padding-x-tablet md:py-spatial-component-navbar-padding-y-tablet\",\n\t\t\t\t\t\t\t// Desktop\n\t\t\t\t\t\t\t\"xl:px-spatial-component-navbar-padding-x-desktop xl:py-spatial-component-navbar-padding-y-desktop\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</nav>\n\t\t\t</NavbarContext.Provider>\n\t\t);\n\t},\n);\nNavbar.displayName = \"Navbar\";\n\nexport interface NavbarBrandProps extends React.HTMLAttributes<HTMLDivElement> {\n\tasChild?: boolean;\n}\n\n/**\n * Brand/logo area of the navbar.\n * Use asChild to render as a link.\n */\nconst NavbarBrand = React.forwardRef<HTMLDivElement, NavbarBrandProps>(\n\t({ className, asChild = false, ...props }, ref) => {\n\t\tconst Comp = asChild ? Slot : \"div\";\n\t\treturn <Comp ref={ref} className={cn(\"shrink-0\", className)} {...props} />;\n\t},\n);\nNavbarBrand.displayName = \"NavbarBrand\";\n\nexport interface NavbarLinksProps\n\textends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Container for navigation links.\n * Centers links on desktop, hidden on mobile (use NavbarMobileMenu instead).\n */\nconst NavbarLinks = React.forwardRef<HTMLDivElement, NavbarLinksProps>(\n\t({ className, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"hidden items-center gap-spatial-component-navbar-gap-links md:flex\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nNavbarLinks.displayName = \"NavbarLinks\";\n\nexport interface NavbarLinkProps\n\textends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n\tasChild?: boolean;\n\tactive?: boolean;\n}\n\n/**\n * Individual navigation link.\n * Use asChild to render with a router Link component.\n */\nconst NavbarLink = React.forwardRef<HTMLAnchorElement, NavbarLinkProps>(\n\t({ className, asChild = false, active, ...props }, ref) => {\n\t\tconst Comp = asChild ? Slot : \"a\";\n\t\treturn (\n\t\t\t<Comp\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"typography-body-small font-medium text-gray-900 transition-colors hover:text-gray-700\",\n\t\t\t\t\tactive && \"text-gray-1100\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nNavbarLink.displayName = \"NavbarLink\";\n\nexport interface NavbarActionsProps\n\textends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Container for navbar action items (search, menu button, etc).\n */\nconst NavbarActions = React.forwardRef<HTMLDivElement, NavbarActionsProps>(\n\t({ className, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"flex items-center gap-spatial-component-navbar-gap-actions\",\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nNavbarActions.displayName = \"NavbarActions\";\n\nexport interface NavbarMobileMenuProps\n\textends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * Mobile menu container that displays navigation links on mobile devices.\n * Hidden on desktop (md and above). Should be used with NavbarMobileMenuButton.\n * Built on Base UI Dialog for accessibility (focus trap, escape key, click-outside).\n */\nconst NavbarMobileMenu = React.forwardRef<\n\tHTMLDivElement,\n\tNavbarMobileMenuProps\n>(({ className, children, ...props }, ref) => {\n\tconst { isMobileMenuOpen, setIsMobileMenuOpen } =\n\t\tReact.useContext(NavbarContext);\n\n\treturn (\n\t\t<Dialog.Root open={isMobileMenuOpen} onOpenChange={setIsMobileMenuOpen}>\n\t\t\t<Dialog.Portal>\n\t\t\t\t<Dialog.Popup\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\"fixed inset-0 z-50 bg-gray-50 md:hidden\",\n\t\t\t\t\t\t// Position below navbar\n\t\t\t\t\t\t\"pt-[calc(var(--navbar-height,60px)+1px)]\",\n\t\t\t\t\t\t// Smooth transition\n\t\t\t\t\t\t\"transition-opacity duration-200\",\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t<Dialog.Title className=\"sr-only\">Navigation menu</Dialog.Title>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\"flex flex-col\",\n\t\t\t\t\t\t\t// Padding matching navbar\n\t\t\t\t\t\t\t\"px-spatial-component-navbar-padding-x-mobile py-spatial-component-navbar-padding-y-tablet\",\n\t\t\t\t\t\t\t// Gap between links\n\t\t\t\t\t\t\t\"gap-spatial-component-navbar-gap-mobile-menu\",\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</div>\n\t\t\t\t</Dialog.Popup>\n\t\t\t</Dialog.Portal>\n\t\t</Dialog.Root>\n\t);\n});\nNavbarMobileMenu.displayName = \"NavbarMobileMenu\";\n\nexport interface NavbarMobileMenuButtonProps\n\textends React.ButtonHTMLAttributes<HTMLButtonElement> {\n\tasChild?: boolean;\n}\n\n/**\n * Button to toggle the mobile menu.\n * Should be placed in NavbarActions on mobile.\n * Use asChild to render as a custom button component (e.g., IconButton).\n */\nconst NavbarMobileMenuButton = React.forwardRef<\n\tHTMLButtonElement,\n\tNavbarMobileMenuButtonProps\n>(({ className, asChild = false, children, ...props }, ref) => {\n\tconst { isMobileMenuOpen, setIsMobileMenuOpen } =\n\t\tReact.useContext(NavbarContext);\n\n\tconst handleClick = () => {\n\t\tsetIsMobileMenuOpen(!isMobileMenuOpen);\n\t};\n\n\tif (asChild) {\n\t\treturn (\n\t\t\t<Slot\n\t\t\t\tref={ref}\n\t\t\t\taria-label=\"Toggle navigation menu\"\n\t\t\t\taria-expanded={isMobileMenuOpen}\n\t\t\t\taria-controls=\"navbar-mobile-menu\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\tclassName={className}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</Slot>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\tref={ref}\n\t\t\ttype=\"button\"\n\t\t\taria-label=\"Toggle navigation menu\"\n\t\t\taria-expanded={isMobileMenuOpen}\n\t\t\taria-controls=\"navbar-mobile-menu\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={cn(\"transition-colors\", className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</button>\n\t);\n});\nNavbarMobileMenuButton.displayName = \"NavbarMobileMenuButton\";\n\nexport interface NavbarMobileMenuLinkProps\n\textends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n\tasChild?: boolean;\n\tactive?: boolean;\n}\n\n/**\n * Navigation link for the mobile menu.\n * Automatically closes the mobile menu when clicked.\n * Use asChild to render with a router Link component.\n */\nconst NavbarMobileMenuLink = React.forwardRef<\n\tHTMLAnchorElement,\n\tNavbarMobileMenuLinkProps\n>(({ className, asChild = false, active, onClick, ...props }, ref) => {\n\tconst { setIsMobileMenuOpen } = React.useContext(NavbarContext);\n\tconst Comp = asChild ? Slot : \"a\";\n\n\tconst handleClick = (event: React.MouseEvent<HTMLAnchorElement>) => {\n\t\tsetIsMobileMenuOpen(false);\n\t\tonClick?.(event);\n\t};\n\n\treturn (\n\t\t<Comp\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t\"typography-body-medium font-medium text-gray-900 transition-colors hover:text-gray-700\",\n\t\t\t\t\"py-spatial-component-navbar-padding-y-mobile\",\n\t\t\t\tactive && \"text-gray-1100\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={handleClick}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nNavbarMobileMenuLink.displayName = \"NavbarMobileMenuLink\";\n\nexport {\n\tNavbar,\n\tNavbarBrand,\n\tNavbarLinks,\n\tNavbarLink,\n\tNavbarActions,\n\tNavbarMobileMenu,\n\tNavbarMobileMenuButton,\n\tNavbarMobileMenuLink,\n};\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface NdstudioFooterProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
4
|
+
/**
|
|
5
|
+
* The URL to link to
|
|
6
|
+
* @default "https://ndstudio.gov"
|
|
7
|
+
*/
|
|
8
|
+
href?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* NdstudioFooter component displays a "Designed and Engineered in DC by National Design Studio" footer link.
|
|
12
|
+
*
|
|
13
|
+
* This component is designed to be used as a footer within other components like Tout,
|
|
14
|
+
* but can also be used standalone.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* // Used within a Tout component via footer slot
|
|
19
|
+
* <Tout
|
|
20
|
+
* headline="Feature Headline"
|
|
21
|
+
* primaryAction={<Button>Primary</Button>}
|
|
22
|
+
* backgroundMedia={<img src="/bg.jpg" alt="" />}
|
|
23
|
+
* footer={<NdstudioFooter />}
|
|
24
|
+
* />
|
|
25
|
+
*
|
|
26
|
+
* // Standalone usage
|
|
27
|
+
* <NdstudioFooter className="my-custom-class" />
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
declare const NdstudioFooter: React.ForwardRefExoticComponent<NdstudioFooterProps & React.RefAttributes<HTMLDivElement>>;
|
|
31
|
+
|
|
32
|
+
export { NdstudioFooter, type NdstudioFooterProps };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { clsx } from 'clsx';
|
|
3
|
+
import { cnBase } from 'tailwind-variants';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
// src/components/atoms/ndstudio-footer/ndstudio-footer.tsx
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return cnBase(clsx(inputs));
|
|
9
|
+
}
|
|
10
|
+
var NdstudioFooter = React.forwardRef(
|
|
11
|
+
({ className, href = "https://ndstudio.gov", ...props }, ref) => {
|
|
12
|
+
return /* @__PURE__ */ jsx("div", { ref, className: cn("text-center", className), ...props, children: /* @__PURE__ */ jsxs("p", { className: "typography-label-large uppercase text-ivory-alpha-75", children: [
|
|
13
|
+
"Designed and Engineered in DC by",
|
|
14
|
+
" ",
|
|
15
|
+
/* @__PURE__ */ jsxs(
|
|
16
|
+
"a",
|
|
17
|
+
{
|
|
18
|
+
href,
|
|
19
|
+
target: "_blank",
|
|
20
|
+
rel: "noopener noreferrer",
|
|
21
|
+
className: "hover:underline",
|
|
22
|
+
children: [
|
|
23
|
+
"National Design Studio",
|
|
24
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: " (opens in new tab)" })
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
] }) });
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
NdstudioFooter.displayName = "NdstudioFooter";
|
|
32
|
+
|
|
33
|
+
export { NdstudioFooter };
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/components/atoms/ndstudio-footer/ndstudio-footer.tsx"],"names":["twMerge"],"mappings":";;;;;;AAKO,SAAS,MAAM,MAAA,EAAsB;AAC3C,EAAA,OAAOA,MAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC5B;ACyBA,IAAM,cAAA,GAAuB,KAAA,CAAA,UAAA;AAAA,EAC5B,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,wBAAwB,GAAG,KAAA,IAAS,GAAA,KAAQ;AAChE,IAAA,uBACC,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,EAAA,CAAG,aAAA,EAAe,SAAS,CAAA,EAAI,GAAG,KAAA,EAC3D,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,sDAAA,EAAuD,QAAA,EAAA;AAAA,MAAA,kCAAA;AAAA,MAClC,GAAA;AAAA,sBACjC,IAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAA,EAAO,QAAA;AAAA,UACP,GAAA,EAAI,qBAAA;AAAA,UACJ,SAAA,EAAU,iBAAA;AAAA,UACV,QAAA,EAAA;AAAA,YAAA,wBAAA;AAAA,4BAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,qBAAA,EAAmB;AAAA;AAAA;AAAA;AAC9C,KAAA,EACD,CAAA,EACD,CAAA;AAAA,EAEF;AACD;AACA,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"index.js","sourcesContent":["import { type ClassValue, clsx } from \"clsx\";\nimport { cnBase as twMerge } from \"tailwind-variants\";\n\nexport { twMerge };\n\nexport function cn(...inputs: ClassValue[]) {\n\treturn twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface NdstudioFooterProps\n\textends React.HTMLAttributes<HTMLDivElement> {\n\t/**\n\t * The URL to link to\n\t * @default \"https://ndstudio.gov\"\n\t */\n\thref?: string;\n}\n\n/**\n * NdstudioFooter component displays a \"Designed and Engineered in DC by National Design Studio\" footer link.\n *\n * This component is designed to be used as a footer within other components like Tout,\n * but can also be used standalone.\n *\n * @example\n * ```tsx\n * // Used within a Tout component via footer slot\n * <Tout\n * headline=\"Feature Headline\"\n * primaryAction={<Button>Primary</Button>}\n * backgroundMedia={<img src=\"/bg.jpg\" alt=\"\" />}\n * footer={<NdstudioFooter />}\n * />\n *\n * // Standalone usage\n * <NdstudioFooter className=\"my-custom-class\" />\n * ```\n */\nconst NdstudioFooter = React.forwardRef<HTMLDivElement, NdstudioFooterProps>(\n\t({ className, href = \"https://ndstudio.gov\", ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn(\"text-center\", className)} {...props}>\n\t\t\t\t<p className=\"typography-label-large uppercase text-ivory-alpha-75\">\n\t\t\t\t\tDesigned and Engineered in DC by{\" \"}\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={href}\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\tclassName=\"hover:underline\"\n\t\t\t\t\t>\n\t\t\t\t\t\tNational Design Studio\n\t\t\t\t\t\t<span className=\"sr-only\"> (opens in new tab)</span>\n\t\t\t\t\t</a>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t},\n);\nNdstudioFooter.displayName = \"NdstudioFooter\";\n\nexport { NdstudioFooter };\n"]}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import * as tailwind_variants from 'tailwind-variants';
|
|
2
|
+
import { VariantProps } from 'tailwind-variants';
|
|
3
|
+
import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
|
|
6
|
+
declare const pagerControlVariants: tailwind_variants.TVReturnType<{
|
|
7
|
+
size: {
|
|
8
|
+
sm: string;
|
|
9
|
+
default: string;
|
|
10
|
+
lg: string;
|
|
11
|
+
};
|
|
12
|
+
}, undefined, "flex items-center", tailwind_variants_dist_config_js.TVConfig<{
|
|
13
|
+
size: {
|
|
14
|
+
sm: string;
|
|
15
|
+
default: string;
|
|
16
|
+
lg: string;
|
|
17
|
+
};
|
|
18
|
+
}, {
|
|
19
|
+
size: {
|
|
20
|
+
sm: string;
|
|
21
|
+
default: string;
|
|
22
|
+
lg: string;
|
|
23
|
+
};
|
|
24
|
+
}>, {
|
|
25
|
+
size: {
|
|
26
|
+
sm: string;
|
|
27
|
+
default: string;
|
|
28
|
+
lg: string;
|
|
29
|
+
};
|
|
30
|
+
}, undefined, tailwind_variants.TVReturnType<{
|
|
31
|
+
size: {
|
|
32
|
+
sm: string;
|
|
33
|
+
default: string;
|
|
34
|
+
lg: string;
|
|
35
|
+
};
|
|
36
|
+
}, undefined, "flex items-center", tailwind_variants_dist_config_js.TVConfig<{
|
|
37
|
+
size: {
|
|
38
|
+
sm: string;
|
|
39
|
+
default: string;
|
|
40
|
+
lg: string;
|
|
41
|
+
};
|
|
42
|
+
}, {
|
|
43
|
+
size: {
|
|
44
|
+
sm: string;
|
|
45
|
+
default: string;
|
|
46
|
+
lg: string;
|
|
47
|
+
};
|
|
48
|
+
}>, unknown, unknown, undefined>>;
|
|
49
|
+
declare const dotBaseVariants: tailwind_variants.TVReturnType<{
|
|
50
|
+
size: {
|
|
51
|
+
sm: string;
|
|
52
|
+
default: string;
|
|
53
|
+
lg: string;
|
|
54
|
+
};
|
|
55
|
+
variant: {
|
|
56
|
+
charcoal: string;
|
|
57
|
+
ivory: string;
|
|
58
|
+
};
|
|
59
|
+
}, undefined, "cursor-pointer rounded-full transition-all duration-500 ease-[cubic-bezier(0.23,1,0.32,1)]", tailwind_variants_dist_config_js.TVConfig<{
|
|
60
|
+
size: {
|
|
61
|
+
sm: string;
|
|
62
|
+
default: string;
|
|
63
|
+
lg: string;
|
|
64
|
+
};
|
|
65
|
+
variant: {
|
|
66
|
+
charcoal: string;
|
|
67
|
+
ivory: string;
|
|
68
|
+
};
|
|
69
|
+
}, {
|
|
70
|
+
size: {
|
|
71
|
+
sm: string;
|
|
72
|
+
default: string;
|
|
73
|
+
lg: string;
|
|
74
|
+
};
|
|
75
|
+
variant: {
|
|
76
|
+
charcoal: string;
|
|
77
|
+
ivory: string;
|
|
78
|
+
};
|
|
79
|
+
}>, {
|
|
80
|
+
size: {
|
|
81
|
+
sm: string;
|
|
82
|
+
default: string;
|
|
83
|
+
lg: string;
|
|
84
|
+
};
|
|
85
|
+
variant: {
|
|
86
|
+
charcoal: string;
|
|
87
|
+
ivory: string;
|
|
88
|
+
};
|
|
89
|
+
}, undefined, tailwind_variants.TVReturnType<{
|
|
90
|
+
size: {
|
|
91
|
+
sm: string;
|
|
92
|
+
default: string;
|
|
93
|
+
lg: string;
|
|
94
|
+
};
|
|
95
|
+
variant: {
|
|
96
|
+
charcoal: string;
|
|
97
|
+
ivory: string;
|
|
98
|
+
};
|
|
99
|
+
}, undefined, "cursor-pointer rounded-full transition-all duration-500 ease-[cubic-bezier(0.23,1,0.32,1)]", tailwind_variants_dist_config_js.TVConfig<{
|
|
100
|
+
size: {
|
|
101
|
+
sm: string;
|
|
102
|
+
default: string;
|
|
103
|
+
lg: string;
|
|
104
|
+
};
|
|
105
|
+
variant: {
|
|
106
|
+
charcoal: string;
|
|
107
|
+
ivory: string;
|
|
108
|
+
};
|
|
109
|
+
}, {
|
|
110
|
+
size: {
|
|
111
|
+
sm: string;
|
|
112
|
+
default: string;
|
|
113
|
+
lg: string;
|
|
114
|
+
};
|
|
115
|
+
variant: {
|
|
116
|
+
charcoal: string;
|
|
117
|
+
ivory: string;
|
|
118
|
+
};
|
|
119
|
+
}>, unknown, unknown, undefined>>;
|
|
120
|
+
interface PagerControlProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange">, VariantProps<typeof pagerControlVariants>, VariantProps<typeof dotBaseVariants> {
|
|
121
|
+
/**
|
|
122
|
+
* Total number of pages/items
|
|
123
|
+
*/
|
|
124
|
+
count: number;
|
|
125
|
+
/**
|
|
126
|
+
* Current active page index (0-based)
|
|
127
|
+
*/
|
|
128
|
+
activeIndex?: number;
|
|
129
|
+
/**
|
|
130
|
+
* Duration in milliseconds for each page before auto-advancing
|
|
131
|
+
* Set to 0 to disable auto-advance
|
|
132
|
+
* @default 5000
|
|
133
|
+
*/
|
|
134
|
+
duration?: number;
|
|
135
|
+
/**
|
|
136
|
+
* Whether the pager should auto-advance
|
|
137
|
+
* @default true
|
|
138
|
+
*/
|
|
139
|
+
autoPlay?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Callback when the active page changes
|
|
142
|
+
*/
|
|
143
|
+
onChange?: (index: number) => void;
|
|
144
|
+
/**
|
|
145
|
+
* Whether to pause auto-advance on hover
|
|
146
|
+
* @default true
|
|
147
|
+
*/
|
|
148
|
+
pauseOnHover?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Whether to loop back to the first page after the last
|
|
151
|
+
* @default true
|
|
152
|
+
*/
|
|
153
|
+
loop?: boolean;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* PagerControl component for indicating progress through a series of pages/slides.
|
|
157
|
+
*
|
|
158
|
+
* Features smooth width transitions when switching between dots and an animated
|
|
159
|
+
* progress fill on the active dot that shows time remaining before auto-advancing
|
|
160
|
+
* (similar to Apple's carousel indicators).
|
|
161
|
+
*
|
|
162
|
+
* Variants:
|
|
163
|
+
* - charcoal: Dark dots (for light backgrounds)
|
|
164
|
+
* - ivory: Light dots (for dark backgrounds)
|
|
165
|
+
*
|
|
166
|
+
* Sizes:
|
|
167
|
+
* - sm: Small dots (6px height)
|
|
168
|
+
* - default: Medium dots (10px height)
|
|
169
|
+
* - lg: Large dots (16px height)
|
|
170
|
+
*/
|
|
171
|
+
declare const PagerControl: React.ForwardRefExoticComponent<PagerControlProps & React.RefAttributes<HTMLDivElement>>;
|
|
172
|
+
|
|
173
|
+
export { PagerControl, type PagerControlProps, pagerControlVariants };
|