geoiq-frontend-ui-kit 2.0.4 → 2.0.5
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/dist/components/atoms/accordion/accordion.d.ts +2 -1
- package/dist/components/atoms/accordion/accordion.d.ts.map +1 -1
- package/dist/components/atoms/avatar/avatar.d.ts +2 -1
- package/dist/components/atoms/avatar/avatar.d.ts.map +1 -1
- package/dist/components/atoms/badge/badge.d.ts +2 -2
- package/dist/components/atoms/badge/badge.d.ts.map +1 -1
- package/dist/components/atoms/skeleton/skeleton.d.ts +1 -1
- package/dist/components/atoms/skeleton/skeleton.d.ts.map +1 -1
- package/dist/components/atoms/tooltip/tooltip.d.ts +2 -2
- package/dist/components/atoms/tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/molecules/announcement-bar/announcement-bar.d.ts +5 -0
- package/dist/components/molecules/announcement-bar/announcement-bar.d.ts.map +1 -0
- package/dist/components/molecules/announcement-bar/announcement-bar.styles.d.ts +8 -0
- package/dist/components/molecules/announcement-bar/announcement-bar.styles.d.ts.map +1 -0
- package/dist/components/molecules/announcement-bar/announcement-bar.types.d.ts +15 -0
- package/dist/components/molecules/announcement-bar/announcement-bar.types.d.ts.map +1 -0
- package/dist/components/molecules/announcement-bar/index.d.ts +3 -0
- package/dist/components/molecules/announcement-bar/index.d.ts.map +1 -0
- package/dist/components/molecules/breadcrumb/breadcrumb-components.d.ts +2 -2
- package/dist/components/molecules/breadcrumb/breadcrumb.d.ts +2 -1
- package/dist/components/molecules/breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/molecules/creatable-multi-combobox/creatable-multi-combobox.d.ts +2 -1
- package/dist/components/molecules/creatable-multi-combobox/creatable-multi-combobox.d.ts.map +1 -1
- package/dist/components/molecules/dropdown-menu/dropdown-menu-components.d.ts +1 -1
- package/dist/components/molecules/dropdown-menu/dropdown-menu.d.ts +2 -1
- package/dist/components/molecules/dropdown-menu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/molecules/multi-combobox/index.d.ts +2 -2
- package/dist/components/molecules/multi-combobox/index.d.ts.map +1 -1
- package/dist/components/molecules/multi-select/index.d.ts +2 -2
- package/dist/components/molecules/multi-select/index.d.ts.map +1 -1
- package/dist/components/molecules/pagination/pagination-components.d.ts +4 -4
- package/dist/components/molecules/single-combobox/single-combobox.d.ts +2 -2
- package/dist/components/molecules/single-combobox/single-combobox.d.ts.map +1 -1
- package/dist/components/molecules/stepper/stepper-components.d.ts +1 -1
- package/dist/components/molecules/stepper/stepper-components.d.ts.map +1 -1
- package/dist/components/molecules/stepper/stepper.d.ts +2 -1
- package/dist/components/molecules/stepper/stepper.d.ts.map +1 -1
- package/dist/components/molecules/stepper/stepper.mock.d.ts +2 -2
- package/dist/components/molecules/stepper/stepper.mock.d.ts.map +1 -1
- package/dist/components/molecules/swatch-grid/swatch-grid.d.ts +2 -1
- package/dist/components/molecules/swatch-grid/swatch-grid.d.ts.map +1 -1
- package/dist/components/molecules/toast/assets/svgs/danger-icon.d.ts +3 -1
- package/dist/components/molecules/toast/assets/svgs/danger-icon.d.ts.map +1 -1
- package/dist/components/molecules/toast/assets/svgs/info-icon.d.ts +3 -1
- package/dist/components/molecules/toast/assets/svgs/info-icon.d.ts.map +1 -1
- package/dist/components/molecules/toast/assets/svgs/success-icon.d.ts +3 -1
- package/dist/components/molecules/toast/assets/svgs/success-icon.d.ts.map +1 -1
- package/dist/components/molecules/toast/assets/svgs/warning-icon.d.ts +3 -1
- package/dist/components/molecules/toast/assets/svgs/warning-icon.d.ts.map +1 -1
- package/dist/components/molecules/toast/toast-components.d.ts +1 -1
- package/dist/components/molecules/toast/toast.d.ts +2 -1
- package/dist/components/molecules/toast/toast.d.ts.map +1 -1
- package/dist/components/molecules/toggle-multi-select/index.d.ts +2 -2
- package/dist/components/molecules/toggle-multi-select/index.d.ts.map +1 -1
- package/dist/components/organisms/alert-dialog/alert-dialog-components.d.ts +2 -2
- package/dist/components/organisms/alert-dialog/alert-dialog.d.ts +2 -1
- package/dist/components/organisms/alert-dialog/alert-dialog.d.ts.map +1 -1
- package/dist/components/organisms/dialog/dialog-components.d.ts +2 -2
- package/dist/components/organisms/dialog/dialog-components.d.ts.map +1 -1
- package/dist/components/organisms/dialog/dialog.d.ts +2 -1
- package/dist/components/organisms/dialog/dialog.d.ts.map +1 -1
- package/dist/components/organisms/feature-dialog/feature-dialog.d.ts +5 -0
- package/dist/components/organisms/feature-dialog/feature-dialog.d.ts.map +1 -0
- package/dist/components/organisms/feature-dialog/feature-dialog.styles.d.ts +5 -0
- package/dist/components/organisms/feature-dialog/feature-dialog.styles.d.ts.map +1 -0
- package/dist/components/organisms/feature-dialog/feature-dialog.types.d.ts +25 -0
- package/dist/components/organisms/feature-dialog/feature-dialog.types.d.ts.map +1 -0
- package/dist/components/organisms/feature-dialog/index.d.ts +3 -0
- package/dist/components/organisms/feature-dialog/index.d.ts.map +1 -0
- package/dist/components/organisms/image-editor/components/color-picker.d.ts +3 -1
- package/dist/components/organisms/image-editor/components/color-picker.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/layers-list.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/layers-list.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/line-session-bar.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/line-session-bar.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/panel-adjust.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/panel-adjust.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/panel-crop.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/panel-crop.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/panel-insert.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/panel-insert.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/panel-selected.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/panel-selected.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/panel.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/panel.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/ribbon.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/ribbon.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/saved-layers-list.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/saved-layers-list.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/components/status-bar.d.ts +2 -1
- package/dist/components/organisms/image-editor/components/status-bar.d.ts.map +1 -1
- package/dist/components/organisms/image-editor/image-editor-modal.d.ts +2 -1
- package/dist/components/organisms/image-editor/image-editor-modal.d.ts.map +1 -1
- package/dist/components/organisms/sheet/sheet-components.d.ts +2 -2
- package/dist/components/organisms/sheet/sheet.d.ts +2 -1
- package/dist/components/organisms/sheet/sheet.d.ts.map +1 -1
- package/dist/components/organisms/sidebar/sidebar.d.ts +2 -1
- package/dist/components/organisms/sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/ui/agent-snippet-view/agent-snippet-view.d.ts +1 -1
- package/dist/components/ui/agent-snippet-view/agent-snippet-view.d.ts.map +1 -1
- package/dist/components/ui/map-marker-hover-card/components/map-cluster-hover-card.d.ts +2 -1
- package/dist/components/ui/map-marker-hover-card/components/map-cluster-hover-card.d.ts.map +1 -1
- package/dist/components/ui/map-marker-hover-card/components/map-point-hover-card.d.ts +2 -1
- package/dist/components/ui/map-marker-hover-card/components/map-point-hover-card.d.ts.map +1 -1
- package/dist/components/ui/map-marker-hover-card/map-marker-hover-card.d.ts +2 -1
- package/dist/components/ui/map-marker-hover-card/map-marker-hover-card.d.ts.map +1 -1
- package/dist/components/ui/star-score/star-score.d.ts +2 -1
- package/dist/components/ui/star-score/star-score.d.ts.map +1 -1
- package/dist/components/unstyled/calendar/calendar.d.ts +1 -1
- package/dist/components/unstyled/calendar/calendar.d.ts.map +1 -1
- package/dist/components/unstyled/command/index.d.ts +2 -2
- package/dist/components/unstyled/command/index.d.ts.map +1 -1
- package/dist/components/unstyled/date-picker/date-picker.d.ts +2 -2
- package/dist/components/unstyled/date-picker/date-picker.d.ts.map +1 -1
- package/dist/components/unstyled/hover-card/hover-card.d.ts +2 -1
- package/dist/components/unstyled/hover-card/hover-card.d.ts.map +1 -1
- package/dist/components/unstyled/popover/popover.d.ts +2 -1
- package/dist/components/unstyled/popover/popover.d.ts.map +1 -1
- package/dist/components/unstyled/table/table.d.ts +2 -2
- package/dist/components/unstyled/table/table.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +199 -195
- package/dist/index.es.js.map +1 -1
- package/dist/{index.es10.js → index10.es.js} +3 -3
- package/dist/{index.es10.js.map → index10.es.js.map} +1 -1
- package/dist/{index.es113.js → index100.es.js} +1 -1
- package/dist/{index.es113.js.map → index100.es.js.map} +1 -1
- package/dist/{index.es119.js → index101.es.js} +1 -1
- package/dist/{index.es119.js.map → index101.es.js.map} +1 -1
- package/dist/{index.es102.js → index102.es.js} +1 -1
- package/dist/{index.es102.js.map → index102.es.js.map} +1 -1
- package/dist/{index.es108.js → index103.es.js} +1 -1
- package/dist/{index.es108.js.map → index103.es.js.map} +1 -1
- package/dist/{index.es127.js → index104.es.js} +4 -4
- package/dist/{index.es127.js.map → index104.es.js.map} +1 -1
- package/dist/{index.es128.js → index105.es.js} +4 -4
- package/dist/{index.es128.js.map → index105.es.js.map} +1 -1
- package/dist/{index.es129.js → index106.es.js} +5 -5
- package/dist/{index.es129.js.map → index106.es.js.map} +1 -1
- package/dist/{index.es130.js → index107.es.js} +2 -2
- package/dist/{index.es130.js.map → index107.es.js.map} +1 -1
- package/dist/{index.es131.js → index108.es.js} +3 -3
- package/dist/{index.es131.js.map → index108.es.js.map} +1 -1
- package/dist/{index.es114.js → index109.es.js} +3 -3
- package/dist/{index.es114.js.map → index109.es.js.map} +1 -1
- package/dist/{index.es11.js → index11.es.js} +4 -4
- package/dist/{index.es11.js.map → index11.es.js.map} +1 -1
- package/dist/{index.es132.js → index110.es.js} +1 -1
- package/dist/{index.es132.js.map → index110.es.js.map} +1 -1
- package/dist/{index.es106.js → index111.es.js} +1 -1
- package/dist/{index.es106.js.map → index111.es.js.map} +1 -1
- package/dist/{index.es105.js → index112.es.js} +3 -3
- package/dist/{index.es105.js.map → index112.es.js.map} +1 -1
- package/dist/{index.es101.js → index113.es.js} +1 -1
- package/dist/{index.es101.js.map → index113.es.js.map} +1 -1
- package/dist/{index.es110.js → index114.es.js} +2 -2
- package/dist/{index.es110.js.map → index114.es.js.map} +1 -1
- package/dist/{index.es111.js → index115.es.js} +6 -6
- package/dist/{index.es111.js.map → index115.es.js.map} +1 -1
- package/dist/{index.es134.js → index116.es.js} +2 -2
- package/dist/{index.es134.js.map → index116.es.js.map} +1 -1
- package/dist/{index.es135.js → index117.es.js} +1 -1
- package/dist/{index.es135.js.map → index117.es.js.map} +1 -1
- package/dist/{index.es112.js → index118.es.js} +1 -1
- package/dist/{index.es112.js.map → index118.es.js.map} +1 -1
- package/dist/index119.es.js +34 -0
- package/dist/index119.es.js.map +1 -0
- package/dist/{index.es12.js → index12.es.js} +3 -3
- package/dist/{index.es12.js.map → index12.es.js.map} +1 -1
- package/dist/{index.es116.js → index120.es.js} +1 -1
- package/dist/{index.es116.js.map → index120.es.js.map} +1 -1
- package/dist/{index.es117.js → index121.es.js} +5 -5
- package/dist/{index.es117.js.map → index121.es.js.map} +1 -1
- package/dist/{index.es120.js → index122.es.js} +4 -4
- package/dist/{index.es120.js.map → index122.es.js.map} +1 -1
- package/dist/{index.es121.js → index123.es.js} +3 -3
- package/dist/{index.es121.js.map → index123.es.js.map} +1 -1
- package/dist/{index.es122.js → index124.es.js} +3 -3
- package/dist/{index.es122.js.map → index124.es.js.map} +1 -1
- package/dist/{index.es123.js → index125.es.js} +3 -3
- package/dist/{index.es123.js.map → index125.es.js.map} +1 -1
- package/dist/{index.es124.js → index126.es.js} +10 -10
- package/dist/{index.es124.js.map → index126.es.js.map} +1 -1
- package/dist/{index.es125.js → index127.es.js} +10 -10
- package/dist/{index.es125.js.map → index127.es.js.map} +1 -1
- package/dist/{index.es126.js → index128.es.js} +5 -5
- package/dist/{index.es126.js.map → index128.es.js.map} +1 -1
- package/dist/{index.es97.js → index129.es.js} +1 -1
- package/dist/index129.es.js.map +1 -0
- package/dist/{index.es13.js → index13.es.js} +3 -3
- package/dist/{index.es13.js.map → index13.es.js.map} +1 -1
- package/dist/{index.es98.js → index130.es.js} +8 -8
- package/dist/index130.es.js.map +1 -0
- package/dist/{index.es99.js → index131.es.js} +1 -1
- package/dist/index131.es.js.map +1 -0
- package/dist/{index.es100.js → index132.es.js} +15 -15
- package/dist/{index.es100.js.map → index132.es.js.map} +1 -1
- package/dist/{index.es118.js → index133.es.js} +1 -1
- package/dist/{index.es118.js.map → index133.es.js.map} +1 -1
- package/dist/{index.es136.js → index134.es.js} +5 -5
- package/dist/{index.es136.js.map → index134.es.js.map} +1 -1
- package/dist/{index.es103.js → index135.es.js} +1 -1
- package/dist/{index.es103.js.map → index135.es.js.map} +1 -1
- package/dist/{index.es104.js → index136.es.js} +1 -1
- package/dist/{index.es104.js.map → index136.es.js.map} +1 -1
- package/dist/{index.es107.js → index137.es.js} +5 -5
- package/dist/{index.es107.js.map → index137.es.js.map} +1 -1
- package/dist/{index.es115.js → index138.es.js} +3 -3
- package/dist/{index.es115.js.map → index138.es.js.map} +1 -1
- package/dist/{index.es133.js → index139.es.js} +1 -1
- package/dist/{index.es133.js.map → index139.es.js.map} +1 -1
- package/dist/{index.es14.js → index14.es.js} +2 -2
- package/dist/{index.es14.js.map → index14.es.js.map} +1 -1
- package/dist/index140.es.js +17 -0
- package/dist/index140.es.js.map +1 -0
- package/dist/{index.es159.js → index141.es.js} +3 -3
- package/dist/{index.es159.js.map → index141.es.js.map} +1 -1
- package/dist/{index.es160.js → index142.es.js} +1 -1
- package/dist/{index.es160.js.map → index142.es.js.map} +1 -1
- package/dist/{index.es161.js → index143.es.js} +1 -1
- package/dist/{index.es161.js.map → index143.es.js.map} +1 -1
- package/dist/{index.es162.js → index144.es.js} +1 -1
- package/dist/{index.es162.js.map → index144.es.js.map} +1 -1
- package/dist/{index.es158.js → index145.es.js} +1 -1
- package/dist/{index.es158.js.map → index145.es.js.map} +1 -1
- package/dist/{index.es157.js → index146.es.js} +1 -1
- package/dist/{index.es157.js.map → index146.es.js.map} +1 -1
- package/dist/{index.es137.js → index147.es.js} +1 -1
- package/dist/{index.es137.js.map → index147.es.js.map} +1 -1
- package/dist/{index.es138.js → index148.es.js} +7 -7
- package/dist/{index.es138.js.map → index148.es.js.map} +1 -1
- package/dist/{index.es139.js → index149.es.js} +3 -3
- package/dist/{index.es139.js.map → index149.es.js.map} +1 -1
- package/dist/{index.es15.js → index15.es.js} +3 -3
- package/dist/{index.es15.js.map → index15.es.js.map} +1 -1
- package/dist/{index.es140.js → index150.es.js} +2 -2
- package/dist/{index.es140.js.map → index150.es.js.map} +1 -1
- package/dist/{index.es141.js → index151.es.js} +1 -1
- package/dist/{index.es141.js.map → index151.es.js.map} +1 -1
- package/dist/{index.es142.js → index152.es.js} +1 -1
- package/dist/{index.es142.js.map → index152.es.js.map} +1 -1
- package/dist/{index.es143.js → index153.es.js} +1 -1
- package/dist/{index.es143.js.map → index153.es.js.map} +1 -1
- package/dist/{index.es144.js → index154.es.js} +2 -2
- package/dist/{index.es144.js.map → index154.es.js.map} +1 -1
- package/dist/{index.es145.js → index155.es.js} +3 -3
- package/dist/{index.es145.js.map → index155.es.js.map} +1 -1
- package/dist/{index.es146.js → index156.es.js} +3 -3
- package/dist/{index.es146.js.map → index156.es.js.map} +1 -1
- package/dist/{index.es147.js → index157.es.js} +5 -5
- package/dist/{index.es147.js.map → index157.es.js.map} +1 -1
- package/dist/{index.es148.js → index158.es.js} +4 -4
- package/dist/{index.es148.js.map → index158.es.js.map} +1 -1
- package/dist/{index.es149.js → index159.es.js} +2 -2
- package/dist/{index.es149.js.map → index159.es.js.map} +1 -1
- package/dist/{index.es16.js → index16.es.js} +8 -8
- package/dist/{index.es16.js.map → index16.es.js.map} +1 -1
- package/dist/{index.es150.js → index160.es.js} +4 -4
- package/dist/{index.es150.js.map → index160.es.js.map} +1 -1
- package/dist/{index.es151.js → index161.es.js} +6 -6
- package/dist/{index.es151.js.map → index161.es.js.map} +1 -1
- package/dist/{index.es152.js → index162.es.js} +5 -5
- package/dist/{index.es152.js.map → index162.es.js.map} +1 -1
- package/dist/{index.es153.js → index163.es.js} +4 -4
- package/dist/{index.es153.js.map → index163.es.js.map} +1 -1
- package/dist/{index.es154.js → index164.es.js} +9 -9
- package/dist/{index.es154.js.map → index164.es.js.map} +1 -1
- package/dist/{index.es155.js → index165.es.js} +6 -6
- package/dist/{index.es155.js.map → index165.es.js.map} +1 -1
- package/dist/{index.es163.js → index166.es.js} +1 -1
- package/dist/{index.es163.js.map → index166.es.js.map} +1 -1
- package/dist/{index.es164.js → index167.es.js} +1 -1
- package/dist/{index.es164.js.map → index167.es.js.map} +1 -1
- package/dist/{index.es156.js → index168.es.js} +2 -2
- package/dist/{index.es156.js.map → index168.es.js.map} +1 -1
- package/dist/{index.es165.js → index169.es.js} +1 -1
- package/dist/{index.es165.js.map → index169.es.js.map} +1 -1
- package/dist/{index.es17.js → index17.es.js} +3 -3
- package/dist/{index.es17.js.map → index17.es.js.map} +1 -1
- package/dist/{index.es166.js → index170.es.js} +2 -2
- package/dist/{index.es166.js.map → index170.es.js.map} +1 -1
- package/dist/{index.es173.js → index171.es.js} +19 -19
- package/dist/{index.es173.js.map → index171.es.js.map} +1 -1
- package/dist/{index.es167.js → index172.es.js} +2 -2
- package/dist/{index.es167.js.map → index172.es.js.map} +1 -1
- package/dist/{index.es168.js → index173.es.js} +4 -4
- package/dist/{index.es168.js.map → index173.es.js.map} +1 -1
- package/dist/{index.es169.js → index174.es.js} +4 -4
- package/dist/{index.es169.js.map → index174.es.js.map} +1 -1
- package/dist/{index.es170.js → index175.es.js} +9 -9
- package/dist/{index.es170.js.map → index175.es.js.map} +1 -1
- package/dist/{index.es171.js → index176.es.js} +10 -10
- package/dist/{index.es171.js.map → index176.es.js.map} +1 -1
- package/dist/{index.es172.js → index177.es.js} +2 -2
- package/dist/{index.es172.js.map → index177.es.js.map} +1 -1
- package/dist/{index.es174.js → index178.es.js} +4 -4
- package/dist/{index.es174.js.map → index178.es.js.map} +1 -1
- package/dist/{index.es175.js → index179.es.js} +2 -2
- package/dist/{index.es175.js.map → index179.es.js.map} +1 -1
- package/dist/{index.es18.js → index18.es.js} +2 -2
- package/dist/{index.es18.js.map → index18.es.js.map} +1 -1
- package/dist/{index.es178.js → index180.es.js} +6 -6
- package/dist/{index.es178.js.map → index180.es.js.map} +1 -1
- package/dist/{index.es179.js → index181.es.js} +17 -16
- package/dist/{index.es179.js.map → index181.es.js.map} +1 -1
- package/dist/{index.es180.js → index182.es.js} +27 -26
- package/dist/{index.es180.js.map → index182.es.js.map} +1 -1
- package/dist/{index.es181.js → index183.es.js} +13 -12
- package/dist/{index.es181.js.map → index183.es.js.map} +1 -1
- package/dist/{index.es182.js → index184.es.js} +5 -5
- package/dist/{index.es182.js.map → index184.es.js.map} +1 -1
- package/dist/{index.es183.js → index185.es.js} +27 -26
- package/dist/{index.es183.js.map → index185.es.js.map} +1 -1
- package/dist/{index.es184.js → index186.es.js} +30 -29
- package/dist/{index.es184.js.map → index186.es.js.map} +1 -1
- package/dist/{index.es176.js → index187.es.js} +1 -1
- package/dist/{index.es176.js.map → index187.es.js.map} +1 -1
- package/dist/{index.es177.js → index188.es.js} +2 -2
- package/dist/{index.es177.js.map → index188.es.js.map} +1 -1
- package/dist/{index.es185.js → index189.es.js} +1 -1
- package/dist/{index.es185.js.map → index189.es.js.map} +1 -1
- package/dist/{index.es19.js → index19.es.js} +4 -4
- package/dist/{index.es19.js.map → index19.es.js.map} +1 -1
- package/dist/{index.es2.js → index2.es.js} +5 -5
- package/dist/{index.es2.js.map → index2.es.js.map} +1 -1
- package/dist/{index.es20.js → index20.es.js} +5 -5
- package/dist/{index.es20.js.map → index20.es.js.map} +1 -1
- package/dist/index21.es.js +57 -0
- package/dist/index21.es.js.map +1 -0
- package/dist/index22.es.js +79 -0
- package/dist/index22.es.js.map +1 -0
- package/dist/{index.es21.js → index23.es.js} +6 -6
- package/dist/{index.es21.js.map → index23.es.js.map} +1 -1
- package/dist/{index.es22.js → index24.es.js} +2 -2
- package/dist/{index.es22.js.map → index24.es.js.map} +1 -1
- package/dist/{index.es23.js → index25.es.js} +7 -7
- package/dist/{index.es23.js.map → index25.es.js.map} +1 -1
- package/dist/{index.es24.js → index26.es.js} +7 -7
- package/dist/{index.es24.js.map → index26.es.js.map} +1 -1
- package/dist/{index.es25.js → index27.es.js} +3 -3
- package/dist/{index.es25.js.map → index27.es.js.map} +1 -1
- package/dist/{index.es26.js → index28.es.js} +2 -2
- package/dist/{index.es26.js.map → index28.es.js.map} +1 -1
- package/dist/{index.es27.js → index29.es.js} +7 -7
- package/dist/{index.es27.js.map → index29.es.js.map} +1 -1
- package/dist/{index.es3.js → index3.es.js} +3 -3
- package/dist/{index.es3.js.map → index3.es.js.map} +1 -1
- package/dist/{index.es28.js → index30.es.js} +9 -9
- package/dist/{index.es28.js.map → index30.es.js.map} +1 -1
- package/dist/{index.es29.js → index31.es.js} +5 -5
- package/dist/{index.es29.js.map → index31.es.js.map} +1 -1
- package/dist/{index.es30.js → index32.es.js} +3 -3
- package/dist/{index.es30.js.map → index32.es.js.map} +1 -1
- package/dist/{index.es31.js → index33.es.js} +1 -1
- package/dist/{index.es31.js.map → index33.es.js.map} +1 -1
- package/dist/{index.es32.js → index34.es.js} +2 -2
- package/dist/{index.es32.js.map → index34.es.js.map} +1 -1
- package/dist/{index.es33.js → index35.es.js} +3 -3
- package/dist/{index.es33.js.map → index35.es.js.map} +1 -1
- package/dist/index36.es.js +39 -0
- package/dist/index36.es.js.map +1 -0
- package/dist/{index.es35.js → index37.es.js} +6 -6
- package/dist/{index.es35.js.map → index37.es.js.map} +1 -1
- package/dist/{index.es36.js → index38.es.js} +5 -5
- package/dist/{index.es36.js.map → index38.es.js.map} +1 -1
- package/dist/{index.es37.js → index39.es.js} +6 -6
- package/dist/{index.es37.js.map → index39.es.js.map} +1 -1
- package/dist/{index.es4.js → index4.es.js} +2 -2
- package/dist/{index.es4.js.map → index4.es.js.map} +1 -1
- package/dist/{index.es38.js → index40.es.js} +2 -2
- package/dist/{index.es38.js.map → index40.es.js.map} +1 -1
- package/dist/{index.es39.js → index41.es.js} +3 -3
- package/dist/{index.es39.js.map → index41.es.js.map} +1 -1
- package/dist/index42.es.js +91 -0
- package/dist/index42.es.js.map +1 -0
- package/dist/{index.es41.js → index43.es.js} +5 -5
- package/dist/{index.es41.js.map → index43.es.js.map} +1 -1
- package/dist/{index.es42.js → index44.es.js} +4 -4
- package/dist/{index.es42.js.map → index44.es.js.map} +1 -1
- package/dist/{index.es43.js → index45.es.js} +2 -2
- package/dist/{index.es43.js.map → index45.es.js.map} +1 -1
- package/dist/{index.es44.js → index46.es.js} +2 -2
- package/dist/{index.es44.js.map → index46.es.js.map} +1 -1
- package/dist/{index.es45.js → index47.es.js} +5 -5
- package/dist/{index.es45.js.map → index47.es.js.map} +1 -1
- package/dist/{index.es46.js → index48.es.js} +9 -9
- package/dist/{index.es46.js.map → index48.es.js.map} +1 -1
- package/dist/{index.es47.js → index49.es.js} +7 -7
- package/dist/{index.es47.js.map → index49.es.js.map} +1 -1
- package/dist/{index.es5.js → index5.es.js} +2 -2
- package/dist/{index.es5.js.map → index5.es.js.map} +1 -1
- package/dist/{index.es48.js → index50.es.js} +10 -10
- package/dist/{index.es48.js.map → index50.es.js.map} +1 -1
- package/dist/{index.es49.js → index51.es.js} +2 -2
- package/dist/{index.es49.js.map → index51.es.js.map} +1 -1
- package/dist/{index.es50.js → index52.es.js} +1 -1
- package/dist/{index.es50.js.map → index52.es.js.map} +1 -1
- package/dist/{index.es51.js → index53.es.js} +2 -2
- package/dist/{index.es51.js.map → index53.es.js.map} +1 -1
- package/dist/{index.es52.js → index54.es.js} +3 -3
- package/dist/{index.es52.js.map → index54.es.js.map} +1 -1
- package/dist/{index.es53.js → index55.es.js} +7 -7
- package/dist/{index.es53.js.map → index55.es.js.map} +1 -1
- package/dist/{index.es54.js → index56.es.js} +4 -4
- package/dist/{index.es54.js.map → index56.es.js.map} +1 -1
- package/dist/{index.es55.js → index57.es.js} +5 -5
- package/dist/{index.es55.js.map → index57.es.js.map} +1 -1
- package/dist/{index.es56.js → index58.es.js} +3 -3
- package/dist/{index.es56.js.map → index58.es.js.map} +1 -1
- package/dist/{index.es57.js → index59.es.js} +9 -9
- package/dist/{index.es57.js.map → index59.es.js.map} +1 -1
- package/dist/{index.es6.js → index6.es.js} +2 -2
- package/dist/{index.es6.js.map → index6.es.js.map} +1 -1
- package/dist/{index.es58.js → index60.es.js} +4 -3
- package/dist/{index.es58.js.map → index60.es.js.map} +1 -1
- package/dist/{index.es59.js → index61.es.js} +2 -2
- package/dist/{index.es59.js.map → index61.es.js.map} +1 -1
- package/dist/{index.es60.js → index62.es.js} +3 -3
- package/dist/{index.es60.js.map → index62.es.js.map} +1 -1
- package/dist/{index.es61.js → index63.es.js} +2 -2
- package/dist/{index.es61.js.map → index63.es.js.map} +1 -1
- package/dist/{index.es62.js → index64.es.js} +2 -2
- package/dist/{index.es62.js.map → index64.es.js.map} +1 -1
- package/dist/{index.es63.js → index65.es.js} +2 -2
- package/dist/{index.es63.js.map → index65.es.js.map} +1 -1
- package/dist/{index.es64.js → index66.es.js} +3 -3
- package/dist/{index.es64.js.map → index66.es.js.map} +1 -1
- package/dist/{index.es65.js → index67.es.js} +3 -3
- package/dist/{index.es65.js.map → index67.es.js.map} +1 -1
- package/dist/{index.es66.js → index68.es.js} +2 -2
- package/dist/{index.es66.js.map → index68.es.js.map} +1 -1
- package/dist/{index.es67.js → index69.es.js} +3 -3
- package/dist/{index.es67.js.map → index69.es.js.map} +1 -1
- package/dist/{index.es7.js → index7.es.js} +2 -2
- package/dist/{index.es7.js.map → index7.es.js.map} +1 -1
- package/dist/{index.es68.js → index70.es.js} +3 -3
- package/dist/{index.es68.js.map → index70.es.js.map} +1 -1
- package/dist/{index.es69.js → index71.es.js} +6 -6
- package/dist/{index.es69.js.map → index71.es.js.map} +1 -1
- package/dist/{index.es70.js → index72.es.js} +6 -6
- package/dist/{index.es70.js.map → index72.es.js.map} +1 -1
- package/dist/{index.es71.js → index73.es.js} +4 -4
- package/dist/{index.es71.js.map → index73.es.js.map} +1 -1
- package/dist/{index.es72.js → index74.es.js} +8 -8
- package/dist/{index.es72.js.map → index74.es.js.map} +1 -1
- package/dist/{index.es73.js → index75.es.js} +5 -5
- package/dist/{index.es73.js.map → index75.es.js.map} +1 -1
- package/dist/{index.es74.js → index76.es.js} +1 -1
- package/dist/{index.es74.js.map → index76.es.js.map} +1 -1
- package/dist/{index.es75.js → index77.es.js} +1 -1
- package/dist/{index.es75.js.map → index77.es.js.map} +1 -1
- package/dist/{index.es76.js → index78.es.js} +1 -1
- package/dist/{index.es76.js.map → index78.es.js.map} +1 -1
- package/dist/{index.es77.js → index79.es.js} +1 -1
- package/dist/{index.es77.js.map → index79.es.js.map} +1 -1
- package/dist/{index.es8.js → index8.es.js} +3 -3
- package/dist/{index.es8.js.map → index8.es.js.map} +1 -1
- package/dist/index80.es.js +90 -0
- package/dist/index80.es.js.map +1 -0
- package/dist/{index.es79.js → index81.es.js} +1 -1
- package/dist/{index.es79.js.map → index81.es.js.map} +1 -1
- package/dist/{index.es80.js → index82.es.js} +3 -3
- package/dist/{index.es80.js.map → index82.es.js.map} +1 -1
- package/dist/{index.es81.js → index83.es.js} +4 -4
- package/dist/{index.es81.js.map → index83.es.js.map} +1 -1
- package/dist/{index.es82.js → index84.es.js} +1 -1
- package/dist/{index.es82.js.map → index84.es.js.map} +1 -1
- package/dist/{index.es83.js → index85.es.js} +1 -1
- package/dist/{index.es83.js.map → index85.es.js.map} +1 -1
- package/dist/{index.es84.js → index86.es.js} +1 -1
- package/dist/{index.es84.js.map → index86.es.js.map} +1 -1
- package/dist/{index.es85.js → index87.es.js} +2 -2
- package/dist/{index.es85.js.map → index87.es.js.map} +1 -1
- package/dist/{index.es86.js → index88.es.js} +2 -2
- package/dist/{index.es86.js.map → index88.es.js.map} +1 -1
- package/dist/{index.es87.js → index89.es.js} +1 -1
- package/dist/{index.es87.js.map → index89.es.js.map} +1 -1
- package/dist/{index.es9.js → index9.es.js} +4 -4
- package/dist/{index.es9.js.map → index9.es.js.map} +1 -1
- package/dist/index90.es.js +5 -0
- package/dist/index90.es.js.map +1 -0
- package/dist/{index.es89.js → index91.es.js} +1 -1
- package/dist/{index.es89.js.map → index91.es.js.map} +1 -1
- package/dist/{index.es90.js → index92.es.js} +2 -2
- package/dist/{index.es90.js.map → index92.es.js.map} +1 -1
- package/dist/{index.es91.js → index93.es.js} +3 -3
- package/dist/{index.es91.js.map → index93.es.js.map} +1 -1
- package/dist/{index.es92.js → index94.es.js} +1 -1
- package/dist/{index.es92.js.map → index94.es.js.map} +1 -1
- package/dist/{index.es93.js → index95.es.js} +1 -1
- package/dist/{index.es93.js.map → index95.es.js.map} +1 -1
- package/dist/{index.es94.js → index96.es.js} +1 -1
- package/dist/{index.es94.js.map → index96.es.js.map} +1 -1
- package/dist/{index.es95.js → index97.es.js} +1 -1
- package/dist/{index.es95.js.map → index97.es.js.map} +1 -1
- package/dist/{index.es96.js → index98.es.js} +1 -1
- package/dist/{index.es96.js.map → index98.es.js.map} +1 -1
- package/dist/{index.es109.js → index99.es.js} +2 -2
- package/dist/index99.es.js.map +1 -0
- package/dist/styles.css +428 -29
- package/package.json +1 -1
- package/dist/index.es109.js.map +0 -1
- package/dist/index.es34.js +0 -31
- package/dist/index.es34.js.map +0 -1
- package/dist/index.es40.js +0 -91
- package/dist/index.es40.js.map +0 -1
- package/dist/index.es78.js +0 -88
- package/dist/index.es78.js.map +0 -1
- package/dist/index.es88.js +0 -5
- package/dist/index.es88.js.map +0 -1
- package/dist/index.es97.js.map +0 -1
- package/dist/index.es98.js.map +0 -1
- package/dist/index.es99.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es152.js","sources":["../src/components/organisms/image-editor/engine/save-export.js"],"sourcesContent":["import { rasterizeWithFilter, supportsContextFilter } from './canvas-filter.js'\nimport { render, syncCanvasSize, baseFilter, paintLayer } from './rendering.js'\nimport { emit, emitChange, getState, resetAdjValues } from './state.js'\nimport { loadStickerImage } from './stickers.js'\n\nfunction isHeic(file) {\n const type = (file.type || '').toLowerCase()\n if (type === 'image/heic' || type === 'image/heif') return true\n const name = file instanceof File ? file.name.toLowerCase() : ''\n return name.endsWith('.heic') || name.endsWith('.heif')\n}\n\nfunction toObjectURL(blob, cb) {\n cb(URL.createObjectURL(blob))\n}\n\nfunction convertHeicThenLoad(src, cb) {\n import('heic2any')\n .then(({ default: heic2any }) =>\n heic2any({ blob: src, toType: 'image/jpeg', quality: 0.8 })\n )\n .then((converted) =>\n toObjectURL(Array.isArray(converted) ? converted[0] : converted, cb)\n )\n .catch(() => toObjectURL(src, cb))\n}\n\nexport function normalizeSource(state, src, cb) {\n state.isLoadingImage = true\n state.notify()\n if (!src) {\n cb(null)\n return\n }\n if (src instanceof HTMLCanvasElement) {\n cb(src.toDataURL())\n return\n }\n if (\n typeof Blob !== 'undefined' &&\n (src instanceof Blob || src instanceof File)\n ) {\n if (isHeic(src)) {\n if (typeof createImageBitmap === 'function') {\n createImageBitmap(src)\n .then((bmp) => {\n bmp.close()\n toObjectURL(src, cb)\n })\n .catch(() => convertHeicThenLoad(src, cb))\n return\n }\n convertHeicThenLoad(src, cb)\n return\n }\n toObjectURL(src, cb)\n return\n }\n cb(src)\n}\n\nexport function doLoadImage(state, dataURL) {\n const revoke = () => {\n if (typeof dataURL === 'string' && dataURL.startsWith('blob:')) {\n URL.revokeObjectURL(dataURL)\n }\n }\n const im = new Image()\n im.crossOrigin = 'anonymous'\n im.onload = () => {\n let w = im.naturalWidth,\n h = im.naturalHeight\n const MAX = 2000\n if (Math.max(w, h) > MAX) {\n const s = MAX / Math.max(w, h)\n w = Math.round(w * s)\n h = Math.round(h * s)\n }\n state.sourceCanvas.width = w\n state.sourceCanvas.height = h\n state.sourceCanvas.getContext('2d').drawImage(im, 0, 0, w, h)\n state.originalCanvas = document.createElement('canvas')\n state.originalCanvas.width = w\n state.originalCanvas.height = h\n state.originalCanvas.getContext('2d').drawImage(state.sourceCanvas, 0, 0)\n revoke()\n state.layers = []\n state.selectedId = null\n state.undoStack = []\n state.redoStack = []\n state.zoom = 1\n resetAdjValues(state)\n if (state.mounted) syncCanvasSize(state)\n render(state)\n state.mode = 'select'\n state.isLoadingImage = false\n state.statusText = 'Image loaded'\n emit(state, 'load', { width: w, height: h })\n emitChange(state)\n }\n im.onerror = () => {\n revoke()\n state.isLoadingImage = false\n state.statusText = 'Could not load that image (CORS?)'\n // eslint-disable-next-line no-console\n console.warn(\n '[ImageEditor] Failed to load image (likely a CORS issue on the source URL). ' +\n 'Reset stays disabled since there is nothing to revert to.',\n typeof dataURL === 'string' ? dataURL.slice(0, 80) : dataURL\n )\n state.notify()\n }\n im.src = dataURL\n}\n\nexport function loadState(state, s) {\n if (!s || !s.image) return\n const im = new Image()\n im.onload = () => {\n state.sourceCanvas.width = s.width || im.naturalWidth\n state.sourceCanvas.height = s.height || im.naturalHeight\n state.sourceCanvas\n .getContext('2d')\n .drawImage(im, 0, 0, state.sourceCanvas.width, state.sourceCanvas.height)\n state.originalCanvas = document.createElement('canvas')\n state.originalCanvas.width = state.sourceCanvas.width\n state.originalCanvas.height = state.sourceCanvas.height\n state.originalCanvas\n .getContext('2d')\n .drawImage(im, 0, 0, state.sourceCanvas.width, state.sourceCanvas.height)\n state.layers = JSON.parse(JSON.stringify(s.layers || []))\n state.layers.forEach((L) => {\n if (L.id >= state.nextId) state.nextId = L.id + 1\n })\n Object.assign(state.adj, s.adjustments || {})\n state.selectedId = null\n state.undoStack = []\n state.redoStack = []\n state.zoom = 1\n if (state.mounted) syncCanvasSize(state)\n render(state)\n state.mode = 'select'\n state.statusText = 'State restored'\n emit(state, 'load', { restored: true })\n emitChange(state)\n const stickerSrcs = [\n ...new Set(\n state.layers.filter((L) => L.type === 'sticker').map((L) => L.src)\n ),\n ]\n if (stickerSrcs.length) {\n Promise.all(\n stickerSrcs.map((src) => loadStickerImage(state, src).catch(() => {}))\n ).then(() => render(state))\n }\n }\n im.src = s.image\n}\n\nasync function flatten(state) {\n const out = document.createElement('canvas')\n out.width = state.sourceCanvas.width\n out.height = state.sourceCanvas.height\n const o = out.getContext('2d')\n const filter = baseFilter(state)\n\n if (supportsContextFilter()) {\n o.filter = filter\n o.drawImage(state.sourceCanvas, 0, 0)\n o.filter = 'none'\n } else {\n try {\n const filtered = await rasterizeWithFilter(state.sourceCanvas, filter)\n o.drawImage(filtered, 0, 0)\n } catch {\n o.drawImage(state.sourceCanvas, 0, 0)\n }\n }\n\n state.layers.forEach((L) => {\n if (!L._editing) paintLayer(state, o, L)\n })\n return out\n}\n\nfunction buildResult(state, canvasEl, blob, type) {\n const dataURL = canvasEl.toDataURL(type || 'image/png')\n const result = {\n blob: blob,\n dataURL: dataURL,\n canvas: canvasEl,\n width: canvasEl.width,\n height: canvasEl.height,\n type: (blob && blob.type) || type || 'image/png',\n state: getState(state),\n getBlob: (t, q) =>\n new Promise((res) => canvasEl.toBlob((b) => res(b), t || 'image/png', q)),\n download: (filename) => {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename || 'picture-studio.png'\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n return result\n },\n }\n return result\n}\n\nexport function produce(state, type, quality) {\n return flatten(state).then(\n (canvasEl) =>\n new Promise((resolve) => {\n canvasEl.toBlob(\n (blob) =>\n resolve(buildResult(state, canvasEl, blob, type || 'image/png')),\n type || 'image/png',\n quality\n )\n })\n )\n}\n\nexport function doSave(state, self) {\n if (state.isSaving) return\n state.isSaving = true\n state.notify()\n return produce(state, 'image/jpeg', 0.92)\n .then((result) => {\n emit(state, 'save', result)\n const ret =\n typeof state.config.onSave === 'function'\n ? state.config.onSave(result, self)\n : undefined\n return Promise.resolve(ret).finally(() => {\n state.isSaving = false\n state.notify()\n if (!state.config.keepOpenOnSave) self.close()\n })\n })\n .catch(() => {\n state.isSaving = false\n state.notify()\n })\n}\n"],"names":["isHeic","file","type","name","toObjectURL","blob","cb","convertHeicThenLoad","src","heic2any","converted","normalizeSource","state","bmp","doLoadImage","dataURL","revoke","im","w","h","MAX","s","resetAdjValues","syncCanvasSize","render","emit","emitChange","loadState","L","stickerSrcs","loadStickerImage","flatten","out","o","filter","baseFilter","supportsContextFilter","filtered","rasterizeWithFilter","paintLayer","buildResult","canvasEl","result","getState","t","q","res","b","filename","url","a","produce","quality","resolve","doSave","self","ret"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index162.es.js","sources":["../src/components/organisms/image-editor/engine/save-export.js"],"sourcesContent":["import { rasterizeWithFilter, supportsContextFilter } from './canvas-filter.js'\nimport { render, syncCanvasSize, baseFilter, paintLayer } from './rendering.js'\nimport { emit, emitChange, getState, resetAdjValues } from './state.js'\nimport { loadStickerImage } from './stickers.js'\n\nfunction isHeic(file) {\n const type = (file.type || '').toLowerCase()\n if (type === 'image/heic' || type === 'image/heif') return true\n const name = file instanceof File ? file.name.toLowerCase() : ''\n return name.endsWith('.heic') || name.endsWith('.heif')\n}\n\nfunction toObjectURL(blob, cb) {\n cb(URL.createObjectURL(blob))\n}\n\nfunction convertHeicThenLoad(src, cb) {\n import('heic2any')\n .then(({ default: heic2any }) =>\n heic2any({ blob: src, toType: 'image/jpeg', quality: 0.8 })\n )\n .then((converted) =>\n toObjectURL(Array.isArray(converted) ? converted[0] : converted, cb)\n )\n .catch(() => toObjectURL(src, cb))\n}\n\nexport function normalizeSource(state, src, cb) {\n state.isLoadingImage = true\n state.notify()\n if (!src) {\n cb(null)\n return\n }\n if (src instanceof HTMLCanvasElement) {\n cb(src.toDataURL())\n return\n }\n if (\n typeof Blob !== 'undefined' &&\n (src instanceof Blob || src instanceof File)\n ) {\n if (isHeic(src)) {\n if (typeof createImageBitmap === 'function') {\n createImageBitmap(src)\n .then((bmp) => {\n bmp.close()\n toObjectURL(src, cb)\n })\n .catch(() => convertHeicThenLoad(src, cb))\n return\n }\n convertHeicThenLoad(src, cb)\n return\n }\n toObjectURL(src, cb)\n return\n }\n cb(src)\n}\n\nexport function doLoadImage(state, dataURL) {\n const revoke = () => {\n if (typeof dataURL === 'string' && dataURL.startsWith('blob:')) {\n URL.revokeObjectURL(dataURL)\n }\n }\n const im = new Image()\n im.crossOrigin = 'anonymous'\n im.onload = () => {\n let w = im.naturalWidth,\n h = im.naturalHeight\n const MAX = 2000\n if (Math.max(w, h) > MAX) {\n const s = MAX / Math.max(w, h)\n w = Math.round(w * s)\n h = Math.round(h * s)\n }\n state.sourceCanvas.width = w\n state.sourceCanvas.height = h\n state.sourceCanvas.getContext('2d').drawImage(im, 0, 0, w, h)\n state.originalCanvas = document.createElement('canvas')\n state.originalCanvas.width = w\n state.originalCanvas.height = h\n state.originalCanvas.getContext('2d').drawImage(state.sourceCanvas, 0, 0)\n revoke()\n state.layers = []\n state.selectedId = null\n state.undoStack = []\n state.redoStack = []\n state.zoom = 1\n resetAdjValues(state)\n if (state.mounted) syncCanvasSize(state)\n render(state)\n state.mode = 'select'\n state.isLoadingImage = false\n state.statusText = 'Image loaded'\n emit(state, 'load', { width: w, height: h })\n emitChange(state)\n }\n im.onerror = () => {\n revoke()\n state.isLoadingImage = false\n state.statusText = 'Could not load that image (CORS?)'\n // eslint-disable-next-line no-console\n console.warn(\n '[ImageEditor] Failed to load image (likely a CORS issue on the source URL). ' +\n 'Reset stays disabled since there is nothing to revert to.',\n typeof dataURL === 'string' ? dataURL.slice(0, 80) : dataURL\n )\n state.notify()\n }\n im.src = dataURL\n}\n\nexport function loadState(state, s) {\n if (!s || !s.image) return\n const im = new Image()\n im.onload = () => {\n state.sourceCanvas.width = s.width || im.naturalWidth\n state.sourceCanvas.height = s.height || im.naturalHeight\n state.sourceCanvas\n .getContext('2d')\n .drawImage(im, 0, 0, state.sourceCanvas.width, state.sourceCanvas.height)\n state.originalCanvas = document.createElement('canvas')\n state.originalCanvas.width = state.sourceCanvas.width\n state.originalCanvas.height = state.sourceCanvas.height\n state.originalCanvas\n .getContext('2d')\n .drawImage(im, 0, 0, state.sourceCanvas.width, state.sourceCanvas.height)\n state.layers = JSON.parse(JSON.stringify(s.layers || []))\n state.layers.forEach((L) => {\n if (L.id >= state.nextId) state.nextId = L.id + 1\n })\n Object.assign(state.adj, s.adjustments || {})\n state.selectedId = null\n state.undoStack = []\n state.redoStack = []\n state.zoom = 1\n if (state.mounted) syncCanvasSize(state)\n render(state)\n state.mode = 'select'\n state.statusText = 'State restored'\n emit(state, 'load', { restored: true })\n emitChange(state)\n const stickerSrcs = [\n ...new Set(\n state.layers.filter((L) => L.type === 'sticker').map((L) => L.src)\n ),\n ]\n if (stickerSrcs.length) {\n Promise.all(\n stickerSrcs.map((src) => loadStickerImage(state, src).catch(() => {}))\n ).then(() => render(state))\n }\n }\n im.src = s.image\n}\n\nasync function flatten(state) {\n const out = document.createElement('canvas')\n out.width = state.sourceCanvas.width\n out.height = state.sourceCanvas.height\n const o = out.getContext('2d')\n const filter = baseFilter(state)\n\n if (supportsContextFilter()) {\n o.filter = filter\n o.drawImage(state.sourceCanvas, 0, 0)\n o.filter = 'none'\n } else {\n try {\n const filtered = await rasterizeWithFilter(state.sourceCanvas, filter)\n o.drawImage(filtered, 0, 0)\n } catch {\n o.drawImage(state.sourceCanvas, 0, 0)\n }\n }\n\n state.layers.forEach((L) => {\n if (!L._editing) paintLayer(state, o, L)\n })\n return out\n}\n\nfunction buildResult(state, canvasEl, blob, type) {\n const dataURL = canvasEl.toDataURL(type || 'image/png')\n const result = {\n blob: blob,\n dataURL: dataURL,\n canvas: canvasEl,\n width: canvasEl.width,\n height: canvasEl.height,\n type: (blob && blob.type) || type || 'image/png',\n state: getState(state),\n getBlob: (t, q) =>\n new Promise((res) => canvasEl.toBlob((b) => res(b), t || 'image/png', q)),\n download: (filename) => {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename || 'picture-studio.png'\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 1000)\n return result\n },\n }\n return result\n}\n\nexport function produce(state, type, quality) {\n return flatten(state).then(\n (canvasEl) =>\n new Promise((resolve) => {\n canvasEl.toBlob(\n (blob) =>\n resolve(buildResult(state, canvasEl, blob, type || 'image/png')),\n type || 'image/png',\n quality\n )\n })\n )\n}\n\nexport function doSave(state, self) {\n if (state.isSaving) return\n state.isSaving = true\n state.notify()\n return produce(state, 'image/jpeg', 0.92)\n .then((result) => {\n emit(state, 'save', result)\n const ret =\n typeof state.config.onSave === 'function'\n ? state.config.onSave(result, self)\n : undefined\n return Promise.resolve(ret).finally(() => {\n state.isSaving = false\n state.notify()\n if (!state.config.keepOpenOnSave) self.close()\n })\n })\n .catch(() => {\n state.isSaving = false\n state.notify()\n })\n}\n"],"names":["isHeic","file","type","name","toObjectURL","blob","cb","convertHeicThenLoad","src","heic2any","converted","normalizeSource","state","bmp","doLoadImage","dataURL","revoke","im","w","h","MAX","s","resetAdjValues","syncCanvasSize","render","emit","emitChange","loadState","L","stickerSrcs","loadStickerImage","flatten","out","o","filter","baseFilter","supportsContextFilter","filtered","rasterizeWithFilter","paintLayer","buildResult","canvasEl","result","getState","t","q","res","b","filename","url","a","produce","quality","resolve","doSave","self","ret"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { pushHistory as u } from "./
|
|
2
|
-
import { emitChange as h } from "./
|
|
3
|
-
import { render as p, layerBounds as m } from "./
|
|
1
|
+
import { pushHistory as u } from "./index156.es.js";
|
|
2
|
+
import { emitChange as h } from "./index154.es.js";
|
|
3
|
+
import { render as p, layerBounds as m } from "./index155.es.js";
|
|
4
4
|
const l = "geoiq-image-editor:saved-layers:v1", b = 200;
|
|
5
5
|
function v(e) {
|
|
6
6
|
const r = e.config?.savedLayersScope;
|
|
@@ -144,4 +144,4 @@ export {
|
|
|
144
144
|
D as setSavedLayers,
|
|
145
145
|
v as storageKey
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=
|
|
147
|
+
//# sourceMappingURL=index163.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es153.js","sources":["../src/components/organisms/image-editor/engine/saved-layers.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange } from './state.js'\nimport { render, layerBounds } from './rendering.js'\n\nconst STORAGE_PREFIX = 'geoiq-image-editor:saved-layers:v1'\nexport const MAX_LOCAL_SAVED = 200\n\nexport function storageKey(state) {\n const scope = state.config?.savedLayersScope\n return scope ? `${STORAGE_PREFIX}:${String(scope)}` : STORAGE_PREFIX\n}\n\nconst TRANSIENT = ['id', '_editing', '_bounds', '_anchorPt']\n\nfunction canUseStorage() {\n try {\n return typeof window !== 'undefined' && !!window.localStorage\n } catch {\n // Safari in private mode throws on access rather than returning null.\n return false\n }\n}\n\nfunction readStorage(state) {\n if (!canUseStorage()) return []\n try {\n const raw = window.localStorage.getItem(storageKey(state))\n const parsed = raw ? JSON.parse(raw) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\nfunction writeStorage(state, items) {\n if (!canUseStorage()) return\n try {\n window.localStorage.setItem(storageKey(state), JSON.stringify(items))\n } catch {\n // Quota exceeded, or storage disabled — the in-memory list still works\n // for this session, so failing silently is better than breaking the editor.\n }\n}\n\n// Host-supplied when the app persists them itself, otherwise localStorage.\nexport function loadSavedLayers(state) {\n const fromConfig = state.config?.savedLayers\n state.savedLayers = Array.isArray(fromConfig)\n ? fromConfig.slice()\n : readStorage(state)\n return state.savedLayers\n}\n\n// The engine is created before the host's fetch resolves, so the library has to\n// be pushed in rather than read from the captured config.\nexport function setSavedLayers(state, list) {\n state.savedLayers = Array.isArray(list) ? list.slice() : []\n // Host-owned lists are not mirrored into localStorage: the app is the source\n // of truth, and a stale local copy would resurface deleted layers.\n if (!isHostManaged(state)) persist_(state)\n state.notify()\n}\n\nfunction isHostManaged(state) {\n return (\n Array.isArray(state.config?.savedLayers) ||\n typeof state.config?.onSavedLayersChange === 'function'\n )\n}\n\nfunction persist(state) {\n if (!isHostManaged(state)) persist_(state)\n state.config?.onSavedLayersChange?.(state.savedLayers.slice())\n state.notify()\n}\n\nfunction persist_(state) {\n writeStorage(state, state.savedLayers)\n}\n\nfunction autoName(L) {\n if (L.type === 'text') {\n const t = (L.text || '').trim().replace(/\\s+/g, ' ')\n return t ? t.slice(0, 40) : 'Text'\n }\n if (L.type === 'shape') {\n if (L.label) return String(L.label).trim().slice(0, 40)\n return L.points && L.points.length > 2 ? 'Multi-point line' : L.shape\n }\n if (L.type === 'stroke') return 'Drawing'\n if (L.type === 'sticker') return 'Sticker'\n return 'Layer'\n}\n\nexport function saveSelectedLayer(state, name) {\n const L =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n if (!L) return null\n const copy = JSON.parse(JSON.stringify(L))\n TRANSIENT.forEach((k) => delete copy[k])\n const entry = {\n id: `sl_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`,\n name: (name || '').trim() || autoName(L),\n createdAt: Date.now(),\n layer: copy,\n }\n const next = [entry, ...(state.savedLayers || [])]\n const capped = isHostManaged(state) ? next : next.slice(0, MAX_LOCAL_SAVED)\n const dropped = next.length - capped.length\n state.savedLayers = capped\n persist(state)\n // Evicting someone's oldest layer without saying so reads as data loss.\n state.statusText = dropped\n ? `Saved \"${entry.name}\" — library full, oldest ${\n dropped === 1 ? 'layer was' : 'layers were'\n } removed`\n : `Saved \"${entry.name}\"`\n return entry\n}\n\nexport function deleteSavedLayer(state, id) {\n state.savedLayers = (state.savedLayers || []).filter((s) => s.id !== id)\n persist(state)\n state.statusText = 'Saved layer removed'\n}\n\nexport function renameSavedLayer(state, id, name) {\n const entry = (state.savedLayers || []).find((s) => s.id === id)\n if (!entry) return\n entry.name = (name || '').trim() || entry.name\n persist(state)\n}\n\n// A layer saved over a large photo would spill off a small one. Shrinks only:\n// blowing a small layer up to fill a big image is rarely wanted.\nfunction fitToCanvas(state, L) {\n const cw = state.sourceCanvas.width\n const ch = state.sourceCanvas.height\n const b = layerBounds(state, L)\n if (!b.w || !b.h) return\n const k = Math.min((cw * 0.9) / b.w, (ch * 0.9) / b.h, 1)\n if (k >= 1) return\n\n const scalePt = (p) => ({\n x: (p.x - b.x) * k + b.x,\n y: (p.y - b.y) * k + b.y,\n })\n if (L.points) {\n L.points = L.points.map(scalePt)\n } else {\n const o = scalePt({ x: L.x || 0, y: L.y || 0 })\n L.x = o.x\n L.y = o.y\n if (typeof L.w === 'number') L.w *= k\n if (typeof L.h === 'number') L.h *= k\n }\n if (typeof L.size === 'number') L.size *= k\n if (typeof L.boxWidth === 'number') L.boxWidth *= k\n if (typeof L.width === 'number') L.width = Math.max(1, L.width * k)\n if (typeof L.labelSize === 'number') L.labelSize *= k\n if (typeof L.labelOffset === 'number') L.labelOffset *= k\n if (typeof L.labelDx === 'number') L.labelDx *= k\n if (typeof L.labelDy === 'number') L.labelDy *= k\n}\n\nfunction centreOnCanvas(state, L) {\n const b = layerBounds(state, L)\n const dx = (state.sourceCanvas.width - b.w) / 2 - b.x\n const dy = (state.sourceCanvas.height - b.h) / 2 - b.y\n if (L.points) {\n L.points = L.points.map((p) => ({ x: p.x + dx, y: p.y + dy }))\n } else {\n L.x = (L.x || 0) + dx\n L.y = (L.y || 0) + dy\n }\n}\n\nexport function insertSavedLayer(state, id) {\n const entry = (state.savedLayers || []).find((s) => s.id === id)\n if (!entry || !state.sourceCanvas.width) return\n pushHistory(state)\n const L = JSON.parse(JSON.stringify(entry.layer))\n TRANSIENT.forEach((k) => delete L[k])\n const highest = state.layers.reduce(\n (m, l) => (typeof l.id === 'number' && l.id > m ? l.id : m),\n 0\n )\n state.nextId = Math.max(state.nextId, highest + 1)\n L.id = state.nextId++\n fitToCanvas(state, L)\n centreOnCanvas(state, L)\n state.layers.push(L)\n state.mode = 'select'\n state.selectedId = L.id\n render(state)\n state.statusText = `Added \"${entry.name}\"`\n emitChange(state)\n}\n\n// Search results come from the host's API and may not be in the local list, so\n// an id lookup would miss them.\nexport function insertSavedLayerEntry(state, entry) {\n if (!entry || !entry.layer || !state.sourceCanvas.width) return\n pushHistory(state)\n const L = JSON.parse(JSON.stringify(entry.layer))\n TRANSIENT.forEach((k) => delete L[k])\n const highest = state.layers.reduce(\n (m, l) => (typeof l.id === 'number' && l.id > m ? l.id : m),\n 0\n )\n state.nextId = Math.max(state.nextId, highest + 1)\n L.id = state.nextId++\n fitToCanvas(state, L)\n centreOnCanvas(state, L)\n state.layers.push(L)\n state.mode = 'select'\n state.selectedId = L.id\n render(state)\n state.statusText = `Added \"${entry.name || 'layer'}\"`\n emitChange(state)\n}\n\nexport function canSearch(state) {\n return typeof state.config?.onSearchSavedLayers === 'function'\n}\n\n// Uses the host's API when wired up, otherwise filters locally so search still\n// works on the localStorage fallback.\nexport function searchSavedLayers(state, query) {\n const q = (query || '').trim()\n if (canSearch(state)) {\n return Promise.resolve(state.config.onSearchSavedLayers(q)).then((r) =>\n Array.isArray(r) ? r : []\n )\n }\n const needle = q.toLowerCase()\n const list = state.savedLayers || []\n return Promise.resolve(\n needle\n ? list.filter((e) => (e.name || '').toLowerCase().includes(needle))\n : list.slice()\n )\n}\n"],"names":["STORAGE_PREFIX","MAX_LOCAL_SAVED","storageKey","state","scope","TRANSIENT","canUseStorage","readStorage","raw","parsed","writeStorage","items","loadSavedLayers","fromConfig","setSavedLayers","list","isHostManaged","persist_","persist","autoName","L","t","saveSelectedLayer","name","l","copy","k","entry","next","capped","dropped","deleteSavedLayer","id","s","renameSavedLayer","fitToCanvas","cw","ch","b","layerBounds","scalePt","p","o","centreOnCanvas","dx","dy","insertSavedLayer","pushHistory","highest","m","render","emitChange","insertSavedLayerEntry","canSearch","searchSavedLayers","query","q","r","needle","e"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index163.es.js","sources":["../src/components/organisms/image-editor/engine/saved-layers.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange } from './state.js'\nimport { render, layerBounds } from './rendering.js'\n\nconst STORAGE_PREFIX = 'geoiq-image-editor:saved-layers:v1'\nexport const MAX_LOCAL_SAVED = 200\n\nexport function storageKey(state) {\n const scope = state.config?.savedLayersScope\n return scope ? `${STORAGE_PREFIX}:${String(scope)}` : STORAGE_PREFIX\n}\n\nconst TRANSIENT = ['id', '_editing', '_bounds', '_anchorPt']\n\nfunction canUseStorage() {\n try {\n return typeof window !== 'undefined' && !!window.localStorage\n } catch {\n // Safari in private mode throws on access rather than returning null.\n return false\n }\n}\n\nfunction readStorage(state) {\n if (!canUseStorage()) return []\n try {\n const raw = window.localStorage.getItem(storageKey(state))\n const parsed = raw ? JSON.parse(raw) : []\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\nfunction writeStorage(state, items) {\n if (!canUseStorage()) return\n try {\n window.localStorage.setItem(storageKey(state), JSON.stringify(items))\n } catch {\n // Quota exceeded, or storage disabled — the in-memory list still works\n // for this session, so failing silently is better than breaking the editor.\n }\n}\n\n// Host-supplied when the app persists them itself, otherwise localStorage.\nexport function loadSavedLayers(state) {\n const fromConfig = state.config?.savedLayers\n state.savedLayers = Array.isArray(fromConfig)\n ? fromConfig.slice()\n : readStorage(state)\n return state.savedLayers\n}\n\n// The engine is created before the host's fetch resolves, so the library has to\n// be pushed in rather than read from the captured config.\nexport function setSavedLayers(state, list) {\n state.savedLayers = Array.isArray(list) ? list.slice() : []\n // Host-owned lists are not mirrored into localStorage: the app is the source\n // of truth, and a stale local copy would resurface deleted layers.\n if (!isHostManaged(state)) persist_(state)\n state.notify()\n}\n\nfunction isHostManaged(state) {\n return (\n Array.isArray(state.config?.savedLayers) ||\n typeof state.config?.onSavedLayersChange === 'function'\n )\n}\n\nfunction persist(state) {\n if (!isHostManaged(state)) persist_(state)\n state.config?.onSavedLayersChange?.(state.savedLayers.slice())\n state.notify()\n}\n\nfunction persist_(state) {\n writeStorage(state, state.savedLayers)\n}\n\nfunction autoName(L) {\n if (L.type === 'text') {\n const t = (L.text || '').trim().replace(/\\s+/g, ' ')\n return t ? t.slice(0, 40) : 'Text'\n }\n if (L.type === 'shape') {\n if (L.label) return String(L.label).trim().slice(0, 40)\n return L.points && L.points.length > 2 ? 'Multi-point line' : L.shape\n }\n if (L.type === 'stroke') return 'Drawing'\n if (L.type === 'sticker') return 'Sticker'\n return 'Layer'\n}\n\nexport function saveSelectedLayer(state, name) {\n const L =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n if (!L) return null\n const copy = JSON.parse(JSON.stringify(L))\n TRANSIENT.forEach((k) => delete copy[k])\n const entry = {\n id: `sl_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 7)}`,\n name: (name || '').trim() || autoName(L),\n createdAt: Date.now(),\n layer: copy,\n }\n const next = [entry, ...(state.savedLayers || [])]\n const capped = isHostManaged(state) ? next : next.slice(0, MAX_LOCAL_SAVED)\n const dropped = next.length - capped.length\n state.savedLayers = capped\n persist(state)\n // Evicting someone's oldest layer without saying so reads as data loss.\n state.statusText = dropped\n ? `Saved \"${entry.name}\" — library full, oldest ${\n dropped === 1 ? 'layer was' : 'layers were'\n } removed`\n : `Saved \"${entry.name}\"`\n return entry\n}\n\nexport function deleteSavedLayer(state, id) {\n state.savedLayers = (state.savedLayers || []).filter((s) => s.id !== id)\n persist(state)\n state.statusText = 'Saved layer removed'\n}\n\nexport function renameSavedLayer(state, id, name) {\n const entry = (state.savedLayers || []).find((s) => s.id === id)\n if (!entry) return\n entry.name = (name || '').trim() || entry.name\n persist(state)\n}\n\n// A layer saved over a large photo would spill off a small one. Shrinks only:\n// blowing a small layer up to fill a big image is rarely wanted.\nfunction fitToCanvas(state, L) {\n const cw = state.sourceCanvas.width\n const ch = state.sourceCanvas.height\n const b = layerBounds(state, L)\n if (!b.w || !b.h) return\n const k = Math.min((cw * 0.9) / b.w, (ch * 0.9) / b.h, 1)\n if (k >= 1) return\n\n const scalePt = (p) => ({\n x: (p.x - b.x) * k + b.x,\n y: (p.y - b.y) * k + b.y,\n })\n if (L.points) {\n L.points = L.points.map(scalePt)\n } else {\n const o = scalePt({ x: L.x || 0, y: L.y || 0 })\n L.x = o.x\n L.y = o.y\n if (typeof L.w === 'number') L.w *= k\n if (typeof L.h === 'number') L.h *= k\n }\n if (typeof L.size === 'number') L.size *= k\n if (typeof L.boxWidth === 'number') L.boxWidth *= k\n if (typeof L.width === 'number') L.width = Math.max(1, L.width * k)\n if (typeof L.labelSize === 'number') L.labelSize *= k\n if (typeof L.labelOffset === 'number') L.labelOffset *= k\n if (typeof L.labelDx === 'number') L.labelDx *= k\n if (typeof L.labelDy === 'number') L.labelDy *= k\n}\n\nfunction centreOnCanvas(state, L) {\n const b = layerBounds(state, L)\n const dx = (state.sourceCanvas.width - b.w) / 2 - b.x\n const dy = (state.sourceCanvas.height - b.h) / 2 - b.y\n if (L.points) {\n L.points = L.points.map((p) => ({ x: p.x + dx, y: p.y + dy }))\n } else {\n L.x = (L.x || 0) + dx\n L.y = (L.y || 0) + dy\n }\n}\n\nexport function insertSavedLayer(state, id) {\n const entry = (state.savedLayers || []).find((s) => s.id === id)\n if (!entry || !state.sourceCanvas.width) return\n pushHistory(state)\n const L = JSON.parse(JSON.stringify(entry.layer))\n TRANSIENT.forEach((k) => delete L[k])\n const highest = state.layers.reduce(\n (m, l) => (typeof l.id === 'number' && l.id > m ? l.id : m),\n 0\n )\n state.nextId = Math.max(state.nextId, highest + 1)\n L.id = state.nextId++\n fitToCanvas(state, L)\n centreOnCanvas(state, L)\n state.layers.push(L)\n state.mode = 'select'\n state.selectedId = L.id\n render(state)\n state.statusText = `Added \"${entry.name}\"`\n emitChange(state)\n}\n\n// Search results come from the host's API and may not be in the local list, so\n// an id lookup would miss them.\nexport function insertSavedLayerEntry(state, entry) {\n if (!entry || !entry.layer || !state.sourceCanvas.width) return\n pushHistory(state)\n const L = JSON.parse(JSON.stringify(entry.layer))\n TRANSIENT.forEach((k) => delete L[k])\n const highest = state.layers.reduce(\n (m, l) => (typeof l.id === 'number' && l.id > m ? l.id : m),\n 0\n )\n state.nextId = Math.max(state.nextId, highest + 1)\n L.id = state.nextId++\n fitToCanvas(state, L)\n centreOnCanvas(state, L)\n state.layers.push(L)\n state.mode = 'select'\n state.selectedId = L.id\n render(state)\n state.statusText = `Added \"${entry.name || 'layer'}\"`\n emitChange(state)\n}\n\nexport function canSearch(state) {\n return typeof state.config?.onSearchSavedLayers === 'function'\n}\n\n// Uses the host's API when wired up, otherwise filters locally so search still\n// works on the localStorage fallback.\nexport function searchSavedLayers(state, query) {\n const q = (query || '').trim()\n if (canSearch(state)) {\n return Promise.resolve(state.config.onSearchSavedLayers(q)).then((r) =>\n Array.isArray(r) ? r : []\n )\n }\n const needle = q.toLowerCase()\n const list = state.savedLayers || []\n return Promise.resolve(\n needle\n ? list.filter((e) => (e.name || '').toLowerCase().includes(needle))\n : list.slice()\n )\n}\n"],"names":["STORAGE_PREFIX","MAX_LOCAL_SAVED","storageKey","state","scope","TRANSIENT","canUseStorage","readStorage","raw","parsed","writeStorage","items","loadSavedLayers","fromConfig","setSavedLayers","list","isHostManaged","persist_","persist","autoName","L","t","saveSelectedLayer","name","l","copy","k","entry","next","capped","dropped","deleteSavedLayer","id","s","renameSavedLayer","fitToCanvas","cw","ch","b","layerBounds","scalePt","p","o","centreOnCanvas","dx","dy","insertSavedLayer","pushHistory","highest","m","render","emitChange","insertSavedLayerEntry","canSearch","searchSavedLayers","query","q","r","needle","e"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { onDown as v, onMove as u, onUp as E, onDbl as t, finishPoly as a, undoPolyPoint as m, cancelPoly as g } from "./
|
|
2
|
-
import { autoGrowTextEditor as L, commitTextEdit as k, blurTextEditor as x } from "./
|
|
3
|
-
import { undo as P, redo as D } from "./
|
|
4
|
-
import { applyModeCursor as w, selectLayer as l, setMode as T } from "./
|
|
5
|
-
import { fitStage as z, render as p, syncCanvasSize as K } from "./
|
|
6
|
-
import { normalizeSource as h, doLoadImage as C } from "./
|
|
7
|
-
import { deleteLayer as I } from "./
|
|
8
|
-
import { panPointerUp as y, resetPan as c, panPointerDown as b, panPointerMove as _ } from "./
|
|
1
|
+
import { onDown as v, onMove as u, onUp as E, onDbl as t, finishPoly as a, undoPolyPoint as m, cancelPoly as g } from "./index165.es.js";
|
|
2
|
+
import { autoGrowTextEditor as L, commitTextEdit as k, blurTextEditor as x } from "./index159.es.js";
|
|
3
|
+
import { undo as P, redo as D } from "./index156.es.js";
|
|
4
|
+
import { applyModeCursor as w, selectLayer as l, setMode as T } from "./index158.es.js";
|
|
5
|
+
import { fitStage as z, render as p, syncCanvasSize as K } from "./index155.es.js";
|
|
6
|
+
import { normalizeSource as h, doLoadImage as C } from "./index162.es.js";
|
|
7
|
+
import { deleteLayer as I } from "./index161.es.js";
|
|
8
|
+
import { panPointerUp as y, resetPan as c, panPointerDown as b, panPointerMove as _ } from "./index170.es.js";
|
|
9
9
|
function G(e, i, o) {
|
|
10
10
|
e.canvasEl = o.canvas, e.overlayEl = o.overlay, e.textEditorEl = o.textEditor, e.stageEl = o.stage, e.ctx = e.canvasEl.getContext("2d"), e.octx = e.overlayEl.getContext("2d"), e.mounted = !0, w(e), e.overlayEl.addEventListener(
|
|
11
11
|
"lostpointercapture",
|
|
@@ -47,4 +47,4 @@ function G(e, i, o) {
|
|
|
47
47
|
export {
|
|
48
48
|
G as mount
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=index164.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index164.es.js","sources":["../src/components/organisms/image-editor/engine/mount.js"],"sourcesContent":["import {\n onDown,\n onMove,\n onUp,\n onDbl,\n cancelPoly,\n finishPoly,\n undoPolyPoint,\n} from './pointer.js'\nimport {\n autoGrowTextEditor,\n blurTextEditor,\n commitTextEdit,\n} from './text-editor.js'\nimport { undo, redo } from './history.js'\nimport { setMode, selectLayer, applyModeCursor } from './mode.js'\nimport { fitStage, render, syncCanvasSize } from './rendering.js'\nimport { normalizeSource, doLoadImage } from './save-export.js'\nimport { deleteLayer } from './layer-actions.js'\nimport {\n panPointerDown,\n panPointerMove,\n panPointerUp,\n resetPan,\n} from './touch-pan.js'\n\nexport function mount(state, self, refs) {\n state.canvasEl = refs.canvas\n state.overlayEl = refs.overlay\n state.textEditorEl = refs.textEditor\n state.stageEl = refs.stage\n state.ctx = state.canvasEl.getContext('2d')\n state.octx = state.overlayEl.getContext('2d')\n state.mounted = true\n applyModeCursor(state)\n\n state.overlayEl.addEventListener('lostpointercapture', (e) =>\n panPointerUp(state, e)\n )\n state.overlayEl.addEventListener('pointerdown', (e) => {\n e.preventDefault()\n if (e.isPrimary && state.panPointers?.size) resetPan(state)\n if (panPointerDown(state, e)) return\n onDown(state, e)\n })\n state.overlayEl.addEventListener('pointermove', (e) => {\n e.preventDefault()\n if (panPointerMove(state, e)) return\n onMove(state, e)\n })\n state.overlayEl.addEventListener('pointerup', (e) => {\n panPointerUp(state, e)\n onUp(state, e)\n })\n state.overlayEl.addEventListener('pointercancel', (e) => {\n resetPan(state)\n onUp(state, e)\n })\n state.overlayEl.addEventListener('dblclick', (e) => onDbl(state, e))\n\n // Commit, unfocus, deselect — guarded so an ordinary drag never deselects.\n const endTextEdit = () => {\n if (!state.editingLayer) return\n blurTextEditor(state)\n selectLayer(state, null)\n }\n\n state.textEditorEl.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n // Enter inserts a newline; stopped so no parent form reads it as submit.\n e.stopPropagation()\n if (e.metaKey || e.ctrlKey) {\n e.preventDefault()\n endTextEdit()\n }\n } else if (e.key === 'Escape') {\n // Escape discards the edit, so restore nothing — just let go.\n e.stopPropagation()\n if (state.editingLayer) state.editingLayer._editing = false\n state.editingLayer = null\n state.textEditorEl.blur()\n selectLayer(state, null)\n }\n })\n state.textEditorEl.addEventListener('input', () => autoGrowTextEditor(state))\n state.textEditorEl.addEventListener('blur', () => commitTextEdit(state))\n\n // Capture phase: the overlay preventDefaults away the implicit blur.\n state.stageEl.addEventListener(\n 'pointerdown',\n (e) => {\n if (e.target === state.textEditorEl) return\n endTextEdit()\n // Presses on the padding deselect; presses on the image are onDown's.\n if (e.target !== state.overlayEl && state.selectedId != null) {\n selectLayer(state, null)\n }\n },\n true\n )\n ;['dragover', 'dragenter'].forEach((ev) =>\n state.stageEl.addEventListener(ev, (e) => e.preventDefault())\n )\n state.stageEl.addEventListener('drop', (e) => {\n e.preventDefault()\n const f = e.dataTransfer.files[0]\n if (f && f.type.startsWith('image/'))\n normalizeSource(state, f, (d) => doLoadImage(state, d))\n })\n\n self._keyHandler = (e) => {\n if (!self.isOpen()) return\n const tag = document.activeElement && document.activeElement.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return\n if (state.pendingPoly && e.key === 'Enter') {\n e.preventDefault()\n finishPoly(state, false)\n } else if (\n state.pendingPoly &&\n (e.key === 'Backspace' || e.key === 'Delete')\n ) {\n // While drawing, Backspace takes back the last corner rather than\n // deleting a layer -- misclicking a corner shouldn't cost the whole line.\n e.preventDefault()\n undoPolyPoint(state)\n } else if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n e.preventDefault()\n undo(state)\n } else if (\n (e.metaKey || e.ctrlKey) &&\n (e.key === 'y' || (e.shiftKey && e.key === 'z'))\n ) {\n e.preventDefault()\n redo(state)\n } else if (e.key === 'Escape') {\n if (state.pendingPoly) {\n // A half-drawn line is the innermost thing Escape can back out of.\n cancelPoly(state)\n } else if (state.mode !== 'select' || state.selectedId != null) {\n setMode(state, 'select')\n selectLayer(state, null)\n } else if (state.config.closeOnEscape !== false) self.close()\n } else if (\n (e.key === 'Delete' || e.key === 'Backspace') &&\n state.selectedId != null &&\n state.mode === 'select'\n ) {\n e.preventDefault()\n deleteLayer(state, state.selectedId)\n }\n }\n document.addEventListener('keydown', self._keyHandler)\n\n self._resizeHandler = () => {\n if (state.sourceCanvas.width && self.isOpen()) {\n fitStage(state)\n render(state)\n }\n }\n window.addEventListener('resize', self._resizeHandler)\n\n if (state.sourceCanvas.width) {\n syncCanvasSize(state)\n render(state)\n }\n}\n"],"names":["mount","state","self","refs","applyModeCursor","e","panPointerUp","resetPan","panPointerDown","onDown","panPointerMove","onMove","onUp","onDbl","endTextEdit","blurTextEditor","selectLayer","autoGrowTextEditor","commitTextEdit","ev","f","normalizeSource","d","doLoadImage","tag","finishPoly","undoPolyPoint","undo","redo","cancelPoly","setMode","deleteLayer","fitStage","render","syncCanvasSize"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { pushHistory as f, popHistory as O } from "./
|
|
2
|
-
import { emitChange as P } from "./
|
|
3
|
-
import { MULTI_POINT_SHAPES as R, render as t, paintLayer as S, onRotateHandle as A, layerCenter as b, onResizeHandle as T, isMultiPoint as I, layerBounds as v, DIRECTIONAL_SHAPES as z, rotatePoint as C, clampBoxWidth as W, clampTextSize as _, renderOverlay as g, normRect as F, toLayerSpace as D } from "./
|
|
4
|
-
import { setMode as k, selectLayer as x } from "./
|
|
5
|
-
import { openTextEditor as N } from "./
|
|
1
|
+
import { pushHistory as f, popHistory as O } from "./index156.es.js";
|
|
2
|
+
import { emitChange as P } from "./index154.es.js";
|
|
3
|
+
import { MULTI_POINT_SHAPES as R, render as t, paintLayer as S, onRotateHandle as A, layerCenter as b, onResizeHandle as T, isMultiPoint as I, layerBounds as v, DIRECTIONAL_SHAPES as z, rotatePoint as C, clampBoxWidth as W, clampTextSize as _, renderOverlay as g, normRect as F, toLayerSpace as D } from "./index155.es.js";
|
|
4
|
+
import { setMode as k, selectLayer as x } from "./index158.es.js";
|
|
5
|
+
import { openTextEditor as N } from "./index159.es.js";
|
|
6
6
|
function a(n, l) {
|
|
7
7
|
const r = n.dragMode && n.dragRect ? n.dragRect : n.overlayEl.getBoundingClientRect(), o = (l.clientX - r.left) / r.width * n.sourceCanvas.width, e = (l.clientY - r.top) / r.height * n.sourceCanvas.height;
|
|
8
8
|
return {
|
|
@@ -355,4 +355,4 @@ export {
|
|
|
355
355
|
a as toSource,
|
|
356
356
|
on as undoPolyPoint
|
|
357
357
|
};
|
|
358
|
-
//# sourceMappingURL=
|
|
358
|
+
//# sourceMappingURL=index165.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es155.js","sources":["../src/components/organisms/image-editor/engine/pointer.js"],"sourcesContent":["import { pushHistory, popHistory } from './history.js'\nimport { emitChange } from './state.js'\nimport {\n render,\n renderOverlay,\n paintLayer,\n layerBounds,\n onResizeHandle,\n normRect,\n clampTextSize,\n clampBoxWidth,\n onRotateHandle,\n layerCenter,\n rotatePoint,\n toLayerSpace,\n DIRECTIONAL_SHAPES,\n MULTI_POINT_SHAPES,\n isMultiPoint,\n} from './rendering.js'\nimport { setMode, selectLayer } from './mode.js'\nimport { openTextEditor } from './text-editor.js'\n\nexport function toSource(state, e) {\n // While actively dragging, use the rect captured at pointerdown instead of\n // re-querying live — on mobile the browser's address-bar/toolbar chrome\n // can collapse mid-gesture (typically ~1s in) and reflow the canvas out\n // from under the drag. Since this is (pointer position - element origin),\n // a rect that shifts mid-drag snaps the result toward 0 (leftmost/\n // smallest), which is exactly what re-querying every move would do.\n const r =\n state.dragMode && state.dragRect\n ? state.dragRect\n : state.overlayEl.getBoundingClientRect()\n const x = ((e.clientX - r.left) / r.width) * state.sourceCanvas.width\n const y = ((e.clientY - r.top) / r.height) * state.sourceCanvas.height\n return {\n x: Math.min(Math.max(x, 0), state.sourceCanvas.width),\n y: Math.min(Math.max(y, 0), state.sourceCanvas.height),\n }\n}\n\nfunction rotatedAABB(b, rotationDeg) {\n if (!rotationDeg) return b\n const rad = (rotationDeg * Math.PI) / 180\n const cos = Math.abs(Math.cos(rad)),\n sin = Math.abs(Math.sin(rad))\n const w = b.w * cos + b.h * sin,\n h = b.w * sin + b.h * cos\n const cx = b.x + b.w / 2,\n cy = b.y + b.h / 2\n return { x: cx - w / 2, y: cy - h / 2, w, h }\n}\n\nfunction strokeMargin(L) {\n if (L.type !== 'shape') return 0\n const alwaysStroked = DIRECTIONAL_SHAPES.includes(L.shape)\n return alwaysStroked || L.fill !== 'fill' ? (L.width || 0) / 2 : 0\n}\n\nfunction clampLayerToCanvas(state, L) {\n const rotated = rotatedAABB(layerBounds(state, L), L.rotation)\n const margin = strokeMargin(L)\n const b = {\n x: rotated.x - margin,\n y: rotated.y - margin,\n w: rotated.w + margin * 2,\n h: rotated.h + margin * 2,\n }\n const dx = Math.min(Math.max(b.x, 0), state.sourceCanvas.width - b.w) - b.x\n const dy = Math.min(Math.max(b.y, 0), state.sourceCanvas.height - b.h) - b.y\n if (!dx && !dy) return\n if (L.type === 'stroke') {\n L.points = L.points.map((pt) => ({ x: pt.x + dx, y: pt.y + dy }))\n } else {\n L.x += dx\n L.y += dy\n }\n}\n\nexport function hitLayer(state, p) {\n const { layers } = state\n for (let i = layers.length - 1; i >= 0; i--) {\n const b = layerBounds(state, layers[i])\n const q = toLayerSpace(state, layers[i], p)\n if (\n q.x >= b.x - 6 &&\n q.x <= b.x + b.w + 6 &&\n q.y >= b.y - 6 &&\n q.y <= b.y + b.h + 6\n )\n return layers[i]\n }\n return null\n}\n\n// --- multi-point (\"extended\") line sessions -------------------------------\n\n// Fingers are far less precise than a cursor, so coarse pointers get a target\n// near the 44px accessibility minimum.\nfunction closeHitRadius() {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(pointer: coarse)').matches\n return coarse ? 40 : 22\n}\nconst SNAP_STEP = Math.PI / 8\n// Below this drag distance a pointer gesture counts as a click, not a drag.\nexport const CLICK_SLOP = 4\n\nexport function isPolyActive(state) {\n return !!state.pendingPoly\n}\n\nexport function polyStatus(state) {\n const poly = state.pendingPoly\n if (!poly)\n return { active: false, pointCount: 0, canFinish: false, canClose: false }\n const n = poly.layer.points.length\n return { active: true, pointCount: n, canFinish: n >= 2, canClose: n >= 3 }\n}\n\n// With Shift held, lock the next segment to a fixed angle from the last point\n// -- the usual way drawing tools make clean horizontals, verticals and 45s.\nfunction snapPreview(anchor, p, shift) {\n if (!shift || !anchor) return p\n const dx = p.x - anchor.x\n const dy = p.y - anchor.y\n const len = Math.hypot(dx, dy)\n if (!len) return p\n const ang = Math.round(Math.atan2(dy, dx) / SNAP_STEP) * SNAP_STEP\n return {\n x: anchor.x + Math.cos(ang) * len,\n y: anchor.y + Math.sin(ang) * len,\n }\n}\n\nexport function undoPolyPoint(state) {\n const poly = state.pendingPoly\n if (!poly) return\n if (poly.layer.points.length <= 1) {\n cancelPoly(state)\n return\n }\n poly.layer.points.pop()\n state.statusText = `${poly.layer.points.length} point${\n poly.layer.points.length === 1 ? '' : 's'\n } — Backspace removes the last`\n drawPolyPreview(state)\n state.notify()\n}\n\nfunction startPoly(state, shapeLayer, p) {\n state.pendingPoly = { layer: shapeLayer, preview: p }\n shapeLayer.points = [{ x: p.x, y: p.y }]\n delete shapeLayer.w\n delete shapeLayer.h\n state.statusText =\n 'Click to add points · double-click to finish · Esc cancels'\n drawPolyPreview(state)\n state.notify()\n}\n\nfunction drawPolyPreview(state) {\n const poly = state.pendingPoly\n if (!poly) return\n const c = state.octx\n const pts = poly.layer.points\n c.clearRect(0, 0, state.overlayEl.width, state.overlayEl.height)\n state.layers.forEach((L) => paintLayer(state, c, L))\n\n const ghost = {\n ...poly.layer,\n points: poly.preview ? pts.concat([poly.preview]) : pts,\n }\n if (ghost.points.length >= 2) paintLayer(state, c, ghost)\n\n const k = 1 / (state.viewScale || 1)\n const r = 5 * k\n\n c.save()\n c.lineWidth = 2 * k\n pts.forEach((pt, i) => {\n if (i === 0) return\n c.beginPath()\n c.arc(pt.x, pt.y, r, 0, Math.PI * 2)\n c.fillStyle = '#ffffff'\n c.strokeStyle = poly.layer.color\n c.fill()\n c.stroke()\n })\n\n // The first point is the close target: it grows and fills once the cursor is\n // near enough that a click would actually close the path.\n const first = pts[0]\n if (first) {\n const near =\n pts.length >= 3 &&\n poly.preview &&\n Math.hypot(poly.preview.x - first.x, poly.preview.y - first.y) <=\n closeHitRadius()\n c.beginPath()\n c.arc(first.x, first.y, (near ? 11 : 7) * k, 0, Math.PI * 2)\n c.fillStyle = near ? poly.layer.color : '#ffffff'\n c.strokeStyle = poly.layer.color\n c.lineWidth = (near ? 3 : 2) * k\n c.fill()\n c.stroke()\n if (near) {\n c.beginPath()\n c.arc(first.x, first.y, 4 * k, 0, Math.PI * 2)\n c.fillStyle = '#ffffff'\n c.fill()\n }\n }\n c.restore()\n\n drawPolyHint(state, pts.length)\n}\n\n// Pinned to the canvas so the rules are where the eyes are. On touch the button\n// bar carries the actions, so the hint only explains what a tap does.\nfunction drawPolyHint(state, count) {\n const c = state.octx\n const k = 1 / (state.viewScale || 1)\n const pad = 10 * k\n const size = 13 * k\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(pointer: coarse)').matches\n const verb = coarse ? 'Tap' : 'Click'\n let msg\n if (count < 2) msg = `${verb} to place the next point`\n else if (coarse)\n msg =\n count < 3\n ? `${verb} to add points · use the bar below to finish`\n : `${verb} the first point to close · or finish below`\n else\n msg =\n count < 3\n ? 'Double-click or Enter to finish · Backspace undoes · Esc cancels'\n : 'Click the first point to close · Double-click to finish · Backspace undoes'\n\n c.save()\n c.font = `${size}px Avenir Next, Segoe UI, sans-serif`\n c.textBaseline = 'top'\n const w = c.measureText(msg).width\n c.fillStyle = 'rgba(17,17,17,.82)'\n c.beginPath()\n const bx = pad,\n by = pad,\n bw = w + pad * 2,\n bh = size + pad * 1.4\n if (c.roundRect) c.roundRect(bx, by, bw, bh, 6 * k)\n else c.rect(bx, by, bw, bh)\n c.fill()\n c.fillStyle = '#ffffff'\n c.fillText(msg, bx + pad, by + pad * 0.6)\n c.restore()\n}\n\n// Without this, continuing a finished line means clicking near its end -- which\n// lands on the rotate/resize handle and spins the layer instead.\nexport function resumePoly(state, id) {\n const L = state.layers.find((l) => l.id === (id ?? state.selectedId))\n if (!L || L.type !== 'shape') return\n if (!MULTI_POINT_SHAPES.includes(L.shape)) return\n pushHistory(state)\n if (!L.points || L.points.length < 2) {\n L.points = [\n { x: L.x, y: L.y },\n { x: L.x + (L.w || 0), y: L.y + (L.h || 0) },\n ]\n }\n delete L.w\n delete L.h\n L.closed = false\n state.selectedId = null\n state.mode = 'shape'\n state.multiPointMode = true\n state.pendingPoly = { layer: L, preview: L.points[L.points.length - 1] }\n state.statusText =\n 'Continuing line — click to add points · double-click to finish'\n drawPolyPreview(state)\n state.notify()\n}\n\nexport function finishPoly(state, close) {\n const poly = state.pendingPoly\n if (!poly) return\n const L = poly.layer\n state.pendingPoly = null\n if (L.points.length < 2) {\n // A lone click never became a line -- drop it and undo the history entry.\n state.layers = state.layers.filter((l) => l.id !== L.id)\n popHistory(state)\n setMode(state, 'select')\n render(state)\n state.notify()\n return\n }\n L.closed = !!close\n if (!state.layers.some((l) => l.id === L.id)) state.layers.push(L)\n // Stay on the shape tool: drawing one line usually means drawing another.\n // The layer is still selected, so its options are immediately editable.\n state.mode = 'shape'\n selectLayer(state, L.id)\n state.statusText = close\n ? 'Shape closed — click to start another'\n : 'Line added — click to start another'\n render(state)\n emitChange(state)\n}\n\nexport function cancelPoly(state) {\n const poly = state.pendingPoly\n if (!poly) return\n state.pendingPoly = null\n state.layers = state.layers.filter((l) => l.id !== poly.layer.id)\n popHistory(state)\n render(state)\n state.statusText = 'Cancelled'\n state.notify()\n}\n\nexport function onDown(state, e) {\n if (!state.sourceCanvas.width) return\n if (state.dragMode) return\n state.overlayEl.setPointerCapture(e.pointerId)\n state.activePointerId = e.pointerId\n state.dragRect = state.overlayEl.getBoundingClientRect()\n const p = toSource(state, e)\n if (state.pendingPoly) {\n const pts = state.pendingPoly.layer.points\n const first = pts[0]\n if (\n pts.length >= 3 &&\n Math.hypot(p.x - first.x, p.y - first.y) <= closeHitRadius()\n ) {\n finishPoly(state, true)\n return\n }\n const last = pts[pts.length - 1]\n const q = snapPreview(last, p, e.shiftKey)\n // Ignore a double-click's second down: it would add a zero-length segment.\n if (!last || Math.hypot(q.x - last.x, q.y - last.y) > CLICK_SLOP) {\n pts.push({ x: q.x, y: q.y })\n }\n state.pendingPoly.preview = q\n drawPolyPreview(state)\n return\n }\n if (state.mode === 'select') {\n const sel =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n if (sel && onRotateHandle(state, p, sel)) {\n const c = layerCenter(state, sel)\n state.dragMode = 'rotate'\n state.rotateStart = {\n center: c,\n angle: Math.atan2(p.y - c.y, p.x - c.x),\n rotation: sel.rotation || 0,\n }\n pushHistory(state)\n return\n }\n const corner = sel ? onResizeHandle(state, p, sel) : null\n if (corner) {\n state.dragMode = 'resize'\n state.resizeCorner = corner\n state.dragStart = p\n state.dragOrig = JSON.parse(JSON.stringify(sel))\n if (sel.type === 'shape' && isMultiPoint(sel)) {\n const b = layerBounds(state, sel)\n const isLeft = corner === 'tl' || corner === 'bl'\n const isTop = corner === 'tl' || corner === 'tr'\n state.resizeAnchor = {\n x: isLeft ? b.x + b.w : b.x,\n y: isTop ? b.y + b.h : b.y,\n }\n // Stash the untouched geometry so scaling stays absolute and cannot\n // accumulate drift across move events.\n state.dragOrig._bounds = {\n w: isLeft ? -b.w : b.w,\n h: isTop ? -b.h : b.h,\n }\n state.dragOrig._anchorPt = {\n x: state.resizeAnchor.x,\n y: state.resizeAnchor.y,\n }\n } else if (\n sel.type === 'shape' &&\n DIRECTIONAL_SHAPES.includes(sel.shape)\n ) {\n state.resizeAnchor =\n corner === 'start'\n ? { x: sel.x + sel.w, y: sel.y + sel.h }\n : { x: sel.x, y: sel.y }\n } else {\n const b = layerBounds(state, sel)\n const isLeft = corner === 'tl' || corner === 'bl'\n state.resizeAnchor = {\n x: isLeft ? b.x + b.w : b.x,\n // Text keeps its top edge: its height follows the wrapping.\n y:\n sel.type === 'text'\n ? b.y\n : corner === 'tl' || corner === 'tr'\n ? b.y + b.h\n : b.y,\n }\n }\n state.resizeCenter = layerCenter(state, sel)\n state.resizeAnchorWorld = rotatePoint(\n state.resizeAnchor,\n state.resizeCenter,\n sel.rotation || 0\n )\n pushHistory(state)\n return\n }\n const hit = hitLayer(state, p)\n if (hit) {\n selectLayer(state, hit.id)\n state.dragMode = 'move'\n state.dragStart = p\n state.dragOrig = JSON.parse(JSON.stringify(hit))\n pushHistory(state)\n } else selectLayer(state, null)\n } else if (state.mode === 'text') {\n pushHistory(state)\n const L = {\n id: state.nextId++,\n type: 'text',\n text: 'Text',\n x: p.x,\n y: p.y,\n size: state.textSize,\n font: state.textFont,\n color: state.textColor,\n rotation: 0,\n flipH: false,\n flipV: false,\n boxWidth: 10,\n }\n state.octx.font = `${L.size}px ${L.font}`\n const placeholderWidth = state.octx.measureText(L.text).width\n L.boxWidth = Math.round(Math.max(700, placeholderWidth + 40))\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n state.layers.push(L)\n setMode(state, 'select')\n selectLayer(state, L.id)\n openTextEditor(state, L, true)\n } else if (state.mode === 'draw') {\n pushHistory(state)\n state.pendingStroke = {\n id: state.nextId++,\n type: 'stroke',\n color: state.drawColor,\n width: state.brushSize,\n style: state.brushStyle,\n points: [p],\n }\n state.dragMode = 'draw'\n } else if (state.mode === 'shape') {\n pushHistory(state)\n state.pendingShape = {\n id: state.nextId++,\n type: 'shape',\n shape: state.selectedShapeType,\n fill: state.shapeFill,\n width: state.shapeWidth,\n color: state.shapeColor,\n x: p.x,\n y: p.y,\n w: 0,\n h: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n }\n state.dragMode = 'newshape'\n state.dragStart = p\n } else if (state.mode === 'crop') {\n state.dragMode = 'crop'\n state.cropStart = p\n state.cropRect = { x: p.x, y: p.y, w: 0, h: 0 }\n }\n}\n\nexport function onMove(state, e) {\n if (state.pendingPoly) {\n const pts = state.pendingPoly.layer.points\n state.pendingPoly.preview = snapPreview(\n pts[pts.length - 1],\n toSource(state, e),\n e.shiftKey\n )\n drawPolyPreview(state)\n return\n }\n if (\n state.dragMode &&\n state.activePointerId != null &&\n e.pointerId !== state.activePointerId\n ) {\n return\n }\n if (!state.dragMode) {\n if (state.mode === 'select') {\n const p = toSource(state, e),\n sel =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n const corner = sel ? onResizeHandle(state, p, sel) : null\n if (sel && onRotateHandle(state, p, sel)) {\n state.overlayEl.style.cursor = 'grab'\n } else if (corner === 'start' || corner === 'end') {\n state.overlayEl.style.cursor =\n sel.w >= 0 === sel.h >= 0 ? 'nwse-resize' : 'nesw-resize'\n } else if (corner) {\n state.overlayEl.style.cursor =\n corner === 'tl' || corner === 'br' ? 'nwse-resize' : 'nesw-resize'\n } else if (sel && hitLayer(state, p) === sel) {\n state.overlayEl.style.cursor = 'move'\n } else if (hitLayer(state, p)) {\n state.overlayEl.style.cursor = 'pointer'\n } else {\n state.overlayEl.style.cursor = 'default'\n }\n }\n return\n }\n const p = toSource(state, e)\n if (state.dragMode === 'move') {\n const dx = p.x - state.dragStart.x,\n dy = p.y - state.dragStart.y,\n L = state.layers.find((l) => l.id === state.selectedId)\n if (L.type === 'shape' && isMultiPoint(L)) {\n L.points = state.dragOrig.points.map((pt) => ({\n x: pt.x + dx,\n y: pt.y + dy,\n }))\n } else if (\n L.type === 'text' ||\n L.type === 'shape' ||\n L.type === 'sticker'\n ) {\n L.x = state.dragOrig.x + dx\n L.y = state.dragOrig.y + dy\n } else if (L.type === 'stroke') {\n L.points = state.dragOrig.points.map((pt) => ({\n x: pt.x + dx,\n y: pt.y + dy,\n }))\n }\n clampLayerToCanvas(state, L)\n renderOverlay(state)\n } else if (state.dragMode === 'resize') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n const rot = L.rotation || 0\n // Resize along the layer's own axes, so a tilted box grows the way it looks.\n const q = rot ? rotatePoint(p, state.resizeCenter, -rot) : p\n if (L.type === 'text') {\n const isLeft = state.resizeCorner === 'tl' || state.resizeCorner === 'bl'\n // Absolute from drag start, so the fix-up below cannot accumulate.\n L.y = state.dragOrig.y\n L.size = state.dragOrig.size\n if (isLeft) {\n const rightEdge = state.dragOrig.x + state.dragOrig.boxWidth\n L.boxWidth = Math.max(20, rightEdge - q.x)\n L.x = rightEdge - L.boxWidth\n } else {\n L.x = state.dragOrig.x\n L.boxWidth = Math.max(20, q.x - state.dragOrig.x)\n }\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n state.notify()\n } else if (L.type === 'shape' && isMultiPoint(L)) {\n // Multi-point paths have no single \"end\" to drag, so scale every point\n // about the opposite corner instead.\n const anchor = state.resizeAnchor\n const ob = state.dragOrig._bounds\n const MIN_SIZE = 8\n const sx = ob.w > 0 ? (q.x - anchor.x) / (ob.w || 1) : 1\n const sy = ob.h > 0 ? (q.y - anchor.y) / (ob.h || 1) : 1\n const kx = Math.abs(ob.w * sx) < MIN_SIZE ? MIN_SIZE / (ob.w || 1) : sx\n const ky = Math.abs(ob.h * sy) < MIN_SIZE ? MIN_SIZE / (ob.h || 1) : sy\n L.points = state.dragOrig.points.map((pt) => ({\n x: anchor.x + (pt.x - state.dragOrig._anchorPt.x) * kx,\n y: anchor.y + (pt.y - state.dragOrig._anchorPt.y) * ky,\n }))\n } else if (L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)) {\n const anchor = state.resizeAnchor\n const MIN_LEN = 8\n let w = q.x - anchor.x\n let h = q.y - anchor.y\n if (Math.hypot(w, h) < MIN_LEN) {\n const ang = Math.atan2(h || 1, w || 1)\n w = MIN_LEN * Math.cos(ang)\n h = MIN_LEN * Math.sin(ang)\n }\n if (state.resizeCorner === 'start') {\n L.x = anchor.x + w\n L.y = anchor.y + h\n L.w = -w\n L.h = -h\n } else {\n L.x = anchor.x\n L.y = anchor.y\n L.w = w\n L.h = h\n }\n } else if (L.type === 'shape' || L.type === 'sticker') {\n const anchor = state.resizeAnchor\n const MIN_SIZE = 8\n let w = q.x - anchor.x\n let h = q.y - anchor.y\n if (Math.abs(w) < MIN_SIZE) {\n w =\n anchor.x + MIN_SIZE <= state.sourceCanvas.width ? MIN_SIZE : -MIN_SIZE\n }\n if (Math.abs(h) < MIN_SIZE) {\n h =\n anchor.y + MIN_SIZE <= state.sourceCanvas.height\n ? MIN_SIZE\n : -MIN_SIZE\n }\n L.x = Math.min(anchor.x, anchor.x + w)\n L.y = Math.min(anchor.y, anchor.y + h)\n L.w = Math.abs(w)\n L.h = Math.abs(h)\n }\n // Resizing moves the centre it spins about; pin the anchor back down.\n if (rot) {\n const moved = rotatePoint(state.resizeAnchor, layerCenter(state, L), rot)\n L.x += state.resizeAnchorWorld.x - moved.x\n L.y += state.resizeAnchorWorld.y - moved.y\n }\n renderOverlay(state)\n } else if (state.dragMode === 'rotate') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n const { center, angle, rotation } = state.rotateStart\n const swept = Math.atan2(p.y - center.y, p.x - center.x) - angle\n const deg = rotation + (swept * 180) / Math.PI\n L.rotation = ((deg % 360) + 360) % 360\n renderOverlay(state)\n } else if (state.dragMode === 'draw') {\n state.pendingStroke.points.push(p)\n state.octx.clearRect(0, 0, state.overlayEl.width, state.overlayEl.height)\n state.layers.forEach((L) => paintLayer(state, state.octx, L))\n paintLayer(state, state.octx, state.pendingStroke)\n } else if (state.dragMode === 'newshape') {\n state.pendingShape.w = p.x - state.dragStart.x\n state.pendingShape.h = p.y - state.dragStart.y\n renderOverlay(state)\n } else if (state.dragMode === 'crop') {\n let w = p.x - state.cropStart.x,\n h = p.y - state.cropStart.y\n if (state.cropRatio !== 'free') {\n const rr = parseFloat(state.cropRatio)\n h = (Math.sign(h || 1) * Math.abs(w)) / rr\n const maxH =\n h >= 0\n ? state.sourceCanvas.height - state.cropStart.y\n : state.cropStart.y\n if (Math.abs(h) > maxH) {\n h = Math.sign(h) * maxH\n w = Math.sign(w || 1) * Math.abs(h) * rr\n }\n }\n state.cropRect = { x: state.cropStart.x, y: state.cropStart.y, w, h }\n renderOverlay(state)\n }\n}\n\nexport function onUp(state, e) {\n if (\n e &&\n state.dragMode &&\n state.activePointerId != null &&\n e.pointerId !== state.activePointerId\n ) {\n return\n }\n if (state.dragMode === 'draw' && state.pendingStroke) {\n if (state.pendingStroke.points.length >= 1) {\n state.layers.push(state.pendingStroke)\n selectLayer(state, state.pendingStroke.id)\n }\n state.pendingStroke = null\n render(state)\n state.statusText = 'Stroke added'\n emitChange(state)\n } else if (state.dragMode === 'newshape' && state.pendingShape) {\n const dragged = Math.hypot(\n state.pendingShape.w || 0,\n state.pendingShape.h || 0\n )\n if (\n state.multiPointMode &&\n MULTI_POINT_SHAPES.includes(state.pendingShape.shape)\n ) {\n // Multi-point is an explicit mode, so it opens a session either way:\n // a drag lays down the first segment, a click just the first corner.\n const L = state.pendingShape\n const end = { x: L.x + (L.w || 0), y: L.y + (L.h || 0) }\n state.pendingShape = null\n startPoly(state, L, { x: L.x, y: L.y })\n if (dragged > CLICK_SLOP) {\n L.points.push(end)\n state.pendingPoly.preview = end\n }\n } else if (\n Math.abs(state.pendingShape.w) > 3 ||\n Math.abs(state.pendingShape.h) > 3\n ) {\n state.layers.push(state.pendingShape)\n const id = state.pendingShape.id\n state.pendingShape = null\n setMode(state, 'select')\n selectLayer(state, id)\n state.statusText = 'Shape added'\n emitChange(state)\n } else {\n state.pendingShape = null\n renderOverlay(state)\n state.notify()\n }\n } else if (state.dragMode === 'crop') {\n if (state.cropRect) state.cropRect = normRect(state.cropRect)\n renderOverlay(state)\n state.notify()\n } else if (\n state.dragMode === 'move' ||\n state.dragMode === 'resize' ||\n state.dragMode === 'rotate'\n ) {\n if (state.dragMode === 'rotate') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n if (L) state.statusText = `Rotated to ${Math.round(L.rotation)}°`\n }\n render(state)\n state.notify()\n }\n if (state.activePointerId != null) {\n if (state.overlayEl.hasPointerCapture(state.activePointerId)) {\n state.overlayEl.releasePointerCapture(state.activePointerId)\n }\n state.activePointerId = null\n }\n state.dragMode = null\n state.dragStart = null\n state.dragOrig = null\n state.dragRect = null\n state.resizeAnchor = null\n state.resizeCenter = null\n state.resizeAnchorWorld = null\n state.rotateStart = null\n}\n\nexport function onDbl(state, e) {\n if (state.pendingPoly) {\n finishPoly(state, false)\n return\n }\n if (state.mode !== 'select') return\n const p = toSource(state, e),\n hit = hitLayer(state, p)\n if (hit && hit.type === 'text') {\n selectLayer(state, hit.id)\n openTextEditor(state, hit, false)\n }\n}\n"],"names":["toSource","state","e","x","y","rotatedAABB","b","rotationDeg","rad","cos","sin","w","h","cx","cy","strokeMargin","L","DIRECTIONAL_SHAPES","clampLayerToCanvas","rotated","layerBounds","margin","dx","dy","pt","hitLayer","p","layers","i","q","toLayerSpace","closeHitRadius","SNAP_STEP","CLICK_SLOP","polyStatus","poly","n","snapPreview","anchor","shift","len","ang","undoPolyPoint","cancelPoly","drawPolyPreview","startPoly","shapeLayer","c","pts","paintLayer","ghost","k","r","first","near","drawPolyHint","count","pad","size","coarse","verb","msg","bx","by","bw","bh","resumePoly","id","l","MULTI_POINT_SHAPES","pushHistory","finishPoly","close","popHistory","setMode","render","selectLayer","emitChange","onDown","last","sel","onRotateHandle","layerCenter","corner","onResizeHandle","isMultiPoint","isLeft","isTop","rotatePoint","hit","placeholderWidth","clampBoxWidth","clampTextSize","openTextEditor","onMove","renderOverlay","rot","rightEdge","ob","MIN_SIZE","sx","sy","kx","ky","MIN_LEN","moved","center","angle","rotation","swept","deg","rr","maxH","onUp","dragged","end","normRect","onDbl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index165.es.js","sources":["../src/components/organisms/image-editor/engine/pointer.js"],"sourcesContent":["import { pushHistory, popHistory } from './history.js'\nimport { emitChange } from './state.js'\nimport {\n render,\n renderOverlay,\n paintLayer,\n layerBounds,\n onResizeHandle,\n normRect,\n clampTextSize,\n clampBoxWidth,\n onRotateHandle,\n layerCenter,\n rotatePoint,\n toLayerSpace,\n DIRECTIONAL_SHAPES,\n MULTI_POINT_SHAPES,\n isMultiPoint,\n} from './rendering.js'\nimport { setMode, selectLayer } from './mode.js'\nimport { openTextEditor } from './text-editor.js'\n\nexport function toSource(state, e) {\n // While actively dragging, use the rect captured at pointerdown instead of\n // re-querying live — on mobile the browser's address-bar/toolbar chrome\n // can collapse mid-gesture (typically ~1s in) and reflow the canvas out\n // from under the drag. Since this is (pointer position - element origin),\n // a rect that shifts mid-drag snaps the result toward 0 (leftmost/\n // smallest), which is exactly what re-querying every move would do.\n const r =\n state.dragMode && state.dragRect\n ? state.dragRect\n : state.overlayEl.getBoundingClientRect()\n const x = ((e.clientX - r.left) / r.width) * state.sourceCanvas.width\n const y = ((e.clientY - r.top) / r.height) * state.sourceCanvas.height\n return {\n x: Math.min(Math.max(x, 0), state.sourceCanvas.width),\n y: Math.min(Math.max(y, 0), state.sourceCanvas.height),\n }\n}\n\nfunction rotatedAABB(b, rotationDeg) {\n if (!rotationDeg) return b\n const rad = (rotationDeg * Math.PI) / 180\n const cos = Math.abs(Math.cos(rad)),\n sin = Math.abs(Math.sin(rad))\n const w = b.w * cos + b.h * sin,\n h = b.w * sin + b.h * cos\n const cx = b.x + b.w / 2,\n cy = b.y + b.h / 2\n return { x: cx - w / 2, y: cy - h / 2, w, h }\n}\n\nfunction strokeMargin(L) {\n if (L.type !== 'shape') return 0\n const alwaysStroked = DIRECTIONAL_SHAPES.includes(L.shape)\n return alwaysStroked || L.fill !== 'fill' ? (L.width || 0) / 2 : 0\n}\n\nfunction clampLayerToCanvas(state, L) {\n const rotated = rotatedAABB(layerBounds(state, L), L.rotation)\n const margin = strokeMargin(L)\n const b = {\n x: rotated.x - margin,\n y: rotated.y - margin,\n w: rotated.w + margin * 2,\n h: rotated.h + margin * 2,\n }\n const dx = Math.min(Math.max(b.x, 0), state.sourceCanvas.width - b.w) - b.x\n const dy = Math.min(Math.max(b.y, 0), state.sourceCanvas.height - b.h) - b.y\n if (!dx && !dy) return\n if (L.type === 'stroke') {\n L.points = L.points.map((pt) => ({ x: pt.x + dx, y: pt.y + dy }))\n } else {\n L.x += dx\n L.y += dy\n }\n}\n\nexport function hitLayer(state, p) {\n const { layers } = state\n for (let i = layers.length - 1; i >= 0; i--) {\n const b = layerBounds(state, layers[i])\n const q = toLayerSpace(state, layers[i], p)\n if (\n q.x >= b.x - 6 &&\n q.x <= b.x + b.w + 6 &&\n q.y >= b.y - 6 &&\n q.y <= b.y + b.h + 6\n )\n return layers[i]\n }\n return null\n}\n\n// --- multi-point (\"extended\") line sessions -------------------------------\n\n// Fingers are far less precise than a cursor, so coarse pointers get a target\n// near the 44px accessibility minimum.\nfunction closeHitRadius() {\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(pointer: coarse)').matches\n return coarse ? 40 : 22\n}\nconst SNAP_STEP = Math.PI / 8\n// Below this drag distance a pointer gesture counts as a click, not a drag.\nexport const CLICK_SLOP = 4\n\nexport function isPolyActive(state) {\n return !!state.pendingPoly\n}\n\nexport function polyStatus(state) {\n const poly = state.pendingPoly\n if (!poly)\n return { active: false, pointCount: 0, canFinish: false, canClose: false }\n const n = poly.layer.points.length\n return { active: true, pointCount: n, canFinish: n >= 2, canClose: n >= 3 }\n}\n\n// With Shift held, lock the next segment to a fixed angle from the last point\n// -- the usual way drawing tools make clean horizontals, verticals and 45s.\nfunction snapPreview(anchor, p, shift) {\n if (!shift || !anchor) return p\n const dx = p.x - anchor.x\n const dy = p.y - anchor.y\n const len = Math.hypot(dx, dy)\n if (!len) return p\n const ang = Math.round(Math.atan2(dy, dx) / SNAP_STEP) * SNAP_STEP\n return {\n x: anchor.x + Math.cos(ang) * len,\n y: anchor.y + Math.sin(ang) * len,\n }\n}\n\nexport function undoPolyPoint(state) {\n const poly = state.pendingPoly\n if (!poly) return\n if (poly.layer.points.length <= 1) {\n cancelPoly(state)\n return\n }\n poly.layer.points.pop()\n state.statusText = `${poly.layer.points.length} point${\n poly.layer.points.length === 1 ? '' : 's'\n } — Backspace removes the last`\n drawPolyPreview(state)\n state.notify()\n}\n\nfunction startPoly(state, shapeLayer, p) {\n state.pendingPoly = { layer: shapeLayer, preview: p }\n shapeLayer.points = [{ x: p.x, y: p.y }]\n delete shapeLayer.w\n delete shapeLayer.h\n state.statusText =\n 'Click to add points · double-click to finish · Esc cancels'\n drawPolyPreview(state)\n state.notify()\n}\n\nfunction drawPolyPreview(state) {\n const poly = state.pendingPoly\n if (!poly) return\n const c = state.octx\n const pts = poly.layer.points\n c.clearRect(0, 0, state.overlayEl.width, state.overlayEl.height)\n state.layers.forEach((L) => paintLayer(state, c, L))\n\n const ghost = {\n ...poly.layer,\n points: poly.preview ? pts.concat([poly.preview]) : pts,\n }\n if (ghost.points.length >= 2) paintLayer(state, c, ghost)\n\n const k = 1 / (state.viewScale || 1)\n const r = 5 * k\n\n c.save()\n c.lineWidth = 2 * k\n pts.forEach((pt, i) => {\n if (i === 0) return\n c.beginPath()\n c.arc(pt.x, pt.y, r, 0, Math.PI * 2)\n c.fillStyle = '#ffffff'\n c.strokeStyle = poly.layer.color\n c.fill()\n c.stroke()\n })\n\n // The first point is the close target: it grows and fills once the cursor is\n // near enough that a click would actually close the path.\n const first = pts[0]\n if (first) {\n const near =\n pts.length >= 3 &&\n poly.preview &&\n Math.hypot(poly.preview.x - first.x, poly.preview.y - first.y) <=\n closeHitRadius()\n c.beginPath()\n c.arc(first.x, first.y, (near ? 11 : 7) * k, 0, Math.PI * 2)\n c.fillStyle = near ? poly.layer.color : '#ffffff'\n c.strokeStyle = poly.layer.color\n c.lineWidth = (near ? 3 : 2) * k\n c.fill()\n c.stroke()\n if (near) {\n c.beginPath()\n c.arc(first.x, first.y, 4 * k, 0, Math.PI * 2)\n c.fillStyle = '#ffffff'\n c.fill()\n }\n }\n c.restore()\n\n drawPolyHint(state, pts.length)\n}\n\n// Pinned to the canvas so the rules are where the eyes are. On touch the button\n// bar carries the actions, so the hint only explains what a tap does.\nfunction drawPolyHint(state, count) {\n const c = state.octx\n const k = 1 / (state.viewScale || 1)\n const pad = 10 * k\n const size = 13 * k\n const coarse =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(pointer: coarse)').matches\n const verb = coarse ? 'Tap' : 'Click'\n let msg\n if (count < 2) msg = `${verb} to place the next point`\n else if (coarse)\n msg =\n count < 3\n ? `${verb} to add points · use the bar below to finish`\n : `${verb} the first point to close · or finish below`\n else\n msg =\n count < 3\n ? 'Double-click or Enter to finish · Backspace undoes · Esc cancels'\n : 'Click the first point to close · Double-click to finish · Backspace undoes'\n\n c.save()\n c.font = `${size}px Avenir Next, Segoe UI, sans-serif`\n c.textBaseline = 'top'\n const w = c.measureText(msg).width\n c.fillStyle = 'rgba(17,17,17,.82)'\n c.beginPath()\n const bx = pad,\n by = pad,\n bw = w + pad * 2,\n bh = size + pad * 1.4\n if (c.roundRect) c.roundRect(bx, by, bw, bh, 6 * k)\n else c.rect(bx, by, bw, bh)\n c.fill()\n c.fillStyle = '#ffffff'\n c.fillText(msg, bx + pad, by + pad * 0.6)\n c.restore()\n}\n\n// Without this, continuing a finished line means clicking near its end -- which\n// lands on the rotate/resize handle and spins the layer instead.\nexport function resumePoly(state, id) {\n const L = state.layers.find((l) => l.id === (id ?? state.selectedId))\n if (!L || L.type !== 'shape') return\n if (!MULTI_POINT_SHAPES.includes(L.shape)) return\n pushHistory(state)\n if (!L.points || L.points.length < 2) {\n L.points = [\n { x: L.x, y: L.y },\n { x: L.x + (L.w || 0), y: L.y + (L.h || 0) },\n ]\n }\n delete L.w\n delete L.h\n L.closed = false\n state.selectedId = null\n state.mode = 'shape'\n state.multiPointMode = true\n state.pendingPoly = { layer: L, preview: L.points[L.points.length - 1] }\n state.statusText =\n 'Continuing line — click to add points · double-click to finish'\n drawPolyPreview(state)\n state.notify()\n}\n\nexport function finishPoly(state, close) {\n const poly = state.pendingPoly\n if (!poly) return\n const L = poly.layer\n state.pendingPoly = null\n if (L.points.length < 2) {\n // A lone click never became a line -- drop it and undo the history entry.\n state.layers = state.layers.filter((l) => l.id !== L.id)\n popHistory(state)\n setMode(state, 'select')\n render(state)\n state.notify()\n return\n }\n L.closed = !!close\n if (!state.layers.some((l) => l.id === L.id)) state.layers.push(L)\n // Stay on the shape tool: drawing one line usually means drawing another.\n // The layer is still selected, so its options are immediately editable.\n state.mode = 'shape'\n selectLayer(state, L.id)\n state.statusText = close\n ? 'Shape closed — click to start another'\n : 'Line added — click to start another'\n render(state)\n emitChange(state)\n}\n\nexport function cancelPoly(state) {\n const poly = state.pendingPoly\n if (!poly) return\n state.pendingPoly = null\n state.layers = state.layers.filter((l) => l.id !== poly.layer.id)\n popHistory(state)\n render(state)\n state.statusText = 'Cancelled'\n state.notify()\n}\n\nexport function onDown(state, e) {\n if (!state.sourceCanvas.width) return\n if (state.dragMode) return\n state.overlayEl.setPointerCapture(e.pointerId)\n state.activePointerId = e.pointerId\n state.dragRect = state.overlayEl.getBoundingClientRect()\n const p = toSource(state, e)\n if (state.pendingPoly) {\n const pts = state.pendingPoly.layer.points\n const first = pts[0]\n if (\n pts.length >= 3 &&\n Math.hypot(p.x - first.x, p.y - first.y) <= closeHitRadius()\n ) {\n finishPoly(state, true)\n return\n }\n const last = pts[pts.length - 1]\n const q = snapPreview(last, p, e.shiftKey)\n // Ignore a double-click's second down: it would add a zero-length segment.\n if (!last || Math.hypot(q.x - last.x, q.y - last.y) > CLICK_SLOP) {\n pts.push({ x: q.x, y: q.y })\n }\n state.pendingPoly.preview = q\n drawPolyPreview(state)\n return\n }\n if (state.mode === 'select') {\n const sel =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n if (sel && onRotateHandle(state, p, sel)) {\n const c = layerCenter(state, sel)\n state.dragMode = 'rotate'\n state.rotateStart = {\n center: c,\n angle: Math.atan2(p.y - c.y, p.x - c.x),\n rotation: sel.rotation || 0,\n }\n pushHistory(state)\n return\n }\n const corner = sel ? onResizeHandle(state, p, sel) : null\n if (corner) {\n state.dragMode = 'resize'\n state.resizeCorner = corner\n state.dragStart = p\n state.dragOrig = JSON.parse(JSON.stringify(sel))\n if (sel.type === 'shape' && isMultiPoint(sel)) {\n const b = layerBounds(state, sel)\n const isLeft = corner === 'tl' || corner === 'bl'\n const isTop = corner === 'tl' || corner === 'tr'\n state.resizeAnchor = {\n x: isLeft ? b.x + b.w : b.x,\n y: isTop ? b.y + b.h : b.y,\n }\n // Stash the untouched geometry so scaling stays absolute and cannot\n // accumulate drift across move events.\n state.dragOrig._bounds = {\n w: isLeft ? -b.w : b.w,\n h: isTop ? -b.h : b.h,\n }\n state.dragOrig._anchorPt = {\n x: state.resizeAnchor.x,\n y: state.resizeAnchor.y,\n }\n } else if (\n sel.type === 'shape' &&\n DIRECTIONAL_SHAPES.includes(sel.shape)\n ) {\n state.resizeAnchor =\n corner === 'start'\n ? { x: sel.x + sel.w, y: sel.y + sel.h }\n : { x: sel.x, y: sel.y }\n } else {\n const b = layerBounds(state, sel)\n const isLeft = corner === 'tl' || corner === 'bl'\n state.resizeAnchor = {\n x: isLeft ? b.x + b.w : b.x,\n // Text keeps its top edge: its height follows the wrapping.\n y:\n sel.type === 'text'\n ? b.y\n : corner === 'tl' || corner === 'tr'\n ? b.y + b.h\n : b.y,\n }\n }\n state.resizeCenter = layerCenter(state, sel)\n state.resizeAnchorWorld = rotatePoint(\n state.resizeAnchor,\n state.resizeCenter,\n sel.rotation || 0\n )\n pushHistory(state)\n return\n }\n const hit = hitLayer(state, p)\n if (hit) {\n selectLayer(state, hit.id)\n state.dragMode = 'move'\n state.dragStart = p\n state.dragOrig = JSON.parse(JSON.stringify(hit))\n pushHistory(state)\n } else selectLayer(state, null)\n } else if (state.mode === 'text') {\n pushHistory(state)\n const L = {\n id: state.nextId++,\n type: 'text',\n text: 'Text',\n x: p.x,\n y: p.y,\n size: state.textSize,\n font: state.textFont,\n color: state.textColor,\n rotation: 0,\n flipH: false,\n flipV: false,\n boxWidth: 10,\n }\n state.octx.font = `${L.size}px ${L.font}`\n const placeholderWidth = state.octx.measureText(L.text).width\n L.boxWidth = Math.round(Math.max(700, placeholderWidth + 40))\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n state.layers.push(L)\n setMode(state, 'select')\n selectLayer(state, L.id)\n openTextEditor(state, L, true)\n } else if (state.mode === 'draw') {\n pushHistory(state)\n state.pendingStroke = {\n id: state.nextId++,\n type: 'stroke',\n color: state.drawColor,\n width: state.brushSize,\n style: state.brushStyle,\n points: [p],\n }\n state.dragMode = 'draw'\n } else if (state.mode === 'shape') {\n pushHistory(state)\n state.pendingShape = {\n id: state.nextId++,\n type: 'shape',\n shape: state.selectedShapeType,\n fill: state.shapeFill,\n width: state.shapeWidth,\n color: state.shapeColor,\n x: p.x,\n y: p.y,\n w: 0,\n h: 0,\n rotation: 0,\n flipH: false,\n flipV: false,\n }\n state.dragMode = 'newshape'\n state.dragStart = p\n } else if (state.mode === 'crop') {\n state.dragMode = 'crop'\n state.cropStart = p\n state.cropRect = { x: p.x, y: p.y, w: 0, h: 0 }\n }\n}\n\nexport function onMove(state, e) {\n if (state.pendingPoly) {\n const pts = state.pendingPoly.layer.points\n state.pendingPoly.preview = snapPreview(\n pts[pts.length - 1],\n toSource(state, e),\n e.shiftKey\n )\n drawPolyPreview(state)\n return\n }\n if (\n state.dragMode &&\n state.activePointerId != null &&\n e.pointerId !== state.activePointerId\n ) {\n return\n }\n if (!state.dragMode) {\n if (state.mode === 'select') {\n const p = toSource(state, e),\n sel =\n state.selectedId != null\n ? state.layers.find((l) => l.id === state.selectedId)\n : null\n const corner = sel ? onResizeHandle(state, p, sel) : null\n if (sel && onRotateHandle(state, p, sel)) {\n state.overlayEl.style.cursor = 'grab'\n } else if (corner === 'start' || corner === 'end') {\n state.overlayEl.style.cursor =\n sel.w >= 0 === sel.h >= 0 ? 'nwse-resize' : 'nesw-resize'\n } else if (corner) {\n state.overlayEl.style.cursor =\n corner === 'tl' || corner === 'br' ? 'nwse-resize' : 'nesw-resize'\n } else if (sel && hitLayer(state, p) === sel) {\n state.overlayEl.style.cursor = 'move'\n } else if (hitLayer(state, p)) {\n state.overlayEl.style.cursor = 'pointer'\n } else {\n state.overlayEl.style.cursor = 'default'\n }\n }\n return\n }\n const p = toSource(state, e)\n if (state.dragMode === 'move') {\n const dx = p.x - state.dragStart.x,\n dy = p.y - state.dragStart.y,\n L = state.layers.find((l) => l.id === state.selectedId)\n if (L.type === 'shape' && isMultiPoint(L)) {\n L.points = state.dragOrig.points.map((pt) => ({\n x: pt.x + dx,\n y: pt.y + dy,\n }))\n } else if (\n L.type === 'text' ||\n L.type === 'shape' ||\n L.type === 'sticker'\n ) {\n L.x = state.dragOrig.x + dx\n L.y = state.dragOrig.y + dy\n } else if (L.type === 'stroke') {\n L.points = state.dragOrig.points.map((pt) => ({\n x: pt.x + dx,\n y: pt.y + dy,\n }))\n }\n clampLayerToCanvas(state, L)\n renderOverlay(state)\n } else if (state.dragMode === 'resize') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n const rot = L.rotation || 0\n // Resize along the layer's own axes, so a tilted box grows the way it looks.\n const q = rot ? rotatePoint(p, state.resizeCenter, -rot) : p\n if (L.type === 'text') {\n const isLeft = state.resizeCorner === 'tl' || state.resizeCorner === 'bl'\n // Absolute from drag start, so the fix-up below cannot accumulate.\n L.y = state.dragOrig.y\n L.size = state.dragOrig.size\n if (isLeft) {\n const rightEdge = state.dragOrig.x + state.dragOrig.boxWidth\n L.boxWidth = Math.max(20, rightEdge - q.x)\n L.x = rightEdge - L.boxWidth\n } else {\n L.x = state.dragOrig.x\n L.boxWidth = Math.max(20, q.x - state.dragOrig.x)\n }\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n state.notify()\n } else if (L.type === 'shape' && isMultiPoint(L)) {\n // Multi-point paths have no single \"end\" to drag, so scale every point\n // about the opposite corner instead.\n const anchor = state.resizeAnchor\n const ob = state.dragOrig._bounds\n const MIN_SIZE = 8\n const sx = ob.w > 0 ? (q.x - anchor.x) / (ob.w || 1) : 1\n const sy = ob.h > 0 ? (q.y - anchor.y) / (ob.h || 1) : 1\n const kx = Math.abs(ob.w * sx) < MIN_SIZE ? MIN_SIZE / (ob.w || 1) : sx\n const ky = Math.abs(ob.h * sy) < MIN_SIZE ? MIN_SIZE / (ob.h || 1) : sy\n L.points = state.dragOrig.points.map((pt) => ({\n x: anchor.x + (pt.x - state.dragOrig._anchorPt.x) * kx,\n y: anchor.y + (pt.y - state.dragOrig._anchorPt.y) * ky,\n }))\n } else if (L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)) {\n const anchor = state.resizeAnchor\n const MIN_LEN = 8\n let w = q.x - anchor.x\n let h = q.y - anchor.y\n if (Math.hypot(w, h) < MIN_LEN) {\n const ang = Math.atan2(h || 1, w || 1)\n w = MIN_LEN * Math.cos(ang)\n h = MIN_LEN * Math.sin(ang)\n }\n if (state.resizeCorner === 'start') {\n L.x = anchor.x + w\n L.y = anchor.y + h\n L.w = -w\n L.h = -h\n } else {\n L.x = anchor.x\n L.y = anchor.y\n L.w = w\n L.h = h\n }\n } else if (L.type === 'shape' || L.type === 'sticker') {\n const anchor = state.resizeAnchor\n const MIN_SIZE = 8\n let w = q.x - anchor.x\n let h = q.y - anchor.y\n if (Math.abs(w) < MIN_SIZE) {\n w =\n anchor.x + MIN_SIZE <= state.sourceCanvas.width ? MIN_SIZE : -MIN_SIZE\n }\n if (Math.abs(h) < MIN_SIZE) {\n h =\n anchor.y + MIN_SIZE <= state.sourceCanvas.height\n ? MIN_SIZE\n : -MIN_SIZE\n }\n L.x = Math.min(anchor.x, anchor.x + w)\n L.y = Math.min(anchor.y, anchor.y + h)\n L.w = Math.abs(w)\n L.h = Math.abs(h)\n }\n // Resizing moves the centre it spins about; pin the anchor back down.\n if (rot) {\n const moved = rotatePoint(state.resizeAnchor, layerCenter(state, L), rot)\n L.x += state.resizeAnchorWorld.x - moved.x\n L.y += state.resizeAnchorWorld.y - moved.y\n }\n renderOverlay(state)\n } else if (state.dragMode === 'rotate') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n const { center, angle, rotation } = state.rotateStart\n const swept = Math.atan2(p.y - center.y, p.x - center.x) - angle\n const deg = rotation + (swept * 180) / Math.PI\n L.rotation = ((deg % 360) + 360) % 360\n renderOverlay(state)\n } else if (state.dragMode === 'draw') {\n state.pendingStroke.points.push(p)\n state.octx.clearRect(0, 0, state.overlayEl.width, state.overlayEl.height)\n state.layers.forEach((L) => paintLayer(state, state.octx, L))\n paintLayer(state, state.octx, state.pendingStroke)\n } else if (state.dragMode === 'newshape') {\n state.pendingShape.w = p.x - state.dragStart.x\n state.pendingShape.h = p.y - state.dragStart.y\n renderOverlay(state)\n } else if (state.dragMode === 'crop') {\n let w = p.x - state.cropStart.x,\n h = p.y - state.cropStart.y\n if (state.cropRatio !== 'free') {\n const rr = parseFloat(state.cropRatio)\n h = (Math.sign(h || 1) * Math.abs(w)) / rr\n const maxH =\n h >= 0\n ? state.sourceCanvas.height - state.cropStart.y\n : state.cropStart.y\n if (Math.abs(h) > maxH) {\n h = Math.sign(h) * maxH\n w = Math.sign(w || 1) * Math.abs(h) * rr\n }\n }\n state.cropRect = { x: state.cropStart.x, y: state.cropStart.y, w, h }\n renderOverlay(state)\n }\n}\n\nexport function onUp(state, e) {\n if (\n e &&\n state.dragMode &&\n state.activePointerId != null &&\n e.pointerId !== state.activePointerId\n ) {\n return\n }\n if (state.dragMode === 'draw' && state.pendingStroke) {\n if (state.pendingStroke.points.length >= 1) {\n state.layers.push(state.pendingStroke)\n selectLayer(state, state.pendingStroke.id)\n }\n state.pendingStroke = null\n render(state)\n state.statusText = 'Stroke added'\n emitChange(state)\n } else if (state.dragMode === 'newshape' && state.pendingShape) {\n const dragged = Math.hypot(\n state.pendingShape.w || 0,\n state.pendingShape.h || 0\n )\n if (\n state.multiPointMode &&\n MULTI_POINT_SHAPES.includes(state.pendingShape.shape)\n ) {\n // Multi-point is an explicit mode, so it opens a session either way:\n // a drag lays down the first segment, a click just the first corner.\n const L = state.pendingShape\n const end = { x: L.x + (L.w || 0), y: L.y + (L.h || 0) }\n state.pendingShape = null\n startPoly(state, L, { x: L.x, y: L.y })\n if (dragged > CLICK_SLOP) {\n L.points.push(end)\n state.pendingPoly.preview = end\n }\n } else if (\n Math.abs(state.pendingShape.w) > 3 ||\n Math.abs(state.pendingShape.h) > 3\n ) {\n state.layers.push(state.pendingShape)\n const id = state.pendingShape.id\n state.pendingShape = null\n setMode(state, 'select')\n selectLayer(state, id)\n state.statusText = 'Shape added'\n emitChange(state)\n } else {\n state.pendingShape = null\n renderOverlay(state)\n state.notify()\n }\n } else if (state.dragMode === 'crop') {\n if (state.cropRect) state.cropRect = normRect(state.cropRect)\n renderOverlay(state)\n state.notify()\n } else if (\n state.dragMode === 'move' ||\n state.dragMode === 'resize' ||\n state.dragMode === 'rotate'\n ) {\n if (state.dragMode === 'rotate') {\n const L = state.layers.find((l) => l.id === state.selectedId)\n if (L) state.statusText = `Rotated to ${Math.round(L.rotation)}°`\n }\n render(state)\n state.notify()\n }\n if (state.activePointerId != null) {\n if (state.overlayEl.hasPointerCapture(state.activePointerId)) {\n state.overlayEl.releasePointerCapture(state.activePointerId)\n }\n state.activePointerId = null\n }\n state.dragMode = null\n state.dragStart = null\n state.dragOrig = null\n state.dragRect = null\n state.resizeAnchor = null\n state.resizeCenter = null\n state.resizeAnchorWorld = null\n state.rotateStart = null\n}\n\nexport function onDbl(state, e) {\n if (state.pendingPoly) {\n finishPoly(state, false)\n return\n }\n if (state.mode !== 'select') return\n const p = toSource(state, e),\n hit = hitLayer(state, p)\n if (hit && hit.type === 'text') {\n selectLayer(state, hit.id)\n openTextEditor(state, hit, false)\n }\n}\n"],"names":["toSource","state","e","x","y","rotatedAABB","b","rotationDeg","rad","cos","sin","w","h","cx","cy","strokeMargin","L","DIRECTIONAL_SHAPES","clampLayerToCanvas","rotated","layerBounds","margin","dx","dy","pt","hitLayer","p","layers","i","q","toLayerSpace","closeHitRadius","SNAP_STEP","CLICK_SLOP","polyStatus","poly","n","snapPreview","anchor","shift","len","ang","undoPolyPoint","cancelPoly","drawPolyPreview","startPoly","shapeLayer","c","pts","paintLayer","ghost","k","r","first","near","drawPolyHint","count","pad","size","coarse","verb","msg","bx","by","bw","bh","resumePoly","id","l","MULTI_POINT_SHAPES","pushHistory","finishPoly","close","popHistory","setMode","render","selectLayer","emitChange","onDown","last","sel","onRotateHandle","layerCenter","corner","onResizeHandle","isMultiPoint","isLeft","isTop","rotatePoint","hit","placeholderWidth","clampBoxWidth","clampTextSize","openTextEditor","onMove","renderOverlay","rot","rightEdge","ob","MIN_SIZE","sx","sy","kx","ky","MIN_LEN","moved","center","angle","rotation","swept","deg","rr","maxH","onUp","dragged","end","normRect","onDbl"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index166.es.js","sources":["../src/lib/constants.ts"],"sourcesContent":["export const FONT_FAMILY = 'Plus Jakarta Sans'\n"],"names":["FONT_FAMILY"],"mappings":"AAAO,MAAMA,IAAc;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index167.es.js","sources":["../src/components/ui/report-snippet-view/report-snippet-view-style.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\n\nexport const trendBoxStyles = cva(\n 'w-auto min-w-[50px] h-5 flex items-center justify-center gap-2 px-1 py-0.5 rounded-[4px]',\n {\n variants: {\n trend: {\n '1': 'bg-success-1 border border-success-1',\n '-1': 'bg-danger-1 border border-danger-1',\n '0': '',\n null: '',\n },\n },\n }\n)\n\nexport const trendValueStyles = cva('text-sm', {\n variants: {\n trend: {\n '1': 'text-success-1',\n '-1': 'text-danger-1',\n '0': '',\n null: '',\n },\n },\n})\n"],"names":["trendBoxStyles","cva","trendValueStyles"],"mappings":";AAEO,MAAMA,IAAiBC;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,GAAK;AAAA,QACL,MAAM;AAAA,QACN,GAAK;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IACR;AAAA,EACF;AAEJ,GAEaC,IAAmBD,EAAI,WAAW;AAAA,EAC7C,UAAU;AAAA,IACR,OAAO;AAAA,MACL,GAAK;AAAA,MACL,MAAM;AAAA,MACN,GAAK;AAAA,MACL,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,CAAC;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { cva as r } from "class-variance-authority";
|
|
2
|
-
import { StepItemStatus as e } from "./
|
|
2
|
+
import { StepItemStatus as e } from "./index33.es.js";
|
|
3
3
|
const o = r(
|
|
4
4
|
"h-8 w-8 border-2 flex items-center justify-center rounded-full cursor-pointer trasnition-all",
|
|
5
5
|
{
|
|
@@ -16,4 +16,4 @@ const o = r(
|
|
|
16
16
|
export {
|
|
17
17
|
o as StepItemVariants
|
|
18
18
|
};
|
|
19
|
-
//# sourceMappingURL=
|
|
19
|
+
//# sourceMappingURL=index168.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index168.es.js","sources":["../src/components/molecules/stepper/stepper.styles.ts"],"sourcesContent":["import { cva } from 'class-variance-authority'\nimport { StepItemStatus } from './stepper.type'\nexport const StepItemVariants = cva(\n 'h-8 w-8 border-2 flex items-center justify-center rounded-full cursor-pointer trasnition-all',\n {\n variants: {\n variant: {\n pending: 'border-neutral-2 ',\n current:\n 'bg-primary-1 border-primary-2 hover:bg-hover-t1 active:bg-click-t1',\n completed:\n 'bg-rest-p1 hover:bg-hover-p1 active:bg-click-p1 border-none',\n },\n },\n defaultVariants: { variant: StepItemStatus.PENDING },\n }\n)\n"],"names":["StepItemVariants","cva","StepItemStatus"],"mappings":";;AAEO,MAAMA,IAAmBC;AAAA,EAC9B;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SACE;AAAA,QACF,WACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB,EAAE,SAASC,EAAe,QAAA;AAAA,EAAQ;AAEvD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index169.es.js","sources":["../src/components/organisms/image-editor/engine/canvas-filter.js"],"sourcesContent":["let contextFilterSupport = null\n\nexport function supportsContextFilter() {\n if (contextFilterSupport !== null) return contextFilterSupport\n if (typeof document === 'undefined') return false\n const ctx = document.createElement('canvas').getContext('2d')\n contextFilterSupport = !!ctx && 'filter' in ctx\n return contextFilterSupport\n}\n\nfunction escapeXml(value) {\n return String(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n}\n\nfunction toAmount(raw) {\n const value = parseFloat(raw)\n if (Number.isNaN(value)) return null\n return raw.trim().endsWith('%') ? value / 100 : value\n}\n\nfunction componentTransfer(slope, intercept) {\n const fn = ['R', 'G', 'B']\n .map(\n (c) =>\n `<feFunc${c} type=\"linear\" slope=\"${slope}\" intercept=\"${intercept}\"/>`\n )\n .join('')\n return `<feComponentTransfer>${fn}</feComponentTransfer>`\n}\n\nfunction sepiaMatrix(amount) {\n const r = 1 - amount\n const m = [\n 0.393 + 0.607 * r,\n 0.769 - 0.769 * r,\n 0.189 - 0.189 * r,\n 0,\n 0,\n 0.349 - 0.349 * r,\n 0.686 + 0.314 * r,\n 0.168 - 0.168 * r,\n 0,\n 0,\n 0.272 - 0.272 * r,\n 0.534 - 0.534 * r,\n 0.131 + 0.869 * r,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n ]\n return `<feColorMatrix type=\"matrix\" values=\"${m.join(' ')}\"/>`\n}\n\nfunction toSvgPrimitives(filter) {\n const primitives = []\n const re = /([a-zA-Z-]+)\\(([^)]*)\\)/g\n let match\n\n while ((match = re.exec(filter)) !== null) {\n const name = match[1].toLowerCase()\n const amount = toAmount(match[2])\n if (amount === null) continue\n\n switch (name) {\n case 'brightness':\n primitives.push(componentTransfer(amount, 0))\n break\n case 'contrast':\n primitives.push(componentTransfer(amount, -0.5 * amount + 0.5))\n break\n case 'saturate':\n primitives.push(`<feColorMatrix type=\"saturate\" values=\"${amount}\"/>`)\n break\n case 'grayscale':\n primitives.push(\n `<feColorMatrix type=\"saturate\" values=\"${1 - amount}\"/>`\n )\n break\n case 'sepia':\n primitives.push(sepiaMatrix(amount))\n break\n case 'hue-rotate':\n primitives.push(`<feColorMatrix type=\"hueRotate\" values=\"${amount}\"/>`)\n break\n case 'blur':\n if (amount > 0) {\n primitives.push(`<feGaussianBlur stdDeviation=\"${amount}\"/>`)\n }\n break\n default:\n break\n }\n }\n\n return primitives\n}\n\nexport function rasterizeWithFilter(sourceCanvas, filter) {\n return new Promise((resolve, reject) => {\n const primitives = toSvgPrimitives(filter)\n if (!primitives.length) {\n reject(new Error('no translatable filter primitives'))\n return\n }\n\n const { width, height } = sourceCanvas\n const href = sourceCanvas.toDataURL('image/png')\n const svg =\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">` +\n `<filter id=\"f\" color-interpolation-filters=\"sRGB\" ` +\n `x=\"0\" y=\"0\" width=\"100%\" height=\"100%\">${primitives.join('')}</filter>` +\n `<image href=\"${escapeXml(href)}\" width=\"${width}\" height=\"${height}\" ` +\n `filter=\"url(#f)\"/>` +\n `</svg>`\n\n const img = new Image()\n img.onload = () => resolve(img)\n img.onerror = () => reject(new Error('filter rasterisation failed'))\n img.src = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg)\n })\n}\n"],"names":["contextFilterSupport","supportsContextFilter","ctx","escapeXml","value","toAmount","raw","componentTransfer","slope","intercept","c","sepiaMatrix","amount","r","toSvgPrimitives","filter","primitives","re","match","name","rasterizeWithFilter","sourceCanvas","resolve","reject","width","height","href","svg","img"],"mappings":"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"}
|