@salt-ds/lab 1.0.0-alpha.89 → 1.0.0-alpha.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +103 -0
- package/css/salt-lab.css +120 -643
- package/dist-cjs/calendar/index.js +61 -0
- package/dist-cjs/calendar/index.js.map +1 -0
- package/dist-cjs/content-status/ContentStatus.js +1 -1
- package/dist-cjs/content-status/ContentStatus.js.map +1 -1
- package/dist-cjs/date-input/index.js +23 -0
- package/dist-cjs/date-input/index.js.map +1 -0
- package/dist-cjs/date-picker/index.js +106 -0
- package/dist-cjs/date-picker/index.js.map +1 -0
- package/dist-cjs/index.js +58 -56
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/localization-provider/index.js +26 -0
- package/dist-cjs/localization-provider/index.js.map +1 -0
- package/dist-cjs/rating/Rating.css.js +1 -1
- package/dist-cjs/rating/Rating.js +11 -16
- package/dist-cjs/rating/Rating.js.map +1 -1
- package/dist-cjs/side-panel/SidePanel.css.js +6 -0
- package/dist-cjs/side-panel/SidePanel.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanel.js +156 -0
- package/dist-cjs/side-panel/SidePanel.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelContent.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelContent.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelContent.js +86 -0
- package/dist-cjs/side-panel/SidePanelContent.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelHeader.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelHeader.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelHeader.js +26 -0
- package/dist-cjs/side-panel/SidePanelHeader.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelProvider.js +71 -0
- package/dist-cjs/side-panel/SidePanelProvider.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTitle.css.js +6 -0
- package/dist-cjs/side-panel/SidePanelTitle.css.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTitle.js +47 -0
- package/dist-cjs/side-panel/SidePanelTitle.js.map +1 -0
- package/dist-cjs/side-panel/SidePanelTrigger.js +37 -0
- package/dist-cjs/side-panel/SidePanelTrigger.js.map +1 -0
- package/dist-cjs/side-panel/internal/SidePanelContext.js +31 -0
- package/dist-cjs/side-panel/internal/SidePanelContext.js.map +1 -0
- package/dist-cjs/side-panel/useSidePanel.js +41 -0
- package/dist-cjs/side-panel/useSidePanel.js.map +1 -0
- package/dist-cjs/utils/deprecatedExport.js +30 -0
- package/dist-cjs/utils/deprecatedExport.js.map +1 -0
- package/dist-es/calendar/index.js +50 -0
- package/dist-es/calendar/index.js.map +1 -0
- package/dist-es/content-status/ContentStatus.js +1 -1
- package/dist-es/content-status/ContentStatus.js.map +1 -1
- package/dist-es/date-input/index.js +20 -0
- package/dist-es/date-input/index.js.map +1 -0
- package/dist-es/date-picker/index.js +85 -0
- package/dist-es/date-picker/index.js.map +1 -0
- package/dist-es/index.js +12 -23
- package/dist-es/index.js.map +1 -1
- package/dist-es/localization-provider/index.js +20 -0
- package/dist-es/localization-provider/index.js.map +1 -0
- package/dist-es/rating/Rating.css.js +1 -1
- package/dist-es/rating/Rating.js +13 -18
- package/dist-es/rating/Rating.js.map +1 -1
- package/dist-es/side-panel/SidePanel.css.js +4 -0
- package/dist-es/side-panel/SidePanel.css.js.map +1 -0
- package/dist-es/side-panel/SidePanel.js +154 -0
- package/dist-es/side-panel/SidePanel.js.map +1 -0
- package/dist-es/side-panel/SidePanelContent.css.js +4 -0
- package/dist-es/side-panel/SidePanelContent.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelContent.js +84 -0
- package/dist-es/side-panel/SidePanelContent.js.map +1 -0
- package/dist-es/side-panel/SidePanelHeader.css.js +4 -0
- package/dist-es/side-panel/SidePanelHeader.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelHeader.js +24 -0
- package/dist-es/side-panel/SidePanelHeader.js.map +1 -0
- package/dist-es/side-panel/SidePanelProvider.js +69 -0
- package/dist-es/side-panel/SidePanelProvider.js.map +1 -0
- package/dist-es/side-panel/SidePanelTitle.css.js +4 -0
- package/dist-es/side-panel/SidePanelTitle.css.js.map +1 -0
- package/dist-es/side-panel/SidePanelTitle.js +45 -0
- package/dist-es/side-panel/SidePanelTitle.js.map +1 -0
- package/dist-es/side-panel/SidePanelTrigger.js +35 -0
- package/dist-es/side-panel/SidePanelTrigger.js.map +1 -0
- package/dist-es/side-panel/internal/SidePanelContext.js +28 -0
- package/dist-es/side-panel/internal/SidePanelContext.js.map +1 -0
- package/dist-es/side-panel/useSidePanel.js +39 -0
- package/dist-es/side-panel/useSidePanel.js.map +1 -0
- package/dist-es/utils/deprecatedExport.js +27 -0
- package/dist-es/utils/deprecatedExport.js.map +1 -0
- package/dist-types/calendar/index.d.ts +13 -8
- package/dist-types/date-input/index.d.ts +3 -2
- package/dist-types/index.d.ts +1 -0
- package/dist-types/localization-provider/index.d.ts +9 -1
- package/dist-types/rating/Rating.d.ts +1 -2
- package/dist-types/side-panel/SidePanel.d.ts +27 -0
- package/dist-types/side-panel/SidePanelContent.d.ts +4 -0
- package/dist-types/side-panel/SidePanelHeader.d.ts +4 -0
- package/dist-types/side-panel/SidePanelProvider.d.ts +20 -0
- package/dist-types/side-panel/SidePanelTitle.d.ts +4 -0
- package/dist-types/side-panel/SidePanelTrigger.d.ts +5 -0
- package/dist-types/side-panel/index.d.ts +7 -0
- package/dist-types/side-panel/internal/SidePanelContext.d.ts +48 -0
- package/dist-types/side-panel/internal/index.d.ts +1 -0
- package/dist-types/side-panel/useSidePanel.d.ts +32 -0
- package/dist-types/utils/deprecatedExport.d.ts +11 -0
- package/package.json +5 -12
- package/dist-cjs/calendar/Calendar.css.js +0 -6
- package/dist-cjs/calendar/Calendar.css.js.map +0 -1
- package/dist-cjs/calendar/Calendar.js +0 -152
- package/dist-cjs/calendar/Calendar.js.map +0 -1
- package/dist-cjs/calendar/CalendarGrid.js +0 -85
- package/dist-cjs/calendar/CalendarGrid.js.map +0 -1
- package/dist-cjs/calendar/CalendarMonthHeader.css.js +0 -6
- package/dist-cjs/calendar/CalendarMonthHeader.css.js.map +0 -1
- package/dist-cjs/calendar/CalendarMonthHeader.js +0 -48
- package/dist-cjs/calendar/CalendarMonthHeader.js.map +0 -1
- package/dist-cjs/calendar/CalendarNavigation.css.js +0 -6
- package/dist-cjs/calendar/CalendarNavigation.css.js.map +0 -1
- package/dist-cjs/calendar/CalendarNavigation.js +0 -337
- package/dist-cjs/calendar/CalendarNavigation.js.map +0 -1
- package/dist-cjs/calendar/CalendarWeekHeader.css.js +0 -6
- package/dist-cjs/calendar/CalendarWeekHeader.css.js.map +0 -1
- package/dist-cjs/calendar/CalendarWeekHeader.js +0 -46
- package/dist-cjs/calendar/CalendarWeekHeader.js.map +0 -1
- package/dist-cjs/calendar/internal/CalendarContext.js +0 -25
- package/dist-cjs/calendar/internal/CalendarContext.js.map +0 -1
- package/dist-cjs/calendar/internal/CalendarDay.css.js +0 -6
- package/dist-cjs/calendar/internal/CalendarDay.css.js.map +0 -1
- package/dist-cjs/calendar/internal/CalendarDay.js +0 -97
- package/dist-cjs/calendar/internal/CalendarDay.js.map +0 -1
- package/dist-cjs/calendar/internal/CalendarMonth.css.js +0 -6
- package/dist-cjs/calendar/internal/CalendarMonth.css.js.map +0 -1
- package/dist-cjs/calendar/internal/CalendarMonth.js +0 -76
- package/dist-cjs/calendar/internal/CalendarMonth.js.map +0 -1
- package/dist-cjs/calendar/internal/useFocusManagement.js +0 -68
- package/dist-cjs/calendar/internal/useFocusManagement.js.map +0 -1
- package/dist-cjs/calendar/internal/utils.js +0 -50
- package/dist-cjs/calendar/internal/utils.js.map +0 -1
- package/dist-cjs/calendar/useCalendar.js +0 -183
- package/dist-cjs/calendar/useCalendar.js.map +0 -1
- package/dist-cjs/calendar/useCalendarDay.js +0 -85
- package/dist-cjs/calendar/useCalendarDay.js.map +0 -1
- package/dist-cjs/calendar/useCalendarSelection.js +0 -604
- package/dist-cjs/calendar/useCalendarSelection.js.map +0 -1
- package/dist-cjs/date-input/DateInput.css.js +0 -6
- package/dist-cjs/date-input/DateInput.css.js.map +0 -1
- package/dist-cjs/date-input/DateInputRange.js +0 -352
- package/dist-cjs/date-input/DateInputRange.js.map +0 -1
- package/dist-cjs/date-input/DateInputSingle.js +0 -234
- package/dist-cjs/date-input/DateInputSingle.js.map +0 -1
- package/dist-cjs/date-picker/DatePicker.js +0 -75
- package/dist-cjs/date-picker/DatePicker.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerActions.css.js +0 -6
- package/dist-cjs/date-picker/DatePickerActions.css.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerActions.js +0 -91
- package/dist-cjs/date-picker/DatePickerActions.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerContext.js +0 -36
- package/dist-cjs/date-picker/DatePickerContext.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerHelperText.css.js +0 -6
- package/dist-cjs/date-picker/DatePickerHelperText.css.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerHelperText.js +0 -36
- package/dist-cjs/date-picker/DatePickerHelperText.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerOverlay.css.js +0 -6
- package/dist-cjs/date-picker/DatePickerOverlay.css.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerOverlay.js +0 -48
- package/dist-cjs/date-picker/DatePickerOverlay.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js +0 -166
- package/dist-cjs/date-picker/DatePickerOverlayProvider.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerPanel.css.js +0 -6
- package/dist-cjs/date-picker/DatePickerPanel.css.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js +0 -246
- package/dist-cjs/date-picker/DatePickerRangeGridPanel.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerRangeInput.js +0 -202
- package/dist-cjs/date-picker/DatePickerRangeInput.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerRangePanel.js +0 -355
- package/dist-cjs/date-picker/DatePickerRangePanel.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js +0 -253
- package/dist-cjs/date-picker/DatePickerSingleGridPanel.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerSingleInput.js +0 -148
- package/dist-cjs/date-picker/DatePickerSingleInput.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerSinglePanel.js +0 -20
- package/dist-cjs/date-picker/DatePickerSinglePanel.js.map +0 -1
- package/dist-cjs/date-picker/DatePickerTrigger.js +0 -32
- package/dist-cjs/date-picker/DatePickerTrigger.js.map +0 -1
- package/dist-cjs/date-picker/useDatePicker.js +0 -201
- package/dist-cjs/date-picker/useDatePicker.js.map +0 -1
- package/dist-cjs/date-picker/useFocusOut.js +0 -43
- package/dist-cjs/date-picker/useFocusOut.js.map +0 -1
- package/dist-cjs/date-picker/useKeyboard.js +0 -22
- package/dist-cjs/date-picker/useKeyboard.js.map +0 -1
- package/dist-cjs/localization-provider/LocalizationProvider.js +0 -51
- package/dist-cjs/localization-provider/LocalizationProvider.js.map +0 -1
- package/dist-es/calendar/Calendar.css.js +0 -4
- package/dist-es/calendar/Calendar.css.js.map +0 -1
- package/dist-es/calendar/Calendar.js +0 -150
- package/dist-es/calendar/Calendar.js.map +0 -1
- package/dist-es/calendar/CalendarGrid.js +0 -83
- package/dist-es/calendar/CalendarGrid.js.map +0 -1
- package/dist-es/calendar/CalendarMonthHeader.css.js +0 -4
- package/dist-es/calendar/CalendarMonthHeader.css.js.map +0 -1
- package/dist-es/calendar/CalendarMonthHeader.js +0 -46
- package/dist-es/calendar/CalendarMonthHeader.js.map +0 -1
- package/dist-es/calendar/CalendarNavigation.css.js +0 -4
- package/dist-es/calendar/CalendarNavigation.css.js.map +0 -1
- package/dist-es/calendar/CalendarNavigation.js +0 -335
- package/dist-es/calendar/CalendarNavigation.js.map +0 -1
- package/dist-es/calendar/CalendarWeekHeader.css.js +0 -4
- package/dist-es/calendar/CalendarWeekHeader.css.js.map +0 -1
- package/dist-es/calendar/CalendarWeekHeader.js +0 -44
- package/dist-es/calendar/CalendarWeekHeader.js.map +0 -1
- package/dist-es/calendar/internal/CalendarContext.js +0 -22
- package/dist-es/calendar/internal/CalendarContext.js.map +0 -1
- package/dist-es/calendar/internal/CalendarDay.css.js +0 -4
- package/dist-es/calendar/internal/CalendarDay.css.js.map +0 -1
- package/dist-es/calendar/internal/CalendarDay.js +0 -95
- package/dist-es/calendar/internal/CalendarDay.js.map +0 -1
- package/dist-es/calendar/internal/CalendarMonth.css.js +0 -4
- package/dist-es/calendar/internal/CalendarMonth.css.js.map +0 -1
- package/dist-es/calendar/internal/CalendarMonth.js +0 -74
- package/dist-es/calendar/internal/CalendarMonth.js.map +0 -1
- package/dist-es/calendar/internal/useFocusManagement.js +0 -66
- package/dist-es/calendar/internal/useFocusManagement.js.map +0 -1
- package/dist-es/calendar/internal/utils.js +0 -44
- package/dist-es/calendar/internal/utils.js.map +0 -1
- package/dist-es/calendar/useCalendar.js +0 -181
- package/dist-es/calendar/useCalendar.js.map +0 -1
- package/dist-es/calendar/useCalendarDay.js +0 -83
- package/dist-es/calendar/useCalendarDay.js.map +0 -1
- package/dist-es/calendar/useCalendarSelection.js +0 -600
- package/dist-es/calendar/useCalendarSelection.js.map +0 -1
- package/dist-es/date-input/DateInput.css.js +0 -4
- package/dist-es/date-input/DateInput.css.js.map +0 -1
- package/dist-es/date-input/DateInputRange.js +0 -349
- package/dist-es/date-input/DateInputRange.js.map +0 -1
- package/dist-es/date-input/DateInputSingle.js +0 -232
- package/dist-es/date-input/DateInputSingle.js.map +0 -1
- package/dist-es/date-picker/DatePicker.js +0 -72
- package/dist-es/date-picker/DatePicker.js.map +0 -1
- package/dist-es/date-picker/DatePickerActions.css.js +0 -4
- package/dist-es/date-picker/DatePickerActions.css.js.map +0 -1
- package/dist-es/date-picker/DatePickerActions.js +0 -89
- package/dist-es/date-picker/DatePickerActions.js.map +0 -1
- package/dist-es/date-picker/DatePickerContext.js +0 -32
- package/dist-es/date-picker/DatePickerContext.js.map +0 -1
- package/dist-es/date-picker/DatePickerHelperText.css.js +0 -4
- package/dist-es/date-picker/DatePickerHelperText.css.js.map +0 -1
- package/dist-es/date-picker/DatePickerHelperText.js +0 -34
- package/dist-es/date-picker/DatePickerHelperText.js.map +0 -1
- package/dist-es/date-picker/DatePickerOverlay.css.js +0 -4
- package/dist-es/date-picker/DatePickerOverlay.css.js.map +0 -1
- package/dist-es/date-picker/DatePickerOverlay.js +0 -46
- package/dist-es/date-picker/DatePickerOverlay.js.map +0 -1
- package/dist-es/date-picker/DatePickerOverlayProvider.js +0 -163
- package/dist-es/date-picker/DatePickerOverlayProvider.js.map +0 -1
- package/dist-es/date-picker/DatePickerPanel.css.js +0 -4
- package/dist-es/date-picker/DatePickerPanel.css.js.map +0 -1
- package/dist-es/date-picker/DatePickerRangeGridPanel.js +0 -244
- package/dist-es/date-picker/DatePickerRangeGridPanel.js.map +0 -1
- package/dist-es/date-picker/DatePickerRangeInput.js +0 -199
- package/dist-es/date-picker/DatePickerRangeInput.js.map +0 -1
- package/dist-es/date-picker/DatePickerRangePanel.js +0 -353
- package/dist-es/date-picker/DatePickerRangePanel.js.map +0 -1
- package/dist-es/date-picker/DatePickerSingleGridPanel.js +0 -251
- package/dist-es/date-picker/DatePickerSingleGridPanel.js.map +0 -1
- package/dist-es/date-picker/DatePickerSingleInput.js +0 -146
- package/dist-es/date-picker/DatePickerSingleInput.js.map +0 -1
- package/dist-es/date-picker/DatePickerSinglePanel.js +0 -18
- package/dist-es/date-picker/DatePickerSinglePanel.js.map +0 -1
- package/dist-es/date-picker/DatePickerTrigger.js +0 -30
- package/dist-es/date-picker/DatePickerTrigger.js.map +0 -1
- package/dist-es/date-picker/useDatePicker.js +0 -199
- package/dist-es/date-picker/useDatePicker.js.map +0 -1
- package/dist-es/date-picker/useFocusOut.js +0 -41
- package/dist-es/date-picker/useFocusOut.js.map +0 -1
- package/dist-es/date-picker/useKeyboard.js +0 -20
- package/dist-es/date-picker/useKeyboard.js.map +0 -1
- package/dist-es/localization-provider/LocalizationProvider.js +0 -47
- package/dist-es/localization-provider/LocalizationProvider.js.map +0 -1
- package/dist-types/calendar/Calendar.d.ts +0 -116
- package/dist-types/calendar/CalendarGrid.d.ts +0 -29
- package/dist-types/calendar/CalendarMonthHeader.d.ts +0 -18
- package/dist-types/calendar/CalendarNavigation.d.ts +0 -64
- package/dist-types/calendar/CalendarWeekHeader.d.ts +0 -6
- package/dist-types/calendar/internal/CalendarContext.d.ts +0 -7
- package/dist-types/calendar/internal/CalendarDay.d.ts +0 -32
- package/dist-types/calendar/internal/CalendarMonth.d.ts +0 -13
- package/dist-types/calendar/internal/useFocusManagement.d.ts +0 -9
- package/dist-types/calendar/internal/utils.d.ts +0 -6
- package/dist-types/calendar/useCalendar.d.ts +0 -294
- package/dist-types/calendar/useCalendarDay.d.ts +0 -56
- package/dist-types/calendar/useCalendarSelection.d.ts +0 -365
- package/dist-types/date-input/DateInputRange.d.ts +0 -136
- package/dist-types/date-input/DateInputSingle.d.ts +0 -104
- package/dist-types/date-picker/DatePicker.d.ts +0 -55
- package/dist-types/date-picker/DatePickerActions.d.ts +0 -81
- package/dist-types/date-picker/DatePickerContext.d.ts +0 -188
- package/dist-types/date-picker/DatePickerHelperText.d.ts +0 -4
- package/dist-types/date-picker/DatePickerOverlay.d.ts +0 -11
- package/dist-types/date-picker/DatePickerOverlayProvider.d.ts +0 -102
- package/dist-types/date-picker/DatePickerRangeGridPanel.d.ts +0 -16
- package/dist-types/date-picker/DatePickerRangeInput.d.ts +0 -18
- package/dist-types/date-picker/DatePickerRangePanel.d.ts +0 -84
- package/dist-types/date-picker/DatePickerSingleGridPanel.d.ts +0 -64
- package/dist-types/date-picker/DatePickerSingleInput.d.ts +0 -17
- package/dist-types/date-picker/DatePickerSinglePanel.d.ts +0 -8
- package/dist-types/date-picker/DatePickerTrigger.d.ts +0 -9
- package/dist-types/date-picker/index.d.ts +0 -13
- package/dist-types/date-picker/useDatePicker.d.ts +0 -119
- package/dist-types/date-picker/useFocusOut.d.ts +0 -9
- package/dist-types/date-picker/useKeyboard.d.ts +0 -20
- package/dist-types/localization-provider/LocalizationProvider.d.ts +0 -62
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react$1 = require('@floating-ui/react');
|
|
5
|
+
var core = require('@salt-ds/core');
|
|
6
|
+
var styles = require('@salt-ds/styles');
|
|
7
|
+
var window = require('@salt-ds/window');
|
|
8
|
+
var clsx = require('clsx');
|
|
9
|
+
var react = require('react');
|
|
10
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
11
|
+
var SidePanel$1 = require('./SidePanel.css.js');
|
|
12
|
+
|
|
13
|
+
const withBaseName = core.makePrefixer("saltSidePanel");
|
|
14
|
+
const SidePanel = react.forwardRef(
|
|
15
|
+
function SidePanel2(props, ref) {
|
|
16
|
+
const {
|
|
17
|
+
disableAnimation = false,
|
|
18
|
+
position = "right",
|
|
19
|
+
initialFocus,
|
|
20
|
+
variant = "primary",
|
|
21
|
+
children,
|
|
22
|
+
id: idProp,
|
|
23
|
+
className,
|
|
24
|
+
"aria-labelledby": ariaLabelledBy,
|
|
25
|
+
...rest
|
|
26
|
+
} = props;
|
|
27
|
+
const { openState, floatingRootContext, setFloating, setPanelId, titleId } = SidePanelContext.useSidePanelContext();
|
|
28
|
+
const id = core.useId(idProp);
|
|
29
|
+
const [showComponent, setShowComponent] = react.useState(openState);
|
|
30
|
+
const [animating, setAnimating] = react.useState(() => {
|
|
31
|
+
var _a;
|
|
32
|
+
if (!openState || disableAnimation) return false;
|
|
33
|
+
const reference = floatingRootContext.elements.reference;
|
|
34
|
+
if (!(reference instanceof Element)) return false;
|
|
35
|
+
const activeElement = (_a = reference.ownerDocument) == null ? void 0 : _a.activeElement;
|
|
36
|
+
return !!activeElement && reference.contains(activeElement);
|
|
37
|
+
});
|
|
38
|
+
const [skipInitialFocus, setSkipInitialFocus] = react.useState(() => {
|
|
39
|
+
var _a;
|
|
40
|
+
if (!openState) return false;
|
|
41
|
+
const reference = floatingRootContext.elements.reference;
|
|
42
|
+
if (!(reference instanceof Element)) return true;
|
|
43
|
+
const activeElement = (_a = reference.ownerDocument) == null ? void 0 : _a.activeElement;
|
|
44
|
+
return !activeElement || !reference.contains(activeElement);
|
|
45
|
+
});
|
|
46
|
+
const initialRender = react.useRef(true);
|
|
47
|
+
const targetWindow = window.useWindow();
|
|
48
|
+
styles.useComponentCssInjection({
|
|
49
|
+
testId: "salt-side-panel",
|
|
50
|
+
css: SidePanel$1,
|
|
51
|
+
window: targetWindow
|
|
52
|
+
});
|
|
53
|
+
const { context } = core.useFloatingUI({
|
|
54
|
+
rootContext: floatingRootContext
|
|
55
|
+
});
|
|
56
|
+
const handleRef = core.useForkRef(setFloating, ref);
|
|
57
|
+
const handleAnimationEnd = (event) => {
|
|
58
|
+
if (event.currentTarget !== event.target) return;
|
|
59
|
+
setAnimating(false);
|
|
60
|
+
if (!openState) {
|
|
61
|
+
setShowComponent(false);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
react.useEffect(() => {
|
|
65
|
+
setPanelId(id);
|
|
66
|
+
return () => {
|
|
67
|
+
setPanelId(void 0);
|
|
68
|
+
};
|
|
69
|
+
}, [id, setPanelId]);
|
|
70
|
+
react.useEffect(() => {
|
|
71
|
+
if (!openState) {
|
|
72
|
+
setSkipInitialFocus(false);
|
|
73
|
+
}
|
|
74
|
+
}, [openState]);
|
|
75
|
+
react.useEffect(() => {
|
|
76
|
+
var _a, _b;
|
|
77
|
+
if (disableAnimation) {
|
|
78
|
+
setShowComponent(openState);
|
|
79
|
+
setAnimating(false);
|
|
80
|
+
initialRender.current = false;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (initialRender.current && openState) {
|
|
84
|
+
const reference = floatingRootContext.elements.reference;
|
|
85
|
+
if (!(reference instanceof Element)) {
|
|
86
|
+
setShowComponent(true);
|
|
87
|
+
setAnimating(false);
|
|
88
|
+
initialRender.current = false;
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const prefersReducedMotion = (_b = (_a = targetWindow == null ? void 0 : targetWindow.matchMedia) == null ? void 0 : _a.call(
|
|
93
|
+
targetWindow,
|
|
94
|
+
"(prefers-reduced-motion: reduce)"
|
|
95
|
+
)) == null ? void 0 : _b.matches;
|
|
96
|
+
if (openState) {
|
|
97
|
+
setShowComponent(true);
|
|
98
|
+
}
|
|
99
|
+
if (prefersReducedMotion) {
|
|
100
|
+
setAnimating(false);
|
|
101
|
+
if (!openState) {
|
|
102
|
+
setShowComponent(false);
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
setAnimating(true);
|
|
106
|
+
}
|
|
107
|
+
initialRender.current = false;
|
|
108
|
+
}, [
|
|
109
|
+
openState,
|
|
110
|
+
targetWindow,
|
|
111
|
+
disableAnimation,
|
|
112
|
+
floatingRootContext.elements.reference
|
|
113
|
+
]);
|
|
114
|
+
if (!showComponent) return null;
|
|
115
|
+
const resolvedInitialFocus = skipInitialFocus ? -1 : initialFocus ?? 0;
|
|
116
|
+
const panelDiv = /* @__PURE__ */ jsxRuntime.jsx(
|
|
117
|
+
"div",
|
|
118
|
+
{
|
|
119
|
+
role: "region",
|
|
120
|
+
"aria-labelledby": clsx.clsx(ariaLabelledBy, titleId) || void 0,
|
|
121
|
+
ref: handleRef,
|
|
122
|
+
className: clsx.clsx(
|
|
123
|
+
withBaseName(),
|
|
124
|
+
{
|
|
125
|
+
[withBaseName(position)]: position,
|
|
126
|
+
[withBaseName(variant)]: variant,
|
|
127
|
+
[withBaseName("enterAnimation")]: !disableAnimation && openState && animating,
|
|
128
|
+
[withBaseName("exitAnimation")]: !disableAnimation && !openState && animating
|
|
129
|
+
},
|
|
130
|
+
className
|
|
131
|
+
),
|
|
132
|
+
onAnimationEnd: disableAnimation ? void 0 : handleAnimationEnd,
|
|
133
|
+
...rest,
|
|
134
|
+
id,
|
|
135
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: withBaseName("inner"), children })
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
if (openState || animating) {
|
|
139
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
140
|
+
react$1.FloatingFocusManager,
|
|
141
|
+
{
|
|
142
|
+
context,
|
|
143
|
+
modal: false,
|
|
144
|
+
initialFocus: resolvedInitialFocus,
|
|
145
|
+
closeOnFocusOut: false,
|
|
146
|
+
guards: false,
|
|
147
|
+
children: panelDiv
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return panelDiv;
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
exports.SidePanel = SidePanel;
|
|
156
|
+
//# sourceMappingURL=SidePanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanel.js","sources":["../src/side-panel/SidePanel.tsx"],"sourcesContent":["import { FloatingFocusManager } from \"@floating-ui/react\";\nimport { makePrefixer, useFloatingUI, useForkRef, useId } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type AnimationEvent,\n type ComponentProps,\n type ComponentPropsWithRef,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useSidePanelContext } from \"./internal\";\nimport sidePanelCss from \"./SidePanel.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanel\");\n\nexport interface SidePanelProps extends ComponentPropsWithRef<\"div\"> {\n /**\n * Disable the panel's own open/close animation.\n * Set to `true` when the parent controls sizing and animation (e.g. inside a splitter).\n * @default false\n */\n disableAnimation?: boolean;\n /**\n * Edge the panel is anchored to; controls animation direction and divider side.\n * @default \"right\"\n */\n position?: \"right\" | \"left\";\n /**\n * Which element receives focus when the panel opens.\n * Pass a number for the tabbable element index (0 = first), or a ref to a specific element.\n * Defaults to the side panel close button.\n */\n initialFocus?: ComponentProps<typeof FloatingFocusManager>[\"initialFocus\"];\n /**\n * The background color palette. Options are 'primary', 'secondary', 'tertiary' and 'none'.\n * @default \"primary\"\n */\n variant?: \"primary\" | \"secondary\" | \"tertiary\" | \"none\";\n}\n\nexport const SidePanel = forwardRef<HTMLDivElement, SidePanelProps>(\n function SidePanel(props, ref) {\n const {\n disableAnimation = false,\n position = \"right\",\n initialFocus,\n variant = \"primary\",\n children,\n id: idProp,\n className,\n \"aria-labelledby\": ariaLabelledBy,\n ...rest\n } = props;\n\n const { openState, floatingRootContext, setFloating, setPanelId, titleId } =\n useSidePanelContext();\n\n const id = useId(idProp);\n\n const [showComponent, setShowComponent] = useState(openState);\n const [animating, setAnimating] = useState(() => {\n if (!openState || disableAnimation) return false;\n // Animate on first mount only when the trigger has focus, indicating a\n // user-initiated open.\n const reference = floatingRootContext.elements.reference;\n if (!(reference instanceof Element)) return false;\n const activeElement = reference.ownerDocument?.activeElement;\n return !!activeElement && reference.contains(activeElement);\n });\n // On first mount while open, skip moving focus when focus did not come from the trigger.\n const [skipInitialFocus, setSkipInitialFocus] = useState(() => {\n if (!openState) return false;\n const reference = floatingRootContext.elements.reference;\n if (!(reference instanceof Element)) return true;\n const activeElement = reference.ownerDocument?.activeElement;\n return !activeElement || !reference.contains(activeElement);\n });\n // Track whether this is the initial render to skip the open animation.\n const initialRender = useRef(true);\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel\",\n css: sidePanelCss,\n window: targetWindow,\n });\n\n const { context } = useFloatingUI({\n rootContext: floatingRootContext,\n });\n\n const handleRef = useForkRef<HTMLDivElement>(setFloating, ref);\n\n const handleAnimationEnd = (event: AnimationEvent<HTMLDivElement>) => {\n if (event.currentTarget !== event.target) return;\n setAnimating(false);\n if (!openState) {\n setShowComponent(false);\n }\n };\n\n useEffect(() => {\n // Keep this as state (not ref): setPanelId causes a context re-render and\n // this value is consumed as a prop for initial focus behavior.\n setPanelId(id);\n\n return () => {\n setPanelId(undefined);\n };\n }, [id, setPanelId]);\n\n useEffect(() => {\n if (!openState) {\n setSkipInitialFocus(false);\n }\n }, [openState]);\n\n useEffect(() => {\n if (disableAnimation) {\n // When animation is disabled, show/hide immediately since there is\n // no exit animation to wait for before unmounting.\n setShowComponent(openState);\n setAnimating(false);\n initialRender.current = false;\n return;\n }\n\n // Skip animation on initial render when panel is already open\n // without a trigger interaction (i.e. defaultOpen scenario).\n if (initialRender.current && openState) {\n const reference = floatingRootContext.elements.reference;\n if (!(reference instanceof Element)) {\n setShowComponent(true);\n setAnimating(false);\n initialRender.current = false;\n return;\n }\n }\n\n const prefersReducedMotion = targetWindow?.matchMedia?.(\n \"(prefers-reduced-motion: reduce)\",\n )?.matches;\n\n if (openState) {\n setShowComponent(true);\n }\n\n if (prefersReducedMotion) {\n setAnimating(false);\n if (!openState) {\n setShowComponent(false);\n }\n } else {\n setAnimating(true);\n }\n\n initialRender.current = false;\n }, [\n openState,\n targetWindow,\n disableAnimation,\n floatingRootContext.elements.reference,\n ]);\n\n if (!showComponent) return null;\n\n // `-1` skips initial focus movement but preserves focus guards/return focus handling.\n const resolvedInitialFocus = skipInitialFocus ? -1 : (initialFocus ?? 0);\n\n const panelDiv = (\n <div\n role=\"region\"\n aria-labelledby={clsx(ariaLabelledBy, titleId) || undefined}\n ref={handleRef}\n className={clsx(\n withBaseName(),\n {\n [withBaseName(position)]: position,\n [withBaseName(variant)]: variant,\n [withBaseName(\"enterAnimation\")]:\n !disableAnimation && openState && animating,\n [withBaseName(\"exitAnimation\")]:\n !disableAnimation && !openState && animating,\n },\n className,\n )}\n onAnimationEnd={disableAnimation ? undefined : handleAnimationEnd}\n {...rest}\n id={id}\n >\n <div className={withBaseName(\"inner\")}>{children}</div>\n </div>\n );\n\n if (openState || animating) {\n return (\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={resolvedInitialFocus}\n closeOnFocusOut={false}\n guards={false}\n >\n {panelDiv}\n </FloatingFocusManager>\n );\n }\n\n return panelDiv;\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanel","useSidePanelContext","useId","useState","useRef","useWindow","useComponentCssInjection","sidePanelCss","useFloatingUI","useForkRef","useEffect","jsx","clsx","FloatingFocusManager"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltSidePanelContent {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n box-sizing: border-box;\n}\n\n.saltSidePanelContent-body {\n flex: 1;\n overflow: auto;\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=SidePanelContent.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContent.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var clsx = require('clsx');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
10
|
+
var SidePanelContent$1 = require('./SidePanelContent.css.js');
|
|
11
|
+
|
|
12
|
+
const withBaseName = core.makePrefixer("saltSidePanelContent");
|
|
13
|
+
const SidePanelContent = react.forwardRef(function SidePanelContent2(props, ref) {
|
|
14
|
+
const {
|
|
15
|
+
children,
|
|
16
|
+
className,
|
|
17
|
+
"aria-labelledby": ariaLabelledBy,
|
|
18
|
+
"aria-label": ariaLabel,
|
|
19
|
+
...rest
|
|
20
|
+
} = props;
|
|
21
|
+
const { titleId } = SidePanelContext.useSidePanelContext();
|
|
22
|
+
const targetWindow = window.useWindow();
|
|
23
|
+
const contentSuffixId = core.useId();
|
|
24
|
+
const bodyRef = react.useRef(null);
|
|
25
|
+
const [isScrollable, setIsScrollable] = react.useState(false);
|
|
26
|
+
react.useEffect(() => {
|
|
27
|
+
const bodyElement = bodyRef.current;
|
|
28
|
+
if (!bodyElement) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const checkScrollable = () => {
|
|
32
|
+
setIsScrollable(
|
|
33
|
+
bodyElement.scrollHeight > bodyElement.clientHeight || bodyElement.scrollWidth > bodyElement.clientWidth
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
checkScrollable();
|
|
37
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
38
|
+
checkScrollable();
|
|
39
|
+
});
|
|
40
|
+
resizeObserver.observe(bodyElement);
|
|
41
|
+
const mutationObserver = new MutationObserver(checkScrollable);
|
|
42
|
+
mutationObserver.observe(bodyElement, { childList: true, subtree: true });
|
|
43
|
+
return () => {
|
|
44
|
+
resizeObserver.disconnect();
|
|
45
|
+
mutationObserver.disconnect();
|
|
46
|
+
};
|
|
47
|
+
}, []);
|
|
48
|
+
styles.useComponentCssInjection({
|
|
49
|
+
testId: "salt-side-panel-content",
|
|
50
|
+
css: SidePanelContent$1,
|
|
51
|
+
window: targetWindow
|
|
52
|
+
});
|
|
53
|
+
const explicitLabelledBy = ariaLabelledBy;
|
|
54
|
+
const explicitLabel = ariaLabel;
|
|
55
|
+
let bodyAriaLabelledBy;
|
|
56
|
+
let bodyAriaLabel;
|
|
57
|
+
if (isScrollable) {
|
|
58
|
+
if (explicitLabelledBy) {
|
|
59
|
+
bodyAriaLabelledBy = explicitLabelledBy;
|
|
60
|
+
} else if (titleId) {
|
|
61
|
+
bodyAriaLabelledBy = clsx.clsx(titleId, contentSuffixId) || void 0;
|
|
62
|
+
} else {
|
|
63
|
+
bodyAriaLabel = explicitLabel ?? "Content";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children: [
|
|
67
|
+
isScrollable ? /* @__PURE__ */ jsxRuntime.jsx("span", { id: contentSuffixId, hidden: true, children: "content" }) : null,
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
69
|
+
"div",
|
|
70
|
+
{
|
|
71
|
+
ref: bodyRef,
|
|
72
|
+
className: withBaseName("body"),
|
|
73
|
+
...isScrollable && {
|
|
74
|
+
role: "region",
|
|
75
|
+
tabIndex: 0,
|
|
76
|
+
"aria-labelledby": bodyAriaLabelledBy,
|
|
77
|
+
"aria-label": bodyAriaLabel
|
|
78
|
+
},
|
|
79
|
+
children
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
] });
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
exports.SidePanelContent = SidePanelContent;
|
|
86
|
+
//# sourceMappingURL=SidePanelContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContent.js","sources":["../src/side-panel/SidePanelContent.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 {\n type ComponentPropsWithRef,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useSidePanelContext } from \"./internal\";\nimport sidePanelContentCss from \"./SidePanelContent.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelContent\");\n\nexport interface SidePanelContentProps extends ComponentPropsWithRef<\"div\"> {}\n\nexport const SidePanelContent = forwardRef<\n HTMLDivElement,\n SidePanelContentProps\n>(function SidePanelContent(props, ref) {\n const {\n children,\n className,\n \"aria-labelledby\": ariaLabelledBy,\n \"aria-label\": ariaLabel,\n ...rest\n } = props;\n\n const { titleId } = useSidePanelContext();\n const targetWindow = useWindow();\n const contentSuffixId = useId();\n const bodyRef = useRef<HTMLDivElement | null>(null);\n const [isScrollable, setIsScrollable] = useState(false);\n\n // Monitor scrollability of the body element\n useEffect(() => {\n const bodyElement = bodyRef.current;\n if (!bodyElement) {\n return;\n }\n\n const checkScrollable = () => {\n // Element is scrollable if scrollHeight > clientHeight\n setIsScrollable(\n bodyElement.scrollHeight > bodyElement.clientHeight ||\n bodyElement.scrollWidth > bodyElement.clientWidth,\n );\n };\n\n // Check immediately\n checkScrollable();\n\n // Use ResizeObserver to detect when the panel resizes\n const resizeObserver = new ResizeObserver(() => {\n checkScrollable();\n });\n\n resizeObserver.observe(bodyElement);\n\n // Use MutationObserver to detect when dynamic content is added/removed,\n // since child size changes don't trigger ResizeObserver on the parent.\n const mutationObserver = new MutationObserver(checkScrollable);\n mutationObserver.observe(bodyElement, { childList: true, subtree: true });\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, []);\n\n useComponentCssInjection({\n testId: \"salt-side-panel-content\",\n css: sidePanelContentCss,\n window: targetWindow,\n });\n\n const explicitLabelledBy = ariaLabelledBy;\n const explicitLabel = ariaLabel;\n\n let bodyAriaLabelledBy: string | undefined;\n let bodyAriaLabel: string | undefined;\n\n if (isScrollable) {\n if (explicitLabelledBy) {\n bodyAriaLabelledBy = explicitLabelledBy;\n } else if (titleId) {\n bodyAriaLabelledBy = clsx(titleId, contentSuffixId) || undefined;\n } else {\n bodyAriaLabel = explicitLabel ?? \"Content\";\n }\n }\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {isScrollable ? (\n <span id={contentSuffixId} hidden>\n content\n </span>\n ) : null}\n <div\n ref={bodyRef}\n className={withBaseName(\"body\")}\n {...(isScrollable && {\n role: \"region\",\n tabIndex: 0,\n \"aria-labelledby\": bodyAriaLabelledBy,\n \"aria-label\": bodyAriaLabel,\n })}\n >\n {children}\n </div>\n </div>\n );\n});\n"],"names":["makePrefixer","forwardRef","SidePanelContent","useSidePanelContext","useWindow","useId","useRef","useState","useEffect","useComponentCssInjection","sidePanelContentCss","clsx","jsxs","jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var css_248z = ".saltSidePanelHeader {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n gap: var(--salt-spacing-100);\n padding: 0 0 var(--salt-spacing-300);\n}\n";
|
|
4
|
+
|
|
5
|
+
module.exports = css_248z;
|
|
6
|
+
//# sourceMappingURL=SidePanelHeader.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelHeader.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var clsx = require('clsx');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var SidePanelHeader$1 = require('./SidePanelHeader.css.js');
|
|
10
|
+
|
|
11
|
+
const withBaseName = core.makePrefixer("saltSidePanelHeader");
|
|
12
|
+
const SidePanelHeader = react.forwardRef(
|
|
13
|
+
function SidePanelHeader2(props, ref) {
|
|
14
|
+
const { children, className, ...rest } = props;
|
|
15
|
+
const targetWindow = window.useWindow();
|
|
16
|
+
styles.useComponentCssInjection({
|
|
17
|
+
testId: "salt-side-panel-header",
|
|
18
|
+
css: SidePanelHeader$1,
|
|
19
|
+
window: targetWindow
|
|
20
|
+
});
|
|
21
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: clsx.clsx(withBaseName(), className), ...rest, children });
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
exports.SidePanelHeader = SidePanelHeader;
|
|
26
|
+
//# sourceMappingURL=SidePanelHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelHeader.js","sources":["../src/side-panel/SidePanelHeader.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 { type ComponentPropsWithRef, forwardRef } from \"react\";\nimport sidePanelHeaderCss from \"./SidePanelHeader.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelHeader\");\n\nexport interface SidePanelHeaderProps extends ComponentPropsWithRef<\"div\"> {}\n\nexport const SidePanelHeader = forwardRef<HTMLDivElement, SidePanelHeaderProps>(\n function SidePanelHeader(props, ref) {\n const { children, className, ...rest } = props;\n\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-header\",\n css: sidePanelHeaderCss,\n window: targetWindow,\n });\n\n return (\n <div ref={ref} className={clsx(withBaseName(), className)} {...rest}>\n {children}\n </div>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanelHeader","useWindow","useComponentCssInjection","sidePanelHeaderCss","jsx","clsx"],"mappings":";;;;;;;;;;AAOA,MAAM,YAAA,GAAeA,kBAAa,qBAAqB,CAAA;AAIhD,MAAM,eAAA,GAAkBC,gBAAA;AAAA,EAC7B,SAASC,gBAAAA,CAAgB,KAAA,EAAO,GAAA,EAAK;AACnC,IAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,GAAI,KAAA;AAEzC,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAE/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,wBAAA;AAAA,MACR,GAAA,EAAKC,iBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA,EAAI,GAAG,IAAA,EAC5D,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react$1 = require('@floating-ui/react');
|
|
5
|
+
var core = require('@salt-ds/core');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
8
|
+
|
|
9
|
+
function SidePanelProvider(props) {
|
|
10
|
+
const { children, open: openProp, defaultOpen, onOpenChange } = props;
|
|
11
|
+
const [openState, setOpenState] = core.useControlled({
|
|
12
|
+
default: Boolean(defaultOpen),
|
|
13
|
+
controlled: openProp,
|
|
14
|
+
name: "SidePanelProvider",
|
|
15
|
+
state: "open"
|
|
16
|
+
});
|
|
17
|
+
const handleOpenChange = react.useCallback(
|
|
18
|
+
(newOpen) => {
|
|
19
|
+
setOpenState(newOpen);
|
|
20
|
+
onOpenChange == null ? void 0 : onOpenChange(newOpen);
|
|
21
|
+
},
|
|
22
|
+
[onOpenChange]
|
|
23
|
+
);
|
|
24
|
+
const [reference, setReference] = react.useState(null);
|
|
25
|
+
const [floating, setFloating] = react.useState(null);
|
|
26
|
+
const [panelId, setPanelId] = react.useState(void 0);
|
|
27
|
+
const [titleId, setTitleId] = react.useState(void 0);
|
|
28
|
+
const floatingRootContext = react$1.useFloatingRootContext({
|
|
29
|
+
open: openState,
|
|
30
|
+
onOpenChange: handleOpenChange,
|
|
31
|
+
elements: {
|
|
32
|
+
reference,
|
|
33
|
+
floating
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
react.useEffect(() => {
|
|
37
|
+
if (!openState || !floating) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const onKeyDown = (event) => {
|
|
41
|
+
if (event.key !== "Escape") {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
event.preventDefault();
|
|
45
|
+
event.stopPropagation();
|
|
46
|
+
handleOpenChange(false);
|
|
47
|
+
};
|
|
48
|
+
floating.addEventListener("keydown", onKeyDown);
|
|
49
|
+
return () => {
|
|
50
|
+
floating.removeEventListener("keydown", onKeyDown);
|
|
51
|
+
};
|
|
52
|
+
}, [floating, openState, handleOpenChange]);
|
|
53
|
+
const context = react.useMemo(
|
|
54
|
+
() => ({
|
|
55
|
+
openState,
|
|
56
|
+
floatingRootContext,
|
|
57
|
+
setFloating,
|
|
58
|
+
setReference,
|
|
59
|
+
setOpen: handleOpenChange,
|
|
60
|
+
panelId,
|
|
61
|
+
setPanelId,
|
|
62
|
+
titleId,
|
|
63
|
+
setTitleId
|
|
64
|
+
}),
|
|
65
|
+
[openState, floatingRootContext, handleOpenChange, panelId, titleId]
|
|
66
|
+
);
|
|
67
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SidePanelContext.SidePanelContext.Provider, { value: context, children });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
exports.SidePanelProvider = SidePanelProvider;
|
|
71
|
+
//# sourceMappingURL=SidePanelProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelProvider.js","sources":["../src/side-panel/SidePanelProvider.tsx"],"sourcesContent":["import { useFloatingRootContext } from \"@floating-ui/react\";\nimport { useControlled } from \"@salt-ds/core\";\nimport {\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { SidePanelContext } from \"./internal\";\n\nexport interface SidePanelProviderProps {\n /**\n * Whether the panel is open.\n */\n open?: boolean;\n /**\n * Default open state when initially rendered.\n */\n defaultOpen?: boolean;\n /**\n * Callback when open state changes.\n */\n onOpenChange?: (open: boolean) => void;\n /**\n * SidePanelProvider children, should include SidePanel and SidePanelTrigger.\n */\n children: ReactNode;\n}\n\nexport function SidePanelProvider(props: SidePanelProviderProps) {\n const { children, open: openProp, defaultOpen, onOpenChange } = props;\n\n const [openState, setOpenState] = useControlled({\n default: Boolean(defaultOpen),\n controlled: openProp,\n name: \"SidePanelProvider\",\n state: \"open\",\n });\n\n const handleOpenChange = useCallback(\n (newOpen: boolean) => {\n setOpenState(newOpen);\n onOpenChange?.(newOpen);\n },\n [onOpenChange],\n );\n\n const [reference, setReference] = useState<HTMLElement | null>(null);\n const [floating, setFloating] = useState<HTMLDivElement | null>(null);\n const [panelId, setPanelId] = useState<string | undefined>(undefined);\n const [titleId, setTitleId] = useState<string | undefined>(undefined);\n\n const floatingRootContext = useFloatingRootContext({\n open: openState,\n onOpenChange: handleOpenChange,\n elements: {\n reference,\n floating,\n },\n });\n\n useEffect(() => {\n if (!openState || !floating) {\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n handleOpenChange(false);\n };\n\n floating.addEventListener(\"keydown\", onKeyDown);\n return () => {\n floating.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [floating, openState, handleOpenChange]);\n\n const context = useMemo(\n () => ({\n openState,\n floatingRootContext,\n setFloating,\n setReference,\n setOpen: handleOpenChange,\n panelId,\n setPanelId,\n titleId,\n setTitleId,\n }),\n [openState, floatingRootContext, handleOpenChange, panelId, titleId],\n );\n\n return (\n <SidePanelContext.Provider value={context}>\n {children}\n </SidePanelContext.Provider>\n );\n}\n"],"names":["useControlled","useCallback","useState","useFloatingRootContext","useEffect","useMemo","SidePanelContext"],"mappings":";;;;;;;;AA8BO,SAAS,kBAAkB,KAAA,EAA+B;AAC/D,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,cAAa,GAAI,KAAA;AAEhE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,kBAAA,CAAc;AAAA,IAC9C,OAAA,EAAS,QAAQ,WAAW,CAAA;AAAA,IAC5B,UAAA,EAAY,QAAA;AAAA,IACZ,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmBC,iBAAA;AAAA,IACvB,CAAC,OAAA,KAAqB;AACpB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,YAAA,IAAA,IAAA,GAAA,MAAA,GAAA,YAAA,CAAe,OAAA,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,CAAC,YAAY;AAAA,GACf;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAA6B,IAAI,CAAA;AACnE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAgC,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA6B,MAAS,CAAA;AACpE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAEpE,EAAA,MAAM,sBAAsBC,8BAAA,CAAuB;AAAA,IACjD,IAAA,EAAM,SAAA;AAAA,IACN,YAAA,EAAc,gBAAA;AAAA,IACd,QAAA,EAAU;AAAA,MACR,SAAA;AAAA,MACA;AAAA;AACF,GACD,CAAA;AAED,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAyB;AAC1C,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAE1C,EAAA,MAAM,OAAA,GAAUC,aAAA;AAAA,IACd,OAAO;AAAA,MACL,SAAA;AAAA,MACA,mBAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,gBAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,mBAAA,EAAqB,gBAAA,EAAkB,SAAS,OAAO;AAAA,GACrE;AAEA,EAAA,sCACGC,iCAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,SAC/B,QAAA,EACH,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTitle.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var clsx = require('clsx');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
10
|
+
var SidePanelTitle$1 = require('./SidePanelTitle.css.js');
|
|
11
|
+
|
|
12
|
+
const withBaseName = core.makePrefixer("saltSidePanelTitle");
|
|
13
|
+
const SidePanelTitle = react.forwardRef(
|
|
14
|
+
function SidePanelTitle2(props, ref) {
|
|
15
|
+
const { children, className, id, styleAs = "h2", ...rest } = props;
|
|
16
|
+
const { setTitleId } = SidePanelContext.useSidePanelContext();
|
|
17
|
+
const targetWindow = window.useWindow();
|
|
18
|
+
styles.useComponentCssInjection({
|
|
19
|
+
testId: "salt-side-panel-title",
|
|
20
|
+
css: SidePanelTitle$1,
|
|
21
|
+
window: targetWindow
|
|
22
|
+
});
|
|
23
|
+
const titleId = core.useId(id);
|
|
24
|
+
core.useIsomorphicLayoutEffect(() => {
|
|
25
|
+
if (titleId) {
|
|
26
|
+
setTitleId(titleId);
|
|
27
|
+
}
|
|
28
|
+
return () => {
|
|
29
|
+
setTitleId(void 0);
|
|
30
|
+
};
|
|
31
|
+
}, [titleId, setTitleId]);
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
core.Text,
|
|
34
|
+
{
|
|
35
|
+
ref,
|
|
36
|
+
id: titleId,
|
|
37
|
+
styleAs,
|
|
38
|
+
className: clsx.clsx(withBaseName(), className),
|
|
39
|
+
...rest,
|
|
40
|
+
children
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
exports.SidePanelTitle = SidePanelTitle;
|
|
47
|
+
//# sourceMappingURL=SidePanelTitle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTitle.js","sources":["../src/side-panel/SidePanelTitle.tsx"],"sourcesContent":["import {\n makePrefixer,\n Text,\n type TextProps,\n useId,\n useIsomorphicLayoutEffect,\n} 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 { useSidePanelContext } from \"./internal\";\nimport sidePanelTitleCss from \"./SidePanelTitle.css\";\n\nconst withBaseName = makePrefixer(\"saltSidePanelTitle\");\n\nexport interface SidePanelTitleProps extends TextProps<\"div\"> {}\n\nexport const SidePanelTitle = forwardRef<HTMLDivElement, SidePanelTitleProps>(\n function SidePanelTitle(props, ref) {\n const { children, className, id, styleAs = \"h2\", ...rest } = props;\n\n const { setTitleId } = useSidePanelContext();\n const targetWindow = useWindow();\n\n useComponentCssInjection({\n testId: \"salt-side-panel-title\",\n css: sidePanelTitleCss,\n window: targetWindow,\n });\n\n const titleId = useId(id);\n\n useIsomorphicLayoutEffect(() => {\n if (titleId) {\n setTitleId(titleId);\n }\n\n return () => {\n setTitleId(undefined);\n };\n }, [titleId, setTitleId]);\n\n return (\n <Text\n ref={ref}\n id={titleId}\n styleAs={styleAs}\n className={clsx(withBaseName(), className)}\n {...rest}\n >\n {children}\n </Text>\n );\n },\n);\n"],"names":["makePrefixer","forwardRef","SidePanelTitle","useSidePanelContext","useWindow","useComponentCssInjection","sidePanelTitleCss","useId","useIsomorphicLayoutEffect","jsx","Text","clsx"],"mappings":";;;;;;;;;;;AAcA,MAAM,YAAA,GAAeA,kBAAa,oBAAoB,CAAA;AAI/C,MAAM,cAAA,GAAiBC,gBAAA;AAAA,EAC5B,SAASC,eAAAA,CAAe,KAAA,EAAO,GAAA,EAAK;AAClC,IAAA,MAAM,EAAE,UAAU,SAAA,EAAW,EAAA,EAAI,UAAU,IAAA,EAAM,GAAG,MAAK,GAAI,KAAA;AAE7D,IAAA,MAAM,EAAE,UAAA,EAAW,GAAIC,oCAAA,EAAoB;AAC3C,IAAA,MAAM,eAAeC,gBAAA,EAAU;AAE/B,IAAAC,+BAAA,CAAyB;AAAA,MACvB,MAAA,EAAQ,uBAAA;AAAA,MACR,GAAA,EAAKC,gBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,MAAM,OAAA,GAAUC,WAAM,EAAE,CAAA;AAExB,IAAAC,8BAAA,CAA0B,MAAM;AAC9B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,OAAO,CAAA;AAAA,MACpB;AAEA,MAAA,OAAO,MAAM;AACX,QAAA,UAAA,CAAW,MAAS,CAAA;AAAA,MACtB,CAAA;AAAA,IACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,IAAA,uBACEC,cAAA;AAAA,MAACC,SAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,EAAA,EAAI,OAAA;AAAA,QACJ,OAAA;AAAA,QACA,SAAA,EAAWC,SAAA,CAAK,YAAA,EAAa,EAAG,SAAS,CAAA;AAAA,QACxC,GAAG,IAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
7
|
+
|
|
8
|
+
const SidePanelTrigger = react.forwardRef(function SidePanelTrigger2(props, ref) {
|
|
9
|
+
const { children, onClick, ...rest } = props;
|
|
10
|
+
const { setReference, openState, setOpen, panelId } = SidePanelContext.useSidePanelContext();
|
|
11
|
+
const childRef = children == null ? void 0 : children.ref;
|
|
12
|
+
const combinedRef = core.useForkRef(setReference, ref);
|
|
13
|
+
const handleRef = core.useForkRef(combinedRef, childRef);
|
|
14
|
+
const handleClick = (event) => {
|
|
15
|
+
onClick == null ? void 0 : onClick(event);
|
|
16
|
+
setOpen(!openState);
|
|
17
|
+
};
|
|
18
|
+
if (!children || !react.isValidElement(children)) {
|
|
19
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
|
|
20
|
+
}
|
|
21
|
+
const mergedProps = core.mergeProps(
|
|
22
|
+
{
|
|
23
|
+
"aria-expanded": openState,
|
|
24
|
+
"aria-controls": openState ? panelId : void 0,
|
|
25
|
+
...rest,
|
|
26
|
+
onClick: handleClick
|
|
27
|
+
},
|
|
28
|
+
children.props
|
|
29
|
+
);
|
|
30
|
+
return react.cloneElement(children, {
|
|
31
|
+
...mergedProps,
|
|
32
|
+
ref: handleRef
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
exports.SidePanelTrigger = SidePanelTrigger;
|
|
37
|
+
//# sourceMappingURL=SidePanelTrigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelTrigger.js","sources":["../src/side-panel/SidePanelTrigger.tsx"],"sourcesContent":["import { mergeProps, useForkRef } from \"@salt-ds/core\";\nimport {\n type ComponentPropsWithoutRef,\n cloneElement,\n forwardRef,\n isValidElement,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport { useSidePanelContext } from \"./internal\";\n\nexport interface SidePanelTriggerProps\n extends ComponentPropsWithoutRef<\"button\"> {\n children?: ReactNode;\n}\n\nexport const SidePanelTrigger = forwardRef<\n HTMLButtonElement,\n SidePanelTriggerProps\n>(function SidePanelTrigger(props, ref) {\n const { children, onClick, ...rest } = props;\n const { setReference, openState, setOpen, panelId } = useSidePanelContext();\n\n const childRef = (children as { ref?: React.Ref<HTMLButtonElement> })?.ref;\n const combinedRef = useForkRef(setReference, ref);\n const handleRef = useForkRef(combinedRef, childRef);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n setOpen(!openState);\n };\n\n if (!children || !isValidElement(children)) {\n return <>{children}</>;\n }\n\n const mergedProps = mergeProps(\n {\n \"aria-expanded\": openState,\n \"aria-controls\": openState ? panelId : undefined,\n ...rest,\n onClick: handleClick,\n },\n children.props,\n );\n\n return cloneElement(children, {\n ...mergedProps,\n ref: handleRef,\n });\n});\n"],"names":["forwardRef","SidePanelTrigger","useSidePanelContext","useForkRef","isValidElement","mergeProps","cloneElement"],"mappings":";;;;;;;AAgBO,MAAM,gBAAA,GAAmBA,gBAAA,CAG9B,SAASC,iBAAAA,CAAiB,OAAO,GAAA,EAAK;AACtC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,GAAG,MAAK,GAAI,KAAA;AACvC,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAW,OAAA,EAAS,OAAA,KAAYC,oCAAA,EAAoB;AAE1E,EAAA,MAAM,WAAY,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAqD,GAAA;AACvE,EAAA,MAAM,WAAA,GAAcC,eAAA,CAAW,YAAA,EAAc,GAAG,CAAA;AAChD,EAAA,MAAM,SAAA,GAAYA,eAAA,CAAW,WAAA,EAAa,QAAQ,CAAA;AAElD,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,IAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAU,KAAA,CAAA;AACV,IAAA,OAAA,CAAQ,CAAC,SAAS,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,IAAI,CAAC,QAAA,IAAY,CAACC,oBAAA,CAAe,QAAQ,CAAA,EAAG;AAC1C,IAAA,6DAAU,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,WAAA,GAAcC,eAAA;AAAA,IAClB;AAAA,MACE,eAAA,EAAiB,SAAA;AAAA,MACjB,eAAA,EAAiB,YAAY,OAAA,GAAU,MAAA;AAAA,MACvC,GAAG,IAAA;AAAA,MACH,OAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AAEA,EAAA,OAAOC,mBAAa,QAAA,EAAU;AAAA,IAC5B,GAAG,WAAA;AAAA,IACH,GAAA,EAAK;AAAA,GACN,CAAA;AACH,CAAC;;;;"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@salt-ds/core');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
|
|
6
|
+
const SidePanelContext = core.createContext(
|
|
7
|
+
"SidePanelContext",
|
|
8
|
+
{
|
|
9
|
+
openState: false,
|
|
10
|
+
floatingRootContext: {},
|
|
11
|
+
setFloating: () => {
|
|
12
|
+
},
|
|
13
|
+
setReference: () => {
|
|
14
|
+
},
|
|
15
|
+
setOpen: () => {
|
|
16
|
+
},
|
|
17
|
+
panelId: void 0,
|
|
18
|
+
setPanelId: () => {
|
|
19
|
+
},
|
|
20
|
+
titleId: void 0,
|
|
21
|
+
setTitleId: () => {
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
);
|
|
25
|
+
function useSidePanelContext() {
|
|
26
|
+
return react.useContext(SidePanelContext);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
exports.SidePanelContext = SidePanelContext;
|
|
30
|
+
exports.useSidePanelContext = useSidePanelContext;
|
|
31
|
+
//# sourceMappingURL=SidePanelContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidePanelContext.js","sources":["../src/side-panel/internal/SidePanelContext.ts"],"sourcesContent":["import type { FloatingRootContext } from \"@floating-ui/react\";\nimport { createContext } from \"@salt-ds/core\";\nimport { type Dispatch, type SetStateAction, useContext } from \"react\";\n\nexport interface SidePanelContextValue {\n /**\n * Whether the side panel is currently open.\n */\n openState: boolean;\n /**\n * The floating-ui root context shared between the trigger and the panel.\n * Coordinates interactions (click, dismiss, role) across both elements.\n */\n floatingRootContext: FloatingRootContext;\n /**\n * Ref setter for the panel element.\n * Registers the panel DOM node with floating-ui.\n */\n setFloating: Dispatch<SetStateAction<HTMLDivElement | null>>;\n /**\n * Ref setter for the reference (trigger) element.\n * Registers the trigger DOM node with floating-ui for focus return.\n */\n setReference: Dispatch<SetStateAction<HTMLElement | null>>;\n /**\n * Sets the open state of the panel.\n * Called by the close button in SidePanelHeader, or any consumer that needs to close the panel.\n */\n setOpen: (open: boolean) => void;\n /**\n * Side panel id used for aria-controls on the trigger.\n */\n panelId?: string;\n /**\n * Registers or clears the side panel id used for aria-controls/id linkage.\n */\n setPanelId: Dispatch<SetStateAction<string | undefined>>;\n /**\n * The auto-generated id placed on SidePanelTitle.\n * Used for aria-labelledby on the panel region and the scrollable body.\n */\n titleId?: string;\n /**\n * Registers the title id from SidePanelTitle back to the context\n * so that SidePanel and SidePanelContent can use it for aria-labelledby.\n */\n setTitleId: Dispatch<SetStateAction<string | undefined>>;\n}\n\nexport const SidePanelContext = createContext<SidePanelContextValue>(\n \"SidePanelContext\",\n {\n openState: false,\n floatingRootContext: {} as FloatingRootContext,\n setFloating: () => {},\n setReference: () => {},\n setOpen: () => {},\n panelId: undefined,\n setPanelId: () => {},\n titleId: undefined,\n setTitleId: () => {},\n },\n);\n\nexport function useSidePanelContext() {\n return useContext(SidePanelContext);\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAiDO,MAAM,gBAAA,GAAmBA,kBAAA;AAAA,EAC9B,kBAAA;AAAA,EACA;AAAA,IACE,SAAA,EAAW,KAAA;AAAA,IACX,qBAAqB,EAAC;AAAA,IACtB,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,OAAA,EAAS,MAAA;AAAA,IACT,YAAY,MAAM;AAAA,IAAC;AAAA;AAEvB;AAEO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAOC,iBAAW,gBAAgB,CAAA;AACpC;;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var SidePanelContext = require('./internal/SidePanelContext.js');
|
|
5
|
+
|
|
6
|
+
function useSidePanel() {
|
|
7
|
+
const { openState, setOpen, setReference, panelId } = SidePanelContext.useSidePanelContext();
|
|
8
|
+
const getTriggerProps = react.useCallback(
|
|
9
|
+
(userProps) => {
|
|
10
|
+
const userOnClick = userProps == null ? void 0 : userProps.onClick;
|
|
11
|
+
return {
|
|
12
|
+
"aria-expanded": openState,
|
|
13
|
+
"aria-controls": openState ? panelId : void 0,
|
|
14
|
+
...userProps,
|
|
15
|
+
onClick: (e) => {
|
|
16
|
+
userOnClick == null ? void 0 : userOnClick(e);
|
|
17
|
+
},
|
|
18
|
+
ref: (node) => {
|
|
19
|
+
setReference(node);
|
|
20
|
+
const userRef = userProps == null ? void 0 : userProps.ref;
|
|
21
|
+
if (typeof userRef === "function") {
|
|
22
|
+
userRef(node);
|
|
23
|
+
} else if (userRef && typeof userRef === "object" && "current" in userRef) {
|
|
24
|
+
userRef.current = node;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
},
|
|
29
|
+
[openState, panelId, setReference]
|
|
30
|
+
);
|
|
31
|
+
return {
|
|
32
|
+
openState,
|
|
33
|
+
setOpen,
|
|
34
|
+
getTriggerProps,
|
|
35
|
+
setTriggerRef: setReference,
|
|
36
|
+
panelId
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.useSidePanel = useSidePanel;
|
|
41
|
+
//# sourceMappingURL=useSidePanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSidePanel.js","sources":["../src/side-panel/useSidePanel.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useSidePanelContext } from \"./internal\";\n\nexport interface SidePanelValue {\n /**\n * Whether the side panel is currently open.\n */\n openState: boolean;\n /**\n * Sets the open state of the panel.\n */\n setOpen: (open: boolean) => void;\n /**\n * Props getter for a single trigger element.\n * Merges `aria-expanded`, `aria-controls`, a `ref` callback (to register\n * the trigger for focus-return), and user-provided props.\n * Best for the common case where one button toggles one panel.\n *\n * For multi-trigger scenarios (e.g. table rows), use `setTriggerRef` and\n * manage ARIA attributes yourself instead.\n */\n getTriggerProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n /**\n * Registers the element that should receive focus when the panel closes.\n * Use this in multi-trigger scenarios (e.g. table rows) where each trigger\n * needs explicit control over which element is the reference.\n */\n setTriggerRef: (element: HTMLElement | null) => void;\n /**\n * The panel's DOM id. Use this for `aria-controls` in multi-trigger\n * scenarios where you manage ARIA attributes yourself.\n */\n panelId: string | undefined;\n}\n\nexport function useSidePanel(): SidePanelValue {\n const { openState, setOpen, setReference, panelId } = useSidePanelContext();\n\n const getTriggerProps = useCallback(\n (userProps?: Record<string, unknown>) => {\n const userOnClick = userProps?.onClick as\n | ((e: React.MouseEvent<HTMLElement>) => void)\n | undefined;\n\n return {\n \"aria-expanded\": openState,\n \"aria-controls\": openState ? panelId : undefined,\n ...userProps,\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n userOnClick?.(e);\n },\n ref: (node: HTMLElement | null) => {\n // Register this element as the trigger for focus return\n setReference(node);\n // Forward the consumer's ref if provided\n const userRef = userProps?.ref;\n if (typeof userRef === \"function\") {\n userRef(node);\n } else if (\n userRef &&\n typeof userRef === \"object\" &&\n \"current\" in userRef\n ) {\n (userRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }\n },\n };\n },\n [openState, panelId, setReference],\n );\n\n return {\n openState,\n setOpen,\n getTriggerProps,\n setTriggerRef: setReference,\n panelId,\n };\n}\n"],"names":["useSidePanelContext","useCallback"],"mappings":";;;;;AAqCO,SAAS,YAAA,GAA+B;AAC7C,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,OAAA,KAAYA,oCAAA,EAAoB;AAE1E,EAAA,MAAM,eAAA,GAAkBC,iBAAA;AAAA,IACtB,CAAC,SAAA,KAAwC;AACvC,MAAA,MAAM,cAAc,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,OAAA;AAI/B,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,SAAA;AAAA,QACjB,eAAA,EAAiB,YAAY,OAAA,GAAU,MAAA;AAAA,QACvC,GAAG,SAAA;AAAA,QACH,OAAA,EAAS,CAAC,CAAA,KAAqC;AAC7C,UAAA,WAAA,IAAA,IAAA,GAAA,MAAA,GAAA,WAAA,CAAc,CAAA,CAAA;AAAA,QAChB,CAAA;AAAA,QACA,GAAA,EAAK,CAAC,IAAA,KAA6B;AAEjC,UAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,UAAA,MAAM,UAAU,SAAA,IAAA,IAAA,GAAA,MAAA,GAAA,SAAA,CAAW,GAAA;AAC3B,UAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UACd,WACE,OAAA,IACA,OAAO,OAAA,KAAY,QAAA,IACnB,aAAa,OAAA,EACb;AACA,YAAC,QAAuD,OAAA,GACtD,IAAA;AAAA,UACJ;AAAA,QACF;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,OAAA,EAAS,YAAY;AAAA,GACnC;AAEA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA,EAAe,YAAA;AAAA,IACf;AAAA,GACF;AACF;;;;"}
|