@widgetic/editor 3.11.4 → 4.0.2
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/README.md +245 -0
- package/dist/assets/fonts.json +331 -0
- package/dist/assets/icons/ic-browser/audio.svg +7 -0
- package/dist/assets/icons/ic-browser/document.svg +11 -0
- package/dist/assets/icons/ic-browser/error.svg +5 -0
- package/dist/assets/icons/ic-browser/folder.svg +28 -0
- package/dist/assets/icons/ic-browser/player-pause.svg +1 -0
- package/dist/assets/icons/ic-browser/player-play.svg +1 -0
- package/dist/assets/icons/ic-browser/trash.svg +1 -0
- package/dist/assets/icons/ic-fixed-position/background-deselected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/background-selected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/bottom-left-background-deselected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/bottom-left-background-selected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/bottom-left-icon.svg +4 -0
- package/dist/assets/icons/ic-fixed-position/bottom-right-background-deselected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/bottom-right-background-selected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/bottom-right-icon.svg +4 -0
- package/dist/assets/icons/ic-fixed-position/center-bottom-icon.svg +5 -0
- package/dist/assets/icons/ic-fixed-position/center-center-icon.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/center-left-icon.svg +5 -0
- package/dist/assets/icons/ic-fixed-position/center-right-icon.svg +5 -0
- package/dist/assets/icons/ic-fixed-position/center-top-icon.svg +5 -0
- package/dist/assets/icons/ic-fixed-position/top-left-background-deselected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/top-left-background-selected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/top-left-icon.svg +4 -0
- package/dist/assets/icons/ic-fixed-position/top-right-background-deselected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/top-right-background-selected.svg +3 -0
- package/dist/assets/icons/ic-fixed-position/top-right-icon.svg +4 -0
- package/dist/assets/icons/trash.svg +1 -0
- package/dist/components/MockWidget.svelte +108 -0
- package/dist/components/MockWidget.svelte.d.ts +22 -0
- package/dist/components/WidgetPreview.svelte +852 -0
- package/dist/components/WidgetPreview.svelte.d.ts +100 -0
- package/dist/components/color-select/ColorSelect.svelte +258 -0
- package/dist/components/color-select/ColorSelect.svelte.d.ts +42 -0
- package/dist/components/color-select/color.d.ts +25 -0
- package/dist/components/color-select/color.js +21 -0
- package/dist/components/color-select/constants.d.ts +5 -0
- package/dist/components/color-select/constants.js +5 -0
- package/dist/components/color-select/render.d.ts +5 -0
- package/dist/components/color-select/render.js +77 -0
- package/dist/components/color-select/shaders.d.ts +3 -0
- package/dist/components/color-select/shaders.js +8 -0
- package/dist/components/editors/EmbedEditor.svelte +700 -0
- package/dist/components/editors/EmbedEditor.svelte.d.ts +50 -0
- package/dist/components/editors/PropsEditor.svelte +4009 -0
- package/dist/components/editors/PropsEditor.svelte.d.ts +62 -0
- package/dist/components/editors/props-editor.css +73 -0
- package/dist/components/ic/AngleInputController.svelte +276 -0
- package/dist/components/ic/AngleInputController.svelte.d.ts +26 -0
- package/dist/components/ic/BrowserInputController.svelte +731 -0
- package/dist/components/ic/BrowserInputController.svelte.d.ts +39 -0
- package/dist/components/ic/CheckboxInputController.svelte +203 -0
- package/dist/components/ic/CheckboxInputController.svelte.d.ts +41 -0
- package/dist/components/ic/ColorPickerInputController.svelte +1584 -0
- package/dist/components/ic/ColorPickerInputController.svelte.d.ts +50 -0
- package/dist/components/ic/DateFieldInputController.svelte +453 -0
- package/dist/components/ic/DateFieldInputController.svelte.d.ts +35 -0
- package/dist/components/ic/DatePickerInputController.svelte +364 -0
- package/dist/components/ic/DatePickerInputController.svelte.d.ts +28 -0
- package/dist/components/ic/DropdownInputController.svelte +226 -0
- package/dist/components/ic/DropdownInputController.svelte.d.ts +43 -0
- package/dist/components/ic/FixedPositionInputController.svelte +353 -0
- package/dist/components/ic/FixedPositionInputController.svelte.d.ts +23 -0
- package/dist/components/ic/FontInputController.svelte +2098 -0
- package/dist/components/ic/FontInputController.svelte.d.ts +47 -0
- package/dist/components/ic/InputControllerHeader.svelte +147 -0
- package/dist/components/ic/InputControllerHeader.svelte.d.ts +23 -0
- package/dist/components/ic/NumberControls.svelte +299 -0
- package/dist/components/ic/NumberControls.svelte.d.ts +30 -0
- package/dist/components/ic/NumberInputController.svelte +397 -0
- package/dist/components/ic/NumberInputController.svelte.d.ts +30 -0
- package/dist/components/ic/PositionInputController.svelte +252 -0
- package/dist/components/ic/PositionInputController.svelte.d.ts +37 -0
- package/dist/components/ic/RadioGroupInputController.svelte +162 -0
- package/dist/components/ic/RadioGroupInputController.svelte.d.ts +38 -0
- package/dist/components/ic/RangeCalendarInputController.svelte +262 -0
- package/dist/components/ic/RangeCalendarInputController.svelte.d.ts +32 -0
- package/dist/components/ic/RoundedCornersInputController.svelte +469 -0
- package/dist/components/ic/RoundedCornersInputController.svelte.d.ts +37 -0
- package/dist/components/ic/SliderInputController.svelte +411 -0
- package/dist/components/ic/SliderInputController.svelte.d.ts +46 -0
- package/dist/components/ic/SliderRangeInputController.svelte +155 -0
- package/dist/components/ic/SliderRangeInputController.svelte.d.ts +33 -0
- package/dist/components/ic/SwitchInputController.svelte +107 -0
- package/dist/components/ic/SwitchInputController.svelte.d.ts +24 -0
- package/dist/components/ic/TagsInputController.svelte +125 -0
- package/dist/components/ic/TagsInputController.svelte.d.ts +27 -0
- package/dist/components/ic/TextAreaInputController.svelte +1932 -0
- package/dist/components/ic/TextAreaInputController.svelte.d.ts +14 -0
- package/dist/components/ic/TextAreaPreviewInputController.svelte +478 -0
- package/dist/components/ic/TextAreaPreviewInputController.svelte.d.ts +28 -0
- package/dist/components/ic/TextInputController.svelte +70 -0
- package/dist/components/ic/TextInputController.svelte.d.ts +30 -0
- package/dist/components/ic/TimeInputController.svelte +434 -0
- package/dist/components/ic/TimeInputController.svelte.d.ts +25 -0
- package/dist/components/ic/VectorInputController.svelte +1826 -0
- package/dist/components/ic/VectorInputController.svelte.d.ts +47 -0
- package/dist/components/ic/index.d.ts +39 -0
- package/dist/components/ic/index.js +24 -0
- package/dist/components/ic/shared/CategoryTabs.svelte +40 -0
- package/dist/components/ic/shared/CategoryTabs.svelte.d.ts +25 -0
- package/dist/components/ic/shared/ItemGrid.svelte +181 -0
- package/dist/components/ic/shared/ItemGrid.svelte.d.ts +35 -0
- package/dist/components/ic/shared/RecentItemsSection.svelte +260 -0
- package/dist/components/ic/shared/RecentItemsSection.svelte.d.ts +35 -0
- package/dist/components/ic/shared/index.d.ts +8 -0
- package/dist/components/ic/shared/index.js +9 -0
- package/dist/components/icons/addnew.svelte +21 -0
- package/dist/components/icons/addnew.svelte.d.ts +20 -0
- package/dist/components/icons/drag.svelte +29 -0
- package/dist/components/icons/drag.svelte.d.ts +20 -0
- package/dist/components/icons/drag.svg +1 -0
- package/dist/components/icons/locked.svelte +4 -0
- package/dist/components/icons/locked.svelte.d.ts +26 -0
- package/dist/components/icons/locked.svg +4 -0
- package/dist/components/icons/ok.svelte +20 -0
- package/dist/components/icons/ok.svelte.d.ts +20 -0
- package/dist/components/icons/ok.svg +11 -0
- package/dist/components/icons/unlocked.svelte +4 -0
- package/dist/components/icons/unlocked.svelte.d.ts +26 -0
- package/dist/components/icons/unlocked.svg +4 -0
- package/dist/components/icons/x.svelte +14 -0
- package/dist/components/icons/x.svelte.d.ts +20 -0
- package/dist/components/icons/x.svg +5 -0
- package/dist/components/ui/arrows/OpacitySliderArrows.svelte +43 -0
- package/dist/components/ui/arrows/OpacitySliderArrows.svelte.d.ts +23 -0
- package/dist/components/ui/checkerboard-background/CheckerboardBackground.svelte +15 -0
- package/dist/components/ui/checkerboard-background/CheckerboardBackground.svelte.d.ts +20 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +31 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +9 -0
- package/dist/stores/userSession.d.ts +7 -0
- package/dist/stores/userSession.js +28 -0
- package/dist/utils/FontManager.d.ts +278 -0
- package/dist/utils/FontManager.js +1302 -0
- package/dist/utils/MediaManager.d.ts +35 -0
- package/dist/utils/MediaManager.js +59 -0
- package/dist/utils/VectorManager.d.ts +190 -0
- package/dist/utils/VectorManager.js +754 -0
- package/dist/utils/colorAutocomplete.d.ts +10 -0
- package/dist/utils/colorAutocomplete.js +28 -0
- package/dist/utils/colorNames.d.ts +3 -0
- package/dist/utils/colorNames.js +152 -0
- package/dist/utils/colorTransparency.d.ts +52 -0
- package/dist/utils/colorTransparency.js +114 -0
- package/dist/utils/fontUtils.d.ts +34 -0
- package/dist/utils/fontUtils.js +132 -0
- package/dist/utils/passiveEvents.js +20 -0
- package/dist/utils/recentColors.d.ts +10 -0
- package/dist/utils/recentColors.js +63 -0
- package/dist/utils/skipFonts.d.ts +3 -0
- package/dist/utils/skipFonts.js +49 -0
- package/dist/utils/vectorUtils.d.ts +34 -0
- package/dist/utils/vectorUtils.js +71 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.js +38 -0
- package/package.json +134 -74
- package/.babelrc +0 -10
- package/.bowerrc +0 -4
- package/.nvmrc +0 -1
- package/Gruntfile.coffee +0 -69
- package/bower.json +0 -28
- package/css/browser/entries/activateable.styl +0 -29
- package/css/browser/entries/audio.styl +0 -39
- package/css/browser/entries/folder.styl +0 -79
- package/css/browser/entries/image.styl +0 -26
- package/css/browser/entries/index.styl +0 -66
- package/css/browser/entries/rss.styl +0 -11
- package/css/browser/entries/video.styl +0 -11
- package/css/browser/index.styl +0 -86
- package/css/browser/intent/index.styl +0 -61
- package/css/browser/nav/index.styl +0 -73
- package/css/browser/social-browser.styl +0 -23
- package/css/controls/clock.styl +0 -110
- package/css/controls/config.styl +0 -6
- package/css/controls/control-audio-details.styl +0 -63
- package/css/controls/control-audio.styl +0 -28
- package/css/controls/control-browser.styl +0 -48
- package/css/controls/control-color.styl +0 -423
- package/css/controls/control-date_time.styl +0 -191
- package/css/controls/control-dropdown.styl +0 -79
- package/css/controls/control-font.styl +0 -147
- package/css/controls/control-image-details.styl +0 -35
- package/css/controls/control-image.styl +0 -43
- package/css/controls/control-order-picker.styl +0 -29
- package/css/controls/control-position.styl +0 -390
- package/css/controls/control-range.styl +0 -68
- package/css/controls/control-scale.styl +0 -30
- package/css/controls/control-slider.styl +0 -38
- package/css/controls/control-spinner.styl +0 -39
- package/css/controls/control-textarea.styl +0 -52
- package/css/controls/control-toggle.styl +0 -34
- package/css/controls/control-url.styl +0 -32
- package/css/controls/control-video-details.styl +0 -85
- package/css/controls/control-video.styl +0 -43
- package/css/controls/general.styl +0 -98
- package/css/controls/index.styl +0 -25
- package/css/editor/colors.styl +0 -7
- package/css/editor/content/directinput.styl +0 -47
- package/css/editor/content/index.styl +0 -111
- package/css/editor/content/message.styl +0 -53
- package/css/editor/content/tabs.styl +0 -75
- package/css/editor/copied-from-old-style.styl +0 -197
- package/css/editor/details/bulk-editor.styl +0 -104
- package/css/editor/details/index.styl +0 -21
- package/css/editor/details/item.styl +0 -153
- package/css/editor/embed.styl +0 -106
- package/css/editor/footer.styl +0 -180
- package/css/editor/full-editor.styl +0 -16
- package/css/editor/index.styl +0 -124
- package/css/editor/login-popup.styl +0 -13
- package/css/editor/preview.styl +0 -257
- package/css/editor/skin/editor/index.styl +0 -54
- package/css/editor/skin/editor/tabs.styl +0 -111
- package/css/editor/skin/index.styl +0 -138
- package/css/editor/skin/popup.styl +0 -152
- package/css/editor/skin/presets/dropdown.styl +0 -61
- package/css/editor/skin/presets/index.styl +0 -86
- package/css/editor/skin/presets/list.styl +0 -244
- package/css/editor/tooltips.styl +0 -85
- package/css/fonts.styl +0 -47
- package/css/icons/BlogvioEditor.dev.svg +0 -112
- package/css/icons.styl +0 -16
- package/css/img/arrow-right-rounded-v-small.png +0 -0
- package/css/img/browser-folder-separator.png +0 -0
- package/css/img/calendar-input-icons.png +0 -0
- package/css/img/check.png +0 -0
- package/css/img/close.png +0 -0
- package/css/img/composition/edit-icon.png +0 -0
- package/css/img/content/audio-icon.png +0 -0
- package/css/img/content/folder-icon.png +0 -0
- package/css/img/content/messages/error-background.png +0 -0
- package/css/img/content/messages/error-icon.png +0 -0
- package/css/img/content/messages/notification-background.png +0 -0
- package/css/img/content/messages/notification-icon.png +0 -0
- package/css/img/content/no-files-audio.png +0 -0
- package/css/img/content/no-files-image.png +0 -0
- package/css/img/content/no-files-video.png +0 -0
- package/css/img/content/no-files.png +0 -0
- package/css/img/content/rss-icon.png +0 -0
- package/css/img/content/selected.png +0 -0
- package/css/img/content/video-icon.png +0 -0
- package/css/img/content/with-control-text.png +0 -0
- package/css/img/control-dropdown-arrow.png +0 -0
- package/css/img/control-image-valid.png +0 -0
- package/css/img/control-position-icon.png +0 -0
- package/css/img/control-scale-lock-icon.png +0 -0
- package/css/img/control-slider-arrows-hover.png +0 -0
- package/css/img/control-slider-arrows.png +0 -0
- package/css/img/control-spinner-buttons-hover.png +0 -0
- package/css/img/control-spinner-buttons.png +0 -0
- package/css/img/control-textarea-bold-active.png +0 -0
- package/css/img/control-textarea-bold.png +0 -0
- package/css/img/control-textarea-italic-active.png +0 -0
- package/css/img/control-textarea-italic.png +0 -0
- package/css/img/control-textarea-underline-active.png +0 -0
- package/css/img/control-textarea-underline.png +0 -0
- package/css/img/custom-checkbox-sprite.png +0 -0
- package/css/img/details/item-collapse-icon.png +0 -0
- package/css/img/details/item-expand-icon.png +0 -0
- package/css/img/details/item-sort-icon.png +0 -0
- package/css/img/done-arrow.png +0 -0
- package/css/img/fb-logo-icon-w.png +0 -0
- package/css/img/grid-icons.png +0 -0
- package/css/img/icon-reference.png +0 -0
- package/css/img/indicator.png +0 -0
- package/css/img/loader.gif +0 -0
- package/css/img/loaders/audio-white.png +0 -0
- package/css/img/loaders/audio.png +0 -0
- package/css/img/loaders/photo-white.png +0 -0
- package/css/img/loaders/photo.png +0 -0
- package/css/img/loaders/util-white.png +0 -0
- package/css/img/loaders/util.png +0 -0
- package/css/img/loaders/video-white.png +0 -0
- package/css/img/loaders/video.png +0 -0
- package/css/img/maximize.png +0 -0
- package/css/img/minimize.png +0 -0
- package/css/img/next-btn.png +0 -0
- package/css/img/search-icon-sprite.png +0 -0
- package/css/img/services/blogvio.png +0 -0
- package/css/img/services/drive.png +0 -0
- package/css/img/services/dropbox-login.png +0 -0
- package/css/img/services/dropbox.png +0 -0
- package/css/img/services/facebook-login.png +0 -0
- package/css/img/services/facebook.png +0 -0
- package/css/img/services/flickr-login.png +0 -0
- package/css/img/services/flickr.png +0 -0
- package/css/img/services/instagram-login.png +0 -0
- package/css/img/services/instagram.png +0 -0
- package/css/img/services/text.png +0 -0
- package/css/img/services/uploads.png +0 -0
- package/css/img/services/uploads.svg +0 -689
- package/css/img/services/webaddress-bw.png +0 -0
- package/css/img/services/webaddress.png +0 -0
- package/css/img/services/webadress.png +0 -0
- package/css/img/services/websearch.png +0 -0
- package/css/img/services/wix.png +0 -0
- package/css/img/skin/item-active-indicator.png +0 -0
- package/css/img/skin/item-hover-icon.png +0 -0
- package/css/img/skin/overwrite.png +0 -0
- package/css/img/skin/popup-name-icon.png +0 -0
- package/css/img/skin/popup-save.png +0 -0
- package/css/img/skin/preset.png +0 -0
- package/css/img/skin/presets-arrow-purple.png +0 -0
- package/css/img/tw-icon-w.png +0 -0
- package/css/img/warning.png +0 -0
- package/css/img/white-rounded-check.png +0 -0
- package/css/index.styl +0 -9
- package/css/mixins.styl +0 -62
- package/css/scrollable.styl +0 -101
- package/karma.conf.js +0 -73
- package/lib/control.js +0 -1
- package/lib/controls.js +0 -1
- package/lib/core.editor.js +0 -4
- package/lib/core.js +0 -1
- package/lib/core.vendor.js +0 -3
- package/lib/dev/control.js +0 -845
- package/lib/dev/controls.js +0 -7774
- package/lib/dev/core.editor.js +0 -6439
- package/lib/dev/core.js +0 -1486
- package/lib/dev/core.vendor.js +0 -10708
- package/lib/dev/editor.css +0 -166
- package/lib/dev/editor.js +0 -29710
- package/lib/dev/editor.vendor.js +0 -15119
- package/lib/dev/jquery.nanoscroller.js.map +0 -10
- package/lib/editor.css +0 -167
- package/lib/editor.js +0 -49
- package/lib/editor.vendor.js +0 -11
- package/src/api/index.coffee +0 -23
- package/src/api/mixin.coffee +0 -89
- package/src/browser/controller/entry/audio.coffee +0 -38
- package/src/browser/controller/entry/button.coffee +0 -16
- package/src/browser/controller/entry/file.coffee +0 -35
- package/src/browser/controller/entry/folder.coffee +0 -14
- package/src/browser/controller/entry/image.coffee +0 -24
- package/src/browser/controller/entry/index.coffee +0 -18
- package/src/browser/controller/entry/rss.coffee +0 -5
- package/src/browser/controller/entry/video.coffee +0 -4
- package/src/browser/controller/index.coffee +0 -289
- package/src/browser/controller/instagram.coffee +0 -129
- package/src/browser/controller/navbar.coffee +0 -48
- package/src/browser/controller/social.coffee +0 -213
- package/src/browser/model/entry.coffee +0 -18
- package/src/browser/model/index.coffee +0 -34
- package/src/core/controller/font-loader.coffee +0 -65
- package/src/core/controller/lazyload.coffee +0 -14
- package/src/core/controller/overlay.coffee +0 -146
- package/src/core/controller/popup.coffee +0 -36
- package/src/core/controller/scrollable.coffee +0 -68
- package/src/core/controls/audio.coffee +0 -56
- package/src/core/controls/browser.coffee +0 -271
- package/src/core/controls/color.coffee +0 -121
- package/src/core/controls/date-time/calendar/index.coffee +0 -99
- package/src/core/controls/date-time/calendar/months.coffee +0 -52
- package/src/core/controls/date-time/calendar/years.coffee +0 -58
- package/src/core/controls/date-time/clock.coffee +0 -62
- package/src/core/controls/date-time/helper.coffee +0 -31
- package/src/core/controls/date-time/index.coffee +0 -62
- package/src/core/controls/date-time/popup.coffee +0 -56
- package/src/core/controls/details/audio.coffee +0 -33
- package/src/core/controls/details/image.coffee +0 -19
- package/src/core/controls/details/video.coffee +0 -14
- package/src/core/controls/dropdown.coffee +0 -100
- package/src/core/controls/font/font-item.coffee +0 -22
- package/src/core/controls/font/font-list.coffee +0 -108
- package/src/core/controls/font/fonts-popup.coffee +0 -91
- package/src/core/controls/font/index.coffee +0 -66
- package/src/core/controls/image.coffee +0 -37
- package/src/core/controls/index.coffee +0 -88
- package/src/core/controls/orderPicker.coffee +0 -93
- package/src/core/controls/position/grid-panel.coffee +0 -75
- package/src/core/controls/position/index.coffee +0 -98
- package/src/core/controls/position/panel.coffee +0 -68
- package/src/core/controls/position/pixel-panel.coffee +0 -54
- package/src/core/controls/position/popup.coffee +0 -63
- package/src/core/controls/position/reference-panel.coffee +0 -26
- package/src/core/controls/range.coffee +0 -191
- package/src/core/controls/rss.coffee +0 -16
- package/src/core/controls/scale.coffee +0 -78
- package/src/core/controls/slider.coffee +0 -122
- package/src/core/controls/stepper.coffee +0 -97
- package/src/core/controls/text.coffee +0 -54
- package/src/core/controls/textarea.coffee +0 -78
- package/src/core/controls/toggle.coffee +0 -29
- package/src/core/controls/url.coffee +0 -88
- package/src/core/controls/video.coffee +0 -9
- package/src/core/embed/api.js +0 -178
- package/src/core/embed/controller.js +0 -331
- package/src/core/models/composition.coffee +0 -178
- package/src/core/models/content.coffee +0 -79
- package/src/core/models/skin.coffee +0 -91
- package/src/core/models/user.coffee +0 -6
- package/src/core/models/widget.coffee +0 -88
- package/src/core/router/index.coffee +0 -44
- package/src/core/services/container/index.js +0 -18
- package/src/core/services/container/instance.js +0 -3
- package/src/core/services/content.js +0 -80
- package/src/core/services/instagram.coffee +0 -47
- package/src/core/services/mixin/events.js +0 -17
- package/src/core/services/service.js +0 -1
- package/src/core/services/sounds.js +0 -81
- package/src/core/services/uploads.js +0 -299
- package/src/core/utils/popup.coffee +0 -67
- package/src/core/utils/should-show.coffee +0 -12
- package/src/core/views/audio-details.pug +0 -9
- package/src/core/views/audio.pug +0 -7
- package/src/core/views/browser.pug +0 -4
- package/src/core/views/color.pug +0 -8
- package/src/core/views/date-time/calendar.pug +0 -3
- package/src/core/views/date-time/clock.pug +0 -12
- package/src/core/views/date-time/grid.pug +0 -6
- package/src/core/views/date-time/input.pug +0 -4
- package/src/core/views/date-time/table.pug +0 -6
- package/src/core/views/dropdown.pug +0 -9
- package/src/core/views/font/font-item.pug +0 -3
- package/src/core/views/font/fonts-list.pug +0 -7
- package/src/core/views/font/fonts-popup.pug +0 -5
- package/src/core/views/font/index.pug +0 -7
- package/src/core/views/image-details.pug +0 -6
- package/src/core/views/image.pug +0 -5
- package/src/core/views/input-layout.pug +0 -15
- package/src/core/views/order-items.pug +0 -7
- package/src/core/views/order-picker.pug +0 -7
- package/src/core/views/pixelpanel.pug +0 -69
- package/src/core/views/position.pug +0 -10
- package/src/core/views/range.pug +0 -9
- package/src/core/views/scale.pug +0 -7
- package/src/core/views/slider.pug +0 -6
- package/src/core/views/stepper.pug +0 -6
- package/src/core/views/text.pug +0 -4
- package/src/core/views/textarea.pug +0 -8
- package/src/core/views/toggle.pug +0 -5
- package/src/core/views/video-details.pug +0 -7
- package/src/core/views/video.pug +0 -4
- package/src/core/widget/index.coffee +0 -66
- package/src/editor/content/browser/dropzone.html +0 -268
- package/src/editor/content/browser/file.html +0 -124
- package/src/editor/content/browser/scroll-pane.html +0 -32
- package/src/editor/content/browser/service.html +0 -53
- package/src/editor/content/browser/upload.coffee +0 -44
- package/src/editor/content/browser/upload.html +0 -439
- package/src/editor/content/index.coffee +0 -294
- package/src/editor/content/input/field.coffee +0 -45
- package/src/editor/content/input/index.coffee +0 -115
- package/src/editor/content/service/base/photoitem.coffee +0 -49
- package/src/editor/content/service/cache.coffee +0 -20
- package/src/editor/content/service/default.coffee +0 -59
- package/src/editor/content/service/dropbox.coffee +0 -71
- package/src/editor/content/service/facebook.coffee +0 -143
- package/src/editor/content/service/flickr.coffee +0 -85
- package/src/editor/content/service/google-drive-sdk.coffee +0 -18
- package/src/editor/content/service/google-drive.coffee +0 -144
- package/src/editor/content/service/instagram-social.coffee +0 -84
- package/src/editor/content/service/instagram.coffee +0 -168
- package/src/editor/content/service/share-popup.coffee +0 -15
- package/src/editor/content/service/soundcloud.coffee +0 -163
- package/src/editor/content/tab.coffee +0 -27
- package/src/editor/details/bulk-editor/attributes-panel.coffee +0 -11
- package/src/editor/details/bulk-editor/index.coffee +0 -86
- package/src/editor/details/index.coffee +0 -156
- package/src/editor/details/item/attributes.coffee +0 -45
- package/src/editor/details/item/index.coffee +0 -82
- package/src/editor/editor.coffee +0 -274
- package/src/editor/footer/breadcrumb.coffee +0 -17
- package/src/editor/footer/index.coffee +0 -36
- package/src/editor/index.coffee +0 -79
- package/src/editor/listeners/embed-listener.coffee +0 -143
- package/src/editor/login-popup.coffee +0 -29
- package/src/editor/notification-controller.coffee +0 -35
- package/src/editor/popup.coffee +0 -68
- package/src/editor/remote-preview.coffee +0 -68
- package/src/editor/save/index.coffee +0 -62
- package/src/editor/skin/delete.coffee +0 -33
- package/src/editor/skin/editor/index.coffee +0 -188
- package/src/editor/skin/editor/panel.coffee +0 -37
- package/src/editor/skin/index.coffee +0 -126
- package/src/editor/skin/save.coffee +0 -58
- package/src/editor/skin/selector/index.coffee +0 -59
- package/src/editor/skin/selector/item.coffee +0 -123
- package/src/editor/skin/selector/list.coffee +0 -97
- package/src/editor/views/embed.pug +0 -10
- package/src/editor/views/loginbutton.pug +0 -8
- package/src/editor/views/popup.pug +0 -17
- package/src/editor/views/presets.pug +0 -8
- package/src/editor/views/presetslist-header.pug +0 -8
- package/src/editor/views/skinitem.pug +0 -13
- package/src/modules/control.js +0 -3
- package/src/modules/controls.js +0 -29
- package/src/modules/core.js +0 -19
- package/src/modules/editor.js +0 -80
- package/test/config.js +0 -3
- package/test/core/models/skin-spec.js +0 -209
- package/webpack.config.js +0 -46
- package/webpack.config.prod.js +0 -9
- /package/{src/core/views/date-time/popup.pug → dist/utils/passiveEvents.d.ts} +0 -0
|
@@ -0,0 +1,754 @@
|
|
|
1
|
+
import { vectorUtils, vectorCategories } from "./vectorUtils";
|
|
2
|
+
class VectorManager {
|
|
3
|
+
// Debug configuration
|
|
4
|
+
static DEBUG_MODE = false;
|
|
5
|
+
static WAIT_TIME = VectorManager.DEBUG_MODE ? 2500 : 250;
|
|
6
|
+
// Singleton instance
|
|
7
|
+
static instance = null;
|
|
8
|
+
// Track loaded and pending vectors to prevent duplicates
|
|
9
|
+
loadedVectors = new Set();
|
|
10
|
+
// Map of intersection observers keyed by container ID
|
|
11
|
+
observers = new Map();
|
|
12
|
+
// Debounce timer for scroll events
|
|
13
|
+
scrollTimeout = null;
|
|
14
|
+
// Cache promise to prevent multiple simultaneous API calls
|
|
15
|
+
vectorListPromise = null;
|
|
16
|
+
initialVectorsLoaded = false;
|
|
17
|
+
allVectorsLoaded = false;
|
|
18
|
+
cachedVectorList = [];
|
|
19
|
+
// Cache configuration
|
|
20
|
+
static CACHE_KEY = 'svg_vectors_cache';
|
|
21
|
+
// Controls how long we keep the vector list in browser's localStorage
|
|
22
|
+
static CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours
|
|
23
|
+
static LOADED_VECTORS_KEY = 'loaded_vectors_cache';
|
|
24
|
+
// Controls how long browsers should cache the actual vector files
|
|
25
|
+
static CACHE_CONTROL = 'public, max-age=31536000'; // 1 year
|
|
26
|
+
// Add new property to store visible vectors
|
|
27
|
+
visibleVectors = new Set();
|
|
28
|
+
static initialPreloadComplete = false;
|
|
29
|
+
static preloadPromise = null;
|
|
30
|
+
completeVectorList = [];
|
|
31
|
+
// Add new property to track initialization
|
|
32
|
+
static isInitialized = false;
|
|
33
|
+
static initialVectorNumber = 8; // 8 - how many vectors to load initially
|
|
34
|
+
// Add a static property to track initialization state
|
|
35
|
+
static initializationPromise = null;
|
|
36
|
+
// Add this property
|
|
37
|
+
remainingTime = 0;
|
|
38
|
+
// Add a Map to store pre-initialized observers
|
|
39
|
+
preInitializedObservers = new Map();
|
|
40
|
+
// Add batch size constant
|
|
41
|
+
static BATCH_SIZE = 100;
|
|
42
|
+
currentBatchIndex = VectorManager.initialVectorNumber; // Start after initial vectors
|
|
43
|
+
// Add a map to track batch indices per controller
|
|
44
|
+
batchIndices = new Map();
|
|
45
|
+
// Add a map to store preloaded vectors per category
|
|
46
|
+
categoryVectors = new Map();
|
|
47
|
+
// Add to existing properties
|
|
48
|
+
customVectors = new Map();
|
|
49
|
+
/**
|
|
50
|
+
* Private constructor to enforce singleton pattern
|
|
51
|
+
*/
|
|
52
|
+
constructor() {
|
|
53
|
+
// console.log('🏗️ [VectorManager] Creating VectorManager instance...');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Gets or creates the singleton instance and initializes it
|
|
57
|
+
*/
|
|
58
|
+
static async getInstance() {
|
|
59
|
+
if (!VectorManager.instance) {
|
|
60
|
+
VectorManager.instance = new VectorManager();
|
|
61
|
+
// Initialize only once
|
|
62
|
+
if (!VectorManager.initializationPromise) {
|
|
63
|
+
VectorManager.initializationPromise = VectorManager.instance.initialize();
|
|
64
|
+
}
|
|
65
|
+
// Wait for initialization to complete
|
|
66
|
+
await VectorManager.initializationPromise;
|
|
67
|
+
}
|
|
68
|
+
return VectorManager.instance;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Initializes the VectorManager with initial vectors and setup
|
|
72
|
+
*/
|
|
73
|
+
async initialize() {
|
|
74
|
+
if (VectorManager.isInitialized) {
|
|
75
|
+
// console.log('✅ [VectorManager] Already initialized');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
// console.log('🚀 [VectorManager] Starting initialization...');
|
|
80
|
+
// Load custom vectors first, before any other operations
|
|
81
|
+
const customVectors = await this.loadCustomVectors();
|
|
82
|
+
// console.log('✅ [VectorManager] Loaded custom vectors:', customVectors.length);
|
|
83
|
+
// First check browser's cached vectors
|
|
84
|
+
const cachedVectors = await this.getBrowserCachedVectors();
|
|
85
|
+
// console.log('📦 [VectorManager] Browser cached vectors:', {
|
|
86
|
+
// total: cachedVectors.length,
|
|
87
|
+
// vectors: cachedVectors
|
|
88
|
+
// });
|
|
89
|
+
// Add cached vectors to loadedVectors set
|
|
90
|
+
cachedVectors.forEach(vector => this.loadedVectors.add(vector));
|
|
91
|
+
// Save to localStorage for persistence
|
|
92
|
+
this.saveLoadedVectors();
|
|
93
|
+
// Get recent vectors first
|
|
94
|
+
const recentVectors = vectorUtils.getRecentVectors()
|
|
95
|
+
.map(vector => ({
|
|
96
|
+
name: vector.name,
|
|
97
|
+
category: vectorCategories.normalize(vector.category),
|
|
98
|
+
url: vector.url
|
|
99
|
+
}));
|
|
100
|
+
// Get initial vector list and cache it
|
|
101
|
+
const initialVectorList = await this.getInitialVectorList();
|
|
102
|
+
// console.log('📋 [VectorManager] Initial vector list loaded:', initialVectorList.length);
|
|
103
|
+
// Cache the complete vector list immediately
|
|
104
|
+
try {
|
|
105
|
+
// Load vectors from svgs.json instead of API
|
|
106
|
+
const response = await fetch('/svgs.json');
|
|
107
|
+
if (!response.ok)
|
|
108
|
+
throw new Error('Failed to fetch vectors');
|
|
109
|
+
const data = await response.json();
|
|
110
|
+
// Convert to VectorData format and cache
|
|
111
|
+
this.cachedVectorList = data.svgGroups.flatMap((group) => group.items.map((item) => ({
|
|
112
|
+
name: item.name,
|
|
113
|
+
category: vectorCategories.normalize(group.category),
|
|
114
|
+
url: item.url
|
|
115
|
+
})));
|
|
116
|
+
// Preload initial vectors for each category
|
|
117
|
+
const categories = ['Icons', 'Emojis', 'Clipart', 'Mine'];
|
|
118
|
+
// Preload vectors for each category
|
|
119
|
+
await Promise.all(categories.map(async (category) => {
|
|
120
|
+
const categoryVectors = this.cachedVectorList
|
|
121
|
+
.filter(vector => vectorCategories.normalize(vector.category) === category)
|
|
122
|
+
.slice(0, VectorManager.initialVectorNumber);
|
|
123
|
+
this.categoryVectors.set(category, categoryVectors);
|
|
124
|
+
// Preload the vectors
|
|
125
|
+
await Promise.all(categoryVectors.map(async (vector) => {
|
|
126
|
+
try {
|
|
127
|
+
await this.loadVector(vector.name);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.warn(`⚠️ [VectorManager] Failed to preload vector: ${vector.name}`, error);
|
|
131
|
+
}
|
|
132
|
+
}));
|
|
133
|
+
// console.log(`📚 [VectorManager] Preloaded vectors for ${category}:`, {
|
|
134
|
+
// total: categoryVectors.length,
|
|
135
|
+
// sample: categoryVectors.slice(0, 3).map(v => v.name)
|
|
136
|
+
// });
|
|
137
|
+
}));
|
|
138
|
+
// Save filtered list to localStorage cache
|
|
139
|
+
this.saveVectorListToCache(this.cachedVectorList);
|
|
140
|
+
this.allVectorsLoaded = true;
|
|
141
|
+
// console.log('📚 [VectorManager] Complete vector list cached:', {
|
|
142
|
+
// total: this.cachedVectorList.length,
|
|
143
|
+
// categoriesPreloaded: Array.from(this.categoryVectors.keys())
|
|
144
|
+
// });
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('❌ [VectorManager] Error caching complete vector list:', error);
|
|
148
|
+
}
|
|
149
|
+
// Only set initialized after everything is complete
|
|
150
|
+
VectorManager.isInitialized = true;
|
|
151
|
+
this.initialVectorsLoaded = true;
|
|
152
|
+
// console.log('✅ [VectorManager] Initialization complete. Vector status:', {
|
|
153
|
+
// totalLoaded: this.loadedVectors.size,
|
|
154
|
+
// loadedVectors: Array.from(this.loadedVectors),
|
|
155
|
+
// cachedVectors: this.cachedVectorList.length
|
|
156
|
+
// });
|
|
157
|
+
// Pre-initialize observers for vector controllers
|
|
158
|
+
this.preInitializeObservers();
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('❌ [VectorManager] Initialization failed:', error);
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Pre-initializes observers during VectorManager initialization
|
|
167
|
+
*/
|
|
168
|
+
preInitializeObservers() {
|
|
169
|
+
// Create a default observer configuration
|
|
170
|
+
const observerConfig = {
|
|
171
|
+
root: null,
|
|
172
|
+
rootMargin: '50px',
|
|
173
|
+
threshold: 0
|
|
174
|
+
};
|
|
175
|
+
// Create and store the observer
|
|
176
|
+
const observer = new IntersectionObserver((entries) => {
|
|
177
|
+
entries.forEach(entry => {
|
|
178
|
+
const vectorName = entry.target.getAttribute('data-vector');
|
|
179
|
+
if (vectorName) {
|
|
180
|
+
if (entry.isIntersecting) {
|
|
181
|
+
this.addVisibleVector(vectorName);
|
|
182
|
+
if (!this.isScrolling()) {
|
|
183
|
+
this.loadInitialVisibleVectors();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
this.removeVisibleVector(vectorName);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}, observerConfig);
|
|
192
|
+
// Store it with a default key
|
|
193
|
+
this.preInitializedObservers.set('default', observer);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Loads custom vectors from custom-svgs.json
|
|
197
|
+
*/
|
|
198
|
+
async loadCustomVectors() {
|
|
199
|
+
try {
|
|
200
|
+
const response = await fetch('/custom-svgs.json');
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
console.error('❌ [VectorManager] Failed to load custom-svgs.json');
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
const vectorsData = await response.json();
|
|
206
|
+
const customVectors = [];
|
|
207
|
+
// Process each SVG group
|
|
208
|
+
for (const group of vectorsData.svgGroups) {
|
|
209
|
+
if (group.category === 'Mine') {
|
|
210
|
+
for (const item of group.items) {
|
|
211
|
+
const vectorData = {
|
|
212
|
+
name: item.name,
|
|
213
|
+
category: 'Mine',
|
|
214
|
+
url: item.url,
|
|
215
|
+
isCustom: true
|
|
216
|
+
};
|
|
217
|
+
this.customVectors.set(item.name, vectorData);
|
|
218
|
+
customVectors.push(vectorData);
|
|
219
|
+
this.loadedVectors.add(item.name);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return customVectors;
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
console.error('❌ [VectorManager] Error loading custom vectors:', error);
|
|
227
|
+
return [];
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Gets list of vectors cached in browser
|
|
232
|
+
*/
|
|
233
|
+
async getBrowserCachedVectors() {
|
|
234
|
+
try {
|
|
235
|
+
const cachedVectorsList = localStorage.getItem(VectorManager.LOADED_VECTORS_KEY);
|
|
236
|
+
const cachedVectors = cachedVectorsList ? JSON.parse(cachedVectorsList) : [];
|
|
237
|
+
// console.log('📦 [VectorManager] Vectors in localStorage:', cachedVectors);
|
|
238
|
+
// Verify each vector exists in the DOM/cache
|
|
239
|
+
const verifiedVectors = await Promise.all(cachedVectors.map(async (name) => {
|
|
240
|
+
const status = await this.verifyVectorCache(name);
|
|
241
|
+
return { name, status };
|
|
242
|
+
}));
|
|
243
|
+
// Filter to only include vectors that are properly cached
|
|
244
|
+
const validCachedVectors = verifiedVectors
|
|
245
|
+
.filter(({ status }) => status.cached)
|
|
246
|
+
.map(({ name }) => name);
|
|
247
|
+
// console.log('✅ [VectorManager] Valid cached vectors:', {
|
|
248
|
+
// total: validCachedVectors.length,
|
|
249
|
+
// vectors: validCachedVectors
|
|
250
|
+
// });
|
|
251
|
+
return validCachedVectors;
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
console.error('❌ [VectorManager] Error getting browser cached vectors:', error);
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Saves the current state of loaded vectors to localStorage
|
|
260
|
+
*/
|
|
261
|
+
saveLoadedVectors() {
|
|
262
|
+
try {
|
|
263
|
+
const vectorsToCache = Array.from(this.loadedVectors);
|
|
264
|
+
localStorage.setItem(VectorManager.LOADED_VECTORS_KEY, JSON.stringify(vectorsToCache));
|
|
265
|
+
// Verify the save operation
|
|
266
|
+
const savedData = localStorage.getItem(VectorManager.LOADED_VECTORS_KEY);
|
|
267
|
+
// console.log('💾 [VectorManager] Vector cache status:', {
|
|
268
|
+
// savedVectors: vectorsToCache,
|
|
269
|
+
// verifiedCache: savedData ? JSON.parse(savedData) : null,
|
|
270
|
+
// cacheSize: savedData?.length || 0
|
|
271
|
+
// });
|
|
272
|
+
}
|
|
273
|
+
catch (error) {
|
|
274
|
+
console.error('❌ [VectorManager] Error saving loaded vectors:', error);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Gets initial vector list (initial number of vectors + recent vectors)
|
|
279
|
+
*/
|
|
280
|
+
async getInitialVectorList() {
|
|
281
|
+
try {
|
|
282
|
+
if (this.initialVectorsLoaded) {
|
|
283
|
+
return this.cachedVectorList;
|
|
284
|
+
}
|
|
285
|
+
// Load recent vectors first
|
|
286
|
+
const recentVectors = vectorUtils.getRecentVectors()
|
|
287
|
+
.map(vector => ({
|
|
288
|
+
name: vector.name,
|
|
289
|
+
category: vectorCategories.normalize(vector.category),
|
|
290
|
+
url: vector.url,
|
|
291
|
+
isCustom: vector.isCustom
|
|
292
|
+
}));
|
|
293
|
+
// Add custom vectors from custom-svgs.json
|
|
294
|
+
const customVectors = await this.loadCustomVectors();
|
|
295
|
+
// Load vectors from svgs.json
|
|
296
|
+
const response = await fetch('/svgs.json');
|
|
297
|
+
if (!response.ok)
|
|
298
|
+
throw new Error('Failed to fetch vectors');
|
|
299
|
+
const data = await response.json();
|
|
300
|
+
// Process and combine vectors
|
|
301
|
+
const standardVectors = data.svgGroups.flatMap((group) => group.items.map((item) => ({
|
|
302
|
+
name: item.name,
|
|
303
|
+
category: vectorCategories.normalize(group.category),
|
|
304
|
+
url: item.url,
|
|
305
|
+
isCustom: false
|
|
306
|
+
})));
|
|
307
|
+
// Combine all vectors
|
|
308
|
+
this.cachedVectorList = [
|
|
309
|
+
...recentVectors,
|
|
310
|
+
...customVectors,
|
|
311
|
+
...standardVectors.filter((vector) => !recentVectors.some((recent) => recent.name === vector.name) &&
|
|
312
|
+
!customVectors.some((custom) => custom.name === vector.name))
|
|
313
|
+
];
|
|
314
|
+
this.initialVectorsLoaded = true;
|
|
315
|
+
return this.cachedVectorList;
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
console.error('Error getting initial vectors:', error);
|
|
319
|
+
return [];
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Saves vector list to localStorage cache
|
|
324
|
+
*/
|
|
325
|
+
saveVectorListToCache(vectors) {
|
|
326
|
+
try {
|
|
327
|
+
const cacheData = {
|
|
328
|
+
timestamp: Date.now(),
|
|
329
|
+
vectors: vectors
|
|
330
|
+
};
|
|
331
|
+
localStorage.setItem(VectorManager.CACHE_KEY, JSON.stringify(cacheData));
|
|
332
|
+
// console.log('💾 [VectorManager] Vector list cached:', {
|
|
333
|
+
// vectors: vectors.length,
|
|
334
|
+
// expires: new Date(cacheData.timestamp + VectorManager.CACHE_DURATION)
|
|
335
|
+
// });
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
console.error('❌ [VectorManager] Error caching vector list:', error);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Verifies if a vector is actually cached in the browser
|
|
343
|
+
*/
|
|
344
|
+
async verifyVectorCache(name) {
|
|
345
|
+
const status = {
|
|
346
|
+
name,
|
|
347
|
+
cached: false,
|
|
348
|
+
url: '',
|
|
349
|
+
headers: {}
|
|
350
|
+
};
|
|
351
|
+
try {
|
|
352
|
+
// Check if vector is in localStorage
|
|
353
|
+
const cachedVectors = localStorage.getItem(VectorManager.LOADED_VECTORS_KEY);
|
|
354
|
+
const loadedVectors = cachedVectors ? JSON.parse(cachedVectors) : [];
|
|
355
|
+
const isCached = loadedVectors.includes(name);
|
|
356
|
+
// Find vector URL
|
|
357
|
+
const vector = this.cachedVectorList.find(v => v.name === name);
|
|
358
|
+
if (vector) {
|
|
359
|
+
status.url = vector.url;
|
|
360
|
+
}
|
|
361
|
+
status.cached = isCached && !!status.url;
|
|
362
|
+
return status;
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.warn('⚠️ [VectorManager] Error verifying vector cache:', name, error);
|
|
366
|
+
return status;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Loads a vector by name
|
|
371
|
+
* Simpler than font loading since we just need to verify the URL exists
|
|
372
|
+
*/
|
|
373
|
+
async loadVector(name) {
|
|
374
|
+
if (this.loadedVectors.has(name)) {
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
try {
|
|
378
|
+
// Find vector in cache
|
|
379
|
+
const vector = this.cachedVectorList.find(v => v.name === name);
|
|
380
|
+
if (!vector) {
|
|
381
|
+
throw new Error(`Vector ${name} not found in cache`);
|
|
382
|
+
}
|
|
383
|
+
// Verify URL exists
|
|
384
|
+
const response = await fetch(vector.url, { method: 'HEAD' });
|
|
385
|
+
if (!response.ok) {
|
|
386
|
+
throw new Error(`Failed to verify vector URL: ${vector.url}`);
|
|
387
|
+
}
|
|
388
|
+
// Mark as loaded
|
|
389
|
+
this.loadedVectors.add(name);
|
|
390
|
+
this.saveLoadedVectors();
|
|
391
|
+
// console.log('✅ [VectorManager] Vector loaded successfully:', name);
|
|
392
|
+
}
|
|
393
|
+
catch (error) {
|
|
394
|
+
console.warn(`⚠️ [VectorManager] Error loading vector ${name}:`, error);
|
|
395
|
+
// Still mark as loaded to prevent retries
|
|
396
|
+
this.loadedVectors.add(name);
|
|
397
|
+
this.saveLoadedVectors();
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Loads initial visible vectors
|
|
402
|
+
*/
|
|
403
|
+
async loadInitialVisibleVectors() {
|
|
404
|
+
const visibleVectors = Array.from(this.visibleVectors);
|
|
405
|
+
// Get initial vectors list
|
|
406
|
+
const initialVectors = this.cachedVectorList.slice(0, VectorManager.initialVectorNumber);
|
|
407
|
+
const initialVectorNames = new Set(initialVectors.map(vector => vector.name));
|
|
408
|
+
// Filter visible vectors to only include those in the initial batch
|
|
409
|
+
const vectorsToLoad = visibleVectors.filter(name => initialVectorNames.has(name));
|
|
410
|
+
if (vectorsToLoad.length > 0) {
|
|
411
|
+
// console.log('🔄 [VectorManager] Loading initial visible vectors:', {
|
|
412
|
+
// visible: visibleVectors.length,
|
|
413
|
+
// toLoad: vectorsToLoad.length,
|
|
414
|
+
// initialBatchSize: initialVectors.length
|
|
415
|
+
// });
|
|
416
|
+
const loadPromises = vectorsToLoad.map(async (name) => {
|
|
417
|
+
try {
|
|
418
|
+
await this.loadVector(name);
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
console.warn(`⚠️ [VectorManager] Failed to load vector: ${name}`, error);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
await Promise.all(loadPromises);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Handles scroll optimization for vector loading
|
|
429
|
+
* Implements debouncing to prevent excessive loading
|
|
430
|
+
* @param callback - Optional callback after vectors are loaded
|
|
431
|
+
*/
|
|
432
|
+
handleScroll(callback) {
|
|
433
|
+
if (this.scrollTimeout) {
|
|
434
|
+
window.clearTimeout(this.scrollTimeout);
|
|
435
|
+
this.scrollTimeout = null;
|
|
436
|
+
}
|
|
437
|
+
this.remainingTime = VectorManager.WAIT_TIME;
|
|
438
|
+
this.scrollTimeout = window.setTimeout(async () => {
|
|
439
|
+
const visibleVectors = Array.from(this.visibleVectors);
|
|
440
|
+
// console.log('🔄 [VectorManager] Loading visible vectors:', {
|
|
441
|
+
// total: visibleVectors.length,
|
|
442
|
+
// vectors: visibleVectors
|
|
443
|
+
// });
|
|
444
|
+
try {
|
|
445
|
+
// Load all visible vectors in parallel
|
|
446
|
+
const loadPromises = visibleVectors.map(async (name) => {
|
|
447
|
+
if (this.loadedVectors.has(name)) {
|
|
448
|
+
const status = await this.verifyVectorCache(name);
|
|
449
|
+
if (!status.cached) {
|
|
450
|
+
// console.log('⚠️ [VectorManager] Reloading uncached vector:', name);
|
|
451
|
+
return this.loadVector(name);
|
|
452
|
+
}
|
|
453
|
+
return Promise.resolve();
|
|
454
|
+
}
|
|
455
|
+
// console.log('📥 [VectorManager] Loading new vector:', name);
|
|
456
|
+
return this.loadVector(name);
|
|
457
|
+
});
|
|
458
|
+
await Promise.all(loadPromises);
|
|
459
|
+
// Log final cache status
|
|
460
|
+
const finalStatus = await Promise.all(visibleVectors.map(async (name) => ({
|
|
461
|
+
name,
|
|
462
|
+
status: await this.verifyVectorCache(name)
|
|
463
|
+
})));
|
|
464
|
+
// console.log('✅ [VectorManager] Vector loading complete:', {
|
|
465
|
+
// total: finalStatus.length,
|
|
466
|
+
// vectors: finalStatus.map(({ name, status }) => ({
|
|
467
|
+
// name,
|
|
468
|
+
// cached: status.cached,
|
|
469
|
+
// url: status.url
|
|
470
|
+
// }))
|
|
471
|
+
// });
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
console.error('❌ [VectorManager] Error loading vectors:', error);
|
|
475
|
+
}
|
|
476
|
+
this.visibleVectors.clear();
|
|
477
|
+
this.scrollTimeout = null;
|
|
478
|
+
if (callback)
|
|
479
|
+
callback();
|
|
480
|
+
}, VectorManager.WAIT_TIME);
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Checks if scrolling is currently active
|
|
484
|
+
*/
|
|
485
|
+
isScrolling() {
|
|
486
|
+
return this.scrollTimeout !== null;
|
|
487
|
+
}
|
|
488
|
+
/**
|
|
489
|
+
* Adds a vector to the visible set
|
|
490
|
+
*/
|
|
491
|
+
addVisibleVector(name) {
|
|
492
|
+
if (!this.visibleVectors.has(name)) {
|
|
493
|
+
this.visibleVectors.add(name);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Removes a vector from the visible set
|
|
498
|
+
*/
|
|
499
|
+
removeVisibleVector(name) {
|
|
500
|
+
if (this.visibleVectors.has(name)) {
|
|
501
|
+
this.visibleVectors.delete(name);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Gets the cached vector list without making an API call
|
|
506
|
+
*/
|
|
507
|
+
getCachedVectorList() {
|
|
508
|
+
return this.cachedVectorList;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Gets the next batch of vectors
|
|
512
|
+
*/
|
|
513
|
+
getNextBatch(controllerId, category) {
|
|
514
|
+
// Get or initialize batch index for this controller
|
|
515
|
+
let currentIndex = this.batchIndices.get(controllerId) || VectorManager.initialVectorNumber;
|
|
516
|
+
// Filter vectors by category first
|
|
517
|
+
const categoryVectors = category === 'All'
|
|
518
|
+
? this.cachedVectorList
|
|
519
|
+
: category === 'Mine'
|
|
520
|
+
? Array.from(this.customVectors.values())
|
|
521
|
+
: this.cachedVectorList.filter(vector => vectorCategories.normalize(vector.category) === category);
|
|
522
|
+
const start = currentIndex;
|
|
523
|
+
const end = start + VectorManager.BATCH_SIZE;
|
|
524
|
+
// Get next batch from category-filtered list
|
|
525
|
+
const batch = categoryVectors.slice(start, end);
|
|
526
|
+
// Only update index if we actually got more vectors
|
|
527
|
+
if (batch.length > 0) {
|
|
528
|
+
this.batchIndices.set(controllerId, end);
|
|
529
|
+
}
|
|
530
|
+
// console.log('📦 [VectorManager] Loading next batch:', {
|
|
531
|
+
// controllerId,
|
|
532
|
+
// category,
|
|
533
|
+
// start,
|
|
534
|
+
// end,
|
|
535
|
+
// batchSize: batch.length,
|
|
536
|
+
// totalInCategory: categoryVectors.length,
|
|
537
|
+
// remainingVectors: categoryVectors.length - end
|
|
538
|
+
// });
|
|
539
|
+
return batch;
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Checks if there are more vectors to load
|
|
543
|
+
*/
|
|
544
|
+
hasMoreVectors(controllerId, category) {
|
|
545
|
+
const currentIndex = this.batchIndices.get(controllerId) || VectorManager.initialVectorNumber;
|
|
546
|
+
// Filter vectors by category first
|
|
547
|
+
const categoryVectors = category === 'All'
|
|
548
|
+
? this.cachedVectorList
|
|
549
|
+
: category === 'Mine'
|
|
550
|
+
? Array.from(this.customVectors.values())
|
|
551
|
+
: this.cachedVectorList.filter(vector => vectorCategories.normalize(vector.category) === category);
|
|
552
|
+
const remainingItems = categoryVectors.length - currentIndex;
|
|
553
|
+
// console.log('🔍 [VectorManager] Checking remaining vectors:', {
|
|
554
|
+
// category,
|
|
555
|
+
// currentIndex,
|
|
556
|
+
// totalInCategory: categoryVectors.length,
|
|
557
|
+
// remainingItems
|
|
558
|
+
// });
|
|
559
|
+
// Only return true if we have more items in this category
|
|
560
|
+
return remainingItems > 0;
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Resets the batch index to initial number
|
|
564
|
+
* This allows each vector input controller to start from the beginning
|
|
565
|
+
*/
|
|
566
|
+
resetBatchIndex(controllerId) {
|
|
567
|
+
this.batchIndices.set(controllerId, VectorManager.initialVectorNumber);
|
|
568
|
+
// console.log('🔄 [VectorManager] Reset batch index for:', controllerId);
|
|
569
|
+
}
|
|
570
|
+
/**
|
|
571
|
+
* Gets preloaded vectors for a category
|
|
572
|
+
*/
|
|
573
|
+
getPreloadedVectors(category) {
|
|
574
|
+
if (category === 'Mine') {
|
|
575
|
+
return Array.from(this.customVectors.values());
|
|
576
|
+
}
|
|
577
|
+
const preloadedVectors = this.categoryVectors.get(category) || [];
|
|
578
|
+
// Ensure vectors are loaded
|
|
579
|
+
preloadedVectors.forEach(vector => {
|
|
580
|
+
if (!this.loadedVectors.has(vector.name)) {
|
|
581
|
+
this.loadVector(vector.name)
|
|
582
|
+
.catch(error => console.warn(`⚠️ [VectorManager] Failed to load vector: ${vector.name}`, error));
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
return preloadedVectors;
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Gets the complete list of vectors
|
|
589
|
+
*/
|
|
590
|
+
async getCompleteVectorList(force = false) {
|
|
591
|
+
try {
|
|
592
|
+
if (this.allVectorsLoaded && !force) {
|
|
593
|
+
return this.cachedVectorList;
|
|
594
|
+
}
|
|
595
|
+
if (!force) {
|
|
596
|
+
const cachedVectors = this.getVectorListFromCache();
|
|
597
|
+
if (cachedVectors) {
|
|
598
|
+
this.cachedVectorList = cachedVectors;
|
|
599
|
+
this.allVectorsLoaded = true;
|
|
600
|
+
return cachedVectors;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
this.vectorListPromise = (async () => {
|
|
604
|
+
const response = await fetch('/svgs.json');
|
|
605
|
+
if (!response.ok)
|
|
606
|
+
throw new Error('Failed to fetch vectors');
|
|
607
|
+
const data = await response.json();
|
|
608
|
+
const allVectors = data.svgGroups.flatMap((group) => group.items.map((item) => ({
|
|
609
|
+
name: item.name,
|
|
610
|
+
category: vectorCategories.normalize(group.category),
|
|
611
|
+
url: item.url,
|
|
612
|
+
isCustom: false
|
|
613
|
+
})));
|
|
614
|
+
this.cachedVectorList = allVectors;
|
|
615
|
+
this.allVectorsLoaded = true;
|
|
616
|
+
this.saveVectorListToCache(allVectors);
|
|
617
|
+
// console.log('✅ [VectorManager] Complete vector list loaded:', {
|
|
618
|
+
// total: allVectors.length,
|
|
619
|
+
// format: 'SVG'
|
|
620
|
+
// });
|
|
621
|
+
return allVectors;
|
|
622
|
+
})();
|
|
623
|
+
return this.vectorListPromise;
|
|
624
|
+
}
|
|
625
|
+
catch (error) {
|
|
626
|
+
console.error('❌ [VectorManager] Error getting complete vector list:', error);
|
|
627
|
+
return this.cachedVectorList;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Checks if a vector is a custom vector
|
|
632
|
+
*/
|
|
633
|
+
isCustomVector(name) {
|
|
634
|
+
return this.customVectors.has(name);
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Gets custom vector data if available
|
|
638
|
+
*/
|
|
639
|
+
getCustomVector(name) {
|
|
640
|
+
return this.customVectors.get(name);
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Removes a custom vector
|
|
644
|
+
*/
|
|
645
|
+
async removeCustomVector(name) {
|
|
646
|
+
try {
|
|
647
|
+
if (this.customVectors.has(name)) {
|
|
648
|
+
this.customVectors.delete(name);
|
|
649
|
+
this.loadedVectors.delete(name);
|
|
650
|
+
// Update cached vector list
|
|
651
|
+
this.cachedVectorList = this.cachedVectorList.filter(vector => vector.name !== name || vector.category !== 'Mine');
|
|
652
|
+
// console.log('✅ [VectorManager] Custom vector removed:', name);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
catch (error) {
|
|
656
|
+
console.error('❌ [VectorManager] Error removing custom vector:', error);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Gets observer for a container
|
|
661
|
+
*/
|
|
662
|
+
getObserver(container) {
|
|
663
|
+
if (!container) {
|
|
664
|
+
console.warn('❌ [VectorManager] No container provided for observer');
|
|
665
|
+
return null;
|
|
666
|
+
}
|
|
667
|
+
// Generate or retrieve unique ID for container
|
|
668
|
+
const key = container.dataset.observerId || `vector-observer-${Math.random().toString(36).slice(2)}`;
|
|
669
|
+
container.dataset.observerId = key;
|
|
670
|
+
// Return existing observer if one exists
|
|
671
|
+
if (this.observers.has(key)) {
|
|
672
|
+
return this.observers.get(key) || null;
|
|
673
|
+
}
|
|
674
|
+
// Create new observer
|
|
675
|
+
console.log('🔧 [VectorManager] Creating new observer for container:', key);
|
|
676
|
+
const observer = new IntersectionObserver((entries) => {
|
|
677
|
+
entries.forEach(entry => {
|
|
678
|
+
const vectorName = entry.target.getAttribute('data-vector');
|
|
679
|
+
if (vectorName) {
|
|
680
|
+
if (entry.isIntersecting) {
|
|
681
|
+
this.addVisibleVector(vectorName);
|
|
682
|
+
if (!this.isScrolling()) {
|
|
683
|
+
this.loadInitialVisibleVectors();
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
else {
|
|
687
|
+
this.removeVisibleVector(vectorName);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
});
|
|
691
|
+
}, {
|
|
692
|
+
root: container,
|
|
693
|
+
rootMargin: '50px' // Pre-load vectors slightly before they come into view
|
|
694
|
+
});
|
|
695
|
+
this.observers.set(key, observer);
|
|
696
|
+
return observer;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Gets a pre-initialized observer
|
|
700
|
+
*/
|
|
701
|
+
getPreInitializedObserver() {
|
|
702
|
+
return this.preInitializedObservers.get('default') || null;
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* Gets stats about loaded vectors
|
|
706
|
+
*/
|
|
707
|
+
getLoadedVectorsStats() {
|
|
708
|
+
return {
|
|
709
|
+
total: this.loadedVectors.size,
|
|
710
|
+
vectors: Array.from(this.loadedVectors)
|
|
711
|
+
};
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Cleans up resources when a vector container is removed
|
|
715
|
+
* Prevents memory leaks from orphaned observers
|
|
716
|
+
*/
|
|
717
|
+
cleanup(containerId) {
|
|
718
|
+
const observer = this.observers.get(containerId);
|
|
719
|
+
if (observer) {
|
|
720
|
+
observer.disconnect();
|
|
721
|
+
this.observers.delete(containerId);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Checks if a vector is already loaded
|
|
726
|
+
*/
|
|
727
|
+
isVectorLoaded(name) {
|
|
728
|
+
return this.loadedVectors.has(name);
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Gets the vector list from cache without making an API call
|
|
732
|
+
* Returns null if cache is invalid or expired
|
|
733
|
+
*/
|
|
734
|
+
getVectorListFromCache() {
|
|
735
|
+
try {
|
|
736
|
+
const cached = localStorage.getItem(VectorManager.CACHE_KEY);
|
|
737
|
+
if (!cached)
|
|
738
|
+
return null;
|
|
739
|
+
const cache = JSON.parse(cached);
|
|
740
|
+
const now = Date.now();
|
|
741
|
+
// Check if cache has expired
|
|
742
|
+
if (now - cache.timestamp > VectorManager.CACHE_DURATION) {
|
|
743
|
+
console.log('📅 [VectorManager] Cache expired, will refresh');
|
|
744
|
+
return null;
|
|
745
|
+
}
|
|
746
|
+
return cache.vectors;
|
|
747
|
+
}
|
|
748
|
+
catch (error) {
|
|
749
|
+
console.error('❌ [VectorManager] Error reading vector cache:', error);
|
|
750
|
+
return null;
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
export default VectorManager;
|