Bagaimana kami meninggalkan penggunaan Sistem Styled untuk membuat komponen dan menciptakan sepeda kami sendiri

Halo semuanya! Nama saya Sasha, saya adalah co-founder dan kepala pengembang paruh waktu di Quarkly. Dalam artikel ini saya ingin berbicara tentang bagaimana konsep CSS atom, yang kami patuhi, ditambah dengan kekurangan fungsionalitas Styled-System (dan Rebass, sebagai kasus khusus penggunaan perpustakaan ini) mendorong kami untuk membuat alat kami sendiri, yang kami sebut Atomize.

Pembukaan kecil. Proyek Quarkly kami adalah campuran dari editor grafis (seperti Figma, Sketch) dan desainer situs (seperti Webflow) dengan penambahan fungsi yang melekat pada IDE klasik. Tentang Quarkly, kami akan menulis posting terpisah, ada sesuatu untuk diceritakan dan apa yang harus ditampilkan, tetapi hari ini kita akan berbicara tentang Atomisasi yang disebutkan di atas.

Atomize adalah dasar dari seluruh proyek dan memungkinkan kami untuk memecahkan masalah yang tidak mungkin atau sulit untuk diselesaikan menggunakan Styled-System dan Rebass. Minimal, solusinya akan jauh kurang elegan.

Jika ada sedikit waktu untuk mengalahkan seluruh pos sekarang, maka Anda bisa lebih terbiasa dengan Atomisasi di GitHub kami .

Dan untuk membuat kenalan lebih menyenangkan, kami meluncurkan kompetisi untuk merakit komponen reaksi menggunakan Atomize. Lebih lanjut tentang ini di akhir posting.

Bagaimana semua ini dimulai


Mulai mengembangkan Quarkly, kami sepakat bahwa kami ingin memberi pengguna kami kemampuan untuk mengeset pada komponen, tetapi tanpa perlu menggunakan file CSS yang terpisah. Untuk membuat kode seminimal mungkin, tetapi pertahankan semua fitur CSS, berbeda dengan gaya sebaris.

Tugas ini tidak inovatif dan, pada pandangan pertama, sepenuhnya diselesaikan dengan bantuan Styled-System dan Rebass. Tetapi fungsi ini tidak cukup bagi kami, dan selain itu kami mengalami masalah berikut:

  • kerja tidak nyaman dengan breakpoints;
  • kurangnya kemampuan untuk menulis gaya untuk negara melayang, fokus dll;
  • Mekanisme kami menangani topik tampaknya tidak cukup fleksibel.

Apa itu Atomize (secara singkat)


gambar

Dari fitur-fitur utama Atomize, kami dapat menyoroti yang berikut ini:

  • kemampuan untuk menggunakan variabel dari topik dalam properti css-komposit;
  • dukungan untuk hover dan kelas pseudo lainnya;
  • alias pendek untuk setiap properti (seperti di emmet);
  • kemampuan untuk menentukan gaya untuk breakpoint tertentu, sambil mempertahankan keterbacaan markup;
  • antarmuka minimalis.

Atomize memiliki dua tujuan utama:

  • membuat komponen yang mendukung CSS atomik dan tema;
  • membuat widget untuk pengeditan interaktif di proyek Quarkly.

Atomisasi instruksi untuk digunakan


Sebelum mulai bekerja, perlu untuk menetapkan dependensi:

npm i react react-dom styled-components @quarkly/atomize @quarkly/theme

Atomize adalah pembungkus di sekitar komponen-gaya dan memiliki API serupa. Cukup memanggil metode dengan nama elemen yang diperlukan:

import atomize from '@quarkly/atomize';
 
const MyBox = atomize.div();

Pada output, kami mendapatkan komponen reaksi yang dapat menerima CSS apa pun sebagai alat peraga.
Untuk kemudahan penggunaan, sistem alias properti dikembangkan. Misalnya, bgc === backgroundColor

ReactDOM.render(<MyBox bgc="red" />, root);

Daftar lengkap properti dan alias dapat ditemukan di sini .

Mekanisme pewarisan Bereaksi juga disediakan:

const MySuperComponent = ({ className }) => {
   // some logic here
   return <div className={className} />;
};
 
const MyWrappedComponent = atomize(MySuperComponent);

Bekerja dengan tema


Tentang ini, menurut saya, perlu diceritakan lebih detail. Tema dalam Quarkly didasarkan pada variabel CSS. Fitur kuncinya adalah kemampuan untuk menggunakan kembali variabel dari properti dan topik itu sendiri, tanpa perlu abstraksi tambahan dalam bentuk fungsi templat dan pemrosesan tambahan selanjutnya oleh pengguna.

Untuk menggunakan variabel dari topik, cukup untuk menggambarkan properti dalam topik dan merujuk ke properti ini menggunakan awalan "-".

Variabel dapat digunakan seperti di JSX:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
};
export const MyComp = () => (
   <Theme>
       <Box bgc="--colors-dark" height="100px" width="100px" />
   </Theme>
);

(Warna # 04080C tersedia melalui properti --colors-dark)

Jadi dalam subjek itu sendiri:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
   borders: {
       dark: "5px solid --colors-dark",
   },
};
export const MyComp = () => (
   <Theme>
       <Box border="--borders-dark" height="100px" width="100px" />
   </Theme>
);

(Kami menggunakan kembali variabel dari warna, menghubungkannya ke tema perbatasan)

Untuk warna dalam markup JSX, sintaks yang disederhanakan disediakan:

import Theme from "@quarkly/theme";
 
const theme = {
   colors: {
       dark: "#04080C",
   },
};
export const MyComp = () => (
   <Theme>
       <Box bgc="--dark" height="100px" width="100px" />
   </Theme>
);

Untuk bekerja dengan ekspresi media, tema memiliki breakpoint.
Anda dapat menambahkan awalan ke properti apa pun dalam bentuk nama kunci breakpoint.

import Theme from "@quarkly/theme";
 
const theme = {
   breakpoints: {
       sm: [{ type: "max-width", value: 576 }],
       md: [{ type: "max-width", value: 768 }],
       lg: [{ type: "max-width", value: 992 }],
   },
   colors: {
       dark: "#04080C",
   },
   borders: {
       dark: "5px solid --colors-dark",
   },
};
export const MyComp = () => (
   <Theme>
       <Box
           md-bgc="--dark"
           border="--borders-dark"
           height="100px"
           width="100px"
       />
   </Theme>
);

Kode sumber untuk topik dapat ditemukan di sini .

Efek


Perbedaan utama antara Atomize dan Styled-System adalah "efek". Apa itu dan mengapa itu dibutuhkan?
Mari kita bayangkan bahwa Anda membuat komponen Button, mengubah warna dan perbatasan, tetapi bagaimana cara menetapkan gaya untuk melayang, fokus dll? Di sini efeknya datang untuk menyelamatkan.

Saat membuat komponen, cukup transfer objek dengan konfigurasi:

const MySuperButton = atomize.button({
 effects: {
   hover: ":hover",
   focus: ":focus",
   active: ":active",
   disabled: ":disabled",
 },
});

Kuncinya adalah awalan dalam nama properti, dan nilainya adalah pemilih CSS. Jadi, kami menutup kebutuhan untuk semua kelas semu.

Sekarang jika kita menentukan awalan hover ke properti CSS apa pun, maka itu akan diterapkan dengan efek tertentu. Misalnya, saat Anda mengarahkan kursor ke:

ReactDOM.render(<MySuperButton hover-bgc="blue" />, root);

Anda juga dapat menggabungkan efek dengan ekspresi media:

ReactDOM.render(<MySuperButton md-hover-bgc="blue" />, root);

Beberapa contoh


Untuk memvisualisasikan informasi di atas, mari sekarang kumpulkan beberapa komponen yang menarik. Kami telah menyiapkan dua contoh:


Dalam contoh kedua, kami menggunakan sebagian besar fungsi, serta API eksternal.

Tapi itu belum semuanya


Tujuan kedua dari Atomize, seperti yang Anda sebutkan di atas, adalah untuk membuat widget di Quarkly berdasarkan komponen reaksi kustom.

Untuk melakukan ini, cukup bungkus komponen Anda dalam Atomisasi dan jelaskan konfigurasinya sehingga Quarkly dapat memahami properti apa yang dapat diedit secara interaktif:

export default atomize(PokemonCard)(
 {
   name: "PokeCard",
   effects: {
     hover: ":hover",
   },
   description: {
     // past here description for your component
     en: "PokeCard — my awesome component",
   },
   propInfo: {
     // past here props description for your component
     name: {
       control: "input",
     },
   },
 },
 { name: "pikachu" }
);

Bidang konfigurasi untuk komponen terlihat seperti ini:

  • efek - mendefinisikan kelas pseudo browser (melayang, fokus, dll);
  • deskripsi - deskripsi komponen yang akan muncul ketika kursor melayang di atas namanya;
  • propInfo - konfigurasi kontrol yang akan ditampilkan di panel kanan (props tab).

Cara menentukan alat peraga yang akan ditampilkan di panel kanan (tab alat peraga):

propInfo: {
   yourCustomProps: { //  
       description: { en: "test" }, //    
       control: "input" //  
   }
}

Opsi kontrol yang mungkin:

  • memasukkan
  • Pilih
  • warna
  • fonta
  • bayangan
  • transisi
  • mengubah
  • Saring,
  • Latar Belakang
  • ikon kotak centang,
  • ikon radio,
  • kelompok radio
  • kotak centang.

Satu lagi contoh. Di sini kami menambahkan komponen kami ke sistem dan sekarang kami dapat mengeditnya secara interaktif:


Terima kasih kepada mereka yang menguasai materi sampai akhir! Saya mohon maaf sebelumnya atas kebingungan, ini adalah pengalaman pertama dalam menulis artikel seperti itu. Saya akan berterima kasih atas kritiknya.

Dan sekarang kompetisi!


Untuk sedikit menghangatkan minat komunitas dalam perkenalan yang lebih dekat dengan Atomize, kami memutuskan untuk mengikuti jalur yang sederhana dan mudah dipahami (seperti Atomize itu sendiri) - kami meluncurkan kontes!

Semua informasi tentang syarat, aturan, dan hadiah tersedia di situs resmi kontes.

Singkatnya: untuk berpartisipasi dan menang, Anda perlu membuat (atau menemukan komponen siap pakai) yang menarik dan berguna pada Bereaksi dan menyesuaikannya dengan persyaratan Atomize. Kami akan memilih dan memberikan penghargaan kepada pemenang dalam beberapa kategori sekaligus. Hadiah tambahan dari tim kami jika ditambahkan komponen Anda ke Quarkly dijamin.

All Articles