Розробка кастомних компонентів введення (Input Components) Sanity

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Розробка кастомних компонентів введення (Input Components) Sanity
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Розробка кастомних компонентів введення (Input Components) Sanity

Sanity дозволяє замінити стандартний UI поля на кастомний React компонент. Використовується для складних типів введення: карти, теги з автодоповненням, палітри кольорів, нестандартні редактори.

Базовий кастомний Input

// components/studio/ColorPickerInput.tsx
import { useCallback } from 'react'
import { set } from 'sanity'
import type { StringInputProps } from 'sanity'

const PRESET_COLORS = ['#FF5733', '#33FF57', '#3357FF', '#FF33A8', '#FFAA00', '#00AAFF']

export function ColorPickerInput(props: StringInputProps) {
  const { value, onChange, readOnly } = props

  const handleSelect = useCallback(
    (color: string) => {
      onChange(color ? set(color) : undefined)
    },
    [onChange]
  )

  return (
    <div>
      <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginBottom: 8 }}>
        {PRESET_COLORS.map(color => (
          <div
            key={color}
            onClick={() => !readOnly && handleSelect(color)}
            style={{
              width: 28,
              height: 28,
              borderRadius: '50%',
              background: color,
              cursor: readOnly ? 'default' : 'pointer',
              border: value === color ? '3px solid var(--card-focus-ring-color)' : 'none',
            }}
          />
        ))}
      </div>
      <input
        type="text"
        value={value || ''}
        onChange={e => handleSelect(e.target.value)}
        placeholder="#000000 або rgb(0,0,0)"
        disabled={readOnly}
        style={{ width: '100%' }}
      />
    </div>
  )
}

Tag Input з автодоповненням

// components/studio/TagInput.tsx
import { useState, useCallback } from 'react'
import { insert, remove } from 'sanity'
import type { ArrayInputProps } from 'sanity'

const SUGGESTED_TAGS = ['TypeScript', 'React', 'Next.js', 'DevOps', 'Python']

export function TagInput(props: ArrayInputProps) {
  const { value = [], onChange, readOnly } = props
  const [input, setInput] = useState('')

  const addTag = useCallback(
    (tag: string) => {
      const trimmed = tag.trim()
      if (!trimmed || (value as string[]).includes(trimmed)) return
      onChange(insert([trimmed], 'after', [-1]))
      setInput('')
    },
    [value, onChange]
  )

  return (
    <div>
      <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginBottom: 8 }}>
        {(value as string[]).map((tag, i) => (
          <span
            key={i}
            style={{
              padding: '2px 10px',
              background: '#f0f0f0',
              borderRadius: 12,
              fontSize: 13,
            }}
          >
            {tag}
            {!readOnly && (
              <button
                onClick={() => onChange(remove([i]))}
                style={{ background: 'none', border: 'none', cursor: 'pointer', marginLeft: 4 }}
              >
                ×
              </button>
            )}
          </span>
        ))}
      </div>
      <input
        value={input}
        onChange={e => setInput(e.target.value)}
        onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); addTag(input) } }}
        placeholder="Додати тег..."
        disabled={readOnly}
      />
    </div>
  )
}

Терміни

Розробка 3–5 кастомних input компонентів — 2–3 дні.