@kismet-ux/constellation 1.14.0 → 1.15.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.
Files changed (51) hide show
  1. package/README.md +219 -208
  2. package/dist/form/Checkbox/checkbox.js +4 -57
  3. package/dist/form/Checkbox/checkbox.js.map +1 -1
  4. package/dist/form/DatePicker/date-picker.d.ts +1 -1
  5. package/dist/form/DatePicker/date-picker.d.ts.map +1 -1
  6. package/dist/form/DatePicker/date-picker.js +7 -59
  7. package/dist/form/DatePicker/date-picker.js.map +1 -1
  8. package/dist/form/Input/input.css +42 -6
  9. package/dist/form/Input/input.d.ts +6 -0
  10. package/dist/form/Input/input.d.ts.map +1 -1
  11. package/dist/form/Input/input.js +3 -3
  12. package/dist/form/Input/input.js.map +1 -1
  13. package/dist/form/Input/input.module.scss.js +1 -1
  14. package/dist/form/Select/select.d.ts.map +1 -1
  15. package/dist/form/Select/select.js +5 -5
  16. package/dist/form/Select/select.js.map +1 -1
  17. package/dist/form.d.ts +2 -2
  18. package/dist/index-BPKtGvrM.d.ts +200 -0
  19. package/dist/index-ByI9bvw8.d.ts +647 -0
  20. package/dist/index-C7SAfZfl.d.ts +647 -0
  21. package/dist/index-Cq8JgMRD.d.ts +354 -0
  22. package/dist/index-D8p7TX9C.d.ts +200 -0
  23. package/dist/index-DyDvelCa.d.ts +354 -0
  24. package/dist/index.d.ts +7 -7
  25. package/dist/index.js +30 -30
  26. package/dist/input-BHmlHvYR.d.ts +58 -0
  27. package/dist/layout/AppSidebarHeader/app-sidebar-header.js +1 -31
  28. package/dist/layout/AppSidebarHeader/app-sidebar-header.js.map +1 -1
  29. package/dist/layout.d.ts +3 -3
  30. package/dist/navigation/NavUser/nav-user.js +2 -2
  31. package/dist/navigation/Sheet/sheet.js +3 -30
  32. package/dist/navigation/Sheet/sheet.js.map +1 -1
  33. package/dist/navigation.d.ts +1 -1
  34. package/dist/settings/AppearanceTabs/appearance-tabs.js +1 -28
  35. package/dist/settings/AppearanceTabs/appearance-tabs.js.map +1 -1
  36. package/dist/tooltip-Cw8p0qeV.d.ts +46 -0
  37. package/dist/types/form/date-picker.d.ts +2 -0
  38. package/dist/types/form/date-picker.d.ts.map +1 -1
  39. package/dist/types/form/select.d.ts +2 -0
  40. package/dist/types/form/select.d.ts.map +1 -1
  41. package/dist/types/form/theme.d.ts +9 -0
  42. package/dist/types/form/theme.d.ts.map +1 -1
  43. package/dist/typography/Typography/typography.css +21 -1
  44. package/dist/ui/Button/button-variants.d.ts +1 -1
  45. package/dist/ui/Button/button.css +1 -1
  46. package/dist/ui/Icon/icon-variants.d.ts +1 -1
  47. package/dist/ui/SwipeRow/swipe-row-variants.js.map +1 -1
  48. package/dist/ui/SwipeRow/swipe-row.js.map +1 -1
  49. package/dist/ui/Toggle/toggle-variants.d.ts +1 -1
  50. package/dist/ui.d.ts +2 -2
  51. package/package.json +1 -1
@@ -3,70 +3,18 @@ import inputStyles from '../Input/input.module.scss.js';
3
3
  import { Label } from '../Label/label.js';
4
4
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../Select/select.js';
5
5
  import { useBreakpoint } from '../../hooks/use-mobile.js';
6
+ import { Typography } from '../../typography/Typography/typography.js';
6
7
  import cn from 'clsx';
7
- import '../Input/input.js';
8
- import * as React from 'react';
9
- import '../../layout/Sidebar/sidebar-context.js';
10
- import '../../ui/Alert/alert-context.js';
11
- import '../../ui/Table/table-sort-context.js';
12
- import '../../layout/Skeleton/skeleton.css';
13
- import '../../navigation/Sheet/sheet.js';
14
- import { Button } from '../../ui/Button/button.js';
15
- import '../../ui/Tooltip/tooltip.js';
16
8
  import { CalendarIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';
17
- import '../../internal/slot.js';
18
- import '../../layout/Sidebar/sidebar-variants.js';
19
- import '../../layout/Sidebar/sidebar.css';
20
- import '../../layout/AppContent/app-content.css';
21
- import '../../layout/AppContentFooter/app-content-footer.css';
22
- import '../../layout/AppContentMain/app-content-main.css';
23
- import { Row } from '../../layout/Row/row.js';
24
- import '../../navigation/Link/link.js';
25
- import { Typography } from '../../typography/Typography/typography.js';
26
- import '../../layout/AppFooter/app-footer.css';
27
- import '../../navigation/Router/router-context.js';
28
- import '../../ui/Separator/separator.js';
9
+ import * as React from 'react';
29
10
  import { createPortal } from 'react-dom';
30
- import '../../typography/TruncatedText/truncated-text.js';
31
- import '../../navigation/Breadcrumbs/breadcrumbs.css';
32
- import '../../navigation/DropdownMenu/dropdown-menu.js';
33
- import '../../ui/Avatar/avatar.js';
34
- import '../../user/UserInfo/user-info.css';
35
- import '../../navigation/NavUser/nav-user.css';
36
- import '../../ui/Alert/alert.js';
37
- import '../../ui/Alert/alert.css';
38
- import '../../ui/Chip/chip.js';
39
- import '../../ui/ChipSelect/chip-select.js';
40
- import '../../ui/CodeBlock/code-block.js';
41
- import '../../ui/DevIndicator/dev-indicator.css';
42
- import '../../ui/Dialog/dialog.js';
43
- import '../../ui/EmptyState/empty-state.js';
44
- import '../../ui/Icon/icon.js';
45
- import '../../ui/List/list.js';
46
- import '../../ui/Pagination/pagination.js';
47
- import '../../ui/ProgressBar/progress-bar.js';
48
- import '../../ui/StatCard/stat-card.js';
49
- import '../../ui/StatusDot/status-dot.js';
50
- import '../../ui/StatusDot/status-dot-variants.js';
51
- import '../../ui/StepProgress/step-progress.js';
52
- import '../../ui/SwipeRow/swipe-row.js';
53
- import '../../ui/Switch/switch.js';
54
- import '../../ui/Table/table.js';
55
- import '../../ui/TableActionCell/table-action-cell.js';
56
- import '../../ui/TableToolbar/table-toolbar.js';
57
- import '../../ui/Toggle/toggle.js';
58
- import '../../ui/ToggleGroup/toggle-group.js';
59
- import '../../settings/AppearanceTabs/appearance-tabs.css';
60
- import '../../layout/AppSidebarHeader/app-sidebar-header.css';
61
- import '../../layout/Collapse/collapse.js';
62
- import '../../layout/Column/column.css';
63
- import '../../layout/Container/container.js';
64
- import '../../layout/Grid/grid.js';
65
11
  import s from './date-picker.module.scss.js';
66
12
  import { normalizeIsoValue, formatDisplayDate, parseDateValue, useCalendar, formatIso, formatDateValue, isDateWithinRange, maskDateInput } from './use-calendar.js';
13
+ import { Row } from '../../layout/Row/row.js';
14
+ import { Button } from '../../ui/Button/button.js';
67
15
 
68
16
  const ANIMATION_DURATION = 200;
69
- function DatePicker({ value: valueProp, defaultValue, onChange, label, helperText, error = false, disabled = false, sizeVariant, placeholder, min, max, required = false, id, className, name, }) {
17
+ function DatePicker({ value: valueProp, defaultValue, onChange, label, helperText, error = false, appearance, disabled = false, sizeVariant, placeholder, min, max, required = false, id, className, name, }) {
70
18
  const generatedId = React.useId();
71
19
  const triggerId = id ?? generatedId;
72
20
  const helperId = `${triggerId}-helper`;
@@ -246,8 +194,8 @@ function DatePicker({ value: valueProp, defaultValue, onChange, label, helperTex
246
194
  const nextDate = new Date(nextYear, nextMonth, nextDay);
247
195
  syncSelectedDate(nextDate);
248
196
  }, [inputValue, normalizedCurrentValue, syncSelectedDate]);
249
- const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: hasError }, { [inputStyles.disabled]: disabled }, { [inputStyles.placeholder]: !!resolvedPlaceholder }, { [inputStyles['has-value']]: hasValue || !!inputValue }, { [inputStyles['is-focused']]: isFocused || displayOpen }, className);
250
- return (jsxs(Fragment, { children: [jsxs("div", { "data-slot": 'date-picker', "data-constellation-field": true, className: containerClasses, children: [jsxs("div", { ref: fieldRef, className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, children: [label, required && jsx("span", { className: inputStyles.required, children: "*" })] }) }), jsx("input", { ref: inputRef, id: triggerId, type: 'text', className: cn(inputStyles['input-field'], s['text-input']), value: inputValue, disabled: disabled, placeholder: resolvedPlaceholder, "aria-invalid": hasError ? 'true' : undefined, "aria-describedby": helperMessage ? helperId : undefined, inputMode: 'numeric', autoComplete: 'off', maxLength: 10, pattern: '\\d{2}/\\d{2}/\\d{4}', onChange: e => {
197
+ const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], appearance && inputStyles[`appearance-${appearance}`], { [inputStyles.error]: hasError }, { [inputStyles.disabled]: disabled }, { [inputStyles.placeholder]: !!resolvedPlaceholder }, { [inputStyles['has-value']]: hasValue || !!inputValue }, { [inputStyles['is-focused']]: isFocused || displayOpen }, className);
198
+ return (jsxs(Fragment, { children: [jsxs("div", { "data-slot": 'date-picker', "data-constellation-field": true, "data-appearance": appearance, className: containerClasses, children: [jsxs("div", { ref: fieldRef, className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, children: [label, required && jsx("span", { className: inputStyles.required, children: "*" })] }) }), jsx("input", { ref: inputRef, id: triggerId, type: 'text', className: cn(inputStyles['input-field'], s['text-input']), value: inputValue, disabled: disabled, placeholder: resolvedPlaceholder, "aria-invalid": hasError ? 'true' : undefined, "aria-describedby": helperMessage ? helperId : undefined, inputMode: 'numeric', autoComplete: 'off', maxLength: 10, pattern: '\\d{2}/\\d{2}/\\d{4}', onChange: e => {
251
199
  const maskedValue = maskDateInput(e.target.value);
252
200
  setInputValue(maskedValue);
253
201
  syncCalendarPreview(maskedValue);
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.js","sources":["../../../src/form/DatePicker/date-picker.tsx"],"sourcesContent":["import inputStyles from '@constellation/form/Input/input.module.scss';\nimport { Label } from '@constellation/form/Label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@constellation/form/Select';\nimport { useBreakpoint } from '@constellation/hooks/use-mobile';\nimport { Row } from '@constellation/layout';\nimport { type DatePickerProps } from '@constellation/types';\nimport { Typography } from '@constellation/typography/Typography';\nimport { Button } from '@constellation/ui';\nimport cn from 'clsx';\nimport { CalendarIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport s from './date-picker.module.scss';\nimport {\n formatDateValue,\n formatDisplayDate,\n formatIso,\n isDateWithinRange,\n maskDateInput,\n normalizeIsoValue,\n parseDateValue,\n useCalendar,\n} from './use-calendar';\n\nconst ANIMATION_DURATION = 200;\n\nfunction DatePicker({\n value: valueProp,\n defaultValue,\n onChange,\n label,\n helperText,\n error = false,\n disabled = false,\n sizeVariant,\n placeholder,\n min,\n max,\n required = false,\n id,\n className,\n name,\n}: DatePickerProps) {\n const generatedId = React.useId();\n const triggerId = id ?? generatedId;\n const helperId = `${triggerId}-helper`;\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const { isBelow } = useBreakpoint();\n const resolvedSize = sizeVariant ?? (isBelow(900) ? 'sm' : 'md');\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = React.useState(() =>\n normalizeIsoValue(defaultValue),\n );\n const currentValue = isControlled ? valueProp : uncontrolledValue;\n const normalizedCurrentValue = normalizeIsoValue(currentValue);\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [isClosing, setIsClosing] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n const [manualError, setManualError] = React.useState<string | null>(null);\n const [inputValue, setInputValue] = React.useState(() =>\n formatDisplayDate(normalizedCurrentValue),\n );\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({\n top: 0,\n left: 0,\n });\n const hasError = error || !!manualError;\n\n const displayOpen = isOpen || isClosing;\n\n // Pixel-accurate positioning via fixed + raw getBoundingClientRect — matches\n // Tooltip / DropdownMenu / Select. Recomputes on scroll + resize so the\n // popover tracks the trigger when the page or a parent scrolls. Flips\n // above the trigger when there isn't enough room below (DropdownMenu pattern).\n const calcPosition = React.useCallback(() => {\n const rect = fieldRef.current?.getBoundingClientRect();\n if (!rect) return;\n const offset = 4;\n const popoverHeight = contentRef.current?.offsetHeight ?? 0;\n const fitsBelow = window.innerHeight - rect.bottom - offset >= popoverHeight;\n const top = fitsBelow ? rect.bottom + offset : rect.top - popoverHeight - offset;\n setPosition({ top, left: rect.left });\n }, []);\n\n React.useLayoutEffect(() => {\n if (!displayOpen) return;\n calcPosition();\n }, [displayOpen, calcPosition]);\n\n React.useEffect(() => {\n if (!displayOpen) return;\n window.addEventListener('scroll', calcPosition, true);\n window.addEventListener('resize', calcPosition);\n return () => {\n window.removeEventListener('scroll', calcPosition, true);\n window.removeEventListener('resize', calcPosition);\n };\n }, [displayOpen, calcPosition]);\n\n const hasValue = Boolean(normalizedCurrentValue);\n const helperMessage = manualError ?? helperText;\n const draftDate = parseDateValue(inputValue);\n const calendarValue = draftDate ? inputValue : isFocused ? undefined : normalizedCurrentValue;\n const resolvedPlaceholder = placeholder ?? 'MM/DD/YYYY';\n\n React.useEffect(() => {\n setInputValue(formatDisplayDate(normalizedCurrentValue));\n setManualError(null);\n }, [normalizedCurrentValue]);\n\n const {\n viewYear,\n viewMonth,\n setViewYear,\n setViewMonth,\n monthNames,\n yearRange,\n weekdays,\n days,\n goToPrevMonth,\n goToNextMonth,\n canGoPrev,\n canGoNext,\n } = useCalendar({ selectedDate: calendarValue, min, max });\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const handleOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n clearCloseTimer();\n setIsClosing(false);\n setIsOpen(true);\n return;\n }\n\n setIsOpen(false);\n setIsClosing(true);\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n }, ANIMATION_DURATION);\n },\n [clearCloseTimer],\n );\n\n React.useEffect(() => {\n return () => clearCloseTimer();\n }, [clearCloseTimer]);\n\n // Click-outside handler\n React.useEffect(() => {\n if (!displayOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (fieldRef.current?.contains(target)) return;\n if (contentRef.current?.contains(target)) return;\n handleOpenChange(false);\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [displayOpen, handleOpenChange]);\n\n const syncCalendarPreview = React.useCallback(\n (maskedValue: string) => {\n const digits = maskedValue.replace(/\\D/g, '');\n\n if (digits.length >= 2) {\n const month = Number(digits.slice(0, 2));\n if (month >= 1 && month <= 12) {\n setViewMonth(month - 1);\n }\n }\n\n if (digits.length === 8) {\n const year = Number(digits.slice(4, 8));\n if (year >= 1000 && year <= 9999) {\n setViewYear(year);\n }\n }\n },\n [setViewMonth, setViewYear],\n );\n\n const handleDayClick = React.useCallback(\n (date: Date) => {\n const isoDate = formatIso(date);\n const displayDate = formatDateValue(date);\n if (!isControlled) {\n setUncontrolledValue(isoDate);\n }\n setInputValue(displayDate);\n setManualError(null);\n onChange?.(isoDate);\n handleOpenChange(false);\n },\n [isControlled, onChange, handleOpenChange],\n );\n\n const syncSelectedDate = React.useCallback(\n (date: Date) => {\n const isoDate = formatIso(date);\n const displayDate = formatDateValue(date);\n\n if (!isDateWithinRange(date, min, max)) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledValue(isoDate);\n }\n setInputValue(displayDate);\n setManualError(null);\n onChange?.(isoDate);\n },\n [isControlled, max, min, onChange],\n );\n\n const commitValue = React.useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n onChange?.(nextValue);\n },\n [isControlled, onChange],\n );\n\n const commitTypedValue = React.useCallback(() => {\n const trimmedValue = inputValue.trim();\n\n if (!trimmedValue) {\n setManualError(null);\n commitValue('');\n setInputValue('');\n return;\n }\n\n const parsedDate = parseDateValue(trimmedValue);\n\n if (!parsedDate) {\n setManualError('Enter a valid date in MM/DD/YYYY format.');\n return;\n }\n\n if (!isDateWithinRange(parsedDate, min, max)) {\n setManualError('Entered date is outside the allowed range.');\n return;\n }\n\n const normalizedDate = formatDateValue(parsedDate);\n const isoDate = formatIso(parsedDate);\n setManualError(null);\n commitValue(isoDate);\n setInputValue(normalizedDate);\n }, [commitValue, inputValue, max, min]);\n\n const updateDateFromCalendarView = React.useCallback(\n (nextYear: number, nextMonth: number) => {\n const baseDate = parseDateValue(inputValue) ?? parseDateValue(normalizedCurrentValue);\n\n if (!baseDate) {\n return;\n }\n\n const lastDayOfMonth = new Date(nextYear, nextMonth + 1, 0).getDate();\n const nextDay = Math.min(baseDate.getDate(), lastDayOfMonth);\n const nextDate = new Date(nextYear, nextMonth, nextDay);\n\n syncSelectedDate(nextDate);\n },\n [inputValue, normalizedCurrentValue, syncSelectedDate],\n );\n\n const containerClasses = cn(\n inputStyles.container,\n inputStyles[resolvedSize],\n { [inputStyles.error]: hasError },\n { [inputStyles.disabled]: disabled },\n { [inputStyles.placeholder]: !!resolvedPlaceholder },\n { [inputStyles['has-value']]: hasValue || !!inputValue },\n { [inputStyles['is-focused']]: isFocused || displayOpen },\n className,\n );\n\n return (\n <>\n <div data-slot={'date-picker'} data-constellation-field className={containerClasses}>\n <div ref={fieldRef} className={inputStyles['input-container']}>\n <div className={inputStyles['label-container']}>\n <Label htmlFor={triggerId}>\n {label}\n {required && <span className={inputStyles.required}>*</span>}\n </Label>\n </div>\n <input\n ref={inputRef}\n id={triggerId}\n type={'text'}\n className={cn(inputStyles['input-field'], s['text-input'])}\n value={inputValue}\n disabled={disabled}\n placeholder={resolvedPlaceholder}\n aria-invalid={hasError ? 'true' : undefined}\n aria-describedby={helperMessage ? helperId : undefined}\n inputMode={'numeric'}\n autoComplete={'off'}\n maxLength={10}\n pattern={'\\\\d{2}/\\\\d{2}/\\\\d{4}'}\n onChange={e => {\n const maskedValue = maskDateInput(e.target.value);\n setInputValue(maskedValue);\n syncCalendarPreview(maskedValue);\n setManualError(null);\n }}\n onFocus={() => {\n setIsFocused(true);\n handleOpenChange(true);\n syncCalendarPreview(inputValue);\n }}\n onBlur={() => {\n setIsFocused(false);\n commitTypedValue();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitTypedValue();\n handleOpenChange(false);\n }\n\n // Guarded + preventDefault so Escape dismisses this calendar and\n // not the Dialog around it, while a closed field ignores the key.\n if (e.key === 'Escape' && displayOpen) {\n e.preventDefault();\n setManualError(null);\n setInputValue(formatDisplayDate(normalizedCurrentValue));\n handleOpenChange(false);\n }\n }}\n />\n <button\n type={'button'}\n className={s.trigger}\n aria-label={'Open calendar'}\n disabled={disabled}\n onMouseDown={e => e.preventDefault()}\n onClick={() => {\n handleOpenChange(true);\n syncCalendarPreview(inputValue);\n inputRef.current?.focus();\n }}\n >\n <CalendarIcon className={s['trigger-icon']} />\n <span className={'srOnly'}>Open calendar</span>\n </button>\n </div>\n {helperMessage ? (\n <Typography id={helperId} variant={'caption'} className={inputStyles['helper-text']}>\n {helperMessage}\n </Typography>\n ) : null}\n </div>\n {name && <input type={'hidden'} name={name} value={normalizedCurrentValue} />}\n {displayOpen\n ? createPortal(\n <div\n data-constellation-portal={''}\n ref={contentRef}\n className={s.content}\n data-state={isOpen ? 'open' : 'closed'}\n data-closing={isClosing ? 'true' : undefined}\n data-side={'bottom'}\n style={{\n position: 'fixed',\n top: position.top,\n left: position.left,\n }}\n >\n <Row gap={1} justify={'space-between'}>\n <Button\n type={'button'}\n theme={'inherit'}\n size={'sm'}\n variant={'ghost'}\n iconOnly\n onClick={goToPrevMonth}\n disabled={!canGoPrev}\n aria-label={'Previous month'}\n >\n <ChevronLeftIcon />\n </Button>\n <Row gap={1}>\n <Select\n value={String(viewMonth)}\n onValueChange={v => {\n const nextMonth = Number(v);\n setViewMonth(nextMonth);\n updateDateFromCalendarView(viewYear, nextMonth);\n }}\n >\n <SelectTrigger className={s['header-trigger']} aria-label={'Month'}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {monthNames.map((name, i) => (\n <SelectItem key={i} value={String(i)}>\n {name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={String(viewYear)}\n onValueChange={v => {\n const nextYear = Number(v);\n setViewYear(nextYear);\n updateDateFromCalendarView(nextYear, viewMonth);\n }}\n >\n <SelectTrigger className={s['header-trigger']} aria-label={'Year'}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {yearRange.map(y => (\n <SelectItem key={y} value={String(y)}>\n {y}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Row>\n <Button\n theme={'inherit'}\n size={'sm'}\n variant={'ghost'}\n iconOnly\n type={'button'}\n onClick={goToNextMonth}\n disabled={!canGoNext}\n aria-label={'Next month'}\n >\n <ChevronRightIcon />\n </Button>\n </Row>\n <div className={s.weekdays}>\n {weekdays.map(wd => (\n <span key={wd} className={s.weekday}>\n {wd}\n </span>\n ))}\n </div>\n <div className={s.grid}>\n {days.map((d, i) => (\n <button\n key={i}\n type={'button'}\n className={cn(\n s.day,\n { [s.outside]: !d.isCurrentMonth },\n { [s.today]: d.isToday },\n { [s.selected]: d.isSelected },\n )}\n disabled={d.isDisabled}\n onClick={() => handleDayClick(d.date)}\n aria-label={d.date.toLocaleDateString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n >\n {d.day}\n </button>\n ))}\n </div>\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\nexport { DatePicker };\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"date-picker.js","sources":["../../../src/form/DatePicker/date-picker.tsx"],"sourcesContent":["import inputStyles from '@constellation/form/Input/input.module.scss';\nimport { Label } from '@constellation/form/Label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@constellation/form/Select';\nimport { useBreakpoint } from '@constellation/hooks/use-mobile';\nimport { Row } from '@constellation/layout';\nimport { type DatePickerProps } from '@constellation/types';\nimport { Typography } from '@constellation/typography/Typography';\nimport { Button } from '@constellation/ui';\nimport cn from 'clsx';\nimport { CalendarIcon, ChevronLeftIcon, ChevronRightIcon } from 'lucide-react';\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport s from './date-picker.module.scss';\nimport {\n formatDateValue,\n formatDisplayDate,\n formatIso,\n isDateWithinRange,\n maskDateInput,\n normalizeIsoValue,\n parseDateValue,\n useCalendar,\n} from './use-calendar';\n\nconst ANIMATION_DURATION = 200;\n\nfunction DatePicker({\n value: valueProp,\n defaultValue,\n onChange,\n label,\n helperText,\n error = false,\n appearance,\n disabled = false,\n sizeVariant,\n placeholder,\n min,\n max,\n required = false,\n id,\n className,\n name,\n}: DatePickerProps) {\n const generatedId = React.useId();\n const triggerId = id ?? generatedId;\n const helperId = `${triggerId}-helper`;\n const fieldRef = React.useRef<HTMLDivElement | null>(null);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n const contentRef = React.useRef<HTMLDivElement | null>(null);\n const { isBelow } = useBreakpoint();\n const resolvedSize = sizeVariant ?? (isBelow(900) ? 'sm' : 'md');\n\n const isControlled = valueProp !== undefined;\n const [uncontrolledValue, setUncontrolledValue] = React.useState(() =>\n normalizeIsoValue(defaultValue),\n );\n const currentValue = isControlled ? valueProp : uncontrolledValue;\n const normalizedCurrentValue = normalizeIsoValue(currentValue);\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [isClosing, setIsClosing] = React.useState(false);\n const [isFocused, setIsFocused] = React.useState(false);\n const [manualError, setManualError] = React.useState<string | null>(null);\n const [inputValue, setInputValue] = React.useState(() =>\n formatDisplayDate(normalizedCurrentValue),\n );\n const closeTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({\n top: 0,\n left: 0,\n });\n const hasError = error || !!manualError;\n\n const displayOpen = isOpen || isClosing;\n\n // Pixel-accurate positioning via fixed + raw getBoundingClientRect — matches\n // Tooltip / DropdownMenu / Select. Recomputes on scroll + resize so the\n // popover tracks the trigger when the page or a parent scrolls. Flips\n // above the trigger when there isn't enough room below (DropdownMenu pattern).\n const calcPosition = React.useCallback(() => {\n const rect = fieldRef.current?.getBoundingClientRect();\n if (!rect) return;\n const offset = 4;\n const popoverHeight = contentRef.current?.offsetHeight ?? 0;\n const fitsBelow = window.innerHeight - rect.bottom - offset >= popoverHeight;\n const top = fitsBelow ? rect.bottom + offset : rect.top - popoverHeight - offset;\n setPosition({ top, left: rect.left });\n }, []);\n\n React.useLayoutEffect(() => {\n if (!displayOpen) return;\n calcPosition();\n }, [displayOpen, calcPosition]);\n\n React.useEffect(() => {\n if (!displayOpen) return;\n window.addEventListener('scroll', calcPosition, true);\n window.addEventListener('resize', calcPosition);\n return () => {\n window.removeEventListener('scroll', calcPosition, true);\n window.removeEventListener('resize', calcPosition);\n };\n }, [displayOpen, calcPosition]);\n\n const hasValue = Boolean(normalizedCurrentValue);\n const helperMessage = manualError ?? helperText;\n const draftDate = parseDateValue(inputValue);\n const calendarValue = draftDate ? inputValue : isFocused ? undefined : normalizedCurrentValue;\n const resolvedPlaceholder = placeholder ?? 'MM/DD/YYYY';\n\n React.useEffect(() => {\n setInputValue(formatDisplayDate(normalizedCurrentValue));\n setManualError(null);\n }, [normalizedCurrentValue]);\n\n const {\n viewYear,\n viewMonth,\n setViewYear,\n setViewMonth,\n monthNames,\n yearRange,\n weekdays,\n days,\n goToPrevMonth,\n goToNextMonth,\n canGoPrev,\n canGoNext,\n } = useCalendar({ selectedDate: calendarValue, min, max });\n\n const clearCloseTimer = React.useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const handleOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n clearCloseTimer();\n setIsClosing(false);\n setIsOpen(true);\n return;\n }\n\n setIsOpen(false);\n setIsClosing(true);\n clearCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n }, ANIMATION_DURATION);\n },\n [clearCloseTimer],\n );\n\n React.useEffect(() => {\n return () => clearCloseTimer();\n }, [clearCloseTimer]);\n\n // Click-outside handler\n React.useEffect(() => {\n if (!displayOpen) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n const target = e.target as Node;\n if (fieldRef.current?.contains(target)) return;\n if (contentRef.current?.contains(target)) return;\n handleOpenChange(false);\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [displayOpen, handleOpenChange]);\n\n const syncCalendarPreview = React.useCallback(\n (maskedValue: string) => {\n const digits = maskedValue.replace(/\\D/g, '');\n\n if (digits.length >= 2) {\n const month = Number(digits.slice(0, 2));\n if (month >= 1 && month <= 12) {\n setViewMonth(month - 1);\n }\n }\n\n if (digits.length === 8) {\n const year = Number(digits.slice(4, 8));\n if (year >= 1000 && year <= 9999) {\n setViewYear(year);\n }\n }\n },\n [setViewMonth, setViewYear],\n );\n\n const handleDayClick = React.useCallback(\n (date: Date) => {\n const isoDate = formatIso(date);\n const displayDate = formatDateValue(date);\n if (!isControlled) {\n setUncontrolledValue(isoDate);\n }\n setInputValue(displayDate);\n setManualError(null);\n onChange?.(isoDate);\n handleOpenChange(false);\n },\n [isControlled, onChange, handleOpenChange],\n );\n\n const syncSelectedDate = React.useCallback(\n (date: Date) => {\n const isoDate = formatIso(date);\n const displayDate = formatDateValue(date);\n\n if (!isDateWithinRange(date, min, max)) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledValue(isoDate);\n }\n setInputValue(displayDate);\n setManualError(null);\n onChange?.(isoDate);\n },\n [isControlled, max, min, onChange],\n );\n\n const commitValue = React.useCallback(\n (nextValue: string) => {\n if (!isControlled) {\n setUncontrolledValue(nextValue);\n }\n onChange?.(nextValue);\n },\n [isControlled, onChange],\n );\n\n const commitTypedValue = React.useCallback(() => {\n const trimmedValue = inputValue.trim();\n\n if (!trimmedValue) {\n setManualError(null);\n commitValue('');\n setInputValue('');\n return;\n }\n\n const parsedDate = parseDateValue(trimmedValue);\n\n if (!parsedDate) {\n setManualError('Enter a valid date in MM/DD/YYYY format.');\n return;\n }\n\n if (!isDateWithinRange(parsedDate, min, max)) {\n setManualError('Entered date is outside the allowed range.');\n return;\n }\n\n const normalizedDate = formatDateValue(parsedDate);\n const isoDate = formatIso(parsedDate);\n setManualError(null);\n commitValue(isoDate);\n setInputValue(normalizedDate);\n }, [commitValue, inputValue, max, min]);\n\n const updateDateFromCalendarView = React.useCallback(\n (nextYear: number, nextMonth: number) => {\n const baseDate = parseDateValue(inputValue) ?? parseDateValue(normalizedCurrentValue);\n\n if (!baseDate) {\n return;\n }\n\n const lastDayOfMonth = new Date(nextYear, nextMonth + 1, 0).getDate();\n const nextDay = Math.min(baseDate.getDate(), lastDayOfMonth);\n const nextDate = new Date(nextYear, nextMonth, nextDay);\n\n syncSelectedDate(nextDate);\n },\n [inputValue, normalizedCurrentValue, syncSelectedDate],\n );\n\n const containerClasses = cn(\n inputStyles.container,\n inputStyles[resolvedSize],\n appearance && inputStyles[`appearance-${appearance}`],\n { [inputStyles.error]: hasError },\n { [inputStyles.disabled]: disabled },\n { [inputStyles.placeholder]: !!resolvedPlaceholder },\n { [inputStyles['has-value']]: hasValue || !!inputValue },\n { [inputStyles['is-focused']]: isFocused || displayOpen },\n className,\n );\n\n return (\n <>\n <div\n data-slot={'date-picker'}\n data-constellation-field\n data-appearance={appearance}\n className={containerClasses}\n >\n <div ref={fieldRef} className={inputStyles['input-container']}>\n <div className={inputStyles['label-container']}>\n <Label htmlFor={triggerId}>\n {label}\n {required && <span className={inputStyles.required}>*</span>}\n </Label>\n </div>\n <input\n ref={inputRef}\n id={triggerId}\n type={'text'}\n className={cn(inputStyles['input-field'], s['text-input'])}\n value={inputValue}\n disabled={disabled}\n placeholder={resolvedPlaceholder}\n aria-invalid={hasError ? 'true' : undefined}\n aria-describedby={helperMessage ? helperId : undefined}\n inputMode={'numeric'}\n autoComplete={'off'}\n maxLength={10}\n pattern={'\\\\d{2}/\\\\d{2}/\\\\d{4}'}\n onChange={e => {\n const maskedValue = maskDateInput(e.target.value);\n setInputValue(maskedValue);\n syncCalendarPreview(maskedValue);\n setManualError(null);\n }}\n onFocus={() => {\n setIsFocused(true);\n handleOpenChange(true);\n syncCalendarPreview(inputValue);\n }}\n onBlur={() => {\n setIsFocused(false);\n commitTypedValue();\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitTypedValue();\n handleOpenChange(false);\n }\n\n // Guarded + preventDefault so Escape dismisses this calendar and\n // not the Dialog around it, while a closed field ignores the key.\n if (e.key === 'Escape' && displayOpen) {\n e.preventDefault();\n setManualError(null);\n setInputValue(formatDisplayDate(normalizedCurrentValue));\n handleOpenChange(false);\n }\n }}\n />\n <button\n type={'button'}\n className={s.trigger}\n aria-label={'Open calendar'}\n disabled={disabled}\n onMouseDown={e => e.preventDefault()}\n onClick={() => {\n handleOpenChange(true);\n syncCalendarPreview(inputValue);\n inputRef.current?.focus();\n }}\n >\n <CalendarIcon className={s['trigger-icon']} />\n <span className={'srOnly'}>Open calendar</span>\n </button>\n </div>\n {helperMessage ? (\n <Typography id={helperId} variant={'caption'} className={inputStyles['helper-text']}>\n {helperMessage}\n </Typography>\n ) : null}\n </div>\n {name && <input type={'hidden'} name={name} value={normalizedCurrentValue} />}\n {displayOpen\n ? createPortal(\n <div\n data-constellation-portal={''}\n ref={contentRef}\n className={s.content}\n data-state={isOpen ? 'open' : 'closed'}\n data-closing={isClosing ? 'true' : undefined}\n data-side={'bottom'}\n style={{\n position: 'fixed',\n top: position.top,\n left: position.left,\n }}\n >\n <Row gap={1} justify={'space-between'}>\n <Button\n type={'button'}\n theme={'inherit'}\n size={'sm'}\n variant={'ghost'}\n iconOnly\n onClick={goToPrevMonth}\n disabled={!canGoPrev}\n aria-label={'Previous month'}\n >\n <ChevronLeftIcon />\n </Button>\n <Row gap={1}>\n <Select\n value={String(viewMonth)}\n onValueChange={v => {\n const nextMonth = Number(v);\n setViewMonth(nextMonth);\n updateDateFromCalendarView(viewYear, nextMonth);\n }}\n >\n <SelectTrigger className={s['header-trigger']} aria-label={'Month'}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {monthNames.map((name, i) => (\n <SelectItem key={i} value={String(i)}>\n {name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select\n value={String(viewYear)}\n onValueChange={v => {\n const nextYear = Number(v);\n setViewYear(nextYear);\n updateDateFromCalendarView(nextYear, viewMonth);\n }}\n >\n <SelectTrigger className={s['header-trigger']} aria-label={'Year'}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {yearRange.map(y => (\n <SelectItem key={y} value={String(y)}>\n {y}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Row>\n <Button\n theme={'inherit'}\n size={'sm'}\n variant={'ghost'}\n iconOnly\n type={'button'}\n onClick={goToNextMonth}\n disabled={!canGoNext}\n aria-label={'Next month'}\n >\n <ChevronRightIcon />\n </Button>\n </Row>\n <div className={s.weekdays}>\n {weekdays.map(wd => (\n <span key={wd} className={s.weekday}>\n {wd}\n </span>\n ))}\n </div>\n <div className={s.grid}>\n {days.map((d, i) => (\n <button\n key={i}\n type={'button'}\n className={cn(\n s.day,\n { [s.outside]: !d.isCurrentMonth },\n { [s.today]: d.isToday },\n { [s.selected]: d.isSelected },\n )}\n disabled={d.isDisabled}\n onClick={() => handleDayClick(d.date)}\n aria-label={d.date.toLocaleDateString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n >\n {d.day}\n </button>\n ))}\n </div>\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n\nexport { DatePicker };\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":"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"}
@@ -5,10 +5,44 @@
5
5
  --small-font-size: 0.8125rem;
6
6
  }
7
7
 
8
+ /*
9
+ * A field's box is described by five custom properties on the container, and
10
+ * an appearance only ever re-points them.
11
+ *
12
+ * It has to work that way. `filled` and `underline` can be asked for by a prop
13
+ * OR by `data-field-appearance` on an ancestor, and the ancestor form carries
14
+ * an extra selector — so a rule that reached into `.input-container` from
15
+ * there would out-specify the focus and error rules below and a filled field
16
+ * would stop showing either. Variables have no such contest: the appearance
17
+ * says what the box is, the state rules say what colour it is.
18
+ */
8
19
  .input-module_container__bycn1 {
9
20
  display: flex;
10
21
  --constellation-field-background: var(--background-default);
22
+ --constellation-field-border-color: var(--input-standard-enabled-border);
23
+ --constellation-field-border-width: 1px;
11
24
  --constellation-field-label-background: transparent;
25
+ --constellation-field-margin: 1px;
26
+ --constellation-field-radius: var(--field-radius, 36px);
27
+ --constellation-field-ring: inset 0 0 0 1px;
28
+ /*
29
+ * Opaque on purpose. The floating label paints the field's ground behind
30
+ * its lower half to notch the top edge, so an alpha here would be laid down
31
+ * twice and show as a darker strip under the label.
32
+ */
33
+ }
34
+ .input-module_container__bycn1.input-module_appearance-filled__thOK6, [data-field-appearance='filled'] .input-module_container__bycn1:not([data-appearance]) {
35
+ --constellation-field-background: var(--field-filled-background, var(--surface-muted));
36
+ --constellation-field-border-color: transparent;
37
+ }
38
+ .input-module_container__bycn1.input-module_appearance-underline__Vo61x, [data-field-appearance='underline'] .input-module_container__bycn1:not([data-appearance]) {
39
+ --constellation-field-background: transparent;
40
+ --constellation-field-border-width: 0 0 1px;
41
+ --constellation-field-margin: 1px 0;
42
+ --constellation-field-radius: 0;
43
+ --constellation-field-ring: 0 1px 0 0;
44
+ }
45
+ .input-module_container__bycn1 {
12
46
  flex-direction: column;
13
47
  gap: 4px;
14
48
  min-width: var(--input-min-width, 140px);
@@ -34,13 +68,15 @@
34
68
  .input-module_container__bycn1 .input-module_input-container__nw0Oc {
35
69
  align-items: center;
36
70
  background-color: var(--constellation-field-background);
37
- border: 1px solid var(--input-standard-enabled-border);
38
- border-radius: 36px;
71
+ border-color: var(--constellation-field-border-color);
72
+ border-radius: var(--constellation-field-radius);
73
+ border-style: solid;
74
+ border-width: var(--constellation-field-border-width);
39
75
  box-shadow: inset 0 0 0 0 transparent;
40
76
  box-sizing: border-box;
41
77
  display: flex;
42
78
  gap: 2px;
43
- margin: 1px;
79
+ margin: var(--constellation-field-margin);
44
80
  min-width: 0;
45
81
  position: relative;
46
82
  transition: border-color 0.3s ease, box-shadow 0.3s ease;
@@ -120,7 +156,7 @@
120
156
  width: 22px;
121
157
  }
122
158
  .input-module_container__bycn1 .input-module_input-container__nw0Oc.input-module_textarea-container__cc9-3 {
123
- border-radius: var(--size-2);
159
+ border-radius: min(var(--constellation-field-radius), var(--size-2));
124
160
  }
125
161
  .input-module_container__bycn1 .input-module_input-container__nw0Oc.input-module_textarea-container__cc9-3 textarea {
126
162
  border: none;
@@ -133,7 +169,7 @@
133
169
  }
134
170
  .input-module_container__bycn1.input-module_is-focused__08nzj .input-module_input-container__nw0Oc {
135
171
  border-color: var(--primary-emphasis);
136
- box-shadow: inset 0 0 0 1px var(--primary-emphasis);
172
+ box-shadow: var(--constellation-field-ring) var(--primary-emphasis);
137
173
  }
138
174
  .input-module_container__bycn1.input-module_error__ftn_q .input-module_label-container__SngtG label,
139
175
  .input-module_container__bycn1.input-module_error__ftn_q .input-module_helper-text__DvzFI {
@@ -141,7 +177,7 @@
141
177
  }
142
178
  .input-module_container__bycn1.input-module_error__ftn_q .input-module_input-container__nw0Oc {
143
179
  border-color: var(--destructive-emphasis);
144
- box-shadow: inset 0 0 0 1px var(--destructive-emphasis);
180
+ box-shadow: var(--constellation-field-ring) var(--destructive-emphasis);
145
181
  }
146
182
  .input-module_container__bycn1.input-module_disabled__9RjjE {
147
183
  cursor: not-allowed;
@@ -1,3 +1,4 @@
1
+ import type { FieldAppearance } from '@constellation/types';
1
2
  import * as React from 'react';
2
3
  type InputSize = 'sm' | 'md' | 'lg';
3
4
  type InputType = React.InputHTMLAttributes<HTMLInputElement>['type'] | 'textarea';
@@ -5,6 +6,11 @@ export interface InputBaseProps {
5
6
  label?: string;
6
7
  sizeVariant?: InputSize;
7
8
  error?: boolean;
9
+ /**
10
+ * How the box is drawn: `outlined` (the default), `filled` or `underline`.
11
+ * Leave it unset to follow `data-field-appearance` on an ancestor.
12
+ */
13
+ appearance?: FieldAppearance;
8
14
  helperText?: string;
9
15
  startAdornment?: React.ReactNode;
10
16
  endAdornment?: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/form/Input/input.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC,KAAK,SAAS,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,eAAe,GAAG,cAAc,GACnC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAEJ,KAAK,aAAa,GAAG,cAAc,GACjC,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,GAAG;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAGJ,KAAK,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;AAGlD,QAAA,MAAM,KAAK,2GAqLV,CAAC;AAIF,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../../src/form/Input/input.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEpC,KAAK,SAAS,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,eAAe,GAAG,cAAc,GACnC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAEJ,KAAK,aAAa,GAAG,cAAc,GACjC,KAAK,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,GAAG;IAClD,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAGJ,KAAK,UAAU,GAAG,eAAe,GAAG,aAAa,CAAC;AAGlD,QAAA,MAAM,KAAK,2GA6LV,CAAC;AAIF,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -7,7 +7,7 @@ import * as React from 'react';
7
7
  import inputStyles from './input.module.scss.js';
8
8
 
9
9
  // The Custom Input Component
10
- const Input = React.forwardRef(({ label, sizeVariant, error = false, helperText, startAdornment, endAdornment, id, type = 'text', rows, ghost, className, onFocus, onBlur, style, ...rest }, ref) => {
10
+ const Input = React.forwardRef(({ label, sizeVariant, error = false, appearance, helperText, startAdornment, endAdornment, id, type = 'text', rows, ghost, className, onFocus, onBlur, style, ...rest }, ref) => {
11
11
  const { isBelow } = useBreakpoint();
12
12
  /*
13
13
  * Compose rather than let the caller's handler win.
@@ -31,7 +31,7 @@ const Input = React.forwardRef(({ label, sizeVariant, error = false, helperText,
31
31
  const resolvedSize = sizeVariant === 'md' && isBelow(900) ? 'sm' : (sizeVariant ?? (isBelow(900) ? 'sm' : 'md'));
32
32
  const isTextArea = type === 'textarea';
33
33
  const [isFocused, setIsFocused] = React.useState(false);
34
- const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: error }, { [inputStyles.disabled]: rest.disabled }, { [inputStyles.placeholder]: rest.placeholder }, { [inputStyles['is-focused']]: isFocused }, { [inputStyles['has-value']]: rest.value },
34
+ const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], appearance && inputStyles[`appearance-${appearance}`], { [inputStyles.error]: error }, { [inputStyles.disabled]: rest.disabled }, { [inputStyles.placeholder]: rest.placeholder }, { [inputStyles['is-focused']]: isFocused }, { [inputStyles['has-value']]: rest.value },
35
35
  /*
36
36
  * The caller's className lands on the ROOT, next to `style`.
37
37
  *
@@ -52,7 +52,7 @@ const Input = React.forwardRef(({ label, sizeVariant, error = false, helperText,
52
52
  * properties inherit downward only. The override silently did nothing.
53
53
  * Inherited text properties still reach the field from here.
54
54
  */
55
- jsxs("div", { "data-slot": 'input', "data-constellation-field": true, className: containerClasses, style: style, children: [jsxs("div", { className: cn(inputStyles['input-container'], isTextArea && inputStyles['textarea-container']), children: [startAdornment && (jsx("span", { "data-slot": 'input-start-adornment', className: inputStyles['adornment'], children: startAdornment })), jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: inputId, children: [label, (rest['aria-required'] || rest.required) && jsx("span", { className: inputStyles.required, children: "*" })] }) }), isTextArea ? (jsx("textarea", { "data-slot": 'input-field', id: inputId, className: inputStyles['input-field'], "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperId, onFocus: handleFocus, onBlur: handleBlur, ref: ref, rows: rows, ...rest })) : ghost !== undefined ? (
55
+ jsxs("div", { "data-slot": 'input', "data-constellation-field": true, "data-appearance": appearance, className: containerClasses, style: style, children: [jsxs("div", { className: cn(inputStyles['input-container'], isTextArea && inputStyles['textarea-container']), children: [startAdornment && (jsx("span", { "data-slot": 'input-start-adornment', className: inputStyles['adornment'], children: startAdornment })), jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: inputId, children: [label, (rest['aria-required'] || rest.required) && jsx("span", { className: inputStyles.required, children: "*" })] }) }), isTextArea ? (jsx("textarea", { "data-slot": 'input-field', id: inputId, className: inputStyles['input-field'], "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperId, onFocus: handleFocus, onBlur: handleBlur, ref: ref, rows: rows, ...rest })) : ghost !== undefined ? (
56
56
  /*
57
57
  * The ghost is drawn by re-rendering the typed value INVISIBLY and
58
58
  * letting the suggestion follow it, so the two share one text flow
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sources":["../../../src/form/Input/input.tsx"],"sourcesContent":["import { Label } from '@constellation/form/Label';\nimport { useBreakpoint } from '@constellation/hooks/use-mobile';\nimport { Typography } from '@constellation/typography/Typography';\nimport cn from 'clsx';\nimport * as React from 'react';\nimport s from './input.module.scss';\n\n// Define the possible size variants\ntype InputSize = 'sm' | 'md' | 'lg';\n\ntype InputType = React.InputHTMLAttributes<HTMLInputElement>['type'] | 'textarea';\n\nexport interface InputBaseProps {\n label?: string;\n sizeVariant?: InputSize;\n error?: boolean;\n helperText?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n /**\n * Inline completion drawn behind the caret — the TAIL only, not the whole\n * word. `value='Avo'` with `ghost='cado'` reads as \"Avocado\", the suggestion\n * dimmed.\n *\n * The component owns the alignment; you own the policy. What to suggest and\n * which key accepts it are decisions about your data and your users (a phone\n * has a spacebar under the thumb and no Tab), so they stay with the caller.\n * Accept by setting `value` to the completed string in your own `onKeyDown`.\n *\n * Pass `''` (not `undefined`) for \"nothing to suggest right now\": the\n * element structure stays stable, so the field is never remounted mid-word.\n *\n * Ignored for `type='textarea'` — a ghost cannot follow a caret across\n * wrapped lines without measuring, which is a different component.\n */\n ghost?: string;\n}\n\ntype InputFieldProps = InputBaseProps &\n React.InputHTMLAttributes<HTMLInputElement> & {\n type?: Exclude<InputType, 'textarea'>;\n rows?: never;\n };\n\ntype TextAreaProps = InputBaseProps &\n React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n type: 'textarea';\n rows?: number;\n };\n\n// Define the component's prop interface\ntype InputProps = InputFieldProps | TextAreaProps;\n\n// The Custom Input Component\nconst Input = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, InputProps>(\n (\n {\n label,\n sizeVariant,\n error = false,\n helperText,\n startAdornment,\n endAdornment,\n id,\n type = 'text',\n rows,\n ghost,\n className,\n onFocus,\n onBlur,\n style,\n ...rest\n },\n ref,\n ) => {\n const { isBelow } = useBreakpoint();\n\n /*\n * Compose rather than let the caller's handler win.\n *\n * These used to be set before `{...rest}` spread over them, so any consumer\n * passing `onFocus` — to select-all on entry, say — silently replaced the\n * one driving the floating label, and the label stopped animating with no\n * error to point at it.\n */\n const handleFocus = (event: React.FocusEvent<HTMLInputElement & HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: React.FocusEvent<HTMLInputElement & HTMLTextAreaElement>) => {\n setIsFocused(false);\n onBlur?.(event);\n };\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const helperId = helperText ? `${inputId}-helper` : undefined;\n const resolvedSize =\n sizeVariant === 'md' && isBelow(900) ? 'sm' : (sizeVariant ?? (isBelow(900) ? 'sm' : 'md'));\n const isTextArea = type === 'textarea';\n const [isFocused, setIsFocused] = React.useState(false);\n\n const containerClasses = cn(\n s.container,\n s[resolvedSize],\n { [s.error]: error },\n { [s.disabled]: rest.disabled },\n { [s.placeholder]: rest.placeholder },\n { [s['is-focused']]: isFocused },\n { [s['has-value']]: rest.value },\n /*\n * The caller's className lands on the ROOT, next to `style`.\n *\n * It used to ride `...rest` onto the inner <input>, which put it on a\n * different element than `style` — so `.qty-field { flex: 0 0 4.5rem }`\n * was sizing the field inside the box rather than the box, and the\n * wrapper kept its 140px default. Every other component in the library\n * puts className on its root; this now matches.\n */\n className,\n );\n\n return (\n /*\n * `style` belongs on the ROOT, which is this container.\n *\n * It used to fall through `...rest` onto the inner <input>, so a custom\n * property meant for the wrapper — `--input-min-width` is the obvious one\n * — was set on a child of the element that reads it, and custom\n * properties inherit downward only. The override silently did nothing.\n * Inherited text properties still reach the field from here.\n */\n <div data-slot={'input'} data-constellation-field className={containerClasses} style={style}>\n <div className={cn(s['input-container'], isTextArea && s['textarea-container'])}>\n {/* Start Adornment */}\n {startAdornment && (\n <span data-slot={'input-start-adornment'} className={s['adornment']}>\n {startAdornment}\n </span>\n )}\n\n <div className={s['label-container']}>\n <Label htmlFor={inputId}>\n {label}\n {(rest['aria-required'] || rest.required) && <span className={s.required}>*</span>}\n </Label>\n </div>\n {isTextArea ? (\n <textarea\n data-slot={'input-field'}\n id={inputId}\n className={s['input-field']}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLTextAreaElement>}\n rows={rows}\n {...(rest as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n ) : ghost !== undefined ? (\n /*\n * The ghost is drawn by re-rendering the typed value INVISIBLY and\n * letting the suggestion follow it, so the two share one text flow\n * and the ghost lands exactly where the caret is — no measuring, and\n * nothing to drift when the font or padding changes.\n *\n * The wrapper exists so `inset: 0` means the input's box rather than\n * the container's, which would be off by the padding and by any\n * start adornment.\n *\n * Branching on `ghost !== undefined` rather than on the string being\n * non-empty is load-bearing: a suggestion appears and disappears as\n * you type, and switching JSX shape underneath a live field makes\n * React unmount and remount the input — which drops focus, the\n * caret and any IME composition mid-word. Pass `ghost=''` for \"no\n * suggestion right now\" and the element stays put.\n */\n <span className={s['ghost-wrap']}>\n {ghost ? (\n <span aria-hidden={'true'} className={s['ghost']}>\n <span className={s['ghost-typed']}>{String(rest.value ?? '')}</span>\n {ghost}\n </span>\n ) : null}\n <input\n data-slot={'input-field'}\n id={inputId}\n className={cn(s['input-field'], ghost && s['input-field--ghosted'])}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n aria-autocomplete={'inline'}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLInputElement>}\n type={type}\n {...(rest as React.InputHTMLAttributes<HTMLInputElement>)}\n />\n </span>\n ) : (\n <input\n data-slot={'input-field'}\n id={inputId}\n className={s['input-field']}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLInputElement>}\n type={type}\n {...(rest as React.InputHTMLAttributes<HTMLInputElement>)}\n />\n )}\n\n {/* End Adornment */}\n {endAdornment && (\n <span data-slot={'input-end-adornment'} className={s['adornment']}>\n {endAdornment}\n </span>\n )}\n </div>\n\n {/* Helper Text */}\n {helperText && (\n <Typography\n data-slot={'input-helper-text'}\n id={helperId}\n variant={'caption'}\n className={s['helper-text']}\n >\n {helperText}\n </Typography>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n\nexport { Input };\n"],"names":["s","_jsxs","_jsx"],"mappings":";;;;;;;;AAqDA;AACA,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAC5B,CACE,EACE,KAAK,EACL,WAAW,EACX,KAAK,GAAG,KAAK,EACb,UAAU,EACV,cAAc,EACd,YAAY,EACZ,EAAE,EACF,IAAI,GAAG,MAAM,EACb,IAAI,EACJ,KAAK,EACL,SAAS,EACT,OAAO,EACP,MAAM,EACN,KAAK,EACL,GAAG,IAAI,EACR,EACD,GAAG,KACD;AACF,IAAA,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;AAEnC;;;;;;;AAOG;AACH,IAAA,MAAM,WAAW,GAAG,CAAC,KAA+D,KAAI;QACtF,YAAY,CAAC,IAAI,CAAC;AAClB,QAAA,OAAO,GAAG,KAAK,CAAC;AAClB,IAAA,CAAC;AACD,IAAA,MAAM,UAAU,GAAG,CAAC,KAA+D,KAAI;QACrF,YAAY,CAAC,KAAK,CAAC;AACnB,QAAA,MAAM,GAAG,KAAK,CAAC;AACjB,IAAA,CAAC;AACD,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,EAAE;AACjC,IAAA,MAAM,OAAO,GAAG,EAAE,IAAI,WAAW;AACjC,IAAA,MAAM,QAAQ,GAAG,UAAU,GAAG,CAAA,EAAG,OAAO,CAAA,OAAA,CAAS,GAAG,SAAS;AAC7D,IAAA,MAAM,YAAY,GAChB,WAAW,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,WAAW,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AAC7F,IAAA,MAAM,UAAU,GAAG,IAAI,KAAK,UAAU;AACtC,IAAA,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AAEvD,IAAA,MAAM,gBAAgB,GAAG,EAAE,CACzBA,WAAC,CAAC,SAAS,EACXA,WAAC,CAAC,YAAY,CAAC,EACf,EAAE,CAACA,WAAC,CAAC,KAAK,GAAG,KAAK,EAAE,EACpB,EAAE,CAACA,WAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,EAC/B,EAAE,CAACA,WAAC,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,EACrC,EAAE,CAACA,WAAC,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,EAChC,EAAE,CAACA,WAAC,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AAChC;;;;;;;;AAQG;AACH,IAAA,SAAS,CACV;IAED;AACE;;;;;;;;AAQG;AACH,IAAAC,IAAA,CAAA,KAAA,EAAA,EAAA,WAAA,EAAgB,OAAO,EAAA,0BAAA,EAAA,IAAA,EAA2B,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAA,QAAA,EAAA,CACzFA,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,EAAE,CAACD,WAAC,CAAC,iBAAiB,CAAC,EAAE,UAAU,IAAIA,WAAC,CAAC,oBAAoB,CAAC,CAAC,EAAA,QAAA,EAAA,CAE5E,cAAc,KACbE,2BAAiB,uBAAuB,EAAE,SAAS,EAAEF,WAAC,CAAC,WAAW,CAAC,YAChE,cAAc,EAAA,CACV,CACR,EAEDE,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAEF,WAAC,CAAC,iBAAiB,CAAC,EAAA,QAAA,EAClCC,IAAA,CAAC,KAAK,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAAA,CACpB,KAAK,EACL,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAKC,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEF,WAAC,CAAC,QAAQ,EAAA,QAAA,EAAA,GAAA,EAAA,CAAU,CAAA,EAAA,CAC5E,EAAA,CACJ,EACL,UAAU,IACTE,GAAA,CAAA,UAAA,EAAA,EAAA,WAAA,EACa,aAAa,EACxB,EAAE,EAAE,OAAO,EACX,SAAS,EAAEF,WAAC,CAAC,aAAa,CAAC,EAAA,cAAA,EACb,KAAK,GAAG,MAAM,GAAG,SAAS,EAAA,kBAAA,EACtB,QAAQ,EAC1B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,GAAqC,EAC1C,IAAI,EAAE,IAAI,EAAA,GACL,IAA0D,EAAA,CAC/D,IACA,KAAK,KAAK,SAAS;AACrB;;;;;;;;;;;;;;;;AAgBG;oBACHC,IAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAED,WAAC,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,CAC7B,KAAK,IACJC,IAAA,CAAA,MAAA,EAAA,EAAA,aAAA,EAAmB,MAAM,EAAE,SAAS,EAAED,WAAC,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,CAC9CE,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAEF,WAAC,CAAC,aAAa,CAAC,YAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAA,CAAQ,EACnE,KAAK,CAAA,EAAA,CACD,IACL,IAAI,EACRE,GAAA,CAAA,OAAA,EAAA,EAAA,WAAA,EACa,aAAa,EACxB,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,EAAE,CAACF,WAAC,CAAC,aAAa,CAAC,EAAE,KAAK,IAAIA,WAAC,CAAC,sBAAsB,CAAC,CAAC,EAAA,cAAA,EACrD,KAAK,GAAG,MAAM,GAAG,SAAS,sBACtB,QAAQ,EAAA,mBAAA,EACP,QAAQ,EAC3B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,GAAkC,EACvC,IAAI,EAAE,IAAI,KACL,IAAoD,EAAA,CACzD,IACG,KAEPE,4BACa,aAAa,EACxB,EAAE,EAAE,OAAO,EACX,SAAS,EAAEF,WAAC,CAAC,aAAa,CAAC,EAAA,cAAA,EACb,KAAK,GAAG,MAAM,GAAG,SAAS,EAAA,kBAAA,EACtB,QAAQ,EAC1B,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,GAAkC,EACvC,IAAI,EAAE,IAAI,EAAA,GACL,IAAoD,EAAA,CACzD,CACH,EAGA,YAAY,KACXE,GAAA,CAAA,MAAA,EAAA,EAAA,WAAA,EAAiB,qBAAqB,EAAE,SAAS,EAAEF,WAAC,CAAC,WAAW,CAAC,YAC9D,YAAY,EAAA,CACR,CACR,CAAA,EAAA,CACG,EAGL,UAAU,KACTE,GAAA,CAAC,UAAU,EAAA,EAAA,WAAA,EACE,mBAAmB,EAC9B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,SAAS,EAClB,SAAS,EAAEF,WAAC,CAAC,aAAa,CAAC,EAAA,QAAA,EAE1B,UAAU,EAAA,CACA,CACd,CAAA,EAAA,CACG;AAEV,CAAC;AAGH,KAAK,CAAC,WAAW,GAAG,OAAO;;"}
1
+ {"version":3,"file":"input.js","sources":["../../../src/form/Input/input.tsx"],"sourcesContent":["import { Label } from '@constellation/form/Label';\nimport { useBreakpoint } from '@constellation/hooks/use-mobile';\nimport type { FieldAppearance } from '@constellation/types';\nimport { Typography } from '@constellation/typography/Typography';\nimport cn from 'clsx';\nimport * as React from 'react';\nimport s from './input.module.scss';\n\n// Define the possible size variants\ntype InputSize = 'sm' | 'md' | 'lg';\n\ntype InputType = React.InputHTMLAttributes<HTMLInputElement>['type'] | 'textarea';\n\nexport interface InputBaseProps {\n label?: string;\n sizeVariant?: InputSize;\n error?: boolean;\n /**\n * How the box is drawn: `outlined` (the default), `filled` or `underline`.\n * Leave it unset to follow `data-field-appearance` on an ancestor.\n */\n appearance?: FieldAppearance;\n helperText?: string;\n startAdornment?: React.ReactNode;\n endAdornment?: React.ReactNode;\n /**\n * Inline completion drawn behind the caret — the TAIL only, not the whole\n * word. `value='Avo'` with `ghost='cado'` reads as \"Avocado\", the suggestion\n * dimmed.\n *\n * The component owns the alignment; you own the policy. What to suggest and\n * which key accepts it are decisions about your data and your users (a phone\n * has a spacebar under the thumb and no Tab), so they stay with the caller.\n * Accept by setting `value` to the completed string in your own `onKeyDown`.\n *\n * Pass `''` (not `undefined`) for \"nothing to suggest right now\": the\n * element structure stays stable, so the field is never remounted mid-word.\n *\n * Ignored for `type='textarea'` — a ghost cannot follow a caret across\n * wrapped lines without measuring, which is a different component.\n */\n ghost?: string;\n}\n\ntype InputFieldProps = InputBaseProps &\n React.InputHTMLAttributes<HTMLInputElement> & {\n type?: Exclude<InputType, 'textarea'>;\n rows?: never;\n };\n\ntype TextAreaProps = InputBaseProps &\n React.TextareaHTMLAttributes<HTMLTextAreaElement> & {\n type: 'textarea';\n rows?: number;\n };\n\n// Define the component's prop interface\ntype InputProps = InputFieldProps | TextAreaProps;\n\n// The Custom Input Component\nconst Input = React.forwardRef<HTMLInputElement | HTMLTextAreaElement, InputProps>(\n (\n {\n label,\n sizeVariant,\n error = false,\n appearance,\n helperText,\n startAdornment,\n endAdornment,\n id,\n type = 'text',\n rows,\n ghost,\n className,\n onFocus,\n onBlur,\n style,\n ...rest\n },\n ref,\n ) => {\n const { isBelow } = useBreakpoint();\n\n /*\n * Compose rather than let the caller's handler win.\n *\n * These used to be set before `{...rest}` spread over them, so any consumer\n * passing `onFocus` — to select-all on entry, say — silently replaced the\n * one driving the floating label, and the label stopped animating with no\n * error to point at it.\n */\n const handleFocus = (event: React.FocusEvent<HTMLInputElement & HTMLTextAreaElement>) => {\n setIsFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: React.FocusEvent<HTMLInputElement & HTMLTextAreaElement>) => {\n setIsFocused(false);\n onBlur?.(event);\n };\n const generatedId = React.useId();\n const inputId = id ?? generatedId;\n const helperId = helperText ? `${inputId}-helper` : undefined;\n const resolvedSize =\n sizeVariant === 'md' && isBelow(900) ? 'sm' : (sizeVariant ?? (isBelow(900) ? 'sm' : 'md'));\n const isTextArea = type === 'textarea';\n const [isFocused, setIsFocused] = React.useState(false);\n\n const containerClasses = cn(\n s.container,\n s[resolvedSize],\n appearance && s[`appearance-${appearance}`],\n { [s.error]: error },\n { [s.disabled]: rest.disabled },\n { [s.placeholder]: rest.placeholder },\n { [s['is-focused']]: isFocused },\n { [s['has-value']]: rest.value },\n /*\n * The caller's className lands on the ROOT, next to `style`.\n *\n * It used to ride `...rest` onto the inner <input>, which put it on a\n * different element than `style` — so `.qty-field { flex: 0 0 4.5rem }`\n * was sizing the field inside the box rather than the box, and the\n * wrapper kept its 140px default. Every other component in the library\n * puts className on its root; this now matches.\n */\n className,\n );\n\n return (\n /*\n * `style` belongs on the ROOT, which is this container.\n *\n * It used to fall through `...rest` onto the inner <input>, so a custom\n * property meant for the wrapper — `--input-min-width` is the obvious one\n * — was set on a child of the element that reads it, and custom\n * properties inherit downward only. The override silently did nothing.\n * Inherited text properties still reach the field from here.\n */\n <div\n data-slot={'input'}\n data-constellation-field\n data-appearance={appearance}\n className={containerClasses}\n style={style}\n >\n <div className={cn(s['input-container'], isTextArea && s['textarea-container'])}>\n {/* Start Adornment */}\n {startAdornment && (\n <span data-slot={'input-start-adornment'} className={s['adornment']}>\n {startAdornment}\n </span>\n )}\n\n <div className={s['label-container']}>\n <Label htmlFor={inputId}>\n {label}\n {(rest['aria-required'] || rest.required) && <span className={s.required}>*</span>}\n </Label>\n </div>\n {isTextArea ? (\n <textarea\n data-slot={'input-field'}\n id={inputId}\n className={s['input-field']}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLTextAreaElement>}\n rows={rows}\n {...(rest as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n ) : ghost !== undefined ? (\n /*\n * The ghost is drawn by re-rendering the typed value INVISIBLY and\n * letting the suggestion follow it, so the two share one text flow\n * and the ghost lands exactly where the caret is — no measuring, and\n * nothing to drift when the font or padding changes.\n *\n * The wrapper exists so `inset: 0` means the input's box rather than\n * the container's, which would be off by the padding and by any\n * start adornment.\n *\n * Branching on `ghost !== undefined` rather than on the string being\n * non-empty is load-bearing: a suggestion appears and disappears as\n * you type, and switching JSX shape underneath a live field makes\n * React unmount and remount the input — which drops focus, the\n * caret and any IME composition mid-word. Pass `ghost=''` for \"no\n * suggestion right now\" and the element stays put.\n */\n <span className={s['ghost-wrap']}>\n {ghost ? (\n <span aria-hidden={'true'} className={s['ghost']}>\n <span className={s['ghost-typed']}>{String(rest.value ?? '')}</span>\n {ghost}\n </span>\n ) : null}\n <input\n data-slot={'input-field'}\n id={inputId}\n className={cn(s['input-field'], ghost && s['input-field--ghosted'])}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n aria-autocomplete={'inline'}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLInputElement>}\n type={type}\n {...(rest as React.InputHTMLAttributes<HTMLInputElement>)}\n />\n </span>\n ) : (\n <input\n data-slot={'input-field'}\n id={inputId}\n className={s['input-field']}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={helperId}\n onFocus={handleFocus}\n onBlur={handleBlur}\n ref={ref as React.Ref<HTMLInputElement>}\n type={type}\n {...(rest as React.InputHTMLAttributes<HTMLInputElement>)}\n />\n )}\n\n {/* End Adornment */}\n {endAdornment && (\n <span data-slot={'input-end-adornment'} className={s['adornment']}>\n {endAdornment}\n </span>\n )}\n </div>\n\n {/* Helper Text */}\n {helperText && (\n <Typography\n data-slot={'input-helper-text'}\n id={helperId}\n variant={'caption'}\n className={s['helper-text']}\n >\n {helperText}\n </Typography>\n )}\n </div>\n );\n },\n);\n\nInput.displayName = 'Input';\n\nexport { Input };\n"],"names":["s","_jsxs","_jsx"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import './input.css';
2
2
 
3
- var inputStyles = {"container":"input-module_container__bycn1","label-container":"input-module_label-container__SngtG","required":"input-module_required__J1bMP","input-container":"input-module_input-container__nw0Oc","ghost-wrap":"input-module_ghost-wrap__pHzia","ghost":"input-module_ghost__yVtI-","ghost-typed":"input-module_ghost-typed__r9NZN","adornment":"input-module_adornment__cO4v1","textarea-container":"input-module_textarea-container__cc9-3","helper-text":"input-module_helper-text__DvzFI","is-focused":"input-module_is-focused__08nzj","error":"input-module_error__ftn_q","disabled":"input-module_disabled__9RjjE","sm":"input-module_sm__AtYYB","placeholder":"input-module_placeholder__I29pr","has-value":"input-module_has-value__juKDe","md":"input-module_md__nPnVp","lg":"input-module_lg__dC2Tp"};
3
+ var inputStyles = {"container":"input-module_container__bycn1","appearance-filled":"input-module_appearance-filled__thOK6","appearance-underline":"input-module_appearance-underline__Vo61x","label-container":"input-module_label-container__SngtG","required":"input-module_required__J1bMP","input-container":"input-module_input-container__nw0Oc","ghost-wrap":"input-module_ghost-wrap__pHzia","ghost":"input-module_ghost__yVtI-","ghost-typed":"input-module_ghost-typed__r9NZN","adornment":"input-module_adornment__cO4v1","textarea-container":"input-module_textarea-container__cc9-3","helper-text":"input-module_helper-text__DvzFI","is-focused":"input-module_is-focused__08nzj","error":"input-module_error__ftn_q","disabled":"input-module_disabled__9RjjE","sm":"input-module_sm__AtYYB","placeholder":"input-module_placeholder__I29pr","has-value":"input-module_has-value__juKDe","md":"input-module_md__nPnVp","lg":"input-module_lg__dC2Tp"};
4
4
 
5
5
  export { inputStyles as default };
6
6
  //# sourceMappingURL=input.module.scss.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/form/Select/select.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA+B/B,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC1D,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACvD,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACxD,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;AAqVvF,iBAAS,OAAO,CAAC,EACf,KAAe,EACf,QAAQ,EACR,SAAS,EACT,gBAA4C,EAC5C,UAAU,EACV,WAAW,EACX,SAAiB,EACjB,SAAS,EACT,IAAI,EACJ,QAAmB,EACnB,IAAe,EACf,UAAc,EACd,UAAU,EACV,GAAG,KAAK,EACT,EAAE,YAAY,4BAoCd;AAED,iBAAS,MAAM,CAAC,EACd,IAAI,EAAE,QAAQ,EACd,WAAW,EACX,YAAY,EACZ,KAAK,EAAE,SAAS,EAChB,YAAY,EACZ,aAAa,EACb,QAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,WAAW,qBAoHb;AAED;;;;;;;GAOG;AACH,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAiBpE;AAED,iBAAS,WAAW,CAAC,EACnB,QAAQ,EACR,WAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,GAAG;IAAE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAS3E;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,EACJ,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACjD;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,qBA0DA;AAED,iBAAS,aAAa,CAAC,EACrB,KAAe,EACf,SAAS,EACT,QAAQ,EACR,gBAA4C,EAC5C,SAAS,EACT,QAAmB,EACnB,IAAe,EACf,UAAc,EACd,GAAG,KAAK,EACT,EAAE,kBAAkB,qBA2FpB;AAED,iBAAS,UAAU,CAAC,EAClB,SAAS,EACT,QAAQ,EACR,QAAgB,EAChB,OAAO,EACP,WAAW,EACX,KAAK,EACL,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,qBA2CnE;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,qBAErF;AA2lBD,iBAAS,WAAW,CAAC,KAAK,EAAE,gBAAgB,qBA+N3C;AAMD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC;AAEhC,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../src/form/Select/select.tsx"],"names":[],"mappings":"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"}
@@ -564,7 +564,7 @@ function SelectInputTrigger({ className, id, onBlur, onFocus, placeholder, searc
564
564
  }
565
565
  }, children: [jsx("input", { ref: inputRef, id: id, type: 'text', value: displayValue, placeholder: placeholder, onChange: handleChange, onKeyDown: handleKeyDown, onFocus: onFocus, onBlur: onBlur, disabled: context.disabled, "aria-controls": context.contentId, "aria-expanded": context.open, "aria-haspopup": 'listbox', className: selectStyles['search-trigger-input'], autoComplete: 'off', ...props }), jsx(ChevronDownIcon, { className: cn(selectStyles['trigger-icon']) })] }));
566
566
  }
567
- function MultiSelectField({ contentProps, defaultOpen, defaultValue, disabled = false, error, fieldClassName, filteredItems, getItemText, helperText, isFocused, isRequired, label, labelRef, minWidth, name, onOpenChange, onValueChange, open: openProp, placeholder, resolvedSize, searchable, selectableItems, searchQuery, setIsFocused, setSearchQuery, triggerId, value, }) {
567
+ function MultiSelectField({ appearance, contentProps, defaultOpen, defaultValue, disabled = false, error, fieldClassName, filteredItems, getItemText, helperText, isFocused, isRequired, label, labelRef, minWidth, name, onOpenChange, onValueChange, open: openProp, placeholder, resolvedSize, searchable, selectableItems, searchQuery, setIsFocused, setSearchQuery, triggerId, value, }) {
568
568
  const triggerRef = React.useRef(null);
569
569
  const contentRef = React.useRef(null);
570
570
  const viewportRef = React.useRef(null);
@@ -653,7 +653,7 @@ function MultiSelectField({ contentProps, defaultOpen, defaultValue, disabled =
653
653
  });
654
654
  }
655
655
  }, [currentOpen, searchable]);
656
- const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: error }, { [inputStyles.disabled]: disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: hasValue }, { [inputStyles['is-focused']]: isFocused || currentOpen || isClosing }, fieldClassName);
656
+ const containerClasses = cn(inputStyles.container, inputStyles[resolvedSize], appearance && inputStyles[`appearance-${appearance}`], { [inputStyles.error]: error }, { [inputStyles.disabled]: disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: hasValue }, { [inputStyles['is-focused']]: isFocused || currentOpen || isClosing }, fieldClassName);
657
657
  const handleKeyDown = (event) => {
658
658
  if (searchable) {
659
659
  const input = triggerRef.current?.querySelector('input');
@@ -699,7 +699,7 @@ function MultiSelectField({ contentProps, defaultOpen, defaultValue, disabled =
699
699
  moveItemFocus(viewportRef.current, 'select-multi-item', 'last');
700
700
  }
701
701
  };
702
- return (jsxs(Fragment, { children: [jsxs("div", { "data-constellation-field": true, className: containerClasses, style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsxs("div", { ref: triggerRef, tabIndex: -1, className: cn(selectStyles.trigger, selectStyles['input-trigger']), "data-placeholder": !hasValue ? 'true' : undefined, onClick: () => {
702
+ return (jsxs(Fragment, { children: [jsxs("div", { "data-constellation-field": true, "data-appearance": appearance, className: containerClasses, style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsxs("div", { ref: triggerRef, tabIndex: -1, className: cn(selectStyles.trigger, selectStyles['input-trigger']), "data-placeholder": !hasValue ? 'true' : undefined, onClick: () => {
703
703
  if (!currentOpen) {
704
704
  setOpen(true);
705
705
  }
@@ -784,7 +784,7 @@ function MultiSelectField({ contentProps, defaultOpen, defaultValue, disabled =
784
784
  }) }) })] }));
785
785
  }
786
786
  function SelectField(props) {
787
- const { label, helperText, error = false, placeholder, children, fieldClassName, contentProps, id, sizeVariant, searchThreshold = DEFAULT_SEARCH_THRESHOLD, } = props;
787
+ const { label, helperText, error = false, appearance, placeholder, children, fieldClassName, contentProps, id, sizeVariant, searchThreshold = DEFAULT_SEARCH_THRESHOLD, } = props;
788
788
  const generatedId = React.useId();
789
789
  const triggerId = id ?? generatedId;
790
790
  const { isBelow } = useBreakpoint();
@@ -872,7 +872,7 @@ function SelectField(props) {
872
872
  if (!nextOpen) {
873
873
  setSearchQuery('');
874
874
  }
875
- }, value: value, defaultValue: defaultValue, onValueChange: onValueChange, children: [jsxs("div", { "data-constellation-field": true, className: cn(inputStyles.container, inputStyles[resolvedSize], { [inputStyles.error]: error }, { [inputStyles.disabled]: props.disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: Boolean(value ?? defaultValue) }, { [inputStyles['is-focused']]: isFocused || isOpen }, fieldClassName), style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsx(SelectInputTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, placeholder: placeholder, searchQuery: searchQuery, setSearchQuery: setSearchQuery, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false) })) : (jsx(SelectTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, className: selectStyles['input-trigger'], onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), children: jsx(SelectValue, { placeholder: placeholder }) }))] }), helperText ? (jsx(Typography, { "data-slot": 'input-helper-text', id: `${triggerId}-helper`, variant: 'caption', className: inputStyles['helper-text'], children: helperText })) : null] }), jsx(SelectContent, { ...contentProps, onKeyDown: handleContentKeyDown, children: searchQuery ? filteredItems : childArray })] }));
875
+ }, value: value, defaultValue: defaultValue, onValueChange: onValueChange, children: [jsxs("div", { "data-constellation-field": true, "data-appearance": appearance, className: cn(inputStyles.container, inputStyles[resolvedSize], appearance && inputStyles[`appearance-${appearance}`], { [inputStyles.error]: error }, { [inputStyles.disabled]: props.disabled }, { [inputStyles.placeholder]: placeholder }, { [inputStyles['has-value']]: Boolean(value ?? defaultValue) }, { [inputStyles['is-focused']]: isFocused || isOpen }, fieldClassName), style: minWidth ? { minWidth: Math.max(minWidth, 140) } : undefined, children: [jsxs("div", { className: inputStyles['input-container'], children: [jsx("div", { className: inputStyles['label-container'], children: jsxs(Label, { htmlFor: triggerId, ref: labelRef, children: [label, isRequired && jsx("span", { className: inputStyles.required, children: "*" })] }) }), searchable ? (jsx(SelectInputTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, placeholder: placeholder, searchQuery: searchQuery, setSearchQuery: setSearchQuery, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false) })) : (jsx(SelectTrigger, { id: triggerId, "aria-invalid": error ? 'true' : undefined, "aria-describedby": helperText ? `${triggerId}-helper` : undefined, className: selectStyles['input-trigger'], onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), children: jsx(SelectValue, { placeholder: placeholder }) }))] }), helperText ? (jsx(Typography, { "data-slot": 'input-helper-text', id: `${triggerId}-helper`, variant: 'caption', className: inputStyles['helper-text'], children: helperText })) : null] }), jsx(SelectContent, { ...contentProps, onKeyDown: handleContentKeyDown, children: searchQuery ? filteredItems : childArray })] }));
876
876
  }
877
877
 
878
878
  export { Select, SelectContent, SelectField, SelectGroup, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Surface as __Surface };