mirror of
				https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web.git
				synced 2025-11-04 08:13:43 +08:00 
			
		
		
		
	style: improve classname by clsx
This commit is contained in:
		@@ -18,6 +18,8 @@ import {
 | 
				
			|||||||
  trackSettingsPageGuideToCPaymentClick,
 | 
					  trackSettingsPageGuideToCPaymentClick,
 | 
				
			||||||
  trackAuthorizationPageButtonToCPaymentClick,
 | 
					  trackAuthorizationPageButtonToCPaymentClick,
 | 
				
			||||||
} from "../utils/auth-settings-events";
 | 
					} from "../utils/auth-settings-events";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const storage = safeLocalStorage();
 | 
					const storage = safeLocalStorage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function AuthPage() {
 | 
					export function AuthPage() {
 | 
				
			||||||
@@ -54,7 +56,7 @@ export function AuthPage() {
 | 
				
			|||||||
          onClick={() => navigate(Path.Home)}
 | 
					          onClick={() => navigate(Path.Home)}
 | 
				
			||||||
        ></IconButton>
 | 
					        ></IconButton>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      <div className={`no-dark ${styles["auth-logo"]}`}>
 | 
					      <div className={clsx("no-dark", styles["auth-logo"])}>
 | 
				
			||||||
        <BotIcon />
 | 
					        <BotIcon />
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -163,7 +165,7 @@ function TopBanner() {
 | 
				
			|||||||
      onMouseEnter={handleMouseEnter}
 | 
					      onMouseEnter={handleMouseEnter}
 | 
				
			||||||
      onMouseLeave={handleMouseLeave}
 | 
					      onMouseLeave={handleMouseLeave}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div className={`${styles["top-banner-inner"]} no-dark`}>
 | 
					      <div className={clsx(styles["top-banner-inner"], "no-dark")}>
 | 
				
			||||||
        <Logo className={styles["top-banner-logo"]}></Logo>
 | 
					        <Logo className={styles["top-banner-logo"]}></Logo>
 | 
				
			||||||
        <span>
 | 
					        <span>
 | 
				
			||||||
          {Locale.Auth.TopTips}
 | 
					          {Locale.Auth.TopTips}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ import * as React from "react";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import styles from "./button.module.scss";
 | 
					import styles from "./button.module.scss";
 | 
				
			||||||
import { CSSProperties } from "react";
 | 
					import { CSSProperties } from "react";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export type ButtonType = "primary" | "danger" | null;
 | 
					export type ButtonType = "primary" | "danger" | null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -22,12 +23,16 @@ export function IconButton(props: {
 | 
				
			|||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <button
 | 
					    <button
 | 
				
			||||||
      className={
 | 
					      className={clsx(
 | 
				
			||||||
        styles["icon-button"] +
 | 
					        "clickable",
 | 
				
			||||||
        ` ${props.bordered && styles.border} ${props.shadow && styles.shadow} ${
 | 
					        styles["icon-button"],
 | 
				
			||||||
          props.className ?? ""
 | 
					        {
 | 
				
			||||||
        } clickable ${styles[props.type ?? ""]}`
 | 
					          [styles.border]: props.bordered,
 | 
				
			||||||
      }
 | 
					          [styles.shadow]: props.shadow,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        styles[props.type ?? ""],
 | 
				
			||||||
 | 
					        props.className,
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
      onClick={props.onClick}
 | 
					      onClick={props.onClick}
 | 
				
			||||||
      title={props.title}
 | 
					      title={props.title}
 | 
				
			||||||
      disabled={props.disabled}
 | 
					      disabled={props.disabled}
 | 
				
			||||||
@@ -40,10 +45,9 @@ export function IconButton(props: {
 | 
				
			|||||||
      {props.icon && (
 | 
					      {props.icon && (
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          aria-label={props.text || props.title}
 | 
					          aria-label={props.text || props.title}
 | 
				
			||||||
          className={
 | 
					          className={clsx(styles["icon-button-icon"], {
 | 
				
			||||||
            styles["icon-button-icon"] +
 | 
					            "no-dark": props.type === "primary",
 | 
				
			||||||
            ` ${props.type === "primary" && "no-dark"}`
 | 
					          })}
 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          {props.icon}
 | 
					          {props.icon}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ import { Mask } from "../store/mask";
 | 
				
			|||||||
import { useRef, useEffect } from "react";
 | 
					import { useRef, useEffect } from "react";
 | 
				
			||||||
import { showConfirm } from "./ui-lib";
 | 
					import { showConfirm } from "./ui-lib";
 | 
				
			||||||
import { useMobileScreen } from "../utils";
 | 
					import { useMobileScreen } from "../utils";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function ChatItem(props: {
 | 
					export function ChatItem(props: {
 | 
				
			||||||
  onClick?: () => void;
 | 
					  onClick?: () => void;
 | 
				
			||||||
@@ -45,11 +46,11 @@ export function ChatItem(props: {
 | 
				
			|||||||
    <Draggable draggableId={`${props.id}`} index={props.index}>
 | 
					    <Draggable draggableId={`${props.id}`} index={props.index}>
 | 
				
			||||||
      {(provided) => (
 | 
					      {(provided) => (
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          className={`${styles["chat-item"]} ${
 | 
					          className={clsx(styles["chat-item"], {
 | 
				
			||||||
            props.selected &&
 | 
					            [styles["chat-item-selected"]]:
 | 
				
			||||||
            (currentPath === Path.Chat || currentPath === Path.Home) &&
 | 
					              props.selected &&
 | 
				
			||||||
            styles["chat-item-selected"]
 | 
					              (currentPath === Path.Chat || currentPath === Path.Home),
 | 
				
			||||||
          }`}
 | 
					          })}
 | 
				
			||||||
          onClick={props.onClick}
 | 
					          onClick={props.onClick}
 | 
				
			||||||
          ref={(ele) => {
 | 
					          ref={(ele) => {
 | 
				
			||||||
            draggableRef.current = ele;
 | 
					            draggableRef.current = ele;
 | 
				
			||||||
@@ -63,7 +64,7 @@ export function ChatItem(props: {
 | 
				
			|||||||
        >
 | 
					        >
 | 
				
			||||||
          {props.narrow ? (
 | 
					          {props.narrow ? (
 | 
				
			||||||
            <div className={styles["chat-item-narrow"]}>
 | 
					            <div className={styles["chat-item-narrow"]}>
 | 
				
			||||||
              <div className={styles["chat-item-avatar"] + " no-dark"}>
 | 
					              <div className={clsx(styles["chat-item-avatar"], "no-dark")}>
 | 
				
			||||||
                <MaskAvatar
 | 
					                <MaskAvatar
 | 
				
			||||||
                  avatar={props.mask.avatar}
 | 
					                  avatar={props.mask.avatar}
 | 
				
			||||||
                  model={props.mask.modelConfig.model}
 | 
					                  model={props.mask.modelConfig.model}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -121,6 +121,7 @@ import { MsEdgeTTS, OUTPUT_FORMAT } from "../utils/ms_edge_tts";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import { isEmpty } from "lodash-es";
 | 
					import { isEmpty } from "lodash-es";
 | 
				
			||||||
import { getModelProvider } from "../utils/model";
 | 
					import { getModelProvider } from "../utils/model";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const localStorage = safeLocalStorage();
 | 
					const localStorage = safeLocalStorage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -211,7 +212,7 @@ function PromptToast(props: {
 | 
				
			|||||||
    <div className={styles["prompt-toast"]} key="prompt-toast">
 | 
					    <div className={styles["prompt-toast"]} key="prompt-toast">
 | 
				
			||||||
      {props.showToast && context.length > 0 && (
 | 
					      {props.showToast && context.length > 0 && (
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          className={styles["prompt-toast-inner"] + " clickable"}
 | 
					          className={clsx(styles["prompt-toast-inner"], "clickable")}
 | 
				
			||||||
          role="button"
 | 
					          role="button"
 | 
				
			||||||
          onClick={() => props.setShowModal(true)}
 | 
					          onClick={() => props.setShowModal(true)}
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
@@ -332,10 +333,9 @@ export function PromptHints(props: {
 | 
				
			|||||||
      {props.prompts.map((prompt, i) => (
 | 
					      {props.prompts.map((prompt, i) => (
 | 
				
			||||||
        <div
 | 
					        <div
 | 
				
			||||||
          ref={i === selectIndex ? selectedRef : null}
 | 
					          ref={i === selectIndex ? selectedRef : null}
 | 
				
			||||||
          className={
 | 
					          className={clsx(styles["prompt-hint"], {
 | 
				
			||||||
            styles["prompt-hint"] +
 | 
					            [styles["prompt-hint-selected"]]: i === selectIndex,
 | 
				
			||||||
            ` ${i === selectIndex ? styles["prompt-hint-selected"] : ""}`
 | 
					          })}
 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          key={prompt.title + i.toString()}
 | 
					          key={prompt.title + i.toString()}
 | 
				
			||||||
          onClick={() => props.onPromptSelect(prompt)}
 | 
					          onClick={() => props.onPromptSelect(prompt)}
 | 
				
			||||||
          onMouseEnter={() => setSelectIndex(i)}
 | 
					          onMouseEnter={() => setSelectIndex(i)}
 | 
				
			||||||
@@ -395,7 +395,7 @@ export function ChatAction(props: {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={`${styles["chat-input-action"]} clickable`}
 | 
					      className={clsx(styles["chat-input-action"], "clickable")}
 | 
				
			||||||
      onClick={() => {
 | 
					      onClick={() => {
 | 
				
			||||||
        props.onClick();
 | 
					        props.onClick();
 | 
				
			||||||
        setTimeout(updateWidth, 1);
 | 
					        setTimeout(updateWidth, 1);
 | 
				
			||||||
@@ -1596,9 +1596,12 @@ function _Chat() {
 | 
				
			|||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
        )}
 | 
					        )}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <div className={`window-header-title ${styles["chat-body-title"]}`}>
 | 
					        <div className={clsx("window-header-title", styles["chat-body-title"])}>
 | 
				
			||||||
          <div
 | 
					          <div
 | 
				
			||||||
            className={`window-header-main-title ${styles["chat-body-main-title"]}`}
 | 
					            className={clsx(
 | 
				
			||||||
 | 
					              "window-header-main-title",
 | 
				
			||||||
 | 
					              styles["chat-body-main-title"],
 | 
				
			||||||
 | 
					            )}
 | 
				
			||||||
            onClickCapture={() => setIsEditingMessage(true)}
 | 
					            onClickCapture={() => setIsEditingMessage(true)}
 | 
				
			||||||
          >
 | 
					          >
 | 
				
			||||||
            {!session.topic ? DEFAULT_TOPIC : session.topic}
 | 
					            {!session.topic ? DEFAULT_TOPIC : session.topic}
 | 
				
			||||||
@@ -1872,7 +1875,7 @@ function _Chat() {
 | 
				
			|||||||
                    )}
 | 
					                    )}
 | 
				
			||||||
                    {getMessageImages(message).length > 1 && (
 | 
					                    {getMessageImages(message).length > 1 && (
 | 
				
			||||||
                      <div
 | 
					                      <div
 | 
				
			||||||
                        className={styles["chat-message-item-images"]}
 | 
					                        className={clsx(styles["chat-message-item-images"])}
 | 
				
			||||||
                        style={
 | 
					                        style={
 | 
				
			||||||
                          {
 | 
					                          {
 | 
				
			||||||
                            "--image-count": getMessageImages(message).length,
 | 
					                            "--image-count": getMessageImages(message).length,
 | 
				
			||||||
@@ -1934,11 +1937,10 @@ function _Chat() {
 | 
				
			|||||||
          setUserInput={setUserInput}
 | 
					          setUserInput={setUserInput}
 | 
				
			||||||
        />
 | 
					        />
 | 
				
			||||||
        <label
 | 
					        <label
 | 
				
			||||||
          className={`${styles["chat-input-panel-inner"]} ${
 | 
					          className={clsx(styles["chat-input-panel-inner"], {
 | 
				
			||||||
            attachImages.length != 0
 | 
					            [styles["chat-input-panel-inner-attach"]]:
 | 
				
			||||||
              ? styles["chat-input-panel-inner-attach"]
 | 
					              attachImages.length !== 0,
 | 
				
			||||||
              : ""
 | 
					          })}
 | 
				
			||||||
          }`}
 | 
					 | 
				
			||||||
          htmlFor="chat-input"
 | 
					          htmlFor="chat-input"
 | 
				
			||||||
        >
 | 
					        >
 | 
				
			||||||
          <textarea
 | 
					          <textarea
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -40,6 +40,7 @@ import { EXPORT_MESSAGE_CLASS_NAME } from "../constant";
 | 
				
			|||||||
import { getClientConfig } from "../config/client";
 | 
					import { getClientConfig } from "../config/client";
 | 
				
			||||||
import { type ClientApi, getClientApi } from "../client/api";
 | 
					import { type ClientApi, getClientApi } from "../client/api";
 | 
				
			||||||
import { getMessageTextContent } from "../utils";
 | 
					import { getMessageTextContent } from "../utils";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const Markdown = dynamic(async () => (await import("./markdown")).Markdown, {
 | 
					const Markdown = dynamic(async () => (await import("./markdown")).Markdown, {
 | 
				
			||||||
  loading: () => <LoadingIcon />,
 | 
					  loading: () => <LoadingIcon />,
 | 
				
			||||||
@@ -118,9 +119,10 @@ function Steps<
 | 
				
			|||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              key={i}
 | 
					              key={i}
 | 
				
			||||||
              className={`${styles["step"]} ${
 | 
					              className={clsx("clickable", styles["step"], {
 | 
				
			||||||
                styles[i <= props.index ? "step-finished" : ""]
 | 
					                [styles["step-finished"]]: i <= props.index,
 | 
				
			||||||
              } ${i === props.index && styles["step-current"]} clickable`}
 | 
					                [styles["step-current"]]: i === props.index,
 | 
				
			||||||
 | 
					              })}
 | 
				
			||||||
              onClick={() => {
 | 
					              onClick={() => {
 | 
				
			||||||
                props.onStepChange?.(i);
 | 
					                props.onStepChange?.(i);
 | 
				
			||||||
              }}
 | 
					              }}
 | 
				
			||||||
@@ -525,11 +527,11 @@ export function ImagePreviewer(props: {
 | 
				
			|||||||
        messages={props.messages}
 | 
					        messages={props.messages}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
      <div
 | 
					      <div
 | 
				
			||||||
        className={`${styles["preview-body"]} ${styles["default-theme"]}`}
 | 
					        className={clsx(styles["preview-body"], styles["default-theme"])}
 | 
				
			||||||
        ref={previewRef}
 | 
					        ref={previewRef}
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <div className={styles["chat-info"]}>
 | 
					        <div className={styles["chat-info"]}>
 | 
				
			||||||
          <div className={styles["logo"] + " no-dark"}>
 | 
					          <div className={clsx(styles["logo"], "no-dark")}>
 | 
				
			||||||
            <NextImage
 | 
					            <NextImage
 | 
				
			||||||
              src={ChatGptIcon.src}
 | 
					              src={ChatGptIcon.src}
 | 
				
			||||||
              alt="logo"
 | 
					              alt="logo"
 | 
				
			||||||
@@ -570,7 +572,7 @@ export function ImagePreviewer(props: {
 | 
				
			|||||||
        {props.messages.map((m, i) => {
 | 
					        {props.messages.map((m, i) => {
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              className={styles["message"] + " " + styles["message-" + m.role]}
 | 
					              className={clsx(styles["message"], styles["message-" + m.role])}
 | 
				
			||||||
              key={i}
 | 
					              key={i}
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div className={styles["avatar"]}>
 | 
					              <div className={styles["avatar"]}>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,6 @@
 | 
				
			|||||||
require("../polyfill");
 | 
					require("../polyfill");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { useState, useEffect } from "react";
 | 
					import { useState, useEffect } from "react";
 | 
				
			||||||
 | 
					 | 
				
			||||||
import styles from "./home.module.scss";
 | 
					import styles from "./home.module.scss";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import BotIcon from "../icons/bot.svg";
 | 
					import BotIcon from "../icons/bot.svg";
 | 
				
			||||||
@@ -29,10 +28,11 @@ import { AuthPage } from "./auth";
 | 
				
			|||||||
import { getClientConfig } from "../config/client";
 | 
					import { getClientConfig } from "../config/client";
 | 
				
			||||||
import { type ClientApi, getClientApi } from "../client/api";
 | 
					import { type ClientApi, getClientApi } from "../client/api";
 | 
				
			||||||
import { useAccessStore } from "../store";
 | 
					import { useAccessStore } from "../store";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function Loading(props: { noLogo?: boolean }) {
 | 
					export function Loading(props: { noLogo?: boolean }) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={styles["loading-content"] + " no-dark"}>
 | 
					    <div className={clsx("no-dark", styles["loading-content"])}>
 | 
				
			||||||
      {!props.noLogo && <BotIcon />}
 | 
					      {!props.noLogo && <BotIcon />}
 | 
				
			||||||
      <LoadingIcon />
 | 
					      <LoadingIcon />
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
@@ -179,7 +179,11 @@ function Screen() {
 | 
				
			|||||||
    if (isSdNew) return <Sd />;
 | 
					    if (isSdNew) return <Sd />;
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <>
 | 
					      <>
 | 
				
			||||||
        <SideBar className={isHome ? styles["sidebar-show"] : ""} />
 | 
					        <SideBar
 | 
				
			||||||
 | 
					          className={clsx({
 | 
				
			||||||
 | 
					            [styles["sidebar-show"]]: isHome,
 | 
				
			||||||
 | 
					          })}
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
        <WindowContent>
 | 
					        <WindowContent>
 | 
				
			||||||
          <Routes>
 | 
					          <Routes>
 | 
				
			||||||
            <Route path={Path.Home} element={<Chat />} />
 | 
					            <Route path={Path.Home} element={<Chat />} />
 | 
				
			||||||
@@ -197,9 +201,10 @@ function Screen() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={`${styles.container} ${
 | 
					      className={clsx(styles.container, {
 | 
				
			||||||
        shouldTightBorder ? styles["tight-container"] : styles.container
 | 
					        [styles["tight-container"]]: shouldTightBorder,
 | 
				
			||||||
      } ${getLang() === "ar" ? styles["rtl-screen"] : ""}`}
 | 
					        [styles["rtl-screen"]]: getLang() === "ar",
 | 
				
			||||||
 | 
					      })}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      {renderContent()}
 | 
					      {renderContent()}
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
import * as React from "react";
 | 
					import * as React from "react";
 | 
				
			||||||
import styles from "./input-range.module.scss";
 | 
					import styles from "./input-range.module.scss";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface InputRangeProps {
 | 
					interface InputRangeProps {
 | 
				
			||||||
  onChange: React.ChangeEventHandler<HTMLInputElement>;
 | 
					  onChange: React.ChangeEventHandler<HTMLInputElement>;
 | 
				
			||||||
@@ -23,7 +24,7 @@ export function InputRange({
 | 
				
			|||||||
  aria,
 | 
					  aria,
 | 
				
			||||||
}: InputRangeProps) {
 | 
					}: InputRangeProps) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={styles["input-range"] + ` ${className ?? ""}`}>
 | 
					    <div className={clsx(styles["input-range"], className)}>
 | 
				
			||||||
      {title || value}
 | 
					      {title || value}
 | 
				
			||||||
      <input
 | 
					      <input
 | 
				
			||||||
        aria-label={aria}
 | 
					        aria-label={aria}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ import { useChatStore } from "../store";
 | 
				
			|||||||
import { IconButton } from "./button";
 | 
					import { IconButton } from "./button";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { useAppConfig } from "../store/config";
 | 
					import { useAppConfig } from "../store/config";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function Mermaid(props: { code: string }) {
 | 
					export function Mermaid(props: { code: string }) {
 | 
				
			||||||
  const ref = useRef<HTMLDivElement>(null);
 | 
					  const ref = useRef<HTMLDivElement>(null);
 | 
				
			||||||
@@ -57,7 +58,7 @@ export function Mermaid(props: { code: string }) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className="no-dark mermaid"
 | 
					      className={clsx("no-dark", "mermaid")}
 | 
				
			||||||
      style={{
 | 
					      style={{
 | 
				
			||||||
        cursor: "pointer",
 | 
					        cursor: "pointer",
 | 
				
			||||||
        overflow: "auto",
 | 
					        overflow: "auto",
 | 
				
			||||||
@@ -193,7 +194,12 @@ function CustomCode(props: { children: any; className?: string }) {
 | 
				
			|||||||
  const renderShowMoreButton = () => {
 | 
					  const renderShowMoreButton = () => {
 | 
				
			||||||
    if (showToggle && enableCodeFold && collapsed) {
 | 
					    if (showToggle && enableCodeFold && collapsed) {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
        <div className={`show-hide-button ${collapsed ? "collapsed" : "expanded"}`}>
 | 
					        <div
 | 
				
			||||||
 | 
					          className={clsx("show-hide-button", {
 | 
				
			||||||
 | 
					            collapsed,
 | 
				
			||||||
 | 
					            expanded: !collapsed,
 | 
				
			||||||
 | 
					          })}
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
          <button onClick={toggleCollapsed}>{Locale.NewChat.More}</button>
 | 
					          <button onClick={toggleCollapsed}>{Locale.NewChat.More}</button>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
@@ -203,7 +209,7 @@ function CustomCode(props: { children: any; className?: string }) {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <code
 | 
					      <code
 | 
				
			||||||
        className={props?.className}
 | 
					        className={clsx(props?.className)}
 | 
				
			||||||
        ref={ref}
 | 
					        ref={ref}
 | 
				
			||||||
        style={{
 | 
					        style={{
 | 
				
			||||||
          maxHeight: enableCodeFold && collapsed ? "400px" : "none",
 | 
					          maxHeight: enableCodeFold && collapsed ? "400px" : "none",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,6 +55,7 @@ import {
 | 
				
			|||||||
  OnDragEndResponder,
 | 
					  OnDragEndResponder,
 | 
				
			||||||
} from "@hello-pangea/dnd";
 | 
					} from "@hello-pangea/dnd";
 | 
				
			||||||
import { getMessageTextContent } from "../utils";
 | 
					import { getMessageTextContent } from "../utils";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// drag and drop helper function
 | 
					// drag and drop helper function
 | 
				
			||||||
function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {
 | 
					function reorder<T>(list: T[], startIndex: number, endIndex: number): T[] {
 | 
				
			||||||
@@ -588,7 +589,7 @@ export function MaskPage() {
 | 
				
			|||||||
                  </div>
 | 
					                  </div>
 | 
				
			||||||
                  <div className={styles["mask-title"]}>
 | 
					                  <div className={styles["mask-title"]}>
 | 
				
			||||||
                    <div className={styles["mask-name"]}>{m.name}</div>
 | 
					                    <div className={styles["mask-name"]}>{m.name}</div>
 | 
				
			||||||
                    <div className={styles["mask-info"] + " one-line"}>
 | 
					                    <div className={clsx(styles["mask-info"], "one-line")}>
 | 
				
			||||||
                      {`${Locale.Mask.Item.Info(m.context.length)} / ${
 | 
					                      {`${Locale.Mask.Item.Info(m.context.length)} / ${
 | 
				
			||||||
                        ALL_LANG_OPTIONS[m.lang]
 | 
					                        ALL_LANG_OPTIONS[m.lang]
 | 
				
			||||||
                      } / ${m.modelConfig.model}`}
 | 
					                      } / ${m.modelConfig.model}`}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,6 +8,7 @@ import Locale from "../locales";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import styles from "./message-selector.module.scss";
 | 
					import styles from "./message-selector.module.scss";
 | 
				
			||||||
import { getMessageTextContent } from "../utils";
 | 
					import { getMessageTextContent } from "../utils";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function useShiftRange() {
 | 
					function useShiftRange() {
 | 
				
			||||||
  const [startIndex, setStartIndex] = useState<number>();
 | 
					  const [startIndex, setStartIndex] = useState<number>();
 | 
				
			||||||
@@ -71,6 +72,7 @@ export function MessageSelector(props: {
 | 
				
			|||||||
  defaultSelectAll?: boolean;
 | 
					  defaultSelectAll?: boolean;
 | 
				
			||||||
  onSelected?: (messages: ChatMessage[]) => void;
 | 
					  onSelected?: (messages: ChatMessage[]) => void;
 | 
				
			||||||
}) {
 | 
					}) {
 | 
				
			||||||
 | 
					  const LATEST_COUNT = 4;
 | 
				
			||||||
  const chatStore = useChatStore();
 | 
					  const chatStore = useChatStore();
 | 
				
			||||||
  const session = chatStore.currentSession();
 | 
					  const session = chatStore.currentSession();
 | 
				
			||||||
  const isValid = (m: ChatMessage) => m.content && !m.isError && !m.streaming;
 | 
					  const isValid = (m: ChatMessage) => m.content && !m.isError && !m.streaming;
 | 
				
			||||||
@@ -141,15 +143,13 @@ export function MessageSelector(props: {
 | 
				
			|||||||
    // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
					    // eslint-disable-next-line react-hooks/exhaustive-deps
 | 
				
			||||||
  }, [startIndex, endIndex]);
 | 
					  }, [startIndex, endIndex]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const LATEST_COUNT = 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={styles["message-selector"]}>
 | 
					    <div className={styles["message-selector"]}>
 | 
				
			||||||
      <div className={styles["message-filter"]}>
 | 
					      <div className={styles["message-filter"]}>
 | 
				
			||||||
        <input
 | 
					        <input
 | 
				
			||||||
          type="text"
 | 
					          type="text"
 | 
				
			||||||
          placeholder={Locale.Select.Search}
 | 
					          placeholder={Locale.Select.Search}
 | 
				
			||||||
          className={styles["filter-item"] + " " + styles["search-bar"]}
 | 
					          className={clsx(styles["filter-item"], styles["search-bar"])}
 | 
				
			||||||
          value={searchInput}
 | 
					          value={searchInput}
 | 
				
			||||||
          onInput={(e) => {
 | 
					          onInput={(e) => {
 | 
				
			||||||
            setSearchInput(e.currentTarget.value);
 | 
					            setSearchInput(e.currentTarget.value);
 | 
				
			||||||
@@ -196,9 +196,9 @@ export function MessageSelector(props: {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
          return (
 | 
					          return (
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              className={`${styles["message"]} ${
 | 
					              className={clsx(styles["message"], {
 | 
				
			||||||
                props.selection.has(m.id!) && styles["message-selected"]
 | 
					                [styles["message-selected"]]: props.selection.has(m.id!),
 | 
				
			||||||
              }`}
 | 
					              })}
 | 
				
			||||||
              key={i}
 | 
					              key={i}
 | 
				
			||||||
              onClick={() => {
 | 
					              onClick={() => {
 | 
				
			||||||
                props.updateSelection((selection) => {
 | 
					                props.updateSelection((selection) => {
 | 
				
			||||||
@@ -221,7 +221,7 @@ export function MessageSelector(props: {
 | 
				
			|||||||
                <div className={styles["date"]}>
 | 
					                <div className={styles["date"]}>
 | 
				
			||||||
                  {new Date(m.date).toLocaleString()}
 | 
					                  {new Date(m.date).toLocaleString()}
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div className={`${styles["content"]} one-line`}>
 | 
					                <div className={clsx(styles["content"], "one-line")}>
 | 
				
			||||||
                  {getMessageTextContent(m)}
 | 
					                  {getMessageTextContent(m)}
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ import { MaskAvatar } from "./mask";
 | 
				
			|||||||
import { useCommand } from "../command";
 | 
					import { useCommand } from "../command";
 | 
				
			||||||
import { showConfirm } from "./ui-lib";
 | 
					import { showConfirm } from "./ui-lib";
 | 
				
			||||||
import { BUILTIN_MASK_STORE } from "../masks";
 | 
					import { BUILTIN_MASK_STORE } from "../masks";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function MaskItem(props: { mask: Mask; onClick?: () => void }) {
 | 
					function MaskItem(props: { mask: Mask; onClick?: () => void }) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
@@ -24,7 +25,9 @@ function MaskItem(props: { mask: Mask; onClick?: () => void }) {
 | 
				
			|||||||
        avatar={props.mask.avatar}
 | 
					        avatar={props.mask.avatar}
 | 
				
			||||||
        model={props.mask.modelConfig.model}
 | 
					        model={props.mask.modelConfig.model}
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
      <div className={styles["mask-name"] + " one-line"}>{props.mask.name}</div>
 | 
					      <div className={clsx(styles["mask-name"], "one-line")}>
 | 
				
			||||||
 | 
					        {props.mask.name}
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ import {
 | 
				
			|||||||
import Locale from "../locales";
 | 
					import Locale from "../locales";
 | 
				
			||||||
import { useNavigate } from "react-router-dom";
 | 
					import { useNavigate } from "react-router-dom";
 | 
				
			||||||
import { useState } from "react";
 | 
					import { useState } from "react";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function PluginPage() {
 | 
					export function PluginPage() {
 | 
				
			||||||
  const navigate = useNavigate();
 | 
					  const navigate = useNavigate();
 | 
				
			||||||
@@ -199,7 +200,7 @@ export function PluginPage() {
 | 
				
			|||||||
                    <div className={styles["mask-name"]}>
 | 
					                    <div className={styles["mask-name"]}>
 | 
				
			||||||
                      {m.title}@<small>{m.version}</small>
 | 
					                      {m.title}@<small>{m.version}</small>
 | 
				
			||||||
                    </div>
 | 
					                    </div>
 | 
				
			||||||
                    <div className={styles["mask-info"] + " one-line"}>
 | 
					                    <div className={clsx(styles["mask-info"], "one-line")}>
 | 
				
			||||||
                      {Locale.Plugin.Item.Info(
 | 
					                      {Locale.Plugin.Item.Info(
 | 
				
			||||||
                        FunctionToolService.add(m).length,
 | 
					                        FunctionToolService.add(m).length,
 | 
				
			||||||
                      )}
 | 
					                      )}
 | 
				
			||||||
@@ -335,7 +336,10 @@ export function PluginPage() {
 | 
				
			|||||||
              <ListItem
 | 
					              <ListItem
 | 
				
			||||||
                subTitle={
 | 
					                subTitle={
 | 
				
			||||||
                  <div
 | 
					                  <div
 | 
				
			||||||
                    className={`markdown-body ${pluginStyles["plugin-content"]}`}
 | 
					                    className={clsx(
 | 
				
			||||||
 | 
					                      "markdown-body",
 | 
				
			||||||
 | 
					                      pluginStyles["plugin-content"],
 | 
				
			||||||
 | 
					                    )}
 | 
				
			||||||
                    dir="auto"
 | 
					                    dir="auto"
 | 
				
			||||||
                  >
 | 
					                  >
 | 
				
			||||||
                    <pre>
 | 
					                    <pre>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import { Select } from "@/app/components/ui-lib";
 | 
				
			|||||||
import { IconButton } from "@/app/components/button";
 | 
					import { IconButton } from "@/app/components/button";
 | 
				
			||||||
import Locale from "@/app/locales";
 | 
					import Locale from "@/app/locales";
 | 
				
			||||||
import { useSdStore } from "@/app/store/sd";
 | 
					import { useSdStore } from "@/app/store/sd";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const params = [
 | 
					export const params = [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@@ -136,7 +137,7 @@ export function ControlParamItem(props: {
 | 
				
			|||||||
  className?: string;
 | 
					  className?: string;
 | 
				
			||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={styles["ctrl-param-item"] + ` ${props.className || ""}`}>
 | 
					    <div className={clsx(styles["ctrl-param-item"], props.className)}>
 | 
				
			||||||
      <div className={styles["ctrl-param-item-header"]}>
 | 
					      <div className={styles["ctrl-param-item-header"]}>
 | 
				
			||||||
        <div className={styles["ctrl-param-item-title"]}>
 | 
					        <div className={styles["ctrl-param-item-title"]}>
 | 
				
			||||||
          <div>
 | 
					          <div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -36,6 +36,7 @@ import { removeImage } from "@/app/utils/chat";
 | 
				
			|||||||
import { SideBar } from "./sd-sidebar";
 | 
					import { SideBar } from "./sd-sidebar";
 | 
				
			||||||
import { WindowContent } from "@/app/components/home";
 | 
					import { WindowContent } from "@/app/components/home";
 | 
				
			||||||
import { params } from "./sd-panel";
 | 
					import { params } from "./sd-panel";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getSdTaskStatus(item: any) {
 | 
					function getSdTaskStatus(item: any) {
 | 
				
			||||||
  let s: string;
 | 
					  let s: string;
 | 
				
			||||||
@@ -104,7 +105,7 @@ export function Sd() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <>
 | 
					    <>
 | 
				
			||||||
      <SideBar className={isSd ? homeStyles["sidebar-show"] : ""} />
 | 
					      <SideBar className={clsx({ [homeStyles["sidebar-show"]]: isSd })} />
 | 
				
			||||||
      <WindowContent>
 | 
					      <WindowContent>
 | 
				
			||||||
        <div className={chatStyles.chat} key={"1"}>
 | 
					        <div className={chatStyles.chat} key={"1"}>
 | 
				
			||||||
          <div className="window-header" data-tauri-drag-region>
 | 
					          <div className="window-header" data-tauri-drag-region>
 | 
				
			||||||
@@ -121,7 +122,10 @@ export function Sd() {
 | 
				
			|||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
            )}
 | 
					            )}
 | 
				
			||||||
            <div
 | 
					            <div
 | 
				
			||||||
              className={`window-header-title ${chatStyles["chat-body-title"]}`}
 | 
					              className={clsx(
 | 
				
			||||||
 | 
					                "window-header-title",
 | 
				
			||||||
 | 
					                chatStyles["chat-body-title"],
 | 
				
			||||||
 | 
					              )}
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div className={`window-header-main-title`}>Stability AI</div>
 | 
					              <div className={`window-header-main-title`}>Stability AI</div>
 | 
				
			||||||
              <div className="window-header-sub-title">
 | 
					              <div className="window-header-sub-title">
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,7 @@ import { Link, useNavigate } from "react-router-dom";
 | 
				
			|||||||
import { isIOS, useMobileScreen } from "../utils";
 | 
					import { isIOS, useMobileScreen } from "../utils";
 | 
				
			||||||
import dynamic from "next/dynamic";
 | 
					import dynamic from "next/dynamic";
 | 
				
			||||||
import { showConfirm, Selector } from "./ui-lib";
 | 
					import { showConfirm, Selector } from "./ui-lib";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, {
 | 
					const ChatList = dynamic(async () => (await import("./chat-list")).ChatList, {
 | 
				
			||||||
  loading: () => null,
 | 
					  loading: () => null,
 | 
				
			||||||
@@ -141,9 +142,9 @@ export function SideBarContainer(props: {
 | 
				
			|||||||
  const { children, className, onDragStart, shouldNarrow } = props;
 | 
					  const { children, className, onDragStart, shouldNarrow } = props;
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={`${styles.sidebar} ${className} ${
 | 
					      className={clsx(styles.sidebar, className, {
 | 
				
			||||||
        shouldNarrow && styles["narrow-sidebar"]
 | 
					        [styles["narrow-sidebar"]]: shouldNarrow,
 | 
				
			||||||
      }`}
 | 
					      })}
 | 
				
			||||||
      style={{
 | 
					      style={{
 | 
				
			||||||
        // #3016 disable transition on ios mobile screen
 | 
					        // #3016 disable transition on ios mobile screen
 | 
				
			||||||
        transition: isMobileScreen && isIOSMobile ? "none" : undefined,
 | 
					        transition: isMobileScreen && isIOSMobile ? "none" : undefined,
 | 
				
			||||||
@@ -171,9 +172,9 @@ export function SideBarHeader(props: {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Fragment>
 | 
					    <Fragment>
 | 
				
			||||||
      <div
 | 
					      <div
 | 
				
			||||||
        className={`${styles["sidebar-header"]} ${
 | 
					        className={clsx(styles["sidebar-header"], {
 | 
				
			||||||
          shouldNarrow ? styles["sidebar-header-narrow"] : ""
 | 
					          [styles["sidebar-header-narrow"]]: shouldNarrow,
 | 
				
			||||||
        }`}
 | 
					        })}
 | 
				
			||||||
        data-tauri-drag-region
 | 
					        data-tauri-drag-region
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        <div className={styles["sidebar-title-container"]}>
 | 
					        <div className={styles["sidebar-title-container"]}>
 | 
				
			||||||
@@ -182,7 +183,7 @@ export function SideBarHeader(props: {
 | 
				
			|||||||
          </div>
 | 
					          </div>
 | 
				
			||||||
          <div className={styles["sidebar-sub-title"]}>{subTitle}</div>
 | 
					          <div className={styles["sidebar-sub-title"]}>{subTitle}</div>
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
        <div className={styles["sidebar-logo"] + " no-dark"}>{logo}</div>
 | 
					        <div className={clsx(styles["sidebar-logo"], "no-dark")}>{logo}</div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
      {children}
 | 
					      {children}
 | 
				
			||||||
    </Fragment>
 | 
					    </Fragment>
 | 
				
			||||||
@@ -286,7 +287,7 @@ export function SideBar(props: { className?: string }) {
 | 
				
			|||||||
      <SideBarTail
 | 
					      <SideBarTail
 | 
				
			||||||
        primaryAction={
 | 
					        primaryAction={
 | 
				
			||||||
          <>
 | 
					          <>
 | 
				
			||||||
            <div className={styles["sidebar-action"] + " " + styles.mobile}>
 | 
					            <div className={clsx(styles["sidebar-action"], styles.mobile)}>
 | 
				
			||||||
              <IconButton
 | 
					              <IconButton
 | 
				
			||||||
                icon={<DeleteIcon />}
 | 
					                icon={<DeleteIcon />}
 | 
				
			||||||
                onClick={async () => {
 | 
					                onClick={async () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,6 +23,7 @@ import React, {
 | 
				
			|||||||
  useRef,
 | 
					  useRef,
 | 
				
			||||||
} from "react";
 | 
					} from "react";
 | 
				
			||||||
import { IconButton } from "./button";
 | 
					import { IconButton } from "./button";
 | 
				
			||||||
 | 
					import clsx from "clsx";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function Popover(props: {
 | 
					export function Popover(props: {
 | 
				
			||||||
  children: JSX.Element;
 | 
					  children: JSX.Element;
 | 
				
			||||||
@@ -45,7 +46,7 @@ export function Popover(props: {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
export function Card(props: { children: JSX.Element[]; className?: string }) {
 | 
					export function Card(props: { children: JSX.Element[]; className?: string }) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div className={styles.card + " " + props.className}>{props.children}</div>
 | 
					    <div className={clsx(styles.card, props.className)}>{props.children}</div>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -60,11 +61,13 @@ export function ListItem(props: {
 | 
				
			|||||||
}) {
 | 
					}) {
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={
 | 
					      className={clsx(
 | 
				
			||||||
        styles["list-item"] +
 | 
					        styles["list-item"],
 | 
				
			||||||
        ` ${props.vertical ? styles["vertical"] : ""} ` +
 | 
					        {
 | 
				
			||||||
        ` ${props.className || ""}`
 | 
					          [styles["vertical"]]: props.vertical,
 | 
				
			||||||
      }
 | 
					        },
 | 
				
			||||||
 | 
					        props.className,
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
      onClick={props.onClick}
 | 
					      onClick={props.onClick}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div className={styles["list-header"]}>
 | 
					      <div className={styles["list-header"]}>
 | 
				
			||||||
@@ -135,9 +138,9 @@ export function Modal(props: ModalProps) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={
 | 
					      className={clsx(styles["modal-container"], {
 | 
				
			||||||
        styles["modal-container"] + ` ${isMax && styles["modal-container-max"]}`
 | 
					        [styles["modal-container-max"]]: isMax,
 | 
				
			||||||
      }
 | 
					      })}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <div className={styles["modal-header"]}>
 | 
					      <div className={styles["modal-header"]}>
 | 
				
			||||||
        <div className={styles["modal-title"]}>{props.title}</div>
 | 
					        <div className={styles["modal-title"]}>{props.title}</div>
 | 
				
			||||||
@@ -260,7 +263,7 @@ export function Input(props: InputProps) {
 | 
				
			|||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <textarea
 | 
					    <textarea
 | 
				
			||||||
      {...props}
 | 
					      {...props}
 | 
				
			||||||
      className={`${styles["input"]} ${props.className}`}
 | 
					      className={clsx(styles["input"], props.className)}
 | 
				
			||||||
    ></textarea>
 | 
					    ></textarea>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -301,9 +304,13 @@ export function Select(
 | 
				
			|||||||
  const { className, children, align, ...otherProps } = props;
 | 
					  const { className, children, align, ...otherProps } = props;
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <div
 | 
					    <div
 | 
				
			||||||
      className={`${styles["select-with-icon"]} ${
 | 
					      className={clsx(
 | 
				
			||||||
        align === "left" ? styles["left-align-option"] : ""
 | 
					        styles["select-with-icon"],
 | 
				
			||||||
      } ${className}`}
 | 
					        {
 | 
				
			||||||
 | 
					          [styles["left-align-option"]]: align === "left",
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        className,
 | 
				
			||||||
 | 
					      )}
 | 
				
			||||||
    >
 | 
					    >
 | 
				
			||||||
      <select className={styles["select-with-icon-select"]} {...otherProps}>
 | 
					      <select className={styles["select-with-icon-select"]} {...otherProps}>
 | 
				
			||||||
        {children}
 | 
					        {children}
 | 
				
			||||||
@@ -509,9 +516,9 @@ export function Selector<T>(props: {
 | 
				
			|||||||
            const selected = selectedValues.includes(item.value);
 | 
					            const selected = selectedValues.includes(item.value);
 | 
				
			||||||
            return (
 | 
					            return (
 | 
				
			||||||
              <ListItem
 | 
					              <ListItem
 | 
				
			||||||
                className={`${styles["selector-item"]} ${
 | 
					                className={clsx(styles["selector-item"], {
 | 
				
			||||||
                  item.disable && styles["selector-item-disabled"]
 | 
					                  [styles["selector-item-disabled"]]: item.disable,
 | 
				
			||||||
                }`}
 | 
					                })}
 | 
				
			||||||
                key={i}
 | 
					                key={i}
 | 
				
			||||||
                title={item.title}
 | 
					                title={item.title}
 | 
				
			||||||
                subTitle={item.subTitle}
 | 
					                subTitle={item.subTitle}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user