Skip to content

Commit b8d71c2

Browse files
committed
lfg
1 parent 5f0c9ce commit b8d71c2

File tree

11 files changed

+60
-163
lines changed

11 files changed

+60
-163
lines changed

app/blocks/sidebar/app-sidebar.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,12 @@ export function AppSidebar(props: React.ComponentProps<typeof Sidebar>) {
130130
</Sidebar.Content>
131131
<Sidebar.Footer className="lg:flex lg:flex-row hidden items-center">
132132
<Menu>
133-
<Button appearance="plain" aria-label="Profile" slot="menu-trigger" className="group">
133+
<Button
134+
appearance="plain"
135+
aria-label="Profile"
136+
data-slot="menu-trigger"
137+
className="group"
138+
>
134139
<Avatar size="small" shape="square" src="/images/sidebar/profile-slash.jpg" />
135140
<span className="group-data-[collapsible=dock]:hidden flex items-center justify-center">
136141
Saul Hudson

components/docs/generated/previews.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// This file is autogenerated by scripts/create-pr-content.ts.
33
// Do not edit this file directly.
44

5-
import React from 'react';
5+
import React from "react"
66

77
export const previews: Record<string, any> = {
88
"date-and-time/date-field/date-field-demo": {

components/docs/rehype/code.tsx

+26-82
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,13 @@
22

33
import React, { useEffect, useState } from "react"
44

5-
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible"
65
import { AnimatePresence, motion } from "framer-motion"
7-
import { IconCheck, IconChevronLgDown, IconCircleInfo, IconDuplicate } from "justd-icons"
6+
import { IconCheck, IconCircleInfo, IconDuplicate } from "justd-icons"
87
import rehypePrettyCode from "rehype-pretty-code"
98
import rehypeStringify from "rehype-stringify"
109
import remarkParse from "remark-parse"
1110
import remarkRehype from "remark-rehype"
12-
import { twJoin } from "tailwind-merge"
13-
import { Button, ButtonPrimitive, type ButtonProps, cn } from "ui"
11+
import { Button, type ButtonProps, cn } from "ui"
1412
import { unified } from "unified"
1513
import { copyToClipboard } from "usemods"
1614

@@ -20,13 +18,22 @@ export const snippetVariants = {
2018
}
2119

2220
export interface CodeProps {
21+
icon?: React.ComponentType<React.SVGProps<SVGSVGElement>>
22+
title?: string
2323
lang?: string
2424
code: string
2525
withImportCopy?: boolean
2626
className?: string
2727
}
2828

29-
function Code({ className, lang = "tsx", code, withImportCopy = true }: CodeProps) {
29+
function Code({
30+
title,
31+
icon: Icon,
32+
className,
33+
lang = "tsx",
34+
code,
35+
withImportCopy = true
36+
}: CodeProps) {
3037
const [copied, setCopied] = React.useState<string>("")
3138

3239
function copyImportsToClipboard(): void {
@@ -44,12 +51,21 @@ function Code({ className, lang = "tsx", code, withImportCopy = true }: CodeProp
4451
return (
4552
<div
4653
className={cn(
47-
"dfakdpxe2941 not-prose group relative max-h-96 overflow-y-auto rounded-lg font-mono text-sm",
54+
"not-prose group relative [&_pre]:max-h-96 [&_pre]:overflow-auto rounded-lg font-mono text-sm",
4855
className
4956
)}
5057
>
51-
<div className="relative -mt-6">
52-
<div className="sticky top-3 right-3 mr-3 z-20 flex gap-1.5 justify-end">
58+
{title && (
59+
<figcaption
60+
className={cn(Icon && "flex items-center gap-x-1")}
61+
data-rehype-pretty-code-title=""
62+
>
63+
{Icon && <Icon className="text-cyan-600 dark:text-cyan-500 size-4" />}
64+
<span className="font-sans">{title}</span>
65+
</figcaption>
66+
)}
67+
<div className="relative">
68+
<div className="absolute cpybtn top-3 right-0 mr-3 z-20 flex gap-1.5 justify-end">
5369
{withImportCopy && (
5470
<CopyButton
5571
ariaLabel="Copy imports statement"
@@ -68,78 +84,6 @@ function Code({ className, lang = "tsx", code, withImportCopy = true }: CodeProp
6884
)
6985
}
7086

71-
function CodeContainer({ children, isOpened }: { children: React.ReactNode; isOpened: boolean }) {
72-
return (
73-
<CollapsibleContent forceMount className={!isOpened ? "max-h-32" : ""}>
74-
<div
75-
className={cn(
76-
"[&_pre]:my-0 [&_pre]:!border-0 [&_pre]:max-h-[32rem] [&_pre]:pb-[100px]",
77-
!isOpened ? "[&_pre]:overflow-hidden" : "[&_pre]:overflow-auto"
78-
)}
79-
>
80-
{children}
81-
</div>
82-
</CollapsibleContent>
83-
)
84-
}
85-
86-
function CodeExpandButton({ isOpened }: { isOpened: boolean }) {
87-
return (
88-
<div
89-
className={cn(
90-
"absolute flex items-center z-10 justify-center bg-gradient-to-b from-[#0e0e10]/50 to-black",
91-
isOpened ? "inset-x-0 bottom-0 h-16" : "inset-0"
92-
)}
93-
>
94-
<CollapsibleTrigger asChild>
95-
<ButtonPrimitive className="bg-zinc-700 text-white px-4 border border-zinc-600 py-2 rounded-lg flex items-center gap-x-2 text-sm focus:outline-none">
96-
<IconChevronLgDown
97-
className={twJoin(
98-
"size-4 -ml-1 duration-200 transition-colors",
99-
isOpened && "rotate-180"
100-
)}
101-
/>
102-
{isOpened ? "Collapse" : "Expand"}
103-
</ButtonPrimitive>
104-
</CollapsibleTrigger>
105-
</div>
106-
)
107-
}
108-
109-
interface CodeCollapsibleProps {
110-
isOpened: boolean
111-
onOpenChange: (open: boolean) => void
112-
lang?: string
113-
withImportCopy?: boolean
114-
code: string
115-
}
116-
117-
function CodeCollapsible({
118-
isOpened,
119-
onOpenChange,
120-
lang = "tsx",
121-
withImportCopy = true,
122-
code,
123-
...props
124-
}: React.PropsWithChildren<CodeCollapsibleProps>) {
125-
return (
126-
<Collapsible open={isOpened} onOpenChange={onOpenChange}>
127-
<div className={"relative overflow-hidden"} {...props}>
128-
<CodeContainer isOpened={isOpened}>
129-
<Code code={code} lang={lang} withImportCopy={withImportCopy} />
130-
</CodeContainer>
131-
<CodeExpandButton isOpened={isOpened} />
132-
</div>
133-
</Collapsible>
134-
)
135-
}
136-
137-
export function CodeCollapsibleRoot({ children }: React.PropsWithChildren<object>) {
138-
return (
139-
<div className="overflow-hidden border border-zinc-800 bg-[#0e0e10] rounded-lg">{children}</div>
140-
)
141-
}
142-
14387
export function CopyRawButton({ code }: { className?: string; code: string }) {
14488
const [copied, setCopied] = React.useState<string>("")
14589
const copyRaw = () => {
@@ -211,7 +155,7 @@ const CopyButton = ({
211155
return (
212156
<Button
213157
className={cn(
214-
"size-7 backdrop-blur-lg rounded-md text-white bg-zinc-800 border hover:bg-zinc-700 border-zinc-700",
158+
"size-7 backdrop-blur-lg rounded-md text-white bg-zinc-900 border hover:bg-zinc-800 border-zinc-700",
215159
className
216160
)}
217161
aria-label={ariaLabel}
@@ -246,4 +190,4 @@ const CopyButton = ({
246190
)
247191
}
248192

249-
export { CodeHighlighter, CodeContainer, CodeExpandButton, CodeCollapsible, Code }
193+
export { CodeHighlighter, Code }

components/docs/rehype/plain-code.tsx

+2-11
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import * as React from "react"
44

5-
import { CodeCollapsible, CodeCollapsibleRoot } from "@/components/docs/rehype/code"
5+
import { Code } from "@/components/docs/rehype/code"
66

77
interface PlainCodeProps extends React.HTMLAttributes<HTMLDivElement> {
88
code: string
@@ -12,19 +12,10 @@ interface PlainCodeProps extends React.HTMLAttributes<HTMLDivElement> {
1212
}
1313

1414
export function PlainCode({ title, withImportCopy = false, lang = "tsx", code }: PlainCodeProps) {
15-
const [isOpened, setIsOpened] = React.useState(false)
1615
return (
1716
<section className="my-4 not-prose">
1817
{title && <figcaption data-rehype-pretty-code-title="">{title}</figcaption>}
19-
<CodeCollapsibleRoot>
20-
<CodeCollapsible
21-
isOpened={isOpened}
22-
onOpenChange={setIsOpened}
23-
withImportCopy={withImportCopy}
24-
lang={lang}
25-
code={code}
26-
/>
27-
</CodeCollapsibleRoot>
18+
<Code code={code} lang={lang} withImportCopy={withImportCopy} />
2819
</section>
2920
)
3021
}

components/docs/rehype/source-code.tsx

+9-15
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import * as React from "react"
44

55
import jsonPreviews from "@/components/docs/generated/previews.json"
6-
import { CodeCollapsible, CodeCollapsibleRoot } from "@/components/docs/rehype/code"
6+
import { Code } from "@/components/docs/rehype/code"
7+
import { IconBrandReactjs } from "justd-icons"
78

89
interface SourceCodeProps extends React.HTMLAttributes<HTMLDivElement> {
910
toShow: string
@@ -14,7 +15,6 @@ interface SourceCodeProps extends React.HTMLAttributes<HTMLDivElement> {
1415

1516
export function SourceCode({ title, message, ext = "tsx", toShow, ...props }: SourceCodeProps) {
1617
const [codeString, setCodeString] = React.useState<{ name: string; code: string } | null>(null)
17-
const [isOpened, setIsOpened] = React.useState<boolean>(false)
1818

1919
React.useEffect(() => {
2020
// @ts-expect-error
@@ -32,10 +32,6 @@ export function SourceCode({ title, message, ext = "tsx", toShow, ...props }: So
3232
}
3333
}, [toShow])
3434

35-
const handleOpenChange = (open: boolean) => {
36-
setIsOpened(open)
37-
}
38-
3935
if (codeString) {
4036
return (
4137
<section {...props} className="my-6 not-prose">
@@ -45,15 +41,13 @@ export function SourceCode({ title, message, ext = "tsx", toShow, ...props }: So
4541
: "And next, you can copy the code below and paste it into your component folder."}
4642
</p>
4743
{title && <figcaption data-rehype-pretty-code-title="">{title}</figcaption>}
48-
<CodeCollapsibleRoot>
49-
<CodeCollapsible
50-
lang={ext}
51-
isOpened={isOpened}
52-
onOpenChange={handleOpenChange}
53-
code={codeString.code}
54-
withImportCopy={false}
55-
/>
56-
</CodeCollapsibleRoot>
44+
<Code
45+
title={`${toShow}.tsx`}
46+
icon={IconBrandReactjs}
47+
code={codeString.code}
48+
lang={ext}
49+
withImportCopy={false}
50+
/>
5751
</section>
5852
)
5953
}

components/installation.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ export function Installation({ className, ...props }: InstallationProps) {
7676
)}
7777
{options.isManual && <p>{manualText}</p>}
7878
<div className={install({ className })}>
79+
<svg
80+
xmlns="http://www.w3.org/2000/svg"
81+
fill="none"
82+
viewBox="0 0 24 24"
83+
className="ml-[0.395rem] md:block hidden size-6 -mr-3.5 text-zinc-400 z-10"
84+
>
85+
<path stroke="currentColor" d="m10 16 4-4-4-4" strokeLinecap="square" strokeWidth="2" />
86+
</svg>
7987
<CodeHighlighter
8088
className="flex-1 chlt overflow-x-auto pr-4"
8189
lang="bash"

components/responsive-aside.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ export function ResponsiveAside({
6161
</div>
6262
</div>
6363
<Sheet.Content
64+
aria-label="Docs Menu"
6465
isOpen={openAside}
6566
onOpenChange={setOpenAside}
6667
classNames={{ content: "w-[19rem]" }}

components/ui/sidebar.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -391,9 +391,9 @@ const footer = tv({
391391
variants: {
392392
collapsed: {
393393
false: [
394-
"p-2 [&_[slot=menu-trigger]>[data-slot=avatar]]:-ml-1.5 [&_[slot=menu-trigger]]:w-full [&_[slot=menu-trigger]]:hover:bg-muted [&_[slot=menu-trigger]]:justify-start [&_[slot=menu-trigger]]:flex [&_[slot=menu-trigger]]:items-center"
394+
"p-2 [&_[data-slot=menu-trigger]>[data-slot=avatar]]:-ml-1.5 [&_[data-slot=menu-trigger]]:w-full [&_[data-slot=menu-trigger]]:hover:bg-muted [&_[data-slot=menu-trigger]]:justify-start [&_[data-slot=menu-trigger]]:flex [&_[data-slot=menu-trigger]]:items-center"
395395
],
396-
true: "size-12 p-1 [&_[slot=menu-trigger]]:size-9 justify-center items-center"
396+
true: "size-12 p-1 [&_[data-slot=menu-trigger]]:size-9 justify-center items-center"
397397
}
398398
}
399399
})

resources/content/docs/components/layouts/sidebar.mdx

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ Imagine you're building a dashboard; you'll likely need a sidebar that lists all
9191
</Sidebar.Content>
9292
<Sidebar.Footer className="lg:flex lg:flex-row hidden items-center">
9393
<Menu>
94-
<Button appearance="plain" aria-label="Profile" slot="menu-trigger" className="group">
94+
<Button appearance="plain" aria-label="Profile" data-slot="menu-trigger" className="group">
9595
<Avatar size="small" shape="square" src="/images/sidebar/profile-slash.jpg" />
9696
<span className="group-data-[collapsible=dock]:hidden flex items-center justify-center">
9797
Saul Hudson

resources/content/docs/getting-started/installation.mdx

+3-50
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ Include this for the default set of utilities:
287287
Configure your Tailwind setup by wrapping your tailwind config with withTV from tailwind-variants. Also, make sure to
288288
integrate the plugins we've just installed.
289289
290-
<PlainCode lang='js' code={`/** @type {import('tailwindcss').Config} */
290+
<PlainCode lang='ts' title='tailwind.config.ts' code={`/** @type {import('tailwindcss').Config} */
291291
292292
import { withTV } from 'tailwind-variants/transformer'
293293
import ta from 'tailwindcss-animate'
@@ -365,7 +365,7 @@ integrate the plugins we've just installed.
365365
`} />
366366
367367
### Primitive
368-
<SourceCode title='ui/primitive.tsx' toShow={['primitive']} />
368+
<SourceCode toShow={['primitive']} />
369369
370370
## Simple Import
371371
Indeed, it's efficient because the index.ts file in your UI folder serves as a hub. Even if the button and badge
@@ -382,54 +382,7 @@ export * from './note';
382382
export * from './list-box';
383383
export * from './choicebox';
384384
export * from './pagination';
385-
export * from './link';
386-
export * from './tabs';
387-
export * from './card';
388-
export * from './slider';
389-
export * from './popover';
390-
export * from './text-field';
391-
export * from './radio';
392-
export * from './date-field';
393-
export * from './date-picker';
394-
export * from './toast';
395-
export * from './container';
396-
export * from './input-otp';
397-
export * from './tag-group';
398-
export * from './sheet';
399-
export * from './drop-zone';
400-
export * from './grid';
401-
export * from './meter';
402-
export * from './time-field';
403-
export * from './breadcrumbs';
404-
export * from './drawer';
405-
export * from './tooltip';
406-
export * from './file-trigger';
407-
export * from './switch';
408-
export * from './calendar';
409-
export * from './grid-list';
410-
export * from './avatar';
411-
export * from './combo-box';
412-
export * from './search-field';
413-
export * from './menu';
414-
export * from './progress-bar';
415-
export * from './badge';
416-
export * from './toggle';
417-
export * from './number-field';
418-
export * from './table';
419-
export * from './separator';
420-
export * from './button';
421-
export * from './modal';
422-
export * from './checkbox';
423-
export * from './select';
424-
export * from './textarea';
425-
export * from './skeleton';
426-
export * from './form';
427-
export * from './carousel';
428-
export * from './color';
429-
export * from './color-field';
430-
export * from './color-picker';
431-
export * from './visually-hidden';
432-
`} />
385+
...`} />
433386
434387
435388
If you're not using all those components, feel free to remove the ones you don't need. Later, when you introduce a new

resources/content/docs/prologue/release-notes.mdx

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ This all changes are made on the 2024 release.
1515
- Minor adjustments across all components to align with the latest version of `react-aria-components`.
1616
- New Component [ToggleGroup](/docs/components/buttons/toggle-group)
1717
- Fix issue on menu [Menu](/docs/components/collections/menu)
18+
- Change `slot` to `data-slot` menu trigger on sidebar
1819

1920
## November 17
2021
- A few adjustment to [Navbar](/navbar)

0 commit comments

Comments
 (0)