@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.
- package/dist/components/FilterBar.d.ts +1 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterPills.d.ts +14 -0
- package/dist/components/FilterPills.d.ts.map +1 -0
- package/dist/components/LetterNav.d.ts +8 -0
- package/dist/components/LetterNav.d.ts.map +1 -0
- package/dist/components/Pagination.d.ts +11 -1
- package/dist/components/Pagination.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/index.d.ts +36 -4
- package/dist/index.esm.js +346 -280
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +346 -278
- package/dist/index.js.map +1 -1
- package/dist/styles.css +6228 -6713
- package/package.json +6 -4
- package/src/components/AdminModal.tsx +1 -1
- package/src/components/Autocomplete.tsx +1 -1
- package/src/components/CommandPalette.tsx +2 -2
- package/src/components/DataTable.tsx +1 -1
- package/src/components/Drawer.tsx +1 -1
- package/src/components/FilterBar.tsx +116 -3
- package/src/components/FilterPills.tsx +58 -0
- package/src/components/LetterNav.tsx +67 -0
- package/src/components/MarkdownEditor.tsx +1 -1
- package/src/components/MaskedInput.tsx +1 -1
- package/src/components/Modal.tsx +1 -1
- package/src/components/NotificationBar.tsx +2 -2
- package/src/components/Pagination.tsx +49 -1
- package/src/components/PasswordInput.tsx +1 -1
- package/src/components/SearchBar.tsx +1 -1
- package/src/components/Textarea.tsx +1 -1
- package/src/components/index.ts +6 -0
- package/src/styles/index.css +50 -160
- 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
|
-
|
|
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$
|
|
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
|
|
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$
|
|
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
|
|
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$
|
|
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$
|
|
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$
|
|
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
|
|
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
|
-
|
|
11844
|
-
|
|
11845
|
-
|
|
11846
|
-
|
|
11847
|
-
|
|
11848
|
-
|
|
11849
|
-
|
|
11850
|
-
|
|
11851
|
-
|
|
11852
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
15718
|
-
|
|
15719
|
-
|
|
15720
|
-
|
|
15721
|
-
|
|
15722
|
-
|
|
15723
|
-
|
|
15724
|
-
|
|
15725
|
-
|
|
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
|
-
|
|
15730
|
-
|
|
15731
|
-
|
|
15797
|
+
get data() {
|
|
15798
|
+
return this._data;
|
|
15799
|
+
}
|
|
15732
15800
|
|
|
15733
|
-
|
|
15734
|
-
|
|
15735
|
-
|
|
15801
|
+
get refs() {
|
|
15802
|
+
return this._refs;
|
|
15803
|
+
}
|
|
15736
15804
|
|
|
15737
|
-
|
|
15738
|
-
|
|
15739
|
-
|
|
15805
|
+
get length() {
|
|
15806
|
+
return this._data.length;
|
|
15807
|
+
}
|
|
15740
15808
|
|
|
15741
|
-
|
|
15742
|
-
|
|
15743
|
-
|
|
15744
|
-
|
|
15745
|
-
|
|
15746
|
-
|
|
15747
|
-
|
|
15748
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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;
|