@papernote/ui 1.13.0 → 2.0.0

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 (36) hide show
  1. package/dist/components/FilterBar.d.ts +1 -1
  2. package/dist/components/FilterBar.d.ts.map +1 -1
  3. package/dist/components/FilterPills.d.ts +14 -0
  4. package/dist/components/FilterPills.d.ts.map +1 -0
  5. package/dist/components/LetterNav.d.ts +8 -0
  6. package/dist/components/LetterNav.d.ts.map +1 -0
  7. package/dist/components/Pagination.d.ts +11 -1
  8. package/dist/components/Pagination.d.ts.map +1 -1
  9. package/dist/components/index.d.ts +4 -0
  10. package/dist/components/index.d.ts.map +1 -1
  11. package/dist/index.d.ts +36 -4
  12. package/dist/index.esm.js +346 -280
  13. package/dist/index.esm.js.map +1 -1
  14. package/dist/index.js +346 -278
  15. package/dist/index.js.map +1 -1
  16. package/dist/styles.css +6228 -6713
  17. package/package.json +6 -4
  18. package/src/components/AdminModal.tsx +1 -1
  19. package/src/components/Autocomplete.tsx +1 -1
  20. package/src/components/CommandPalette.tsx +2 -2
  21. package/src/components/DataTable.tsx +1 -1
  22. package/src/components/Drawer.tsx +1 -1
  23. package/src/components/FilterBar.tsx +116 -3
  24. package/src/components/FilterPills.tsx +58 -0
  25. package/src/components/LetterNav.tsx +67 -0
  26. package/src/components/MarkdownEditor.tsx +1 -1
  27. package/src/components/MaskedInput.tsx +1 -1
  28. package/src/components/Modal.tsx +1 -1
  29. package/src/components/NotificationBar.tsx +2 -2
  30. package/src/components/Pagination.tsx +49 -1
  31. package/src/components/PasswordInput.tsx +1 -1
  32. package/src/components/SearchBar.tsx +1 -1
  33. package/src/components/Textarea.tsx +1 -1
  34. package/src/components/index.ts +6 -0
  35. package/src/styles/index.css +50 -160
  36. package/src/styles/theme.css +302 -0
package/dist/index.js CHANGED
@@ -1277,7 +1277,7 @@ const Textarea = React.forwardRef(({ label, helperText, validationState, validat
1277
1277
  }
1278
1278
  };
1279
1279
  return (jsxRuntime.jsxs("div", { className: "w-full", children: [label && (jsxRuntime.jsxs("label", { htmlFor: textareaId, className: "label", children: [label, props.required && jsxRuntime.jsx("span", { className: "text-error-500 ml-1", children: "*" })] })), jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx("textarea", { ref: textareaRef, id: textareaId, value: value, maxLength: maxLength, rows: autoExpand ? minRows : rows, enterKeyHint: enterKeyHint, className: `
1280
- block w-full border rounded-lg text-ink-800 placeholder-ink-400
1280
+ block w-full border rounded-lg text-ink-800 placeholder:text-ink-400
1281
1281
  bg-white bg-subtle-grain transition-all duration-200
1282
1282
  focus:outline-none focus:ring-2 ${getResizeClass()}
1283
1283
  disabled:bg-paper-100 disabled:text-ink-400 disabled:cursor-not-allowed disabled:opacity-60
@@ -2719,7 +2719,18 @@ function FilterBar({ filters, values, onChange, className = '', onClear, showCle
2719
2719
  // Default clear: set all values to null/empty
2720
2720
  const clearedValues = {};
2721
2721
  filters.forEach(filter => {
2722
- clearedValues[filter.key] = filter.type === 'text' ? '' : null;
2722
+ if (filter.type === 'text' || filter.type === 'search') {
2723
+ clearedValues[filter.key] = '';
2724
+ }
2725
+ else if (filter.type === 'dateRange') {
2726
+ clearedValues[filter.key] = { from: undefined, to: undefined };
2727
+ }
2728
+ else if (filter.type === 'multiSelect') {
2729
+ clearedValues[filter.key] = [];
2730
+ }
2731
+ else {
2732
+ clearedValues[filter.key] = null;
2733
+ }
2723
2734
  });
2724
2735
  onChange(clearedValues);
2725
2736
  }
@@ -2751,6 +2762,38 @@ function FilterBar({ filters, values, onChange, className = '', onClear, showCle
2751
2762
  ];
2752
2763
  return (jsxRuntime.jsx(Select, { options: boolOptions, value: value === null || value === undefined ? '' : String(value), onChange: (newValue) => handleFilterChange(filter.key, newValue === '' ? null : newValue === 'true') }));
2753
2764
  }
2765
+ case 'search':
2766
+ return (jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none", children: jsxRuntime.jsx(lucideReact.Search, { className: "h-4 w-4 text-ink-400" }) }), jsxRuntime.jsx("input", { type: "text", placeholder: filter.placeholder || `Search ${filter.label}...`, value: value || '', onChange: (e) => handleFilterChange(filter.key, e.target.value), className: "input pl-9" })] }));
2767
+ case 'dateRange': {
2768
+ const rangeValue = value || {};
2769
+ return (jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("input", { type: "date", value: rangeValue.from || '', onChange: (e) => handleFilterChange(filter.key, { ...rangeValue, from: e.target.value || undefined }), className: "input text-sm", "aria-label": `${filter.label} from` }), jsxRuntime.jsx("span", { className: "text-ink-400 text-xs", children: "to" }), jsxRuntime.jsx("input", { type: "date", value: rangeValue.to || '', onChange: (e) => handleFilterChange(filter.key, { ...rangeValue, to: e.target.value || undefined }), className: "input text-sm", "aria-label": `${filter.label} to` })] }));
2770
+ }
2771
+ case 'toggle': {
2772
+ const toggleOptions = [
2773
+ { value: '', label: 'All' },
2774
+ { value: 'true', label: 'Yes' },
2775
+ { value: 'false', label: 'No' },
2776
+ ];
2777
+ const currentVal = value === null || value === undefined ? '' : String(value);
2778
+ return (jsxRuntime.jsx("div", { className: "flex rounded-lg border border-paper-300 overflow-hidden", role: "group", children: toggleOptions.map((opt) => (jsxRuntime.jsx("button", { type: "button", onClick: () => handleFilterChange(filter.key, opt.value === '' ? null : opt.value === 'true'), className: `px-3 py-1.5 text-xs font-medium transition-colors ${currentVal === opt.value
2779
+ ? 'bg-accent-500 text-white'
2780
+ : 'bg-white text-ink-600 hover:bg-paper-50'} ${opt.value !== '' ? 'border-l border-paper-300' : ''}`, children: opt.label }, opt.value))) }));
2781
+ }
2782
+ case 'multiSelect': {
2783
+ const selectedValues = Array.isArray(value) ? value : [];
2784
+ const msOptions = filter.options || [];
2785
+ return (jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx(Select, { options: [{ value: '', label: `All ${filter.label}` }, ...msOptions.map(o => ({ value: String(o.value), label: o.label }))], value: "", onChange: (newValue) => {
2786
+ if (!newValue) {
2787
+ handleFilterChange(filter.key, []);
2788
+ }
2789
+ else if (!selectedValues.includes(newValue)) {
2790
+ handleFilterChange(filter.key, [...selectedValues, newValue]);
2791
+ }
2792
+ } }), selectedValues.length > 0 && (jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1 mt-1", children: selectedValues.map((sv) => {
2793
+ const opt = msOptions.find(o => String(o.value) === sv);
2794
+ return (jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 px-2 py-0.5 text-xs bg-accent-100 text-accent-700 rounded-full", children: [opt?.label || sv, jsxRuntime.jsx("button", { type: "button", onClick: () => handleFilterChange(filter.key, selectedValues.filter(v => v !== sv)), className: "hover:text-accent-900", children: jsxRuntime.jsx(lucideReact.X, { className: "h-3 w-3" }) })] }, sv));
2795
+ }) }))] }));
2796
+ }
2754
2797
  default:
2755
2798
  return null;
2756
2799
  }
@@ -2760,6 +2803,237 @@ function FilterBar({ filters, values, onChange, className = '', onClear, showCle
2760
2803
  return (jsxRuntime.jsx("div", { className: `bg-white bg-subtle-grain border border-paper-200 rounded-lg shadow-sm p-4 ${className}`, children: jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 flex-wrap", children: [jsxRuntime.jsx("div", { className: "flex-1 flex flex-wrap gap-4", children: filters.map((filter) => (jsxRuntime.jsxs("div", { className: "flex flex-col space-y-1 min-w-[200px]", children: [jsxRuntime.jsx("label", { className: "label", children: filter.label }), renderFilter(filter)] }, filter.key))) }), showClearButton && (jsxRuntime.jsx("div", { className: "flex items-end", children: jsxRuntime.jsx(Button, { variant: "ghost", size: "md", onClick: handleClear, icon: jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" }), iconPosition: "left", children: "Clear" }) }))] }) }));
2761
2804
  }
2762
2805
 
2806
+ const variantClasses$4 = {
2807
+ primary: {
2808
+ default: 'bg-primary-100 text-primary-700 border-primary-200',
2809
+ hover: 'hover:bg-primary-200',
2810
+ close: 'hover:bg-primary-300 text-primary-600',
2811
+ selected: 'bg-primary-200 border-primary-400 ring-2 ring-primary-300',
2812
+ },
2813
+ secondary: {
2814
+ default: 'bg-ink-100 text-ink-700 border-ink-200',
2815
+ hover: 'hover:bg-ink-200',
2816
+ close: 'hover:bg-ink-300 text-ink-600',
2817
+ selected: 'bg-ink-200 border-ink-400 ring-2 ring-ink-300',
2818
+ },
2819
+ success: {
2820
+ default: 'bg-success-100 text-success-700 border-success-200',
2821
+ hover: 'hover:bg-success-200',
2822
+ close: 'hover:bg-success-300 text-success-600',
2823
+ selected: 'bg-success-200 border-success-400 ring-2 ring-success-300',
2824
+ },
2825
+ warning: {
2826
+ default: 'bg-warning-100 text-warning-700 border-warning-200',
2827
+ hover: 'hover:bg-warning-200',
2828
+ close: 'hover:bg-warning-300 text-warning-600',
2829
+ selected: 'bg-warning-200 border-warning-400 ring-2 ring-warning-300',
2830
+ },
2831
+ error: {
2832
+ default: 'bg-error-100 text-error-700 border-error-200',
2833
+ hover: 'hover:bg-error-200',
2834
+ close: 'hover:bg-error-300 text-error-600',
2835
+ selected: 'bg-error-200 border-error-400 ring-2 ring-error-300',
2836
+ },
2837
+ info: {
2838
+ default: 'bg-accent-100 text-accent-700 border-accent-200',
2839
+ hover: 'hover:bg-accent-200',
2840
+ close: 'hover:bg-accent-300 text-accent-600',
2841
+ selected: 'bg-accent-200 border-accent-400 ring-2 ring-accent-300',
2842
+ },
2843
+ };
2844
+ const sizeClasses$b = {
2845
+ sm: {
2846
+ container: 'h-6 px-2 text-xs gap-1',
2847
+ icon: 'h-3 w-3',
2848
+ close: 'h-3 w-3 ml-1',
2849
+ },
2850
+ md: {
2851
+ container: 'h-7 px-2.5 text-sm gap-1.5',
2852
+ icon: 'h-3.5 w-3.5',
2853
+ close: 'h-3.5 w-3.5 ml-1.5',
2854
+ },
2855
+ lg: {
2856
+ container: 'h-8 px-3 text-base gap-2',
2857
+ icon: 'h-4 w-4',
2858
+ close: 'h-4 w-4 ml-2',
2859
+ },
2860
+ };
2861
+ const gapClasses = {
2862
+ xs: 'gap-1',
2863
+ sm: 'gap-1.5',
2864
+ md: 'gap-2',
2865
+ lg: 'gap-3',
2866
+ };
2867
+ /**
2868
+ * Chip - Compact element for displaying values with optional remove functionality
2869
+ *
2870
+ * @example Basic chip
2871
+ * ```tsx
2872
+ * <Chip>Tag Name</Chip>
2873
+ * ```
2874
+ *
2875
+ * @example Removable chip
2876
+ * ```tsx
2877
+ * <Chip onClose={() => removeTag(tag)}>
2878
+ * {tag.name}
2879
+ * </Chip>
2880
+ * ```
2881
+ *
2882
+ * @example With icon and selected state
2883
+ * ```tsx
2884
+ * <Chip
2885
+ * icon={<Star className="h-3 w-3" />}
2886
+ * selected={isSelected}
2887
+ * onClick={() => toggleSelection()}
2888
+ * >
2889
+ * Favorite
2890
+ * </Chip>
2891
+ * ```
2892
+ */
2893
+ function Chip({ children, variant = 'secondary', size = 'md', onClose, icon, disabled = false, className = '', onClick, selected = false, maxWidth, chipKey, }) {
2894
+ const variantStyle = variantClasses$4[variant];
2895
+ const sizeStyle = sizeClasses$b[size];
2896
+ const isClickable = !disabled && (onClick || onClose);
2897
+ return (jsxRuntime.jsxs("div", { className: `
2898
+ inline-flex items-center rounded-full border font-medium
2899
+ transition-colors
2900
+ ${selected ? variantStyle.selected : variantStyle.default}
2901
+ ${isClickable && !disabled && !selected ? variantStyle.hover : ''}
2902
+ ${sizeStyle.container}
2903
+ ${disabled ? 'opacity-50 cursor-not-allowed' : ''}
2904
+ ${onClick && !disabled ? 'cursor-pointer' : ''}
2905
+ ${className}
2906
+ `, onClick: onClick && !disabled ? onClick : undefined, role: onClick ? 'button' : undefined, "aria-disabled": disabled, "aria-pressed": onClick ? selected : undefined, "data-chip-key": chipKey, style: { maxWidth: maxWidth || undefined }, children: [icon && (jsxRuntime.jsx("span", { className: `flex-shrink-0 ${sizeStyle.icon}`, children: icon })), jsxRuntime.jsx("span", { className: "truncate", children: children }), onClose && (jsxRuntime.jsx("button", { type: "button", onClick: (e) => {
2907
+ e.stopPropagation();
2908
+ if (!disabled)
2909
+ onClose();
2910
+ }, disabled: disabled, className: `
2911
+ flex-shrink-0 rounded-full transition-colors
2912
+ ${variantStyle.close}
2913
+ ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}
2914
+ ${sizeStyle.close}
2915
+ `, "aria-label": "Remove", children: jsxRuntime.jsx(lucideReact.X, { className: "w-full h-full" }) }))] }));
2916
+ }
2917
+ /**
2918
+ * ChipGroup - Container for multiple chips with layout and selection support
2919
+ *
2920
+ * @example Basic group
2921
+ * ```tsx
2922
+ * <ChipGroup wrap gap="sm">
2923
+ * {tags.map(tag => (
2924
+ * <Chip key={tag.id} onClose={() => removeTag(tag)}>
2925
+ * {tag.name}
2926
+ * </Chip>
2927
+ * ))}
2928
+ * </ChipGroup>
2929
+ * ```
2930
+ *
2931
+ * @example Selectable group (single)
2932
+ * ```tsx
2933
+ * <ChipGroup
2934
+ * selectionMode="single"
2935
+ * selectedKeys={[selectedCategory]}
2936
+ * onSelectionChange={(keys) => setSelectedCategory(keys[0])}
2937
+ * >
2938
+ * <Chip chipKey="all">All</Chip>
2939
+ * <Chip chipKey="active">Active</Chip>
2940
+ * <Chip chipKey="archived">Archived</Chip>
2941
+ * </ChipGroup>
2942
+ * ```
2943
+ *
2944
+ * @example Multi-select group
2945
+ * ```tsx
2946
+ * <ChipGroup
2947
+ * selectionMode="multiple"
2948
+ * selectedKeys={selectedTags}
2949
+ * onSelectionChange={setSelectedTags}
2950
+ * wrap
2951
+ * >
2952
+ * {availableTags.map(tag => (
2953
+ * <Chip key={tag} chipKey={tag}>{tag}</Chip>
2954
+ * ))}
2955
+ * </ChipGroup>
2956
+ * ```
2957
+ */
2958
+ function ChipGroup({ children, direction = 'horizontal', wrap = false, gap = 'sm', selectionMode = 'none', selectedKeys = [], onSelectionChange, className = '', }) {
2959
+ const handleChipClick = (chipKey) => {
2960
+ if (selectionMode === 'none' || !onSelectionChange)
2961
+ return;
2962
+ if (selectionMode === 'single') {
2963
+ // Toggle single selection
2964
+ if (selectedKeys.includes(chipKey)) {
2965
+ onSelectionChange([]);
2966
+ }
2967
+ else {
2968
+ onSelectionChange([chipKey]);
2969
+ }
2970
+ }
2971
+ else if (selectionMode === 'multiple') {
2972
+ // Toggle in array
2973
+ if (selectedKeys.includes(chipKey)) {
2974
+ onSelectionChange(selectedKeys.filter(k => k !== chipKey));
2975
+ }
2976
+ else {
2977
+ onSelectionChange([...selectedKeys, chipKey]);
2978
+ }
2979
+ }
2980
+ };
2981
+ // Clone children to inject selection props
2982
+ const enhancedChildren = React.Children.map(children, (child) => {
2983
+ if (!React.isValidElement(child))
2984
+ return child;
2985
+ const chipKey = child.props.chipKey;
2986
+ if (!chipKey || selectionMode === 'none')
2987
+ return child;
2988
+ const isSelected = selectedKeys.includes(chipKey);
2989
+ return React.cloneElement(child, {
2990
+ ...child.props,
2991
+ selected: isSelected,
2992
+ onClick: () => {
2993
+ // Call original onClick if exists
2994
+ if (child.props.onClick) {
2995
+ child.props.onClick();
2996
+ }
2997
+ handleChipClick(chipKey);
2998
+ },
2999
+ });
3000
+ });
3001
+ return (jsxRuntime.jsx("div", { className: `
3002
+ flex
3003
+ ${direction === 'vertical' ? 'flex-col' : 'flex-row'}
3004
+ ${wrap ? 'flex-wrap' : ''}
3005
+ ${gapClasses[gap]}
3006
+ ${className}
3007
+ `, role: selectionMode !== 'none' ? 'group' : undefined, "aria-label": selectionMode !== 'none' ? 'Chip selection group' : undefined, children: enhancedChildren }));
3008
+ }
3009
+
3010
+ function FilterPills({ pills, onRemove, onClearAll, totalCount, className = '', }) {
3011
+ if (pills.length === 0)
3012
+ return null;
3013
+ return (jsxRuntime.jsxs("div", { className: `flex items-center gap-2 px-4 py-2 border-b border-paper-200 bg-paper-50 ${className}`, children: [jsxRuntime.jsx(lucideReact.Filter, { className: "h-3.5 w-3.5 text-ink-400 shrink-0" }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 flex-wrap flex-1", children: [pills.map((pill) => (jsxRuntime.jsxs(Chip, { size: "sm", variant: "primary", onClose: () => onRemove(pill.key), children: [pill.label, ": ", pill.displayValue] }, pill.key))), pills.length >= 2 && (jsxRuntime.jsx("button", { type: "button", onClick: onClearAll, className: "text-xs text-ink-500 hover:text-ink-700 underline underline-offset-2 ml-1", children: "Clear all" }))] }), totalCount !== undefined && (jsxRuntime.jsxs("span", { className: "text-xs text-ink-500 shrink-0 tabular-nums", children: [totalCount.toLocaleString(), " ", totalCount === 1 ? 'record' : 'records'] }))] }));
3014
+ }
3015
+
3016
+ const LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
3017
+ function LetterNav({ activeLetter, onChange, availableLetters, className = '', }) {
3018
+ const hasAvailability = availableLetters && availableLetters.length > 0;
3019
+ const availableSet = hasAvailability
3020
+ ? new Set(availableLetters.map((l) => l.toUpperCase()))
3021
+ : null;
3022
+ return (jsxRuntime.jsxs("div", { className: `flex items-center gap-0.5 px-4 py-1.5 border-b border-paper-200 bg-white overflow-x-auto ${className}`, children: [jsxRuntime.jsx("button", { type: "button", onClick: () => onChange(null), className: `px-2 py-1 text-xs font-medium rounded transition-colors ${activeLetter === null
3023
+ ? 'bg-accent-500 text-white'
3024
+ : 'text-ink-600 hover:bg-paper-100'}`, children: "All" }), LETTERS.map((letter) => {
3025
+ const isActive = activeLetter === letter;
3026
+ const isAvailable = !availableSet || availableSet.has(letter);
3027
+ return (jsxRuntime.jsx("button", { type: "button", onClick: () => onChange(isActive ? null : letter), className: `w-7 h-7 text-xs font-medium rounded transition-colors ${isActive
3028
+ ? 'bg-accent-500 text-white'
3029
+ : isAvailable
3030
+ ? 'text-ink-600 hover:bg-paper-100'
3031
+ : 'text-ink-300'}`, children: letter }, letter));
3032
+ }), jsxRuntime.jsx("button", { type: "button", onClick: () => onChange(activeLetter === '#' ? null : '#'), className: `px-2 py-1 text-xs font-medium rounded transition-colors ${activeLetter === '#'
3033
+ ? 'bg-accent-500 text-white'
3034
+ : 'text-ink-600 hover:bg-paper-100'}`, children: "#" })] }));
3035
+ }
3036
+
2763
3037
  function Loading({ variant = 'spinner', size = 'md', text }) {
2764
3038
  const sizeClasses = {
2765
3039
  sm: 'h-4 w-4',
@@ -4610,7 +4884,7 @@ function BottomSheetActions({ children, className = '' }) {
4610
4884
 
4611
4885
  // Selector for all focusable elements
4612
4886
  const FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
4613
- const sizeClasses$b = {
4887
+ const sizeClasses$a = {
4614
4888
  sm: 'max-w-md',
4615
4889
  md: 'max-w-lg',
4616
4890
  lg: 'max-w-2xl',
@@ -4799,7 +5073,7 @@ function Modal({ isOpen, onClose, title, children, size = 'md', showCloseButton
4799
5073
  return reactDom.createPortal(jsxRuntime.jsx(BottomSheet, { isOpen: isOpen, onClose: onClose, title: title, height: mobileHeight, showHandle: mobileShowHandle, showCloseButton: showCloseButton, children: children }), document.body);
4800
5074
  }
4801
5075
  // Render as standard modal on desktop
4802
- const modalContent = (jsxRuntime.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-ink-900 bg-opacity-50 backdrop-blur-sm animate-fade-in", onMouseDown: handleBackdropMouseDown, onClick: handleBackdropClick, children: jsxRuntime.jsxs("div", { ref: modalRef, className: `${sizeClasses$b[size]} w-full bg-white bg-subtle-grain rounded-xl shadow-2xl border border-paper-200 ${getAnimationClass()}`, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-paper-200", children: [jsxRuntime.jsx("h3", { id: titleId, className: "text-lg font-medium text-ink-900", children: title }), showCloseButton && (jsxRuntime.jsx("button", { onClick: onClose, className: "text-ink-400 hover:text-ink-600 transition-colors", "aria-label": "Close modal", children: jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) }))] }), jsxRuntime.jsx("div", { className: `px-6 py-4 ${scrollable || maxHeight ? 'overflow-y-auto' : ''}`, style: {
5076
+ const modalContent = (jsxRuntime.jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center p-4 bg-ink-900/50 backdrop-blur-sm animate-fade-in", onMouseDown: handleBackdropMouseDown, onClick: handleBackdropClick, children: jsxRuntime.jsxs("div", { ref: modalRef, className: `${sizeClasses$a[size]} w-full bg-white bg-subtle-grain rounded-xl shadow-2xl border border-paper-200 ${getAnimationClass()}`, role: "dialog", "aria-modal": "true", "aria-labelledby": titleId, tabIndex: -1, children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-paper-200", children: [jsxRuntime.jsx("h3", { id: titleId, className: "text-lg font-medium text-ink-900", children: title }), showCloseButton && (jsxRuntime.jsx("button", { onClick: onClose, className: "text-ink-400 hover:text-ink-600 transition-colors", "aria-label": "Close modal", children: jsxRuntime.jsx(lucideReact.X, { className: "h-5 w-5" }) }))] }), jsxRuntime.jsx("div", { className: `px-6 py-4 ${scrollable || maxHeight ? 'overflow-y-auto' : ''}`, style: {
4803
5077
  maxHeight: maxHeight || (scrollable ? 'calc(100vh - 200px)' : undefined),
4804
5078
  }, children: children })] }) }));
4805
5079
  return reactDom.createPortal(modalContent, document.body);
@@ -5870,7 +6144,7 @@ function Alert({ variant = 'info', title, children, onClose, className = '', act
5870
6144
  return (jsxRuntime.jsx("div", { className: `rounded-lg border p-4 ${styles.container} ${className}`, role: "alert", children: jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("div", { className: "flex-shrink-0 mt-0.5", children: styles.icon }), jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [title && jsxRuntime.jsx("h4", { className: "text-sm font-medium mb-1", children: title }), jsxRuntime.jsx("div", { className: "text-sm", children: children }), actions.length > 0 && (jsxRuntime.jsx("div", { className: "flex gap-2 mt-3", children: actions.map((action, index) => (jsxRuntime.jsx("button", { onClick: action.onClick, className: getButtonStyles(action.variant), children: action.label }, index))) }))] }), onClose && (jsxRuntime.jsx("button", { onClick: onClose, className: "flex-shrink-0 text-current opacity-70 hover:opacity-100 transition-opacity", "aria-label": "Close alert", children: jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" }) }))] }) }));
5871
6145
  }
5872
6146
 
5873
- const sizeClasses$a = {
6147
+ const sizeClasses$9 = {
5874
6148
  left: {
5875
6149
  sm: 'w-64',
5876
6150
  md: 'w-96',
@@ -5947,9 +6221,9 @@ function Drawer({ isOpen, onClose, title, children, placement = 'right', size =
5947
6221
  if (!isOpen)
5948
6222
  return null;
5949
6223
  const isHorizontal = placement === 'left' || placement === 'right';
5950
- return (jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex", children: [showOverlay && (jsxRuntime.jsx("div", { className: "fixed inset-0 bg-ink-900 bg-opacity-50 backdrop-blur-sm animate-fade-in", onClick: handleOverlayClick, "aria-hidden": "true" })), jsxRuntime.jsxs("div", { className: `
6224
+ return (jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex", children: [showOverlay && (jsxRuntime.jsx("div", { className: "fixed inset-0 bg-ink-900/50 backdrop-blur-sm animate-fade-in", onClick: handleOverlayClick, "aria-hidden": "true" })), jsxRuntime.jsxs("div", { className: `
5951
6225
  fixed ${placementClasses[placement]}
5952
- ${sizeClasses$a[placement][size]}
6226
+ ${sizeClasses$9[placement][size]}
5953
6227
  bg-white border-paper-200 shadow-2xl
5954
6228
  ${isHorizontal ? 'border-r' : 'border-b'}
5955
6229
  ${animationClasses[placement].enter}
@@ -6091,14 +6365,14 @@ function useConfirmDialog() {
6091
6365
  };
6092
6366
  }
6093
6367
 
6094
- const sizeClasses$9 = {
6368
+ const sizeClasses$8 = {
6095
6369
  sm: 'h-3.5 w-3.5',
6096
6370
  md: 'h-4 w-4',
6097
6371
  lg: 'h-5 w-5',
6098
6372
  };
6099
6373
  function HelpTooltip({ content, icon = 'help', size = 'md', position = 'top', className = '', }) {
6100
6374
  const IconComponent = icon === 'info' ? lucideReact.Info : lucideReact.HelpCircle;
6101
- return (jsxRuntime.jsx(Tooltip, { content: content, position: position, children: jsxRuntime.jsx("span", { className: `inline-flex items-center justify-center text-ink-400 hover:text-ink-600 cursor-help transition-colors ${className}`, role: "button", "aria-label": "Help", tabIndex: 0, children: jsxRuntime.jsx(IconComponent, { className: sizeClasses$9[size] }) }) }));
6375
+ return (jsxRuntime.jsx(Tooltip, { content: content, position: position, children: jsxRuntime.jsx("span", { className: `inline-flex items-center justify-center text-ink-400 hover:text-ink-600 cursor-help transition-colors ${className}`, role: "button", "aria-label": "Help", tabIndex: 0, children: jsxRuntime.jsx(IconComponent, { className: sizeClasses$8[size] }) }) }));
6102
6376
  }
6103
6377
 
6104
6378
  /**
@@ -6500,10 +6774,10 @@ function CommandPalette({ commands, open, onOpenChange, placeholder = 'Type a co
6500
6774
  };
6501
6775
  if (!open)
6502
6776
  return null;
6503
- return reactDom.createPortal(jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex items-start justify-center pt-[20vh] animate-fade-in", children: [jsxRuntime.jsx("div", { className: "absolute inset-0 bg-ink-900 bg-opacity-50 backdrop-blur-sm", onClick: () => onOpenChange(false) }), jsxRuntime.jsxs("div", { className: "relative w-full max-w-2xl mx-4 bg-white rounded-xl shadow-2xl border border-paper-200 overflow-hidden animate-scale-in", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3 px-4 py-3 border-b border-paper-200", children: [jsxRuntime.jsx(lucideReact.Search, { className: "h-5 w-5 text-ink-400" }), jsxRuntime.jsx("input", { ref: inputRef, type: "text", value: searchQuery, onChange: (e) => {
6777
+ return reactDom.createPortal(jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 flex items-start justify-center pt-[20vh] animate-fade-in", children: [jsxRuntime.jsx("div", { className: "absolute inset-0 bg-ink-900/50 backdrop-blur-sm", onClick: () => onOpenChange(false) }), jsxRuntime.jsxs("div", { className: "relative w-full max-w-2xl mx-4 bg-white rounded-xl shadow-2xl border border-paper-200 overflow-hidden animate-scale-in", children: [jsxRuntime.jsxs("div", { className: "flex items-center gap-3 px-4 py-3 border-b border-paper-200", children: [jsxRuntime.jsx(lucideReact.Search, { className: "h-5 w-5 text-ink-400" }), jsxRuntime.jsx("input", { ref: inputRef, type: "text", value: searchQuery, onChange: (e) => {
6504
6778
  setSearchQuery(e.target.value);
6505
6779
  setSelectedIndex(0);
6506
- }, placeholder: placeholder, className: "flex-1 text-base text-ink-900 placeholder-ink-400 bg-transparent border-none outline-none" }), trigger && (jsxRuntime.jsx("kbd", { className: "hidden sm:inline-block px-2 py-1 text-xs font-mono text-ink-500 bg-paper-100 border border-paper-300 rounded", children: trigger }))] }), jsxRuntime.jsx("div", { ref: listRef, className: "max-h-[400px] overflow-y-auto py-2", children: flatCommands.length === 0 ? (jsxRuntime.jsx("div", { className: "px-4 py-8 text-center text-sm text-ink-500", children: "No commands found" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [Object.entries(grouped).map(([groupName, groupCommands]) => (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "px-4 py-1.5 text-xs font-semibold text-ink-500 uppercase tracking-wider", children: groupName }), groupCommands.map((command) => {
6780
+ }, placeholder: placeholder, className: "flex-1 text-base text-ink-900 placeholder:text-ink-400 bg-transparent border-none outline-none" }), trigger && (jsxRuntime.jsx("kbd", { className: "hidden sm:inline-block px-2 py-1 text-xs font-mono text-ink-500 bg-paper-100 border border-paper-300 rounded", children: trigger }))] }), jsxRuntime.jsx("div", { ref: listRef, className: "max-h-[400px] overflow-y-auto py-2", children: flatCommands.length === 0 ? (jsxRuntime.jsx("div", { className: "px-4 py-8 text-center text-sm text-ink-500", children: "No commands found" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [Object.entries(grouped).map(([groupName, groupCommands]) => (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("div", { className: "px-4 py-1.5 text-xs font-semibold text-ink-500 uppercase tracking-wider", children: groupName }), groupCommands.map((command) => {
6507
6781
  const globalIndex = flatCommands.indexOf(command);
6508
6782
  const isSelected = globalIndex === selectedIndex;
6509
6783
  return (jsxRuntime.jsxs("button", { "data-index": globalIndex, onClick: () => executeCommand(command), onMouseEnter: () => setSelectedIndex(globalIndex), className: `
@@ -7445,7 +7719,7 @@ const PasswordInput = React.forwardRef(({ value, onChange, label, placeholder =
7445
7719
  }, [value, requirements]);
7446
7720
  return (jsxRuntime.jsxs("div", { className: className, children: [label && (jsxRuntime.jsxs("label", { className: "block text-sm font-medium text-ink-900 mb-1.5", children: [label, required && jsxRuntime.jsx("span", { className: "text-error-500 ml-1", children: "*" })] })), jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsx("input", { ref: inputRef, type: showPassword ? 'text' : 'password', value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, className: `
7447
7721
  w-full px-3 py-2 pr-10
7448
- text-sm text-ink-900 placeholder-ink-400
7722
+ text-sm text-ink-900 placeholder:text-ink-400
7449
7723
  bg-white border rounded-lg
7450
7724
  focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400
7451
7725
  disabled:bg-paper-100 disabled:cursor-not-allowed
@@ -7554,7 +7828,7 @@ const MaskedInput = React.forwardRef(({ value, onChange, maskType = 'phone', cus
7554
7828
  };
7555
7829
  return (jsxRuntime.jsxs("div", { className: className, children: [label && (jsxRuntime.jsxs("label", { className: "block text-sm font-medium text-ink-900 mb-1.5", children: [label, required && jsxRuntime.jsx("span", { className: "text-error-500 ml-1", children: "*" })] })), jsxRuntime.jsx("input", { ref: inputRef, type: "text", value: displayValue, onChange: handleChange, onPaste: handlePaste, placeholder: getPlaceholder(), disabled: disabled, className: `
7556
7830
  w-full px-3 py-2
7557
- text-sm text-ink-900 placeholder-ink-400
7831
+ text-sm text-ink-900 placeholder:text-ink-400
7558
7832
  bg-white border rounded-lg
7559
7833
  focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400
7560
7834
  disabled:bg-paper-100 disabled:cursor-not-allowed
@@ -7769,7 +8043,7 @@ const Autocomplete = React.forwardRef(({ value, onChange, options = [], onSearch
7769
8043
  }
7770
8044
  }, placeholder: placeholder, disabled: disabled, className: `
7771
8045
  w-full pl-9 pr-9 py-2
7772
- text-sm text-ink-900 placeholder-ink-400
8046
+ text-sm text-ink-900 placeholder:text-ink-400
7773
8047
  bg-white border rounded-lg
7774
8048
  focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400
7775
8049
  disabled:bg-paper-100 disabled:cursor-not-allowed
@@ -8329,7 +8603,7 @@ function MarkdownEditor({ value, onChange, label, placeholder = '# Start writing
8329
8603
  : 'text-ink-600 hover:bg-white/50'}
8330
8604
  `, children: "Split" })] }))] }), showHelp && (jsxRuntime.jsxs("button", { type: "button", onClick: () => setShowHelpPanel(!showHelpPanel), className: "flex items-center gap-1 px-2 py-1 text-xs text-ink-600 hover:text-ink-900 transition-colors", children: [jsxRuntime.jsx(lucideReact.Info, { className: "h-3.5 w-3.5" }), "Markdown Help"] }))] }), showHelpPanel && (jsxRuntime.jsx("div", { className: "p-3 border border-b-0 border-paper-300 bg-accent-50 text-xs", children: jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-2", children: helpContent.map((item, index) => (jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsx("code", { className: "px-2 py-0.5 bg-white rounded text-ink-900 font-mono", children: item.syntax }), jsxRuntime.jsx("span", { className: "text-ink-600", children: item.description })] }, index))) }) })), jsxRuntime.jsxs("div", { className: `flex border border-paper-300 rounded-b-lg overflow-hidden ${mode === 'split' ? '' : ''}`, children: [(mode === 'edit' || mode === 'split') && (jsxRuntime.jsx("div", { className: `${mode === 'split' ? 'w-1/2 border-r border-paper-300' : 'w-full'}`, children: jsxRuntime.jsx("textarea", { value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, disabled: disabled, className: `
8331
8605
  w-full p-3 outline-none resize-none
8332
- text-sm text-ink-900 font-mono placeholder-ink-400
8606
+ text-sm text-ink-900 font-mono placeholder:text-ink-400
8333
8607
  ${disabled ? 'bg-paper-100 cursor-not-allowed' : 'bg-white'}
8334
8608
  `, style: { minHeight, maxHeight } }) })), (mode === 'preview' || mode === 'split') && (jsxRuntime.jsx("div", { className: `${mode === 'split' ? 'w-1/2' : 'w-full'} overflow-y-auto bg-white`, children: jsxRuntime.jsx("div", { className: "p-3 prose prose-sm max-w-none", style: { minHeight, maxHeight }, dangerouslySetInnerHTML: { __html: markdownToHtml(value) } }) }))] }), jsxRuntime.jsx("style", { children: `
8335
8609
  .prose h1 { font-size: 1.875rem; font-weight: 700; margin-bottom: 1rem; }
@@ -8476,210 +8750,6 @@ function MenuDivider() {
8476
8750
  return { divider: true, id: `divider-${Date.now()}`, label: '' };
8477
8751
  }
8478
8752
 
8479
- const variantClasses$4 = {
8480
- primary: {
8481
- default: 'bg-primary-100 text-primary-700 border-primary-200',
8482
- hover: 'hover:bg-primary-200',
8483
- close: 'hover:bg-primary-300 text-primary-600',
8484
- selected: 'bg-primary-200 border-primary-400 ring-2 ring-primary-300',
8485
- },
8486
- secondary: {
8487
- default: 'bg-ink-100 text-ink-700 border-ink-200',
8488
- hover: 'hover:bg-ink-200',
8489
- close: 'hover:bg-ink-300 text-ink-600',
8490
- selected: 'bg-ink-200 border-ink-400 ring-2 ring-ink-300',
8491
- },
8492
- success: {
8493
- default: 'bg-success-100 text-success-700 border-success-200',
8494
- hover: 'hover:bg-success-200',
8495
- close: 'hover:bg-success-300 text-success-600',
8496
- selected: 'bg-success-200 border-success-400 ring-2 ring-success-300',
8497
- },
8498
- warning: {
8499
- default: 'bg-warning-100 text-warning-700 border-warning-200',
8500
- hover: 'hover:bg-warning-200',
8501
- close: 'hover:bg-warning-300 text-warning-600',
8502
- selected: 'bg-warning-200 border-warning-400 ring-2 ring-warning-300',
8503
- },
8504
- error: {
8505
- default: 'bg-error-100 text-error-700 border-error-200',
8506
- hover: 'hover:bg-error-200',
8507
- close: 'hover:bg-error-300 text-error-600',
8508
- selected: 'bg-error-200 border-error-400 ring-2 ring-error-300',
8509
- },
8510
- info: {
8511
- default: 'bg-accent-100 text-accent-700 border-accent-200',
8512
- hover: 'hover:bg-accent-200',
8513
- close: 'hover:bg-accent-300 text-accent-600',
8514
- selected: 'bg-accent-200 border-accent-400 ring-2 ring-accent-300',
8515
- },
8516
- };
8517
- const sizeClasses$8 = {
8518
- sm: {
8519
- container: 'h-6 px-2 text-xs gap-1',
8520
- icon: 'h-3 w-3',
8521
- close: 'h-3 w-3 ml-1',
8522
- },
8523
- md: {
8524
- container: 'h-7 px-2.5 text-sm gap-1.5',
8525
- icon: 'h-3.5 w-3.5',
8526
- close: 'h-3.5 w-3.5 ml-1.5',
8527
- },
8528
- lg: {
8529
- container: 'h-8 px-3 text-base gap-2',
8530
- icon: 'h-4 w-4',
8531
- close: 'h-4 w-4 ml-2',
8532
- },
8533
- };
8534
- const gapClasses = {
8535
- xs: 'gap-1',
8536
- sm: 'gap-1.5',
8537
- md: 'gap-2',
8538
- lg: 'gap-3',
8539
- };
8540
- /**
8541
- * Chip - Compact element for displaying values with optional remove functionality
8542
- *
8543
- * @example Basic chip
8544
- * ```tsx
8545
- * <Chip>Tag Name</Chip>
8546
- * ```
8547
- *
8548
- * @example Removable chip
8549
- * ```tsx
8550
- * <Chip onClose={() => removeTag(tag)}>
8551
- * {tag.name}
8552
- * </Chip>
8553
- * ```
8554
- *
8555
- * @example With icon and selected state
8556
- * ```tsx
8557
- * <Chip
8558
- * icon={<Star className="h-3 w-3" />}
8559
- * selected={isSelected}
8560
- * onClick={() => toggleSelection()}
8561
- * >
8562
- * Favorite
8563
- * </Chip>
8564
- * ```
8565
- */
8566
- function Chip({ children, variant = 'secondary', size = 'md', onClose, icon, disabled = false, className = '', onClick, selected = false, maxWidth, chipKey, }) {
8567
- const variantStyle = variantClasses$4[variant];
8568
- const sizeStyle = sizeClasses$8[size];
8569
- const isClickable = !disabled && (onClick || onClose);
8570
- return (jsxRuntime.jsxs("div", { className: `
8571
- inline-flex items-center rounded-full border font-medium
8572
- transition-colors
8573
- ${selected ? variantStyle.selected : variantStyle.default}
8574
- ${isClickable && !disabled && !selected ? variantStyle.hover : ''}
8575
- ${sizeStyle.container}
8576
- ${disabled ? 'opacity-50 cursor-not-allowed' : ''}
8577
- ${onClick && !disabled ? 'cursor-pointer' : ''}
8578
- ${className}
8579
- `, onClick: onClick && !disabled ? onClick : undefined, role: onClick ? 'button' : undefined, "aria-disabled": disabled, "aria-pressed": onClick ? selected : undefined, "data-chip-key": chipKey, style: { maxWidth: maxWidth || undefined }, children: [icon && (jsxRuntime.jsx("span", { className: `flex-shrink-0 ${sizeStyle.icon}`, children: icon })), jsxRuntime.jsx("span", { className: "truncate", children: children }), onClose && (jsxRuntime.jsx("button", { type: "button", onClick: (e) => {
8580
- e.stopPropagation();
8581
- if (!disabled)
8582
- onClose();
8583
- }, disabled: disabled, className: `
8584
- flex-shrink-0 rounded-full transition-colors
8585
- ${variantStyle.close}
8586
- ${disabled ? 'cursor-not-allowed' : 'cursor-pointer'}
8587
- ${sizeStyle.close}
8588
- `, "aria-label": "Remove", children: jsxRuntime.jsx(lucideReact.X, { className: "w-full h-full" }) }))] }));
8589
- }
8590
- /**
8591
- * ChipGroup - Container for multiple chips with layout and selection support
8592
- *
8593
- * @example Basic group
8594
- * ```tsx
8595
- * <ChipGroup wrap gap="sm">
8596
- * {tags.map(tag => (
8597
- * <Chip key={tag.id} onClose={() => removeTag(tag)}>
8598
- * {tag.name}
8599
- * </Chip>
8600
- * ))}
8601
- * </ChipGroup>
8602
- * ```
8603
- *
8604
- * @example Selectable group (single)
8605
- * ```tsx
8606
- * <ChipGroup
8607
- * selectionMode="single"
8608
- * selectedKeys={[selectedCategory]}
8609
- * onSelectionChange={(keys) => setSelectedCategory(keys[0])}
8610
- * >
8611
- * <Chip chipKey="all">All</Chip>
8612
- * <Chip chipKey="active">Active</Chip>
8613
- * <Chip chipKey="archived">Archived</Chip>
8614
- * </ChipGroup>
8615
- * ```
8616
- *
8617
- * @example Multi-select group
8618
- * ```tsx
8619
- * <ChipGroup
8620
- * selectionMode="multiple"
8621
- * selectedKeys={selectedTags}
8622
- * onSelectionChange={setSelectedTags}
8623
- * wrap
8624
- * >
8625
- * {availableTags.map(tag => (
8626
- * <Chip key={tag} chipKey={tag}>{tag}</Chip>
8627
- * ))}
8628
- * </ChipGroup>
8629
- * ```
8630
- */
8631
- function ChipGroup({ children, direction = 'horizontal', wrap = false, gap = 'sm', selectionMode = 'none', selectedKeys = [], onSelectionChange, className = '', }) {
8632
- const handleChipClick = (chipKey) => {
8633
- if (selectionMode === 'none' || !onSelectionChange)
8634
- return;
8635
- if (selectionMode === 'single') {
8636
- // Toggle single selection
8637
- if (selectedKeys.includes(chipKey)) {
8638
- onSelectionChange([]);
8639
- }
8640
- else {
8641
- onSelectionChange([chipKey]);
8642
- }
8643
- }
8644
- else if (selectionMode === 'multiple') {
8645
- // Toggle in array
8646
- if (selectedKeys.includes(chipKey)) {
8647
- onSelectionChange(selectedKeys.filter(k => k !== chipKey));
8648
- }
8649
- else {
8650
- onSelectionChange([...selectedKeys, chipKey]);
8651
- }
8652
- }
8653
- };
8654
- // Clone children to inject selection props
8655
- const enhancedChildren = React.Children.map(children, (child) => {
8656
- if (!React.isValidElement(child))
8657
- return child;
8658
- const chipKey = child.props.chipKey;
8659
- if (!chipKey || selectionMode === 'none')
8660
- return child;
8661
- const isSelected = selectedKeys.includes(chipKey);
8662
- return React.cloneElement(child, {
8663
- ...child.props,
8664
- selected: isSelected,
8665
- onClick: () => {
8666
- // Call original onClick if exists
8667
- if (child.props.onClick) {
8668
- child.props.onClick();
8669
- }
8670
- handleChipClick(chipKey);
8671
- },
8672
- });
8673
- });
8674
- return (jsxRuntime.jsx("div", { className: `
8675
- flex
8676
- ${direction === 'vertical' ? 'flex-col' : 'flex-row'}
8677
- ${wrap ? 'flex-wrap' : ''}
8678
- ${gapClasses[gap]}
8679
- ${className}
8680
- `, role: selectionMode !== 'none' ? 'group' : undefined, "aria-label": selectionMode !== 'none' ? 'Chip selection group' : undefined, children: enhancedChildren }));
8681
- }
8682
-
8683
8753
  const sizeClasses$7 = {
8684
8754
  sm: {
8685
8755
  item: 'py-1.5 px-2',
@@ -11799,7 +11869,7 @@ function Tabs({ tabs, activeTab: controlledActiveTab, defaultTab, variant = 'und
11799
11869
  }) })] }));
11800
11870
  }
11801
11871
 
11802
- function Pagination({ currentPage, totalPages, onPageChange, showPageNumbers = true, maxPageNumbers = 5, showPageJump = false, }) {
11872
+ function Pagination({ currentPage, totalPages, onPageChange, showPageNumbers = true, maxPageNumbers = 5, showPageJump = false, totalItems, pageSize, pageSizeOptions, onPageSizeChange, showRecordCount = false, }) {
11803
11873
  const [jumpValue, setJumpValue] = React.useState('');
11804
11874
  const getPageNumbers = () => {
11805
11875
  const pages = [];
@@ -11840,16 +11910,20 @@ function Pagination({ currentPage, totalPages, onPageChange, showPageNumbers = t
11840
11910
  setJumpValue('');
11841
11911
  }
11842
11912
  };
11843
- return (jsxRuntime.jsxs("nav", { className: "flex items-center justify-center gap-2", "aria-label": "Pagination", children: [jsxRuntime.jsxs("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-ink-700 bg-white border border-paper-300 rounded-lg hover:bg-paper-50 hover:border-paper-400 disabled:opacity-40 disabled:cursor-not-allowed transition-all shadow-xs hover:shadow-sm", "aria-label": "Previous page", children: [jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" }), jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Previous" })] }), showPageNumbers && (jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: pageNumbers.map((page, index) => {
11844
- if (page === '...') {
11845
- return (jsxRuntime.jsx("span", { className: "px-3 py-2 text-ink-500", children: "..." }, `ellipsis-${index}`));
11846
- }
11847
- const pageNum = page;
11848
- const isActive = pageNum === currentPage;
11849
- return (jsxRuntime.jsx("button", { onClick: () => onPageChange(pageNum), className: `px-3 py-2 text-sm font-medium rounded-lg transition-all ${isActive
11850
- ? 'bg-accent-500 text-white shadow-sm'
11851
- : 'text-ink-700 bg-white border border-paper-300 hover:bg-paper-50 hover:border-paper-400'}`, "aria-label": `Page ${pageNum}`, "aria-current": isActive ? 'page' : undefined, children: pageNum }, pageNum));
11852
- }) })), jsxRuntime.jsxs("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage === totalPages, className: "inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-ink-700 bg-white border border-paper-300 rounded-lg hover:bg-paper-50 hover:border-paper-400 disabled:opacity-40 disabled:cursor-not-allowed transition-all shadow-xs hover:shadow-sm", "aria-label": "Next page", children: [jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Next" }), jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })] }), showPageJump && (jsxRuntime.jsxs("form", { onSubmit: handlePageJump, className: "flex items-center gap-2 ml-2", children: [jsxRuntime.jsx("span", { className: "text-sm text-ink-600 hidden sm:inline", children: "Go to:" }), jsxRuntime.jsx("input", { type: "number", min: "1", max: totalPages, value: jumpValue, onChange: (e) => setJumpValue(e.target.value), placeholder: "#", className: "w-16 px-2 py-1.5 text-sm text-center border border-paper-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400", "aria-label": "Jump to page" }), jsxRuntime.jsx("button", { type: "submit", disabled: !jumpValue, className: "px-3 py-1.5 text-sm font-medium text-white bg-accent-500 rounded-lg hover:bg-accent-600 disabled:opacity-40 disabled:cursor-not-allowed transition-all", children: "Go" })] }))] }));
11913
+ const showLeftSection = showRecordCount && totalItems !== undefined && pageSize;
11914
+ const showRightSection = onPageSizeChange && pageSizeOptions && pageSizeOptions.length > 0;
11915
+ const rangeStart = totalItems ? (currentPage - 1) * (pageSize || 0) + 1 : 0;
11916
+ const rangeEnd = totalItems ? Math.min(currentPage * (pageSize || 0), totalItems) : 0;
11917
+ return (jsxRuntime.jsxs("nav", { className: `flex items-center gap-2 ${showLeftSection || showRightSection ? 'justify-between' : 'justify-center'}`, "aria-label": "Pagination", children: [showLeftSection ? (jsxRuntime.jsxs("span", { className: "text-sm text-ink-500 tabular-nums shrink-0", children: ["Showing ", rangeStart.toLocaleString(), "\u2013", rangeEnd.toLocaleString(), " of ", totalItems.toLocaleString()] })) : showRightSection ? jsxRuntime.jsx("div", {}) : null, jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [jsxRuntime.jsxs("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-ink-700 bg-white border border-paper-300 rounded-lg hover:bg-paper-50 hover:border-paper-400 disabled:opacity-40 disabled:cursor-not-allowed transition-all shadow-xs hover:shadow-sm", "aria-label": "Previous page", children: [jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4" }), jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Previous" })] }), showPageNumbers && (jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: pageNumbers.map((page, index) => {
11918
+ if (page === '...') {
11919
+ return (jsxRuntime.jsx("span", { className: "px-3 py-2 text-ink-500", children: "..." }, `ellipsis-${index}`));
11920
+ }
11921
+ const pageNum = page;
11922
+ const isActive = pageNum === currentPage;
11923
+ return (jsxRuntime.jsx("button", { onClick: () => onPageChange(pageNum), className: `px-3 py-2 text-sm font-medium rounded-lg transition-all ${isActive
11924
+ ? 'bg-accent-500 text-white shadow-sm'
11925
+ : 'text-ink-700 bg-white border border-paper-300 hover:bg-paper-50 hover:border-paper-400'}`, "aria-label": `Page ${pageNum}`, "aria-current": isActive ? 'page' : undefined, children: pageNum }, pageNum));
11926
+ }) })), jsxRuntime.jsxs("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage === totalPages, className: "inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-ink-700 bg-white border border-paper-300 rounded-lg hover:bg-paper-50 hover:border-paper-400 disabled:opacity-40 disabled:cursor-not-allowed transition-all shadow-xs hover:shadow-sm", "aria-label": "Next page", children: [jsxRuntime.jsx("span", { className: "hidden sm:inline", children: "Next" }), jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4" })] }), showPageJump && (jsxRuntime.jsxs("form", { onSubmit: handlePageJump, className: "flex items-center gap-2 ml-2", children: [jsxRuntime.jsx("span", { className: "text-sm text-ink-600 hidden sm:inline", children: "Go to:" }), jsxRuntime.jsx("input", { type: "number", min: "1", max: totalPages, value: jumpValue, onChange: (e) => setJumpValue(e.target.value), placeholder: "#", className: "w-16 px-2 py-1.5 text-sm text-center border border-paper-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400", "aria-label": "Jump to page" }), jsxRuntime.jsx("button", { type: "submit", disabled: !jumpValue, className: "px-3 py-1.5 text-sm font-medium text-white bg-accent-500 rounded-lg hover:bg-accent-600 disabled:opacity-40 disabled:cursor-not-allowed transition-all", children: "Go" })] }))] }), showRightSection ? (jsxRuntime.jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [jsxRuntime.jsx("span", { className: "text-sm text-ink-500 hidden sm:inline", children: "Per page:" }), jsxRuntime.jsx("select", { value: pageSize || pageSizeOptions[0], onChange: (e) => onPageSizeChange(Number(e.target.value)), className: "px-2 py-1.5 text-sm border border-paper-300 rounded-lg bg-white text-ink-700 focus:outline-none focus:ring-2 focus:ring-accent-400 focus:border-accent-400 cursor-pointer", "aria-label": "Items per page", children: pageSizeOptions.map((size) => (jsxRuntime.jsx("option", { value: size, children: size }, size))) })] })) : showLeftSection ? jsxRuntime.jsx("div", {}) : null] }));
11853
11927
  }
11854
11928
 
11855
11929
  function StepIndicator({ steps, currentStep, variant = 'horizontal', onStepClick, }) {
@@ -14239,7 +14313,7 @@ function SearchBar({ value, onChange, placeholder = 'Search...', className = '',
14239
14313
  onSearch(value);
14240
14314
  }
14241
14315
  };
14242
- return (jsxRuntime.jsxs("div", { className: `flex-1 max-w-2xl relative ${className}`, children: [jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none", children: jsxRuntime.jsx(lucideReact.Search, { className: "h-5 w-5 text-ink-400" }) }), jsxRuntime.jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), onKeyDown: handleKeyDown, disabled: disabled, className: "block w-full pl-11 pr-4 py-3 border border-paper-300 rounded-lg leading-5 bg-white placeholder-ink-400 text-ink-800 focus:outline-none focus:placeholder-ink-300 focus:ring-2 focus:ring-accent-400 focus:border-accent-400 hover:border-paper-400 transition-all sm:text-sm disabled:bg-paper-100 disabled:cursor-not-allowed", placeholder: placeholder })] }));
14316
+ return (jsxRuntime.jsxs("div", { className: `flex-1 max-w-2xl relative ${className}`, children: [jsxRuntime.jsx("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none", children: jsxRuntime.jsx(lucideReact.Search, { className: "h-5 w-5 text-ink-400" }) }), jsxRuntime.jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), onKeyDown: handleKeyDown, disabled: disabled, className: "block w-full pl-11 pr-4 py-3 border border-paper-300 rounded-lg leading-5 bg-white placeholder:text-ink-400 text-ink-800 focus:outline-none focus:placeholder:text-ink-300 focus:ring-2 focus:ring-accent-400 focus:border-accent-400 hover:border-paper-400 transition-all sm:text-sm disabled:bg-paper-100 disabled:cursor-not-allowed", placeholder: placeholder })] }));
14243
14317
  }
14244
14318
 
14245
14319
  function NotificationIndicator({ count = 0, onClick, className = '', maxCount = 99, variant = 'default', }) {
@@ -15611,7 +15685,7 @@ mobileView = 'auto', cardConfig, cardGap = 'md', cardClassName, }) {
15611
15685
  })()] }, rowKey));
15612
15686
  });
15613
15687
  };
15614
- const tableContent = (jsxRuntime.jsxs("div", { className: `bg-white rounded-lg shadow border-2 ${borderColor} ${virtualized ? 'overflow-hidden' : 'overflow-x-auto overflow-y-visible'} ${className}`, style: { position: 'relative' }, children: [loading && data.length > 0 && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center z-20", style: { backdropFilter: 'blur(2px)' }, children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3", children: [jsxRuntime.jsx("div", { className: "loading-spinner", style: { width: '32px', height: '32px', borderWidth: '3px' } }), jsxRuntime.jsx("span", { className: "text-sm font-medium text-ink-600", children: "Loading..." })] }) })), jsxRuntime.jsxs("table", { className: `table-stable w-full ${bordered ? 'border-collapse' : ''}`, role: "grid", "aria-label": "Data table", "aria-rowcount": data.length, "aria-colcount": visibleColumns.length, children: [jsxRuntime.jsxs("colgroup", { children: [selectable && jsxRuntime.jsx("col", { className: "w-12" }), ((expandable || expandedRowConfig) && showExpandChevron) && jsxRuntime.jsx("col", { className: "w-10" }), allActions.length > 0 && jsxRuntime.jsx("col", { style: { width: '28px' } }), visibleColumns.map((column, index) => {
15688
+ const tableContent = (jsxRuntime.jsxs("div", { className: `bg-white rounded-lg shadow border-2 ${borderColor} ${virtualized ? 'overflow-hidden' : 'overflow-x-auto overflow-y-visible'} ${className}`, style: { position: 'relative' }, children: [loading && data.length > 0 && (jsxRuntime.jsx("div", { className: "absolute inset-0 bg-white/75 flex items-center justify-center z-20", style: { backdropFilter: 'blur(2px)' }, children: jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-3", children: [jsxRuntime.jsx("div", { className: "loading-spinner", style: { width: '32px', height: '32px', borderWidth: '3px' } }), jsxRuntime.jsx("span", { className: "text-sm font-medium text-ink-600", children: "Loading..." })] }) })), jsxRuntime.jsxs("table", { className: `table-stable w-full ${bordered ? 'border-collapse' : ''}`, role: "grid", "aria-label": "Data table", "aria-rowcount": data.length, "aria-colcount": visibleColumns.length, children: [jsxRuntime.jsxs("colgroup", { children: [selectable && jsxRuntime.jsx("col", { className: "w-12" }), ((expandable || expandedRowConfig) && showExpandChevron) && jsxRuntime.jsx("col", { className: "w-10" }), allActions.length > 0 && jsxRuntime.jsx("col", { style: { width: '28px' } }), visibleColumns.map((column, index) => {
15615
15689
  const columnKey = String(column.key);
15616
15690
  const dynamicWidth = columnWidths[columnKey];
15617
15691
  return (jsxRuntime.jsx("col", { style: getColumnStyle(column, dynamicWidth) }, index));
@@ -15706,52 +15780,44 @@ function getAugmentedNamespace(n) {
15706
15780
  * (A1, A1:C5, ...)
15707
15781
  */
15708
15782
 
15709
- var collection;
15710
- var hasRequiredCollection;
15711
-
15712
- function requireCollection () {
15713
- if (hasRequiredCollection) return collection;
15714
- hasRequiredCollection = 1;
15715
- class Collection {
15783
+ let Collection$3 = class Collection {
15716
15784
 
15717
- constructor(data, refs) {
15718
- if (data == null && refs == null) {
15719
- this._data = [];
15720
- this._refs = [];
15721
- } else {
15722
- if (data.length !== refs.length)
15723
- throw Error('Collection: data length should match references length.');
15724
- this._data = data;
15725
- this._refs = refs;
15726
- }
15727
- }
15785
+ constructor(data, refs) {
15786
+ if (data == null && refs == null) {
15787
+ this._data = [];
15788
+ this._refs = [];
15789
+ } else {
15790
+ if (data.length !== refs.length)
15791
+ throw Error('Collection: data length should match references length.');
15792
+ this._data = data;
15793
+ this._refs = refs;
15794
+ }
15795
+ }
15728
15796
 
15729
- get data() {
15730
- return this._data;
15731
- }
15797
+ get data() {
15798
+ return this._data;
15799
+ }
15732
15800
 
15733
- get refs() {
15734
- return this._refs;
15735
- }
15801
+ get refs() {
15802
+ return this._refs;
15803
+ }
15736
15804
 
15737
- get length() {
15738
- return this._data.length;
15739
- }
15805
+ get length() {
15806
+ return this._data.length;
15807
+ }
15740
15808
 
15741
- /**
15742
- * Add data and references to this collection.
15743
- * @param {{}} obj - data
15744
- * @param {{}} ref - reference
15745
- */
15746
- add(obj, ref) {
15747
- this._data.push(obj);
15748
- this._refs.push(ref);
15749
- }
15750
- }
15809
+ /**
15810
+ * Add data and references to this collection.
15811
+ * @param {{}} obj - data
15812
+ * @param {{}} ref - reference
15813
+ */
15814
+ add(obj, ref) {
15815
+ this._data.push(obj);
15816
+ this._refs.push(ref);
15817
+ }
15818
+ };
15751
15819
 
15752
- collection = Collection;
15753
- return collection;
15754
- }
15820
+ var collection = Collection$3;
15755
15821
 
15756
15822
  var helpers;
15757
15823
  var hasRequiredHelpers;
@@ -15760,7 +15826,7 @@ function requireHelpers () {
15760
15826
  if (hasRequiredHelpers) return helpers;
15761
15827
  hasRequiredHelpers = 1;
15762
15828
  const FormulaError = requireError();
15763
- const Collection = requireCollection();
15829
+ const Collection = collection;
15764
15830
 
15765
15831
  const Types = {
15766
15832
  NUMBER: 0,
@@ -25414,7 +25480,7 @@ var engineering = EngineeringFunctions;
25414
25480
 
25415
25481
  const FormulaError$b = requireError();
25416
25482
  const {FormulaHelpers: FormulaHelpers$8, Types: Types$6, WildCard, Address: Address$3} = requireHelpers();
25417
- const Collection$2 = requireCollection();
25483
+ const Collection$2 = collection;
25418
25484
  const H$5 = FormulaHelpers$8;
25419
25485
 
25420
25486
  const ReferenceFunctions$1 = {
@@ -37042,7 +37108,7 @@ var parsing = {
37042
37108
  const FormulaError$4 = requireError();
37043
37109
  const {Address: Address$1} = requireHelpers();
37044
37110
  const {Prefix: Prefix$1, Postfix: Postfix$1, Infix: Infix$1, Operators: Operators$1} = operators;
37045
- const Collection$1 = requireCollection();
37111
+ const Collection$1 = collection;
37046
37112
  const MAX_ROW$1 = 1048576, MAX_COLUMN$1 = 16384;
37047
37113
  const {NotAllInputParsedException} = require$$4;
37048
37114
 
@@ -37804,7 +37870,7 @@ var hooks$1 = {
37804
37870
  const FormulaError$2 = requireError();
37805
37871
  const {FormulaHelpers: FormulaHelpers$1, Types, Address} = requireHelpers();
37806
37872
  const {Prefix, Postfix, Infix, Operators} = operators;
37807
- const Collection = requireCollection();
37873
+ const Collection = collection;
37808
37874
  const MAX_ROW = 1048576, MAX_COLUMN = 16384;
37809
37875
 
37810
37876
  let Utils$1 = class Utils {
@@ -61849,7 +61915,7 @@ function AdminModal({ isOpen, onClose, title, subtitle, onSubmit, isSaving = fal
61849
61915
  onSubmit(formData);
61850
61916
  }
61851
61917
  };
61852
- return (jsxRuntime.jsx("div", { className: "fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 p-4 admin-modal-overlay", children: jsxRuntime.jsxs("div", { className: `bg-white rounded-lg w-full ${sizeClasses[size]} flex flex-col overflow-hidden shadow-2xl admin-modal-content`, style: { height: height }, children: [jsxRuntime.jsx("div", { className: "fixed inset-0 pointer-events-none admin-modal-sidebar-placeholder" }), jsxRuntime.jsxs("div", { className: "px-6 py-4 border-b", children: [jsxRuntime.jsx("h3", { className: "text-lg font-semibold", children: title }), subtitle && jsxRuntime.jsx("p", { className: "text-sm text-gray-500 mt-1", children: subtitle })] }), tabs.length > 1 && (jsxRuntime.jsx("div", { className: "border-b border-gray-200 bg-white", children: jsxRuntime.jsx("nav", { className: "-mb-px flex items-center px-6 admin-modal-tabs", "aria-label": "Tabs", children: tabs.map((tab, index) => (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: () => onTabChange(tab.id), className: `whitespace-nowrap border-b-2 py-3 px-4 text-sm font-medium transition-colors ${activeTabId === tab.id
61918
+ return (jsxRuntime.jsx("div", { className: "fixed inset-0 bg-black/50 flex items-center justify-center z-50 p-4 admin-modal-overlay", children: jsxRuntime.jsxs("div", { className: `bg-white rounded-lg w-full ${sizeClasses[size]} flex flex-col overflow-hidden shadow-2xl admin-modal-content`, style: { height: height }, children: [jsxRuntime.jsx("div", { className: "fixed inset-0 pointer-events-none admin-modal-sidebar-placeholder" }), jsxRuntime.jsxs("div", { className: "px-6 py-4 border-b", children: [jsxRuntime.jsx("h3", { className: "text-lg font-semibold", children: title }), subtitle && jsxRuntime.jsx("p", { className: "text-sm text-gray-500 mt-1", children: subtitle })] }), tabs.length > 1 && (jsxRuntime.jsx("div", { className: "border-b border-gray-200 bg-white", children: jsxRuntime.jsx("nav", { className: "-mb-px flex items-center px-6 admin-modal-tabs", "aria-label": "Tabs", children: tabs.map((tab, index) => (jsxRuntime.jsxs(React.Fragment, { children: [jsxRuntime.jsx("button", { type: "button", onClick: () => onTabChange(tab.id), className: `whitespace-nowrap border-b-2 py-3 px-4 text-sm font-medium transition-colors ${activeTabId === tab.id
61853
61919
  ? 'border-blue-500 text-blue-600'
61854
61920
  : 'border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700'}`, "aria-current": activeTabId === tab.id ? 'page' : undefined, children: tab.label }), index < tabs.length - 1 && (jsxRuntime.jsx("div", { className: "admin-modal-tab-separator" }))] }, tab.id))) }) })), onSubmit ? (jsxRuntime.jsx("form", { className: "flex-1 overflow-y-auto min-h-0 h-0 px-6 py-6 admin-modal-form", onSubmit: handleFormSubmit, id: formId, noValidate: true, children: activeTab?.content || children })) : (jsxRuntime.jsx("div", { className: "flex-1 overflow-y-auto min-h-0 h-0 px-6 py-6 admin-modal-content-area", children: activeTab?.content || children })), jsxRuntime.jsxs("div", { className: "px-6 py-4 border-t bg-gray-50 flex justify-between gap-3", children: [jsxRuntime.jsx("button", { type: "button", onClick: onClose, className: "px-4 py-2 text-sm text-gray-600 hover:text-gray-800", disabled: isSaving, children: "Cancel" }), jsxRuntime.jsxs("div", { className: "flex gap-3", children: [customFooterActions, onSubmit && (jsxRuntime.jsx("button", { type: "submit", form: formId, disabled: isSaving, className: "px-4 py-2 text-sm bg-primary-600 text-white rounded hover:bg-primary-700 disabled:opacity-50 disabled:cursor-not-allowed", children: isSaving ? 'Saving...' : 'Save Changes' }))] })] })] }) }));
61855
61921
  }
@@ -62070,7 +62136,7 @@ function NotificationBar({ notifications, onDismiss }) {
62070
62136
  }
62071
62137
  return (jsxRuntime.jsx("div", { className: "fixed top-4 right-4 z-50 space-y-3 max-w-md", children: notifications.map((notification) => {
62072
62138
  const IconComponent = getNotificationIcon(notification.type);
62073
- return (jsxRuntime.jsx("div", { className: `border-2 rounded-xl p-4 backdrop-blur-sm transform transition-all duration-300 ease-in-out animate-slide-in ${notificationStyles[notification.type]}`, children: jsxRuntime.jsxs("div", { className: "flex items-start space-x-3", children: [jsxRuntime.jsx("div", { className: `flex-shrink-0 p-1 rounded-full bg-white bg-opacity-50 ${iconStyles[notification.type]}`, children: jsxRuntime.jsx(IconComponent, { className: "h-5 w-5" }) }), jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntime.jsx("p", { className: "text-sm font-semibold mb-1 leading-tight", children: notification.title }), jsxRuntime.jsx("p", { className: "text-sm leading-relaxed opacity-90", children: notification.message })] }), notification.dismissible && onDismiss && (jsxRuntime.jsx("button", { onClick: () => onDismiss(notification.id), className: `flex-shrink-0 p-1.5 hover:bg-white hover:bg-opacity-60 rounded-full transition-all duration-200 ${iconStyles[notification.type]} hover:scale-110`, title: "Dismiss notification", children: jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" }) }))] }) }, notification.id));
62139
+ return (jsxRuntime.jsx("div", { className: `border-2 rounded-xl p-4 backdrop-blur-sm transform transition-all duration-300 ease-in-out animate-slide-in ${notificationStyles[notification.type]}`, children: jsxRuntime.jsxs("div", { className: "flex items-start space-x-3", children: [jsxRuntime.jsx("div", { className: `flex-shrink-0 p-1 rounded-full bg-white/50 ${iconStyles[notification.type]}`, children: jsxRuntime.jsx(IconComponent, { className: "h-5 w-5" }) }), jsxRuntime.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntime.jsx("p", { className: "text-sm font-semibold mb-1 leading-tight", children: notification.title }), jsxRuntime.jsx("p", { className: "text-sm leading-relaxed opacity-90", children: notification.message })] }), notification.dismissible && onDismiss && (jsxRuntime.jsx("button", { onClick: () => onDismiss(notification.id), className: `flex-shrink-0 p-1.5 hover:bg-white/60 rounded-full transition-all duration-200 ${iconStyles[notification.type]} hover:scale-110`, title: "Dismiss notification", children: jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4" }) }))] }) }, notification.id));
62074
62140
  }) }));
62075
62141
  }
62076
62142
 
@@ -62855,6 +62921,7 @@ exports.FieldArray = FieldArray;
62855
62921
  exports.FileUpload = FileUpload;
62856
62922
  exports.FilterBar = FilterBar;
62857
62923
  exports.FilterControls = FilterControls;
62924
+ exports.FilterPills = FilterPills;
62858
62925
  exports.FilterStatusBanner = FilterStatusBanner;
62859
62926
  exports.FloatingActionButton = FloatingActionButton;
62860
62927
  exports.Form = Form;
@@ -62874,6 +62941,7 @@ exports.InsightsPanelUI = InsightsPanelUI;
62874
62941
  exports.InviteCard = InviteCard;
62875
62942
  exports.KanbanBoard = KanbanBoard;
62876
62943
  exports.Layout = Layout;
62944
+ exports.LetterNav = LetterNav;
62877
62945
  exports.Loading = Loading;
62878
62946
  exports.LoadingOverlay = LoadingOverlay;
62879
62947
  exports.Logo = Logo;