mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* docs: optimize route higtlight (#4520) * docs: optimize home display (#4519) * docs: optimize home display and route highlight * docs: optimize home display * fix(alert): propagate className (#4535) * fix(alert): propagate className * chore(alert): remove className from alert theme * fix(avatar): title type in Avatar (#4529) * fix(avatar): title type in Avatar * fix(alert): apply isEmpty check on title * fix(alert): alert interface props type * refactor: remove unnecessary props types (#4530) * refactor(docs): remove string type as it is included in ReactNode * refactor: remove unnecessary types * feat(changeset): add changeset * chore: remove changeset * refactor: remove null since ReactNode unions it already * fix(input): use onPress for wrapper click focus (#4483) * fix(input): use onPress for wrapper click focus * test(input): wrapper click focus test * chore(changeset): input onPress for wrapper click focus * chore(changeset): minor wording * Refactor/rebrand (#4532) * chore: rebrand in progress * chore: update docs to use heroui * chore: components renbranded * chore: figma moved to the docs files * fix: posthog config * fix(docs): extra classname in form example (#4465) * chore: clean git * chore: make heroui private * chore: new logo * chore: node env var renamed * chore: public robots txt deleted * chore: wrangler installed * chore: wrangler renamed * chore: cloudlfare workers removed * chore: force vercel deploy * refactor: first migration and provider * refactor: rename nextui plugin * refactor: rename github site * refactor: rename CONTRIBUTING * refactor: rename package name * refactor: nextjs image hostname * refactor: mdx repo nextui-org rename frontio-ai * refactor: nextui.org rename heroui.com * refactor: add heroui to missing places * fix: heroui plugin name * fix: update docs * docs: nextui to heroui add npmrc pnpm migratation * chore: rename all packages with new org name * chore: replace frontio-ai by frontioai * chore: revert previous changes * chore: small adjustment * chore: doc updated * feat: blog * chore: avatar updated * fix: url * chore: add new ogimage * fix: ogimage command * fix: heroui name and storybook welcome page * fix: og image url * feat: favicon and icon changed --------- Co-authored-by: աӄա <wingkwong.code@gmail.com> Co-authored-by: winches <329487092@qq.com> * fix: postbuild script * chore: core package updates * ci(changesets): version packages (#4569) Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * feat: contributors added to the blog --------- Co-authored-by: winches <329487092@qq.com> Co-authored-by: աӄա <wingkwong.code@gmail.com> Co-authored-by: Peterl561 <76144929+Peterl561@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
163 lines
4.1 KiB
JavaScript
163 lines
4.1 KiB
JavaScript
import React, {forwardRef} from "react";
|
|
import {useInput} from "@heroui/react";
|
|
|
|
export const SearchIcon = (props) => {
|
|
return (
|
|
<svg
|
|
aria-hidden="true"
|
|
fill="none"
|
|
focusable="false"
|
|
height="1em"
|
|
role="presentation"
|
|
viewBox="0 0 24 24"
|
|
width="1em"
|
|
{...props}
|
|
>
|
|
<path
|
|
d="M11.5 21C16.7467 21 21 16.7467 21 11.5C21 6.25329 16.7467 2 11.5 2C6.25329 2 2 6.25329 2 11.5C2 16.7467 6.25329 21 11.5 21Z"
|
|
stroke="currentColor"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth="2"
|
|
/>
|
|
<path
|
|
d="M22 22L20 20"
|
|
stroke="currentColor"
|
|
strokeLinecap="round"
|
|
strokeLinejoin="round"
|
|
strokeWidth="2"
|
|
/>
|
|
</svg>
|
|
);
|
|
};
|
|
|
|
export const CloseFilledIcon = (props) => {
|
|
return (
|
|
<svg
|
|
aria-hidden="true"
|
|
focusable="false"
|
|
height="1em"
|
|
role="presentation"
|
|
viewBox="0 0 24 24"
|
|
width="1em"
|
|
{...props}
|
|
>
|
|
<path
|
|
d="M12 2a10 10 0 1010 10A10.016 10.016 0 0012 2zm3.36 12.3a.754.754 0 010 1.06.748.748 0 01-1.06 0l-2.3-2.3-2.3 2.3a.748.748 0 01-1.06 0 .754.754 0 010-1.06l2.3-2.3-2.3-2.3A.75.75 0 019.7 8.64l2.3 2.3 2.3-2.3a.75.75 0 011.06 1.06l-2.3 2.3z"
|
|
fill="currentColor"
|
|
/>
|
|
</svg>
|
|
);
|
|
};
|
|
|
|
const styles = {
|
|
label: "text-black/50 dark:text-white/90",
|
|
input: [
|
|
"bg-transparent",
|
|
"text-black/90 dark:text-white/90",
|
|
"placeholder:text-default-700/50 dark:placeholder:text-white/60",
|
|
],
|
|
innerWrapper: "bg-transparent",
|
|
inputWrapper: [
|
|
"shadow-xl",
|
|
"bg-default-200/50",
|
|
"dark:bg-default/60",
|
|
"backdrop-blur-xl",
|
|
"backdrop-saturate-200",
|
|
"hover:bg-default-200/70",
|
|
"focus-within:!bg-default-200/50",
|
|
"dark:hover:bg-default/70",
|
|
"dark:focus-within:!bg-default/60",
|
|
"!cursor-text",
|
|
],
|
|
};
|
|
|
|
const MyInput = forwardRef((props, ref) => {
|
|
const {
|
|
Component,
|
|
label,
|
|
domRef,
|
|
description,
|
|
isClearable,
|
|
startContent,
|
|
endContent,
|
|
shouldLabelBeOutside,
|
|
shouldLabelBeInside,
|
|
errorMessage,
|
|
getBaseProps,
|
|
getLabelProps,
|
|
getInputProps,
|
|
getInnerWrapperProps,
|
|
getInputWrapperProps,
|
|
getDescriptionProps,
|
|
getErrorMessageProps,
|
|
getClearButtonProps,
|
|
} = useInput({
|
|
...props,
|
|
ref,
|
|
// this is just for the example, the props bellow should be passed by the parent component
|
|
label: "Search",
|
|
type: "search",
|
|
placeholder: "Type to search...",
|
|
startContent: (
|
|
<SearchIcon className="text-black/50 mb-0.5 dark:text-white/90 text-slate-400 pointer-events-none flex-shrink-0" />
|
|
),
|
|
// custom styles
|
|
classNames: {
|
|
...styles,
|
|
},
|
|
});
|
|
|
|
const labelContent = <label {...getLabelProps()}>{label}</label>;
|
|
|
|
const end = React.useMemo(() => {
|
|
if (isClearable) {
|
|
return <span {...getClearButtonProps()}>{endContent || <CloseFilledIcon />}</span>;
|
|
}
|
|
|
|
return endContent;
|
|
}, [isClearable, getClearButtonProps]);
|
|
|
|
const innerWrapper = React.useMemo(() => {
|
|
if (startContent || end) {
|
|
return (
|
|
<div {...getInnerWrapperProps()}>
|
|
{startContent}
|
|
<input {...getInputProps()} />
|
|
{end}
|
|
</div>
|
|
);
|
|
}
|
|
|
|
return <input {...getInputProps()} />;
|
|
}, [startContent, end, getInputProps, getInnerWrapperProps]);
|
|
|
|
return (
|
|
<div className="w-[340px] h-[300px] px-8 rounded-2xl flex justify-center items-center bg-gradient-to-tr from-pink-500 to-yellow-500 text-white shadow-lg">
|
|
<Component {...getBaseProps()}>
|
|
{shouldLabelBeOutside ? labelContent : null}
|
|
<div
|
|
tabIndex={0}
|
|
{...getInputWrapperProps()}
|
|
role="button"
|
|
onClick={() => {
|
|
domRef.current?.focus();
|
|
}}
|
|
onKeyDown={() => {
|
|
domRef.current?.focus();
|
|
}}
|
|
>
|
|
{shouldLabelBeInside ? labelContent : null}
|
|
{innerWrapper}
|
|
</div>
|
|
{description && <div {...getDescriptionProps()}>{description}</div>}
|
|
{errorMessage && <div {...getErrorMessageProps()}>{errorMessage}</div>}
|
|
</Component>
|
|
</div>
|
|
);
|
|
});
|
|
|
|
MyInput.displayName = "MyInput";
|
|
|
|
export default MyInput;
|