docs: обновление правил UI Kit и блока поставщиков + новые glass компоненты
- Добавлены правила анализа UI Kit компонентов (interaction-integrity-rules.md) - Обновлены правила блока 1: убран заголовок, добавлена кнопка навигации (rules-complete.md) - Детальная спецификация плавающей кнопки "Назад" (seller-ui-rules.md) - Новые компоненты: GlassDatePicker и GlassSelect для UI Kit - Улучшены hover/focus эффекты в DatePicker 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@ -19,7 +19,13 @@ interface DatePickerProps {
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export function DatePicker({ value, onChange, placeholder = 'Выберите дату', className, disabled }: DatePickerProps) {
|
||||
export function DatePicker({
|
||||
value,
|
||||
onChange,
|
||||
placeholder: _placeholder = 'Выберите дату',
|
||||
className,
|
||||
disabled,
|
||||
}: DatePickerProps) {
|
||||
const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
onChange?.(e.target.value)
|
||||
}
|
||||
@ -32,7 +38,7 @@ export function DatePicker({ value, onChange, placeholder = 'Выберите д
|
||||
onChange={handleDateChange}
|
||||
disabled={disabled}
|
||||
className={cn(
|
||||
'flex h-9 w-full rounded-lg border border-white/10 bg-white/5 backdrop-blur px-3 py-1 text-sm text-white placeholder:text-white/50 focus:border-white/20 focus:outline-none focus:ring-1 focus:ring-white/20 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
'flex h-9 w-full rounded-lg border border-white/10 bg-white/5 backdrop-blur px-3 py-1 text-sm text-white placeholder:text-white/50 hover:border-white/30 hover:bg-white/10 focus:border-purple-400/50 focus:outline-none focus:ring-2 focus:ring-purple-400/20 transition-all duration-200 disabled:cursor-not-allowed disabled:opacity-50',
|
||||
'pr-8', // Place for calendar icon
|
||||
className,
|
||||
)}
|
||||
|
46
src/components/ui/glass-date-picker.tsx
Normal file
46
src/components/ui/glass-date-picker.tsx
Normal file
@ -0,0 +1,46 @@
|
||||
'use client'
|
||||
|
||||
import { Calendar } from 'lucide-react'
|
||||
import * as React from 'react'
|
||||
|
||||
interface GlassDatePickerProps {
|
||||
value?: string
|
||||
onChange?: (date: string) => void
|
||||
placeholder?: string
|
||||
className?: string
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export function GlassDatePicker({
|
||||
value,
|
||||
onChange,
|
||||
placeholder: _placeholder = 'дд.мм.гггг',
|
||||
className = '',
|
||||
disabled = false,
|
||||
}: GlassDatePickerProps) {
|
||||
const handleDateChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
onChange?.(e.target.value)
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="relative" data-testid="glass-date-picker-wrapper">
|
||||
<input
|
||||
type="date"
|
||||
value={value}
|
||||
onChange={handleDateChange}
|
||||
disabled={disabled}
|
||||
data-testid="glass-date-picker-input"
|
||||
className={`
|
||||
bg-white/5 border border-white/10 text-white rounded-lg h-9 px-3 text-sm
|
||||
hover:border-white/30 hover:bg-white/10
|
||||
focus:border-purple-400/50 focus:ring-2 focus:ring-purple-400/20
|
||||
transition-all duration-200 outline-none
|
||||
disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-white/10 disabled:hover:bg-white/5
|
||||
pr-8
|
||||
${className}
|
||||
`}
|
||||
/>
|
||||
<Calendar className="absolute right-3 top-1/2 h-4 w-4 -translate-y-1/2 text-white/40 pointer-events-none" />
|
||||
</div>
|
||||
)
|
||||
}
|
114
src/components/ui/glass-select.tsx
Normal file
114
src/components/ui/glass-select.tsx
Normal file
@ -0,0 +1,114 @@
|
||||
'use client'
|
||||
|
||||
import React from 'react'
|
||||
|
||||
interface GlassSelectOption {
|
||||
value: string
|
||||
label: string
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
interface GlassSelectProps {
|
||||
value: string
|
||||
onChange: (value: string) => void
|
||||
placeholder?: string
|
||||
options: GlassSelectOption[]
|
||||
className?: string
|
||||
size?: 'sm' | 'md' | 'lg'
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export function GlassSelect({
|
||||
value,
|
||||
onChange,
|
||||
placeholder = 'Выберите вариант',
|
||||
options,
|
||||
className = '',
|
||||
size = 'md',
|
||||
disabled = false,
|
||||
}: GlassSelectProps) {
|
||||
const sizeClasses = {
|
||||
sm: 'h-8 text-xs px-3',
|
||||
md: 'h-9 text-sm px-3',
|
||||
lg: 'h-11 text-base px-4',
|
||||
}
|
||||
|
||||
return (
|
||||
<select
|
||||
value={value}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
disabled={disabled}
|
||||
className={`
|
||||
bg-white/5 border border-white/10 text-white rounded-lg
|
||||
hover:border-white/30 hover:bg-white/10
|
||||
focus:border-purple-400/50 focus:ring-2 focus:ring-purple-400/20
|
||||
transition-all duration-200 outline-none
|
||||
disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-white/10 disabled:hover:bg-white/5
|
||||
${sizeClasses[size]}
|
||||
${className}
|
||||
`}
|
||||
>
|
||||
{placeholder && (
|
||||
<option value="" disabled className="bg-gray-800 text-white/60">
|
||||
{placeholder}
|
||||
</option>
|
||||
)}
|
||||
{options.map((option) => (
|
||||
<option key={option.value} value={option.value} disabled={option.disabled} className="bg-gray-800 text-white">
|
||||
{option.label}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
)
|
||||
}
|
||||
|
||||
// Дополнительный компонент для простого использования с children
|
||||
interface GlassSelectSimpleProps {
|
||||
value: string
|
||||
onChange: (value: string) => void
|
||||
placeholder?: string
|
||||
children: React.ReactNode
|
||||
className?: string
|
||||
size?: 'sm' | 'md' | 'lg'
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export function GlassSelectSimple({
|
||||
value,
|
||||
onChange,
|
||||
placeholder,
|
||||
children,
|
||||
className = '',
|
||||
size = 'md',
|
||||
disabled = false,
|
||||
}: GlassSelectSimpleProps) {
|
||||
const sizeClasses = {
|
||||
sm: 'h-8 text-xs px-3',
|
||||
md: 'h-9 text-sm px-3',
|
||||
lg: 'h-11 text-base px-4',
|
||||
}
|
||||
|
||||
return (
|
||||
<select
|
||||
value={value}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
disabled={disabled}
|
||||
className={`
|
||||
bg-white/5 border border-white/10 text-white rounded-lg
|
||||
hover:border-white/30 hover:bg-white/10
|
||||
focus:border-purple-400/50 focus:ring-2 focus:ring-purple-400/20
|
||||
transition-all duration-200 outline-none
|
||||
disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:border-white/10 disabled:hover:bg-white/5
|
||||
${sizeClasses[size]}
|
||||
${className}
|
||||
`}
|
||||
>
|
||||
{placeholder && (
|
||||
<option value="" disabled className="bg-gray-800 text-white/60">
|
||||
{placeholder}
|
||||
</option>
|
||||
)}
|
||||
{children}
|
||||
</select>
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user