@yinuo-ngm/server 1.0.15 → 1.0.16
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.
- package/lib/plugins/error-handler.plugin.js +5 -0
- package/lib/routes/api-client/hub-token.routes.js +22 -0
- package/lib/routes/index.js +2 -0
- package/lib/routes/node-version.routes.d.ts +2 -0
- package/lib/routes/node-version.routes.js +56 -0
- package/lib/routes/project.routes.js +5 -0
- package/lib/routes/sprite-browse.routes.js +19 -5
- package/lib/routes/sprite.routes.js +17 -11
- package/lib/routes/static-files.routes.js +16 -0
- package/lib/routes/task.routes.js +7 -0
- package/package.json +3 -3
- package/www/3rdpartylicenses.txt +14 -66
- package/www/browser/chunk-2BZRE4G7.js +1 -0
- package/www/browser/chunk-2X3MRS27.js +1 -0
- package/www/browser/chunk-4KETC6EB.js +1 -0
- package/www/browser/chunk-5T5KA5PG.js +1 -0
- package/www/browser/chunk-6CGHNKJI.js +1 -0
- package/www/browser/chunk-76TVIB33.js +63 -0
- package/www/browser/chunk-7J24TP36.js +1 -0
- package/www/browser/chunk-ACAZUX6C.js +1 -0
- package/www/browser/chunk-B6MBYCXI.js +1 -0
- package/www/browser/chunk-BYEU6KGP.js +2 -0
- package/www/browser/chunk-CZ5AZ3VW.js +1 -0
- package/www/browser/chunk-DW7F5PEA.js +1 -0
- package/www/browser/chunk-DXF7BVK5.js +1 -0
- package/www/browser/chunk-EEVPZGEY.js +1 -0
- package/www/browser/chunk-G2W3B7TJ.js +1 -0
- package/www/browser/chunk-GDWS2L66.js +1 -0
- package/www/browser/chunk-HFZLJHYR.js +1 -0
- package/www/browser/chunk-HGONFYP6.js +1 -0
- package/www/browser/chunk-HHBPULJW.js +2 -0
- package/www/browser/chunk-HRXCR3IN.js +1 -0
- package/www/browser/chunk-INL2PELS.js +1 -0
- package/www/browser/chunk-JHMEKUZ5.js +1 -0
- package/www/browser/chunk-JU3TEDBV.js +37 -0
- package/www/browser/chunk-JZULA5JV.js +1 -0
- package/www/browser/chunk-KVFR7GFV.js +20 -0
- package/www/browser/chunk-L5D75AMV.js +1 -0
- package/www/browser/chunk-L7TMCSHV.js +1 -0
- package/www/browser/chunk-LQ5OXSW7.js +3 -0
- package/www/browser/chunk-MVQTKINJ.js +1 -0
- package/www/browser/chunk-N4LRZJBP.js +1 -0
- package/www/browser/chunk-O2EYEF7J.js +1 -0
- package/www/browser/chunk-OMDHJIUB.js +1 -0
- package/www/browser/chunk-OWUAAOHW.js +2 -0
- package/www/browser/chunk-PIK5YPIB.js +1 -0
- package/www/browser/chunk-RHLQRQDK.js +9 -0
- package/www/browser/chunk-RW2JPJV7.js +1 -0
- package/www/browser/chunk-S3SJ4VVM.js +11 -0
- package/www/browser/chunk-SIVPP74B.js +0 -0
- package/www/browser/chunk-SPRWNZHF.js +15 -0
- package/www/browser/chunk-SQQNR223.js +1 -0
- package/www/browser/chunk-SVQWPHF5.js +1 -0
- package/www/browser/chunk-SYCNSLAW.js +4 -0
- package/www/browser/chunk-T3KK7ZXB.js +2 -0
- package/www/browser/chunk-TMX5TTV3.js +1 -0
- package/www/browser/chunk-UFY3FLDK.js +1 -0
- package/www/browser/chunk-UJOHBN2Y.js +1 -0
- package/www/browser/chunk-UQGCUFNM.js +1 -0
- package/www/browser/chunk-UXXWRMM6.js +1 -0
- package/www/browser/chunk-UZRJGJTD.js +2 -0
- package/www/browser/chunk-WD4IAQR3.js +1 -0
- package/www/browser/chunk-WF2QTF5L.js +1 -0
- package/www/browser/chunk-WI67LAOV.js +4 -0
- package/www/browser/chunk-WNCM6QKB.js +1 -0
- package/www/browser/chunk-XJ5KZQNN.js +1 -0
- package/www/browser/chunk-YETDFSQE.js +1 -0
- package/www/browser/chunk-YMTC5GZK.js +1 -0
- package/www/browser/chunk-YVZHJ76K.js +1 -0
- package/www/browser/chunk-ZNTJRLVH.js +1 -0
- package/www/browser/dark.css +1 -30433
- package/www/browser/default.css +1 -30149
- package/www/browser/index.html +3 -3
- package/www/browser/main-6LN5C22E.js +34 -0
- package/www/browser/scripts-U25HCVEI.js +6 -0
- package/www/browser/styles-ROAHD7MY.css +1 -0
- package/www/browser/add-widget-drawer.component.css.map +0 -7
- package/www/browser/advanced-editor.component.css.map +0 -7
- package/www/browser/api-client.component.css.map +0 -7
- package/www/browser/api-history-drawer.component.css.map +0 -7
- package/www/browser/app.css.map +0 -7
- package/www/browser/attachment-viewer.component.css.map +0 -7
- package/www/browser/auth-editor.component.css.map +0 -7
- package/www/browser/body-editor.component.css.map +0 -7
- package/www/browser/chunk-2YSUXBGC.js +0 -627
- package/www/browser/chunk-2YSUXBGC.js.map +0 -1
- package/www/browser/chunk-3G2GEOPV.js +0 -456
- package/www/browser/chunk-3G2GEOPV.js.map +0 -1
- package/www/browser/chunk-3L72DF3R.js +0 -1683
- package/www/browser/chunk-3L72DF3R.js.map +0 -1
- package/www/browser/chunk-3MCIETCQ.js +0 -8279
- package/www/browser/chunk-3MCIETCQ.js.map +0 -1
- package/www/browser/chunk-665WC4RU.js +0 -5383
- package/www/browser/chunk-665WC4RU.js.map +0 -1
- package/www/browser/chunk-6QMSEZPT.js +0 -10044
- package/www/browser/chunk-6QMSEZPT.js.map +0 -1
- package/www/browser/chunk-6TBQERYX.js +0 -280
- package/www/browser/chunk-6TBQERYX.js.map +0 -1
- package/www/browser/chunk-6UW4MRJZ.js +0 -43
- package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
- package/www/browser/chunk-6XUMIL3W.js +0 -5495
- package/www/browser/chunk-6XUMIL3W.js.map +0 -1
- package/www/browser/chunk-724YOJI3.js +0 -903
- package/www/browser/chunk-724YOJI3.js.map +0 -1
- package/www/browser/chunk-766T7YES.js +0 -437
- package/www/browser/chunk-766T7YES.js.map +0 -1
- package/www/browser/chunk-7FC7DN65.js +0 -728
- package/www/browser/chunk-7FC7DN65.js.map +0 -1
- package/www/browser/chunk-APGQRYWX.js +0 -156
- package/www/browser/chunk-APGQRYWX.js.map +0 -7
- package/www/browser/chunk-AQHSGTHS.js +0 -1960
- package/www/browser/chunk-AQHSGTHS.js.map +0 -1
- package/www/browser/chunk-CTOEAJQK.js +0 -40
- package/www/browser/chunk-CTOEAJQK.js.map +0 -7
- package/www/browser/chunk-DEGQJKKZ.js +0 -409
- package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
- package/www/browser/chunk-DIJX2663.js +0 -1166
- package/www/browser/chunk-DIJX2663.js.map +0 -1
- package/www/browser/chunk-E4XD4GLT.js +0 -427
- package/www/browser/chunk-E4XD4GLT.js.map +0 -1
- package/www/browser/chunk-EQOY6A3M.js +0 -212
- package/www/browser/chunk-EQOY6A3M.js.map +0 -1
- package/www/browser/chunk-ETTBRXVA.js +0 -2643
- package/www/browser/chunk-ETTBRXVA.js.map +0 -1
- package/www/browser/chunk-FLSUSPBD.js +0 -5569
- package/www/browser/chunk-FLSUSPBD.js.map +0 -1
- package/www/browser/chunk-FZNHBEAZ.js +0 -102
- package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
- package/www/browser/chunk-GJC7CZIJ.js +0 -361
- package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
- package/www/browser/chunk-GMCNMOTD.js +0 -844
- package/www/browser/chunk-GMCNMOTD.js.map +0 -7
- package/www/browser/chunk-H43HGCRW.js +0 -198
- package/www/browser/chunk-H43HGCRW.js.map +0 -7
- package/www/browser/chunk-J447GBHM.js +0 -160
- package/www/browser/chunk-J447GBHM.js.map +0 -1
- package/www/browser/chunk-JN3VOWP7.js +0 -384
- package/www/browser/chunk-JN3VOWP7.js.map +0 -1
- package/www/browser/chunk-KSHAGY2M.js +0 -399
- package/www/browser/chunk-KSHAGY2M.js.map +0 -7
- package/www/browser/chunk-KV72AKOD.js +0 -59
- package/www/browser/chunk-KV72AKOD.js.map +0 -7
- package/www/browser/chunk-LAVMY2SJ.js +0 -26
- package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
- package/www/browser/chunk-LLRVGHG5.js +0 -73
- package/www/browser/chunk-LLRVGHG5.js.map +0 -7
- package/www/browser/chunk-LPME4AJ3.js +0 -196
- package/www/browser/chunk-LPME4AJ3.js.map +0 -1
- package/www/browser/chunk-LVPSURVU.js +0 -4615
- package/www/browser/chunk-LVPSURVU.js.map +0 -1
- package/www/browser/chunk-MMPO7QLO.js +0 -4146
- package/www/browser/chunk-MMPO7QLO.js.map +0 -7
- package/www/browser/chunk-O7LB6VFM.js +0 -1953
- package/www/browser/chunk-O7LB6VFM.js.map +0 -1
- package/www/browser/chunk-P5CWA4FO.js +0 -685
- package/www/browser/chunk-P5CWA4FO.js.map +0 -1
- package/www/browser/chunk-RBWIWNTL.js +0 -203
- package/www/browser/chunk-RBWIWNTL.js.map +0 -7
- package/www/browser/chunk-RUXJCM3V.js +0 -26199
- package/www/browser/chunk-RUXJCM3V.js.map +0 -1
- package/www/browser/chunk-S77VVYUZ.js +0 -168
- package/www/browser/chunk-S77VVYUZ.js.map +0 -1
- package/www/browser/chunk-SCXPYFOB.js +0 -4316
- package/www/browser/chunk-SCXPYFOB.js.map +0 -1
- package/www/browser/chunk-SS73S33S.js +0 -471
- package/www/browser/chunk-SS73S33S.js.map +0 -7
- package/www/browser/chunk-T6UAOWNP.js +0 -600
- package/www/browser/chunk-T6UAOWNP.js.map +0 -1
- package/www/browser/chunk-TEW4MY4J.js +0 -148
- package/www/browser/chunk-TEW4MY4J.js.map +0 -7
- package/www/browser/chunk-TVORF3SF.js +0 -82
- package/www/browser/chunk-TVORF3SF.js.map +0 -7
- package/www/browser/chunk-UAN42EUZ.js +0 -2147
- package/www/browser/chunk-UAN42EUZ.js.map +0 -1
- package/www/browser/chunk-ULOHDK7Y.js +0 -1
- package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
- package/www/browser/chunk-UYJ3FVRV.js +0 -3978
- package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
- package/www/browser/chunk-VXHZMSDM.js +0 -5509
- package/www/browser/chunk-VXHZMSDM.js.map +0 -1
- package/www/browser/chunk-VYNQPZQO.js +0 -281
- package/www/browser/chunk-VYNQPZQO.js.map +0 -1
- package/www/browser/chunk-W3J23PZI.js +0 -9213
- package/www/browser/chunk-W3J23PZI.js.map +0 -1
- package/www/browser/chunk-W5HGHCQT.js +0 -1642
- package/www/browser/chunk-W5HGHCQT.js.map +0 -7
- package/www/browser/chunk-XF5H7E4L.js +0 -4723
- package/www/browser/chunk-XF5H7E4L.js.map +0 -1
- package/www/browser/chunk-XNFNEBMY.js +0 -398
- package/www/browser/chunk-XNFNEBMY.js.map +0 -7
- package/www/browser/chunk-XQY5SPGI.js +0 -30811
- package/www/browser/chunk-XQY5SPGI.js.map +0 -1
- package/www/browser/chunk-Y7JBZHNK.js +0 -514
- package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
- package/www/browser/chunk-YWHRP4X3.js +0 -406
- package/www/browser/chunk-YWHRP4X3.js.map +0 -1
- package/www/browser/chunk-Z7FJIV62.js +0 -95
- package/www/browser/chunk-Z7FJIV62.js.map +0 -7
- package/www/browser/chunk-ZBZHXS46.js +0 -1674
- package/www/browser/chunk-ZBZHXS46.js.map +0 -1
- package/www/browser/chunk-ZZA5NVAI.js +0 -735
- package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
- package/www/browser/collection-modal.component.css.map +0 -7
- package/www/browser/collection-tree-item.component.css.map +0 -7
- package/www/browser/collection-tree.component.css.map +0 -7
- package/www/browser/config-change-bar-component.css.map +0 -7
- package/www/browser/config-item-component.css.map +0 -7
- package/www/browser/config-nav-component.css.map +0 -7
- package/www/browser/config-section-component.css.map +0 -7
- package/www/browser/create-summary-aside.component.css.map +0 -7
- package/www/browser/curl-actions.component.css.map +0 -7
- package/www/browser/dark.css.map +0 -7
- package/www/browser/dashboard-canvas.component.css.map +0 -7
- package/www/browser/dashboard.component.css.map +0 -7
- package/www/browser/default.css.map +0 -7
- package/www/browser/detail-item-card.component.css.map +0 -7
- package/www/browser/ellipsis-text.component.css.map +0 -7
- package/www/browser/env-modal.component.css.map +0 -7
- package/www/browser/env-picker.component.css.map +0 -7
- package/www/browser/feedback.component.css.map +0 -7
- package/www/browser/fs-explorer.component.css.map +0 -7
- package/www/browser/git-import-modal.component.css.map +0 -7
- package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
- package/www/browser/issue-action-area.component.css.map +0 -7
- package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
- package/www/browser/issue-assign-dialog.component.css.map +0 -7
- package/www/browser/issue-attachment-area.component.css.map +0 -7
- package/www/browser/issue-base-info-area.component.css.map +0 -7
- package/www/browser/issue-branches.component.css.map +0 -7
- package/www/browser/issue-close-dialog.component.css.map +0 -7
- package/www/browser/issue-collaborators-panel.component.css.map +0 -7
- package/www/browser/issue-comment-editor.component.css.map +0 -7
- package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
- package/www/browser/issue-description-area.component.css.map +0 -7
- package/www/browser/issue-detail.component.css.map +0 -7
- package/www/browser/issue-resolve-dialog.component.css.map +0 -7
- package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
- package/www/browser/issues-list-table.component.css.map +0 -7
- package/www/browser/issues.component.css.map +0 -7
- package/www/browser/kill-port-widget.component.css.map +0 -7
- package/www/browser/kv-table.component.css.map +0 -7
- package/www/browser/layout-footer.component.css.map +0 -7
- package/www/browser/layout-header.component.css.map +0 -7
- package/www/browser/layout-menu.component.css.map +0 -7
- package/www/browser/layout-project-nav.component.css.map +0 -7
- package/www/browser/layout-sidebar.component.css.map +0 -7
- package/www/browser/layout.component.css.map +0 -7
- package/www/browser/less-viewport-component.css.map +0 -7
- package/www/browser/main.js +0 -1872
- package/www/browser/main.js.map +0 -1
- package/www/browser/markdown-viewer.component.css.map +0 -7
- package/www/browser/news-feed-widget.component.css.map +0 -7
- package/www/browser/ng-devtool.component.css.map +0 -7
- package/www/browser/nginx-config-editor.component.css.map +0 -7
- package/www/browser/nginx-log-viewer.component.css.map +0 -7
- package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
- package/www/browser/nginx-section-card.component.css.map +0 -7
- package/www/browser/nginx-server-drawer.component.css.map +0 -7
- package/www/browser/nginx-server-list.component.css.map +0 -7
- package/www/browser/nginx-stat-card.component.css.map +0 -7
- package/www/browser/nginx.component.css.map +0 -7
- package/www/browser/page-layout.component.css.map +0 -7
- package/www/browser/pick-workspace-modal.component.css.map +0 -7
- package/www/browser/polyfills.js +0 -26584
- package/www/browser/polyfills.js.map +0 -7
- package/www/browser/project-conf.component.css.map +0 -7
- package/www/browser/project-create-modal.component.css.map +0 -7
- package/www/browser/project-create.component.css.map +0 -7
- package/www/browser/project-deps.component.css.map +0 -7
- package/www/browser/project-edit-modal.component.css.map +0 -7
- package/www/browser/project-import.component.css.map +0 -7
- package/www/browser/project-item-popover.component.css.map +0 -7
- package/www/browser/project-item.component.css.map +0 -7
- package/www/browser/project-list.component.css.map +0 -7
- package/www/browser/projects.component.css.map +0 -7
- package/www/browser/quick-task-widget.component.css.map +0 -7
- package/www/browser/rd-action-area.component.css.map +0 -7
- package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
- package/www/browser/rd-block-dialog.component.css.map +0 -7
- package/www/browser/rd-create-dialog.component.css.map +0 -7
- package/www/browser/rd-detail.component.css.map +0 -7
- package/www/browser/rd-item-card.component.css.map +0 -7
- package/www/browser/rd-list-board.component.css.map +0 -7
- package/www/browser/rd-list-table.component.css.map +0 -7
- package/www/browser/rd.component.css.map +0 -7
- package/www/browser/request-collections.component.css.map +0 -7
- package/www/browser/request-editor.component.css.map +0 -7
- package/www/browser/request-list-item.component.css.map +0 -7
- package/www/browser/request-list.component.css.map +0 -7
- package/www/browser/request-tabs-bar.component.css.map +0 -7
- package/www/browser/request-tabs.component.css.map +0 -7
- package/www/browser/request-urlbar.component.css.map +0 -7
- package/www/browser/response-viewer.component.css.map +0 -7
- package/www/browser/scripts.js +0 -245
- package/www/browser/scripts.js.map +0 -7
- package/www/browser/setting.component.css.map +0 -7
- package/www/browser/sprite-conf-modal.component.css.map +0 -7
- package/www/browser/sprite-icons-panel-component.css.map +0 -7
- package/www/browser/sprite-images-panel-component.css.map +0 -7
- package/www/browser/sprite-result-tabs.component.css.map +0 -7
- package/www/browser/sprite-viewport-component.css.map +0 -7
- package/www/browser/sprite.component.css.map +0 -7
- package/www/browser/step-advance.component.css.map +0 -7
- package/www/browser/step-basic.component.css.map +0 -7
- package/www/browser/step-config.component.css.map +0 -7
- package/www/browser/step-features.component.css.map +0 -7
- package/www/browser/step-preset.component.css.map +0 -7
- package/www/browser/step-summary-aside.component.css.map +0 -7
- package/www/browser/styles.css +0 -258
- package/www/browser/styles.css.map +0 -7
- package/www/browser/system-log.component.css.map +0 -7
- package/www/browser/task-actions.component.css.map +0 -7
- package/www/browser/task-console.component.css.map +0 -7
- package/www/browser/task-header.component.css.map +0 -7
- package/www/browser/task-list.component.css.map +0 -7
- package/www/browser/tasks.component.css.map +0 -7
- package/www/browser/terminal-view.component.css.map +0 -7
- package/www/browser/welcome-widget.component.css.map +0 -7
- package/www/browser/widget-base.component.css.map +0 -7
- package/www/browser/widget-host.component.css.map +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["node_modules/dayjs/dayjs.min.js","angular:jit:style:inline:src\\app\\pages\\sprite\\sprite.component.ts;CiAgICAucGFnZXsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICBnYXA6IDE2cHg7CiAgICAgIHBhZGRpbmc6MCAxNnB4OwogICAgfQogICAgLmNvbnRlbnQgewogICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgd2lkdGg6IDA7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KICAgIC5jb250ZW50LmVtcHR5IHsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICB9CiAgICAuYXNpZGUgewogICAgICB3aWR0aDogMDsKICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgcGFkZGluZzogMTZweDsKICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgZWFzZTsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDE1MCUpOwogICAgfQogICAgLmFzaWRlLm9wZW4gewogICAgICB3aWR0aDogNDAwcHg7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTsKICAgIH0KICAgIA==","src/app/pages/sprite/services/sprite-api.service.ts","src/app/pages/sprite/services/sprite-state.service.ts","src/app/pages/sprite/services/sprite-stream.service.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\sprite-conf-modal.component.ts;CiAgICAuY29udGVudCB7CiAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDM2MHB4OwogICAgICBnYXA6IDE2cHg7CiAgICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICB9CgogICAgLm1haW4gewogICAgICBtaW4taGVpZ2h0OiA0MjBweDsKICAgIH0KCiAgICAuYWN0aW9ucyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogOHB4OwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICBtYXJnaW4tdG9wOiAxOHB4OwogICAgfQoKICAgIC5hc2lkZSB7CiAgICAgIHBvc2l0aW9uOiBzdGlja3k7CiAgICAgIHRvcDogMTZweDsKICAgICAgaGVpZ2h0OiBmaXQtY29udGVudDsKICAgIH0KICAgIA==","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\step-basic.component.ts;CiAgICAuaGludCB7IG1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAuNzsgfQogICAgLmVtaXQgeyBtYXJnaW4tdG9wOiA4cHg7IH0KICA=","src/app/pages/sprite/components/step-basic.component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\step-advance.component.ts;CiAgICAuaGludCB7IG1hcmdpbi10b3A6IDZweDsgZm9udC1zaXplOiAxMnB4OyBvcGFjaXR5OiAuNzsgfQogICAgLmVtaXQgeyBtYXJnaW4tdG9wOiA4cHg7IH0KICA=","src/app/pages/sprite/components/step-advance.component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\step-summary-aside.component.ts;CiAgICAuaXRlbSB7IGRpc3BsYXk6ZmxleDsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGdhcDogMTBweDsgcGFkZGluZzogNnB4IDA7YWxpZ24taXRlbXM6IGNlbnRlcjsgfQogICAgLmsgeyBvcGFjaXR5OiAuNzsgd2lkdGg6IDkwcHg7Zm9udC1zaXplOiAxNHB4OyB9CiAgICAudiB7IHRleHQtYWxpZ246IHJpZ2h0OyBmbGV4OiAxO292ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9CiAgICAubW9ubyB7IGZvbnQtZmFtaWx5OiB1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgIkxpYmVyYXRpb24gTW9ubyIsIG1vbm9zcGFjZTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9CiAgICAuc2VwIHsgaGVpZ2h0OiAxcHg7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsLjA2KTsgbWFyZ2luOiAxMHB4IDA7IH0KICAgIC50YWcgeyBtYXJnaW4tdG9wOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0OyB9CiAgICAud2FybiB7IG1hcmdpbi10b3A6IDEwcHg7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICNkNDZiMDg7IH0KICA=","src/app/pages/sprite/components/step-summary-aside.component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\sprite-icons-panel-component.ts;CiAgICAud3JhcHsgaGVpZ2h0OjEwMCU7IG1pbi1oZWlnaHQ6MDsgZGlzcGxheTpmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDoxMnB4OyB9CiAgICAuYmFyeyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGdhcDoxMnB4OyB9CiAgICAubGVmdHsgZGlzcGxheTpmbGV4OyBhbGlnbi1pdGVtczpjZW50ZXI7IGdhcDoxMHB4OyBtaW4td2lkdGg6MDsgfQogICAgLmxhYmVseyBvcGFjaXR5Oi44OyB9CiAgICAuaGludHsgb3BhY2l0eTouNzU7IG1heC13aWR0aDo1MjBweDsgb3ZlcmZsb3c6aGlkZGVuOyB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzOyB3aGl0ZS1zcGFjZTpub3dyYXA7IH0KICAgIC5va3sgY29sb3I6IzUyYzQxYTsgfQoKICAgIC5ncmlkewogICAgICBmbGV4OjEgMSBhdXRvOwogICAgICBtaW4taGVpZ2h0OjA7CiAgICAgIGRpc3BsYXk6Z3JpZDsKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBtaW5tYXgoMCwgMmZyKSBtaW5tYXgoMCwgMS4yZnIpOwogICAgICBnYXA6IDEycHg7CiAgICB9CiAgICBAbWVkaWEgKG1heC13aWR0aDogMTEwMHB4KXsgLmdyaWR7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyB9IH0KCiAgICAucGFuZWx7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTUsIDIzLCA0MiwgLjEyKTsKICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgICAgbWluLWhlaWdodDowOwogICAgICBkaXNwbGF5OmZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMDIpOwogICAgfQogICAgLnBhbmVsLWhlYWRlcnsKICAgICAgZGlzcGxheTpmbGV4OwogICAgICBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOwogICAgICBwYWRkaW5nOjEycHggMTJweDsKICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMTUsIDIzLCA0MiwgLjEyKTsKICAgIH0KICAgIC5wYW5lbC10aXRsZXsgCiAgICAgICAgZGlzcGxheTpmbGV4OwogICAgICAgICYuY29sdW1ueyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47ICB9CiAgICAgICAgLnRleHR7IGZvbnQtc2l6ZToxNHB4OyBmb250LXdlaWdodDo1MDA7IH0KICAgICAgICAuc3ViLXRleHR7IGZvbnQtc2l6ZToxMnB4OyBvcGFjaXR5Oi43NTsgfQogICAgIH0KICAgICAuc2VhcmNoeyB3aWR0aDoyNDBweDsgfQoKICAgIC5pY29uLWdyaWR7CiAgICAgIGRpc3BsYXk6Z3JpZDsKICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMTYwcHgsIDFmcikpOwogICAgICBnYXA6IDEwcHg7CiAgICAgIG92ZXJmbG93OmF1dG87CiAgICAgIHBhZGRpbmctcmlnaHQ6IDRweDsKICAgICAgcGFkZGluZzoxMnB4OwogICAgfQogICAgLmljb24tY2FyZHsKICAgICAgY3Vyc29yOnBvaW50ZXI7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsLjA2KTsKICAgICAgYm9yZGVyLXJhZGl1czogMTRweDsKICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuNSk7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMDhzIGVhc2UsIGJvcmRlci1jb2xvciAuMDhzIGVhc2U7CiAgICAgIHVzZXItc2VsZWN0Om5vbmU7CiAgICAgIGNvbG9yOiAjZmZmOwogICAgICBkaXNwbGF5OmZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICB9CiAgICAuaWNvbi1jYXJkOmhvdmVyeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTFweCk7IGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuOSk7IH0KICAgIC50aHVtYnsKICAgICAgZGlzcGxheTpmbGV4OwogICAgICBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDpjZW50ZXI7CiAgICB9CiAgICAudGh1bWIgaW1newogICAgICBtaW4td2lkdGg6MzJweDsKICAgICAgbWluLWhlaWdodDozMnB4OwogICAgfQogICAgLm1ldGEgLm5hbWV7IGZvbnQtc2l6ZToxMnB4OyBvcGFjaXR5Oi45OyB9CiAgICAubWV0YSAuY2xzeyBmb250LXNpemU6MTJweDsgb3BhY2l0eTouNjU7IH0KICAgIC5tZXRhIHsKICAgICAgcG9zaXRpb246cmVsYXRpdmU7CiAgICB9CiAgICAubWV0YSBuei1iYWRnZXsKICAgICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICAgIHRvcDotMTJweDsKICAgICAgcmlnaHQ6MDsKICAgIH0KICAgIC5zcHJpdGUtY29udGVudHsKICAgICAgcGFkZGluZzogMTZweCAxNnB4IDAgMTZweDsKICAgIH0KICAgIC5jc3MtY29udGVudHsKICAgICAgcGFkZGluZzoxMnB4OwogICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICBmbGV4OjEgMSBhdXRvOwogICAgICBvdmVyZmxvdzpoaWRkZW47CiAgICB9CiAg","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\less-viewport-component.ts;CiAgICAgIDpob3N0ewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAvKiDlvq7lvLHlmarngrkgKyDmuJDlj5jog4zmma8gKi8KICAgICAgLmJnLWZ4IHsKICAgICAgICAgIGJhY2tncm91bmQ6CiAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KDEyMDBweCA2NTBweCBhdCAyMCUgMTAlLCByZ2JhKDM0LCAyMTEsIDIzOCwgLjE0KSwgdHJhbnNwYXJlbnQgNTUlKSwKICAgICAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoOTAwcHggNTIwcHggYXQgODAlIDM1JSwgcmdiYSgxMjQsIDU4LCAyMzcsIC4xNiksIHRyYW5zcGFyZW50IDU1JSksCiAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KDkwMHB4IDUyMHB4IGF0IDQwJSA5MCUsIHJnYmEoNTIsIDIxMSwgMTUzLCAuMTApLCB0cmFuc3BhcmVudCA1NSUpLAogICAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCgxODBkZWcsICMwNTA4MTYgMCUsICMwNzBCMTggNDAlLCAjMDUwODE2IDEwMCUpOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC52aWV3LWNhcmR7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKTsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIGRpc3BsYXk6ZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjpjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CgogICAgICB9CiAgICAgIC52aWV3LWhlYWRlcnsKICAgICAgICBwYWRkaW5nOjhweCAxMnB4OwogICAgICAgIGRpc3BsYXk6ZmxleDsKICAgICAgICBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47CiAgICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgICAgLnRleHR7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjg1KTsKICAgICAgICB9CiAgICAgICAgLmFjdGlvbnN7CiAgICAgICAgICBkaXNwbGF5OmZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczpjZW50ZXI7CiAgICAgICAgICBnYXA6OHB4OwogICAgICAgICAgYnV0dG9uW256LWJ1dHRvbl17CiAgICAgICAgICAgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjg1KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CiAgICAgIC52aWV3cG9ydHsKICAgICAgICBmbGV4OjEgMSBhdXRvOwogICAgICAgIG1pbi1oZWlnaHQ6MDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDUsIDgsIDIxKTsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEycHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgIA==","src/app/pages/sprite/components/less-viewport-component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\sprite-viewport-component.ts;CiAgICAgIC52aWV3LWNhcmR7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNSwgMjMsIDQyLCAwLjEyKTsKICAgICAgICBwb3NpdGlvbjpyZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnZpZXctaGVhZGVyewogICAgICAgIHBhZGRpbmc6OHB4IDEycHg7CiAgICAgICAgZGlzcGxheTpmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjsKICAgICAgICAudGlwewogICAgICAgICAgZGlzcGxheTppbmxpbmUtZmxleDsKICAgICAgICAgIGFsaWduLWl0ZW1zOmNlbnRlcjsKICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgfQogICAgICAgIGxhYmVsewogICAgICAgICAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLnZpZXdwb3J0ewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBtaW4taGVpZ2h0OiAzNjBweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNSwgOCwgMjEpOwogICAgICAgIHBvc2l0aW9uOnJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgJi5ncmlkLWZ4ewogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6CiAgICAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgxNDgsIDE2MywgMTg0LCAuMDYpIDFweCwgdHJhbnNwYXJlbnQgMXB4KSwKICAgICAgICAgICAgbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgxNDgsIDE2MywgMTg0LCAuMDYpIDFweCwgdHJhbnNwYXJlbnQgMXB4KTsKICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI4cHggMjhweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyog5b6u5byx5Zmq54K5ICsg5riQ5Y+Y6IOM5pmvICovCiAgICAgIC5iZy1meCB7CiAgICAgICAgICBiYWNrZ3JvdW5kOgogICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudCgxMjAwcHggNjUwcHggYXQgMjAlIDEwJSwgcmdiYSgzNCwgMjExLCAyMzgsIC4xNCksIHRyYW5zcGFyZW50IDU1JSksCiAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KDkwMHB4IDUyMHB4IGF0IDgwJSAzNSUsIHJnYmEoMTI0LCA1OCwgMjM3LCAuMTYpLCB0cmFuc3BhcmVudCA1NSUpLAogICAgICAgICAgICAgIHJhZGlhbC1ncmFkaWVudCg5MDBweCA1MjBweCBhdCA0MCUgOTAlLCByZ2JhKDUyLCAyMTEsIDE1MywgLjEwKSwgdHJhbnNwYXJlbnQgNTUlKSwKICAgICAgICAgICAgICBsaW5lYXItZ3JhZGllbnQoMTgwZGVnLCAjMDUwODE2IDAlLCAjMDcwQjE4IDQwJSwgIzA1MDgxNiAxMDAlKTsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAuYmctZng6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaW5zZXQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogLjEwOwogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNjAnIGhlaWdodD0nMTYwJyUzRSUzQ2ZpbHRlciBpZD0nbiclM0UlM0NmZVR1cmJ1bGVuY2UgdHlwZT0nZnJhY3RhbE5vaXNlJyBiYXNlRnJlcXVlbmN5PScuOCcgbnVtT2N0YXZlcz0nMycgc3RpdGNoVGlsZXM9J3N0aXRjaCcvJTNFJTNDL2ZpbHRlciUzRSUzQ3JlY3Qgd2lkdGg9JzE2MCcgaGVpZ2h0PScxNjAnIGZpbHRlcj0ndXJsKCUyM24pJyBvcGFjaXR5PScuMzUnLyUzRSUzQy9zdmclM0UiKTsKICAgICAgICBtaXgtYmxlbmQtbW9kZTogb3ZlcmxheTsKICAgICAgfQogICAgICAuc3ByaXRlewogICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMDIpOwogICAgICAgIHRvcDoyNHB4OwogICAgICAgIGxlZnQ6MjRweDsKICAgICAgICAtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwOwogICAgICAgIC0tdHctc2hhZG93OiAwIDAgMCAxcHggcmdiYSgzNCwgMjExLCAyMzgsIC4xNCksIDAgMjRweCA4MHB4IHJnYmEoMCwgMCwgMCwgLjU1KTsKICAgICAgICAtLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgMCAxcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKSwgMCAyNHB4IDgwcHggdmFyKC0tdHctc2hhZG93LWNvbG9yKTsKICAgICAgICBib3gtc2hhZG93OiB2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksIHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLCB2YXIoLS10dy1zaGFkb3cpOwogICAgICB9CiAgICAgIC5hYnN7CiAgICAgICAgcG9zaXRpb246YWJzb2x1dGU7CiAgICAgIH0KICAgICAgLmluc2V0LTB7CiAgICAgICAgbGVmdDowOwogICAgICAgIHRvcDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgICAgYm90dG9tOjA7CiAgICAgIH0KICAgICAgLmFiczJ7CiAgICAgICAgYm9yZGVyLXJhZGl1czoxMnB4OwogICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoMzQsIDIxMSwgMjM4LCAuMDgpLCByZ2JhKDEyNCwgNTgsIDIzNywgLjEwKSk7CiAgICAgIH0KICAgICAgLnRyYW5zaXRpb24gewogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IGNvbG9yLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXItY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLWNvbG9yLCAtd2Via2l0LWJhY2tkcm9wLWZpbHRlcjsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlcjsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBjb2xvciwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyLWNvbG9yLCB0ZXh0LWRlY29yYXRpb24tY29sb3IsIGZpbGwsIHN0cm9rZSwgb3BhY2l0eSwgYm94LXNoYWRvdywgdHJhbnNmb3JtLCBmaWx0ZXIsIGJhY2tkcm9wLWZpbHRlciwgLXdlYmtpdC10ZXh0LWRlY29yYXRpb24tY29sb3IsIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDE1MG1zOwogICAgICB9CiAgICAgIC5ib3gtaXRlbXsKICAgICAgICBib3JkZXItd2lkdGg6IDFweDsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwuMTUpOwogICAgICAgICY6aG92ZXJ7CiAgICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMTI0LCA1OCwgMjM3LCAuNDApOwogICAgICAgIH0KICAgICAgICAmLmFjdGl2ZXsKICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgzNCwyMTEsMjM4LC43MCk7CiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgzNCwyMTEsMjM4LC4yNSksIDAgMCAyOHB4IHJnYmEoMzQsMjExLDIzOCwuMTgpOwogICAgICAgIH0KICAgICAgfQogICAgICAudG9vbHRpcHsKICAgICAgICBwb2ludGVyLWV2ZW50czpub25lOwogICAgICAgIHotaW5kZXg6MTA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIGJvcmRlcjoxcHggc29saWQgcmdiYSgxNDgsIDE2MywgMTg0LCAuMTQpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMTgsIDI4LCA1MiwgMC43KTsKICAgICAgICBwYWRkaW5nOiA2cHggMTBweDsKICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgzNCwgMjExLCAyMzgsIC4yNSksIDAgMTBweCAzMHB4IHJnYmEoMTI0LCA1OCwgMjM3LCAuMTgpOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgICYuaGlkZGVuewogICAgICAgICAgZGlzcGxheTpub25lOwogICAgICAgIH0KICAgICAgfQogICAg","src/app/pages/sprite/components/sprite-viewport-component.ts","src/app/pages/sprite/components/sprite-icons-panel-component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\components\\sprite-images-panel-component.ts;CiAgICAud3JhcHsgaGVpZ2h0OjEwMCU7IG1pbi1oZWlnaHQ6MDsgb3ZlcmZsb3cteTphdXRvOyBwYWRkaW5nOjEycHg7IH0KICAgIC5oZWFkZXJ7IGRpc3BsYXk6ZmxleDsgYWxpZ24taXRlbXM6Y2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6c3BhY2UtYmV0d2VlbjsgZ2FwOjEycHg7IG1hcmdpbi1ib3R0b206MTJweDsgfQogICAgLmhlYWRlciAuY291bnR7IGZvbnQtc2l6ZToxNHB4OyBvcGFjaXR5Oi40NTsgZmxleDowIDAgYXV0bzsgd2hpdGUtc3BhY2U6bm93cmFwOyB9CiAgICAuZGlyLXN0YWNreyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsgZ2FwOjZweDsgbWFyZ2luLWJvdHRvbToxMnB4OyBmbGV4LXdyYXA6d3JhcDsgfQogICAgLmRpci1pdGVteyBjdXJzb3I6IHBvaW50ZXI7IH0KICAgIC5pbWctZ3JpZHsKICAgICAgZGlzcGxheTpncmlkOwogICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpbGwsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICAgIGdhcDogMTJweDsKICAgICAgb3ZlcmZsb3c6YXV0bzsKICAgICAgcGFkZGluZy1yaWdodDogNHB4OwogICAgfQogICAgLmltZy1jYXJkewogICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4wOCk7CiAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICAgIG92ZXJmbG93OmhpZGRlbjsKICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwuMDIpOwogICAgICBkaXNwbGF5OmZsZXg7CiAgICAgIGZsZXgtZGlyZWN0aW9uOmNvbHVtbjsKICAgIH0KICAgIC50aHVtYnsgaGVpZ2h0OiAxNjBweDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwuMTgpOyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OmNlbnRlcjsgdXNlci1zZWxlY3Q6bm9uZTt9CiAgICAudGh1bWIgaW1neyBtYXgtd2lkdGg6MTAwJTsgbWF4LWhlaWdodDoxMDAlOyBvYmplY3QtZml0OmNvbnRhaW47IGN1cnNvcjogcG9pbnRlcjsgICB9CiAgICAudGh1bWIgaW1nOmZvY3VzLC50aHVtYjpmb2N1c3tvdXRsaW5lOm5vbmV9CiAgICAudGh1bWIgLmRpcnsgY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsLjYpOyBmb250LXNpemU6NTZweDsgY3Vyc29yOnBvaW50ZXI7IH0KICAgIC5tZXRheyBwYWRkaW5nOiAxMHB4OyBkaXNwbGF5OmZsZXg7IGFsaWduLWl0ZW1zOmNlbnRlcjsganVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47IGdhcDoxMHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLC4wNCk7ICB9CiAgICAubmFtZXsgZm9udC1zaXplOjE0cHg7IG9wYWNpdHk6Ljg1OyBvdmVyZmxvdzpoaWRkZW47IHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7IHdoaXRlLXNwYWNlOm5vd3JhcDsgfQogICAgLmZpbGUtY291bnR7IGZvbnQtc2l6ZToxNHB4OyBvcGFjaXR5Oi40NTtmbGV4OjAgMCBhdXRvOyB3aGl0ZS1zcGFjZTpub3dyYXA7IH0KICA=","src/app/pages/sprite/components/sprite-images-panel-component.ts","src/app/pages/sprite/sprite-conf-modal.component.ts","angular:jit:style:inline:src\\app\\pages\\sprite\\sprite-result-tabs.component.ts;CiAgICA6aG9zdHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgbnotdGFic3sKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgJjo6bmctZGVlcCAuYW50LXRhYnMtY29udGVudC1ob2xkZXJ7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAuYW50LXRhYnMtY29udGVudHsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICAuYW50LXRhYnMtdGFicGFuZXsKICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIA==","src/app/pages/sprite/sprite-result-tabs.component.ts","src/app/pages/sprite/sprite.component.ts","src/app/pages/sprite/sprite-routing.module.ts","src/app/pages/sprite/sprite.module.ts"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","/* angular:styles/component:less;0b8b22c936238239f0eefecb7ef1320d00db89e47b2c1150ed010468d3e85fd7;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\sprite.component.ts */\n.page {\n height: 100%;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n gap: 16px;\n padding: 0 16px;\n}\n.content {\n flex: 1 1 auto;\n width: 0;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n.content.empty {\n justify-content: center;\n}\n.aside {\n width: 0;\n flex: 0 0 auto;\n height: 100%;\n padding: 16px;\n background: #000;\n transition: transform 0.2s ease;\n transform: translateX(150%);\n}\n.aside.open {\n width: 400px;\n transform: translateX(0);\n}\n/*# sourceMappingURL=sprite.component.css.map */\n","import { inject, Injectable } from '@angular/core';\r\nimport { ApiClient } from '@app/core/api';\r\nimport { Project, ProjectAssets } from '@models/project.model';\r\nimport { SpriteBrowseResult, SpriteConfig, SpriteSnapshot } from '@models/sprite.model';\r\nimport { GenerateSpriteOptions, SvnCheckoutOptions } from '../models';\r\nimport { SvnRuntime, SvnSyncResult } from '@models/svn.model';\r\nimport { HttpParams } from '@angular/common/http';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpriteApiService {\r\n private api = inject(ApiClient);\r\n\r\n generate(projectId: string, options: GenerateSpriteOptions = {}) {\r\n return this.api.post<SpriteSnapshot>(`/api/sprite/generate/${projectId}`, options);\r\n }\r\n\r\n getConfig(projectId: string) {\r\n return this.api.get<SpriteConfig>(`/api/sprite/config/${projectId}`);\r\n }\r\n\r\n createConfig(projectId: string, assets: ProjectAssets, config: Omit<SpriteConfig, \"projectId\" | \"updatedAt\">) {\r\n return this.api.post<{ cfg: SpriteConfig | null, project: Project }>(`/api/sprite/config/${projectId}`, { config, assets });\r\n }\r\n\r\n checkout(projectId: string, options: SvnCheckoutOptions = {}) {\r\n return this.api.post<SvnSyncResult[]>(`/api/svn/sync/${projectId}`, options);\r\n }\r\n\r\n streamCheckout(projectId: string, options: SvnCheckoutOptions = {}) {\r\n return this.api.post<void>(`/api/svn/sync/stream/${projectId}`, options);\r\n }\r\n\r\n getRuntimes(projectId: string) {\r\n return this.api.get<SvnRuntime[]>(`/api/svn/runtime/${projectId}`);\r\n }\r\n\r\n getSprites(projectId: string) {\r\n return this.api.get<SpriteSnapshot>(`/api/sprite/list/${projectId}`);\r\n }\r\n\r\n browseIconGroups(projectId: string) {\r\n return this.api.get<SpriteBrowseResult>(`/api/sprite/browse/icons/groups/${projectId}`);\r\n }\r\n\r\n browseIconFiles(projectId: string, group: string) {\r\n const params = new HttpParams().set('group', group);\r\n return this.api.get<SpriteBrowseResult>(`/api/sprite/browse/icons/files/${projectId}`, params);\r\n // 如果你的 ApiClient 不支持 query 对象,就拼接 ?group=\r\n }\r\n\r\n browseImages(projectId: string, dir: string = '') {\r\n const params = new HttpParams().set('dir', dir);\r\n return this.api.get<SpriteBrowseResult>(`/api/sprite/browse/images/list/${projectId}`, params);\r\n }\r\n}\r\n","import { computed, inject, Injectable } from '@angular/core';\r\nimport { ProjectContextStore } from '@app/core/stores';\r\nimport { ProjectAssets } from '@models/project.model';\r\nimport { SpriteConfig, SpriteSnapshot } from '@models/sprite.model';\r\nimport { SvnRuntime, SvnSyncResult } from '@models/svn.model';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { SvnCheckoutOptions } from '../models';\r\nimport { SpriteApiService } from './sprite-api.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpriteStateService {\r\n private projectContext = inject(ProjectContextStore)\r\n private api = inject(SpriteApiService)\r\n\r\n project = computed(() => {\r\n return this.projectContext.currentProject()\r\n })\r\n\r\n async loadConfig(): Promise<SpriteConfig | null> {\r\n if (!this.project()) {\r\n throw new Error(\"No project selected\");\r\n }\r\n const projectId = this.project()!.id;\r\n return await firstValueFrom(this.api.getConfig(projectId));\r\n }\r\n\r\n async createConfig(assets: ProjectAssets, config: Omit<SpriteConfig, \"projectId\" | \"updatedAt\">): Promise<SpriteConfig | null> {\r\n if (!this.project()) {\r\n throw new Error(\"No project selected\");\r\n }\r\n const projectId = this.project()!.id;\r\n const data = await firstValueFrom(this.api.createConfig(projectId, assets, config));\r\n this.projectContext.patchProject(data.project); // 更新项目状态以反映新的资产配置\r\n return data.cfg;\r\n }\r\n\r\n async checkout(options: SvnCheckoutOptions = {}): Promise<SvnSyncResult[]> {\r\n const projectId = this.ensureProjectId();\r\n return await firstValueFrom(this.api.checkout(projectId, options));\r\n }\r\n\r\n async streamCheckout(options: SvnCheckoutOptions = {}): Promise<void> {\r\n const projectId = this.ensureProjectId();\r\n return await firstValueFrom(this.api.streamCheckout(projectId, options));\r\n }\r\n\r\n async getSvnRuntimes(): Promise<SvnRuntime[]> {\r\n const projectId = this.ensureProjectId();\r\n return await firstValueFrom(this.api.getRuntimes(projectId));\r\n }\r\n\r\n async generate(): Promise<SpriteSnapshot> {\r\n const projectId = this.ensureProjectId();\r\n return await firstValueFrom(this.api.generate(projectId));\r\n }\r\n\r\n async getSprites(): Promise<SpriteSnapshot> {\r\n const projectId = this.ensureProjectId();\r\n return await firstValueFrom(this.api.getSprites(projectId));\r\n }\r\n\r\n private ensureProjectId(): string {\r\n const project = this.project();\r\n if (!project) {\r\n throw new Error(\"No project selected\");\r\n }\r\n return project.id;\r\n }\r\n\r\n}\r\n","import { DestroyRef, Injectable } from \"@angular/core\";\r\nimport { WsClientMsg, WsServerMsg, WsState } from \"@app/core/ws\";\r\nimport { WsClientService } from \"@app/core/ws/ws-client.service\";\r\nimport type {\r\n SvnEventMsg,\r\n SvnEventType,\r\n SvnSyncDonePayload,\r\n SvnSyncFailedPayload,\r\n SvnSyncOutputPayload,\r\n SvnSyncProgressPayload,\r\n SvnSyncRuntimePayload,\r\n SvnSyncStartedPayload,\r\n SvnTaskStatus,\r\n} from \"@core/ws/ws.svn.types\";\r\nimport { BehaviorSubject, Observable, Subject, Subscription } from \"rxjs\";\r\nimport { distinctUntilChanged } from \"rxjs/operators\";\r\n\r\n/**\r\n * UI 侧运行态(基于 SvnSyncRuntimePayload 扩展一些便于展示的字段)\r\n */\r\nexport type SvnRuntimeVM = SvnSyncRuntimePayload & {\r\n status?: SvnTaskStatus;\r\n\r\n // progress snapshot\r\n total?: number;\r\n changed?: number;\r\n percent?: number;\r\n\r\n // timestamps\r\n updatedAt?: string; // 来自 done/failed\r\n lastEventAt?: number; // 本地接收时间戳\r\n\r\n // error snapshot\r\n lastError?: string;\r\n};\r\n\r\ntype SvnOutputChunk = {\r\n projectId: string;\r\n sourceId: string;\r\n stream: \"stdout\" | \"stderr\";\r\n text: string;\r\n status: SvnTaskStatus;\r\n ts: number;\r\n};\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class SpriteStreamService {\r\n private subs = new Map<string, number>(); // projectId -> tail\r\n private lastWsState: WsState = \"idle\";\r\n\r\n private event$ = new Subject<SvnEventMsg>();\r\n private eventByProject = new Map<string, Subject<SvnEventMsg>>();\r\n\r\n private runtimesByProject = new Map<string, BehaviorSubject<SvnRuntimeVM[]>>();\r\n\r\n // projectId:sourceId -> output stream\r\n private outputByKey = new Map<string, Subject<SvnOutputChunk>>();\r\n\r\n constructor(\r\n private ws: WsClientService\r\n ) {\r\n this.ws.messages().subscribe((msg) => this.onMessage(msg));\r\n this.ws.stateChanges().subscribe((s) => {\r\n if (s === \"open\" && this.lastWsState !== \"open\") this.replaySubs();\r\n this.lastWsState = s;\r\n });\r\n }\r\n\r\n // ------------------------\r\n // connection + trigger\r\n // ------------------------\r\n\r\n ensureConnected() {\r\n this.ws.connect();\r\n }\r\n\r\n // ------------------------\r\n // subscribe lifecycle\r\n // ------------------------\r\n\r\n subscribeProject(projectId: string, tail = 1000) {\r\n const id = String(projectId ?? \"\").trim();\r\n if (!id) return;\r\n\r\n const t = Math.max(0, Math.min(5000, tail | 0));\r\n if (this.subs.get(id) === t) return;\r\n\r\n this.subs.set(id, t);\r\n this.ensureProjectEventSubject(id);\r\n this.ensureProjectRuntimesSubject(id);\r\n\r\n if (this.ws.isOpen()) {\r\n this.ws.send({ op: \"sub\", topic: \"svn\", projectId: id, tail: t } as Extract<WsClientMsg, { op: \"sub\" }>);\r\n }\r\n }\r\n\r\n unsubscribeProject(projectId: string) {\r\n const id = String(projectId ?? \"\").trim();\r\n if (!this.subs.has(id)) return;\r\n\r\n this.subs.delete(id);\r\n\r\n if (this.ws.isOpen()) {\r\n this.ws.send({ op: \"unsub\", topic: \"svn\", projectId: id } as Extract<WsClientMsg, { op: \"unsub\" }>);\r\n }\r\n }\r\n\r\n /**\r\n * 推荐:组件 add 进自己的 Subscription 容器\r\n * - sub.unsubscribe() 时自动触发 unsubscribeProject()\r\n */\r\n watchProject(projectId: string, tail = 1000): Subscription {\r\n const id = String(projectId ?? \"\").trim();\r\n this.ensureConnected();\r\n this.subscribeProject(id, tail);\r\n\r\n const sub = new Subscription();\r\n sub.add(() => this.unsubscribeProject(id));\r\n return sub;\r\n }\r\n\r\n /**\r\n * 更自动:绑定到 DestroyRef(Angular 16+)\r\n */\r\n bindToDestroyRef(projectId: string, destroyRef: DestroyRef, tail = 1000) {\r\n const id = String(projectId ?? \"\").trim();\r\n this.ensureConnected();\r\n this.subscribeProject(id, tail);\r\n destroyRef.onDestroy(() => this.unsubscribeProject(id));\r\n }\r\n\r\n // ------------------------\r\n // streams\r\n // ------------------------\r\n\r\n events$() {\r\n return this.event$.asObservable();\r\n }\r\n\r\n eventsByProject$(projectId: string) {\r\n const id = String(projectId ?? \"\").trim();\r\n return this.ensureProjectEventSubject(id).asObservable();\r\n }\r\n\r\n runtimes$(projectId: string): Observable<SvnRuntimeVM[]> {\r\n const id = String(projectId ?? \"\").trim();\r\n return this.ensureProjectRuntimesSubject(id).asObservable().pipe(distinctUntilChanged());\r\n }\r\n\r\n /**\r\n * 输出流:按 (projectId, sourceId)\r\n * - payload.output: { type, data, status }\r\n */\r\n output$(projectId: string) {\r\n const key = this.keyOf(projectId);\r\n if (!this.outputByKey.has(key)) this.outputByKey.set(key, new Subject<SvnOutputChunk>());\r\n return this.outputByKey.get(key)!.asObservable();\r\n }\r\n\r\n // ------------------------\r\n // internals\r\n // ------------------------\r\n\r\n private replaySubs() {\r\n for (const [projectId, tail] of this.subs.entries()) {\r\n this.ws.send({ op: \"sub\", topic: \"svn\", projectId, tail } as WsClientMsg);\r\n }\r\n }\r\n\r\n private onMessage(msg: WsServerMsg) {\r\n if (msg?.op !== \"svn.event\") return;\r\n\r\n const m = msg as SvnEventMsg;\r\n const type = m.type as SvnEventType;\r\n const payload: any = m.payload;\r\n\r\n const projectId = String(payload?.projectId ?? \"\").trim();\r\n if (!projectId) return;\r\n\r\n // 全局 & 分项目事件\r\n this.event$.next(m);\r\n this.ensureProjectEventSubject(projectId).next(m);\r\n\r\n // 更新 runtime / output\r\n this.applyEvent(type, payload, m.ts ?? Date.now());\r\n }\r\n\r\n private applyEvent(type: SvnEventType, payload: any, ts: number) {\r\n const projectId = String(payload?.projectId ?? \"\").trim();\r\n const sourceId = String(payload?.sourceId ?? \"\").trim();\r\n if (!projectId || !sourceId) return;\r\n\r\n switch (type) {\r\n case \"runtime\": {\r\n const rt = payload as SvnSyncRuntimePayload;\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n ...rt,\r\n lastEventAt: ts,\r\n }), true);\r\n return;\r\n }\r\n\r\n case \"started\": {\r\n const p = payload as SvnSyncStartedPayload;\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n status: p.status,\r\n lastEventAt: ts,\r\n // started 时通常还没有 url/mode,保留 prev\r\n }));\r\n return;\r\n }\r\n\r\n case \"output\": {\r\n const p = payload as SvnSyncOutputPayload;\r\n const stream = p.type; // stdout | stderr\r\n const text = String(p.data ?? \"\");\r\n\r\n // 1) 推输出流\r\n if (text) {\r\n const key = this.keyOf(projectId);\r\n if (!this.outputByKey.has(key)) this.outputByKey.set(key, new Subject<SvnOutputChunk>());\r\n this.outputByKey.get(key)!.next({\r\n projectId,\r\n sourceId,\r\n stream,\r\n text,\r\n status: p.status,\r\n ts,\r\n });\r\n }\r\n\r\n // 2) 也写回 runtime 快照(MVP:只存最后一段)\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n status: p.status,\r\n lastEventAt: ts,\r\n lastStdout: stream === \"stdout\" ? text : prev.lastStdout,\r\n lastStderr: stream === \"stderr\" ? text : prev.lastStderr,\r\n }));\r\n return;\r\n }\r\n\r\n case \"progress\": {\r\n const p = payload as SvnSyncProgressPayload;\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n status: p.status,\r\n lastEventAt: ts,\r\n total: p.total ?? prev.total,\r\n changed: p.changed ?? prev.changed,\r\n percent: p.percent ?? prev.percent,\r\n }));\r\n return;\r\n }\r\n\r\n case \"done\": {\r\n const p = payload as SvnSyncDonePayload;\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n status: p.status,\r\n lastEventAt: ts,\r\n updatedAt: p.updatedAt,\r\n\r\n // 把本次同步的关键信息写回 runtime\r\n lastSyncAt: p.updatedAt, // 你 runtime 里叫 lastSyncAt\r\n lastSyncMode: p.mode,\r\n desiredUrl: p.desiredUrl,\r\n currentUrl: p.currentUrl,\r\n }));\r\n return;\r\n }\r\n\r\n case \"failed\": {\r\n const p = payload as SvnSyncFailedPayload;\r\n this.upsert(projectId, sourceId, (prev) => ({\r\n ...prev,\r\n status: p.status,\r\n lastEventAt: ts,\r\n updatedAt: p.updatedAt,\r\n lastError: p.error,\r\n\r\n // 失败一般也希望 stderr 有一条提示,方便 aside/面板直接展示\r\n lastStderr: p.error ? `[failed] ${p.error}` : prev.lastStderr,\r\n }));\r\n\r\n // 同时推一条 stderr 到 output 流(对齐你 task failed 的做法)\r\n if (p.error) {\r\n const key = this.keyOf(projectId);\r\n if (!this.outputByKey.has(key)) this.outputByKey.set(key, new Subject<SvnOutputChunk>());\r\n this.outputByKey.get(key)!.next({\r\n projectId,\r\n sourceId,\r\n stream: \"stderr\",\r\n text: `[failed] ${p.error}\\n`,\r\n status: p.status,\r\n ts,\r\n });\r\n }\r\n return;\r\n }\r\n\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n /** upsert by (projectId, sourceId) */\r\n private upsert(\r\n projectId: string,\r\n sourceId: string,\r\n patcher: (prev: SvnRuntimeVM) => SvnRuntimeVM,\r\n preferIncoming = false\r\n ) {\r\n const $rt = this.ensureProjectRuntimesSubject(projectId);\r\n const prevList = $rt.value ?? [];\r\n const idx = prevList.findIndex((x) => x.projectId === projectId && x.sourceId === sourceId);\r\n\r\n const base: SvnRuntimeVM =\r\n idx >= 0 ? prevList[idx] : ({ projectId, sourceId } as SvnRuntimeVM);\r\n\r\n const patched = patcher(base);\r\n const nextOne = preferIncoming ? { ...base, ...patched } : patched;\r\n\r\n const next = prevList.slice();\r\n if (idx >= 0) next[idx] = nextOne;\r\n else next.unshift(nextOne);\r\n\r\n $rt.next(next.slice(0, 200));\r\n }\r\n\r\n private ensureProjectEventSubject(projectId: string) {\r\n const id = String(projectId ?? \"\").trim();\r\n if (!this.eventByProject.has(id)) this.eventByProject.set(id, new Subject<SvnEventMsg>());\r\n return this.eventByProject.get(id)!;\r\n }\r\n\r\n private ensureProjectRuntimesSubject(projectId: string) {\r\n const id = String(projectId ?? \"\").trim();\r\n if (!this.runtimesByProject.has(id)) this.runtimesByProject.set(id, new BehaviorSubject<SvnRuntimeVM[]>([]));\r\n return this.runtimesByProject.get(id)!;\r\n }\r\n\r\n private keyOf(projectId: string) {\r\n return `svn:${projectId}`;\r\n }\r\n}","/* angular:styles/component:less;125834e9b5936eb64ca24f787803d49e0490724ab814641d7bcb085c7ceaba3d;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\sprite-conf-modal.component.ts */\n.content {\n display: grid;\n grid-template-columns: 1fr 360px;\n gap: 16px;\n margin-top: 16px;\n}\n.main {\n min-height: 420px;\n}\n.actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n margin-top: 18px;\n}\n.aside {\n position: sticky;\n top: 16px;\n height: fit-content;\n}\n/*# sourceMappingURL=sprite-conf-modal.component.css.map */\n","/* angular:styles/component:less;b7b62613d0435917e09e19b17aeff29a1d4ff7eee5edfd92a1ae057b0f1c85a0;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\step-basic.component.ts */\n.hint {\n margin-top: 6px;\n font-size: 12px;\n opacity: 0.7;\n}\n.emit {\n margin-top: 8px;\n}\n/*# sourceMappingURL=step-basic.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { SpriteDraft } from '../models/sprite-draft.model';\r\n\r\n@Component({\r\n selector: 'app-step-basic',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzFormModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzSelectModule,\r\n NzSwitchModule,\r\n NzCardModule,\r\n NzTooltipModule,\r\n NzIconModule,\r\n ],\r\n template: `\r\n <nz-card nzTitle=\"基础设置\">\r\n <form nz-form nzLayout=\"vertical\">\r\n <nz-form-item>\r\n <nz-form-label nzRequired nzTooltipTitle=\"项目的原尺寸图标SVN地址,用于制作项目所需雪碧图\" [nzTooltipIcon]=\"{ type: 'question-circle', theme: 'outline' }\">原尺寸图标 SVN 地址</nz-form-label>\r\n <nz-form-control nzHasFeedback nzErrorTip=\"请输入原尺寸图标SVN地址\">\r\n <input nz-input [(ngModel)]=\"draft.iconSvnPath\" required name=\"iconSvnPath\" placeholder=\"输入原尺寸图标SVN地址\" />\r\n </nz-form-control>\r\n <div class=\"hint\">示例:svn://192.168.1.10/项目管理/xx项目/02.项目文档/05.系统设计/02-原型设计/02-UI设计效果图&切图/3-原尺寸图标</div>\r\n </nz-form-item>\r\n \r\n <nz-form-item>\r\n <nz-form-label nzTooltipTitle=\"项目的其他切图SVN地址,方便浏览和查看详情\" [nzTooltipIcon]=\"{ type: 'question-circle', theme: 'outline' }\">其他切图 SVN 地址</nz-form-label>\r\n <nz-form-control>\r\n <input nz-input [(ngModel)]=\"draft.otherImagesSvnPath\" name=\"otherImagesSvnPath\" placeholder=\"输入其他切图 SVN 地址\"/>\r\n </nz-form-control>\r\n </nz-form-item>\r\n\r\n <nz-form-item>\r\n <nz-form-label nzRequired nzTooltipTitle=\"用于存放从SVN拉取的原尺寸图标和其他切图等资源文件,供后续雪碧图制作使用\">SVN资源目录</nz-form-label>\r\n <nz-form-control nzHasFeedback nzErrorTip=\"请输入存放SVN资源目录\">\r\n <input nz-input required [(ngModel)]=\"draft.localDir\" name=\"localDir\" placeholder=\"输入SVN资源本地存放目录\" />\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label nzRequired nzTooltipTitle=\"用于存放生成的雪碧图文件\">雪碧图导出目录</nz-form-label>\r\n <nz-form-control nzHasFeedback nzErrorTip=\"请输入存放雪碧图的导出目录\">\r\n <input nz-input required [(ngModel)]=\"draft.spriteExportDir\" name=\"spriteExportDir\" placeholder=\"输入雪碧图导出目录\" />\r\n </nz-form-control>\r\n <div class=\"hint\">\r\n 示例:前端项目中公共资源目录一般为 assets 或 public,建议设置为 'assets/icons' 或 'public/icons'\r\n </div>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label nzRequired nzTooltipTitle=\"用于存放生成的Less文件\">Less 导出目录</nz-form-label>\r\n <nz-form-control nzHasFeedback nzErrorTip=\"请输入存放Less文件的导出目录\">\r\n <input nz-input required [(ngModel)]=\"draft.lessExportDir\" name=\"lessExportDir\" placeholder=\"输入Less导出目录\" />\r\n </nz-form-control>\r\n <div class=\"hint\">\r\n 示例:前端项目中样式文件目录一般为 '/src/styles',建议设置为 '/src/styles/icons'\r\n </div>\r\n </nz-form-item>\r\n </form>\r\n </nz-card>\r\n `,\r\n styles: [`\r\n .hint { margin-top: 6px; font-size: 12px; opacity: .7; }\r\n .emit { margin-top: 8px; }\r\n `]\r\n})\r\nexport class StepBasicComponent {\r\n @Input({ required: true }) draft!: SpriteDraft;\r\n}\r\n","/* angular:styles/component:less;b7b62613d0435917e09e19b17aeff29a1d4ff7eee5edfd92a1ae057b0f1c85a0;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\step-advance.component.ts */\n.hint {\n margin-top: 6px;\n font-size: 12px;\n opacity: 0.7;\n}\n.emit {\n margin-top: 8px;\n}\n/*# sourceMappingURL=step-advance.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzFormModule } from 'ng-zorro-antd/form';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzSwitchModule } from 'ng-zorro-antd/switch';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { SpriteDraft } from '../models/sprite-draft.model';\r\n@Component({\r\n selector: 'app-step-advance',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzFormModule,\r\n NzInputModule,\r\n NzButtonModule,\r\n NzSelectModule,\r\n NzSwitchModule,\r\n NzCardModule,\r\n NzTooltipModule,\r\n NzIconModule,\r\n ],\r\n template: `\r\n <nz-card nzTitle=\"高级设置\">\r\n <form nz-form nzLayout=\"vertical\">\r\n <nz-form-item>\r\n <nz-form-label>CSS 前缀</nz-form-label>\r\n <nz-form-control>\r\n <input nz-input [(ngModel)]=\"draft.cssPrefix\" name=\"cssPrefix\" placeholder=\"输入 CSS 前缀,默认:sl\" />\r\n <div class=\"hint\">\r\n 可选,默认为 sl。生成的 CSS 类名将以该前缀开头,如:sl-16-1。\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label>雪碧图 URL</nz-form-label>\r\n <nz-form-control>\r\n <input nz-input [(ngModel)]=\"draft.spriteUrl\" name=\"spriteUrl\" placeholder=\"输入雪碧图 URL,默认:/assets/icons/{group}.png\"/>\r\n <div class=\"hint\">\r\n {{spriteUrlHint}}\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <nz-form-item>\r\n <nz-form-label>复制模板</nz-form-label>\r\n <nz-form-control>\r\n <textarea nz-input [(ngModel)]=\"draft.template\" name=\"template\" placeholder=\"{{templatePlaceholder}}\" rows=\"3\" style=\"resize:none;\"></textarea>\r\n <div class=\"hint\">\r\n {{templateHint}}\r\n </div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </form>\r\n </nz-card>\r\n `,\r\n styles: [`\r\n .hint { margin-top: 6px; font-size: 12px; opacity: .7; }\r\n .emit { margin-top: 8px; }\r\n `]\r\n})\r\nexport class StepAdvanceComponent {\r\n @Input({ required: true }) draft!: SpriteDraft;\r\n spriteUrlHint = `项目中实际雪碧图路径,默认:/assets/icons/{group}.png,如:/assets/icons/16-16.png。支持占位符: {group} 分组名(如 16-16), {size} 尺寸前缀(如 16)。`\r\n templatePlaceholder = `输入复制模板,默认:<i class=\"{base} {class}\"></i>`;\r\n templateHint = `实际复制的文本,默认:<i class=\"{base} {class}\"></i>,如:<i class=\"sl-16 sl-16-1\"></i>。支持占位符:{base} 基类名,{class} CSS 类名;{name} 图标名称;支持使用自定义组件,如小程序中用法:<SlIcon name=\"16-16-1\" size=\"16\" />,则模板为:<SlIcon name=\"{name}\" size=\"{size}\"/>。`\r\n}\r\n","/* angular:styles/component:less;b9ffde9aa18883857097dda339cdf9d1c94b1bdcae063459df7d83fbab96d96c;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\step-summary-aside.component.ts */\n.item {\n display: flex;\n justify-content: space-between;\n gap: 10px;\n padding: 6px 0;\n align-items: center;\n}\n.k {\n opacity: 0.7;\n width: 90px;\n font-size: 14px;\n}\n.v {\n text-align: right;\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.mono {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Menlo,\n Monaco,\n Consolas,\n \"Liberation Mono\",\n monospace;\n word-break: break-all;\n}\n.sep {\n height: 1px;\n background: rgba(0, 0, 0, 0.06);\n margin: 10px 0;\n}\n.tag {\n margin-top: 8px;\n text-align: right;\n}\n.warn {\n margin-top: 10px;\n font-size: 12px;\n color: #d46b08;\n}\n/*# sourceMappingURL=step-summary-aside.component.css.map */\n","import { Component, Input } from '@angular/core';\r\nimport { SpriteDraft } from '../models/sprite-draft.model';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\n\r\n@Component({\r\n selector: 'app-step-summary-aside',\r\n imports: [CommonModule, NzCardModule, NzTagModule, NzTooltipModule, NzIconModule, NzButtonModule, NzDrawerModule],\r\n template: `\r\n <nz-card nzTitle=\"摘要\" nzSize=\"small\">\r\n <div class=\"item\"><span class=\"k\">项目名称</span><span class=\"v\">{{draft.name || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">原尺寸图标</span><span class=\"v mono\" [nz-tooltip]=\"draft.iconSvnPath\">{{draft.iconSvnPath || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">其他切图</span><span class=\"v\" [nz-tooltip]=\"draft.otherImagesSvnPath\">{{draft.otherImagesSvnPath || '-'}}</span></div>\r\n <div class=\"sep\"></div>\r\n <div class=\"item\"><span class=\"k\">本地目录</span><span class=\"v\" [nz-tooltip]=\"draft.localDir\">{{draft.localDir || '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">雪碧图导出</span><span class=\"v\" [nz-tooltip]=\"draft.spriteExportDir\">{{draft.spriteExportDir ?? '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">Less 导出目录</span><span class=\"v\" [nz-tooltip]=\"draft.lessExportDir\">{{draft.lessExportDir ?? '-'}}</span></div>\r\n <div class=\"sep\"></div>\r\n <div class=\"item\"><span class=\"k\">CSS前缀</span><span class=\"v\">{{draft.cssPrefix ?? '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">雪碧图 URL</span><span class=\"v\">{{draft.spriteUrl ?? '-'}}</span></div>\r\n <div class=\"item\"><span class=\"k\">复制模板</span><span class=\"v\">{{draft.template ?? '-'}}</span></div> \r\n \r\n </nz-card>\r\n `,\r\n styles: [`\r\n .item { display:flex; justify-content:space-between; gap: 10px; padding: 6px 0;align-items: center; }\r\n .k { opacity: .7; width: 90px;font-size: 14px; }\r\n .v { text-align: right; flex: 1;overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace; word-break: break-all; }\r\n .sep { height: 1px; background: rgba(0,0,0,.06); margin: 10px 0; }\r\n .tag { margin-top: 8px; text-align: right; }\r\n .warn { margin-top: 10px; font-size: 12px; color: #d46b08; }\r\n `]\r\n})\r\nexport class StepSummaryAsideComponent {\r\n @Input({ required: true }) draft!: SpriteDraft;\r\n}\r\n","/* angular:styles/component:less;c424390f4eb7d036a785308cf1e8016be36a23ef2d28b39a4b98d4537811f199;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\sprite-icons-panel-component.ts */\n.wrap {\n height: 100%;\n min-height: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n}\n.left {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n}\n.label {\n opacity: 0.8;\n}\n.hint {\n opacity: 0.75;\n max-width: 520px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ok {\n color: #52c41a;\n}\n.grid {\n flex: 1 1 auto;\n min-height: 0;\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.2fr);\n gap: 12px;\n}\n@media (max-width: 1100px) {\n .grid {\n grid-template-columns: 1fr;\n }\n}\n.panel {\n border: 1px solid rgba(15, 23, 42, 0.12);\n border-radius: 20px;\n min-height: 0;\n display: flex;\n flex-direction: column;\n background: rgba(255, 255, 255, 0.02);\n}\n.panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 12px;\n border-bottom: 1px solid rgba(15, 23, 42, 0.12);\n}\n.panel-title {\n display: flex;\n}\n.panel-title.column {\n flex-direction: column;\n}\n.panel-title .text {\n font-size: 14px;\n font-weight: 500;\n}\n.panel-title .sub-text {\n font-size: 12px;\n opacity: 0.75;\n}\n.search {\n width: 240px;\n}\n.icon-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: 10px;\n overflow: auto;\n padding-right: 4px;\n padding: 12px;\n}\n.icon-card {\n cursor: pointer;\n border: 1px solid rgba(255, 255, 255, 0.06);\n border-radius: 14px;\n background: rgba(0, 0, 0, 0.5);\n transition: transform 0.08s ease, border-color 0.08s ease;\n -webkit-user-select: none;\n user-select: none;\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n}\n.icon-card:hover {\n transform: translateY(-1px);\n border-color: rgba(255, 255, 255, 0.9);\n}\n.thumb {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.thumb img {\n min-width: 32px;\n min-height: 32px;\n}\n.meta .name {\n font-size: 12px;\n opacity: 0.9;\n}\n.meta .cls {\n font-size: 12px;\n opacity: 0.65;\n}\n.meta {\n position: relative;\n}\n.meta nz-badge {\n position: absolute;\n top: -12px;\n right: 0;\n}\n.sprite-content {\n padding: 16px 16px 0 16px;\n}\n.css-content {\n padding: 12px;\n line-height: 1.5;\n flex: 1 1 auto;\n overflow: hidden;\n}\n/*# sourceMappingURL=sprite-icons-panel-component.css.map */\n","/* angular:styles/component:less;eb9450ccb5878613586334d2156dfbb450da3ff7a9a080e1df710f4935e5d83d;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\less-viewport-component.ts */\n:host {\n display: block;\n height: 100%;\n}\n.bg-fx {\n background:\n radial-gradient(\n 1200px 650px at 20% 10%,\n rgba(34, 211, 238, 0.14),\n transparent 55%),\n radial-gradient(\n 900px 520px at 80% 35%,\n rgba(124, 58, 237, 0.16),\n transparent 55%),\n radial-gradient(\n 900px 520px at 40% 90%,\n rgba(52, 211, 153, 0.1),\n transparent 55%),\n linear-gradient(\n 180deg,\n #050816 0%,\n #070B18 40%,\n #050816 100%);\n position: relative;\n}\n.view-card {\n border: 1px solid rgba(15, 23, 42, 0.12);\n position: relative;\n border-radius: 12px;\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n.view-header {\n padding: 8px 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex: 0 0 auto;\n}\n.view-header .text {\n font-size: 14px;\n font-weight: 500;\n color: rgba(255, 255, 255, 0.85);\n}\n.view-header .actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.view-header .actions button[nz-button] {\n color: rgba(255, 255, 255, 0.85);\n}\n.viewport {\n flex: 1 1 auto;\n min-height: 0;\n cursor: default;\n background-color: #050815;\n position: relative;\n color: #fff;\n padding-left: 12px;\n overflow-x: hidden;\n overflow-y: auto;\n}\n/*# sourceMappingURL=less-viewport-component.css.map */\n","import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Component, inject, Input } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzMessageService } from 'ng-zorro-antd/message';\r\nimport { NzSpaceModule } from 'ng-zorro-antd/space';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\n@Component({\r\n selector: 'app-less-viewport',\r\n imports: [\r\n CommonModule,\r\n NzCheckboxModule,\r\n FormsModule,\r\n NzSpaceModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n ClipboardModule,\r\n NzTooltipModule\r\n ],\r\n template: `\r\n <div class=\"view-card bg-fx\">\r\n <div class=\"view-header\">\r\n <div class=\"text\">样式代码</div>\r\n <div class=\"actions\">\r\n <button nz-button nzType=\"text\" (click)=\"copyCss()\" [disabled]=\"!cssText\" nz-tooltip=\"复制样式\">\r\n <nz-icon nzType=\"copy\"></nz-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"viewport\">\r\n <pre><code>{{cssText}}</code></pre>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n :host{\r\n display: block;\r\n height: 100%;\r\n }\r\n /* 微弱噪点 + 渐变背景 */\r\n .bg-fx {\r\n background:\r\n radial-gradient(1200px 650px at 20% 10%, rgba(34, 211, 238, .14), transparent 55%),\r\n radial-gradient(900px 520px at 80% 35%, rgba(124, 58, 237, .16), transparent 55%),\r\n radial-gradient(900px 520px at 40% 90%, rgba(52, 211, 153, .10), transparent 55%),\r\n linear-gradient(180deg, #050816 0%, #070B18 40%, #050816 100%);\r\n position: relative;\r\n }\r\n .view-card{\r\n border: 1px solid rgba(15, 23, 42, 0.12);\r\n position:relative;\r\n border-radius: 12px;\r\n display:flex;\r\n flex-direction:column;\r\n height: 100%;\r\n overflow: hidden;\r\n\r\n }\r\n .view-header{\r\n padding:8px 12px;\r\n display:flex;\r\n align-items:center;\r\n justify-content:space-between;\r\n flex: 0 0 auto;\r\n .text{\r\n font-size: 14px;\r\n font-weight: 500;\r\n color: rgba(255,255,255,.85);\r\n }\r\n .actions{\r\n display:flex;\r\n align-items:center;\r\n gap:8px;\r\n button[nz-button]{\r\n color: rgba(255,255,255,.85);\r\n }\r\n }\r\n\r\n }\r\n .viewport{\r\n flex:1 1 auto;\r\n min-height:0;\r\n cursor: default;\r\n background-color: rgb(5, 8, 21);\r\n position:relative;\r\n color: #fff;\r\n padding-left: 12px;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n }\r\n `],\r\n})\r\nexport class LessViewportComponent {\r\n @Input() cssText: string = '';\r\n private clipboard = inject(Clipboard);\r\n private msg = inject(NzMessageService);\r\n async copyCss() {\r\n const t = this.cssText;\r\n if (!t) return;\r\n this.clipboard.copy(t);\r\n this.msg.success(\"已复制样式\");\r\n }\r\n}\r\n","/* angular:styles/component:less;991b632b353fdd67d564e85381720016a1fd0d5205f64b4bc87eeaee09e28352;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\sprite-viewport-component.ts */\n.view-card {\n border: 1px solid rgba(15, 23, 42, 0.12);\n position: relative;\n border-radius: 12px;\n overflow: hidden;\n}\n.view-header {\n padding: 8px 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.view-header .tip {\n display: inline-flex;\n align-items: center;\n color: rgba(255, 255, 255, 0.8);\n font-size: 12px;\n}\n.view-header label {\n color: rgba(255, 255, 255, 0.8);\n}\n.viewport {\n cursor: default;\n min-height: 360px;\n background-color: #050815;\n position: relative;\n overflow: hidden;\n}\n.viewport.grid-fx {\n background-image:\n linear-gradient(\n to right,\n rgba(148, 163, 184, 0.06) 1px,\n transparent 1px),\n linear-gradient(\n to bottom,\n rgba(148, 163, 184, 0.06) 1px,\n transparent 1px);\n background-size: 28px 28px;\n}\n.bg-fx {\n background:\n radial-gradient(\n 1200px 650px at 20% 10%,\n rgba(34, 211, 238, 0.14),\n transparent 55%),\n radial-gradient(\n 900px 520px at 80% 35%,\n rgba(124, 58, 237, 0.16),\n transparent 55%),\n radial-gradient(\n 900px 520px at 40% 90%,\n rgba(52, 211, 153, 0.1),\n transparent 55%),\n linear-gradient(\n 180deg,\n #050816 0%,\n #070B18 40%,\n #050816 100%);\n position: relative;\n}\n.bg-fx:before {\n content: \"\";\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0.1;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.35'/%3E%3C/svg%3E\");\n mix-blend-mode: overlay;\n}\n.sprite {\n border-radius: 12px;\n background-color: rgba(255, 255, 255, 0.02);\n top: 24px;\n left: 24px;\n --tw-ring-offset-shadow: 0 0 #0000;\n --tw-shadow: 0 0 0 1px rgba(34, 211, 238, 0.14), 0 24px 80px rgba(0, 0, 0, 0.55);\n --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 24px 80px var(--tw-shadow-color);\n box-shadow:\n var(--tw-ring-offset-shadow, 0 0 #0000),\n var(--tw-ring-shadow, 0 0 #0000),\n var(--tw-shadow);\n}\n.abs {\n position: absolute;\n}\n.inset-0 {\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n}\n.abs2 {\n border-radius: 12px;\n background:\n linear-gradient(\n 135deg,\n rgba(34, 211, 238, 0.08),\n rgba(124, 58, 237, 0.1));\n}\n.transition {\n transition-property:\n color,\n background-color,\n border-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n -webkit-text-decoration-color,\n -webkit-backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter;\n transition-property:\n color,\n background-color,\n border-color,\n text-decoration-color,\n fill,\n stroke,\n opacity,\n box-shadow,\n transform,\n filter,\n backdrop-filter,\n -webkit-text-decoration-color,\n -webkit-backdrop-filter;\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-duration: 150ms;\n}\n.box-item {\n border-width: 1px;\n border-style: solid;\n border-color: rgba(255, 255, 255, 0.15);\n}\n.box-item:hover {\n border-color: rgba(124, 58, 237, 0.4);\n}\n.box-item.active {\n border-color: rgba(34, 211, 238, 0.7);\n box-shadow: 0 0 0 1px rgba(34, 211, 238, 0.25), 0 0 28px rgba(34, 211, 238, 0.18);\n}\n.tooltip {\n pointer-events: none;\n z-index: 10;\n border-radius: 8px;\n border: 1px solid rgba(148, 163, 184, 0.14);\n background-color: rgba(18, 28, 52, 0.7);\n padding: 6px 10px;\n box-shadow: 0 0 0 1px rgba(34, 211, 238, 0.25), 0 10px 30px rgba(124, 58, 237, 0.18);\n color: #fff;\n}\n.tooltip.hidden {\n display: none;\n}\n/*# sourceMappingURL=sprite-viewport-component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, ElementRef, input, Input, model, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SpriteClassMeta, SpriteGroupItem, SpriteMetaFile } from '@models/sprite.model';\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzCheckboxModule } from 'ng-zorro-antd/checkbox';\r\nimport { NzSpaceModule } from 'ng-zorro-antd/space';\r\n\r\n@Component({\r\n selector: 'app-sprite-viewport',\r\n imports: [\r\n CommonModule,\r\n NzCheckboxModule,\r\n FormsModule,\r\n NzSpaceModule,\r\n NzBadgeModule\r\n ],\r\n template: `\r\n <div class=\"view-card bg-fx\">\r\n <div class=\"view-header\">\r\n <nz-space>\r\n <div class=\"tip\">\r\n <nz-badge nzColor=\"purple\"/>\r\n 鼠标滚轮缩放\r\n </div>\r\n <div class=\"tip\">\r\n <nz-badge nzColor=\"geekblue\"/>\r\n 拖拽移动\r\n </div>\r\n \r\n </nz-space>\r\n <div class=\"actions\">\r\n <nz-space>\r\n <a href=\"javascript:;\" class=\"tip\" (click)=\"resetView()\">重置视图</a>\r\n <label nz-checkbox [(ngModel)]=\"showGrid\">像素网格</label>\r\n <label nz-checkbox [(ngModel)]=\"showBoxes\">切片框</label>\r\n </nz-space>\r\n </div>\r\n </div>\r\n <div class=\"viewport\" #viewport \r\n [style.height.px]=\"(meta?.spriteHeight ?? 0) + 48\"\r\n [class.grid-fx]=\"showGrid\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n (mouseup)=\"onMouseUp()\"\r\n (mouseleave)=\"onMouseUp()\"\r\n (wheel)=\"onWheel($event)\"\r\n (click)=\"clearActiveIfBlank($event)\"\r\n >\r\n <div class=\"stage abs inset-0\" [style.transform]=\"stageTransform()\" style=\"transform-origin: 0 0;\">\r\n <div class=\"sprite abs\" [style.width.px]=\"meta?.spriteWidth\" [style.height.px]=\"meta?.spriteHeight\">\r\n <div class=\"abs inset-0\" [style.backgroundImage]=\"'url(' + previewSpriteUrl + ')'\"\r\n style=\"background-repeat:no-repeat;background-position:0 0;background-size:100% 100%;opacity:.95;\" ></div>\r\n <div class=\"abs inset-0 abs2\"></div>\r\n <div class=\"abs inset-0 boxes\" [style.display]=\"showBoxes ? 'block' : 'none'\">\r\n @for (cls of classes; track cls.name) {\r\n <div\r\n class=\"abs box-item transition\"\r\n [class.active]=\"activeClassName() === cls.className\"\r\n \r\n [style.left.px]=\"cls.x\"\r\n [style.top.px]=\"cls.y\"\r\n [style.width.px]=\"cls.width\"\r\n [style.height.px]=\"cls.height\"\r\n (mousemove)=\"onBoxMove($event, cls)\"\r\n (mouseleave)=\"onBoxLeave()\"\r\n (click)=\"$event.stopPropagation(); setActive(cls.name)\"\r\n ></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tooltip abs\"\r\n [class.hidden]=\"!tooltip().visible\"\r\n [style.left.px]=\"tooltip().left\"\r\n [style.top.px]=\"tooltip().top\"\r\n >\r\n <div class=\"font-medium\">{{ tooltip().name }}</div>\r\n <div >{{ tooltip().meta }}</div>\r\n </div>\r\n </div>\r\n <div class=\"info-bar\"></div>\r\n </div>\r\n `,\r\n styles: [`\r\n .view-card{\r\n border: 1px solid rgba(15, 23, 42, 0.12);\r\n position:relative;\r\n border-radius: 12px;\r\n overflow: hidden;\r\n }\r\n .view-header{\r\n padding:8px 12px;\r\n display:flex;\r\n align-items:center;\r\n justify-content:space-between;\r\n .tip{\r\n display:inline-flex;\r\n align-items:center;\r\n color: rgba(255, 255, 255, 0.8);\r\n font-size: 12px;\r\n }\r\n label{\r\n color: rgba(255, 255, 255, 0.8);\r\n }\r\n }\r\n .viewport{\r\n cursor: default;\r\n min-height: 360px;\r\n background-color: rgb(5, 8, 21);\r\n position:relative;\r\n overflow: hidden;\r\n &.grid-fx{\r\n background-image:\r\n linear-gradient(to right, rgba(148, 163, 184, .06) 1px, transparent 1px),\r\n linear-gradient(to bottom, rgba(148, 163, 184, .06) 1px, transparent 1px);\r\n background-size: 28px 28px;\r\n }\r\n }\r\n /* 微弱噪点 + 渐变背景 */\r\n .bg-fx {\r\n background:\r\n radial-gradient(1200px 650px at 20% 10%, rgba(34, 211, 238, .14), transparent 55%),\r\n radial-gradient(900px 520px at 80% 35%, rgba(124, 58, 237, .16), transparent 55%),\r\n radial-gradient(900px 520px at 40% 90%, rgba(52, 211, 153, .10), transparent 55%),\r\n linear-gradient(180deg, #050816 0%, #070B18 40%, #050816 100%);\r\n position: relative;\r\n }\r\n .bg-fx:before {\r\n content: \"\";\r\n position: absolute;\r\n inset: 0;\r\n pointer-events: none;\r\n opacity: .10;\r\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='.35'/%3E%3C/svg%3E\");\r\n mix-blend-mode: overlay;\r\n }\r\n .sprite{\r\n border-radius: 12px;\r\n background-color: rgba(255,255,255,.02);\r\n top:24px;\r\n left:24px;\r\n --tw-ring-offset-shadow: 0 0 #0000;\r\n --tw-shadow: 0 0 0 1px rgba(34, 211, 238, .14), 0 24px 80px rgba(0, 0, 0, .55);\r\n --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 24px 80px var(--tw-shadow-color);\r\n box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);\r\n }\r\n .abs{\r\n position:absolute;\r\n }\r\n .inset-0{\r\n left:0;\r\n top:0;\r\n right:0;\r\n bottom:0;\r\n }\r\n .abs2{\r\n border-radius:12px;\r\n background: linear-gradient(135deg, rgba(34, 211, 238, .08), rgba(124, 58, 237, .10));\r\n }\r\n .transition {\r\n transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\r\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;\r\n transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter;\r\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\r\n transition-duration: 150ms;\r\n }\r\n .box-item{\r\n border-width: 1px;\r\n border-style: solid;\r\n border-color: rgba(255,255,255,.15);\r\n &:hover{\r\n border-color: rgba(124, 58, 237, .40);\r\n }\r\n &.active{\r\n border-color: rgba(34,211,238,.70);\r\n box-shadow: 0 0 0 1px rgba(34,211,238,.25), 0 0 28px rgba(34,211,238,.18);\r\n }\r\n }\r\n .tooltip{\r\n pointer-events:none;\r\n z-index:10;\r\n border-radius: 8px;\r\n border:1px solid rgba(148, 163, 184, .14);\r\n background-color: rgba(18, 28, 52, 0.7);\r\n padding: 6px 10px;\r\n box-shadow: 0 0 0 1px rgba(34, 211, 238, .25), 0 10px 30px rgba(124, 58, 237, .18);\r\n color: #fff;\r\n &.hidden{\r\n display:none;\r\n }\r\n }\r\n `],\r\n})\r\nexport class SpriteViewportComponent {\r\n @Input() item: SpriteGroupItem | null = null;\r\n\r\n @ViewChild('viewport', { static: true }) viewportRef!: ElementRef<HTMLDivElement>;\r\n\r\n activeClassName = model<string>(\"\");\r\n\r\n showGrid = true;\r\n showBoxes = true;\r\n\r\n scale = signal(1);\r\n tx = signal(0);\r\n ty = signal(0);\r\n dragging = signal(false);\r\n last = signal({ x: 0, y: 0 });\r\n\r\n // Tooltip & Toast\r\n tooltip = signal({\r\n visible: false,\r\n left: 0,\r\n top: 0,\r\n name: '—',\r\n meta: '—',\r\n });\r\n\r\n get classes() {\r\n return this.meta?.classes ?? [];\r\n }\r\n\r\n get meta() {\r\n return this.item?.meta as SpriteMetaFile | undefined;\r\n }\r\n\r\n get previewSpriteUrl() {\r\n return this.item?.previewSpriteUrl ?? \"\";\r\n }\r\n\r\n setActive(className: string) {\r\n this.activeClassName.set(className);\r\n }\r\n\r\n stageTransform = computed(() => {\r\n return `translate(${this.tx()}px, ${this.ty()}px) scale(${this.scale()})`;\r\n });\r\n\r\n onBoxMove(e: MouseEvent, cls: SpriteClassMeta) {\r\n if (!this.showBoxes) return;\r\n if (this.activeClassName() !== cls.className) {\r\n this.setActive(cls.className);\r\n }\r\n const r = this.viewportRef.nativeElement.getBoundingClientRect();\r\n this.tooltip.set({\r\n visible: true,\r\n left: e.clientX - r.left + 10,\r\n top: e.clientY - r.top + 10,\r\n name: cls.name,\r\n meta: `${cls.width}×${cls.height} · (-${cls.x}px, -${cls.y}px)`,\r\n });\r\n }\r\n\r\n onBoxLeave() {\r\n this.tooltip.set({\r\n ...this.tooltip(),\r\n visible: false,\r\n });\r\n }\r\n\r\n // ====== Pan / Zoom ======\r\n onMouseDown(e: MouseEvent) {\r\n this.dragging.set(true);\r\n this.last.set({ x: e.clientX, y: e.clientY });\r\n }\r\n\r\n onMouseUp() {\r\n this.dragging.set(false);\r\n }\r\n\r\n onMouseMove(e: MouseEvent) {\r\n if (!this.dragging()) return;\r\n const last = this.last();\r\n const dx = e.clientX - last.x;\r\n const dy = e.clientY - last.y;\r\n this.last.set({ x: e.clientX, y: e.clientY });\r\n this.tx.set(this.tx() + dx);\r\n this.ty.set(this.ty() + dy);\r\n }\r\n\r\n onWheel(e: WheelEvent) {\r\n e.preventDefault();\r\n const rect = this.viewportRef.nativeElement.getBoundingClientRect();\r\n const mx = e.clientX - rect.left;\r\n const my = e.clientY - rect.top;\r\n\r\n const delta = -Math.sign(e.deltaY) * 0.08;\r\n const current = this.scale();\r\n const next = this.clamp(current * (1 + delta), 0.6, 3);\r\n\r\n const wx = (mx - this.tx()) / current;\r\n const wy = (my - this.ty()) / current;\r\n\r\n this.scale.set(next);\r\n this.tx.set(mx - wx * next);\r\n this.ty.set(my - wy * next);\r\n }\r\n\r\n clearActiveIfBlank(e: MouseEvent) {\r\n // 点击空白处清空选中(注意:boxes 会 stopPropagation)\r\n const target = e.target as HTMLElement;\r\n if (target.id === 'viewport') this.setActive(\"\");\r\n }\r\n\r\n resetView() {\r\n this.scale.set(1);\r\n this.tx.set(0);\r\n this.ty.set(0);\r\n }\r\n\r\n private clamp(v: number, min: number, max: number) {\r\n return Math.max(min, Math.min(max, v));\r\n }\r\n}\r\n","import { Clipboard, ClipboardModule } from '@angular/cdk/clipboard';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Component, OnChanges, SimpleChanges, computed, inject, input, signal } from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport type { SpriteBrowseEntry, SpriteClassMeta, SpriteGroupItem, SpriteMetaFile, SpriteSnapshot, SvgMetaFile } from \"@models/sprite.model\";\r\nimport { NzBadgeModule } from 'ng-zorro-antd/badge';\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzCodeEditorModule } from \"ng-zorro-antd/code-editor\";\r\nimport { NzEmptyModule } from \"ng-zorro-antd/empty\";\r\nimport { NzGridModule } from \"ng-zorro-antd/grid\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzInputModule } from \"ng-zorro-antd/input\";\r\nimport { NzMessageService } from \"ng-zorro-antd/message\";\r\nimport { NzSelectModule } from \"ng-zorro-antd/select\";\r\nimport { LessViewportComponent } from \"./less-viewport-component\";\r\nimport { SpriteViewportComponent } from \"./sprite-viewport-component\";\r\nimport { SpriteApiService } from '../services/sprite-api.service';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\n@Component({\r\n selector: \"app-sprite-icons-panel\",\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzSelectModule,\r\n NzGridModule,\r\n NzEmptyModule,\r\n NzCodeEditorModule,\r\n NzButtonModule,\r\n NzIconModule,\r\n ClipboardModule,\r\n NzInputModule,\r\n SpriteViewportComponent,\r\n LessViewportComponent,\r\n NzBadgeModule,\r\n NzImageModule\r\n ],\r\n template: `\r\n <div class=\"wrap\">\r\n <div class=\"bar\">\r\n <div class=\"left\">\r\n <span class=\"label\">分组</span>\r\n <nz-select\r\n style=\"width: 220px\"\r\n [ngModel]=\"group()\"\r\n (ngModelChange)=\"group.set($event); groupChange($event)\"\r\n nzPlaceHolder=\"请选择\"\r\n >\r\n @for (opt of groups(); track opt.group) {\r\n <nz-option [nzLabel]=\"opt.group\" [nzValue]=\"opt.group\"></nz-option>\r\n }\r\n </nz-select>\r\n </div>\r\n </div>\r\n\r\n @if(!activeItem()){\r\n <nz-empty nzNotFoundContent=\"没有可展示的分组\"></nz-empty>\r\n } @else {\r\n <div class=\"grid\">\r\n <div class=\"panel\">\r\n <div class=\"panel-header\">\r\n <div class=\"panel-title column\">\r\n <div class=\"text\">图标预览</div>\r\n <div class=\"sub-text\">共{{icons().length + iconClasses().length}}个图标</div>\r\n </div>\r\n <div class=\"search\">\r\n <input type=\"text\" placeholder=\"搜索图标名称或类名\" nz-input />\r\n </div>\r\n </div>\r\n\r\n @if(iconClasses().length === 0 && icons().length === 0){\r\n <nz-empty nzNotFoundContent=\"该分组没有可用图标\"></nz-empty>\r\n } @else {\r\n <div class=\"icon-grid\">\r\n @if(mode() === 'svg'){\r\n @for (c of icons(); track c.name) {\r\n <div class=\"icon-card\" (click)=\"copySvg(c)\">\r\n <div class=\"thumb\">\r\n @if(c.kind === 'file' && c.url){\r\n <img nz-image [nzSrc]=\"c.url\" [alt]=\"c.name\" loading=\"lazy\" />\r\n }\r\n </div>\r\n <div class=\"meta\">\r\n <div class=\"name\">{{c.name}}</div>\r\n </div>\r\n </div>\r\n }\r\n }@else{\r\n @for (c of iconClasses(); track c.className) {\r\n <div class=\"icon-card\" (click)=\"copySpriteClass(c.className)\">\r\n <div class=\"thumb\">\r\n <div class=\"sprite\" [ngStyle]=\"spriteStyle(c)\"></div>\r\n </div>\r\n <div class=\"meta\">\r\n <div class=\"name\">{{c.name}}</div>\r\n <div class=\"cls\">{{c.className}}</div>\r\n <nz-badge [nzStatus]=\"activeClassName() === c.className ? 'processing' : 'default'\" />\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <div class=\"panel\">\r\n <div class=\"panel-header\">\r\n <div class=\"panel-title column\">\r\n <div class=\"text\">生成结果</div>\r\n <div class=\"sub-text\">LESS/CSS 样式,包含雪碧图背景定位等信息</div>\r\n </div>\r\n <div class=\"actions\">\r\n <!-- <button nz-button nzType=\"text\" (click)=\"copyCss()\" [disabled]=\"!cssText()\">\r\n <nz-icon nzType=\"reload\"></nz-icon>\r\n </button> -->\r\n </div>\r\n </div>\r\n <div class=\"sprite-content\">\r\n <app-sprite-viewport [(activeClassName)]=\"activeClassName\" [item]=\"activeItem()\"/>\r\n </div>\r\n <div class=\"css-content\">\r\n <app-less-viewport [cssText]=\"cssText()\"/>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .wrap{ height:100%; min-height:0; display:flex; flex-direction:column; gap:12px; }\r\n .bar{ display:flex; align-items:center; justify-content:space-between; gap:12px; }\r\n .left{ display:flex; align-items:center; gap:10px; min-width:0; }\r\n .label{ opacity:.8; }\r\n .hint{ opacity:.75; max-width:520px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\r\n .ok{ color:#52c41a; }\r\n\r\n .grid{\r\n flex:1 1 auto;\r\n min-height:0;\r\n display:grid;\r\n grid-template-columns: minmax(0, 2fr) minmax(0, 1.2fr);\r\n gap: 12px;\r\n }\r\n @media (max-width: 1100px){ .grid{ grid-template-columns: 1fr; } }\r\n\r\n .panel{\r\n border: 1px solid rgba(15, 23, 42, .12);\r\n border-radius: 20px;\r\n min-height:0;\r\n display:flex;\r\n flex-direction:column;\r\n background: rgba(255,255,255,.02);\r\n }\r\n .panel-header{\r\n display:flex;\r\n align-items:center;\r\n justify-content:space-between;\r\n padding:12px 12px;\r\n border-bottom: 1px solid rgba(15, 23, 42, .12);\r\n }\r\n .panel-title{ \r\n display:flex;\r\n &.column{ flex-direction:column; }\r\n .text{ font-size:14px; font-weight:500; }\r\n .sub-text{ font-size:12px; opacity:.75; }\r\n }\r\n .search{ width:240px; }\r\n\r\n .icon-grid{\r\n display:grid;\r\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\r\n gap: 10px;\r\n overflow:auto;\r\n padding-right: 4px;\r\n padding:12px;\r\n }\r\n .icon-card{\r\n cursor:pointer;\r\n border: 1px solid rgba(255,255,255,.06);\r\n border-radius: 14px;\r\n background: rgba(0,0,0,.5);\r\n transition: transform .08s ease, border-color .08s ease;\r\n user-select:none;\r\n color: #fff;\r\n display:flex;\r\n align-items:center;\r\n justify-content: space-between;\r\n padding: 12px 16px;\r\n }\r\n .icon-card:hover{ transform: translateY(-1px); border-color: rgba(255,255,255,.9); }\r\n .thumb{\r\n display:flex;\r\n align-items:center;\r\n justify-content:center;\r\n }\r\n .thumb img{\r\n min-width:32px;\r\n min-height:32px;\r\n }\r\n .meta .name{ font-size:12px; opacity:.9; }\r\n .meta .cls{ font-size:12px; opacity:.65; }\r\n .meta {\r\n position:relative;\r\n }\r\n .meta nz-badge{\r\n position:absolute;\r\n top:-12px;\r\n right:0;\r\n }\r\n .sprite-content{\r\n padding: 16px 16px 0 16px;\r\n }\r\n .css-content{\r\n padding:12px;\r\n line-height: 1.5;\r\n flex:1 1 auto;\r\n overflow:hidden;\r\n }\r\n `]\r\n})\r\nexport class SpriteIconsPanelComponent implements OnChanges {\r\n private clipboard = inject(Clipboard);\r\n private msg = inject(NzMessageService);\r\n private api = inject(SpriteApiService);\r\n\r\n\r\n sprite = input<SpriteSnapshot | null>(null);\r\n\r\n groups = computed<SpriteGroupItem[]>(() => {\r\n return this.sprite()?.groups ?? [];\r\n });\r\n group = signal<string>(\"\");\r\n activeItem = computed(() => {\r\n const g = this.group();\r\n return this.groups().find((x) => x.group === g) ?? null;\r\n });\r\n mode = computed<\"svg\" | \"png\">(() => {\r\n return this.activeItem()?.kind === \"svg\" ? \"svg\" : \"png\";\r\n })\r\n activeClassName = signal<string>(\"\");\r\n\r\n activePreviewSpriteUrl = computed(() => {\r\n const it = this.activeItem();\r\n return it?.previewSpriteUrl ?? null;\r\n });\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes[\"sprite\"]) {\r\n const firstItem = this.sprite()?.groups?.[0];\r\n if (firstItem) {\r\n const firstGroup = firstItem.group ?? \"\";\r\n this.group.set(firstGroup);\r\n this.groupChange(firstGroup);\r\n }\r\n }\r\n }\r\n\r\n groupChange(group: string) {\r\n if (this.activeItem()?.kind === 'svg') {\r\n this.loadImages(group);\r\n }\r\n }\r\n\r\n loadImages(group: string) {\r\n const id = this.sprite()?.projectId ?? ''\r\n if (!id) return;\r\n this.api.browseIconFiles(id, group)\r\n .subscribe(res => {\r\n const icons = res.entries ?? [];\r\n this.icons.set(icons);\r\n });\r\n }\r\n\r\n private baseClass = computed(() => {\r\n const prefix = this.sprite()?.config?.prefix || \"sl\";\r\n const g = this.group();\r\n const sizes = String(g).split(\"-\");\r\n if (sizes.length > 1) {\r\n const [w, h] = sizes\r\n if (w !== h) {\r\n return `${prefix}-${sizes[0]}-${sizes[1]}`\r\n }\r\n return `${prefix}-${sizes[0]}`\r\n }\r\n return `${prefix}-${sizes[0]}`;\r\n });\r\n\r\n\r\n iconClasses = computed(() => {\r\n const it = this.activeItem();\r\n const meta = it?.meta as SpriteMetaFile\r\n const classes = (meta?.classes ?? []);\r\n return classes\r\n .filter((x) => !!x.className);\r\n });\r\n\r\n icons = signal<SpriteBrowseEntry[]>([]);\r\n\r\n cssText = computed(() => {\r\n const it = this.activeItem();\r\n return String(it?.lessText ?? \"\");\r\n });\r\n\r\n async copySpriteClass(className: string) {\r\n const tpl = this.sprite()?.config?.template || `<i class=\"{base} {class}\"></i>`;\r\n const html = tpl\r\n .replaceAll(\"{base}\", this.baseClass())\r\n .replaceAll(\"{class}\", className);\r\n\r\n this.activeClassName.set(className);\r\n this.clipboard.copy(html);\r\n const safe = escapeHtmlText(html);\r\n const tip = `已复制:${safe}`\r\n this.msg.success(tip);\r\n }\r\n\r\n async copySvg(c: SpriteBrowseEntry) {\r\n const tpl = this.sprite()?.config?.template;\r\n if (!tpl) return;\r\n const item = this.activeItem();\r\n const meta = item?.meta as SvgMetaFile;\r\n if (!meta) return;\r\n const size = meta?.size\r\n const svgMeta = meta.icons.find(i => i.file === c.name);\r\n if (!svgMeta) return;\r\n const html = tpl.replaceAll(\"{name}\", svgMeta.name).replaceAll(\"{size}\", size).replaceAll(\"{base}\", svgMeta.className).replaceAll(\"{group}\", meta.group);\r\n this.clipboard.copy(html);\r\n const safe = escapeHtmlText(html);\r\n const tip = `已复制:${safe}`\r\n this.msg.success(tip);\r\n }\r\n\r\n async copyCss() {\r\n const t = this.cssText();\r\n if (!t) return;\r\n this.clipboard.copy(t);\r\n this.msg.success(\"已复制\");\r\n }\r\n\r\n private baseSpriteStyle() {\r\n const item = this.activeItem(); // SpriteGroupItem\r\n const url = item?.previewSpriteUrl; // 推荐用 previewSpriteUrl\r\n if (!url) return {};\r\n const meta = item?.meta as SpriteMetaFile;\r\n return {\r\n backgroundImage: `url(\"${url}\")`,\r\n backgroundRepeat: \"no-repeat\",\r\n backgroundSize: meta ? `${meta.spriteWidth}px ${meta.spriteHeight}px` : \"initial\",\r\n };\r\n }\r\n\r\n spriteStyle(c: SpriteClassMeta) {\r\n if (!c) return {};\r\n const base = this.baseSpriteStyle();\r\n return {\r\n ...base,\r\n width: `${c.width}px`,\r\n height: `${c.height}px`,\r\n backgroundPosition: `-${c.x}px -${c.y}px`,\r\n };\r\n }\r\n}\r\n\r\nfunction escapeHtmlText(s: string) {\r\n return s\r\n .replaceAll(\"&\", \"&\")\r\n .replaceAll(\"<\", \"<\")\r\n .replaceAll(\">\", \">\");\r\n}","/* angular:styles/component:less;a4fc820090e8fad6f7382e666c8cdc1ace171077a29b1ea94c5cf76bc134eb68;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\components\\sprite-images-panel-component.ts */\n.wrap {\n height: 100%;\n min-height: 0;\n overflow-y: auto;\n padding: 12px;\n}\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n margin-bottom: 12px;\n}\n.header .count {\n font-size: 14px;\n opacity: 0.45;\n flex: 0 0 auto;\n white-space: nowrap;\n}\n.dir-stack {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 12px;\n flex-wrap: wrap;\n}\n.dir-item {\n cursor: pointer;\n}\n.img-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\n gap: 12px;\n overflow: auto;\n padding-right: 4px;\n}\n.img-card {\n border: 1px solid rgba(255, 255, 255, 0.08);\n border-radius: 16px;\n overflow: hidden;\n background: rgba(255, 255, 255, 0.02);\n display: flex;\n flex-direction: column;\n}\n.thumb {\n height: 160px;\n background: rgba(0, 0, 0, 0.18);\n display: flex;\n align-items: center;\n justify-content: center;\n -webkit-user-select: none;\n user-select: none;\n}\n.thumb img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n cursor: pointer;\n}\n.thumb img:focus,\n.thumb:focus {\n outline: none;\n}\n.thumb .dir {\n color: rgba(255, 255, 255, 0.6);\n font-size: 56px;\n cursor: pointer;\n}\n.meta {\n padding: 10px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n background: rgba(0, 0, 0, 0.04);\n}\n.name {\n font-size: 14px;\n opacity: 0.85;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.file-count {\n font-size: 14px;\n opacity: 0.45;\n flex: 0 0 auto;\n white-space: nowrap;\n}\n/*# sourceMappingURL=sprite-images-panel-component.css.map */\n","import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Component, Input, OnChanges, OnInit, SimpleChanges, computed, inject, signal } from \"@angular/core\";\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SpriteBrowseEntry, SpriteSnapshot } from \"@models/sprite.model\";\r\nimport { NzButtonModule } from \"ng-zorro-antd/button\";\r\nimport { NzEmptyModule } from \"ng-zorro-antd/empty\";\r\nimport { NzIconModule } from \"ng-zorro-antd/icon\";\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzMessageService } from \"ng-zorro-antd/message\";\r\nimport { SpriteApiService } from '../services/sprite-api.service';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzImageModule } from 'ng-zorro-antd/image';\r\ntype DirCrumb = { label: string; dir: string }; // dir = '' 表示 root\r\n@Component({\r\n selector: \"app-sprite-images-panel\",\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, NzEmptyModule, NzButtonModule, NzIconModule, NzInputModule, NzTagModule, NzImageModule],\r\n template: `\r\n <div class=\"wrap\">\r\n <div class=\"header\">\r\n <input nz-input placeholder=\"搜索文件名\" [(ngModel)]=\"keyword\"/>\r\n <div class=\"count\">\r\n 共 {{imagesCount()}} 张图片\r\n </div>\r\n </div>\r\n @if(cachedImages().length === 0){\r\n <nz-empty nzNotFoundContent=\"暂无图片列表(后续可从 cutImageSvn 扫描并映射 URL)\"></nz-empty>\r\n } @else {\r\n <div class=\"dir-stack\">\r\n @for(crumb of dirStack;let i = $index; track crumb.dir) {\r\n <nz-tag color=\"blue\" class=\"dir-item\" (click)=\"loadDir(crumb)\">\r\n {{crumb.label}}\r\n </nz-tag>\r\n @if(i < dirStack.length - 1){\r\n <nz-icon nzType=\"right\" nzTheme=\"outline\"></nz-icon>\r\n }\r\n }\r\n </div>\r\n <nz-image-group>\r\n <div class=\"img-grid\">\r\n @for (img of images(); track img.url) {\r\n <div class=\"img-card\">\r\n <div class=\"thumb\">\r\n @if(img.kind==='file'){\r\n <img nz-image [nzSrc]=\"img.url!\" [nzFallback]=\"'/images/placeholder.png'\" [nzPlaceholder]=\"'/images/placeholder.png'\" [alt]=\"img.name\" loading=\"lazy\" />\r\n }@else {\r\n <div class=\"dir\" title=\"目录\" (click)=\"openDir(img)\">\r\n <nz-icon nzType=\"folder\" nzTheme=\"fill\"></nz-icon>\r\n </div>\r\n }\r\n </div>\r\n <div class=\"meta\">\r\n <div class=\"name\">{{img.name}}</div>\r\n @if(img.kind === 'dir' && img.fileCount !== undefined){\r\n <div class=\"file-count\">共{{img.fileCount}} 张图片</div>\r\n }\r\n <!-- <button nz-button nzSize=\"small\" (click)=\"copy(img.url!)\">\r\n <nz-icon nzType=\"copy\"></nz-icon>\r\n 复制URL\r\n </button> -->\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </nz-image-group>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .wrap{ height:100%; min-height:0; overflow-y:auto; padding:12px; }\r\n .header{ display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:12px; }\r\n .header .count{ font-size:14px; opacity:.45; flex:0 0 auto; white-space:nowrap; }\r\n .dir-stack{ display:flex; align-items:center; gap:6px; margin-bottom:12px; flex-wrap:wrap; }\r\n .dir-item{ cursor: pointer; }\r\n .img-grid{\r\n display:grid;\r\n grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));\r\n gap: 12px;\r\n overflow:auto;\r\n padding-right: 4px;\r\n }\r\n .img-card{\r\n border: 1px solid rgba(255,255,255,.08);\r\n border-radius: 16px;\r\n overflow:hidden;\r\n background: rgba(255,255,255,.02);\r\n display:flex;\r\n flex-direction:column;\r\n }\r\n .thumb{ height: 160px; background: rgba(0,0,0,.18); display:flex; align-items:center; justify-content:center; user-select:none;}\r\n .thumb img{ max-width:100%; max-height:100%; object-fit:contain; cursor: pointer; }\r\n .thumb img:focus,.thumb:focus{outline:none}\r\n .thumb .dir{ color: rgba(255,255,255,.6); font-size:56px; cursor:pointer; }\r\n .meta{ padding: 10px; display:flex; align-items:center; justify-content:space-between; gap:10px; background: rgba(0,0,0,.04); }\r\n .name{ font-size:14px; opacity:.85; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }\r\n .file-count{ font-size:14px; opacity:.45;flex:0 0 auto; white-space:nowrap; }\r\n `]\r\n})\r\nexport class SpriteImagesPanelComponent implements OnInit, OnChanges {\r\n\r\n @Input() sprite: SpriteSnapshot | null = null;\r\n\r\n private api = inject(SpriteApiService);\r\n private clipboard = inject(Clipboard);\r\n private msg = inject(NzMessageService);\r\n private currentDir = signal<string>(''); // '' root\r\n dirStack: DirCrumb[] = [{ label: '根目录', dir: '' }]; // 记录当前路径,支持返回上级\r\n\r\n cachedImages = signal<SpriteBrowseEntry[]>([]);\r\n imagesCount = computed(() => this.images().filter(i => i.kind === 'file').length);\r\n keyword = signal<string>('');\r\n ngOnInit(): void {\r\n\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const sprite = changes['sprite'].currentValue as SpriteSnapshot | null;\r\n if (sprite) {\r\n this.dirStack = [{ label: '根目录', dir: '' }];\r\n this.loadImages(sprite.projectId);\r\n }\r\n }\r\n images = computed(() => {\r\n const kw = this.keyword().trim().toLowerCase();\r\n if (!kw) {\r\n return this.cachedImages();\r\n }\r\n else {\r\n return this.cachedImages().filter(i => i.name.toLowerCase().includes(kw));\r\n }\r\n })\r\n\r\n private loadImages(projectId: string, dir: string = '') {\r\n this.keyword.set('');\r\n this.currentDir.set(dir);\r\n this.api.browseImages(projectId, dir)\r\n .subscribe(res => {\r\n this.cachedImages.set(res.entries);\r\n });\r\n }\r\n\r\n loadDir(crumb: DirCrumb) {\r\n if (!this.sprite?.projectId) return;\r\n // 找到点击的 crumb 索引,截断到该层\r\n const idx = this.dirStack.findIndex(x => x.dir === crumb.dir);\r\n if (idx >= 0) this.dirStack = this.dirStack.slice(0, idx + 1);\r\n this.loadImages(this.sprite.projectId, crumb.dir);\r\n }\r\n\r\n openDir(entry: SpriteBrowseEntry) {\r\n if (!this.sprite?.projectId) return;\r\n if (entry.kind !== 'dir') return;\r\n\r\n const name = String(entry.name ?? '').trim();\r\n if (!name) return;\r\n\r\n const base = this.currentDir();\r\n const nextDir = base ? `${base}/${name}` : name;\r\n // push crumb(避免重复 push 同一个)\r\n this.dirStack = [...this.dirStack, { label: name, dir: nextDir }];\r\n\r\n this.loadImages(this.sprite.projectId, nextDir);\r\n }\r\n\r\n copy(url: string) {\r\n this.clipboard.copy(url);\r\n this.msg.success(\"已复制图片 URL\");\r\n }\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, inject, signal } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ProjectAssets, ProjectAssetSourceSvn } from '@models/project.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzCardModule } from 'ng-zorro-antd/card';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NZ_MODAL_DATA, NzModalModule, NzModalRef, NzModalService } from 'ng-zorro-antd/modal';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzStepsModule } from 'ng-zorro-antd/steps';\r\nimport { StepAdvanceComponent, StepBasicComponent, StepSummaryAsideComponent } from './components';\r\nimport { SpriteDraft } from './models/sprite-draft.model';\r\nimport { SpriteStateService } from './services/sprite-state.service';\r\nimport { SpriteConfig } from '@models/sprite.model';\r\nimport { UiNotifierService } from '@app/core';\r\n\r\n@Component({\r\n selector: 'app-sprite-conf-modal',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzModalModule,\r\n NzCardModule,\r\n NzGridModule,\r\n NzStepsModule,\r\n NzButtonModule,\r\n NzInputModule,\r\n NzIconModule,\r\n NzSpinModule,\r\n StepBasicComponent,\r\n StepAdvanceComponent,\r\n StepSummaryAsideComponent,\r\n ],\r\n template: `\r\n <div nz-row nzJustify=\"center\" >\r\n <div nz-col nzSpan=\"16\">\r\n <nz-steps [nzCurrent]=\"step()\">\r\n <nz-step nzTitle=\"详情\"></nz-step>\r\n <nz-step nzTitle=\"配置\"></nz-step>\r\n </nz-steps>\r\n </div>\r\n </div>\r\n <div nz-row nzJustify=\"start\" >\r\n <div nz-col nzSpan=\"24\">\r\n <nz-spin [nzSpinning]=\"creating()\">\r\n <div class=\"content\">\r\n <div class=\"main\">\r\n @switch(step()){ @case(0){\r\n <app-step-basic [draft]=\"draft()\" />\r\n } @case(1){\r\n <app-step-advance [draft]=\"draft()\" />\r\n }\r\n }\r\n <div class=\"actions\">\r\n @if(step()===0){\r\n <button nz-button (click)=\"cancel()\">\r\n <nz-icon nzType=\"close\" nzTheme=\"outline\" />\r\n 取消\r\n </button>\r\n }\r\n @if(step() > 0){\r\n <button nz-button (click)=\"prev()\">\r\n <nz-icon nzType=\"arrow-left\" nzTheme=\"outline\" />\r\n 上一步\r\n </button>\r\n }\r\n @if(canCreateHere()){\r\n <button nz-button nzType=\"primary\" (click)=\"create()\" >\r\n <nz-icon nzType=\"check\" nzTheme=\"outline\" />\r\n 确定\r\n </button>\r\n } @else {\r\n <button nz-button nzType=\"primary\" (click)=\"next()\" [disabled]=\"!canNext() \">\r\n 下一步\r\n <nz-icon nzType=\"arrow-right\" nzTheme=\"outline\" />\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"aside\">\r\n <app-step-summary-aside [draft]=\"draft()\" />\r\n </div>\r\n </div>\r\n </nz-spin>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .content {\r\n display: grid;\r\n grid-template-columns: 1fr 360px;\r\n gap: 16px;\r\n margin-top: 16px;\r\n }\r\n\r\n .main {\r\n min-height: 420px;\r\n }\r\n\r\n .actions {\r\n display: flex;\r\n gap: 8px;\r\n justify-content: flex-end;\r\n margin-top: 18px;\r\n }\r\n\r\n .aside {\r\n position: sticky;\r\n top: 16px;\r\n height: fit-content;\r\n }\r\n `\r\n ],\r\n})\r\nexport class SpriteConfModalComponent {\r\n step = signal(0);\r\n creating = signal(false);\r\n draft = signal<SpriteDraft>({ name: '', iconSvnPath: '', otherImagesSvnPath: '', localDir: '' });\r\n readonly nzModalData = inject<{ cfg: SpriteConfig }>(NZ_MODAL_DATA);\r\n readonly modalRef = inject(NzModalRef);\r\n private modal = inject(NzModalService);\r\n private state = inject(SpriteStateService);\r\n private notify = inject(UiNotifierService);\r\n constructor() {\r\n const p = this.state.project();\r\n if (p) {\r\n const iconsRepoUrl = p.assets?.iconsSvn?.url || '';\r\n const sourceId = p.assets?.iconsSvn?.id || '';\r\n const otherImageUrl = p.assets?.cutImageSvn?.url || '';\r\n const cfg = this.nzModalData.cfg;\r\n this.draft.update((d) => {\r\n d.name = p.name;\r\n d.sourceId = sourceId;\r\n d.iconSvnPath = iconsRepoUrl;\r\n d.otherImagesSvnPath = otherImageUrl;\r\n d.localDir = cfg?.localDir || '';\r\n d.cssPrefix = cfg?.prefix || 'sl';\r\n d.spriteUrl = cfg?.spriteUrl || '/assets/icons/{group}.png';\r\n d.template = cfg?.template || '<i class=\"{base} {class}\"></i>';\r\n d.spriteExportDir = cfg?.spriteExportDir || '';\r\n d.lessExportDir = cfg?.lessExportDir || '';\r\n return d;\r\n });\r\n }\r\n }\r\n canNext() {\r\n const s = this.step();\r\n const d = this.draft();\r\n if (s === 0) {\r\n if (!d.iconSvnPath?.trim()) return false;\r\n return true;\r\n }\r\n return true;\r\n }\r\n\r\n next() {\r\n this.step.update((s) => s + 1);\r\n }\r\n\r\n prev() {\r\n this.step.update((s) => s - 1);\r\n }\r\n\r\n canCreateHere() {\r\n return this.step() === 1;\r\n }\r\n\r\n async create() {\r\n if (this.creating()) return;\r\n this.creating.set(true);\r\n const d = this.draft();\r\n const assets: ProjectAssets = {\r\n iconsSvn: { kind: 'svn', url: d.iconSvnPath, label: 'icons', mode: 'manual', localDir: d.localDir, id: d.sourceId },\r\n };\r\n if (d.otherImagesSvnPath) {\r\n const cutImageId = this.state.project()?.assets?.cutImageSvn?.id || '';\r\n assets.cutImageSvn = { kind: 'svn', url: d.otherImagesSvnPath, label: 'images', mode: 'manual', localDir: d.localDir, id: cutImageId };\r\n }\r\n const nextCfg: Omit<SpriteConfig, \"projectId\" | \"updatedAt\"> = {\r\n enabled: true,\r\n persistLess: true,\r\n localDir: d.localDir,\r\n template: d.template || '<i class=\"{base} {class}\"></i>',\r\n prefix: d.cssPrefix || 'sl',\r\n sourceId: d.sourceId || '',\r\n spriteUrl: d.spriteUrl || '/assets/icons/{group}.png',\r\n algorithm: 'binary-tree',\r\n spriteExportDir: d.spriteExportDir || '',\r\n lessExportDir: d.lessExportDir || '',\r\n }\r\n\r\n const cfg = await this.state.createConfig(assets, nextCfg);\r\n this.creating.set(false);\r\n this.notify.success(\"配置已保存\");\r\n this.modalRef.close({ ok: true, cfg });\r\n }\r\n\r\n cancel() {\r\n this.modalRef.close();\r\n // this.modal.confirm({\r\n // nzTitle: '取消',\r\n // nzContent: '暂未保存,确定要取消吗',\r\n // nzOkDanger: true,\r\n // nzOkText: '是',\r\n // nzCancelText: '否',\r\n // nzCentered: true,\r\n // nzOnOk: () => {\r\n // this.modalRef.close();\r\n // }\r\n // })\r\n }\r\n}\r\n","/* angular:styles/component:less;401419e42ea612974332f37ae64f79232bb6823bf87868ff3fbbd15fae67b438;D:\\ng-manager\\webapp\\src\\app\\pages\\sprite\\sprite-result-tabs.component.ts */\n:host {\n display: block;\n height: 100%;\n}\n:host nz-tabs {\n height: 100%;\n}\n:host nz-tabs::ng-deep .ant-tabs-content-holder {\n height: 100%;\n}\n:host nz-tabs::ng-deep .ant-tabs-content-holder .ant-tabs-content {\n height: 100%;\n}\n:host nz-tabs::ng-deep .ant-tabs-content-holder .ant-tabs-content .ant-tabs-tabpane {\n height: 100%;\n}\n/*# sourceMappingURL=sprite-result-tabs.component.css.map */\n","import { CommonModule } from '@angular/common';\r\nimport { Component, input } from '@angular/core';\r\nimport { SpriteSnapshot } from '@models/sprite.model';\r\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\r\nimport { NzSelectModule } from 'ng-zorro-antd/select';\r\nimport { NzTabsModule } from 'ng-zorro-antd/tabs';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { SpriteIconsPanelComponent, SpriteImagesPanelComponent } from './components';\r\n\r\n@Component({\r\n selector: 'app-sprite-result-tabs',\r\n imports: [\r\n CommonModule,\r\n NzTabsModule,\r\n NzEmptyModule,\r\n NzSelectModule,\r\n NzTagModule,\r\n SpriteImagesPanelComponent,\r\n SpriteIconsPanelComponent\r\n ],\r\n template: `\r\n <!-- @if(!gen){\r\n <nz-empty nzNotFoundContent=\"请先生成雪碧图\"></nz-empty>\r\n } @else { -->\r\n <nz-tabs [(nzSelectedIndex)]=\"tabIndex\">\r\n <nz-tab nzTitle=\"图标\">\r\n <ng-template nz-tab>\r\n <app-sprite-icons-panel\r\n [sprite]=\"sprite()\"\r\n />\r\n </ng-template>\r\n </nz-tab>\r\n\r\n <nz-tab nzTitle=\"图片\">\r\n <ng-template nz-tab>\r\n <app-sprite-images-panel [sprite]=\"sprite()\"\r\n />\r\n </ng-template>\r\n </nz-tab> \r\n </nz-tabs>\r\n <!-- } -->\r\n `,\r\n styles: [\r\n `\r\n :host{\r\n display: block;\r\n height: 100%;\r\n nz-tabs{\r\n height: 100%;\r\n &::ng-deep .ant-tabs-content-holder{\r\n height: 100%;\r\n .ant-tabs-content{\r\n height: 100%;\r\n .ant-tabs-tabpane{\r\n height: 100%;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n `\r\n ],\r\n})\r\nexport class SpriteResultTabsComponent {\r\n sprite = input<SpriteSnapshot | null>(null);\r\n tabIndex = 0;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, computed, inject, OnDestroy, OnInit, signal, ViewChild } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { PageLayoutComponent, TerminalViewComponent } from '@app/shared';\r\nimport { SpriteConfig, SpriteSnapshot, } from '@models/sprite.model';\r\nimport { NzButtonModule } from 'ng-zorro-antd/button';\r\nimport { NzDividerModule } from 'ng-zorro-antd/divider';\r\nimport { NzDrawerModule } from 'ng-zorro-antd/drawer';\r\nimport { NzEmptyModule } from 'ng-zorro-antd/empty';\r\nimport { NzGridModule } from 'ng-zorro-antd/grid';\r\nimport { NzIconModule } from 'ng-zorro-antd/icon';\r\nimport { NzInputModule } from 'ng-zorro-antd/input';\r\nimport { NzModalService } from 'ng-zorro-antd/modal';\r\nimport { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm';\r\nimport { NzPopoverModule } from 'ng-zorro-antd/popover';\r\nimport { NzSpinModule } from 'ng-zorro-antd/spin';\r\nimport { NzTagModule } from 'ng-zorro-antd/tag';\r\nimport { NzTooltipModule } from 'ng-zorro-antd/tooltip';\r\nimport { Subscription } from 'rxjs';\r\nimport { SpriteStateService } from './services/sprite-state.service';\r\nimport { SpriteStreamService } from './services/sprite-stream.service';\r\nimport { SpriteConfModalComponent } from './sprite-conf-modal.component';\r\nimport { SpriteResultTabsComponent } from './sprite-result-tabs.component';\r\nimport dayjs from 'dayjs';\r\n\r\n@Component({\r\n selector: 'app-sprite',\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n NzGridModule,\r\n NzButtonModule,\r\n NzInputModule,\r\n NzIconModule,\r\n NzTooltipModule,\r\n NzTagModule,\r\n NzSpinModule,\r\n NzDividerModule,\r\n NzPopconfirmModule,\r\n NzPopoverModule,\r\n PageLayoutComponent,\r\n NzEmptyModule,\r\n NzDrawerModule,\r\n TerminalViewComponent,\r\n SpriteResultTabsComponent,\r\n ],\r\n template: `\r\n <app-page-layout [title]=\"'雪碧图'\" [loading]=\"loading()\" [isFullscreen]=\"true\" [isOverflowYAuto]=\"false\">\r\n <ng-container ngProjectAs=\"actions\">\r\n @if(!isEmpty()){\r\n <button nz-button nzType=\"primary\" (click)=\"generate()\" nz-tooltip nzTooltipTitle=\"生成雪碧图\">\r\n <nz-icon nzType=\"play-circle\" nzTheme=\"outline\"></nz-icon>\r\n <span>生成雪碧图</span>\r\n </button>\r\n <button nz-button nzType=\"primary\" (click)=\"streamCheckout()\" nz-tooltip nzTooltipTitle=\"从svn更新资源\">\r\n <nz-icon nzType=\"sync\" nzTheme=\"outline\"></nz-icon>\r\n <span>同步 {{lastSyncAt()}}</span>\r\n </button>\r\n }\r\n <button nz-button nzType=\"text\" (click)=\"isDrawerOpen = !isDrawerOpen\" nz-tooltip nzTooltipTitle=\"查看日志\">\r\n <nz-icon nzType=\"desktop\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n <button nz-button nzType=\"text\" (click)=\"openSettingModal()\" nz-tooltip nzTooltipTitle=\"配置雪碧图\">\r\n <nz-icon nzType=\"setting\" nzTheme=\"outline\"></nz-icon>\r\n </button>\r\n </ng-container>\r\n <div class=\"page\">\r\n <div class=\"content\" [class.empty]=\"isEmpty()\">\r\n @if(isEmpty()){\r\n <nz-empty \r\n [nzNotFoundContent]=\"contentTpl\"\r\n [nzNotFoundFooter]=\"footerTpl\">\r\n </nz-empty>\r\n }@else{\r\n <app-sprite-result-tabs [sprite]=\"sprite()\"></app-sprite-result-tabs>\r\n }\r\n\r\n </div>\r\n <div class=\"aside\" [class.open]=\"isDrawerOpen\">\r\n <app-terminal-view [style.height.%]=\"100\"></app-terminal-view>\r\n </div>\r\n </div>\r\n </app-page-layout>\r\n <ng-template #contentTpl>\r\n <span>暂无雪碧图配置,点击右上角“<nz-icon nzType=\"setting\" nzTheme=\"outline\"></nz-icon>” 新增配置</span>\r\n </ng-template>\r\n <ng-template #footerTpl>\r\n <button nz-button nzType=\"primary\" (click)=\"openSettingModal()\">立即新增</button>\r\n </ng-template>\r\n `,\r\n styles: [\r\n `\r\n .page{\r\n height: 100%;\r\n display: flex;\r\n flex-direction: row;\r\n overflow: hidden;\r\n gap: 16px;\r\n padding:0 16px;\r\n }\r\n .content {\r\n flex: 1 1 auto;\r\n width: 0;\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n .content.empty {\r\n justify-content: center;\r\n }\r\n .aside {\r\n width: 0;\r\n flex: 0 0 auto;\r\n height: 100%;\r\n padding: 16px;\r\n background: #000;\r\n transition: transform 0.2s ease;\r\n transform: translateX(150%);\r\n }\r\n .aside.open {\r\n width: 400px;\r\n transform: translateX(0);\r\n }\r\n `\r\n ],\r\n})\r\nexport class SpriteComponent implements OnInit, OnDestroy {\r\n isDrawerOpen = false\r\n loading = signal(false);\r\n cfg = signal<SpriteConfig | null>(null);\r\n lastSyncAt = signal<string>('N/A');\r\n private sub = new Subscription();\r\n private state = inject(SpriteStateService);\r\n private modal = inject(NzModalService);\r\n private svnStream = inject(SpriteStreamService);\r\n @ViewChild(TerminalViewComponent) term?: TerminalViewComponent;\r\n sprite = signal<SpriteSnapshot | null>(null);\r\n async ngOnInit() {\r\n await this.loadConfig();\r\n if (this.isEmpty()) return;\r\n const projectId = this.state.project()?.id;\r\n if (!projectId) return;\r\n const runtimes = await this.state.getSvnRuntimes();\r\n if (runtimes?.length) {\r\n runtimes.forEach(runtime => {\r\n const lastSyncAt = runtime.lastSyncAt ? dayjs(runtime.lastSyncAt).format('YYYY-MM-DD HH:mm:ss') : 'N/A';\r\n const lastStatus = runtime.lastStderr ? '失败' : '成功';\r\n const desiredUrl = runtime.desiredUrl ? `${runtime.desiredUrl}` : 'No desired URL';\r\n this.term?.writeln(`[更新时间]: ${lastSyncAt}`);\r\n this.term?.writeln(`[更新状态]: ${lastStatus}`);\r\n this.term?.writeln(`[SVN 路径]: ${desiredUrl}`);\r\n this.term?.writeln(`-----------------------------`);\r\n // 雪碧图匹配\r\n if (runtime.sourceId === this.cfg()?.sourceId && runtime.lastSyncAt) {\r\n this.lastSyncAt.set(dayjs(runtime.lastSyncAt).format('YYYY-MM-DD HH:mm:ss'));\r\n }\r\n })\r\n }\r\n const sprite = await this.state.getSprites();\r\n this.sprite.set(sprite);\r\n\r\n this.sub.add(this.svnStream.watchProject(projectId, 1000));\r\n // this.sub.add(\r\n // this.svnStream.runtimes$(projectId).subscribe(list => {\r\n // console.log('SVN Runtimes updated:', list);\r\n // })\r\n // );\r\n this.sub.add(this.svnStream.output$(projectId).subscribe(chunk => {\r\n if (this.term) {\r\n this.term.write(chunk.text);\r\n }\r\n }));\r\n }\r\n ngOnDestroy(): void {\r\n if (this.term) {\r\n this.term.clear();\r\n }\r\n this.sub.unsubscribe();\r\n }\r\n isEmpty = computed(() => {\r\n const cfg = this.cfg();\r\n const p = this.state.project();\r\n return (cfg && p?.assets?.iconsSvn || cfg?.sourceId) ? false : true;\r\n });\r\n\r\n private async loadConfig() {\r\n try {\r\n this.loading.set(true);\r\n const cfg = await this.state.loadConfig();\r\n this.cfg.set(cfg);\r\n this.loading.set(false);\r\n } catch (e) {\r\n this.loading.set(false);\r\n }\r\n }\r\n\r\n async generate() {\r\n this.loading.set(true);\r\n const sprite = await this.state.generate();\r\n this.sprite.set(sprite);\r\n this.loading.set(false);\r\n }\r\n\r\n async checkout() {\r\n this.loading.set(true);\r\n const results = await this.state.checkout()\r\n // console.log('SVN Sync Results:', results);\r\n this.loading.set(false);\r\n }\r\n\r\n async streamCheckout() {\r\n this.loading.set(true);\r\n this.isDrawerOpen = true\r\n await this.state.streamCheckout();\r\n this.loading.set(false);\r\n }\r\n\r\n openSettingModal() {\r\n const modal = this.modal.create({\r\n nzTitle: '雪碧图配置',\r\n nzFooter: null,\r\n nzKeyboard: false,\r\n nzMaskClosable: false,\r\n nzClosable: true,\r\n nzContent: SpriteConfModalComponent,\r\n nzData: {\r\n cfg: this.cfg(),\r\n },\r\n nzWidth: '1020px',\r\n nzCentered: true,\r\n })\r\n\r\n const instance = modal.getContentComponent();\r\n modal.afterClose.subscribe((data) => {\r\n if (data?.ok) {\r\n // 创建成功\r\n this.loadConfig();\r\n }\r\n })\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { SpriteComponent } from './sprite.component';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '', component: SpriteComponent\r\n }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class SpriteRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { SpriteRoutingModule } from './sprite-routing.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n SpriteRoutingModule\r\n ]\r\n})\r\nexport class SpriteModule { }\r\n"],"mappings":"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","names":["t","e","n","r","i","s","u","a","M","m","f","l","$","y","v","g","D","o","d","c","h","SpriteApiService","SpriteStateService","SpriteStreamService","StepBasicComponent","StepAdvanceComponent","StepSummaryAsideComponent","LessViewportComponent","SpriteViewportComponent","SpriteIconsPanelComponent","SpriteImagesPanelComponent","SpriteConfModalComponent","SpriteResultTabsComponent","SpriteComponent","dayjs","SpriteRoutingModule","SpriteModule"],"x_google_ignoreList":[0]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=chunk-ULOHDK7Y.js.map
|