mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* feat: Slider Component (#1686) * feat(slider): initial structure * chore(slider): readme improved * fix: fixed border color of slider track * docs: added range story * feat: added rtl support to slider * feat: improved value label formatting * feat: refactor styling and add colors support to slider * chore: improved thumb color * docs: improved slider stories * chore(slider): default color changed by foreground * Update packages/core/theme/src/components/slider.ts Co-authored-by: Jakob Guddas <github@jguddas.de> * feat: added fillOffset prop * Update packages/components/slider/src/use-slider.ts * fix(slider): animation * Update packages/components/slider/src/use-slider.ts * Update packages/core/theme/src/components/slider.ts * feat: slider steps * refactor: renamed variables * feat: improved slider step styling * fix: hide infinite steps * fix: fixed step transparency issue * fix: fixed thumb focus issue * Update packages/components/slider/src/use-slider.ts Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * feat(slider): vertical orientation added, start & end content, bug fixes * chore(slider): tests added * fix(docs): scrollbar added to the sidebar (#1743) * feat(slider): marks added * chore(slider): example ts-doc changed * feat(slider): vertical marks support * feat(core): slider tooltip support added, popover modified (#1746) * Feat/slider custom styles (#1751) * feat(slider): custom styles story added * fix(slider): custom styles on different sizes * Fix/slider tooltip android position (#1753) * feat(slider): custom styles story added * fix(slider): tooltip update position dependecies added * fix(popover): arrow placements improved * feat(slider): docs started, custom thumb and custom output stories added * feat(slider): render function added to custom render the slider parts * feat(slider): docs in progress, new properties and examples added * fix(slider): some issues fixed, output renamed to value, documentation improved * feat(slider): docs done * chore: changeset --------- Co-authored-by: Jakob Guddas <github@jguddas.de> * Client side routing (#1764) * feat(slider): initial structure * chore(slider): readme improved * fix: fixed border color of slider track * docs: added range story * feat: added rtl support to slider * feat: improved value label formatting * feat: refactor styling and add colors support to slider * chore: improved thumb color * docs: improved slider stories * chore(slider): default color changed by foreground * Update packages/core/theme/src/components/slider.ts Co-authored-by: Jakob Guddas <github@jguddas.de> * feat: added fillOffset prop * Update packages/components/slider/src/use-slider.ts * fix(slider): animation * Update packages/components/slider/src/use-slider.ts * Update packages/core/theme/src/components/slider.ts * feat: slider steps * refactor: renamed variables * feat: improved slider step styling * fix: hide infinite steps * fix: fixed step transparency issue * fix: fixed thumb focus issue * Update packages/components/slider/src/use-slider.ts Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * feat(slider): vertical orientation added, start & end content, bug fixes * chore(slider): tests added * feat(slider): marks added * chore(slider): example ts-doc changed * feat(slider): vertical marks support * feat(core): slider tooltip support added, popover modified (#1746) * Feat/slider custom styles (#1751) * feat(slider): custom styles story added * fix(slider): custom styles on different sizes * Fix/slider tooltip android position (#1753) * feat(slider): custom styles story added * fix(slider): tooltip update position dependecies added * fix(popover): arrow placements improved * feat(slider): docs started, custom thumb and custom output stories added * feat(slider): render function added to custom render the slider parts * feat(slider): docs in progress, new properties and examples added * fix(slider): some issues fixed, output renamed to value, documentation improved * feat(slider): docs done * chore: changeset * chore: react aria packages upgraded * feat(system): router provider added * feat: client side routing support added to items components * chore(docs): routing docs started * chore: changeset * feat(docs): client side routing documented * feat(pagination): client router support added to pagination * fix(link): csr added --------- Co-authored-by: Jakob Guddas <github@jguddas.de> * feat: added RTL support to accordion component (#1725) * feat: added RTL support to accordion component * Create healthy-cobras-crash.md * feat: added RTL support to avatar and avatar group component (#1727) * feat: added RTL support to avatar and avatar group components * Create tender-penguins-love.md * Update tender-penguins-love.md * feat: added RTL support to button group component (#1726) * feat: added RTL support to button component * feat: added RTL support to button component * Create orange-bobcats-kneel.md * Update button.ts * refactor(root): styles refactor (#1688) * refactor(root): styles refactor * chore(tabs): remove needless type extends * fix(tabs): typecheck * Breadcrumbs component (#1794) * feat(components): breadcrumbs initial structure * feat(breadcrumbs): tests and examples added * feat(docs): breadcrumbs documentation done * feat(docs): breadcrumbs docs done * chore(breadcrumbs): readme changed * fix(slider): Place last dragged slider handle over the other handle (#1778) * Set `data-focused` in handle * Style focused handle on top * Add tests * fix(core): tests and build * fix(button): show only spinner if button isLoading & isIconOnly (#1800) * fix(button): show only spinner if button isLoading & isIconOnly * chore: add changeset * fix(button): remove repeating code * Fix blur/opaque Popover (#1812) * fix(popover): double underlay click * chore: use ref instead of a state * Feat/controlled scroll shadow (#1819) * feat(scroll-shadow): logic improved, controlled support added * feat(scroll-shadow): controlled visibility * fix(scroll-shadow): visibility tests * Autocomplete component (Single Selection) (#1797) * feat(autocomplete): initial structure * feat(core): use press custom hook implemented, autocomplete improved, input and select animations fixed * chore(button): add console.log on press * feat(core): select & input label position, autocomplete improvements, listbox and menu empty state * chore: tailwind-variants upgraded * chore: autocomplete stories in progress * fix: input and select label placement * fix(autocomplete): popover trigger * chore(root): react-aria pkgs and framer-motion upgraded * fix(input,select): outside label scale removed * feat(autocomplete): more stories and use cases supported * fix(core): custom items support on collection-based comps, menu generic items support added * chore(core): tailwind-variants upgraded, custom tv function adapted * chore(docs): select on-change controlled e.g. changed, sandpack theme fixed * chore(autocomplete): docs started, tests added * chore: in progress * feat(menu): top and end content added, autocomplete docs improved * feat(docs): autocomplete documentation almost done * fix(input): outside styles * feat(docs): autocomplete async filtering added * chore(docs): autocomplete highlighted lines added * feat(docs): autocomplete a11y and slots added * feat(docs): autocomplete a11y and slots added * feat(docs): autocomplete docs done * fix(root): peer dependencies (#1848) * Fix/small issues (#1851) * fix(input): visible outline * fix(button): button group radius prop * chore(navbar): menu item active status added * fix(docs): pagination missing keys custom items * fix(core): extendVariants support added to collection-based components * fix(theme): card body padding * chore(theme): transition added to menu/listbox items * fix(input): textarea styles fixed, new prop added * chore(input): textarea height animated * feat(button): hover opacity added * chore(textarea): hide scroll when the limit hasn't been reached * chore(docs): updated badge added to textarea * feat(docs): blog v2.2.0 image and entry added * fix(avatar): ring primary color * chore(docs): tabs added again, autocomplete iframes removed --------- Co-authored-by: Jakob Guddas <github@jguddas.de> Co-authored-by: Maurici Abad Gutierrez <hello@mauriciabad.com> Co-authored-by: Ivan Kucher <dev.kucher@gmail.com>
173 lines
5.6 KiB
TypeScript
173 lines
5.6 KiB
TypeScript
import type {SandpackInitMode} from "@codesandbox/sandpack-react";
|
|
|
|
import * as React from "react";
|
|
import {FileTabs, useSandpack, useActiveCode, SandpackStack} from "@codesandbox/sandpack-react";
|
|
import {Button} from "@nextui-org/react";
|
|
import scrollIntoView from "scroll-into-view-if-needed";
|
|
import {clsx} from "@nextui-org/shared-utils";
|
|
import {Language} from "prism-react-renderer";
|
|
|
|
import {HighlightedLines} from "./types";
|
|
import {Decorators} from "./types";
|
|
|
|
import {trackEvent} from "@/utils/va";
|
|
import {Codeblock} from "@/components/docs/components";
|
|
|
|
export interface CodeViewerProps {
|
|
showTabs?: boolean;
|
|
showLineNumbers?: boolean;
|
|
/**
|
|
* Provides a way to draw or style a piece of the content.
|
|
*/
|
|
decorators?: Decorators;
|
|
code?: string;
|
|
highlightedLines?: HighlightedLines;
|
|
wrapContent?: boolean;
|
|
defaultExpanded?: boolean;
|
|
/**
|
|
* This provides a way to control how some components are going to
|
|
* be initialized on the page. The CodeEditor and the Preview components
|
|
* are quite expensive and might overload the memory usage, so this gives
|
|
* a certain control of when to initialize them.
|
|
*/
|
|
initMode?: SandpackInitMode;
|
|
containerRef?: React.RefObject<HTMLDivElement>;
|
|
}
|
|
|
|
const INITIAL_HEIGHT = "200px";
|
|
|
|
export const SandpackCodeViewer = React.forwardRef<any, CodeViewerProps>(
|
|
({showTabs, code: propCode, defaultExpanded = false, highlightedLines, containerRef}, ref) => {
|
|
const {sandpack} = useSandpack();
|
|
const {code} = useActiveCode();
|
|
|
|
const {activeFile} = sandpack;
|
|
|
|
const [isExpanded, setIsExpanded] = React.useState(defaultExpanded);
|
|
|
|
// const id = React.useId();
|
|
// hack to make sure we re-render the code editor and change current file
|
|
// TODO: open an issue on sandpack-react
|
|
// const [internalKey, setInternalKey] = React.useState(() => id);
|
|
const lineCountRef = React.useRef<{[key: string]: number}>({});
|
|
|
|
if (!lineCountRef.current[activeFile]) {
|
|
lineCountRef.current[activeFile] = code.split("\n").length;
|
|
}
|
|
|
|
const shouldShowTabs = showTabs ?? sandpack.visibleFilesFromProps.length > 1;
|
|
|
|
const lineCount = lineCountRef.current[activeFile];
|
|
const isExpandable = lineCount > 7 || isExpanded;
|
|
const fileExt = activeFile.split(".").pop() as Language;
|
|
|
|
// const isAppFile = activeFile.includes("App");
|
|
|
|
React.useEffect(() => {
|
|
if (containerRef && containerRef?.current !== null && isExpandable) {
|
|
containerRef.current.style.height = INITIAL_HEIGHT;
|
|
}
|
|
}, [containerRef]);
|
|
|
|
// React.useEffect(() => {
|
|
// setInternalKey(getId());
|
|
// }, [propCode, code]);
|
|
|
|
React.useEffect(() => {
|
|
if (defaultExpanded && containerRef && containerRef?.current !== null) {
|
|
const container = containerRef?.current;
|
|
|
|
container.style.height = "auto";
|
|
}
|
|
}, [defaultExpanded]);
|
|
|
|
const handleExpand = () => {
|
|
const nextIsExpanded = !isExpanded;
|
|
|
|
trackEvent("CodeViewer - Expand", {
|
|
name: activeFile,
|
|
action: "expand",
|
|
category: "docs",
|
|
data: nextIsExpanded ? "expanded" : "collapsed",
|
|
});
|
|
|
|
setIsExpanded(nextIsExpanded);
|
|
if (containerRef && containerRef?.current !== null) {
|
|
const container = containerRef?.current;
|
|
|
|
if (nextIsExpanded) {
|
|
container.style.height = "auto";
|
|
} else {
|
|
container.style.height = INITIAL_HEIGHT;
|
|
scrollIntoView(container, {
|
|
behavior: "smooth",
|
|
scrollMode: "if-needed",
|
|
block: "center",
|
|
});
|
|
}
|
|
}
|
|
};
|
|
|
|
return (
|
|
<>
|
|
<div className="h-full">
|
|
<SandpackStack>
|
|
{shouldShowTabs ? <FileTabs /> : null}
|
|
<div
|
|
className={clsx("sp-code-viewer max-h-[600px] overflow-y-scroll", {
|
|
"is-expanded": isExpanded,
|
|
})}
|
|
>
|
|
{/*
|
|
* Disabled in favor of Codeblock due to performance issues & font size on ios
|
|
*
|
|
<CodeEditor
|
|
key={internalKey}
|
|
ref={ref}
|
|
readOnly
|
|
code={propCode || code}
|
|
decorators={isAppFile ? decorators : []}
|
|
filePath={activeFile}
|
|
initMode={initMode || sandpack.initMode}
|
|
showLineNumbers={showLineNumbers}
|
|
showReadOnly={false}
|
|
wrapContent={wrapContent}
|
|
/> */}
|
|
<Codeblock
|
|
ref={ref}
|
|
className={isExpandable ? "pb-16" : "pb-2"}
|
|
codeString={propCode || code}
|
|
language={fileExt}
|
|
metastring={highlightedLines && `{${highlightedLines}}`}
|
|
/>
|
|
</div>
|
|
</SandpackStack>
|
|
</div>
|
|
{isExpandable && (
|
|
<div
|
|
className={clsx(
|
|
"w-full absolute z-10 py-1 px-4 flex items-center justify-center bg-gradient-to-t from-code-background to-code-background/10 dark:to-code-background/50",
|
|
{"h-10 bottom-0 pb-2": isExpanded},
|
|
{"h-full inset-0": !isExpanded},
|
|
)}
|
|
>
|
|
<Button
|
|
className="bg-[#2a2838] shadow-md font-sans dark:bg-zinc-800 text-zinc-300 dark:text-zinc-400 hover:!text-zinc-200"
|
|
radius="full"
|
|
size="sm"
|
|
variant="flat"
|
|
onClick={handleExpand}
|
|
>
|
|
{isExpanded ? "Show less" : "Show more"}
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</>
|
|
);
|
|
},
|
|
);
|
|
|
|
SandpackCodeViewer.displayName = "SandpackCodeViewer";
|
|
|
|
export default SandpackCodeViewer;
|