colibri-ui 0.8.80 → 0.8.82

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 (42) hide show
  1. package/Modal/index.js +15 -13
  2. package/Sheet/Sheet.d.ts +3 -0
  3. package/Sheet/Sheet.js +276 -0
  4. package/Sheet/Sheet.module.css +153 -0
  5. package/Sheet/index.d.ts +2 -0
  6. package/Sheet/index.js +7 -0
  7. package/Sheet/index.props.d.ts +26 -0
  8. package/Sheet/package.json +9 -0
  9. package/Theme/index.d.ts +60 -0
  10. package/Theme/themes/buenos_aires.d.ts +30 -0
  11. package/Theme/themes/buenos_aires.js +30 -0
  12. package/Theme/themes/jaipur.d.ts +30 -0
  13. package/Theme/themes/jaipur.js +30 -0
  14. package/esm/Modal/index.js +4 -2
  15. package/esm/Sheet/Sheet.d.ts +3 -0
  16. package/esm/Sheet/Sheet.js +266 -0
  17. package/esm/Sheet/Sheet.module.css +153 -0
  18. package/esm/Sheet/index.d.ts +2 -0
  19. package/esm/Sheet/index.js +1 -0
  20. package/esm/Sheet/index.props.d.ts +26 -0
  21. package/esm/Theme/index.d.ts +60 -0
  22. package/esm/Theme/themes/buenos_aires.d.ts +30 -0
  23. package/esm/Theme/themes/buenos_aires.js +30 -0
  24. package/esm/Theme/themes/jaipur.d.ts +30 -0
  25. package/esm/Theme/themes/jaipur.js +30 -0
  26. package/esm/hooks/useModalStack/index.d.ts +6 -0
  27. package/esm/hooks/useModalStack/index.js +24 -0
  28. package/esm/index.d.ts +2 -0
  29. package/esm/index.js +1 -0
  30. package/esm/theme_ba_variables.css +30 -0
  31. package/esm/theme_jaipur_variables.css +30 -0
  32. package/hooks/useModalStack/index.d.ts +6 -0
  33. package/hooks/useModalStack/index.js +26 -0
  34. package/index.d.ts +2 -0
  35. package/index.js +3 -0
  36. package/package.json +1 -1
  37. package/theme_ba_variables.css +30 -0
  38. package/theme_jaipur_variables.css +30 -0
  39. package/Modal/useModalStack.d.ts +0 -2
  40. package/Modal/useModalStack.js +0 -20
  41. package/esm/Modal/useModalStack.d.ts +0 -2
  42. package/esm/Modal/useModalStack.js +0 -18
package/Modal/index.js CHANGED
@@ -4,18 +4,18 @@ var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
4
  var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
5
  var React = require('react');
6
6
  var clsx = require('clsx');
7
- var index$5 = require('../hooks/useScrollLock/index.js');
8
- var index$6 = require('../hooks/useTrapFocus/index.js');
9
- var index$9 = require('../Portal/index.js');
7
+ var index$6 = require('../hooks/useScrollLock/index.js');
8
+ var index$7 = require('../hooks/useTrapFocus/index.js');
9
+ var index$5 = require('../hooks/useModalStack/index.js');
10
+ var index$a = require('../Portal/index.js');
10
11
  var index$4 = require('../hooks/useMediaSizes/index.js');
11
12
  var index = require('./components/Body/index.js');
12
- var index$7 = require('./components/Close/index.js');
13
- var index$8 = require('./components/Content/index.js');
13
+ var index$8 = require('./components/Close/index.js');
14
+ var index$9 = require('./components/Content/index.js');
14
15
  var index$1 = require('./components/Footer/index.js');
15
16
  var index$2 = require('./components/Header/index.js');
16
17
  var index$3 = require('./components/Title/index.js');
17
18
  var context = require('./context.js');
18
- var useModalStack = require('./useModalStack.js');
19
19
  var styles = require('./Modal.module.css');
20
20
 
21
21
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -58,9 +58,9 @@ var ModalRoot = function ModalRoot(_ref) {
58
58
  _useState4 = _slicedToArray__default.default(_useState3, 2),
59
59
  titleCount = _useState4[0],
60
60
  setTitleCount = _useState4[1];
61
- var isTopmost = useModalStack.useModalStack(titleId);
62
- index$5.useScrollLock();
63
- index$6.useTrapFocus(modalRef, isTopmost);
61
+ var isTopmost = index$5.useModalStack(titleId);
62
+ index$6.useScrollLock();
63
+ index$7.useTrapFocus(modalRef, isTopmost);
64
64
  var handleClose = React.useCallback(function () {
65
65
  onClose === null || onClose === void 0 ? void 0 : onClose();
66
66
  }, [onClose]);
@@ -93,7 +93,9 @@ var ModalRoot = function ModalRoot(_ref) {
93
93
  }, [handleClose]);
94
94
  React.useEffect(function () {
95
95
  var handleEscape = function handleEscape(event) {
96
- if (event.key === "Escape" && isTopmost()) {
96
+ // A layer that closed on this Escape already called preventDefault.
97
+ if (event.key === "Escape" && !event.defaultPrevented && isTopmost()) {
98
+ event.preventDefault();
97
99
  handleClose();
98
100
  }
99
101
  };
@@ -105,7 +107,7 @@ var ModalRoot = function ModalRoot(_ref) {
105
107
  var isCompound = React.Children.toArray(children).some(isCompoundPart);
106
108
  var standaloneClose = /*#__PURE__*/React__default.default.createElement("div", {
107
109
  className: styles__default.default["close-wrapper"]
108
- }, /*#__PURE__*/React__default.default.createElement(index$7.Close, {
110
+ }, /*#__PURE__*/React__default.default.createElement(index$8.Close, {
109
111
  onClick: handleClose,
110
112
  "aria-label": "Close modal"
111
113
  }));
@@ -113,11 +115,11 @@ var ModalRoot = function ModalRoot(_ref) {
113
115
  if (isCompound) {
114
116
  content = /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, !hasHeader(children) && standaloneClose, children);
115
117
  } else {
116
- content = /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, title ? (/*#__PURE__*/React__default.default.createElement(index$2.Header, null, /*#__PURE__*/React__default.default.createElement(index$3.Title, null, title))) : standaloneClose, /*#__PURE__*/React__default.default.createElement(index$8.Content, null, children));
118
+ content = /*#__PURE__*/React__default.default.createElement(React__default.default.Fragment, null, title ? (/*#__PURE__*/React__default.default.createElement(index$2.Header, null, /*#__PURE__*/React__default.default.createElement(index$3.Title, null, title))) : standaloneClose, /*#__PURE__*/React__default.default.createElement(index$9.Content, null, children));
117
119
  }
118
120
  // Wait for the parent window node instead of flashing in document.body.
119
121
  if (withinParent && parentModal && !parentContainer) return null;
120
- return /*#__PURE__*/React__default.default.createElement(index$9.Portal, {
122
+ return /*#__PURE__*/React__default.default.createElement(index$a.Portal, {
121
123
  node: parentContainer
122
124
  }, /*#__PURE__*/React__default.default.createElement(context.ModalContext.Provider, {
123
125
  value: contextValue
@@ -0,0 +1,3 @@
1
+ import React from "react";
2
+ import type { SheetProps } from "./index.props";
3
+ export declare const Sheet: React.ForwardRefExoticComponent<SheetProps & React.RefAttributes<HTMLDivElement>>;
package/Sheet/Sheet.js ADDED
@@ -0,0 +1,276 @@
1
+ 'use strict';
2
+
3
+ var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var tslib = require('tslib');
6
+ var React = require('react');
7
+ var ReactDOM = require('react-dom');
8
+ var clsx = require('clsx');
9
+ var index = require('../hooks/useModalStack/index.js');
10
+ var styles = require('./Sheet.module.css');
11
+
12
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
+
14
+ var _toConsumableArray__default = /*#__PURE__*/_interopDefault(_toConsumableArray);
15
+ var _slicedToArray__default = /*#__PURE__*/_interopDefault(_slicedToArray);
16
+ var React__default = /*#__PURE__*/_interopDefault(React);
17
+ var clsx__default = /*#__PURE__*/_interopDefault(clsx);
18
+ var styles__default = /*#__PURE__*/_interopDefault(styles);
19
+
20
+ var defaultSnapPoints = ["60dvh"];
21
+ var focusableSelector = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
22
+ var toCssSize = function toCssSize(point) {
23
+ return typeof point === "number" ? "".concat(point, "px") : point;
24
+ };
25
+ var toPixels = function toPixels(point, viewportHeight) {
26
+ if (typeof point === "number") return point;
27
+ var value = Number.parseFloat(point);
28
+ if (!Number.isFinite(value)) return 0;
29
+ if (point.endsWith("%") || point.endsWith("vh") || point.endsWith("dvh")) return viewportHeight * value / 100;
30
+ return value;
31
+ };
32
+ var findPoint = function findPoint(points, preferred) {
33
+ var _a;
34
+ if (preferred !== undefined && points.includes(preferred)) return preferred;
35
+ return (_a = points[0]) !== null && _a !== void 0 ? _a : "60dvh";
36
+ };
37
+ var Sheet = /*#__PURE__*/React.forwardRef(function SheetComponent(_a, forwardedRef) {
38
+ var open = _a.open,
39
+ onOpenChange = _a.onOpenChange,
40
+ title = _a.title,
41
+ description = _a.description,
42
+ header = _a.header,
43
+ footer = _a.footer,
44
+ _a$snapPoints = _a.snapPoints,
45
+ snapPoints = _a$snapPoints === void 0 ? defaultSnapPoints : _a$snapPoints,
46
+ snapPoint = _a.snapPoint,
47
+ defaultSnapPoint = _a.defaultSnapPoint,
48
+ onSnapPointChange = _a.onSnapPointChange,
49
+ _a$modal = _a.modal,
50
+ modal = _a$modal === void 0 ? true : _a$modal,
51
+ _a$blurOverlay = _a.blurOverlay,
52
+ blurOverlay = _a$blurOverlay === void 0 ? false : _a$blurOverlay,
53
+ _a$closeOnOverlayClic = _a.closeOnOverlayClick,
54
+ closeOnOverlayClick = _a$closeOnOverlayClic === void 0 ? true : _a$closeOnOverlayClic,
55
+ _a$closeOnEscape = _a.closeOnEscape,
56
+ closeOnEscape = _a$closeOnEscape === void 0 ? true : _a$closeOnEscape,
57
+ _a$draggable = _a.draggable,
58
+ draggable = _a$draggable === void 0 ? true : _a$draggable,
59
+ _a$showHandle = _a.showHandle,
60
+ showHandle = _a$showHandle === void 0 ? true : _a$showHandle,
61
+ _a$lockBodyScroll = _a.lockBodyScroll,
62
+ lockBodyScroll = _a$lockBodyScroll === void 0 ? true : _a$lockBodyScroll,
63
+ portalContainer = _a.portalContainer,
64
+ initialFocusRef = _a.initialFocusRef,
65
+ returnFocusRef = _a.returnFocusRef,
66
+ zIndex = _a.zIndex,
67
+ className = _a.className,
68
+ style = _a.style,
69
+ children = _a.children,
70
+ ariaLabel = _a["aria-label"],
71
+ ariaLabelledBy = _a["aria-labelledby"],
72
+ ariaDescribedBy = _a["aria-describedby"],
73
+ rest = tslib.__rest(_a, ["open", "onOpenChange", "title", "description", "header", "footer", "snapPoints", "snapPoint", "defaultSnapPoint", "onSnapPointChange", "modal", "blurOverlay", "closeOnOverlayClick", "closeOnEscape", "draggable", "showHandle", "lockBodyScroll", "portalContainer", "initialFocusRef", "returnFocusRef", "zIndex", "className", "style", "children", "aria-label", "aria-labelledby", "aria-describedby"]);
74
+ var normalizedPoints = snapPoints.length ? snapPoints : defaultSnapPoints;
75
+ var controlledSnap = snapPoint !== undefined;
76
+ var _useState = React.useState(function () {
77
+ return findPoint(normalizedPoints, defaultSnapPoint);
78
+ }),
79
+ _useState2 = _slicedToArray__default.default(_useState, 2),
80
+ internalSnap = _useState2[0],
81
+ setInternalSnap = _useState2[1];
82
+ var activeSnap = findPoint(normalizedPoints, controlledSnap ? snapPoint : internalSnap);
83
+ var _useState3 = React.useState(open),
84
+ _useState4 = _slicedToArray__default.default(_useState3, 2),
85
+ rendered = _useState4[0],
86
+ setRendered = _useState4[1];
87
+ var _useState5 = React.useState(false),
88
+ _useState6 = _slicedToArray__default.default(_useState5, 2),
89
+ closing = _useState6[0],
90
+ setClosing = _useState6[1];
91
+ var panelRef = React.useRef(null);
92
+ var previousFocusRef = React.useRef(null);
93
+ var dragRef = React.useRef({
94
+ pointerId: -1,
95
+ startY: 0,
96
+ startHeight: 0,
97
+ currentHeight: 0
98
+ });
99
+ var titleId = React.useId();
100
+ var descriptionId = React.useId();
101
+ var isTopmost = index.useModalStack(titleId, open && modal);
102
+ var setPanelRef = function setPanelRef(node) {
103
+ panelRef.current = node;
104
+ if (typeof forwardedRef === "function") forwardedRef(node);else if (forwardedRef) forwardedRef.current = node;
105
+ };
106
+ var sortedPoints = React.useMemo(function () {
107
+ return _toConsumableArray__default.default(normalizedPoints).sort(function (left, right) {
108
+ var height = typeof window === "undefined" ? 1000 : window.innerHeight;
109
+ return toPixels(left, height) - toPixels(right, height);
110
+ });
111
+ }, [normalizedPoints]);
112
+ var changeSnap = function changeSnap(next) {
113
+ if (!controlledSnap) setInternalSnap(next);
114
+ onSnapPointChange === null || onSnapPointChange === void 0 ? void 0 : onSnapPointChange(next);
115
+ };
116
+ React.useEffect(function () {
117
+ if (open) {
118
+ setRendered(true);
119
+ setClosing(false);
120
+ return;
121
+ }
122
+ if (!rendered) return;
123
+ setClosing(true);
124
+ var duration = panelRef.current ? Number.parseFloat(getComputedStyle(panelRef.current).animationDuration) * 1000 : 220;
125
+ var timer = window.setTimeout(function () {
126
+ setRendered(false);
127
+ setClosing(false);
128
+ }, Number.isFinite(duration) ? duration : 220);
129
+ return function () {
130
+ return window.clearTimeout(timer);
131
+ };
132
+ }, [open, rendered]);
133
+ React.useEffect(function () {
134
+ var _a;
135
+ if (!open || typeof document === "undefined") return;
136
+ previousFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
137
+ var returnFocusElement = (_a = returnFocusRef === null || returnFocusRef === void 0 ? void 0 : returnFocusRef.current) !== null && _a !== void 0 ? _a : previousFocusRef.current;
138
+ var previousOverflow = document.body.style.overflow;
139
+ if (modal && lockBodyScroll) document.body.style.overflow = "hidden";
140
+ var frame = window.requestAnimationFrame(function () {
141
+ var _a, _b, _c, _d;
142
+ var first = (_a = panelRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(focusableSelector);
143
+ (_d = (_c = (_b = initialFocusRef === null || initialFocusRef === void 0 ? void 0 : initialFocusRef.current) !== null && _b !== void 0 ? _b : first) !== null && _c !== void 0 ? _c : panelRef.current) === null || _d === void 0 ? void 0 : _d.focus();
144
+ });
145
+ var onKeyDown = function onKeyDown(event) {
146
+ if (event.defaultPrevented || !isTopmost()) return;
147
+ if (event.key === "Escape" && closeOnEscape) {
148
+ event.preventDefault();
149
+ onOpenChange(false, "escape");
150
+ return;
151
+ }
152
+ if (!modal || event.key !== "Tab" || !panelRef.current) return;
153
+ var focusable = Array.from(panelRef.current.querySelectorAll(focusableSelector));
154
+ if (!focusable.length) {
155
+ event.preventDefault();
156
+ panelRef.current.focus();
157
+ return;
158
+ }
159
+ var first = focusable[0];
160
+ var last = focusable[focusable.length - 1];
161
+ if (event.shiftKey && document.activeElement === first) {
162
+ event.preventDefault();
163
+ last.focus();
164
+ } else if (!event.shiftKey && document.activeElement === last) {
165
+ event.preventDefault();
166
+ first.focus();
167
+ }
168
+ };
169
+ document.addEventListener("keydown", onKeyDown);
170
+ return function () {
171
+ window.cancelAnimationFrame(frame);
172
+ document.removeEventListener("keydown", onKeyDown);
173
+ if (modal && lockBodyScroll) document.body.style.overflow = previousOverflow;
174
+ returnFocusElement === null || returnFocusElement === void 0 ? void 0 : returnFocusElement.focus();
175
+ };
176
+ }, [open, modal, lockBodyScroll, closeOnEscape, onOpenChange, initialFocusRef, returnFocusRef, isTopmost]);
177
+ var startDrag = function startDrag(event) {
178
+ if (!draggable || !panelRef.current) return;
179
+ event.currentTarget.setPointerCapture(event.pointerId);
180
+ var height = panelRef.current.getBoundingClientRect().height;
181
+ dragRef.current = {
182
+ pointerId: event.pointerId,
183
+ startY: event.clientY,
184
+ startHeight: height,
185
+ currentHeight: height
186
+ };
187
+ panelRef.current.classList.add(styles__default.default.dragging);
188
+ };
189
+ var moveDrag = function moveDrag(event) {
190
+ if (dragRef.current.pointerId !== event.pointerId || !panelRef.current) return;
191
+ var viewportHeight = window.innerHeight;
192
+ var maximum = Math.max.apply(Math, _toConsumableArray__default.default(sortedPoints.map(function (point) {
193
+ return toPixels(point, viewportHeight);
194
+ })));
195
+ var nextHeight = Math.max(0, Math.min(maximum, dragRef.current.startHeight - (event.clientY - dragRef.current.startY)));
196
+ dragRef.current.currentHeight = nextHeight;
197
+ panelRef.current.style.height = "".concat(nextHeight, "px");
198
+ };
199
+ var endDrag = function endDrag(event) {
200
+ if (dragRef.current.pointerId !== event.pointerId || !panelRef.current) return;
201
+ event.currentTarget.releasePointerCapture(event.pointerId);
202
+ panelRef.current.classList.remove(styles__default.default.dragging);
203
+ var _dragRef$current = dragRef.current,
204
+ currentHeight = _dragRef$current.currentHeight,
205
+ startHeight = _dragRef$current.startHeight;
206
+ dragRef.current.pointerId = -1;
207
+ var pointHeights = sortedPoints.map(function (point) {
208
+ return toPixels(point, window.innerHeight);
209
+ });
210
+ var minimum = pointHeights[0];
211
+ if (currentHeight < Math.min(minimum * 0.65, startHeight * 0.65)) {
212
+ panelRef.current.style.height = toCssSize(activeSnap);
213
+ onOpenChange(false, "drag");
214
+ return;
215
+ }
216
+ var nearest = 0;
217
+ pointHeights.forEach(function (height, index) {
218
+ if (Math.abs(height - currentHeight) < Math.abs(pointHeights[nearest] - currentHeight)) nearest = index;
219
+ });
220
+ var next = sortedPoints[nearest];
221
+ panelRef.current.style.height = toCssSize(next);
222
+ changeSnap(next);
223
+ };
224
+ if (!rendered || typeof document === "undefined") return null;
225
+ var panelStyle = Object.assign(Object.assign({}, style), {
226
+ height: toCssSize(activeSnap)
227
+ });
228
+ var node = /*#__PURE__*/React__default.default.createElement("div", {
229
+ className: clsx__default.default(styles__default.default.root, !modal && styles__default.default["non-modal"], closing && styles__default.default.closing),
230
+ style: {
231
+ zIndex: zIndex
232
+ }
233
+ }, modal && (/*#__PURE__*/React__default.default.createElement("div", {
234
+ className: clsx__default.default(styles__default.default.overlay, blurOverlay && styles__default.default.blur),
235
+ "aria-hidden": "true",
236
+ onClick: function onClick() {
237
+ return closeOnOverlayClick && onOpenChange(false, "overlay");
238
+ }
239
+ })), /*#__PURE__*/React__default.default.createElement("div", Object.assign({}, rest, {
240
+ ref: setPanelRef,
241
+ role: "dialog",
242
+ "aria-modal": modal || undefined,
243
+ "aria-label": ariaLabel,
244
+ "aria-labelledby": ariaLabelledBy !== null && ariaLabelledBy !== void 0 ? ariaLabelledBy : title ? titleId : undefined,
245
+ "aria-describedby": ariaDescribedBy !== null && ariaDescribedBy !== void 0 ? ariaDescribedBy : description ? descriptionId : undefined,
246
+ tabIndex: -1,
247
+ className: clsx__default.default(styles__default.default.sheet, className),
248
+ style: panelStyle
249
+ }), (showHandle || draggable) && (/*#__PURE__*/React__default.default.createElement("div", {
250
+ className: styles__default.default["drag-area"],
251
+ onPointerDown: startDrag,
252
+ onPointerMove: moveDrag,
253
+ onPointerUp: endDrag,
254
+ onPointerCancel: endDrag
255
+ }, showHandle && (/*#__PURE__*/React__default.default.createElement("span", {
256
+ className: styles__default.default.handle,
257
+ "aria-hidden": "true"
258
+ })))), (title || description || header) && (/*#__PURE__*/React__default.default.createElement("header", {
259
+ className: styles__default.default.header
260
+ }, /*#__PURE__*/React__default.default.createElement("div", {
261
+ className: styles__default.default.heading
262
+ }, title && /*#__PURE__*/React__default.default.createElement("h2", {
263
+ id: titleId
264
+ }, title), description && /*#__PURE__*/React__default.default.createElement("p", {
265
+ id: descriptionId
266
+ }, description)), header && (/*#__PURE__*/React__default.default.createElement("div", {
267
+ className: styles__default.default["header-actions"]
268
+ }, header)))), /*#__PURE__*/React__default.default.createElement("div", {
269
+ className: styles__default.default.body
270
+ }, children), footer && /*#__PURE__*/React__default.default.createElement("footer", {
271
+ className: styles__default.default.footer
272
+ }, footer)));
273
+ return /*#__PURE__*/ReactDOM.createPortal(node, portalContainer !== null && portalContainer !== void 0 ? portalContainer : document.body);
274
+ });
275
+
276
+ exports.Sheet = Sheet;
@@ -0,0 +1,153 @@
1
+ .root {
2
+ font-family: var(--font-family-ui);
3
+ inset: 0;
4
+ pointer-events: none;
5
+ position: fixed;
6
+ z-index: var(--component-sheet-z-index);
7
+ }
8
+
9
+ .overlay {
10
+ animation: fade-in var(--component-sheet-motion-duration) ease-out both;
11
+ background: var(--component-sheet-overlay);
12
+ inset: 0;
13
+ pointer-events: auto;
14
+ position: absolute;
15
+ }
16
+
17
+ .blur {
18
+ backdrop-filter: blur(var(--component-sheet-overlay-blur));
19
+ }
20
+
21
+ .sheet {
22
+ animation: sheet-in var(--component-sheet-motion-duration) var(--component-sheet-motion-easing) both;
23
+ background: var(--component-sheet-bg);
24
+ border-radius: var(--component-sheet-radius) var(--component-sheet-radius) 0 0;
25
+ bottom: 0;
26
+ box-shadow: var(--component-sheet-shadow);
27
+ box-sizing: border-box;
28
+ color: var(--component-sheet-text);
29
+ display: flex;
30
+ flex-direction: column;
31
+ left: 0;
32
+ max-height: min(var(--component-sheet-max-height), 100%);
33
+ outline: none;
34
+ overflow: hidden;
35
+ pointer-events: auto;
36
+ position: absolute;
37
+ right: 0;
38
+ transition: height var(--component-sheet-resize-duration) ease, transform var(--component-sheet-motion-duration) ease;
39
+ }
40
+
41
+ .dragging {
42
+ transition: none;
43
+ user-select: none;
44
+ }
45
+
46
+ .drag-area {
47
+ align-items: center;
48
+ cursor: ns-resize;
49
+ display: flex;
50
+ flex: none;
51
+ justify-content: center;
52
+ min-height: var(--component-sheet-drag-area-height);
53
+ touch-action: none;
54
+ }
55
+
56
+ .handle {
57
+ background: var(--component-sheet-secondary);
58
+ border-radius: var(--component-sheet-handle-radius);
59
+ height: var(--component-sheet-handle-height);
60
+ opacity: var(--component-sheet-handle-opacity);
61
+ width: var(--component-sheet-handle-width);
62
+ }
63
+
64
+ .header {
65
+ align-items: flex-start;
66
+ border-bottom: var(--component-sheet-border-width) solid var(--component-sheet-border-color);
67
+ display: flex;
68
+ flex: none;
69
+ gap: var(--component-sheet-header-gap);
70
+ padding: var(--component-sheet-header-padding);
71
+ }
72
+
73
+ .heading {
74
+ flex: 1;
75
+ min-width: 0;
76
+ }
77
+
78
+ .heading h2 {
79
+ font-size: var(--component-sheet-title-font-size);
80
+ font-weight: var(--component-sheet-title-font-weight);
81
+ line-height: var(--component-sheet-title-line-height);
82
+ margin: 0;
83
+ }
84
+
85
+ .heading p {
86
+ color: var(--component-sheet-secondary);
87
+ font-size: var(--component-sheet-description-font-size);
88
+ margin: var(--component-sheet-description-offset) 0 0;
89
+ }
90
+
91
+ .header-actions {
92
+ align-items: center;
93
+ display: flex;
94
+ flex: none;
95
+ }
96
+
97
+ .body {
98
+ flex: 1;
99
+ min-height: 0;
100
+ overflow: auto;
101
+ overscroll-behavior: contain;
102
+ padding: var(--component-sheet-body-padding);
103
+ }
104
+
105
+ .footer {
106
+ background: var(--component-sheet-bg);
107
+ border-top: var(--component-sheet-border-width) solid var(--component-sheet-border-color);
108
+ flex: none;
109
+ padding: var(--component-sheet-footer-padding-block) var(--component-sheet-footer-padding-inline) max(var(--component-sheet-footer-padding-block), env(safe-area-inset-bottom));
110
+ }
111
+
112
+ .closing .overlay {
113
+ animation: fade-out var(--component-sheet-motion-duration) ease-in both;
114
+ }
115
+
116
+ .closing .sheet {
117
+ animation: sheet-out var(--component-sheet-motion-duration) ease-in both;
118
+ }
119
+
120
+ .non-modal {
121
+ height: 100%;
122
+ inset: auto 0 0;
123
+ }
124
+
125
+ @keyframes fade-in {
126
+ from {
127
+ opacity: 0;
128
+ }
129
+ }
130
+ @keyframes fade-out {
131
+ to {
132
+ opacity: 0;
133
+ }
134
+ }
135
+ @keyframes sheet-in {
136
+ from {
137
+ transform: translateY(100%);
138
+ }
139
+ }
140
+ @keyframes sheet-out {
141
+ to {
142
+ transform: translateY(100%);
143
+ }
144
+ }
145
+ @media (prefers-reduced-motion: reduce) {
146
+ .overlay,
147
+ .sheet,
148
+ .closing .overlay,
149
+ .closing .sheet {
150
+ animation-duration: var(--component-sheet-reduced-motion-duration);
151
+ transition-duration: var(--component-sheet-reduced-motion-duration);
152
+ }
153
+ }
@@ -0,0 +1,2 @@
1
+ export { Sheet } from "./Sheet";
2
+ export type { SheetProps, SheetSnapPoint, SheetCloseReason, } from "./index.props";
package/Sheet/index.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ var Sheet = require('./Sheet.js');
4
+
5
+
6
+
7
+ exports.Sheet = Sheet.Sheet;
@@ -0,0 +1,26 @@
1
+ import type { HTMLAttributes, ReactNode, RefObject } from "react";
2
+ export type SheetSnapPoint = number | `${number}px` | `${number}%` | `${number}vh` | `${number}dvh`;
3
+ export type SheetCloseReason = "overlay" | "escape" | "drag";
4
+ export interface SheetProps extends Omit<HTMLAttributes<HTMLDivElement>, "title" | "onChange"> {
5
+ open: boolean;
6
+ onOpenChange: (open: boolean, reason?: SheetCloseReason) => void;
7
+ title?: ReactNode;
8
+ description?: ReactNode;
9
+ header?: ReactNode;
10
+ footer?: ReactNode;
11
+ snapPoints?: readonly SheetSnapPoint[];
12
+ snapPoint?: SheetSnapPoint;
13
+ defaultSnapPoint?: SheetSnapPoint;
14
+ onSnapPointChange?: (snapPoint: SheetSnapPoint) => void;
15
+ modal?: boolean;
16
+ blurOverlay?: boolean;
17
+ closeOnOverlayClick?: boolean;
18
+ closeOnEscape?: boolean;
19
+ draggable?: boolean;
20
+ showHandle?: boolean;
21
+ lockBodyScroll?: boolean;
22
+ portalContainer?: HTMLElement | null;
23
+ initialFocusRef?: RefObject<HTMLElement | null>;
24
+ returnFocusRef?: RefObject<HTMLElement | null>;
25
+ zIndex?: number;
26
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "sideEffects": [
3
+ "**/*.css",
4
+ "**/*.scss"
5
+ ],
6
+ "module": "../esm/Sheet/index.js",
7
+ "main": "./index.js",
8
+ "types": "./index.d.ts"
9
+ }
package/Theme/index.d.ts CHANGED
@@ -597,6 +597,36 @@ export declare const THEMES: {
597
597
  "component-avatar-font-size-xxxl": string;
598
598
  "component-accordion-text": string;
599
599
  "component-accordion-line": string;
600
+ "component-sheet-bg": string;
601
+ "component-sheet-text": string;
602
+ "component-sheet-secondary": string;
603
+ "component-sheet-overlay": string;
604
+ "component-sheet-radius": string;
605
+ "component-sheet-shadow": string;
606
+ "component-sheet-z-index": string;
607
+ "component-sheet-max-height": string;
608
+ "component-sheet-overlay-blur": string;
609
+ "component-sheet-motion-duration": string;
610
+ "component-sheet-resize-duration": string;
611
+ "component-sheet-motion-easing": string;
612
+ "component-sheet-reduced-motion-duration": string;
613
+ "component-sheet-drag-area-height": string;
614
+ "component-sheet-handle-width": string;
615
+ "component-sheet-handle-height": string;
616
+ "component-sheet-handle-radius": string;
617
+ "component-sheet-handle-opacity": string;
618
+ "component-sheet-header-gap": string;
619
+ "component-sheet-header-padding": string;
620
+ "component-sheet-border-width": string;
621
+ "component-sheet-border-color": string;
622
+ "component-sheet-title-font-size": string;
623
+ "component-sheet-title-line-height": string;
624
+ "component-sheet-title-font-weight": string;
625
+ "component-sheet-description-offset": string;
626
+ "component-sheet-description-font-size": string;
627
+ "component-sheet-body-padding": string;
628
+ "component-sheet-footer-padding-block": string;
629
+ "component-sheet-footer-padding-inline": string;
600
630
  "component-modal-bg": string;
601
631
  "component-modal-border": string;
602
632
  "component-modal-overlay": string;
@@ -1384,6 +1414,36 @@ export declare const THEMES: {
1384
1414
  "component-avatar-font-size-xxxl": string;
1385
1415
  "component-accordion-text": string;
1386
1416
  "component-accordion-line": string;
1417
+ "component-sheet-bg": string;
1418
+ "component-sheet-text": string;
1419
+ "component-sheet-secondary": string;
1420
+ "component-sheet-overlay": string;
1421
+ "component-sheet-radius": string;
1422
+ "component-sheet-shadow": string;
1423
+ "component-sheet-z-index": string;
1424
+ "component-sheet-max-height": string;
1425
+ "component-sheet-overlay-blur": string;
1426
+ "component-sheet-motion-duration": string;
1427
+ "component-sheet-resize-duration": string;
1428
+ "component-sheet-motion-easing": string;
1429
+ "component-sheet-reduced-motion-duration": string;
1430
+ "component-sheet-drag-area-height": string;
1431
+ "component-sheet-handle-width": string;
1432
+ "component-sheet-handle-height": string;
1433
+ "component-sheet-handle-radius": string;
1434
+ "component-sheet-handle-opacity": string;
1435
+ "component-sheet-header-gap": string;
1436
+ "component-sheet-header-padding": string;
1437
+ "component-sheet-border-width": string;
1438
+ "component-sheet-border-color": string;
1439
+ "component-sheet-title-font-size": string;
1440
+ "component-sheet-title-line-height": string;
1441
+ "component-sheet-title-font-weight": string;
1442
+ "component-sheet-description-offset": string;
1443
+ "component-sheet-description-font-size": string;
1444
+ "component-sheet-body-padding": string;
1445
+ "component-sheet-footer-padding-block": string;
1446
+ "component-sheet-footer-padding-inline": string;
1387
1447
  "component-modal-bg": string;
1388
1448
  "component-modal-border": string;
1389
1449
  "component-modal-overlay": string;
@@ -518,6 +518,36 @@ declare const _default: {
518
518
  "component-avatar-font-size-xxxl": string;
519
519
  "component-accordion-text": string;
520
520
  "component-accordion-line": string;
521
+ "component-sheet-bg": string;
522
+ "component-sheet-text": string;
523
+ "component-sheet-secondary": string;
524
+ "component-sheet-overlay": string;
525
+ "component-sheet-radius": string;
526
+ "component-sheet-shadow": string;
527
+ "component-sheet-z-index": string;
528
+ "component-sheet-max-height": string;
529
+ "component-sheet-overlay-blur": string;
530
+ "component-sheet-motion-duration": string;
531
+ "component-sheet-resize-duration": string;
532
+ "component-sheet-motion-easing": string;
533
+ "component-sheet-reduced-motion-duration": string;
534
+ "component-sheet-drag-area-height": string;
535
+ "component-sheet-handle-width": string;
536
+ "component-sheet-handle-height": string;
537
+ "component-sheet-handle-radius": string;
538
+ "component-sheet-handle-opacity": string;
539
+ "component-sheet-header-gap": string;
540
+ "component-sheet-header-padding": string;
541
+ "component-sheet-border-width": string;
542
+ "component-sheet-border-color": string;
543
+ "component-sheet-title-font-size": string;
544
+ "component-sheet-title-line-height": string;
545
+ "component-sheet-title-font-weight": string;
546
+ "component-sheet-description-offset": string;
547
+ "component-sheet-description-font-size": string;
548
+ "component-sheet-body-padding": string;
549
+ "component-sheet-footer-padding-block": string;
550
+ "component-sheet-footer-padding-inline": string;
521
551
  "component-modal-bg": string;
522
552
  "component-modal-border": string;
523
553
  "component-modal-overlay": string;