انتقل إلى المحتوى
uiify

Skeleton

أشكال كمحتوى مؤقت أثناء تحميل المحتوى.

المتصفحات
Chrome 123+Firefox 121+Safari 17.5+
الفئة
0
الحجم المضغوط
317 B
ميزانية التخطيط القسري
0 ms
ميزانية axe
0
متوافق مع SSR
نعم
العقد المنشور
بيئة الاختبار

المختبر

Skeleton

Text

الملف الشخصي

Media

Table

Pulse, shimmer, static

Load and reveal

Loading workspace…
import { Skeleton } from "@gunkin/uiify";

export default function Example() {
  return <Skeleton className="" width={240} height={20} />;
}
@layer components {
  [data-uiify-skeleton] {
    inline-size: var(--uiify-skeleton-w, 100%);
    min-block-size: var(--uiify-skeleton-h, 1rem);
    border-radius: var(--radius-sm);
  }
  [data-uiify-skeleton][data-state="loading"] {
    block-size: var(--uiify-skeleton-h, 1rem);
    background: var(--muted);
    animation: uiify-skeleton-pulse 1.8s ease-in-out infinite;
  }
  [data-uiify-skeleton][data-shape="circle"] {
    border-radius: 50%;
    corner-shape: round;
  }
  [data-uiify-skeleton][data-variant="shimmer"][data-state="loading"] {
    background: linear-gradient(90deg, var(--muted), var(--secondary), var(--muted));
    background-size: 200% 100%;
    animation: uiify-skeleton-shimmer 1.5s linear infinite;
  }
  [data-uiify-skeleton][data-variant="none"] {
    animation: none;
  }
  [data-uiify-skeleton][data-state="loaded"] {
    animation: uiify-skeleton-reveal 200ms ease-out;
  }

  @keyframes uiify-skeleton-pulse {
    50% {
      opacity: 0.45;
    }
  }

  @keyframes uiify-skeleton-shimmer {
    to {
      background-position: -200% 0;
    }
  }

  @keyframes uiify-skeleton-reveal {
    from {
      opacity: 0;
    }
    to {
      opacity: 1;
    }
  }

  @media (prefers-reduced-motion: reduce) {
    [data-uiify-skeleton] {
      animation: none;
    }
  }
}
import { Skeleton } from "@gunkin/uiify";

export default function Example() {
  return (
    <Skeleton
      className={
        "[inline-size:var(--uiify-skeleton-w,_100%)] [min-block-size:var(--uiify-skeleton-h,_1rem)] rounded-sm data-" +
        "[state=loading]:[block-size:var(--uiify-skeleton-h,_1rem)] data-[state=loading]:bg-muted data-[state=loadin" +
        "g]:[animation:uiify-skeleton-pulse_1.8s_ease-in-out_infinite] data-[shape=circle]:rounded-[50%] data-[shape" +
        "=circle]:[corner-shape:round] data-[variant=shimmer]:data-[state=loading]:[background-image:linear-gradient" +
        "(90deg,_var(--muted),_var(--secondary),_var(--muted))] data-[variant=shimmer]:data-[state=loading]:bg-trans" +
        "parent data-[variant=shimmer]:data-[state=loading]:[background-size:200%_100%] data-[variant=shimmer]:data-" +
        "[state=loading]:[animation:uiify-skeleton-shimmer_1.5s_linear_infinite] data-[variant=none]:[animation:none" +
        "] data-[state=loaded]:[animation:uiify-skeleton-reveal_200ms_ease-out] motion-reduce:[animation:none]"
      }
      width={240}
      height={20}
    />
  );
}
/* app.css */

@layer reset, ui, app, tokens, base, demo, components, utilities, theme;

@import "@gunkin/uiify/styles/reset";

@import "@gunkin/uiify/components/behavior.css";

@import "@gunkin/uiify/styles/tokens";

@import "@gunkin/uiify/styles/tailwind";

@import "tailwindcss/utilities.css";

@theme { --spacing: 0.25rem; --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; }

@source inline('[inline-size:var(--uiify-skeleton-w,_100%)] [min-block-size:var(--uiify-skeleton-h,_1rem)] rounded-sm data-[state=loading]:[block-size:var(--uiify-skeleton-h,_1rem)] data-[state=loading]:bg-muted data-[state=loading]:[animation:uiify-skeleton-pulse_1.8s_ease-in-out_infinite] data-[shape=circle]:rounded-[50%] data-[shape=circle]:[corner-shape:round] data-[variant=shimmer]:data-[state=loading]:[background-image:linear-gradient(90deg,_var(--muted),_var(--secondary),_var(--muted))] data-[variant=shimmer]:data-[state=loading]:bg-transparent data-[variant=shimmer]:data-[state=loading]:[background-size:200%_100%] data-[variant=shimmer]:data-[state=loading]:[animation:uiify-skeleton-shimmer_1.5s_linear_infinite] data-[variant=none]:[animation:none] data-[state=loaded]:[animation:uiify-skeleton-reveal_200ms_ease-out] motion-reduce:[animation:none]');

@layer base { :root { --uiify-control-text: var(--text-sm); } @media (pointer: coarse) { :root { --uiify-control-text: var(--text-base); } } }

/* Authored animation and registered properties used by the Tailwind skin.
 * Visual rules belong in utility recipes; only at-rule definitions live here. */
@layer components {
  @keyframes uiify-presence-in {
    from {
      opacity: 0;
      scale: var(--presence-scale);
    }
  }
}

@layer components {
  @keyframes uiify-presence-out {
    to {
      opacity: 0;
      scale: var(--presence-scale);
    }
  }
}

@property --uiify-spinner-tail {
  syntax: "<angle>";
  inherits: false;
  initial-value: 0deg;
}

@property --uiify-spinner-length {
  syntax: "<angle>";
  inherits: false;
  initial-value: 36deg;
}

@layer components {
  @keyframes uiify-spinner-rotate {
    to {
      transform: rotate(360deg);
    }
  }
}

@layer components {
  @keyframes uiify-spinner-orbit {
    0% {
      --uiify-spinner-tail: 0deg;
      --uiify-spinner-length: 36deg;
    }

    50% {
      --uiify-spinner-tail: 90deg;
      --uiify-spinner-length: 324deg;
    }

    100% {
      --uiify-spinner-tail: 360deg;
      --uiify-spinner-length: 36deg;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-pulse {
    50% {
      opacity: 0.45;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-shimmer {
    to {
      background-position: -200% 0;
    }
  }
}

@layer components {
  @keyframes uiify-skeleton-reveal {
    from {
      opacity: 0;
    }
    to {
      opacity: 1;
    }
  }
}

@property --candle-body-height {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-body-top {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --candle-slot {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 100%;
}

@property --candle-wick-height {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-wick-top {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --candle-x {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 0%;
}

@property --candle-scale {
  syntax: "<number>";
  inherits: true;
  initial-value: 1;
}

@property --line-y {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --line-prev-y {
  syntax: "<percentage>";
  inherits: true;
  initial-value: 50%;
}

@property --line-count {
  syntax: "<integer>";
  inherits: false;
  initial-value: 1;
}

@property --line-scale {
  syntax: "<number>";
  inherits: true;
  initial-value: 1;
}

@layer components {
  @keyframes uiify-otp-input-caret-blink {
    50% {
      opacity: 0;
    }
  }
}

API

Skeleton

الخاصيةالنوعافتراضيالوصف
variant"pulse" | "shimmer" | "none""pulse"حركة المحتوى المؤقت. ويعطّل تفضيل تقليل الحركة التحريك وحركة إظهار المحتوى.
circlebooleanfalseيعرض محتوى مؤقتًا دائريًا بدلًا من المستطيل.
heightnumber | string—ارتفاع المحتوى المؤقت؛ ويُفسّر العدد بالبكسل.
loadingbooleantrueتكشف false العناصر الأبناء داخل الغلاف نفسه، مع الحفاظ على الأبعاد والمرجع؛ وتحرّك ورقة الأنماط المختارة عملية الإظهار.
widthnumber | string—عرض المحتوى المؤقت؛ ويُفسّر العدد بالبكسل.
childrenReactNode—المحتوى الحقيقي الذي يُعرض حين تصبح loading مساوية لـ false.
renderReactElement | ((props, state) => ReactElement)—استبدل العنصر المعروض مع الحفاظ على توصيلات السلوك وإمكانية الوصول.

لوحة المفاتيح

المفتاحالإجراء

إمكانية الوصول

يحافظ Skeleton على غلاف ثابت أثناء التحميل وإظهار المحتوى. تحمل العناصر المؤقتة أثناء التحميل aria-hidden؛ ويحتفظ الأبناء بعد التحميل بدلالاتهم الأصلية. اختر pulse أو shimmer أو none. يعطّل تفضيل تقليل الحركة التحريك. صِف التحميل في المنطقة الحاوية بدلًا من إعطاء كل هيكل زخرفي حالة حية.

نقاط التنسيق

data-uiify-skeletondata-statedata-variantdata-shape--uiify-skeleton-w--uiify-skeleton-h
تُرجمت هذه الصفحة آليًا ولم تُراجع بعد.