castlecraftstudios-ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/components/Button/Button.tsx","../src/components/Card/Card.tsx","../src/components/Input/Input.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Select/Select.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Radio/Radio.tsx","../src/components/Modal/Modal.tsx","../src/components/Tooltip/Tooltip.tsx","../src/components/Badge/Badge.tsx","../src/components/Alert/Alert.tsx","../src/components/Toast/Toast.tsx","../src/components/Spinner/Spinner.tsx","../src/components/Tabs/Tabs.tsx","../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import './Button.scss';\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost';\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport default function Button({\n variant = 'primary',\n size = 'md',\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={['button', `button--${variant}`, `button--${size}`, className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import './Card.scss';\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: 'default' | 'elevated' | 'outline' | 'flat';\n header?: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport default function Card({\n variant = 'default',\n header,\n footer,\n className,\n children,\n ...props\n}: CardProps) {\n return (\n <div\n className={['card', `card--${variant}`, className].filter(Boolean).join(' ')}\n {...props}\n >\n {header && <div className=\"card__header\">{header}</div>}\n {children && <div className=\"card__body\">{children}</div>}\n {footer && <div className=\"card__footer\">{footer}</div>}\n </div>\n );\n}\n","import { useId } from 'react';\nimport './Input.scss';\n\ninterface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport default function Input({\n label,\n helperText,\n error,\n size = 'md',\n className,\n id,\n ...props\n}: InputProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div\n className={['input-field', `input-field--${size}`, error && 'input-field--error', className]\n .filter(Boolean)\n .join(' ')}\n >\n {label && <label htmlFor={inputId}>{label}</label>}\n <input id={inputId} {...props} />\n {(error || helperText) && (\n <span className=\"input-field__hint\">{error ?? helperText}</span>\n )}\n </div>\n );\n}\n","import { useId } from 'react';\nimport './Textarea.scss';\n\ninterface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n}\n\nexport default function Textarea({\n label,\n helperText,\n error,\n className,\n id,\n rows = 4,\n ...props\n}: TextareaProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div\n className={['textarea-field', error && 'textarea-field--error', className]\n .filter(Boolean)\n .join(' ')}\n >\n {label && <label htmlFor={inputId}>{label}</label>}\n <textarea id={inputId} rows={rows} {...props} />\n {(error || helperText) && (\n <span className=\"textarea-field__hint\">{error ?? helperText}</span>\n )}\n </div>\n );\n}\n","import { useId } from 'react';\nimport './Select.scss';\n\ninterface SelectProps extends Omit<React.SelectHTMLAttributes<HTMLSelectElement>, 'size'> {\n label?: string;\n helperText?: string;\n error?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport default function Select({\n label,\n helperText,\n error,\n size = 'md',\n className,\n id,\n children,\n ...props\n}: SelectProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n\n return (\n <div\n className={['select-field', `select-field--${size}`, error && 'select-field--error', className]\n .filter(Boolean)\n .join(' ')}\n >\n {label && <label htmlFor={inputId}>{label}</label>}\n <div className=\"select-field__wrapper\">\n <select id={inputId} {...props}>\n {children}\n </select>\n </div>\n {(error || helperText) && (\n <span className=\"select-field__hint\">{error ?? helperText}</span>\n )}\n </div>\n );\n}\n","import './Toggle.scss';\n\ninterface ToggleProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'> {\n label?: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport default function Toggle({ label, size = 'md', className, ...props }: ToggleProps) {\n return (\n <label className={['toggle', `toggle--${size}`, className].filter(Boolean).join(' ')}>\n <input type=\"checkbox\" role=\"switch\" {...props} />\n <span className=\"toggle__track\">\n <span className=\"toggle__thumb\" />\n </span>\n {label && <span className=\"toggle__label\">{label}</span>}\n </label>\n );\n}\n","import './Checkbox.scss';\n\ninterface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n}\n\nexport default function Checkbox({ label, className, ...props }: CheckboxProps) {\n return (\n <label className={['checkbox', className].filter(Boolean).join(' ')}>\n <input type=\"checkbox\" {...props} />\n <span className=\"checkbox__box\" />\n {label && <span className=\"checkbox__label\">{label}</span>}\n </label>\n );\n}\n","import './Radio.scss';\n\ninterface RadioProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string;\n}\n\nexport default function Radio({ label, className, ...props }: RadioProps) {\n return (\n <label className={['radio', className].filter(Boolean).join(' ')}>\n <input type=\"radio\" {...props} />\n <span className=\"radio__dot\" />\n {label && <span className=\"radio__label\">{label}</span>}\n </label>\n );\n}\n","import { useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport './Modal.scss';\n\ninterface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: string;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n children: React.ReactNode;\n}\n\nexport default function Modal({ open, onClose, title, footer, size = 'md', children }: ModalProps) {\n useEffect(() => {\n if (!open) return;\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n document.body.style.overflow = 'hidden';\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n document.addEventListener('keydown', onKey);\n return () => {\n document.body.style.overflow = '';\n document.body.style.paddingRight = '';\n document.removeEventListener('keydown', onKey);\n };\n }, [open, onClose]);\n\n if (!open) return null;\n\n return createPortal(\n <div className=\"modal-backdrop\" onClick={onClose}>\n <div\n className={['modal', `modal--${size}`].join(' ')}\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={(e) => e.stopPropagation()}\n >\n {title && (\n <div className=\"modal__header\">\n <h2>{title}</h2>\n <button className=\"modal__close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path d=\"M1 1l12 12M13 1L1 13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n </button>\n </div>\n )}\n <div className=\"modal__body\">{children}</div>\n {footer && <div className=\"modal__footer\">{footer}</div>}\n </div>\n </div>,\n document.body\n );\n}\n","import { useState } from 'react';\nimport './Tooltip.scss';\n\ninterface TooltipProps {\n content: React.ReactNode;\n position?: 'top' | 'bottom' | 'left' | 'right';\n children: React.ReactElement;\n}\n\nexport default function Tooltip({ content, position = 'top', children }: TooltipProps) {\n const [visible, setVisible] = useState(false);\n\n return (\n <span\n className=\"tooltip-wrapper\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n onFocus={() => setVisible(true)}\n onBlur={() => setVisible(false)}\n >\n {children}\n <span\n className={['tooltip', `tooltip--${position}`, visible && 'tooltip--visible']\n .filter(Boolean)\n .join(' ')}\n role=\"tooltip\"\n >\n {content}\n </span>\n </span>\n );\n}\n","import './Badge.scss';\n\ninterface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'default' | 'success' | 'warning' | 'error' | 'info';\n dot?: boolean;\n}\n\nexport default function Badge({\n variant = 'default',\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={['badge', `badge--${variant}`, className].filter(Boolean).join(' ')}\n {...props}\n >\n {dot && <span className=\"badge__dot\" />}\n {children}\n </span>\n );\n}\n","import './Alert.scss';\n\ntype AlertVariant = 'success' | 'warning' | 'error' | 'info';\n\ninterface AlertProps {\n variant?: AlertVariant;\n title?: string;\n onDismiss?: () => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst icons: Record<AlertVariant, React.ReactNode> = {\n success: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 8l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n warning: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n ),\n error: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n ),\n info: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 7.5V11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n ),\n};\n\nexport default function Alert({ variant = 'info', title, onDismiss, children, className }: AlertProps) {\n return (\n <div className={['alert', `alert--${variant}`, className].filter(Boolean).join(' ')}>\n <span className=\"alert__icon\">{icons[variant]}</span>\n <div className=\"alert__content\">\n {title && <div className=\"alert__title\">{title}</div>}\n <div className=\"alert__body\">{children}</div>\n </div>\n {onDismiss && (\n <button className=\"alert__dismiss\" onClick={onDismiss} aria-label=\"Dismiss\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M1 1l10 10M11 1L1 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport './Toast.scss';\n\ntype ToastVariant = 'success' | 'warning' | 'error' | 'info';\n\ninterface ToastProps {\n open: boolean;\n variant?: ToastVariant;\n title?: string;\n onDismiss?: () => void;\n children: React.ReactNode;\n}\n\nconst icons: Record<ToastVariant, React.ReactNode> = {\n success: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5 8l2 2 4-4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n ),\n warning: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 2.5L14 13.5H2L8 2.5z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" />\n <path d=\"M8 6.5v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"11.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n ),\n error: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M5.5 5.5l5 5M10.5 5.5l-5 5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n ),\n info: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 7.5V11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"8\" cy=\"5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n ),\n};\n\nexport default function Toast({ open, variant = 'info', title, onDismiss, children }: ToastProps) {\n const [mounted, setMounted] = useState(false);\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n if (open) {\n setMounted(true);\n const raf = requestAnimationFrame(() => requestAnimationFrame(() => setVisible(true)));\n return () => cancelAnimationFrame(raf);\n } else {\n setVisible(false);\n const t = setTimeout(() => setMounted(false), 250);\n return () => clearTimeout(t);\n }\n }, [open]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n className={['toast', `toast--${variant}`, visible && 'toast--visible'].filter(Boolean).join(' ')}\n role=\"status\"\n >\n <span className=\"toast__icon\">{icons[variant]}</span>\n <div className=\"toast__content\">\n {title && <div className=\"toast__title\">{title}</div>}\n <div className=\"toast__body\">{children}</div>\n </div>\n {onDismiss && (\n <button className=\"toast__dismiss\" onClick={onDismiss} aria-label=\"Dismiss\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M1 1l10 10M11 1L1 11\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n </button>\n )}\n </div>,\n document.body\n );\n}\n","import './Spinner.scss';\n\ninterface SpinnerProps {\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n}\n\nexport default function Spinner({ size = 'md', className }: SpinnerProps) {\n return (\n <svg\n className={['spinner', `spinner--${size}`, className].filter(Boolean).join(' ')}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-label=\"Loading\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeDasharray=\"47 16\"\n />\n </svg>\n );\n}\n","import { createContext, useContext, useId, useRef, useState } from 'react';\nimport './Tabs.scss';\n\ninterface TabsContextValue {\n activeValue: string;\n setActiveValue: (v: string) => void;\n baseId: string;\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nfunction useTabsContext() {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tab components must be used inside <Tabs>');\n return ctx;\n}\n\ninterface TabsProps {\n defaultValue: string;\n value?: string;\n onChange?: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Tabs({ defaultValue, value, onChange, children, className }: TabsProps) {\n const [internal, setInternal] = useState(defaultValue);\n const baseId = useId();\n const activeValue = value ?? internal;\n\n function setActiveValue(v: string) {\n if (!value) setInternal(v);\n onChange?.(v);\n }\n\n return (\n <TabsContext.Provider value={{ activeValue, setActiveValue, baseId }}>\n <div className={['tabs', className].filter(Boolean).join(' ')}>{children}</div>\n </TabsContext.Provider>\n );\n}\n\ninterface TabListProps {\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TabList({ children, className }: TabListProps) {\n const listRef = useRef<HTMLDivElement>(null);\n\n function handleKeyDown(e: React.KeyboardEvent) {\n const tabs = listRef.current?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])');\n if (!tabs) return;\n const arr = Array.from(tabs);\n const focused = document.activeElement as HTMLButtonElement;\n const idx = arr.indexOf(focused);\n if (idx === -1) return;\n\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n arr[(idx + 1) % arr.length].focus();\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n arr[(idx - 1 + arr.length) % arr.length].focus();\n } else if (e.key === 'Home') {\n e.preventDefault();\n arr[0].focus();\n } else if (e.key === 'End') {\n e.preventDefault();\n arr[arr.length - 1].focus();\n }\n }\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n className={['tabs__list', className].filter(Boolean).join(' ')}\n onKeyDown={handleKeyDown}\n >\n {children}\n </div>\n );\n}\n\ninterface TabProps {\n value: string;\n disabled?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function Tab({ value, disabled, children, className }: TabProps) {\n const { activeValue, setActiveValue, baseId } = useTabsContext();\n const isActive = activeValue === value;\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`${baseId}-panel-${value}`}\n id={`${baseId}-tab-${value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={['tabs__tab', isActive && 'tabs__tab--active', className].filter(Boolean).join(' ')}\n onClick={() => !disabled && setActiveValue(value)}\n >\n {children}\n </button>\n );\n}\n\ninterface TabPanelProps {\n value: string;\n children: React.ReactNode;\n className?: string;\n}\n\nexport function TabPanel({ value, children, className }: TabPanelProps) {\n const { activeValue, baseId } = useTabsContext();\n if (activeValue !== value) return null;\n\n return (\n <div\n role=\"tabpanel\"\n id={`${baseId}-panel-${value}`}\n aria-labelledby={`${baseId}-tab-${value}`}\n className={['tabs__panel', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport './DatePicker.scss';\n\nconst DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];\nconst MONTHS = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December',\n];\n\nfunction isSameDay(a: Date, b: Date) {\n return a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n}\n\nfunction startOfDay(d: Date) {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate());\n}\n\nfunction formatDisplay(d: Date | null) {\n if (!d) return '';\n return d.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' });\n}\n\nfunction getDaysInMonth(year: number, month: number) {\n return new Date(year, month + 1, 0).getDate();\n}\n\nfunction getFirstDayOfWeek(year: number, month: number) {\n return new Date(year, month, 1).getDay();\n}\n\ninterface DatePickerProps {\n label?: string;\n value?: Date | null;\n onChange?: (date: Date) => void;\n min?: Date;\n max?: Date;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport default function DatePicker({\n label,\n value,\n onChange,\n min,\n max,\n placeholder = 'Select date',\n disabled,\n className,\n}: DatePickerProps) {\n const id = useId();\n const [open, setOpen] = useState(false);\n const [cursor, setCursor] = useState(() => {\n const base = value ?? new Date();\n return { year: base.getFullYear(), month: base.getMonth() };\n });\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n function handlePointerDown(e: PointerEvent) {\n if (!wrapperRef.current?.contains(e.target as Node)) setOpen(false);\n }\n document.addEventListener('pointerdown', handlePointerDown);\n return () => document.removeEventListener('pointerdown', handlePointerDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') setOpen(false);\n }\n document.addEventListener('keydown', handleKey);\n return () => document.removeEventListener('keydown', handleKey);\n }, [open]);\n\n function prevMonth() {\n setCursor((c) => {\n const m = c.month === 0 ? 11 : c.month - 1;\n const y = c.month === 0 ? c.year - 1 : c.year;\n return { year: y, month: m };\n });\n }\n\n function nextMonth() {\n setCursor((c) => {\n const m = c.month === 11 ? 0 : c.month + 1;\n const y = c.month === 11 ? c.year + 1 : c.year;\n return { year: y, month: m };\n });\n }\n\n function selectDay(day: number) {\n const d = new Date(cursor.year, cursor.month, day);\n onChange?.(d);\n setOpen(false);\n }\n\n function isDisabledDay(day: number) {\n const d = startOfDay(new Date(cursor.year, cursor.month, day));\n if (min && d < startOfDay(min)) return true;\n if (max && d > startOfDay(max)) return true;\n return false;\n }\n\n const totalDays = getDaysInMonth(cursor.year, cursor.month);\n const firstDay = getFirstDayOfWeek(cursor.year, cursor.month);\n const cells: (number | null)[] = [\n ...Array<null>(firstDay).fill(null),\n ...Array.from({ length: totalDays }, (_, i) => i + 1),\n ];\n while (cells.length % 7 !== 0) cells.push(null);\n\n return (\n <div\n ref={wrapperRef}\n className={['date-picker', disabled && 'date-picker--disabled', className].filter(Boolean).join(' ')}\n >\n {label && (\n <label className=\"date-picker__label\" htmlFor={id}>\n {label}\n </label>\n )}\n <button\n id={id}\n type=\"button\"\n className={['date-picker__trigger', open && 'date-picker__trigger--open'].filter(Boolean).join(' ')}\n disabled={disabled}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <span className={value ? '' : 'date-picker__placeholder'}>\n {value ? formatDisplay(value) : placeholder}\n </span>\n <svg\n className=\"date-picker__icon\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"date-picker__popover\" role=\"dialog\" aria-label=\"Date picker\">\n <div className=\"date-picker__header\">\n <button\n type=\"button\"\n className=\"date-picker__nav\"\n onClick={prevMonth}\n aria-label=\"Previous month\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n <span className=\"date-picker__month-label\">\n {MONTHS[cursor.month]} {cursor.year}\n </span>\n <button\n type=\"button\"\n className=\"date-picker__nav\"\n onClick={nextMonth}\n aria-label=\"Next month\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n </div>\n\n <div className=\"date-picker__grid\">\n {DAYS.map((d) => (\n <span key={d} className=\"date-picker__day-name\">{d}</span>\n ))}\n {cells.map((day, i) => {\n if (!day) return <span key={`empty-${i}`} />;\n const d = new Date(cursor.year, cursor.month, day);\n const selected = value ? isSameDay(d, value) : false;\n const today = isSameDay(d, new Date());\n const off = isDisabledDay(day);\n return (\n <button\n key={day}\n type=\"button\"\n disabled={off}\n aria-pressed={selected}\n aria-label={d.toLocaleDateString('en-GB', { day: 'numeric', month: 'long', year: 'numeric' })}\n className={[\n 'date-picker__day',\n selected && 'date-picker__day--selected',\n today && !selected && 'date-picker__day--today',\n off && 'date-picker__day--disabled',\n ].filter(Boolean).join(' ')}\n onClick={() => !off && selectDay(day)}\n >\n {day}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export { default as Button } from '../components/Button/Button';
2
+ export { default as Card } from '../components/Card/Card';
3
+ export { default as Input } from '../components/Input/Input';
4
+ export { default as Textarea } from '../components/Textarea/Textarea';
5
+ export { default as Select } from '../components/Select/Select';
6
+ export { default as Toggle } from '../components/Toggle/Toggle';
7
+ export { default as Checkbox } from '../components/Checkbox/Checkbox';
8
+ export { default as Radio } from '../components/Radio/Radio';
9
+ export { default as Modal } from '../components/Modal/Modal';
10
+ export { default as Tooltip } from '../components/Tooltip/Tooltip';
11
+ export { default as Badge } from '../components/Badge/Badge';
12
+ export { default as Alert } from '../components/Alert/Alert';
13
+ export { default as Toast } from '../components/Toast/Toast';
14
+ export { default as Spinner } from '../components/Spinner/Spinner';
15
+ export { Tabs, TabList, Tab, TabPanel } from '../components/Tabs/Tabs';
16
+ export { default as DatePicker } from '../components/DatePicker/DatePicker';
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "castlecraftstudios-ui",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Accessible, zero-dependency React component library with dark mode support",
6
+ "keywords": [
7
+ "react",
8
+ "components",
9
+ "ui",
10
+ "accessible",
11
+ "dark-mode"
12
+ ],
13
+ "license": "MIT",
14
+ "main": "./dist/index.cjs",
15
+ "module": "./dist/index.js",
16
+ "types": "./dist/lib/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "import": "./dist/index.js",
20
+ "require": "./dist/index.cjs",
21
+ "types": "./dist/lib/index.d.ts"
22
+ },
23
+ "./styles": "./dist/index.css"
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "dev": "vite",
30
+ "build": "tsc -b && vite build",
31
+ "build:lib": "vite build --config vite.lib.config.ts",
32
+ "lint": "eslint .",
33
+ "preview": "vite preview"
34
+ },
35
+ "peerDependencies": {
36
+ "react": ">=18",
37
+ "react-dom": ">=18"
38
+ },
39
+ "dependencies": {
40
+ "react": ">=18",
41
+ "react-dom": ">=18",
42
+ "react-router-dom": "^7.15.0"
43
+ },
44
+ "devDependencies": {
45
+ "@eslint/js": "^10.0.1",
46
+ "@types/node": "^24.12.2",
47
+ "@types/react": "^19.2.14",
48
+ "@types/react-dom": "^19.2.3",
49
+ "@vitejs/plugin-react": "^6.0.1",
50
+ "eslint": "^10.2.1",
51
+ "eslint-plugin-react-hooks": "^7.1.1",
52
+ "eslint-plugin-react-refresh": "^0.5.2",
53
+ "globals": "^17.5.0",
54
+ "prettier": "^3.8.3",
55
+ "sass": "^1.99.0",
56
+ "typescript": "~6.0.2",
57
+ "typescript-eslint": "^8.58.2",
58
+ "vite": "^8.0.10",
59
+ "vite-plugin-dts": "^4.5.4"
60
+ }
61
+ }