@danhachuel/pandanews 0.2.2 → 0.3.1
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/CHANGELOG.md +16 -0
- package/README.md +5 -4
- package/backend/app/main.py +21 -6
- package/backend/app/routers/automacao.py +47 -0
- package/backend/app/routers/blogs.py +10 -0
- package/backend/app/routers/configuracoes.py +12 -0
- package/backend/app/routers/imagens.py +49 -0
- package/backend/app/routers/legal.py +35 -0
- package/backend/app/routers/noticias.py +46 -0
- package/backend/core/config.py +4 -0
- package/backend/core/database.py +31 -0
- package/backend/core/image_gen.py +82 -4
- package/backend/core/pipeline.py +212 -4
- package/backend/core/scheduler.py +80 -0
- package/frontend/dist/assets/index-BcgBzdzo.js +70 -0
- package/frontend/dist/assets/index-gsZzhCX8.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/legal/index.html +218 -0
- package/legal/privacy.html +207 -0
- package/legal/terms.html +185 -0
- package/package.json +2 -1
- package/scripts/start.js +1 -1
- package/frontend/dist/assets/index-BaPdaYIz.css +0 -1
- package/frontend/dist/assets/index-D0e-vr7T.js +0 -70
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.left-1{left:.25rem}.left-11{left:2.75rem}.left-9{left:2.25rem}.top-1{top:.25rem}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-40{height:10rem}.h-44{height:11rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-auto{height:auto}.h-full{height:100%}.max-h-48{max-height:12rem}.max-h-56{max-height:14rem}.max-h-\[90vh\]{max-height:90vh}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-40{width:10rem}.w-44{width:11rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-amber-400\/40{border-color:#fbbf2466}.border-panda\/40{border-color:#22c55e66}.border-red-400\/40{border-color:#f8717166}.border-slate-100{--tw-border-opacity: 1;border-color:rgb(241 245 249 / var(--tw-border-opacity, 1))}.border-slate-200{--tw-border-opacity: 1;border-color:rgb(226 232 240 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-black\/60{background-color:#0009}.bg-emerald-100{--tw-bg-opacity: 1;background-color:rgb(209 250 229 / var(--tw-bg-opacity, 1))}.bg-panda{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-panda\/10{background-color:#22c55e1a}.bg-panda\/15{background-color:#22c55e26}.bg-panda\/30{background-color:#22c55e4d}.bg-panda\/70{background-color:#22c55eb3}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-slate-300{--tw-bg-opacity: 1;background-color:rgb(203 213 225 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.object-cover{-o-object-fit:cover;object-fit:cover}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.pb-2{padding-bottom:.5rem}.pr-4{padding-right:1rem}.pt-2{padding-top:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-panda{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-panda-dark{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.placeholder-slate-400::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(148 163 184 / var(--tw-placeholder-opacity, 1))}.placeholder-slate-400::placeholder{--tw-placeholder-opacity: 1;color:rgb(148 163 184 / var(--tw-placeholder-opacity, 1))}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}body{--tw-bg-opacity: 1;background-color:rgb(11 18 32 / var(--tw-bg-opacity, 1));font-family:Inter,system-ui,sans-serif;--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html:not(.dark) body{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.last\:border-0:last-child{border-width:0px}.hover\:border-slate-400:hover{--tw-border-opacity: 1;border-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.hover\:bg-panda-dark:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-100:hover{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.hover\:text-slate-800:hover{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-panda:focus{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.dark\:border-slate-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.dark\:border-slate-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.dark\:bg-amber-500\/15:is(.dark *){background-color:#f59e0b26}.dark\:bg-card:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(16 26 44 / var(--tw-bg-opacity, 1))}.dark\:bg-emerald-500\/15:is(.dark *){background-color:#10b98126}.dark\:bg-night:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(11 18 32 / var(--tw-bg-opacity, 1))}.dark\:bg-red-500\/15:is(.dark *){background-color:#ef444426}.dark\:bg-sky-500\/15:is(.dark *){background-color:#0ea5e926}.dark\:bg-slate-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.dark\:bg-slate-700\/60:is(.dark *){background-color:#33415599}.dark\:bg-slate-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-emerald-400:is(.dark *){--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-panda:is(.dark *){--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-sky-400:is(.dark *){--tw-text-opacity: 1;color:rgb(56 189 248 / var(--tw-text-opacity, 1))}.dark\:text-slate-200:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.dark\:text-slate-300:is(.dark *){--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.dark\:text-slate-400:is(.dark *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.dark\:text-slate-500:is(.dark *){--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.dark\:text-slate-600:is(.dark *){--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.dark\:placeholder-slate-500:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.dark\:placeholder-slate-500:is(.dark *)::placeholder{--tw-placeholder-opacity: 1;color:rgb(100 116 139 / var(--tw-placeholder-opacity, 1))}.dark\:hover\:border-slate-500:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity, 1))}.dark\:hover\:bg-slate-800\/60:hover:is(.dark *){background-color:#1e293b99}.dark\:hover\:text-slate-200:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 768px){.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
package/frontend/dist/index.html
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
9
9
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
10
10
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-BcgBzdzo.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-gsZzhCX8.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
package/legal/index.html
ADDED
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="pt-BR">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>PandaNews - Geração e Automação de Blogs de Notícias com IA</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body {
|
|
10
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
11
|
+
background: linear-gradient(135deg, #0b1220 0%, #14532d 100%);
|
|
12
|
+
min-height: 100vh;
|
|
13
|
+
padding: 40px 20px;
|
|
14
|
+
}
|
|
15
|
+
.container { max-width: 800px; margin: 0 auto; }
|
|
16
|
+
.card {
|
|
17
|
+
background: #ffffff;
|
|
18
|
+
border-radius: 20px;
|
|
19
|
+
padding: 40px;
|
|
20
|
+
margin-bottom: 30px;
|
|
21
|
+
box-shadow: 0 20px 40px rgba(0,0,0,0.25);
|
|
22
|
+
}
|
|
23
|
+
.badge {
|
|
24
|
+
background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
|
|
25
|
+
color: #052e16;
|
|
26
|
+
padding: 8px 16px;
|
|
27
|
+
border-radius: 50px;
|
|
28
|
+
display: inline-block;
|
|
29
|
+
font-size: 0.9em;
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
margin-bottom: 20px;
|
|
32
|
+
}
|
|
33
|
+
h1 { color: #0b1220; font-size: 2.4em; margin-bottom: 10px; }
|
|
34
|
+
h2 { color: #14532d; margin: 25px 0 15px 0; font-size: 1.6em; }
|
|
35
|
+
p { color: #475569; line-height: 1.6; margin: 10px 0; }
|
|
36
|
+
.feature-grid {
|
|
37
|
+
display: grid;
|
|
38
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
39
|
+
gap: 20px;
|
|
40
|
+
margin: 25px 0;
|
|
41
|
+
}
|
|
42
|
+
.feature-item {
|
|
43
|
+
background: #f8faf9;
|
|
44
|
+
padding: 20px;
|
|
45
|
+
border-radius: 15px;
|
|
46
|
+
border-left: 4px solid #22c55e;
|
|
47
|
+
transition: transform 0.2s;
|
|
48
|
+
}
|
|
49
|
+
.feature-item:hover { transform: translateY(-4px); }
|
|
50
|
+
.feature-item h3 { margin-bottom: 10px; font-size: 1.15em; color: #0b1220; }
|
|
51
|
+
.feature-item p { color: #64748b; line-height: 1.5; margin: 6px 0; }
|
|
52
|
+
.api-grid {
|
|
53
|
+
display: grid;
|
|
54
|
+
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
55
|
+
gap: 20px;
|
|
56
|
+
margin: 25px 0;
|
|
57
|
+
}
|
|
58
|
+
.api-item {
|
|
59
|
+
background: #f8faf9;
|
|
60
|
+
padding: 20px;
|
|
61
|
+
border-radius: 15px;
|
|
62
|
+
border-left: 4px solid;
|
|
63
|
+
}
|
|
64
|
+
.api-nvidia { border-left-color: #76b900; }
|
|
65
|
+
.api-gemini { border-left-color: #4285f4; }
|
|
66
|
+
.api-supabase { border-left-color: #3ecf8e; }
|
|
67
|
+
.api-item h3 { margin-bottom: 8px; font-size: 1.1em; color: #0b1220; }
|
|
68
|
+
.api-item p { color: #64748b; font-size: 0.92em; line-height: 1.5; margin: 6px 0; }
|
|
69
|
+
code {
|
|
70
|
+
background: #e8f0ea;
|
|
71
|
+
color: #14532d;
|
|
72
|
+
padding: 2px 6px;
|
|
73
|
+
border-radius: 4px;
|
|
74
|
+
font-size: 0.85em;
|
|
75
|
+
}
|
|
76
|
+
.links {
|
|
77
|
+
margin: 30px 0 20px 0;
|
|
78
|
+
padding: 22px;
|
|
79
|
+
background: #ecfdf5;
|
|
80
|
+
border-radius: 15px;
|
|
81
|
+
text-align: center;
|
|
82
|
+
}
|
|
83
|
+
.links a {
|
|
84
|
+
display: inline-block;
|
|
85
|
+
min-height: 44px;
|
|
86
|
+
line-height: 44px;
|
|
87
|
+
padding: 0 14px;
|
|
88
|
+
color: #15803d;
|
|
89
|
+
text-decoration: none;
|
|
90
|
+
margin: 4px 8px;
|
|
91
|
+
font-weight: 600;
|
|
92
|
+
border-radius: 10px;
|
|
93
|
+
}
|
|
94
|
+
.links a:hover { background: #d1fae5; }
|
|
95
|
+
footer { text-align: center; color: rgba(255,255,255,0.85); margin-top: 30px; line-height: 1.6; }
|
|
96
|
+
.contact {
|
|
97
|
+
background: #fff8e6;
|
|
98
|
+
padding: 18px;
|
|
99
|
+
border-radius: 10px;
|
|
100
|
+
margin-top: 20px;
|
|
101
|
+
line-height: 1.7;
|
|
102
|
+
}
|
|
103
|
+
.contact a { color: #15803d; }
|
|
104
|
+
.pipeline {
|
|
105
|
+
background: #0b1220;
|
|
106
|
+
color: #e2e8f0;
|
|
107
|
+
padding: 18px 20px;
|
|
108
|
+
border-radius: 15px;
|
|
109
|
+
font-size: 0.95em;
|
|
110
|
+
line-height: 1.8;
|
|
111
|
+
}
|
|
112
|
+
.pipeline strong { color: #22c55e; }
|
|
113
|
+
@media (max-width: 600px) {
|
|
114
|
+
.card { padding: 25px; }
|
|
115
|
+
h1 { font-size: 1.7em; }
|
|
116
|
+
h2 { font-size: 1.35em; }
|
|
117
|
+
}
|
|
118
|
+
</style>
|
|
119
|
+
</head>
|
|
120
|
+
<body>
|
|
121
|
+
<div class="container">
|
|
122
|
+
<div class="card">
|
|
123
|
+
<div class="badge">🐻 Automação Editorial com IA</div>
|
|
124
|
+
<h1>PandaNews</h1>
|
|
125
|
+
<p style="font-size: 1.15em; color: #334155; margin-bottom: 15px;">
|
|
126
|
+
Geração e automação de blogs de notícias com Inteligência Artificial — SaaS local para criação e operação de múltiplos blogs segmentados por tema e região.
|
|
127
|
+
</p>
|
|
128
|
+
<p>
|
|
129
|
+
O PandaNews é uma ferramenta <strong>local</strong> (executada na máquina do usuário via <code>npx</code>) de automação editorial:
|
|
130
|
+
coleta pautas em feeds RSS configurados pelo usuário, redige notícias com modelos de linguagem de IA (LLMs)
|
|
131
|
+
e produz imagens ilustrativas, organizando tudo em múltiplos blogs com revisão humana e agendamento automático.
|
|
132
|
+
</p>
|
|
133
|
+
|
|
134
|
+
<h2>⚙️ Funcionalidades</h2>
|
|
135
|
+
<div class="feature-grid">
|
|
136
|
+
<div class="feature-item">
|
|
137
|
+
<h3>📰 Múltiplos blogs por tema e região</h3>
|
|
138
|
+
<p>Gestão de blogs segmentados por tema — esporte, política, economia, tecnologia, geral — e por recorte regional (Brasil, Espanha, São Paulo, Rio de Janeiro etc.), cada um com fontes e estilo editorial próprios.</p>
|
|
139
|
+
</div>
|
|
140
|
+
<div class="feature-item">
|
|
141
|
+
<h3>📡 Coleta via feeds RSS</h3>
|
|
142
|
+
<p>Pautas coletadas automaticamente das fontes RSS configuradas pelo usuário, com filtragem por relevância (tema e região) e deduplicação de itens.</p>
|
|
143
|
+
</div>
|
|
144
|
+
<div class="feature-item">
|
|
145
|
+
<h3>🤖 Redação com LLM multi-provedor</h3>
|
|
146
|
+
<p>Geração de notícias (título, resumo e corpo) com fallback por prioridade: <strong>NVIDIA NIM → Google Gemini</strong>. O provedor que responde é registrado em cada notícia.</p>
|
|
147
|
+
</div>
|
|
148
|
+
<div class="feature-item">
|
|
149
|
+
<h3>🎨 Imagens com IA</h3>
|
|
150
|
+
<p>Imagens ilustrativas em estilo fotojornalístico geradas pela API do Google Gemini Image a partir de palavras-chave da notícia, com geração manual por prompt livre.</p>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="feature-item">
|
|
153
|
+
<h3>👁️ Revisão humana</h3>
|
|
154
|
+
<p>Fluxo editorial completo: rascunho → aprovado → publicado. Toda notícia nasce em rascunho para revisão, edição manual ou regeneração antes da aprovação.</p>
|
|
155
|
+
</div>
|
|
156
|
+
<div class="feature-item">
|
|
157
|
+
<h3>⏱️ Agendamento automático</h3>
|
|
158
|
+
<p>Agendador com frequência configurável por blog, toggle global e execução imediata — com logs de execução por etapa (coleta, redação, imagem).</p>
|
|
159
|
+
</div>
|
|
160
|
+
<div class="feature-item">
|
|
161
|
+
<h3>💾 Armazenamento local</h3>
|
|
162
|
+
<p>Por padrão, 100% local em SQLite (<code>data/pandanews.db</code>), com opção de migração para Supabase quando o usuário fornecer credenciais.</p>
|
|
163
|
+
</div>
|
|
164
|
+
<div class="feature-item">
|
|
165
|
+
<h3>📊 Dashboard com métricas</h3>
|
|
166
|
+
<p>Métricas de geração (últimos 7 dias), notícias pendentes de revisão, status do agendador, checklist de onboarding e últimos erros registrados.</p>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
<h2>🔌 Como funciona</h2>
|
|
171
|
+
<div class="pipeline">
|
|
172
|
+
<strong>Pipeline de geração:</strong> coleta RSS → filtragem por relevância → redação via LLM
|
|
173
|
+
(NVIDIA NIM → Google Gemini) → imagem via Gemini Image → <strong>rascunho</strong> → revisão humana → aprovado/publicado.
|
|
174
|
+
<br>
|
|
175
|
+
O agendador repete o ciclo para cada blog ativo conforme sua frequência configurada.
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<h2>🧩 Provedores de API utilizados</h2>
|
|
179
|
+
<div class="api-grid">
|
|
180
|
+
<div class="api-item api-nvidia">
|
|
181
|
+
<h3>🟩 NVIDIA NIM</h3>
|
|
182
|
+
<p><strong>API:</strong> inference (endpoint compatível com OpenAI)</p>
|
|
183
|
+
<p><strong>Uso:</strong> geração de texto das notícias (provedor primário do fallback)</p>
|
|
184
|
+
<p>Chave de API fornecida pelo próprio usuário, armazenada localmente.</p>
|
|
185
|
+
</div>
|
|
186
|
+
<div class="api-item api-gemini">
|
|
187
|
+
<h3>🔵 Google Gemini</h3>
|
|
188
|
+
<p><strong>APIs:</strong> modelo de linguagem (fallback de texto) e Gemini Image (imagens ilustrativas)</p>
|
|
189
|
+
<p><strong>Uso:</strong> redação alternativa e geração de imagens fotojornalísticas</p>
|
|
190
|
+
<p>Chave de API fornecida pelo próprio usuário, armazenada localmente.</p>
|
|
191
|
+
</div>
|
|
192
|
+
<div class="api-item api-supabase">
|
|
193
|
+
<h3>🟢 Supabase</h3>
|
|
194
|
+
<p><strong>API:</strong> banco gerenciado (opcional)</p>
|
|
195
|
+
<p><strong>Uso:</strong> backend de dados alternativo, apenas se o usuário optar explicitamente e fornecer suas credenciais</p>
|
|
196
|
+
<p>Por padrão, os dados permanecem em SQLite local.</p>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<div class="links">
|
|
201
|
+
<a href="privacy.html">🔒 Política de Privacidade</a>
|
|
202
|
+
<a href="terms.html">📜 Termos de Uso</a>
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
<div class="contact">
|
|
206
|
+
<strong>📧 Desenvolvedor:</strong> Dan Hachuel<br>
|
|
207
|
+
<!-- TODO: confirmar e-mail -->
|
|
208
|
+
<strong>📩 Contato:</strong> <a href="mailto:danchannels96@gmail.com">danchannels96@gmail.com</a><br>
|
|
209
|
+
<strong>📍 Propósito:</strong> aplicação pessoal de automação editorial para blogs próprios do usuário.
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
<footer>
|
|
213
|
+
<p>© 2026 PandaNews — Dan Hachuel</p>
|
|
214
|
+
<p>Este site é usado para verificação da aplicação junto aos provedores de API utilizados: Google Gemini, NVIDIA NIM e Supabase.</p>
|
|
215
|
+
</footer>
|
|
216
|
+
</div>
|
|
217
|
+
</body>
|
|
218
|
+
</html>
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="pt-BR">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Política de Privacidade - PandaNews</title>
|
|
7
|
+
<style>
|
|
8
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
9
|
+
body {
|
|
10
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
11
|
+
background: linear-gradient(135deg, #0b1220 0%, #14532d 100%);
|
|
12
|
+
min-height: 100vh;
|
|
13
|
+
padding: 40px 20px;
|
|
14
|
+
}
|
|
15
|
+
.container { max-width: 800px; margin: 0 auto; }
|
|
16
|
+
.card {
|
|
17
|
+
background: #ffffff;
|
|
18
|
+
border-radius: 20px;
|
|
19
|
+
padding: 40px;
|
|
20
|
+
margin-bottom: 30px;
|
|
21
|
+
box-shadow: 0 20px 40px rgba(0,0,0,0.25);
|
|
22
|
+
}
|
|
23
|
+
.badge {
|
|
24
|
+
background: linear-gradient(135deg, #22c55e 0%, #16a34a 100%);
|
|
25
|
+
color: #052e16;
|
|
26
|
+
padding: 8px 16px;
|
|
27
|
+
border-radius: 50px;
|
|
28
|
+
display: inline-block;
|
|
29
|
+
font-size: 0.9em;
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
margin-bottom: 20px;
|
|
32
|
+
}
|
|
33
|
+
h1 { color: #0b1220; font-size: 2.2em; margin-bottom: 10px; }
|
|
34
|
+
h2 { color: #14532d; margin: 28px 0 12px 0; font-size: 1.45em; }
|
|
35
|
+
h3 { color: #166534; margin: 18px 0 8px 0; font-size: 1.15em; }
|
|
36
|
+
p { color: #475569; line-height: 1.65; margin: 10px 0; }
|
|
37
|
+
ul, ol { margin: 10px 0 10px 28px; color: #475569; line-height: 1.65; }
|
|
38
|
+
li { margin: 6px 0; }
|
|
39
|
+
strong { color: #0b1220; }
|
|
40
|
+
code {
|
|
41
|
+
background: #e8f0ea;
|
|
42
|
+
color: #14532d;
|
|
43
|
+
padding: 2px 6px;
|
|
44
|
+
border-radius: 4px;
|
|
45
|
+
font-size: 0.85em;
|
|
46
|
+
}
|
|
47
|
+
a { color: #15803d; text-decoration: none; }
|
|
48
|
+
a:hover { text-decoration: underline; }
|
|
49
|
+
.destaque {
|
|
50
|
+
background: #ecfdf5;
|
|
51
|
+
border-left: 4px solid #22c55e;
|
|
52
|
+
padding: 14px 18px;
|
|
53
|
+
border-radius: 10px;
|
|
54
|
+
margin: 15px 0;
|
|
55
|
+
color: #14532d;
|
|
56
|
+
}
|
|
57
|
+
.links {
|
|
58
|
+
margin: 30px 0 20px 0;
|
|
59
|
+
padding: 22px;
|
|
60
|
+
background: #ecfdf5;
|
|
61
|
+
border-radius: 15px;
|
|
62
|
+
text-align: center;
|
|
63
|
+
}
|
|
64
|
+
.links a {
|
|
65
|
+
display: inline-block;
|
|
66
|
+
min-height: 44px;
|
|
67
|
+
line-height: 44px;
|
|
68
|
+
padding: 0 14px;
|
|
69
|
+
color: #15803d;
|
|
70
|
+
text-decoration: none;
|
|
71
|
+
margin: 4px 8px;
|
|
72
|
+
font-weight: 600;
|
|
73
|
+
border-radius: 10px;
|
|
74
|
+
}
|
|
75
|
+
.links a:hover { background: #d1fae5; }
|
|
76
|
+
footer { text-align: center; color: rgba(255,255,255,0.85); margin-top: 30px; line-height: 1.6; }
|
|
77
|
+
.contact {
|
|
78
|
+
background: #fff8e6;
|
|
79
|
+
padding: 18px;
|
|
80
|
+
border-radius: 10px;
|
|
81
|
+
margin-top: 20px;
|
|
82
|
+
line-height: 1.7;
|
|
83
|
+
}
|
|
84
|
+
.contact a { color: #15803d; }
|
|
85
|
+
@media (max-width: 600px) {
|
|
86
|
+
.card { padding: 25px; }
|
|
87
|
+
h1 { font-size: 1.6em; }
|
|
88
|
+
h2 { font-size: 1.25em; }
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
91
|
+
</head>
|
|
92
|
+
<body>
|
|
93
|
+
<div class="container">
|
|
94
|
+
<div class="card">
|
|
95
|
+
<div class="badge">🔒 Documento Legal</div>
|
|
96
|
+
<h1>Política de Privacidade</h1>
|
|
97
|
+
<p><strong>Data de vigência:</strong> 25 de outubro de 2026</p>
|
|
98
|
+
<p><strong>Aplicação:</strong> PandaNews — geração e automação de blogs de notícias com IA</p>
|
|
99
|
+
|
|
100
|
+
<p>
|
|
101
|
+
Esta Política de Privacidade descreve como o PandaNews trata dados pessoais e informações do usuário,
|
|
102
|
+
em conformidade com a <strong>Lei Geral de Proteção de Dados Pessoais (LGPD — Lei nº 13.709/2018)</strong>.
|
|
103
|
+
</p>
|
|
104
|
+
<div class="destaque">
|
|
105
|
+
<strong>Princípio fundamental do PandaNews:</strong> o aplicativo é <strong>100% local</strong>. Ele é executado
|
|
106
|
+
na máquina do próprio usuário via <code>npx</code>, e todos os dados — configurações, conteúdo e credenciais —
|
|
107
|
+
residem no banco SQLite local (<code>data/pandanews.db</code>). <strong>Nenhum dado é enviado a servidores
|
|
108
|
+
do desenvolvedor.</strong>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<h2>1. Dados coletados</h2>
|
|
112
|
+
<p>O PandaNews trata as seguintes categorias de dados, todas armazenadas localmente na máquina do usuário:</p>
|
|
113
|
+
<ul>
|
|
114
|
+
<li><strong>Dados de configuração de blogs:</strong> nome, tema (esporte, política, economia, tecnologia, geral), região, fontes RSS, estilo editorial, frequência de geração e status.</li>
|
|
115
|
+
<li><strong>Conteúdo coletado de feeds RSS públicos:</strong> títulos, resumos e links de notícias das fontes configuradas pelo usuário.</li>
|
|
116
|
+
<li><strong>Conteúdo gerado por IA:</strong> notícias (título, resumo, corpo), imagens ilustrativas e o provedor de LLM que gerou cada texto.</li>
|
|
117
|
+
<li><strong>Chaves de API fornecidas pelo usuário:</strong> NVIDIA NIM, Google Gemini e Supabase — armazenadas localmente, no banco SQLite do próprio usuário.</li>
|
|
118
|
+
<li><strong>Dados de uso da plataforma:</strong> logs de execução (sucessos e erros por etapa), status do agendador e estatísticas de geração — visíveis apenas para o próprio usuário.</li>
|
|
119
|
+
<li><strong>Tokens e credenciais do Supabase:</strong> apenas se o usuário optar explicitamente por esse backend.</li>
|
|
120
|
+
</ul>
|
|
121
|
+
|
|
122
|
+
<h2>2. Finalidade do tratamento</h2>
|
|
123
|
+
<ul>
|
|
124
|
+
<li>Coleta e agregação de notícias de fontes públicas para fins editoriais.</li>
|
|
125
|
+
<li>Geração de conteúdo textual e visual com Inteligência Artificial.</li>
|
|
126
|
+
<li>Automação de geração conforme a frequência configurada por blog.</li>
|
|
127
|
+
<li>Produção de estatísticas e logs de execução para o próprio usuário acompanhar a operação.</li>
|
|
128
|
+
</ul>
|
|
129
|
+
|
|
130
|
+
<h2>3. Compartilhamento de dados</h2>
|
|
131
|
+
<p>O PandaNews é arquitetado para compartilhar <strong>o mínimo necessário</strong>, apenas com os provedores de API
|
|
132
|
+
cujas chaves o próprio usuário configura:</p>
|
|
133
|
+
<ul>
|
|
134
|
+
<li><strong>NVIDIA NIM (LLM):</strong> apenas o texto dos prompts e o contexto da notícia (título e resumo da fonte) são enviados para a redação. <strong>Nenhum dado pessoal do usuário é compartilhado.</strong></li>
|
|
135
|
+
<li><strong>Google Gemini (LLM de fallback):</strong> mesmo escopo do item acima — apenas prompts e contexto editorial.</li>
|
|
136
|
+
<li><strong>Google Gemini Image API:</strong> apenas prompts visuais derivados do conteúdo da notícia (palavras-chave do título/resumo).</li>
|
|
137
|
+
<li><strong>Supabase:</strong> apenas se o usuário optar explicitamente por esse backend, e apenas os dados que ele próprio decidir sincronizar.</li>
|
|
138
|
+
<li>O PandaNews <strong>não compartilha dados com terceiros</strong> para fins publicitários, de marketing ou de perfilação, e <strong>não vende dados</strong> sob nenhuma circunstância.</li>
|
|
139
|
+
</ul>
|
|
140
|
+
|
|
141
|
+
<h2>4. Armazenamento e localização</h2>
|
|
142
|
+
<ul>
|
|
143
|
+
<li>Por padrão, todos os dados residem no <strong>SQLite local</strong> na máquina do usuário: <code>data/pandanews.db</code>.</li>
|
|
144
|
+
<li>As imagens geradas residem em <code>data/imagens/</code>, também na máquina do usuário.</li>
|
|
145
|
+
<li>O runtime (Python portátil e dependências) fica em <code>~/.pandanews/</code>, separado do pacote npm.</li>
|
|
146
|
+
<li><strong>Nenhum dado é enviado a servidores do desenvolvedor do PandaNews.</strong> O tráfego externo limita-se às chamadas de API descritas na seção 3 e à leitura dos feeds RSS configurados.</li>
|
|
147
|
+
</ul>
|
|
148
|
+
|
|
149
|
+
<h2>5. Direitos do titular (LGPD, art. 18)</h2>
|
|
150
|
+
<p>Nos termos da LGPD, o titular dos dados possui direito à confirmação do tratamento, acesso, correção,
|
|
151
|
+
anonimização, portabilidade e eliminação dos dados. Como o PandaNews é uma aplicação local, <strong>o próprio
|
|
152
|
+
usuário exerce esses direitos diretamente</strong>:</p>
|
|
153
|
+
<ul>
|
|
154
|
+
<li>No banco de dados local (<code>data/pandanews.db</code>), acessível com qualquer ferramenta de SQLite;</li>
|
|
155
|
+
<li>Pela interface do aplicativo (exclusão de blogs e notícias, edição de configurações);</li>
|
|
156
|
+
<li>Para dados eventualmente sincronizados ao Supabase, diretamente no painel do Supabase, que pertence ao próprio usuário.</li>
|
|
157
|
+
</ul>
|
|
158
|
+
<p>Dúvidas sobre tratamento de dados podem ser enviadas ao canal de contato indicado ao final deste documento.</p>
|
|
159
|
+
|
|
160
|
+
<h2>6. Segurança</h2>
|
|
161
|
+
<ul>
|
|
162
|
+
<li>As chaves de API são armazenadas <strong>localmente</strong> no SQLite da própria máquina, sem criptografia adicional — cabe ao usuário proteger o acesso ao seu sistema.</li>
|
|
163
|
+
<li>Recomenda-se <strong>não compartilhar</strong> o arquivo <code>data/pandanews.db</code> nem o arquivo <code>.env</code> do projeto, pois ambos podem conter credenciais.</li>
|
|
164
|
+
<li>O aplicativo escuta apenas em <code>127.0.0.1</code> (interface local), não expondo os serviços à rede externa.</li>
|
|
165
|
+
</ul>
|
|
166
|
+
|
|
167
|
+
<h2>7. Cookies</h2>
|
|
168
|
+
<p>O PandaNews é uma aplicação local servida em <code>localhost</code> e <strong>não utiliza cookies de rastreamento
|
|
169
|
+
de terceiros</strong>, analytics externos ou pixels de publicidade. Cookies de sessão, caso existam na interface
|
|
170
|
+
local, servem apenas ao funcionamento da própria UI.</p>
|
|
171
|
+
|
|
172
|
+
<h2>8. Transferência internacional</h2>
|
|
173
|
+
<p>As chamadas às APIs de LLM e imagem (NVIDIA NIM, Google Gemini) implicam envio dos prompts aos servidores
|
|
174
|
+
desses provedores, que podem estar localizados fora do Brasil, regidos pelos termos de uso e políticas de
|
|
175
|
+
privacidade de cada provedor. O PandaNews não envia a esses provedores nenhum dado pessoal além do conteúdo
|
|
176
|
+
dos prompts editoriais descritos na seção 3.</p>
|
|
177
|
+
|
|
178
|
+
<h2>9. Alterações desta Política</h2>
|
|
179
|
+
<p>Esta Política de Privacidade pode ser atualizada a qualquer momento. A versão vigente será publicada neste
|
|
180
|
+
endereço, com a data de vigência atualizada. O uso contínuo do PandaNews após alterações implica concordância
|
|
181
|
+
com a versão vigente.</p>
|
|
182
|
+
|
|
183
|
+
<h2>10. Contato</h2>
|
|
184
|
+
<p>Para exercer direitos de titular ou esclarecer dúvidas sobre esta Política:</p>
|
|
185
|
+
<ul>
|
|
186
|
+
<!-- TODO: confirmar e-mail -->
|
|
187
|
+
<li>Por e-mail: <a href="mailto:danchannels96@gmail.com">danchannels96@gmail.com</a></li>
|
|
188
|
+
</ul>
|
|
189
|
+
|
|
190
|
+
<div class="links">
|
|
191
|
+
<a href="index.html">🏠 Voltar para Home</a>
|
|
192
|
+
<a href="terms.html">📜 Termos de Uso</a>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div class="contact">
|
|
196
|
+
<strong>📧 Desenvolvedor:</strong> Dan Hachuel<br>
|
|
197
|
+
<!-- TODO: confirmar e-mail -->
|
|
198
|
+
<strong>📩 Contato:</strong> <a href="mailto:danchannels96@gmail.com">danchannels96@gmail.com</a>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
<footer>
|
|
202
|
+
<p>© 2026 PandaNews — Dan Hachuel</p>
|
|
203
|
+
<p>Este site é usado para verificação da aplicação junto aos provedores de API utilizados: Google Gemini, NVIDIA NIM e Supabase.</p>
|
|
204
|
+
</footer>
|
|
205
|
+
</div>
|
|
206
|
+
</body>
|
|
207
|
+
</html>
|