@dreamtree-org/twreact-ui 1.3.11 → 2.0.1
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/README.md +40 -6
- package/ai-skills/dreamtree-ui.md +47 -9
- package/codemods/v2.cjs +198 -0
- package/dist/ai-schema.json +609 -33
- package/dist/components/blocks/AppShell.d.ts.map +1 -1
- package/dist/components/blocks/BottomActionBar.d.ts +6 -0
- package/dist/components/blocks/BottomActionBar.d.ts.map +1 -0
- package/dist/components/blocks/ConfirmDialog.d.ts.map +1 -1
- package/dist/components/blocks/PageHeader.d.ts.map +1 -1
- package/dist/components/core/Checkbox.d.ts.map +1 -1
- package/dist/components/core/DatePicker.d.ts.map +1 -1
- package/dist/components/core/DateRangePicker.d.ts.map +1 -1
- package/dist/components/core/Form.d.ts.map +1 -1
- package/dist/components/core/Input.d.ts.map +1 -1
- package/dist/components/core/Popover.d.ts.map +1 -1
- package/dist/components/core/ProgressBar.d.ts.map +1 -1
- package/dist/components/core/Rate.d.ts.map +1 -1
- package/dist/components/core/SearchField.d.ts +9 -0
- package/dist/components/core/SearchField.d.ts.map +1 -0
- package/dist/components/core/SegmentedControl.d.ts +8 -0
- package/dist/components/core/SegmentedControl.d.ts.map +1 -0
- package/dist/components/core/Select.d.ts.map +1 -1
- package/dist/components/core/SwipeableListItem.d.ts +4 -0
- package/dist/components/core/SwipeableListItem.d.ts.map +1 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts +58 -0
- package/dist/components/core/SwipeableListItemGesture.d.ts.map +1 -0
- package/dist/components/core/Switch.d.ts.map +1 -1
- package/dist/components/core/Table/ActionMenu.d.ts +10 -3
- package/dist/components/core/Table/ActionMenu.d.ts.map +1 -1
- package/dist/components/core/Table/MobileCard.d.ts +10 -1
- package/dist/components/core/Table/MobileCard.d.ts.map +1 -1
- package/dist/components/core/Table/MobileFilters.d.ts +8 -2
- package/dist/components/core/Table/MobileFilters.d.ts.map +1 -1
- package/dist/components/core/Table/Table.d.ts.map +1 -1
- package/dist/components/core/Table/TableRow.d.ts +2 -1
- package/dist/components/core/Table/TableRow.d.ts.map +1 -1
- package/dist/components/core/Tabs.d.ts +3 -3
- package/dist/components/core/Tabs.d.ts.map +1 -1
- package/dist/components/core/ThreeDotPopover.d.ts +10 -22
- package/dist/components/core/ThreeDotPopover.d.ts.map +1 -1
- package/dist/components/core/Tooltip.d.ts +2 -1
- package/dist/components/core/Tooltip.d.ts.map +1 -1
- package/dist/components/core/internal/Calendar.d.ts +77 -0
- package/dist/components/core/internal/Calendar.d.ts.map +1 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts +42 -0
- package/dist/components/core/menu/ActionMenuSurface.d.ts.map +1 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts +17 -0
- package/dist/components/core/menu/ActionSheetMenu.d.ts.map +1 -0
- package/dist/components/core/menu/MenuPopover.d.ts +21 -0
- package/dist/components/core/menu/MenuPopover.d.ts.map +1 -0
- package/dist/components/core/menu/menuItems.d.ts +21 -0
- package/dist/components/core/menu/menuItems.d.ts.map +1 -0
- package/dist/components/core/menu/menuKeyboard.d.ts +16 -0
- package/dist/components/core/menu/menuKeyboard.d.ts.map +1 -0
- package/dist/components/feedback/ActionSheet.d.ts +4 -0
- package/dist/components/feedback/ActionSheet.d.ts.map +1 -0
- package/dist/components/feedback/Alert.d.ts.map +1 -1
- package/dist/components/feedback/Dialog.d.ts.map +1 -1
- package/dist/components/feedback/Drawer.d.ts.map +1 -1
- package/dist/components/feedback/Sheet.d.ts +4 -0
- package/dist/components/feedback/Sheet.d.ts.map +1 -0
- package/dist/components/feedback/Toast.d.ts +4 -3
- package/dist/components/feedback/Toast.d.ts.map +1 -1
- package/dist/components/feedback/ToastItem.d.ts +47 -0
- package/dist/components/feedback/ToastItem.d.ts.map +1 -0
- package/dist/components/feedback/ToastStack.d.ts +20 -0
- package/dist/components/feedback/ToastStack.d.ts.map +1 -0
- package/dist/components/feedback/ToastSwipe.d.ts +22 -0
- package/dist/components/feedback/ToastSwipe.d.ts.map +1 -0
- package/dist/components/feedback/Tour.d.ts.map +1 -1
- package/dist/components/feedback/sheetCore.d.ts +30 -0
- package/dist/components/feedback/sheetCore.d.ts.map +1 -0
- package/dist/components/navigation/Navbar.d.ts.map +1 -1
- package/dist/components/navigation/Sidebar.d.ts +6 -0
- package/dist/components/navigation/Sidebar.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextEditor.d.ts.map +1 -1
- package/dist/components/rich-text/RichTextToolbar.d.ts +6 -2
- package/dist/components/rich-text/RichTextToolbar.d.ts.map +1 -1
- package/dist/components/utility/PullToRefresh.d.ts +5 -0
- package/dist/components/utility/PullToRefresh.d.ts.map +1 -0
- package/dist/esm/components/blocks/AppShell.js +97 -90
- package/dist/esm/components/blocks/BottomActionBar.js +132 -0
- package/dist/esm/components/blocks/ConfirmDialog.js +40 -4
- package/dist/esm/components/blocks/PageHeader.js +16 -3
- package/dist/esm/components/core/Checkbox.js +13 -24
- package/dist/esm/components/core/DatePicker.js +117 -304
- package/dist/esm/components/core/DateRangePicker.js +260 -308
- package/dist/esm/components/core/Form.js +11 -2
- package/dist/esm/components/core/Input.js +13 -18
- package/dist/esm/components/core/Popover.js +59 -48
- package/dist/esm/components/core/ProgressBar.js +36 -64
- package/dist/esm/components/core/Rate.js +5 -10
- package/dist/esm/components/core/SearchField.js +311 -0
- package/dist/esm/components/core/SegmentedControl.js +189 -0
- package/dist/esm/components/core/Select.js +185 -190
- package/dist/esm/components/core/SwipeableListItem.js +286 -0
- package/dist/esm/components/core/SwipeableListItemGesture.js +219 -0
- package/dist/esm/components/core/Switch.js +11 -13
- package/dist/esm/components/core/Table/ActionMenu.js +45 -231
- package/dist/esm/components/core/Table/ColumnMenu.js +1 -1
- package/dist/esm/components/core/Table/MobileCard.js +66 -16
- package/dist/esm/components/core/Table/MobileFilters.js +181 -10
- package/dist/esm/components/core/Table/Table.js +149 -102
- package/dist/esm/components/core/Table/TableRow.js +10 -2
- package/dist/esm/components/core/Tabs.js +7 -7
- package/dist/esm/components/core/ThreeDotPopover.js +93 -99
- package/dist/esm/components/core/Tooltip.js +138 -145
- package/dist/esm/components/core/internal/Calendar.js +381 -0
- package/dist/esm/components/core/menu/ActionMenuSurface.js +110 -0
- package/dist/esm/components/core/menu/ActionSheetMenu.js +140 -0
- package/dist/esm/components/core/menu/MenuPopover.js +177 -0
- package/dist/esm/components/core/menu/menuItems.js +61 -0
- package/dist/esm/components/core/menu/menuKeyboard.js +54 -0
- package/dist/esm/components/feedback/ActionSheet.js +55 -0
- package/dist/esm/components/feedback/Alert.js +63 -53
- package/dist/esm/components/feedback/Dialog.js +141 -53
- package/dist/esm/components/feedback/Drawer.js +130 -132
- package/dist/esm/components/feedback/Sheet.js +125 -0
- package/dist/esm/components/feedback/Toast.js +21 -291
- package/dist/esm/components/feedback/ToastItem.js +348 -0
- package/dist/esm/components/feedback/ToastStack.js +130 -0
- package/dist/esm/components/feedback/ToastSwipe.js +52 -0
- package/dist/esm/components/feedback/Tour.js +107 -30
- package/dist/esm/components/feedback/sheetCore.js +494 -0
- package/dist/esm/components/navigation/Dropdown.js +1 -1
- package/dist/esm/components/navigation/Navbar.js +172 -37
- package/dist/esm/components/navigation/Sidebar.js +263 -111
- package/dist/esm/components/rich-text/RichTextEditor.js +9 -3
- package/dist/esm/components/rich-text/RichTextToolbar.js +29 -9
- package/dist/esm/components/utility/Portal.js +31 -0
- package/dist/esm/components/utility/PullToRefresh.js +229 -0
- package/dist/esm/hooks/useFloatingPosition.js +82 -0
- package/dist/esm/hooks/useHaptics.js +65 -0
- package/dist/esm/hooks/usePresence.js +58 -0
- package/dist/esm/hooks/usePresentation.js +21 -0
- package/dist/esm/hooks/useSheetDrag.js +220 -0
- package/dist/esm/index.js +13 -2
- package/dist/esm/utils/position.js +10 -63
- package/dist/hooks/useFloatingPosition.d.ts +8 -4
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -1
- package/dist/hooks/useHaptics.d.ts +19 -0
- package/dist/hooks/useHaptics.d.ts.map +1 -0
- package/dist/hooks/useSheetDrag.d.ts +31 -0
- package/dist/hooks/useSheetDrag.d.ts.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.esm.css +1 -1
- package/dist/index.esm.js +8851 -3198
- package/dist/index.js +8856 -3195
- package/dist/rich-text/index.js +41 -11
- package/dist/types/blocks.d.ts +32 -2
- package/dist/types/blocks.d.ts.map +1 -1
- package/dist/types/index.d.ts +353 -19
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rich-text.d.ts +5 -0
- package/dist/types/rich-text.d.ts.map +1 -1
- package/dist/utils/position.d.ts +0 -15
- package/dist/utils/position.d.ts.map +1 -1
- package/doc/README.md +15 -0
- package/mcp/catalog.snapshot.json +1398 -464
- package/package.json +7 -2
- package/dist/esm/hooks/useSwipeToClose.js +0 -66
- package/dist/hooks/useSwipeToClose.d.ts +0 -24
- package/dist/hooks/useSwipeToClose.d.ts.map +0 -1
|
@@ -2,15 +2,70 @@
|
|
|
2
2
|
import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../../_virtual/_rollupPluginBabelHelpers.js';
|
|
3
3
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
4
|
import { cn } from '../../utils/cn.js';
|
|
5
|
-
import React, { useState, useCallback, useEffect } from 'react';
|
|
5
|
+
import React, { useState, useRef, useCallback, useEffect, useSyncExternalStore } from 'react';
|
|
6
6
|
import { ChevronLeft, Search, LogIn, LogOut, X, Menu, User, Bell } from 'lucide-react';
|
|
7
7
|
import { Dropdown } from './Dropdown.js';
|
|
8
8
|
import Avatar from '../utility/Avatar.js';
|
|
9
|
+
import Sheet from '../feedback/Sheet.js';
|
|
10
|
+
import SearchField from '../core/SearchField.js';
|
|
11
|
+
import { TOUCH_TARGET } from '../../utils/touchTarget.js';
|
|
9
12
|
import PropTypes from '../../_vendor/prop-types/index.js';
|
|
10
13
|
|
|
11
14
|
var _excluded = ["emitter", "content", "notifications"],
|
|
12
|
-
_excluded2 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen"];
|
|
15
|
+
_excluded2 = ["emitter", "logo", "center", "items", "user", "notifications", "searchable", "onSearch", "leftIcon", "rightMenuContent", "onLeftIconClick", "onLoginClick", "onLogoutClick", "className", "onFetch", "isMobileOpen", "setIsMobileOpen", "sticky", "largeTitle"];
|
|
13
16
|
var NO_NOTIFICATIONS = [];
|
|
17
|
+
// Icon-only bar buttons: 36px on desktop, the 44px touch target on coarse pointers.
|
|
18
|
+
var ICON_BUTTON = cn("inline-flex items-center justify-center rounded-md p-2 text-primary-400 hover:text-primary-500 hover:bg-gray-100 dark:hover:bg-gray-800", "focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500", TOUCH_TARGET);
|
|
19
|
+
// Badge counts above this read "99+".
|
|
20
|
+
var BADGE_MAX = 99;
|
|
21
|
+
var formatBadgeCount = function formatBadgeCount(count) {
|
|
22
|
+
return count > BADGE_MAX ? "".concat(BADGE_MAX, "+") : String(count);
|
|
23
|
+
};
|
|
24
|
+
// Large title: collapses past COLLAPSE_AT and re-expands under EXPAND_AT. The
|
|
25
|
+
// gap (hysteresis) stops the bar flickering when collapsing it shortens the page.
|
|
26
|
+
var LARGE_TITLE_COLLAPSE_AT = 44;
|
|
27
|
+
var LARGE_TITLE_EXPAND_AT = 8;
|
|
28
|
+
// Per-instance scroll store for useSyncExternalStore: one passive window
|
|
29
|
+
// scroll listener; `false` (expanded) on the server and while hydrating.
|
|
30
|
+
function createScrollCollapseStore() {
|
|
31
|
+
var collapsed = false;
|
|
32
|
+
var read = function read() {
|
|
33
|
+
var y = window.scrollY || window.pageYOffset || 0;
|
|
34
|
+
if (!collapsed && y > LARGE_TITLE_COLLAPSE_AT) collapsed = true;else if (collapsed && y < LARGE_TITLE_EXPAND_AT) collapsed = false;
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
subscribe: function subscribe(onChange) {
|
|
38
|
+
if (typeof window === "undefined") return function () {};
|
|
39
|
+
var handle = function handle() {
|
|
40
|
+
var prev = collapsed;
|
|
41
|
+
read();
|
|
42
|
+
if (prev !== collapsed) onChange();
|
|
43
|
+
};
|
|
44
|
+
handle();
|
|
45
|
+
window.addEventListener("scroll", handle, {
|
|
46
|
+
passive: true
|
|
47
|
+
});
|
|
48
|
+
return function () {
|
|
49
|
+
return window.removeEventListener("scroll", handle);
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
getSnapshot: function getSnapshot() {
|
|
53
|
+
return collapsed;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
var NEVER_SUBSCRIBE = function NEVER_SUBSCRIBE() {
|
|
58
|
+
return function () {};
|
|
59
|
+
};
|
|
60
|
+
var ALWAYS_FALSE = function ALWAYS_FALSE() {
|
|
61
|
+
return false;
|
|
62
|
+
};
|
|
63
|
+
function useLargeTitleCollapsed(enabled) {
|
|
64
|
+
var _useState = useState(createScrollCollapseStore),
|
|
65
|
+
_useState2 = _slicedToArray(_useState, 1),
|
|
66
|
+
store = _useState2[0];
|
|
67
|
+
return useSyncExternalStore(enabled ? store.subscribe : NEVER_SUBSCRIBE, enabled ? store.getSnapshot : ALWAYS_FALSE, ALWAYS_FALSE);
|
|
68
|
+
}
|
|
14
69
|
// Simplified Notifications, uses notifications from props and a single effect for fetch/update
|
|
15
70
|
var NotificationsDropdown = function NotificationsDropdown(_ref) {
|
|
16
71
|
var emitter = _ref.emitter,
|
|
@@ -20,10 +75,10 @@ var NotificationsDropdown = function NotificationsDropdown(_ref) {
|
|
|
20
75
|
onFetch = _ref$onFetch === void 0 ? function () {
|
|
21
76
|
return console.log("invoked onFetch notifications");
|
|
22
77
|
} : _ref$onFetch;
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
notifications =
|
|
26
|
-
setNotifications =
|
|
78
|
+
var _useState3 = useState(initialNotifications),
|
|
79
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
80
|
+
notifications = _useState4[0],
|
|
81
|
+
setNotifications = _useState4[1];
|
|
27
82
|
var onView = function onView() {
|
|
28
83
|
emitter.emit("notification:view", notifications);
|
|
29
84
|
};
|
|
@@ -46,10 +101,10 @@ var NotificationsDropdown = function NotificationsDropdown(_ref) {
|
|
|
46
101
|
};
|
|
47
102
|
// Reset to the `notifications` prop when it changes (adjust-during-render
|
|
48
103
|
// pattern), then let onFetch refresh from the server.
|
|
49
|
-
var
|
|
50
|
-
|
|
51
|
-
prevInitial =
|
|
52
|
-
setPrevInitial =
|
|
104
|
+
var _useState5 = useState(initialNotifications),
|
|
105
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
106
|
+
prevInitial = _useState6[0],
|
|
107
|
+
setPrevInitial = _useState6[1];
|
|
53
108
|
if (initialNotifications !== prevInitial) {
|
|
54
109
|
setPrevInitial(initialNotifications);
|
|
55
110
|
setNotifications(initialNotifications);
|
|
@@ -67,13 +122,19 @@ var NotificationsDropdown = function NotificationsDropdown(_ref) {
|
|
|
67
122
|
// For simplicity, shows notifications in the dropdown, can be expanded
|
|
68
123
|
return jsx(Dropdown, {
|
|
69
124
|
trigger: jsxs("button", {
|
|
70
|
-
|
|
71
|
-
|
|
125
|
+
type: "button",
|
|
126
|
+
className: cn(ICON_BUTTON, "relative"),
|
|
127
|
+
"aria-label": unreadCount > 0 ? "Notifications, ".concat(formatBadgeCount(unreadCount), " unread") : "Notifications",
|
|
72
128
|
children: [jsx(Bell, {
|
|
73
|
-
className: "h-5 w-5"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
129
|
+
className: "h-5 w-5",
|
|
130
|
+
"aria-hidden": "true"
|
|
131
|
+
}), unreadCount > 0 &&
|
|
132
|
+
// Grows with the count (min-w + padding) and caps at "99+".
|
|
133
|
+
jsx("span", {
|
|
134
|
+
"aria-hidden": "true",
|
|
135
|
+
"data-navbar-badge": "",
|
|
136
|
+
className: "absolute -right-0.5 -top-0.5 inline-flex h-4 min-w-4 items-center justify-center rounded-pill bg-error-500 px-1 text-micro font-semibold leading-none text-white",
|
|
137
|
+
children: formatBadgeCount(unreadCount)
|
|
77
138
|
})]
|
|
78
139
|
}),
|
|
79
140
|
placement: "bottom-end",
|
|
@@ -159,7 +220,7 @@ var RightMenuContent = function RightMenuContent(_ref2) {
|
|
|
159
220
|
});
|
|
160
221
|
};
|
|
161
222
|
var styledClassNames = {
|
|
162
|
-
button:
|
|
223
|
+
button: ICON_BUTTON,
|
|
163
224
|
mobileItem: "md:hidden",
|
|
164
225
|
icon: "h-6 w-6",
|
|
165
226
|
dropdown: "w-56 rounded-md border border-line bg-surface py-1 shadow-lg"
|
|
@@ -192,19 +253,29 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
192
253
|
onFetch = _ref3.onFetch;
|
|
193
254
|
_ref3.isMobileOpen;
|
|
194
255
|
_ref3.setIsMobileOpen;
|
|
195
|
-
var
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
var _useState7 = useState(""),
|
|
256
|
+
var _ref3$sticky = _ref3.sticky,
|
|
257
|
+
sticky = _ref3$sticky === void 0 ? false : _ref3$sticky,
|
|
258
|
+
largeTitle = _ref3.largeTitle,
|
|
259
|
+
props = _objectWithoutProperties(_ref3, _excluded2);
|
|
260
|
+
var _useState7 = useState(false),
|
|
201
261
|
_useState8 = _slicedToArray(_useState7, 2),
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
var _useState9 = useState(
|
|
262
|
+
isMobileMenuOpen = _useState8[0],
|
|
263
|
+
setIsMobileMenuOpen = _useState8[1];
|
|
264
|
+
var _useState9 = useState(""),
|
|
205
265
|
_useState0 = _slicedToArray(_useState9, 2),
|
|
206
|
-
|
|
207
|
-
|
|
266
|
+
searchTerm = _useState0[0],
|
|
267
|
+
setSearchTerm = _useState0[1];
|
|
268
|
+
var _useState1 = useState(false),
|
|
269
|
+
_useState10 = _slicedToArray(_useState1, 2),
|
|
270
|
+
isMobileSearchOpen = _useState10[0],
|
|
271
|
+
setIsMobileSearchOpen = _useState10[1];
|
|
272
|
+
var mobileSearchRef = useRef(null);
|
|
273
|
+
var hasLargeTitle = largeTitle !== undefined && largeTitle !== null && largeTitle !== false;
|
|
274
|
+
var titleCollapsed = useLargeTitleCollapsed(hasLargeTitle);
|
|
275
|
+
var _useState11 = useState(typeof window !== "undefined" ? window.innerWidth < 768 : false),
|
|
276
|
+
_useState12 = _slicedToArray(_useState11, 2),
|
|
277
|
+
isMobile = _useState12[0],
|
|
278
|
+
setIsMobile = _useState12[1];
|
|
208
279
|
// Responsive flag update
|
|
209
280
|
var handleResize = useCallback(function () {
|
|
210
281
|
setIsMobile(window.innerWidth < 768);
|
|
@@ -221,6 +292,12 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
221
292
|
e.preventDefault();
|
|
222
293
|
onSearch === null || onSearch === void 0 || onSearch(searchTerm);
|
|
223
294
|
};
|
|
295
|
+
// Phones: the inline field is hidden below `sm`; a search button opens it
|
|
296
|
+
// in a top Sheet instead, sharing the same term and `onSearch`.
|
|
297
|
+
var handleMobileSearch = function handleMobileSearch(term) {
|
|
298
|
+
onSearch === null || onSearch === void 0 || onSearch(term);
|
|
299
|
+
setIsMobileSearchOpen(false);
|
|
300
|
+
};
|
|
224
301
|
var handleLoginClick = function handleLoginClick() {
|
|
225
302
|
onLoginClick === null || onLoginClick === void 0 || onLoginClick();
|
|
226
303
|
};
|
|
@@ -262,11 +339,17 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
262
339
|
};
|
|
263
340
|
return jsxs("nav", _objectSpread2(_objectSpread2({
|
|
264
341
|
ref: ref,
|
|
265
|
-
className: cn("bg-surface text-foreground border-b border-line px-4 sm:px-6 lg:px-8", className)
|
|
342
|
+
className: cn("bg-surface text-foreground border-b border-line px-4 sm:px-6 lg:px-8", sticky && "sticky top-0 z-sticky pt-safe supports-[backdrop-filter]:bg-surface/80 supports-[backdrop-filter]:backdrop-blur", className),
|
|
343
|
+
"data-sticky": sticky ? "" : undefined
|
|
266
344
|
}, props), {}, {
|
|
267
345
|
children: [jsxs("div", {
|
|
268
|
-
className: "flex h-16 min-w-0 items-center justify-between gap-2 sm:gap-4",
|
|
269
|
-
children: [
|
|
346
|
+
className: "relative flex h-16 min-w-0 items-center justify-between gap-2 sm:gap-4",
|
|
347
|
+
children: [hasLargeTitle && jsx("div", {
|
|
348
|
+
"aria-hidden": "true",
|
|
349
|
+
"data-navbar-compact-title": "",
|
|
350
|
+
className: cn("pointer-events-none absolute left-1/2 top-1/2 max-w-[50%] -translate-x-1/2 -translate-y-1/2 truncate text-base font-semibold", "transition-opacity duration-base ease-standard motion-reduce:transition-none", titleCollapsed ? "opacity-100" : "opacity-0"),
|
|
351
|
+
children: largeTitle
|
|
352
|
+
}), jsxs("div", {
|
|
270
353
|
className: "flex min-w-0 shrink items-center",
|
|
271
354
|
children: [leftIcon !== false && jsx("div", {
|
|
272
355
|
className: "mr-2 hidden md:block md:mr-4",
|
|
@@ -275,8 +358,9 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
275
358
|
className: "flex min-w-0 items-center",
|
|
276
359
|
children: [leftIcon !== false && jsx("button", {
|
|
277
360
|
onClick: onLeftIconClick,
|
|
278
|
-
|
|
279
|
-
"
|
|
361
|
+
type: "button",
|
|
362
|
+
className: cn(ICON_BUTTON, "shrink-0 md:hidden"),
|
|
363
|
+
"aria-label": "Go back",
|
|
280
364
|
children: leftIcon
|
|
281
365
|
}), logo && jsx("div", {
|
|
282
366
|
className: "ml-2 min-w-0 truncate sm:ml-4 md:ml-0",
|
|
@@ -309,6 +393,20 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
309
393
|
}
|
|
310
394
|
})]
|
|
311
395
|
})
|
|
396
|
+
}), searchable && jsx("button", {
|
|
397
|
+
type: "button",
|
|
398
|
+
className: cn(styledClassNames.button, "sm:hidden"),
|
|
399
|
+
onClick: function onClick() {
|
|
400
|
+
return setIsMobileSearchOpen(true);
|
|
401
|
+
},
|
|
402
|
+
"aria-label": "Search",
|
|
403
|
+
"aria-haspopup": "dialog",
|
|
404
|
+
"aria-expanded": isMobileSearchOpen,
|
|
405
|
+
"data-navbar-search-button": "",
|
|
406
|
+
children: jsx(Search, {
|
|
407
|
+
className: "h-5 w-5",
|
|
408
|
+
"aria-hidden": "true"
|
|
409
|
+
})
|
|
312
410
|
}), jsx(RightMenuComponent, {
|
|
313
411
|
notifications: notifications,
|
|
314
412
|
onFetch: onFetch
|
|
@@ -333,12 +431,14 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
333
431
|
className: "relative",
|
|
334
432
|
children: !user ? jsx("button", {
|
|
335
433
|
className: cn(styledClassNames.button, styledClassNames.mobileItem),
|
|
434
|
+
type: "button",
|
|
336
435
|
onClick: function onClick() {
|
|
337
436
|
return setIsMobileMenuOpen(function (s) {
|
|
338
437
|
return !s;
|
|
339
438
|
});
|
|
340
439
|
},
|
|
341
|
-
"aria-label": "menu",
|
|
440
|
+
"aria-label": isMobileMenuOpen ? "Close menu" : "Open menu",
|
|
441
|
+
"aria-expanded": isMobileMenuOpen,
|
|
342
442
|
children: isMobileMenuOpen ? jsx(X, {
|
|
343
443
|
className: styledClassNames.icon
|
|
344
444
|
}) : jsx(Menu, {
|
|
@@ -346,8 +446,9 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
346
446
|
})
|
|
347
447
|
}) : jsx(Dropdown, {
|
|
348
448
|
trigger: jsx("button", {
|
|
449
|
+
type: "button",
|
|
349
450
|
className: styledClassNames.button,
|
|
350
|
-
"aria-label": "
|
|
451
|
+
"aria-label": "User menu",
|
|
351
452
|
children: user.avatar || user.name ?
|
|
352
453
|
// Image when `avatar` is set; otherwise initials from
|
|
353
454
|
// `name` (Avatar's own fallback logic).
|
|
@@ -361,7 +462,7 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
361
462
|
})
|
|
362
463
|
}),
|
|
363
464
|
placement: "bottom-end",
|
|
364
|
-
className: "z-
|
|
465
|
+
className: "z-dropdown",
|
|
365
466
|
children: jsxs("div", {
|
|
366
467
|
className: styledClassNames.dropdown,
|
|
367
468
|
children: [jsxs("div", {
|
|
@@ -404,6 +505,38 @@ var Navbar = /*#__PURE__*/React.forwardRef(function (_ref3, ref) {
|
|
|
404
505
|
})
|
|
405
506
|
})]
|
|
406
507
|
})]
|
|
508
|
+
}), hasLargeTitle && jsx("div", {
|
|
509
|
+
"data-navbar-large-title": "",
|
|
510
|
+
"data-collapsed": titleCollapsed ? "" : undefined,
|
|
511
|
+
className: cn("overflow-hidden transition-[max-height,opacity] duration-base ease-standard motion-reduce:transition-none", titleCollapsed ? "max-h-0 opacity-0" : "max-h-16 opacity-100"),
|
|
512
|
+
children: jsx("h1", {
|
|
513
|
+
className: "truncate pb-3 text-3xl font-bold tracking-tight text-foreground",
|
|
514
|
+
children: largeTitle
|
|
515
|
+
})
|
|
516
|
+
}), searchable && jsx(Sheet, {
|
|
517
|
+
open: isMobileSearchOpen,
|
|
518
|
+
onClose: function onClose() {
|
|
519
|
+
return setIsMobileSearchOpen(false);
|
|
520
|
+
},
|
|
521
|
+
placement: "top",
|
|
522
|
+
initialFocus: mobileSearchRef,
|
|
523
|
+
"aria-label": "Search",
|
|
524
|
+
"data-navbar-search-sheet": "",
|
|
525
|
+
children: jsx("div", {
|
|
526
|
+
className: "px-4 py-3",
|
|
527
|
+
children: jsx(SearchField, {
|
|
528
|
+
ref: mobileSearchRef,
|
|
529
|
+
presentation: "popover",
|
|
530
|
+
showCancel: true,
|
|
531
|
+
placeholder: "Search...",
|
|
532
|
+
value: searchTerm,
|
|
533
|
+
onValueChange: setSearchTerm,
|
|
534
|
+
onSearch: handleMobileSearch,
|
|
535
|
+
onCancel: function onCancel() {
|
|
536
|
+
return setIsMobileSearchOpen(false);
|
|
537
|
+
}
|
|
538
|
+
})
|
|
539
|
+
})
|
|
407
540
|
}), isMobileMenuOpen && !user && jsx("div", {
|
|
408
541
|
className: "md:hidden h-full",
|
|
409
542
|
children: jsx("div", {
|
|
@@ -431,7 +564,9 @@ Navbar.propTypes = {
|
|
|
431
564
|
user: PropTypes.object,
|
|
432
565
|
notifications: PropTypes.array,
|
|
433
566
|
searchable: PropTypes.bool,
|
|
434
|
-
onSearch: PropTypes.func
|
|
567
|
+
onSearch: PropTypes.func,
|
|
568
|
+
sticky: PropTypes.bool,
|
|
569
|
+
largeTitle: PropTypes.node
|
|
435
570
|
};
|
|
436
571
|
|
|
437
572
|
export { Navbar, Navbar as default };
|