Junior Garcia baec55029d
Feat/select component (#1313)
* chore(root): menu and select components in progress

* chore(root): merged with main

* feat(menu): stories created

* feat(dropdown): menu migrated to menu component

* feat(select): base implementation in progress

* feat(select): listbox implemented

* feat(select): scroll overflow and auto scroll added

* feat(select): colors & variants improved, inside placement complete, outside pending

* feat(scroll-shadow): new component in progress

* feat(select): scroll shadow integrated

* fix(select): popover implementation, more scroll shadow stories added

* feat(listbox): custom styles example added to stories

* chore(listbox): overflow hidden removed

* feat(select): variants and styles completed

* chore(select): description story added

* feat(select): more stories added

* fix(select): dynamic collections inference, styles improved, more stories added

* fix(select): auto scroll to selected item, scroll padding added

* chore(select): scroll behavior changed to nearest

* feat(select): custom item story added

* fix(select): autoscroll fixed

* feat(select): multi select support added

* feat(select): more examples added, clean-package modified to remove dev packages

* chore(modal): useImperativeHandle removed

* feat(select): render value story improved

* feat(docs): listbox & scroll shadow docs done

* feat(docs): select documentation in progress

* fix: select aria label (#1425)

* feat(docs): more examples added

* feat(docs): select multiple added, storybook favicon changed

* fix: added value to aria label of select (#1431)

* feat(select): more examples added, storybook favicon changed

* fix(popover): dialog role removed

* feat(select): api added, async loading exampled added

* fix: fixed list box on click not working with sr click (#1439)

* feat(select): async items loading support added and documented

* feat(root): input styles updated to be as the select ones

* chore(root): listbox and scroll shadow readme updated

* feat(select): ts examples added, banner updated

* fix(popover): voiceover closes when focusing an item fixed

* chore(select): focus scope removed

* fix(popover): free solo popover added to use without a trigger

* feat(select): blog post added

* chore(docs): search meta generated, multi controlled onchange example fixed

* chore(root): changeset added

---------

Co-authored-by: Jakob Guddas <github@jguddas.de>
2023-08-21 12:28:01 +00:00

88 lines
2.7 KiB
TypeScript

"use client";
import {FC, useRef} from "react";
import {SandpackProvider, SandpackLayout, SandpackPreview} from "@codesandbox/sandpack-react";
import {SandpackCodeViewer} from "./code-viewer";
import {nextuiTheme} from "./theme";
import {UseSandpackProps, useSandpack} from "./use-sandpack";
import {BugReportButton} from "./bugreport-button";
import {CopyButton} from "./copy-button";
import {CodeSandboxButton} from "./codesandbox-button";
import {LanguageSelector} from "./language-selector";
export interface SandpackProps extends UseSandpackProps {
showTabs?: boolean;
showPreview?: boolean;
showEditor?: boolean;
showCopyCode?: boolean;
showReportBug?: boolean;
defaultExpanded?: boolean;
showOpenInCodeSandbox?: boolean;
children?: React.ReactNode;
}
export const Sandpack: FC<SandpackProps> = ({
files: filesProp,
template,
highlightedLines,
typescriptStrict = false,
showPreview = false,
showEditor = true,
defaultExpanded = false,
showOpenInCodeSandbox = true,
showReportBug = true,
showCopyCode = true,
showTabs,
children,
}) => {
const editorContainerRef = useRef(null);
const {files, decorators, customSetup, sandpackTemplate, hasTypescript, setCurrentTemplate} =
useSandpack({
files: filesProp,
template,
typescriptStrict,
highlightedLines,
});
return (
<SandpackProvider
customSetup={customSetup}
files={files}
template={sandpackTemplate}
theme={nextuiTheme}
>
<SandpackLayout
style={{
// @ts-ignore
"--sp-border-radius": "0.5rem",
}}
>
<div className="flex w-full flex-col">
<div>{showPreview ? <SandpackPreview /> : children}</div>
<div ref={editorContainerRef} className="group h-auto relative pt-2">
{showEditor && (
<SandpackCodeViewer
containerRef={editorContainerRef}
decorators={decorators}
defaultExpanded={defaultExpanded}
highlightedLines={highlightedLines}
showTabs={showTabs}
/>
)}
<div className="hidden md:flex z-20 opacity-0 group-hover:opacity-100 transition-opacity absolute gap-0 right-2 top-2 items-center justify-center bg-code-background">
{showReportBug && <BugReportButton />}
{showCopyCode && <CopyButton />}
{!showPreview && showOpenInCodeSandbox && <CodeSandboxButton />}
</div>
{hasTypescript && sandpackTemplate && (
<LanguageSelector template={sandpackTemplate} onChange={setCurrentTemplate} />
)}
</div>
</div>
</SandpackLayout>
</SandpackProvider>
);
};