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.
- package/README.md +73 -0
- package/dist/components/Alert/Alert.d.ts +10 -0
- package/dist/components/Badge/Badge.d.ts +6 -0
- package/dist/components/Button/Button.d.ts +6 -0
- package/dist/components/Card/Card.d.ts +7 -0
- package/dist/components/Checkbox/Checkbox.d.ts +5 -0
- package/dist/components/CodeBlock/CodeBlock.d.ts +6 -0
- package/dist/components/ComponentPage/ComponentPage.d.ts +17 -0
- package/dist/components/DatePicker/DatePicker.d.ts +12 -0
- package/dist/components/Input/Input.d.ts +8 -0
- package/dist/components/Modal/Modal.d.ts +10 -0
- package/dist/components/Radio/Radio.d.ts +5 -0
- package/dist/components/Select/Select.d.ts +8 -0
- package/dist/components/SideNav/SideNav.d.ts +10 -0
- package/dist/components/Spinner/Spinner.d.ts +6 -0
- package/dist/components/Tabs/Tabs.d.ts +27 -0
- package/dist/components/Textarea/Textarea.d.ts +7 -0
- package/dist/components/ThemePicker/ThemePicker.d.ts +1 -0
- package/dist/components/Toast/Toast.d.ts +10 -0
- package/dist/components/Toggle/Toggle.d.ts +6 -0
- package/dist/components/Tooltip/Tooltip.d.ts +7 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +2 -0
- package/dist/index.js +898 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.d.ts +16 -0
- package/package.json +61 -0
|
@@ -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
|
+
}
|