@igstack/app-catalog-frontend-core 6.10.3 → 6.11.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 (201) hide show
  1. package/dist/esm/__tests__/modules/auth/AuthContext.test.d.ts +1 -0
  2. package/dist/esm/__tests__/modules/communityTools/likedBy.test.d.ts +1 -0
  3. package/dist/esm/__tests__/modules/communityTools/timeAgo.test.d.ts +1 -0
  4. package/dist/esm/__tests__/modules/communityTools/useTimeUp.test.d.ts +1 -0
  5. package/dist/esm/api/infra/trpc.d.ts +419 -0
  6. package/dist/esm/api/infra/trpc.js.map +1 -1
  7. package/dist/esm/modules/appCatalog/hooks/useUpdateApp.d.ts +1 -1
  8. package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.d.ts +2 -4
  9. package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js +29 -101
  10. package/dist/esm/modules/appCatalog/ui/catalog/AppDetailPanel.js.map +1 -1
  11. package/dist/esm/modules/appCatalog/ui/catalog/DetailDialogShell.d.ts +26 -0
  12. package/dist/esm/modules/appCatalog/ui/catalog/DetailDialogShell.js +108 -0
  13. package/dist/esm/modules/appCatalog/ui/catalog/DetailDialogShell.js.map +1 -0
  14. package/dist/esm/modules/appCatalog/ui/components/ScreenshotGallery.d.ts +2 -1
  15. package/dist/esm/modules/appCatalog/ui/components/ScreenshotGallery.js.map +1 -1
  16. package/dist/esm/modules/appCatalog/ui/components/SectionTabs.d.ts +8 -0
  17. package/dist/esm/modules/appCatalog/ui/components/SectionTabs.js +73 -0
  18. package/dist/esm/modules/appCatalog/ui/components/SectionTabs.js.map +1 -0
  19. package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js +19 -2
  20. package/dist/esm/modules/appCatalog/ui/detail/AppDetails.js.map +1 -1
  21. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.d.ts +3 -2
  22. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.js +4 -4
  23. package/dist/esm/modules/appCatalog/ui/detail/CommentsFeed.js.map +1 -1
  24. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.d.ts +2 -1
  25. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.js +2 -2
  26. package/dist/esm/modules/appCatalog/ui/detail/CommentsHelp.js.map +1 -1
  27. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.d.ts +3 -2
  28. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.js +13 -9
  29. package/dist/esm/modules/appCatalog/ui/detail/CommunityInput.js.map +1 -1
  30. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.d.ts +4 -2
  31. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.js +10 -4
  32. package/dist/esm/modules/appCatalog/ui/detail/CommunitySection.js.map +1 -1
  33. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.d.ts +12 -0
  34. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.js +4 -0
  35. package/dist/esm/modules/appCatalog/ui/detail/communityDraft.js.map +1 -1
  36. package/dist/esm/modules/appCatalog/ui/detail/composeComments.js +1 -0
  37. package/dist/esm/modules/appCatalog/ui/detail/composeComments.js.map +1 -1
  38. package/dist/esm/modules/appCatalog/ui/detail/useCommunityToolCount.d.ts +6 -0
  39. package/dist/esm/modules/appCatalog/ui/detail/useCommunityToolCount.js +16 -0
  40. package/dist/esm/modules/appCatalog/ui/detail/useCommunityToolCount.js.map +1 -0
  41. package/dist/esm/modules/appCatalog/ui/layout/AppCatalogLayout.js +2 -2
  42. package/dist/esm/modules/appCatalog/ui/layout/AppCatalogLayout.js.map +1 -1
  43. package/dist/esm/modules/auth/AuthContext.js +7 -3
  44. package/dist/esm/modules/auth/AuthContext.js.map +1 -1
  45. package/dist/esm/modules/auth/ui/LoginModal.js +16 -8
  46. package/dist/esm/modules/auth/ui/LoginModal.js.map +1 -1
  47. package/dist/esm/modules/communityTools/likedBy.d.ts +8 -0
  48. package/dist/esm/modules/communityTools/likedBy.js +23 -0
  49. package/dist/esm/modules/communityTools/likedBy.js.map +1 -0
  50. package/dist/esm/modules/communityTools/timeAgo.d.ts +2 -0
  51. package/dist/esm/modules/communityTools/timeAgo.js +18 -0
  52. package/dist/esm/modules/communityTools/timeAgo.js.map +1 -0
  53. package/dist/esm/modules/communityTools/ui/CardScreenshot.d.ts +13 -0
  54. package/dist/esm/modules/communityTools/ui/CardScreenshot.js +112 -0
  55. package/dist/esm/modules/communityTools/ui/CardScreenshot.js.map +1 -0
  56. package/dist/esm/modules/communityTools/ui/CardTitleBlock.d.ts +8 -0
  57. package/dist/esm/modules/communityTools/ui/CardTitleBlock.js +59 -0
  58. package/dist/esm/modules/communityTools/ui/CardTitleBlock.js.map +1 -0
  59. package/dist/esm/modules/communityTools/ui/CommunityPage.d.ts +12 -0
  60. package/dist/esm/modules/communityTools/ui/CommunityPage.js +547 -0
  61. package/dist/esm/modules/communityTools/ui/CommunityPage.js.map +1 -0
  62. package/dist/esm/modules/communityTools/ui/FeedRow.d.ts +42 -0
  63. package/dist/esm/modules/communityTools/ui/FeedRow.js +260 -0
  64. package/dist/esm/modules/communityTools/ui/FeedRow.js.map +1 -0
  65. package/dist/esm/modules/communityTools/ui/FeedSortControl.d.ts +17 -0
  66. package/dist/esm/modules/communityTools/ui/FeedSortControl.js +84 -0
  67. package/dist/esm/modules/communityTools/ui/FeedSortControl.js.map +1 -0
  68. package/dist/esm/modules/communityTools/ui/LifecycleBadge.d.ts +7 -0
  69. package/dist/esm/modules/communityTools/ui/LifecycleBadge.js +50 -0
  70. package/dist/esm/modules/communityTools/ui/LifecycleBadge.js.map +1 -0
  71. package/dist/esm/modules/communityTools/ui/LikeButton.d.ts +9 -0
  72. package/dist/esm/modules/communityTools/ui/LikeButton.js +56 -0
  73. package/dist/esm/modules/communityTools/ui/LikeButton.js.map +1 -0
  74. package/dist/esm/modules/communityTools/ui/MarginPreview.d.ts +18 -0
  75. package/dist/esm/modules/communityTools/ui/MarginPreview.js +115 -0
  76. package/dist/esm/modules/communityTools/ui/MarginPreview.js.map +1 -0
  77. package/dist/esm/modules/communityTools/ui/MyToolsShelf.d.ts +12 -0
  78. package/dist/esm/modules/communityTools/ui/MyToolsShelf.js +88 -0
  79. package/dist/esm/modules/communityTools/ui/MyToolsShelf.js.map +1 -0
  80. package/dist/esm/modules/communityTools/ui/OwnerPicker.d.ts +56 -0
  81. package/dist/esm/modules/communityTools/ui/OwnerPicker.js +245 -0
  82. package/dist/esm/modules/communityTools/ui/OwnerPicker.js.map +1 -0
  83. package/dist/esm/modules/communityTools/ui/PinButton.d.ts +14 -0
  84. package/dist/esm/modules/communityTools/ui/PinButton.js +72 -0
  85. package/dist/esm/modules/communityTools/ui/PinButton.js.map +1 -0
  86. package/dist/esm/modules/communityTools/ui/ShelfTile.d.ts +13 -0
  87. package/dist/esm/modules/communityTools/ui/ShelfTile.js +81 -0
  88. package/dist/esm/modules/communityTools/ui/ShelfTile.js.map +1 -0
  89. package/dist/esm/modules/communityTools/ui/TagPicker.d.ts +21 -0
  90. package/dist/esm/modules/communityTools/ui/TagPicker.js +87 -0
  91. package/dist/esm/modules/communityTools/ui/TagPicker.js.map +1 -0
  92. package/dist/esm/modules/communityTools/ui/TagRow.d.ts +22 -0
  93. package/dist/esm/modules/communityTools/ui/TagRow.js +92 -0
  94. package/dist/esm/modules/communityTools/ui/TagRow.js.map +1 -0
  95. package/dist/esm/modules/communityTools/ui/Toast.d.ts +19 -0
  96. package/dist/esm/modules/communityTools/ui/Toast.js +87 -0
  97. package/dist/esm/modules/communityTools/ui/Toast.js.map +1 -0
  98. package/dist/esm/modules/communityTools/ui/ToolCard.d.ts +22 -0
  99. package/dist/esm/modules/communityTools/ui/ToolCard.js +467 -0
  100. package/dist/esm/modules/communityTools/ui/ToolCard.js.map +1 -0
  101. package/dist/esm/modules/communityTools/ui/ToolFormDialog.d.ts +32 -0
  102. package/dist/esm/modules/communityTools/ui/ToolFormDialog.js +765 -0
  103. package/dist/esm/modules/communityTools/ui/ToolFormDialog.js.map +1 -0
  104. package/dist/esm/modules/communityTools/ui/ToolSearch.d.ts +15 -0
  105. package/dist/esm/modules/communityTools/ui/ToolSearch.js +92 -0
  106. package/dist/esm/modules/communityTools/ui/ToolSearch.js.map +1 -0
  107. package/dist/esm/modules/communityTools/useCommunityTools.d.ts +157 -0
  108. package/dist/esm/modules/communityTools/useCommunityTools.js +122 -0
  109. package/dist/esm/modules/communityTools/useCommunityTools.js.map +1 -0
  110. package/dist/esm/modules/communityTools/useCommunityToolsConfig.d.ts +10 -0
  111. package/dist/esm/modules/communityTools/useCommunityToolsConfig.js +20 -0
  112. package/dist/esm/modules/communityTools/useCommunityToolsConfig.js.map +1 -0
  113. package/dist/esm/modules/communityTools/useTimeUp.d.ts +5 -0
  114. package/dist/esm/modules/communityTools/useTimeUp.js +13 -0
  115. package/dist/esm/modules/communityTools/useTimeUp.js.map +1 -0
  116. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/classic/schemas.js +2 -2
  117. package/dist/esm/node_modules/.pnpm/zod@4.3.5/node_modules/zod/v4/core/schemas.js +1 -1
  118. package/dist/esm/routeTree.gen.d.ts +96 -3
  119. package/dist/esm/routeTree.gen.js +19 -0
  120. package/dist/esm/routeTree.gen.js.map +1 -1
  121. package/dist/esm/routes/_layout/community.$slug.d.ts +22 -0
  122. package/dist/esm/routes/_layout/community._slug.js +10 -0
  123. package/dist/esm/routes/_layout/community._slug.js.map +1 -0
  124. package/dist/esm/routes/_layout/community.d.ts +23 -0
  125. package/dist/esm/routes/_layout/community.js +71 -0
  126. package/dist/esm/routes/_layout/community.js.map +1 -0
  127. package/dist/esm/ui/components/header/Header.js +7 -3
  128. package/dist/esm/ui/components/header/Header.js.map +1 -1
  129. package/dist/esm/util/highlightMatches.d.ts +2 -0
  130. package/dist/esm/util/highlightMatches.js +32 -0
  131. package/dist/esm/util/highlightMatches.js.map +1 -0
  132. package/dist/index.css +6 -0
  133. package/package.json +5 -5
  134. package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.appSwitch.test.tsx +3 -0
  135. package/src/__tests__/modules/appCatalog/ui/catalog/AppDetailPanel.enter.test.tsx +3 -0
  136. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.background.test.tsx +3 -0
  137. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.behindThisCard.test.tsx +4 -0
  138. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.doorAndTabs.test.tsx +3 -0
  139. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.escape.test.tsx +3 -0
  140. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.knowMore.test.tsx +3 -0
  141. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.sectionOrder.test.tsx +3 -0
  142. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.subResourceTab.test.tsx +3 -0
  143. package/src/__tests__/modules/appCatalog/ui/detail/AppDetails.tags.test.tsx +3 -0
  144. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.feed.test.tsx +10 -3
  145. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.help.test.tsx +4 -1
  146. package/src/__tests__/modules/appCatalog/ui/detail/CommunitySection.input.test.tsx +12 -2
  147. package/src/__tests__/modules/appCatalog/ui/detail/composeComments.test.ts +1 -0
  148. package/src/__tests__/modules/auth/AuthContext.test.tsx +55 -0
  149. package/src/__tests__/modules/communityTools/likedBy.test.ts +45 -0
  150. package/src/__tests__/modules/communityTools/timeAgo.test.ts +28 -0
  151. package/src/__tests__/modules/communityTools/useTimeUp.test.ts +31 -0
  152. package/src/__tests__/ui/components/header/Header.login.test.tsx +4 -4
  153. package/src/api/infra/trpc.ts +2 -0
  154. package/src/index.css +6 -0
  155. package/src/modules/appCatalog/ui/catalog/AppDetailPanel.tsx +33 -176
  156. package/src/modules/appCatalog/ui/catalog/DetailDialogShell.tsx +199 -0
  157. package/src/modules/appCatalog/ui/components/ScreenshotGallery.tsx +2 -1
  158. package/src/modules/appCatalog/ui/components/SectionTabs.tsx +81 -0
  159. package/src/modules/appCatalog/ui/detail/AppDetails.tsx +17 -2
  160. package/src/modules/appCatalog/ui/detail/CommentsFeed.tsx +9 -4
  161. package/src/modules/appCatalog/ui/detail/CommentsHelp.tsx +6 -3
  162. package/src/modules/appCatalog/ui/detail/CommunityInput.tsx +15 -10
  163. package/src/modules/appCatalog/ui/detail/CommunitySection.tsx +10 -5
  164. package/src/modules/appCatalog/ui/detail/communityDraft.ts +16 -0
  165. package/src/modules/appCatalog/ui/detail/composeComments.ts +1 -0
  166. package/src/modules/appCatalog/ui/detail/useCommunityToolCount.ts +18 -0
  167. package/src/modules/appCatalog/ui/layout/AppCatalogLayout.tsx +2 -2
  168. package/src/modules/auth/AuthContext.tsx +9 -3
  169. package/src/modules/auth/ui/LoginModal.tsx +7 -2
  170. package/src/modules/communityTools/likedBy.ts +32 -0
  171. package/src/modules/communityTools/timeAgo.ts +16 -0
  172. package/src/modules/communityTools/ui/CardScreenshot.tsx +124 -0
  173. package/src/modules/communityTools/ui/CardTitleBlock.tsx +58 -0
  174. package/src/modules/communityTools/ui/CommunityPage.tsx +626 -0
  175. package/src/modules/communityTools/ui/FeedRow.tsx +310 -0
  176. package/src/modules/communityTools/ui/FeedSortControl.tsx +97 -0
  177. package/src/modules/communityTools/ui/LifecycleBadge.tsx +44 -0
  178. package/src/modules/communityTools/ui/LikeButton.tsx +56 -0
  179. package/src/modules/communityTools/ui/MarginPreview.tsx +143 -0
  180. package/src/modules/communityTools/ui/MyToolsShelf.tsx +112 -0
  181. package/src/modules/communityTools/ui/OwnerPicker.tsx +311 -0
  182. package/src/modules/communityTools/ui/PinButton.tsx +87 -0
  183. package/src/modules/communityTools/ui/ShelfTile.tsx +83 -0
  184. package/src/modules/communityTools/ui/TagPicker.tsx +118 -0
  185. package/src/modules/communityTools/ui/TagRow.tsx +118 -0
  186. package/src/modules/communityTools/ui/Toast.tsx +105 -0
  187. package/src/modules/communityTools/ui/ToolCard.tsx +519 -0
  188. package/src/modules/communityTools/ui/ToolFormDialog.tsx +922 -0
  189. package/src/modules/communityTools/ui/ToolSearch.tsx +111 -0
  190. package/src/modules/communityTools/useCommunityTools.ts +146 -0
  191. package/src/modules/communityTools/useCommunityToolsConfig.ts +26 -0
  192. package/src/modules/communityTools/useTimeUp.ts +14 -0
  193. package/src/routeTree.gen.ts +52 -0
  194. package/src/routes/_layout/community.$slug.tsx +7 -0
  195. package/src/routes/_layout/community.tsx +97 -0
  196. package/src/ui/components/header/Header.tsx +9 -3
  197. package/src/util/highlightMatches.tsx +34 -0
  198. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.d.ts +0 -12
  199. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js +0 -56
  200. package/dist/esm/modules/appCatalog/ui/components/ViewToggle.js.map +0 -1
  201. package/src/modules/appCatalog/ui/components/ViewToggle.tsx +0 -59
@@ -1,3 +1,4 @@
1
+ import { TRPCRouter } from '@igstack/app-catalog-backend-core';
1
2
  declare const TRPCProvider: import('react').FunctionComponent<{
2
3
  children: React.ReactNode;
3
4
  queryClient: import('@tanstack/react-query').QueryClient;
@@ -52,6 +53,8 @@ declare const TRPCProvider: import('react').FunctionComponent<{
52
53
  list: import('@trpc/server').TRPCQueryProcedure<{
53
54
  input: {
54
55
  resourceSlug: string;
56
+ } | {
57
+ communityToolSlug: string;
55
58
  };
56
59
  output: import('@igstack/app-catalog-backend-core').FeedbackList;
57
60
  meta: object;
@@ -64,6 +67,7 @@ declare const TRPCProvider: import('react').FunctionComponent<{
64
67
  add: import('@trpc/server').TRPCMutationProcedure<{
65
68
  input: {
66
69
  resourceSlug?: string | undefined;
70
+ communityToolSlug?: string | undefined;
67
71
  subject?: string | undefined;
68
72
  body?: string | undefined;
69
73
  attachmentIds?: string[] | undefined;
@@ -89,6 +93,142 @@ declare const TRPCProvider: import('react').FunctionComponent<{
89
93
  meta: object;
90
94
  }>;
91
95
  }>>;
96
+ communityTools: import('@trpc/server').TRPCBuiltRouter<{
97
+ ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
98
+ meta: object;
99
+ errorShape: import('@trpc/server').TRPCDefaultErrorShape;
100
+ transformer: false;
101
+ }, import('@trpc/server').TRPCDecorateCreateRouterOptions<{
102
+ config: import('@trpc/server').TRPCQueryProcedure<{
103
+ input: void;
104
+ output: {
105
+ enabled: boolean;
106
+ };
107
+ meta: object;
108
+ }>;
109
+ list: import('@trpc/server').TRPCQueryProcedure<{
110
+ input: void;
111
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
112
+ meta: object;
113
+ }>;
114
+ countByApp: import('@trpc/server').TRPCQueryProcedure<{
115
+ input: void;
116
+ output: Record<string, number>;
117
+ meta: object;
118
+ }>;
119
+ get: import('@trpc/server').TRPCQueryProcedure<{
120
+ input: {
121
+ slug: string;
122
+ };
123
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
124
+ meta: object;
125
+ }>;
126
+ recordView: import('@trpc/server').TRPCMutationProcedure<{
127
+ input: {
128
+ slug: string;
129
+ };
130
+ output: {
131
+ views30d: number;
132
+ viewsAll: number;
133
+ };
134
+ meta: object;
135
+ }>;
136
+ pins: import('@trpc/server').TRPCQueryProcedure<{
137
+ input: void;
138
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
139
+ meta: object;
140
+ }>;
141
+ pin: import('@trpc/server').TRPCMutationProcedure<{
142
+ input: {
143
+ slug: string;
144
+ };
145
+ output: void;
146
+ meta: object;
147
+ }>;
148
+ like: import('@trpc/server').TRPCMutationProcedure<{
149
+ input: {
150
+ slug: string;
151
+ };
152
+ output: void;
153
+ meta: object;
154
+ }>;
155
+ unlike: import('@trpc/server').TRPCMutationProcedure<{
156
+ input: {
157
+ slug: string;
158
+ };
159
+ output: void;
160
+ meta: object;
161
+ }>;
162
+ unpin: import('@trpc/server').TRPCMutationProcedure<{
163
+ input: {
164
+ slug: string;
165
+ };
166
+ output: void;
167
+ meta: object;
168
+ }>;
169
+ reorderPins: import('@trpc/server').TRPCMutationProcedure<{
170
+ input: {
171
+ slugs: string[];
172
+ };
173
+ output: void;
174
+ meta: object;
175
+ }>;
176
+ preview: import('@trpc/server').TRPCMutationProcedure<{
177
+ input: {
178
+ url: string;
179
+ };
180
+ output: import('@igstack/app-catalog-backend-core').ToolPreview;
181
+ meta: object;
182
+ }>;
183
+ add: import('@trpc/server').TRPCMutationProcedure<{
184
+ input: {
185
+ url: string;
186
+ name: string;
187
+ summary: string;
188
+ descriptionMd: string;
189
+ ownerSlugs: string[];
190
+ tags: {
191
+ kind: "app" | "topic";
192
+ value: string;
193
+ }[];
194
+ ownerNames?: string[] | undefined;
195
+ };
196
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
197
+ meta: object;
198
+ }>;
199
+ edit: import('@trpc/server').TRPCMutationProcedure<{
200
+ input: {
201
+ url: string;
202
+ name: string;
203
+ summary: string;
204
+ descriptionMd: string;
205
+ ownerSlugs: string[];
206
+ tags: {
207
+ kind: "app" | "topic";
208
+ value: string;
209
+ }[];
210
+ slug: string;
211
+ ownerNames?: string[] | undefined;
212
+ };
213
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
214
+ meta: object;
215
+ }>;
216
+ archive: import('@trpc/server').TRPCMutationProcedure<{
217
+ input: {
218
+ slug: string;
219
+ reason: string;
220
+ };
221
+ output: void;
222
+ meta: object;
223
+ }>;
224
+ approve: import('@trpc/server').TRPCMutationProcedure<{
225
+ input: {
226
+ slug: string;
227
+ };
228
+ output: void;
229
+ meta: object;
230
+ }>;
231
+ }>>;
92
232
  auth: import('@trpc/server').TRPCBuiltRouter<{
93
233
  ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
94
234
  meta: {};
@@ -175,6 +315,8 @@ declare const TRPCProvider: import('react').FunctionComponent<{
175
315
  list: import('@trpc/server').TRPCQueryProcedure<{
176
316
  input: {
177
317
  resourceSlug: string;
318
+ } | {
319
+ communityToolSlug: string;
178
320
  };
179
321
  output: import('@igstack/app-catalog-backend-core').FeedbackList;
180
322
  meta: object;
@@ -187,6 +329,7 @@ declare const TRPCProvider: import('react').FunctionComponent<{
187
329
  add: import('@trpc/server').TRPCMutationProcedure<{
188
330
  input: {
189
331
  resourceSlug?: string | undefined;
332
+ communityToolSlug?: string | undefined;
190
333
  subject?: string | undefined;
191
334
  body?: string | undefined;
192
335
  attachmentIds?: string[] | undefined;
@@ -212,6 +355,142 @@ declare const TRPCProvider: import('react').FunctionComponent<{
212
355
  meta: object;
213
356
  }>;
214
357
  }>>;
358
+ communityTools: import('@trpc/server').TRPCBuiltRouter<{
359
+ ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
360
+ meta: object;
361
+ errorShape: import('@trpc/server').TRPCDefaultErrorShape;
362
+ transformer: false;
363
+ }, import('@trpc/server').TRPCDecorateCreateRouterOptions<{
364
+ config: import('@trpc/server').TRPCQueryProcedure<{
365
+ input: void;
366
+ output: {
367
+ enabled: boolean;
368
+ };
369
+ meta: object;
370
+ }>;
371
+ list: import('@trpc/server').TRPCQueryProcedure<{
372
+ input: void;
373
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
374
+ meta: object;
375
+ }>;
376
+ countByApp: import('@trpc/server').TRPCQueryProcedure<{
377
+ input: void;
378
+ output: Record<string, number>;
379
+ meta: object;
380
+ }>;
381
+ get: import('@trpc/server').TRPCQueryProcedure<{
382
+ input: {
383
+ slug: string;
384
+ };
385
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
386
+ meta: object;
387
+ }>;
388
+ recordView: import('@trpc/server').TRPCMutationProcedure<{
389
+ input: {
390
+ slug: string;
391
+ };
392
+ output: {
393
+ views30d: number;
394
+ viewsAll: number;
395
+ };
396
+ meta: object;
397
+ }>;
398
+ pins: import('@trpc/server').TRPCQueryProcedure<{
399
+ input: void;
400
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
401
+ meta: object;
402
+ }>;
403
+ pin: import('@trpc/server').TRPCMutationProcedure<{
404
+ input: {
405
+ slug: string;
406
+ };
407
+ output: void;
408
+ meta: object;
409
+ }>;
410
+ like: import('@trpc/server').TRPCMutationProcedure<{
411
+ input: {
412
+ slug: string;
413
+ };
414
+ output: void;
415
+ meta: object;
416
+ }>;
417
+ unlike: import('@trpc/server').TRPCMutationProcedure<{
418
+ input: {
419
+ slug: string;
420
+ };
421
+ output: void;
422
+ meta: object;
423
+ }>;
424
+ unpin: import('@trpc/server').TRPCMutationProcedure<{
425
+ input: {
426
+ slug: string;
427
+ };
428
+ output: void;
429
+ meta: object;
430
+ }>;
431
+ reorderPins: import('@trpc/server').TRPCMutationProcedure<{
432
+ input: {
433
+ slugs: string[];
434
+ };
435
+ output: void;
436
+ meta: object;
437
+ }>;
438
+ preview: import('@trpc/server').TRPCMutationProcedure<{
439
+ input: {
440
+ url: string;
441
+ };
442
+ output: import('@igstack/app-catalog-backend-core').ToolPreview;
443
+ meta: object;
444
+ }>;
445
+ add: import('@trpc/server').TRPCMutationProcedure<{
446
+ input: {
447
+ url: string;
448
+ name: string;
449
+ summary: string;
450
+ descriptionMd: string;
451
+ ownerSlugs: string[];
452
+ tags: {
453
+ kind: "app" | "topic";
454
+ value: string;
455
+ }[];
456
+ ownerNames?: string[] | undefined;
457
+ };
458
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
459
+ meta: object;
460
+ }>;
461
+ edit: import('@trpc/server').TRPCMutationProcedure<{
462
+ input: {
463
+ url: string;
464
+ name: string;
465
+ summary: string;
466
+ descriptionMd: string;
467
+ ownerSlugs: string[];
468
+ tags: {
469
+ kind: "app" | "topic";
470
+ value: string;
471
+ }[];
472
+ slug: string;
473
+ ownerNames?: string[] | undefined;
474
+ };
475
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
476
+ meta: object;
477
+ }>;
478
+ archive: import('@trpc/server').TRPCMutationProcedure<{
479
+ input: {
480
+ slug: string;
481
+ reason: string;
482
+ };
483
+ output: void;
484
+ meta: object;
485
+ }>;
486
+ approve: import('@trpc/server').TRPCMutationProcedure<{
487
+ input: {
488
+ slug: string;
489
+ };
490
+ output: void;
491
+ meta: object;
492
+ }>;
493
+ }>>;
215
494
  auth: import('@trpc/server').TRPCBuiltRouter<{
216
495
  ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
217
496
  meta: {};
@@ -297,6 +576,8 @@ declare const TRPCProvider: import('react').FunctionComponent<{
297
576
  list: import('@trpc/server').TRPCQueryProcedure<{
298
577
  input: {
299
578
  resourceSlug: string;
579
+ } | {
580
+ communityToolSlug: string;
300
581
  };
301
582
  output: import('@igstack/app-catalog-backend-core').FeedbackList;
302
583
  meta: object;
@@ -309,6 +590,7 @@ declare const TRPCProvider: import('react').FunctionComponent<{
309
590
  add: import('@trpc/server').TRPCMutationProcedure<{
310
591
  input: {
311
592
  resourceSlug?: string | undefined;
593
+ communityToolSlug?: string | undefined;
312
594
  subject?: string | undefined;
313
595
  body?: string | undefined;
314
596
  attachmentIds?: string[] | undefined;
@@ -334,6 +616,142 @@ declare const TRPCProvider: import('react').FunctionComponent<{
334
616
  meta: object;
335
617
  }>;
336
618
  }>>;
619
+ communityTools: import('@trpc/server').TRPCBuiltRouter<{
620
+ ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
621
+ meta: object;
622
+ errorShape: import('@trpc/server').TRPCDefaultErrorShape;
623
+ transformer: false;
624
+ }, import('@trpc/server').TRPCDecorateCreateRouterOptions<{
625
+ config: import('@trpc/server').TRPCQueryProcedure<{
626
+ input: void;
627
+ output: {
628
+ enabled: boolean;
629
+ };
630
+ meta: object;
631
+ }>;
632
+ list: import('@trpc/server').TRPCQueryProcedure<{
633
+ input: void;
634
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
635
+ meta: object;
636
+ }>;
637
+ countByApp: import('@trpc/server').TRPCQueryProcedure<{
638
+ input: void;
639
+ output: Record<string, number>;
640
+ meta: object;
641
+ }>;
642
+ get: import('@trpc/server').TRPCQueryProcedure<{
643
+ input: {
644
+ slug: string;
645
+ };
646
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
647
+ meta: object;
648
+ }>;
649
+ recordView: import('@trpc/server').TRPCMutationProcedure<{
650
+ input: {
651
+ slug: string;
652
+ };
653
+ output: {
654
+ views30d: number;
655
+ viewsAll: number;
656
+ };
657
+ meta: object;
658
+ }>;
659
+ pins: import('@trpc/server').TRPCQueryProcedure<{
660
+ input: void;
661
+ output: import('@igstack/app-catalog-shared-core').CommunityTool[];
662
+ meta: object;
663
+ }>;
664
+ pin: import('@trpc/server').TRPCMutationProcedure<{
665
+ input: {
666
+ slug: string;
667
+ };
668
+ output: void;
669
+ meta: object;
670
+ }>;
671
+ like: import('@trpc/server').TRPCMutationProcedure<{
672
+ input: {
673
+ slug: string;
674
+ };
675
+ output: void;
676
+ meta: object;
677
+ }>;
678
+ unlike: import('@trpc/server').TRPCMutationProcedure<{
679
+ input: {
680
+ slug: string;
681
+ };
682
+ output: void;
683
+ meta: object;
684
+ }>;
685
+ unpin: import('@trpc/server').TRPCMutationProcedure<{
686
+ input: {
687
+ slug: string;
688
+ };
689
+ output: void;
690
+ meta: object;
691
+ }>;
692
+ reorderPins: import('@trpc/server').TRPCMutationProcedure<{
693
+ input: {
694
+ slugs: string[];
695
+ };
696
+ output: void;
697
+ meta: object;
698
+ }>;
699
+ preview: import('@trpc/server').TRPCMutationProcedure<{
700
+ input: {
701
+ url: string;
702
+ };
703
+ output: import('@igstack/app-catalog-backend-core').ToolPreview;
704
+ meta: object;
705
+ }>;
706
+ add: import('@trpc/server').TRPCMutationProcedure<{
707
+ input: {
708
+ url: string;
709
+ name: string;
710
+ summary: string;
711
+ descriptionMd: string;
712
+ ownerSlugs: string[];
713
+ tags: {
714
+ kind: "app" | "topic";
715
+ value: string;
716
+ }[];
717
+ ownerNames?: string[] | undefined;
718
+ };
719
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
720
+ meta: object;
721
+ }>;
722
+ edit: import('@trpc/server').TRPCMutationProcedure<{
723
+ input: {
724
+ url: string;
725
+ name: string;
726
+ summary: string;
727
+ descriptionMd: string;
728
+ ownerSlugs: string[];
729
+ tags: {
730
+ kind: "app" | "topic";
731
+ value: string;
732
+ }[];
733
+ slug: string;
734
+ ownerNames?: string[] | undefined;
735
+ };
736
+ output: import('@igstack/app-catalog-shared-core').CommunityTool;
737
+ meta: object;
738
+ }>;
739
+ archive: import('@trpc/server').TRPCMutationProcedure<{
740
+ input: {
741
+ slug: string;
742
+ reason: string;
743
+ };
744
+ output: void;
745
+ meta: object;
746
+ }>;
747
+ approve: import('@trpc/server').TRPCMutationProcedure<{
748
+ input: {
749
+ slug: string;
750
+ };
751
+ output: void;
752
+ meta: object;
753
+ }>;
754
+ }>>;
337
755
  auth: import('@trpc/server').TRPCBuiltRouter<{
338
756
  ctx: import('@igstack/app-catalog-backend-core').AcTrpcContext;
339
757
  meta: {};
@@ -368,3 +786,4 @@ declare const TRPCProvider: import('react').FunctionComponent<{
368
786
  }>>;
369
787
  }>>>;
370
788
  export { TRPCProvider, useTRPC, useTRPCClient };
789
+ export type { TRPCRouter };
@@ -1 +1 @@
1
- {"version":3,"file":"trpc.js","sources":["../../../../src/api/infra/trpc.ts"],"sourcesContent":["import { createTRPCContext } from '@trpc/tanstack-react-query'\nimport type { TRPCRouter } from '@igstack/app-catalog-backend-core'\n\nconst { TRPCProvider, useTRPC, useTRPCClient } = createTRPCContext<TRPCRouter>()\n\nexport { TRPCProvider, useTRPC, useTRPCClient }\n"],"names":[],"mappings":";AAGA,MAAM,EAAE,cAAc,SAAS,cAAA,IAAkB,kBAAA;"}
1
+ {"version":3,"file":"trpc.js","sources":["../../../../src/api/infra/trpc.ts"],"sourcesContent":["import { createTRPCContext } from '@trpc/tanstack-react-query'\nimport type { TRPCRouter } from '@igstack/app-catalog-backend-core'\n\nconst { TRPCProvider, useTRPC, useTRPCClient } = createTRPCContext<TRPCRouter>()\n\n// Re-export with explicit types to avoid portable type errors\nexport { TRPCProvider, useTRPC, useTRPCClient }\nexport type { TRPCRouter }\n"],"names":[],"mappings":";AAGA,MAAM,EAAE,cAAc,SAAS,cAAA,IAAkB,kBAAA;"}
@@ -87,9 +87,9 @@ export declare function useUpdateApp(): import('@tanstack/react-query').UseMutat
87
87
  status: "active" | "review" | "archived";
88
88
  text: string;
89
89
  addedAt: string;
90
+ archivedAt?: string | undefined;
90
91
  origin?: string | undefined;
91
92
  archiveReason?: string | undefined;
92
- archivedAt?: string | undefined;
93
93
  }[] | undefined;
94
94
  childrenLabel?: string | undefined;
95
95
  parentSlug?: string | undefined;
@@ -9,10 +9,8 @@ import { Resource } from '@igstack/app-catalog-backend-core';
9
9
  * sub-resource's own detail, with its two-step access chain and a back link to
10
10
  * the parent.
11
11
  *
12
- * Escape handling: this component does NOT globally bind Escape. Escape-to-close
13
- * is owned by AppDetails' own key handling (which first closes an open
14
- * screenshot gallery, then closes the card), so pressing Esc inside the gallery
15
- * returns to the card — not all the way to the home page (#38 Esc-stacking bug).
12
+ * The overlay itself — scrim, centring, Widen, Close, Escape — is
13
+ * `DetailDialogShell`, shared with the community tool card.
16
14
  */
17
15
  export declare function AppDetailPanel({ app, subResource, onClose, onAppClick, onBackToParent, }: {
18
16
  app: Resource;
@@ -1,14 +1,13 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { Minimize2, Maximize2, X } from "lucide-react";
3
- import { useMemo, useRef, useState, useLayoutEffect, useEffect } from "react";
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useMemo } from "react";
4
3
  import { useAppCatalogContext } from "../../context/AppCatalogContext.js";
5
4
  import { useOptionalUser } from "../../../auth/AuthContext.js";
6
5
  import "@tanstack/react-query";
7
6
  import "../../../../ui/button.js";
8
- import { useDismissStack, useDismissable } from "../../../dismiss/DismissStack.js";
9
7
  import { getChildResources } from "../../utils/resolveHelpers.js";
10
8
  import { SubResourceDetailPanel } from "../components/SubResourceDetailPanel.js";
11
9
  import { AppDetails } from "../detail/AppDetails.js";
10
+ import { DetailDialogShell } from "./DetailDialogShell.js";
12
11
  import { ResourceDetailProvider, ResourceDetailAccessActions } from "../../../extensions/features/resourceDetail.js";
13
12
  function AppDetailPanel({
14
13
  app,
@@ -28,105 +27,34 @@ function AppDetailPanel({
28
27
  }),
29
28
  [subResource, app, allResources, user]
30
29
  );
31
- const dialogRef = useRef(null);
32
- const [isWide, setIsWide] = useState(false);
33
- useLayoutEffect(() => {
34
- const card = dialogRef.current;
35
- const scroller = card == null ? void 0 : card.parentElement;
36
- if (!card || !scroller) return;
37
- const pinCentre = () => {
38
- card.style.marginTop = "0px";
39
- const style = getComputedStyle(scroller);
40
- const usable = scroller.clientHeight - parseFloat(style.paddingTop) - parseFloat(style.paddingBottom);
41
- const slack = usable - card.offsetHeight;
42
- card.style.marginTop = `${Math.max(0, Math.round(slack / 2))}px`;
43
- };
44
- pinCentre();
45
- window.addEventListener("resize", pinCentre);
46
- return () => window.removeEventListener("resize", pinCentre);
47
- }, [app.slug, subResource == null ? void 0 : subResource.slug]);
48
30
  const shownSlug = (subResource == null ? void 0 : subResource.slug) ?? app.slug;
49
- const stack = useDismissStack();
50
- useEffect(() => {
51
- const dialog = dialogRef.current;
52
- if (!dialog || dialog.contains(document.activeElement)) return;
53
- const top = stack.topElement();
54
- if (top && top !== dialog) return;
55
- const target = dialog.querySelector(".app-door") ?? dialog;
56
- target.focus();
57
- }, [shownSlug, stack]);
58
- useDismissable(dialogRef, onClose);
59
- return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-start justify-center overflow-y-auto p-4 sm:p-6 md:p-10", children: [
60
- /* @__PURE__ */ jsx(
61
- "button",
62
- {
63
- type: "button",
64
- "aria-label": "Close details panel",
65
- onClick: onClose,
66
- className: "fixed inset-0 -z-10 bg-black/40 backdrop-blur-[2px] animate-in fade-in"
67
- }
68
- ),
69
- /* @__PURE__ */ jsxs(
70
- "div",
71
- {
72
- ref: dialogRef,
73
- role: "dialog",
74
- "aria-modal": "true",
75
- "aria-label": `${(subResource == null ? void 0 : subResource.displayName) ?? app.displayName} details`,
76
- tabIndex: -1,
77
- className: `relative w-full ${isWide ? "max-w-none" : "max-w-[min(1120px,94vw)]"} overflow-hidden rounded-[var(--radius)] border border-border bg-background shadow-2xl animate-in fade-in zoom-in-95 duration-200 outline-none`,
78
- children: [
79
- /* @__PURE__ */ jsxs("div", { className: "absolute top-3 right-3 z-10 flex gap-1", children: [
80
- /* @__PURE__ */ jsx(
81
- "button",
82
- {
83
- type: "button",
84
- "aria-label": isWide ? "Restore width" : "Widen card",
85
- title: isWide ? "Restore width" : "Widen card",
86
- onClick: () => setIsWide((wide) => !wide),
87
- className: "rounded-full p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
88
- children: isWide ? /* @__PURE__ */ jsx(Minimize2, { className: "size-4" }) : /* @__PURE__ */ jsx(Maximize2, { className: "size-4" })
89
- }
90
- ),
91
- /* @__PURE__ */ jsx(
92
- "button",
93
- {
94
- type: "button",
95
- "aria-label": "Close",
96
- onClick: onClose,
97
- className: "rounded-full p-1.5 text-muted-foreground hover:bg-accent hover:text-foreground transition-colors",
98
- children: /* @__PURE__ */ jsx(X, { className: "size-4" })
99
- }
100
- )
101
- ] }),
102
- /* @__PURE__ */ jsx(
103
- "div",
31
+ return /* @__PURE__ */ jsx(
32
+ DetailDialogShell,
33
+ {
34
+ label: `${(subResource == null ? void 0 : subResource.displayName) ?? app.displayName} details`,
35
+ shownKey: shownSlug,
36
+ maxWidthClass: "max-w-[min(1120px,94vw)]",
37
+ focusSelector: ".app-door",
38
+ onClose,
39
+ children: /* @__PURE__ */ jsx(
40
+ ResourceDetailProvider,
41
+ {
42
+ resource: subResource ?? app,
43
+ parent: subResource ? app : void 0,
44
+ children: subResource ? /* @__PURE__ */ jsx(
45
+ SubResourceDetailPanel,
104
46
  {
105
- className: "max-h-[85vh] overflow-y-auto px-6 py-5 sm:px-8 sm:py-7",
106
- children: /* @__PURE__ */ jsx(
107
- ResourceDetailProvider,
108
- {
109
- resource: subResource ?? app,
110
- parent: subResource ? app : void 0,
111
- children: subResource ? /* @__PURE__ */ jsx(
112
- SubResourceDetailPanel,
113
- {
114
- subResource,
115
- parent: app,
116
- approvalMethods,
117
- onBack: onBackToParent ?? onClose,
118
- actions: /* @__PURE__ */ jsx(ResourceDetailAccessActions, { ...subResourceActionsCtx })
119
- }
120
- ) : /* @__PURE__ */ jsx(AppDetails, { app, onAppClick })
121
- }
122
- )
123
- },
124
- shownSlug
125
- )
126
- ]
127
- }
128
- )
129
- ] });
47
+ subResource,
48
+ parent: app,
49
+ approvalMethods,
50
+ onBack: onBackToParent ?? onClose,
51
+ actions: /* @__PURE__ */ jsx(ResourceDetailAccessActions, { ...subResourceActionsCtx })
52
+ }
53
+ ) : /* @__PURE__ */ jsx(AppDetails, { app, onAppClick })
54
+ }
55
+ )
56
+ }
57
+ );
130
58
  }
131
59
  export {
132
60
  AppDetailPanel