Feedback

Filtered Out

The list is empty because of the filters, not by itself: the active conditions are listed and the number of records waiting after a reset is named.

  • empty
  • filters
  • reset
  • list

Preview

1440pxHost theme

Use it with AI

  1. 1. Copy the link.
  2. 2. Write to your agent in your own words and drop the link into the sentence.
  3. 3. The agent opens the link and installs the component from the registry.

put this in the header: https://vibeui.ru/c/empty-006?lang=en

Nothing matches these filters

Записи есть — их скрывают условия ниже. Без них в списке 248 записей.

  • Статус: черновик
  • Автор: я
  • За последние 7 дней
Show the full instructions

What the link says, spelled out. Use it when your agent cannot open links — paste this text instead.

# Install and place "empty-006" (Filtered Out) from VibeUI

## 1. Install first — do not skip, do not recreate
Run this exact command before writing any code:
npx shadcn@latest add https://vibeui.ru/r/empty-006.json

Registry item: https://vibeui.ru/r/empty-006.json
Installs to: components/vibeui/empty-006.tsx (the exact path follows this project's components.json aliases).
npm dependencies: none.
Registry dependencies: none.

Install it from the registry. Do not recreate it from the description,
do not substitute a similar component from another library, and do not
rewrite it to match the project's existing style.

## 2. What it is
The list is empty because of the filters, not by itself: the active conditions are listed and the number of records waiting after a reset is named.

An empty list after filtering: a funnel, a heading, the active conditions as chips, the unfiltered record count and one reset button with a condition counter. Zero dependencies, one file, its own palette.

## 3. How to use it
import { Empty006 } from "@/components/vibeui/empty-006"

<Empty006 filters={["Status: draft"]} total={248} onReset={clearFilters} />

Read the installed file for the full prop list.

## 4. Where to place it
This is a small inline component. Put it exactly where the user asked,
inside the existing markup. Do not create a new page, section or
wrapper for it. If a similar control already sits in that spot,
replace it instead of adding a second one.

Placement: ___
(The user fills this line in. If it is still blank, ask where to put it
instead of guessing.)

## 5. Keep exactly as installed
- the local --vibeui-empty-006-* palette — do not swap it for your theme tokens
- listing the active conditions: without them nobody knows what a reset removes
- the unfiltered record count — it proves the data is there and makes the reset worth pressing
- the single reset action: offering "create a record" here is harmful, nothing was lost
- the condition counter on the button: it shows the size of the undo
- role="status": the list disappearing has to be heard

## 6. You may change
- the filters array — the labels of the active conditions
- total — how many records come back after the reset
- title — the empty state heading
- the onReset handler — it is what clears the filters
- the accent through the accent prop — it colours the funnel, the chips and the button

## 7. Rules
- With no filters this screen is wrong: an empty section looks different and offers a first step.
- The conditions must match the ones actually applied: a mismatch is worse than showing none.
- The reset should not silently drop the search query — the results would change twice.
- Do not lift the CSS variables into globals.css: the component has to stay a single file.

## 8. Verify
- it renders with no console errors;
- it looks like the preview on the VibeUI page you copied this from;
- if it does not, you changed something listed in section 5 — put it back.

For developers

npx shadcn@latest add https://vibeui.ru/r/empty-006.json
https://vibeui.ru/r/empty-006.json

Компонент самодостаточен: один файл, без зависимостей, собственная палитра в локальных переменных --vibeui-empty-006-*. Серверный: хуков нет. Знак-воронка собран из двух псевдоэлементов, верхний обрезан clip-path. Условия выложены списком ul с чипами, число записей печатается через toLocaleString. Блок объявлен role="status", подложка своя и светлая.

Component source

The same file your agent installs. Here in case you would rather copy it by hand.

import type { ComponentPropsWithoutRef, CSSProperties } from "react"

export type Empty006Props = Omit<
  ComponentPropsWithoutRef<"div">,
  "children" | "title"
> & {
  filters?: string[]
  total?: number
  title?: string
  resetLabel?: string
  onReset?: () => void
  accent?: string
}

// Идея компонента: список опустел не сам по себе, а из-за фильтров. Поэтому
// на экране перечислено, что сейчас включено, и сказано, сколько записей
// вернётся после сброса. Действие ровно одно — снять фильтры: предлагать
// заодно «создать запись» здесь вредно, данные ведь есть.
const STYLES = `
:where([data-vibeui-block="empty-006"]){
--vibeui-empty-006-bg:oklch(1 0 0);
--vibeui-empty-006-fg:oklch(0.21 0.014 265);
--vibeui-empty-006-muted:oklch(0.55 0.014 265);
--vibeui-empty-006-border:oklch(0.91 0.006 265);
--vibeui-empty-006-accent:oklch(0.55 0.17 265);
--vibeui-empty-006-font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
}
[data-vibeui-block="empty-006"]{
display:flex;flex-direction:column;align-items:center;gap:0.625rem;
width:100%;max-width:24rem;box-sizing:border-box;padding:1.5rem 1.25rem;
text-align:center;
background:var(--vibeui-empty-006-bg);
border:1px solid var(--vibeui-empty-006-border);border-radius:1rem;
font-family:var(--vibeui-empty-006-font);color:var(--vibeui-empty-006-fg);
}
/* Воронка: два прямоугольника сходятся в носик — знак «отфильтровано». */
[data-vibeui-block="empty-006"] [data-part="mark"]{
position:relative;width:2.25rem;height:2.25rem;color:var(--vibeui-empty-006-accent);
}
[data-vibeui-block="empty-006"] [data-part="mark"]::before{
content:"";position:absolute;left:0.125rem;top:0.375rem;width:2rem;height:0.875rem;
border:2px solid currentColor;border-bottom:0;
clip-path:polygon(0 0,100% 0,64% 100%,36% 100%);opacity:.55;
}
[data-vibeui-block="empty-006"] [data-part="mark"]::after{
content:"";position:absolute;left:50%;top:1.25rem;width:0.375rem;height:0.75rem;
margin-left:-0.1875rem;border-radius:0 0 0.125rem 0.125rem;background:currentColor;
}
[data-vibeui-block="empty-006"] [data-part="title"]{margin:0;font-size:1rem;font-weight:680;line-height:1.3}
[data-vibeui-block="empty-006"] [data-part="text"]{
margin:0;max-width:32ch;font-size:0.8125rem;line-height:1.5;color:var(--vibeui-empty-006-muted);
}
/* Условия перечислены поимённо: иначе непонятно, что именно сбрасывать. */
[data-vibeui-block="empty-006"] [data-part="chips"]{
display:flex;flex-wrap:wrap;justify-content:center;gap:0.375rem;margin:0.125rem 0 0;padding:0;list-style:none;
}
[data-vibeui-block="empty-006"] [data-part="chip"]{
display:inline-flex;align-items:center;gap:0.375rem;
padding:0.25rem 0.625rem;border-radius:9999px;
background:color-mix(in oklab,var(--vibeui-empty-006-accent) 10%,transparent);
color:var(--vibeui-empty-006-fg);font-size:0.75rem;font-weight:650;
}
[data-vibeui-block="empty-006"] [data-part="dot"]{
width:0.375rem;height:0.375rem;border-radius:9999px;background:var(--vibeui-empty-006-accent);
}
[data-vibeui-block="empty-006"] [data-part="action"]{
appearance:none;border:0;cursor:pointer;margin-top:0.5rem;
height:2.5rem;padding:0 1.125rem;border-radius:0.75rem;
background:var(--vibeui-empty-006-accent);color:oklch(0.99 0.01 265);
font:inherit;font-size:0.875rem;font-weight:650;
}
[data-vibeui-block="empty-006"] [data-part="action"]:focus-visible{outline:2px solid var(--vibeui-empty-006-accent);outline-offset:2px}
@media (prefers-reduced-motion:reduce){[data-vibeui-block="empty-006"] *{animation:none!important;transition:none!important}}
`

const DEFAULT_FILTERS = ["Статус: черновик", "Автор: я", "За последние 7 дней"]

/**
 * Пустой список после фильтров: видно условия и сколько вернётся после сброса.
 * Один файл, ноль зависимостей, собственная палитра.
 */
export function Empty006({
  filters = DEFAULT_FILTERS,
  total = 248,
  title = "Под фильтры ничего не подошло",
  resetLabel = "Сбросить фильтры",
  onReset,
  accent,
  className,
  style,
  ...props
}: Empty006Props) {
  const palette = {
    ...(accent ? { "--vibeui-empty-006-accent": accent } : null),
    ...style,
  } as CSSProperties

  return (
    <>
      <style href="vibeui-empty-006" precedence="medium">
        {STYLES}
      </style>
      <div
        {...props}
        data-vibeui-block="empty-006"
        role="status"
        className={className}
        style={palette}
      >
        <span data-part="mark" aria-hidden="true" />
        <h3 data-part="title">{title}</h3>
        <p data-part="text">
          Записи есть — их скрывают условия ниже. Без них в списке{" "}
          {total.toLocaleString("ru-RU")} записей.
        </p>
        <ul data-part="chips">
          {filters.map((filter) => (
            <li key={filter} data-part="chip">
              <span data-part="dot" aria-hidden="true" />
              {filter}
            </li>
          ))}
        </ul>
        <button type="button" data-part="action" onClick={onReset}>
          {resetLabel}
          {filters.length ? ` · ${filters.length}` : ""}
        </button>
      </div>
    </>
  )
}