diff --git a/apps/web/components/booking/TimeOptions.tsx b/apps/web/components/booking/TimeOptions.tsx index 502a068313..9fe3dea4bd 100644 --- a/apps/web/components/booking/TimeOptions.tsx +++ b/apps/web/components/booking/TimeOptions.tsx @@ -1,8 +1,8 @@ import { FC, useEffect, useState } from "react"; import { useLocale } from "@calcom/lib/hooks/useLocale"; -import TimezoneSelect, { ITimezoneOption } from "@calcom/ui/form/TimezoneSelect"; import { Switch } from "@calcom/ui/v2"; +import TimezoneSelect, { ITimezoneOption } from "@calcom/ui/v2/core/TimezoneSelect"; import { is24h, timeZone } from "../../lib/clock"; diff --git a/apps/web/components/v2/apps/AdditionalCalendarSelector.tsx b/apps/web/components/v2/apps/AdditionalCalendarSelector.tsx index dfc3ac9e69..2d16bc1084 100644 --- a/apps/web/components/v2/apps/AdditionalCalendarSelector.tsx +++ b/apps/web/components/v2/apps/AdditionalCalendarSelector.tsx @@ -1,5 +1,4 @@ import React from "react"; -import Select from "react-select"; import { OptionProps } from "react-select"; import { InstallAppButton } from "@calcom/app-store/components"; @@ -8,6 +7,7 @@ import { trpc } from "@calcom/trpc/react"; import type { App } from "@calcom/types/App"; import { Button } from "@calcom/ui"; import { Icon } from "@calcom/ui/Icon"; +import { Select } from "@calcom/ui/v2"; import { QueryCell } from "@lib/QueryCell"; @@ -65,23 +65,7 @@ const AdditionalCalendarSelector = ({ isLoading }: AdditionalCalendarSelectorPro name="additionalCalendar" placeholder={t("install_another")} options={options} - styles={{ - placeholder: (defaultStyles) => { - return { - ...defaultStyles, - color: "#3E3E3E", - marginLeft: "3px", - }; - }, - control: (defaultStyles) => { - return { - ...defaultStyles, - borderRadius: "6px", - }; - }, - }} isSearchable={false} - className="min-w-52 block w-full flex-1 rounded-none rounded-r-sm border-gray-300 text-sm font-medium text-gray-700" isLoading={isLoading} components={{ Option: ImageOption }} /> diff --git a/apps/web/components/v2/eventtype/AvailabilityTab.tsx b/apps/web/components/v2/eventtype/AvailabilityTab.tsx index 5ae9e0cbf3..8be0d029ab 100644 --- a/apps/web/components/v2/eventtype/AvailabilityTab.tsx +++ b/apps/web/components/v2/eventtype/AvailabilityTab.tsx @@ -8,7 +8,7 @@ import { weekdayNames } from "@calcom/lib/weekday"; import { trpc } from "@calcom/trpc/react"; import { Icon } from "@calcom/ui"; import Button from "@calcom/ui/v2/core/Button"; -import Select from "@calcom/ui/v2/core/form/Select"; +import Select from "@calcom/ui/v2/core/form/select"; import { SkeletonText } from "@calcom/ui/v2/core/skeleton"; import { SelectSkeletonLoader } from "@components/v2/availability/SkeletonLoader"; diff --git a/apps/web/pages/v2/availability/[schedule].tsx b/apps/web/pages/v2/availability/[schedule].tsx index 761575a8a5..6aa7c30fd1 100644 --- a/apps/web/pages/v2/availability/[schedule].tsx +++ b/apps/web/pages/v2/availability/[schedule].tsx @@ -12,10 +12,10 @@ import { trpc } from "@calcom/trpc/react"; import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery"; import type { Schedule as ScheduleType } from "@calcom/types/schedule"; import { Icon } from "@calcom/ui"; -import TimezoneSelect from "@calcom/ui/form/TimezoneSelect"; import Button from "@calcom/ui/v2/core/Button"; import Shell from "@calcom/ui/v2/core/Shell"; import Switch from "@calcom/ui/v2/core/Switch"; +import TimezoneSelect from "@calcom/ui/v2/core/TimezoneSelect"; import VerticalDivider from "@calcom/ui/v2/core/VerticalDivider"; import { Form, Label } from "@calcom/ui/v2/core/form/fields"; import showToast from "@calcom/ui/v2/core/notifications"; diff --git a/apps/web/pages/v2/settings/my-account/general.tsx b/apps/web/pages/v2/settings/my-account/general.tsx index 9d0b041062..47ced1ea6f 100644 --- a/apps/web/pages/v2/settings/my-account/general.tsx +++ b/apps/web/pages/v2/settings/my-account/general.tsx @@ -8,8 +8,8 @@ import { inferQueryOutput, trpc } from "@calcom/trpc/react"; import { Button } from "@calcom/ui/v2/core/Button"; import Meta from "@calcom/ui/v2/core/Meta"; import TimezoneSelect from "@calcom/ui/v2/core/TimezoneSelect"; -import Select from "@calcom/ui/v2/core/form/Select"; import { Form, Label } from "@calcom/ui/v2/core/form/fields"; +import Select from "@calcom/ui/v2/core/form/select"; import { getLayout } from "@calcom/ui/v2/core/layouts/SettingsLayout"; import showToast from "@calcom/ui/v2/core/notifications"; import { SkeletonContainer, SkeletonText, SkeletonButton } from "@calcom/ui/v2/core/skeleton"; diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css index 9e8752ed57..d21de8b6f3 100644 --- a/apps/web/styles/globals.css +++ b/apps/web/styles/globals.css @@ -197,11 +197,6 @@ button[role="switch"][data-state="checked"] { box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.2); } - /* React Select V2 */ - .cal-react-select-container .cal-react-select__control { - @apply bg-white min-h-[36px] h-[36px] text-sm leading-4 border-gray-300 hover:border-neutral-400 focus-within:ring-2 focus-within:ring-neutral-800 focus-within:border-0 placeholder:text-gray-400 placeholder:text-sm placeholder:font-normal; - } - } /* !important to style multi-email input */ diff --git a/packages/app-store/ee/routing-forms/pages/routing-link/[...appPages].tsx b/packages/app-store/ee/routing-forms/pages/routing-link/[...appPages].tsx index d8a98d6d67..0686cafb07 100644 --- a/packages/app-store/ee/routing-forms/pages/routing-link/[...appPages].tsx +++ b/packages/app-store/ee/routing-forms/pages/routing-link/[...appPages].tsx @@ -170,7 +170,11 @@ function RoutingForm({ form, profile }: inferSSRProps ); })}
-
diff --git a/packages/config/package.json b/packages/config/package.json index d654e71fee..6e65ef0b7f 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -26,6 +26,7 @@ "eslint": "^8.22.0", "prettier": "^2.7.1", "prettier-plugin-tailwindcss": "^0.1.13", + "tailwind-scrollbar": "^2.0.1", "tailwindcss": "^3.1.8", "typescript": "^4.7.4" } diff --git a/packages/config/tailwind-preset.js b/packages/config/tailwind-preset.js index 2f514c4b68..19a7f1e16d 100644 --- a/packages/config/tailwind-preset.js +++ b/packages/config/tailwind-preset.js @@ -209,6 +209,7 @@ module.exports = { require("@tailwindcss/forms"), require("@tailwindcss/typography"), require("@tailwindcss/line-clamp"), + require("tailwind-scrollbar"), require("tailwindcss-radix")(), plugin(({ addVariant }) => { addVariant("mac", ".mac &"); @@ -216,4 +217,7 @@ module.exports = { addVariant("ios", ".ios &"); }), ], + variants: { + scrollbar: ["rounded", "dark"], + }, }; diff --git a/packages/features/ee/workflows/components/v2/WorkflowStepContainer.tsx b/packages/features/ee/workflows/components/v2/WorkflowStepContainer.tsx index 4211c9cf44..116399649e 100644 --- a/packages/features/ee/workflows/components/v2/WorkflowStepContainer.tsx +++ b/packages/features/ee/workflows/components/v2/WorkflowStepContainer.tsx @@ -19,8 +19,8 @@ import { Icon } from "@calcom/ui/Icon"; import PhoneInput from "@calcom/ui/form/PhoneInputLazy"; import { Button, DialogClose, DialogContent } from "@calcom/ui/v2"; import ConfirmationDialogContent from "@calcom/ui/v2/core/ConfirmationDialogContent"; -import Select from "@calcom/ui/v2/core/form/Select"; import { EmailField, Label, TextArea } from "@calcom/ui/v2/core/form/fields"; +import Select from "@calcom/ui/v2/core/form/select"; import { AddVariablesDropdown } from "../../components/v2/AddVariablesDropdown"; import { diff --git a/packages/features/webhooks/components/WebhookForm.tsx b/packages/features/webhooks/components/WebhookForm.tsx index 3b6404b308..f7b2a039df 100644 --- a/packages/features/webhooks/components/WebhookForm.tsx +++ b/packages/features/webhooks/components/WebhookForm.tsx @@ -8,8 +8,8 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { inferQueryOutput } from "@calcom/trpc/react"; import Button from "@calcom/ui/v2/core/Button"; import Switch from "@calcom/ui/v2/core/Switch"; -import Select from "@calcom/ui/v2/core/form/Select"; import { Form, Label, TextArea, TextField } from "@calcom/ui/v2/core/form/fields"; +import Select from "@calcom/ui/v2/core/form/select"; import customTemplate, { hasTemplateIntegration } from "../utils/integrationTemplate"; import WebhookTestDisclosure from "./WebhookTestDisclosure"; diff --git a/packages/ui/form/TimezoneSelect.tsx b/packages/ui/form/TimezoneSelect.tsx index aa2f5f767b..741d7b241e 100644 --- a/packages/ui/form/TimezoneSelect.tsx +++ b/packages/ui/form/TimezoneSelect.tsx @@ -7,7 +7,7 @@ import BaseSelect, { Props as SelectProps, } from "react-timezone-select"; -import { InputComponent } from "@calcom/ui/v2/core/form/Select"; +import { InputComponent } from "@calcom/ui/v2/core/form/select/components"; function TimezoneSelect({ className, ...props }: SelectProps) { // @TODO: remove borderRadius and haveRoundedClassName logic from theme so we use only new style diff --git a/packages/ui/v2/core/TimezoneSelect.tsx b/packages/ui/v2/core/TimezoneSelect.tsx index d902c25076..4eff91daec 100644 --- a/packages/ui/v2/core/TimezoneSelect.tsx +++ b/packages/ui/v2/core/TimezoneSelect.tsx @@ -1,5 +1,4 @@ -import classNames from "classnames"; -import { components } from "react-select"; +import { useMemo } from "react"; import BaseSelect, { allTimezones, ITimezoneOption, @@ -7,42 +6,20 @@ import BaseSelect, { Props as SelectProps, } from "react-timezone-select"; -import { InputComponent } from "./form/Select"; +import { getReactSelectProps } from "@calcom/ui/v2/core/form/select"; + +function TimezoneSelect({ className, components, ...props }: SelectProps) { + const reactSelectProps = useMemo(() => { + return getReactSelectProps({ className, components: components || {} }); + }, [className, components]); -function TimezoneSelect({ className, ...props }: SelectProps) { return ( ({ - ...theme, - borderRadius: 6, - colors: { - ...theme.colors, - primary: "var(--brand-color)", - - primary50: "rgba(209 , 213, 219, var(--tw-bg-opacity))", - primary25: "rgba(244, 245, 246, var(--tw-bg-opacity))", - }, - })} - styles={{ - option: (provided, state) => ({ - ...provided, - color: state.isSelected ? "var(--brand-text-color)" : "black", - ":active": { - backgroundColor: state.isSelected ? "" : "var(--brand-color)", - color: "var(--brand-text-color)", - }, - }), - }} + {...reactSelectProps} timezones={{ ...allTimezones, "America/Asuncion": "Asuncion", }} - components={{ - ...components, - IndicatorSeparator: () => null, - Input: InputComponent, - }} - className={classNames("text-sm", className)} {...props} /> ); diff --git a/packages/ui/v2/core/form/MultiSelectCheckboxes.tsx b/packages/ui/v2/core/form/MultiSelectCheckboxes.tsx index 1e2e9c24b0..b7a8ac9335 100644 --- a/packages/ui/v2/core/form/MultiSelectCheckboxes.tsx +++ b/packages/ui/v2/core/form/MultiSelectCheckboxes.tsx @@ -5,7 +5,7 @@ import { Props } from "react-select"; import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; -import Select from "./Select"; +import Select from "./select"; export type Option = { value: string; @@ -18,22 +18,21 @@ const InputOption: React.FC>> = ({ isSelected, children, innerProps, + className, ...rest }) => { - const style = { - alignItems: "center", - backgroundColor: isFocused ? "rgba(244, 245, 246, var(--tw-bg-opacity))" : "transparent", - color: "inherit", - display: "flex ", - }; - const props = { ...innerProps, - style, }; return ( ({ - ...theme, - borderRadius: 6, - colors: { - ...theme.colors, - primary: "var(--brand-color)", - - primary50: "rgba(209 , 213, 219, var(--tw-bg-opacity))", - primary25: "rgba(244, 245, 246, var(--tw-bg-opacity))", - }, - })} value={selected} onChange={(s: any) => { setSelected(s); diff --git a/packages/ui/v2/core/form/index.ts b/packages/ui/v2/core/form/index.ts index 1c5bde2140..3e18b80a33 100644 --- a/packages/ui/v2/core/form/index.ts +++ b/packages/ui/v2/core/form/index.ts @@ -2,6 +2,6 @@ export * from "./radio-area"; export * from "./fields"; export { default as Checkbox } from "./Checkbox"; export { default as DatePicker } from "./DatePicker"; -export { default as Select, SelectWithValidation, SelectField } from "./Select"; +export { default as Select, SelectWithValidation, SelectField, getReactSelectProps } from "./select"; export { default as FormStep } from "./FormStep"; diff --git a/packages/ui/v2/core/form/Select.tsx b/packages/ui/v2/core/form/select/Select.tsx similarity index 56% rename from packages/ui/v2/core/form/Select.tsx rename to packages/ui/v2/core/form/select/Select.tsx index d04c727180..bb93f6d952 100644 --- a/packages/ui/v2/core/form/Select.tsx +++ b/packages/ui/v2/core/form/select/Select.tsx @@ -1,20 +1,28 @@ import { useId } from "@radix-ui/react-id"; import * as React from "react"; import ReactSelect, { - components, + components as reactSelectComponents, GroupBase, - InputProps, Props, SingleValue, MultiValue, - OptionProps, + SelectComponentsConfig, } from "react-select"; import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; -import { Icon } from "@calcom/ui/Icon"; -import { Label } from "./fields"; +import { Label } from "../fields"; +import { + ControlComponent, + InputComponent, + MenuComponent, + MenuListComponent, + OptionComponent, + SingleValueComponent, + ValueContainerComponent, + MultiValueComponent, +} from "./components"; export type SelectProps< Option, @@ -22,85 +30,53 @@ export type SelectProps< Group extends GroupBase