From d4f4747fdef4c2616fd7e903101c9e47c620a140 Mon Sep 17 00:00:00 2001 From: Ryan Copley Date: Sun, 31 Aug 2025 23:39:44 -0400 Subject: [PATCH] - --- user/web/package.json | 3 +- web-components/README.md | 144 ++++++- .../components/ActionMenu/ActionMenu.d.ts | 43 ++ .../components/EmptyState/EmptyState.d.ts | 47 +++ .../components/LoadingState/LoadingState.d.ts | 46 +++ .../dist/components/Sidebar/Sidebar.d.ts | 49 +++ .../components/StatusBadge/StatusBadge.d.ts | 18 + web-components/dist/index.d.ts | 5 + web-components/dist/index.esm.js | 2 +- web-components/dist/index.esm.js.map | 2 +- web-components/dist/index.js | 2 +- web-components/dist/index.js.map | 2 +- web-components/dist/types/index.d.ts | 5 + .../src/components/ActionMenu/ActionMenu.tsx | 374 +++++++++++++++++ .../src/components/EmptyState/EmptyState.tsx | 346 ++++++++++++++++ .../components/LoadingState/LoadingState.tsx | 378 ++++++++++++++++++ .../src/components/Sidebar/Sidebar.tsx | 266 ++++++++++++ .../components/StatusBadge/StatusBadge.tsx | 186 +++++++++ web-components/src/index.ts | 5 + web-components/src/types/index.ts | 9 +- 20 files changed, 1919 insertions(+), 13 deletions(-) create mode 100644 web-components/dist/components/ActionMenu/ActionMenu.d.ts create mode 100644 web-components/dist/components/EmptyState/EmptyState.d.ts create mode 100644 web-components/dist/components/LoadingState/LoadingState.d.ts create mode 100644 web-components/dist/components/Sidebar/Sidebar.d.ts create mode 100644 web-components/dist/components/StatusBadge/StatusBadge.d.ts create mode 100644 web-components/src/components/ActionMenu/ActionMenu.tsx create mode 100644 web-components/src/components/EmptyState/EmptyState.tsx create mode 100644 web-components/src/components/LoadingState/LoadingState.tsx create mode 100644 web-components/src/components/Sidebar/Sidebar.tsx create mode 100644 web-components/src/components/StatusBadge/StatusBadge.tsx diff --git a/user/web/package.json b/user/web/package.json index f0a3620..916f394 100644 --- a/user/web/package.json +++ b/user/web/package.json @@ -11,7 +11,8 @@ "@mantine/form": "^7.0.0", "@mantine/modals": "^7.0.0", "@tabler/icons-react": "^2.40.0", - "axios": "^1.6.0" + "axios": "^1.6.0", + "@skybridge/web-components": "workspace:*" }, "devDependencies": { "@babel/core": "^7.22.0", diff --git a/web-components/README.md b/web-components/README.md index 158d791..a71f9ca 100644 --- a/web-components/README.md +++ b/web-components/README.md @@ -12,6 +12,132 @@ npm install @skybridge/web-components ## Components +### StatusBadge + +A standardized badge component with consistent color schemes across all microfrontends. + +```tsx +import { StatusBadge, UserRoleBadge, RuntimeBadge } from '@skybridge/web-components'; + +// Generic usage + + +// Context-specific usage + + + +// Variants: 'status', 'role', 'runtime', 'type', 'severity', 'execution' +``` + +### EmptyState + +A comprehensive empty state component for consistent empty data handling. + +```tsx +import { EmptyState, NoUsersState, NoSearchResults } from '@skybridge/web-components'; + +// Generic empty state + handleAddUser()} + onRefresh={() => handleRefresh()} +/> + +// Convenience components + + +``` + +### Sidebar + +A flexible base sidebar component for consistent slide-out panels. + +```tsx +import { Sidebar, DetailsSidebar, useSidebar } from '@skybridge/web-components'; + +const MySidebar = () => { + const { opened, open, close } = useSidebar(); + + return ( + +

Content goes here

+
+ ); +}; + +// For item details +} + editButton={} +> + + +``` + +### ActionMenu + +A standardized action menu component for table rows and items. + +```tsx +import { ActionMenu, getUserActions, createEditAction } from '@skybridge/web-components'; + +// Using pre-built action sets + + +// Custom actions + +``` + +### LoadingState + +Comprehensive loading states for different scenarios. + +```tsx +import { + LoadingState, + TableLoadingState, + PageLoadingState, + useLoadingState +} from '@skybridge/web-components'; + +// Different loading variants + + + + +// Convenience components + + + +// Hook for loading state management +const { loading, startLoading, stopLoading, updateProgress } = useLoadingState(); +``` + ### FormSidebar A reusable sidebar form component that handles create/edit operations with validation. @@ -288,14 +414,18 @@ The component library is designed to: ## Common Patterns Extracted -Based on analysis of the existing microfrontends, this library extracts these common patterns: +Based on deep analysis of the existing microfrontends, this library extracts these common patterns: -1. **Sidebar Forms**: All microfrontends use similar slide-out forms -2. **Data Tables**: Consistent table layouts with actions and filtering -3. **API Integration**: Standard CRUD operations with error handling -4. **Validation**: Common validation rules and patterns -5. **Notifications**: Standardized success/error messaging -6. **Filtering**: Client-side search and filter functionality +1. **Status Display**: Standardized color schemes and formatting for status badges across all apps +2. **Empty States**: Consistent empty data handling with contextual actions and messaging +3. **Sidebar Components**: All microfrontends use similar slide-out forms and detail panels +4. **Action Menus**: Standardized table actions with confirmation dialogs and consistent UX +5. **Loading States**: Multiple loading variants (spinners, progress, skeletons) for different scenarios +6. **Form Handling**: Reusable form sidebars with validation and error handling +7. **Data Tables**: Consistent table layouts with actions, filtering, and pagination +8. **API Integration**: Standard CRUD operations with error handling and state management +9. **Validation**: Common validation rules and patterns with consistent error messages +10. **Notifications**: Standardized success/error messaging and CRUD operation feedback ## Compatibility diff --git a/web-components/dist/components/ActionMenu/ActionMenu.d.ts b/web-components/dist/components/ActionMenu/ActionMenu.d.ts new file mode 100644 index 0000000..5c634d1 --- /dev/null +++ b/web-components/dist/components/ActionMenu/ActionMenu.d.ts @@ -0,0 +1,43 @@ +import React from 'react'; +import { TablerIconsProps } from '@tabler/icons-react'; +export interface ActionMenuItem { + key: string; + label: string; + icon?: React.ComponentType; + color?: string; + disabled?: boolean; + hidden?: boolean; + onClick: (item?: any) => void | Promise; + confirm?: { + title: string; + message: string; + confirmLabel?: string; + cancelLabel?: string; + }; + show?: (item: any) => boolean; +} +export interface ActionMenuProps { + item?: any; + actions: ActionMenuItem[]; + trigger?: 'dots' | 'button' | 'custom'; + triggerLabel?: string; + triggerIcon?: React.ComponentType; + triggerProps?: any; + customTrigger?: React.ReactNode; + position?: 'bottom-end' | 'bottom-start' | 'top-end' | 'top-start'; + withArrow?: boolean; + withinPortal?: boolean; + 'aria-label'?: string; +} +declare const ActionMenu: React.FC; +export default ActionMenu; +export declare const createViewAction: (onView: (item: any) => void) => ActionMenuItem; +export declare const createEditAction: (onEdit: (item: any) => void) => ActionMenuItem; +export declare const createCopyAction: (onCopy: (item: any) => void) => ActionMenuItem; +export declare const createDeleteAction: (onDelete: (item: any) => void | Promise, itemName?: string) => ActionMenuItem; +export declare const createArchiveAction: (onArchive: (item: any) => void) => ActionMenuItem; +export declare const createRestoreAction: (onRestore: (item: any) => void) => ActionMenuItem; +export declare const getUserActions: (onEdit: (item: any) => void, onDelete: (item: any) => void, onViewDetails?: (item: any) => void) => ActionMenuItem[]; +export declare const getApplicationActions: (onEdit: (item: any) => void, onDelete: (item: any) => void, onConfigure?: (item: any) => void) => ActionMenuItem[]; +export declare const getFunctionActions: (onEdit: (item: any) => void, onDelete: (item: any) => void, onExecute?: (item: any) => void, onViewLogs?: (item: any) => void) => ActionMenuItem[]; +export declare const getTokenActions: (onRevoke: (item: any) => void, onCopy?: (item: any) => void, onRefresh?: (item: any) => void) => ActionMenuItem[]; diff --git a/web-components/dist/components/EmptyState/EmptyState.d.ts b/web-components/dist/components/EmptyState/EmptyState.d.ts new file mode 100644 index 0000000..7bb47d7 --- /dev/null +++ b/web-components/dist/components/EmptyState/EmptyState.d.ts @@ -0,0 +1,47 @@ +import React from 'react'; +import { TablerIconsProps } from '@tabler/icons-react'; +export type EmptyStateVariant = 'no-data' | 'no-results' | 'error' | 'loading-failed' | 'access-denied' | 'coming-soon'; +export type EmptyStateContext = 'users' | 'applications' | 'functions' | 'tokens' | 'executions' | 'permissions' | 'audit' | 'generic'; +export interface EmptyStateAction { + label: string; + onClick: () => void; + variant?: 'filled' | 'light' | 'outline'; + color?: string; + leftSection?: React.ReactNode; +} +export interface EmptyStateProps { + variant?: EmptyStateVariant; + context?: EmptyStateContext; + title?: string; + message?: string; + icon?: React.ComponentType; + iconSize?: number; + iconColor?: string; + actions?: EmptyStateAction[]; + height?: number | string; +} +declare const EmptyState: React.FC void; + onRefresh?: () => void; + onClearFilters?: () => void; +}>; +export default EmptyState; +export declare const NoUsersState: React.FC & { + onAddUser?: () => void; +}>; +export declare const NoApplicationsState: React.FC & { + onCreateApp?: () => void; +}>; +export declare const NoFunctionsState: React.FC & { + onCreateFunction?: () => void; +}>; +export declare const NoTokensState: React.FC & { + onGenerateToken?: () => void; +}>; +export declare const NoSearchResults: React.FC & { + onClearFilters?: () => void; + onRefresh?: () => void; +}>; +export declare const ErrorState: React.FC & { + onRetry?: () => void; +}>; diff --git a/web-components/dist/components/LoadingState/LoadingState.d.ts b/web-components/dist/components/LoadingState/LoadingState.d.ts new file mode 100644 index 0000000..e8cd6cb --- /dev/null +++ b/web-components/dist/components/LoadingState/LoadingState.d.ts @@ -0,0 +1,46 @@ +import React from 'react'; +export type LoadingVariant = 'spinner' | 'progress' | 'skeleton-table' | 'skeleton-cards' | 'skeleton-form' | 'skeleton-text' | 'dots' | 'overlay'; +export type LoadingSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; +export interface LoadingStateProps { + variant?: LoadingVariant; + size?: LoadingSize; + height?: number | string; + message?: string; + submessage?: string; + progress?: number; + progressLabel?: string; + rows?: number; + columns?: number; + color?: string; + withContainer?: boolean; + animate?: boolean; +} +declare const LoadingState: React.FC; +export default LoadingState; +export declare const TableLoadingState: React.FC<{ + rows?: number; + columns?: number; +}>; +export declare const CardsLoadingState: React.FC<{ + count?: number; + columns?: number; +}>; +export declare const FormLoadingState: React.FC<{ + fields?: number; +}>; +export declare const PageLoadingState: React.FC<{ + message?: string; +}>; +export declare const InlineLoadingState: React.FC<{ + message?: string; + size?: LoadingSize; +}>; +export declare const useLoadingState: (initialLoading?: boolean) => { + loading: boolean; + progress: number; + startLoading: () => void; + stopLoading: () => void; + updateProgress: (value: number) => void; + setLoading: React.Dispatch>; + setProgress: React.Dispatch>; +}; diff --git a/web-components/dist/components/Sidebar/Sidebar.d.ts b/web-components/dist/components/Sidebar/Sidebar.d.ts new file mode 100644 index 0000000..f601615 --- /dev/null +++ b/web-components/dist/components/Sidebar/Sidebar.d.ts @@ -0,0 +1,49 @@ +import React from 'react'; +export interface SidebarProps { + opened: boolean; + onClose: () => void; + title: string; + width?: number; + position?: 'left' | 'right'; + headerActions?: React.ReactNode; + footer?: React.ReactNode; + children: React.ReactNode; + zIndex?: number; + offsetTop?: number; + backgroundColor?: string; + borderColor?: string; + animationDuration?: string; + 'aria-label'?: string; +} +declare const Sidebar: React.FC; +export default Sidebar; +export interface FormSidebarWrapperProps extends Omit { + children: React.ReactNode; + cancelLabel?: string; + submitLabel?: string; + onCancel?: () => void; + onSubmit?: () => void; + submitDisabled?: boolean; + showFooterActions?: boolean; +} +export declare const FormSidebarWrapper: React.FC; +export interface DetailsSidebarProps extends Omit { + itemName: string; + itemType?: string; + editButton?: React.ReactNode; + deleteButton?: React.ReactNode; + status?: React.ReactNode; +} +export declare const DetailsSidebar: React.FC; +export interface QuickSidebarProps extends Omit { + content: React.ReactNode; + actions?: React.ReactNode; +} +export declare const QuickSidebar: React.FC; +export declare const useSidebar: (initialOpened?: boolean) => { + opened: boolean; + open: () => void; + close: () => void; + toggle: () => void; + setOpened: React.Dispatch>; +}; diff --git a/web-components/dist/components/StatusBadge/StatusBadge.d.ts b/web-components/dist/components/StatusBadge/StatusBadge.d.ts new file mode 100644 index 0000000..42d4fee --- /dev/null +++ b/web-components/dist/components/StatusBadge/StatusBadge.d.ts @@ -0,0 +1,18 @@ +import React from 'react'; +import { BadgeProps } from '@mantine/core'; +export type StatusVariant = 'status' | 'role' | 'runtime' | 'type' | 'severity' | 'execution'; +export interface StatusBadgeProps extends Omit { + value: string; + variant?: StatusVariant; + customColorMap?: Record; +} +declare const COLOR_MAPS: Record>; +declare const DEFAULT_COLORS: Record; +declare const StatusBadge: React.FC; +export default StatusBadge; +export { COLOR_MAPS, DEFAULT_COLORS }; +export declare const UserRoleBadge: React.FC>; +export declare const ApplicationTypeBadge: React.FC>; +export declare const RuntimeBadge: React.FC>; +export declare const ExecutionStatusBadge: React.FC>; +export declare const SeverityBadge: React.FC>; diff --git a/web-components/dist/index.d.ts b/web-components/dist/index.d.ts index 0a776ef..54baba7 100644 --- a/web-components/dist/index.d.ts +++ b/web-components/dist/index.d.ts @@ -1,5 +1,10 @@ export { default as FormSidebar } from './components/FormSidebar/FormSidebar'; export { default as DataTable } from './components/DataTable/DataTable'; +export { default as StatusBadge, UserRoleBadge, ApplicationTypeBadge, RuntimeBadge, ExecutionStatusBadge, SeverityBadge } from './components/StatusBadge/StatusBadge'; +export { default as EmptyState, NoUsersState, NoApplicationsState, NoFunctionsState, NoTokensState, NoSearchResults, ErrorState } from './components/EmptyState/EmptyState'; +export { default as Sidebar, FormSidebarWrapper, DetailsSidebar, QuickSidebar, useSidebar } from './components/Sidebar/Sidebar'; +export { default as ActionMenu, createViewAction, createEditAction, createCopyAction, createDeleteAction, createArchiveAction, createRestoreAction, getUserActions, getApplicationActions, getFunctionActions, getTokenActions } from './components/ActionMenu/ActionMenu'; +export { default as LoadingState, TableLoadingState, CardsLoadingState, FormLoadingState, PageLoadingState, InlineLoadingState, useLoadingState } from './components/LoadingState/LoadingState'; export * from './types'; export { useApiService } from './hooks/useApiService'; export { useDataFilter } from './hooks/useDataFilter'; diff --git a/web-components/dist/index.esm.js b/web-components/dist/index.esm.js index 073b0a5..0a03f9e 100644 --- a/web-components/dist/index.esm.js +++ b/web-components/dist/index.esm.js @@ -1,2 +1,2 @@ -import{jsxs as e,jsx as t}from"react/jsx-runtime";import{useEffect as n,useState as r,useCallback as o,useMemo as i}from"react";import{Paper as a,Group as c,Title as l,ActionIcon as u,ScrollArea as s,Box as d,Stack as f,Button as h,TextInput as m,JsonInput as v,MultiSelect as p,Select as g,Textarea as y,NumberInput as b,Text as w,LoadingOverlay as x,Center as I,Table as C,Pagination as S,Badge as k,Menu as E}from"@mantine/core";export{ActionIcon,Badge,Box,Button,Center,Divider,Group,JsonInput,LoadingOverlay,Menu,MultiSelect,NumberInput,Pagination,Paper,ScrollArea,Select,Stack,Table,Text,TextInput,Textarea,Title}from"@mantine/core";import{IconX as F,IconRefresh as A,IconPlus as T,IconSearch as L,IconFilter as z,IconEdit as D,IconTrash as P,IconDots as U}from"@tabler/icons-react";export{IconAlertCircle,IconCheck,IconChevronDown,IconChevronRight,IconCopy,IconDots,IconEdit,IconEye,IconEyeOff,IconFilter,IconInfoCircle,IconKey,IconPlus,IconRefresh,IconSearch,IconSettings,IconTrash,IconUser,IconUsers,IconX}from"@tabler/icons-react";import{useForm as O}from"@mantine/form";export{useForm}from"@mantine/form";import{notifications as j}from"@mantine/notifications";export{notifications}from"@mantine/notifications";import{modals as R}from"@mantine/modals";export{modals}from"@mantine/modals";import q from"axios";export{useDisclosure,useLocalStorage,useToggle}from"@mantine/hooks";var M=function(){return M=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&o[o.length-1])||6!==c[0]&&2!==c[0])){i=0;continue}if(3===c[0]&&(!o||c[1]>o[0]&&c[1]e.validation.maxLength?"".concat(e.label," must be no more than ").concat(e.validation.maxLength," characters"):(null===(a=e.validation)||void 0===a?void 0:a.pattern)&&t&&!e.validation.pattern.test(t)?"".concat(e.label," format is invalid"):(null===(c=e.validation)||void 0===c?void 0:c.custom)?e.validation.custom(t):null}}),D)});n(function(){if(P&&S){var e={};k.forEach(function(t){var n,r;e[t.name]=null!==(r=null!==(n=S[t.name])&&void 0!==n?n:t.defaultValue)&&void 0!==r?r:""}),R.setValues(e)}else P||R.setValues(U())},[S,o,P]);return e(a,{style:{position:"fixed",top:60,right:o?0:"-".concat(T,"px"),bottom:0,width:"".concat(T,"px"),zIndex:1e3,borderRadius:0,display:"flex",flexDirection:"column",borderLeft:"1px solid var(--mantine-color-gray-3)",backgroundColor:"var(--mantine-color-body)",transition:"right 0.3s ease"},children:[e(c,{justify:"space-between",p:"md",style:{borderBottom:"1px solid var(--mantine-color-gray-3)"},children:[t(l,{order:4,children:P?"Edit ".concat(x):"Create New ".concat(x)}),t(u,{variant:"subtle",color:"gray",onClick:i,children:t(F,{size:18})})]}),t(s,{style:{flex:1},children:t(d,{p:"md",children:t("form",{onSubmit:R.onSubmit(function(e){return B(void 0,void 0,void 0,function(){var t,n,r;return N(this,function(o){switch(o.label){case 0:return o.trys.push([0,2,,3]),[4,E(e)];case 1:return o.sent(),t={title:"Success",message:"".concat(x," ").concat(P?"updated":"created"," successfully"),color:"green"},j.show(t),w(),i(),R.reset(),[3,3];case 2:return n=o.sent(),console.error("Error ".concat(P?"updating":"creating"," ").concat(x.toLowerCase(),":"),n),r={title:"Error",message:n.message||"Failed to ".concat(P?"update":"create"," ").concat(x.toLowerCase()),color:"red"},j.show(r),[3,3];case 3:return[2]}})})}),children:e(f,{gap:"md",children:[k.map(function(e){var n=R.getInputProps(e.name),r=M({key:e.name,label:e.label,placeholder:e.placeholder,description:e.description,required:e.required,disabled:e.disabled||P&&"id"===e.name},n);switch(e.type){case"email":return t(m,M({},r,{type:"email"}));case"number":return t(b,M({},r));case"textarea":return t(y,M({},r,{autosize:!0,minRows:3,maxRows:6}));case"select":return t(g,M({},r,{data:e.options||[]}));case"multiselect":return t(p,M({},r,{data:e.options||[]}));case"json":return t(v,M({},r,{validationError:"Invalid JSON format",formatOnBlur:!0,autosize:!0,minRows:3}));default:return t(m,M({},r))}}),e(c,{justify:"flex-end",mt:"md",children:[t(h,{variant:"light",onClick:i,children:"Cancel"}),e(h,{type:"submit",children:[P?"Update":"Create"," ",x]})]})]})})})})]})},J=function(o){var i=o.data,l=o.columns,s=o.loading,d=void 0!==s&&s,v=o.error,p=void 0===v?null:v,g=o.title,y=o.total,b=void 0===y?0:y,F=o.page,O=void 0===F?1:F,q=o.pageSize,$=void 0===q?10:q,V=o.onPageChange,J=o.onAdd,H=o.onEdit,_=o.onDelete,G=o.onRefresh,X=o.customActions,Z=void 0===X?[]:X,K=o.searchable,W=void 0===K||K,Y=o.filterable,Q=void 0!==Y&&Y,ee=o.filters,te=void 0===ee?{}:ee,ne=o.onFiltersChange,re=o.withBorder,oe=void 0===re||re,ie=o.withColumnBorders,ae=void 0!==ie&&ie,ce=o.striped,le=void 0===ce||ce,ue=o.highlightOnHover,se=void 0===ue||ue,de=o.emptyMessage,fe=void 0===de?"No data available":de,he=r(te),me=he[0],ve=he[1];n(function(){ve(te)},[te]);var pe=function(e){!function(e,t){var n,r=M(M({},me),((n={})[e]=t,n));ve(r),null==ne||ne(r)}("search",e)},ge=function(e,n){var r=n[e.key];if(e.render)return e.render(r,n);if(null==r)return t(w,{c:"dimmed",children:"-"});if("boolean"==typeof r)return t(k,{color:r?"green":"gray",size:"sm",children:r?"Yes":"No"});if("status"===e.key){return t(k,{color:{active:"green",inactive:"gray",pending:"yellow",suspended:"red",success:"green",error:"red",warning:"yellow"}[r]||"blue",size:"sm",children:r})}return t(w,{children:r.toString()})},ye=function(n){var r=[];H&&r.push({key:"edit",label:"Edit",icon:t(D,{size:14}),onClick:H}),_&&r.push({key:"delete",label:"Delete",icon:t(P,{size:14}),color:"red",onClick:function(){return function(e){R.openConfirmModal({title:"Confirm Delete",children:t(w,{size:"sm",children:"Are you sure you want to delete this item? This action cannot be undone."}),labels:{confirm:"Delete",cancel:"Cancel"},confirmProps:{color:"red"},onConfirm:function(){return B(void 0,void 0,void 0,function(){var t;return N(this,function(n){switch(n.label){case 0:return n.trys.push([0,3,,4]),_?[4,_(e)]:[3,2];case 1:n.sent(),j.show({title:"Success",message:"Item deleted successfully",color:"green"}),n.label=2;case 2:return[3,4];case 3:return t=n.sent(),j.show({title:"Error",message:t.message||"Failed to delete item",color:"red"}),[3,4];case 4:return[2]}})})}})}(n)}}),r.push.apply(r,Z);var o=r.filter(function(e){return!e.show||e.show(n)});return 0===o.length?null:e(E,{position:"bottom-end",children:[t(E.Target,{children:t(u,{variant:"subtle",color:"gray",children:t(U,{size:16})})}),t(E.Dropdown,{children:o.map(function(e){return t(E.Item,{leftSection:e.icon,color:e.color,onClick:function(){return e.onClick(n)},children:e.label},e.key)})})]})},be=Math.ceil(b/$);return e(f,{gap:"md",children:[e(c,{justify:"space-between",children:[t(c,{children:g&&t(w,{size:"xl",fw:600,children:g})}),e(c,{children:[G&&t(u,{variant:"light",onClick:G,children:t(A,{size:16})}),J&&t(h,{leftSection:t(T,{size:16}),onClick:J,children:"Add New"})]})]}),(W||Q)&&e(c,{children:[W&&t(m,{placeholder:"Search...",leftSection:t(L,{size:16}),value:me.search||"",onChange:function(e){return pe(e.currentTarget.value)},style:{flex:1}}),Q&&t(c,{children:t(u,{variant:"light",children:t(z,{size:16})})})]}),e(a,{withBorder:oe,pos:"relative",children:[t(x,{visible:d}),p?t(I,{p:"xl",children:e(f,{align:"center",gap:"xs",children:[t(w,{c:"red",fw:500,children:"Error loading data"}),t(w,{c:"dimmed",size:"sm",children:p}),G&&t(h,{variant:"light",size:"sm",onClick:G,children:"Try Again"})]})}):0===i.length?t(I,{p:"xl",children:e(f,{align:"center",gap:"xs",children:[t(w,{c:"dimmed",children:fe}),J&&t(h,{variant:"light",size:"sm",onClick:J,children:"Add First Item"})]})}):e(C,{striped:le,highlightOnHover:se,withColumnBorders:ae,children:[t(C.Thead,{children:e(C.Tr,{children:[l.map(function(e){return t(C.Th,{style:{width:e.width},children:e.label},e.key)}),(H||_||Z.length>0)&&t(C.Th,{style:{width:50},children:"Actions"})]})}),t(C.Tbody,{children:i.map(function(n){return e(C.Tr,{children:[l.map(function(e){return t(C.Td,{children:ge(e,n)},"".concat(n.id,"-").concat(e.key))}),(H||_||Z.length>0)&&t(C.Td,{children:ye(n)})]},n.id)})})]})]}),be>1&&t(c,{justify:"center",children:t(S,{total:be,value:O,onChange:V,size:"sm"})})]})},H=function(e,t){var n=r([]),i=n[0],a=n[1],c=r(!1),l=c[0],u=c[1],s=r(null),d=s[0],f=s[1],h=r(0),m=h[0],v=h[1],p=r(!1),g=p[0],y=p[1],b=q.create({baseURL:e.baseURL,timeout:e.timeout||1e4,headers:M({"Content-Type":"application/json"},e.defaultHeaders)});b.interceptors.request.use(function(e){return e.headers["X-User-Email"]="admin@example.com",e},function(e){return Promise.reject(e)}),b.interceptors.response.use(function(e){return e},function(e){var t,n,r=(null===(n=null===(t=e.response)||void 0===t?void 0:t.data)||void 0===n?void 0:n.message)||e.message||"An error occurred";return f(r),Promise.reject(e)});var w=o(function(){f(null)},[]),x=o(function(){for(var e=[],n=0;n0?t.filter(function(e){return r.includes(e[n])}):t.filter(function(e){var t=e[n];return null!=t&&(t.toString().toLowerCase()===r.toString().toLowerCase()||"string"==typeof t&&"string"==typeof r&&t.toLowerCase().includes(r.toLowerCase()))}))}),t},[e,h,s,a]);return{filteredData:y,filters:s,setFilter:v,clearFilters:p,resetFilters:g,searchTerm:h,setSearchTerm:m}},G=function(e,t){void 0===t&&(t="Success");var n={title:t,message:e,color:"green"};j.show(n)},X=function(e,t){void 0===t&&(t="Error");var n={title:t,message:e,color:"red"};j.show(n)},Z=function(e,t){void 0===t&&(t="Warning");var n={title:t,message:e,color:"yellow"};j.show(n)},K=function(e,t){void 0===t&&(t="Info");var n={title:t,message:e,color:"blue"};j.show(n)},W={createSuccess:function(e){return"".concat(e," created successfully")},updateSuccess:function(e){return"".concat(e," updated successfully")},deleteSuccess:function(e){return"".concat(e," deleted successfully")},createError:function(e){return"Failed to create ".concat(e)},updateError:function(e){return"Failed to update ".concat(e)},deleteError:function(e){return"Failed to delete ".concat(e)},loadError:function(e){return"Failed to load ".concat(e)},networkError:"Network error occurred. Please try again.",validationError:"Please check the form for errors",requiredFieldError:function(e){return"".concat(e," is required")},authRequired:"Authentication required",permissionDenied:"Permission denied",sessionExpired:"Session expired. Please log in again.",applicationCreated:"Application created successfully",applicationUpdated:"Application updated successfully",applicationDeleted:"Application deleted successfully",tokenCreated:"Token created successfully",tokenRevoked:"Token revoked successfully",userCreated:"User created successfully",userUpdated:"User updated successfully",userDeleted:"User deleted successfully",functionCreated:"Function created successfully",functionUpdated:"Function updated successfully",functionDeleted:"Function deleted successfully",executionStarted:"Function execution started",executionCompleted:"Function execution completed",executionFailed:"Function execution failed"},Y={success:function(e,t){var n=W["".concat(e,"Success")](t);G(n)},error:function(e,t,n){var r=n||W["".concat(e,"Error")](t);X(r)}},Q={email:/^\S+@\S+\.\S+$/,url:/^https?:\/\/.+/,duration:/^\d+[smhd]$/,token:/^[a-zA-Z0-9_-]+$/,appId:/^[a-zA-Z0-9-_]+$/,uuid:/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i},ee={required:function(e){return"".concat(e," is required")},email:"Please enter a valid email address",url:"Please enter a valid URL (http:// or https://)",duration:"Duration must be in format like 30s, 5m, 2h, 1d",minLength:function(e,t){return"".concat(e," must be at least ").concat(t," characters")},maxLength:function(e,t){return"".concat(e," must be no more than ").concat(t," characters")},pattern:function(e){return"".concat(e," format is invalid")},token:"Token can only contain letters, numbers, underscores and hyphens",appId:"App ID can only contain letters, numbers, hyphens and underscores",uuid:"Please enter a valid UUID",positiveNumber:"Must be a positive number",range:function(e,t,n){return"".concat(e," must be between ").concat(t," and ").concat(n)}},te=function(e){return null==e||""===e||Array.isArray(e)&&0===e.length?"This field is required":null},ne=function(e){return e?Q.email.test(e)?null:ee.email:null},re=function(e){return e?Q.url.test(e)?null:ee.url:null},oe=function(e){return e?Q.duration.test(e)?null:ee.duration:null},ie=function(e,t,n){return void 0===n&&(n="Field"),e?e.length>=t?null:ee.minLength(n,t):null},ae=function(e,t,n){return void 0===n&&(n="Field"),e?e.length<=t?null:ee.maxLength(n,t):null},ce=function(e,t,n){return void 0===n&&(n="Field"),e?t.test(e)?null:ee.pattern(n):null},le=function(e,t,n,r){return void 0===r&&(r="Field"),null==e?null:en?ee.range(r,t,n):null},ue=function(e){return e?Q.appId.test(e)?null:ee.appId:null},se=function(e){return e?Q.token.test(e)?null:ee.token:null},de=function(e){return e?Q.uuid.test(e)?null:ee.uuid:null},fe=function(e){if(!e||""===e.trim())return null;try{return JSON.parse(e),null}catch(e){return"Invalid JSON format"}},he=function(e){var t=e.match(/^(\d+)([smhd]?)$/);if(!t)return 86400;var n=parseInt(t[1]);switch(t[2]||"h"){case"s":return n;case"m":return 60*n;case"h":default:return 3600*n;case"d":return 86400*n}},me=function(e){return e<60?"".concat(e,"s"):e<3600?"".concat(Math.floor(e/60),"m"):e<86400?"".concat(Math.floor(e/3600),"h"):"".concat(Math.floor(e/86400),"d")},ve=function(){for(var e=[],t=0;t0&&i[i.length-1])||6!==c[0]&&2!==c[0])){o=0;continue}if(3===c[0]&&(!i||c[1]>i[0]&&c[1]e.validation.maxLength?"".concat(e.label," must be no more than ").concat(e.validation.maxLength," characters"):(null===(a=e.validation)||void 0===a?void 0:a.pattern)&&n&&!e.validation.pattern.test(n)?"".concat(e.label," format is invalid"):(null===(c=e.validation)||void 0===c?void 0:c.custom)?e.validation.custom(n):null}}),E)});i(function(){if(j&&A){var e={};S.forEach(function(n){var t,r;e[n.name]=null!==(r=null!==(t=A[n.name])&&void 0!==t?t:n.defaultValue)&&void 0!==r?r:""}),R.setValues(e)}else j||R.setValues(P())},[A,r,j]);return e(l,{style:{position:"fixed",top:60,right:r?0:"-".concat(F,"px"),bottom:0,width:"".concat(F,"px"),zIndex:1e3,borderRadius:0,display:"flex",flexDirection:"column",borderLeft:"1px solid var(--mantine-color-gray-3)",backgroundColor:"var(--mantine-color-body)",transition:"right 0.3s ease"},children:[e(s,{justify:"space-between",p:"md",style:{borderBottom:"1px solid var(--mantine-color-gray-3)"},children:[n(u,{order:4,children:j?"Edit ".concat(c):"Create New ".concat(c)}),n(d,{variant:"subtle",color:"gray",onClick:o,children:n(D,{size:18})})]}),n(f,{style:{flex:1},children:n(h,{p:"md",children:n("form",{onSubmit:R.onSubmit(function(e){return le(void 0,void 0,void 0,function(){var n,t,r;return se(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),[4,z(e)];case 1:return i.sent(),n={title:"Success",message:"".concat(c," ").concat(j?"updated":"created"," successfully"),color:"green"},re.show(n),a(),o(),R.reset(),[3,3];case 2:return t=i.sent(),console.error("Error ".concat(j?"updating":"creating"," ").concat(c.toLowerCase(),":"),t),r={title:"Error",message:t.message||"Failed to ".concat(j?"update":"create"," ").concat(c.toLowerCase()),color:"red"},re.show(r),[3,3];case 3:return[2]}})})}),children:e(m,{gap:"md",children:[S.map(function(e){var t=R.getInputProps(e.name),r=ae({key:e.name,label:e.label,placeholder:e.placeholder,description:e.description,required:e.required,disabled:e.disabled||j&&"id"===e.name},t);switch(e.type){case"email":return n(v,ae({},r,{type:"email"}));case"number":return n(k,ae({},r));case"textarea":return n(w,ae({},r,{autosize:!0,minRows:3,maxRows:6}));case"select":return n(b,ae({},r,{data:e.options||[]}));case"multiselect":return n(y,ae({},r,{data:e.options||[]}));case"json":return n(g,ae({},r,{validationError:"Invalid JSON format",formatOnBlur:!0,autosize:!0,minRows:3}));default:return n(v,ae({},r))}}),e(s,{justify:"flex-end",mt:"md",children:[n(p,{variant:"light",onClick:o,children:"Cancel"}),e(p,{type:"submit",children:[j?"Update":"Create"," ",c]})]})]})})})})]})},fe=function(t){var r=t.data,a=t.columns,c=t.loading,u=void 0!==c&&c,f=t.error,h=void 0===f?null:f,g=t.title,y=t.total,b=void 0===y?0:y,w=t.page,k=void 0===w?1:w,L=t.pageSize,T=void 0===L?10:L,E=t.onPageChange,j=t.onAdd,P=t.onEdit,R=t.onDelete,D=t.onRefresh,W=t.customActions,G=void 0===W?[]:W,$=t.searchable,J=void 0===$||$,H=t.filterable,Y=void 0!==H&&H,_=t.filters,X=void 0===_?{}:_,Z=t.onFiltersChange,K=t.withBorder,Q=void 0===K||K,ee=t.withColumnBorders,ne=void 0!==ee&&ee,te=t.striped,oe=void 0===te||te,ce=t.highlightOnHover,ue=void 0===ce||ce,de=t.emptyMessage,fe=void 0===de?"No data available":de,he=o(X),me=he[0],pe=he[1];i(function(){pe(X)},[X]);var ve=function(e){!function(e,n){var t,r=ae(ae({},me),((t={})[e]=n,t));pe(r),null==Z||Z(r)}("search",e)},ge=function(e,t){var r=t[e.key];if(e.render)return e.render(r,t);if(null==r)return n(C,{c:"dimmed",children:"-"});if("boolean"==typeof r)return n(I,{color:r?"green":"gray",size:"sm",children:r?"Yes":"No"});if("status"===e.key){return n(I,{color:{active:"green",inactive:"gray",pending:"yellow",suspended:"red",success:"green",error:"red",warning:"yellow"}[r]||"blue",size:"sm",children:r})}return n(C,{children:r.toString()})},ye=function(t){var r=[];P&&r.push({key:"edit",label:"Edit",icon:n(B,{size:14}),onClick:P}),R&&r.push({key:"delete",label:"Delete",icon:n(q,{size:14}),color:"red",onClick:function(){return function(e){ie.openConfirmModal({title:"Confirm Delete",children:n(C,{size:"sm",children:"Are you sure you want to delete this item? This action cannot be undone."}),labels:{confirm:"Delete",cancel:"Cancel"},confirmProps:{color:"red"},onConfirm:function(){return le(void 0,void 0,void 0,function(){var n;return se(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),R?[4,R(e)]:[3,2];case 1:t.sent(),re.show({title:"Success",message:"Item deleted successfully",color:"green"}),t.label=2;case 2:return[3,4];case 3:return n=t.sent(),re.show({title:"Error",message:n.message||"Failed to delete item",color:"red"}),[3,4];case 4:return[2]}})})}})}(t)}}),r.push.apply(r,G);var i=r.filter(function(e){return!e.show||e.show(t)});return 0===i.length?null:e(F,{position:"bottom-end",children:[n(F.Target,{children:n(d,{variant:"subtle",color:"gray",children:n(V,{size:16})})}),n(F.Dropdown,{children:i.map(function(e){return n(F.Item,{leftSection:e.icon,color:e.color,onClick:function(){return e.onClick(t)},children:e.label},e.key)})})]})},be=Math.ceil(b/T);return e(m,{gap:"md",children:[e(s,{justify:"space-between",children:[n(s,{children:g&&n(C,{size:"xl",fw:600,children:g})}),e(s,{children:[D&&n(d,{variant:"light",onClick:D,children:n(O,{size:16})}),j&&n(p,{leftSection:n(U,{size:16}),onClick:j,children:"Add New"})]})]}),(J||Y)&&e(s,{children:[J&&n(v,{placeholder:"Search...",leftSection:n(N,{size:16}),value:me.search||"",onChange:function(e){return ve(e.currentTarget.value)},style:{flex:1}}),Y&&n(s,{children:n(d,{variant:"light",children:n(M,{size:16})})})]}),e(l,{withBorder:Q,pos:"relative",children:[n(x,{visible:u}),h?n(A,{p:"xl",children:e(m,{align:"center",gap:"xs",children:[n(C,{c:"red",fw:500,children:"Error loading data"}),n(C,{c:"dimmed",size:"sm",children:h}),D&&n(p,{variant:"light",size:"sm",onClick:D,children:"Try Again"})]})}):0===r.length?n(A,{p:"xl",children:e(m,{align:"center",gap:"xs",children:[n(C,{c:"dimmed",children:fe}),j&&n(p,{variant:"light",size:"sm",onClick:j,children:"Add First Item"})]})}):e(S,{striped:oe,highlightOnHover:ue,withColumnBorders:ne,children:[n(S.Thead,{children:e(S.Tr,{children:[a.map(function(e){return n(S.Th,{style:{width:e.width},children:e.label},e.key)}),(P||R||G.length>0)&&n(S.Th,{style:{width:50},children:"Actions"})]})}),n(S.Tbody,{children:r.map(function(t){return e(S.Tr,{children:[a.map(function(e){return n(S.Td,{children:ge(e,t)},"".concat(t.id,"-").concat(e.key))}),(P||R||G.length>0)&&n(S.Td,{children:ye(t)})]},t.id)})})]})]}),be>1&&n(s,{justify:"center",children:n(z,{total:be,value:k,onChange:E,size:"sm"})})]})},he={status:{active:"green",inactive:"gray",pending:"yellow",suspended:"red",enabled:"green",disabled:"gray",online:"green",offline:"gray",running:"green",stopped:"gray",paused:"yellow",failed:"red",success:"green",completed:"green",error:"red",warning:"yellow",info:"blue"},role:{admin:"red",moderator:"orange",user:"blue",viewer:"gray",owner:"purple",editor:"cyan",contributor:"teal",guest:"gray"},type:{static:"blue",user:"cyan",service:"green",application:"purple",api:"orange",web:"teal",mobile:"pink",desktop:"indigo"},runtime:{nodejs18:"green",nodejs20:"lime","python3.9":"blue","python3.11":"indigo","go1.20":"cyan","go1.21":"teal",java11:"orange",java17:"red",dotnet6:"purple",dotnet7:"violet",rust:"dark",php8:"grape"},severity:{critical:"red",high:"orange",medium:"yellow",low:"blue",info:"gray",debug:"dark"},execution:{queued:"gray",running:"blue",succeeded:"green",failed:"red",timeout:"orange",cancelled:"yellow",retrying:"cyan"}},me={status:"gray",role:"blue",runtime:"blue",type:"blue",severity:"gray",execution:"gray"},pe=function(e){var t=e.value,r=e.variant,i=void 0===r?"status":r,o=e.customColorMap,a=e.size,c=void 0===a?"sm":a,l=ce(e,["value","variant","customColorMap","size"]);if(!t)return n(I,ae({color:"gray",size:c},l,{children:"-"}));var s=(o||he[i]||he.status)[t.toLowerCase()]||me[i],u=ve(t,i);return n(I,ae({color:s,size:c,variant:"filled"},l,{children:u}))},ve=function(e,n){switch(n){case"runtime":if(e.startsWith("nodejs"))return"Node.js ".concat(e.replace("nodejs",""));if(e.startsWith("python"))return"Python ".concat(e.replace("python",""));if(e.startsWith("go"))return"Go ".concat(e.replace("go",""));if(e.startsWith("java"))return"Java ".concat(e.replace("java",""));if(e.startsWith("dotnet"))return".NET ".concat(e.replace("dotnet",""));break;case"type":if("api"===e)return"API";if("web"===e)return"Web App";if("mobile"===e)return"Mobile App"}return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()},ge=function(e){return n(pe,ae({},e,{variant:"role"}))},ye=function(e){return n(pe,ae({},e,{variant:"type"}))},be=function(e){return n(pe,ae({},e,{variant:"runtime"}))},we=function(e){return n(pe,ae({},e,{variant:"execution"}))},ke=function(e){return n(pe,ae({},e,{variant:"severity"}))},Ce={users:G,applications:$,functions:W,tokens:J,executions:W,permissions:J,audit:H,generic:H},xe=function(t){var r=t.variant,i=void 0===r?"no-data":r,o=t.context,a=void 0===o?"generic":o,c=t.title,l=t.message,s=t.icon,u=t.iconSize,d=void 0===u?48:u,f=t.iconColor,v=void 0===f?"dimmed":f,g=t.actions,y=t.height,b=void 0===y?400:y,w=t.onAdd,k=t.onRefresh,x=t.onClearFilters,S=function(e,n){var t={users:"users",applications:"applications",functions:"functions",tokens:"tokens",executions:"executions",permissions:"permissions",audit:"audit events",generic:"items"}[n],r=t.charAt(0).toUpperCase()+t.slice(1);switch(e){case"no-data":return{title:"No ".concat(t," found"),message:"You haven't created any ".concat(t," yet. Get started by adding your first ").concat(t.slice(0,-1),".")};case"no-results":return{title:"No matching results",message:"No ".concat(t," match your current filters or search criteria. Try adjusting your search terms or clearing filters.")};case"error":return{title:"Something went wrong",message:"We couldn't load your ".concat(t,". Please try again or contact support if the problem persists.")};case"loading-failed":return{title:"Failed to load data",message:"There was a problem loading ".concat(t,". Check your connection and try again.")};case"access-denied":return{title:"Access denied",message:"You don't have permission to view ".concat(t,". Contact your administrator if you need access.")};case"coming-soon":return{title:"Coming soon",message:"".concat(r," functionality is being developed. Check back soon for updates.")};default:return{title:"No ".concat(t),message:"There are no ".concat(t," to display.")}}}(i,a),z=c||S.title,I=l||S.message,F=s||Ce[a]||function(e){switch(e){case"no-results":return N;case"error":case"loading-failed":case"access-denied":return Y;default:return H}}(i),L=g||function(e,t,r,i,o){var a=[];switch(e){case"no-data":if(r){var c={users:{label:"Add User",onClick:r,variant:"filled",leftSection:n(U,{size:16})},applications:{label:"Create Application",onClick:r,variant:"filled",leftSection:n(U,{size:16})},functions:{label:"Create Function",onClick:r,variant:"filled",leftSection:n(U,{size:16})},tokens:{label:"Generate Token",onClick:r,variant:"filled",leftSection:n(U,{size:16})},executions:{label:"Run Function",onClick:r,variant:"filled",leftSection:n(W,{size:16})},permissions:{label:"Add Permission",onClick:r,variant:"filled",leftSection:n(U,{size:16})},audit:{label:"Refresh",onClick:r,variant:"light",leftSection:n(O,{size:16})},generic:{label:"Add New",onClick:r,variant:"filled",leftSection:n(U,{size:16})}};a.push(c[t])}break;case"no-results":o&&a.push({label:"Clear Filters",onClick:o,variant:"light",leftSection:n(M,{size:16})}),i&&a.push({label:"Refresh",onClick:i,variant:"outline",leftSection:n(O,{size:16})});break;case"error":case"loading-failed":i&&a.push({label:"Try Again",onClick:i,variant:"filled",leftSection:n(O,{size:16})})}return a}(i,a,w,k,x);return n(A,{h:b,children:e(m,{align:"center",gap:"lg",maw:400,ta:"center",children:[n(h,{c:v,children:n(F,{size:d,stroke:1.5})}),e(m,{align:"center",gap:"xs",children:[n(C,{size:"lg",fw:600,c:"dimmed",children:z}),n(C,{size:"sm",c:"dimmed",lh:1.5,children:I})]}),L.length>0&&n(m,{align:"center",gap:"sm",w:"100%",children:L.map(function(e,t){return n(p,{onClick:e.onClick,variant:e.variant||"filled",color:e.color,leftSection:e.leftSection,size:"sm",children:e.label},t)})})]})})},Ae=function(e){var t=e.onAddUser,r=ce(e,["onAddUser"]);return n(xe,ae({},r,{variant:"no-data",context:"users",onAdd:t}))},Se=function(e){var t=e.onCreateApp,r=ce(e,["onCreateApp"]);return n(xe,ae({},r,{variant:"no-data",context:"applications",onAdd:t}))},ze=function(e){var t=e.onCreateFunction,r=ce(e,["onCreateFunction"]);return n(xe,ae({},r,{variant:"no-data",context:"functions",onAdd:t}))},Ie=function(e){var t=e.onGenerateToken,r=ce(e,["onGenerateToken"]);return n(xe,ae({},r,{variant:"no-data",context:"tokens",onAdd:t}))},Fe=function(e){var t=e.onClearFilters,r=e.onRefresh,i=ce(e,["onClearFilters","onRefresh"]);return n(xe,ae({},i,{variant:"no-results",onClearFilters:t,onRefresh:r}))},Le=function(e){var t=e.onRetry,r=ce(e,["onRetry"]);return n(xe,ae({},r,{variant:"error",onRefresh:t}))},Te=function(r){var i,o=r.opened,a=r.onClose,c=r.title,m=r.width,p=void 0===m?450:m,v=r.position,g=void 0===v?"right":v,y=r.headerActions,b=r.footer,w=r.children,k=r.zIndex,C=void 0===k?1e3:k,x=r.offsetTop,A=void 0===x?60:x,S=r.backgroundColor,z=void 0===S?"var(--mantine-color-body)":S,I=r.borderColor,F=void 0===I?"var(--mantine-color-gray-3)":I,T=r.animationDuration,E=void 0===T?"0.3s":T,j=r["aria-label"];return e(l,{style:(i={position:"fixed",top:A,bottom:0,width:"".concat(p,"px"),zIndex:C,borderRadius:0,display:"flex",flexDirection:"column",backgroundColor:z,transition:"".concat(g," ").concat(E," ease")},ae(ae({},i),"right"===g?{right:o?0:"-".concat(p,"px"),borderLeft:"1px solid ".concat(F)}:{left:o?0:"-".concat(p,"px"),borderRight:"1px solid ".concat(F)})),role:"dialog","aria-modal":"true","aria-label":j||c,"aria-hidden":!o,children:[e(s,{justify:"space-between",p:"md",style:{borderBottom:"1px solid ".concat(F)},children:[n(u,{order:4,style:{flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:c}),y&&n(s,{gap:"xs",children:y}),n(d,{variant:"subtle",color:"gray",onClick:a,"aria-label":"Close sidebar",ml:"xs",children:n(D,{size:18})})]}),n(f,{style:{flex:1},scrollbarSize:6,children:n(h,{p:"md",children:w})}),b&&e(t,{children:[n(L,{}),n(h,{p:"md",style:{borderTop:"1px solid ".concat(F)},children:b})]})]})},Ee=function(t){var r=t.children,i=t.cancelLabel,o=void 0===i?"Cancel":i,a=t.submitLabel,c=void 0===a?"Save":a,l=t.onCancel,u=t.onSubmit,f=t.submitDisabled,h=void 0!==f&&f,m=t.showFooterActions,p=void 0===m||m,v=t.onClose,g=ce(t,["children","cancelLabel","submitLabel","onCancel","onSubmit","submitDisabled","showFooterActions","onClose"]),y=p?e(s,{justify:"flex-end",gap:"sm",children:[n(d,{variant:"subtle",onClick:function(){null==l||l(),v()},size:"sm",children:o}),n(d,{onClick:u,disabled:h,size:"sm",children:c})]}):void 0;return n(Te,ae({},g,{onClose:v,footer:y,children:r}))},je=function(t){var r=t.itemName,i=t.itemType,o=void 0===i?"Item":i,a=t.editButton,c=t.deleteButton,l=t.status,u=t.children,d=ce(t,["itemName","itemType","editButton","deleteButton","status","children"]),f=e(s,{gap:"xs",children:[l,a,c]});return n(Te,ae({},d,{title:"".concat(o,": ").concat(r),headerActions:f,children:u}))},Pe=function(e){var t=e.content,r=e.actions,i=ce(e,["content","actions"]);return n(Te,ae({},i,{footer:r,children:t}))},Re=function(e){void 0===e&&(e=!1);var n=r.useState(e),t=n[0],i=n[1];return{opened:t,open:r.useCallback(function(){return i(!0)},[]),close:r.useCallback(function(){return i(!1)},[]),toggle:r.useCallback(function(){return i(function(e){return!e})},[]),setOpened:i}},De=function(t){var i=t.item,o=t.actions,a=t.trigger,c=void 0===a?"dots":a,l=t.triggerLabel,s=void 0===l?"Actions":l,u=t.triggerIcon,f=void 0===u?V:u,h=t.triggerProps,m=void 0===h?{}:h,v=t.customTrigger,g=t.position,y=void 0===g?"bottom-end":g,b=t.withArrow,w=void 0!==b&&b,k=t.withinPortal,x=void 0===k||k,A=t["aria-label"],S=o.filter(function(e){return!e.hidden&&!(e.show&&!e.show(i))}),z=Oe(S);if(0===S.length)return null;var I=function(e){var t=e.icon;return n(F.Item,{leftSection:t&&n(t,{size:14}),color:e.color,disabled:e.disabled,onClick:function(){return function(e){return le(void 0,void 0,void 0,function(){var t;return se(this,function(r){switch(r.label){case 0:return r.trys.push([0,4,,5]),e.confirm?[2,new Promise(function(t){ie.openConfirmModal({title:e.confirm.title,children:n(C,{size:"sm",children:e.confirm.message}),labels:{confirm:e.confirm.confirmLabel||"Confirm",cancel:e.confirm.cancelLabel||"Cancel"},confirmProps:{color:e.color||"red"},onConfirm:function(){return le(void 0,void 0,void 0,function(){var n;return se(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,e.onClick(i)];case 1:return r.sent(),t(),[3,3];case 2:return n=r.sent(),console.error("Action ".concat(e.key," failed:"),n),re.show({title:"Action Failed",message:"Failed to ".concat(e.label.toLowerCase()),color:"red"}),[3,3];case 3:return[2]}})})},onCancel:function(){return t()}})})]:[3,1];case 1:return[4,e.onClick(i)];case 2:r.sent(),r.label=3;case 3:return[3,5];case 4:return t=r.sent(),console.error("Action ".concat(e.key," failed:"),t),re.show({title:"Action Failed",message:"Failed to ".concat(e.label.toLowerCase()),color:"red"}),[3,5];case 5:return[2]}})})}(e)},children:e.label},e.key)};return e(F,{position:y,withArrow:w,withinPortal:x,children:[n(F.Target,{children:v||("button"===c?n(p,ae({variant:"light",size:"xs",leftSection:n(f,{size:16})},m,{children:s})):n(d,ae({variant:"subtle",color:"gray",size:"sm","aria-label":A||"".concat(s," menu")},m,{children:n(f,{size:16})})))}),n(F.Dropdown,{children:z.map(function(t,i){return e(r.Fragment,{children:[t.map(I),i0&&i.push(n),t.length>0&&i.push(t),r.length>0&&i.push(r),i},Ue=function(e){return{key:"view",label:"View Details",icon:_,onClick:e}},Ne=function(e){return{key:"edit",label:"Edit",icon:B,color:"blue",onClick:e}},Me=function(e){return{key:"copy",label:"Duplicate",icon:X,onClick:e}},Be=function(e,n){return void 0===n&&(n="item"),{key:"delete",label:"Delete",icon:q,color:"red",onClick:e,confirm:{title:"Confirm Delete",message:"Are you sure you want to delete this ".concat(n,"? This action cannot be undone."),confirmLabel:"Delete",cancelLabel:"Cancel"}}},qe=function(e){return{key:"archive",label:"Archive",icon:Z,color:"orange",onClick:e,confirm:{title:"Archive Item",message:"Are you sure you want to archive this item?"}}},Ve=function(e){return{key:"restore",label:"Restore",icon:K,color:"green",onClick:e}},We=function(e,n,t){return ue(ue([],t?[Ue(t)]:[],!0),[Ne(e),Be(n,"user")],!1)},Ge=function(e,n,t){return ue(ue([Ne(e)],t?[{key:"configure",label:"Configure",icon:Q,onClick:t}]:[],!0),[Be(n,"application")],!1)},$e=function(e,n,t,r){return ue(ue(ue([],t?[{key:"execute",label:"Execute",icon:ee,color:"green",onClick:t}]:[],!0),r?[{key:"logs",label:"View Logs",icon:_,onClick:r}]:[],!0),[Ne(e),Be(n,"function")],!1)},Je=function(e,n,t){return ue(ue(ue([],n?[Me(n)]:[],!0),t?[{key:"refresh",label:"Refresh",icon:O,onClick:t}]:[],!0),[{key:"revoke",label:"Revoke",icon:ne,color:"red",onClick:e,confirm:{title:"Revoke Token",message:"Are you sure you want to revoke this token? This action cannot be undone and will immediately disable the token.",confirmLabel:"Revoke"}}],!1)},He=function(r){var i=r.variant,o=void 0===i?"spinner":i,a=r.size,c=void 0===a?"md":a,l=r.height,u=void 0===l?200:l,d=r.message,f=r.submessage,p=r.progress,v=r.progressLabel,g=r.rows,y=void 0===g?5:g,b=r.columns,w=void 0===b?3:b,k=r.color,x=void 0===k?"blue":k,S=r.withContainer,z=void 0===S||S,I=r.animate,F=void 0===I||I,L=function(){return{xs:"xs",sm:"sm",md:"md",lg:"lg",xl:"xl"}[c]},D=function(){return e(m,{align:"center",gap:"md",children:[n(T,{size:{xs:16,sm:24,md:32,lg:48,xl:64}[c],color:x}),d&&n(C,{size:L(),c:"dimmed",ta:"center",children:d}),f&&n(C,{size:"xs",c:"dimmed",ta:"center",children:f})]})},O=function(){switch(o){case"progress":return e(m,{gap:"md",children:[(d||v)&&e(s,{justify:"space-between",children:[n(C,{size:L(),children:d||"Loading..."}),v&&n(C,{size:"sm",c:"dimmed",children:v})]}),n(E,{value:p||0,color:x,size:c,animated:F}),f&&n(C,{size:"xs",c:"dimmed",ta:"center",children:f})]});case"skeleton-table":return e(m,{gap:"xs",children:[n(s,{gap:"md",children:Array.from({length:w}).map(function(e,t){return n(j,{height:20,width:"".concat(100/w,"%")},"header-".concat(t))})}),Array.from({length:y}).map(function(e,t){return n(s,{gap:"md",children:Array.from({length:w}).map(function(e,r){return n(j,{height:16,width:"".concat(100/w,"%")},"cell-".concat(t,"-").concat(r))})},"row-".concat(t))})]});case"skeleton-cards":return n(P,{cols:{base:1,sm:2,lg:w},children:Array.from({length:y*w}).map(function(t,r){return n(R,{padding:"md",withBorder:!0,children:e(m,{gap:"xs",children:[n(j,{height:20,width:"70%"}),n(j,{height:14}),n(j,{height:14,width:"90%"}),e(s,{justify:"apart",mt:"md",children:[n(j,{height:12,width:"40%"}),n(j,{height:12,width:"30%"})]})]})},"card-".concat(r))})});case"skeleton-form":return e(m,{gap:"md",children:[Array.from({length:y}).map(function(t,r){return e(h,{children:[n(j,{height:12,width:"30%",mb:"xs"}),n(j,{height:36})]},"form-field-".concat(r))}),e(s,{justify:"flex-end",mt:"xl",children:[n(j,{height:36,width:80}),n(j,{height:36,width:100})]})]});case"skeleton-text":return n(m,{gap:"xs",children:Array.from({length:y}).map(function(e,t){var r=["100%","95%","85%","90%","75%"];return n(j,{height:16,width:r[t%r.length]},"text-".concat(t))})});case"dots":return t=Array.from({length:3}).map(function(e,t){return n(h,{w:8,h:8,bg:x,style:{borderRadius:"50%",animation:F?"loading-dots 1.4s infinite ease-in-out ".concat(.16*t,"s"):void 0}},t)}),e(m,{align:"center",gap:"md",children:[n(s,{gap:"xs",children:t}),d&&n(C,{size:L(),c:"dimmed",ta:"center",children:d})]});case"overlay":return n(h,{style:{position:"absolute",top:0,left:0,right:0,bottom:0,backgroundColor:"rgba(255, 255, 255, 0.8)",backdropFilter:"blur(2px)",zIndex:1e3},children:n(A,{h:"100%",children:D()})});default:return D()}var t};if("overlay"===o)return e(t,{children:[O(),n("style",{children:Ye})]});var U=e(t,{children:[O(),F&&n("style",{children:Ye})]});return z?n(A,{h:u,children:U}):U},Ye="\n @keyframes loading-dots {\n 0%, 80%, 100% {\n transform: scale(0);\n opacity: 0.5;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n }\n",_e=function(e){var t=e.rows,r=void 0===t?5:t,i=e.columns;return n(He,{variant:"skeleton-table",rows:r,columns:void 0===i?4:i,withContainer:!1})},Xe=function(e){var t=e.count,r=void 0===t?6:t,i=e.columns,o=void 0===i?3:i;return n(He,{variant:"skeleton-cards",rows:Math.ceil(r/o),columns:o,withContainer:!1})},Ze=function(e){var t=e.fields;return n(He,{variant:"skeleton-form",rows:void 0===t?4:t,withContainer:!1})},Ke=function(e){var t=e.message;return n(He,{variant:"spinner",message:void 0===t?"Loading page...":t,height:"60vh",size:"lg"})},Qe=function(t){var r=t.message,i=void 0===r?"Loading...":r,o=t.size,a=void 0===o?"sm":o;return e(s,{gap:"xs",children:[n(T,{size:"xs"===a?12:"sm"===a?16:20}),n(C,{size:a,c:"dimmed",children:i})]})},en=function(e){void 0===e&&(e=!1);var n=r.useState(e),t=n[0],i=n[1],o=r.useState(0),a=o[0],c=o[1];return{loading:t,progress:a,startLoading:r.useCallback(function(){return i(!0)},[]),stopLoading:r.useCallback(function(){i(!1),c(0)},[]),updateProgress:r.useCallback(function(e){c(Math.max(0,Math.min(100,e)))},[]),setLoading:i,setProgress:c}},nn=function(e,n){var t=o([]),r=t[0],i=t[1],c=o(!1),l=c[0],s=c[1],u=o(null),d=u[0],f=u[1],h=o(0),m=h[0],p=h[1],v=o(!1),g=v[0],y=v[1],b=oe.create({baseURL:e.baseURL,timeout:e.timeout||1e4,headers:ae({"Content-Type":"application/json"},e.defaultHeaders)});b.interceptors.request.use(function(e){return e.headers["X-User-Email"]="admin@example.com",e},function(e){return Promise.reject(e)}),b.interceptors.response.use(function(e){return e},function(e){var n,t,r=(null===(t=null===(n=e.response)||void 0===n?void 0:n.data)||void 0===t?void 0:t.message)||e.message||"An error occurred";return f(r),Promise.reject(e)});var w=a(function(){f(null)},[]),k=a(function(){for(var e=[],t=0;t0?n.filter(function(e){return r.includes(e[t])}):n.filter(function(e){var n=e[t];return null!=n&&(n.toString().toLowerCase()===r.toString().toLowerCase()||"string"==typeof n&&"string"==typeof r&&n.toLowerCase().includes(r.toLowerCase()))}))}),n},[e,h,u,r]);return{filteredData:y,filters:u,setFilter:p,clearFilters:v,resetFilters:g,searchTerm:h,setSearchTerm:m}},rn=function(e,n){void 0===n&&(n="Success");var t={title:n,message:e,color:"green"};re.show(t)},on=function(e,n){void 0===n&&(n="Error");var t={title:n,message:e,color:"red"};re.show(t)},an=function(e,n){void 0===n&&(n="Warning");var t={title:n,message:e,color:"yellow"};re.show(t)},cn=function(e,n){void 0===n&&(n="Info");var t={title:n,message:e,color:"blue"};re.show(t)},ln={createSuccess:function(e){return"".concat(e," created successfully")},updateSuccess:function(e){return"".concat(e," updated successfully")},deleteSuccess:function(e){return"".concat(e," deleted successfully")},createError:function(e){return"Failed to create ".concat(e)},updateError:function(e){return"Failed to update ".concat(e)},deleteError:function(e){return"Failed to delete ".concat(e)},loadError:function(e){return"Failed to load ".concat(e)},networkError:"Network error occurred. Please try again.",validationError:"Please check the form for errors",requiredFieldError:function(e){return"".concat(e," is required")},authRequired:"Authentication required",permissionDenied:"Permission denied",sessionExpired:"Session expired. Please log in again.",applicationCreated:"Application created successfully",applicationUpdated:"Application updated successfully",applicationDeleted:"Application deleted successfully",tokenCreated:"Token created successfully",tokenRevoked:"Token revoked successfully",userCreated:"User created successfully",userUpdated:"User updated successfully",userDeleted:"User deleted successfully",functionCreated:"Function created successfully",functionUpdated:"Function updated successfully",functionDeleted:"Function deleted successfully",executionStarted:"Function execution started",executionCompleted:"Function execution completed",executionFailed:"Function execution failed"},sn={success:function(e,n){var t=ln["".concat(e,"Success")](n);rn(t)},error:function(e,n,t){var r=t||ln["".concat(e,"Error")](n);on(r)}},un={email:/^\S+@\S+\.\S+$/,url:/^https?:\/\/.+/,duration:/^\d+[smhd]$/,token:/^[a-zA-Z0-9_-]+$/,appId:/^[a-zA-Z0-9-_]+$/,uuid:/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i},dn={required:function(e){return"".concat(e," is required")},email:"Please enter a valid email address",url:"Please enter a valid URL (http:// or https://)",duration:"Duration must be in format like 30s, 5m, 2h, 1d",minLength:function(e,n){return"".concat(e," must be at least ").concat(n," characters")},maxLength:function(e,n){return"".concat(e," must be no more than ").concat(n," characters")},pattern:function(e){return"".concat(e," format is invalid")},token:"Token can only contain letters, numbers, underscores and hyphens",appId:"App ID can only contain letters, numbers, hyphens and underscores",uuid:"Please enter a valid UUID",positiveNumber:"Must be a positive number",range:function(e,n,t){return"".concat(e," must be between ").concat(n," and ").concat(t)}},fn=function(e){return null==e||""===e||Array.isArray(e)&&0===e.length?"This field is required":null},hn=function(e){return e?un.email.test(e)?null:dn.email:null},mn=function(e){return e?un.url.test(e)?null:dn.url:null},pn=function(e){return e?un.duration.test(e)?null:dn.duration:null},vn=function(e,n,t){return void 0===t&&(t="Field"),e?e.length>=n?null:dn.minLength(t,n):null},gn=function(e,n,t){return void 0===t&&(t="Field"),e?e.length<=n?null:dn.maxLength(t,n):null},yn=function(e,n,t){return void 0===t&&(t="Field"),e?n.test(e)?null:dn.pattern(t):null},bn=function(e,n,t,r){return void 0===r&&(r="Field"),null==e?null:et?dn.range(r,n,t):null},wn=function(e){return e?un.appId.test(e)?null:dn.appId:null},kn=function(e){return e?un.token.test(e)?null:dn.token:null},Cn=function(e){return e?un.uuid.test(e)?null:dn.uuid:null},xn=function(e){if(!e||""===e.trim())return null;try{return JSON.parse(e),null}catch(e){return"Invalid JSON format"}},An=function(e){var n=e.match(/^(\d+)([smhd]?)$/);if(!n)return 86400;var t=parseInt(n[1]);switch(n[2]||"h"){case"s":return t;case"m":return 60*t;case"h":default:return 3600*t;case"d":return 86400*t}},Sn=function(e){return e<60?"".concat(e,"s"):e<3600?"".concat(Math.floor(e/60),"m"):e<86400?"".concat(Math.floor(e/3600),"h"):"".concat(Math.floor(e/86400),"d")},zn=function(){for(var e=[],n=0;n= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","import React, { useEffect } from 'react';\nimport {\n Paper,\n TextInput,\n Select,\n MultiSelect,\n NumberInput,\n Textarea,\n JsonInput,\n Button,\n Group,\n Stack,\n Title,\n ActionIcon,\n ScrollArea,\n Box,\n Text,\n} from '@mantine/core';\nimport { IconX } from '@tabler/icons-react';\nimport { useForm } from '@mantine/form';\nimport { notifications } from '@mantine/notifications';\nimport { FormField, NotificationConfig } from '../../types';\n\nexport interface FormSidebarProps {\n opened: boolean;\n onClose: () => void;\n onSuccess: () => void;\n title: string;\n editMode?: boolean;\n editItem?: any;\n fields: FormField[];\n onSubmit: (values: any) => Promise;\n width?: number;\n initialValues?: Record;\n validateOnSubmit?: boolean;\n}\n\nconst FormSidebar: React.FC = ({\n opened,\n onClose,\n onSuccess,\n title,\n editMode = false,\n editItem,\n fields,\n onSubmit,\n width = 450,\n initialValues = {},\n validateOnSubmit = true,\n}) => {\n const isEditing = editMode && !!editItem;\n\n // Build initial form values from fields\n const buildInitialValues = () => {\n const values: Record = {};\n fields.forEach(field => {\n values[field.name] = field.defaultValue ?? (field.type === 'multiselect' ? [] : '');\n });\n return { ...values, ...initialValues };\n };\n\n // Build validation rules from fields\n const buildValidation = () => {\n const validation: Record string | null> = {};\n fields.forEach(field => {\n validation[field.name] = (value: any) => {\n if (field.required && (!value || (typeof value === 'string' && value.trim() === ''))) {\n return `${field.label} is required`;\n }\n if (field.validation?.email && value && !/^\\S+@\\S+$/.test(value)) {\n return 'Invalid email format';\n }\n if (field.validation?.url && value && !/^https?:\\/\\/.+/.test(value)) {\n return 'Invalid URL format';\n }\n if (field.validation?.minLength && value && value.length < field.validation.minLength) {\n return `${field.label} must be at least ${field.validation.minLength} characters`;\n }\n if (field.validation?.maxLength && value && value.length > field.validation.maxLength) {\n return `${field.label} must be no more than ${field.validation.maxLength} characters`;\n }\n if (field.validation?.pattern && value && !field.validation.pattern.test(value)) {\n return `${field.label} format is invalid`;\n }\n if (field.validation?.custom) {\n return field.validation.custom(value);\n }\n return null;\n };\n });\n return validation;\n };\n\n const form = useForm({\n initialValues: buildInitialValues(),\n validate: buildValidation(),\n });\n\n // Update form values when editItem changes\n useEffect(() => {\n if (isEditing && editItem) {\n const updatedValues: Record = {};\n fields.forEach(field => {\n updatedValues[field.name] = editItem[field.name] ?? field.defaultValue ?? '';\n });\n form.setValues(updatedValues);\n } else if (!isEditing) {\n form.setValues(buildInitialValues());\n }\n }, [editItem, opened, isEditing]);\n\n const handleSubmit = async (values: typeof form.values) => {\n try {\n await onSubmit(values);\n \n const successNotification: NotificationConfig = {\n title: 'Success',\n message: `${title} ${isEditing ? 'updated' : 'created'} successfully`,\n color: 'green',\n };\n \n notifications.show(successNotification);\n onSuccess();\n onClose();\n form.reset();\n } catch (error: any) {\n console.error(`Error ${isEditing ? 'updating' : 'creating'} ${title.toLowerCase()}:`, error);\n \n const errorNotification: NotificationConfig = {\n title: 'Error',\n message: error.message || `Failed to ${isEditing ? 'update' : 'create'} ${title.toLowerCase()}`,\n color: 'red',\n };\n \n notifications.show(errorNotification);\n }\n };\n\n const renderField = (field: FormField) => {\n const inputProps = form.getInputProps(field.name);\n const commonProps = {\n key: field.name,\n label: field.label,\n placeholder: field.placeholder,\n description: field.description,\n required: field.required,\n disabled: field.disabled || (isEditing && field.name === 'id'),\n ...inputProps,\n };\n\n switch (field.type) {\n case 'email':\n return ;\n \n case 'number':\n return ;\n \n case 'textarea':\n return