@papernote/ui 1.10.5 → 1.10.6
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/dist/components/SwipeableListItem.d.ts +66 -0
- package/dist/components/SwipeableListItem.d.ts.map +1 -0
- package/dist/components/Toast.d.ts +7 -1
- package/dist/components/Toast.d.ts.map +1 -1
- package/dist/components/index.d.ts +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/index.d.ts +73 -4
- package/dist/index.esm.js +292 -3
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +292 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/SwipeableListItem.stories.tsx +442 -0
- package/src/components/SwipeableListItem.tsx +425 -0
- package/src/components/Toast.stories.tsx +449 -0
- package/src/components/Toast.tsx +23 -1
- package/src/components/index.ts +4 -1
package/dist/index.esm.js
CHANGED
|
@@ -3346,7 +3346,7 @@ const toastStyles = {
|
|
|
3346
3346
|
icon: jsx(Info, { className: "h-5 w-5 text-primary-600" }),
|
|
3347
3347
|
},
|
|
3348
3348
|
};
|
|
3349
|
-
function Toast({ id, type, title, message, duration = 5000, onClose }) {
|
|
3349
|
+
function Toast({ id, type, title, message, duration = 5000, onClose, action }) {
|
|
3350
3350
|
const [isExiting, setIsExiting] = useState(false);
|
|
3351
3351
|
const styles = toastStyles[type];
|
|
3352
3352
|
const handleClose = useCallback(() => {
|
|
@@ -3355,13 +3355,19 @@ function Toast({ id, type, title, message, duration = 5000, onClose }) {
|
|
|
3355
3355
|
onClose(id);
|
|
3356
3356
|
}, 300); // Match animation duration
|
|
3357
3357
|
}, [id, onClose]);
|
|
3358
|
+
const handleAction = useCallback(() => {
|
|
3359
|
+
if (action) {
|
|
3360
|
+
action.onClick();
|
|
3361
|
+
handleClose();
|
|
3362
|
+
}
|
|
3363
|
+
}, [action, handleClose]);
|
|
3358
3364
|
useEffect(() => {
|
|
3359
3365
|
const timer = setTimeout(() => {
|
|
3360
3366
|
handleClose();
|
|
3361
3367
|
}, duration);
|
|
3362
3368
|
return () => clearTimeout(timer);
|
|
3363
3369
|
}, [duration, handleClose]);
|
|
3364
|
-
return (jsx("div", { className: `${styles.bg} ${styles.border} bg-subtle-grain rounded-lg shadow-lg p-4 min-w-[320px] max-w-md transition-all duration-300 ${isExiting ? 'opacity-0 translate-x-full' : 'opacity-100 translate-x-0 animate-slide-in-right'}`, children: jsxs("div", { className: "flex items-start gap-3", children: [jsx("div", { className: "flex-shrink-0 mt-0.5", children: styles.icon }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("h4", { className: "text-sm font-medium text-ink-900 mb-1", children: title }), jsx("p", { className: "text-sm text-ink-600", children: message })] }), jsx("button", { onClick: handleClose, className: "flex-shrink-0 text-ink-400 hover:text-ink-600 transition-colors", "aria-label": "Close notification", children: jsx(X, { className: "h-4 w-4" }) })] }) }));
|
|
3370
|
+
return (jsx("div", { className: `${styles.bg} ${styles.border} bg-subtle-grain rounded-lg shadow-lg p-4 min-w-[320px] max-w-md transition-all duration-300 ${isExiting ? 'opacity-0 translate-x-full' : 'opacity-100 translate-x-0 animate-slide-in-right'}`, children: jsxs("div", { className: "flex items-start gap-3", children: [jsx("div", { className: "flex-shrink-0 mt-0.5", children: styles.icon }), jsxs("div", { className: "flex-1 min-w-0", children: [jsx("h4", { className: "text-sm font-medium text-ink-900 mb-1", children: title }), jsx("p", { className: "text-sm text-ink-600", children: message }), action && (jsx("button", { onClick: handleAction, className: "mt-2 text-sm font-medium text-accent-600 hover:text-accent-700 transition-colors", children: action.label }))] }), jsx("button", { onClick: handleClose, className: "flex-shrink-0 text-ink-400 hover:text-ink-600 transition-colors", "aria-label": "Close notification", children: jsx(X, { className: "h-4 w-4" }) })] }) }));
|
|
3365
3371
|
}
|
|
3366
3372
|
const positionStyles = {
|
|
3367
3373
|
'top-right': 'top-20 right-6',
|
|
@@ -8096,6 +8102,289 @@ function SwipeableCard({ children, onSwipeRight, onSwipeLeft, rightAction = {
|
|
|
8096
8102
|
}, onTouchStart: handleTouchStart, onTouchMove: handleTouchMove, onTouchEnd: handleTouchEnd, onMouseDown: handleMouseDown, role: "button", "aria-label": `Swipeable card. ${onSwipeRight ? `Swipe right to ${rightAction.label}.` : ''} ${onSwipeLeft ? `Swipe left to ${leftAction.label}.` : ''}`, tabIndex: disabled ? -1 : 0, children: children })] }));
|
|
8097
8103
|
}
|
|
8098
8104
|
|
|
8105
|
+
// Color classes for action backgrounds
|
|
8106
|
+
const getColorClass = (color) => {
|
|
8107
|
+
const colorMap = {
|
|
8108
|
+
destructive: 'bg-error-500',
|
|
8109
|
+
warning: 'bg-warning-500',
|
|
8110
|
+
success: 'bg-success-500',
|
|
8111
|
+
primary: 'bg-accent-500',
|
|
8112
|
+
};
|
|
8113
|
+
return colorMap[color] || color;
|
|
8114
|
+
};
|
|
8115
|
+
/**
|
|
8116
|
+
* SwipeableListItem - List item with swipe-to-action functionality
|
|
8117
|
+
*
|
|
8118
|
+
* Designed for mobile workflows with keyboard accessibility:
|
|
8119
|
+
* - Swipe right to approve/confirm
|
|
8120
|
+
* - Swipe left to dismiss/delete
|
|
8121
|
+
* - Arrow keys for keyboard navigation
|
|
8122
|
+
* - Async callback support with loading state
|
|
8123
|
+
*
|
|
8124
|
+
* @example
|
|
8125
|
+
* ```tsx
|
|
8126
|
+
* <SwipeableListItem
|
|
8127
|
+
* onSwipeRight={() => handleApprove()}
|
|
8128
|
+
* onSwipeLeft={() => handleDismiss()}
|
|
8129
|
+
* rightAction={{
|
|
8130
|
+
* icon: Check,
|
|
8131
|
+
* color: 'success',
|
|
8132
|
+
* label: 'Approve'
|
|
8133
|
+
* }}
|
|
8134
|
+
* leftAction={{
|
|
8135
|
+
* icon: X,
|
|
8136
|
+
* color: 'destructive',
|
|
8137
|
+
* label: 'Dismiss'
|
|
8138
|
+
* }}
|
|
8139
|
+
* >
|
|
8140
|
+
* <div className="p-4">List item content</div>
|
|
8141
|
+
* </SwipeableListItem>
|
|
8142
|
+
* ```
|
|
8143
|
+
*/
|
|
8144
|
+
function SwipeableListItem({ children, onSwipeRight, onSwipeLeft, rightAction, leftAction, swipeThreshold = 100, disabled = false, className = '', }) {
|
|
8145
|
+
const containerRef = useRef(null);
|
|
8146
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
8147
|
+
const [offsetX, setOffsetX] = useState(0);
|
|
8148
|
+
const [isTriggered, setIsTriggered] = useState(null);
|
|
8149
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
8150
|
+
const [keyboardDirection, setKeyboardDirection] = useState(null);
|
|
8151
|
+
const startX = useRef(0);
|
|
8152
|
+
const startY = useRef(0);
|
|
8153
|
+
const isHorizontalSwipe = useRef(null);
|
|
8154
|
+
// Trigger haptic feedback
|
|
8155
|
+
const triggerHaptic = useCallback((style = 'medium') => {
|
|
8156
|
+
if ('vibrate' in navigator) {
|
|
8157
|
+
const patterns = {
|
|
8158
|
+
light: 10,
|
|
8159
|
+
medium: 25,
|
|
8160
|
+
heavy: [50, 30, 50],
|
|
8161
|
+
};
|
|
8162
|
+
navigator.vibrate(patterns[style]);
|
|
8163
|
+
}
|
|
8164
|
+
}, []);
|
|
8165
|
+
// Execute action with async support
|
|
8166
|
+
const executeAction = useCallback(async (direction) => {
|
|
8167
|
+
const handler = direction === 'right' ? onSwipeRight : onSwipeLeft;
|
|
8168
|
+
if (!handler)
|
|
8169
|
+
return;
|
|
8170
|
+
setIsLoading(true);
|
|
8171
|
+
triggerHaptic('heavy');
|
|
8172
|
+
// Animate out
|
|
8173
|
+
const slideDistance = direction === 'right' ? window.innerWidth : -window.innerWidth;
|
|
8174
|
+
setOffsetX(slideDistance);
|
|
8175
|
+
try {
|
|
8176
|
+
await handler();
|
|
8177
|
+
}
|
|
8178
|
+
finally {
|
|
8179
|
+
// Reset state after animation
|
|
8180
|
+
setTimeout(() => {
|
|
8181
|
+
setOffsetX(0);
|
|
8182
|
+
setIsTriggered(null);
|
|
8183
|
+
setIsLoading(false);
|
|
8184
|
+
setKeyboardDirection(null);
|
|
8185
|
+
}, 200);
|
|
8186
|
+
}
|
|
8187
|
+
}, [onSwipeRight, onSwipeLeft, triggerHaptic]);
|
|
8188
|
+
// Handle drag start
|
|
8189
|
+
const handleDragStart = useCallback((clientX, clientY) => {
|
|
8190
|
+
if (disabled || isLoading)
|
|
8191
|
+
return;
|
|
8192
|
+
setIsDragging(true);
|
|
8193
|
+
startX.current = clientX;
|
|
8194
|
+
startY.current = clientY;
|
|
8195
|
+
isHorizontalSwipe.current = null;
|
|
8196
|
+
}, [disabled, isLoading]);
|
|
8197
|
+
// Handle drag move
|
|
8198
|
+
const handleDragMove = useCallback((clientX, clientY) => {
|
|
8199
|
+
if (!isDragging || disabled || isLoading)
|
|
8200
|
+
return;
|
|
8201
|
+
const deltaX = clientX - startX.current;
|
|
8202
|
+
const deltaY = clientY - startY.current;
|
|
8203
|
+
// Determine if this is a horizontal swipe on first significant movement
|
|
8204
|
+
if (isHorizontalSwipe.current === null) {
|
|
8205
|
+
const absDeltaX = Math.abs(deltaX);
|
|
8206
|
+
const absDeltaY = Math.abs(deltaY);
|
|
8207
|
+
if (absDeltaX > 10 || absDeltaY > 10) {
|
|
8208
|
+
isHorizontalSwipe.current = absDeltaX > absDeltaY;
|
|
8209
|
+
}
|
|
8210
|
+
}
|
|
8211
|
+
// Only process horizontal swipes
|
|
8212
|
+
if (isHorizontalSwipe.current !== true)
|
|
8213
|
+
return;
|
|
8214
|
+
// Check if we should allow this direction
|
|
8215
|
+
const canSwipeRight = onSwipeRight !== undefined && rightAction !== undefined;
|
|
8216
|
+
const canSwipeLeft = onSwipeLeft !== undefined && leftAction !== undefined;
|
|
8217
|
+
let newOffset = deltaX;
|
|
8218
|
+
// Limit swipe direction based on available actions
|
|
8219
|
+
if (!canSwipeRight && deltaX > 0)
|
|
8220
|
+
newOffset = 0;
|
|
8221
|
+
if (!canSwipeLeft && deltaX < 0)
|
|
8222
|
+
newOffset = 0;
|
|
8223
|
+
// Add resistance when exceeding threshold
|
|
8224
|
+
const maxSwipe = swipeThreshold * 1.5;
|
|
8225
|
+
if (Math.abs(newOffset) > swipeThreshold) {
|
|
8226
|
+
const overflow = Math.abs(newOffset) - swipeThreshold;
|
|
8227
|
+
const resistance = overflow * 0.3;
|
|
8228
|
+
newOffset = newOffset > 0
|
|
8229
|
+
? swipeThreshold + resistance
|
|
8230
|
+
: -(swipeThreshold + resistance);
|
|
8231
|
+
newOffset = Math.max(-maxSwipe, Math.min(maxSwipe, newOffset));
|
|
8232
|
+
}
|
|
8233
|
+
setOffsetX(newOffset);
|
|
8234
|
+
// Check for threshold crossing and trigger haptic
|
|
8235
|
+
const newTriggered = Math.abs(newOffset) >= swipeThreshold
|
|
8236
|
+
? (newOffset > 0 ? 'right' : 'left')
|
|
8237
|
+
: null;
|
|
8238
|
+
if (newTriggered !== isTriggered) {
|
|
8239
|
+
if (newTriggered) {
|
|
8240
|
+
triggerHaptic('medium');
|
|
8241
|
+
}
|
|
8242
|
+
setIsTriggered(newTriggered);
|
|
8243
|
+
}
|
|
8244
|
+
}, [isDragging, disabled, isLoading, onSwipeRight, onSwipeLeft, rightAction, leftAction, swipeThreshold, isTriggered, triggerHaptic]);
|
|
8245
|
+
// Handle drag end
|
|
8246
|
+
const handleDragEnd = useCallback(() => {
|
|
8247
|
+
if (!isDragging)
|
|
8248
|
+
return;
|
|
8249
|
+
setIsDragging(false);
|
|
8250
|
+
// Check if action should be triggered
|
|
8251
|
+
if (Math.abs(offsetX) >= swipeThreshold) {
|
|
8252
|
+
if (offsetX > 0 && onSwipeRight && rightAction) {
|
|
8253
|
+
executeAction('right');
|
|
8254
|
+
return;
|
|
8255
|
+
}
|
|
8256
|
+
else if (offsetX < 0 && onSwipeLeft && leftAction) {
|
|
8257
|
+
executeAction('left');
|
|
8258
|
+
return;
|
|
8259
|
+
}
|
|
8260
|
+
}
|
|
8261
|
+
// Snap back
|
|
8262
|
+
setOffsetX(0);
|
|
8263
|
+
setIsTriggered(null);
|
|
8264
|
+
}, [isDragging, offsetX, swipeThreshold, onSwipeRight, onSwipeLeft, rightAction, leftAction, executeAction]);
|
|
8265
|
+
// Touch event handlers
|
|
8266
|
+
const handleTouchStart = (e) => {
|
|
8267
|
+
handleDragStart(e.touches[0].clientX, e.touches[0].clientY);
|
|
8268
|
+
};
|
|
8269
|
+
const handleTouchMove = (e) => {
|
|
8270
|
+
handleDragMove(e.touches[0].clientX, e.touches[0].clientY);
|
|
8271
|
+
// Prevent vertical scroll if horizontal swipe
|
|
8272
|
+
if (isHorizontalSwipe.current === true) {
|
|
8273
|
+
e.preventDefault();
|
|
8274
|
+
}
|
|
8275
|
+
};
|
|
8276
|
+
const handleTouchEnd = () => {
|
|
8277
|
+
handleDragEnd();
|
|
8278
|
+
};
|
|
8279
|
+
// Mouse event handlers (for desktop testing)
|
|
8280
|
+
const handleMouseDown = (e) => {
|
|
8281
|
+
handleDragStart(e.clientX, e.clientY);
|
|
8282
|
+
};
|
|
8283
|
+
useEffect(() => {
|
|
8284
|
+
if (!isDragging)
|
|
8285
|
+
return;
|
|
8286
|
+
const handleMouseMove = (e) => {
|
|
8287
|
+
handleDragMove(e.clientX, e.clientY);
|
|
8288
|
+
};
|
|
8289
|
+
const handleMouseUp = () => {
|
|
8290
|
+
handleDragEnd();
|
|
8291
|
+
};
|
|
8292
|
+
document.addEventListener('mousemove', handleMouseMove);
|
|
8293
|
+
document.addEventListener('mouseup', handleMouseUp);
|
|
8294
|
+
return () => {
|
|
8295
|
+
document.removeEventListener('mousemove', handleMouseMove);
|
|
8296
|
+
document.removeEventListener('mouseup', handleMouseUp);
|
|
8297
|
+
};
|
|
8298
|
+
}, [isDragging, handleDragMove, handleDragEnd]);
|
|
8299
|
+
// Keyboard event handlers
|
|
8300
|
+
const handleKeyDown = useCallback((e) => {
|
|
8301
|
+
if (disabled || isLoading)
|
|
8302
|
+
return;
|
|
8303
|
+
const canSwipeRight = onSwipeRight !== undefined && rightAction !== undefined;
|
|
8304
|
+
const canSwipeLeft = onSwipeLeft !== undefined && leftAction !== undefined;
|
|
8305
|
+
switch (e.key) {
|
|
8306
|
+
case 'ArrowRight':
|
|
8307
|
+
if (canSwipeRight) {
|
|
8308
|
+
e.preventDefault();
|
|
8309
|
+
setKeyboardDirection('right');
|
|
8310
|
+
setOffsetX(swipeThreshold);
|
|
8311
|
+
setIsTriggered('right');
|
|
8312
|
+
triggerHaptic('medium');
|
|
8313
|
+
}
|
|
8314
|
+
break;
|
|
8315
|
+
case 'ArrowLeft':
|
|
8316
|
+
if (canSwipeLeft) {
|
|
8317
|
+
e.preventDefault();
|
|
8318
|
+
setKeyboardDirection('left');
|
|
8319
|
+
setOffsetX(-swipeThreshold);
|
|
8320
|
+
setIsTriggered('left');
|
|
8321
|
+
triggerHaptic('medium');
|
|
8322
|
+
}
|
|
8323
|
+
break;
|
|
8324
|
+
case 'Enter':
|
|
8325
|
+
if (keyboardDirection) {
|
|
8326
|
+
e.preventDefault();
|
|
8327
|
+
executeAction(keyboardDirection);
|
|
8328
|
+
}
|
|
8329
|
+
break;
|
|
8330
|
+
case 'Escape':
|
|
8331
|
+
if (keyboardDirection) {
|
|
8332
|
+
e.preventDefault();
|
|
8333
|
+
setKeyboardDirection(null);
|
|
8334
|
+
setOffsetX(0);
|
|
8335
|
+
setIsTriggered(null);
|
|
8336
|
+
}
|
|
8337
|
+
break;
|
|
8338
|
+
}
|
|
8339
|
+
}, [disabled, isLoading, onSwipeRight, onSwipeLeft, rightAction, leftAction, swipeThreshold, keyboardDirection, executeAction, triggerHaptic]);
|
|
8340
|
+
// Reset keyboard state on blur
|
|
8341
|
+
const handleBlur = useCallback(() => {
|
|
8342
|
+
if (keyboardDirection) {
|
|
8343
|
+
setKeyboardDirection(null);
|
|
8344
|
+
setOffsetX(0);
|
|
8345
|
+
setIsTriggered(null);
|
|
8346
|
+
}
|
|
8347
|
+
}, [keyboardDirection]);
|
|
8348
|
+
// Calculate action opacity based on swipe distance
|
|
8349
|
+
const rightActionOpacity = offsetX > 0 ? Math.min(1, offsetX / swipeThreshold) : 0;
|
|
8350
|
+
const leftActionOpacity = offsetX < 0 ? Math.min(1, Math.abs(offsetX) / swipeThreshold) : 0;
|
|
8351
|
+
// Build aria-label
|
|
8352
|
+
const ariaLabel = [
|
|
8353
|
+
'Swipeable list item.',
|
|
8354
|
+
rightAction && onSwipeRight ? `Swipe right or press Arrow Right to ${rightAction.label}.` : '',
|
|
8355
|
+
leftAction && onSwipeLeft ? `Swipe left or press Arrow Left to ${leftAction.label}.` : '',
|
|
8356
|
+
keyboardDirection ? `Press Enter to confirm or Escape to cancel.` : '',
|
|
8357
|
+
].filter(Boolean).join(' ');
|
|
8358
|
+
return (jsxs("div", { ref: containerRef, className: `relative overflow-hidden ${className}`, children: [rightAction && onSwipeRight && (jsx("div", { className: `
|
|
8359
|
+
absolute inset-y-0 left-0 flex items-center justify-start pl-6
|
|
8360
|
+
${getColorClass(rightAction.color)}
|
|
8361
|
+
transition-opacity duration-100
|
|
8362
|
+
`, style: {
|
|
8363
|
+
opacity: rightActionOpacity,
|
|
8364
|
+
width: Math.abs(offsetX) + 20,
|
|
8365
|
+
}, "aria-hidden": "true", children: jsx("div", { className: `
|
|
8366
|
+
text-white transform transition-transform duration-200
|
|
8367
|
+
${isTriggered === 'right' ? 'scale-125' : 'scale-100'}
|
|
8368
|
+
`, children: isLoading && isTriggered === 'right' ? (jsx(Loader2, { className: "h-6 w-6 animate-spin" })) : (jsx(rightAction.icon, { className: "h-6 w-6" })) }) })), leftAction && onSwipeLeft && (jsx("div", { className: `
|
|
8369
|
+
absolute inset-y-0 right-0 flex items-center justify-end pr-6
|
|
8370
|
+
${getColorClass(leftAction.color)}
|
|
8371
|
+
transition-opacity duration-100
|
|
8372
|
+
`, style: {
|
|
8373
|
+
opacity: leftActionOpacity,
|
|
8374
|
+
width: Math.abs(offsetX) + 20,
|
|
8375
|
+
}, "aria-hidden": "true", children: jsx("div", { className: `
|
|
8376
|
+
text-white transform transition-transform duration-200
|
|
8377
|
+
${isTriggered === 'left' ? 'scale-125' : 'scale-100'}
|
|
8378
|
+
`, children: isLoading && isTriggered === 'left' ? (jsx(Loader2, { className: "h-6 w-6 animate-spin" })) : (jsx(leftAction.icon, { className: "h-6 w-6" })) }) })), jsx("div", { className: `
|
|
8379
|
+
relative bg-white
|
|
8380
|
+
${isDragging ? '' : 'transition-transform duration-200 ease-out'}
|
|
8381
|
+
${disabled ? 'opacity-50 pointer-events-none' : ''}
|
|
8382
|
+
${keyboardDirection ? 'ring-2 ring-accent-500 ring-inset' : ''}
|
|
8383
|
+
`, style: {
|
|
8384
|
+
transform: `translateX(${offsetX}px)`,
|
|
8385
|
+
}, onTouchStart: handleTouchStart, onTouchMove: handleTouchMove, onTouchEnd: handleTouchEnd, onMouseDown: handleMouseDown, onKeyDown: handleKeyDown, onBlur: handleBlur, role: "button", "aria-label": ariaLabel, tabIndex: disabled ? -1 : 0, children: children })] }));
|
|
8386
|
+
}
|
|
8387
|
+
|
|
8099
8388
|
/**
|
|
8100
8389
|
* NotificationBanner - Dismissible banner for important alerts
|
|
8101
8390
|
*
|
|
@@ -58476,5 +58765,5 @@ function Responsive({ mobile, tablet, desktop, }) {
|
|
|
58476
58765
|
return jsx(Fragment, { children: mobile || tablet || desktop });
|
|
58477
58766
|
}
|
|
58478
58767
|
|
|
58479
|
-
export { Accordion, ActionBar, ActionBarCenter, ActionBarLeft, ActionBarRight, ActionButton, AdminModal, Alert, AlertDialog, AppLayout, Autocomplete, Avatar, BREAKPOINTS, Badge, BottomNavigation, BottomNavigationSpacer, BottomSheet, BottomSheetActions, BottomSheetContent, BottomSheetHeader, Box, Breadcrumbs, Button, ButtonGroup, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CardView, Carousel, Checkbox, CheckboxList, Chip, ChipGroup, Collapsible, ColorPicker, Combobox, ComingSoon, CommandPalette, CompactStat, ConfirmDialog, ContextMenu, ControlBar, CurrencyDisplay, CurrencyInput, Dashboard, DashboardContent, DashboardHeader, DataGrid, DataTable, DataTableCardView, DateDisplay, DatePicker, DateRangePicker, DateTimePicker, DesktopOnly, Drawer, DrawerFooter, DropZone, Dropdown, DropdownTrigger, EmptyState, ErrorBoundary, ExpandablePanel, ExpandablePanelContainer, ExpandablePanelSpacer, ExpandableRowButton, ExpandableToolbar, ExpandedRowEditForm, ExportButton, FORMULA_CATEGORIES, FORMULA_DEFINITIONS, FORMULA_NAMES, FieldArray, FileUpload, FilterBar, FilterControls, FilterStatusBanner, FloatingActionButton, Form, FormContext, FormControl, FormWizard, Grid, GridItem, Hide, HorizontalScroll, HoverCard, InfiniteScroll, Input, KanbanBoard, Layout, Loading, LoadingOverlay, Logo, MarkdownEditor, MaskedInput, Menu, MenuDivider, MobileHeader, MobileHeaderSpacer, MobileLayout, MobileOnly, MobileProvider, Modal, ModalFooter, MultiSelect, NotificationBanner, NotificationBar, NotificationBell, NotificationIndicator, NumberInput, Page, PageHeader, PageLayout, PageNavigation, Pagination, PasswordInput, Popover, Progress, PullToRefresh, QueryTransparency, RadioGroup, Rating, Responsive, RichTextEditor, SearchBar, SearchableList, Select, Separator, Show, Sidebar, SidebarGroup, Skeleton, SkeletonCard$1 as SkeletonCard, SkeletonTable, Slider, Spreadsheet, SpreadsheetReport, Stack, StatCard, StatItem, StatsCardGrid, StatsGrid, StatusBadge, StatusBar, StepIndicator, Stepper, SwipeActions, SwipeableCard, Switch, Tabs, TabsContent, TabsList, TabsRoot, TabsTrigger, Text, Textarea, ThemeToggle, TimePicker, Timeline, TimezoneSelector, Toast, ToastContainer, Tooltip, Transfer, TreeView, TwoColumnContent, UserProfileButton, addErrorMessage, addInfoMessage, addSuccessMessage, addWarningMessage, calculateColumnWidth, createActionsSection, createFiltersSection, createMultiSheetExcel, createPageControlsSection, createQueryDetailsSection, exportDataTableToExcel, exportToExcel, formatStatisticValue, formatStatistics, getFormula, getFormulasByCategory, getLocalTimezone, isValidTimezone, loadColumnOrder, loadColumnWidths, reorderArray, saveColumnOrder, saveColumnWidths, searchFormulas, statusManager, useBreadcrumbReset, useBreakpoint, useBreakpointValue, useColumnReorder, useColumnResize, useCommandPalette, useConfirmDialog, useFABScroll, useFormContext, useIsDesktop, useIsMobile, useIsTablet, useIsTouchDevice, useMediaQuery, useMobileContext, useOrientation, usePrefersMobile, useResponsiveCallback, useSafeAreaInsets, useViewportSize, withMobileContext };
|
|
58768
|
+
export { Accordion, ActionBar, ActionBarCenter, ActionBarLeft, ActionBarRight, ActionButton, AdminModal, Alert, AlertDialog, AppLayout, Autocomplete, Avatar, BREAKPOINTS, Badge, BottomNavigation, BottomNavigationSpacer, BottomSheet, BottomSheetActions, BottomSheetContent, BottomSheetHeader, Box, Breadcrumbs, Button, ButtonGroup, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CardView, Carousel, Checkbox, CheckboxList, Chip, ChipGroup, Collapsible, ColorPicker, Combobox, ComingSoon, CommandPalette, CompactStat, ConfirmDialog, ContextMenu, ControlBar, CurrencyDisplay, CurrencyInput, Dashboard, DashboardContent, DashboardHeader, DataGrid, DataTable, DataTableCardView, DateDisplay, DatePicker, DateRangePicker, DateTimePicker, DesktopOnly, Drawer, DrawerFooter, DropZone, Dropdown, DropdownTrigger, EmptyState, ErrorBoundary, ExpandablePanel, ExpandablePanelContainer, ExpandablePanelSpacer, ExpandableRowButton, ExpandableToolbar, ExpandedRowEditForm, ExportButton, FORMULA_CATEGORIES, FORMULA_DEFINITIONS, FORMULA_NAMES, FieldArray, FileUpload, FilterBar, FilterControls, FilterStatusBanner, FloatingActionButton, Form, FormContext, FormControl, FormWizard, Grid, GridItem, Hide, HorizontalScroll, HoverCard, InfiniteScroll, Input, KanbanBoard, Layout, Loading, LoadingOverlay, Logo, MarkdownEditor, MaskedInput, Menu, MenuDivider, MobileHeader, MobileHeaderSpacer, MobileLayout, MobileOnly, MobileProvider, Modal, ModalFooter, MultiSelect, NotificationBanner, NotificationBar, NotificationBell, NotificationIndicator, NumberInput, Page, PageHeader, PageLayout, PageNavigation, Pagination, PasswordInput, Popover, Progress, PullToRefresh, QueryTransparency, RadioGroup, Rating, Responsive, RichTextEditor, SearchBar, SearchableList, Select, Separator, Show, Sidebar, SidebarGroup, Skeleton, SkeletonCard$1 as SkeletonCard, SkeletonTable, Slider, Spreadsheet, SpreadsheetReport, Stack, StatCard, StatItem, StatsCardGrid, StatsGrid, StatusBadge, StatusBar, StepIndicator, Stepper, SwipeActions, SwipeableCard, SwipeableListItem, Switch, Tabs, TabsContent, TabsList, TabsRoot, TabsTrigger, Text, Textarea, ThemeToggle, TimePicker, Timeline, TimezoneSelector, Toast, ToastContainer, Tooltip, Transfer, TreeView, TwoColumnContent, UserProfileButton, addErrorMessage, addInfoMessage, addSuccessMessage, addWarningMessage, calculateColumnWidth, createActionsSection, createFiltersSection, createMultiSheetExcel, createPageControlsSection, createQueryDetailsSection, exportDataTableToExcel, exportToExcel, formatStatisticValue, formatStatistics, getFormula, getFormulasByCategory, getLocalTimezone, isValidTimezone, loadColumnOrder, loadColumnWidths, reorderArray, saveColumnOrder, saveColumnWidths, searchFormulas, statusManager, useBreadcrumbReset, useBreakpoint, useBreakpointValue, useColumnReorder, useColumnResize, useCommandPalette, useConfirmDialog, useFABScroll, useFormContext, useIsDesktop, useIsMobile, useIsTablet, useIsTouchDevice, useMediaQuery, useMobileContext, useOrientation, usePrefersMobile, useResponsiveCallback, useSafeAreaInsets, useViewportSize, withMobileContext };
|
|
58480
58769
|
//# sourceMappingURL=index.esm.js.map
|