@igstack/app-catalog-frontend-core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/dist/esm/api/infra/trpc.d.ts +0 -1491
  2. package/dist/esm/modules/appCatalog/context/AppCatalogContext.js +1 -0
  3. package/dist/esm/modules/appCatalog/context/AppCatalogContext.js.map +1 -1
  4. package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js +23 -11
  5. package/dist/esm/modules/appCatalog/ui/filters/FilterBar.js.map +1 -1
  6. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.d.ts +5 -1
  7. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js +146 -56
  8. package/dist/esm/modules/appCatalog/ui/grid/AppCatalogGrid.js.map +1 -1
  9. package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js +20 -1
  10. package/dist/esm/modules/appCatalog/ui/pages/AppCatalogPage.js.map +1 -1
  11. package/dist/esm/modules/auth/AuthContext.js +1 -1
  12. package/dist/esm/modules/auth/AuthModalContext.js +1 -1
  13. package/dist/esm/modules/auth/authClient.d.ts +2 -2
  14. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js +4 -37
  15. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js.map +1 -1
  16. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js +2 -10
  17. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/api.js.map +1 -1
  18. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/checks.js +1 -1
  19. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js +0 -44
  20. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/json-schema-processors.js.map +1 -1
  21. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js +0 -4
  22. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/parse.js.map +1 -1
  23. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js +0 -2
  24. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/regexes.js.map +1 -1
  25. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js +4 -49
  26. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js.map +1 -1
  27. package/dist/esm/routeTree.gen.d.ts +3 -164
  28. package/dist/esm/routeTree.gen.js +8 -80
  29. package/dist/esm/routeTree.gen.js.map +1 -1
  30. package/dist/esm/ui/button.d.ts +1 -1
  31. package/dist/esm/ui/card.js +1 -48
  32. package/dist/esm/ui/card.js.map +1 -1
  33. package/dist/esm/ui/command.js +1 -15
  34. package/dist/esm/ui/command.js.map +1 -1
  35. package/dist/esm/ui/components/header/Header.js +2 -11
  36. package/dist/esm/ui/components/header/Header.js.map +1 -1
  37. package/dist/esm/ui/input-group.js +125 -0
  38. package/dist/esm/ui/input-group.js.map +1 -0
  39. package/package.json +3 -3
  40. package/src/modules/appCatalog/ui/components/AppDetailModal.tsx +2 -21
  41. package/src/routeTree.gen.ts +2 -220
  42. package/src/ui/components/header/Header.tsx +2 -12
  43. package/dist/esm/components/IconPickerDialog.d.ts +0 -8
  44. package/dist/esm/components/IconPickerDialog.js +0 -98
  45. package/dist/esm/components/IconPickerDialog.js.map +0 -1
  46. package/dist/esm/components/IconPickerField.d.ts +0 -9
  47. package/dist/esm/components/IconPickerField.js +0 -76
  48. package/dist/esm/components/IconPickerField.js.map +0 -1
  49. package/dist/esm/modules/admin-base/components/AdminChat.d.ts +0 -1
  50. package/dist/esm/modules/admin-base/components/AdminChat.js +0 -82
  51. package/dist/esm/modules/admin-base/components/AdminChat.js.map +0 -1
  52. package/dist/esm/modules/admin-base/components/AdminLayout.d.ts +0 -5
  53. package/dist/esm/modules/admin-base/components/AdminLayout.js +0 -83
  54. package/dist/esm/modules/admin-base/components/AdminLayout.js.map +0 -1
  55. package/dist/esm/modules/admin-base/components/AdminWelcome.d.ts +0 -1
  56. package/dist/esm/modules/admin-base/components/AdminWelcome.js +0 -37
  57. package/dist/esm/modules/admin-base/components/AdminWelcome.js.map +0 -1
  58. package/dist/esm/modules/admin-base/context/AdminConfigContext.d.ts +0 -8
  59. package/dist/esm/modules/admin-base/context/AdminConfigContext.js +0 -27
  60. package/dist/esm/modules/admin-base/context/AdminConfigContext.js.map +0 -1
  61. package/dist/esm/modules/admin-base/index.d.ts +0 -5
  62. package/dist/esm/modules/admin-base/types/adminTypes.d.ts +0 -10
  63. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.d.ts +0 -1
  64. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js +0 -196
  65. package/dist/esm/modules/appCatalog/AppCatalogAdminPage.js.map +0 -1
  66. package/dist/esm/modules/appCatalog/ScreenshotItem.js +0 -57
  67. package/dist/esm/modules/appCatalog/ScreenshotItem.js.map +0 -1
  68. package/dist/esm/modules/appCatalog/ScreenshotManager.js +0 -155
  69. package/dist/esm/modules/appCatalog/ScreenshotManager.js.map +0 -1
  70. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.d.ts +0 -7
  71. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js +0 -323
  72. package/dist/esm/modules/approvalMethod/AccessRequestFormFields.js.map +0 -1
  73. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.d.ts +0 -14
  74. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js +0 -227
  75. package/dist/esm/modules/approvalMethod/ApprovalMethodForm.js.map +0 -1
  76. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.d.ts +0 -7
  77. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js +0 -124
  78. package/dist/esm/modules/approvalMethod/ApprovalMethodSelector.js.map +0 -1
  79. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.d.ts +0 -381
  80. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js +0 -26
  81. package/dist/esm/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.js.map +0 -1
  82. package/dist/esm/modules/auth/authUtils.js +0 -25
  83. package/dist/esm/modules/auth/authUtils.js.map +0 -1
  84. package/dist/esm/modules/icons/IconManagementPage.d.ts +0 -1
  85. package/dist/esm/modules/icons/IconManagementPage.js +0 -177
  86. package/dist/esm/modules/icons/IconManagementPage.js.map +0 -1
  87. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -60
  88. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.2/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
  89. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js +0 -3055
  90. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
  91. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -593
  92. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.2_react@19.1.2__react@19.1.2__react@19.1.2/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
  93. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -302
  94. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.2/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
  95. package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js +0 -34
  96. package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/dist/resolvers.js.map +0 -1
  97. package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js +0 -94
  98. package/dist/esm/node_modules/.pnpm/@hookform_resolvers@5.2.2_react-hook-form@7.71.1_react@19.1.2_/node_modules/@hookform/resolvers/zod/dist/zod.js.map +0 -1
  99. package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js +0 -1894
  100. package/dist/esm/node_modules/.pnpm/react-hook-form@7.71.1_react@19.1.2/node_modules/react-hook-form/dist/index.esm.js.map +0 -1
  101. package/dist/esm/routes/admin/app-for-catalog/$id.d.ts +0 -5
  102. package/dist/esm/routes/admin/app-for-catalog/_id.js +0 -67
  103. package/dist/esm/routes/admin/app-for-catalog/_id.js.map +0 -1
  104. package/dist/esm/routes/admin/app-for-catalog/_id2.js +0 -321
  105. package/dist/esm/routes/admin/app-for-catalog/_id2.js.map +0 -1
  106. package/dist/esm/routes/admin/app-for-catalog/index.d.ts +0 -1
  107. package/dist/esm/routes/admin/app-for-catalog/index.js +0 -9
  108. package/dist/esm/routes/admin/app-for-catalog/index.js.map +0 -1
  109. package/dist/esm/routes/admin/app-for-catalog/index2.js +0 -12
  110. package/dist/esm/routes/admin/app-for-catalog/index2.js.map +0 -1
  111. package/dist/esm/routes/admin/app-for-catalog.d.ts +0 -1
  112. package/dist/esm/routes/admin/app-for-catalog.js +0 -14
  113. package/dist/esm/routes/admin/app-for-catalog.js.map +0 -1
  114. package/dist/esm/routes/admin/app-for-catalog2.js +0 -9
  115. package/dist/esm/routes/admin/app-for-catalog2.js.map +0 -1
  116. package/dist/esm/routes/admin/approval-methods/index.d.ts +0 -32
  117. package/dist/esm/routes/admin/approval-methods/index.js +0 -24
  118. package/dist/esm/routes/admin/approval-methods/index.js.map +0 -1
  119. package/dist/esm/routes/admin/approval-methods/index2.js +0 -100
  120. package/dist/esm/routes/admin/approval-methods/index2.js.map +0 -1
  121. package/dist/esm/routes/admin/approval-methods.d.ts +0 -1
  122. package/dist/esm/routes/admin/approval-methods.js +0 -14
  123. package/dist/esm/routes/admin/approval-methods.js.map +0 -1
  124. package/dist/esm/routes/admin/approval-methods2.js +0 -7
  125. package/dist/esm/routes/admin/approval-methods2.js.map +0 -1
  126. package/dist/esm/routes/admin/chat.d.ts +0 -1
  127. package/dist/esm/routes/admin/chat.js +0 -14
  128. package/dist/esm/routes/admin/chat.js.map +0 -1
  129. package/dist/esm/routes/admin/chat2.js +0 -9
  130. package/dist/esm/routes/admin/chat2.js.map +0 -1
  131. package/dist/esm/routes/admin/icons.d.ts +0 -1
  132. package/dist/esm/routes/admin/icons.js +0 -14
  133. package/dist/esm/routes/admin/icons.js.map +0 -1
  134. package/dist/esm/routes/admin/icons2.js +0 -12
  135. package/dist/esm/routes/admin/icons2.js.map +0 -1
  136. package/dist/esm/routes/admin/index.d.ts +0 -1
  137. package/dist/esm/routes/admin/index.js +0 -9
  138. package/dist/esm/routes/admin/index.js.map +0 -1
  139. package/dist/esm/routes/admin/index2.js +0 -9
  140. package/dist/esm/routes/admin/index2.js.map +0 -1
  141. package/dist/esm/routes/admin.d.ts +0 -1
  142. package/dist/esm/routes/admin.js +0 -37
  143. package/dist/esm/routes/admin.js.map +0 -1
  144. package/dist/esm/routes/admin2.js +0 -18
  145. package/dist/esm/routes/admin2.js.map +0 -1
  146. package/dist/esm/ui/alert-dialog.js +0 -141
  147. package/dist/esm/ui/alert-dialog.js.map +0 -1
  148. package/dist/esm/ui/breadcrumb.js +0 -84
  149. package/dist/esm/ui/breadcrumb.js.map +0 -1
  150. package/dist/esm/ui/components/Breadcrumbs.js +0 -36
  151. package/dist/esm/ui/components/Breadcrumbs.js.map +0 -1
  152. package/dist/esm/ui/crud-list/CrudList.js +0 -189
  153. package/dist/esm/ui/crud-list/CrudList.js.map +0 -1
  154. package/dist/esm/ui/editable-list/EditableListField.js +0 -130
  155. package/dist/esm/ui/editable-list/EditableListField.js.map +0 -1
  156. package/dist/esm/ui/form.js +0 -134
  157. package/dist/esm/ui/form.js.map +0 -1
  158. package/dist/esm/ui/linkExternal.js +0 -26
  159. package/dist/esm/ui/linkExternal.js.map +0 -1
  160. package/dist/esm/ui/markdown-editor/MarkdownEditor.js +0 -116
  161. package/dist/esm/ui/markdown-editor/MarkdownEditor.js.map +0 -1
  162. package/dist/esm/ui/markdown-editor/MarkdownToolbar.js +0 -99
  163. package/dist/esm/ui/markdown-editor/MarkdownToolbar.js.map +0 -1
  164. package/dist/esm/ui/scroll-area.js +0 -62
  165. package/dist/esm/ui/scroll-area.js.map +0 -1
  166. package/dist/esm/ui/select.js +0 -138
  167. package/dist/esm/ui/select.js.map +0 -1
  168. package/dist/esm/ui/textarea.js +0 -19
  169. package/dist/esm/ui/textarea.js.map +0 -1
  170. package/src/components/IconPickerDialog.tsx +0 -136
  171. package/src/components/IconPickerField.tsx +0 -88
  172. package/src/modules/admin-base/components/AdminChat.tsx +0 -122
  173. package/src/modules/admin-base/components/AdminLayout.tsx +0 -111
  174. package/src/modules/admin-base/components/AdminWelcome.tsx +0 -52
  175. package/src/modules/admin-base/context/AdminConfigContext.tsx +0 -36
  176. package/src/modules/admin-base/index.ts +0 -16
  177. package/src/modules/admin-base/types/adminTypes.ts +0 -11
  178. package/src/modules/appCatalog/AppCatalogAdminPage.tsx +0 -274
  179. package/src/modules/approvalMethod/AccessRequestFormFields.tsx +0 -393
  180. package/src/modules/approvalMethod/ApprovalMethodForm.tsx +0 -323
  181. package/src/modules/approvalMethod/ApprovalMethodSelector.tsx +0 -150
  182. package/src/modules/approvalMethod/api/ApiQueryMagazineApprovalMethod.ts +0 -34
  183. package/src/modules/icons/IconManagementPage.tsx +0 -245
  184. package/src/routes/admin/app-for-catalog/$id.tsx +0 -571
  185. package/src/routes/admin/app-for-catalog/index.tsx +0 -19
  186. package/src/routes/admin/app-for-catalog.tsx +0 -12
  187. package/src/routes/admin/approval-methods/index.tsx +0 -161
  188. package/src/routes/admin/approval-methods.tsx +0 -10
  189. package/src/routes/admin/chat.tsx +0 -13
  190. package/src/routes/admin/icons.tsx +0 -22
  191. package/src/routes/admin/index.tsx +0 -9
  192. package/src/routes/admin.tsx +0 -60
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sources":["../../../src/ui/command.tsx"],"sourcesContent":["'use client'\n\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { SearchIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '~/lib/utils'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '~/ui/dialog'\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = true,\n commandProps,\n position = 'center',\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n commandProps?: React.ComponentProps<typeof Command>\n position?: 'center' | 'top'\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n 'overflow-hidden p-0',\n position === 'top' && 'top-[10%] translate-y-0',\n className,\n )}\n showCloseButton={showCloseButton}\n >\n <Command\n className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\"\n {...commandProps}\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n 'max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut\n}\n\n"],"names":["CommandPrimitive"],"mappings":";;;;;;AAeA;AAAiB;AACf;AAEF;AACE;AACE;AAACA;AAAA;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AA4CA;AAAsB;AACpB;AAEF;AACE;AACE;AAAC;AAAA;AACW;AACA;AAEV;AAAmD;AACnD;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAAA;AACN;AAAA;AAGN;AAEA;AAAqB;AACnB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AAEA;AAAsB;AAEtB;AACE;AACE;AAAkB;AAAjB;AACW;AACA;AACN;AAAA;AAGV;AAEA;AAAsB;AACpB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AAEA;AAA0B;AACxB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACqC;AAC3C;AAAA;AAGV;AAEA;AAAqB;AACnB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;;;;;;;;;;"}
1
+ {"version":3,"file":"command.js","sources":["../../../src/ui/command.tsx"],"sourcesContent":["'use client'\n\nimport { Command as CommandPrimitive } from 'cmdk'\nimport { SearchIcon } from 'lucide-react'\nimport * as React from 'react'\n\nimport { cn } from '~/lib/utils'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '~/ui/dialog'\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n data-slot=\"command\"\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandDialog({\n title = 'Command Palette',\n description = 'Search for a command to run...',\n children,\n className,\n showCloseButton = true,\n commandProps,\n position = 'center',\n ...props\n}: React.ComponentProps<typeof Dialog> & {\n title?: string\n description?: string\n className?: string\n showCloseButton?: boolean\n commandProps?: React.ComponentProps<typeof Command>\n position?: 'center' | 'top'\n}) {\n return (\n <Dialog {...props}>\n <DialogHeader className=\"sr-only\">\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>{description}</DialogDescription>\n </DialogHeader>\n <DialogContent\n className={cn(\n 'overflow-hidden p-0',\n position === 'top' && 'top-[10%] translate-y-0',\n className,\n )}\n showCloseButton={showCloseButton}\n >\n <Command\n className=\"[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\"\n {...commandProps}\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n data-slot=\"command-input-wrapper\"\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n data-slot=\"command-input\"\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n )\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn(\n 'max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n data-slot=\"command-empty\"\n className=\"py-6 text-center text-sm\"\n {...props}\n />\n )\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('bg-border -mx-1 h-px', className)}\n {...props}\n />\n )\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n Command,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut\n}\n\n"],"names":["CommandPrimitive"],"mappings":";;;;;;AAeA;AAAiB;AACf;AAEF;AACE;AACE;AAACA;AAAA;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AA4CA;AAAsB;AACpB;AAEF;AACE;AACE;AAAC;AAAA;AACW;AACA;AAEV;AAAmD;AACnD;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAAA;AACN;AAAA;AAGN;AAEA;AAAqB;AACnB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AAEA;AAAsB;AAEtB;AACE;AACE;AAAkB;AAAjB;AACW;AACA;AACN;AAAA;AAGV;AAEA;AAAsB;AACpB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;AAeA;AAAqB;AACnB;AAEF;AACE;AACE;AAAkB;AAAjB;AACW;AACC;AACT;AACA;AAAA;AAEE;AAAA;AAGV;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useNavigate, Link } from "@tanstack/react-router";
3
- import { Settings, LogOut } from "lucide-react";
2
+ import { Link } from "@tanstack/react-router";
3
+ import { LogOut } from "lucide-react";
4
4
  import SvgAppCatalog from "../../../assets/app-catalog.svg.js";
5
5
  import { ThemeSwitcher } from "../../../components/ThemeSwitcher.js";
6
6
  import { useAppCatalogContext } from "../../../modules/appCatalog/context/AppCatalogContext.js";
@@ -16,7 +16,6 @@ function Header({ middle }) {
16
16
  const isAuthenticated = useIsAuthenticated();
17
17
  const user = useUser();
18
18
  const { logout } = useAuthActions();
19
- const navigate = useNavigate();
20
19
  const { open: openLoginModal } = useAuthModal();
21
20
  const { appVersion } = useAppCatalogContext();
22
21
  const handleLogout = async () => {
@@ -26,9 +25,6 @@ function Header({ middle }) {
26
25
  console.error("Logout failed:", error);
27
26
  }
28
27
  };
29
- const handleAdminClick = () => {
30
- navigate({ to: "/admin" });
31
- };
32
28
  const handleLoginClick = () => {
33
29
  const currentUrl = window.location.pathname + window.location.search;
34
30
  openLoginModal(currentUrl);
@@ -98,11 +94,6 @@ function Header({ middle }) {
98
94
  ] })
99
95
  ] }),
100
96
  /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
101
- /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: handleAdminClick, children: [
102
- /* @__PURE__ */ jsx(Settings, { className: "h-4 w-4 mr-2" }),
103
- /* @__PURE__ */ jsx("span", { children: "Admin" })
104
- ] }),
105
- /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
106
97
  /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: handleLogout, children: [
107
98
  /* @__PURE__ */ jsx(LogOut, { className: "h-4 w-4 mr-2" }),
108
99
  /* @__PURE__ */ jsx("span", { children: "Sign out" })
@@ -1 +1 @@
1
- {"version":3,"file":"Header.js","sources":["../../../../../src/ui/components/header/Header.tsx"],"sourcesContent":["import { Link, useNavigate } from '@tanstack/react-router'\nimport { LogOut, Settings } from 'lucide-react'\nimport type React from 'react'\nimport AppCatalogLogo from '~/assets/app-catalog.svg?react'\nimport { ThemeSwitcher } from '~/components/ThemeSwitcher'\nimport { useAppCatalogContext } from '~/modules/appCatalog/context/AppCatalogContext'\nimport {\n useAuth,\n useAuthActions,\n useIsAuthenticated,\n useUser,\n} from '~/modules/auth'\nimport { useAuthModal } from '~/modules/auth/AuthModalContext'\nimport { Button } from '~/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '~/ui/dropdown-menu'\nimport { Skeleton } from '~/ui/skeleton'\n\nexport interface HeaderProps {\n middle?: React.ReactNode\n}\n\nexport function Header({ middle }: HeaderProps) {\n const { isLoading } = useAuth()\n const isAuthenticated = useIsAuthenticated()\n const user = useUser()\n const { logout } = useAuthActions()\n const navigate = useNavigate()\n const { open: openLoginModal } = useAuthModal()\n const { appVersion } = useAppCatalogContext()\n\n const handleLogout = async () => {\n try {\n await logout()\n } catch (error) {\n console.error('Logout failed:', error)\n }\n }\n\n const handleAdminClick = () => {\n navigate({ to: '/admin' })\n }\n\n const handleLoginClick = () => {\n // Preserve the current URL for redirect after login\n const currentUrl = window.location.pathname + window.location.search\n openLoginModal(currentUrl)\n }\n\n return (\n <div className=\"flex items-center mb-4 pb-4 gap-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <Link to=\"/\">\n <div className=\"flex items-center gap-2\">\n <AppCatalogLogo className=\"h-16 w-16\" />\n <div className=\"flex flex-col\">\n <span className=\"text-lg font-bold\">App Catalog</span>\n {appVersion &&\n (appVersion.url ? (\n <a\n href={appVersion.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-primary hover:text-primary/80 transition-colors font-medium py-0.5\"\n onClick={(e) => e.stopPropagation()}\n >\n {appVersion.displayName}\n </a>\n ) : (\n <span className=\"text-xs text-muted-foreground py-0.5\">\n {appVersion.displayName}\n </span>\n ))}\n </div>\n </div>\n </Link>\n </div>\n {middle && <div className=\"flex-1\">{middle}</div>}\n <div className=\"flex items-center gap-3 ml-auto\">\n <ThemeSwitcher />\n {isLoading ? (\n <Skeleton className=\"w-8 h-8 rounded-full\" />\n ) : !isAuthenticated ? (\n <button\n type=\"button\"\n onClick={handleLoginClick}\n className=\"text-sm font-medium text-muted-foreground hover:text-foreground cursor-pointer\"\n >\n Login\n </button>\n ) : user?.name ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-8 h-8 rounded-full p-0 hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n {user.image ? (\n <img\n src={user.image}\n alt={user.name}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-full h-full rounded-full bg-primary text-primary-foreground text-xs font-semibold\">\n {user.name.charAt(0).toUpperCase()}\n </div>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <div className=\"px-2 py-3 flex items-center gap-3\">\n {user.image ? (\n <img\n src={user.image}\n alt={user.name}\n className=\"w-10 h-10 rounded-full object-cover shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-full bg-primary text-primary-foreground text-sm font-semibold shrink-0\">\n {user.name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex flex-col min-w-0\">\n <p className=\"text-xs text-muted-foreground truncate\">\n @{user.email?.split('@')[0] || 'user'}\n </p>\n <p className=\"text-sm font-medium truncate\">{user.name}</p>\n </div>\n </div>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleAdminClick}>\n <Settings className=\"h-4 w-4 mr-2\" />\n <span>Admin</span>\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"h-4 w-4 mr-2\" />\n <span>Sign out</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n )\n}\n"],"names":["AppCatalogLogo"],"mappings":"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"}
1
+ {"version":3,"file":"Header.js","sources":["../../../../../src/ui/components/header/Header.tsx"],"sourcesContent":["import { Link } from '@tanstack/react-router'\nimport { LogOut } from 'lucide-react'\nimport type React from 'react'\nimport AppCatalogLogo from '~/assets/app-catalog.svg?react'\nimport { ThemeSwitcher } from '~/components/ThemeSwitcher'\nimport { useAppCatalogContext } from '~/modules/appCatalog/context/AppCatalogContext'\nimport {\n useAuth,\n useAuthActions,\n useIsAuthenticated,\n useUser,\n} from '~/modules/auth'\nimport { useAuthModal } from '~/modules/auth/AuthModalContext'\nimport { Button } from '~/ui/button'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '~/ui/dropdown-menu'\nimport { Skeleton } from '~/ui/skeleton'\n\nexport interface HeaderProps {\n middle?: React.ReactNode\n}\n\nexport function Header({ middle }: HeaderProps) {\n const { isLoading } = useAuth()\n const isAuthenticated = useIsAuthenticated()\n const user = useUser()\n const { logout } = useAuthActions()\n const { open: openLoginModal } = useAuthModal()\n const { appVersion } = useAppCatalogContext()\n\n const handleLogout = async () => {\n try {\n await logout()\n } catch (error) {\n console.error('Logout failed:', error)\n }\n }\n\n const handleLoginClick = () => {\n // Preserve the current URL for redirect after login\n const currentUrl = window.location.pathname + window.location.search\n openLoginModal(currentUrl)\n }\n\n return (\n <div className=\"flex items-center mb-4 pb-4 gap-4 border-b\">\n <div className=\"flex items-center gap-4\">\n <Link to=\"/\">\n <div className=\"flex items-center gap-2\">\n <AppCatalogLogo className=\"h-16 w-16\" />\n <div className=\"flex flex-col\">\n <span className=\"text-lg font-bold\">App Catalog</span>\n {appVersion &&\n (appVersion.url ? (\n <a\n href={appVersion.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-primary hover:text-primary/80 transition-colors font-medium py-0.5\"\n onClick={(e) => e.stopPropagation()}\n >\n {appVersion.displayName}\n </a>\n ) : (\n <span className=\"text-xs text-muted-foreground py-0.5\">\n {appVersion.displayName}\n </span>\n ))}\n </div>\n </div>\n </Link>\n </div>\n {middle && <div className=\"flex-1\">{middle}</div>}\n <div className=\"flex items-center gap-3 ml-auto\">\n <ThemeSwitcher />\n {isLoading ? (\n <Skeleton className=\"w-8 h-8 rounded-full\" />\n ) : !isAuthenticated ? (\n <button\n type=\"button\"\n onClick={handleLoginClick}\n className=\"text-sm font-medium text-muted-foreground hover:text-foreground cursor-pointer\"\n >\n Login\n </button>\n ) : user?.name ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"w-8 h-8 rounded-full p-0 hover:bg-accent hover:text-accent-foreground cursor-pointer\"\n >\n {user.image ? (\n <img\n src={user.image}\n alt={user.name}\n className=\"w-full h-full rounded-full object-cover\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-full h-full rounded-full bg-primary text-primary-foreground text-xs font-semibold\">\n {user.name.charAt(0).toUpperCase()}\n </div>\n )}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56\">\n <div className=\"px-2 py-3 flex items-center gap-3\">\n {user.image ? (\n <img\n src={user.image}\n alt={user.name}\n className=\"w-10 h-10 rounded-full object-cover shrink-0\"\n />\n ) : (\n <div className=\"flex items-center justify-center w-10 h-10 rounded-full bg-primary text-primary-foreground text-sm font-semibold shrink-0\">\n {user.name.charAt(0).toUpperCase()}\n </div>\n )}\n <div className=\"flex flex-col min-w-0\">\n <p className=\"text-xs text-muted-foreground truncate\">\n @{user.email?.split('@')[0] || 'user'}\n </p>\n <p className=\"text-sm font-medium truncate\">{user.name}</p>\n </div>\n </div>\n <DropdownMenuSeparator />\n <DropdownMenuItem onClick={handleLogout}>\n <LogOut className=\"h-4 w-4 mr-2\" />\n <span>Sign out</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n )\n}\n"],"names":["AppCatalogLogo"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../lib/utils.js";
4
+ import { Button } from "./button.js";
5
+ import { Input } from "./input.js";
6
+ function InputGroup({ className, ...props }) {
7
+ return /* @__PURE__ */ jsx(
8
+ "div",
9
+ {
10
+ "data-slot": "input-group",
11
+ role: "group",
12
+ className: cn(
13
+ "group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none",
14
+ "h-9 min-w-0 has-[>textarea]:h-auto",
15
+ // Variants based on alignment.
16
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2",
17
+ "has-[>[data-align=inline-end]]:[&>input]:pr-2",
18
+ "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3",
19
+ "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
20
+ // Focus state.
21
+ "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]",
22
+ // Error state.
23
+ "has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40",
24
+ className
25
+ ),
26
+ ...props
27
+ }
28
+ );
29
+ }
30
+ const inputGroupAddonVariants = cva(
31
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50",
32
+ {
33
+ variants: {
34
+ align: {
35
+ "inline-start": "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
36
+ "inline-end": "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
37
+ "block-start": "order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5",
38
+ "block-end": "order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5"
39
+ }
40
+ },
41
+ defaultVariants: {
42
+ align: "inline-start"
43
+ }
44
+ }
45
+ );
46
+ function InputGroupAddon({
47
+ className,
48
+ align = "inline-start",
49
+ ...props
50
+ }) {
51
+ return /* @__PURE__ */ jsx(
52
+ "div",
53
+ {
54
+ role: "group",
55
+ "data-slot": "input-group-addon",
56
+ "data-align": align,
57
+ className: cn(inputGroupAddonVariants({ align }), className),
58
+ onClick: (e) => {
59
+ var _a, _b;
60
+ if (e.target.closest("button")) {
61
+ return;
62
+ }
63
+ (_b = (_a = e.currentTarget.parentElement) == null ? void 0 : _a.querySelector("input")) == null ? void 0 : _b.focus();
64
+ },
65
+ ...props
66
+ }
67
+ );
68
+ }
69
+ const inputGroupButtonVariants = cva(
70
+ "text-sm shadow-none flex gap-2 items-center",
71
+ {
72
+ variants: {
73
+ size: {
74
+ xs: "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
75
+ sm: "h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
76
+ "icon-xs": "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
77
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0"
78
+ }
79
+ },
80
+ defaultVariants: {
81
+ size: "xs"
82
+ }
83
+ }
84
+ );
85
+ function InputGroupButton({
86
+ className,
87
+ type = "button",
88
+ variant = "ghost",
89
+ size = "xs",
90
+ ...props
91
+ }) {
92
+ return /* @__PURE__ */ jsx(
93
+ Button,
94
+ {
95
+ type,
96
+ "data-size": size,
97
+ variant,
98
+ className: cn(inputGroupButtonVariants({ size }), className),
99
+ ...props
100
+ }
101
+ );
102
+ }
103
+ function InputGroupInput({
104
+ className,
105
+ ...props
106
+ }) {
107
+ return /* @__PURE__ */ jsx(
108
+ Input,
109
+ {
110
+ "data-slot": "input-group-control",
111
+ className: cn(
112
+ "flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
113
+ className
114
+ ),
115
+ ...props
116
+ }
117
+ );
118
+ }
119
+ export {
120
+ InputGroup,
121
+ InputGroupAddon,
122
+ InputGroupButton,
123
+ InputGroupInput
124
+ };
125
+ //# sourceMappingURL=input-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-group.js","sources":["../../../src/ui/input-group.tsx"],"sourcesContent":["import type { VariantProps } from 'class-variance-authority'\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\n\nimport { cn } from '~/lib/utils'\nimport { Button } from '~/ui/button'\nimport { Input } from '~/ui/input'\nimport { Textarea } from '~/ui/textarea'\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n 'group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none',\n 'h-9 min-w-0 has-[>textarea]:h-auto',\n\n // Variants based on alignment.\n 'has-[>[data-align=inline-start]]:[&>input]:pl-2',\n 'has-[>[data-align=inline-end]]:[&>input]:pr-2',\n 'has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3',\n 'has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3',\n\n // Focus state.\n 'has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]',\n\n // Error state.\n 'has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40',\n\n className,\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50\",\n {\n variants: {\n align: {\n 'inline-start':\n 'order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]',\n 'inline-end':\n 'order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]',\n 'block-start':\n 'order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5',\n 'block-end':\n 'order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5',\n },\n },\n defaultVariants: {\n align: 'inline-start',\n },\n },\n)\n\nfunction InputGroupAddon({\n className,\n align = 'inline-start',\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest('button')) {\n return\n }\n e.currentTarget.parentElement?.querySelector('input')?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n 'text-sm shadow-none flex gap-2 items-center',\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\n sm: 'h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5',\n 'icon-xs':\n 'size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0',\n 'icon-sm': 'size-8 p-0 has-[>svg]:p-0',\n },\n },\n defaultVariants: {\n size: 'xs',\n },\n },\n)\n\nfunction InputGroupButton({\n className,\n type = 'button',\n variant = 'ghost',\n size = 'xs',\n ...props\n}: Omit<React.ComponentProps<typeof Button>, 'size'> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<'input'>) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n 'flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent',\n className,\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<'textarea'>) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n 'flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent',\n className,\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton, InputGroupInput, InputGroupText, InputGroupTextarea\n}\n\n"],"names":[],"mappings":";;;;;AASA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAsC;AACxE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA,QAGA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,QAGA;AAAA;AAAA,QAGA;AAAA,QAEA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,gBACE;AAAA,QACF,cACE;AAAA,QACF,eACE;AAAA,QACF,aACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACL,GAA+E;AAC7E,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAW,GAAG,wBAAwB,EAAE,MAAA,CAAO,GAAG,SAAS;AAAA,MAC3D,SAAS,CAAC,MAAM;;AACd,YAAK,EAAE,OAAuB,QAAQ,QAAQ,GAAG;AAC/C;AAAA,QACF;AACA,sBAAE,cAAc,kBAAhB,mBAA+B,cAAc,aAA7C,mBAAuD;AAAA,MACzD;AAAA,MACC,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,MAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,WACE;AAAA,QACF,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ;AAEA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,GAAG;AACL,GACiD;AAC/C,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,aAAW;AAAA,MACX;AAAA,MACA,WAAW,GAAG,yBAAyB,EAAE,KAAA,CAAM,GAAG,SAAS;AAAA,MAC1D,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;AAcA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA,GAAG;AACL,GAAkC;AAChC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAED,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@igstack/app-catalog-frontend-core",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Frontend core library for App Catalog",
5
5
  "homepage": "https://github.com/lislon/app-catalog",
6
6
  "repository": {
@@ -133,8 +133,8 @@
133
133
  "vite-plugin-static-copy": "^3.1.4",
134
134
  "vite-plugin-svgr": "^4.2.0",
135
135
  "vitest": "3.2.2",
136
- "@igstack/app-catalog-shared-core": "0.2.0",
137
- "@igstack/app-catalog-backend-core": "0.2.0"
136
+ "@igstack/app-catalog-shared-core": "0.3.0",
137
+ "@igstack/app-catalog-backend-core": "0.3.0"
138
138
  },
139
139
  "peerDependencies": {
140
140
  "react": "19.1.2",
@@ -1,13 +1,12 @@
1
1
  import type { AppForCatalog } from '@igstack/app-catalog-backend-core'
2
- import { AppWindowIcon, EditIcon, ExternalLinkIcon, XIcon } from 'lucide-react'
2
+ import { AppWindowIcon, ExternalLinkIcon, XIcon } from 'lucide-react'
3
3
  import React, { useEffect, useState } from 'react'
4
- import { useUser } from '~/modules/auth/AuthContext'
5
4
  import { Badge } from '~/ui/badge'
6
5
  import { Button } from '~/ui/button'
7
6
  import { ScrollArea } from '~/ui/scroll-area'
8
7
  import { Separator } from '~/ui/separator'
9
8
  import { useAppCatalogContext } from '~/modules/appCatalog'
10
- import { ExternalLink, Link } from '~/ui/link'
9
+ import { ExternalLink } from '~/ui/link'
11
10
  import {
12
11
  Table,
13
12
  TableBody,
@@ -185,9 +184,6 @@ function AccessSection({ app }: { app: AppForCatalog }) {
185
184
  }
186
185
 
187
186
  export function AppDetailModal({ app, isOpen, onClose }: AppDetailModalProps) {
188
- const user = useUser()
189
- const isAuthenticated = !!user
190
-
191
187
  // Close on Escape key
192
188
  useEffect(() => {
193
189
  const handleEscape = (e: KeyboardEvent) => {
@@ -235,21 +231,6 @@ export function AppDetailModal({ app, isOpen, onClose }: AppDetailModalProps) {
235
231
  <span className="sr-only">Close</span>
236
232
  </Button>
237
233
 
238
- {/* Edit Button (Authenticated users) */}
239
- {isAuthenticated && app.slug && (
240
- <Button
241
- variant="default"
242
- size="sm"
243
- asChild
244
- className="absolute top-6 right-[4.5rem] z-10"
245
- >
246
- <Link to="/admin/app-for-catalog/$id" params={{ id: app.slug }}>
247
- <EditIcon className="size-4 mr-2" />
248
- Edit
249
- </Link>
250
- </Button>
251
- )}
252
-
253
234
  <div className="bg-background rounded-lg shadow-2xl border border-border p-8 space-y-8">
254
235
  {/* App Details Section */}
255
236
  <div className="space-y-6">
@@ -9,35 +9,16 @@
9
9
  // Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
10
10
 
11
11
  import { Route as rootRouteImport } from './routes/__root'
12
- import { Route as AdminRouteImport } from './routes/admin'
13
12
  import { Route as LayoutRouteImport } from './routes/_layout'
14
- import { Route as AdminIndexRouteImport } from './routes/admin/index'
15
13
  import { Route as LayoutIndexRouteImport } from './routes/_layout/index'
16
14
  import { Route as AuthCallbackRouteImport } from './routes/auth.callback'
17
- import { Route as AdminIconsRouteImport } from './routes/admin/icons'
18
- import { Route as AdminChatRouteImport } from './routes/admin/chat'
19
- import { Route as AdminApprovalMethodsRouteImport } from './routes/admin/approval-methods'
20
- import { Route as AdminAppForCatalogRouteImport } from './routes/admin/app-for-catalog'
21
15
  import { Route as LayoutLoginRouteImport } from './routes/_layout/login'
22
- import { Route as AdminApprovalMethodsIndexRouteImport } from './routes/admin/approval-methods/index'
23
- import { Route as AdminAppForCatalogIndexRouteImport } from './routes/admin/app-for-catalog/index'
24
- import { Route as AdminAppForCatalogIdRouteImport } from './routes/admin/app-for-catalog/$id'
25
16
  import { Route as LayoutCatalogAppsIndexRouteImport } from './routes/_layout/catalog.apps.index'
26
17
 
27
- const AdminRoute = AdminRouteImport.update({
28
- id: '/admin',
29
- path: '/admin',
30
- getParentRoute: () => rootRouteImport,
31
- } as any)
32
18
  const LayoutRoute = LayoutRouteImport.update({
33
19
  id: '/_layout',
34
20
  getParentRoute: () => rootRouteImport,
35
21
  } as any)
36
- const AdminIndexRoute = AdminIndexRouteImport.update({
37
- id: '/',
38
- path: '/',
39
- getParentRoute: () => AdminRoute,
40
- } as any)
41
22
  const LayoutIndexRoute = LayoutIndexRouteImport.update({
42
23
  id: '/',
43
24
  path: '/',
@@ -48,47 +29,11 @@ const AuthCallbackRoute = AuthCallbackRouteImport.update({
48
29
  path: '/auth/callback',
49
30
  getParentRoute: () => rootRouteImport,
50
31
  } as any)
51
- const AdminIconsRoute = AdminIconsRouteImport.update({
52
- id: '/icons',
53
- path: '/icons',
54
- getParentRoute: () => AdminRoute,
55
- } as any)
56
- const AdminChatRoute = AdminChatRouteImport.update({
57
- id: '/chat',
58
- path: '/chat',
59
- getParentRoute: () => AdminRoute,
60
- } as any)
61
- const AdminApprovalMethodsRoute = AdminApprovalMethodsRouteImport.update({
62
- id: '/approval-methods',
63
- path: '/approval-methods',
64
- getParentRoute: () => AdminRoute,
65
- } as any)
66
- const AdminAppForCatalogRoute = AdminAppForCatalogRouteImport.update({
67
- id: '/app-for-catalog',
68
- path: '/app-for-catalog',
69
- getParentRoute: () => AdminRoute,
70
- } as any)
71
32
  const LayoutLoginRoute = LayoutLoginRouteImport.update({
72
33
  id: '/login',
73
34
  path: '/login',
74
35
  getParentRoute: () => LayoutRoute,
75
36
  } as any)
76
- const AdminApprovalMethodsIndexRoute =
77
- AdminApprovalMethodsIndexRouteImport.update({
78
- id: '/',
79
- path: '/',
80
- getParentRoute: () => AdminApprovalMethodsRoute,
81
- } as any)
82
- const AdminAppForCatalogIndexRoute = AdminAppForCatalogIndexRouteImport.update({
83
- id: '/',
84
- path: '/',
85
- getParentRoute: () => AdminAppForCatalogRoute,
86
- } as any)
87
- const AdminAppForCatalogIdRoute = AdminAppForCatalogIdRouteImport.update({
88
- id: '/$id',
89
- path: '/$id',
90
- getParentRoute: () => AdminAppForCatalogRoute,
91
- } as any)
92
37
  const LayoutCatalogAppsIndexRoute = LayoutCatalogAppsIndexRouteImport.update({
93
38
  id: '/catalog/apps/',
94
39
  path: '/catalog/apps/',
@@ -97,109 +42,45 @@ const LayoutCatalogAppsIndexRoute = LayoutCatalogAppsIndexRouteImport.update({
97
42
 
98
43
  export interface FileRoutesByFullPath {
99
44
  '/': typeof LayoutIndexRoute
100
- '/admin': typeof AdminRouteWithChildren
101
45
  '/login': typeof LayoutLoginRoute
102
- '/admin/app-for-catalog': typeof AdminAppForCatalogRouteWithChildren
103
- '/admin/approval-methods': typeof AdminApprovalMethodsRouteWithChildren
104
- '/admin/chat': typeof AdminChatRoute
105
- '/admin/icons': typeof AdminIconsRoute
106
46
  '/auth/callback': typeof AuthCallbackRoute
107
- '/admin/': typeof AdminIndexRoute
108
- '/admin/app-for-catalog/$id': typeof AdminAppForCatalogIdRoute
109
- '/admin/app-for-catalog/': typeof AdminAppForCatalogIndexRoute
110
- '/admin/approval-methods/': typeof AdminApprovalMethodsIndexRoute
111
47
  '/catalog/apps/': typeof LayoutCatalogAppsIndexRoute
112
48
  }
113
49
  export interface FileRoutesByTo {
114
50
  '/login': typeof LayoutLoginRoute
115
- '/admin/chat': typeof AdminChatRoute
116
- '/admin/icons': typeof AdminIconsRoute
117
51
  '/auth/callback': typeof AuthCallbackRoute
118
52
  '/': typeof LayoutIndexRoute
119
- '/admin': typeof AdminIndexRoute
120
- '/admin/app-for-catalog/$id': typeof AdminAppForCatalogIdRoute
121
- '/admin/app-for-catalog': typeof AdminAppForCatalogIndexRoute
122
- '/admin/approval-methods': typeof AdminApprovalMethodsIndexRoute
123
53
  '/catalog/apps': typeof LayoutCatalogAppsIndexRoute
124
54
  }
125
55
  export interface FileRoutesById {
126
56
  __root__: typeof rootRouteImport
127
57
  '/_layout': typeof LayoutRouteWithChildren
128
- '/admin': typeof AdminRouteWithChildren
129
58
  '/_layout/login': typeof LayoutLoginRoute
130
- '/admin/app-for-catalog': typeof AdminAppForCatalogRouteWithChildren
131
- '/admin/approval-methods': typeof AdminApprovalMethodsRouteWithChildren
132
- '/admin/chat': typeof AdminChatRoute
133
- '/admin/icons': typeof AdminIconsRoute
134
59
  '/auth/callback': typeof AuthCallbackRoute
135
60
  '/_layout/': typeof LayoutIndexRoute
136
- '/admin/': typeof AdminIndexRoute
137
- '/admin/app-for-catalog/$id': typeof AdminAppForCatalogIdRoute
138
- '/admin/app-for-catalog/': typeof AdminAppForCatalogIndexRoute
139
- '/admin/approval-methods/': typeof AdminApprovalMethodsIndexRoute
140
61
  '/_layout/catalog/apps/': typeof LayoutCatalogAppsIndexRoute
141
62
  }
142
63
  export interface FileRouteTypes {
143
64
  fileRoutesByFullPath: FileRoutesByFullPath
144
- fullPaths:
145
- | '/'
146
- | '/admin'
147
- | '/login'
148
- | '/admin/app-for-catalog'
149
- | '/admin/approval-methods'
150
- | '/admin/chat'
151
- | '/admin/icons'
152
- | '/auth/callback'
153
- | '/admin/'
154
- | '/admin/app-for-catalog/$id'
155
- | '/admin/app-for-catalog/'
156
- | '/admin/approval-methods/'
157
- | '/catalog/apps/'
65
+ fullPaths: '/' | '/login' | '/auth/callback' | '/catalog/apps/'
158
66
  fileRoutesByTo: FileRoutesByTo
159
- to:
160
- | '/login'
161
- | '/admin/chat'
162
- | '/admin/icons'
163
- | '/auth/callback'
164
- | '/'
165
- | '/admin'
166
- | '/admin/app-for-catalog/$id'
167
- | '/admin/app-for-catalog'
168
- | '/admin/approval-methods'
169
- | '/catalog/apps'
67
+ to: '/login' | '/auth/callback' | '/' | '/catalog/apps'
170
68
  id:
171
69
  | '__root__'
172
70
  | '/_layout'
173
- | '/admin'
174
71
  | '/_layout/login'
175
- | '/admin/app-for-catalog'
176
- | '/admin/approval-methods'
177
- | '/admin/chat'
178
- | '/admin/icons'
179
72
  | '/auth/callback'
180
73
  | '/_layout/'
181
- | '/admin/'
182
- | '/admin/app-for-catalog/$id'
183
- | '/admin/app-for-catalog/'
184
- | '/admin/approval-methods/'
185
74
  | '/_layout/catalog/apps/'
186
75
  fileRoutesById: FileRoutesById
187
76
  }
188
77
  export interface RootRouteChildren {
189
78
  LayoutRoute: typeof LayoutRouteWithChildren
190
- AdminRoute: typeof AdminRouteWithChildren
191
79
  AuthCallbackRoute: typeof AuthCallbackRoute
192
80
  }
193
81
 
194
82
  declare module '@tanstack/react-router' {
195
83
  interface FileRoutesByPath {
196
- '/admin': {
197
- id: '/admin'
198
- path: '/admin'
199
- fullPath: '/admin'
200
- preLoaderRoute: typeof AdminRouteImport
201
- parentRoute: typeof rootRouteImport
202
- }
203
84
  '/_layout': {
204
85
  id: '/_layout'
205
86
  path: ''
@@ -207,13 +88,6 @@ declare module '@tanstack/react-router' {
207
88
  preLoaderRoute: typeof LayoutRouteImport
208
89
  parentRoute: typeof rootRouteImport
209
90
  }
210
- '/admin/': {
211
- id: '/admin/'
212
- path: '/'
213
- fullPath: '/admin/'
214
- preLoaderRoute: typeof AdminIndexRouteImport
215
- parentRoute: typeof AdminRoute
216
- }
217
91
  '/_layout/': {
218
92
  id: '/_layout/'
219
93
  path: '/'
@@ -228,34 +102,6 @@ declare module '@tanstack/react-router' {
228
102
  preLoaderRoute: typeof AuthCallbackRouteImport
229
103
  parentRoute: typeof rootRouteImport
230
104
  }
231
- '/admin/icons': {
232
- id: '/admin/icons'
233
- path: '/icons'
234
- fullPath: '/admin/icons'
235
- preLoaderRoute: typeof AdminIconsRouteImport
236
- parentRoute: typeof AdminRoute
237
- }
238
- '/admin/chat': {
239
- id: '/admin/chat'
240
- path: '/chat'
241
- fullPath: '/admin/chat'
242
- preLoaderRoute: typeof AdminChatRouteImport
243
- parentRoute: typeof AdminRoute
244
- }
245
- '/admin/approval-methods': {
246
- id: '/admin/approval-methods'
247
- path: '/approval-methods'
248
- fullPath: '/admin/approval-methods'
249
- preLoaderRoute: typeof AdminApprovalMethodsRouteImport
250
- parentRoute: typeof AdminRoute
251
- }
252
- '/admin/app-for-catalog': {
253
- id: '/admin/app-for-catalog'
254
- path: '/app-for-catalog'
255
- fullPath: '/admin/app-for-catalog'
256
- preLoaderRoute: typeof AdminAppForCatalogRouteImport
257
- parentRoute: typeof AdminRoute
258
- }
259
105
  '/_layout/login': {
260
106
  id: '/_layout/login'
261
107
  path: '/login'
@@ -263,27 +109,6 @@ declare module '@tanstack/react-router' {
263
109
  preLoaderRoute: typeof LayoutLoginRouteImport
264
110
  parentRoute: typeof LayoutRoute
265
111
  }
266
- '/admin/approval-methods/': {
267
- id: '/admin/approval-methods/'
268
- path: '/'
269
- fullPath: '/admin/approval-methods/'
270
- preLoaderRoute: typeof AdminApprovalMethodsIndexRouteImport
271
- parentRoute: typeof AdminApprovalMethodsRoute
272
- }
273
- '/admin/app-for-catalog/': {
274
- id: '/admin/app-for-catalog/'
275
- path: '/'
276
- fullPath: '/admin/app-for-catalog/'
277
- preLoaderRoute: typeof AdminAppForCatalogIndexRouteImport
278
- parentRoute: typeof AdminAppForCatalogRoute
279
- }
280
- '/admin/app-for-catalog/$id': {
281
- id: '/admin/app-for-catalog/$id'
282
- path: '/$id'
283
- fullPath: '/admin/app-for-catalog/$id'
284
- preLoaderRoute: typeof AdminAppForCatalogIdRouteImport
285
- parentRoute: typeof AdminAppForCatalogRoute
286
- }
287
112
  '/_layout/catalog/apps/': {
288
113
  id: '/_layout/catalog/apps/'
289
114
  path: '/catalog/apps'
@@ -309,51 +134,8 @@ const LayoutRouteChildren: LayoutRouteChildren = {
309
134
  const LayoutRouteWithChildren =
310
135
  LayoutRoute._addFileChildren(LayoutRouteChildren)
311
136
 
312
- interface AdminAppForCatalogRouteChildren {
313
- AdminAppForCatalogIdRoute: typeof AdminAppForCatalogIdRoute
314
- AdminAppForCatalogIndexRoute: typeof AdminAppForCatalogIndexRoute
315
- }
316
-
317
- const AdminAppForCatalogRouteChildren: AdminAppForCatalogRouteChildren = {
318
- AdminAppForCatalogIdRoute: AdminAppForCatalogIdRoute,
319
- AdminAppForCatalogIndexRoute: AdminAppForCatalogIndexRoute,
320
- }
321
-
322
- const AdminAppForCatalogRouteWithChildren =
323
- AdminAppForCatalogRoute._addFileChildren(AdminAppForCatalogRouteChildren)
324
-
325
- interface AdminApprovalMethodsRouteChildren {
326
- AdminApprovalMethodsIndexRoute: typeof AdminApprovalMethodsIndexRoute
327
- }
328
-
329
- const AdminApprovalMethodsRouteChildren: AdminApprovalMethodsRouteChildren = {
330
- AdminApprovalMethodsIndexRoute: AdminApprovalMethodsIndexRoute,
331
- }
332
-
333
- const AdminApprovalMethodsRouteWithChildren =
334
- AdminApprovalMethodsRoute._addFileChildren(AdminApprovalMethodsRouteChildren)
335
-
336
- interface AdminRouteChildren {
337
- AdminAppForCatalogRoute: typeof AdminAppForCatalogRouteWithChildren
338
- AdminApprovalMethodsRoute: typeof AdminApprovalMethodsRouteWithChildren
339
- AdminChatRoute: typeof AdminChatRoute
340
- AdminIconsRoute: typeof AdminIconsRoute
341
- AdminIndexRoute: typeof AdminIndexRoute
342
- }
343
-
344
- const AdminRouteChildren: AdminRouteChildren = {
345
- AdminAppForCatalogRoute: AdminAppForCatalogRouteWithChildren,
346
- AdminApprovalMethodsRoute: AdminApprovalMethodsRouteWithChildren,
347
- AdminChatRoute: AdminChatRoute,
348
- AdminIconsRoute: AdminIconsRoute,
349
- AdminIndexRoute: AdminIndexRoute,
350
- }
351
-
352
- const AdminRouteWithChildren = AdminRoute._addFileChildren(AdminRouteChildren)
353
-
354
137
  const rootRouteChildren: RootRouteChildren = {
355
138
  LayoutRoute: LayoutRouteWithChildren,
356
- AdminRoute: AdminRouteWithChildren,
357
139
  AuthCallbackRoute: AuthCallbackRoute,
358
140
  }
359
141
  export const routeTree = rootRouteImport