@rynt/sdk 0.9.53

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 (332) hide show
  1. package/README.md +122 -0
  2. package/REGISTRIES.md +189 -0
  3. package/env.d.ts +11 -0
  4. package/host-shims.d.ts +30 -0
  5. package/package.json +88 -0
  6. package/src/extension-marketplace/api-types.ts +141 -0
  7. package/src/extension-marketplace/client.ts +296 -0
  8. package/src/extension-marketplace/index.ts +22 -0
  9. package/src/extension-marketplace/schemas.ts +178 -0
  10. package/src/extensions/ExtensionRoutePage.vue +17 -0
  11. package/src/extensions/context.ts +37 -0
  12. package/src/extensions/disabled-folder.ts +21 -0
  13. package/src/extensions/extension-expose-map.ts +5 -0
  14. package/src/extensions/extension-expose.ts +48 -0
  15. package/src/extensions/graph.ts +67 -0
  16. package/src/extensions/index.ts +251 -0
  17. package/src/extensions/invite-handler/types.ts +20 -0
  18. package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
  19. package/src/extensions/launcher-entities/keys.ts +46 -0
  20. package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
  21. package/src/extensions/launcher-entities/props-map.ts +69 -0
  22. package/src/extensions/launcher-entities/registry.ts +32 -0
  23. package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
  24. package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
  25. package/src/extensions/launcher-models/keys.ts +23 -0
  26. package/src/extensions/launcher-models/public.ts +9 -0
  27. package/src/extensions/launcher-models/registry-core.ts +34 -0
  28. package/src/extensions/manifest-types.ts +22 -0
  29. package/src/extensions/manifest.ts +46 -0
  30. package/src/extensions/marketplace-open-key.ts +26 -0
  31. package/src/extensions/plugin-types.ts +44 -0
  32. package/src/extensions/plugin.ts +62 -0
  33. package/src/extensions/registries/bootstrap.ts +11 -0
  34. package/src/extensions/registries/builtins/account-provider.ts +6 -0
  35. package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
  36. package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
  37. package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
  38. package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
  39. package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
  40. package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
  41. package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
  42. package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
  43. package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
  44. package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
  45. package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
  46. package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
  47. package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
  48. package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
  49. package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
  50. package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
  51. package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
  52. package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
  53. package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
  54. package/src/extensions/registries/builtins/file-editor.ts +19 -0
  55. package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
  56. package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
  57. package/src/extensions/registries/builtins/index.ts +141 -0
  58. package/src/extensions/registries/builtins/invite-handler.ts +7 -0
  59. package/src/extensions/registries/builtins/library-after-content.ts +6 -0
  60. package/src/extensions/registries/builtins/library-before-content.ts +6 -0
  61. package/src/extensions/registries/builtins/loader.ts +8 -0
  62. package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
  63. package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
  64. package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
  65. package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
  66. package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
  67. package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
  68. package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
  69. package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
  70. package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
  71. package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
  72. package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
  73. package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
  74. package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
  75. package/src/extensions/registries/builtins/mod-provider.ts +5 -0
  76. package/src/extensions/registries/builtins/nav.ts +7 -0
  77. package/src/extensions/registries/builtins/page.ts +13 -0
  78. package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
  79. package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
  80. package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
  81. package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
  82. package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
  83. package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
  84. package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
  85. package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
  86. package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
  87. package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
  88. package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
  89. package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
  90. package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
  91. package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
  92. package/src/extensions/registries/builtins/shell.ts +5 -0
  93. package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
  94. package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
  95. package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
  96. package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
  97. package/src/extensions/registries/builtins/sidebar.ts +11 -0
  98. package/src/extensions/registries/builtins/theme.ts +5 -0
  99. package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
  100. package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
  101. package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
  102. package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
  103. package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
  104. package/src/extensions/registries/builtins/user-strip.ts +5 -0
  105. package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
  106. package/src/extensions/registries/define-extension-registry.ts +58 -0
  107. package/src/extensions/registries/extension-host-api.ts +41 -0
  108. package/src/extensions/registries/extension-registry-api.ts +103 -0
  109. package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
  110. package/src/extensions/registries/extension-scope.ts +41 -0
  111. package/src/extensions/registries/get-registry.ts +23 -0
  112. package/src/extensions/registries/index.ts +58 -0
  113. package/src/extensions/registries/manifest-rynt.ts +193 -0
  114. package/src/extensions/registries/registry-slot.ts +40 -0
  115. package/src/extensions/registries/registry-value-map.ts +89 -0
  116. package/src/extensions/registries/store.ts +206 -0
  117. package/src/extensions/resolve-extensions.ts +245 -0
  118. package/src/extensions/router-bridge.ts +103 -0
  119. package/src/extensions/session.ts +6 -0
  120. package/src/extensions/slug.ts +23 -0
  121. package/src/extensions/version.ts +147 -0
  122. package/src/host/extensions-composables.ts +33 -0
  123. package/src/host/extensions-init.ts +194 -0
  124. package/src/host/index.ts +11 -0
  125. package/src/host/launcher-models/index.ts +4 -0
  126. package/src/index.ts +229 -0
  127. package/src/minecraft-loader/base-loader.ts +102 -0
  128. package/src/minecraft-loader/index.ts +11 -0
  129. package/src/minecraft-loader/loader-registry.ts +72 -0
  130. package/src/shared/api/assets.ts +112 -0
  131. package/src/shared/api/auth.ts +283 -0
  132. package/src/shared/api/builds.ts +647 -0
  133. package/src/shared/api/config.ts +19 -0
  134. package/src/shared/api/download-stats.ts +103 -0
  135. package/src/shared/api/downloads.ts +36 -0
  136. package/src/shared/api/entity-authorship.ts +60 -0
  137. package/src/shared/api/events.ts +393 -0
  138. package/src/shared/api/friends.ts +140 -0
  139. package/src/shared/api/graphql.ts +87 -0
  140. package/src/shared/api/index.ts +23 -0
  141. package/src/shared/api/invites.ts +262 -0
  142. package/src/shared/api/library.ts +44 -0
  143. package/src/shared/api/maps.ts +385 -0
  144. package/src/shared/api/notify-websocket.ts +140 -0
  145. package/src/shared/api/posts.ts +357 -0
  146. package/src/shared/api/projectServers.ts +379 -0
  147. package/src/shared/api/serverMembers.ts +173 -0
  148. package/src/shared/api/users.ts +294 -0
  149. package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
  150. package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
  151. package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
  152. package/src/shared/composables/index.ts +10 -0
  153. package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
  154. package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
  155. package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
  156. package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
  157. package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
  158. package/src/shared/composables/useSkinRender.ts +70 -0
  159. package/src/shared/composables/useZlDeepLink.ts +178 -0
  160. package/src/shared/definitions/defineGraphCache.ts +216 -0
  161. package/src/shared/definitions/defineStore.ts +32 -0
  162. package/src/shared/definitions/index.ts +2 -0
  163. package/src/shared/minecraft-types/build-manifest.ts +611 -0
  164. package/src/shared/minecraft-types/index.ts +3 -0
  165. package/src/shared/minecraft-types/launcher-versions.ts +32 -0
  166. package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
  167. package/src/shared/mocks/index.ts +1 -0
  168. package/src/shared/mocks/navigation.ts +17 -0
  169. package/src/shared/mods/http.ts +45 -0
  170. package/src/shared/mods/index.ts +5 -0
  171. package/src/shared/mods/marketplace-editor-search.ts +266 -0
  172. package/src/shared/mods/marketplace-search-utils.ts +42 -0
  173. package/src/shared/mods/mod-marketplace-registry.ts +66 -0
  174. package/src/shared/mods/mod-marketplace-types.ts +28 -0
  175. package/src/shared/mods/providers/curseforge.ts +464 -0
  176. package/src/shared/mods/providers/index.ts +8 -0
  177. package/src/shared/mods/providers/modrinth.ts +402 -0
  178. package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
  179. package/src/shared/mods/types.ts +76 -0
  180. package/src/shared/styles/index.css +713 -0
  181. package/src/shared/themes/index.ts +23 -0
  182. package/src/shared/themes/theme-tokens-black.json +126 -0
  183. package/src/shared/themes/theme-tokens-classic.json +126 -0
  184. package/src/shared/themes/theme-tokens-pink.json +126 -0
  185. package/src/shared/themes/theme-tokens.json +126 -0
  186. package/src/shared/themes/types.ts +85 -0
  187. package/src/shared/types/API_DOCUMENTATION.md +422 -0
  188. package/src/shared/types/account.ts +40 -0
  189. package/src/shared/types/build.ts +8 -0
  190. package/src/shared/types/entities.ts +181 -0
  191. package/src/shared/types/index.ts +6 -0
  192. package/src/shared/types/invite-payloads.ts +60 -0
  193. package/src/shared/types/navigation.ts +16 -0
  194. package/src/shared/types/running-build.ts +51 -0
  195. package/src/shared/types/serverMember.ts +17 -0
  196. package/src/shared/types/user.ts +55 -0
  197. package/src/shared/ui/base/Avatar.vue +262 -0
  198. package/src/shared/ui/base/Badge.vue +47 -0
  199. package/src/shared/ui/base/Button.vue +78 -0
  200. package/src/shared/ui/base/Divider.vue +42 -0
  201. package/src/shared/ui/base/Icon.vue +597 -0
  202. package/src/shared/ui/base/StatusIndicator.vue +44 -0
  203. package/src/shared/ui/base/index.ts +7 -0
  204. package/src/shared/ui/cards/InviteCard.vue +47 -0
  205. package/src/shared/ui/cards/index.ts +2 -0
  206. package/src/shared/ui/dialog/Dialog.vue +71 -0
  207. package/src/shared/ui/dialog/DialogContent.vue +31 -0
  208. package/src/shared/ui/dialog/DialogFooter.vue +14 -0
  209. package/src/shared/ui/dialog/DialogHeader.vue +41 -0
  210. package/src/shared/ui/dialog/index.ts +5 -0
  211. package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
  212. package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
  213. package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
  214. package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
  215. package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
  216. package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
  217. package/src/shared/ui/editors/index.ts +6 -0
  218. package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
  219. package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
  220. package/src/shared/ui/form/Checkbox.vue +38 -0
  221. package/src/shared/ui/form/FormField.vue +30 -0
  222. package/src/shared/ui/form/FormGrid.vue +38 -0
  223. package/src/shared/ui/form/ImageEditor.vue +598 -0
  224. package/src/shared/ui/form/Input.vue +72 -0
  225. package/src/shared/ui/form/Range.vue +65 -0
  226. package/src/shared/ui/form/Select.vue +76 -0
  227. package/src/shared/ui/form/Switch.vue +38 -0
  228. package/src/shared/ui/form/Textarea.vue +144 -0
  229. package/src/shared/ui/form/index.ts +9 -0
  230. package/src/shared/ui/index.ts +9 -0
  231. package/src/shared/ui/layout/BusyOverlay.vue +31 -0
  232. package/src/shared/ui/layout/Callout.vue +44 -0
  233. package/src/shared/ui/layout/Card.vue +38 -0
  234. package/src/shared/ui/layout/Container.vue +36 -0
  235. package/src/shared/ui/layout/EmptyState.vue +99 -0
  236. package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
  237. package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
  238. package/src/shared/ui/layout/FloatingPanel.vue +37 -0
  239. package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
  240. package/src/shared/ui/layout/Grid.vue +40 -0
  241. package/src/shared/ui/layout/Inline.vue +59 -0
  242. package/src/shared/ui/layout/LoadingState.vue +39 -0
  243. package/src/shared/ui/layout/MediaBox.vue +47 -0
  244. package/src/shared/ui/layout/OverlayPanel.vue +28 -0
  245. package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
  246. package/src/shared/ui/layout/PageSection.vue +43 -0
  247. package/src/shared/ui/layout/PageToolbar.vue +29 -0
  248. package/src/shared/ui/layout/Panel.vue +39 -0
  249. package/src/shared/ui/layout/ProgressBar.vue +49 -0
  250. package/src/shared/ui/layout/Section.vue +30 -0
  251. package/src/shared/ui/layout/SegmentedControl.vue +43 -0
  252. package/src/shared/ui/layout/SelectableCard.vue +46 -0
  253. package/src/shared/ui/layout/SelectableRow.vue +41 -0
  254. package/src/shared/ui/layout/Skeleton.vue +25 -0
  255. package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
  256. package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
  257. package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
  258. package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
  259. package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
  260. package/src/shared/ui/layout/SkeletonText.vue +25 -0
  261. package/src/shared/ui/layout/Stack.vue +42 -0
  262. package/src/shared/ui/layout/StateBlock.vue +44 -0
  263. package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
  264. package/src/shared/ui/layout/VirtualList.vue +160 -0
  265. package/src/shared/ui/layout/index.ts +35 -0
  266. package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
  267. package/src/shared/ui/navigation/NavItem.vue +139 -0
  268. package/src/shared/ui/navigation/Tab.vue +61 -0
  269. package/src/shared/ui/navigation/Tabs.vue +37 -0
  270. package/src/shared/ui/navigation/index.ts +4 -0
  271. package/src/shared/ui/primitives/Action.vue +19 -0
  272. package/src/shared/ui/primitives/Block.vue +28 -0
  273. package/src/shared/ui/primitives/CanvasView.vue +19 -0
  274. package/src/shared/ui/primitives/Control.vue +24 -0
  275. package/src/shared/ui/primitives/ControlSelect.vue +19 -0
  276. package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
  277. package/src/shared/ui/primitives/FieldLabel.vue +19 -0
  278. package/src/shared/ui/primitives/Form.vue +19 -0
  279. package/src/shared/ui/primitives/Heading.vue +29 -0
  280. package/src/shared/ui/primitives/Image.vue +17 -0
  281. package/src/shared/ui/primitives/LineBreak.vue +3 -0
  282. package/src/shared/ui/primitives/Link.vue +19 -0
  283. package/src/shared/ui/primitives/List.vue +28 -0
  284. package/src/shared/ui/primitives/ListItem.vue +19 -0
  285. package/src/shared/ui/primitives/OptionItem.vue +19 -0
  286. package/src/shared/ui/primitives/Text.vue +28 -0
  287. package/src/shared/ui/primitives/VideoView.vue +19 -0
  288. package/src/shared/ui/primitives/index.ts +19 -0
  289. package/src/shared/ui/primitives/resolveElement.ts +25 -0
  290. package/src/shared/ui/special/AngularAccent.vue +106 -0
  291. package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
  292. package/src/shared/ui/special/InfoRow.vue +39 -0
  293. package/src/shared/ui/special/LogViewer.vue +53 -0
  294. package/src/shared/ui/special/PageHeader.vue +23 -0
  295. package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
  296. package/src/shared/ui/special/WelcomeCard.vue +32 -0
  297. package/src/shared/ui/special/index.ts +9 -0
  298. package/src/shared/utils/app-paths.ts +50 -0
  299. package/src/shared/utils/attachments.ts +16 -0
  300. package/src/shared/utils/autostart.ts +213 -0
  301. package/src/shared/utils/build-files.ts +439 -0
  302. package/src/shared/utils/build-manifest-init.ts +176 -0
  303. package/src/shared/utils/cloudinary.ts +67 -0
  304. package/src/shared/utils/cn.ts +7 -0
  305. package/src/shared/utils/download-stats-week.ts +165 -0
  306. package/src/shared/utils/entity-api-to-cache.ts +84 -0
  307. package/src/shared/utils/entity-build-from-api.ts +1 -0
  308. package/src/shared/utils/entity-display.ts +27 -0
  309. package/src/shared/utils/entity-map-from-api.ts +1 -0
  310. package/src/shared/utils/file-hash.ts +65 -0
  311. package/src/shared/utils/formatSize.ts +5 -0
  312. package/src/shared/utils/formatTime.ts +157 -0
  313. package/src/shared/utils/getAccountSkinRender.ts +32 -0
  314. package/src/shared/utils/index.ts +34 -0
  315. package/src/shared/utils/local-mods.ts +678 -0
  316. package/src/shared/utils/local-settings.ts +217 -0
  317. package/src/shared/utils/member-join-stats.ts +35 -0
  318. package/src/shared/utils/platform.ts +86 -0
  319. package/src/shared/utils/play-host-slug.ts +92 -0
  320. package/src/shared/utils/rich-content.ts +294 -0
  321. package/src/shared/utils/safeRequest.ts +23 -0
  322. package/src/shared/utils/semver.ts +81 -0
  323. package/src/shared/utils/serverPermissions.ts +155 -0
  324. package/src/shared/utils/skin-render-cache.ts +372 -0
  325. package/src/shared/utils/stripMarkdown.ts +45 -0
  326. package/src/shared/utils/transliterate.ts +74 -0
  327. package/src/shared/utils/updateAccountSkinRender.ts +64 -0
  328. package/src/shared/utils/updater.ts +218 -0
  329. package/src/shared/utils/uploadImage.ts +195 -0
  330. package/src/shared/utils/user-status.ts +9 -0
  331. package/src/tiptap/index.ts +7 -0
  332. package/tsconfig.json +13 -0
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <div
3
+ class="bg-surface-list p-3 flex items-center gap-3 hover:bg-surface-list-hover transition-colors"
4
+ >
5
+ <Avatar :src="avatar" size="md" :title="username" />
6
+ <div class="flex-1 min-w-0">
7
+ <div class="text-foreground font-medium text-sm truncate">{{ username }}</div>
8
+ <!-- <div class="text-muted-foreground text-xs truncate">{{ email }}</div> -->
9
+ </div>
10
+ <div class="flex items-center gap-2">
11
+ <Button
12
+ variant="primary"
13
+ size="sm"
14
+ :disabled="isProcessing"
15
+ @click="$emit('accept')"
16
+ >
17
+ {{ isProcessing ? 'Обработка...' : 'Принять' }}
18
+ </Button>
19
+ <Button
20
+ variant="secondary"
21
+ size="sm"
22
+ :disabled="isProcessing"
23
+ @click="$emit('reject')"
24
+ >
25
+ Отклонить
26
+ </Button>
27
+ </div>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { Avatar, Button } from '../base';
33
+
34
+ interface Props {
35
+ username: string;
36
+ email: string;
37
+ avatar?: string;
38
+ isProcessing?: boolean;
39
+ }
40
+
41
+ defineProps<Props>();
42
+
43
+ const emit = defineEmits<{
44
+ accept: [];
45
+ reject: [];
46
+ }>();
47
+ </script>
@@ -0,0 +1,2 @@
1
+ export { default as InviteCard } from './InviteCard.vue';
2
+
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <Teleport to="body">
3
+ <Transition name="dialog">
4
+ <div
5
+ v-if="open"
6
+ class="fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4"
7
+ @mousedown.self="!closeDisabled && $emit('close')"
8
+ >
9
+ <div :class="dialogClasses" :style="angularStyle" @click.stop>
10
+ <slot />
11
+ </div>
12
+ </div>
13
+ </Transition>
14
+ </Teleport>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { computed } from 'vue';
19
+ import { cn } from '../../utils/cn';
20
+
21
+ interface Props {
22
+ open: boolean;
23
+ size?: 'sm' | 'md' | 'base' | 'lg' | 'xl' | 'full';
24
+ angular?: boolean;
25
+ closeDisabled?: boolean;
26
+ }
27
+
28
+ const props = withDefaults(defineProps<Props>(), {
29
+ size: 'base',
30
+ angular: true,
31
+ closeDisabled: false,
32
+ });
33
+
34
+ const emit = defineEmits<{
35
+ close: [];
36
+ }>();
37
+
38
+ const sizeClasses = {
39
+ sm: 'max-w-md',
40
+ md: 'max-w-2xl',
41
+ base: 'max-w-4xl',
42
+ lg: 'max-w-6xl',
43
+ xl: 'max-w-7xl',
44
+ full: 'w-full max-w-7xl',
45
+ };
46
+
47
+ const dialogClasses = computed(() => {
48
+ return cn(
49
+ 'flex w-full max-h-[90vh] flex-col overflow-hidden rounded border border-primary/22 rnt-dialog',
50
+ 'shadow-[0_12px_40px_-12px_color-mix(in_srgb,var(--foreground)_38%,transparent),0_0_0_1px_color-mix(in_srgb,var(--primary)_22%,transparent)_inset]',
51
+ sizeClasses[props.size],
52
+ );
53
+ });
54
+
55
+ const angularStyle = computed(() => {
56
+ if (!props.angular) return {};
57
+ return {};
58
+ });
59
+ </script>
60
+
61
+ <style scoped>
62
+ .dialog-enter-active,
63
+ .dialog-leave-active {
64
+ transition: opacity 0.2s ease;
65
+ }
66
+
67
+ .dialog-enter-from,
68
+ .dialog-leave-to {
69
+ opacity: 0;
70
+ }
71
+ </style>
@@ -0,0 +1,31 @@
1
+ <template>
2
+ <div :class="contentClasses">
3
+ <slot />
4
+ </div>
5
+ </template>
6
+
7
+ <script setup lang="ts">
8
+ import { computed } from 'vue';
9
+ import { cn } from '../../utils/cn';
10
+
11
+ interface Props {
12
+ padding?: boolean;
13
+ scrollable?: boolean;
14
+ class?: string;
15
+ }
16
+
17
+ const props = withDefaults(defineProps<Props>(), {
18
+ padding: true,
19
+ scrollable: true,
20
+ });
21
+
22
+ const contentClasses = computed(() => {
23
+ return cn(
24
+ 'flex-1',
25
+ props.padding && 'p-4',
26
+ props.scrollable && 'overflow-y-auto',
27
+ props.class
28
+ );
29
+ });
30
+ </script>
31
+
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <div class="p-4 border-t border-border flex justify-between items-center">
3
+ <div class="text-muted-foreground text-sm">
4
+ <slot name="left" />
5
+ </div>
6
+ <div class="flex gap-3">
7
+ <slot />
8
+ </div>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ </script>
14
+
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <div class="flex items-center justify-between border-b border-border p-4">
3
+ <div>
4
+ <h2 v-if="title" class="text-lg font-semibold text-foreground">{{ title }}</h2>
5
+ <p v-if="description" class="mt-1 text-xs text-muted-foreground">{{ description }}</p>
6
+ <slot />
7
+ </div>
8
+ <button
9
+ v-if="showClose"
10
+ @click="$emit('close')"
11
+ :disabled="closeDisabled"
12
+ :class="[
13
+ 'text-muted-foreground transition-colors hover:text-foreground',
14
+ closeDisabled && 'cursor-not-allowed opacity-50',
15
+ ]"
16
+ >
17
+ <Icon name="close" size="lg" />
18
+ </button>
19
+ </div>
20
+ </template>
21
+
22
+ <script setup lang="ts">
23
+ import { Icon } from '../base';
24
+
25
+ interface Props {
26
+ title?: string;
27
+ description?: string;
28
+ showClose?: boolean;
29
+ closeDisabled?: boolean;
30
+ }
31
+
32
+ const props = withDefaults(defineProps<Props>(), {
33
+ showClose: true,
34
+ closeDisabled: false,
35
+ });
36
+
37
+ const emit = defineEmits<{
38
+ close: [];
39
+ }>();
40
+ </script>
41
+
@@ -0,0 +1,5 @@
1
+ export { default as Dialog } from './Dialog.vue';
2
+ export { default as DialogHeader } from './DialogHeader.vue';
3
+ export { default as DialogContent } from './DialogContent.vue';
4
+ export { default as DialogFooter } from './DialogFooter.vue';
5
+
@@ -0,0 +1,133 @@
1
+ <template>
2
+ <div class="attachment-images-editor">
3
+ <input
4
+ ref="fileInputRef"
5
+ type="file"
6
+ accept="image/*"
7
+ multiple
8
+ class="hidden"
9
+ @change="handleFileChange"
10
+ />
11
+
12
+ <div v-if="modelValue.length" class="mb-2 flex flex-wrap gap-2">
13
+ <div
14
+ v-for="(url, index) in modelValue"
15
+ :key="`${url}-${index}`"
16
+ class="group relative h-20 w-20 overflow-hidden rounded border border-border bg-card"
17
+ >
18
+ <img :src="url" alt="" class="h-full w-full object-cover" />
19
+ <div
20
+ v-if="uploadingIndexes.has(index)"
21
+ class="absolute inset-0 flex items-center justify-center bg-background/50"
22
+ >
23
+ <div
24
+ class="h-5 w-5 animate-spin rounded-full border-2 border-foreground/25 border-t-accent-secondary"
25
+ />
26
+ </div>
27
+ <button
28
+ v-else
29
+ type="button"
30
+ class="absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded bg-background/80 text-subtle-fg opacity-0 transition-opacity hover:text-destructive group-hover:opacity-100"
31
+ title="Удалить"
32
+ @mousedown.prevent="removeAt(index)"
33
+ >
34
+ <Icon name="x" size="xs" />
35
+ </button>
36
+ </div>
37
+ </div>
38
+
39
+ <Button
40
+ type="button"
41
+ variant="secondary"
42
+ size="sm"
43
+ :disabled="isUploading || modelValue.length >= maxImages"
44
+ @click="openFilePicker"
45
+ >
46
+ <Icon v-if="isUploading" name="refresh-cw" size="sm" class="animate-spin" />
47
+ <Icon v-else name="image" size="sm" />
48
+ {{ isUploading ? 'Загрузка...' : 'Добавить фото' }}
49
+ </Button>
50
+ <p v-if="maxImages > 0" class="mt-1 text-xs text-subtle-fg">
51
+ До {{ maxImages }} изображений
52
+ </p>
53
+ </div>
54
+ </template>
55
+
56
+ <script setup lang="ts">
57
+ import { ref } from 'vue';
58
+ import { Button, Icon } from '..';
59
+ import { uploadImage } from '../../utils/uploadImage';
60
+
61
+ interface Props {
62
+ modelValue: string[];
63
+ uploadFolder?: string;
64
+ maxImages?: number;
65
+ }
66
+
67
+ const props = withDefaults(defineProps<Props>(), {
68
+ uploadFolder: 'content',
69
+ maxImages: 10,
70
+ });
71
+
72
+ const emit = defineEmits<{
73
+ 'update:modelValue': [value: string[]];
74
+ }>();
75
+
76
+ const fileInputRef = ref<HTMLInputElement | null>(null);
77
+ const isUploading = ref(false);
78
+ const uploadingIndexes = ref(new Set<number>());
79
+
80
+ const openFilePicker = () => {
81
+ fileInputRef.value?.click();
82
+ };
83
+
84
+ const removeAt = (index: number) => {
85
+ const next = [...props.modelValue];
86
+ next.splice(index, 1);
87
+ emit('update:modelValue', next);
88
+ };
89
+
90
+ const handleFileChange = async (event: Event) => {
91
+ const input = event.target as HTMLInputElement;
92
+ const files = input.files ? Array.from(input.files) : [];
93
+ input.value = '';
94
+ if (!files.length) return;
95
+
96
+ const slotsLeft = props.maxImages - props.modelValue.length;
97
+ if (slotsLeft <= 0) return;
98
+
99
+ const toUpload = files.slice(0, slotsLeft);
100
+ isUploading.value = true;
101
+
102
+ const urls = [...props.modelValue];
103
+
104
+ for (const file of toUpload) {
105
+ const index = urls.length;
106
+ urls.push('');
107
+ emit('update:modelValue', [...urls]);
108
+
109
+ const pending = new Set(uploadingIndexes.value);
110
+ pending.add(index);
111
+ uploadingIndexes.value = pending;
112
+
113
+ try {
114
+ const result = await uploadImage(file, {
115
+ folder: props.uploadFolder,
116
+ maxSizeBytes: 10 * 1024 * 1024,
117
+ });
118
+ urls[index] = result.url;
119
+ emit('update:modelValue', urls.filter(Boolean));
120
+ } catch (error) {
121
+ console.error('[AttachmentImagesEditor] upload failed:', error);
122
+ urls.pop();
123
+ emit('update:modelValue', urls.filter(Boolean));
124
+ } finally {
125
+ const nextPending = new Set(uploadingIndexes.value);
126
+ nextPending.delete(index);
127
+ uploadingIndexes.value = nextPending;
128
+ }
129
+ }
130
+
131
+ isUploading.value = false;
132
+ };
133
+ </script>
@@ -0,0 +1,76 @@
1
+ <template>
2
+ <div v-if="urls.length" class="content-attachments">
3
+ <button
4
+ v-for="(url, index) in urls"
5
+ :key="`${url}-${index}`"
6
+ type="button"
7
+ class="content-attachments__item"
8
+ :title="'Открыть изображение'"
9
+ @click="openViewer(index)"
10
+ >
11
+ <img :src="url" alt="" loading="lazy" />
12
+ </button>
13
+
14
+ <RichContentImageViewer
15
+ :open="viewerOpen"
16
+ :images="viewerImages"
17
+ :initial-index="viewerIndex"
18
+ @close="viewerOpen = false"
19
+ />
20
+ </div>
21
+ </template>
22
+
23
+ <script setup lang="ts">
24
+ import { computed, ref } from 'vue';
25
+ import { parseAttachments } from '../../utils/attachments';
26
+ import RichContentImageViewer from './RichContentImageViewer.vue';
27
+
28
+ const props = defineProps<{
29
+ attachments?: unknown;
30
+ }>();
31
+
32
+ const viewerOpen = ref(false);
33
+ const viewerIndex = ref(0);
34
+
35
+ const urls = computed(() => parseAttachments(props.attachments));
36
+
37
+ const viewerImages = computed(() =>
38
+ urls.value.map((src) => ({ src, alt: '' })),
39
+ );
40
+
41
+ const openViewer = (index: number) => {
42
+ viewerIndex.value = index;
43
+ viewerOpen.value = true;
44
+ };
45
+ </script>
46
+
47
+ <style scoped>
48
+ .content-attachments {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ gap: 0.5rem;
52
+ margin-bottom: 0.75rem;
53
+ }
54
+
55
+ .content-attachments__item {
56
+ width: 5.5rem;
57
+ height: 5.5rem;
58
+ overflow: hidden;
59
+ border: 1px solid var(--border);
60
+ border-radius: var(--radius-ui-lg);
61
+ background: var(--card);
62
+ cursor: zoom-in;
63
+ padding: 0;
64
+ }
65
+
66
+ .content-attachments__item:hover {
67
+ border-color: var(--accent-secondary);
68
+ }
69
+
70
+ .content-attachments__item img {
71
+ width: 100%;
72
+ height: 100%;
73
+ object-fit: cover;
74
+ display: block;
75
+ }
76
+ </style>