···11+---
22+description: Typescript authoring rules
33+globs: ["**/*.js", "**/*.ts", "**/*.js"]
44+alwaysApply: true
55+---
66+77+- Avoid nesting functions if you dont need to
+8
.cursor/rules/tsx.mdc
···11+---
22+description: Typescript authoring rules
33+globs: ["**/*.tsx"]
44+alwaysApply: true
55+---
66+77+- When there are linter errors first run eslint --fix
88+- Make sure to never cause reflow if you can. Check this resource to determine what does cause reflow https://gist.github.com/paulirish/5d52fb081b3570c81e3a
···1111import { AlwaysVisibleActions } from '../../../examples/navbar/always-visible-actions'
1212import { WithMenus } from '../../../examples/navbar/with-menus'
1313import { ActiveLink } from '../../../examples/navbar/active-link'
1414+import { Sticky } from '../../../examples/navbar/sticky'
14151516<Example src={Basic} noPadding />
1617···2930<PropDocs components={["Navbar", "NavbarLogo", "NavbarNavigation", "NavbarAction"]} />
30313132## Features
3333+3434+### Sticky Behavior
3535+3636+The `Navbar` component can be made sticky by using the `useAnimatedNavbar` hook.
3737+3838+<Example src={Sticky} />
32393340### Active Link
3441
+51-1
apps/docs/src/examples/navbar/basic.tsx
···2020 borderWidth: 1,
2121 borderColor: uiColor.border1,
2222 borderRadius: radius["lg"],
2323- overflow: "hidden",
2323+ overflow: "auto",
2424 margin: spacing["4"],
2525+ },
2626+ content: {
2727+ padding: spacing["4"],
2528 },
2629});
2730···5558 <Button variant="primary">Sign In</Button>
5659 </NavbarAction>
5760 </Navbar>
6161+ <div {...stylex.props(styles.content)}>
6262+ <h2>Lorem Ipsum</h2>
6363+ <p>
6464+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
6565+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
6666+ minim veniam, quis nostrud exercitation ullamco laboris nisi ut
6767+ aliquip ex ea commodo consequat.
6868+ </p>
6969+ <p>
7070+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
7171+ dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
7272+ proident, sunt in culpa qui officia deserunt mollit anim id est
7373+ laborum.
7474+ </p>
7575+ <p>
7676+ Sed ut perspiciatis unde omnis iste natus error sit voluptatem
7777+ accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae
7878+ ab illo inventore veritatis et quasi architecto beatae vitae dicta
7979+ sunt explicabo.
8080+ </p>
8181+ <p>
8282+ Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut
8383+ fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem
8484+ sequi nesciunt.
8585+ </p>
8686+ <p>
8787+ Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet,
8888+ consectetur, adipisci velit, sed quia non numquam eius modi tempora
8989+ incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
9090+ </p>
9191+ <p>
9292+ Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis
9393+ suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis
9494+ autem vel eum iure reprehenderit qui in ea voluptate velit esse quam
9595+ nihil molestiae consequatur.
9696+ </p>
9797+ <p>
9898+ At vero eos et accusamus et iusto odio dignissimos ducimus qui
9999+ blanditiis praesentium voluptatum deleniti atque corrupti quos dolores
100100+ et quas molestias excepturi sint occaecati cupiditate non provident.
101101+ </p>
102102+ <p>
103103+ Similique sunt in culpa qui officia deserunt mollitia animi, id est
104104+ laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita
105105+ distinctio.
106106+ </p>
107107+ </div>
58108 </div>
59109 );
60110}
+118
apps/docs/src/examples/navbar/sticky.tsx
···11+import { Button } from "@/components/button";
22+import {
33+ Navbar,
44+ NavbarAction,
55+ NavbarLink,
66+ NavbarLogo,
77+ NavbarNavigation,
88+} from "@/components/navbar";
99+import { uiColor } from "../../components/theme/color.stylex";
1010+import * as stylex from "@stylexjs/stylex";
1111+import { radius } from "../../components/theme/radius.stylex";
1212+import { spacing } from "../../components/theme/spacing.stylex";
1313+import { useRef } from "react";
1414+import { useAnimatedNavbar } from "@/components/navbar/useAnimatedNavbar";
1515+1616+const styles = stylex.create({
1717+ wrapper: {
1818+ containerType: "inline-size",
1919+ height: "400px",
2020+ width: "90%",
2121+ borderStyle: "solid",
2222+ borderWidth: 1,
2323+ borderColor: uiColor.border1,
2424+ borderRadius: radius["lg"],
2525+ overflow: "auto",
2626+ margin: spacing["4"],
2727+ },
2828+ content: {
2929+ padding: spacing["4"],
3030+ },
3131+});
3232+3333+function Logo() {
3434+ return (
3535+ <svg
3636+ width="32"
3737+ height="32"
3838+ viewBox="0 0 120 120"
3939+ fill="currentColor"
4040+ xmlns="http://www.w3.org/2000/svg"
4141+ >
4242+ <circle cx="60" cy="60" r="50" stroke="currentColor" strokeWidth="2" />
4343+ </svg>
4444+ );
4545+}
4646+4747+export function Sticky() {
4848+ const scrollContainerRef = useRef<HTMLDivElement>(null);
4949+ const { sentinel, navBarProps } = useAnimatedNavbar({
5050+ scrollContainer: scrollContainerRef,
5151+ });
5252+5353+ return (
5454+ <div ref={scrollContainerRef} {...stylex.props(styles.wrapper)}>
5555+ {sentinel}
5656+ <Navbar {...navBarProps}>
5757+ <NavbarLogo>
5858+ <Logo />
5959+ </NavbarLogo>
6060+ <NavbarNavigation justify="right">
6161+ <NavbarLink href="/dashboard">Dashboard</NavbarLink>
6262+ <NavbarLink href="/projects">Projects</NavbarLink>
6363+ <NavbarLink href="/settings">Settings</NavbarLink>
6464+ </NavbarNavigation>
6565+ <NavbarAction>
6666+ <Button variant="primary">Sign In</Button>
6767+ </NavbarAction>
6868+ </Navbar>
6969+ <div {...stylex.props(styles.content)}>
7070+ <h2>Lorem Ipsum</h2>
7171+ <p>
7272+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
7373+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
7474+ minim veniam, quis nostrud exercitation ullamco laboris nisi ut
7575+ aliquip ex ea commodo consequat.
7676+ </p>
7777+ <p>
7878+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
7979+ dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
8080+ proident, sunt in culpa qui officia deserunt mollit anim id est
8181+ laborum.
8282+ </p>
8383+ <p>
8484+ Sed ut perspiciatis unde omnis iste natus error sit voluptatem
8585+ accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae
8686+ ab illo inventore veritatis et quasi architecto beatae vitae dicta
8787+ sunt explicabo.
8888+ </p>
8989+ <p>
9090+ Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut
9191+ fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem
9292+ sequi nesciunt.
9393+ </p>
9494+ <p>
9595+ Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet,
9696+ consectetur, adipisci velit, sed quia non numquam eius modi tempora
9797+ incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
9898+ </p>
9999+ <p>
100100+ Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis
101101+ suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis
102102+ autem vel eum iure reprehenderit qui in ea voluptate velit esse quam
103103+ nihil molestiae consequatur.
104104+ </p>
105105+ <p>
106106+ At vero eos et accusamus et iusto odio dignissimos ducimus qui
107107+ blanditiis praesentium voluptatum deleniti atque corrupti quos dolores
108108+ et quas molestias excepturi sint occaecati cupiditate non provident.
109109+ </p>
110110+ <p>
111111+ Similique sunt in culpa qui officia deserunt mollitia animi, id est
112112+ laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita
113113+ distinctio.
114114+ </p>
115115+ </div>
116116+ </div>
117117+ );
118118+}