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>
216 lines
5.7 KiB
TypeScript
216 lines
5.7 KiB
TypeScript
import {useMemo} from "react";
|
|
import {SandpackFiles, SandpackPredefinedTemplate} from "@codesandbox/sandpack-react";
|
|
import {useTheme} from "next-themes";
|
|
|
|
import {HighlightedLines} from "./types";
|
|
import {getHighlightedLines, getFileName} from "./utils";
|
|
import {stylesConfig, postcssConfig, tailwindConfig, getHtmlFile, rootFile} from "./entries";
|
|
|
|
import {useLocalStorage} from "@/hooks/use-local-storage";
|
|
|
|
export interface UseSandpackProps {
|
|
files?: SandpackFiles;
|
|
typescriptStrict?: boolean;
|
|
template?: SandpackPredefinedTemplate;
|
|
highlightedLines?: HighlightedLines;
|
|
}
|
|
|
|
const importReact = 'import React from "react";';
|
|
|
|
export const useSandpack = ({
|
|
files = {},
|
|
typescriptStrict = false,
|
|
template = "vite-react",
|
|
highlightedLines,
|
|
}: UseSandpackProps) => {
|
|
// once the user select a template we store it in local storage
|
|
const [currentTemplate, setCurrentTemplate] = useLocalStorage<SandpackPredefinedTemplate>(
|
|
"currentTemplate",
|
|
template,
|
|
);
|
|
const hasTypescript = Object.keys(files).some(
|
|
(file) => file.includes(".ts") || file.includes(".tsx"),
|
|
);
|
|
|
|
const {theme} = useTheme();
|
|
|
|
const decorators = getHighlightedLines(highlightedLines, currentTemplate);
|
|
|
|
const sandpackTemplate = useMemo<SandpackPredefinedTemplate>(
|
|
() => (currentTemplate === "vite-react-ts" && hasTypescript ? currentTemplate : "vite-react"),
|
|
[currentTemplate, hasTypescript],
|
|
);
|
|
|
|
// map current template to its mime type
|
|
const mimeType = useMemo(
|
|
() => (sandpackTemplate === "vite-react-ts" ? ".tsx" : ".jsx"),
|
|
[sandpackTemplate],
|
|
);
|
|
|
|
// get entry file by current template
|
|
const entryFile = useMemo(
|
|
() => (sandpackTemplate === "vite-react-ts" ? "index.tsx" : "index.jsx"),
|
|
[sandpackTemplate],
|
|
);
|
|
|
|
// filter files by current template
|
|
const filteredFiles = Object.keys(files).reduce((acc, key) => {
|
|
if (key.includes("App") && !key.includes(mimeType)) {
|
|
return acc;
|
|
}
|
|
if (typescriptStrict && currentTemplate === "vite-react-ts" && key.includes(".js")) {
|
|
return acc;
|
|
}
|
|
if (currentTemplate === "vite-react" && key.includes(".ts")) {
|
|
return acc;
|
|
}
|
|
// @ts-ignore
|
|
acc[key] = files[key];
|
|
|
|
return acc;
|
|
}, {});
|
|
|
|
let dependencies = {
|
|
"framer-motion": "10.12.16",
|
|
"@nextui-org/react": "latest",
|
|
};
|
|
|
|
// sort files by dependency
|
|
const sortedFiles = Object.keys(filteredFiles)
|
|
.sort((a: string, b: string) => {
|
|
const aFile = files[a] as string;
|
|
const bFile = files[b] as string;
|
|
const aName = getFileName(a);
|
|
const bName = getFileName(b);
|
|
|
|
// if bName includes "App" should be first
|
|
if (bName.includes("App")) {
|
|
return 1;
|
|
}
|
|
|
|
if (aFile?.includes(bName)) {
|
|
return -1;
|
|
}
|
|
if (bFile.includes(aName)) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
})
|
|
.reduce((acc, key) => {
|
|
let fileContent = files[key] as string;
|
|
|
|
// Check if the file content includes 'React' import statements, if not, add it
|
|
if (!fileContent.includes("from 'react'") && !fileContent.includes('from "react"')) {
|
|
fileContent = `${importReact}\n${fileContent}\n`;
|
|
}
|
|
|
|
// Check if file content includes any other dependencies, if yes, add it to dependencies
|
|
const importRegex = /import .* from ["'](.*)["']/g;
|
|
let match;
|
|
|
|
while ((match = importRegex.exec(fileContent)) !== null) {
|
|
const dependencyName = match[1];
|
|
|
|
if (!dependencies.hasOwnProperty(dependencyName) && !dependencyName.includes("./")) {
|
|
// add the dependency to the dependencies object with version 'latest'
|
|
// @ts-ignore
|
|
dependencies[dependencyName] = "latest";
|
|
}
|
|
}
|
|
|
|
return {
|
|
...acc,
|
|
[key]: fileContent,
|
|
};
|
|
}, {});
|
|
|
|
/**
|
|
* Uncomment this logic when specific imports are needed
|
|
*/
|
|
// const nextUIComponents = useMemo(
|
|
// () =>
|
|
// Object.values(getNextUIComponents(sortedFiles) || {}).flatMap((e) =>
|
|
// e.split(",").map((name) => name.replace(/"/g, "")),
|
|
// ),
|
|
// [sortedFiles],
|
|
// );
|
|
|
|
// const hasComponents = !isEmpty(nextUIComponents);
|
|
|
|
// const dependencies = useMemo(() => {
|
|
// let deps = {
|
|
// "framer-motion": "10.12.16",
|
|
// };
|
|
|
|
// if (hasComponents) {
|
|
// let deps = {
|
|
// "@nextui-org/theme": "dev-v2",
|
|
// "@nextui-org/system": "dev-v2",
|
|
// };
|
|
|
|
// nextUIComponents.forEach((component) => {
|
|
// deps = {
|
|
// ...deps,
|
|
// [`@nextui-org/${component}`]: "dev-v2",
|
|
// };
|
|
// });
|
|
|
|
// return deps;
|
|
// }
|
|
|
|
// return {
|
|
// ...deps,
|
|
// "@nextui-org/react": "dev-v2",
|
|
// };
|
|
// }, [hasComponents, nextUIComponents, component]);
|
|
|
|
// const tailwindConfigFile = useMemo(
|
|
// () => (hasComponents ? updateTailwindConfig(tailwindConfig, nextUIComponents) : tailwindConfig),
|
|
// [tailwindConfig, nextUIComponents],
|
|
// );
|
|
|
|
const customSetup = {
|
|
dependencies,
|
|
entry: entryFile,
|
|
devDependencies: {
|
|
autoprefixer: "^10.4.14",
|
|
postcss: "^8.4.21",
|
|
tailwindcss: "^3.2.7",
|
|
},
|
|
};
|
|
|
|
return {
|
|
customSetup,
|
|
files: {
|
|
...sortedFiles,
|
|
[entryFile]: {
|
|
code: rootFile,
|
|
hidden: true,
|
|
},
|
|
"index.html": {
|
|
code: getHtmlFile(theme ?? "light", entryFile),
|
|
hidden: true,
|
|
},
|
|
"tailwind.config.js": {
|
|
code: tailwindConfig,
|
|
hidden: true,
|
|
},
|
|
"postcss.config.js": {
|
|
code: postcssConfig,
|
|
hidden: true,
|
|
},
|
|
"styles.css": {
|
|
code: stylesConfig,
|
|
hidden: true,
|
|
},
|
|
},
|
|
hasTypescript,
|
|
entryFile,
|
|
sortedFiles,
|
|
decorators,
|
|
sandpackTemplate,
|
|
setCurrentTemplate,
|
|
};
|
|
};
|