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:
Veronika Smirnova
2025-08-12 18:08:24 +03:00
parent c586ddc868
commit c5cd75cdb9
6 changed files with 323 additions and 8 deletions

View File

@ -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,
)}

View 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>
)
}

View 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>
)
}