koishi-plugin-media-luna 0.0.1

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 (437) hide show
  1. package/client/README.md +558 -0
  2. package/client/api.ts +256 -0
  3. package/client/components/ChannelConfigDialog.vue +1113 -0
  4. package/client/components/ChannelsView.vue +698 -0
  5. package/client/components/ConfigRenderer.vue +164 -0
  6. package/client/components/EmptyState.vue +87 -0
  7. package/client/components/GenerateView.vue +778 -0
  8. package/client/components/HistoryGallery.vue +590 -0
  9. package/client/components/ImageLightbox.vue +510 -0
  10. package/client/components/ImageUpload.vue +298 -0
  11. package/client/components/JsonEditor.vue +68 -0
  12. package/client/components/LoadingState.vue +73 -0
  13. package/client/components/PresetsView.vue +800 -0
  14. package/client/components/ScrollContainer.vue +45 -0
  15. package/client/components/SettingsView.vue +231 -0
  16. package/client/components/StatusBadge.vue +55 -0
  17. package/client/components/TagFilter.vue +139 -0
  18. package/client/components/TagInput.vue +63 -0
  19. package/client/components/TasksView.vue +1074 -0
  20. package/client/components/ViewModeSwitch.vue +78 -0
  21. package/client/components/settings/CachePanel.vue +142 -0
  22. package/client/components/settings/MiddlewaresPanel.vue +480 -0
  23. package/client/components/settings/PluginsPanel.vue +493 -0
  24. package/client/index.ts +13 -0
  25. package/client/pages/index.vue +177 -0
  26. package/client/styles/shared.css +258 -0
  27. package/client/types.ts +158 -0
  28. package/client/utils/format.ts +72 -0
  29. package/dist/index.js +1 -0
  30. package/dist/style.css +1 -0
  31. package/lib/api/README.md +643 -0
  32. package/lib/api/cache-api.d.ts +6 -0
  33. package/lib/api/cache-api.d.ts.map +1 -0
  34. package/lib/api/cache-api.js +147 -0
  35. package/lib/api/cache-api.js.map +1 -0
  36. package/lib/api/channel-api.d.ts +6 -0
  37. package/lib/api/channel-api.d.ts.map +1 -0
  38. package/lib/api/channel-api.js +148 -0
  39. package/lib/api/channel-api.js.map +1 -0
  40. package/lib/api/connector-api.d.ts +6 -0
  41. package/lib/api/connector-api.d.ts.map +1 -0
  42. package/lib/api/connector-api.js +63 -0
  43. package/lib/api/connector-api.js.map +1 -0
  44. package/lib/api/generate-api.d.ts +6 -0
  45. package/lib/api/generate-api.d.ts.map +1 -0
  46. package/lib/api/generate-api.js +123 -0
  47. package/lib/api/generate-api.js.map +1 -0
  48. package/lib/api/index.d.ts +15 -0
  49. package/lib/api/index.d.ts.map +1 -0
  50. package/lib/api/index.js +34 -0
  51. package/lib/api/index.js.map +1 -0
  52. package/lib/api/middleware-api.d.ts +6 -0
  53. package/lib/api/middleware-api.d.ts.map +1 -0
  54. package/lib/api/middleware-api.js +212 -0
  55. package/lib/api/middleware-api.js.map +1 -0
  56. package/lib/api/plugin-api.d.ts +6 -0
  57. package/lib/api/plugin-api.d.ts.map +1 -0
  58. package/lib/api/plugin-api.js +78 -0
  59. package/lib/api/plugin-api.js.map +1 -0
  60. package/lib/api/preset-api.d.ts +6 -0
  61. package/lib/api/preset-api.d.ts.map +1 -0
  62. package/lib/api/preset-api.js +256 -0
  63. package/lib/api/preset-api.js.map +1 -0
  64. package/lib/api/settings-api.d.ts +6 -0
  65. package/lib/api/settings-api.d.ts.map +1 -0
  66. package/lib/api/settings-api.js +118 -0
  67. package/lib/api/settings-api.js.map +1 -0
  68. package/lib/api/task-api.d.ts +6 -0
  69. package/lib/api/task-api.d.ts.map +1 -0
  70. package/lib/api/task-api.js +148 -0
  71. package/lib/api/task-api.js.map +1 -0
  72. package/lib/config.d.ts +6 -0
  73. package/lib/config.d.ts.map +1 -0
  74. package/lib/config.js +8 -0
  75. package/lib/config.js.map +1 -0
  76. package/lib/connectors/builtin/chat-api.d.ts +9 -0
  77. package/lib/connectors/builtin/chat-api.d.ts.map +1 -0
  78. package/lib/connectors/builtin/chat-api.js +351 -0
  79. package/lib/connectors/builtin/chat-api.js.map +1 -0
  80. package/lib/connectors/builtin/dalle.d.ts +6 -0
  81. package/lib/connectors/builtin/dalle.d.ts.map +1 -0
  82. package/lib/connectors/builtin/dalle.js +109 -0
  83. package/lib/connectors/builtin/dalle.js.map +1 -0
  84. package/lib/connectors/builtin/flux.d.ts +7 -0
  85. package/lib/connectors/builtin/flux.d.ts.map +1 -0
  86. package/lib/connectors/builtin/flux.js +199 -0
  87. package/lib/connectors/builtin/flux.js.map +1 -0
  88. package/lib/connectors/builtin/index.d.ts +5 -0
  89. package/lib/connectors/builtin/index.d.ts.map +1 -0
  90. package/lib/connectors/builtin/index.js +6 -0
  91. package/lib/connectors/builtin/index.js.map +1 -0
  92. package/lib/connectors/builtin/sd-webui.d.ts +7 -0
  93. package/lib/connectors/builtin/sd-webui.d.ts.map +1 -0
  94. package/lib/connectors/builtin/sd-webui.js +157 -0
  95. package/lib/connectors/builtin/sd-webui.js.map +1 -0
  96. package/lib/connectors/connector-registry.d.ts +36 -0
  97. package/lib/connectors/connector-registry.d.ts.map +1 -0
  98. package/lib/connectors/connector-registry.js +66 -0
  99. package/lib/connectors/connector-registry.js.map +1 -0
  100. package/lib/connectors/index.d.ts +3 -0
  101. package/lib/connectors/index.d.ts.map +1 -0
  102. package/lib/connectors/index.js +4 -0
  103. package/lib/connectors/index.js.map +1 -0
  104. package/lib/core/api/api-utils.d.ts +46 -0
  105. package/lib/core/api/api-utils.d.ts.map +1 -0
  106. package/lib/core/api/api-utils.js +78 -0
  107. package/lib/core/api/api-utils.js.map +1 -0
  108. package/lib/core/api/cache-api.d.ts +6 -0
  109. package/lib/core/api/cache-api.d.ts.map +1 -0
  110. package/lib/core/api/cache-api.js +147 -0
  111. package/lib/core/api/cache-api.js.map +1 -0
  112. package/lib/core/api/channel-api.d.ts +6 -0
  113. package/lib/core/api/channel-api.d.ts.map +1 -0
  114. package/lib/core/api/channel-api.js +146 -0
  115. package/lib/core/api/channel-api.js.map +1 -0
  116. package/lib/core/api/connector-api.d.ts +6 -0
  117. package/lib/core/api/connector-api.d.ts.map +1 -0
  118. package/lib/core/api/connector-api.js +63 -0
  119. package/lib/core/api/connector-api.js.map +1 -0
  120. package/lib/core/api/generate-api.d.ts +6 -0
  121. package/lib/core/api/generate-api.d.ts.map +1 -0
  122. package/lib/core/api/generate-api.js +124 -0
  123. package/lib/core/api/generate-api.js.map +1 -0
  124. package/lib/core/api/index.d.ts +16 -0
  125. package/lib/core/api/index.d.ts.map +1 -0
  126. package/lib/core/api/index.js +38 -0
  127. package/lib/core/api/index.js.map +1 -0
  128. package/lib/core/api/middleware-api.d.ts +6 -0
  129. package/lib/core/api/middleware-api.d.ts.map +1 -0
  130. package/lib/core/api/middleware-api.js +196 -0
  131. package/lib/core/api/middleware-api.js.map +1 -0
  132. package/lib/core/api/plugin-api.d.ts +6 -0
  133. package/lib/core/api/plugin-api.d.ts.map +1 -0
  134. package/lib/core/api/plugin-api.js +78 -0
  135. package/lib/core/api/plugin-api.js.map +1 -0
  136. package/lib/core/api/preset-api.d.ts +6 -0
  137. package/lib/core/api/preset-api.d.ts.map +1 -0
  138. package/lib/core/api/preset-api.js +272 -0
  139. package/lib/core/api/preset-api.js.map +1 -0
  140. package/lib/core/api/settings-api.d.ts +6 -0
  141. package/lib/core/api/settings-api.d.ts.map +1 -0
  142. package/lib/core/api/settings-api.js +118 -0
  143. package/lib/core/api/settings-api.js.map +1 -0
  144. package/lib/core/api/task-api.d.ts +6 -0
  145. package/lib/core/api/task-api.d.ts.map +1 -0
  146. package/lib/core/api/task-api.js +281 -0
  147. package/lib/core/api/task-api.js.map +1 -0
  148. package/lib/core/channel.service.d.ts +44 -0
  149. package/lib/core/channel.service.d.ts.map +1 -0
  150. package/lib/core/channel.service.js +146 -0
  151. package/lib/core/channel.service.js.map +1 -0
  152. package/lib/core/config/config.service.d.ts +89 -0
  153. package/lib/core/config/config.service.d.ts.map +1 -0
  154. package/lib/core/config/config.service.js +216 -0
  155. package/lib/core/config/config.service.js.map +1 -0
  156. package/lib/core/config/index.d.ts +3 -0
  157. package/lib/core/config/index.d.ts.map +1 -0
  158. package/lib/core/config/index.js +3 -0
  159. package/lib/core/config/index.js.map +1 -0
  160. package/lib/core/error.d.ts +73 -0
  161. package/lib/core/error.d.ts.map +1 -0
  162. package/lib/core/error.js +137 -0
  163. package/lib/core/error.js.map +1 -0
  164. package/lib/core/index.d.ts +12 -0
  165. package/lib/core/index.d.ts.map +1 -0
  166. package/lib/core/index.js +23 -0
  167. package/lib/core/index.js.map +1 -0
  168. package/lib/core/logger.d.ts +18 -0
  169. package/lib/core/logger.d.ts.map +1 -0
  170. package/lib/core/logger.js +39 -0
  171. package/lib/core/logger.js.map +1 -0
  172. package/lib/core/medialuna.service.d.ts +168 -0
  173. package/lib/core/medialuna.service.d.ts.map +1 -0
  174. package/lib/core/medialuna.service.js +423 -0
  175. package/lib/core/medialuna.service.js.map +1 -0
  176. package/lib/core/pipeline/dependency-graph.d.ts +43 -0
  177. package/lib/core/pipeline/dependency-graph.d.ts.map +1 -0
  178. package/lib/core/pipeline/dependency-graph.js +223 -0
  179. package/lib/core/pipeline/dependency-graph.js.map +1 -0
  180. package/lib/core/pipeline/generation-pipeline.d.ts +40 -0
  181. package/lib/core/pipeline/generation-pipeline.d.ts.map +1 -0
  182. package/lib/core/pipeline/generation-pipeline.js +216 -0
  183. package/lib/core/pipeline/generation-pipeline.js.map +1 -0
  184. package/lib/core/pipeline/index.d.ts +4 -0
  185. package/lib/core/pipeline/index.d.ts.map +1 -0
  186. package/lib/core/pipeline/index.js +5 -0
  187. package/lib/core/pipeline/index.js.map +1 -0
  188. package/lib/core/pipeline/middleware-registry.d.ts +33 -0
  189. package/lib/core/pipeline/middleware-registry.d.ts.map +1 -0
  190. package/lib/core/pipeline/middleware-registry.js +78 -0
  191. package/lib/core/pipeline/middleware-registry.js.map +1 -0
  192. package/lib/core/plugin-loader.d.ts +77 -0
  193. package/lib/core/plugin-loader.d.ts.map +1 -0
  194. package/lib/core/plugin-loader.js +300 -0
  195. package/lib/core/plugin-loader.js.map +1 -0
  196. package/lib/core/registry/connector.registry.d.ts +36 -0
  197. package/lib/core/registry/connector.registry.d.ts.map +1 -0
  198. package/lib/core/registry/connector.registry.js +65 -0
  199. package/lib/core/registry/connector.registry.js.map +1 -0
  200. package/lib/core/registry/index.d.ts +3 -0
  201. package/lib/core/registry/index.d.ts.map +1 -0
  202. package/lib/core/registry/index.js +4 -0
  203. package/lib/core/registry/index.js.map +1 -0
  204. package/lib/core/registry/service.registry.d.ts +27 -0
  205. package/lib/core/registry/service.registry.d.ts.map +1 -0
  206. package/lib/core/registry/service.registry.js +54 -0
  207. package/lib/core/registry/service.registry.js.map +1 -0
  208. package/lib/core/request.service.d.ts +83 -0
  209. package/lib/core/request.service.d.ts.map +1 -0
  210. package/lib/core/request.service.js +237 -0
  211. package/lib/core/request.service.js.map +1 -0
  212. package/lib/core/types.d.ts +270 -0
  213. package/lib/core/types.d.ts.map +1 -0
  214. package/lib/core/types.js +17 -0
  215. package/lib/core/types.js.map +1 -0
  216. package/lib/database.d.ts +6 -0
  217. package/lib/database.d.ts.map +1 -0
  218. package/lib/database.js +89 -0
  219. package/lib/database.js.map +1 -0
  220. package/lib/index.d.ts +13 -0
  221. package/lib/index.d.ts.map +1 -0
  222. package/lib/index.js +54 -0
  223. package/lib/index.js.map +1 -0
  224. package/lib/middlewares/builtin/billing.d.ts +45 -0
  225. package/lib/middlewares/builtin/billing.d.ts.map +1 -0
  226. package/lib/middlewares/builtin/billing.js +362 -0
  227. package/lib/middlewares/builtin/billing.js.map +1 -0
  228. package/lib/middlewares/builtin/index.d.ts +6 -0
  229. package/lib/middlewares/builtin/index.d.ts.map +1 -0
  230. package/lib/middlewares/builtin/index.js +7 -0
  231. package/lib/middlewares/builtin/index.js.map +1 -0
  232. package/lib/middlewares/builtin/preset.d.ts +14 -0
  233. package/lib/middlewares/builtin/preset.d.ts.map +1 -0
  234. package/lib/middlewares/builtin/preset.js +156 -0
  235. package/lib/middlewares/builtin/preset.js.map +1 -0
  236. package/lib/middlewares/builtin/remote-preset-sync.d.ts +8 -0
  237. package/lib/middlewares/builtin/remote-preset-sync.d.ts.map +1 -0
  238. package/lib/middlewares/builtin/remote-preset-sync.js +32 -0
  239. package/lib/middlewares/builtin/remote-preset-sync.js.map +1 -0
  240. package/lib/middlewares/builtin/request.d.ts +10 -0
  241. package/lib/middlewares/builtin/request.d.ts.map +1 -0
  242. package/lib/middlewares/builtin/request.js +50 -0
  243. package/lib/middlewares/builtin/request.js.map +1 -0
  244. package/lib/middlewares/builtin/storage.d.ts +64 -0
  245. package/lib/middlewares/builtin/storage.d.ts.map +1 -0
  246. package/lib/middlewares/builtin/storage.js +715 -0
  247. package/lib/middlewares/builtin/storage.js.map +1 -0
  248. package/lib/middlewares/builtin/task-recorder.d.ts +20 -0
  249. package/lib/middlewares/builtin/task-recorder.d.ts.map +1 -0
  250. package/lib/middlewares/builtin/task-recorder.js +138 -0
  251. package/lib/middlewares/builtin/task-recorder.js.map +1 -0
  252. package/lib/middlewares/index.d.ts +2 -0
  253. package/lib/middlewares/index.d.ts.map +1 -0
  254. package/lib/middlewares/index.js +3 -0
  255. package/lib/middlewares/index.js.map +1 -0
  256. package/lib/pipeline/dependency-graph.d.ts +43 -0
  257. package/lib/pipeline/dependency-graph.d.ts.map +1 -0
  258. package/lib/pipeline/dependency-graph.js +240 -0
  259. package/lib/pipeline/dependency-graph.js.map +1 -0
  260. package/lib/pipeline/generation-pipeline.d.ts +38 -0
  261. package/lib/pipeline/generation-pipeline.d.ts.map +1 -0
  262. package/lib/pipeline/generation-pipeline.js +211 -0
  263. package/lib/pipeline/generation-pipeline.js.map +1 -0
  264. package/lib/pipeline/index.d.ts +4 -0
  265. package/lib/pipeline/index.d.ts.map +1 -0
  266. package/lib/pipeline/index.js +5 -0
  267. package/lib/pipeline/index.js.map +1 -0
  268. package/lib/pipeline/middleware-registry.d.ts +36 -0
  269. package/lib/pipeline/middleware-registry.d.ts.map +1 -0
  270. package/lib/pipeline/middleware-registry.js +83 -0
  271. package/lib/pipeline/middleware-registry.js.map +1 -0
  272. package/lib/plugins/billing/config.d.ts +19 -0
  273. package/lib/plugins/billing/config.d.ts.map +1 -0
  274. package/lib/plugins/billing/config.js +98 -0
  275. package/lib/plugins/billing/config.js.map +1 -0
  276. package/lib/plugins/billing/index.d.ts +4 -0
  277. package/lib/plugins/billing/index.d.ts.map +1 -0
  278. package/lib/plugins/billing/index.js +20 -0
  279. package/lib/plugins/billing/index.js.map +1 -0
  280. package/lib/plugins/billing/middleware.d.ts +12 -0
  281. package/lib/plugins/billing/middleware.d.ts.map +1 -0
  282. package/lib/plugins/billing/middleware.js +233 -0
  283. package/lib/plugins/billing/middleware.js.map +1 -0
  284. package/lib/plugins/cache/config.d.ts +44 -0
  285. package/lib/plugins/cache/config.d.ts.map +1 -0
  286. package/lib/plugins/cache/config.js +187 -0
  287. package/lib/plugins/cache/config.js.map +1 -0
  288. package/lib/plugins/cache/index.d.ts +6 -0
  289. package/lib/plugins/cache/index.d.ts.map +1 -0
  290. package/lib/plugins/cache/index.js +87 -0
  291. package/lib/plugins/cache/index.js.map +1 -0
  292. package/lib/plugins/cache/middleware.d.ts +12 -0
  293. package/lib/plugins/cache/middleware.d.ts.map +1 -0
  294. package/lib/plugins/cache/middleware.js +194 -0
  295. package/lib/plugins/cache/middleware.js.map +1 -0
  296. package/lib/plugins/cache/service.d.ts +106 -0
  297. package/lib/plugins/cache/service.d.ts.map +1 -0
  298. package/lib/plugins/cache/service.js +467 -0
  299. package/lib/plugins/cache/service.js.map +1 -0
  300. package/lib/plugins/cache/utils/index.d.ts +4 -0
  301. package/lib/plugins/cache/utils/index.d.ts.map +1 -0
  302. package/lib/plugins/cache/utils/index.js +5 -0
  303. package/lib/plugins/cache/utils/index.js.map +1 -0
  304. package/lib/plugins/cache/utils/mime.d.ts +9 -0
  305. package/lib/plugins/cache/utils/mime.d.ts.map +1 -0
  306. package/lib/plugins/cache/utils/mime.js +65 -0
  307. package/lib/plugins/cache/utils/mime.js.map +1 -0
  308. package/lib/plugins/cache/utils/s3.d.ts +19 -0
  309. package/lib/plugins/cache/utils/s3.d.ts.map +1 -0
  310. package/lib/plugins/cache/utils/s3.js +147 -0
  311. package/lib/plugins/cache/utils/s3.js.map +1 -0
  312. package/lib/plugins/cache/utils/webdav.d.ts +16 -0
  313. package/lib/plugins/cache/utils/webdav.d.ts.map +1 -0
  314. package/lib/plugins/cache/utils/webdav.js +69 -0
  315. package/lib/plugins/cache/utils/webdav.js.map +1 -0
  316. package/lib/plugins/connector-chat-api/index.d.ts +7 -0
  317. package/lib/plugins/connector-chat-api/index.d.ts.map +1 -0
  318. package/lib/plugins/connector-chat-api/index.js +400 -0
  319. package/lib/plugins/connector-chat-api/index.js.map +1 -0
  320. package/lib/plugins/connector-dalle/index.d.ts +7 -0
  321. package/lib/plugins/connector-dalle/index.d.ts.map +1 -0
  322. package/lib/plugins/connector-dalle/index.js +140 -0
  323. package/lib/plugins/connector-dalle/index.js.map +1 -0
  324. package/lib/plugins/connector-flux/index.d.ts +7 -0
  325. package/lib/plugins/connector-flux/index.d.ts.map +1 -0
  326. package/lib/plugins/connector-flux/index.js +232 -0
  327. package/lib/plugins/connector-flux/index.js.map +1 -0
  328. package/lib/plugins/connector-sd-webui/index.d.ts +7 -0
  329. package/lib/plugins/connector-sd-webui/index.d.ts.map +1 -0
  330. package/lib/plugins/connector-sd-webui/index.js +171 -0
  331. package/lib/plugins/connector-sd-webui/index.js.map +1 -0
  332. package/lib/plugins/index.d.ts +22 -0
  333. package/lib/plugins/index.d.ts.map +1 -0
  334. package/lib/plugins/index.js +21 -0
  335. package/lib/plugins/index.js.map +1 -0
  336. package/lib/plugins/preset/config.d.ts +37 -0
  337. package/lib/plugins/preset/config.d.ts.map +1 -0
  338. package/lib/plugins/preset/config.js +74 -0
  339. package/lib/plugins/preset/config.js.map +1 -0
  340. package/lib/plugins/preset/index.d.ts +6 -0
  341. package/lib/plugins/preset/index.d.ts.map +1 -0
  342. package/lib/plugins/preset/index.js +58 -0
  343. package/lib/plugins/preset/index.js.map +1 -0
  344. package/lib/plugins/preset/middleware.d.ts +6 -0
  345. package/lib/plugins/preset/middleware.d.ts.map +1 -0
  346. package/lib/plugins/preset/middleware.js +126 -0
  347. package/lib/plugins/preset/middleware.js.map +1 -0
  348. package/lib/plugins/preset/remote-sync.service.d.ts +84 -0
  349. package/lib/plugins/preset/remote-sync.service.d.ts.map +1 -0
  350. package/lib/plugins/preset/remote-sync.service.js +342 -0
  351. package/lib/plugins/preset/remote-sync.service.js.map +1 -0
  352. package/lib/plugins/preset/service.d.ts +64 -0
  353. package/lib/plugins/preset/service.d.ts.map +1 -0
  354. package/lib/plugins/preset/service.js +196 -0
  355. package/lib/plugins/preset/service.js.map +1 -0
  356. package/lib/plugins/prompt-encoding/config.d.ts +25 -0
  357. package/lib/plugins/prompt-encoding/config.d.ts.map +1 -0
  358. package/lib/plugins/prompt-encoding/config.js +62 -0
  359. package/lib/plugins/prompt-encoding/config.js.map +1 -0
  360. package/lib/plugins/prompt-encoding/index.d.ts +5 -0
  361. package/lib/plugins/prompt-encoding/index.d.ts.map +1 -0
  362. package/lib/plugins/prompt-encoding/index.js +21 -0
  363. package/lib/plugins/prompt-encoding/index.js.map +1 -0
  364. package/lib/plugins/prompt-encoding/middleware.d.ts +6 -0
  365. package/lib/plugins/prompt-encoding/middleware.d.ts.map +1 -0
  366. package/lib/plugins/prompt-encoding/middleware.js +151 -0
  367. package/lib/plugins/prompt-encoding/middleware.js.map +1 -0
  368. package/lib/plugins/task/config.d.ts +15 -0
  369. package/lib/plugins/task/config.d.ts.map +1 -0
  370. package/lib/plugins/task/config.js +33 -0
  371. package/lib/plugins/task/config.js.map +1 -0
  372. package/lib/plugins/task/index.d.ts +5 -0
  373. package/lib/plugins/task/index.d.ts.map +1 -0
  374. package/lib/plugins/task/index.js +58 -0
  375. package/lib/plugins/task/index.js.map +1 -0
  376. package/lib/plugins/task/middleware.d.ts +14 -0
  377. package/lib/plugins/task/middleware.d.ts.map +1 -0
  378. package/lib/plugins/task/middleware.js +123 -0
  379. package/lib/plugins/task/middleware.js.map +1 -0
  380. package/lib/plugins/task/service.d.ts +94 -0
  381. package/lib/plugins/task/service.d.ts.map +1 -0
  382. package/lib/plugins/task/service.js +226 -0
  383. package/lib/plugins/task/service.js.map +1 -0
  384. package/lib/plugins/webui-auth/config.d.ts +12 -0
  385. package/lib/plugins/webui-auth/config.d.ts.map +1 -0
  386. package/lib/plugins/webui-auth/config.js +30 -0
  387. package/lib/plugins/webui-auth/config.js.map +1 -0
  388. package/lib/plugins/webui-auth/index.d.ts +5 -0
  389. package/lib/plugins/webui-auth/index.d.ts.map +1 -0
  390. package/lib/plugins/webui-auth/index.js +99 -0
  391. package/lib/plugins/webui-auth/index.js.map +1 -0
  392. package/lib/plugins/webui-auth/service.d.ts +42 -0
  393. package/lib/plugins/webui-auth/service.d.ts.map +1 -0
  394. package/lib/plugins/webui-auth/service.js +106 -0
  395. package/lib/plugins/webui-auth/service.js.map +1 -0
  396. package/lib/services/asset-cache.service.d.ts +133 -0
  397. package/lib/services/asset-cache.service.d.ts.map +1 -0
  398. package/lib/services/asset-cache.service.js +882 -0
  399. package/lib/services/asset-cache.service.js.map +1 -0
  400. package/lib/services/cache.service.d.ts +110 -0
  401. package/lib/services/cache.service.d.ts.map +1 -0
  402. package/lib/services/cache.service.js +333 -0
  403. package/lib/services/cache.service.js.map +1 -0
  404. package/lib/services/channel.service.d.ts +44 -0
  405. package/lib/services/channel.service.d.ts.map +1 -0
  406. package/lib/services/channel.service.js +154 -0
  407. package/lib/services/channel.service.js.map +1 -0
  408. package/lib/services/config.service.d.ts +73 -0
  409. package/lib/services/config.service.d.ts.map +1 -0
  410. package/lib/services/config.service.js +171 -0
  411. package/lib/services/config.service.js.map +1 -0
  412. package/lib/services/index.d.ts +8 -0
  413. package/lib/services/index.d.ts.map +1 -0
  414. package/lib/services/index.js +9 -0
  415. package/lib/services/index.js.map +1 -0
  416. package/lib/services/medialuna.service.d.ts +173 -0
  417. package/lib/services/medialuna.service.d.ts.map +1 -0
  418. package/lib/services/medialuna.service.js +455 -0
  419. package/lib/services/medialuna.service.js.map +1 -0
  420. package/lib/services/preset.service.d.ts +69 -0
  421. package/lib/services/preset.service.d.ts.map +1 -0
  422. package/lib/services/preset.service.js +202 -0
  423. package/lib/services/preset.service.js.map +1 -0
  424. package/lib/services/remote-preset.service.d.ts +97 -0
  425. package/lib/services/remote-preset.service.d.ts.map +1 -0
  426. package/lib/services/remote-preset.service.js +212 -0
  427. package/lib/services/remote-preset.service.js.map +1 -0
  428. package/lib/services/task.service.d.ts +57 -0
  429. package/lib/services/task.service.d.ts.map +1 -0
  430. package/lib/services/task.service.js +138 -0
  431. package/lib/services/task.service.js.map +1 -0
  432. package/lib/types/index.d.ts +357 -0
  433. package/lib/types/index.d.ts.map +1 -0
  434. package/lib/types/index.js +21 -0
  435. package/lib/types/index.js.map +1 -0
  436. package/package.json +66 -0
  437. package/readme.md +326 -0
@@ -0,0 +1,800 @@
1
+ <template>
2
+ <div class="view-container">
3
+ <div class="view-header">
4
+ <div class="header-left">
5
+ <k-button solid type="primary" @click="openCreateDialog">
6
+ <template #icon><k-icon name="add"></k-icon></template>
7
+ 新建预设
8
+ </k-button>
9
+ <TagFilter
10
+ v-model="selectedTags"
11
+ :all-tags="allTags"
12
+ :preset-tags="presetTags"
13
+ />
14
+ </div>
15
+ <div class="header-right">
16
+ <ViewModeSwitch v-model="viewMode" />
17
+ </div>
18
+ </div>
19
+
20
+ <div class="view-content">
21
+ <div v-if="loading" class="loading-state">
22
+ <k-icon name="sync" class="loading-icon"></k-icon> 加载中...
23
+ </div>
24
+
25
+ <!-- 卡片视图 (瀑布流) -->
26
+ <div v-else-if="viewMode === 'card'" class="masonry-grid">
27
+ <div v-for="preset in filteredPresets" :key="preset.id" class="masonry-item">
28
+ <div class="preset-card" @click="openEditDialog(preset)">
29
+ <!-- 缩略图 -->
30
+ <div class="card-thumbnail" v-if="preset.thumbnail">
31
+ <img :src="preset.thumbnail" :alt="preset.name" loading="lazy" />
32
+ <div class="thumbnail-overlay">
33
+ <span class="ref-count" v-if="preset.referenceImages?.length">
34
+ <k-icon name="image"></k-icon> {{ preset.referenceImages.length }}
35
+ </span>
36
+ </div>
37
+ </div>
38
+ <div class="card-thumbnail placeholder" v-else>
39
+ <k-icon name="image" class="placeholder-icon"></k-icon>
40
+ </div>
41
+
42
+ <!-- 内容 -->
43
+ <div class="card-content">
44
+ <div class="card-title">{{ preset.name }}</div>
45
+ <div class="card-tags" v-if="preset.tags?.length">
46
+ <span v-for="tag in preset.tags.slice(0, 4)" :key="tag" class="mini-tag">
47
+ {{ tag }}
48
+ </span>
49
+ <span v-if="preset.tags.length > 4" class="mini-tag more">+{{ preset.tags.length - 4 }}</span>
50
+ </div>
51
+ </div>
52
+
53
+ <!-- 操作按钮 -->
54
+ <div class="card-actions" @click.stop>
55
+ <el-switch
56
+ v-model="preset.enabled"
57
+ size="small"
58
+ @change="toggleEnable(preset)"
59
+ />
60
+ <k-button size="mini" class="copy-btn" @click="copyPreset(preset)">
61
+ <template #icon><k-icon name="copy"></k-icon></template>
62
+ 复制
63
+ </k-button>
64
+ <k-button
65
+ v-if="preset.source === 'user'"
66
+ size="mini"
67
+ class="delete-btn"
68
+ @click="confirmDelete(preset)"
69
+ >
70
+ <template #icon><k-icon name="delete"></k-icon></template>
71
+ 删除
72
+ </k-button>
73
+ </div>
74
+
75
+ <!-- 来源标记 -->
76
+ <div class="source-indicator" :class="preset.source">
77
+ {{ preset.source === 'api' ? '远程' : '本地' }}
78
+ </div>
79
+ </div>
80
+ </div>
81
+ </div>
82
+
83
+ <!-- 列表视图 -->
84
+ <div v-else class="list-view">
85
+ <table class="preset-table">
86
+ <thead>
87
+ <tr>
88
+ <th class="col-thumb">缩略图</th>
89
+ <th class="col-name">名称</th>
90
+ <th class="col-template">Prompt 模板</th>
91
+ <th class="col-refs">参考图</th>
92
+ <th class="col-source">来源</th>
93
+ <th class="col-status">状态</th>
94
+ <th class="col-actions">操作</th>
95
+ </tr>
96
+ </thead>
97
+ <tbody>
98
+ <tr
99
+ v-for="preset in filteredPresets"
100
+ :key="preset.id"
101
+ class="preset-row"
102
+ @click="openEditDialog(preset)"
103
+ >
104
+ <td class="col-thumb">
105
+ <div class="thumb-wrapper">
106
+ <img v-if="preset.thumbnail" :src="preset.thumbnail" :alt="preset.name" />
107
+ <div v-else class="thumb-placeholder">
108
+ <k-icon name="image"></k-icon>
109
+ </div>
110
+ </div>
111
+ </td>
112
+ <td class="col-name">
113
+ <span class="name-text">{{ preset.name }}</span>
114
+ </td>
115
+ <td class="col-template">
116
+ <span class="template-preview">{{ truncateTemplate(preset.promptTemplate) }}</span>
117
+ </td>
118
+ <td class="col-refs">
119
+ <span v-if="preset.referenceImages?.length" class="ref-badge">
120
+ <k-icon name="image"></k-icon>
121
+ {{ preset.referenceImages.length }}
122
+ </span>
123
+ <span v-else class="no-data">-</span>
124
+ </td>
125
+ <td class="col-source">
126
+ <span class="source-badge" :class="preset.source">
127
+ {{ preset.source === 'api' ? '远程' : '本地' }}
128
+ </span>
129
+ </td>
130
+ <td class="col-status" @click.stop>
131
+ <el-switch v-model="preset.enabled" size="small" @change="toggleEnable(preset)" />
132
+ </td>
133
+ <td class="col-actions" @click.stop>
134
+ <div class="action-btns">
135
+ <k-button size="mini" class="copy-btn" @click="copyPreset(preset)">
136
+ <template #icon><k-icon name="copy"></k-icon></template>
137
+ 复制
138
+ </k-button>
139
+ <k-button
140
+ v-if="preset.source === 'user'"
141
+ size="mini"
142
+ class="delete-btn"
143
+ @click="confirmDelete(preset)"
144
+ >
145
+ <template #icon><k-icon name="delete"></k-icon></template>
146
+ 删除
147
+ </k-button>
148
+ </div>
149
+ </td>
150
+ </tr>
151
+ </tbody>
152
+ </table>
153
+ </div>
154
+ </div>
155
+
156
+ <!-- 编辑/创建对话框 -->
157
+ <el-dialog
158
+ v-model="dialogVisible"
159
+ :title="isEdit ? '编辑预设' : '创建预设'"
160
+ width="600px"
161
+ :close-on-click-modal="false"
162
+ >
163
+ <el-form ref="formRef" :model="form" label-width="100px" v-if="dialogVisible">
164
+ <el-form-item label="名称" required>
165
+ <el-input v-model="form.name" :disabled="isEdit && form.source === 'api'" placeholder="如 二次元少女"></el-input>
166
+ <div class="form-tip">用于指令调用和展示,冲突时会自动添加后缀</div>
167
+ </el-form-item>
168
+
169
+ <el-form-item label="Prompt 模板" required>
170
+ <el-input
171
+ v-model="form.promptTemplate"
172
+ type="textarea"
173
+ :rows="4"
174
+ placeholder="输入提示词模板,支持变量如 {prompt}"
175
+ ></el-input>
176
+ <div class="form-tip">默认将用户输入附加在最后,也可使用 {prompt} 指定位置</div>
177
+ </el-form-item>
178
+
179
+ <el-form-item label="缩略图" v-if="form.source === 'user'">
180
+ <ImageUpload v-model="thumbnailImages" :max-count="1" />
181
+ <div class="form-tip">用于在卡片视图中展示预设的预览图</div>
182
+ </el-form-item>
183
+
184
+ <el-form-item label="参考图">
185
+ <ImageUpload v-model="form.referenceImages!" :max-count="5" />
186
+ <div class="form-tip">生成时会自动附加这些参考图片</div>
187
+ </el-form-item>
188
+
189
+ <el-divider content-position="left">高级设置</el-divider>
190
+
191
+ <el-form-item label="标签">
192
+ <TagInput v-model="form.tags!" placeholder="输入标签..." />
193
+ <div class="form-tip">与渠道标签匹配时会自动关联</div>
194
+ </el-form-item>
195
+
196
+ <el-form-item label="参数覆盖">
197
+ <JsonEditor v-model="form.parameterOverrides" :rows="3" />
198
+ </el-form-item>
199
+
200
+ <el-form-item label="启用状态">
201
+ <el-switch v-model="form.enabled"></el-switch>
202
+ </el-form-item>
203
+ </el-form>
204
+
205
+ <template #footer>
206
+ <span class="dialog-footer">
207
+ <k-button @click="dialogVisible = false">取消</k-button>
208
+ <k-button type="primary" @click="submitForm">保存</k-button>
209
+ </span>
210
+ </template>
211
+ </el-dialog>
212
+ </div>
213
+ </template>
214
+
215
+ <script setup lang="ts">
216
+ import { ref, computed, onMounted, watch } from 'vue'
217
+ import { message } from '@koishijs/client'
218
+ import { PresetData } from '../types'
219
+ import { presetApi, cacheApi } from '../api'
220
+ import TagInput from './TagInput.vue'
221
+ import JsonEditor from './JsonEditor.vue'
222
+ import TagFilter from './TagFilter.vue'
223
+ import ViewModeSwitch, { type ViewMode } from './ViewModeSwitch.vue'
224
+ import ImageUpload from './ImageUpload.vue'
225
+
226
+ // 预置标签(包含来源虚拟标签)
227
+ const presetTags = ['本地', '远程', 'text2img', 'img2img', 'NSFW']
228
+
229
+ // 状态
230
+ const loading = ref(false)
231
+ const presets = ref<PresetData[]>([])
232
+ const dialogVisible = ref(false)
233
+ const isEdit = ref(false)
234
+ const selectedTags = ref<string[]>([])
235
+ const viewMode = ref<ViewMode>('card')
236
+
237
+ // 从所有预设中提取标签
238
+ const allTags = computed(() => {
239
+ const tagSet = new Set<string>()
240
+ presets.value.forEach(p => {
241
+ (p.tags || []).forEach(t => tagSet.add(t))
242
+ })
243
+ return Array.from(tagSet).sort()
244
+ })
245
+
246
+ // 表单数据
247
+ const form = ref<Partial<PresetData>>({
248
+ name: '',
249
+ promptTemplate: '',
250
+ referenceImages: [],
251
+ tags: [],
252
+ parameterOverrides: {},
253
+ enabled: true,
254
+ source: 'user'
255
+ })
256
+
257
+ // 缩略图作为数组处理(兼容 ImageUpload 组件)
258
+ const thumbnailImages = ref<string[]>([])
259
+
260
+ // 监听表单变化,同步缩略图
261
+ watch(() => form.value.thumbnail, (newVal) => {
262
+ thumbnailImages.value = newVal ? [newVal] : []
263
+ }, { immediate: true })
264
+
265
+ // 监听缩略图数组变化,同步到表单
266
+ watch(thumbnailImages, (newVal) => {
267
+ form.value.thumbnail = newVal.length > 0 ? newVal[0] : ''
268
+ })
269
+
270
+ // 计算属性
271
+ const filteredPresets = computed(() => {
272
+ if (selectedTags.value.length === 0) return presets.value
273
+
274
+ return presets.value.filter(p => {
275
+ return selectedTags.value.every(tag => {
276
+ // 虚拟标签:本地/远程
277
+ if (tag === '本地') return p.source === 'user'
278
+ if (tag === '远程') return p.source === 'api'
279
+ // 普通标签匹配
280
+ return (p.tags || []).includes(tag)
281
+ })
282
+ })
283
+ })
284
+
285
+ // 方法
286
+ const fetchData = async () => {
287
+ loading.value = true
288
+ try {
289
+ presets.value = await presetApi.list()
290
+ } catch (e) {
291
+ message.error('加载数据失败')
292
+ } finally {
293
+ loading.value = false
294
+ }
295
+ }
296
+
297
+ const openCreateDialog = () => {
298
+ isEdit.value = false
299
+ form.value = {
300
+ name: '',
301
+ promptTemplate: '',
302
+ referenceImages: [],
303
+ tags: [],
304
+ parameterOverrides: {},
305
+ enabled: true,
306
+ source: 'user'
307
+ }
308
+ dialogVisible.value = true
309
+ }
310
+
311
+ const openEditDialog = (preset: PresetData) => {
312
+ isEdit.value = true
313
+ form.value = JSON.parse(JSON.stringify(preset))
314
+ dialogVisible.value = true
315
+ }
316
+
317
+ // 复制预设 - 打开新建对话框并填充已有配置
318
+ const copyPreset = (preset: PresetData) => {
319
+ isEdit.value = false
320
+ // 复制配置但不复制 id,并重命名,标记为用户创建
321
+ const copied = JSON.parse(JSON.stringify(preset))
322
+ delete copied.id
323
+ copied.name = `${preset.name} (副本)`
324
+ copied.source = 'user' // 复制的预设归为用户预设
325
+ form.value = copied
326
+ dialogVisible.value = true
327
+ }
328
+
329
+ const toggleEnable = async (preset: PresetData) => {
330
+ try {
331
+ await presetApi.toggle(preset.id, preset.enabled)
332
+ } catch (e) {
333
+ preset.enabled = !preset.enabled
334
+ message.error('操作失败')
335
+ }
336
+ }
337
+
338
+ // 截断模板文本用于列表显示
339
+ const truncateTemplate = (template: string, maxLen = 50): string => {
340
+ if (!template) return '-'
341
+ const cleaned = template.replace(/\s+/g, ' ').trim()
342
+ if (cleaned.length <= maxLen) return cleaned
343
+ return cleaned.slice(0, maxLen) + '...'
344
+ }
345
+
346
+ const submitForm = async () => {
347
+ if (!form.value.name || !form.value.promptTemplate) {
348
+ message.warning('请填写必要信息')
349
+ return
350
+ }
351
+
352
+ try {
353
+ if (isEdit.value && form.value.id) {
354
+ await presetApi.update(form.value.id, form.value)
355
+ message.success('更新成功')
356
+ } else {
357
+ await presetApi.create(form.value as any)
358
+ message.success('创建成功')
359
+ }
360
+ dialogVisible.value = false
361
+ fetchData()
362
+ } catch (e) {
363
+ message.error('操作失败')
364
+ }
365
+ }
366
+
367
+ const confirmDelete = async (preset: PresetData) => {
368
+ if (!confirm(`确定要删除预设 "${preset.name}" 吗?`)) return
369
+ try {
370
+ await presetApi.delete(preset.id)
371
+ message.success('删除成功')
372
+ fetchData()
373
+ } catch (e) {
374
+ message.error('删除失败')
375
+ }
376
+ }
377
+
378
+ onMounted(() => {
379
+ fetchData()
380
+ })
381
+ </script>
382
+
383
+ <style scoped>
384
+ .view-container {
385
+ height: 100%;
386
+ display: flex;
387
+ flex-direction: column;
388
+ min-height: 0;
389
+ }
390
+
391
+ .view-header {
392
+ flex-shrink: 0;
393
+ display: flex;
394
+ justify-content: space-between;
395
+ align-items: center;
396
+ margin-bottom: 1rem;
397
+ flex-wrap: wrap;
398
+ gap: 1rem;
399
+ }
400
+
401
+ .header-left {
402
+ display: flex;
403
+ align-items: center;
404
+ gap: 1rem;
405
+ flex-wrap: wrap;
406
+ }
407
+
408
+ .header-right {
409
+ display: flex;
410
+ align-items: center;
411
+ gap: 1rem;
412
+ }
413
+
414
+ /* 内容区域 */
415
+ .view-content {
416
+ flex: 1 1 0;
417
+ min-height: 0;
418
+ overflow-y: auto;
419
+ overflow-x: hidden;
420
+ padding: 0.5rem 0;
421
+ }
422
+
423
+ /* 瀑布流布局 */
424
+ .masonry-grid {
425
+ columns: 5;
426
+ column-gap: 1rem;
427
+ }
428
+
429
+ @media (max-width: 1400px) {
430
+ .masonry-grid { columns: 4; }
431
+ }
432
+ @media (max-width: 1100px) {
433
+ .masonry-grid { columns: 3; }
434
+ }
435
+ @media (max-width: 800px) {
436
+ .masonry-grid { columns: 2; }
437
+ }
438
+ @media (max-width: 500px) {
439
+ .masonry-grid { columns: 1; }
440
+ }
441
+
442
+ .masonry-item {
443
+ break-inside: avoid;
444
+ margin-bottom: 1rem;
445
+ }
446
+
447
+ .preset-card {
448
+ background-color: var(--k-color-bg-1);
449
+ border: 1px solid var(--k-color-border);
450
+ border-radius: 8px;
451
+ overflow: hidden;
452
+ cursor: pointer;
453
+ transition: all 0.2s ease;
454
+ position: relative;
455
+ }
456
+
457
+ .preset-card:hover {
458
+ border-color: var(--k-color-active);
459
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
460
+ }
461
+
462
+ .card-thumbnail {
463
+ width: 100%;
464
+ aspect-ratio: auto;
465
+ position: relative;
466
+ overflow: hidden;
467
+ background-color: var(--k-color-bg-2);
468
+ }
469
+
470
+ .card-thumbnail img {
471
+ width: 100%;
472
+ height: auto;
473
+ display: block;
474
+ object-fit: cover;
475
+ }
476
+
477
+ .card-thumbnail.placeholder {
478
+ aspect-ratio: 4/3;
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: center;
482
+ }
483
+
484
+ .placeholder-icon {
485
+ font-size: 2rem;
486
+ color: var(--k-color-text-description);
487
+ opacity: 0.5;
488
+ }
489
+
490
+ .thumbnail-overlay {
491
+ position: absolute;
492
+ bottom: 0;
493
+ left: 0;
494
+ right: 0;
495
+ padding: 0.5rem;
496
+ background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
497
+ display: flex;
498
+ justify-content: flex-end;
499
+ }
500
+
501
+ .ref-count {
502
+ display: flex;
503
+ align-items: center;
504
+ gap: 4px;
505
+ font-size: 0.75rem;
506
+ color: white;
507
+ background-color: rgba(0, 0, 0, 0.5);
508
+ padding: 2px 6px;
509
+ border-radius: 4px;
510
+ }
511
+
512
+ .card-content {
513
+ padding: 0.75rem;
514
+ }
515
+
516
+ .card-title {
517
+ font-size: 0.9rem;
518
+ font-weight: 600;
519
+ color: var(--k-color-text);
520
+ margin-bottom: 0.5rem;
521
+ overflow: hidden;
522
+ text-overflow: ellipsis;
523
+ white-space: nowrap;
524
+ }
525
+
526
+ .card-tags {
527
+ display: flex;
528
+ flex-wrap: wrap;
529
+ gap: 4px;
530
+ }
531
+
532
+ .mini-tag {
533
+ font-size: 0.7rem;
534
+ padding: 2px 6px;
535
+ background-color: var(--k-color-bg-2);
536
+ color: var(--k-color-text-description);
537
+ border-radius: 4px;
538
+ }
539
+
540
+ .mini-tag.more {
541
+ background-color: var(--k-color-active);
542
+ color: white;
543
+ }
544
+
545
+ .card-actions {
546
+ display: flex;
547
+ align-items: center;
548
+ gap: 0.5rem;
549
+ padding: 0.5rem 0.75rem;
550
+ border-top: 1px solid var(--k-color-border);
551
+ background-color: var(--k-color-bg-2);
552
+ }
553
+
554
+ .source-indicator {
555
+ position: absolute;
556
+ top: 0.5rem;
557
+ left: 0.5rem;
558
+ font-size: 0.65rem;
559
+ padding: 2px 6px;
560
+ border-radius: 4px;
561
+ font-weight: 600;
562
+ }
563
+
564
+ .source-indicator.api {
565
+ background-color: var(--k-color-active);
566
+ color: white;
567
+ }
568
+
569
+ .source-indicator.user {
570
+ background-color: var(--k-color-warning, #e6a23c);
571
+ color: white;
572
+ }
573
+
574
+ /* 列表视图 - 表格样式 */
575
+ .list-view {
576
+ background-color: var(--k-card-bg);
577
+ border: 1px solid var(--k-color-border);
578
+ border-radius: 8px;
579
+ overflow: hidden;
580
+ }
581
+
582
+ .preset-table {
583
+ width: 100%;
584
+ border-collapse: collapse;
585
+ table-layout: fixed;
586
+ }
587
+
588
+ .preset-table thead {
589
+ background-color: var(--k-color-bg-2);
590
+ }
591
+
592
+ .preset-table th {
593
+ padding: 0.875rem 1rem;
594
+ font-size: 0.8rem;
595
+ font-weight: 600;
596
+ color: var(--k-color-text-description);
597
+ text-align: left;
598
+ border-bottom: 1px solid var(--k-color-border);
599
+ white-space: nowrap;
600
+ overflow: hidden;
601
+ text-overflow: ellipsis;
602
+ }
603
+
604
+ .preset-table .preset-row {
605
+ cursor: pointer;
606
+ transition: background-color 0.15s ease;
607
+ }
608
+
609
+ .preset-table .preset-row:hover {
610
+ background-color: var(--k-color-bg-1);
611
+ }
612
+
613
+ .preset-table .preset-row td {
614
+ padding: 0.75rem 1rem;
615
+ border-bottom: 1px solid var(--k-color-border);
616
+ vertical-align: middle;
617
+ text-align: left;
618
+ overflow: hidden;
619
+ text-overflow: ellipsis;
620
+ white-space: nowrap;
621
+ }
622
+
623
+ .preset-table .preset-row:last-child td {
624
+ border-bottom: none;
625
+ }
626
+
627
+ /* 表格列宽定义 */
628
+ .preset-table .col-thumb {
629
+ width: 60px;
630
+ }
631
+
632
+ .preset-table .col-name {
633
+ width: 15%;
634
+ }
635
+
636
+ .preset-table .col-template {
637
+ width: auto;
638
+ }
639
+
640
+ .preset-table .col-refs {
641
+ width: 10%;
642
+ text-align: center !important;
643
+ }
644
+
645
+ .preset-table th.col-refs {
646
+ text-align: center !important;
647
+ }
648
+
649
+ .preset-table .col-source {
650
+ width: 10%;
651
+ }
652
+
653
+ .preset-table .col-status {
654
+ width: 8%;
655
+ }
656
+
657
+ .preset-table .col-actions {
658
+ width: 15%;
659
+ }
660
+
661
+ .thumb-wrapper {
662
+ width: 40px;
663
+ height: 40px;
664
+ border-radius: 6px;
665
+ overflow: hidden;
666
+ background-color: var(--k-color-bg-2);
667
+ }
668
+
669
+ .thumb-wrapper img {
670
+ width: 100%;
671
+ height: 100%;
672
+ object-fit: cover;
673
+ }
674
+
675
+ .preset-table .name-text {
676
+ font-weight: 600;
677
+ color: var(--k-color-text);
678
+ display: block;
679
+ overflow: hidden;
680
+ text-overflow: ellipsis;
681
+ white-space: nowrap;
682
+ }
683
+
684
+ .template-preview {
685
+ font-size: 0.85rem;
686
+ color: var(--k-color-text-description);
687
+ display: block;
688
+ overflow: hidden;
689
+ text-overflow: ellipsis;
690
+ white-space: nowrap;
691
+ max-width: 300px;
692
+ }
693
+
694
+ .action-btns {
695
+ display: flex;
696
+ gap: 0.5rem;
697
+ }
698
+
699
+ /* 加载状态 */
700
+ .loading-state {
701
+ display: flex;
702
+ align-items: center;
703
+ justify-content: center;
704
+ padding: 4rem;
705
+ color: var(--k-color-text-description);
706
+ gap: 0.5rem;
707
+ }
708
+
709
+ .loading-icon {
710
+ animation: spin 1s linear infinite;
711
+ }
712
+
713
+ @keyframes spin {
714
+ from { transform: rotate(0deg); }
715
+ to { transform: rotate(360deg); }
716
+ }
717
+
718
+ /* 表单样式 */
719
+ .form-tip {
720
+ font-size: 0.8rem;
721
+ color: var(--k-color-text-description);
722
+ margin-top: 0.25rem;
723
+ }
724
+
725
+ .ref-image-input {
726
+ margin-bottom: 8px;
727
+ }
728
+
729
+ /* 复制按钮样式 */
730
+ .copy-btn {
731
+ color: var(--k-color-active) !important;
732
+ border-color: var(--k-color-active) !important;
733
+ }
734
+
735
+ .copy-btn:hover {
736
+ background-color: var(--k-color-active) !important;
737
+ color: white !important;
738
+ }
739
+
740
+ /* 删除按钮样式 */
741
+ .delete-btn {
742
+ color: var(--k-color-error, #f56c6c) !important;
743
+ border-color: var(--k-color-error, #f56c6c) !important;
744
+ }
745
+
746
+ .delete-btn:hover {
747
+ background-color: var(--k-color-error, #f56c6c) !important;
748
+ color: white !important;
749
+ }
750
+
751
+ /* 表格内元素样式 */
752
+ .thumb-placeholder {
753
+ width: 44px;
754
+ height: 44px;
755
+ display: flex;
756
+ align-items: center;
757
+ justify-content: center;
758
+ background-color: var(--k-color-bg-2);
759
+ border-radius: 4px;
760
+ color: var(--k-color-text-description);
761
+ }
762
+
763
+ .name-text {
764
+ font-weight: 500;
765
+ color: var(--k-color-text);
766
+ }
767
+
768
+ .source-badge {
769
+ display: inline-block;
770
+ font-size: 0.75rem;
771
+ padding: 2px 8px;
772
+ border-radius: 4px;
773
+ }
774
+
775
+ .source-badge.api {
776
+ background-color: var(--k-color-active);
777
+ color: white;
778
+ }
779
+
780
+ .source-badge.user {
781
+ background-color: var(--k-color-warning, #e6a23c);
782
+ color: white;
783
+ }
784
+
785
+ .no-data {
786
+ color: var(--k-color-text-description);
787
+ opacity: 0.5;
788
+ }
789
+
790
+ .ref-badge {
791
+ display: inline-flex;
792
+ align-items: center;
793
+ gap: 4px;
794
+ font-size: 0.8rem;
795
+ color: var(--k-color-text-description);
796
+ background-color: var(--k-color-bg-2);
797
+ padding: 2px 8px;
798
+ border-radius: 4px;
799
+ }
800
+ </style>