Компонент Shadecdn/ui Drawer внутри div

Как мне этого добиться, чтобы ящик открывался только внутри определенного div в моем приложении чата, созданном с помощью Shadecdn/ui? Я хочу, чтобы ящик открывался внутри определенного div, то есть я хочу, чтобы он открывался только на экране чата, а не на всей странице.

Я хочу, чтобы он открывался только на экране чата, а не на всей странице.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. В components/ui/drawer.tsx замените fixed className в <DrawerOverlay /> и <DrawerContent /> на absolute.

  2. Не рендерить <DrawerPortal>. измените строку 31, 44 с <DrawerPortal> на <>.

  3. При рендеринге ящика укажите родительский <Chat />relative className.

export default function Page() {
  return (
    <div className = "min-h-screen flex justify-center items-center">
      <div className = "size-96 bg-sky-300 relative overflow-hidden">
        <Drawer>
          <DrawerTrigger>Trigger</DrawerTrigger>
          <DrawerContent>
            Content
          </DrawerContent>
        </Drawer>
      </div>
    </div>
  )
}

components/ui/drawer.tsx:

'use client';

import * as React from 'react';
import { Drawer as DrawerPrimitive } from 'vaul';

import { cn } from "@/lib/utils";

const Drawer = ({ shouldScaleBackground = true, ...props }: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
  <DrawerPrimitive.Root shouldScaleBackground = {shouldScaleBackground} {...props} />
);
Drawer.displayName = 'Drawer';

const DrawerTrigger = DrawerPrimitive.Trigger;

const DrawerPortal = DrawerPrimitive.Portal;

const DrawerClose = DrawerPrimitive.Close;

const DrawerOverlay = React.forwardRef<
  React.ElementRef<typeof DrawerPrimitive.Overlay>,
  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
>(({ className, ...props }, ref) => (
  <DrawerPrimitive.Overlay ref = {ref} className = {cn('absolute inset-0 z-50 bg-black/80', className)} {...props} />
));
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;

const DrawerContent = React.forwardRef<
  React.ElementRef<typeof DrawerPrimitive.Content>,
  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
>(({ className, children, ...props }, ref) => (
  <>
    <DrawerOverlay />
    <DrawerPrimitive.Content
      ref = {ref}
      className = {cn(
        'absolute inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background',
        className,
      )}
      {...props}
    >
      <div className = "mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
      {children}
    </DrawerPrimitive.Content>
  </>
));
DrawerContent.displayName = 'DrawerContent';

const DrawerHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
  <div className = {cn('grid gap-1.5 p-4 text-center sm:text-left', className)} {...props} />
);
DrawerHeader.displayName = 'DrawerHeader';

const DrawerFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
  <div className = {cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />
);
DrawerFooter.displayName = 'DrawerFooter';

const DrawerTitle = React.forwardRef<
  React.ElementRef<typeof DrawerPrimitive.Title>,
  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
>(({ className, ...props }, ref) => (
  <DrawerPrimitive.Title
    ref = {ref}
    className = {cn('text-lg font-semibold leading-none tracking-tight', className)}
    {...props}
  />
));
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;

const DrawerDescription = React.forwardRef<
  React.ElementRef<typeof DrawerPrimitive.Description>,
  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
>(({ className, ...props }, ref) => (
  <DrawerPrimitive.Description ref = {ref} className = {cn('text-sm text-muted-foreground', className)} {...props} />
));
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;

export {
  Drawer,
  DrawerPortal,
  DrawerOverlay,
  DrawerTrigger,
  DrawerClose,
  DrawerContent,
  DrawerHeader,
  DrawerFooter,
  DrawerTitle,
  DrawerDescription,
};

Вот и все. Возможно, вам придется изменить некоторые стили в соответствии с вашим вариантом использования.

Привет, Ахмед, большое спасибо, у меня это сработало. Ваше пошаговое объяснение и объяснение с примерами кода очень приятно, спасибо за быстрый ответ.

huseyinaltun 05.04.2024 01:51

Знаете ли вы, как предотвратить применение стиля по умолчанию к HTML и телу? Возникает ситуация, когда добавляются HTML и стили тела, и я хочу предотвратить это.

huseyinaltun 05.04.2024 03:09

стили взяты с vaulgithub.com/emilkowalski/vaul/blob/main/src/index.tsx У вас есть возможность исправить пакет или скопировать его в свои файлы и изменить (vaul — это лицензия MIT).

Ahmed Abdelbaset 05.04.2024 03:51

или переопределить их с помощью CSS !important

Ahmed Abdelbaset 05.04.2024 03:51

Спасибо. Когда я посмотрел ссылки на хранилище, я заметил, что есть «вложенное» свойство. Если установлено значение true, вычисления останавливаются и отображается только статус блокировки. Однако, похоже, это пока меня не блокирует.

huseyinaltun 05.04.2024 05:16

Другие вопросы по теме