mirror of
https://github.com/nextui-org/nextui.git
synced 2025-12-08 19:26:11 +00:00
* fix(date-picker): error state (#5317) * fix(date-range-picker): fixed the error state in preset * Update giant-sloths-shop.md * Removed if statement * chore(date-picker): prettier --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix(theme): clear button in mobile (#5252) * fix(toast): fixed close button hover position * fix(input): fixed the clear button rendering on smaller devices * Delete .changeset/soft-spoons-march.md * Update input.ts * Undo unrelated toast changes * fix(toast): icons (#5246) * feat(shared-icons): add loading icon * fix(toast): icons * chore(toast): revise types for icons * chore(changeset): add changeset * refactor: migrate eslint to v9 (#5267) * refactor: migrate eslint to v9 * chore: lint * chore: update eslint command * chore: fix lint warnings * chore: separate lint and lint:fix * chore: exclude contentlayer generated code * fix(scripts): add missing await * fix(autocomplete): persist last selected item position (#5286) * refactor(select): remove unnecessary code * fix(autocomplete): persist last selected item position * chore(changeset): add changeset * chore(deps): bump framer-motion version (#5287) * chore(deps): bump framer-motion version * fix: typing issues * chore(changeset): add changeset --------- Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * chore(docs): supplement onAction & selectionBehavior (#5289) * fix(autocomplete): ensure focused item matches selected item after filter, selection (#5290) * fix(autocomplete): ensure focused item matches selected item after filter, selection * chore: apply type and default value * chore: add perpose coment in updated code * test: add focuskey management testcode * docs: add changeset * docs: update changeset * chore: remove comment * fix: broken components in stories (#5291) * chore(switch): remove xl size * chore(docs): remove xl size * chore(system-rsc): remove xl size * chore(circular-progress): remove xl size * chore: undo * chore(deps): bump RA versions (#5310) * chore(deps): ra version bump * chore(changeset): add changeset * fix(scripts): incorrect docs path --------- Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * chore(docs): update meta data (#5311) * docs(layout.tsx): added text-foreground (#5316) * feat(tabs): add click handling for tab items in tests and implementation (#3917) Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix issues in tabs examples (#2405) Co-authored-by: WK Wong <wingkwong.code@gmail.com> * chore(docs): add missing onValueChange in CheckboxGroup (#5332) * ci(changesets): version packages (#5323) Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> * chore(deps): bump RA versions (#5361) * chore(deps): bump RA versions * chore(deps): bump RA versions * chore(deps): bump RA versions * chore: changeset * refactor(listbox): already extends in AriaListBoxProps * chore(docs): remove herohack announcement (#5363) * chore: remove herohack announcement * Update carbon-ad.tsx * chore(docs): fixed lint errors * chore(docs): requested changes * Update carbon-ad.tsx * Update carbon-ad.tsx * fix(theme): consistent faded styling for isInvalid in InputOtp and DateInput (#5349) * fix(input-otp): remove bg and border styles from faded variant when isInvalid * fix(date-input): remove bg styles from faded variant when isInvalid * chore(changeset): add changeset * chore: bump theme peerDependencies * chore: bump theme peerDependencies * fix: wrong version * chore: extra line --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix(theme): helperWrapper padding (#5350) * fix(number-input): decreased helperWrapper padding to maintain consistency * Update beige-laws-heal.md * chore(theme): change to p-1 * chore(deps): bump peerDependencies for theme pkg * fix(number-input): incorrect versions * chore(changeset): include number input --------- Co-authored-by: WK Wong <wingkwong.code@gmail.com> * fix(autocomplete): onClear (#5365) * fix(autocomplete): add onClear * feat(autocomplete): add test case for onClear * chore(changeset): add changeset * fix(number-input): only allow number type (#5368) * refactor(number-input): avoid non number type passing to number input * chore(changeset): add changeset * refactor: optimization (#5362) * chore(deps): bump RA versions * chore(deps): bump RA versions * chore(deps): bump RA versions * chore: changeset * chore(deps): remove unnecessary dependencies * fix(calendar): typing issue * refactor(system): remove unused SupportedCalendars * refactor(system): move I18nProviderProps to type * refactor: use `spectrumCalendarProps<DateValue>["createCalendar"]` * feat: add consistent-type-imports * fix: eslint * chore: add changeset * refactor: remove unused deps * ci(changesets): version packages (#5364) Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> --------- Co-authored-by: Vishv Salvi <82429084+Vishvsalvi@users.noreply.github.com> Co-authored-by: Junior Garcia <jrgarciadev@gmail.com> Co-authored-by: KumJungMin <37934668+KumJungMin@users.noreply.github.com> Co-authored-by: liaoyinglong <vigossliao@gmail.com> Co-authored-by: zhengjitf <zhengjitf@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Anuj Kuralkar <76731106+anuj-kuralkar@users.noreply.github.com>
93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
"use client";
|
|
|
|
import type {ReactNode} from "react";
|
|
import type {LinkProps, SlotsToClasses} from "@heroui/react";
|
|
|
|
import React from "react";
|
|
import {usePostHog} from "posthog-js/react";
|
|
import {tv} from "tailwind-variants";
|
|
import {Card, CardHeader, CardBody} from "@heroui/react";
|
|
import {useRouter} from "next/navigation";
|
|
import {LinkIcon} from "@heroui/shared-icons";
|
|
|
|
const styles = tv({
|
|
slots: {
|
|
base: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4",
|
|
card: "border-transparent bg-white/5 dark:bg-default-400/10 backdrop-blur-lg backdrop-saturate-[1.8]",
|
|
header: "gap-2 pb-0",
|
|
body: "",
|
|
iconWrapper:
|
|
"flex justify-center p-2 rounded-full items-center bg-secondary-100/80 text-pink-500",
|
|
title: "text-base font-semibold",
|
|
description: "font-normal text-medium text-default-500",
|
|
},
|
|
});
|
|
|
|
export type FeaturesGridSlots = keyof ReturnType<typeof styles>;
|
|
|
|
export interface Feature extends LinkProps {
|
|
title: string;
|
|
icon: ReactNode;
|
|
description?: string | ReactNode;
|
|
}
|
|
|
|
interface FeaturesGridProps {
|
|
features: Feature[];
|
|
classNames?: SlotsToClasses<FeaturesGridSlots>;
|
|
}
|
|
|
|
export const FeaturesGrid: React.FC<FeaturesGridProps> = ({features, classNames, ...props}) => {
|
|
const router = useRouter();
|
|
|
|
const posthog = usePostHog();
|
|
|
|
const slots = styles();
|
|
|
|
const handleClick = (feat: Feature) => {
|
|
posthog.capture("FeaturesGrid - Click", {
|
|
name: feat.title,
|
|
action: "click",
|
|
category: "docs",
|
|
data: feat.href ?? "",
|
|
});
|
|
|
|
if (!feat.href) {
|
|
return;
|
|
}
|
|
|
|
if (feat.isExternal) {
|
|
window.open(feat.href, "_blank");
|
|
|
|
return;
|
|
}
|
|
router.push(feat.href);
|
|
};
|
|
|
|
return (
|
|
<div className={slots.base({class: classNames?.base})} {...props}>
|
|
{features.map((feat: Feature, index: number) => (
|
|
<Card
|
|
key={`${feat.title}_${index}`}
|
|
isBlurred
|
|
className={slots.card({class: classNames?.card})}
|
|
isPressable={!!feat.href}
|
|
onPress={() => handleClick(feat)}
|
|
>
|
|
<CardHeader className={slots.header({class: classNames?.header})}>
|
|
<div className={slots.iconWrapper({class: classNames?.iconWrapper})}>{feat.icon}</div>
|
|
<p className={slots.title({class: classNames?.title})}>{feat.title}</p>
|
|
{feat.isExternal && <LinkIcon height={18} width={18} />}
|
|
</CardHeader>
|
|
{feat.description ? (
|
|
<CardBody className={slots.body({class: classNames?.body})}>
|
|
<p className={slots.description({class: classNames?.description})}>
|
|
{feat.description}
|
|
</p>
|
|
</CardBody>
|
|
) : null}
|
|
</Card>
|
|
))}
|
|
</div>
|
|
);
|
|
};
|