Browse Source

- New uploader look.

- Previews fixed.
- Queue position selection.
- Design improvements.
- Important fixes and QoL.
tags/v1.4.4
Ivan Bravo Bravo 6 months ago
parent
commit
b75d16c984
38 changed files with 566 additions and 395 deletions
  1. 0
    4
      src/.gitignore
  2. 3
    2
      src/.vscode/tasks.json
  3. 2
    2
      src/assets/css/components/_box.scss
  4. 4
    0
      src/assets/css/components/_wizard.scss
  5. 1
    1
      src/assets/css/reset/_base.scss
  6. 0
    8
      src/components/Layout/Navbar.vue
  7. 14
    34
      src/components/Nudity/PhotoRun.vue
  8. 133
    142
      src/components/Nudity/Upload.vue
  9. 1
    35
      src/components/Queue/QueueBar.vue
  10. 5
    3
      src/components/Queue/QueuePhoto.vue
  11. 2
    2
      src/components/Settings/SettingsPreferences.vue
  12. 5
    1
      src/components/UI/BoxItem.vue
  13. 24
    1
      src/components/UI/ProjectUpdate.vue
  14. 9
    2
      src/electron/src/modules/settings.js
  15. 25
    9
      src/electron/src/modules/tools/power.js
  16. 16
    6
      src/layouts/default.vue
  17. 11
    4
      src/layouts/wizard.vue
  18. 1
    1
      src/middleware/wizard.js
  19. 48
    4
      src/modules/config/cli-errors.json
  20. 24
    0
      src/modules/dream.js
  21. 32
    1
      src/modules/file.js
  22. 1
    1
      src/modules/nudify/photo-run.js
  23. 3
    3
      src/modules/system/requirements.js
  24. 75
    11
      src/modules/tutorial.js
  25. 2
    3
      src/modules/updater/base.js
  26. 49
    49
      src/package.json
  27. 1
    1
      src/package.min.json
  28. 10
    3
      src/pages/nudify/_id/crop.vue
  29. 2
    1
      src/pages/nudify/_id/editor.vue
  30. 4
    16
      src/pages/nudify/_id/overlay.vue
  31. 2
    0
      src/pages/nudify/_id/results.vue
  32. 13
    0
      src/pages/settings/app.vue
  33. 8
    3
      src/pages/wizard/checkpoints.vue
  34. 13
    3
      src/pages/wizard/power.vue
  35. 1
    1
      src/pages/wizard/tos.vue
  36. 0
    37
      src/patches/tui-image-editor+3.7.1.patch
  37. 22
    0
      src/patches/tui-image-editor+3.7.3.patch
  38. 0
    1
      src/tailwind.config.js

+ 0
- 4
src/.gitignore View File

@@ -94,8 +94,4 @@ sw.*
#
*.tgz

# settings
settings.json
nucleus.json

scripts/decrypt.js

+ 3
- 2
src/.vscode/tasks.json View File

@@ -18,7 +18,7 @@
"background": {
"activeOnStart": true,
"beginsPattern": "Updated",
"endsPattern": "Compiled",
"endsPattern": "Compiled"
}
}
},
@@ -55,7 +55,8 @@
"dependsOn": [
"Build: Electron",
"Build: Nuxt"
]
],
"problemMatcher": []
}
]
}

+ 2
- 2
src/assets/css/components/_box.scss View File

@@ -24,10 +24,10 @@
}

.box__header {
@apply px-4 pt-4;
@apply px-4 pt-2;

.title {
@apply text-lg font-semibold text-generic-200;
@apply text-base font-semibold text-generic-200;
}

.subtitle {

+ 4
- 0
src/assets/css/components/_wizard.scss View File

@@ -49,6 +49,10 @@
p {
@apply text-xl mb-6;
}

a {
@apply text-white underline;
}
}
}


+ 1
- 1
src/assets/css/reset/_base.scss View File

@@ -18,7 +18,7 @@

html {
@apply bg-black text-generic-500 font-sans;
background-image: url('~assets/images/papyrus-dark.webp'); /* Background pattern from Toptal Subtle Patterns */
//background-image: url('~assets/images/papyrus-dark.webp'); /* Background pattern from Toptal Subtle Patterns */
font-size: 16px;
text-size-adjust: 100%;
font-smoothing: antialiased;

+ 0
- 8
src/components/Layout/Navbar.vue View File

@@ -20,14 +20,6 @@
<a v-if="isDev" class="navbar__item" @click.prevent="createError">
Force Error
</a>

<a v-if="isDev" href="https://google.com" class="navbar__item">
External Page
</a>

<a v-if="isDev" href="https://google.com" target="_blank" class="navbar__item">
Popup
</a>
</div>

<div class="navbar__right">

+ 14
- 34
src/components/Nudity/PhotoRun.vue View File

@@ -76,7 +76,7 @@
</div>

<div v-show="hasMaskfin" class="content__item">
<button v-tooltip="'View maskfin'" class="button button--info button--sm" @click.prevent="$refs.maskfinDialog.showModal()">
<button v-tooltip="'View Maskfin'" class="button button--info button--sm" @click.prevent="$refs.maskfinDialog.showModal()">
<font-awesome-icon icon="mask" />
</button>
</div>
@@ -97,7 +97,7 @@

<div class="maskfin__description">
<p>This is the Maskfin, a mask that represents in layers the areas that the algorithm will replace with the fake nude.</p>
<p>Click on the "Add to queue" button to add it as an additional photo, edit the layers and continue with the nudification. You can also save it to your computer, edit it with an external program and continue the nudification manually.</p>
<p>Click on the "Add to queue" button to add it as an additional photo, edit the layers with the editor and continue with the nudification. You can also save it to your computer, edit it with an external program and continue the nudification manually.</p>
<p>For more information please consult the <a :href="manualURL" target="_blank">guide</a>.</p>
</div>

@@ -167,7 +167,9 @@ export default {
return {}
}

return { backgroundImage: `url(${this.run.outputFile.path})` }
const url = encodeURI(this.run.outputFile.path)

return { backgroundImage: `url(${url})` }
},

previewClass() {
@@ -189,20 +191,7 @@ export default {

methods: {
save() {
const savePath = showSaveDialogSync({
defaultPath: this.run.outputName,
filters: [
{ name: 'PNG', extensions: ['png'] },
{ name: 'JPG', extensions: ['jpg'] },
{ name: 'GIF', extensions: ['gif'] },
],
})

if (isNil(savePath)) {
return
}

this.run.outputFile.copy(savePath)
this.run.outputFile.save(this.run.outputName)
},

rerun() {
@@ -218,20 +207,7 @@ export default {
},

saveMask() {
const savePath = showSaveDialogSync({
defaultPath: `maskfin-${this.run.outputName}`,
filters: [
{ name: 'PNG', extensions: ['png'] },
{ name: 'JPG', extensions: ['jpg'] },
{ name: 'GIF', extensions: ['gif'] },
],
})

if (isNil(savePath)) {
return
}

this.run.maskfinFile.copy(savePath)
this.run.maskfinFile.save(`maskfin-${this.run.outputName}`)
},
},
}
@@ -267,7 +243,7 @@ export default {

.run__preview {
@apply absolute opacity-0 left-0 right-0 top-0 bottom-0 z-10;
@apply bg-cover bg-center;
@apply bg-contain bg-center bg-no-repeat;
transition: opacity .3s linear;
}
}
@@ -330,11 +306,15 @@ export default {
}

.maskfin__preview {
@apply mb-4;
@apply mb-4 flex justify-center items-center;

img {
max-height: 350px;
}
}

.maskfin__description {
@apply text-sm mb-4;
@apply mb-4 text-sm;

p {
@apply mb-2;

+ 133
- 142
src/components/Nudity/Upload.vue View File

@@ -1,39 +1,100 @@
<template>
<div id="uploader" class="c-uploader">
<div id="uploader-settings" class="uploader__settings box box--items">
<div class="box__content">
<box-item
label="Upload mode"
description="What will happen when uploading a photo.">
<select v-model="$settings.app.uploadMode" class="input">
<option value="none">
Put in Pending
</option>
<option value="add-queue">
Put in Queue
</option>
<option value="go-preferences">
Put in Pending and Open preferences
</option>
</select>
</box-item>
<div id="uploader" class="uploader">
<!-- Uploader Selection -->
<div class="uploader__selection">
<div class="selection__menu">
<select
id="uploader-settings"
v-model="$settings.app.uploadMode"
v-tooltip="{ content: 'Upload mode. What will happen when uploading a photo.', placement: 'right' }"
class="input">
<option value="add-queue">
Put in Queue
</option>
<option value="none">
Put in Pending
</option>
<option value="go-preferences">
Put in Pending and Open preferences
</option>
</select>

<div id="uploader-methods" class="box box--items">
<div class="box__content">
<box-item
label="Web"
icon="globe"
:is-link="true"
:class="{'box__item--active': selectionId === 0}"
@click="selectionId = 0" />

<box-item
label="Instagram"
:icon="['fab', 'instagram']"
:is-link="true"
:class="{'box__item--active': selectionId === 1}"
@click="selectionId = 1" />

<box-item
label="File"
icon="file"
:is-link="true"
:class="{'box__item--active': selectionId === 2}"
@click="selectionId = 2" />

<box-item
label="Folder"
icon="folder-open"
:is-link="true"
:class="{'box__item--active': selectionId === 3}"
@click="selectionId = 3" />

<box-item
label="Examples"
icon="images"
href="https://time.dreamnet.tech/docs/guide/photos" />
</div>
</div>

<div class="box uploader__hint">
<div class="box__content">
<p>
<font-awesome-icon icon="exclamation-circle" />
You can drag and drop photos and folders into the application no matter where you are.
</p>
</div>
</div>
</div>
</div>

<div id="uploader-alternatives" class="uploader__alt">
<!-- File -->
<div class="box">
<div class="box__header">
<h2 class="title">
<span class="icon"><font-awesome-icon icon="image" /></span>
<span>Photo.</span>
</h2>
<h3 class="subtitle">
Select one or more photos from your computer.
</h3>
<div class="selection__content">
<!-- Web Address -->
<div v-show="selectionId === 0" class="selection__content__body">
<input v-model="webAddress" type="url" class="input mb-2" placeholder="https://" data-private="lipsum">

<p class="help">
It must end in a valid extension (jpg, png, gif)
</p>

<button class="button" @click="openUrl">
Submit
</button>
</div>

<!-- Instagram -->
<div v-show="selectionId === 1" class="selection__content__body">
<input v-model="instagramPhoto" type="url" class="input mb-2" placeholder="https://www.instagram.com/p/dU4fHDw-Ho/" data-private="lipsum">

<p class="help">
Enter the web address or Media ID of an Instagram photo.
</p>

<button class="button" @click="openInstagramPhoto">
Submit
</button>
</div>

<div class="box__content">
<!-- File -->
<div v-show="selectionId === 2" class="selection__content__body">
<input
v-show="false"
ref="photo"
@@ -43,69 +104,23 @@
@change="openFile">

<button class="button" @click.prevent="$refs.photo.click()">
<span>open file</span>
<span>Open File</span>
</button>
</div>
</div>

<!-- Folder -->
<div class="box">
<div class="box__header">
<h2 class="title">
<span class="icon"><font-awesome-icon icon="folder-open" /></span>
<span>Folder.</span>
</h2>
<h3 class="subtitle">
Select one or more folders on your computer. All valid photos inside will be uploaded.
</h3>
<p class="help">
Select one or more photos from your computer.
</p>
</div>

<div class="box__content">
<!-- Folder -->
<div v-show="selectionId === 3" class="selection__content__body">
<button class="button" @click.prevent="openFolder">
<span>Open folder</span>
</button>
</div>
</div>

<!-- Web Address -->
<div class="box">
<div class="box__header">
<h2 class="title">
<span class="icon"><font-awesome-icon icon="globe" /></span>
<span>Web Address.</span>
</h2>
<h3 class="subtitle">
Enter the web address of a photo. It must end in a valid extension (jpg, png, gif)
</h3>
</div>

<div class="box__content">
<input v-model="webAddress" type="url" class="input mb-2" placeholder="https://" data-private="lipsum">

<button class="button" @click="openUrl">
Submit
</button>
</div>
</div>

<!-- Web Address -->
<div class="box">
<div class="box__header">
<h2 class="title">
<span class="icon"><font-awesome-icon :icon="['fab', 'instagram']" /></span>
<span>Instagram photo.</span>
</h2>
<h3 class="subtitle">
Enter the web address or Media ID of an Instagram photo.
</h3>
</div>

<div class="box__content">
<input v-model="instagramPhoto" type="url" class="input mb-2" placeholder="https://www.instagram.com/p/dU4fHDw-Ho/" data-private="lipsum">

<button class="button" @click="openInstagramPhoto">
Submit
</button>
<p class="help">
Select one or more folders on your computer. All valid photos inside will be uploaded.
</p>
</div>
</div>
</div>
@@ -133,6 +148,7 @@ export default {
},

data: () => ({
selectionId: 0,
webAddress: '',
instagramPhoto: '',
}),
@@ -207,82 +223,57 @@ export default {
</script>

<style lang="scss" scoped>
.c-uploader {
.uploader {
@apply w-full relative;
}

.uploader__alt {
@apply flex flex-wrap justify-between;

.box {
@apply flex flex-col;
width: calc(1/2*100% - (1 - 1/2)*1rem);
min-height: 200px;

.box__header {
h2 {
@apply text-lg font-bold;
}

h3 {
@apply text-sm mb-4 font-light;
}
.uploader__selection {
@apply flex;

.help {
@apply text-xs align-text-top font-bold underline;
cursor: help;
}
}
.selection__menu {
@apply mr-4;
width: 200px;

.box__content {
@apply flex-1 flex flex-col justify-center items-center;
}
.input {
@apply mb-6;
}
}

.uploader__dropzone {
@apply flex items-center justify-center;
@apply bg-dark-500 mb-6;
@apply border-2 border-dashed border-dark-100;
height: 200px;
transition: all 0.1s linear;
.selection__content {
@apply flex flex-1 items-center justify-center;

&.is-dragging {
@apply bg-dark-700 border-dark-200;

.dropzone-hint {
@apply text-white text-xl;
}
.selection__content__body {
@apply text-center;
width: 50%;
}

.dropzone-hint {
@apply text-generic-300 uppercase;
transition: all 0.1s linear;
.input {
@apply mb-4;
}
}

.upload-url {
@apply mb-6 flex;
.help {
@apply text-sm;

.input {
@apply flex-1 mr-4;
&:not(:last-child) {
@apply mb-4;
}
}
}

&.is-dragging {
@apply border-white border-dotted;
.button:not(:last-child) {
@apply mb-4;
}

.button {

.dragging-overlay {
//display: block;
}
}
}

.dragging-overlay {
@apply bg-white absolute top-0 left-0 right-0 bottom-0 hidden;
opacity: 0.3;
}
.uploader__hint {
@apply text-center;

.fu-hint {
@apply text-sm text-gray-600;
p {
@apply text-sm;
}
}
</style>

+ 1
- 35
src/components/Queue/QueueBar.vue View File

@@ -112,7 +112,6 @@ export default {
@apply relative flex flex-col;
@apply bg-dark-500 py-2 z-10;
@apply border-l border-dark-100;
width: 200px;
}

section {
@@ -164,41 +163,8 @@ section {
}

.jobs__list {
@apply flex-1;
@apply flex flex-wrap flex-1;
@apply py-2 overflow-y-auto max-h-full;
will-change: scroll-position;

.job {
@apply inline-block mb-2 cursor-pointer;
width: 47px;
height: 47px;
transition: all .1s ease-in-out;

&:not(:nth-child(3n)) {
@apply mr-2;
}

&.job--running {
img {
@apply border-primary-500;
}
}

&.job--failed {
img {
@apply border-danger-500;
}
}

&:hover {
@apply z-30;
transform: scale(1.3)
}

img {
@apply border-2 border-transparent rounded-full;
@apply w-full h-full;
}
}
}
</style>

+ 5
- 3
src/components/Queue/QueuePhoto.vue View File

@@ -80,8 +80,8 @@ export default {

<style lang="scss" scoped>
.photo {
@apply mb-2 relative border-2 border-transparent;
height: 40px;
@apply w-1/2 relative border-2 border-transparent;
height: 150px;
will-change: transform;

&.photo--running {
@@ -93,6 +93,8 @@ export default {
}

&:hover {
@apply bg-dark-900;

.photo__content {
@apply opacity-100;
}
@@ -100,7 +102,7 @@ export default {

.photo__preview {
@apply absolute top-0 bottom-0 left-0 right-0 z-10;
@apply bg-cover bg-center;
@apply bg-contain bg-no-repeat bg-center;
}

.photo__content {

+ 2
- 2
src/components/Settings/SettingsPreferences.vue View File

@@ -57,10 +57,10 @@
<Preference id="preferences-body" v-model="currentValue.body.boobs" label="Boobs" />

<!-- Areola -->
<Preference v-model="currentValue.body.areola" label="Areola" />
<Preference v-model="currentValue.body.areola" label="Areola" :min="0" />

<!-- Nipple -->
<Preference v-model="currentValue.body.nipple" label="Nipple" />
<Preference v-model="currentValue.body.nipple" label="Nipple" :min="0" />

<!-- Vagina -->
<Preference v-model="currentValue.body.vagina" label="Vagina" :max="1.5" />

+ 5
- 1
src/components/UI/BoxItem.vue View File

@@ -150,10 +150,14 @@ export default {
@apply cursor-pointer;

&:hover {
@apply bg-dark-700 text-white;
@apply bg-dark-800 text-white;
}
}

&.box__item--active {
@apply bg-dark-800 text-generic-100;
}

&:not(:last-child) {
@apply border-b border-dark-300;
}

+ 24
- 1
src/components/UI/ProjectUpdate.vue View File

@@ -30,11 +30,16 @@
Cancel
</button>

<button class="button button--info" @click.prevent="$refs.mirrorsDialog.show()">
<button v-tooltip="'Show a list of links to download the update and install it manually.'" class="button button--info" @click.prevent="$refs.mirrorsDialog.show()">
Mirrors
</button>
</div>

<!-- Hint -->
<div class="update__hint">
<p><a href="https://time.dreamnet.tech/docs/guide/updater" target="_blank">More information and troubleshooting</a>.</p>
</div>

<!-- Mirrors Dialog -->
<dialog ref="mirrorsDialog">
<div class="dialog__content">
@@ -141,6 +146,24 @@ export default {
}
}

.update__actions {
@apply mb-6 text-sm;

.button {
&:not(:last-child) {
@apply mr-4;
}
}
}

.update__hint {
@apply text-sm;

a {
@apply text-white underline;
}
}

.mirrors {
@apply list-disc ml-6;


+ 9
- 2
src/electron/src/modules/settings.js View File

@@ -116,7 +116,7 @@ class Settings {
const cores = round(system.cpu?.cores / 2) || 1

this.payload = {
version: 6,
version: 7,
user: uuid(),

wizard: {
@@ -133,6 +133,7 @@ class Settings {
app: {
disableHardwareAcceleration: false,
uploadMode: 'none',
queuePosition: 'right',
},

notifications: {
@@ -218,7 +219,7 @@ class Settings {
},

advanced: {
scaleMode: 'auto-resize',
scaleMode: 'overlay',
transformMode: 'normal',
useColorTransfer: false,
useWaifu: false,
@@ -387,6 +388,12 @@ class Settings {
}
}

// 6 -> 7
if (this.payload?.version === 6 && this._default.version >= 7) {
this.payload.version = 7
this.payload.app.queuePosition = 'right'
}

this.save()
}
}

+ 25
- 9
src/electron/src/modules/tools/power.js View File

@@ -30,10 +30,17 @@ export function exec(args, options = {}) {
options,
})

return spawn('python3', args, {
return spawn('python', args, {
cwd: getPowerPath(),
...options,
})

/*
return spawn('C:\\Users\\koles\\Anaconda3\\envs\\dreampower\\python', args, {
cwd: getPowerPath(),
...options,
})
*/
}

logger.debug('Running:', args)
@@ -129,7 +136,7 @@ export const transform = (run) => {
}

if (transformMode === 'export-maskfin') {
args.push('--export-step', 4, '--export-step-path', run.maskfinFile.path)
args.push('--export-step', 3, '--export-step-path', run.maskfinFile.path)
} else if (transformMode === 'import-maskfin') {
args.push('--steps', '5:5')
}
@@ -138,12 +145,14 @@ export const transform = (run) => {
args.push('--color-transfer')
}

// body preferences
args.push('--bsize', preferences.body.boobs.size)
args.push('--asize', preferences.body.areola.size)
args.push('--nsize', preferences.body.nipple.size)
args.push('--vsize', preferences.body.vagina.size)
args.push('--hsize', preferences.body.pubicHair.size)
if (transformMode !== 'import-maskfin') {
// body preferences
args.push('--bsize', preferences.body.boobs.size)
args.push('--asize', preferences.body.areola.size)
args.push('--nsize', preferences.body.nipple.size)
args.push('--vsize', preferences.body.vagina.size)
args.push('--hsize', preferences.body.pubicHair.size)
}

const events = (new EventBus)

@@ -196,7 +205,8 @@ export const getVersion = () => {

let response = ''

process.on('error', () => {
process.on('error', (error) => {
logger.warn(error)
def.resolve()
})

@@ -204,16 +214,22 @@ export const getVersion = () => {
response += data
})

process.stderr.on('data', (data) => {
response += data
})

process.on('close', () => {
try {
response = semverRegex().exec(response)
response = `v${response[0]}`
def.resolve(response)
} catch (err) {
logger.warn(err)
def.resolve()
}
})
} catch (err) {
logger.warn(err)
def.resolve()
}


+ 16
- 6
src/layouts/default.vue View File

@@ -1,7 +1,10 @@
<template>
<div
class="layout"
:class="{'layout--dragging': isDragging}"
:class="{
'layout--dragging': isDragging,
'layout--left-queue': $settings.app.queuePosition === 'left'
}"
@dragenter="onDragEnter"
@dragover="onDragOver"
@dragleave="onDragLeave"
@@ -42,9 +45,17 @@ export default {
@apply h-full;

display: grid;
grid-template-columns: 200px 1fr 200px;
grid-template-columns: 250px 1fr 250px;
grid-template-rows: 30px 50px 1fr;
grid-template-areas: "topbar topbar topbar" "navbar navbar navbar" "content content jobbar";
grid-template-areas: "topbar topbar topbar" "navbar navbar navbar" "content content queuebar";

&.layout--left-queue {
grid-template-areas: "topbar topbar topbar" "navbar navbar navbar" "queuebar content content";

.layout__jobbar {
@apply border-l-0 border-r;
}
}

&.layout--dragging {
.layout__dropzone {
@@ -61,7 +72,7 @@ export default {
}

.layout__jobbar {
grid-area: jobbar;
grid-area: queuebar;
}

.layout__content {
@@ -74,9 +85,8 @@ export default {
@apply absolute left-0 right-0 top-0 bottom-0 z-50;
@apply hidden opacity-0 pointer-events-none;
@apply bg-dark-900-70 items-center justify-center;
@apply border-8 border-dotted;
backdrop-filter: blur(6px);
transition: opacity .2s ease-in-out;
transition: opacity 0.2s ease-in-out;
will-change: opacity;

h2 {

+ 11
- 4
src/layouts/wizard.vue View File

@@ -5,7 +5,9 @@

<!-- Content -->
<div id="layout-content" class="layout__content">
<nuxt />
<div class="container">
<nuxt />
</div>
</div>
</div>
</template>
@@ -31,9 +33,13 @@ export default {

.layout__content {
@apply relative overflow-hidden overflow-y-auto;
@apply p-6 border-t border-dark-500;
@apply border-t border-dark-500;
grid-area: content;
height: calc(100vh - 30px);

.container {
@apply h-full m-auto;
}
}
}
</style>
@@ -41,8 +47,9 @@ export default {
<style lang="scss">
.layout__header {
@apply flex flex-col justify-center items-center;
@apply text-3xl font-semibold mb-8;
height: 80px;
@apply font-semibold mb-8;
@apply border-b border-dark-500;
height: 90px;

.title {
@apply text-xl text-white;

+ 1
- 1
src/middleware/wizard.js View File

@@ -28,7 +28,7 @@ export default function ({ route, redirect }) {
return
}

if (!requirements.power.installed) {
if (!requirements.power.installed || !requirements.power.compatible) {
if (route.path !== '/wizard/power') {
redirect('/wizard/power')
}

+ 48
- 4
src/modules/config/cli-errors.json View File

@@ -53,7 +53,11 @@
},
{
"query": "cv2.error",
"message": "There was a problem trying to load the photo. Please make sure it is a valid photo and has not been deleted."
"message": "There was a problem trying to load the photo. Please ensure that it is a valid photo, that it has not been deleted or that the Cropper/Overlay are well located."
},
{
"query": "OpenCV",
"message": "There was a problem trying to load the photo. Please ensure that it is a valid photo, that it has not been deleted or that the Cropper/Overlay are well located."
},
{
"query": "is not a valid file or directory or url",
@@ -63,6 +67,10 @@
"query": "file not a supported format",
"message": "There was a problem trying to load the photo. Please make sure it is a valid photo and has not been deleted."
},
{
"query": "invalid extension format",
"message": "There was a problem trying to load the photo. Please make sure it is a valid photo and has not been deleted."
},
{
"query": "not compiled with CUDA",
"message": "You have installed the CPU-only version of DreamPower. Please reinstall DreamPower to get GPU support."
@@ -71,12 +79,48 @@
"query": "float division by zero",
"message": "There was a problem cropping the photo. Please make sure you position the cropper correctly."
},
{
"query": "CUDA error",
"message": "Your GPU has reported a problem. Please make sure you have the latest drivers installed or reinstall it to fix any errors."
},
{
"query": "Python was not found",
"message": "Python is not installed on the system. Please disable the Use Python option if you are not using the algorithm source code."
"message": "There was a problem with DreamPower. Python is not installed on the system. Please disable the Use Python option if you are not using the algorithm source code."
},
{
"query": "CUDA error",
"message": "Your GPU has reported a problem. Please make sure you have the latest drivers installed or reinstall it to fix any errors."
"query": "No module named",
"message": "There was a problem with DreamPower. If you are using the algorithm source code please make sure you have installed the necessary modules, if you are not using the source code please disable the Use Python option or update your operating system."
},
{
"query": "can't open file 'main.py'",
"message": "There was a problem with DreamPower. If you are using the algorithm source code please make sure you have cloned the repository correctly or have configured the correct location, if you are not using the source code please disable the Use Python option."
},
{
"query": "invalid choice",
"message": "There was a problem with DreamPower. The installed version of DreamPower is not compatible with this version of DreamTime, please update the component."
},
{
"query": "unrecognized arguments",
"message": "There was a problem with DreamPower. The installed version of DreamPower is not compatible with this version of DreamTime, please update the component."
},
{
"query": "Checkpoints file not found",
"message": "There was a problem with DreamPower. The checkpoints could not be loaded, if you have changed the location of DreamPower please be sure to restart DreamTime and install the checkpoints."
},
{
"query": "THCudaCheck FAIL",
"message": "There was a problem with CUDA. This version of DreamPower may not be compatible with your operating system and it may be necessary to compile the project in your environment. Please visit our Chat or Forum for technical support."
},
{
"query": "CUDNN_STATUS_ALLOC_FAILED",
"message": "There was a problem with CUDA. Apparently there is another program using your GPU, please close that program and try again."
},
{
"query": "CUDNN_STATUS_INTERNAL_ERROR",
"message": "There was a problem with CUDA. Please make sure you have the latest drivers installed, that you have available memory and if you have installed CUDA or CUDNN that these are updated and configured."
},
{
"query": "library load disallowed by system policy",
"message": "There was a problem with DreamPower. Your operating system is configured to prevent the loading of applications that have not been verified by Apple. Please <a href='https://support.apple.com/en-us/HT202491' target='_blank'>click here</a> for information on how to solve this problem."
}
]

+ 24
- 0
src/modules/dream.js View File

@@ -7,6 +7,9 @@
//
// Written by Ivan Bravo Bravo <ivan@dreamnet.tech>, 2020.

const { getAppPath, getPowerPath, getPath } = $provider.paths
const { shell } = $provider.api

/**
* $dream.
* Application information.
@@ -27,4 +30,25 @@ export default {
* @type {string}
*/
version: `v${process.env.npm_package_version}`,

/**
*
*/
openAppFolder() {
shell.openItem(getAppPath())
},

/**
*
*/
openAppDataFolder() {
shell.openItem(getPath('userData'))
},

/**
*
*/
openPowerFolder() {
shell.openItem(getPowerPath())
},
}

+ 32
- 1
src/modules/file.js View File

@@ -1,4 +1,4 @@
import { isString, attempt } from 'lodash'
import { isString, attempt, isNil } from 'lodash'
import path from 'path'
import slash from 'slash'
import { Consola } from './consola'
@@ -6,6 +6,7 @@ import { getMetadata } from '~/workers/fs'

const consola = Consola.create('file')
const { fs } = $provider
const { dialog } = $provider.api
const { getPath } = $provider.paths

/**
@@ -185,8 +186,38 @@ export class File {
* @param {string} destination
*/
copy(destination) {
if (!fs.existsSync(this.path)) {
return this
}

fs.copySync(this.path, destination)
consola.debug(`File copied: ${this.path} -> ${destination}`)
return this
}

/**
*
*/
save(defaultPath) {
if (!fs.existsSync(this.path)) {
throw new Warning('The photo no longer exists.', 'Could not save the photo because it has been deleted, this could be caused due to cleaning or antivirus programs.')
}

const savePath = dialog.showSaveDialogSync({
defaultPath,
filters: [
{ name: 'PNG', extensions: ['png'] },
{ name: 'JPG', extensions: ['jpg'] },
{ name: 'GIF', extensions: ['gif'] },
],
})

if (isNil(savePath)) {
return this
}

this.copy(savePath)

return this
}
}

+ 1
- 1
src/modules/nudify/photo-run.js View File

@@ -91,7 +91,7 @@ export class PhotoRun {
}

get outputName() {
const now = Date.now()
const now = Date.now() + random(1, 100)
const { file } = this.photo

const originalName = trim(kebabCase(truncate(deburr(file.name), { length: 20, omission: '' })))

+ 3
- 3
src/modules/system/requirements.js View File

@@ -79,10 +79,10 @@ export const requirements = {

try {
version = await getVersion()
const currentVersion = process.env.npm_package_version
const currentVersion = `v${process.env.npm_package_version}`

const minimum = nucleus.v1?.projects?.dreamtime?.releases[`v${currentVersion}`]?.dreampower?.minimum || 'v0.0.1'
const maximum = nucleus.v1?.projects?.dreamtime?.releases[`v${currentVersion}`]?.dreampower?.maximum
const minimum = nucleus.v1?.projects?.dreamtime?.releases[currentVersion]?.dreampower?.minimum || 'v0.0.1'
const maximum = nucleus.v1?.projects?.dreamtime?.releases[currentVersion]?.dreampower?.maximum

if (compareVersions.compare(version, minimum, '<')) {
return false

+ 75
- 11
src/modules/tutorial.js View File

@@ -25,26 +25,21 @@ export const tutorial = {
overlayOpacity: 0.7,
steps: [
{
intro: 'Welcome to DreamTime! Let me give you some information so you don\'t get lost. Let\'s start with the Nudification process.',
intro: 'Welcome to DreamTime! Let me give you some information so you don\'t get lost. Let\'s start with the upload process. DreamTime has different ways in which you can upload the photo you want to nudify.',
},

{
intro: 'DreamTime has different ways in which you can upload the photo you want to nudify.',
intro: 'The easiest one is to drag and drop your photos into the application, no matter what section you are in! You can drag entire folders, photos from the web browser or even web addresses.',
},

{
element: '#uploader',
intro: 'The easiest one is to drag and drop your photos into the application, no matter what section you are in! Just drag and drop, it\'s that easy. You can drag entire folders, photos from the web browser or even web addresses.',
},

{
element: '#uploader-alternatives',
intro: 'On this page there are alternative ways, you can upload photos even from the Internet or Instagram.',
element: '#uploader-methods',
intro: 'On this section there are alternative upload methods, you can upload photos even from the Internet or Instagram.',
},

{
element: '#uploader-settings',
intro: 'What happens when uploading a photo is controlled by this option, initially it is set that the photos are placed in the Pending Queue. Speaking of the queue...',
intro: 'What happens when uploading a photo is controlled by this option, initially it is set that the photos are placed in the pending queue. Speaking of the queue...',
},

{
@@ -98,7 +93,7 @@ export const tutorial = {
overlayOpacity: 0.7,
steps: [
{
intro: 'You have unlocked the BadTime easter-egg! Use the arrows on your keyboard to play while your photos are nudified in the background. Try to survive as long as possible! 💀🎮',
intro: 'You have unlocked the BadTime mini-game! Use the arrows on your keyboard to play while your photos are nudified in the background. Try to survive as long as possible! 🎮💀',
},
],
})
@@ -150,4 +145,73 @@ export const tutorial = {

localStorage.setItem('tutorial.preferences', 'true')
},

editor() {
const seen = localStorage.getItem('tutorial.editor')

if (!isNil(seen)) {
return
}

const intro = introJs()

intro.setOptions({
showBullets: false,
overlayOpacity: 0.7,
steps: [
{
intro: 'Welcome to the photo editor, here you can make some improvements and corrections to the photo before nudifying it. Keep in mind that the editor is very basic and is only recommended for small improvements.',
},

{
intro: 'If you are looking for the Crop tool it is in a different area that will be visible when setting the Scale method option to Manual Crop or Overlay.',
},

{
intro: 'And although the editor has a tool called "Mask", don\'t get confused, this is not the custom mask for the algorithm. To use a custom mask you must set the transformation method to Nudify & Maskfin or Nudify with Maskfin, these options require more user experience.',
},
],
})

intro.start()

localStorage.setItem('tutorial.editor', 'true')
},

cropper() {
const seen = localStorage.getItem('tutorial.cropper')

if (!isNil(seen)) {
return
}

const intro = introJs()

intro.setOptions({
steps: [
{
intro: 'Welcome to the photo cropper, this tool will allow you to crop the photo for best results.',
},

{
element: '#cropper-reload',
intro: 'This button will allow you to reload the photo to get the latest changes from the editor, restart the cropper or troubleshoot when the cropper behaves strangely.',
},

{
element: '#cropper-about',
intro: 'Here you can get more information about what the cropper of the selected scale method does.',
},

{
element: '#cropper-help',
intro: 'And here you can see the controls to use the cropper.',
},
],
})

intro.start()

localStorage.setItem('tutorial.cropper', 'true')
},
}

+ 2
- 3
src/modules/updater/base.js View File

@@ -231,11 +231,10 @@ export class BaseUpdater {
dialog.showMessageBoxSync({
type: 'error',
title: 'Connect to Internet.',
message: 'There was a problem getting information on some components needed to download. Please make sure you are connected to the Internet just for this time. DreamTime will restart...',
message: 'There was a problem getting the latest version of the components needed to use DreamTime. Please make sure you are connected to the Internet just for this time and try again.',
})

// Restart.
app.relaunch()
// Close.
app.quit()
}
}

+ 49
- 49
src/package.json View File

@@ -4,7 +4,7 @@
"description": "An open-source and super-improved version of DeepNude.",
"author": "DreamNet",
"homepage": "https://time.dreamnet.tech",
"version": "1.4.1",
"version": "1.4.2",
"main": "electron/dist/index.js",
"license": "GPL-3.0-only",
"private": true,
@@ -54,13 +54,13 @@
"7zip-bin": "^5.0.3",
"@dreamnet/logplease": "^1.0.0",
"@dreamnet/queue": "^0.1.2",
"@fortawesome/fontawesome-svg-core": "^1.2.25",
"@fortawesome/free-brands-svg-icons": "^5.11.2",
"@fortawesome/free-regular-svg-icons": "^5.11.2",
"@fortawesome/free-solid-svg-icons": "^5.11.2",
"@fortawesome/vue-fontawesome": "^0.1.8",
"@fortawesome/fontawesome-svg-core": "^1.2.26",
"@fortawesome/free-brands-svg-icons": "^5.12.0",
"@fortawesome/free-regular-svg-icons": "^5.12.0",
"@fortawesome/free-solid-svg-icons": "^5.12.0",
"@fortawesome/vue-fontawesome": "^0.1.9",
"@sweetalert2/theme-dark": "^3.1.0",
"axios": "^0.19.0",
"axios": "^0.19.2",
"better-queue-memory": "^1.0.4",
"caller-callsite": "^4.1.0",
"combokeys": "^3.0.1",
@@ -70,8 +70,8 @@
"dayjs": "^1.8.18",
"deferred": "^0.7.11",
"delay": "^4.3.0",
"electron-context-menu": "^0.15.1",
"electron-util": "^0.13.0",
"electron-context-menu": "^0.15.2",
"electron-util": "^0.13.1",
"fabric": "^3.6.0",
"filesize": "^6.0.1",
"form-data": "^3.0.0",
@@ -80,78 +80,78 @@
"image-js": "^0.21.8",
"instagram-save": "^1.3.2",
"intro.js": "^2.9.3",
"is-online": "^8.2.0",
"is-online": "^8.2.1",
"js-event-bus": "^1.0.0",
"lodash": "^4.17.15",
"logrocket": "^1.0.5",
"logrocket": "^1.0.6",
"md5-file": "^4.0.0",
"melanke-watchjs": "^1.5.0",
"mime-types": "^2.1.25",
"node-7z": "^2.0.3",
"nucleus-nodejs": "^3.0.1",
"nuxt": "^2.10.2",
"mime-types": "^2.1.26",
"node-7z": "^2.0.5",
"nucleus-nodejs": "^3.0.3",
"nuxt": "^2.11.0",
"patch-package": "^6.2.0",
"popmotion": "^8.7.1",
"postinstall-postinstall": "^2.0.0",
"promise-worker": "^2.0.1",
"regedit": "^3.0.3",
"rollbar": "^2.14.4",
"semver-regex": "^3.1.0",
"semver-regex": "^3.1.1",
"slash": "^3.0.0",
"sweetalert2": "^9.4.0",
"systeminformation": "^4.15.3",
"tippy.js": "^5.1.1",
"tui-image-editor": "^3.7.1",
"unzipper": "^0.10.5",
"uuid": "^3.3.3",
"sweetalert2": "^9.7.1",
"systeminformation": "^4.21.0",
"tippy.js": "^5.1.4",
"tui-image-editor": "^3.7.3",
"unzipper": "^0.10.7",
"uuid": "^3.4.0",
"vue-slider-component": "^3.1.0"
},
"devDependencies": {
"@babel/cli": "^7.7.0",
"@babel/core": "^7.7.2",
"@babel/plugin-proposal-class-properties": "^7.7.0",
"@babel/plugin-proposal-export-default-from": "^7.5.2",
"@babel/plugin-proposal-optional-chaining": "^7.6.0",
"@nuxtjs/eslint-config": "^1.1.2",
"@babel/cli": "^7.8.3",
"@babel/core": "^7.8.3",
"@babel/plugin-proposal-class-properties": "^7.8.3",
"@babel/plugin-proposal-export-default-from": "^7.8.3",
"@babel/plugin-proposal-optional-chaining": "^7.8.3",
"@nuxtjs/eslint-config": "^2.0.0",
"@nuxtjs/eslint-module": "^1.1.0",
"@nuxtjs/tailwindcss": "^1.2.0",
"@octokit/rest": "^16.35.0",
"@nuxtjs/tailwindcss": "^1.3.1",
"@octokit/rest": "^16.40.1",
"babel-eslint": "^10.0.3",
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-module-resolver": "^3.2.0",
"babel-plugin-module-resolver": "^4.0.0",
"babel-plugin-transform-inline-environment-variables": "^0.4.3",
"babel-watch": "^7.0.0",
"cross-env": "^6.0.3",
"electron": "^7.1.1",
"electron-builder": "^22.1.0",
"cross-env": "^7.0.0",
"electron": "^7.1.10",
"electron-builder": "^22.3.2",
"electron-devtools-installer": "^2.2.4",
"env-cmd": "^10.0.1",
"eslint": "^6.6.0",
"eslint": "^6.8.0",
"eslint-config-airbnb-base": "^14.0.0",
"eslint-config-standard": ">=14.1.0",
"eslint-import-resolver-node": "^0.3.2",
"eslint-import-resolver-node": "^0.3.3",
"eslint-import-resolver-nuxt": "^0.1.5",
"eslint-import-resolver-webpack": "^0.11.1",
"eslint-plugin-import": ">=2.18.2",
"eslint-plugin-jest": ">=23.0.4",
"eslint-import-resolver-webpack": "^0.12.1",
"eslint-plugin-import": ">=2.20.0",
"eslint-plugin-jest": ">=23.6.0",
"eslint-plugin-lodash": "^6.0.0",
"eslint-plugin-mocha": "^6.2.2",
"eslint-plugin-node": ">=10.0.0",
"eslint-plugin-node": ">=11.0.0",
"eslint-plugin-nuxt": ">=0.5.0",
"eslint-plugin-promise": ">=4.2.1",
"eslint-plugin-standard": ">=4.0.1",
"eslint-plugin-vue": "^6.0.1",
"eslint-plugin-vue": "^6.1.2",
"fibers": "^4.0.2",
"flow-bin": "^0.115.0",
"husky": "^3.0.9",
"lint-staged": "^9.4.3",
"mocha": "^6.2.2",
"flow-bin": "^0.117.0",
"husky": "^4.2.1",
"lint-staged": "^10.0.4",
"mocha": "^7.0.1",
"modclean": "^3.0.0-beta.1",
"ngrok": "^3.2.7",
"sass": "^1.23.7",
"sass-loader": "^8.0.0",
"spectron": "^9.0.0",
"tailwindcss": "^1.1.3",
"sass": "^1.25.0",
"sass-loader": "^8.0.2",
"spectron": "^10.0.0",
"tailwindcss": "^1.1.4",
"tailwindcss-alpha": "hacknug/tailwindcss-alpha#feature/tests",
"worker-loader": "^2.0.0"
}

+ 1
- 1
src/package.min.json View File

@@ -4,7 +4,7 @@
"description": "An open-source and super-improved version of DeepNude.",
"author": "DreamNet",
"homepage": "https://time.dreamnet.tech",
"version": "1.3.3",
"version": "1.4.2",
"main": "electron/dist/index.js",
"license": "GPL-3.0-only",
"private": true

+ 10
- 3
src/pages/nudify/_id/crop.vue View File

@@ -5,12 +5,16 @@
</div>

<div class="cropper__help">
<button v-tooltip="'Get recent changes from the editor.'" class="button" @click.prevent="reload">
<button
id="cropper-reload"
v-tooltip="'Get recent changes from the editor.'"
class="button"
@click.prevent="reload">
<span class="icon"><font-awesome-icon icon="sync" /></span>
<span>Reload</span>
</button>

<section class="box">
<section id="cropper-about" class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="crop" /> Manual crop.
@@ -24,7 +28,7 @@
</div>
</section>

<section class="box">
<section id="cropper-help" class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="mouse-pointer" /> Commands
@@ -68,6 +72,8 @@
</template>

<script>
import { tutorial } from '~/modules'

export default {
computed: {
photo() {
@@ -81,6 +87,7 @@ export default {

mounted() {
this.create()
tutorial.cropper()
},

methods: {

+ 2
- 1
src/pages/nudify/_id/editor.vue View File

@@ -5,7 +5,7 @@
</template>

<script>
import { tutorial } from '~/modules'

export default {
computed: {
@@ -16,6 +16,7 @@ export default {

mounted() {
this.create()
tutorial.editor()
},

methods: {

+ 4
- 16
src/pages/nudify/_id/overlay.vue View File

@@ -5,12 +5,12 @@
</div>

<div class="cropper__help">
<button v-tooltip="'Get recent changes from the editor.'" class="button" @click.prevent="reload">
<button id="cropper-reload" v-tooltip="'Get recent changes from the editor.'" class="button" @click.prevent="reload">
<span class="icon"><font-awesome-icon icon="sync" /></span>
<span>Reload</span>
</button>

<section class="box">
<section id="cropper-about" class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="magic" /> Overlay.
@@ -28,20 +28,6 @@
</div>
</section>

<section class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="mouse-pointer" /> Commands
</h2>
</div>

<div class="box__content">
<p>
- Increase or decrease the zoom with the mouse wheel.
</p>
</div>
</section>

<section class="box">
<div class="box__header">
<h2 class="title">
@@ -87,6 +73,7 @@

<script>
import { round } from 'lodash'
import { tutorial } from '~/modules'

export default {
data: () => ({
@@ -101,6 +88,7 @@ export default {

mounted() {
this.create()
tutorial.cropper()
},

methods: {

+ 2
- 0
src/pages/nudify/_id/results.vue View File

@@ -116,9 +116,11 @@ export default {
@apply mb-2;
width: calc(1/2*100% - (1 - 1/2)*1rem);

/*
@screen xl {
width: calc(1/3*100% - (1 - 1/3)*1rem);
}
*/

@media (min-height: 1280px) {
height: 1024px;

+ 13
- 0
src/pages/settings/app.vue View File

@@ -30,6 +30,19 @@
</option>
</select>
</box-item>

<box-item
label="Queue position."
description="Change the position of the queue bar to the place that is most comfortable for you.">
<select v-model="currentValue.app.queuePosition" class="input">
<option value="right">
Right
</option>
<option value="left">
Left
</option>
</select>
</box-item>
</div>
</section>
</div>

+ 8
- 3
src/pages/wizard/checkpoints.vue View File

@@ -24,10 +24,8 @@
</div>

<div class="project__description">
<p>Now you need the {{ checkpoints.title }}, the data models required by the algorithm to carry out the nudification process.</p>
<p>Now you need the data models required by the algorithm to carry out the nudification process.</p>
<p>Approximately <strong>2 GB</strong> will be downloaded.</p>
<p>If the download fails please click on the "Mirrors" button to see a list of links where you can download it manually.</p>
<p>All downloads are saved in the <strong>Downloads</strong> folder of your operating system.</p>
</div>
</div>

@@ -35,6 +33,13 @@
<div class="project__update">
<ProjectUpdate project="checkpoints" />
</div>

<div class="project__settings text-center">
<button class="button" @click="$dream.openPowerFolder()">
<span class="icon"><font-awesome-icon icon="folder-open" /></span>
<span>DreamPower</span>
</button>
</div>
</div>
</div>
</template>

+ 13
- 3
src/pages/wizard/power.vue View File

@@ -30,8 +30,10 @@
<div class="project__description">
<p>To make your dreams come true it is necessary to install {{ power.title }}, the algorithm that will handle the entire nudification process.</p>
<p>Approximately <strong>1 GB</strong> will be downloaded. (Depending on your system)</p>
<p>If the download fails please click on the "Mirrors" button to see a list of links where you can download it manually.</p>
<p>All downloads are saved in the <strong>Downloads</strong> folder of your operating system.</p>

<p v-if="requirements.power.installed && !requirements.power.compatible" class="text-danger">
The installed version of {{ power.title }} is not compatible with this version of {{ $dream.name }}. Please update.
</p>
</div>
</div>

@@ -94,6 +96,13 @@
</box-item>
</div>
</div>

<div class="text-center">
<button class="button" @click="$dream.openAppDataFolder()">
<span class="icon"><font-awesome-icon icon="folder-open" /></span>
<span>AppData</span>
</button>
</div>
</div>
</div>
</div>
@@ -112,13 +121,14 @@ export default {
layout: 'wizard',

middleware({ redirect }) {
if (requirements.power.installed && !dreampower.available) {
if (requirements.power.installed && requirements.power.compatible && !dreampower.available) {
redirect('/wizard/checkpoints')
}
},

data: () => ({
settings: {},
requirements,
}),

computed: {

+ 1
- 1
src/pages/wizard/tos.vue View File

@@ -6,7 +6,7 @@
</h1>

<h2 class="subtitle">
Important things
Important information.
</h2>
</div>


+ 0
- 37
src/patches/tui-image-editor+3.7.1.patch View File

@@ -1,37 +0,0 @@
diff --git a/node_modules/tui-image-editor/dist/tui-image-editor.js b/node_modules/tui-image-editor/dist/tui-image-editor.js
index 81802aa..c7c95b0 100644
--- a/node_modules/tui-image-editor/dist/tui-image-editor.js
+++ b/node_modules/tui-image-editor/dist/tui-image-editor.js
@@ -8383,7 +8383,7 @@ return /******/ (function(modules) { // webpackBootstrap
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
- var DRAW_OPACITY = 0.7;
+ var DRAW_OPACITY = 1.0;
/**
* Draw ui class
diff --git a/node_modules/tui-image-editor/src/js/ui/draw.js b/node_modules/tui-image-editor/src/js/ui/draw.js
index 2a42926..7add9c7 100644
--- a/node_modules/tui-image-editor/src/js/ui/draw.js
+++ b/node_modules/tui-image-editor/src/js/ui/draw.js
@@ -3,8 +3,8 @@ import Colorpicker from './tools/colorpicker';
import Range from './tools/range';
import Submenu from './submenuBase';
import templateHtml from './template/submenu/draw';
-import {defaultDrawRangeValus} from '../consts';
-const DRAW_OPACITY = 0.7;
+import { defaultDrawRangeValus } from '../consts';
+const DRAW_OPACITY = 1.0;
/**
* Draw ui class
@@ -12,7 +12,7 @@ const DRAW_OPACITY = 0.7;
* @ignore
*/
class Draw extends Submenu {
- constructor(subMenuElement, {locale, iconStyle, menuBarPosition, usageStatistics}) {
+ constructor(subMenuElement, { locale, iconStyle, menuBarPosition, usageStatistics }) {
super(subMenuElement, {
locale,
name: 'draw',

+ 22
- 0
src/patches/tui-image-editor+3.7.3.patch
File diff suppressed because it is too large
View File


+ 0
- 1
src/tailwind.config.js View File

@@ -181,7 +181,6 @@ module.exports = {
},
variants: {},
plugins: [
// eslint-disable-next-line global-require
require('tailwindcss-alpha')({
modules: {
borderColor: {

Loading…
Cancel
Save