geoiq-frontend-ui-kit 2.0.4 → 2.0.6
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.es107.js → index100.es.js} +5 -5
- package/dist/{index.es107.js.map → index100.es.js.map} +1 -1
- package/dist/{index.es133.js → index101.es.js} +1 -1
- package/dist/{index.es133.js.map → index101.es.js.map} +1 -1
- package/dist/{index.es113.js → index102.es.js} +1 -1
- package/dist/{index.es113.js.map → index102.es.js.map} +1 -1
- package/dist/{index.es134.js → index103.es.js} +2 -2
- package/dist/{index.es134.js.map → index103.es.js.map} +1 -1
- package/dist/{index.es135.js → index104.es.js} +1 -1
- package/dist/{index.es135.js.map → index104.es.js.map} +1 -1
- package/dist/{index.es118.js → index105.es.js} +1 -1
- package/dist/{index.es118.js.map → index105.es.js.map} +1 -1
- package/dist/{index.es101.js → index106.es.js} +1 -1
- package/dist/{index.es101.js.map → index106.es.js.map} +1 -1
- package/dist/{index.es112.js → index107.es.js} +1 -1
- package/dist/{index.es112.js.map → index107.es.js.map} +1 -1
- package/dist/{index.es119.js → index108.es.js} +1 -1
- package/dist/{index.es119.js.map → index108.es.js.map} +1 -1
- package/dist/{index.es127.js → index109.es.js} +4 -4
- package/dist/{index.es127.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.es128.js → index110.es.js} +4 -4
- package/dist/{index.es128.js.map → index110.es.js.map} +1 -1
- package/dist/{index.es129.js → index111.es.js} +5 -5
- package/dist/{index.es129.js.map → index111.es.js.map} +1 -1
- package/dist/{index.es130.js → index112.es.js} +2 -2
- package/dist/{index.es130.js.map → index112.es.js.map} +1 -1
- package/dist/{index.es131.js → index113.es.js} +3 -3
- package/dist/{index.es131.js.map → index113.es.js.map} +1 -1
- package/dist/{index.es116.js → index114.es.js} +1 -1
- package/dist/{index.es116.js.map → index114.es.js.map} +1 -1
- package/dist/{index.es117.js → index115.es.js} +5 -5
- package/dist/{index.es117.js.map → index115.es.js.map} +1 -1
- package/dist/index116.es.js +34 -0
- package/dist/index116.es.js.map +1 -0
- package/dist/{index.es103.js → index117.es.js} +1 -1
- package/dist/{index.es103.js.map → index117.es.js.map} +1 -1
- package/dist/{index.es115.js → index118.es.js} +3 -3
- package/dist/{index.es115.js.map → index118.es.js.map} +1 -1
- package/dist/{index.es105.js → index119.es.js} +3 -3
- package/dist/{index.es105.js.map → index119.es.js.map} +1 -1
- 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.es120.js → index120.es.js} +4 -4
- package/dist/{index.es120.js.map → index120.es.js.map} +1 -1
- package/dist/{index.es121.js → index121.es.js} +3 -3
- package/dist/{index.es121.js.map → index121.es.js.map} +1 -1
- package/dist/{index.es122.js → index122.es.js} +3 -3
- package/dist/{index.es122.js.map → index122.es.js.map} +1 -1
- package/dist/{index.es123.js → index123.es.js} +3 -3
- package/dist/{index.es123.js.map → index123.es.js.map} +1 -1
- package/dist/{index.es124.js → index124.es.js} +10 -10
- package/dist/{index.es124.js.map → index124.es.js.map} +1 -1
- package/dist/{index.es125.js → index125.es.js} +10 -10
- package/dist/{index.es125.js.map → index125.es.js.map} +1 -1
- package/dist/{index.es126.js → index126.es.js} +5 -5
- package/dist/{index.es126.js.map → index126.es.js.map} +1 -1
- package/dist/{index.es97.js → index127.es.js} +1 -1
- package/dist/index127.es.js.map +1 -0
- package/dist/{index.es98.js → index128.es.js} +8 -8
- package/dist/index128.es.js.map +1 -0
- package/dist/{index.es99.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.es100.js → index130.es.js} +15 -15
- package/dist/{index.es100.js.map → index130.es.js.map} +1 -1
- package/dist/{index.es104.js → index131.es.js} +1 -1
- package/dist/{index.es104.js.map → index131.es.js.map} +1 -1
- package/dist/{index.es106.js → index132.es.js} +1 -1
- package/dist/{index.es106.js.map → index132.es.js.map} +1 -1
- package/dist/{index.es114.js → index133.es.js} +3 -3
- package/dist/{index.es114.js.map → index133.es.js.map} +1 -1
- package/dist/{index.es132.js → index134.es.js} +1 -1
- package/dist/{index.es132.js.map → index134.es.js.map} +1 -1
- package/dist/{index.es108.js → index135.es.js} +1 -1
- package/dist/{index.es108.js.map → index135.es.js.map} +1 -1
- package/dist/{index.es102.js → index136.es.js} +1 -1
- package/dist/{index.es102.js.map → index136.es.js.map} +1 -1
- package/dist/{index.es110.js → index137.es.js} +2 -2
- package/dist/{index.es110.js.map → index137.es.js.map} +1 -1
- package/dist/{index.es111.js → index138.es.js} +6 -6
- package/dist/{index.es111.js.map → index138.es.js.map} +1 -1
- package/dist/{index.es136.js → index139.es.js} +5 -5
- package/dist/{index.es136.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.es156.js → index141.es.js} +2 -2
- package/dist/{index.es156.js.map → index141.es.js.map} +1 -1
- package/dist/{index.es159.js → index142.es.js} +3 -3
- package/dist/{index.es159.js.map → index142.es.js.map} +1 -1
- package/dist/{index.es160.js → index143.es.js} +1 -1
- package/dist/{index.es160.js.map → index143.es.js.map} +1 -1
- package/dist/{index.es161.js → index144.es.js} +1 -1
- package/dist/{index.es161.js.map → index144.es.js.map} +1 -1
- package/dist/{index.es162.js → index145.es.js} +1 -1
- package/dist/{index.es162.js.map → index145.es.js.map} +1 -1
- package/dist/{index.es137.js → index146.es.js} +1 -1
- package/dist/{index.es137.js.map → index146.es.js.map} +1 -1
- package/dist/{index.es138.js → index147.es.js} +7 -7
- package/dist/{index.es138.js.map → index147.es.js.map} +1 -1
- package/dist/{index.es139.js → index148.es.js} +3 -3
- package/dist/{index.es139.js.map → index148.es.js.map} +1 -1
- package/dist/{index.es140.js → index149.es.js} +2 -2
- package/dist/{index.es140.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.es141.js → index150.es.js} +1 -1
- package/dist/{index.es141.js.map → index150.es.js.map} +1 -1
- package/dist/{index.es142.js → index151.es.js} +1 -1
- package/dist/{index.es142.js.map → index151.es.js.map} +1 -1
- package/dist/{index.es143.js → index152.es.js} +1 -1
- package/dist/{index.es143.js.map → index152.es.js.map} +1 -1
- package/dist/{index.es144.js → index153.es.js} +2 -2
- package/dist/{index.es144.js.map → index153.es.js.map} +1 -1
- package/dist/{index.es145.js → index154.es.js} +3 -3
- package/dist/{index.es145.js.map → index154.es.js.map} +1 -1
- package/dist/{index.es146.js → index155.es.js} +3 -3
- package/dist/{index.es146.js.map → index155.es.js.map} +1 -1
- package/dist/{index.es147.js → index156.es.js} +5 -5
- package/dist/{index.es147.js.map → index156.es.js.map} +1 -1
- package/dist/{index.es148.js → index157.es.js} +4 -4
- package/dist/{index.es148.js.map → index157.es.js.map} +1 -1
- package/dist/{index.es149.js → index158.es.js} +2 -2
- package/dist/{index.es149.js.map → index158.es.js.map} +1 -1
- package/dist/{index.es150.js → index159.es.js} +4 -4
- package/dist/{index.es150.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.es151.js → index160.es.js} +6 -6
- package/dist/{index.es151.js.map → index160.es.js.map} +1 -1
- package/dist/{index.es152.js → index161.es.js} +5 -5
- package/dist/{index.es152.js.map → index161.es.js.map} +1 -1
- package/dist/{index.es153.js → index162.es.js} +4 -4
- package/dist/{index.es153.js.map → index162.es.js.map} +1 -1
- package/dist/{index.es154.js → index163.es.js} +9 -9
- package/dist/{index.es154.js.map → index163.es.js.map} +1 -1
- package/dist/{index.es155.js → index164.es.js} +6 -6
- package/dist/{index.es155.js.map → index164.es.js.map} +1 -1
- package/dist/{index.es158.js → index165.es.js} +1 -1
- package/dist/{index.es158.js.map → index165.es.js.map} +1 -1
- package/dist/{index.es157.js → index166.es.js} +1 -1
- package/dist/{index.es157.js.map → index166.es.js.map} +1 -1
- package/dist/{index.es163.js → index167.es.js} +1 -1
- package/dist/{index.es163.js.map → index167.es.js.map} +1 -1
- package/dist/{index.es164.js → index168.es.js} +1 -1
- package/dist/{index.es164.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.es145.js","sources":["../src/components/organisms/image-editor/engine/rendering.js"],"sourcesContent":["import { supportsContextFilter } from './canvas-filter.js'\nimport { FILTER_CSS } from './constants.js'\n\nexport function baseFilter(state) {\n const { adj } = state\n let f = `brightness(${adj.brightness}%) contrast(${adj.contrast}%) saturate(${adj.saturate}%) sepia(${adj.sepia}%) blur(${adj.blur}px) hue-rotate(${adj.hue}deg)`\n if (adj.filter !== 'none') f += ' ' + FILTER_CSS[adj.filter]\n return f.trim()\n}\n\nexport const ZOOM_MIN = 0.25\nexport const ZOOM_MAX = 4\nconst ZOOM_STEP = 1.25\n\nexport function fitStage(state) {\n const pad = 48\n const fitScale = Math.min(\n (state.stageEl.clientWidth - pad) / state.sourceCanvas.width,\n (state.stageEl.clientHeight - pad) / state.sourceCanvas.height,\n 1\n )\n state.fitScale = fitScale\n const scale = fitScale * state.zoom\n state.viewScale = scale\n const w = Math.round(state.sourceCanvas.width * scale),\n h = Math.round(state.sourceCanvas.height * scale)\n state.canvasEl.style.width = state.overlayEl.style.width = w + 'px'\n state.canvasEl.style.height = state.overlayEl.style.height = h + 'px'\n}\n\nexport function applyZoom(state, zoom) {\n state.zoom = Math.min(ZOOM_MAX, Math.max(ZOOM_MIN, zoom))\n if (!state.mounted || !state.sourceCanvas.width) {\n state.notify()\n return\n }\n fitStage(state)\n renderOverlay(state)\n state.notify()\n}\n\nexport function zoomIn(state) {\n applyZoom(state, state.zoom * ZOOM_STEP)\n}\n\nexport function zoomOut(state) {\n applyZoom(state, state.zoom / ZOOM_STEP)\n}\n\nexport function zoomToFit(state) {\n applyZoom(state, 1)\n}\n\nexport function syncCanvasSize(state) {\n state.canvasEl.width = state.overlayEl.width = state.sourceCanvas.width\n state.canvasEl.height = state.overlayEl.height = state.sourceCanvas.height\n fitStage(state)\n}\n\nexport function renderBase(state) {\n const { ctx, canvasEl, sourceCanvas } = state\n ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)\n const filter = baseFilter(state)\n\n if (supportsContextFilter()) {\n canvasEl.style.filter = ''\n ctx.filter = filter\n ctx.drawImage(sourceCanvas, 0, 0)\n ctx.filter = 'none'\n return\n }\n\n canvasEl.style.filter = filter\n ctx.drawImage(sourceCanvas, 0, 0)\n}\n\nexport function render(state) {\n if (!state.mounted || !state.sourceCanvas.width) return\n renderBase(state)\n renderOverlay(state)\n}\n\nexport const TEXT_LINE_HEIGHT = 1.1\n\nexport function wrapTextLines(state, L) {\n state.octx.font = `${L.size}px ${L.font}`\n const maxWidth = Math.max(L.boxWidth, 1)\n const lines = []\n // Split on hard breaks first, then word-wrap each paragraph in the box.\n L.text.split('\\n').forEach((paragraph) => {\n const words = paragraph.split(' ')\n let current = ''\n words.forEach((word) => {\n const test = current ? current + ' ' + word : word\n if (current && state.octx.measureText(test).width > maxWidth) {\n lines.push(current)\n current = word\n } else {\n current = test\n }\n })\n lines.push(current)\n })\n return lines\n}\n\nexport function layerBounds(state, L) {\n if (L.type === 'text') {\n const lines = wrapTextLines(state, L)\n return {\n x: L.x,\n y: L.y,\n w: L.boxWidth,\n h: lines.length * L.size * TEXT_LINE_HEIGHT,\n }\n }\n if (L.type === 'shape' && isMultiPoint(L)) {\n // Bounds come from the points themselves, padded for stroke width so the\n // selection box doesn't clip a thick line.\n let a = Infinity,\n b = Infinity,\n cc = -Infinity,\n d = -Infinity\n L.points.forEach((pt) => {\n a = Math.min(a, pt.x)\n b = Math.min(b, pt.y)\n cc = Math.max(cc, pt.x)\n d = Math.max(d, pt.y)\n })\n const pad = (L.width || 6) / 2\n return { x: a - pad, y: b - pad, w: cc - a + pad * 2, h: d - b + pad * 2 }\n }\n if (L.type === 'shape' || L.type === 'sticker') {\n return {\n x: Math.min(L.x, L.x + L.w),\n y: Math.min(L.y, L.y + L.h),\n w: Math.abs(L.w),\n h: Math.abs(L.h),\n }\n }\n if (L.type === 'stroke') {\n let a = Infinity,\n b = Infinity,\n cc = -Infinity,\n d = -Infinity\n L.points.forEach((p) => {\n a = Math.min(a, p.x)\n b = Math.min(b, p.y)\n cc = Math.max(cc, p.x)\n d = Math.max(d, p.y)\n })\n const pad = L.width / 2\n return { x: a - pad, y: b - pad, w: cc - a + pad * 2, h: d - b + pad * 2 }\n }\n return { x: 0, y: 0, w: 0, h: 0 }\n}\n\nexport function clampTextSize(state, L) {\n if (L.type !== 'text') return\n const availH = state.sourceCanvas.height - L.y\n while (L.size > 10 && layerBounds(state, L).h > availH && availH > 0) {\n L.size -= 1\n }\n}\n\nexport function clampBoxWidth(state, L) {\n if (L.type !== 'text') return\n const availW = state.sourceCanvas.width - L.x\n L.boxWidth = Math.round(Math.max(20, Math.min(L.boxWidth, availW)))\n}\n\nexport function cornerPoints(b) {\n return [\n { corner: 'tl', x: b.x, y: b.y },\n { corner: 'tr', x: b.x + b.w, y: b.y },\n { corner: 'bl', x: b.x, y: b.y + b.h },\n { corner: 'br', x: b.x + b.w, y: b.y + b.h },\n ]\n}\n\nexport const DIRECTIONAL_SHAPES = [\n 'line',\n 'dashedLine',\n 'arrow',\n 'dashedArrow',\n 'doubleArrow',\n 'dashedDoubleArrow',\n]\n\nconst DASHED_SHAPES = ['dashedLine', 'dashedArrow', 'dashedDoubleArrow']\n\n// Only plain shafts can be chained into a multi-point path. Arrow variants are\n// excluded on purpose: a head belongs at the end of a direction, and a path\n// that turns corners has no single direction to point along.\nexport const MULTI_POINT_SHAPES = ['line', 'dashedLine']\n\n// Which ends of the shaft get an arrow head.\nconst ARROW_HEAD_ENDS = {\n arrow: ['end'],\n dashedArrow: ['end'],\n doubleArrow: ['end', 'start'],\n dashedDoubleArrow: ['end', 'start'],\n}\n\n// Label geometry: gap above the shaft, and how far text sits off the line.\nexport const LABEL_GAP = 10\nexport const DEFAULT_LABEL_SIZE = 42\n\n/**\n * Directional shapes are stored one of two ways:\n * - legacy / single segment: x, y, w, h (start -> start + w/h)\n * - multi-point: an absolute `points` array\n * Everything downstream reads through here so both shapes render, hit-test,\n * move and resize identically.\n */\nexport function directionalPoints(L) {\n if (L.points && L.points.length >= 2) return L.points\n return [\n { x: L.x, y: L.y },\n { x: L.x + L.w, y: L.y + L.h },\n ]\n}\n\nexport function isMultiPoint(L) {\n return !!(L.points && L.points.length >= 2)\n}\n\n// A point at fraction `t` (0..1) along the path by arc length, plus the angle\n// of the segment it lands on -- so a label can sit anywhere from start to end.\nexport function pathPointAt(pts, closed, t) {\n const seq = closed && pts.length > 2 ? pts.concat([pts[0]]) : pts\n let total = 0\n const segs = []\n for (let i = 0; i < seq.length - 1; i++) {\n const len = Math.hypot(seq[i + 1].x - seq[i].x, seq[i + 1].y - seq[i].y)\n segs.push(len)\n total += len\n }\n if (!total) return { x: seq[0].x, y: seq[0].y, angle: 0 }\n let want = total * Math.min(Math.max(t, 0), 1)\n for (let i = 0; i < segs.length; i++) {\n if (want <= segs[i] || i === segs.length - 1) {\n const f = segs[i] ? want / segs[i] : 0\n return {\n x: seq[i].x + (seq[i + 1].x - seq[i].x) * f,\n y: seq[i].y + (seq[i + 1].y - seq[i].y) * f,\n angle: Math.atan2(seq[i + 1].y - seq[i].y, seq[i + 1].x - seq[i].x),\n }\n }\n want -= segs[i]\n }\n return { x: seq[0].x, y: seq[0].y, angle: 0 }\n}\n\nexport function pathMidpoint(pts, closed) {\n return pathPointAt(pts, closed, 0.5)\n}\n\n/**\n * Draws a shape's label relative to its shaft.\n * labelSide 'above' | 'below' -- which side of the line\n * labelOffset px clear of the shaft\n * labelPos 0..1 along the path (0 = start, 1 = end)\n * labelRotate follow the line angle, or stay horizontal\n * When following the line, text past +/-90 degrees is flipped so it never\n * reads mirrored, and the perpendicular offset flips with it to match.\n */\nfunction drawShapeLabel(c, L, pts) {\n if (!L.label) return\n const size = L.labelSize || DEFAULT_LABEL_SIZE\n const at = pathPointAt(pts, L.closed, L.labelPos ?? 0.5)\n const follow = L.labelRotate !== false\n const side = L.labelSide === 'below' ? -1 : 1\n const gap = L.labelOffset ?? LABEL_GAP\n const off = (L.width || 6) / 2 + gap\n\n let ang = follow ? at.angle : 0\n let flip = false\n if (follow && (ang > Math.PI / 2 || ang < -Math.PI / 2)) {\n ang += Math.PI\n flip = true\n }\n // Perpendicular to the shaft, pushed to the requested side.\n const dir = side * (flip ? -1 : 1)\n const nx = Math.sin(at.angle) * off * dir\n const ny = -Math.cos(at.angle) * off * dir\n\n c.save()\n c.translate(at.x + nx, at.y + ny)\n c.rotate(ang)\n c.font = `${size}px ${L.labelFont || 'Avenir Next, Segoe UI, sans-serif'}`\n c.fillStyle = L.labelColor || L.color\n c.textAlign = 'center'\n // 'below' hangs the text under the line, so its top edge is the anchor.\n c.textBaseline = side === 1 ? 'bottom' : 'top'\n c.setLineDash([])\n c.shadowColor = 'rgba(0,0,0,.25)'\n c.shadowBlur = size * 0.08\n c.fillText(L.label, 0, 0)\n c.restore()\n}\n\n// Dash and gap scale with stroke width; the floors keep hairlines visible.\nfunction dashedLineDash(width) {\n const w = Math.max(1, width || 1)\n return [Math.max(6, w * 2.5), Math.max(4, w * 1.75)]\n}\n\nfunction drawArrowHead(c, tipX, tipY, ang, head) {\n c.beginPath()\n c.moveTo(tipX, tipY)\n c.lineTo(\n tipX - head * Math.cos(ang - Math.PI / 6),\n tipY - head * Math.sin(ang - Math.PI / 6)\n )\n c.moveTo(tipX, tipY)\n c.lineTo(\n tipX - head * Math.cos(ang + Math.PI / 6),\n tipY - head * Math.sin(ang + Math.PI / 6)\n )\n c.stroke()\n}\n\n/**\n * Draws a label centred inside a closed shape (rect / ellipse / circle, or a\n * closed multi-point path). Wraps on spaces to stay within the shape's width.\n * Shares the same `label` field as line labels, so one control drives both.\n */\nfunction drawCenteredLabel(c, L, b) {\n if (!L.label) return\n const size = L.labelSize || DEFAULT_LABEL_SIZE\n c.save()\n c.font = `${size}px ${L.labelFont || 'Avenir Next, Segoe UI, sans-serif'}`\n c.fillStyle = L.labelColor || pickReadableInk(L)\n c.textAlign = 'center'\n c.textBaseline = 'middle'\n c.setLineDash([])\n const maxW = Math.max(20, Math.abs(b.w) - size * 0.6)\n const lines = []\n let line = ''\n L.label.split(/\\s+/).forEach((word) => {\n const next = line ? line + ' ' + word : word\n if (c.measureText(next).width > maxW && line) {\n lines.push(line)\n line = word\n } else line = next\n })\n if (line) lines.push(line)\n const lh = size * TEXT_LINE_HEIGHT\n // labelDx / labelDy nudge the block off-centre inside the shape.\n const cx = b.x + b.w / 2 + (L.labelDx || 0)\n const cy = b.y + b.h / 2 + (L.labelDy || 0) - ((lines.length - 1) * lh) / 2\n lines.forEach((ln, i) => c.fillText(ln, cx, cy + i * lh))\n c.restore()\n}\n\n// On a solid-filled shape the shape colour is the background, so default the\n// label to white or near-black depending on how dark that fill is.\nfunction pickReadableInk(L) {\n if (L.fill !== 'fill') return L.color\n const hex = (L.color || '#111111').replace('#', '')\n if (hex.length < 6) return '#ffffff'\n const r = parseInt(hex.slice(0, 2), 16),\n g = parseInt(hex.slice(2, 4), 16),\n b = parseInt(hex.slice(4, 6), 16)\n // Rec. 601 luma: matches how bright the fill actually looks.\n return 0.299 * r + 0.587 * g + 0.114 * b > 150 ? '#111111' : '#ffffff'\n}\n\nconst ROTATE_HANDLE_GAP = 26\nconst ROTATE_HANDLE_RADIUS = 6\n\nexport function layerCenter(state, L) {\n const b = layerBounds(state, L)\n return { x: b.x + b.w / 2, y: b.y + b.h / 2 }\n}\n\n// Canvas convention: y grows downward, so a positive angle turns clockwise.\nexport function rotatePoint(p, c, deg) {\n if (!deg) return { x: p.x, y: p.y }\n const rad = (deg * Math.PI) / 180\n const cos = Math.cos(rad),\n sin = Math.sin(rad)\n const dx = p.x - c.x,\n dy = p.y - c.y\n return { x: c.x + dx * cos - dy * sin, y: c.y + dx * sin + dy * cos }\n}\n\n// Resize without swinging a rotated layer: `local` stays put on screen.\nexport function keepingFixed(state, L, local, mutate) {\n const rot = L.rotation || 0\n if (!rot) {\n mutate()\n return\n }\n const before = rotatePoint(local, layerCenter(state, L), rot)\n mutate()\n const after = rotatePoint(local, layerCenter(state, L), rot)\n L.x += before.x - after.x\n L.y += before.y - after.y\n}\n\n// A pointer in the layer's own unrotated frame, where x/y/w/h are stored.\nexport function toLayerSpace(state, L, p) {\n return rotatePoint(p, layerCenter(state, L), -(L.rotation || 0))\n}\n\n// Local frame; the overlay's transform is what makes the grip orbit.\nfunction rotateHandleLocalPoint(state, L) {\n const b = layerBounds(state, L)\n return {\n x: b.x + b.w / 2,\n y: b.y + b.h + ROTATE_HANDLE_GAP / state.viewScale,\n }\n}\n\nfunction rotateHandlePoint(state, L) {\n const local = rotateHandleLocalPoint(state, L)\n return rotatePoint(local, layerCenter(state, L), L.rotation || 0)\n}\n\nexport function onRotateHandle(state, p, L) {\n const rp = rotateHandlePoint(state, L)\n return Math.hypot(p.x - rp.x, p.y - rp.y) <= 14 / state.viewScale\n}\n\nexport function onResizeHandle(state, p, L) {\n if (L.type === 'stroke') return null\n const hs = 12 / state.viewScale\n const q = toLayerSpace(state, L, p)\n if (L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)) {\n const ends = [\n { corner: 'start', x: L.x, y: L.y },\n { corner: 'end', x: L.x + L.w, y: L.y + L.h },\n ]\n const hit = ends.find(\n (ep) => Math.abs(q.x - ep.x) < hs && Math.abs(q.y - ep.y) < hs\n )\n return hit ? hit.corner : null\n }\n const b = layerBounds(state, L)\n const hit = cornerPoints(b).find(\n (cp) => Math.abs(q.x - cp.x) < hs && Math.abs(q.y - cp.y) < hs\n )\n return hit ? hit.corner : null\n}\n\nexport function paintLayer(state, c, L) {\n if (L._editing) return\n c.save()\n // Strokes only need the transform once they carry a rotation.\n if (L.type !== 'stroke' || L.rotation) {\n const b = layerBounds(state, L)\n const cx = b.x + b.w / 2,\n cy = b.y + b.h / 2\n c.translate(cx, cy)\n if (L.rotation) c.rotate((L.rotation * Math.PI) / 180)\n if (L.flipH || L.flipV) c.scale(L.flipH ? -1 : 1, L.flipV ? -1 : 1)\n c.translate(-cx, -cy)\n }\n if (L.type === 'text') {\n c.font = `${L.size}px ${L.font}`\n c.fillStyle = L.color\n c.textBaseline = 'top'\n c.shadowColor = 'rgba(0,0,0,.22)'\n c.shadowBlur = L.size * 0.05\n c.shadowOffsetY = L.size * 0.02\n const lineHeight = L.size * TEXT_LINE_HEIGHT\n wrapTextLines(state, L).forEach((line, i) => {\n c.fillText(line, L.x, L.y + i * lineHeight)\n })\n } else if (L.type === 'shape') {\n c.strokeStyle = L.color\n c.fillStyle = L.color\n c.lineWidth = L.width\n c.lineCap = 'round'\n c.lineJoin = 'round'\n const x = L.x,\n y = L.y,\n w = L.w,\n h = L.h\n const closedBox = { x, y, w, h }\n if (L.shape === 'rect') {\n L.fill === 'fill' ? c.fillRect(x, y, w, h) : c.strokeRect(x, y, w, h)\n drawCenteredLabel(c, L, closedBox)\n } else if (L.shape === 'ellipse') {\n c.beginPath()\n c.ellipse(\n x + w / 2,\n y + h / 2,\n Math.abs(w / 2),\n Math.abs(h / 2),\n 0,\n 0,\n Math.PI * 2\n )\n L.fill === 'fill' ? c.fill() : c.stroke()\n drawCenteredLabel(c, L, closedBox)\n } else if (L.shape === 'circle') {\n const r = Math.min(Math.abs(w), Math.abs(h)) / 2\n c.beginPath()\n c.arc(x + w / 2, y + h / 2, r, 0, Math.PI * 2)\n L.fill === 'fill' ? c.fill() : c.stroke()\n drawCenteredLabel(c, L, {\n x: x + w / 2 - r,\n y: y + h / 2 - r,\n w: r * 2,\n h: r * 2,\n })\n } else if (DIRECTIONAL_SHAPES.includes(L.shape)) {\n const pts = directionalPoints(L)\n const dashed = DASHED_SHAPES.includes(L.shape)\n if (dashed) {\n // Butt caps keep dashes crisp; round caps bleed into the gaps.\n c.lineCap = 'butt'\n c.setLineDash(dashedLineDash(L.width))\n }\n c.beginPath()\n pts.forEach((pt, i) =>\n i === 0 ? c.moveTo(pt.x, pt.y) : c.lineTo(pt.x, pt.y)\n )\n if (L.closed && pts.length > 2) c.closePath()\n // A closed multi-point path can be filled like any other shape.\n if (L.closed && pts.length > 2 && L.fill === 'fill') {\n c.setLineDash([])\n c.fill()\n }\n c.stroke()\n if (dashed) {\n // Heads draw solid: a dash pattern would fragment them into stubs.\n c.setLineDash([])\n c.lineCap = 'round'\n }\n // Heads sit on the outermost segments so they point the way the path goes.\n if (!L.closed) {\n const head = Math.max(14, L.width * 3)\n const a = pts[0],\n b2 = pts[1],\n y2 = pts[pts.length - 2],\n z = pts[pts.length - 1]\n const endAng = Math.atan2(z.y - y2.y, z.x - y2.x)\n const startAng = Math.atan2(a.y - b2.y, a.x - b2.x)\n ;(ARROW_HEAD_ENDS[L.shape] || []).forEach((which) => {\n if (which === 'end') drawArrowHead(c, z.x, z.y, endAng, head)\n else drawArrowHead(c, a.x, a.y, startAng, head)\n })\n }\n if (L.closed && pts.length > 2) {\n drawCenteredLabel(c, L, layerBounds(state, L))\n } else {\n drawShapeLabel(c, L, pts)\n }\n }\n } else if (L.type === 'stroke') {\n c.strokeStyle = L.color\n c.lineWidth = L.width\n c.lineCap = 'round'\n c.lineJoin = 'round'\n c.globalAlpha = L.style === 'highlight' ? 0.35 : 1\n c.beginPath()\n L.points.forEach((pt, i) =>\n i === 0 ? c.moveTo(pt.x, pt.y) : c.lineTo(pt.x, pt.y)\n )\n if (L.points.length === 1)\n c.lineTo(L.points[0].x + 0.1, L.points[0].y + 0.1)\n c.stroke()\n } else if (L.type === 'sticker') {\n const img = state.stickerImageCache.get(L.src)\n if (img && img.complete && img.naturalWidth)\n c.drawImage(img, L.x, L.y, L.w, L.h)\n }\n c.restore()\n}\n\nexport function normRect(r) {\n return {\n x: Math.min(r.x, r.x + r.w),\n y: Math.min(r.y, r.y + r.h),\n w: Math.abs(r.w),\n h: Math.abs(r.h),\n }\n}\n\nexport function drawCropOverlay(state) {\n const { cropRect, overlayEl, octx, sourceCanvas } = state\n if (!cropRect) return\n const r = normRect(cropRect)\n const W = overlayEl.width,\n H = overlayEl.height\n octx.save()\n octx.fillStyle = 'rgba(0,0,0,.45)'\n octx.fillRect(0, 0, W, Math.max(0, r.y))\n octx.fillRect(0, Math.min(H, r.y + r.h), W, Math.max(0, H - (r.y + r.h)))\n octx.fillRect(0, r.y, Math.max(0, r.x), r.h)\n octx.fillRect(Math.min(W, r.x + r.w), r.y, Math.max(0, W - (r.x + r.w)), r.h)\n octx.strokeStyle = '#fff'\n octx.lineWidth = Math.max(1, sourceCanvas.width / 500)\n octx.setLineDash([8, 6])\n octx.strokeRect(r.x, r.y, r.w, r.h)\n octx.restore()\n}\n\nexport function renderOverlay(state) {\n const { octx, overlayEl, layers, mode, selectedId } = state\n octx.clearRect(0, 0, overlayEl.width, overlayEl.height)\n layers.forEach((L) => {\n try {\n paintLayer(state, octx, L)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[image-editor] failed to paint layer', L.id, L.type, err)\n }\n })\n if (mode === 'select' && selectedId != null) {\n const L = layers.find((l) => l.id === selectedId)\n if (L) {\n const b = layerBounds(state, L)\n octx.save()\n // The layer's frame, so box, handles and grip all tilt with it.\n if (L.rotation) {\n const c = layerCenter(state, L)\n octx.translate(c.x, c.y)\n octx.rotate((L.rotation * Math.PI) / 180)\n octx.translate(-c.x, -c.y)\n }\n octx.strokeStyle = '#2f5fd2'\n octx.lineWidth = Math.max(1.2, 1.5 / state.viewScale)\n octx.setLineDash([6 / state.viewScale, 4 / state.viewScale])\n octx.strokeRect(b.x - 4, b.y - 4, b.w + 8, b.h + 8)\n octx.setLineDash([])\n if (L.type !== 'stroke') {\n const hs = 9 / state.viewScale\n octx.fillStyle = '#fff'\n octx.strokeStyle = '#2f5fd2'\n const handlePoints =\n L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)\n ? [\n { x: L.x, y: L.y },\n { x: L.x + L.w, y: L.y + L.h },\n ]\n : cornerPoints(b)\n handlePoints.forEach((cp) => {\n octx.fillRect(cp.x - hs / 2, cp.y - hs / 2, hs, hs)\n octx.strokeRect(cp.x - hs / 2, cp.y - hs / 2, hs, hs)\n })\n }\n // Rotate grip: every layer type gets one, strokes included.\n const rp = rotateHandleLocalPoint(state, L)\n octx.strokeStyle = '#2f5fd2'\n octx.fillStyle = '#fff'\n octx.beginPath()\n octx.moveTo(rp.x, b.y + b.h + 4)\n octx.lineTo(rp.x, rp.y)\n octx.stroke()\n octx.beginPath()\n octx.arc(\n rp.x,\n rp.y,\n ROTATE_HANDLE_RADIUS / state.viewScale,\n 0,\n Math.PI * 2\n )\n octx.fill()\n octx.stroke()\n octx.restore()\n }\n }\n if (state.pendingShape) paintLayer(state, octx, state.pendingShape)\n if (mode === 'crop' && state.cropRect) drawCropOverlay(state)\n}\n"],"names":["baseFilter","state","adj","f","FILTER_CSS","ZOOM_MIN","ZOOM_MAX","ZOOM_STEP","fitStage","fitScale","scale","w","h","applyZoom","zoom","renderOverlay","zoomIn","zoomOut","zoomToFit","syncCanvasSize","renderBase","ctx","canvasEl","sourceCanvas","filter","supportsContextFilter","render","TEXT_LINE_HEIGHT","wrapTextLines","L","maxWidth","lines","paragraph","words","current","word","test","layerBounds","isMultiPoint","a","b","cc","d","pt","pad","p","clampTextSize","availH","clampBoxWidth","availW","cornerPoints","DIRECTIONAL_SHAPES","DASHED_SHAPES","MULTI_POINT_SHAPES","ARROW_HEAD_ENDS","LABEL_GAP","DEFAULT_LABEL_SIZE","directionalPoints","pathPointAt","pts","closed","t","seq","total","segs","i","len","want","drawShapeLabel","c","size","at","follow","side","gap","off","ang","flip","dir","nx","ny","dashedLineDash","width","drawArrowHead","tipX","tipY","head","drawCenteredLabel","pickReadableInk","maxW","line","next","lh","cx","cy","ln","hex","r","g","ROTATE_HANDLE_GAP","ROTATE_HANDLE_RADIUS","layerCenter","rotatePoint","deg","rad","cos","sin","dx","dy","keepingFixed","local","mutate","rot","before","after","toLayerSpace","rotateHandleLocalPoint","rotateHandlePoint","onRotateHandle","rp","onResizeHandle","hs","q","hit","ep","cp","paintLayer","lineHeight","x","y","closedBox","dashed","b2","y2","z","endAng","startAng","which","img","normRect","drawCropOverlay","cropRect","overlayEl","octx","W","H","layers","mode","selectedId","err"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index154.es.js","sources":["../src/components/organisms/image-editor/engine/rendering.js"],"sourcesContent":["import { supportsContextFilter } from './canvas-filter.js'\nimport { FILTER_CSS } from './constants.js'\n\nexport function baseFilter(state) {\n const { adj } = state\n let f = `brightness(${adj.brightness}%) contrast(${adj.contrast}%) saturate(${adj.saturate}%) sepia(${adj.sepia}%) blur(${adj.blur}px) hue-rotate(${adj.hue}deg)`\n if (adj.filter !== 'none') f += ' ' + FILTER_CSS[adj.filter]\n return f.trim()\n}\n\nexport const ZOOM_MIN = 0.25\nexport const ZOOM_MAX = 4\nconst ZOOM_STEP = 1.25\n\nexport function fitStage(state) {\n const pad = 48\n const fitScale = Math.min(\n (state.stageEl.clientWidth - pad) / state.sourceCanvas.width,\n (state.stageEl.clientHeight - pad) / state.sourceCanvas.height,\n 1\n )\n state.fitScale = fitScale\n const scale = fitScale * state.zoom\n state.viewScale = scale\n const w = Math.round(state.sourceCanvas.width * scale),\n h = Math.round(state.sourceCanvas.height * scale)\n state.canvasEl.style.width = state.overlayEl.style.width = w + 'px'\n state.canvasEl.style.height = state.overlayEl.style.height = h + 'px'\n}\n\nexport function applyZoom(state, zoom) {\n state.zoom = Math.min(ZOOM_MAX, Math.max(ZOOM_MIN, zoom))\n if (!state.mounted || !state.sourceCanvas.width) {\n state.notify()\n return\n }\n fitStage(state)\n renderOverlay(state)\n state.notify()\n}\n\nexport function zoomIn(state) {\n applyZoom(state, state.zoom * ZOOM_STEP)\n}\n\nexport function zoomOut(state) {\n applyZoom(state, state.zoom / ZOOM_STEP)\n}\n\nexport function zoomToFit(state) {\n applyZoom(state, 1)\n}\n\nexport function syncCanvasSize(state) {\n state.canvasEl.width = state.overlayEl.width = state.sourceCanvas.width\n state.canvasEl.height = state.overlayEl.height = state.sourceCanvas.height\n fitStage(state)\n}\n\nexport function renderBase(state) {\n const { ctx, canvasEl, sourceCanvas } = state\n ctx.clearRect(0, 0, canvasEl.width, canvasEl.height)\n const filter = baseFilter(state)\n\n if (supportsContextFilter()) {\n canvasEl.style.filter = ''\n ctx.filter = filter\n ctx.drawImage(sourceCanvas, 0, 0)\n ctx.filter = 'none'\n return\n }\n\n canvasEl.style.filter = filter\n ctx.drawImage(sourceCanvas, 0, 0)\n}\n\nexport function render(state) {\n if (!state.mounted || !state.sourceCanvas.width) return\n renderBase(state)\n renderOverlay(state)\n}\n\nexport const TEXT_LINE_HEIGHT = 1.1\n\nexport function wrapTextLines(state, L) {\n state.octx.font = `${L.size}px ${L.font}`\n const maxWidth = Math.max(L.boxWidth, 1)\n const lines = []\n // Split on hard breaks first, then word-wrap each paragraph in the box.\n L.text.split('\\n').forEach((paragraph) => {\n const words = paragraph.split(' ')\n let current = ''\n words.forEach((word) => {\n const test = current ? current + ' ' + word : word\n if (current && state.octx.measureText(test).width > maxWidth) {\n lines.push(current)\n current = word\n } else {\n current = test\n }\n })\n lines.push(current)\n })\n return lines\n}\n\nexport function layerBounds(state, L) {\n if (L.type === 'text') {\n const lines = wrapTextLines(state, L)\n return {\n x: L.x,\n y: L.y,\n w: L.boxWidth,\n h: lines.length * L.size * TEXT_LINE_HEIGHT,\n }\n }\n if (L.type === 'shape' && isMultiPoint(L)) {\n // Bounds come from the points themselves, padded for stroke width so the\n // selection box doesn't clip a thick line.\n let a = Infinity,\n b = Infinity,\n cc = -Infinity,\n d = -Infinity\n L.points.forEach((pt) => {\n a = Math.min(a, pt.x)\n b = Math.min(b, pt.y)\n cc = Math.max(cc, pt.x)\n d = Math.max(d, pt.y)\n })\n const pad = (L.width || 6) / 2\n return { x: a - pad, y: b - pad, w: cc - a + pad * 2, h: d - b + pad * 2 }\n }\n if (L.type === 'shape' || L.type === 'sticker') {\n return {\n x: Math.min(L.x, L.x + L.w),\n y: Math.min(L.y, L.y + L.h),\n w: Math.abs(L.w),\n h: Math.abs(L.h),\n }\n }\n if (L.type === 'stroke') {\n let a = Infinity,\n b = Infinity,\n cc = -Infinity,\n d = -Infinity\n L.points.forEach((p) => {\n a = Math.min(a, p.x)\n b = Math.min(b, p.y)\n cc = Math.max(cc, p.x)\n d = Math.max(d, p.y)\n })\n const pad = L.width / 2\n return { x: a - pad, y: b - pad, w: cc - a + pad * 2, h: d - b + pad * 2 }\n }\n return { x: 0, y: 0, w: 0, h: 0 }\n}\n\nexport function clampTextSize(state, L) {\n if (L.type !== 'text') return\n const availH = state.sourceCanvas.height - L.y\n while (L.size > 10 && layerBounds(state, L).h > availH && availH > 0) {\n L.size -= 1\n }\n}\n\nexport function clampBoxWidth(state, L) {\n if (L.type !== 'text') return\n const availW = state.sourceCanvas.width - L.x\n L.boxWidth = Math.round(Math.max(20, Math.min(L.boxWidth, availW)))\n}\n\nexport function cornerPoints(b) {\n return [\n { corner: 'tl', x: b.x, y: b.y },\n { corner: 'tr', x: b.x + b.w, y: b.y },\n { corner: 'bl', x: b.x, y: b.y + b.h },\n { corner: 'br', x: b.x + b.w, y: b.y + b.h },\n ]\n}\n\nexport const DIRECTIONAL_SHAPES = [\n 'line',\n 'dashedLine',\n 'arrow',\n 'dashedArrow',\n 'doubleArrow',\n 'dashedDoubleArrow',\n]\n\nconst DASHED_SHAPES = ['dashedLine', 'dashedArrow', 'dashedDoubleArrow']\n\n// Only plain shafts can be chained into a multi-point path. Arrow variants are\n// excluded on purpose: a head belongs at the end of a direction, and a path\n// that turns corners has no single direction to point along.\nexport const MULTI_POINT_SHAPES = ['line', 'dashedLine']\n\n// Which ends of the shaft get an arrow head.\nconst ARROW_HEAD_ENDS = {\n arrow: ['end'],\n dashedArrow: ['end'],\n doubleArrow: ['end', 'start'],\n dashedDoubleArrow: ['end', 'start'],\n}\n\n// Label geometry: gap above the shaft, and how far text sits off the line.\nexport const LABEL_GAP = 10\nexport const DEFAULT_LABEL_SIZE = 42\n\n/**\n * Directional shapes are stored one of two ways:\n * - legacy / single segment: x, y, w, h (start -> start + w/h)\n * - multi-point: an absolute `points` array\n * Everything downstream reads through here so both shapes render, hit-test,\n * move and resize identically.\n */\nexport function directionalPoints(L) {\n if (L.points && L.points.length >= 2) return L.points\n return [\n { x: L.x, y: L.y },\n { x: L.x + L.w, y: L.y + L.h },\n ]\n}\n\nexport function isMultiPoint(L) {\n return !!(L.points && L.points.length >= 2)\n}\n\n// A point at fraction `t` (0..1) along the path by arc length, plus the angle\n// of the segment it lands on -- so a label can sit anywhere from start to end.\nexport function pathPointAt(pts, closed, t) {\n const seq = closed && pts.length > 2 ? pts.concat([pts[0]]) : pts\n let total = 0\n const segs = []\n for (let i = 0; i < seq.length - 1; i++) {\n const len = Math.hypot(seq[i + 1].x - seq[i].x, seq[i + 1].y - seq[i].y)\n segs.push(len)\n total += len\n }\n if (!total) return { x: seq[0].x, y: seq[0].y, angle: 0 }\n let want = total * Math.min(Math.max(t, 0), 1)\n for (let i = 0; i < segs.length; i++) {\n if (want <= segs[i] || i === segs.length - 1) {\n const f = segs[i] ? want / segs[i] : 0\n return {\n x: seq[i].x + (seq[i + 1].x - seq[i].x) * f,\n y: seq[i].y + (seq[i + 1].y - seq[i].y) * f,\n angle: Math.atan2(seq[i + 1].y - seq[i].y, seq[i + 1].x - seq[i].x),\n }\n }\n want -= segs[i]\n }\n return { x: seq[0].x, y: seq[0].y, angle: 0 }\n}\n\nexport function pathMidpoint(pts, closed) {\n return pathPointAt(pts, closed, 0.5)\n}\n\n/**\n * Draws a shape's label relative to its shaft.\n * labelSide 'above' | 'below' -- which side of the line\n * labelOffset px clear of the shaft\n * labelPos 0..1 along the path (0 = start, 1 = end)\n * labelRotate follow the line angle, or stay horizontal\n * When following the line, text past +/-90 degrees is flipped so it never\n * reads mirrored, and the perpendicular offset flips with it to match.\n */\nfunction drawShapeLabel(c, L, pts) {\n if (!L.label) return\n const size = L.labelSize || DEFAULT_LABEL_SIZE\n const at = pathPointAt(pts, L.closed, L.labelPos ?? 0.5)\n const follow = L.labelRotate !== false\n const side = L.labelSide === 'below' ? -1 : 1\n const gap = L.labelOffset ?? LABEL_GAP\n const off = (L.width || 6) / 2 + gap\n\n let ang = follow ? at.angle : 0\n let flip = false\n if (follow && (ang > Math.PI / 2 || ang < -Math.PI / 2)) {\n ang += Math.PI\n flip = true\n }\n // Perpendicular to the shaft, pushed to the requested side.\n const dir = side * (flip ? -1 : 1)\n const nx = Math.sin(at.angle) * off * dir\n const ny = -Math.cos(at.angle) * off * dir\n\n c.save()\n c.translate(at.x + nx, at.y + ny)\n c.rotate(ang)\n c.font = `${size}px ${L.labelFont || 'Avenir Next, Segoe UI, sans-serif'}`\n c.fillStyle = L.labelColor || L.color\n c.textAlign = 'center'\n // 'below' hangs the text under the line, so its top edge is the anchor.\n c.textBaseline = side === 1 ? 'bottom' : 'top'\n c.setLineDash([])\n c.shadowColor = 'rgba(0,0,0,.25)'\n c.shadowBlur = size * 0.08\n c.fillText(L.label, 0, 0)\n c.restore()\n}\n\n// Dash and gap scale with stroke width; the floors keep hairlines visible.\nfunction dashedLineDash(width) {\n const w = Math.max(1, width || 1)\n return [Math.max(6, w * 2.5), Math.max(4, w * 1.75)]\n}\n\nfunction drawArrowHead(c, tipX, tipY, ang, head) {\n c.beginPath()\n c.moveTo(tipX, tipY)\n c.lineTo(\n tipX - head * Math.cos(ang - Math.PI / 6),\n tipY - head * Math.sin(ang - Math.PI / 6)\n )\n c.moveTo(tipX, tipY)\n c.lineTo(\n tipX - head * Math.cos(ang + Math.PI / 6),\n tipY - head * Math.sin(ang + Math.PI / 6)\n )\n c.stroke()\n}\n\n/**\n * Draws a label centred inside a closed shape (rect / ellipse / circle, or a\n * closed multi-point path). Wraps on spaces to stay within the shape's width.\n * Shares the same `label` field as line labels, so one control drives both.\n */\nfunction drawCenteredLabel(c, L, b) {\n if (!L.label) return\n const size = L.labelSize || DEFAULT_LABEL_SIZE\n c.save()\n c.font = `${size}px ${L.labelFont || 'Avenir Next, Segoe UI, sans-serif'}`\n c.fillStyle = L.labelColor || pickReadableInk(L)\n c.textAlign = 'center'\n c.textBaseline = 'middle'\n c.setLineDash([])\n const maxW = Math.max(20, Math.abs(b.w) - size * 0.6)\n const lines = []\n let line = ''\n L.label.split(/\\s+/).forEach((word) => {\n const next = line ? line + ' ' + word : word\n if (c.measureText(next).width > maxW && line) {\n lines.push(line)\n line = word\n } else line = next\n })\n if (line) lines.push(line)\n const lh = size * TEXT_LINE_HEIGHT\n // labelDx / labelDy nudge the block off-centre inside the shape.\n const cx = b.x + b.w / 2 + (L.labelDx || 0)\n const cy = b.y + b.h / 2 + (L.labelDy || 0) - ((lines.length - 1) * lh) / 2\n lines.forEach((ln, i) => c.fillText(ln, cx, cy + i * lh))\n c.restore()\n}\n\n// On a solid-filled shape the shape colour is the background, so default the\n// label to white or near-black depending on how dark that fill is.\nfunction pickReadableInk(L) {\n if (L.fill !== 'fill') return L.color\n const hex = (L.color || '#111111').replace('#', '')\n if (hex.length < 6) return '#ffffff'\n const r = parseInt(hex.slice(0, 2), 16),\n g = parseInt(hex.slice(2, 4), 16),\n b = parseInt(hex.slice(4, 6), 16)\n // Rec. 601 luma: matches how bright the fill actually looks.\n return 0.299 * r + 0.587 * g + 0.114 * b > 150 ? '#111111' : '#ffffff'\n}\n\nconst ROTATE_HANDLE_GAP = 26\nconst ROTATE_HANDLE_RADIUS = 6\n\nexport function layerCenter(state, L) {\n const b = layerBounds(state, L)\n return { x: b.x + b.w / 2, y: b.y + b.h / 2 }\n}\n\n// Canvas convention: y grows downward, so a positive angle turns clockwise.\nexport function rotatePoint(p, c, deg) {\n if (!deg) return { x: p.x, y: p.y }\n const rad = (deg * Math.PI) / 180\n const cos = Math.cos(rad),\n sin = Math.sin(rad)\n const dx = p.x - c.x,\n dy = p.y - c.y\n return { x: c.x + dx * cos - dy * sin, y: c.y + dx * sin + dy * cos }\n}\n\n// Resize without swinging a rotated layer: `local` stays put on screen.\nexport function keepingFixed(state, L, local, mutate) {\n const rot = L.rotation || 0\n if (!rot) {\n mutate()\n return\n }\n const before = rotatePoint(local, layerCenter(state, L), rot)\n mutate()\n const after = rotatePoint(local, layerCenter(state, L), rot)\n L.x += before.x - after.x\n L.y += before.y - after.y\n}\n\n// A pointer in the layer's own unrotated frame, where x/y/w/h are stored.\nexport function toLayerSpace(state, L, p) {\n return rotatePoint(p, layerCenter(state, L), -(L.rotation || 0))\n}\n\n// Local frame; the overlay's transform is what makes the grip orbit.\nfunction rotateHandleLocalPoint(state, L) {\n const b = layerBounds(state, L)\n return {\n x: b.x + b.w / 2,\n y: b.y + b.h + ROTATE_HANDLE_GAP / state.viewScale,\n }\n}\n\nfunction rotateHandlePoint(state, L) {\n const local = rotateHandleLocalPoint(state, L)\n return rotatePoint(local, layerCenter(state, L), L.rotation || 0)\n}\n\nexport function onRotateHandle(state, p, L) {\n const rp = rotateHandlePoint(state, L)\n return Math.hypot(p.x - rp.x, p.y - rp.y) <= 14 / state.viewScale\n}\n\nexport function onResizeHandle(state, p, L) {\n if (L.type === 'stroke') return null\n const hs = 12 / state.viewScale\n const q = toLayerSpace(state, L, p)\n if (L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)) {\n const ends = [\n { corner: 'start', x: L.x, y: L.y },\n { corner: 'end', x: L.x + L.w, y: L.y + L.h },\n ]\n const hit = ends.find(\n (ep) => Math.abs(q.x - ep.x) < hs && Math.abs(q.y - ep.y) < hs\n )\n return hit ? hit.corner : null\n }\n const b = layerBounds(state, L)\n const hit = cornerPoints(b).find(\n (cp) => Math.abs(q.x - cp.x) < hs && Math.abs(q.y - cp.y) < hs\n )\n return hit ? hit.corner : null\n}\n\nexport function paintLayer(state, c, L) {\n if (L._editing) return\n c.save()\n // Strokes only need the transform once they carry a rotation.\n if (L.type !== 'stroke' || L.rotation) {\n const b = layerBounds(state, L)\n const cx = b.x + b.w / 2,\n cy = b.y + b.h / 2\n c.translate(cx, cy)\n if (L.rotation) c.rotate((L.rotation * Math.PI) / 180)\n if (L.flipH || L.flipV) c.scale(L.flipH ? -1 : 1, L.flipV ? -1 : 1)\n c.translate(-cx, -cy)\n }\n if (L.type === 'text') {\n c.font = `${L.size}px ${L.font}`\n c.fillStyle = L.color\n c.textBaseline = 'top'\n c.shadowColor = 'rgba(0,0,0,.22)'\n c.shadowBlur = L.size * 0.05\n c.shadowOffsetY = L.size * 0.02\n const lineHeight = L.size * TEXT_LINE_HEIGHT\n wrapTextLines(state, L).forEach((line, i) => {\n c.fillText(line, L.x, L.y + i * lineHeight)\n })\n } else if (L.type === 'shape') {\n c.strokeStyle = L.color\n c.fillStyle = L.color\n c.lineWidth = L.width\n c.lineCap = 'round'\n c.lineJoin = 'round'\n const x = L.x,\n y = L.y,\n w = L.w,\n h = L.h\n const closedBox = { x, y, w, h }\n if (L.shape === 'rect') {\n L.fill === 'fill' ? c.fillRect(x, y, w, h) : c.strokeRect(x, y, w, h)\n drawCenteredLabel(c, L, closedBox)\n } else if (L.shape === 'ellipse') {\n c.beginPath()\n c.ellipse(\n x + w / 2,\n y + h / 2,\n Math.abs(w / 2),\n Math.abs(h / 2),\n 0,\n 0,\n Math.PI * 2\n )\n L.fill === 'fill' ? c.fill() : c.stroke()\n drawCenteredLabel(c, L, closedBox)\n } else if (L.shape === 'circle') {\n const r = Math.min(Math.abs(w), Math.abs(h)) / 2\n c.beginPath()\n c.arc(x + w / 2, y + h / 2, r, 0, Math.PI * 2)\n L.fill === 'fill' ? c.fill() : c.stroke()\n drawCenteredLabel(c, L, {\n x: x + w / 2 - r,\n y: y + h / 2 - r,\n w: r * 2,\n h: r * 2,\n })\n } else if (DIRECTIONAL_SHAPES.includes(L.shape)) {\n const pts = directionalPoints(L)\n const dashed = DASHED_SHAPES.includes(L.shape)\n if (dashed) {\n // Butt caps keep dashes crisp; round caps bleed into the gaps.\n c.lineCap = 'butt'\n c.setLineDash(dashedLineDash(L.width))\n }\n c.beginPath()\n pts.forEach((pt, i) =>\n i === 0 ? c.moveTo(pt.x, pt.y) : c.lineTo(pt.x, pt.y)\n )\n if (L.closed && pts.length > 2) c.closePath()\n // A closed multi-point path can be filled like any other shape.\n if (L.closed && pts.length > 2 && L.fill === 'fill') {\n c.setLineDash([])\n c.fill()\n }\n c.stroke()\n if (dashed) {\n // Heads draw solid: a dash pattern would fragment them into stubs.\n c.setLineDash([])\n c.lineCap = 'round'\n }\n // Heads sit on the outermost segments so they point the way the path goes.\n if (!L.closed) {\n const head = Math.max(14, L.width * 3)\n const a = pts[0],\n b2 = pts[1],\n y2 = pts[pts.length - 2],\n z = pts[pts.length - 1]\n const endAng = Math.atan2(z.y - y2.y, z.x - y2.x)\n const startAng = Math.atan2(a.y - b2.y, a.x - b2.x)\n ;(ARROW_HEAD_ENDS[L.shape] || []).forEach((which) => {\n if (which === 'end') drawArrowHead(c, z.x, z.y, endAng, head)\n else drawArrowHead(c, a.x, a.y, startAng, head)\n })\n }\n if (L.closed && pts.length > 2) {\n drawCenteredLabel(c, L, layerBounds(state, L))\n } else {\n drawShapeLabel(c, L, pts)\n }\n }\n } else if (L.type === 'stroke') {\n c.strokeStyle = L.color\n c.lineWidth = L.width\n c.lineCap = 'round'\n c.lineJoin = 'round'\n c.globalAlpha = L.style === 'highlight' ? 0.35 : 1\n c.beginPath()\n L.points.forEach((pt, i) =>\n i === 0 ? c.moveTo(pt.x, pt.y) : c.lineTo(pt.x, pt.y)\n )\n if (L.points.length === 1)\n c.lineTo(L.points[0].x + 0.1, L.points[0].y + 0.1)\n c.stroke()\n } else if (L.type === 'sticker') {\n const img = state.stickerImageCache.get(L.src)\n if (img && img.complete && img.naturalWidth)\n c.drawImage(img, L.x, L.y, L.w, L.h)\n }\n c.restore()\n}\n\nexport function normRect(r) {\n return {\n x: Math.min(r.x, r.x + r.w),\n y: Math.min(r.y, r.y + r.h),\n w: Math.abs(r.w),\n h: Math.abs(r.h),\n }\n}\n\nexport function drawCropOverlay(state) {\n const { cropRect, overlayEl, octx, sourceCanvas } = state\n if (!cropRect) return\n const r = normRect(cropRect)\n const W = overlayEl.width,\n H = overlayEl.height\n octx.save()\n octx.fillStyle = 'rgba(0,0,0,.45)'\n octx.fillRect(0, 0, W, Math.max(0, r.y))\n octx.fillRect(0, Math.min(H, r.y + r.h), W, Math.max(0, H - (r.y + r.h)))\n octx.fillRect(0, r.y, Math.max(0, r.x), r.h)\n octx.fillRect(Math.min(W, r.x + r.w), r.y, Math.max(0, W - (r.x + r.w)), r.h)\n octx.strokeStyle = '#fff'\n octx.lineWidth = Math.max(1, sourceCanvas.width / 500)\n octx.setLineDash([8, 6])\n octx.strokeRect(r.x, r.y, r.w, r.h)\n octx.restore()\n}\n\nexport function renderOverlay(state) {\n const { octx, overlayEl, layers, mode, selectedId } = state\n octx.clearRect(0, 0, overlayEl.width, overlayEl.height)\n layers.forEach((L) => {\n try {\n paintLayer(state, octx, L)\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[image-editor] failed to paint layer', L.id, L.type, err)\n }\n })\n if (mode === 'select' && selectedId != null) {\n const L = layers.find((l) => l.id === selectedId)\n if (L) {\n const b = layerBounds(state, L)\n octx.save()\n // The layer's frame, so box, handles and grip all tilt with it.\n if (L.rotation) {\n const c = layerCenter(state, L)\n octx.translate(c.x, c.y)\n octx.rotate((L.rotation * Math.PI) / 180)\n octx.translate(-c.x, -c.y)\n }\n octx.strokeStyle = '#2f5fd2'\n octx.lineWidth = Math.max(1.2, 1.5 / state.viewScale)\n octx.setLineDash([6 / state.viewScale, 4 / state.viewScale])\n octx.strokeRect(b.x - 4, b.y - 4, b.w + 8, b.h + 8)\n octx.setLineDash([])\n if (L.type !== 'stroke') {\n const hs = 9 / state.viewScale\n octx.fillStyle = '#fff'\n octx.strokeStyle = '#2f5fd2'\n const handlePoints =\n L.type === 'shape' && DIRECTIONAL_SHAPES.includes(L.shape)\n ? [\n { x: L.x, y: L.y },\n { x: L.x + L.w, y: L.y + L.h },\n ]\n : cornerPoints(b)\n handlePoints.forEach((cp) => {\n octx.fillRect(cp.x - hs / 2, cp.y - hs / 2, hs, hs)\n octx.strokeRect(cp.x - hs / 2, cp.y - hs / 2, hs, hs)\n })\n }\n // Rotate grip: every layer type gets one, strokes included.\n const rp = rotateHandleLocalPoint(state, L)\n octx.strokeStyle = '#2f5fd2'\n octx.fillStyle = '#fff'\n octx.beginPath()\n octx.moveTo(rp.x, b.y + b.h + 4)\n octx.lineTo(rp.x, rp.y)\n octx.stroke()\n octx.beginPath()\n octx.arc(\n rp.x,\n rp.y,\n ROTATE_HANDLE_RADIUS / state.viewScale,\n 0,\n Math.PI * 2\n )\n octx.fill()\n octx.stroke()\n octx.restore()\n }\n }\n if (state.pendingShape) paintLayer(state, octx, state.pendingShape)\n if (mode === 'crop' && state.cropRect) drawCropOverlay(state)\n}\n"],"names":["baseFilter","state","adj","f","FILTER_CSS","ZOOM_MIN","ZOOM_MAX","ZOOM_STEP","fitStage","fitScale","scale","w","h","applyZoom","zoom","renderOverlay","zoomIn","zoomOut","zoomToFit","syncCanvasSize","renderBase","ctx","canvasEl","sourceCanvas","filter","supportsContextFilter","render","TEXT_LINE_HEIGHT","wrapTextLines","L","maxWidth","lines","paragraph","words","current","word","test","layerBounds","isMultiPoint","a","b","cc","d","pt","pad","p","clampTextSize","availH","clampBoxWidth","availW","cornerPoints","DIRECTIONAL_SHAPES","DASHED_SHAPES","MULTI_POINT_SHAPES","ARROW_HEAD_ENDS","LABEL_GAP","DEFAULT_LABEL_SIZE","directionalPoints","pathPointAt","pts","closed","t","seq","total","segs","i","len","want","drawShapeLabel","c","size","at","follow","side","gap","off","ang","flip","dir","nx","ny","dashedLineDash","width","drawArrowHead","tipX","tipY","head","drawCenteredLabel","pickReadableInk","maxW","line","next","lh","cx","cy","ln","hex","r","g","ROTATE_HANDLE_GAP","ROTATE_HANDLE_RADIUS","layerCenter","rotatePoint","deg","rad","cos","sin","dx","dy","keepingFixed","local","mutate","rot","before","after","toLayerSpace","rotateHandleLocalPoint","rotateHandlePoint","onRotateHandle","rp","onResizeHandle","hs","q","hit","ep","cp","paintLayer","lineHeight","x","y","closedBox","dashed","b2","y2","z","endAng","startAng","which","img","normRect","drawCropOverlay","cropRect","overlayEl","octx","W","H","layers","mode","selectedId","err"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { emitChange as o, MAX_HISTORY as e } from "./
|
|
2
|
-
import { syncCanvasSize as u, render as i } from "./
|
|
1
|
+
import { emitChange as o, MAX_HISTORY as e } from "./index153.es.js";
|
|
2
|
+
import { syncCanvasSize as u, render as i } from "./index154.es.js";
|
|
3
3
|
function d(n) {
|
|
4
4
|
const r = document.createElement("canvas");
|
|
5
5
|
return r.width = n.sourceCanvas.width, r.height = n.sourceCanvas.height, r.getContext("2d").drawImage(n.sourceCanvas, 0, 0), {
|
|
@@ -32,4 +32,4 @@ export {
|
|
|
32
32
|
d as snapshot,
|
|
33
33
|
g as undo
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=
|
|
35
|
+
//# sourceMappingURL=index155.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index155.es.js","sources":["../src/components/organisms/image-editor/engine/history.js"],"sourcesContent":["import { MAX_HISTORY, emitChange } from './state.js'\nimport { render, syncCanvasSize } from './rendering.js'\n\nexport function snapshot(state) {\n const c = document.createElement('canvas')\n c.width = state.sourceCanvas.width\n c.height = state.sourceCanvas.height\n c.getContext('2d').drawImage(state.sourceCanvas, 0, 0)\n return {\n raster: c,\n layers: JSON.parse(JSON.stringify(state.layers)),\n adj: { ...state.adj },\n sel: state.selectedId,\n }\n}\n\nexport function pushHistory(state) {\n state.undoStack.push(snapshot(state))\n if (state.undoStack.length > MAX_HISTORY) state.undoStack.shift()\n state.redoStack = []\n emitChange(state)\n}\nexport function popHistory(state) {\n state.undoStack.pop()\n emitChange(state)\n}\n\nexport function applySnapshot(state, s) {\n state.sourceCanvas.width = s.raster.width\n state.sourceCanvas.height = s.raster.height\n state.sourceCanvas.getContext('2d').drawImage(s.raster, 0, 0)\n state.layers = JSON.parse(JSON.stringify(s.layers))\n Object.assign(state.adj, s.adj)\n state.selectedId = s.sel\n syncCanvasSize(state)\n render(state)\n}\n\nexport function undo(state) {\n if (!state.undoStack.length) return\n state.redoStack.push(snapshot(state))\n applySnapshot(state, state.undoStack.pop())\n state.statusText = 'Undo'\n emitChange(state)\n}\n\nexport function redo(state) {\n if (!state.redoStack.length) return\n state.undoStack.push(snapshot(state))\n applySnapshot(state, state.redoStack.pop())\n state.statusText = 'Redo'\n emitChange(state)\n}\n"],"names":["snapshot","state","c","pushHistory","MAX_HISTORY","emitChange","popHistory","applySnapshot","s","syncCanvasSize","render","undo","redo"],"mappings":";;AAGO,SAASA,EAASC,GAAO;AAC9B,QAAMC,IAAI,SAAS,cAAc,QAAQ;AACzC,SAAAA,EAAE,QAAQD,EAAM,aAAa,OAC7BC,EAAE,SAASD,EAAM,aAAa,QAC9BC,EAAE,WAAW,IAAI,EAAE,UAAUD,EAAM,cAAc,GAAG,CAAC,GAC9C;AAAA,IACL,QAAQC;AAAA,IACR,QAAQ,KAAK,MAAM,KAAK,UAAUD,EAAM,MAAM,CAAC;AAAA,IAC/C,KAAK,EAAE,GAAGA,EAAM,IAAG;AAAA,IACnB,KAAKA,EAAM;AAAA,EACf;AACA;AAEO,SAASE,EAAYF,GAAO;AACjC,EAAAA,EAAM,UAAU,KAAKD,EAASC,CAAK,CAAC,GAChCA,EAAM,UAAU,SAASG,KAAaH,EAAM,UAAU,MAAK,GAC/DA,EAAM,YAAY,CAAA,GAClBI,EAAWJ,CAAK;AAClB;AACO,SAASK,EAAWL,GAAO;AAChC,EAAAA,EAAM,UAAU,IAAG,GACnBI,EAAWJ,CAAK;AAClB;AAEO,SAASM,EAAcN,GAAOO,GAAG;AACtC,EAAAP,EAAM,aAAa,QAAQO,EAAE,OAAO,OACpCP,EAAM,aAAa,SAASO,EAAE,OAAO,QACrCP,EAAM,aAAa,WAAW,IAAI,EAAE,UAAUO,EAAE,QAAQ,GAAG,CAAC,GAC5DP,EAAM,SAAS,KAAK,MAAM,KAAK,UAAUO,EAAE,MAAM,CAAC,GAClD,OAAO,OAAOP,EAAM,KAAKO,EAAE,GAAG,GAC9BP,EAAM,aAAaO,EAAE,KACrBC,EAAeR,CAAK,GACpBS,EAAOT,CAAK;AACd;AAEO,SAASU,EAAKV,GAAO;AAC1B,EAAKA,EAAM,UAAU,WACrBA,EAAM,UAAU,KAAKD,EAASC,CAAK,CAAC,GACpCM,EAAcN,GAAOA,EAAM,UAAU,IAAG,CAAE,GAC1CA,EAAM,aAAa,QACnBI,EAAWJ,CAAK;AAClB;AAEO,SAASW,EAAKX,GAAO;AAC1B,EAAKA,EAAM,UAAU,WACrBA,EAAM,UAAU,KAAKD,EAASC,CAAK,CAAC,GACpCM,EAAcN,GAAOA,EAAM,UAAU,IAAG,CAAE,GAC1CA,EAAM,aAAa,QACnBI,EAAWJ,CAAK;AAClB;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { pushHistory as d } from "./
|
|
2
|
-
import { emitChange as u, resetAdjValues as v } from "./
|
|
3
|
-
import { syncCanvasSize as C, render as x, normRect as w, layerBounds as R } from "./
|
|
4
|
-
import { setMode as g } from "./
|
|
1
|
+
import { pushHistory as d } from "./index155.es.js";
|
|
2
|
+
import { emitChange as u, resetAdjValues as v } from "./index153.es.js";
|
|
3
|
+
import { syncCanvasSize as C, render as x, normRect as w, layerBounds as R } from "./index154.es.js";
|
|
4
|
+
import { setMode as g } from "./index157.es.js";
|
|
5
5
|
function m(o, n, t) {
|
|
6
6
|
const r = R(o, n), a = { x: r.x + r.w / 2, y: r.y + r.h / 2 }, c = t(a);
|
|
7
7
|
return { x: c.x - a.x, y: c.y - a.y };
|
|
@@ -68,4 +68,4 @@ export {
|
|
|
68
68
|
T as rotate,
|
|
69
69
|
D as setCropRatio
|
|
70
70
|
};
|
|
71
|
-
//# sourceMappingURL=
|
|
71
|
+
//# sourceMappingURL=index156.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index156.es.js","sources":["../src/components/organisms/image-editor/engine/geometry.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange, resetAdjValues } from './state.js'\nimport { render, syncCanvasSize, normRect, layerBounds } from './rendering.js'\nimport { setMode } from './mode.js'\n\nfunction centerDelta(state, L, mapCenter) {\n const b = layerBounds(state, L)\n const oldCenter = { x: b.x + b.w / 2, y: b.y + b.h / 2 }\n const newCenter = mapCenter(oldCenter)\n return { x: newCenter.x - oldCenter.x, y: newCenter.y - oldCenter.y }\n}\n\nexport function rotate(state, deg) {\n pushHistory(state)\n const rad = (deg * Math.PI) / 180,\n ow = state.sourceCanvas.width,\n oh = state.sourceCanvas.height,\n nw = oh,\n nh = ow\n const tmp = document.createElement('canvas')\n tmp.width = nw\n tmp.height = nh\n const t = tmp.getContext('2d')\n t.translate(nw / 2, nh / 2)\n t.rotate(rad)\n t.drawImage(state.sourceCanvas, -ow / 2, -oh / 2)\n state.sourceCanvas.width = nw\n state.sourceCanvas.height = nh\n state.sourceCanvas.getContext('2d').drawImage(tmp, 0, 0)\n const rot = (x, y) => {\n const dx = x - ow / 2,\n dy = y - oh / 2\n return {\n x: dx * Math.cos(rad) - dy * Math.sin(rad) + nw / 2,\n y: dx * Math.sin(rad) + dy * Math.cos(rad) + nh / 2,\n }\n }\n state.layers.forEach((L) => {\n if (L.type === 'text' || L.type === 'shape' || L.type === 'sticker') {\n const delta = centerDelta(state, L, (c) => rot(c.x, c.y))\n L.x += delta.x\n L.y += delta.y\n L.rotation = ((((L.rotation || 0) + deg) % 360) + 360) % 360\n } else if (L.type === 'stroke') {\n L.points = L.points.map((pt) => rot(pt.x, pt.y))\n }\n })\n syncCanvasSize(state)\n render(state)\n state.statusText = deg < 0 ? 'Rotated left' : 'Rotated right'\n emitChange(state)\n}\n\nexport function flip(state, hz) {\n pushHistory(state)\n const w = state.sourceCanvas.width,\n h = state.sourceCanvas.height\n const tmp = document.createElement('canvas')\n tmp.width = w\n tmp.height = h\n const t = tmp.getContext('2d')\n if (hz) {\n t.translate(w, 0)\n t.scale(-1, 1)\n } else {\n t.translate(0, h)\n t.scale(1, -1)\n }\n t.drawImage(state.sourceCanvas, 0, 0)\n state.sourceCanvas.getContext('2d').clearRect(0, 0, w, h)\n state.sourceCanvas.getContext('2d').drawImage(tmp, 0, 0)\n const fx = (x) => (hz ? w - x : x),\n fy = (y) => (hz ? y : h - y)\n state.layers.forEach((L) => {\n if (L.type === 'text' || L.type === 'shape' || L.type === 'sticker') {\n const delta = centerDelta(state, L, (c) => ({ x: fx(c.x), y: fy(c.y) }))\n L.x += delta.x\n L.y += delta.y\n L.rotation = (360 - ((L.rotation || 0) % 360)) % 360\n if (hz) L.flipH = !L.flipH\n else L.flipV = !L.flipV\n } else if (L.type === 'stroke') {\n L.points = L.points.map((pt) => ({ x: fx(pt.x), y: fy(pt.y) }))\n }\n })\n render(state)\n state.statusText = hz ? 'Flipped horizontally' : 'Flipped vertically'\n emitChange(state)\n}\n\nexport function applyCrop(state) {\n if (\n !state.cropRect ||\n Math.abs(state.cropRect.w) < 4 ||\n Math.abs(state.cropRect.h) < 4\n ) {\n state.statusText = 'Draw a crop box first'\n state.notify()\n return\n }\n pushHistory(state)\n const r = normRect(state.cropRect)\n const tmp = document.createElement('canvas')\n tmp.width = Math.round(r.w)\n tmp.height = Math.round(r.h)\n tmp\n .getContext('2d')\n .drawImage(state.sourceCanvas, r.x, r.y, r.w, r.h, 0, 0, r.w, r.h)\n state.sourceCanvas.width = tmp.width\n state.sourceCanvas.height = tmp.height\n state.sourceCanvas.getContext('2d').drawImage(tmp, 0, 0)\n state.layers.forEach((L) => {\n if (L.type === 'text' || L.type === 'shape' || L.type === 'sticker') {\n L.x -= r.x\n L.y -= r.y\n } else if (L.type === 'stroke') {\n L.points = L.points.map((p) => ({ x: p.x - r.x, y: p.y - r.y }))\n }\n })\n state.cropRect = null\n setMode(state, 'select')\n syncCanvasSize(state)\n render(state)\n state.statusText = 'Cropped'\n emitChange(state)\n}\n\nexport function cancelCrop(state) {\n setMode(state, 'select')\n}\n\nexport function setCropRatio(state, v) {\n state.cropRatio = v\n state.notify()\n}\n\nexport function resetToOriginal(state) {\n if (!state.originalCanvas) return\n pushHistory(state)\n state.sourceCanvas.width = state.originalCanvas.width\n state.sourceCanvas.height = state.originalCanvas.height\n state.sourceCanvas.getContext('2d').drawImage(state.originalCanvas, 0, 0)\n state.layers = []\n state.selectedId = null\n state.zoom = 1\n resetAdjValues(state)\n syncCanvasSize(state)\n render(state)\n state.statusText = 'Reset to original'\n emitChange(state)\n}\n"],"names":["centerDelta","state","L","mapCenter","b","layerBounds","oldCenter","newCenter","rotate","deg","pushHistory","rad","ow","oh","nw","nh","tmp","t","rot","x","y","dx","dy","delta","c","pt","syncCanvasSize","render","emitChange","flip","hz","w","h","fx","fy","applyCrop","r","normRect","p","setMode","cancelCrop","setCropRatio","v","resetToOriginal","resetAdjValues"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { renderOverlay as e } from "./
|
|
2
|
-
import { commitTextEdit as l } from "./
|
|
3
|
-
import { cancelPoly as n } from "./
|
|
1
|
+
import { renderOverlay as e } from "./index154.es.js";
|
|
2
|
+
import { commitTextEdit as l } from "./index158.es.js";
|
|
3
|
+
import { cancelPoly as n } from "./index164.es.js";
|
|
4
4
|
const i = {
|
|
5
5
|
select: "Select — click a layer to move it",
|
|
6
6
|
crop: "Crop — drag a box",
|
|
@@ -33,4 +33,4 @@ export {
|
|
|
33
33
|
a as selectLayer,
|
|
34
34
|
u as setMode
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=
|
|
36
|
+
//# sourceMappingURL=index157.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index157.es.js","sources":["../src/components/organisms/image-editor/engine/mode.js"],"sourcesContent":["import { renderOverlay } from './rendering.js'\nimport { commitTextEdit } from './text-editor.js'\nimport { cancelPoly } from './pointer.js'\n\nconst STATUS_BY_MODE = {\n select: 'Select — click a layer to move it',\n crop: 'Crop — drag a box',\n text: 'Text tool',\n draw: 'Draw tool',\n shape: 'Shape tool — drag for one segment, or click to chain points',\n sticker: 'Sticker tool',\n}\n\nfunction pencilCursor(color) {\n const stroke = encodeURIComponent(color)\n return `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='${stroke}' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m18 2 4 4-14 14H4v-4L18 2z'/%3E%3Cpath d='m14.5 5.5 4 4'/%3E%3C/svg%3E\") 2 22, crosshair`\n}\n\nconst CURSOR_BY_MODE = {\n select: 'default',\n crop: 'crosshair',\n text: 'text',\n shape: 'crosshair',\n sticker: 'default',\n}\n\nexport function applyModeCursor(state) {\n if (!state.overlayEl) return\n state.overlayEl.style.cursor =\n state.mode === 'draw'\n ? pencilCursor(state.drawColor)\n : CURSOR_BY_MODE[state.mode] || 'default'\n}\n\nexport function setMode(state, m) {\n if (state.mode !== 'select') commitTextEdit(state)\n // Switching tools abandons a half-drawn multi-point line.\n if (state.pendingPoly) cancelPoly(state)\n state.mode = m\n state.pendingShape = null\n state.cropRect = null\n applyModeCursor(state)\n renderOverlay(state)\n state.statusText = STATUS_BY_MODE[m]\n state.notify()\n}\n\nexport function selectLayer(state, id) {\n state.selectedId = id\n renderOverlay(state)\n state.notify()\n}\n"],"names":["STATUS_BY_MODE","pencilCursor","color","CURSOR_BY_MODE","applyModeCursor","state","setMode","m","commitTextEdit","cancelPoly","renderOverlay","selectLayer","id"],"mappings":";;;AAIA,MAAMA,IAAiB;AAAA,EACrB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX;AAEA,SAASC,EAAaC,GAAO;AAE3B,SAAO,oIADQ,mBAAmBA,CAAK,CAC0G;AACnJ;AAEA,MAAMC,IAAiB;AAAA,EACrB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX;AAEO,SAASC,EAAgBC,GAAO;AACrC,EAAKA,EAAM,cACXA,EAAM,UAAU,MAAM,SACpBA,EAAM,SAAS,SACXJ,EAAaI,EAAM,SAAS,IAC5BF,EAAeE,EAAM,IAAI,KAAK;AACtC;AAEO,SAASC,EAAQD,GAAOE,GAAG;AAChC,EAAIF,EAAM,SAAS,YAAUG,EAAeH,CAAK,GAE7CA,EAAM,eAAaI,EAAWJ,CAAK,GACvCA,EAAM,OAAOE,GACbF,EAAM,eAAe,MACrBA,EAAM,WAAW,MACjBD,EAAgBC,CAAK,GACrBK,EAAcL,CAAK,GACnBA,EAAM,aAAaL,EAAeO,CAAC,GACnCF,EAAM,OAAM;AACd;AAEO,SAASM,EAAYN,GAAOO,GAAI;AACrC,EAAAP,EAAM,aAAaO,GACnBF,EAAcL,CAAK,GACnBA,EAAM,OAAM;AACd;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { keepingFixed as E, render as x, layerBounds as d, renderOverlay as y } from "./
|
|
1
|
+
import { keepingFixed as E, render as x, layerBounds as d, renderOverlay as y } from "./index154.es.js";
|
|
2
2
|
const u = 16, r = 28;
|
|
3
3
|
function c(e) {
|
|
4
4
|
const i = e.textEditorEl;
|
|
@@ -25,4 +25,4 @@ export {
|
|
|
25
25
|
f as commitTextEdit,
|
|
26
26
|
p as openTextEditor
|
|
27
27
|
};
|
|
28
|
-
//# sourceMappingURL=
|
|
28
|
+
//# sourceMappingURL=index158.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index158.es.js","sources":["../src/components/organisms/image-editor/engine/text-editor.js"],"sourcesContent":["import {\n keepingFixed,\n layerBounds,\n render,\n renderOverlay,\n} from './rendering.js'\n\nconst EDITOR_FONT_SIZE = 16\nconst EDITOR_MIN_HEIGHT = 28\n\n// Grow the box to fit what is typed; no-op while hidden (scrollHeight is 0).\nexport function autoGrowTextEditor(state) {\n const el = state.textEditorEl\n if (!el || el.offsetParent === null) return\n el.style.height = 'auto'\n el.style.height = Math.max(EDITOR_MIN_HEIGHT, el.scrollHeight) + 'px'\n}\n\nexport function openTextEditor(state, L, selectAll) {\n state.editingLayer = L\n state.editingSelectAll = !!selectAll\n const b = layerBounds(state, L),\n r = state.overlayEl.getBoundingClientRect(),\n wr = state.overlayEl.parentElement.getBoundingClientRect()\n state.textEditorEl.value = L.text === 'Text' ? '' : L.text\n state.textEditorEl.style.left =\n r.left - wr.left + b.x * state.viewScale + 'px'\n state.textEditorEl.style.top = r.top - wr.top + b.y * state.viewScale + 'px'\n state.textEditorEl.style.width = Math.max(60, b.w * state.viewScale) + 'px'\n state.textEditorEl.style.height =\n Math.max(EDITOR_MIN_HEIGHT, b.h * state.viewScale) + 'px'\n state.textEditorEl.style.fontFamily = L.font\n state.textEditorEl.style.fontSize = EDITOR_FONT_SIZE + 'px'\n state.textEditorEl.style.color = L.color\n L._editing = true\n renderOverlay(state)\n state.notify()\n // notify() is what un-hides the textarea, so measure on the next frame.\n requestAnimationFrame(() => autoGrowTextEditor(state))\n}\n\nexport function commitTextEdit(state) {\n if (!state.editingLayer) return\n const L = state.editingLayer\n // Longer text means taller bounds; hold the top-left corner.\n keepingFixed(state, L, { x: L.x, y: L.y }, () => {\n L.text =\n state.textEditorEl.value.trim() === '' ? 'Text' : state.textEditorEl.value\n })\n L._editing = false\n state.editingLayer = null\n render(state)\n state.notify()\n}\n\n// Committing alone leaves the hidden textarea focused, keeping the keyboard up.\nexport function blurTextEditor(state) {\n if (!state.editingLayer) return\n commitTextEdit(state)\n if (state.textEditorEl) state.textEditorEl.blur()\n}\n"],"names":["EDITOR_FONT_SIZE","EDITOR_MIN_HEIGHT","autoGrowTextEditor","state","el","openTextEditor","L","selectAll","b","layerBounds","r","wr","renderOverlay","commitTextEdit","keepingFixed","render","blurTextEditor"],"mappings":";AAOA,MAAMA,IAAmB,IACnBC,IAAoB;AAGnB,SAASC,EAAmBC,GAAO;AACxC,QAAMC,IAAKD,EAAM;AACjB,EAAI,CAACC,KAAMA,EAAG,iBAAiB,SAC/BA,EAAG,MAAM,SAAS,QAClBA,EAAG,MAAM,SAAS,KAAK,IAAIH,GAAmBG,EAAG,YAAY,IAAI;AACnE;AAEO,SAASC,EAAeF,GAAOG,GAAGC,GAAW;AAClD,EAAAJ,EAAM,eAAeG,GACrBH,EAAM,mBAAmB,CAAC,CAACI;AAC3B,QAAMC,IAAIC,EAAYN,GAAOG,CAAC,GAC5BI,IAAIP,EAAM,UAAU,sBAAqB,GACzCQ,IAAKR,EAAM,UAAU,cAAc,sBAAqB;AAC1D,EAAAA,EAAM,aAAa,QAAQG,EAAE,SAAS,SAAS,KAAKA,EAAE,MACtDH,EAAM,aAAa,MAAM,OACvBO,EAAE,OAAOC,EAAG,OAAOH,EAAE,IAAIL,EAAM,YAAY,MAC7CA,EAAM,aAAa,MAAM,MAAMO,EAAE,MAAMC,EAAG,MAAMH,EAAE,IAAIL,EAAM,YAAY,MACxEA,EAAM,aAAa,MAAM,QAAQ,KAAK,IAAI,IAAIK,EAAE,IAAIL,EAAM,SAAS,IAAI,MACvEA,EAAM,aAAa,MAAM,SACvB,KAAK,IAAIF,GAAmBO,EAAE,IAAIL,EAAM,SAAS,IAAI,MACvDA,EAAM,aAAa,MAAM,aAAaG,EAAE,MACxCH,EAAM,aAAa,MAAM,WAAWH,IAAmB,MACvDG,EAAM,aAAa,MAAM,QAAQG,EAAE,OACnCA,EAAE,WAAW,IACbM,EAAcT,CAAK,GACnBA,EAAM,OAAM,GAEZ,sBAAsB,MAAMD,EAAmBC,CAAK,CAAC;AACvD;AAEO,SAASU,EAAeV,GAAO;AACpC,MAAI,CAACA,EAAM,aAAc;AACzB,QAAMG,IAAIH,EAAM;AAEhB,EAAAW,EAAaX,GAAOG,GAAG,EAAE,GAAGA,EAAE,GAAG,GAAGA,EAAE,EAAC,GAAI,MAAM;AAC/C,IAAAA,EAAE,OACAH,EAAM,aAAa,MAAM,KAAI,MAAO,KAAK,SAASA,EAAM,aAAa;AAAA,EACzE,CAAC,GACDG,EAAE,WAAW,IACbH,EAAM,eAAe,MACrBY,EAAOZ,CAAK,GACZA,EAAM,OAAM;AACd;AAGO,SAASa,EAAeb,GAAO;AACpC,EAAKA,EAAM,iBACXU,EAAeV,CAAK,GAChBA,EAAM,gBAAcA,EAAM,aAAa,KAAI;AACjD;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { pushHistory as t } from "./
|
|
2
|
-
import { emitChange as d } from "./
|
|
3
|
-
import { render as a } from "./
|
|
1
|
+
import { pushHistory as t } from "./index155.es.js";
|
|
2
|
+
import { emitChange as d } from "./index153.es.js";
|
|
3
|
+
import { render as a } from "./index154.es.js";
|
|
4
4
|
function h(o, n) {
|
|
5
5
|
return new Promise((i, c) => {
|
|
6
6
|
const r = o.stickerImageCache.get(n);
|
|
@@ -38,4 +38,4 @@ export {
|
|
|
38
38
|
l as addSticker,
|
|
39
39
|
h as loadStickerImage
|
|
40
40
|
};
|
|
41
|
-
//# sourceMappingURL=
|
|
41
|
+
//# sourceMappingURL=index159.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index159.es.js","sources":["../src/components/organisms/image-editor/engine/stickers.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange } from './state.js'\nimport { render } from './rendering.js'\n\nexport function loadStickerImage(state, src) {\n return new Promise((resolve, reject) => {\n const cached = state.stickerImageCache.get(src)\n if (cached && cached.complete && cached.naturalWidth) {\n resolve(cached)\n return\n }\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => {\n state.stickerImageCache.set(src, img)\n resolve(img)\n }\n img.onerror = reject\n img.src = src\n })\n}\n\nexport function addSticker(state, src) {\n loadStickerImage(state, src)\n .then((img) => {\n pushHistory(state)\n const w = state.sourceCanvas.width * 0.25\n const h = w * (img.naturalHeight / img.naturalWidth || 1)\n const L = {\n id: state.nextId++,\n type: 'sticker',\n src,\n x: (state.sourceCanvas.width - w) / 2,\n y: (state.sourceCanvas.height - h) / 2,\n w,\n h,\n rotation: 0,\n flipH: false,\n flipV: false,\n }\n state.layers.push(L)\n render(state)\n state.mode = 'select'\n state.selectedId = L.id\n state.statusText = 'Sticker added'\n emitChange(state)\n })\n .catch(() => {\n state.statusText = 'Could not load that sticker (CORS?)'\n state.notify()\n })\n}\n"],"names":["loadStickerImage","state","src","resolve","reject","cached","img","addSticker","pushHistory","w","h","L","render","emitChange"],"mappings":";;;AAIO,SAASA,EAAiBC,GAAOC,GAAK;AAC3C,SAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,UAAMC,IAASJ,EAAM,kBAAkB,IAAIC,CAAG;AAC9C,QAAIG,KAAUA,EAAO,YAAYA,EAAO,cAAc;AACpD,MAAAF,EAAQE,CAAM;AACd;AAAA,IACF;AACA,UAAMC,IAAM,IAAI,MAAK;AACrB,IAAAA,EAAI,cAAc,aAClBA,EAAI,SAAS,MAAM;AACjB,MAAAL,EAAM,kBAAkB,IAAIC,GAAKI,CAAG,GACpCH,EAAQG,CAAG;AAAA,IACb,GACAA,EAAI,UAAUF,GACdE,EAAI,MAAMJ;AAAA,EACZ,CAAC;AACH;AAEO,SAASK,EAAWN,GAAOC,GAAK;AACrC,EAAAF,EAAiBC,GAAOC,CAAG,EACxB,KAAK,CAACI,MAAQ;AACb,IAAAE,EAAYP,CAAK;AACjB,UAAMQ,IAAIR,EAAM,aAAa,QAAQ,MAC/BS,IAAID,KAAKH,EAAI,gBAAgBA,EAAI,gBAAgB,IACjDK,IAAI;AAAA,MACR,IAAIV,EAAM;AAAA,MACV,MAAM;AAAA,MACN,KAAAC;AAAA,MACA,IAAID,EAAM,aAAa,QAAQQ,KAAK;AAAA,MACpC,IAAIR,EAAM,aAAa,SAASS,KAAK;AAAA,MACrC,GAAAD;AAAA,MACA,GAAAC;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO;AAAA,IACf;AACM,IAAAT,EAAM,OAAO,KAAKU,CAAC,GACnBC,EAAOX,CAAK,GACZA,EAAM,OAAO,UACbA,EAAM,aAAaU,EAAE,IACrBV,EAAM,aAAa,iBACnBY,EAAWZ,CAAK;AAAA,EAClB,CAAC,EACA,MAAM,MAAM;AACX,IAAAA,EAAM,aAAa,uCACnBA,EAAM,OAAM;AAAA,EACd,CAAC;AACL;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as e from "react";
|
|
2
|
-
import { cn as u } from "./
|
|
3
|
-
import { Typography as n } from "./
|
|
2
|
+
import { cn as u } from "./index91.es.js";
|
|
3
|
+
import { Typography as n } from "./index19.es.js";
|
|
4
4
|
import "lucide-react";
|
|
5
|
-
import "./
|
|
6
|
-
import "./
|
|
7
|
-
import "./
|
|
8
|
-
import "./
|
|
9
|
-
import { TextAreaVariants as m } from "./
|
|
5
|
+
import "./index62.es.js";
|
|
6
|
+
import "./index92.es.js";
|
|
7
|
+
import "./index31.es.js";
|
|
8
|
+
import "./index37.es.js";
|
|
9
|
+
import { TextAreaVariants as m } from "./index106.es.js";
|
|
10
10
|
const g = e.forwardRef(
|
|
11
11
|
({ className: o, inputLabel: i, showTextCount: l, maximumTextCount: a, id: d, ...t }, f) => {
|
|
12
12
|
const [r, s] = e.useState(!1), c = e.useRef(null);
|
|
@@ -46,4 +46,4 @@ g.displayName = "Textarea";
|
|
|
46
46
|
export {
|
|
47
47
|
g as Textarea
|
|
48
48
|
};
|
|
49
|
-
//# sourceMappingURL=
|
|
49
|
+
//# sourceMappingURL=index16.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"index16.es.js","sources":["../src/components/atoms/textarea/textarea.tsx"],"sourcesContent":["import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\nimport { Typography } from '@/index'\nimport { TextAreaVariants } from './textarea.styles'\nimport type { TextareaProps } from './textarea.types'\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n { className, inputLabel, showTextCount, maximumTextCount, id, ...props },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n React.useEffect(() => {\n if (isFocused) {\n inputRef.current?.focus()\n }\n }, [isFocused])\n return (\n <div id={id}>\n {inputLabel && (\n <Typography variant={'body4'} className={`text-light-3`}>\n {inputLabel}\n </Typography>\n )}\n <textarea\n className={cn(\n 'flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',\n className,\n TextAreaVariants({\n isFocused,\n disabled: props.disabled,\n className,\n })\n )}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n ref={ref}\n maxLength={maximumTextCount}\n {...props}\n />\n\n {showTextCount && (\n <Typography\n variant={'body4'}\n className={`text-light-4 mt-1.5 flex justify-end`}\n >\n {props.value?.toString().length}/{maximumTextCount}\n </Typography>\n )}\n </div>\n )\n }\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n"],"names":["Textarea","React","className","inputLabel","showTextCount","maximumTextCount","id","props","ref","isFocused","setIsFocused","inputRef","Typography","cn","TextAreaVariants"],"mappings":";;;;;;;;;AAOA,MAAMA,IAAWC,EAAM;AAAA,EACrB,CACE,EAAE,WAAAC,GAAW,YAAAC,GAAY,eAAAC,GAAe,kBAAAC,GAAkB,IAAAC,GAAI,GAAGC,EAAA,GACjEC,MACG;AACH,UAAM,CAACC,GAAWC,CAAY,IAAIT,EAAM,SAAS,EAAK,GAChDU,IAAWV,EAAM,OAAyB,IAAI;AACpD,WAAAA,EAAM,UAAU,MAAM;AACpB,MAAIQ,KACFE,EAAS,SAAS,MAAA;AAAA,IAEtB,GAAG,CAACF,CAAS,CAAC,GAEZ,gBAAAR,EAAA,cAAC,OAAA,EAAI,IAAAK,EAAA,GACFH,KACC,gBAAAF,EAAA,cAACW,GAAA,EAAW,SAAS,SAAS,WAAW,eAAA,GACtCT,CACH,GAEF,gBAAAF,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWY;AAAA,UACT;AAAA,UACAX;AAAA,UACAY,EAAiB;AAAA,YACf,WAAAL;AAAA,YACA,UAAUF,EAAM;AAAA,YAChB,WAAAL;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAEH,SAAS,MAAMQ,EAAa,EAAI;AAAA,QAChC,QAAQ,MAAMA,EAAa,EAAK;AAAA,QAChC,KAAAF;AAAA,QACA,WAAWH;AAAA,QACV,GAAGE;AAAA,MAAA;AAAA,IAAA,GAGLH,KACC,gBAAAH,EAAA;AAAA,MAACW;AAAA,MAAA;AAAA,QACC,SAAS;AAAA,QACT,WAAW;AAAA,MAAA;AAAA,MAEVL,EAAM,OAAO,SAAA,EAAW;AAAA,MAAO;AAAA,MAAEF;AAAA,IAAA,CAGxC;AAAA,EAEJ;AACF;AACAL,EAAS,cAAc;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { pushHistory as f } from "./
|
|
2
|
-
import { emitChange as r, getSel as l } from "./
|
|
3
|
-
import { render as o, keepingFixed as d, clampTextSize as u, clampBoxWidth as p } from "./
|
|
4
|
-
import { SHAPES as y } from "./
|
|
5
|
-
import { applyModeCursor as h } from "./
|
|
1
|
+
import { pushHistory as f } from "./index155.es.js";
|
|
2
|
+
import { emitChange as r, getSel as l } from "./index153.es.js";
|
|
3
|
+
import { render as o, keepingFixed as d, clampTextSize as u, clampBoxWidth as p } from "./index154.es.js";
|
|
4
|
+
import { SHAPES as y } from "./index152.es.js";
|
|
5
|
+
import { applyModeCursor as h } from "./index157.es.js";
|
|
6
6
|
function c(e, i, n) {
|
|
7
7
|
d(e, i, { x: i.x, y: i.y }, n);
|
|
8
8
|
}
|
|
@@ -212,4 +212,4 @@ export {
|
|
|
212
212
|
w as setTextFont,
|
|
213
213
|
D as setTextSize
|
|
214
214
|
};
|
|
215
|
-
//# sourceMappingURL=
|
|
215
|
+
//# sourceMappingURL=index160.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es151.js","sources":["../src/components/organisms/image-editor/engine/layer-actions.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange, getSel } from './state.js'\nimport {\n render,\n clampTextSize,\n clampBoxWidth,\n keepingFixed,\n} from './rendering.js'\n\n// These all resize the bounds, which would swing a rotated layer's centre.\nfunction resizeInPlace(state, L, mutate) {\n keepingFixed(state, L, { x: L.x, y: L.y }, mutate)\n}\nimport { SHAPES } from './constants.js'\nimport { applyModeCursor } from './mode.js'\n\nexport function layerName(L) {\n if (L.type === 'text')\n return '“' + (L.text.length > 16 ? L.text.slice(0, 16) + '…' : L.text) + '”'\n if (L.type === 'stroke')\n return L.style === 'highlight' ? 'Highlighter' : 'Brush stroke'\n if (L.type === 'sticker') return 'Sticker'\n const s = SHAPES.find((s) => s.id === L.shape)\n return s ? s.name : L.shape\n}\n\nexport function deleteLayer(state, id) {\n pushHistory(state)\n state.layers = state.layers.filter((l) => l.id !== id)\n if (state.selectedId === id) state.selectedId = null\n render(state)\n state.statusText = 'Layer deleted'\n emitChange(state)\n}\n\nexport function deleteSelected(state) {\n if (state.selectedId != null) deleteLayer(state, state.selectedId)\n}\n\nexport function duplicateSelected(state) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n const copy = JSON.parse(JSON.stringify(L))\n copy.id = state.nextId++\n if (\n copy.type === 'text' ||\n copy.type === 'shape' ||\n copy.type === 'sticker'\n ) {\n copy.x += 20\n copy.y += 20\n } else if (copy.type === 'stroke') {\n copy.points = copy.points.map((p) => ({ x: p.x + 20, y: p.y + 20 }))\n }\n state.layers.push(copy)\n state.selectedId = copy.id\n render(state)\n state.statusText = 'Layer duplicated'\n emitChange(state)\n}\n\nexport function bringSelectedToFront(state) {\n const i = state.layers.findIndex((l) => l.id === state.selectedId)\n if (i < 0) return\n pushHistory(state)\n const [L] = state.layers.splice(i, 1)\n state.layers.push(L)\n render(state)\n emitChange(state)\n}\n\nexport function sendSelectedToBack(state) {\n const i = state.layers.findIndex((l) => l.id === state.selectedId)\n if (i < 0) return\n pushHistory(state)\n const [L] = state.layers.splice(i, 1)\n state.layers.unshift(L)\n render(state)\n emitChange(state)\n}\n\nexport function setAdjustment(state, key, value) {\n state.adj[key] = value\n render(state)\n state.notify()\n}\nexport function setFilter(state, id) {\n state.adj.filter = id\n render(state)\n emitChange(state)\n}\nexport function selectShapeType(state, id) {\n state.selectedShapeType = id\n state.notify()\n}\nexport function setShapeFill(state, v) {\n state.shapeFill = v\n state.notify()\n}\nexport function setShapeWidth(state, v) {\n state.shapeWidth = v\n state.notify()\n}\nexport function setBrushSize(state, v) {\n state.brushSize = v\n state.notify()\n}\nexport function setBrushStyle(state, v) {\n state.brushStyle = v\n state.notify()\n}\nexport function setTextFont(state, v) {\n state.textFont = v\n state.notify()\n}\nexport function setTextSize(state, v) {\n state.textSize = v\n state.notify()\n}\nexport function setTextColor(state, v) {\n state.textColor = v\n state.notify()\n}\nexport function setShapeColor(state, v) {\n state.shapeColor = v\n state.notify()\n}\nexport function setDrawColor(state, v) {\n state.drawColor = v\n applyModeCursor(state)\n state.notify()\n}\n\nexport function setSelectedColor(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.color = v\n render(state)\n emitChange(state)\n}\nexport function setSelectedText(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'text') return\n resizeInPlace(state, L, () => {\n L.text = v\n })\n render(state)\n state.notify()\n}\nexport function setSelectedFont(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n resizeInPlace(state, L, () => {\n L.font = v\n })\n render(state)\n emitChange(state)\n}\nexport function setSelectedTextSize(state, v) {\n const L = getSel(state)\n if (!L) return\n resizeInPlace(state, L, () => {\n L.size = v\n clampTextSize(state, L)\n })\n render(state)\n state.notify()\n}\nexport function setSelectedBoxWidth(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'text') return\n resizeInPlace(state, L, () => {\n L.boxWidth = v\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n })\n render(state)\n state.notify()\n}\nexport function setSelectedShapeFill(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.fill = v\n render(state)\n emitChange(state)\n}\nexport function setSelectedWidth(state, v) {\n const L = getSel(state)\n if (!L) return\n resizeInPlace(state, L, () => {\n L.width = v\n })\n render(state)\n state.notify()\n}\n\n// Labels live on the shape layer itself rather than as a separate text layer,\n// so they move, rotate and delete with the line they annotate.\n\nexport function setSelectedLabel(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n pushHistory(state)\n L.label = v\n render(state)\n emitChange(state)\n}\n\nexport function setSelectedLabelSize(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelSize = v\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelColor(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelColor = v\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelFont(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelFont = v\n render(state)\n state.notify()\n}\n\n/** Toggles a multi-point path between open and closed. */\nexport function setSelectedClosed(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape' || !L.points || L.points.length < 3) return\n pushHistory(state)\n L.closed = !!v\n render(state)\n emitChange(state)\n}\n\nexport function setSelectedLabelSide(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelSide = v === 'below' ? 'below' : 'above'\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelOffset(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelOffset = v\n render(state)\n state.notify()\n}\n\n/** Where the label sits along the shaft: 0 = start, 1 = end. */\nexport function setSelectedLabelPos(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelPos = Math.min(Math.max(v, 0), 1)\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelRotate(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelRotate = !!v\n render(state)\n state.notify()\n}\n\n/** Explicit multi-point drawing, so chaining points isn't a hidden gesture. */\nexport function setMultiPointMode(state, v) {\n state.multiPointMode = !!v\n state.notify()\n}\n\n// The ribbon's rotate/flip act on the whole image when nothing is selected,\n// and on just the selected layer when something is -- which is what people\n// expect after clicking a layer.\n\nexport function rotateSelected(state, deg) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.rotation = ((((L.rotation || 0) + deg) % 360) + 360) % 360\n render(state)\n state.statusText = `Layer rotated to ${Math.round(L.rotation)}°`\n emitChange(state)\n}\n\nexport function flipSelected(state, horizontal) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n if (horizontal) L.flipH = !L.flipH\n else L.flipV = !L.flipV\n render(state)\n state.statusText = horizontal ? 'Layer flipped H' : 'Layer flipped V'\n emitChange(state)\n}\n\n/** Horizontal nudge for text centred inside a closed shape. */\nexport function setSelectedLabelDx(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelDx = v\n render(state)\n state.notify()\n}\n\n/** Vertical nudge for text centred inside a closed shape. */\nexport function setSelectedLabelDy(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelDy = v\n render(state)\n state.notify()\n}\n"],"names":["resizeInPlace","state","L","mutate","keepingFixed","layerName","s","SHAPES","deleteLayer","id","pushHistory","l","render","emitChange","deleteSelected","duplicateSelected","getSel","copy","p","bringSelectedToFront","sendSelectedToBack","setAdjustment","key","value","setFilter","selectShapeType","setShapeFill","v","setShapeWidth","setBrushSize","setBrushStyle","setTextFont","setTextSize","setTextColor","setShapeColor","setDrawColor","applyModeCursor","setSelectedColor","setSelectedText","setSelectedFont","setSelectedTextSize","clampTextSize","setSelectedBoxWidth","clampBoxWidth","setSelectedShapeFill","setSelectedWidth","setSelectedLabel","setSelectedLabelSize","setSelectedLabelColor","setSelectedLabelFont","setSelectedClosed","setSelectedLabelSide","setSelectedLabelOffset","setSelectedLabelPos","setSelectedLabelRotate","setMultiPointMode","rotateSelected","deg","flipSelected","horizontal","setSelectedLabelDx","setSelectedLabelDy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index160.es.js","sources":["../src/components/organisms/image-editor/engine/layer-actions.js"],"sourcesContent":["import { pushHistory } from './history.js'\nimport { emitChange, getSel } from './state.js'\nimport {\n render,\n clampTextSize,\n clampBoxWidth,\n keepingFixed,\n} from './rendering.js'\n\n// These all resize the bounds, which would swing a rotated layer's centre.\nfunction resizeInPlace(state, L, mutate) {\n keepingFixed(state, L, { x: L.x, y: L.y }, mutate)\n}\nimport { SHAPES } from './constants.js'\nimport { applyModeCursor } from './mode.js'\n\nexport function layerName(L) {\n if (L.type === 'text')\n return '“' + (L.text.length > 16 ? L.text.slice(0, 16) + '…' : L.text) + '”'\n if (L.type === 'stroke')\n return L.style === 'highlight' ? 'Highlighter' : 'Brush stroke'\n if (L.type === 'sticker') return 'Sticker'\n const s = SHAPES.find((s) => s.id === L.shape)\n return s ? s.name : L.shape\n}\n\nexport function deleteLayer(state, id) {\n pushHistory(state)\n state.layers = state.layers.filter((l) => l.id !== id)\n if (state.selectedId === id) state.selectedId = null\n render(state)\n state.statusText = 'Layer deleted'\n emitChange(state)\n}\n\nexport function deleteSelected(state) {\n if (state.selectedId != null) deleteLayer(state, state.selectedId)\n}\n\nexport function duplicateSelected(state) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n const copy = JSON.parse(JSON.stringify(L))\n copy.id = state.nextId++\n if (\n copy.type === 'text' ||\n copy.type === 'shape' ||\n copy.type === 'sticker'\n ) {\n copy.x += 20\n copy.y += 20\n } else if (copy.type === 'stroke') {\n copy.points = copy.points.map((p) => ({ x: p.x + 20, y: p.y + 20 }))\n }\n state.layers.push(copy)\n state.selectedId = copy.id\n render(state)\n state.statusText = 'Layer duplicated'\n emitChange(state)\n}\n\nexport function bringSelectedToFront(state) {\n const i = state.layers.findIndex((l) => l.id === state.selectedId)\n if (i < 0) return\n pushHistory(state)\n const [L] = state.layers.splice(i, 1)\n state.layers.push(L)\n render(state)\n emitChange(state)\n}\n\nexport function sendSelectedToBack(state) {\n const i = state.layers.findIndex((l) => l.id === state.selectedId)\n if (i < 0) return\n pushHistory(state)\n const [L] = state.layers.splice(i, 1)\n state.layers.unshift(L)\n render(state)\n emitChange(state)\n}\n\nexport function setAdjustment(state, key, value) {\n state.adj[key] = value\n render(state)\n state.notify()\n}\nexport function setFilter(state, id) {\n state.adj.filter = id\n render(state)\n emitChange(state)\n}\nexport function selectShapeType(state, id) {\n state.selectedShapeType = id\n state.notify()\n}\nexport function setShapeFill(state, v) {\n state.shapeFill = v\n state.notify()\n}\nexport function setShapeWidth(state, v) {\n state.shapeWidth = v\n state.notify()\n}\nexport function setBrushSize(state, v) {\n state.brushSize = v\n state.notify()\n}\nexport function setBrushStyle(state, v) {\n state.brushStyle = v\n state.notify()\n}\nexport function setTextFont(state, v) {\n state.textFont = v\n state.notify()\n}\nexport function setTextSize(state, v) {\n state.textSize = v\n state.notify()\n}\nexport function setTextColor(state, v) {\n state.textColor = v\n state.notify()\n}\nexport function setShapeColor(state, v) {\n state.shapeColor = v\n state.notify()\n}\nexport function setDrawColor(state, v) {\n state.drawColor = v\n applyModeCursor(state)\n state.notify()\n}\n\nexport function setSelectedColor(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.color = v\n render(state)\n emitChange(state)\n}\nexport function setSelectedText(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'text') return\n resizeInPlace(state, L, () => {\n L.text = v\n })\n render(state)\n state.notify()\n}\nexport function setSelectedFont(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n resizeInPlace(state, L, () => {\n L.font = v\n })\n render(state)\n emitChange(state)\n}\nexport function setSelectedTextSize(state, v) {\n const L = getSel(state)\n if (!L) return\n resizeInPlace(state, L, () => {\n L.size = v\n clampTextSize(state, L)\n })\n render(state)\n state.notify()\n}\nexport function setSelectedBoxWidth(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'text') return\n resizeInPlace(state, L, () => {\n L.boxWidth = v\n clampBoxWidth(state, L)\n clampTextSize(state, L)\n })\n render(state)\n state.notify()\n}\nexport function setSelectedShapeFill(state, v) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.fill = v\n render(state)\n emitChange(state)\n}\nexport function setSelectedWidth(state, v) {\n const L = getSel(state)\n if (!L) return\n resizeInPlace(state, L, () => {\n L.width = v\n })\n render(state)\n state.notify()\n}\n\n// Labels live on the shape layer itself rather than as a separate text layer,\n// so they move, rotate and delete with the line they annotate.\n\nexport function setSelectedLabel(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n pushHistory(state)\n L.label = v\n render(state)\n emitChange(state)\n}\n\nexport function setSelectedLabelSize(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelSize = v\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelColor(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelColor = v\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelFont(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelFont = v\n render(state)\n state.notify()\n}\n\n/** Toggles a multi-point path between open and closed. */\nexport function setSelectedClosed(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape' || !L.points || L.points.length < 3) return\n pushHistory(state)\n L.closed = !!v\n render(state)\n emitChange(state)\n}\n\nexport function setSelectedLabelSide(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelSide = v === 'below' ? 'below' : 'above'\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelOffset(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelOffset = v\n render(state)\n state.notify()\n}\n\n/** Where the label sits along the shaft: 0 = start, 1 = end. */\nexport function setSelectedLabelPos(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelPos = Math.min(Math.max(v, 0), 1)\n render(state)\n state.notify()\n}\n\nexport function setSelectedLabelRotate(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelRotate = !!v\n render(state)\n state.notify()\n}\n\n/** Explicit multi-point drawing, so chaining points isn't a hidden gesture. */\nexport function setMultiPointMode(state, v) {\n state.multiPointMode = !!v\n state.notify()\n}\n\n// The ribbon's rotate/flip act on the whole image when nothing is selected,\n// and on just the selected layer when something is -- which is what people\n// expect after clicking a layer.\n\nexport function rotateSelected(state, deg) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n L.rotation = ((((L.rotation || 0) + deg) % 360) + 360) % 360\n render(state)\n state.statusText = `Layer rotated to ${Math.round(L.rotation)}°`\n emitChange(state)\n}\n\nexport function flipSelected(state, horizontal) {\n const L = getSel(state)\n if (!L) return\n pushHistory(state)\n if (horizontal) L.flipH = !L.flipH\n else L.flipV = !L.flipV\n render(state)\n state.statusText = horizontal ? 'Layer flipped H' : 'Layer flipped V'\n emitChange(state)\n}\n\n/** Horizontal nudge for text centred inside a closed shape. */\nexport function setSelectedLabelDx(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelDx = v\n render(state)\n state.notify()\n}\n\n/** Vertical nudge for text centred inside a closed shape. */\nexport function setSelectedLabelDy(state, v) {\n const L = getSel(state)\n if (!L || L.type !== 'shape') return\n L.labelDy = v\n render(state)\n state.notify()\n}\n"],"names":["resizeInPlace","state","L","mutate","keepingFixed","layerName","s","SHAPES","deleteLayer","id","pushHistory","l","render","emitChange","deleteSelected","duplicateSelected","getSel","copy","p","bringSelectedToFront","sendSelectedToBack","setAdjustment","key","value","setFilter","selectShapeType","setShapeFill","v","setShapeWidth","setBrushSize","setBrushStyle","setTextFont","setTextSize","setTextColor","setShapeColor","setDrawColor","applyModeCursor","setSelectedColor","setSelectedText","setSelectedFont","setSelectedTextSize","clampTextSize","setSelectedBoxWidth","clampBoxWidth","setSelectedShapeFill","setSelectedWidth","setSelectedLabel","setSelectedLabelSize","setSelectedLabelColor","setSelectedLabelFont","setSelectedClosed","setSelectedLabelSide","setSelectedLabelOffset","setSelectedLabelPos","setSelectedLabelRotate","setMultiPointMode","rotateSelected","deg","flipSelected","horizontal","setSelectedLabelDx","setSelectedLabelDy"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { supportsContextFilter as v, rasterizeWithFilter as C } from "./
|
|
2
|
-
import { syncCanvasSize as m, render as g, baseFilter as p, paintLayer as w } from "./
|
|
3
|
-
import { emit as l, emitChange as f, getState as y, resetAdjValues as S } from "./
|
|
4
|
-
import { loadStickerImage as I } from "./
|
|
1
|
+
import { supportsContextFilter as v, rasterizeWithFilter as C } from "./index169.es.js";
|
|
2
|
+
import { syncCanvasSize as m, render as g, baseFilter as p, paintLayer as w } from "./index154.es.js";
|
|
3
|
+
import { emit as l, emitChange as f, getState as y, resetAdjValues as S } from "./index153.es.js";
|
|
4
|
+
import { loadStickerImage as I } from "./index159.es.js";
|
|
5
5
|
function L(e) {
|
|
6
6
|
const n = (e.type || "").toLowerCase();
|
|
7
7
|
if (n === "image/heic" || n === "image/heif") return !0;
|
|
@@ -144,4 +144,4 @@ export {
|
|
|
144
144
|
B as normalizeSource,
|
|
145
145
|
O as produce
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=
|
|
147
|
+
//# sourceMappingURL=index161.es.js.map
|