Skip to main content

Customize skin

Let's start to create a skin from scratch. to create a skin just you need to know the props available. Check the offcicial documentation to know about the required element prop.

Skin folder struncture

you can store your skin as your needs. here is a way to store the skins in a proper way. set the skin folder in your src src/skins/...

Project file
├── src
│ └── skins
│ ├── default skins
│ │ └──element skins folder
│ │ └──element skins
│ └── optional skin
│ └──element skins folder
│ └──other skins for the element
│ └──other skins for the element

UI designing

For the styling you can use the tailwind or bootstrap or dispaly it with an svg

install tailwind via npm
npm install -D tailwindcss postcss autoprefixer
install tailwind via pnpm
pnpm add -D tailwindcss postcss autoprefixer
install bootstrap via npm
npm install bootstrap
install bootstrap via pnpm
pnpm add bootstrap

Let's Start to Create the Skin

To create a skin, define a React functional component that takes the appropriate props. Refer to the documentation for the property definitions (type definition interface name) to pass the correct props.

Example: Tab Item Element Skin

TabItemSkin
  const TabItemSkin: com.qbit.Skin<TabItemProps> = (props) => {
const { name, onClick, disabled, active,className } = props;
return (
<button
className={`${className} ${active ? 'border-b-2 border-blue-500 text-blue-500' : 'text-gray-500 hover:text-blue-500'} ${disabled ? 'cursor-not-allowed opacity-50' : ''}`}
onClick={(e) => {
if (!disabled) {
onClick?.(e);
}
}}
>
{name}
</button>
);
};

export default TabItemSkin;

For instance, if you're creating a skin for a tab item, you can use TabItemProps as shown below:

const TabItemSkin: com.qbit.Skin<TabItemProps> = (props) => {
  • The component uses the TypeScript generic type com.qbit.Skin<TabItemProps>, which enforces that the props (TabItemProps) adhere to the provided type definition.
  • TabItemProps defines the properties that can be passed to this component. (The exact definition of TabItemProps is not included here, but its usage is demonstrated below.)

Destructuring Props

You can destructure the props for easier access:

const { name, onClick, disabled, active, className } = props;
  • Props Explanation:
    • name: The label or text displayed inside the button.
    • onClick: An optional function executed when the button is clicked.
    • disabled: A boolean indicating whether the button is disabled.
    • active: A boolean indicating whether this tab is currently active.
    • className: A custom class name string for additional CSS styling.

Rendering the Button

The skin renders a <button> element, styled dynamically using Tailwind CSS classes.

Dynamic Styling

  • The className combines custom classes and conditional classes based on the active and disabled props.

  • Styling Behavior:

    • If active is true:
      • Adds styles: border-b-2 border-blue-500 text-blue-500 (active tab appearance with a blue underline and blue text).
    • If active is false:
      • Adds styles: text-gray-500 hover:text-blue-500 (gray text by default, turning blue on hover).
    • If disabled is true:
      • Adds styles: cursor-not-allowed opacity-50 (disables pointer events and makes the button semi-transparent).

Click Handler

  • The button’s click event is handled via the onClick function passed as a prop.
  • If disabled is true, the onClick function is not executed.
  • Optional chaining (onClick?.(e)) ensures the function is only called if it exists.

Button Content

  • The {name} prop displays the name inside the button.

Skin usage

here is how to use your skin in the required page. for render your desired skin pass it into your element's parent element's renderers prop

  • For an example

    Use the tabskin in a page
       <Tab
    keyExtractor={(value: string, i: number) => `${value}-${i}`}
    renderers={{ renderer: TabSkin, childRenderer: TabItemSkin }}
    >
    <TabItem active={true} name="Tasks" content={<SampleContent />} />
    <TabItem active={false} name="Removed task" content={<Element />} />
    <TabItem active={false} name="Sign in/up" content={<Login />} />
    </Tab>
  • Here into the renderers prop you can pass the parent element skin into the renderer prop and children's skin into the childRendrer prop

  • You should pass the childRenderer is a required one

caution