درجه‌ی دنباله‌دارComet Dial

درجه‌ی چرخشی با دنباله‌ی دنباله‌دار: قوس با کشیدن پر می‌شه، سرِ نشانگر ذراتِ محو پشتِ سر می‌ذاره و عدد با ارقامِ فارسیِ عرض‌ثابت وسط می‌نشینه.

محمدجواد

ساخته شده توسط محمدجواد

سازنده فارسی‌فای، بچه دولوپر

وابستگی‌ها

motion

نوع تعامل

با فشردن و کشیدنِ دایره مقدار عوض می‌شه؛ رهاکردن با سرعت، مومنتوم می‌ده و فنر مقدار رو به نزدیک‌ترین پله می‌نشونه و کمی جهش می‌کنه. توی RTL صفر سمتِ راسته و مقدار به سمتِ چپ زیاد می‌شه؛ توی LTR برعکس. کلیدهای جهت هم کار می‌کنن — توی RTL `ArrowLeft` زیاد می‌کنه.

پراپ‌ها

گزینه‌هایی که می‌تونی به کامپوننت بدی؛ ستاره‌دارها اجباری‌اند.

value
number

حالتِ controlled.

defaultValue
numberپیش‌فرض: 62

مقدارِ اولیه توی حالتِ uncontrolled.

min
numberپیش‌فرض: 0

کمینه‌ی مقدار.

max
numberپیش‌فرض: 100

بیشینه‌ی مقدار.

step
numberپیش‌فرض: 1

گامِ مقدار.

unit
"%" | "٪" | "°" | "dB" | ""پیش‌فرض: "%"% · ٪ · ° · dB ·

یکای کنارِ عدد؛ رشته‌ی خالی یعنی بدونِ یکا.

نصب

۱. این آدرس رو یک‌بار توی components.json بذار تا shadcn مخزن فارسی‌فای رو بشناسه.

components.jsonjson
{
  "registries": {
    "@farsify": "https://farsify.ir/r/{name}.json"
  }
}

۲. بعد با دستورِ زیر کامپوننت رو نصب کن.

npx shadcn@latest add @farsify/comet-dial

پیش‌نیاز: Tailwind CSS v4 و صفحهٔ راست‌به‌چپ dir="rtl".

نمونه

comet-dial.tsxtsx
"use client";

import { useState } from "react";
import { CometDial } from "@/components/farsify/comet-dial";

export function VolumeDial() {
  const [level, setLevel] = useState(62);

  return (
    <CometDial
      value={level}
      onChange={setLevel}
      onChangeEnd={(v) => save(v)}
      label="میزانِ صدا"
      unit="%"
    />
  );
}

// درجه، با دنباله‌ی بلندتر و ضخامتِ بیشتر
<CometDial unit="°" cometReach={240} thickness={7} accent="var(--color-brand)" />

// بدونِ یکا — فقط عددِ وسط، با فنرِ نرم‌تر
<CometDial unit="" speed={10} tapBounce={0.05} />

// صفحه‌ی غیرفعال، برای نمایشِ مقدارِ ثبت‌شده
<CometDial value={40} disabled label="تنظیمِ فعلی" />

نکته‌ها

  • صفر توی RTL سمتِ راسته و مقدار به سمتِ چپ زیاد می‌شه — خواسته‌ی فارسی. این آینه‌سازی توی JS انجام می‌شه، پس کافیه صفحه `dir="rtl"` باشه؛ هیچ propِ `rtl`‌ای لازم نیست.
  • ارقام به‌صورتِ فارسی رندر می‌شن و هر رقم توی جعبه‌ی عرض‌ثابتِ ۰٫۶۹۴em می‌نشینه؛ `tabular-nums` با قلمِ Peyda بی‌اثره و همین جعبه‌ها تنها چیزی‌ان که عدد رو موقعِ چرخیدن از لرزیدن نگه می‌دارن.
  • برای واحدی غیر از درصد، `unit` رو عوض کن — `°`، `dB` یا رشته‌ی خالی. رشته‌ی خالی یعنی فقط عدد، و عدد خودش وسط می‌مونه.
  • `onChangeEnd` جای مناسب برای ثبت توی سروره: با هر فریمِ کشیدن صدا زده نمی‌شه و فقط وقتی فنر نشست.

مجوز

کد بعد از نصب مالِ خودته؛ هر تغییری خواستی بده و توی پروژه‌ی خودت نگهش دار. برای پروژه‌های شخصی و تجاری آزاده، حتی اگه کدت بسته باشه. فقط اسم و لینک فارسی‌فای رو یه جا توی پروژه نگه دار.