iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
Modern Web

產品設計師的 Chakra UI & framer-motion 實作筆記系列 第 11

Chakra UI 打造設計系統系列11: multipart components, Modal

  • 分享至 

  • xImage
  •  

multipart components

已經介紹完像是 Button 類型的 UI 元件該如何利用 theme 客製化來達成設計稿上的 UI
可以持續用相同的方式來完成其他單一構成的元件。
但遇到像是內建的複合元件,實作方式有些許變化,今天會分析 multipart components 的構成,以及完成 Modal
這個元件。


複合元件

多個構成的元件在 style config 上加上 part 來定義有哪些組件,定義完後也必須分別用物件的形式去定義個別的 style (baseStyle, sizes, and variant)。

const Modal = {
  //元件的哪一部分
  parts: [],
  // 各部分的 base styles
  baseStyle: {},
  // 各部分的 size styles 
  sizes: {},
  // 各部分的 variant styles 
  variants: {},
  // 預設 `size` or `variant` values
  defaultProps: {},
};

export default Modal;

我們先以 Modal 作為舉例,先看原本官方 Modal 的文件

https://ithelp.ithome.com.tw/upload/images/20220924/20151365sN3shKYruy.jpg

假設我們要客製化的項目為 ModalOverlay、ModalBody

 parts: [ 'modalOverlay','modalBody'],

跟改 baseStyle ,是需要各自分別定義好樣式,如下

baseStyle: {
    modalOverlay: {
      bgColor: 'blackAlpha.700'
    },
    modalBody: {
      rounded: 'lg',
    },
  },

ps: blackAlpha 是 Chakara UI 內建的顏色群以透明度為依據, blackAlpha.700 及透明度 70% 的黑

sizes 方面 overlay 的尺寸是固定滿版,那我們可以只針對 modalBody 去做定義

sizes: {
    sm: {
      modalBody: {
        fontSize: '14px',
        w: '300px'
        h: 400px,
      },
    },
    md: {
      modalBody: {
        fontSize: '16px',
        w: '400px'
        h: '500px',
      },
    },
  },

同樣的我們今天如果在製作自己的複合元件,要使用同樣 style 方式也是可以的
會用到類似但是不一樣的一個 hook : useMultiStyleConfig

const styles = useMultiStyleConfig(themeKey, props)

使用的方式比單一個元件所使用的 useStyleConfig 多了兩個要注意的地方
傳入元件的 style 要使用 dot notation 指定 __css={styles.modalBody}__css={styles.modalOverlay}

在整個複合元件中負責包起來的母元件中 要添加 StylesProvider

function Modal(props) {
  const { size, variant, children, ...rest } = props
  
  const styles = useMultiStyleConfig('Modal', { size, variant })

  return (
    <Flex __css={styles.modal} {...rest}>
      {/*  Mount the computed styles on `StylesProvider` */}
      <StylesProvider value={styles}>{children}</StylesProvider>
    </Flex>
  )
}

其子元件使用 useStyles 這個 hook 來讀取 styles provider 所提供的 style

function ModalOverlay(props) {
  //  Read computed `item` styles from styles provider
  const styles = useStyles()
  return <Box as='button' __css={styles.modalOverlay} {...props} />
}

上一篇
Chakra UI 打造設計系統10: Button UI state
下一篇
Chakra UI 打造設計系統12:Modal上
系列文
產品設計師的 Chakra UI & framer-motion 實作筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言