برنامه نویسی

نحوه ساخت کامپوننت متن با کامپوننت های React، TypeScript و Styled

در یوتیوب تماشا کنید | 🐙 گیت هاب | 🎮 نسخه ی نمایشی

متن احتمالاً پر استفاده ترین مؤلفه در هر برنامه ای است. امروز می‌خواهم یک مؤلفه متن قابل استفاده مجدد را به اشتراک بگذارم که در کار توسعه جلویی من بسیار مفید است و باید در وقت شما نیز صرفه‌جویی کند.

جزء متن

این Text کامپوننت فقط یک پاراگراف استایل دار است که می توانیم با عبور دادن آن به هر عنصر دیگری مانند div، span یا heading تبدیل کنیم. as ویژگی. همچنین، می‌توانیم آن را به هر شکلی که دوست داریم، با استفاده از styles دارایی یا پیچیدن آن با styled تابع. به دلیل این انعطاف پذیری، به عنوان یک بلوک ساختمانی برای اجزای دیگر عمل می کند.

import styled, { DefaultTheme, css } from "styled-components"

const getTextColorRecord = ({ colors }: DefaultTheme) =>
  ({
    regular: colors.text,
    supporting: colors.textSupporting,
    supporting2: colors.textSupporting2,
    supporting3: colors.textSupporting3,

    primary: colors.primary,
    attention: colors.attention,
    alert: colors.alert,
    success: colors.success,
    reversed: colors.background,
    contrast: colors.contrast,
  } as const)

type TextWeight = "regular" | "semibold" | "bold"
const fontWeight: Record<TextWeight, number> = {
  regular: 400,
  semibold: 500,
  bold: 600,
}

type TextHeight = "small" | "regular" | "large"
const lineHeight: Record<TextHeight, number> = {
  small: 1,
  regular: 1.2,
  large: 1.5,
}

export type TextColor = keyof ReturnType<typeof getTextColorRecord>

export interface TextProps {
  color?: TextColor
  weight?: TextWeight
  size?: number
  height?: TextHeight
  centered?: boolean
  cropped?: boolean
  nowrap?: boolean
}

export const oneRemInPx = 16

const getFontSize = (sizeInPx: number) => {
  const sizeInRem = sizeInPx / oneRemInPx

  return `${sizeInRem}rem`
}

export const Text = styled.p<TextProps>`
  margin: 0;
  padding: 0;
  overflow-wrap: break-word;

  ${({ color, theme }) =>
    color &&
    css`
      color: ${getTextColorRecord(theme)[color].toCssValue()};
    `}
  ${({ weight }) =>
    weight &&
    css`
      font-weight: ${fontWeight[weight]};
    `}
  ${({ height }) =>
    height &&
    css`
      line-height: ${lineHeight[height]};
    `}
  ${({ size }) =>
    size &&
    css`
      font-size: ${getFontSize(size)};
    `}
  ${({ centered }) =>
    centered &&
    css`
      text-align: center;
    `}

  ${({ nowrap }) =>
    nowrap &&
    css`
      white-space: nowrap;
    `}

  ${({ cropped }) =>
    cropped &&
    css`
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    `}
`
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

برای سازگاری UI ما CSS پیش فرض مرورگر را در ابتدای صفحه بازنشانی می کنیم Text یک ظاهر طراحی شده با حذف حاشیه ها و لایه ها و تنظیم overflow-wrap به break-word برای جلوگیری از سرریز متن از شکستن طرح. سپس با رسیدگی به ویژگی های آن ادامه می دهیم.

بیایید به ویژگی های اضافی که می توانیم به آن منتقل کنیم نگاه کنیم Text جزء. در حالی که می‌توانیم رنگ مجموعه را از طریق styles یا className تنظیم کنیم، اغلب از آن استفاده می‌کنیم color ویژگی. این مجموعه محدودی از رنگ‌های نام‌گذاری شده است، مانند معمولی، پشتیبانی یا هشدار. ما از طریق به همه آنها دسترسی داریم getTextColorRecord تابعی که به نوبه خود بر موضوع مولفه‌های مدل‌دهی شده متکی است. توجه داشته باشید که همه نام ها به جای رنگ زرد یا سفید، رنگ را توصیف می کنند. به این ترتیب می‌توانیم پالت رنگ را تغییر دهیم و بدون تغییر آن، تم‌های جدید اضافه کنیم Text جزء.

این weight ملک می چرخد regular، semibold و bold به 400، 500، 600. معمولاً برای اکثر موارد کافی است. اما شما همچنین می توانید آن را برای موقعیت خود گسترش دهید، و thin یا extrabold گزینه ها برای مثال

این size یک ملک جالب و مورد نظر است. در حالی که یک پیکسل را به عنوان یک عدد ارسال می کنیم، در حال تبدیل به رم است. برای ما ساده تر است که به پیکسل فکر کنیم. فکر می کنیم 16px به عنوان یک اندازه پیش‌فرض، و برای ایجاد یک نوع کوچک‌تر، انتقال آن راحت‌تر است 14px به جای 0.875rem. در عین حال، ما با تبدیل پیکسل ها به رم، برنامه را در دسترس تر می کنیم، به طوری که کاربران می توانند اندازه فونت را در تنظیمات مرورگر خود تغییر دهند و برنامه مطابق با آن تنظیم می شود.

این height دارایی نشان می دهد line-height و می تواند باشد small، regular، یا large، اما ما به ندرت از آن استفاده می کنیم.

در حالی که برخی از افراد ترجیح می دهند انواع متن ها را داشته باشند، با توجه به تجربه من، تکیه بر ویژگی هایی مانند این را عملی تر دیدم size و weight برای ایجاد انواع سبک های متن با این حال، اگر پروژه شما از داشتن انواع سود می برد، می توانید آن را به عنوان یک ویژگی اضافه کنید و سپس یک رکورد از سبک ها برای هر گونه داشته باشید.

بالاخره وجود دارند centered، cropped، و nowrap کمک کننده هایی که خود توضیح دهنده هستند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا