@vuu-ui/vuu-ui-controls 2.1.19-beta.1 → 2.1.19-beta.2

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 (180) hide show
  1. package/package.json +12 -13
  2. package/src/calendar/Calendar.css.js +10 -0
  3. package/src/calendar/Calendar.js +70 -0
  4. package/src/calendar/index.js +4 -0
  5. package/src/calendar/internal/CalendarCarousel.css.js +19 -0
  6. package/src/calendar/internal/CalendarCarousel.js +73 -0
  7. package/src/calendar/internal/CalendarContext.js +9 -0
  8. package/src/calendar/internal/CalendarDay.css.js +116 -0
  9. package/src/calendar/internal/CalendarDay.js +64 -0
  10. package/src/calendar/internal/CalendarMonth.css.js +13 -0
  11. package/src/calendar/internal/CalendarMonth.js +43 -0
  12. package/src/calendar/internal/CalendarNavigation.css.js +24 -0
  13. package/src/calendar/internal/CalendarNavigation.js +185 -0
  14. package/src/calendar/internal/CalendarWeekHeader.css.js +23 -0
  15. package/src/calendar/internal/CalendarWeekHeader.js +31 -0
  16. package/src/calendar/internal/useFocusManagement.js +66 -0
  17. package/src/calendar/internal/utils.js +57 -0
  18. package/src/calendar/useCalendar.js +116 -0
  19. package/src/calendar/useCalendarDay.js +74 -0
  20. package/src/calendar/useSelection.js +202 -0
  21. package/src/column-picker/ColumnPicker.css.js +8 -0
  22. package/src/column-picker/ColumnPicker.js +108 -0
  23. package/src/column-picker/ColumnSearch.css.js +61 -0
  24. package/src/column-picker/ColumnSearch.js +66 -0
  25. package/src/column-picker/index.js +2 -0
  26. package/src/column-picker/moving-window.js +49 -0
  27. package/src/common-hooks/index.js +3 -0
  28. package/src/common-hooks/selectionTypes.js +8 -0
  29. package/src/common-hooks/use-resize-observer.js +122 -0
  30. package/src/common-hooks/useControlled.js +45 -0
  31. package/src/context-panel-provider/ContextPanelProvider.js +80 -0
  32. package/src/cycle-state-button/CycleStateButton.js +30 -0
  33. package/src/cycle-state-button/index.js +1 -0
  34. package/src/date-input/DateInput.css.js +195 -0
  35. package/src/date-input/DateInput.js +210 -0
  36. package/src/date-input/index.js +1 -0
  37. package/src/date-picker/DatePicker.js +137 -0
  38. package/src/date-picker/DatePickerContext.js +20 -0
  39. package/src/date-picker/DatePickerPanel.css.js +25 -0
  40. package/src/date-picker/DatePickerPanel.js +124 -0
  41. package/src/date-picker/index.js +1 -0
  42. package/src/drag-drop/DragDropProvider.js +123 -0
  43. package/src/drag-drop/DragDropState.js +25 -0
  44. package/src/drag-drop/Draggable.css.js +57 -0
  45. package/src/drag-drop/Draggable.js +77 -0
  46. package/src/drag-drop/DropIndicator.css.js +11 -0
  47. package/src/drag-drop/DropIndicator.js +28 -0
  48. package/src/drag-drop/dragDropTypes.js +3 -0
  49. package/src/drag-drop/drop-target-utils.js +199 -0
  50. package/src/drag-drop/index.js +6 -0
  51. package/src/drag-drop/useAutoScroll.js +53 -0
  52. package/src/drag-drop/useDragDisplacers.js +126 -0
  53. package/src/drag-drop/useDragDrop.js +435 -0
  54. package/src/drag-drop/useDragDropCopy.js +22 -0
  55. package/src/drag-drop/useDragDropIndicator.js +182 -0
  56. package/src/drag-drop/useDragDropNaturalMovement.js +205 -0
  57. package/src/drag-drop/useDropIndicator.js +21 -0
  58. package/src/drag-drop/useGlobalDragDrop.js +67 -0
  59. package/src/drag-drop/useTransition.js +11 -0
  60. package/src/editable/index.js +1 -0
  61. package/src/editable/useEditableText.js +199 -0
  62. package/src/editable-label/EditableLabel.css.js +81 -0
  63. package/src/editable-label/EditableLabel.js +125 -0
  64. package/src/editable-label/index.js +1 -0
  65. package/src/expando-input/ExpandoInput.css.js +67 -0
  66. package/src/expando-input/ExpandoInput.js +40 -0
  67. package/src/expando-input/index.js +1 -0
  68. package/src/highlighter/Highlighter.css.js +8 -0
  69. package/src/highlighter/Highlighter.js +27 -0
  70. package/src/highlighter/index.js +1 -0
  71. package/src/hover-overlay/HoverOverlay.js +92 -0
  72. package/src/icon-button/Icon.css.js +8 -0
  73. package/src/icon-button/Icon.js +26 -0
  74. package/src/icon-button/IconButton.css.js +10 -0
  75. package/src/icon-button/IconButton.js +28 -0
  76. package/src/icon-button/ToggleIconButton.css.js +47 -0
  77. package/src/icon-button/ToggleIconButton.js +26 -0
  78. package/src/icon-button/index.js +3 -0
  79. package/src/index.js +31 -0
  80. package/src/instrument-picker/SearchCell.css.js +17 -0
  81. package/src/instrument-picker/SearchCell.js +29 -0
  82. package/src/instrument-picker/TablePicker.css.js +23 -0
  83. package/src/instrument-picker/TablePicker.js +89 -0
  84. package/src/instrument-picker/index.js +1 -0
  85. package/src/instrument-picker/moving-window.js +49 -0
  86. package/src/instrument-picker/useDataSource.js +38 -0
  87. package/src/instrument-picker/useTablePicker.js +136 -0
  88. package/src/measured-container/MeasuredContainer.css.js +11 -0
  89. package/src/measured-container/MeasuredContainer.js +50 -0
  90. package/src/measured-container/index.js +2 -0
  91. package/src/measured-container/useMeasuredContainer.js +156 -0
  92. package/src/modal-provider/ModalProvider.js +147 -0
  93. package/src/overflow-container/OverflowContainer.css.js +135 -0
  94. package/src/overflow-container/OverflowContainer.js +87 -0
  95. package/src/overflow-container/index.js +2 -0
  96. package/src/overflow-container/overflow-utils.js +211 -0
  97. package/src/overflow-container/useOverflowContainer.js +108 -0
  98. package/src/price-ticker/PriceTicker.css.js +32 -0
  99. package/src/price-ticker/PriceTicker.js +51 -0
  100. package/src/price-ticker/index.js +1 -0
  101. package/src/prompt/Prompt.css.js +48 -0
  102. package/src/prompt/Prompt.js +112 -0
  103. package/src/sortable-list/SortableList.js +39 -0
  104. package/src/split-button/SplitButton.css.js +117 -0
  105. package/src/split-button/SplitButton.js +60 -0
  106. package/src/split-button/SplitStateButton.css.js +66 -0
  107. package/src/split-button/SplitStateButton.js +23 -0
  108. package/src/split-button/index.js +2 -0
  109. package/src/split-button/useSplitButton.js +61 -0
  110. package/src/table-search/SearchCell.css.js +20 -0
  111. package/src/table-search/SearchCell.js +26 -0
  112. package/src/table-search/TableSearch.css.js +27 -0
  113. package/src/table-search/TableSearch.js +81 -0
  114. package/src/table-search/index.js +1 -0
  115. package/src/table-search/moving-window.js +49 -0
  116. package/src/table-search/useTableSearch.js +30 -0
  117. package/src/tabs-next/TabBar.css.js +26 -0
  118. package/src/tabs-next/TabBar.js +27 -0
  119. package/src/tabs-next/TabListNext.css.js +36 -0
  120. package/src/tabs-next/TabListNext.js +94 -0
  121. package/src/tabs-next/TabNext.css.js +76 -0
  122. package/src/tabs-next/TabNext.js +91 -0
  123. package/src/tabs-next/TabNextAction.js +26 -0
  124. package/src/tabs-next/TabNextContext.js +14 -0
  125. package/src/tabs-next/TabNextPanel.css.js +17 -0
  126. package/src/tabs-next/TabNextPanel.js +69 -0
  127. package/src/tabs-next/TabNextTrigger.css.js +22 -0
  128. package/src/tabs-next/TabNextTrigger.js +66 -0
  129. package/src/tabs-next/TabOverflowList.css.js +77 -0
  130. package/src/tabs-next/TabOverflowList.js +115 -0
  131. package/src/tabs-next/TabsNext.js +149 -0
  132. package/src/tabs-next/TabsNextContext.js +28 -0
  133. package/src/tabs-next/hooks/useCollection.js +80 -0
  134. package/src/tabs-next/hooks/useFocusOutside.js +23 -0
  135. package/src/tabs-next/hooks/useOverflow.js +118 -0
  136. package/src/tabs-next/index.js +7 -0
  137. package/src/tabstrip/Tab.css.js +148 -0
  138. package/src/tabstrip/Tab.js +107 -0
  139. package/src/tabstrip/TabMenu.css.js +8 -0
  140. package/src/tabstrip/TabMenu.js +48 -0
  141. package/src/tabstrip/TabMenuOptions.js +14 -0
  142. package/src/tabstrip/TabsTypes.js +0 -0
  143. package/src/tabstrip/Tabstrip.css.js +121 -0
  144. package/src/tabstrip/Tabstrip.js +106 -0
  145. package/src/tabstrip/ThemeTabstrip.css.js +20 -0
  146. package/src/tabstrip/index.js +4 -0
  147. package/src/tabstrip/tabstrip-dom-utils.js +11 -0
  148. package/src/tabstrip/useAnimatedSelectionThumb.js +68 -0
  149. package/src/tabstrip/useKeyboardNavigation.js +191 -0
  150. package/src/tabstrip/useSelection.js +50 -0
  151. package/src/tabstrip/useTabstrip.js +181 -0
  152. package/src/time-input/MaskedInput.js +285 -0
  153. package/src/time-input/TimeInput.css.js +39 -0
  154. package/src/time-input/TimeInput.js +37 -0
  155. package/src/time-input/useTimeInput.js +82 -0
  156. package/src/toolbar/Toolbar.css.js +46 -0
  157. package/src/toolbar/Toolbar.js +62 -0
  158. package/src/toolbar/index.js +1 -0
  159. package/src/toolbar/toolbar-dom-utils.js +11 -0
  160. package/src/toolbar/useKeyboardNavigation.js +240 -0
  161. package/src/toolbar/useSelection.js +82 -0
  162. package/src/toolbar/useToolbar.js +73 -0
  163. package/src/utils/deprecated-types.js +0 -0
  164. package/src/utils/escapeRegExp.js +5 -0
  165. package/src/utils/forwardCallbackProps.js +15 -0
  166. package/src/utils/index.js +5 -0
  167. package/src/utils/isOverflowElement.js +2 -0
  168. package/src/utils/isPlainObject.js +2 -0
  169. package/src/vuu-date-picker/VuuDatePicker.js +92 -0
  170. package/src/vuu-date-picker/index.js +1 -0
  171. package/src/vuu-input/VuuInput.css.js +13 -0
  172. package/src/vuu-input/VuuInput.js +85 -0
  173. package/src/vuu-input/index.js +1 -0
  174. package/src/vuu-time-picker/TimeRangePicker.js +0 -0
  175. package/src/vuu-time-picker/VuuTimePicker.css.js +14 -0
  176. package/src/vuu-time-picker/VuuTimePicker.js +26 -0
  177. package/src/vuu-typeahead-input/VuuTypeaheadInput.css.js +49 -0
  178. package/src/vuu-typeahead-input/VuuTypeaheadInput.js +46 -0
  179. package/src/vuu-typeahead-input/index.js +1 -0
  180. package/src/vuu-typeahead-input/useVuuTypeaheadInput.js +140 -0
package/package.json CHANGED
@@ -1,21 +1,21 @@
1
1
  {
2
- "version": "2.1.19-beta.1",
2
+ "version": "2.1.19-beta.2",
3
3
  "description": "VUU UI Controls",
4
4
  "author": "heswell",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "devDependencies": {
8
- "@vuu-ui/vuu-data-types": "2.1.19-beta.1",
9
- "@vuu-ui/vuu-protocol-types": "2.1.19-beta.1",
10
- "@vuu-ui/vuu-table-types": "2.1.19-beta.1"
8
+ "@vuu-ui/vuu-data-types": "2.1.19-beta.2",
9
+ "@vuu-ui/vuu-protocol-types": "2.1.19-beta.2",
10
+ "@vuu-ui/vuu-table-types": "2.1.19-beta.2"
11
11
  },
12
12
  "dependencies": {
13
- "@vuu-ui/vuu-context-menu": "2.1.19-beta.1",
14
- "@vuu-ui/vuu-data-react": "2.1.19-beta.1",
15
- "@vuu-ui/vuu-layout": "2.1.19-beta.1",
16
- "@vuu-ui/vuu-popups": "2.1.19-beta.1",
17
- "@vuu-ui/vuu-table": "2.1.19-beta.1",
18
- "@vuu-ui/vuu-utils": "2.1.19-beta.1",
13
+ "@vuu-ui/vuu-context-menu": "2.1.19-beta.2",
14
+ "@vuu-ui/vuu-data-react": "2.1.19-beta.2",
15
+ "@vuu-ui/vuu-layout": "2.1.19-beta.2",
16
+ "@vuu-ui/vuu-popups": "2.1.19-beta.2",
17
+ "@vuu-ui/vuu-table": "2.1.19-beta.2",
18
+ "@vuu-ui/vuu-utils": "2.1.19-beta.2",
19
19
  "@salt-ds/core": "1.54.1",
20
20
  "@salt-ds/icons": "1.16.0",
21
21
  "@salt-ds/styles": "0.2.1",
@@ -32,13 +32,12 @@
32
32
  "sideEffects": false,
33
33
  "files": [
34
34
  "README.md",
35
- "esm",
36
- "cjs",
35
+ "src",
37
36
  "/types"
38
37
  ],
39
38
  "exports": {
40
39
  ".": {
41
- "import": "./index.js",
40
+ "import": "./src/index.js",
42
41
  "types": "./types/index.d.ts"
43
42
  }
44
43
  },
@@ -0,0 +1,10 @@
1
+ const css = `
2
+ .saltCalendar {
3
+ background: var(--salt-container-primary-background);
4
+ width: min-content;
5
+ padding: var(--salt-spacing-100);
6
+ }
7
+
8
+
9
+ `;
10
+ export default css;
@@ -0,0 +1,70 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { makePrefixer } from "@salt-ds/core";
3
+ import { clsx } from "clsx";
4
+ import { forwardRef, useCallback } from "react";
5
+ import { CalendarCarousel } from "./internal/CalendarCarousel.js";
6
+ import { CalendarContext } from "./internal/CalendarContext.js";
7
+ import { CalendarNavigation } from "./internal/CalendarNavigation.js";
8
+ import { CalendarWeekHeader } from "./internal/CalendarWeekHeader.js";
9
+ import { useCalendar } from "./useCalendar.js";
10
+ import { useComponentCssInjection } from "@salt-ds/styles";
11
+ import { useWindow } from "@salt-ds/window";
12
+ import { DateFormatter, getLocalTimeZone } from "@internationalized/date";
13
+ import Calendar_0 from "./Calendar.css";
14
+ import { getCurrentLocale } from "./internal/utils.js";
15
+ const withBaseName = makePrefixer("saltCalendar");
16
+ const Calendar_Calendar = /*#__PURE__*/ forwardRef(function(props, ref) {
17
+ const { className, id, renderDayContents, hideYearDropdown, TooltipProps, borderedDropdown, ...rest } = props;
18
+ const targetWindow = useWindow();
19
+ useComponentCssInjection({
20
+ testId: "salt-calendar",
21
+ css: Calendar_0,
22
+ window: targetWindow
23
+ });
24
+ const { state, helpers } = useCalendar({
25
+ hideYearDropdown,
26
+ ...rest
27
+ });
28
+ const { setCalendarFocused } = helpers;
29
+ const handleFocus = useCallback(()=>{
30
+ setCalendarFocused(true);
31
+ }, [
32
+ setCalendarFocused
33
+ ]);
34
+ const handleBlur = useCallback(()=>{
35
+ setCalendarFocused(false);
36
+ }, [
37
+ setCalendarFocused
38
+ ]);
39
+ const calendarLabel = new DateFormatter(getCurrentLocale(), {
40
+ month: "long",
41
+ year: "numeric"
42
+ }).format(state.visibleMonth.toDate(getLocalTimeZone()));
43
+ return /*#__PURE__*/ jsx(CalendarContext.Provider, {
44
+ value: {
45
+ state,
46
+ helpers
47
+ },
48
+ children: /*#__PURE__*/ jsxs("div", {
49
+ className: clsx(withBaseName(), className),
50
+ id: id,
51
+ role: "application",
52
+ "aria-label": calendarLabel,
53
+ ref: ref,
54
+ children: [
55
+ /*#__PURE__*/ jsx(CalendarNavigation, {
56
+ borderedDropdown: borderedDropdown,
57
+ hideYearDropdown: hideYearDropdown
58
+ }),
59
+ /*#__PURE__*/ jsx(CalendarWeekHeader, {}),
60
+ /*#__PURE__*/ jsx(CalendarCarousel, {
61
+ onFocus: handleFocus,
62
+ onBlur: handleBlur,
63
+ renderDayContents: renderDayContents,
64
+ TooltipProps: TooltipProps
65
+ })
66
+ ]
67
+ })
68
+ });
69
+ });
70
+ export { Calendar_Calendar as Calendar };
@@ -0,0 +1,4 @@
1
+ export * from "./Calendar.js";
2
+ export * from "./useCalendarDay.js";
3
+ export * from "./useCalendar.js";
4
+ export * from "./useSelection.js";
@@ -0,0 +1,19 @@
1
+ const css = `
2
+ .saltCalendarCarousel-track {
3
+ grid-auto-flow: column;
4
+ display: grid;
5
+ }
6
+
7
+ .saltCalendarCarousel-track > * {
8
+ width: 100%;
9
+ position: absolute;
10
+ left: 0;
11
+ }
12
+
13
+ .saltCalendarCarousel-track > :nth-child(2) {
14
+ position: relative;
15
+ }
16
+
17
+
18
+ `;
19
+ export default css;
@@ -0,0 +1,73 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { isSameMonth } from "@internationalized/date";
3
+ import { makePrefixer, useIsomorphicLayoutEffect } from "@salt-ds/core";
4
+ import { forwardRef, useEffect, useRef, useState } from "react";
5
+ import { useCalendarContext } from "./CalendarContext.js";
6
+ import { CalendarMonth } from "./CalendarMonth.js";
7
+ import { useComponentCssInjection } from "@salt-ds/styles";
8
+ import { useWindow } from "@salt-ds/window";
9
+ import CalendarCarousel_0 from "./CalendarCarousel.css";
10
+ import { formatDate, monthDiff } from "./utils.js";
11
+ function getMonths(month) {
12
+ return [
13
+ month.subtract({
14
+ months: 1
15
+ }),
16
+ month,
17
+ month.add({
18
+ months: 1
19
+ })
20
+ ];
21
+ }
22
+ const withBaseName = makePrefixer("saltCalendarCarousel");
23
+ const CalendarCarousel_CalendarCarousel = /*#__PURE__*/ forwardRef(function(props, ref) {
24
+ const { ...rest } = props;
25
+ const targetWindow = useWindow();
26
+ useComponentCssInjection({
27
+ testId: "salt-calendar-carousel",
28
+ css: CalendarCarousel_0,
29
+ window: targetWindow
30
+ });
31
+ const { state: { visibleMonth } } = useCalendarContext();
32
+ const containerRef = useRef(null);
33
+ const diffIndex = (a, b)=>monthDiff(a, b);
34
+ const { current: baseIndex } = useRef(visibleMonth);
35
+ useIsomorphicLayoutEffect(()=>{
36
+ if (containerRef.current) containerRef.current.style.transform = `translate3d(${-101 * diffIndex(baseIndex, visibleMonth)}%, 0, 0)`;
37
+ });
38
+ const [months, setMonths] = useState(()=>getMonths(visibleMonth));
39
+ useEffect(()=>{
40
+ setMonths((oldMonths)=>{
41
+ const newMonths = getMonths(visibleMonth).filter((month)=>!oldMonths.find((oldMonth)=>isSameMonth(oldMonth, month)));
42
+ return oldMonths.concat(newMonths);
43
+ });
44
+ setMonths(getMonths(visibleMonth));
45
+ }, [
46
+ formatDate(visibleMonth)
47
+ ]);
48
+ return /*#__PURE__*/ jsx("div", {
49
+ className: withBaseName(),
50
+ tabIndex: -1,
51
+ style: {
52
+ overflowX: "hidden",
53
+ position: "relative"
54
+ },
55
+ ref: ref,
56
+ children: /*#__PURE__*/ jsx("div", {
57
+ className: withBaseName("track"),
58
+ ref: containerRef,
59
+ children: months.map((date, index)=>/*#__PURE__*/ jsx("div", {
60
+ className: withBaseName("slide"),
61
+ style: {
62
+ transform: `translateX(${-101 * diffIndex(date, baseIndex)}%)`
63
+ },
64
+ "aria-hidden": 1 !== index ? "true" : void 0,
65
+ children: /*#__PURE__*/ jsx(CalendarMonth, {
66
+ ...rest,
67
+ date: date
68
+ })
69
+ }, formatDate(date)))
70
+ })
71
+ });
72
+ });
73
+ export { CalendarCarousel_CalendarCarousel as CalendarCarousel };
@@ -0,0 +1,9 @@
1
+ import { createContext, useContext } from "react";
2
+ const CalendarContext = /*#__PURE__*/ createContext(null);
3
+ if ("production" !== process.env.NODE_ENV) CalendarContext.displayName = "CalendarContext";
4
+ function useCalendarContext() {
5
+ const context = useContext(CalendarContext);
6
+ if (!context) throw new Error("Unexpected usage");
7
+ return context;
8
+ }
9
+ export { CalendarContext, useCalendarContext };
@@ -0,0 +1,116 @@
1
+ const css = `
2
+ .saltCalendarDay {
3
+ font-family: var(--salt-text-fontFamily);
4
+ font-weight: var(--salt-text-fontWeight);
5
+ line-height: var(--salt-text-lineHeight);
6
+ font-size: var(--salt-text-fontSize);
7
+ width: var(--salt-size-base);
8
+ height: var(--salt-size-base);
9
+ color: var(--salt-content-primary-foreground);
10
+ background: var(--salt-selectable-background);
11
+ cursor: pointer;
12
+ border: none;
13
+ justify-content: center;
14
+ align-items: center;
15
+ padding: 0;
16
+ display: flex;
17
+ position: relative;
18
+ overflow: hidden;
19
+ }
20
+
21
+ .saltCalendarDay-content {
22
+ margin: 0 var(--salt-spacing-50);
23
+ width: 100%;
24
+ }
25
+
26
+ .saltCalendarDay:focus-visible {
27
+ outline: var(--salt-focused-outline);
28
+ outline-offset: calc(0px - var(--salt-focused-outlineWidth));
29
+ }
30
+
31
+ .saltCalendarDay-outOfRange {
32
+ color: var(--salt-content-secondary-foreground);
33
+ }
34
+
35
+ .saltCalendarDay-outOfRange:hover {
36
+ color: var(--salt-content-primary-foreground);
37
+ }
38
+
39
+ .saltCalendarDay-outOfRange .saltCalendarDay-today {
40
+ border-bottom: var(--salt-size-indicator) var(--salt-selectable-borderStyle) var(--salt-content-secondary-foreground);
41
+ }
42
+
43
+ .saltCalendarDay-outOfRange.saltCalendarDay-highlighted:before {
44
+ background: var(--salt-content-secondary-foreground);
45
+ }
46
+
47
+ .saltCalendarDay:hover, .saltCalendarDay-hoveredOffset, .saltCalendarDay-hoveredOffset:hover {
48
+ background: var(--salt-selectable-background-hover);
49
+ }
50
+
51
+ .saltCalendarDay-selected {
52
+ border-radius: var(--salt-palette-corner-weak, 0);
53
+ }
54
+
55
+ .saltCalendarDay-selectedStart {
56
+ z-index: var(--salt-zIndex-default);
57
+ border-top-left-radius: var(--salt-palette-corner-weak, 0);
58
+ border-bottom-left-radius: var(--salt-palette-corner-weak, 0);
59
+ }
60
+
61
+ .saltCalendarDay-selectedEnd {
62
+ border-top-right-radius: var(--salt-palette-corner-weak, 0);
63
+ border-bottom-right-radius: var(--salt-palette-corner-weak, 0);
64
+ }
65
+
66
+ .saltCalendarDay-selected, .saltCalendarDay-selected:hover, .saltCalendarDay-selectedStart, .saltCalendarDay-selectedStart:hover, .saltCalendarDay-selectedEnd, .saltCalendarDay-selectedEnd:hover {
67
+ background: var(--salt-selectable-background-selected);
68
+ box-shadow: 0 0 0 var(--salt-size-border) var(--salt-selectable-borderColor-selected);
69
+ }
70
+
71
+ .saltCalendarDay-hoveredSpan, .saltCalendarDay-hoveredSpan:hover, .saltCalendarDay-selectedSpan, .saltCalendarDay-selectedSpan:hover {
72
+ background: var(--salt-selectable-background-hover);
73
+ box-shadow: calc(var(--salt-size-border) * -2) 0 0 0 var(--salt-selectable-background-hover), calc(var(--salt-size-border) * -1) 0 0 var(--salt-size-border)
74
+ var(--salt-selectable-borderColor-selected), 0 calc(var(--salt-size-border) * -1) 0 var(--salt-selectable-borderColor-selected);
75
+ }
76
+
77
+ .saltCalendarDay-disabled, .saltCalendarDay-disabled:hover, .saltCalendarDay-unselectable, .saltCalendarDay-unselectable:hover {
78
+ background: var(--salt-selectable-background-disabled);
79
+ cursor: var(--salt-selectable-cursor-disabled);
80
+ }
81
+
82
+ .saltCalendarDay-highlighted:before, .saltCalendarDay-highlighted:hover:before {
83
+ content: "";
84
+ height: var(--salt-spacing-200);
85
+ width: var(--salt-spacing-200);
86
+ top: calc(var(--salt-spacing-100) * -1);
87
+ right: calc(var(--salt-spacing-100) * -1);
88
+ background: var(--salt-accent-background);
89
+ position: absolute;
90
+ transform: rotate(45deg);
91
+ }
92
+
93
+ .saltCalendarDay-unselectable:after {
94
+ content: "";
95
+ height: var(--salt-size-border);
96
+ width: calc(100% - var(--salt-spacing-100));
97
+ background: var(--salt-content-secondary-foreground);
98
+ position: absolute;
99
+ }
100
+
101
+ .saltCalendarDay-today, .saltCalendarDay-today:hover, .saltCalendarDay-outOfRange .saltCalendarDay-today:hover {
102
+ border-bottom: var(--salt-size-indicator) var(--salt-selectable-borderStyle) var(--salt-accent-borderColor);
103
+ margin-bottom: calc(var(--salt-size-indicator) * -1);
104
+ }
105
+
106
+ .saltCalendarDay-disabled, .saltCalendarDay-disabled:hover {
107
+ color: var(--salt-content-secondary-foreground-disabled);
108
+ }
109
+
110
+ .saltCalendarDay-hidden {
111
+ visibility: hidden;
112
+ }
113
+
114
+
115
+ `;
116
+ export default css;
@@ -0,0 +1,64 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { Tooltip, makePrefixer, useForkRef } 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, useRef } from "react";
7
+ import { useCalendarDay } from "../useCalendarDay.js";
8
+ import CalendarDay_0 from "./CalendarDay.css";
9
+ import { formatDate } from "./utils.js";
10
+ const withBaseName = makePrefixer("saltCalendarDay");
11
+ const CalendarDay_CalendarDay = /*#__PURE__*/ forwardRef(function(props, ref) {
12
+ const { className, day, renderDayContents, month, TooltipProps, ...rest } = props;
13
+ const targetWindow = useWindow();
14
+ useComponentCssInjection({
15
+ testId: "salt-calendar-day",
16
+ css: CalendarDay_0,
17
+ window: targetWindow
18
+ });
19
+ const dayRef = useRef(null);
20
+ const buttonRef = useForkRef(ref, dayRef);
21
+ const { status, dayProps, unselectableReason, highlightedReason } = useCalendarDay({
22
+ date: day,
23
+ month
24
+ }, dayRef);
25
+ const { outOfRange, today, unselectable, highlighted, hidden, disabled } = status;
26
+ return /*#__PURE__*/ jsx(Tooltip, {
27
+ hideIcon: true,
28
+ status: unselectableReason ? "error" : "info",
29
+ content: unselectableReason || highlightedReason || "Date is out of range",
30
+ disabled: !unselectableReason && !highlightedReason,
31
+ placement: "top",
32
+ enterDelay: 0,
33
+ leaveDelay: 0,
34
+ ...TooltipProps,
35
+ children: /*#__PURE__*/ jsx("button", {
36
+ "aria-label": formatDate(day, {
37
+ day: "2-digit",
38
+ month: "long",
39
+ year: "numeric"
40
+ }),
41
+ disabled: disabled,
42
+ type: "button",
43
+ ...dayProps,
44
+ ref: buttonRef,
45
+ ...rest,
46
+ className: clsx(withBaseName(), {
47
+ [withBaseName("hidden")]: hidden,
48
+ [withBaseName("outOfRange")]: outOfRange,
49
+ [withBaseName("disabled")]: disabled,
50
+ [withBaseName("unselectable")]: !!unselectable,
51
+ [withBaseName("highlighted")]: !!highlighted
52
+ }, dayProps.className, className),
53
+ children: /*#__PURE__*/ jsx("span", {
54
+ className: clsx(withBaseName("content"), {
55
+ [withBaseName("today")]: today
56
+ }),
57
+ children: renderDayContents ? renderDayContents(day, status) : formatDate(day, {
58
+ day: "numeric"
59
+ })
60
+ })
61
+ })
62
+ });
63
+ });
64
+ export { CalendarDay_CalendarDay as CalendarDay };
@@ -0,0 +1,13 @@
1
+ const css = `
2
+ .saltCalendarMonth-dateGrid {
3
+ gap: var(--salt-size-border);
4
+ grid-template-columns: repeat(7, var(--salt-size-base));
5
+ grid-template-rows: repeat(6, var(--salt-size-base));
6
+ text-align: center;
7
+ margin: var(--salt-size-border);
8
+ display: grid;
9
+ }
10
+
11
+
12
+ `;
13
+ export default css;
@@ -0,0 +1,43 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { makePrefixer } from "@salt-ds/core";
3
+ import { clsx } from "clsx";
4
+ import { forwardRef } from "react";
5
+ import { CalendarDay } from "./CalendarDay.js";
6
+ import { formatDate, generateVisibleDays } from "./utils.js";
7
+ import { useComponentCssInjection } from "@salt-ds/styles";
8
+ import { useWindow } from "@salt-ds/window";
9
+ import { useCalendarContext } from "./CalendarContext.js";
10
+ import CalendarMonth_0 from "./CalendarMonth.css";
11
+ const withBaseName = makePrefixer("saltCalendarMonth");
12
+ const CalendarMonth_CalendarMonth = /*#__PURE__*/ forwardRef(function(props, ref) {
13
+ const { className, date, renderDayContents, onMouseLeave, TooltipProps, ...rest } = props;
14
+ const targetWindow = useWindow();
15
+ useComponentCssInjection({
16
+ testId: "salt-calendar-month",
17
+ css: CalendarMonth_0,
18
+ window: targetWindow
19
+ });
20
+ const days = generateVisibleDays(date);
21
+ const { helpers: { setHoveredDate } } = useCalendarContext();
22
+ const handleMouseLeave = (event)=>{
23
+ setHoveredDate(event, null);
24
+ onMouseLeave?.(event);
25
+ };
26
+ return /*#__PURE__*/ jsx("div", {
27
+ className: clsx(withBaseName(), className),
28
+ ref: ref,
29
+ onMouseLeave: handleMouseLeave,
30
+ ...rest,
31
+ children: /*#__PURE__*/ jsx("div", {
32
+ "data-testid": "CalendarDateGrid",
33
+ className: withBaseName("dateGrid"),
34
+ children: days.map((day)=>/*#__PURE__*/ jsx(CalendarDay, {
35
+ day: day.date,
36
+ renderDayContents: renderDayContents,
37
+ month: date,
38
+ TooltipProps: TooltipProps
39
+ }, formatDate(day.date)))
40
+ })
41
+ });
42
+ });
43
+ export { CalendarMonth_CalendarMonth as CalendarMonth };
@@ -0,0 +1,24 @@
1
+ const css = `
2
+ .saltCalendarNavigation {
3
+ padding-bottom: var(--salt-spacing-100);
4
+ grid-gap: 0;
5
+ box-sizing: border-box;
6
+ grid-template-columns: min-content auto min-content;
7
+ align-items: center;
8
+ display: grid;
9
+ }
10
+
11
+ .saltCalendarNavigation-hideYearDropdown {
12
+ grid-gap: var(--salt-spacing-300);
13
+ grid-template-columns: min-content auto min-content;
14
+ }
15
+
16
+ .saltCalendarNavigation-dropdowns {
17
+ grid-gap: var(--salt-spacing-100);
18
+ grid-template-columns: 1fr 1fr;
19
+ display: grid;
20
+ }
21
+
22
+
23
+ `;
24
+ export default css;