Middle

Sidebar middle region: caption-headed cell groups (1-4 blocks).

Installation

$npx @309-thingspire/ui@latest add middle

Usage

import { Middle } from "@/components/middle/middle"
<Middle />

Examples

Live preview rendered from Middle.preview.tsx. Switch to the Code tab to view the underlying component source.

Loading preview…
import React from 'react';

import { spacing } from '../../style-tokens';
import { Additional } from '../Additional/Additional';
import { CellItem } from '../CellItem/CellItem';

import type { MiddleProps } from './Middle.types';

const SIDEBAR_WIDTH = spacing.primitive['256'] + spacing.scale['24'];

const DEFAULT_BLOCKS = [
  {
    id: 'block-1',
    heading: 'Teamspaces',
    items: Array.from({ length: 5 }, (_, index) => ({
      id: `block-1-item-${index + 1}`,
      label: 'Label',
    })),
  },
];

export function Middle({ blocks = DEFAULT_BLOCKS, className, style, onItemClick }: MiddleProps) {
  return (
    <div
      className={className}
      style={{
        width: SIDEBAR_WIDTH,
        boxSizing: 'border-box',
        display: 'flex',
        flexDirection: 'column',
        alignItems: 'flex-start',
        gap: spacing.scale['16'],
        ...style,
      }}
    >
      {blocks.map((block, blockIndex) => {
        const blockId = block.id ?? `block-${blockIndex}`;
        return (
          <div
            key={blockId}
            style={{
              width: '100%',
              display: 'flex',
              flexDirection: 'column',
              alignItems: 'flex-start',
            }}
          >
            <Additional type="caption" text={block.heading} />
            {block.items.map((item, itemIndex) => {
              const itemId = item.id ?? `${blockId}-item-${itemIndex}`;
              return (
                <CellItem
                  key={itemId}
                  type="default"
                  target="default"
                  active={item.active ?? false}
                  disabled={item.disabled ?? false}
                  label={item.label}
                  leadIcon={item.leadIcon}
                  badge={false}
                  tailIcon1={false}
                  tailIcon2={false}
                  onClick={onItemClick ? () => onItemClick(blockId, itemId) : undefined}
                />
              );
            })}
          </div>
        );
      })}
    </div>
  );
}

export default Middle;

API Reference

Props 문서 준비 중입니다. (component-spec.json 추가 시 표시됩니다.)