@salt-ds/lab 1.0.0-alpha.60 → 1.0.0-alpha.62

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 (96) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/css/salt-lab.css +185 -1
  3. package/dist-cjs/date-picker/DatePickerRangeInput.js +1 -0
  4. package/dist-cjs/date-picker/DatePickerRangeInput.js.map +1 -1
  5. package/dist-cjs/date-picker/DatePickerSingleInput.js +1 -0
  6. package/dist-cjs/date-picker/DatePickerSingleInput.js.map +1 -1
  7. package/dist-cjs/index.js +6 -0
  8. package/dist-cjs/index.js.map +1 -1
  9. package/dist-cjs/splitter/SplitHandle.css.js +6 -0
  10. package/dist-cjs/splitter/SplitHandle.css.js.map +1 -0
  11. package/dist-cjs/splitter/SplitHandle.js +60 -0
  12. package/dist-cjs/splitter/SplitHandle.js.map +1 -0
  13. package/dist-cjs/splitter/SplitPanel.css.js +6 -0
  14. package/dist-cjs/splitter/SplitPanel.css.js.map +1 -0
  15. package/dist-cjs/splitter/SplitPanel.js +37 -0
  16. package/dist-cjs/splitter/SplitPanel.js.map +1 -0
  17. package/dist-cjs/splitter/Splitter.js +31 -0
  18. package/dist-cjs/splitter/Splitter.js.map +1 -0
  19. package/dist-cjs/splitter/utils.js +18 -0
  20. package/dist-cjs/splitter/utils.js.map +1 -0
  21. package/dist-cjs/stepped-tracker/stepReducer.js +127 -81
  22. package/dist-cjs/stepped-tracker/stepReducer.js.map +1 -1
  23. package/dist-cjs/stepped-tracker/useStepReducer.js +6 -4
  24. package/dist-cjs/stepped-tracker/useStepReducer.js.map +1 -1
  25. package/dist-cjs/stepped-tracker/utils.js +44 -9
  26. package/dist-cjs/stepped-tracker/utils.js.map +1 -1
  27. package/dist-cjs/stepper-input/StepperInput.js +6 -5
  28. package/dist-cjs/stepper-input/StepperInput.js.map +1 -1
  29. package/dist-cjs/tabs-next/TabListNext.css.js +1 -1
  30. package/dist-cjs/tabs-next/TabListNext.js +10 -16
  31. package/dist-cjs/tabs-next/TabListNext.js.map +1 -1
  32. package/dist-cjs/tabs-next/TabOverflowList.js +1 -1
  33. package/dist-cjs/tabs-next/TabOverflowList.js.map +1 -1
  34. package/dist-cjs/tabs-next/TabsNext.js +4 -51
  35. package/dist-cjs/tabs-next/TabsNext.js.map +1 -1
  36. package/dist-cjs/tabs-next/TabsNextContext.js +1 -1
  37. package/dist-cjs/tabs-next/TabsNextContext.js.map +1 -1
  38. package/dist-cjs/tabs-next/hooks/useCollection.js.map +1 -1
  39. package/dist-cjs/tabs-next/hooks/useOverflow.js +48 -5
  40. package/dist-cjs/tabs-next/hooks/useOverflow.js.map +1 -1
  41. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js +93 -0
  42. package/dist-cjs/tabs-next/hooks/useRestoreActiveTab.js.map +1 -0
  43. package/dist-es/date-picker/DatePickerRangeInput.js +1 -0
  44. package/dist-es/date-picker/DatePickerRangeInput.js.map +1 -1
  45. package/dist-es/date-picker/DatePickerSingleInput.js +1 -0
  46. package/dist-es/date-picker/DatePickerSingleInput.js.map +1 -1
  47. package/dist-es/index.js +3 -0
  48. package/dist-es/index.js.map +1 -1
  49. package/dist-es/splitter/SplitHandle.css.js +4 -0
  50. package/dist-es/splitter/SplitHandle.css.js.map +1 -0
  51. package/dist-es/splitter/SplitHandle.js +58 -0
  52. package/dist-es/splitter/SplitHandle.js.map +1 -0
  53. package/dist-es/splitter/SplitPanel.css.js +4 -0
  54. package/dist-es/splitter/SplitPanel.css.js.map +1 -0
  55. package/dist-es/splitter/SplitPanel.js +35 -0
  56. package/dist-es/splitter/SplitPanel.js.map +1 -0
  57. package/dist-es/splitter/Splitter.js +27 -0
  58. package/dist-es/splitter/Splitter.js.map +1 -0
  59. package/dist-es/splitter/utils.js +15 -0
  60. package/dist-es/splitter/utils.js.map +1 -0
  61. package/dist-es/stepped-tracker/stepReducer.js +128 -82
  62. package/dist-es/stepped-tracker/stepReducer.js.map +1 -1
  63. package/dist-es/stepped-tracker/useStepReducer.js +7 -5
  64. package/dist-es/stepped-tracker/useStepReducer.js.map +1 -1
  65. package/dist-es/stepped-tracker/utils.js +43 -9
  66. package/dist-es/stepped-tracker/utils.js.map +1 -1
  67. package/dist-es/stepper-input/StepperInput.js +6 -5
  68. package/dist-es/stepper-input/StepperInput.js.map +1 -1
  69. package/dist-es/tabs-next/TabListNext.css.js +1 -1
  70. package/dist-es/tabs-next/TabListNext.js +11 -17
  71. package/dist-es/tabs-next/TabListNext.js.map +1 -1
  72. package/dist-es/tabs-next/TabOverflowList.js +1 -1
  73. package/dist-es/tabs-next/TabOverflowList.js.map +1 -1
  74. package/dist-es/tabs-next/TabsNext.js +5 -52
  75. package/dist-es/tabs-next/TabsNext.js.map +1 -1
  76. package/dist-es/tabs-next/TabsNextContext.js +1 -1
  77. package/dist-es/tabs-next/TabsNextContext.js.map +1 -1
  78. package/dist-es/tabs-next/hooks/useCollection.js.map +1 -1
  79. package/dist-es/tabs-next/hooks/useOverflow.js +49 -6
  80. package/dist-es/tabs-next/hooks/useOverflow.js.map +1 -1
  81. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js +91 -0
  82. package/dist-es/tabs-next/hooks/useRestoreActiveTab.js.map +1 -0
  83. package/dist-types/index.d.ts +1 -0
  84. package/dist-types/splitter/SplitHandle.d.ts +21 -0
  85. package/dist-types/splitter/SplitPanel.d.ts +10 -0
  86. package/dist-types/splitter/Splitter.d.ts +22 -0
  87. package/dist-types/splitter/index.d.ts +4 -0
  88. package/dist-types/splitter/utils.d.ts +4 -0
  89. package/dist-types/stepped-tracker/Step.types.d.ts +2 -4
  90. package/dist-types/stepped-tracker/stepReducer.types.d.ts +6 -4
  91. package/dist-types/stepped-tracker/utils.d.ts +6 -3
  92. package/dist-types/tabs/drag-drop/drag-utils.d.ts +6 -6
  93. package/dist-types/tabs-next/TabsNextContext.d.ts +1 -1
  94. package/dist-types/tabs-next/hooks/useOverflow.d.ts +1 -1
  95. package/dist-types/tabs-next/hooks/useRestoreActiveTab.d.ts +10 -0
  96. package/package.json +5 -4
@@ -144,6 +144,7 @@ const DatePickerRangeInput = forwardRef(function DatePickerRangeInput2(props, re
144
144
  startInputProps,
145
145
  endInputProps,
146
146
  readOnly,
147
+ disabled,
147
148
  ref,
148
149
  onDateChange: handleDateChange,
149
150
  onDateValueChange: handleDateValueChange,
@@ -1 +1 @@
1
- {"version":3,"file":"DatePickerRangeInput.js","sources":["../src/date-picker/DatePickerRangeInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled, useIcon } from \"@salt-ds/core\";\nimport {\n DateDetailError,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type KeyboardEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport {\n DateInputRange,\n type DateInputRangeDetails,\n type DateInputRangeProps,\n type DateInputRangeValue,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerRangeInput\");\n\n/**\n * Props for the DatePickerRangeInput component.\n */\nexport interface DatePickerRangeInputProps<TDate extends DateFrameworkType>\n extends DateInputRangeProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputRangeDetails details\n */\n validate?: (\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => DateInputRangeDetails;\n}\n\nexport function defaultRangeValidator<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputRangeDetails {\n const { startDate, endDate } = date || {};\n\n if (!startDate) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no start date defined\",\n });\n }\n if (!endDate) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no end date defined\",\n });\n }\n\n // If startDate is after endDate\n if (\n dateAdapter.isValid(startDate) &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(startDate, endDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"greater-than-end-date\",\n message: \"start date after end date\",\n });\n }\n // If startDate is before minDate\n if (\n minDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, minDate) < 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n }\n // If endDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, maxDate) > 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n return details;\n}\n\nexport const DatePickerRangeInput = forwardRef(function DatePickerRangeInput<\n TDate extends DateFrameworkType,\n>(\n props: DatePickerRangeInputProps<SingleDateSelection<TDate>>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n className,\n endInputProps: endInputPropsProp,\n startInputProps: startInputPropsProp,\n onKeyDown,\n defaultValue,\n format,\n value: valueProp,\n validate,\n onChange,\n onDateValueChange,\n ...rest\n } = props;\n\n const { CalendarIcon } = useIcon();\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"range\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerRangeInput\",\n state: \"dateValue\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);\n select(event, date, validatedDetails);\n },\n [select, minDate, maxDate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: DateInputRangeValue) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue.current);\n }\n }, [cancelled]);\n\n const startInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n startInputPropsProp?.onKeyDown?.(event);\n },\n ...startInputPropsProp,\n };\n const endInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n endInputPropsProp?.onKeyDown?.(event);\n },\n ...endInputPropsProp,\n };\n\n return (\n <DateInputRange\n value={\n value ?? {\n startDate: dateAdapter.format(value, format),\n endDate: dateAdapter.format(value, format),\n }\n }\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n startInputProps={startInputProps}\n endInputProps={endInputProps}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n onChange={onChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n format={format}\n {...rest}\n />\n );\n});\n"],"names":["DatePickerRangeInput"],"mappings":"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"}
1
+ {"version":3,"file":"DatePickerRangeInput.js","sources":["../src/date-picker/DatePickerRangeInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled, useIcon } from \"@salt-ds/core\";\nimport {\n DateDetailError,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type KeyboardEventHandler,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { DateRangeSelection, SingleDateSelection } from \"../calendar\";\nimport {\n DateInputRange,\n type DateInputRangeDetails,\n type DateInputRangeProps,\n type DateInputRangeValue,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerRangeInput\");\n\n/**\n * Props for the DatePickerRangeInput component.\n */\nexport interface DatePickerRangeInputProps<TDate extends DateFrameworkType>\n extends DateInputRangeProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputRangeDetails details\n */\n validate?: (\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => DateInputRangeDetails;\n}\n\nexport function defaultRangeValidator<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputRangeDetails {\n const { startDate, endDate } = date || {};\n\n if (!startDate) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no start date defined\",\n });\n }\n if (!endDate) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: DateDetailError.UNSET,\n message: \"no end date defined\",\n });\n }\n\n // If startDate is after endDate\n if (\n dateAdapter.isValid(startDate) &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(startDate, endDate) > 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"greater-than-end-date\",\n message: \"start date after end date\",\n });\n }\n // If startDate is before minDate\n if (\n minDate &&\n dateAdapter.isValid(startDate) &&\n dateAdapter.compare(startDate, minDate) < 0\n ) {\n details.startDate = details.startDate || {};\n details.startDate.errors = details.startDate.errors || [];\n details.startDate.errors.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n }\n // If endDate is after maxDate\n if (\n maxDate &&\n dateAdapter.isValid(endDate) &&\n dateAdapter.compare(endDate, maxDate) > 0\n ) {\n details.endDate = details.endDate || {};\n details.endDate.errors = details.endDate.errors || [];\n details.endDate.errors.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n return details;\n}\n\nexport const DatePickerRangeInput = forwardRef(function DatePickerRangeInput<\n TDate extends DateFrameworkType,\n>(\n props: DatePickerRangeInputProps<SingleDateSelection<TDate>>,\n ref: React.Ref<HTMLDivElement>,\n) {\n const { dateAdapter } = useLocalization<TDate>();\n const {\n className,\n endInputProps: endInputPropsProp,\n startInputProps: startInputPropsProp,\n onKeyDown,\n defaultValue,\n format,\n value: valueProp,\n validate,\n onChange,\n onDateValueChange,\n ...rest\n } = props;\n\n const { CalendarIcon } = useIcon();\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"range\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerRangeInput\",\n state: \"dateValue\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: DateRangeSelection<TDate> | null,\n details: DateInputRangeDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultRangeValidator(dateAdapter, date, details, minDate, maxDate);\n select(event, date, validatedDetails);\n },\n [select, minDate, maxDate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: DateInputRangeValue) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue.current);\n }\n }, [cancelled]);\n\n const startInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n startInputPropsProp?.onKeyDown?.(event);\n },\n ...startInputPropsProp,\n };\n const endInputProps: {\n onKeyDown: KeyboardEventHandler<HTMLInputElement>;\n } = {\n onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n }\n endInputPropsProp?.onKeyDown?.(event);\n },\n ...endInputPropsProp,\n };\n\n return (\n <DateInputRange\n value={\n value ?? {\n startDate: dateAdapter.format(value, format),\n endDate: dateAdapter.format(value, format),\n }\n }\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n startInputProps={startInputProps}\n endInputProps={endInputProps}\n readOnly={readOnly}\n disabled={disabled}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n onChange={onChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n format={format}\n {...rest}\n />\n );\n});\n"],"names":["DatePickerRangeInput"],"mappings":"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"}
@@ -114,6 +114,7 @@ const DatePickerSingleInput = forwardRef(
114
114
  className: clsx(withBaseName(), className),
115
115
  date: selectedDate ?? null,
116
116
  readOnly,
117
+ disabled,
117
118
  ref,
118
119
  onDateChange: handleDateChange,
119
120
  onDateValueChange: handleDateValueChange,
@@ -1 +1 @@
1
- {"version":3,"file":"DatePickerSingleInput.js","sources":["../src/date-picker/DatePickerSingleInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled } from \"@salt-ds/core\";\nimport {\n DateDetailError,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport {\n DateInputSingle,\n type DateInputSingleDetails,\n type DateInputSingleProps,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerSingleInput\");\n\n/**\n * Props for the DatePickerSingleInput component.\n */\nexport interface DatePickerSingleInputProps<TDate extends DateFrameworkType>\n extends DateInputSingleProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputSingleDetails details\n */\n validate?: (\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => DateInputSingleDetails;\n}\n\nfunction defaultSingleValidation<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n details: DateInputSingleDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputSingleDetails {\n if (!date) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: DateDetailError.UNSET,\n message: \"no date defined\",\n });\n } else {\n if (\n minDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, minDate) < 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n } else if (\n maxDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, maxDate) > 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n }\n return details;\n}\n\nexport const DatePickerSingleInput = forwardRef<\n HTMLDivElement,\n DatePickerSingleInputProps<any>\n>(\n <TDate extends DateFrameworkType>(\n props: DatePickerSingleInputProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n className,\n onFocus,\n onBlur,\n value: valueProp,\n validate,\n defaultValue,\n onDateValueChange,\n onKeyDown,\n ...rest\n } = props;\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"single\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerSingleInput\",\n state: \"value\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultSingleValidation<TDate>(\n dateAdapter,\n date,\n details,\n minDate,\n maxDate,\n );\n select(event, date, validatedDetails);\n },\n [select, validate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: string) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n const handleOnKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n onKeyDown?.(event);\n }\n },\n [onKeyDown],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue?.current);\n }\n }, [cancelled]);\n\n return (\n <DateInputSingle\n value={value ?? \"\"}\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n readOnly={readOnly}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n onKeyDown={handleOnKeyDown}\n {...rest}\n />\n );\n },\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DatePickerSingleInput.js","sources":["../src/date-picker/DatePickerSingleInput.tsx"],"sourcesContent":["import { Button, makePrefixer, useControlled } from \"@salt-ds/core\";\nimport {\n DateDetailError,\n type DateFrameworkType,\n type SaltDateAdapter,\n} from \"@salt-ds/date-adapters\";\nimport { CalendarIcon } from \"@salt-ds/icons\";\nimport { clsx } from \"clsx\";\nimport {\n type KeyboardEvent,\n type SyntheticEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport type { SingleDateSelection } from \"../calendar\";\nimport {\n DateInputSingle,\n type DateInputSingleDetails,\n type DateInputSingleProps,\n} from \"../date-input\";\nimport { useLocalization } from \"../localization-provider\";\nimport { useDatePickerContext } from \"./DatePickerContext\";\nimport { useDatePickerOverlay } from \"./DatePickerOverlayProvider\";\n\nconst withBaseName = makePrefixer(\"saltDatePickerSingleInput\");\n\n/**\n * Props for the DatePickerSingleInput component.\n */\nexport interface DatePickerSingleInputProps<TDate extends DateFrameworkType>\n extends DateInputSingleProps<TDate> {\n /**\n * Function to validate the entered date\n * @param date - The selected date\n * @param details - The details of date selection, either a valid date or error\n * @returns updated DateInputSingleDetails details\n */\n validate?: (\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => DateInputSingleDetails;\n}\n\nfunction defaultSingleValidation<TDate extends DateFrameworkType>(\n dateAdapter: SaltDateAdapter<TDate>,\n date: TDate,\n details: DateInputSingleDetails,\n minDate: TDate | undefined,\n maxDate: TDate | undefined,\n): DateInputSingleDetails {\n if (!date) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: DateDetailError.UNSET,\n message: \"no date defined\",\n });\n } else {\n if (\n minDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, minDate) < 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"min-date\",\n message: \"is before min date\",\n });\n } else if (\n maxDate &&\n dateAdapter.isValid(date) &&\n dateAdapter.compare(date, maxDate) > 0\n ) {\n details.errors = details.errors ?? [];\n details.errors?.push({\n type: \"max-date\",\n message: \"is after max date\",\n });\n }\n }\n return details;\n}\n\nexport const DatePickerSingleInput = forwardRef<\n HTMLDivElement,\n DatePickerSingleInputProps<any>\n>(\n <TDate extends DateFrameworkType>(\n props: DatePickerSingleInputProps<TDate>,\n ref: React.Ref<HTMLDivElement>,\n ) => {\n const { dateAdapter } = useLocalization<TDate>();\n\n const {\n className,\n onFocus,\n onBlur,\n value: valueProp,\n validate,\n defaultValue,\n onDateValueChange,\n onKeyDown,\n ...rest\n } = props;\n\n const {\n state: { selectedDate, disabled, readOnly, cancelled, minDate, maxDate },\n helpers: { select },\n } = useDatePickerContext<TDate>({ selectionVariant: \"single\" });\n const {\n state: { open },\n helpers: { setOpen },\n } = useDatePickerOverlay();\n\n const previousValue = useRef<typeof valueProp>();\n\n const [value, setValue] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: \"DatePickerSingleInput\",\n state: \"value\",\n });\n\n const handleCalendarButton = useCallback(() => {\n setOpen(!open);\n }, [open, setOpen]);\n\n const handleDateChange = useCallback(\n (\n event: SyntheticEvent,\n date: SingleDateSelection<TDate>,\n details: DateInputSingleDetails,\n ) => {\n const validatedDetails = validate\n ? validate(date, details)\n : defaultSingleValidation<TDate>(\n dateAdapter,\n date,\n details,\n minDate,\n maxDate,\n );\n select(event, date, validatedDetails);\n },\n [select, validate],\n );\n\n const handleDateValueChange = useCallback(\n (event: SyntheticEvent | null, newDateValue: string) => {\n setValue(newDateValue);\n onDateValueChange?.(event, newDateValue);\n },\n [onDateValueChange],\n );\n\n const handleOnKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"ArrowDown\") {\n setOpen(true);\n onKeyDown?.(event);\n }\n },\n [onKeyDown],\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: should run when open changes and not selected date or value\n useEffect(() => {\n if (open) {\n previousValue.current = value;\n }\n }, [open]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: avoid excessive re-rendering\n useEffect(() => {\n if (cancelled) {\n setValue(previousValue?.current);\n }\n }, [cancelled]);\n\n return (\n <DateInputSingle\n value={value ?? \"\"}\n className={clsx(withBaseName(), className)}\n date={selectedDate ?? null}\n readOnly={readOnly}\n disabled={disabled}\n ref={ref}\n onDateChange={handleDateChange}\n onDateValueChange={handleDateValueChange}\n endAdornment={\n !readOnly && (\n <Button\n appearance=\"transparent\"\n sentiment=\"neutral\"\n onClick={handleCalendarButton}\n disabled={disabled}\n aria-label=\"Open Calendar\"\n >\n <CalendarIcon />\n </Button>\n )\n }\n onKeyDown={handleOnKeyDown}\n {...rest}\n />\n );\n },\n);\n"],"names":[],"mappings":"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"}
package/dist-es/index.js CHANGED
@@ -118,6 +118,9 @@ export { DropdownPlaceholder, NO_DATA, addAll, allExceptOverflowIndicator, byDes
118
118
  export { isResponsiveAttribute, liftResponsivePropsToFormField } from './responsive/utils.js';
119
119
  export { SearchInput } from './search-input/SearchInput.js';
120
120
  export { Slider } from './slider/Slider.js';
121
+ export { Splitter } from './splitter/Splitter.js';
122
+ export { SplitPanel } from './splitter/SplitPanel.js';
123
+ export { SplitHandle } from './splitter/SplitHandle.js';
121
124
  export { StaticList } from './static-list/StaticList.js';
122
125
  export { StaticListItem } from './static-list/StaticListItem.js';
123
126
  export { StaticListItemContent } from './static-list/StaticListItemContent.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltSplitHandle {\n --splitHandle-size: var(--salt-size-thickness-400, calc(var(--salt-size-border) * 4));\n --splitHandle-borderWidth: var(--salt-size-thickness-100, var(--salt-size-border));\n --splitHandle-borderColor: var(--salt-separable-secondary-borderColor);\n --splitHandle-borderStyle: var(--salt-separable-borderStyle);\n --splitHandle-dot-background: var(--salt-separable-foreground);\n --splitHandle-dot-background-hover: var(--salt-separable-foreground-hover);\n --splitHandle-dot-background-active: var(--salt-separable-foreground-active);\n\n position: relative;\n\n display: inline-flex;\n justify-content: center;\n align-items: center;\n gap: 2px;\n\n box-sizing: content-box;\n\n background: var(--splitHandle-background);\n}\n\n.saltSplitHandle-bordered,\n.saltSplitHandle-variant-primary {\n --splitHandle-background: var(--salt-container-primary-background);\n --splitHandle-background-hover: var(--salt-separable-background-hover);\n --splitHandle-background-active: var(--salt-separable-background-active);\n}\n\n.saltSplitHandle-variant-secondary {\n --splitHandle-background: var(--salt-container-secondary-background);\n --splitHandle-background-hover: var(--salt-separable-background-hover);\n --splitHandle-background-active: var(--salt-separable-background-active);\n}\n\n.saltSplitHandle-variant-tertiary {\n --splitHandle-background: var(--salt-container-tertiary-background);\n --splitHandle-background-hover: var(--salt-separable-background-hover);\n --splitHandle-background-active: var(--salt-separable-background-active);\n}\n\n.saltSplitHandle-variant-transparent {\n --splitHandle-background: var(--salt-separable-background);\n --splitHandle-background-hover: var(--salt-separable-background-hover);\n --splitHandle-background-active: var(--salt-separable-background-active);\n}\n\n.saltSplitHandle[data-resize-handle-state=\"hover\"] {\n background: var(--splitHandle-background-hover);\n}\n\n.saltSplitHandle[data-resize-handle-state=\"drag\"] {\n --splitHandle-background: var(--splitHandle-background-active);\n}\n\n.saltSplitHandle[data-panel-group-direction=\"horizontal\"] {\n flex-direction: column;\n width: var(--splitHandle-size);\n}\n\n.saltSplitHandle[data-panel-group-direction=\"vertical\"] {\n flex-direction: row;\n height: var(--splitHandle-size);\n}\n\n.saltSplitHandle[data-panel-group-direction=\"horizontal\"]::after {\n content: \"\";\n position: absolute;\n left: -10px;\n right: -10px;\n top: 0;\n bottom: 0;\n}\n\n.saltSplitHandle[data-panel-group-direction=\"vertical\"]::after {\n content: \"\";\n position: absolute;\n left: 0;\n right: 0;\n top: -10px;\n bottom: -10px;\n}\n\n.saltSplitHandle:focus-visible {\n outline-style: var(--salt-focused-outlineStyle);\n outline-width: var(--salt-focused-outlineWidth);\n outline-color: var(--salt-focused-outlineColor);\n outline-offset: var(--salt-focused-outlineOffset);\n}\n\n.saltSplitHandle-border-top {\n border-top-width: var(--splitHandle-borderWidth);\n border-top-color: var(--splitHandle-borderColor);\n border-top-style: var(--splitHandle-borderStyle);\n\n border-bottom-width: var(--splitHandle-borderWidth);\n border-bottom-color: transparent;\n border-bottom-style: var(--splitHandle-borderStyle);\n}\n\n.saltSplitHandle-border-bottom {\n border-top-width: var(--splitHandle-borderWidth);\n border-top-color: transparent;\n border-top-style: var(--splitHandle-borderStyle);\n\n border-bottom-width: var(--splitHandle-borderWidth);\n border-bottom-color: var(--splitHandle-borderColor);\n border-bottom-style: var(--splitHandle-borderStyle);\n}\n\n.saltSplitHandle-border-top-bottom {\n border-top-width: var(--splitHandle-borderWidth);\n border-top-color: var(--splitHandle-borderColor);\n border-top-style: var(--splitHandle-borderStyle);\n\n border-bottom-width: var(--splitHandle-borderWidth);\n border-bottom-color: var(--splitHandle-borderColor);\n border-bottom-style: var(--splitHandle-borderStyle);\n}\n\n.saltSplitHandle-border-left {\n border-left-width: var(--splitHandle-borderWidth);\n border-left-color: var(--splitHandle-borderColor);\n border-left-style: var(--splitHandle-borderStyle);\n\n border-right-width: var(--splitHandle-borderWidth);\n border-right-color: transparent;\n border-right-style: var(--splitHandle-borderStyle);\n}\n\n.saltSplitHandle-border-right {\n border-left-width: var(--splitHandle-borderWidth);\n border-left-color: transparent;\n border-left-style: var(--splitHandle-borderStyle);\n\n border-right-width: var(--splitHandle-borderWidth);\n border-right-color: var(--splitHandle-borderColor);\n border-right-style: var(--splitHandle-borderStyle);\n}\n\n.saltSplitHandle-border-left-right {\n border-left-width: var(--splitHandle-borderWidth);\n border-left-color: var(--splitHandle-borderColor);\n border-left-style: var(--splitHandle-borderStyle);\n\n border-right-width: var(--splitHandle-borderWidth);\n border-right-color: var(--splitHandle-borderColor);\n border-right-style: var(--splitHandle-borderStyle);\n}\n\n/* two handles touching horizontally */\n.saltSplitHandle[data-panel-group-direction=\"horizontal\"] + div[data-panel-size=\"0.0\"] + .saltSplitHandle[data-panel-group-direction=\"horizontal\"] {\n margin-left: -1px;\n}\n\n/* two handles touching vertically */\n.saltSplitHandle[data-panel-group-direction=\"vertical\"] + div[data-panel-size=\"0.0\"] + .saltSplitHandle[data-panel-group-direction=\"vertical\"] {\n margin-top: -1px;\n}\n\n/* handle touching the side of a container */\n@supports selector(:has(*)) {\n .saltSplitPanel:first-of-type[data-panel-size=\"0.0\"] + .saltSplitHandle-bordered[data-panel-group-direction=\"horizontal\"] {\n margin-left: -1px;\n }\n\n .saltSplitPanel:first-of-type[data-panel-size=\"0.0\"] + .saltSplitHandle-bordered[data-panel-group-direction=\"vertical\"] {\n margin-top: -1px;\n }\n\n .saltSplitHandle-bordered[data-panel-group-direction=\"horizontal\"]:has(+ .saltSplitPanel:last-of-type[data-panel-size=\"0.0\"]) {\n margin-right: -1px;\n }\n\n .saltSplitHandle-bordered[data-panel-group-direction=\"vertical\"]:has(+ .saltSplitPanel:last-of-type[data-panel-size=\"0.0\"]) {\n margin-bottom: -1px;\n }\n}\n\n.saltSplitHandle-dot {\n background: var(--splitHandle-dot-background);\n}\n\n.saltSplitHandle[data-resize-handle-state=\"hover\"] > .saltSplitHandle-dot {\n background: var(--splitHandle-dot-background-hover);\n}\n\n.saltSplitHandle[data-resize-handle-state=\"drag\"] > .saltSplitHandle-dot {\n background: var(--splitHandle-dot-background-active);\n}\n\n.saltSplitHandle[data-panel-group-direction=\"horizontal\"] > .saltSplitHandle-dot {\n width: 2px;\n height: 1px;\n}\n\n.saltSplitHandle[data-panel-group-direction=\"vertical\"] > .saltSplitHandle-dot {\n height: 2px;\n width: 1px;\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=SplitHandle.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitHandle.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,58 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import clsx from 'clsx';
6
+ import { useContext } from 'react';
7
+ import { PanelResizeHandle } from 'react-resizable-panels';
8
+ import css_248z from './SplitHandle.css.js';
9
+ import { AppearanceContext, OrientationContext } from './Splitter.js';
10
+ import { computeVariant, computeAccent } from './utils.js';
11
+
12
+ const withBaseName = makePrefixer("saltSplitHandle");
13
+ function SplitHandle({
14
+ variant: variantProp,
15
+ border: borderProp,
16
+ hitAreaMargins = {
17
+ coarse: 9,
18
+ fine: 9
19
+ },
20
+ className,
21
+ ...props
22
+ }) {
23
+ const targetWindow = useWindow();
24
+ const appearance = useContext(AppearanceContext);
25
+ const orientation = useContext(OrientationContext);
26
+ const variant = variantProp ?? computeVariant(appearance);
27
+ const border = borderProp ?? computeAccent(appearance, orientation);
28
+ useComponentCssInjection({
29
+ testId: "salt-split-handle",
30
+ css: css_248z,
31
+ window: targetWindow
32
+ });
33
+ return /* @__PURE__ */ jsxs(
34
+ PanelResizeHandle,
35
+ {
36
+ hitAreaMargins,
37
+ "data-variant": variant,
38
+ "data-border": border,
39
+ className: clsx(
40
+ withBaseName(),
41
+ withBaseName(appearance),
42
+ withBaseName("border", border),
43
+ withBaseName("variant", variant),
44
+ className
45
+ ),
46
+ ...props,
47
+ children: [
48
+ /* @__PURE__ */ jsx("span", { className: withBaseName("dot") }),
49
+ /* @__PURE__ */ jsx("span", { className: withBaseName("dot") }),
50
+ /* @__PURE__ */ jsx("span", { className: withBaseName("dot") }),
51
+ /* @__PURE__ */ jsx("span", { className: withBaseName("dot") })
52
+ ]
53
+ }
54
+ );
55
+ }
56
+
57
+ export { SplitHandle };
58
+ //# sourceMappingURL=SplitHandle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitHandle.js","sources":["../src/splitter/SplitHandle.tsx"],"sourcesContent":["import { makePrefixer } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport clsx from \"clsx\";\nimport { useContext } from \"react\";\nimport {\n PanelResizeHandle,\n type PanelResizeHandleProps,\n} from \"react-resizable-panels\";\n\nimport splitHandleCSS from \"./SplitHandle.css\";\nimport { AppearanceContext, OrientationContext } from \"./Splitter\";\nimport { computeAccent, computeVariant } from \"./utils\";\n\nconst withBaseName = makePrefixer(\"saltSplitHandle\");\n\nexport type SplitHandleVariant =\n | \"primary\"\n | \"secondary\"\n | \"tertiary\"\n | \"transparent\";\n\nexport type SplitHandleBorder =\n | \"top\"\n | \"bottom\"\n | \"right\"\n | \"left\"\n | \"top-bottom\"\n | \"left-right\"\n | \"none\";\n\nexport interface SplitHandleProps extends PanelResizeHandleProps {\n /**\n * Styling variant\n * @default \"primary\"\n */\n variant?: SplitHandleVariant;\n /**\n * Change which sides get a border displayed\n *\n * Default is based on the orientation and appearance\n * set on the parent Stepper components, ex.\n * bordered + vertical = left-right\n * bordered + horizontal = top-bottom\n * transparent = none\n */\n border?: SplitHandleBorder;\n}\n\nexport function SplitHandle({\n variant: variantProp,\n border: borderProp,\n hitAreaMargins = {\n coarse: 9,\n fine: 9,\n },\n className,\n ...props\n}: SplitHandleProps) {\n const targetWindow = useWindow();\n const appearance = useContext(AppearanceContext);\n const orientation = useContext(OrientationContext);\n\n const variant = variantProp ?? computeVariant(appearance);\n const border = borderProp ?? computeAccent(appearance, orientation);\n\n useComponentCssInjection({\n testId: \"salt-split-handle\",\n css: splitHandleCSS,\n window: targetWindow,\n });\n\n return (\n <PanelResizeHandle\n hitAreaMargins={hitAreaMargins}\n data-variant={variant}\n data-border={border}\n className={clsx(\n withBaseName(),\n withBaseName(appearance),\n withBaseName(\"border\", border),\n withBaseName(\"variant\", variant),\n className,\n )}\n {...props}\n >\n <span className={withBaseName(\"dot\")} />\n <span className={withBaseName(\"dot\")} />\n <span className={withBaseName(\"dot\")} />\n <span className={withBaseName(\"dot\")} />\n </PanelResizeHandle>\n );\n}\n"],"names":["splitHandleCSS"],"mappings":";;;;;;;;;;;AAcA,MAAM,YAAA,GAAe,aAAa,iBAAiB,CAAA;AAmC5C,SAAS,WAAY,CAAA;AAAA,EAC1B,OAAS,EAAA,WAAA;AAAA,EACT,MAAQ,EAAA,UAAA;AAAA,EACR,cAAiB,GAAA;AAAA,IACf,MAAQ,EAAA,CAAA;AAAA,IACR,IAAM,EAAA;AAAA,GACR;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAqB,EAAA;AACnB,EAAA,MAAM,eAAe,SAAU,EAAA;AAC/B,EAAM,MAAA,UAAA,GAAa,WAAW,iBAAiB,CAAA;AAC/C,EAAM,MAAA,WAAA,GAAc,WAAW,kBAAkB,CAAA;AAEjD,EAAM,MAAA,OAAA,GAAU,WAAe,IAAA,cAAA,CAAe,UAAU,CAAA;AACxD,EAAA,MAAM,MAAS,GAAA,UAAA,IAAc,aAAc,CAAA,UAAA,EAAY,WAAW,CAAA;AAElE,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,mBAAA;AAAA,IACR,GAAK,EAAAA,QAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EACE,uBAAA,IAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,cAAA;AAAA,MACA,cAAc,EAAA,OAAA;AAAA,MACd,aAAa,EAAA,MAAA;AAAA,MACb,SAAW,EAAA,IAAA;AAAA,QACT,YAAa,EAAA;AAAA,QACb,aAAa,UAAU,CAAA;AAAA,QACvB,YAAA,CAAa,UAAU,MAAM,CAAA;AAAA,QAC7B,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,QAC/B;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAW,YAAa,CAAA,KAAK,CAAG,EAAA,CAAA;AAAA,wBACrC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,YAAA,CAAa,KAAK,CAAG,EAAA,CAAA;AAAA,wBACrC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,YAAA,CAAa,KAAK,CAAG,EAAA,CAAA;AAAA,wBACrC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAW,EAAA,YAAA,CAAa,KAAK,CAAG,EAAA;AAAA;AAAA;AAAA,GACxC;AAEJ;;;;"}
@@ -0,0 +1,4 @@
1
+ var css_248z = ".saltSplitPanel {\n box-sizing: border-box;\n\n background: var(--splitPanel-background);\n}\n\n.saltSplitPanel[data-panel-size=\"0.0\"] {\n visibility: hidden;\n}\n\n.saltSplitPanel-primary {\n --splitPanel-background: var(--salt-container-primary-background);\n}\n\n.saltSplitPanel-secondary {\n --splitPanel-background: var(--salt-container-secondary-background);\n}\n\n.saltSplitPanel-tertiary {\n --splitPanel-background: var(--salt-container-tertiary-background);\n}\n\n@supports selector(:has(*)) {\n .saltSplitPanel:has(.saltSplitPanel) {\n background: unset;\n }\n}\n";
2
+
3
+ export { css_248z as default };
4
+ //# sourceMappingURL=SplitPanel.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitPanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,35 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { makePrefixer, useId } from '@salt-ds/core';
3
+ import { useComponentCssInjection } from '@salt-ds/styles';
4
+ import { useWindow } from '@salt-ds/window';
5
+ import clsx from 'clsx';
6
+ import { forwardRef } from 'react';
7
+ import { Panel } from 'react-resizable-panels';
8
+ import css_248z from './SplitPanel.css.js';
9
+
10
+ const withBaseName = makePrefixer("saltSplitPanel");
11
+ const SplitPanel = forwardRef(
12
+ function SplitPanel2({ id: idProp, variant = "primary", minSize = 10, className, ...props }, ref) {
13
+ const id = useId(idProp);
14
+ const targetWindow = useWindow();
15
+ useComponentCssInjection({
16
+ testId: "salt-split-panel",
17
+ css: css_248z,
18
+ window: targetWindow
19
+ });
20
+ return /* @__PURE__ */ jsx(
21
+ Panel,
22
+ {
23
+ id,
24
+ minSize,
25
+ "data-variant": variant,
26
+ className: clsx(withBaseName(), withBaseName(variant), className),
27
+ ref,
28
+ ...props
29
+ }
30
+ );
31
+ }
32
+ );
33
+
34
+ export { SplitPanel };
35
+ //# sourceMappingURL=SplitPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SplitPanel.js","sources":["../src/splitter/SplitPanel.tsx"],"sourcesContent":["import { makePrefixer, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport clsx from \"clsx\";\nimport { forwardRef } from \"react\";\nimport {\n type ImperativePanelHandle,\n Panel,\n type PanelProps,\n} from \"react-resizable-panels\";\n\nimport splitPanelCSS from \"./SplitPanel.css\";\n\nexport type SplitPanelVariant = \"primary\" | \"secondary\" | \"tertiary\";\n\nexport interface SplitPanelProps extends PanelProps {\n /**\n * Styling variant\n * @default \"primary\"\n */\n variant?: SplitPanelVariant;\n}\n\nconst withBaseName = makePrefixer(\"saltSplitPanel\");\n\nexport const SplitPanel = forwardRef<ImperativePanelHandle, SplitPanelProps>(\n function SplitPanel(\n { id: idProp, variant = \"primary\", minSize = 10, className, ...props },\n ref,\n ) {\n const id = useId(idProp);\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-split-panel\",\n css: splitPanelCSS,\n window: targetWindow,\n });\n\n return (\n <Panel\n id={id}\n minSize={minSize}\n data-variant={variant}\n className={clsx(withBaseName(), withBaseName(variant), className)}\n ref={ref}\n {...props}\n />\n );\n },\n);\n"],"names":["SplitPanel","splitPanelCSS"],"mappings":";;;;;;;;;AAuBA,MAAM,YAAA,GAAe,aAAa,gBAAgB,CAAA;AAE3C,MAAM,UAAa,GAAA,UAAA;AAAA,EACxB,SAASA,WAAAA,CACP,EAAE,EAAA,EAAI,MAAQ,EAAA,OAAA,GAAU,SAAW,EAAA,OAAA,GAAU,EAAI,EAAA,SAAA,EAAW,GAAG,KAAA,IAC/D,GACA,EAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAM,CAAA;AACvB,IAAA,MAAM,eAAe,SAAU,EAAA;AAE/B,IAAyB,wBAAA,CAAA;AAAA,MACvB,MAAQ,EAAA,kBAAA;AAAA,MACR,GAAK,EAAAC,QAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACT,CAAA;AAED,IACE,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,EAAA;AAAA,QACA,OAAA;AAAA,QACA,cAAc,EAAA,OAAA;AAAA,QACd,WAAW,IAAK,CAAA,YAAA,IAAgB,YAAa,CAAA,OAAO,GAAG,SAAS,CAAA;AAAA,QAChE,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA;AAGN;;;;"}
@@ -0,0 +1,27 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { createContext, useContext } from 'react';
3
+ import { PanelGroup } from 'react-resizable-panels';
4
+
5
+ const OrientationContext = createContext("vertical");
6
+ const AppearanceContext = createContext("bordered");
7
+ function Splitter({
8
+ orientation,
9
+ appearance: appearanceProp,
10
+ ...props
11
+ }) {
12
+ const appearanceContext = useContext(AppearanceContext);
13
+ const appearance = appearanceProp ?? appearanceContext;
14
+ const direction = orientation === "horizontal" ? "vertical" : "horizontal";
15
+ return /* @__PURE__ */ jsx(OrientationContext.Provider, { value: orientation, children: /* @__PURE__ */ jsx(AppearanceContext.Provider, { value: appearance, children: /* @__PURE__ */ jsx(
16
+ PanelGroup,
17
+ {
18
+ "data-orientation": orientation,
19
+ "data-appearance": appearance,
20
+ direction,
21
+ ...props
22
+ }
23
+ ) }) });
24
+ }
25
+
26
+ export { AppearanceContext, OrientationContext, Splitter };
27
+ //# sourceMappingURL=Splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Splitter.js","sources":["../src/splitter/Splitter.tsx"],"sourcesContent":["import { type ReactNode, createContext, useContext } from \"react\";\nimport { PanelGroup, type PanelGroupProps } from \"react-resizable-panels\";\n\nexport type SplitterAppearance = \"bordered\" | \"transparent\";\nexport type SplitterOrientation = \"horizontal\" | \"vertical\";\n\nexport const OrientationContext =\n createContext<SplitterOrientation>(\"vertical\");\nexport const AppearanceContext = createContext<SplitterAppearance>(\"bordered\");\n\nexport interface SplitterProps extends Omit<PanelGroupProps, \"direction\"> {\n /**\n * The orientation of the splitter.\n * Replaces `PanelGroupProps[\"direction\"]`\n */\n orientation: SplitterOrientation;\n /**\n * The appearance of the splitter.\n * If set to \"transparent\", the splitter handle will\n * be transparent, hence the background will be visible.\n * @default \"bordered\"\n */\n appearance?: SplitterAppearance;\n children: ReactNode;\n}\n\nexport function Splitter({\n orientation,\n appearance: appearanceProp,\n ...props\n}: SplitterProps) {\n const appearanceContext = useContext(AppearanceContext);\n const appearance = appearanceProp ?? appearanceContext;\n\n const direction = orientation === \"horizontal\" ? \"vertical\" : \"horizontal\";\n\n return (\n <OrientationContext.Provider value={orientation}>\n <AppearanceContext.Provider value={appearance}>\n <PanelGroup\n data-orientation={orientation}\n data-appearance={appearance}\n direction={direction}\n {...props}\n />\n </AppearanceContext.Provider>\n </OrientationContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;AAMa,MAAA,kBAAA,GACX,cAAmC,UAAU;AAClC,MAAA,iBAAA,GAAoB,cAAkC,UAAU;AAkBtE,SAAS,QAAS,CAAA;AAAA,EACvB,WAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,GAAG;AACL,CAAkB,EAAA;AAChB,EAAM,MAAA,iBAAA,GAAoB,WAAW,iBAAiB,CAAA;AACtD,EAAA,MAAM,aAAa,cAAkB,IAAA,iBAAA;AAErC,EAAM,MAAA,SAAA,GAAY,WAAgB,KAAA,YAAA,GAAe,UAAa,GAAA,YAAA;AAE9D,EACE,uBAAA,GAAA,CAAC,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,WAClC,EAAA,QAAA,kBAAA,GAAA,CAAC,iBAAkB,CAAA,QAAA,EAAlB,EAA2B,KAAA,EAAO,UACjC,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,kBAAkB,EAAA,WAAA;AAAA,MAClB,iBAAiB,EAAA,UAAA;AAAA,MACjB,SAAA;AAAA,MACC,GAAG;AAAA;AAAA,KAER,CACF,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,15 @@
1
+ function computeAccent(appearance, orientation) {
2
+ if (appearance === "transparent") {
3
+ return "none";
4
+ }
5
+ if (orientation === "horizontal") {
6
+ return "top-bottom";
7
+ }
8
+ return "left-right";
9
+ }
10
+ function computeVariant(appearance) {
11
+ return appearance === "bordered" ? "primary" : "transparent";
12
+ }
13
+
14
+ export { computeAccent, computeVariant };
15
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sources":["../src/splitter/utils.ts"],"sourcesContent":["import type { SplitHandleBorder } from \"./SplitHandle\";\nimport type { SplitterAppearance, SplitterOrientation } from \"./Splitter\";\n\nexport function computeAccent(\n appearance: SplitterAppearance,\n orientation: SplitterOrientation,\n): SplitHandleBorder {\n if (appearance === \"transparent\") {\n return \"none\";\n }\n\n if (orientation === \"horizontal\") {\n return \"top-bottom\";\n }\n\n return \"left-right\";\n}\n\nexport function computeVariant(\n appearance: SplitterAppearance,\n): \"primary\" | \"transparent\" {\n return appearance === \"bordered\" ? \"primary\" : \"transparent\";\n}\n"],"names":[],"mappings":"AAGgB,SAAA,aAAA,CACd,YACA,WACmB,EAAA;AACnB,EAAA,IAAI,eAAe,aAAe,EAAA;AAChC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,IAAI,gBAAgB,YAAc,EAAA;AAChC,IAAO,OAAA,YAAA;AAAA;AAGT,EAAO,OAAA,YAAA;AACT;AAEO,SAAS,eACd,UAC2B,EAAA;AAC3B,EAAO,OAAA,UAAA,KAAe,aAAa,SAAY,GAAA,aAAA;AACjD;;;;"}
@@ -1,106 +1,152 @@
1
- import { resetSteps, flattenSteps, autoStageSteps, assignSteps } from './utils.js';
1
+ import { autoStageSteps, resetSteps, flattenSteps, assignStepStatus, assignStepsStage } from './utils.js';
2
2
 
3
3
  function stepReducer(state, action) {
4
4
  var _a, _b;
5
- if (action.type === "next") {
6
- if (((_a = state.activeStep) == null ? void 0 : _a.status) === "error") {
7
- return state;
8
- }
9
- const steps = resetSteps(state.steps);
10
- const flatSteps = flattenSteps(steps);
11
- if (state.nextStep) {
12
- const activeStepIndex2 = state.activeStepIndex + 1;
13
- const activeStep2 = flatSteps[activeStepIndex2];
14
- const previousStep2 = flatSteps[activeStepIndex2 - 1] || null;
15
- const nextStep2 = flatSteps[activeStepIndex2 + 1] || null;
16
- if (activeStep2) {
17
- activeStep2.stage = "active";
5
+ switch (action.type) {
6
+ case "next": {
7
+ if (((_a = state.activeStep) == null ? void 0 : _a.status) === "error") {
8
+ return state;
9
+ }
10
+ const activeStepIndex = state.activeStepIndex + 1;
11
+ const lastStepIndex = state.flatSteps.length - 1;
12
+ if (activeStepIndex > lastStepIndex) {
13
+ const steps2 = assignStepsStage(state.steps, "completed");
14
+ const flatSteps2 = flattenSteps(steps2);
15
+ return {
16
+ steps: steps2,
17
+ flatSteps: flatSteps2,
18
+ activeStepIndex: lastStepIndex + 1,
19
+ activeStep: null,
20
+ previousStep: flatSteps2[lastStepIndex],
21
+ nextStep: null,
22
+ started: true,
23
+ ended: true
24
+ };
18
25
  }
26
+ const activeStepId = state.flatSteps[activeStepIndex].id;
27
+ const steps = autoStageSteps(resetSteps(state.steps), { activeStepId });
28
+ const flatSteps = flattenSteps(steps);
19
29
  return {
20
- steps: autoStageSteps(steps),
30
+ steps,
21
31
  flatSteps,
22
- activeStepIndex: activeStepIndex2,
23
- activeStep: activeStep2,
24
- previousStep: previousStep2,
25
- nextStep: nextStep2,
32
+ activeStepIndex,
33
+ activeStep: flatSteps[activeStepIndex],
34
+ previousStep: flatSteps[activeStepIndex - 1],
35
+ nextStep: flatSteps[activeStepIndex + 1] ?? null,
26
36
  started: true,
27
37
  ended: false
28
38
  };
29
39
  }
30
- const activeStepIndex = flatSteps.length;
31
- const previousStep = flatSteps.at(-1);
32
- const activeStep = null;
33
- const nextStep = null;
34
- return {
35
- steps: assignSteps(steps, "completed"),
36
- flatSteps,
37
- activeStepIndex,
38
- activeStep,
39
- previousStep,
40
- nextStep,
41
- started: true,
42
- ended: true
43
- };
44
- }
45
- if (action.type === "previous") {
46
- if (((_b = state.activeStep) == null ? void 0 : _b.status) === "error") {
47
- return state;
48
- }
49
- const steps = resetSteps(state.steps);
50
- const flatSteps = flattenSteps(steps);
51
- if (state.previousStep) {
52
- const activeStepIndex2 = state.activeStepIndex - 1;
53
- const activeStep2 = flatSteps[activeStepIndex2];
54
- const previousStep2 = flatSteps[activeStepIndex2 - 1] || null;
55
- const nextStep2 = flatSteps[activeStepIndex2 + 1] || null;
56
- if (activeStep2) {
57
- activeStep2.stage = "active";
40
+ case "previous": {
41
+ if (((_b = state.activeStep) == null ? void 0 : _b.status) === "error") {
42
+ return state;
58
43
  }
44
+ const activeStepIndex = state.activeStepIndex - 1;
45
+ if (activeStepIndex < 0) {
46
+ const steps2 = assignStepsStage(state.steps, "pending");
47
+ const flatSteps2 = flattenSteps(steps2);
48
+ return {
49
+ steps: steps2,
50
+ flatSteps: flatSteps2,
51
+ activeStepIndex: -1,
52
+ activeStep: null,
53
+ previousStep: null,
54
+ nextStep: flatSteps2[0],
55
+ started: false,
56
+ ended: false
57
+ };
58
+ }
59
+ const activeStepId = state.flatSteps[activeStepIndex].id;
60
+ const steps = autoStageSteps(resetSteps(state.steps), { activeStepId });
61
+ const flatSteps = flattenSteps(steps);
59
62
  return {
60
- steps: autoStageSteps(steps),
63
+ steps,
61
64
  flatSteps,
62
- activeStepIndex: activeStepIndex2,
63
- activeStep: activeStep2,
64
- previousStep: previousStep2,
65
- nextStep: nextStep2,
65
+ activeStepIndex,
66
+ activeStep: flatSteps[activeStepIndex],
67
+ previousStep: flatSteps[activeStepIndex - 1] ?? null,
68
+ nextStep: flatSteps[activeStepIndex + 1],
66
69
  started: true,
67
70
  ended: false
68
71
  };
69
72
  }
70
- const activeStepIndex = -1;
71
- const activeStep = null;
72
- const previousStep = null;
73
- const nextStep = flatSteps.at(0);
74
- return {
75
- steps: assignSteps(steps, "pending"),
76
- flatSteps,
77
- activeStepIndex,
78
- activeStep,
79
- previousStep,
80
- nextStep,
81
- ended: false,
82
- started: false
83
- };
84
- }
85
- if (action.type === "error") {
86
- if (state.activeStep) {
87
- state.activeStep.status = "error";
88
- return { ...state };
73
+ case "status/error": {
74
+ const { activeStep, activeStepIndex } = state;
75
+ if (!activeStep) {
76
+ return state;
77
+ }
78
+ const activeStepId = activeStep.id;
79
+ const steps = assignStepStatus(state.steps, activeStepId, "error");
80
+ const flatSteps = flattenSteps(steps);
81
+ return {
82
+ ...state,
83
+ steps,
84
+ flatSteps,
85
+ activeStepIndex,
86
+ activeStep: flatSteps[activeStepIndex],
87
+ previousStep: flatSteps[activeStepIndex - 1] ?? null,
88
+ nextStep: flatSteps[activeStepIndex + 1]
89
+ };
89
90
  }
90
- }
91
- if (action.type === "warning") {
92
- if (state.activeStep) {
93
- state.activeStep.status = "warning";
94
- return { ...state };
91
+ case "status/warning": {
92
+ const { activeStep, activeStepIndex } = state;
93
+ if (!activeStep) {
94
+ return state;
95
+ }
96
+ const activeStepId = activeStep.id;
97
+ const steps = assignStepStatus(state.steps, activeStepId, "warning");
98
+ const flatSteps = flattenSteps(steps);
99
+ return {
100
+ ...state,
101
+ steps,
102
+ flatSteps,
103
+ activeStepIndex,
104
+ activeStep: flatSteps[activeStepIndex],
105
+ previousStep: flatSteps[activeStepIndex - 1] ?? null,
106
+ nextStep: flatSteps[activeStepIndex + 1]
107
+ };
95
108
  }
96
- }
97
- if (action.type === "clear") {
98
- if (state.activeStep) {
99
- state.activeStep.status = void 0;
100
- return { ...state };
109
+ case "status/clear": {
110
+ const { activeStep, activeStepIndex } = state;
111
+ if (!activeStep) {
112
+ return state;
113
+ }
114
+ const activeStepId = activeStep.id;
115
+ const steps = assignStepStatus(state.steps, activeStepId, void 0);
116
+ const flatSteps = flattenSteps(steps);
117
+ return {
118
+ ...state,
119
+ steps,
120
+ flatSteps,
121
+ activeStepIndex,
122
+ activeStep: flatSteps[activeStepIndex],
123
+ previousStep: flatSteps[activeStepIndex - 1] ?? null,
124
+ nextStep: flatSteps[activeStepIndex + 1]
125
+ };
126
+ }
127
+ case "reset": {
128
+ const firstStepId = state.flatSteps[0].id;
129
+ const steps = autoStageSteps(
130
+ resetSteps(state.steps, { resetStatus: true }),
131
+ { activeStepId: firstStepId }
132
+ );
133
+ const flatSteps = flattenSteps(steps);
134
+ return {
135
+ steps,
136
+ flatSteps,
137
+ activeStepIndex: 0,
138
+ activeStep: flatSteps[0],
139
+ previousStep: null,
140
+ nextStep: flatSteps[1],
141
+ started: true,
142
+ ended: false
143
+ };
144
+ }
145
+ default: {
146
+ const exhaustiveCheck = action;
147
+ throw new Error(`Unhandled action: ${exhaustiveCheck}`);
101
148
  }
102
149
  }
103
- return state;
104
150
  }
105
151
 
106
152
  export { stepReducer as default };