Commit Graph

288 Commits

Author SHA1 Message Date
JeLuF
3b01e65e11 CSS only initimg hover, 'use as input' button 2022-12-17 01:30:30 +01:00
patriceac
62553dc0fa Fire an event upon tab change
Fire an event upon tab change.
2022-12-16 01:45:58 -08:00
cmdr2
7982a9ae25 Change the performance field to GPU Memory Usage instead, and use the 'balanced' profile by default, since it's just 5% slower than 'high', and uses nearly 50% less VRAM 2022-12-16 11:34:49 +05:30
cmdr2
aa01fd058e Set performance level (low, medium, high) instead of a Turbo field. The previous Turbo field is equivalent to 'Medium' performance now 2022-12-15 23:30:06 +05:30
cmdr2
fb075a0013 Fix whitespace 2022-12-14 16:53:50 +05:30
cmdr2
d1738baf44 Merge branch 'beta' into refactor 2022-12-14 16:53:23 +05:30
cmdr2
7eb29fa91b Fix: errors were overwritten by the time taken in the UI 2022-12-14 16:52:46 +05:30
cmdr2
cb81e2aacd Fix a bug where the metadata output format wouldn't get sent to the backend 2022-12-14 10:18:01 +05:30
cmdr2
80bc80dc2c
removeTask() 2022-12-13 12:02:43 +05:30
cmdr2
ceff4f06c1 Merge branch 'beta' into refactor 2022-12-12 20:43:29 +05:30
cmdr2
92030a3917 Don't collapse the task entry if 'Stop Task' is pressed 2022-12-12 19:56:27 +05:30
cmdr2
8c032579b8 Hide the hypernetwork strength slider if no hypernetwork model is selected; Support drag-n-drop for hypernetwork models 2022-12-12 19:31:59 +05:30
cmdr2
b53935bfd4 Revert "Scrolling panes (#632)"
This reverts commit e3184622e8.
2022-12-12 19:03:16 +05:30
cmdr2
25f488c6e1 Merge branch 'beta' into refactor 2022-12-12 15:47:13 +05:30
cmdr2
fb32a38d96 Rename sampler to sampler_name in the API 2022-12-12 15:21:02 +05:30
JeLuF
8faf6b9f52
Don't allow to make zero images, make at least one. (#647) 2022-12-12 11:11:33 +05:30
cmdr2
0aa7968503 Move color correction to diffusionkit; Rename color correction to 'Preserve color profile' 2022-12-11 19:34:07 +05:30
JeLuF
bd1bc78953 Use onIdle(), move pause button, quick resume without using the promise 2022-12-11 14:57:01 +01:00
cmdr2
6ce6dc3ff6 Get rid of the ugly copying around (and maintaining) of multiple request-related fields. Split into two objects: task-related fields, and render-related fields. Also remove the ability for request-defined full-precision. Full-precision can now be forced by using a USE_FULL_PRECISION environment variable 2022-12-11 18:16:29 +05:30
JeLuF
e6346775e7 Merge branch 'beta' into pause 2022-12-11 11:19:48 +01:00
Marc-Andre Ferland
5b7cd11de8
Added support for Async events (#643)
* Added support for async events callbacks

* Don't fire IDLE event if the first callback hasn't completed execution.
2022-12-11 11:22:52 +05:30
cmdr2
c08c8b2789
Merge pull request #638 from JeLuF/initimg
show initimg in task list
2022-12-11 11:18:10 +05:30
JeLuF
c568bca69e Pause button 2022-12-11 02:31:23 +01:00
JeLuF
099fde2652 show initimg in task list 2022-12-10 17:17:37 +01:00
Marc-Andre Ferland
83e5410945 Fix (typeof stepUpdate !== 'object') not completing the task on stop. 2022-12-10 00:52:27 -05:00
patriceac
e3184622e8
Scrolling panes (#632)
Decouple the editor and the preview panes. Scrollbars color updated as well as requested.
2022-12-09 23:11:39 +05:30
patriceac
28f822afe0
Fix tags not being properly applied to prompt matrix (#610)
There is an issue on the beta where if you use pipe ( | ) in the prompt to make a prompt matrix, the optional prompts are only applied when the last prompt in the matrix is used.
2022-12-09 23:04:25 +05:30
cmdr2
79cc84b611 Option to apply color correction (balances the histogram) during inpainting; Refactor the runtime to use a general-purpose dict 2022-12-09 19:39:56 +05:30
Marc-Andre Ferland
ba2c966329
First draft of multi-task in a single session. (#622) 2022-12-08 11:12:46 +05:30
Marc-Andre Ferland
182236e742
Hypernets mergefixes (#625)
* Add hypernetwork args definition in the engine.

* Add the values to reqBody

* Don't load hypernetwork.py with SD2 until it's compatible.
2022-12-07 12:35:36 +05:30
Guillaume Mercier
cbe91251ac
Hypernetwork support (#619)
* Update README.md

* Update README.md

* Make on_sd_start.sh executable

* Merge pull request #542 from patriceac/patch-1

Fix restoration of model and VAE

* Merge pull request #541 from patriceac/patch-2

Fix restoration of parallel output setting

* Hypernetwork support

Adds support for hypernetworks. Hypernetworks are stored in /models/hypernetworks

* forgot to remove unused code

Co-authored-by: cmdr2 <secondary.cmdr2@gmail.com>
2022-12-07 11:24:16 +05:30
Marc-Andre Ferland
1283c6483d
Use the reqBody exposed to events to allow plugins to change the request. (#620) 2022-12-07 09:34:04 +05:30
cmdr2
ef90832aea
engine.js (#615)
* New engine.js first draft.

* Small fixes...

* Bump version for cache...

* Improved cancellation code.

* Cleaning

* Wrong argument used in Task.waitUntil

* session_id needs to always match SD.sessionId

* Removed passing explicit Session ID from UI.
Use SD.sessionID to replace.

* Cleaning... Removed a disabled line and a hardcoded value.

* Fix return if tasks are still waiting.

* Added checkbox to reverse processing order.

* Fixed progress not displaying properly.

* Renamed reverse label.

* Only hide progress bar inside onCompleted.

* Thanks to rbertus2000 for helping testing and debugging!

* Resolve async promises when used optionally.

* when removed var should have used let, not const.

* Renamed getTaskErrorHandler to onTaskErrorHandler to better reflect actual implementation.

* Switched to the unsafer and less git friendly end of lines comma as requested in review.

* Raised SERVER_STATE_VALIDITY_DURATION to 90 seconds to match the changes to Beta.

* Added logging.

* Added one more hook before those inside the SD engine.

* Added selftest.plugin.js as part of core.

* Removed a tests that wasn't yet implemented...

* Groupped task stopping and abort in single function.

* Added optional test for plugins.

* Allow prompt text to be selected.

* Added comment.

* Improved isServerAvailable for better mobile usage and added comments for easier debugging.

* Comments...

* Normalized EVENT_STATUS_CHANGED to follow the same pattern as the other events.

* Disable plugins if editorModifierTagsList is not defined.

* Adds a new ServiceContainer to register IOC handlers.

* Added expect test for a missing dependency in a ServiceContainer

* Moved all event code in it's own sub class for easier reuse.

* Removed forgotten unused var...

* Allow getPrompts to be reused be plugins.

* Renamed EventSource to GenericEventSource to avoid redefining an existing class name.

* Added missing time argument to debounce

* Added output_quality to engine.js

* output_quality need to be an int.

* Fixed typo.

* Replaced the default euler_a by dpm2 to work with both SD1.# and SD2

* Remove generic completed tasks from plugins on generator complete.

* dpm2 starts at step 2, replaced with plms to start at step 1.

* Merge error

* Merge error

* changelog

Co-authored-by: Marc-Andre Ferland <madrang@gmail.com>
2022-12-06 17:04:08 +05:30
Malcolm Diller
cb618efb98
Image Editor Updates (#612)
* fixed tools for image editor to be more modular and made cursor an actual cursor change

* fixed eraser cursor positioning

* updated opacity to not have a 100 option

* separated clear into an actions section

* added history support for image editor. ctrl-z and ctrl-y both work now

* removed extra console log debugging stuff

* updated buttons style

* updated the button ui on the main page as requested

* updated with a bunch of bugfixes
2022-12-06 13:56:51 +05:30
JeLuF
e7ca8090fd
Make JPEG Output quality user controllable (#607)
Add a slider to the image options for the JPEG quality
For PNG images, the slider is hidden.
2022-12-05 11:02:33 +05:30
Marc-Andre Ferland
f701b8dc29
Simplify onUpscaleClick (#602)
* Simplified onUpscaleClick code.

* Updated fix with comment as to what it's fixing.

* Move the fix to enqueueImageVariationTask
2022-12-05 10:46:10 +05:30
patriceac
bd10a850fa
Fix upscaling when a source image is set (#593)
* Fix upscaling when a source image is set

If you have an image selected (img2img) then clicking Upscale on another unrelated image, the image for img2img is used and you get something very unexpected.

* Fix for img2img and mask gens
2022-12-03 22:25:14 +05:30
Malcolm Diller
277140f218
Image Editor (#574)
* started implementing hamunii's image editor, and added a hamunii theme

* fixed so active tab is main tab

* added some testing stuff for image ediotr

* re-implemented canvas drawing myself. just need to add layer stuff now

* moved everything to an image editor class and implement it so it actually works nicely now

* fixed a couple weird bugs and cleaned up the background image and sharpness stuff

* cleaned up a lot of stuff about the editor, added tools, buttons, made it mostly work in the current ui

* added inpainting support

* updated with more nice changes/updates to the inpainting and drawing editor

* made some more fixes and touchups to the image editor

* removed a bunch of semicolons

* remove old image inpainting system

* updated to work properly on mobile

* made a minor bugfix

* fixed img_size_box alignment

* Update index.html

Co-authored-by: cmdr2 <secondary.cmdr2@gmail.com>
Co-authored-by: cmdr2 <shashank.shekhar.global@gmail.com>
2022-12-01 16:01:09 +05:30
patriceac
ca9413ccf4
Toggle image modifiers plugin (#558)
* Toggle image modifiers plugin

Right-click on image modifiers to temporarily turn them off without removing them. To quickly iterate and experiment with various combinations.

Please note this plugin required a minor tweak in getPrompts() to add support for image modifier inactive state.

* Fix tag matching

Co-authored-by: cmdr2 <secondary.cmdr2@gmail.com>
2022-12-01 15:10:36 +05:30
cmdr2
c9a0d090cb
Merge pull request #569 from patriceac/Fix-seed-behavior
Tweak the seed behavior
2022-12-01 15:03:21 +05:30
cmdr2
3b554d881a Styling changes for the confirm dialog 2022-12-01 13:54:49 +05:30
cmdr2
6d131d9d8e
Merge branch 'beta' into Fix-UI-display-when-removing-the-last-task 2022-11-30 16:14:28 +05:30
cmdr2
029509ebad Unify IP info with devices, into a system_info table 2022-11-30 14:34:24 +05:30
cmdr2
f0b3bea4e3 Also confirm before the 'Stop All' button acts; Tweak wording of confirm dialog 2022-11-30 13:54:42 +05:30
cmdr2
0b96fa112d
Merge branch 'beta' into confirm 2022-11-30 13:47:08 +05:30
cmdr2
ff9430b8a2 Tabs to 4 spaces 2022-11-30 12:18:34 +05:30
patriceac
69f14edd80 Tweak the seed behavior
Update the seed *before* starting the processing, so interrupting the processing retains the seed being used for the batch being currently processed.

The idea behind that is that if I like the gen I'm currently seeing and want to build on top of it, I can create a new task with the same seed without having to wait for the current task to complete.
2022-11-28 01:19:31 -08:00
patriceac
14714b950d Slight improvement of detection logic 2022-11-28 00:14:12 -08:00
patriceac
e64e1a92e6 Fix UI display when removing the last task
Clear All button properly shows the "welcome message", but Remove the last task would just result in a blank Preview pane.
2022-11-27 12:42:51 -08:00
JeLuF
6eff591df7 System settings to disable the 'Are you sure?'-dialogs 2022-11-23 23:05:30 +01:00
JeLuF
49535deb2e Confirm 'Clear All' and 'Stop Task'
Ask for a confimation before clearing the results pane or stopping a render task. The dialog can be skipped by holding down the shift key while clicking on the button.
2022-11-22 21:27:36 +01:00
JeLuF
ae409dd0ec Prevent empty fields in make image request
Prevent render jobs to fail with HTTP 422 due to empty fields in the image settings.
https://discord.com/channels/1014774730907209781/1043481789706031215/1043481789706031215
https://discord.com/channels/1014774730907209781/1014774732018683927/1042768986871443516

minor change, no CHANGE.md entry
2022-11-19 21:00:41 +01:00
cmdr2
d03521bf12 Use as Input -> Use these settings 2022-11-18 21:11:34 +05:30
cmdr2
3eb1919c81 Fix the missing (beta) label next to the version number 2022-11-18 19:38:16 +05:30
cmdr2
0067e46192
Merge pull request #501 from mdiller/mdiller_fancyswitches
Better Toggle Inputs & Updated Settings UI
2022-11-18 16:17:54 +05:30
cmdr2
921711a679 Don't crash if an invalid model file is beign scanned 2022-11-18 16:12:45 +05:30
cmdr2
1f815d7562
Merge branch 'beta' into scanner 2022-11-18 16:01:50 +05:30
cmdr2
f74c57449e Cosmetic changes to Use Settings 2022-11-18 15:54:47 +05:30
cmdr2
a697bd935a Refactor the Use Settings code, and move that to the common restoreTask() function 2022-11-18 15:38:17 +05:30
cmdr2
7ffeb3964b
Merge pull request #463 from patriceac/beta
Adding Use Settings
2022-11-18 14:40:04 +05:30
Malcolm Diller
507491fbec added fancy switches and updated the ui of the settings tab 2022-11-17 17:58:09 -08:00
JeLuF
3e18f2f09c Picklescan of model files
During getModel(), the server picklescans the model files for potential
malicious code in the pickled python objects. If a malicious file is
found, the web UI will show a big red error message, the makeImage
button will be disabled, and the user must remove the malicious file
and reload the UI page.
2022-11-16 22:34:02 +01:00
cmdr2
18d9d2602a Add a 'What's New?' tab as a core plugin, which fetches the contents of CHANGES.md from the app's release branch 2022-11-16 16:54:28 +05:30
patriceac
9764d9109f Merge remote-tracking branch 'upstream/main' into beta 2022-11-16 00:29:52 -08:00
cmdr2
e99d54d1f6 Merge main 2022-11-16 11:19:10 +05:30
cmdr2
f124cf8318
Make the task config summary labels bold 2022-11-15 16:06:35 +05:30
cmdr2
5cf763d51f Add a 'Save' button in settings, to avoid starting/stopping threads while a user is still modifying their GPU settings 2022-11-15 12:22:55 +05:30
cmdr2
6530e45178
Merge pull request #478 from madrang/beta
Changed update_render_threads to use SetAppConfigRequest.
2022-11-15 11:04:52 +05:30
Marc-Andre Ferland
ffe0eb1544 Changed update_render_threads to use SetAppConfigRequest to set which devices are active.
Keep ImageRequest.render_device for affinity only. (Send a task to an already active device.)
2022-11-14 21:54:24 -05:00
JeLuF
288e8a65f3
Incr. Server State Validtiy to 90s
By default, healthCheck() is run every 5s. On background tabs, this may get extended. My tests have shown pings every 60s. The ping was older than 10s, so the condition in line 490 evaluates to `false` and the client tries to access the stream before the server is ready. By increasing the validity this can be avoided - at least until the browser runs the healthcheck even less often.

See https://discord.com/channels/1014774730907209781/1041811939380178964/1041812021018120262 for the analysis.
2022-11-14 23:18:03 +01:00
JeLuF
f22f57495e Fix system info for CPU mode 2022-11-14 17:55:36 +01:00
cmdr2
f06a97d30b Move system info into settings 2022-11-14 21:21:48 +05:30
cmdr2
64ff1ecbb6 Formatting for mem free 2022-11-14 21:02:17 +05:30
cmdr2
8707f88c07 Show mem free info 2022-11-14 20:35:47 +05:30
cmdr2
125a50ae87 Include the gpu id in the gpu list and system info 2022-11-14 20:01:57 +05:30
cmdr2
31617ae340 Show a system info tab, which shows the active GPUs 2022-11-14 19:53:40 +05:30
cmdr2
24fbbf8aa8 Remove unused variables 2022-11-14 16:26:16 +05:30
cmdr2
1d2b3a4ed8 Hide/show the GPUs list depending on whether auto is selected 2022-11-14 13:14:33 +05:30
cmdr2
f904945d40 Disable the GPU list if auto is enabled 2022-11-14 13:02:36 +05:30
cmdr2
ea03fd22db Start on multiple GPUs by default (top 75 percentile by free_mem); UI selection for 'cpu' or 'auto' or a list of specific GPUs, which is now linked to the backend; Dynamically start/stop render threads for the devices, without requiring a full program restart 2022-11-14 11:23:22 +05:30
cmdr2
cd5f847b55 Merge branch 'beta' of github.com:cmdr2/stable-diffusion-ui into beta 2022-11-11 12:03:14 +05:30
patriceac
39b6c5d6f4 Merge remote-tracking branch 'upstream/beta' into beta 2022-11-10 22:30:28 -08:00
patriceac
903acff924 Adding Use Settings 2022-11-10 18:36:39 -08:00
JeLuF
5a06946469 Add event listener beforeunload
When closing the window, a warning is shown if there are any render results.
2022-11-10 23:23:20 +01:00
cmdr2
baef31b2c7 Send 'auto' as the render_device from the UI
, if no GPU is selected and CPU is unchecked)
2022-11-10 22:23:15 +05:30
cmdr2
3f26d03166 Show GPU list in the UI only if the PC has more than 1 GPU 2022-11-10 16:34:01 +05:30
cmdr2
1fed3ad532 Don't propagate events in the Stop Task button 2022-11-10 15:33:39 +05:30
cmdr2
0da6354825 Press Ctrl+Enter to start a task 2022-11-10 14:59:01 +05:30
cmdr2
058ce6fe82 UI-side changes for selecting multiple GPUs, and keeping the Use CPU option synchronized with the backend. This change isn't ready to be shipped, it still needs python-side changes to support the req.render_device config 2022-11-09 19:17:44 +05:30
Malcolm Diller
69c7f22053 Merge branch 'beta' into mdiller_ui_reorganize 2022-11-08 21:22:22 -08:00
Malcolm Diller
e175b87384 updated so tabs work now, and we have a settings tab and an about tab 2022-11-08 19:54:41 -08:00
Malcolm Diller
f216ee739a updated with latest updates for this support 2022-11-08 19:22:14 -08:00
cmdr2
9bc7521de0 Make custom VAE an Image Setting, rather than a System Setting; Don't load a VAE into memory by default 2022-11-08 16:54:15 +05:30
Marc-Andre Ferland
a922a93016 Can work with one or more params, don't need a minimum of two.
Still works just the same.
2022-10-30 14:09:12 -04:00
patriceac
f08a875cd2
Update main.js
Fix parsing of Set and Permute operators in custom tags.
2022-10-30 00:26:53 -07:00
patriceac
d492d3f738
Update main.js
Fixing the parsing of Set and Permute operators in custom tags.
2022-10-30 00:22:01 -07:00
Marc-Andre Ferland
3bd97352ba Don't reset reqBody, only replace using req as we use a new task object created from UI inputs.
Fix plugins needing to specify many params or they would be missing in the render request.
2022-10-29 14:47:58 -04:00
Malcolm Diller
301af7bd7a added parameters 2022-10-28 18:25:54 -07:00
Malcolm Diller
09c11a385d normalized popups 2022-10-28 16:48:32 -07:00
cmdr2
a8c16e39b8 Support custom VAE files; Use vae-ft-mse-840000-ema-pruned as the default VAE, which can be overridden by putting a .vae.pt file inside models/stable-diffusion with the same name as the ckpt model file. The UI / System Settings allows setting the default VAE model to use 2022-10-28 20:06:44 +05:30
Malcolm Diller
7d29b9901c updated progressbar to end more consistently 2022-10-27 22:47:08 -07:00
Malcolm Diller
5a6e7a46d1 added progressbar 2022-10-27 17:03:09 -07:00
cmdr2
6285980f98
Merge pull request #377 from madrang/beta
Missing '?' in case renderRequest is ever undefined.
2022-10-25 10:44:37 +05:30
cmdr2
9c9998b468
Merge pull request #364 from mdiller/mdiller_settings
Settings Refactor
2022-10-25 10:32:38 +05:30
Marc-Andre Ferland
1ec95d42ba Missing '?' in case renderRequest is ever undefined. 2022-10-22 21:19:42 -04:00
cmdr2
5ee05e3aaa
Merge pull request #376 from cmdr2/beta
Custom Modifiers; Try to fix the 503 error bug; Show the number of images being created in the Make Image button
2022-10-22 22:27:05 +05:30
Marc-Andre Ferland
1199c431ff Removed a new line by mistake. Formatting... 2022-10-22 12:51:43 -04:00
Marc-Andre Ferland
305f2fa448 In case of failure, display error in renderRequest.detail 2022-10-22 12:32:41 -04:00
Marc-Andre Ferland
b051685727 More logging for each state and improved handling. 2022-10-22 12:31:14 -04:00
cmdr2
7580bb21c3
Fix upscale multiple images bug 2022-10-22 08:38:19 +05:30
Malcolm Diller
5453925e26 Merge branch 'beta' into mdiller_settings 2022-10-21 17:16:50 -07:00
rbertus2000
1696a5c8e1 modifyCurrentRequest with rest parameters 2022-10-21 23:04:42 +02:00
rbertus2000
816cf8f702 fix multiple images with upscale/fix face button 2022-10-21 22:40:26 +02:00
cmdr2
329360aa5b Show the number of images it'll make in the Make Image button 2022-10-21 15:18:05 +05:30
Marc-Andre Ferland
807e9573fb Check result status, not json object. 2022-10-20 20:36:45 -04:00
cmdr2
090dfff730 Refactor the time delays into constants and mention the units 2022-10-20 17:22:01 +05:30
cmdr2
f4bcc1f2e5 Bug fix - autosave wasn't saving the changes in the textboxes next to guidance scale and prompt strength sliders 2022-10-20 15:26:18 +05:30
cmdr2
63e8614ace Refactor the image button code 2022-10-20 15:10:34 +05:30
cmdr2
5d686b146d Remove the new label from Upscale 2022-10-20 12:14:09 +05:30
Malcolm Diller
d08f090800 Merge branch 'beta' into mdiller_settings 2022-10-19 21:17:56 -07:00
Malcolm Diller
8554473c21 the rest of the fking owl 2022-10-19 21:12:01 -07:00
cmdr2
29e32ffc42 Mark the new upscale button as new 2022-10-19 22:08:58 +05:30
cmdr2
88bd60a083 Button to draw another 25 steps 2022-10-19 22:08:42 +05:30
cmdr2
48b7b725b0 Add a button to fix faces on generated images 2022-10-19 22:02:59 +05:30
cmdr2
253d355bd2 New upscale button for images; Fix a bug where the string seed would get appended with numbers 2022-10-19 21:58:51 +05:30
cmdr2
e287df1320 Allow loading UI plugins from a /plugins/ URL path, which loads files ending with .plugin.js inside the plugins/ui folder 2022-10-19 21:34:40 +05:30
cmdr2
bae0bec1cc Change the image buttons plugins to a list instead of a dict 2022-10-19 21:21:19 +05:30
cmdr2
602686a5d2 Move the current implementation of upscale/redo/double size into a custom plugin 2022-10-19 20:27:06 +05:30
cmdr2
af05d94198 Allow plugin buttons for image overlay to decide whether they should be displayed or not 2022-10-19 20:10:45 +05:30
cmdr2
5fa3a7ca44 UI-side plugin system; Use PLUGINS['IMAGE_INFO_BUTTONS'] to add additional buttons on the generated images 2022-10-19 19:50:05 +05:30
cmdr2
9609350789 Rework the API for image buttons 2022-10-19 18:23:34 +05:30
cmdr2
50741c70c0 Add a 'Make Similar Images' button 2022-10-19 17:26:35 +05:30
cmdr2
105f071847 Expand curly braces in prompts, for e.g. 'hello {foo,bar}' => 'hello foo' and 'hello bar' 2022-10-19 13:50:05 +05:30
Malcolm Diller
0922349344 made some updates and moved some stuff to auto-save js 2022-10-18 20:49:58 -07:00
cmdr2
946dfdf7b8 Bring back the upscale/double/redo buttons 2022-10-18 22:29:15 +05:30
cmdr2
4da9843479 Move image modifiers JS to a separate file 2022-10-18 22:28:04 +05:30
cmdr2
eccb3c643d Separate the inpainting editor JS into a separate file 2022-10-18 22:09:11 +05:30
cmdr2
f7b513dff2 Refactor the CSS and JS into separate files, attempt 1 2022-10-18 20:18:56 +05:30