diff --git a/.gitignore b/.gitignore index 6702851..675c98f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ espfs/espfstest/espfstest html_compressed/ ldscript_memspecific.ld eagle.app.sym +node_modules # Garbage added by CLion .idea/ diff --git a/.gitmodules b/.gitmodules index 849972e..cf68bfe 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,7 @@ [submodule "libesphttpd"] path = libesphttpd url = git@github.com:MightyPork/libesphttpd.git +[submodule "front-end"] + path = front-end + url = git@github.com:espterm/espterm-front-end.git + branch = master diff --git a/CMakeLists.txt b/CMakeLists.txt index 33ed3d9..c2e420d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,8 +110,6 @@ set(SOURCE_FILES user/serial.h user/routes.c user/routes.h - user/uart_asyncdrv.c- - user/uart_asyncdrv.h- user/cgi_main.c user/cgi_main.h user/cgi_sockets.c @@ -141,7 +139,7 @@ set(SOURCE_FILES user/apars_osc.c user/apars_osc.h user/apars_dcs.c - user/apars_dcs.h user/uart_buffer.c user/uart_buffer.h user/jstring.c user/jstring.h user/character_sets.h) + user/apars_dcs.h user/uart_buffer.c user/uart_buffer.h user/jstring.c user/jstring.h user/character_sets.h user/utf8.h user/utf8.c user/cgi_logging.h) include_directories(include) include_directories(user) @@ -155,6 +153,7 @@ include_directories(esp_iot_sdk_v1.5.2/include) add_definitions( -D__ets__ -DICACHE_FLASH + -DUSE_OPTIMIZE_PRINTF=1 -DHTTPD_MAX_CONNECTIONS=5 -DHTTPD_STACKSIZE=1000 -DICACHE_FLASH_ATTR= diff --git a/Makefile b/Makefile index 1c3c4a7..7c2fc02 100644 --- a/Makefile +++ b/Makefile @@ -62,12 +62,13 @@ LIBS = c gcc hal phy pp net80211 wpa main lwip crypto #Add in esphttpd lib LIBS += esphttpd -# compiler flags using during compilation of source files -CFLAGS = -Os -ggdb -std=gnu99 -Werror -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \ +# compiler flags using during compilation of source files -ggdb +CFLAGS = -Os -std=gnu99 -Werror -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \ -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH \ -Wno-address -Wno-unused -CFLAGS += -DGIT_HASH='"$(shell git rev-parse --short HEAD)"' +CFLAGS += -DGIT_HASH_BACKEND='"$(shell git rev-parse --short HEAD)"' +CFLAGS += -DGIT_HASH_FRONTEND='"$(shell cd front-end && git rev-parse --short HEAD)"' CFLAGS += -DADMIN_PASSWORD=$(ADMIN_PASSWORD) ifdef GLOBAL_CFLAGS @@ -152,7 +153,6 @@ define maplookup $(patsubst $(strip $(1)):%,%,$(filter $(strip $(1)):%,$(2))) endef - #Include options and target specific to the OUTPUT_TYPE include Makefile.$(OUTPUT_TYPE) @@ -171,7 +171,7 @@ MODULE_INCDIR := $(addsuffix /include,$(INCDIR)) ESP_FLASH_SIZE_IX=$(call maplookup,$(ESP_SPI_FLASH_SIZE_K),512:0 1024:2 2048:5 4096:6) ESPTOOL_FREQ=$(call maplookup,$(ESP_FLASH_FREQ_DIV),0:40m 1:26m 2:20m 0xf:80m 15:80m) ESPTOOL_MODE=$(call maplookup,$(ESP_FLASH_MODE),0:qio 1:qout 2:dio 3:dout) -ESPTOOL_SIZE=$(call maplookup,$(ESP_SPI_FLASH_SIZE_K),512:4m 256:2m 1024:8m 2048:16m 4096:32m) +ESPTOOL_SIZE=$(call maplookup,$(ESP_SPI_FLASH_SIZE_K),512:512KB 256:256KB 1024:1MB 2048:2MB 4096:4MB) ESPTOOL_OPTS=--port $(ESPPORT) --baud $(ESPBAUD) ESPTOOL_FLASHDEF=--flash_freq $(ESPTOOL_FREQ) --flash_mode $(ESPTOOL_MODE) --flash_size $(ESPTOOL_SIZE) @@ -189,7 +189,7 @@ $1/%.o: %.S $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS) -c $$< -o $$@ endef -.PHONY: all web parser checkdirs clean libesphttpd default-tgt +.PHONY: all web parser checkdirs clean libesphttpd default-tgt espsize espmac web: $(Q) ./build_web.sh @@ -197,19 +197,31 @@ web: parser: $(Q) ./build_parser.sh -all: checkdirs web parser $(TARGET_OUT) $(FW_BASE) +espsize: + $(Q) esptool --port /dev/ttyUSB0 flash_id + +espmac: + $(Q) esptool --port /dev/ttyUSB0 read_mac + +all: checkdirs + $(Q) make actual_all -j4 -B + +actual_all: parser $(TARGET_OUT) $(FW_BASE) libesphttpd/Makefile: $(Q) [[ -e "libesphttpd/Makefile" ]] || echo -e "\e[31mlibesphttpd submodule missing.\nIf build fails, run \"git submodule init\" and \"git submodule update\".\e[0m" libesphttpd: libesphttpd/Makefile - $(Q) make -C libesphttpd USE_OPENSDK=$(USE_OPENSDK) SERVERNAME_PREFIX="ESPTerm " + $(Q) make -C libesphttpd USE_OPENSDK=$(USE_OPENSDK) SERVERNAME_PREFIX="ESPTerm " -j4 $(APP_AR): libesphttpd $(OBJ) $(vecho) "AR $@" $(Q) $(AR) cru $@ $(OBJ) -checkdirs: $(BUILD_DIR) +checkdirs: $(BUILD_DIR) html/favicon.ico + +html/favicon.ico: + $(Q) [[ -e "html/favicon.ico" ]] || ./build_web.sh $(BUILD_DIR): $(Q) mkdir -p $@ diff --git a/README.md b/README.md index 48f9453..9dc6c26 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ![Photo][photo-hw]
*Fig 1: Breadboard adapter developed for ESPTerm* -Version 1.0.0 **passes most of VTTEST test cases** (from the main menu and some Xterm specific), making it +As of release 1.0, ESPTerm **passes most of VTTEST test cases** (from the main menu and some Xterm specific), making it functionally comparable to eg. gnome-terminal, terminator, konsole, GtkTerm or PuTTY. ESPTerm is **capable of running Midnight Commander** through agetty, **including full mouse support**, provided agetty is made to believe it's Xterm, which shows ESPTerm is sufficiently well @@ -27,23 +27,24 @@ You can try the web user interface here: [espterm.github.io][demo-term] The demo is almost identical to the real thing, except, of course, it doesn't do much without the emulator backend that runs on the ESP8266. The web version will be updated to match this repository - after each minor release. +after each minor release (and sometimes in between for testing; the version currently being show-cased +can be read on the About page of the demo). ## Main features - **Almost complete VT102 emulation** with some extras from Xterm, eg. - - Screen size up to 80x25 + - Screen size up to 80x25 (the limit can be modified when compiling from source) - All standard text styles and 16 colors supported - Full UTF-8 support, alternate character sets - Standard mouse tracking modes - You can dynamically set screen title, button labels... -- **Web Interface** +- **Web Terminal Interface** - Real-time screen update via WebSocket - - Button to open keyboard on Android - - 5 buttons under the screen for quick commands - - Text file upload tool with configurable delays and line endings + - Mouse and keyboard input, works also on mobile + - 5 optional buttons for quick commands + - Text file upload tool with adjustable delays and line endings - *Built-in help page* ([demo][demo-help]) with basic troubleshooting and command reference -- **Robust WiFi configuration interface** (Demo: [WiFi][demo-wifi], [network][demo-network] config) +- **User-friendly comprehensive WiFi configuration** (Demo: [WiFi][demo-wifi], [network][demo-network] config) - Static IP, DHCP, channel selection, power - SSID search utility for finding your existing network @@ -121,8 +122,7 @@ and changes required by the project. ``` - Install Ragel if you wish to make modifications to the ANSI sequence parser. If not, comment out its call in `build_parser.sh`. The `.rl` file is the actual source, the `.c` is generated. -- Install Ruby and then the `sass` package with `gem install sass` (or try some other implementation, such as - `sassc`) +- Install dependencies of the front-end submodule (`yarn install` in the front-end folder, installed PHP) - Make sure your `esphttpdconfig.mk` is set up properly - link to the SDK etc. The IoT SDK is now included in the project due to problems with obtaining the correct version and patching it. @@ -131,24 +131,23 @@ than welcome! ### Web resources -The web resources are in `html_orig`. To prepare for a build, run `build_web.sh`, which packs them and -copies over to `html`. The compression and minification is handled by scripts in libesphttpd, specifically, -it runs yuicompressor on js and css and gzip or heatshrink on the other files. The `html` folder is -then embedded in the firmware image. +The web resources are in the `front-end` git submodule. To prepare the web resources for a build, +run `make web`. The resulting files are copied to `html/`. The `html/` folder is then embedded in the firmware image. It's kind of tricky to develop the web resources locally; you might want to try the "split image" Makefile option, then you can flash just the html portion with `make htmlflash`. I haven't tried this. -For local development, use the `server.sh` script in `html_orig`. It's possible to talk to API of a running -ESP8266 from here, if you configure `_env.php` with its IP. +For local development, use the `server.sh` script in `html_orig` (more details in the front-end repo's readme). +It's possible to talk to the API endpoints of a running ESP8266 from a page served by your local server +if you configure `_env.php` with its IP. ### Flashing -The Makefile should automatically build the parser and web resources for you when you run `make`. -Sometimes it does not, particularly with `make -B`. Try just plain `make`. You can always run those -build scripts manually, too. +The Makefile should automatically build the parser and web resources for you when you run `make`. +The web resources are normally no re-built, because the build process is quite slow. To manually rebuild them, +run `make web` before `make`. -To flash, just run `make flash`. +To flash, just run `make flash`. It will use parameters you setup in the `esphttpdconfig.mk` file. [releases]: https://github.com/MightyPork/esp-vt100-firmware/releases [httpdlib]: https://github.com/MightyPork/libesphttpd diff --git a/build_demo.sh b/build_demo.sh deleted file mode 100755 index 158ef7c..0000000 --- a/build_demo.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -echo "-- Preparing WWW files --" - -[[ -e html_demo ]] && rm -r html_demo -mkdir -p html_demo/img -mkdir -p html_demo/js -mkdir -p html_demo/css - -cd html_orig -sh ./packjs.sh -ESP_DEMO=1 php ./build_html.php -cd .. - -cp html_orig/js/app.js html_demo/js/ - -sass html_orig/sass/app.scss html_demo/css/app.css -rm html_demo/css/app.css.map - -cp html_orig/img/* html_demo/img/ -cp html_orig/favicon.ico html_demo/favicon.ico - -# cleanup -find html_demo/ -name "*.orig" -delete -find html_demo/ -name "*.xcf" -delete -find html_demo/ -name "*~" -delete diff --git a/build_web.sh b/build_web.sh index 72ad0eb..3366a17 100755 --- a/build_web.sh +++ b/build_web.sh @@ -3,24 +3,9 @@ echo "-- Preparing WWW files --" [[ -e html ]] && rm -r html -mkdir -p html/img -mkdir -p html/js -mkdir -p html/css -cd html_orig -sh ./packjs.sh -php ./build_html.php -cd .. +ESP_PROD=1 front-end/build.sh -cp html_orig/js/app.js html/js/ +echo "Copying from submodule..." -sass html_orig/sass/app.scss html/css/app.css -rm html/css/app.css.map - -cp html_orig/img/* html/img/ -cp html_orig/favicon.ico html/favicon.ico - -# cleanup -find html/ -name "*.orig" -delete -find html/ -name "*.xcf" -delete -find html/ -name "*~" -delete +cp -r front-end/out html diff --git a/demo_deploy.sh b/demo_deploy.sh deleted file mode 100755 index cb1872c..0000000 --- a/demo_deploy.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -./build_demo.sh - -cp -r html_demo/* ../espterm.github.io/ - -cd ../espterm.github.io/ - -echo "Enter to deploy (^C to abort):" -read - -git add --all -git commit -m "Deploy updates" -git push diff --git a/esp_iot_sdk_v1.5.2/include/osapi.h b/esp_iot_sdk_v1.5.2/include/osapi.h index 5cac8dd..9b352b2 100755 --- a/esp_iot_sdk_v1.5.2/include/osapi.h +++ b/esp_iot_sdk_v1.5.2/include/osapi.h @@ -35,9 +35,9 @@ #define os_snprintf ets_snprintf #ifdef USE_OPTIMIZE_PRINTF -#define os_printf(fmt, ...) do { \ - static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \ - os_printf_plus(flash_str, ##__VA_ARGS__); \ +#define os_printf(fmt, ...) do { \ + static const char flash_str[] ICACHE_RODATA_ATTR STORE_ATTR = fmt; \ + os_printf_plus(flash_str, ##__VA_ARGS__); \ } while(0) #else #define os_printf os_printf_plus diff --git a/esphttpdconfig.mk b/esphttpdconfig.mk index 981ec4e..a46fa85 100644 --- a/esphttpdconfig.mk +++ b/esphttpdconfig.mk @@ -18,7 +18,7 @@ GZIP_COMPRESSION = yes # This option works only when GZIP_COMPRESSION is set to "yes" # http://yui.github.io/yuicompressor/ #Disabled by default. -COMPRESS_W_YUI = yes +COMPRESS_W_YUI = no YUI-COMPRESSOR = /usr/bin/yui-compressor @@ -44,14 +44,20 @@ ADMIN_PASSWORD = "19738426" GLOBAL_CFLAGS = \ -DDEBUG_ROUTER=0 \ -DDEBUG_CAPTDNS=0 \ - -DDEBUG_HTTP=1 \ + -DDEBUG_HTTP=0 \ -DDEBUG_ESPFS=0 \ + -DDEBUG_PERSIST=0 \ + -DDEBUG_UTFCACHE=0 \ + -DDEBUG_CGI=0 \ + -DDEBUG_WIFI=0 \ -DDEBUG_WS=0 \ -DDEBUG_ANSI=1 \ -DDEBUG_ANSI_NOIMPL=1 \ + -DDEBUG_INPUT=0 \ + -DDEBUG_HEAP=1 \ + -DDEBUG_MALLOC=0 \ -DHTTPD_MAX_BACKLOG_SIZE=8192 \ -DHTTPD_MAX_HEAD_LEN=1024 \ -DHTTPD_MAX_POST_LEN=512 \ - -DDEBUG_INPUT=0 \ - -DDEBUG_HEAP=1 \ - -DDEBUG_MALLOC=0 + -mforce-l32 \ + -DUSE_OPTIMIZE_PRINTF=1 diff --git a/front-end b/front-end new file mode 160000 index 0000000..b2174fc --- /dev/null +++ b/front-end @@ -0,0 +1 @@ +Subproject commit b2174fc528d2766eb82d1e828d70bb432d4ea949 diff --git a/html_orig/.gitignore b/html_orig/.gitignore deleted file mode 100644 index 0a0f73a..0000000 --- a/html_orig/.gitignore +++ /dev/null @@ -1 +0,0 @@ -pages/_test_env.php diff --git a/html_orig/_debug_replacements.php b/html_orig/_debug_replacements.php deleted file mode 100644 index 1aca8dc..0000000 --- a/html_orig/_debug_replacements.php +++ /dev/null @@ -1,86 +0,0 @@ - ESP_DEMO ? 'ESPTerm Web UI Demo' : 'ESPTerm local debug', - - 'btn1' => 'OK', - 'btn2' => 'Cancel', - 'btn3' => '', - 'btn4' => '', - 'btn5' => 'Help', - 'bm1' => '01,'.ord('y'), - 'bm2' => '01,'.ord('n'), - 'bm3' => '', - 'bm4' => '', - 'bm5' => '05', - 'labels_seq' => ESP_DEMO ? 'TESPTerm Web UI DemoOKCancelHelp' : 'TESPTerm local debugOKCancelHelp', - - 'parser_tout_ms' => 10, - 'display_tout_ms' => 15, - 'display_cooldown_ms' => 35, - 'fn_alt_mode' => '1', - - 'opmode' => '2', - 'sta_enable' => '1', - 'ap_enable' => '1', - - 'tpw' => '60', - 'ap_channel' => '7', - 'ap_ssid' => 'TERM-027451', - 'ap_password' => '', - 'ap_hidden' => '0', - - 'sta_ssid' => 'Cisco', - 'sta_password' => 'Passw0rd!', - 'sta_active_ip' => ESP_DEMO ? '192.168.82.66' : '192.168.0.19', - 'sta_active_ssid' => 'Cisco', - - 'vers_fw' => $vers, - 'date' => date('Y-m-d'), - 'time' => date('G:i'), - 'vers_httpd' => '0.4', - 'vers_sdk' => '010502', - 'githubrepo' => 'https://github.com/MightyPork/esp-vt100-firmware', - - 'ap_dhcp_time' => '120', - 'ap_dhcp_start' => '192.168.4.100', - 'ap_dhcp_end' => '192.168.4.200', - 'ap_addr_ip' => '192.168.4.1', - 'ap_addr_mask' => '255.255.255.0', - - 'sta_dhcp_enable' => '1', - 'sta_addr_ip' => '192.168.0.33', - 'sta_addr_mask' => '255.255.255.0', - 'sta_addr_gw' => '192.168.0.1', - - 'sta_mac' => '5c:cf:7f:02:74:51', - 'ap_mac' => '5e:cf:7f:02:74:51', - - 'term_width' => '80', - 'term_height' => '25', - 'default_bg' => '0', - 'default_fg' => '7', - 'show_buttons' => '1', - 'show_config_links' => '1', - - 'uart_baud' => 115200, - 'uart_stopbits' => 1, - 'uart_parity' => 2, - - 'theme' => 0, -]; diff --git a/html_orig/_env.php b/html_orig/_env.php deleted file mode 100644 index 4d38f09..0000000 --- a/html_orig/_env.php +++ /dev/null @@ -1,3 +0,0 @@ - $key, - 'bodyclass' => $bc, - 'path' => $path, - 'icon' => $icon ? "icn-$icon" : '', - 'label' => tr("menu.$key"), - 'title' => $titleKey ? tr($titleKey) : tr("menu.$key"), - ]; - } -} - -pg('cfg_term', 'cfg', 'terminal', '/cfg/term'); -pg('term_set', 'api', '', '/cfg/term/set'); - -pg('cfg_wifi', 'cfg', 'wifi', '/cfg/wifi'); -pg('cfg_wifi_conn', '', '', '/cfg/wifi/connecting'); -pg('wifi_connstatus', 'api', '', '/cfg/wifi/connstatus'); -pg('wifi_set', 'api', '', '/cfg/wifi/set'); -pg('wifi_scan', 'api', '', '/cfg/wifi/scan'); - -pg('cfg_network', 'cfg', 'network', '/cfg/network'); -pg('network_set', 'api', '', '/cfg/network/set'); - -pg('cfg_system', 'cfg', 'configure', '/cfg/system'); -pg('system_set', 'api', '', '/cfg/system/set'); - -pg('write_defaults', 'api', '', '/cfg/system/write_defaults'); -pg('restore_defaults', 'api', '', '/cfg/system/restore_defaults'); -pg('restore_hard', 'api', '', '/cfg/system/restore_hard'); - -pg('help', 'cfg page-help', 'help', '/help'); -pg('about', 'cfg page-about', 'about', '/about'); -pg('term', 'term', '', '/', 'title.term'); - -pg('reset_screen', 'api', '', '/system/cls', 'title.term'); - -pg('index', 'api', '', '/', ''); - -// ajax API - -return $pages; diff --git a/html_orig/base.php b/html_orig/base.php deleted file mode 100644 index 592450a..0000000 --- a/html_orig/base.php +++ /dev/null @@ -1,177 +0,0 @@ -_env.php.example to _env.php and check the settings inside!"); -} - -require_once __DIR__ . '/_env.php'; - -$prod = defined('STDIN'); -define('DEBUG', !$prod); -$root = DEBUG ? json_encode(ESP_IP) : 'location.host'; -define('JS_WEB_ROOT', $root); - -define('ESP_DEMO', (bool)getenv('ESP_DEMO')); -if (ESP_DEMO) { - define('DEMO_SCREEN', '"S\u0019\u0001Q\u0001\u0017\u0001K\u0001\u0015\u0004\u0003\b\u0001 \u0002P\u0001┌ESPTerm─Demo─\u0002\u0002\u0001\u0003\u0002\u000131\u0003\u0003\u000132\u0003\u0004\u00013\u0002\u0002\u0001\u0003\u0005\u000134\u0003\u0006\u000135\u0003\u0007\u000136\u0003\b\u000137\u0003\t\u000190\u0003\n\u000191\u0003\u000b\u000192\u0003\f\u000193\u0003\r\u000194\u0003\u000e\u000195\u0003\u000f\u000196\u0003\u0010\u000197\u0003\b\u0001─\u0002\r\u0001┐ \u0002\u0015\u0001│ \u00029\u0001│ \u0002\u0004\u0001│\u0002\t\u0001 \u0002\b\u0001│\u0004\u0002\u0001Bold \u0004\u0003\u0001F\u0004\u0003\u0001a\u0004\u0003\u0001i\u0004\u0003\u0001n\u0004\u0003\u0001t\u0004\u0003\u0001 \u0004\u0005\u0001I\u0004\u0005\u0001t\u0004\u0005\u0001a\u0004\u0005\u0001l\u0004\u0005\u0001i\u0004\u0005\u0001c\u0004\u0005\u0001 \u0004\t\u0001U\u0004\t\u0001n\u0004\t\u0001d\u0004\t\u0001e\u0004\t\u0001r\u0004\t\u0001l\u0004\t\u0001i\u0004\t\u0001n\u0004\t\u0001e\u0004\u0001\u0001 \u0004\u0011\u0001B\u0004\u0011\u0001l\u0004\u0011\u0001i\u0004\u0011\u0001n\u0004\u0011\u0001k\u0004\u0011\u0001 \u0001q\u0001\u0001Inverse\u0003\b\u0001 \u0004A\u0001S\u0004A\u0001t\u0004A\u0001r\u0004A\u0001i\u0004A\u0001k\u0004A\u0001e\u0004\u0001\u0001 \u0004!\u0001F\u0004!\u0001r\u0004!\u0001a\u0004!\u0001k\u0004!\u0001t\u0004!\u0001u\u0004!\u0001r\u0004\u0001\u0001 │ \u0002\u0002\u0001─\u0002\u0002\u0001\u0003\n\u0002 \u0002\t\u0001\u0003\b\u0001─\u0002\u0002\u0001 \u0002\u0006\u0001│ \u00029\u0001│ \u0002\u0002\u0001─\u0002\u0002\u0001\u0003\n\u0002 \u0003\u0002\u0002ESP826\u0002\u0002\u0001\u0003\n\u0002 \u0003\b\u0001─\u0002\u0002\u0001 \u0002\u0006\u0001└─\u00029\u0001┤ \u0002\u0002\u0001─\u0002\u0002\u0001\u0003\n\u0002 \u0002\t\u0001\u0003\b\u0001─\u0002\u0002\u0001 \u0002@\u0001│ \u0002\u0002\u0001─\u0002\u0002\u0001\u0003\n\u0002 \u0003\u0002\u0002(@)#\u0002\u0004\u0001\u0003\n\u0002 \u0003\b\u0001─\u0002\u0002\u0001 \u0002\u0007\u0001\u0003O\u0001 This is a static demo of the ESPTerm Web Interface \u0002\u0004\u0001\u0003\b\u0001 \u0002\u0002\u0001│ \u0002\u0002\u0001─\u0002\u0002\u0001\u0003\n\u0002 \u0002\t\u0001\u0003\b\u0001─\u0002\u0002\u0001 \u0002\u0007\u0001\u0003O\u0001 \u00027\u0001\u0003\b\u0001 \u0002\u0002\u0001│ \u0002\u0004\u0001│\u0002\t\u0001 \u0002\t\u0001\u0003O\u0001 Try the links beneath this scre\u0002\u0002\u0001n to browse the menu. \u0003\b\u0001 \u0002\u0002\u0001♦ \u0002\u0016\u0001\u0003O\u0001 \u00027\u0001\u0003\b\u0001 \u0002\u0019\u0001\u0003O\u0001 <°)\u0002\u0003\u0001>< ESPTerm ful\u0002\u0002\u0001y sup\u0002\u0002\u0001orts UTF-8 お は よ ー \u0002\u0002\u0001><(\u0002\u0003\u0001°> \u0003\b\u0001 \u0002\u0019\u0001\u0003O\u0001 \u00027\u0001\u0003\b\u0001 \u0002i\u0001\u0003\u000b\u0001Other interesting features:\u0003\b\u0001 \u0002\u0018\u0001↓ \u0002n\u0001\u0003\u0003\u0001- Almost ful\u0002\u0002\u0001 VT10\u0002\u0002\u0001 emulation \u0003\b\u0001 \u0003\u0006\u0001()\u0003\b\u0001 \u0003\u0006\u0001()\u0003\b\u0001 \u0002\b\u0001Funguje tu čeština! \u0002\u0011\u0001\u0003\u0005\u0001- Xterm-like mouse tracking\u0003\b\u0001 \u0002\u0003\u0001=\u0002\u0002\u0001\u0003\t\u0002°.°\u0003\b\u0001=\u0002\u0002\u0001 \u0003\u0006\u0001<-\u0002\u0003\u0001, \u0003\b\u0001 \u0002$\u0001\u0003\u0004\u0001- File upload utility\u0003\b\u0001 \u0002\n\u0001\'\u0002\u0002\u0001 \'\u0002\u0002\u0001 \u0002\u0002\u0001\u0003\u0006\u0001 \u0002\u0004\u0001mouse\u0003\b\u0001 \u0002!\u0001\u0003\u0002\u0001- User-friendly config interface\u0003\b\u0001 \u00020\u0001\u0003\u000e\u0001-\u0003\u0002\u0001 \u0003\u000e\u0001Advanced WiFi & network set\u0002\u0002\u0001ings\u0003\b\u0001 \u0002\u0011\u0001\u0003\f\u0001Try ESPTerm today!\u0003\b\u0001 \u0002\u000b\u0001- Built-in help page \u0002\u001a\u0001\u0003\u0007\u0001-\u0002\u0002\u0001>\u0003\b\u0001 \u0002\u0002\u0001\u0003\f\u0001Pre-built binaries\u0003\b\u0001 \u0003\f\u0001are\u0003\b\u0001 \u0002\"\u0001\u0003\u0007\u0001link on the About page \u0002\u0002\u0001\u0003\f\u0001available on GitHub! \u0003\b\u0001 \u0002U\u0001"'); - define('DEMO_APS', <<path; - - if (DEBUG) return "/index.php?page=$name"; - if (ESP_DEMO) return "$name.html"; - else return $_pages[$name]->path; -} - -/** URL label for a button */ -function label($name) -{ - global $_pages; - return $_pages[$name]->label; -} - -function e($s) -{ - return htmlspecialchars($s, ENT_HTML5 | ENT_QUOTES); -} - -function je($s) -{ - return htmlspecialchars(json_encode($s), ENT_HTML5); -} - - -function tr($key) -{ - global $_messages; - return isset($_messages[$key]) ? $_messages[$key] : ('??' . $key . '??'); -} - -/** Like eval, but allows */ -function include_str($code) -{ - $tmp = tmpfile(); - $tmpf = stream_get_meta_data($tmp); - $tmpf = $tmpf ['uri']; - fwrite($tmp, $code); - $ret = include($tmpf); - fclose($tmp); - return $ret; -} - -if (!function_exists('utf8')) { - function utf8($num) - { - if($num<=0x7F) return chr($num); - if($num<=0x7FF) return chr(($num>>6)+192).chr(($num&63)+128); - if($num<=0xFFFF) return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); - if($num<=0x1FFFFF) return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128).chr(($num&63)+128); - return ''; - } -} - -if (!function_exists('load_esp_charsets')) { - function load_esp_charsets() { - $chsf = __DIR__ . '/../user/character_sets.h'; - $re_table = '/\/\/ %%BEGIN:(.)%%\s*(.*?)\s*\/\/ %%END:\1%%/s'; - preg_match_all($re_table, file_get_contents($chsf), $m_tbl); - - $re_bounds = '/#define CODEPAGE_(.)_BEGIN\s+(\d+)\n#define CODEPAGE_\1_END\s+(\d+)/'; - preg_match_all($re_bounds, file_get_contents($chsf), $m_bounds); - - $cps = []; - - foreach ($m_tbl[2] as $i => $str) { - $name = $m_tbl[1][$i]; - $start = intval($m_bounds[2][$i]); - $table = []; - $str = preg_replace('/,\s*\/\/[^\n]*/', '', $str); - $rows = explode("\n", $str); - $rows = array_map('trim', $rows); - - foreach($rows as $j => $v) { - if (strpos($v, '0x') === 0) { - $v = substr($v, 2); - $v = hexdec($v); - } else { - $v = intval($v); - } - $ascii = $start+$j; - $table[] = [ - $ascii, - chr($ascii), - utf8($v==0? $ascii :$v), - ]; - } - $cps[$name] = $table; - } - return $cps; - } -} - -if (!function_exists('tplSubs')) { - function tplSubs($str, $reps) - { - return preg_replace_callback('/%(j:|js:|h:|html:)?([a-z0-9-_.]+)%/i', function ($m) use ($reps) { - $key = $m[2]; - if (array_key_exists($key, $reps)) { - $val = $reps[$key]; - } else { - $val = ''; - } - switch ($m[1]) { - case 'j:': - case 'js:': - $v = json_encode($val); - return substr($v, 1, strlen($v) - 2); - case 'h:': - case 'html:': - return htmlspecialchars($val); - default: - return $val; - } - }, $str); - } -} diff --git a/html_orig/build_html.php b/html_orig/build_html.php deleted file mode 100755 index 78f3aea..0000000 --- a/html_orig/build_html.php +++ /dev/null @@ -1,50 +0,0 @@ -/Uis'; - $s = preg_replace($pattern, '', $s); - - $pattern = '/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(? $p) { - if ($p->bodyclass == 'api') { - if (ESP_DEMO) { - $target = 'term.html'; - echo "Generating: ~$_k.html -> $target\n"; - $s = ""; - } else { - continue; - } - } else { - echo "Generating: $_k ($p->title)\n"; - - $_GET['page'] = $_k; - ob_flush(); // print the message - ob_clean(); // clean up - include(__DIR__ . '/index.php'); - $s = ob_get_contents(); // grab the output - - // remove newlines and comments - // as tests have shown, it saves just a couple kilobytes, - // making it not a very big improvement at the expense of ugly html. - // $s = process_html($s); - ob_clean(); - } // clean up - $of = $dest . $_k . ((in_array($_k, $no_tpl_files)||ESP_DEMO) ? '.html' : '.tpl'); - file_put_contents($of, $s); // write to a file -} - -ob_flush(); diff --git a/html_orig/css/app.css b/html_orig/css/app.css deleted file mode 100644 index a25946a..0000000 --- a/html_orig/css/app.css +++ /dev/null @@ -1,1810 +0,0 @@ -@charset "UTF-8"; -/* normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -*, *:before, *:after { - box-sizing: border-box; } - -html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/** - * Remove default margin. - */ -body { - margin: 0; } - -/* HTML5 display definitions - ========================================================================== */ -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -figure, -nav - { - display: block; } - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -canvas, -progress - { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ } - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden] - { - display: none; } - -/* Links - ========================================================================== */ -/** - * Remove the gray background color from active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ -a:active, -a:hover { - outline: 0; } - -/* Text-level semantics - ========================================================================== */ -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b - { - font-weight: bold; } - -/** - * Address styling not present in Safari and Chrome. - */ -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -h2 { - font-size: 2em; - margin: 0.67em 0; } - -/** - * Address styling not present in IE 8/9. - */ -/** - * Address inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; } - -/** - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; } - -/* Grouping content - ========================================================================== */ -/** - * Address margin not present in IE 8/9 and Safari. - */ -/** - * Address differences between Firefox and other browsers. - */ -hr { - box-sizing: content-box; - height: 0; } - -/** - * Contain overflow in all browsers. - */ -pre { - overflow: auto; } - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ -code, -pre - { - font-family: "DejaVu Sans Mono", "Inconsolata", monospace; - font-size: 1em; } - -/* Forms - ========================================================================== */ -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ -button, -input, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ } - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ -button { - overflow: visible; } - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ -button, -select { - text-transform: none; } - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ -button, -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ } - -/** - * Re-set default cursor for disabled elements. - */ -button[disabled], -html input[disabled] { - cursor: default; } - -/** - * Remove inner padding and border in Firefox 4+. - */ -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ -input { - line-height: normal; } - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -/** - * Define consistent border, margin, and padding. - */ -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ -legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ -textarea { - overflow: auto; } - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -/* Tables - ========================================================================== */ -/** - * Remove most spacing between table cells. - */ -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -/* Fontello data, processed by the unpack script. */ -@font-face { - font-family: 'fontello'; - src: url("data:application/octet-stream;base64,d09GRgABAAAAABwwAA8AAAAALWAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABWAAAADsAAABUIIslek9TLzIAAAGUAAAAQwAAAFZ5SGGnY21hcAAAAdgAAADOAAACfqqIBupjdnQgAAACqAAAABQAAAAgBzn/aGZwZ20AAAK8AAAFkAAAC3CKkZBZZ2FzcAAACEwAAAAIAAAACAAAABBnbHlmAAAIVAAAEJcAABisQO7I82hlYWQAABjsAAAAMwAAADYPIludaGhlYQAAGSAAAAAgAAAAJAfeBB5obXR4AAAZQAAAADAAAABEPw3/8WxvY2EAABlwAAAAJAAAACQwdjUqbWF4cAAAGZQAAAAgAAAAIAGBDbpuYW1lAAAZtAAAAXcAAALNzJ0dH3Bvc3QAABssAAAAhwAAALfQo2W7cHJlcAAAG7QAAAB6AAAAhuVBK7x4nGNgZGBg4GIwYLBjYHJx8wlh4MtJLMljkGJgYYAAkDwymzEnMz2RgQPGA8qxgGkOIGaDiAIAJjsFSAB4nGNgZN7KOIGBlYGBqYppDwMDQw+EZnzAYMjIBBRlYGVmwAoC0lxTGByUNf7/Z275P4chirmFIQUozAiSAwAHmwy/AHic5ZExbgIxEEXfhN0lEEgoUC6AZFOk4SxcgZoT7EW4ARVN+pwhl0BCVEhs0sL3TDrICRjr2fK3NB79D9RAT3yICmyHUWor1VzvMXS9otX9nYmUZjZPdWrTJk/zMq/y+mCn4+UC/+l3ytTrdhX9ST9UmqyhzzMD/7+52+OxauT7999tUtwOSlKpDuQeqQ1KsmkTlHTzNCip52Ugl8mrQH6T14Gc52CBMuB0DJSGnccOvGDdwinTWfflgN67vQOvOn8deMN+Ph3NfwU+yDYDAAB4nGNgQAMSEMjc8n8OCAMAFYwEpXicrVZpd9NGFB15SZyELCULLWphxMRpsEYmbMGACUGyYyBdnK2VoIsUO+m+8Ynf4F/zZNpz6Dd+Wu8bLySQtOdwmpOjd+fN1czbZRJaktgL65GUmy/F1NYmjew8CemGTctRfCg7eyFlisnfBVEQrZbatx2HREQiULWusEQQ+x5ZmmR86FFGy7akV03KLT3pLlvjQb1V334aOsqxO6GkZjN0aD2yJVUYVaJIpj1S0qZlqPorSSu8v8LMV81QwohOImm8GcbQSN4bZ7TKaDW24yiKbLLcKFIkmuFBFHmU1RLn5IoJDMoHzZDyyqcR5cP8iKzYo5xWsEu20/y+L3mndzk/sV9vUbbkQB/Ijuzg7HQlX4RbW2HctJPtKFQRdtd3QmzZ7FT/Zo/ymkYDtysyvdCMYKl8hRArP6HM/iFZLZxP+ZJHo1qykRNB62VO7Es+gdbjiClxzRhZ0N3RCRHU/ZIzDPaYPh788d4plgsTAngcy3pHJZwIEylhczRJ2jByYCVliyqp9a6YOOV1WsRbwn7t2tGXzmjjUHdiPFsPHVs5UcnxaFKnmUyd2knNoykNopR0JnjMrwMoP6JJXm1jNYmVR9M4ZsaERCICLdxLU0EsO7GkKQTNoxm9uRumuXYtWqTJA/Xco/f05la4udNT2g70s0Z/VqdiOtgL0+lp5C/xadrlIkXp+ukZfkziQdYCMpEtNsOUgwdv/Q7Sy9eWHIXXBtju7fMrqH3WRPCkAfsb0B5P1SkJTIWYVYhWQGKta1mWydWsFqnI1HdDmla+rNMEinIcF8e+jHH9XzMzlpgSvt+J07MjLj1z7UsI0xx8m3U9mtepxXIBcWZ5TqdZlu/rNMfyA53mWZ7X6QhLW6ejLD/UaYHlRzodY3lBC5p038GQizDkAg6QMISlA0NYXoIhLBUMYbkIQ1gWYQjLJRjC8mMYwnIZhrC8rGXV1FNJ49qZWAZsQmBijh65zEXlaiq5VEK7aFRqQ54SbpVUFM+qf2WgXjzyhjmwFkiXyJpfMc6Vj0bl+NYVLW8aO1fAsepvH472OfFS1ouFPwX/1dZUJb1izcOTq/Abhp5sJ6o2qXh0TZfPVT26/l9UVFgL9BtIhVgoyrJscGcihI86nYZqoJVDzGzMPLTrdcuan8P9NzFCFlD9+DcUGgvcg05ZSVnt4KzV19uy3DuDcjgTLEkxN/P6VvgiI7PSfpFZyp6PfB5wBYxKZdhqA60VvNknMQ+Z3iTPBHFbUTZI2tjOBIkNHPOAefOdBCZh6qoN5E7hhg34BWFuwXknXKJ6oyyH7kXs8yik/Fun4kT2qGiMwLPZG2Gv70LKb3EMJDT5pX4MVBWhqRg1FdA0Um6oBl/G2bptQsYO9CMqdsOyrOLDxxb3lZJtGYR8pIjVo6Of1l6iTqrcfmYUl++dvgXBIDUxf3vfdHGQyrtayTJHbQNTtxqVU9eaQ+NVh+rmUfW94+wTOWuabronHnpf06rbwcVcLLD2bQ7SUiYX1PVhhQ2iy8WlUOplNEnvuAcYFhjQ71CKjf+r+th8nitVhdFxJN9O1LfR52AM/A/Yf0f1A9D3Y+hyDS7P95oTn2704WyZrqIX66foNzBrrblZugbc0HQD4iFHrY64yg18pwZxeqS5HOkh4GPdFeIBwCaAxeAT3bWM5lMAo/mMOT7A58xh0GQOgy3mMNhmzhrADnMY7DKHwR5zGHzBnHWAL5nDIGQOg4g5DJ4wJwB4yhwGXzGHwdfMYfANc+4DfMscBjFzGCTMYbCv6dYwzC1e0F2gtkFVoANTT1jcw+JQU2XI/o4Xhv29Qcz+wSCm/qjp9pD6Ey8M9WeDmPqLQUz9VdOdIfU3Xhjq7wYx9Q+DmPpMvxjLZQa/jHyXCgeUXWw+5++J9w/bxUC5AAEAAf//AA94nMVYfYxc1XW/536+r3lvPt68t96dmd2d2Z1Z765n7dn5MLv2MvhrF3vsmvXa7CKwt3zFxdimrsEqkSkyVgQB4TRSCCXE2MEOFSqUkNCkbYL6B5AoUVVoI+M0jdRCqpqoQmrlqIja4577Zk1A9CPqH+183Hfvfeeee+65557zO5d4BD98JX2R2CQkBTJGJsk02UH2kH3kCHmInCDPkGfJN8ljzUdmgDKYJjnSI3I9u7vDtGcLEfiuxTkTfHFZImZy1hV3DE6B0d9MKQpJSUkGyGIvZLLZzCw+Mtl5ks1kW6dOvfzHzz936tlTz37t9DNPP/Xkl7544rFHPvfQg0fvP3L4tw/s23vHrXtuXtg1u33r5ukN101Nrh5f+lT6RHakkfZHIL8WqpNQ+Xi99LE6pP1Cv66P91cG/wua8NfoDz/J83+iqel2KtGfgIQvUYBiLVGtowjBObNm4m/GPGrib6bTomvMds404R2z/RWzbuJv6cU5Q7eM6aVW5/F2h6T9Tud54uoDOU5hZfrSHnZhqPfSnuzwcJadzg1/EI36XKfsDP3Jp7qe/FS9U0I66lr6vRYRme0dcLHt6L+eAy7mhofRfICQK5fYaXaI9JJa00p6FhoEoTC95aXM9vmmA0AouYdQ6tDre5oWNuhB7CN3LryS9UMmwhHwPUilfRfGQEnUWbWRKulysFGv9III2GnvhyudtPPvHzqBAyt/5PZC1wN2n3MUuvpoj+O93n7PseOgjh9XSYsbEL7uOWkx1A7D9pCI5HuXLbC1ZBWZak4OAxODWcoZnSacAeOwn2jTpvuIIIwLtogSEjqHApN5rJDW8lpYCAek6EZBXaryxVKxei3UgzAH45UpVqZ5qcJAog0US7VqvRemsD9H2cKGQ6d2Lb64houWTPDl962f2Lt9mJZbdx+8fWhrIhV+6PkwmphZ89TsjScPr4Mv6JLOXi9dvlWArE2UW3cdvqtVHhrcGl8RuB92pZIz10xtOHwSdS5xTWf4GPssMUiS9JD7yZ+QfyFPN//g/Z9Q7t51CxXGm9+9hxHx6h+dune2tbGQNYF882STUZhYQSX90oPUZmr6n35K3Y3HwN5ggWEK0xD7iaSKSrWfuISbLl8kpkHMOSJiQEAQVI0EOqe3VDFQi4TZNpsjjNnzxGZ26x/f/f4bz//ho5/ff/ftt960UK2MDKd8308lPa27ajEv/aBSF9WiC6GuMd2Vg0pdpX3pgVRBGPjKhfwY1vGrNVorFUtoFJE9TEGjOAZlwKNWxw1o6I1oaGX3YgO/ePaCXghCNJswSPsRx17IAR5cZBfosqB550suqA5LZIHccDA2kOV4BUeHyDxioOVJfHxssRSN/TWHwsW5++bwBy+Mrh6F4YlRWHqeN/iN0kn1cu5siItmOpCKx/ZKK5YK1/GY3M7FgBFTO4VhiF3K7tBZUjZTXVIxTQhIeZ2IiRt4V8KIyZ1Swp07pJWhG0Cks7Zjq1EGG1jWUjt2KCvLqnHgw0YikQk5XU8zJnYvUQ8bETX/b4nhC5N6HXPvZkfpUC+efbqAxeTw8F9+BmVxU2HPoHR4Yh2v2HJNT8xAgZwK51s8IYxRpyuIgaH2io8oRRwpLWNNd0Rpr9KUXObSsZ6UQ432X20zDc+91qV0qGcQwK7CEKXY9gxzm2nGY/pNzqyiEQ6FUNKvYnGTjuO7zqiSfuVUS51BJg4yPhpkA5Q+GmREvosQdpb+kKRJttntoZVjjKNAD+IrOIgv7/RDv+OjlDYciI4+GlxUBOxsvN0XH423f+F5LXyegQNYtuJ0JsAXngdB1IyfhYPxeMsj7Mpl9EV70Bd5pEE2kJnmxuUgmAkUnST6I8rQMe0nTFAm9hFFKFd0Ef1S5/AB7vMcSijniQTZSudGUkGxWDBEZmSwVi3icZFZ8AM8BvVUtQyFvJIo43gFz0gFbVLi0cJYFb3XB2iKhehz82WKr/GQXLSMfYYVFSembl718LQZ28ylKXKDq4eDnsIaiF51JTNWznfePvTGhR8ckPd/9+KfPXD86jALfm/VXPlIzG5wVezJJdPdjrdu0McXybwdl92Zodl7Xzt8+LVf6GLJL19gUyRD+pu5RKR7ClrvTIcHIGE6ZiOAyHDhjwjUfanM0L820LeGKHsl0FsCF127fcazhvPdjx/Nz0yVU/5oc1Ph6OMPts9aWQu2e1a9vn3ws5+HruF82h8Y6obHfvlg+xtWNP+/0ifZfcQnK16BaPotLw1gyLK1YdyDbQcwYpkfmcLCt8KQimDEpIF2LpE1NDqG4NPH22/Dcsu6xc7Y7VttG05aOesWi/5d+3z77ahqwTP4hJO2fYuVI0u2R39Mv0MGSK7Zk18WV1yHTQxFVyOkn/F9LrpGBqPpoug4Fllg6aoZNjqzexAG9McdEzzTMTl8xn/V9rwzZ7yvBbpy9qz3aUKvrAkIR508jXtyHONKF8aVBtnSnElaaJQVoLwH0C6niUJ9KLIfiangdDeaJygBGAyYMU8Mw5nRAQpNVMbk9bVCLRUOpPrjJgI30Z/QPrRWaKC1lvrzUltjox+tdbwkEDCpfv1WF4iasD9Q6Y7/fgEuvhfk4NzjlmofUQ5aIjyirBPPPQe5vuDyexiI229h0RfQPUEfOMbP40EW7syFF04PKAscOaDHtH//uffbj0RkC31p+n5U+7Yyfu7Vl86lxggOfA/+jR7Z8pK5ff66NeR75M/JdxAEP0EexqDLcGUniMYzjPwt+RvUwQK5gawjU2Sc9JFlxNJHFk7Ck/AEPAaPwv1wL9wBtwEj/0D+njjIQcEO2ApDON7AM3wRfgpvwY/gL+BVWA3j2Ae6n0z3bHnJwvnXL83+MOoanQBKAzhS/B/IoDANeAJrGj5t6vn/U8TCQrQTzRqhTDGKwERJpuQ+Ig0mjX3EAGbAPjyqBxDgMEbm8EHYPNolI6zVUWNzgiPmo4LdQagSVKFjlaLDQ3R4iF/xEKLDQ+zCtYvNPf/LmRcWrlumTzich3Pwp/BtuBF2ke+T18kr5FvkG+RF8rvkPtQR4jjUBuDfwukwjUBHfNUnA4KUyhTUEPXUw6IGPNeCLNZ8VS3KWplrR6A9gj8Mfl7mVb1ULNSLpfEyLZV1N7oFxFZK4yoNq2QeKwhZSkWl/5WimoKCZloKNJSqV4LxoFqqRAQy1MQ4QQnZItdSUbdzGtkonEoGqgyloFTIa1zWqIYlqSqaFeKfogZLCiXAoVLlqN8IFA7DgaWiDMY1n14UqCF7GXpxqfnVkCpo1EtlWtNITuboOMpdyfFeFlQinB008toNpHMQ1mvIBQu9+mI9rNRxubgsX6YLde0SsV/llcuKKIJul7RcGPCquI6gjpxQ4KCRo6idekMj+ClAiFkrowoiTFmqIEUepUFYGeiyEdSLU5Bu1AtaRq3gSg0VwhD2oS+uIx7VPw9wZWnUVxl3zYNivaj1XpdpF9JlaKDggQa0oS8DeOHwG4euRk9IUQP9PWeJdAodFTUkwmrJuSUkBwNRAWMcPxjtKQJ0LpESDAdEBtMXigQuUGUiCaDVgUI/LWKM+W6KG4jTgQqTQsqUnAppMYOj8TNpIjdhYp7D0HuDq2yPxxlyxbzJ0A9kzDjlScEcB6enzrIeJoVICWbzmI0TSW5wk99Q4YJKwaDLQhkE13LilADUUirJlclxQupim7qUU+oZDFkzARwDIXIQjqLMYKYKpESgG+c+8kHmzMWMzBJGwqL4wYCDLcocRlEbKB8eRBvnoYbPDByg1y30fQMw4F3MZCgAi1FXqwOzUCpRBtQT58oQyuHYwARGRII4nCZxOBWuSalloKqkVMJ0rN/6ne0Y+GM4Pq3dhla0cPDM4we05BbuEEVVIxEKwm0PqGkBW7uEa7Bo/wwM5IbETNhIhiww/qhIr0ARAEvUKwe9ufjAOjW0WnUuinutmKEsxYUUjjYNXJpjolIELoElKHMN3c9M3FYmweUWshS4LIsrpcAUhjJQSUzrEs3BYszVrwUCSQybHmXambmoAC7xi0Ks+A2ud51Lz0IZBEd9+DYF2U0hRItjwmcsjjrmhjA42F0x4eCquWO43AXL9hW6T1Q57kWSWZybQlJmRQqmcSOp7RflsBB66q1EfceFp30xtXHR2ORdrukKE9AqUdWodDwmgnpoI1FSzgyBaYiBinSpZQns4LYptGngHuCaOR4IVIEEXB4O1PuORTuW3qnXLKkH+hygqqnFJHahdl1JNY22J81HZIyE6ZoO5XEV4Z932Wn6S/TIyzCW3aTxz8Lstmmkj+loR6dNUIY6SAxqHNQiYqaA/l7DNUEOEoHGjNmy0PBHyNbOuUJ2SyOfHMmkLMQ/g+jay2yK5kB8VAurRY3T0ZGiO1V+jjX0nUID02Cu8mXeyTTxj9klppihdkg6u4Q73Hx5AFXcV8kl4baPNea3XRfuGlos7exa14KB+uzm8u7y5tnV+Qfywea5u3ZVRmZu3taaSBVaXmbtTWtnb9qxeeLmyazX+llQHqIDlaFqng+Pdn2isX63I6Wze/2qmdEAfVT3UOuLhzeOTOV93FCrK796YOPh4wsrKs1rRsf8ZHkYrmmuWrGwpEuNqRjpJ6vIRnJDc9vIcCGPZwimY3rHDbqJWApNy+KLGO8xrrJFjImAiGA3bjIxTTKrn8ScJyYxW821q2thcTyRmkwk4ra+Cuyv9YvxRDW6FtC3CIUIQhYS47XOvZtiS4lRBDXHK3WxdDFXWrqY04HlHLygr7ZmHPFVtIZc2H4VwebMTF8a3kI4eQ5zmwhz6vL2XHg52YGaIqx7T8eDkXPn4KLRrZ6WDlwI+vqCC5fr0RNyL+u86GU91rr8oe6i7wd9Xe5XEXBq6H/lgysX2D+zCcx/CuTIKzltp5iB2IhYliPYUAdN9CIgDwptw5GxMXqbhl5sVgOOBayQrT3Nof+cNjLMT5AuNBPZbLaQLSRSiXwqEdQtnTjmMF65oFWCcexaGFc6CPfry5QSovLB8cR4gv0gmZQZPhBcejMY4Blr+OStz79s8CEYHTL4y8/furJ9qX3p669+YI0mn/K7u/2nVnbdfcw4cMA4du7iRSBXiLYFLHTeayE+nCCz5NHmw9NgG2NoBmkMIJjxAZ9OxKhtSMOW+zGjV1xnv/s97YK1L9ivUZLhWNpSMAbJRZ2AoAddjHCWzovJvItsSGtysr8fMzAyOTs529qycX3z2v6J/onq+IqR0qDdZ/d1L0slPVcKYoGVxNxyEM2hOgWB8mUDI3geY3d0CzlFA32Xg50aUuVdVuh0g47nS/1Udi6Gqo36QB+PuumkvR02jc7A7GMwPDOzKQisOTF67NjxETH3uJStYzvHFjet7qPmnNz85vm/vl5ir7rtfPvc7UqacyD3Qh+MQv4zYq4yaye7aCZuz345k8m47pyl5MhKWl0ulTX3pJhYDV35gS7sFZtn6baWwN4vi/l5evMuoUn3Hjq0V1NqW7ty5V0+hnmdR8bIyuaK6MahT0emaXRqDJPdjr9dxH0S8+jBHHJ9DWFM0Y/uPROdfE0l/GBc52tRsuajGpYOE2pP522NpUPFLljGpYei1IsdVc6m6mD7rWQcfK/9judDMtl+c6AO1UF2dLAKN8FbEWF7TCEyOH/5NPb5ZcRwQeAa+dF0fYDuGaxWyX8Aa1p+egB4nGNgZGBgAOJKz55N8fw2Xxm4mV8ARRiuXuM+A6P///g/hyWeuQXI5WBgAokCAH3+DiIAeJxjYGRgYG75P4eBgaXs/4//v1jiGYAiKEAQAKw6BwN4nGN+wcDAos/AwLwAiCOh7Bcg9v+/IJrpFJAtiCQGVcf84v8PljKQ+v//Ad4OES4AAAAAASIBcgHcA4ADuAQ+BH4EvgUIBYQJiAouCr4LNAv0DFYAAQAAABEB+AAPAAAAAAACAEAAUABzAAAArQtwAAAAAHicdZDdasIwGIbfzJ9tCtvYYKfL0VDG6g8MQRAEh55sJzI8HbXWtlIbSaPgbewedjG7iV3LXts4hrKWNM/35MuXrwFwjW8I5M8TR84CZ4xyPsEpepYL9M+Wi+QXyyVU8Wa5TP9uuYIHBJaruMEHK4jiOaMFPi0LXIlLyye4EHeWC/SPlovknuUSbsWr5TK9Z7mCiUgtV3EvvgZqtdVREBpZG9Rlu9nqyOlWKqoocWPprk2odCr7cq4S48excjy13PPYD9axq/fhfp74Oo1UIltOc69GfuJr1/izXfV0E7SNmcu5Vks5tBlypdXC94wTGrPqNhp/z8MACitsoRHxqkIYSNRo65zbaKKFDmnKDMnMPCtCAhcxjYs1d4TZSsq4zzFnlND6zIjJDjx+l0d+TAq4P2YVfbR6GE9IuzOizEv25bC7w6wRKcky3czOfntPseFpbVrDXbsuddaVxPCghuR97NYWNB69k92Koe2iwfef//sB5m6EUQB4nG3B2xKCIBQFULYhoF3tDxGOxkAcB3Cc/r6HXltLdOJnFP9N6HCCRA8FDYMBI8644Iob7nhgwlOYSJ+ZbfG9nXlvulBtXGhwnJew7oU6jvJFaVOes20kZ+uicjY7Sv1mayOdqR1colpDe+2z3qjUUJvxfOTE1ssjLME0Ku+QbRLiC5yHKXcAeJxj8N7BcCIoYiMjY1/kBsadHAwcDMkFGxlYnTYxMDJogRibuZgYOSAsPgYwi81pF9MBoDQnkM3utIvBAcJmZnDZqMLYERixwaEjYiNzistGNRBvF0cDAyOLQ0dySARISSQQbOZhYuTR2sH4v3UDS+9GJgYXAAx2I/QAAA==") format("woff"); } -[class^="icn-"]::before, [class*=" icn-"]::before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - -/* Fontello icon codes */ -/* Fontello classes */ -.icn-keyboard::before { - content: '\2328'; } - -.icn-about::before { - content: '\2605'; } - -.icn-restore::before { - content: '\267c'; } - -.icn-configure::before { - content: '\2699'; } - -.icn-ok::before { - content: '\2714'; } - -.icn-help::before { - content: '\2753'; } - -.icn-donate::before { - content: '\2764'; } - -.icn-back::before { - content: '\276e'; } - -.icn-cancel::before { - content: '\e801'; } - -.icn-paste::before { - content: '\f0ea'; } - -.icn-network::before { - content: '🌍'; } - -.icn-github::before { - content: '🐱'; } - -.icn-persist::before { - content: '💾'; } - -.icn-download::before { - content: '📥'; } - -.icn-wifi::before { - content: '📶'; } - -.icn-terminal::before { - content: '🖳'; } - -html { - box-sizing: border-box; } - -*, *::after, *::before { - box-sizing: inherit; } - -html { - font-family: Arial, sans-serif; - color: #D0D0D0; - background: #131315; } - -html, body { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; - width: 100%; - height: 100%; - overflow: hidden; } - -a, a:visited, a:link { - cursor: pointer; - color: #5abfff; - text-decoration: none; } - -a:hover { - color: #5abfff; - text-decoration: underline; } - -.hidden { - display: none !important; } - -[onclick] { - cursor: pointer; } - -ul > * { - padding-top: .3em; - padding-bottom: .3em; } - -ul { - margin-top: 0; - margin-bottom: 0; } - -/* Main outer container */ -#outer { - display: flex; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - flex-direction: row; } - -@media screen and (max-width: 544px) { - #outer { - display: block; - overflow-y: scroll; } } -#menu { - flex: 0 0 15rem; - background: #3983CD; } - #menu > * { - display: block; - text-decoration: none; - padding: 0.61805rem 1rem; - white-space: nowrap; - word-wrap: normal; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - #menu #brand { - cursor: pointer; - color: white; - background: #2b6aa8; - font-size: 120%; - text-align: center; - position: relative; - transition: none; - font-weight: bold; - margin-bottom: 1rem; } - @media screen and (max-width: 544px) { - #menu #brand { - background: #3983CD; - cursor: pointer; - margin-bottom: 0.38198rem; } - #menu #brand::after { - position: absolute; - color: rgba(0, 0, 0, 0.4); - right: 1rem; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } } - #menu.expanded #brand { - background: #2b6aa8; } - @media screen and (max-width: 544px) { - #menu.expanded #brand:after { - transform: translate(-25%, -50%) rotate(-90deg); } } - #menu a { - font-size: 130%; - color: white; - transition: background-color 0.2s; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.4); } - #menu a:hover, #menu a.selected { - background: #5badff; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.6); } - #menu a.selected { - position: relative; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } - #menu a:focus { - outline-color: #ff0099; } - #menu a::before { - vertical-align: -2px; - margin-left: 0; - margin-right: 15px; } - @media screen and (max-width: 544px) { - #menu a { - display: none; } - #menu a::before { - margin-left: 10px; } } - #menu.expanded a { - display: block; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #menu { - flex-basis: 10rem; } - #menu #brand { - font-size: 95%; - margin-bottom: 0.61805rem; } - #menu a { - font-size: 105%; } - #menu > * { - padding: 0.38198rem 0.61805rem; } } - -#content { - flex-grow: 1; - position: relative; - padding: 1rem; - overflow-y: auto; } - @media screen and (max-width: 544px) { - #content { - padding: 0.61805rem; } } - #content > * { - margin-left: auto; - margin-right: auto; } - #content h1 { - text-align: center; - font-size: 2.2807em; - margin-top: 0; - margin-bottom: 1rem; } - #content h2 { - font-size: 1.42383em; - margin-bottom: 0.61805rem; } - @media screen and (max-width: 544px) { - #content h1 { - font-size: 1.80203em; - margin-bottom: 0.61805rem; } - #content h2 { - font-size: 1.26563em; - margin-bottom: 0.61805rem; } } - #content td, #content th { - padding: 0.38198rem; } - #content tbody th { - text-align: right; - width: 160px; - color: white; } - -#content { - opacity: 0; - transition: opacity 0.15s ease-in; } - -#content.load { - opacity: 1; } - -#loader { - position: absolute; - right: 1.618rem; - top: 1.618rem; - transition: opacity .2s; - opacity: 0; } - @media screen and (max-width: 544px) { - #loader { - top: 1rem; - right: 1rem; } } - #loader.show { - opacity: 1; } - -.botpad { - display: block; - height: 5em; } - -.Box { - display: block; - max-width: 900px; - margin-top: 1rem; - padding: 0.61805rem 1rem; - border-radius: 3px; - background-color: rgba(255, 255, 255, 0.07); - box-shadow: 0 0 4px black; - border: 1px solid #4f4f4f; } - .Box::after { - content: ''; - display: block; - clear: both; } - @media screen and (max-width: 544px) { - .Box { - margin-top: 0.61805rem; } } - .Box h1, .Box h2 { - overflow: hidden; } - h1 + .Box { - margin-top: 0; } - .Box h2 { - margin-top: 0; - margin-bottom: 0 !important; } - .Box p:last-child { - margin-bottom: 0.5em; } - .Box.wide { - width: initial; - max-width: initial; } - .Box.medium { - max-width: 1200px; } - .Box.str { - position: relative; } - .Box.str .Row.buttons { - position: absolute; } - @media screen and (max-width: 544px) { - .Box.str .Row.buttons { - right: 1rem; - top: 1.8em; - margin: 1rem auto; } } - @media screen and (min-width: 545px) { - .Box.str .Row.buttons { - right: 0; - top: 0; - margin-top: 0.61805rem; } } - .Box.str.mobopen .Row.buttons { - top: 0; - margin-top: 0.61805rem; } - .Box .Row.explain { - display: block; - max-width: 600px; - margin-left: 0; - line-height: 1.2; } - @media screen and (max-width: 544px) { - .Box .Row.explain { - margin-top: 60px; } } - .Box .Row.explain.nomargintop { - margin-top: 12px !important; } - .Box.mobopen .Row.explain { - margin-top: 12px; } - @media screen and (max-width: 544px) { - .Box.mobopen .Row.explain { - margin-top: 18px; } } - -.Box.fold h2 { - position: relative; - cursor: pointer; - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.fold h2::after { - position: absolute; - right: 4px; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } -.Box.fold.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } -.Box.fold .Row { - display: none; } -.Box.fold.expanded .Row { - display: flex; } - .Box.fold.expanded .Row.v { - display: block; } - -@media screen and (max-width: 544px) { - .Box.fold h2, .Box.mobcol h2 { - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.fold.expanded h2::after, .Box.mobcol.expanded h2::after { - margin-bottom: 1rem; } - - .Box.mobcol h2 { - position: relative; - cursor: pointer; - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; } - .Box.mobcol h2::after { - position: absolute; - right: 4px; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } - .Box.mobcol.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } - .Box.mobcol .Row { - display: none; } - .Box.mobcol.expanded .Row { - display: flex; } - .Box.mobcol.expanded .Row.v { - display: block; } - .Box.mobcol #ap-box { - display: none; } - .Box.mobcol.expanded #ap-box { - display: block; } } -.Modal { - z-index: 100; - position: fixed; - width: 100%; - height: 100%; - left: 0; - top: 0; - right: 0; - bottom: 0; - display: flex; - justify-content: center; - align-items: center; - transition: opacity .5s; - background: rgba(0, 0, 0, 0.65); - opacity: 0; } - .Modal.visible { - opacity: 1; } - .Modal.hidden { - display: none; } - .Modal.light { - background: rgba(0, 0, 0, 0.25); } - @media screen and (max-width: 544px) { - .Modal { - flex-direction: column; - justify-content: flex-start; - overflow-y: auto; } - .Modal .Dialog { - margin-top: 0.61805rem !important; - flex-basis: unset; - flex-shrink: 0; } } - -.Dialog { - margin: 0.61805rem; - padding: 1rem; - overflow: hidden; - flex-basis: 35rem; - background: #242426; - border-left: 6px solid #2972ba; - border-right: 6px solid #2972ba; - box-shadow: 0 0 6px 0 black; - border-radius: 6px; } - .Dialog h1, .Dialog h2 { - margin-top: 0; } - .Dialog p:last-child { - margin-bottom: 0; } - -.NotifyMsg { - position: fixed; - top: 1.618rem; - right: 2.61792rem; - padding: 0.61805rem 1rem; - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transform: translateZ(0) scale(1, 1); - background: #3887d0; - color: white; - text-shadow: 0 0 2px black; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.6); - border-radius: 5px; - max-width: 80%; - transition: opacity .5s; - opacity: 0; } - .NotifyMsg.error { - background: #d03e42; } - @media screen and (max-width: 544px) { - .NotifyMsg { - width: calc(100% - 1rem); } } - .NotifyMsg.visible { - opacity: 1; } - .NotifyMsg.hidden { - display: none; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select, label.select-wrap { - width: 250px; } - -input[type="number"], input.short, select.short { - width: 125px; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select { - border: 0 none; - border-bottom: 2px solid #2972ba; - background-color: #3c3c3c; - color: white; - padding: 6px; - line-height: 1em; - font-weight: normal; } - input[type="number"]:focus, input[type="number"]:hover, input[type="password"]:focus, input[type="password"]:hover, input[type="text"]:focus, input[type="text"]:hover, textarea:focus, textarea:hover, select:focus, select:hover { - border-bottom-color: #2ea1f9; } - -.Row.checkbox { - line-height: 27px; } - .Row.checkbox .box { - overflow: hidden; - width: 27px; - height: 27px; - border: 1px solid #808080; - border-radius: 3px; - background: #3c3c3c; - display: inline-block; - position: relative; - cursor: pointer; - color: #2ea1f9; } - .Row.checkbox .box::before { - font-family: "fontello"; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - line-height: 25px; - text-align: center; - font-size: 20px; - vertical-align: middle; - display: none; } - .Row.checkbox .box::before { - content: "✔"; } - .Row.checkbox .box.checked::before { - display: block; } - -.Row.range .display { - margin-left: 1ex; } -.Row.range label .display { - font-weight: normal; } - -#psk-modal form > *, #wificonfbox form > * { - margin-right: 0.38198rem; } - #psk-modal form > *:last-child, #wificonfbox form > *:last-child { - margin-right: 0; } - -form { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; } - -.Box.errors .list { - color: crimson; - font-weight: bold; } -.Box.errors .lead { - color: white; } - -.Row { - vertical-align: middle; - margin: 12px auto; - text-align: left; - line-height: 1.35em; - display: flex; - flex-direction: row; - align-items: center; } - .Row:first-child { - margin-top: 0; } - .Row:last-child { - margin-bottom: 0; } - .Row.v { - display: block; } - .Row .aside { - float: right; - margin-left: 5px; - margin-bottom: 5px; } - @media screen and (max-width: 544px) { - .Row .aside { - margin: 0; - float: none; } } - .Row .spacer { - width: 160px; } - @media screen and (max-width: 544px) { - .Row .spacer { - display: none; } } - .Row.buttons, .Row.buttons2 { - margin: 16px auto; } - .Row.buttons input, .Row.buttons .button, .Row.buttons2 input, .Row.buttons2 .button { - margin-right: 0.61805rem; } - .Row.centered { - justify-content: center; } - .Row.message { - font-size: 1em; - text-shadow: 1px 1px 3px black; - text-align: center; } - .Row.message.error { - color: crimson; } - .Row.message.ok { - color: #0fe851; } - .Row.separator { - padding-top: 14px; - border-top: 2px solid rgba(255, 255, 255, 0.1); } - .Row textarea { - display: inline-block; - vertical-align: top; - min-height: 10rem; - flex-grow: 1; - resize: vertical; } - .Row label { - font-weight: bold; - color: white; - display: inline-block; - width: 160px; - text-align: right; - text-shadow: 1px 1px 3px black; - padding: 8px; - align-self: flex-start; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; - word-wrap: normal; } - .Row label.error { - color: crimson; } - .Row input[type="range"] { - width: 200px; } - @media screen and (max-width: 544px) { - .Row { - flex-direction: column; - margin: 6px auto; } - .Row.buttons, .Row.centered, .Row.checkbox { - flex-direction: row; } - .Row.buttons { - justify-content: center; } - .Row.buttons :last-child { - margin-right: 0; } - .Row label { - padding-left: 0; - text-align: left; - width: auto; } - .Row .checkbox-wrap { - order: 1; - text-align: left; - padding-bottom: 0; - border-radius: .4px; - width: auto; } - .Row .checkbox-wrap + label { - width: auto; } - .Row input[type="number"], .Row input[type="password"], .Row input[type="text"], .Row textarea, .Row input[type="range"], .Row textarea, .Row select { - width: 100%; } } - -form span.required { - color: red; } - -.RadioGroup { - display: inline-block; - line-height: 1.5em; - vertical-align: middle; } - .RadioGroup label { - width: auto; - text-align: left; - cursor: pointer; - font-weight: normal; } - .RadioGroup input[type="radio"] { - vertical-align: middle; - margin: 0 0 0 5px; } - -#ap-list { - column-count: 3; - column-gap: 0; - margin: 0 -0.23608rem; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #ap-list { - column-count: 2; } } - @media screen and (max-width: 544px) { - #ap-list { - column-count: 1; } } - -#ap-loader, #ap-noscan, #ap-scan { - background: rgba(255, 255, 255, 0.1); - border-radius: 5px; - padding: 0.38198rem; - margin-bottom: 0.38198rem; - margin-top: 0.38198rem; - font-size: 110%; } - -#ap-noscan { - font-weight: bold; } - -#ap-box { - padding-top: 0.38198rem; } - #ap-box label { - display: block; - color: white; - font-weight: bold; - margin-bottom: 0.23608rem; } - -#psk-modal form { - display: flex; - align-items: center; - margin: 0.38198rem; } - #psk-modal form input[type=password] { - min-width: 5rem; } - -.AP .inner, .AP-preview .wrap { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: relative; - border-radius: 3px; - color: #222; - background: #afafaf; - transition: background-color 0.5s; - display: flex; } - .AP .inner:active, .AP-preview .wrap:active { - left: 0; - top: 1px; } - .AP .inner:hover, .AP-preview .wrap:hover { - background: white; } - .AP .inner .rssi, .AP-preview .wrap .rssi { - min-width: 2.5rem; - flex: 0 0 15%; - text-align: right; } - .AP .inner .rssi:after, .AP-preview .wrap .rssi:after { - padding-left: 0.09018rem; - content: '%'; - font-size: 0.88889em; } - .AP .inner .essid, .AP-preview .wrap .essid { - flex: 1 1 70%; - min-width: 0; - text-overflow: ellipsis; - overflow: hidden; - font-weight: bold; } - .AP .inner .auth, .AP-preview .wrap .auth { - flex: 0 0 15%; } - -.AP { - break-inside: avoid-column; - max-width: 500px; - padding: 0.23608rem; } - .AP.selected .inner { - background: #42a6f9 !important; - cursor: default; - top: 0 !important; } - .AP .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - -.AP-preview-nil { - padding: 8px; - border-radius: 5px; - border: 1px dashed #ddd; - width: 250px; - height: 94px; } - -.AP-preview .wrap { - flex-direction: row; - background: #ddd !important; - cursor: default; - top: 0 !important; - overflow: hidden; } - .AP-preview .wrap .inner { - display: flex; - flex-direction: column; } - .AP-preview .wrap .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - .AP-preview .wrap .forget { - align-self: stretch; - line-height: 100%; - padding: 0.61805rem; - border-left: 1px solid #bbb; - display: flex; - align-items: center; - font-size: 28px; } - .AP-preview .wrap .forget, .AP-preview .wrap .forget:hover { - color: black; - text-decoration: none; } - .AP-preview .wrap .forget:hover { - background: #dc4a6a; - color: white; - border-left: 1px solid #666; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .AP-preview .wrap .forget:active { - position: relative; - padding-top: calc(0.61805rem + 1px); } - .AP-preview .wrap .essid, .AP-preview .wrap .passwd, .AP-preview .wrap .nopasswd { - padding-bottom: 0; } - .AP-preview .wrap .x-passwd { - font-family: monospace; } - -body.term #content { - padding-left: 0; - padding-right: 0; - transition: opacity 0.25s ease-in; } - body.term #content h1 { - font-size: 1.80203em; } - @media screen and (max-width: 544px) { - body.term #content h1 { - font-size: 1.42383em; } } - -#screen { - white-space: nowrap; - background: #111213; - padding: 6px; - display: inline-block; - border: 2px solid #3983CD; - font-size: 20px; - font-family: "DejaVu Sans Mono", "Liberation Mono", "Inconsolata", monospace; } - #screen span { - white-space: pre; } - #screen > span { - position: relative; - cursor: pointer; } - #screen > span::before { - content: " "; } - #screen > span > span { - position: absolute; - left: 0; - z-index: 1; } - #screen.noselect { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -#action-buttons { - margin-top: 10px; - white-space: nowrap; } - #action-buttons button { - margin: 0 3px; - padding: 8px 5px; - min-width: 62px; - cursor: pointer; - font-weight: bold; } - #action-buttons button:focus { - outline: 0 none !important; } - -#term-nav { - padding-top: 1.5em; - text-align: center; } - #term-nav a { - text-decoration: none; - padding: 5px 5px; - border-radius: 2px; - position: relative; } - #term-nav a, #term-nav a:visited, #term-nav a:link { - color: #336085; } - #term-nav a:hover { - color: #5abfff; - background: #1b273c; } - #term-nav a:active { - top: 1px; } - #term-nav a i::before { - display: inline; } - #term-nav a span { - margin-left: .2em; } - @media screen and (max-width: 544px) { - #term-nav a { - font-size: 130%; - padding: 6px; } - #term-nav a span { - display: none; } } - #term-nav .icn-keyboard { - text-decoration: none; - font-size: 130%; - vertical-align: middle; } - -#term-wrap { - text-align: center; } - -#softkb-input { - position: absolute; - top: -9999px; } - -#fu_modal { - align-items: flex-start; } - -#fu_form { - padding: 1rem; - margin-top: 100px; - z-index: 1000; } - #fu_form label { - width: 8em; - display: inline-block; } - #fu_form input[type="number"], #fu_form select { - width: 10em; } - #fu_form textarea { - width: 100%; - min-height: 8em; - margin-top: 0.61805rem; - resize: vertical; } - #fu_form .fu-buttons { - text-align: center; - padding: 0.38198rem; - margin-top: 0.38198rem; - border-radius: 3px; } - #fu_form .fu-prog-box { - display: none; } - #fu_form.busy { - background: rgba(36, 36, 38, 0.3); - border-left-color: rgba(41, 114, 186, 0.3); - border-right-color: rgba(41, 114, 186, 0.3); } - #fu_form.busy .fu-content { - pointer-events: none; - opacity: .3; } - #fu_form.busy .fu-buttons { - text-align: left; - background: #242426; - border: 1px solid #2972ba; } - #fu_form.busy .fu-prog-box { - display: inline-block; } - -.theme-0 .fg0 { - color: #111213; } -.theme-0 .bg0 { - background-color: #111213; } -.theme-0 .fg1 { - color: #CC0000; } -.theme-0 .bg1 { - background-color: #CC0000; } -.theme-0 .fg2 { - color: #4E9A06; } -.theme-0 .bg2 { - background-color: #4E9A06; } -.theme-0 .fg3 { - color: #C4A000; } -.theme-0 .bg3 { - background-color: #C4A000; } -.theme-0 .fg4 { - color: #3465A4; } -.theme-0 .bg4 { - background-color: #3465A4; } -.theme-0 .fg5 { - color: #75507B; } -.theme-0 .bg5 { - background-color: #75507B; } -.theme-0 .fg6 { - color: #06989A; } -.theme-0 .bg6 { - background-color: #06989A; } -.theme-0 .fg7 { - color: #D3D7CF; } -.theme-0 .bg7 { - background-color: #D3D7CF; } -.theme-0 .fg8 { - color: #555753; } -.theme-0 .bg8 { - background-color: #555753; } -.theme-0 .fg9 { - color: #EF2929; } -.theme-0 .bg9 { - background-color: #EF2929; } -.theme-0 .fg10 { - color: #8AE234; } -.theme-0 .bg10 { - background-color: #8AE234; } -.theme-0 .fg11 { - color: #FCE94F; } -.theme-0 .bg11 { - background-color: #FCE94F; } -.theme-0 .fg12 { - color: #729FCF; } -.theme-0 .bg12 { - background-color: #729FCF; } -.theme-0 .fg13 { - color: #AD7FA8; } -.theme-0 .bg13 { - background-color: #AD7FA8; } -.theme-0 .fg14 { - color: #34E2E2; } -.theme-0 .bg14 { - background-color: #34E2E2; } -.theme-0 .fg15 { - color: #EEEEEC; } -.theme-0 .bg15 { - background-color: #EEEEEC; } - -.theme-1 .fg0 { - color: #000000; } -.theme-1 .bg0 { - background-color: #000000; } -.theme-1 .fg1 { - color: #aa0000; } -.theme-1 .bg1 { - background-color: #aa0000; } -.theme-1 .fg2 { - color: #00aa00; } -.theme-1 .bg2 { - background-color: #00aa00; } -.theme-1 .fg3 { - color: #aa5500; } -.theme-1 .bg3 { - background-color: #aa5500; } -.theme-1 .fg4 { - color: #0000aa; } -.theme-1 .bg4 { - background-color: #0000aa; } -.theme-1 .fg5 { - color: #aa00aa; } -.theme-1 .bg5 { - background-color: #aa00aa; } -.theme-1 .fg6 { - color: #00aaaa; } -.theme-1 .bg6 { - background-color: #00aaaa; } -.theme-1 .fg7 { - color: #aaaaaa; } -.theme-1 .bg7 { - background-color: #aaaaaa; } -.theme-1 .fg8 { - color: #555555; } -.theme-1 .bg8 { - background-color: #555555; } -.theme-1 .fg9 { - color: #ff5555; } -.theme-1 .bg9 { - background-color: #ff5555; } -.theme-1 .fg10 { - color: #55ff55; } -.theme-1 .bg10 { - background-color: #55ff55; } -.theme-1 .fg11 { - color: #ffff55; } -.theme-1 .bg11 { - background-color: #ffff55; } -.theme-1 .fg12 { - color: #5555ff; } -.theme-1 .bg12 { - background-color: #5555ff; } -.theme-1 .fg13 { - color: #ff55ff; } -.theme-1 .bg13 { - background-color: #ff55ff; } -.theme-1 .fg14 { - color: #55ffff; } -.theme-1 .bg14 { - background-color: #55ffff; } -.theme-1 .fg15 { - color: #ffffff; } -.theme-1 .bg15 { - background-color: #ffffff; } - -.theme-2 .fg0 { - color: #000000; } -.theme-2 .bg0 { - background-color: #000000; } -.theme-2 .fg1 { - color: #cd0000; } -.theme-2 .bg1 { - background-color: #cd0000; } -.theme-2 .fg2 { - color: #00cd00; } -.theme-2 .bg2 { - background-color: #00cd00; } -.theme-2 .fg3 { - color: #cdcd00; } -.theme-2 .bg3 { - background-color: #cdcd00; } -.theme-2 .fg4 { - color: #0000ee; } -.theme-2 .bg4 { - background-color: #0000ee; } -.theme-2 .fg5 { - color: #cd00cd; } -.theme-2 .bg5 { - background-color: #cd00cd; } -.theme-2 .fg6 { - color: #00cdcd; } -.theme-2 .bg6 { - background-color: #00cdcd; } -.theme-2 .fg7 { - color: #e5e5e5; } -.theme-2 .bg7 { - background-color: #e5e5e5; } -.theme-2 .fg8 { - color: #7f7f7f; } -.theme-2 .bg8 { - background-color: #7f7f7f; } -.theme-2 .fg9 { - color: #ff0000; } -.theme-2 .bg9 { - background-color: #ff0000; } -.theme-2 .fg10 { - color: #00ff00; } -.theme-2 .bg10 { - background-color: #00ff00; } -.theme-2 .fg11 { - color: #ffff00; } -.theme-2 .bg11 { - background-color: #ffff00; } -.theme-2 .fg12 { - color: #5c5cff; } -.theme-2 .bg12 { - background-color: #5c5cff; } -.theme-2 .fg13 { - color: #ff00ff; } -.theme-2 .bg13 { - background-color: #ff00ff; } -.theme-2 .fg14 { - color: #00ffff; } -.theme-2 .bg14 { - background-color: #00ffff; } -.theme-2 .fg15 { - color: #ffffff; } -.theme-2 .bg15 { - background-color: #ffffff; } - -.theme-3 .fg0 { - color: #000000; } -.theme-3 .bg0 { - background-color: #000000; } -.theme-3 .fg1 { - color: #cd0000; } -.theme-3 .bg1 { - background-color: #cd0000; } -.theme-3 .fg2 { - color: #00cd00; } -.theme-3 .bg2 { - background-color: #00cd00; } -.theme-3 .fg3 { - color: #cdcd00; } -.theme-3 .bg3 { - background-color: #cdcd00; } -.theme-3 .fg4 { - color: #0000cd; } -.theme-3 .bg4 { - background-color: #0000cd; } -.theme-3 .fg5 { - color: #cd00cd; } -.theme-3 .bg5 { - background-color: #cd00cd; } -.theme-3 .fg6 { - color: #00cdcd; } -.theme-3 .bg6 { - background-color: #00cdcd; } -.theme-3 .fg7 { - color: #faebd7; } -.theme-3 .bg7 { - background-color: #faebd7; } -.theme-3 .fg8 { - color: #404040; } -.theme-3 .bg8 { - background-color: #404040; } -.theme-3 .fg9 { - color: #ff0000; } -.theme-3 .bg9 { - background-color: #ff0000; } -.theme-3 .fg10 { - color: #00ff00; } -.theme-3 .bg10 { - background-color: #00ff00; } -.theme-3 .fg11 { - color: #ffff00; } -.theme-3 .bg11 { - background-color: #ffff00; } -.theme-3 .fg12 { - color: #0000ff; } -.theme-3 .bg12 { - background-color: #0000ff; } -.theme-3 .fg13 { - color: #ff00ff; } -.theme-3 .bg13 { - background-color: #ff00ff; } -.theme-3 .fg14 { - color: #00ffff; } -.theme-3 .bg14 { - background-color: #00ffff; } -.theme-3 .fg15 { - color: #ffffff; } -.theme-3 .bg15 { - background-color: #ffffff; } - -.theme-4 .fg0 { - color: #2e3436; } -.theme-4 .bg0 { - background-color: #2e3436; } -.theme-4 .fg1 { - color: #cc0000; } -.theme-4 .bg1 { - background-color: #cc0000; } -.theme-4 .fg2 { - color: #4e9a06; } -.theme-4 .bg2 { - background-color: #4e9a06; } -.theme-4 .fg3 { - color: #c4a000; } -.theme-4 .bg3 { - background-color: #c4a000; } -.theme-4 .fg4 { - color: #3465a4; } -.theme-4 .bg4 { - background-color: #3465a4; } -.theme-4 .fg5 { - color: #75507b; } -.theme-4 .bg5 { - background-color: #75507b; } -.theme-4 .fg6 { - color: #06989a; } -.theme-4 .bg6 { - background-color: #06989a; } -.theme-4 .fg7 { - color: #d3d7cf; } -.theme-4 .bg7 { - background-color: #d3d7cf; } -.theme-4 .fg8 { - color: #555753; } -.theme-4 .bg8 { - background-color: #555753; } -.theme-4 .fg9 { - color: #ef2929; } -.theme-4 .bg9 { - background-color: #ef2929; } -.theme-4 .fg10 { - color: #8ae234; } -.theme-4 .bg10 { - background-color: #8ae234; } -.theme-4 .fg11 { - color: #fce94f; } -.theme-4 .bg11 { - background-color: #fce94f; } -.theme-4 .fg12 { - color: #729fcf; } -.theme-4 .bg12 { - background-color: #729fcf; } -.theme-4 .fg13 { - color: #ad7fa8; } -.theme-4 .bg13 { - background-color: #ad7fa8; } -.theme-4 .fg14 { - color: #34e2e2; } -.theme-4 .bg14 { - background-color: #34e2e2; } -.theme-4 .fg15 { - color: #eeeeec; } -.theme-4 .bg15 { - background-color: #eeeeec; } - -.theme-5 .fg0 { - color: #073642; } -.theme-5 .bg0 { - background-color: #073642; } -.theme-5 .fg1 { - color: #dc322f; } -.theme-5 .bg1 { - background-color: #dc322f; } -.theme-5 .fg2 { - color: #859900; } -.theme-5 .bg2 { - background-color: #859900; } -.theme-5 .fg3 { - color: #b58900; } -.theme-5 .bg3 { - background-color: #b58900; } -.theme-5 .fg4 { - color: #268bd2; } -.theme-5 .bg4 { - background-color: #268bd2; } -.theme-5 .fg5 { - color: #d33682; } -.theme-5 .bg5 { - background-color: #d33682; } -.theme-5 .fg6 { - color: #2aa198; } -.theme-5 .bg6 { - background-color: #2aa198; } -.theme-5 .fg7 { - color: #eee8d5; } -.theme-5 .bg7 { - background-color: #eee8d5; } -.theme-5 .fg8 { - color: #002b36; } -.theme-5 .bg8 { - background-color: #002b36; } -.theme-5 .fg9 { - color: #cb4b16; } -.theme-5 .bg9 { - background-color: #cb4b16; } -.theme-5 .fg10 { - color: #586e75; } -.theme-5 .bg10 { - background-color: #586e75; } -.theme-5 .fg11 { - color: #657b83; } -.theme-5 .bg11 { - background-color: #657b83; } -.theme-5 .fg12 { - color: #839496; } -.theme-5 .bg12 { - background-color: #839496; } -.theme-5 .fg13 { - color: #6c71c4; } -.theme-5 .bg13 { - background-color: #6c71c4; } -.theme-5 .fg14 { - color: #93a1a1; } -.theme-5 .bg14 { - background-color: #93a1a1; } -.theme-5 .fg15 { - color: #fdf6e3; } -.theme-5 .bg15 { - background-color: #fdf6e3; } - -.bold { - font-weight: bold !important; } - -.faint span { - opacity: 0.6; } - -.italic { - font-style: italic; } - -.under { - text-decoration: underline; } - -.strike { - text-decoration: line-through; } - -.underline.strike { - text-decoration: underline line-through; } - -.blink-hide .blink { - color: transparent; } - -.Row.color-preview { - font-family: monospace; - font-size: 16pt; - display: block; - margin-bottom: 0; - padding-left: 160px; } - @media screen and (max-width: 544px) { - .Row.color-preview { - padding-left: 0; - font-size: 14pt; } } - .Row.color-preview .colorprev { - display: block; - margin: 0; - cursor: pointer; } - -#color-example { - display: inline-block; - padding: 5px; } - -.page-about .Box { - padding-left: 1rem; - padding-right: 1rem; } - .page-about .Box a { - font-weight: bold; } -.page-about #logo { - float: right; - height: 130px; } -.page-about #logo2 { - max-width: 100%; - margin: 1rem; } -.page-about td { - white-space: normal; } - -.page-help code { - background: rgba(33, 97, 109, 0.31); - border-radius: 1px; - padding: 0 2px; } - -.colorprev { - margin-top: 0.38198rem; - margin-bottom: 0.38198rem; } - .colorprev span { - display: inline-block; - width: 2em; - padding: 0.38198rem 0; - text-align: center; } - -.Row table, .Row table td, .Row table th { - border: 1px solid #666; } -.Row table th, .Row table td { - white-space: normal; } -.Row table th { - background-color: rgba(255, 255, 255, 0.1); } - -.ansiref.w100 { - width: 100%; } - .ansiref.w100 td:nth-child(1) { - width: 8em; } - -.nomen { - width: 100%; } - .nomen code { - white-space: nowrap; } - .nomen td:last-child { - min-width: 15em; } - -.tscroll { - overflow-x: auto; } - -.charset { - line-height: 1; } - .charset div { - display: inline-block; - width: 2.7em; - border: 1px solid #666; - height: 3em; - margin: 1px; - position: relative; } - .charset div span { - display: block; - position: absolute; } - .charset div span:nth-child(1) { - left: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; } - .charset div span:nth-child(2) { - right: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; } - .charset div span:nth-child(3) { - width: 100%; - font-size: 105%; - text-align: center; - bottom: .4em; - font-family: "DejaVu Sans Mono", "Liberation Mono", "Inconsolata", monospace; } - .charset div.none { - opacity: .4; } - -@media screen and (min-width: 545px) { - .mq-phone { - display: none !important; } } -@media screen and (max-width: 544px) { - .mq-tablet-min, .mq-no-phone { - display: none !important; } } -@media screen and (min-width: 1001px) { - .mq-tablet-max { - display: none !important; } } -@media screen and (max-width: 1000px) { - .mq-normal-min { - display: none !important; } } - -/*# sourceMappingURL=app.css.map */ diff --git a/html_orig/css/app.css.bak b/html_orig/css/app.css.bak deleted file mode 100644 index 5baf098..0000000 --- a/html_orig/css/app.css.bak +++ /dev/null @@ -1,1284 +0,0 @@ -@charset "UTF-8"; -/* normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ -*, *:before, *:after { - box-sizing: border-box; } - -html { - font-family: sans-serif; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ } - -/** - * Remove default margin. - */ -body { - margin: 0; } - -/* HTML5 display definitions - ========================================================================== */ -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ -figure, -nav - { - display: block; } - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ -canvas, -progress - { - display: inline-block; - /* 1 */ - vertical-align: baseline; - /* 2 */ } - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ -[hidden] - { - display: none; } - -/* Links - ========================================================================== */ -/** - * Remove the gray background color from active links in IE 10. - */ -a { - background-color: transparent; } - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ -a:active, -a:hover { - outline: 0; } - -/* Text-level semantics - ========================================================================== */ -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ -b - { - font-weight: bold; } - -/** - * Address styling not present in Safari and Chrome. - */ -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ -h1 { - font-size: 2em; - margin: 0.67em 0; } - -h2 { - font-size: 2em; - margin: 0.67em 0; } - -/** - * Address styling not present in IE 8/9. - */ -/** - * Address inconsistent and variable font size in all browsers. - */ -small { - font-size: 80%; } - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; } - -sup { - top: -0.5em; } - -sub { - bottom: -0.25em; } - -/* Embedded content - ========================================================================== */ -/** - * Remove border when inside `a` element in IE 8/9/10. - */ -img { - border: 0; } - -/** - * Correct overflow not hidden in IE 9/10/11. - */ -svg:not(:root) { - overflow: hidden; } - -/* Grouping content - ========================================================================== */ -/** - * Address margin not present in IE 8/9 and Safari. - */ -/** - * Address differences between Firefox and other browsers. - */ -hr { - box-sizing: content-box; - height: 0; } - -/** - * Contain overflow in all browsers. - */ -pre { - overflow: auto; } - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ -code, -pre - { - font-family: monospace; - font-size: 1em; } - -/* Forms - ========================================================================== */ -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ -button, -input, -select, -textarea { - color: inherit; - /* 1 */ - font: inherit; - /* 2 */ - margin: 0; - /* 3 */ } - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ -button { - overflow: visible; } - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ -button, -select { - text-transform: none; } - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ -button, -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ } - -/** - * Re-set default cursor for disabled elements. - */ -button[disabled], -html input[disabled] { - cursor: default; } - -/** - * Remove inner padding and border in Firefox 4+. - */ -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; } - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ -input { - line-height: normal; } - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -/** - * Define consistent border, margin, and padding. - */ -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ -legend { - border: 0; - /* 1 */ - padding: 0; - /* 2 */ } - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ -textarea { - overflow: auto; } - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -/* Tables - ========================================================================== */ -/** - * Remove most spacing between table cells. - */ -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - -@font-face { - font-family: 'fontello'; - src: url("data:application/octet-stream;base64,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") format("woff"), url("data:application/octet-stream;base64,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I7AEQ2CwASuwBSVhsAUlsAJiILAAUFiwQGBZZrABY7AEJmEgsAQlYGQjsAMlYGRQWCEbIyFZIyAgsAQmI0ZhOFktsDcssAAWICAgsAUmIC5HI0cjYSM8OC2wOCywABYgsAgjQiAgIEYjR7ABKyNhOC2wOSywABawAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhuQgACABjYyMgWGIbIVljuAQAYiCwAFBYsEBgWWawAWNgIy4jICA8ijgjIVktsDossAAWILAIQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbA7LCMgLkawAiVGUlggPFkusSsBFCstsDwsIyAuRrACJUZQWCA8WS6xKwEUKy2wPSwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xKwEUKy2wPiywNSsjIC5GsAIlRlJYIDxZLrErARQrLbA/LLA2K4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=") format("truetype"); } -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'fontello'; - src: url('../font/fontello.svg?60007293#fontello') format('svg'); - } -} -*/ -[class^="icn-"]:before, [class*=" icn-"]:before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } - -.icn-persist:before { - content: '\e800'; } - -/* '' */ -.icn-ok:before { - content: '\e801'; } - -/* '' */ -.icn-donate:before { - content: '\e802'; } - -/* '' */ -.icn-back:before { - content: '\e80b'; } - -/* '' */ -.icn-about:before { - content: '\e81f'; } - -/* '' */ -.icn-help:before { - content: '\e826'; } - -/* '' */ -.icn-network:before { - content: '\e82e'; } - -/* '' */ -.icn-restore:before { - content: '\e836'; } - -/* '' */ -.icn-terminal:before { - content: '\f108'; } - -/* '' */ -.icn-github:before { - content: '\f113'; } - -/* '' */ -.icn-wifi:before { - content: '\f1eb'; } - -/* '' */ -html { - box-sizing: border-box; } - -*, *::after, *::before { - box-sizing: inherit; } - -html { - font-family: Arial, sans-serif; - color: #D0D0D0; - background: #131315; } - -html, body { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; - width: 100%; - height: 100%; - overflow: hidden; } - -a, a:visited, a:link { - cursor: pointer; - color: #5abfff; - text-decoration: none; } - -a:hover { - color: #5abfff; - text-decoration: underline; } - -.hidden { - display: none !important; } - -[onclick] { - cursor: pointer; } - -ul > * { - padding-top: .2em; - padding-bottom: .2em; } - -/* Main outer container */ -#outer { - display: flex; - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - flex-direction: row; } - -@media screen and (max-width: 544px) { - #outer { - display: block; - overflow-y: scroll; } } -#menu { - flex: 0 0 15rem; - background: #3983CD; } - #menu > * { - display: block; - text-decoration: none; - padding: 0.61805rem 1rem; - white-space: nowrap; - word-wrap: normal; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - #menu #brand { - color: white; - background: #2b6aa8; - font-size: 120%; - text-align: center; - position: relative; - transition: none; - font-weight: bold; - margin-bottom: 1rem; } - @media screen and (max-width: 544px) { - #menu #brand { - background: #3983CD; - cursor: pointer; - margin-bottom: 0.38198rem; } - #menu #brand::after { - position: absolute; - color: rgba(0, 0, 0, 0.4); - right: 1rem; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } } - #menu.expanded #brand { - background: #2b6aa8; } - @media screen and (max-width: 544px) { - #menu.expanded #brand:after { - transform: translate(-25%, -50%) rotate(-90deg); } } - #menu a { - font-size: 130%; - color: white; - transition: background-color 0.2s; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.4); } - #menu a:hover, #menu a.selected { - background: #5badff; - text-shadow: 0 0 5px rgba(0, 0, 0, 0.6); } - #menu a.selected { - position: relative; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.5); } - #menu a:focus { - outline-color: #ff0099; } - #menu a::before { - vertical-align: -2px; - margin-left: 0; - margin-right: 15px; } - @media screen and (max-width: 544px) { - #menu a { - display: none; } - #menu a::before { - margin-left: 10px; } } - #menu.expanded a { - display: block; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #menu { - flex-basis: 10rem; } - #menu #brand { - font-size: 95%; - margin-bottom: 0.61805rem; } - #menu a { - font-size: 105%; } - #menu > * { - padding: 0.38198rem 0.61805rem; } } - -#content { - flex-grow: 1; - position: relative; - padding: 1rem; - overflow-y: auto; } - @media screen and (max-width: 544px) { - #content { - padding: 0.61805rem; } } - #content > * { - margin-left: auto; - margin-right: auto; } - #content h1 { - text-align: center; - font-size: 2.2807em; - margin-top: 0; - margin-bottom: 1rem; } - #content h2 { - font-size: 1.42383em; - margin-bottom: 0.61805rem; } - @media screen and (max-width: 544px) { - #content h1 { - font-size: 1.80203em; - margin-bottom: 0.61805rem; } - #content h2 { - font-size: 1.26563em; - margin-bottom: 0.61805rem; } } - #content td, #content th { - padding: 0.38198rem; } - #content tbody th { - text-align: right; - width: 160px; - color: white; } - -#loader { - position: absolute; - right: 1.618rem; - top: 1.618rem; - transition: opacity .2s; - opacity: 0; } - @media screen and (max-width: 544px) { - #loader { - top: 1rem; - right: 1rem; } } - #loader.show { - opacity: 1; } - -.Box { - display: block; - max-width: 900px; - margin-top: 1rem; - padding: 0.61805rem 1rem; - border-radius: 3px; - background-color: rgba(255, 255, 255, 0.07); - box-shadow: 0 0 4px black; - border: 1px solid #4f4f4f; } - @media screen and (max-width: 544px) { - .Box { - margin-top: 0.61805rem; } } - .Box h1, .Box h2 { - overflow: hidden; } - h1 + .Box { - margin-top: 0; } - .Box h2 { - margin-top: 0; - margin-bottom: 0 !important; } - .Box.wide { - width: initial; - max-width: initial; } - .Box.medium { - max-width: 1200px; } - .Box.str { - position: relative; } - .Box.str .Row.buttons { - position: absolute; } - @media screen and (max-width: 544px) { - .Box.str .Row.buttons { - right: 1rem; - top: 1.8em; - margin: 1rem auto; } } - @media screen and (min-width: 545px) { - .Box.str .Row.buttons { - right: 0; - top: 0; - margin-top: 0.61805rem; } } - .Box.str.mobopen .Row.buttons { - top: 0; - margin-top: 0.61805rem; } - .Box .Row.explain { - max-width: 600px; - margin-left: 0; } - @media screen and (max-width: 544px) { - .Box .Row.explain { - margin-top: 60px; } } - .Box.mobopen .Row.explain { - margin-top: 12px; } - @media screen and (max-width: 544px) { - .Box.mobopen .Row.explain { - margin-top: 18px; } } - -@media screen and (max-width: 544px) { - .Box.mobcol h2 { - position: relative; - cursor: pointer; - padding-right: 1.3rem; } - .Box.mobcol h2::after { - position: absolute; - right: 0; - content: '▸'; - top: 50%; - font-size: 120%; - font-weight: bold; - transform: translate(0, -50%) rotate(90deg); } - .Box.mobcol.expanded h2::after { - transform: translate(-25%, -50%) rotate(-90deg); - margin-bottom: 1rem; } - .Box.mobcol .Row { - display: none; } - .Box.mobcol #ap-box { - display: none; } - .Box.mobcol.expanded .Row { - display: flex; } - .Box.mobcol.expanded #ap-box { - display: block; } } -.Modal { - position: fixed; - width: 100%; - height: 100%; - left: 0; - top: 0; - right: 0; - bottom: 0; - display: flex; - justify-content: center; - align-items: center; - transition: opacity .5s; - background: rgba(0, 0, 0, 0.65); - opacity: 0; } - .Modal.visible { - opacity: 1; } - .Modal.hidden { - display: none; } - -.Dialog { - margin: 0.61805rem; - padding: 1rem; - overflow: hidden; - max-width: 100%; - max-height: 100%; - flex: 0 1 30rem; - background: #1c1c1e; - border-left: 6px solid #2972ba; - border-right: 6px solid #2972ba; - border-top: 1px solid #2972ba; - border-bottom: 1px solid #2972ba; - box-shadow: 0 0 6px 0 black; - border-radius: 6px; } - .Dialog h1, .Dialog h2 { - margin-top: 0; } - .Dialog p:last-child { - margin-bottom: 0; } - -.NotifyMsg { - position: fixed; - top: 1.618rem; - right: 2.61792rem; - padding: 0.61805rem 1rem; - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transform: translateZ(0) scale(1, 1); - background: #3887d0; - color: white; - text-shadow: 0 0 2px black; - box-shadow: 0 0 6px 0 rgba(0, 0, 0, 0.6); - border-radius: 5px; - max-width: 80%; - transition: opacity .5s; - opacity: 0; } - .NotifyMsg.error { - background: #d03e42; } - @media screen and (max-width: 544px) { - .NotifyMsg { - width: calc(100% - 1rem); } } - .NotifyMsg.visible { - opacity: 1; } - .NotifyMsg.hidden { - display: none; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -button, input[type=submit], .button { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-shadow: 1.5px 1.5px 2px rgba(0, 0, 0, 0.4); - background-color: #3983cd; - box-shadow: 0 3px 0 #265f98; - text-decoration: none !important; } - button:active, input[type=submit]:active, .button:active { - position: relative; - top: 2px; } - button.narrow, input[type=submit].narrow, .button.narrow { - min-width: initial; } - button::before, input[type=submit]::before, .button::before { - vertical-align: -1px; - margin-left: 0; } - button, button:link, button:visited, input[type=submit], input[type=submit]:link, input[type=submit]:visited, .button, .button:link, .button:visited { - color: #FEFEFE; } - button:hover, button:active, button.active, button.selected, input[type=submit]:hover, input[type=submit]:active, input[type=submit].active, input[type=submit].selected, .button:hover, .button:active, .button.active, .button.selected { - background-color: #2076C6; - color: #FEFEFE; } - button:hover, button.selected, button.active, input[type=submit]:hover, input[type=submit].selected, input[type=submit].active, .button:hover, .button.selected, .button.active { - box-shadow: 0 3px 0 #154c80; } - button:active, input[type=submit]:active, .button:active { - box-shadow: 0 1px 0 #154c80; } - button:focus, input[type=submit]:focus, .button:focus { - outline-color: #ff0099; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select { - border: 0 none; - border-bottom: 2px solid #2972ba; - background-color: #3c3c3c; - color: white; - padding: 6px; - line-height: 1em; - font-weight: normal; } - input[type="number"]:focus, input[type="number"]:hover, input[type="password"]:focus, input[type="password"]:hover, input[type="text"]:focus, input[type="text"]:hover, textarea:focus, textarea:hover, select:focus, select:hover { - border-bottom-color: #2ea1f9; } - -.Row.checkbox { - line-height: 27px; } - .Row.checkbox .box { - overflow: hidden; - width: 27px; - height: 27px; - border: 1px solid #808080; - border-radius: 3px; - background: #3c3c3c; - display: inline-block; - position: relative; - cursor: pointer; - color: #2ea1f9; } - .Row.checkbox .box::before { - font-weight: bold; - position: absolute; - content: '×'; - left: 0; - top: 0; - right: 0; - bottom: 0; - line-height: 26px; - text-align: center; - font-size: 27px; - vertical-align: middle; - display: none; } - .Row.checkbox .box.checked::before { - display: block; } - -.Row.range .display { - margin-left: 1ex; } -.Row.range label .display { - font-weight: normal; } - -#psk-modal form > *, #wificonfbox form > * { - margin-right: 0.38198rem; } - #psk-modal form > *:last-child, #wificonfbox form > *:last-child { - margin-right: 0; } - -form { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; } - -input[type="number"], input[type="password"], input[type="text"], textarea, select, label.select-wrap { - width: 250px; } - -input[type="number"], input.short { - width: 125px; } - -.Box.errors .list { - color: crimson; - font-weight: bold; } -.Box.errors .lead { - color: white; } - -.Row { - vertical-align: middle; - margin: 12px auto; - text-align: left; - display: flex; - flex-direction: row; - align-items: center; } - .Row:first-child { - margin-top: 0; } - .Row:last-child { - margin-bottom: 0; } - .Row .spacer { - width: 160px; } - @media screen and (max-width: 544px) { - .Row .spacer { - display: none; } } - .Row.buttons { - margin: 16px auto; } - .Row.buttons input, .Row.buttons .button { - margin-right: 0.61805rem; } - .Row.centered { - justify-content: center; } - .Row.message { - font-size: 1em; - text-shadow: 1px 1px 3px black; - text-align: center; } - .Row.message.error { - color: crimson; } - .Row.message.ok { - color: #0fe851; } - .Row.separator { - padding-top: 14px; - border-top: 2px solid rgba(255, 255, 255, 0.1); } - .Row textarea { - display: inline-block; - vertical-align: top; - min-height: 10rem; - flex-grow: 1; - resize: vertical; } - .Row label { - font-weight: bold; - color: white; - display: inline-block; - width: 160px; - text-align: right; - text-shadow: 1px 1px 3px black; - padding: 8px; - align-self: flex-start; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - white-space: nowrap; - word-wrap: normal; } - .Row label.error { - color: crimson; } - .Row input[type="range"] { - width: 200px; } - @media screen and (max-width: 544px) { - .Row { - flex-direction: column; - margin: 6px auto; } - .Row.buttons, .Row.centered, .Row.checkbox { - flex-direction: row; } - .Row.buttons { - justify-content: center; } - .Row.buttons :last-child { - margin-right: 0; } - .Row label { - padding-left: 0; - text-align: left; - width: auto; } - .Row .checkbox-wrap { - order: 1; - text-align: left; - padding-bottom: 0; - border-radius: .4px; - width: auto; } - .Row .checkbox-wrap + label { - width: auto; } - .Row input[type="number"], .Row input[type="password"], .Row input[type="text"], .Row textarea, .Row input[type="range"], .Row textarea, .Row select { - width: 100%; } } - -form span.required { - color: red; } - -.RadioGroup { - display: inline-block; - line-height: 1.5em; - vertical-align: middle; } - .RadioGroup label { - width: auto; - text-align: left; - cursor: pointer; - font-weight: normal; } - .RadioGroup input[type="radio"] { - vertical-align: middle; - margin: 0 0 0 5px; } - -#ap-list { - column-count: 3; - column-gap: 0; - margin: 0 -0.23608rem; } - @media screen and (min-width: 545px) and (max-width: 1000px) { - #ap-list { - column-count: 2; } } - @media screen and (max-width: 544px) { - #ap-list { - column-count: 1; } } - -#ap-loader, #ap-noscan, #ap-scan { - background: rgba(255, 255, 255, 0.1); - border-radius: 5px; - padding: 0.38198rem; - margin-bottom: 0.38198rem; } - -#ap-noscan { - font-weight: bold; } - -#ap-box { - padding-top: 0.38198rem; } - #ap-box label { - display: block; - color: white; - font-weight: bold; - margin-bottom: 0.23608rem; } - -#psk-modal form { - display: flex; - align-items: center; - margin: 0.38198rem; } - #psk-modal form input[type=password] { - min-width: 5rem; } - -.AP .inner, .AP-preview .wrap { - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - position: relative; - border-radius: 3px; - color: #222; - background: #afafaf; - transition: background-color 0.5s; - display: flex; } - .AP .inner:active, .AP-preview .wrap:active { - left: 0; - top: 1px; } - .AP .inner:hover, .AP-preview .wrap:hover { - background: white; } - .AP .inner .rssi, .AP-preview .wrap .rssi { - min-width: 2.5rem; - flex: 0 0 15%; - text-align: right; } - .AP .inner .rssi:after, .AP-preview .wrap .rssi:after { - padding-left: 0.09018rem; - content: '%'; - font-size: 0.88889em; } - .AP .inner .essid, .AP-preview .wrap .essid { - flex: 1 1 70%; - min-width: 0; - text-overflow: ellipsis; - overflow: hidden; - font-weight: bold; } - .AP .inner .auth, .AP-preview .wrap .auth { - flex: 0 0 15%; } - -.AP { - break-inside: avoid-column; - max-width: 500px; - padding: 0.23608rem; } - .AP.selected .inner { - background: #42a6f9 !important; - cursor: default; - top: 0 !important; } - .AP .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - -.AP-preview-nil { - padding: 8px; - border-radius: 5px; - border: 1px dashed #ddd; - width: 250px; - height: 94px; } - -.AP-preview .wrap { - flex-direction: row; - background: #ddd !important; - cursor: default; - top: 0 !important; - overflow: hidden; } - .AP-preview .wrap .inner { - display: flex; - flex-direction: column; } - .AP-preview .wrap .inner > * { - padding: 0.61805rem; - white-space: nowrap; - word-wrap: normal; } - .AP-preview .wrap .forget { - align-self: stretch; - line-height: 100%; - padding: 0.61805rem; - border-left: 1px solid #bbb; - display: flex; - align-items: center; - font-size: 28px; } - .AP-preview .wrap .forget, .AP-preview .wrap .forget:hover { - color: black; - text-decoration: none; } - .AP-preview .wrap .forget:hover { - background: #dc4a6a; - color: white; - border-left: 1px solid #666; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; } - .AP-preview .wrap .forget:active { - position: relative; - padding-top: calc(0.61805rem + 1px); } - .AP-preview .wrap .essid, .AP-preview .wrap .passwd, .AP-preview .wrap .nopasswd { - padding-bottom: 0; } - .AP-preview .wrap .x-passwd { - font-family: monospace; } - -body.term h1 { - font-size: 1.80203em; } - @media screen and (max-width: 544px) { - body.term h1 { - font-size: 1.42383em; } } -body.term #screen { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - font-family: monospace; - font-size: 16pt; - white-space: nowrap; - background: #111213; - padding: 6px; - display: inline-block; - border: 2px solid #3983CD; } - body.term #screen span { - white-space: pre; - cursor: pointer; } - body.term #screen span:hover { - outline: 1px solid rgba(255, 255, 255, 0.4); } - @media screen and (max-width: 544px) { - body.term #screen span:hover { - outline: 0 none; } } -body.term #buttons { - margin-top: 10px; - white-space: nowrap; } - body.term #buttons button { - margin: 0 3px; - padding: 10px 0; - width: 18%; - max-width: 65px; - min-width: initial; - cursor: pointer; - font-weight: bold; } -body.term #botnav { - padding-top: 1.5em; - text-align: center; } - body.term #botnav a { - padding: 0 0.38198rem; - text-decoration: underline; } - body.term #botnav a, body.term #botnav a:visited, body.term #botnav a:link { - color: #2e4d6e; } - body.term #botnav a:hover { - color: #5abfff; } - -#termwrap { - text-align: center; } - -.page-about .Box { - padding-left: 1rem; - padding-right: 1rem; } - .page-about .Box a { - font-weight: bold; } -.page-about #logo { - float: right; - height: 130px; } -.page-about #logo2 { - max-width: 100%; } -.page-about td { - white-space: normal; } - -.colorprev { - margin-top: 0.38198rem; - margin-bottom: 0.38198rem; } - .colorprev span { - display: inline-block; - width: 2em; - padding: 0.38198rem 0; - text-align: center; } - -.ansiref, .ansiref td, .ansiref th { - border: 1px solid #666; } -.ansiref th, .ansiref td { - white-space: normal; } -.ansiref th { - background-color: rgba(255, 255, 255, 0.1); } -.ansiref td:nth-child(1) { - font-family: monospace; } -.ansiref.w100 { - width: 100%; } - .ansiref.w100 td:nth-child(1) { - width: 9em; } - .ansiref.w100 td:nth-child(2) { - width: 8em; } - -.fg0 { - color: #111213; } - -.bg0 { - background-color: #111213; } - -.fg1 { - color: #CC0000; } - -.bg1 { - background-color: #CC0000; } - -.fg2 { - color: #4E9A06; } - -.bg2 { - background-color: #4E9A06; } - -.fg3 { - color: #C4A000; } - -.bg3 { - background-color: #C4A000; } - -.fg4 { - color: #3465A4; } - -.bg4 { - background-color: #3465A4; } - -.fg5 { - color: #75507B; } - -.bg5 { - background-color: #75507B; } - -.fg6 { - color: #06989A; } - -.bg6 { - background-color: #06989A; } - -.fg7 { - color: #D3D7CF; } - -.bg7 { - background-color: #D3D7CF; } - -.fg8 { - color: #555753; } - -.bg8 { - background-color: #555753; } - -.fg9 { - color: #EF2929; } - -.bg9 { - background-color: #EF2929; } - -.fg10 { - color: #8AE234; } - -.bg10 { - background-color: #8AE234; } - -.fg11 { - color: #FCE94F; } - -.bg11 { - background-color: #FCE94F; } - -.fg12 { - color: #729FCF; } - -.bg12 { - background-color: #729FCF; } - -.fg13 { - color: #AD7FA8; } - -.bg13 { - background-color: #AD7FA8; } - -.fg14 { - color: #34E2E2; } - -.bg14 { - background-color: #34E2E2; } - -.fg15 { - color: #EEEEEC; } - -.bg15 { - background-color: #EEEEEC; } - -.fg8, .fg9, .fg10, .fg11, .fg12, .fg13, .fg14, .fg15 { - font-weight: bold; } - -.nb { - font-weight: normal !important; } - -@media screen and (min-width: 545px) { - .mq-phone { - display: none !important; } } -@media screen and (max-width: 544px) { - .mq-tablet-min, .mq-no-phone { - display: none !important; } } -@media screen and (min-width: 1001px) { - .mq-tablet-max { - display: none !important; } } -@media screen and (max-width: 1000px) { - .mq-normal-min { - display: none !important; } } - -/*# sourceMappingURL=app.css.map */ diff --git a/html_orig/dump_js_lang.php b/html_orig/dump_js_lang.php deleted file mode 100755 index ab2f976..0000000 --- a/html_orig/dump_js_lang.php +++ /dev/null @@ -1,23 +0,0 @@ - "$SASSFILE" - -# Extract the base font-face style -#grep -Pazo "(?s)@font-face.*?normal;\n\}" "$OUTPUT_DIR/fontello.css" \ -# | sed 's/\x0//g' >> "$SASSFILE" - -grep -Pazo "(?s)@font-face \{\n\s*font-family: 'fontello';\n\s*src: url\('data.*?woff'\)" "$OUTPUT_DIR/fontello-embedded.css" \ - | sed 's/\x0//g' >> "$SASSFILE" - -echo -e ";\n}" >> "$SASSFILE" - - -grep -Pazo "(?s)$ICON_PREFIX-\"\]:before .*?\}" "$OUTPUT_DIR/fontello.css" \ - | sed 's/\x0//g' \ - | sed "s/$ICON_PREFIX-\"\]:before/\n\n%fontello-icon-base \{\n\&::before /g" \ - >> "$SASSFILE" -echo -e "\n}" >> "$SASSFILE" - -echo -e "\n\n/* Fontello icon codes */" >> "$SASSFILE" -echo -n "\$icon-codes: (" >> "$SASSFILE" -sed -r "s|\.$ICON_PREFIX-([a-z0-9-]+):before \{ content: ('.*?');.*?$|\t\1: \2,|g" "$OUTPUT_DIR/fontello-codes.css" \ - | sed -r "s|@.*||g" >> "$SASSFILE" - -echo -ne "\n);\n" >> "$SASSFILE" - -echo -ne "\n/* Fontello classes */" >> "$SASSFILE" -cat "$OUTPUT_DIR/fontello-codes.css" \ - | sed -r 's/\/\*.+\*\///g' \ - | sed -r "s|@.*||g" \ - | sed 's/:before/::before/g' >> "$SASSFILE" - -TAIL=$(cat <> "$SASSFILE" - -echo -e "\e[32mFontello ready\e[0m" diff --git a/html_orig/img/adapter.jpg.orig b/html_orig/img/adapter.jpg.orig deleted file mode 100644 index ab6cfd3..0000000 Binary files a/html_orig/img/adapter.jpg.orig and /dev/null differ diff --git a/html_orig/img/cvut.svg b/html_orig/img/cvut.svg deleted file mode 100755 index dc015d3..0000000 --- a/html_orig/img/cvut.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/html_orig/img/loader.gif b/html_orig/img/loader.gif deleted file mode 100755 index dfb5362..0000000 Binary files a/html_orig/img/loader.gif and /dev/null differ diff --git a/html_orig/img/vt100.jpg b/html_orig/img/vt100.jpg deleted file mode 100644 index 7046042..0000000 Binary files a/html_orig/img/vt100.jpg and /dev/null differ diff --git a/html_orig/img/vt100.jpg.orig b/html_orig/img/vt100.jpg.orig deleted file mode 100644 index 909461a..0000000 Binary files a/html_orig/img/vt100.jpg.orig and /dev/null differ diff --git a/html_orig/index.php b/html_orig/index.php deleted file mode 100644 index 895546d..0000000 --- a/html_orig/index.php +++ /dev/null @@ -1,50 +0,0 @@ -title . ' :: ' . APP_NAME; -$_GET['BODYCLASS'] = $_pages[$_GET['page']]->bodyclass; - -$_pf = __DIR__ . '/pages/'.$_GET['page'].'.php'; - -if (!file_exists($_pf)) { - header("Location: /", true, 302); - die(); -} - -require __DIR__ . '/pages/_head.php'; - -$include_re = '/<\?php\s*(require|include)\s*\(?\s*?(?:__DIR__\s*\.)?\s*(["\'])(.*?)\2\s*\)?;\s*\?>/'; - -if (file_exists($_pf)) { - $f = file_get_contents($_pf); - - // Resolve requires inline - they wont work after dumping the resulting file to /tmp for eval - $f = preg_replace_callback($include_re, function ($m) use ($_pf) { - $n = dirname($_pf).'/'.$m[3]; - if (file_exists($n)) { - return file_get_contents($n); - } else { - return "

NOT FOUND: $n

"; - } - }, $f); - - if (DEBUG || ESP_DEMO) - $str = tplSubs($f, require(__DIR__ . '/_debug_replacements.php')); - else $str = $f; - - // special symbols - $str = str_replace('\,', ' ', $str); - $str = preg_replace('/(?<=[^ \\\\])~(?=[^ ])/', ' ', $str); - $str = str_replace('\~', '~', $str); - $str = preg_replace('/(?$1', $str); - $str = preg_replace('/(?$1', $str); - $str = preg_replace('/(?$1', $str); - - $str = preg_replace("/\s*(\\\\\\\\)[\n \t]+/", '
', $str); - include_str($str); -} - -require __DIR__ . '/pages/_tail.php'; diff --git a/html_orig/js/app.js b/html_orig/js/app.js deleted file mode 100644 index a97b633..0000000 --- a/html_orig/js/app.js +++ /dev/null @@ -1,2533 +0,0 @@ -/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */ - -// MODIFIED VERSION. -(function () { - 'use strict'; - - var readyfn = [], - loadedfn = [], - domready = false, - pageloaded = false, - d = document, - w = window; - - // Fire any function calls on ready event - function fireReady() { - var i; - domready = true; - for (i = 0; i < readyfn.length; i += 1) { - readyfn[i](); - } - readyfn = []; - } - - // Fire any function calls on loaded event - function fireLoaded() { - var i; - pageloaded = true; - // For browsers with no DOM loaded support - if (!domready) { - fireReady(); - } - for (i = 0; i < loadedfn.length; i += 1) { - loadedfn[i](); - } - loadedfn = []; - } - - // Check DOM ready, page loaded - if (d.addEventListener) { - // Standards - d.addEventListener('DOMContentLoaded', fireReady, false); - w.addEventListener('load', fireLoaded, false); - } else if (d.attachEvent) { - // IE - d.attachEvent('onreadystatechange', fireReady); - // IE < 9 - w.attachEvent('onload', fireLoaded); - } else { - // Anything else - w.onload = fireLoaded; - } - - // Utility functions - - // Loop through node array - function nodeLoop(fn, nodes) { - var i; - // Good idea to walk up the DOM - for (i = nodes.length - 1; i >= 0; i -= 1) { - fn(nodes[i]); - } - } - - // Convert to camel case - function cssCamel(property) { - return property.replace(/-\w/g, function (result) { - return result.charAt(1).toUpperCase(); - }); - } - - // Get computed style - function computeStyle(elm, property) { - // IE, everything else or null - return (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null; - - } - - // Returns URI encoded query string pair - function queryPair(name, value) { - return encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+'); - } - - // Set CSS, important to wrap in try to prevent error thown on unsupported property - function setCss(elm, property, value) { - try { - elm.style[cssCamel(property)] = value; - } catch (e) { - } - } - - // Show CSS - function showCss(elm) { - elm.style.display = ''; - // For elements still hidden by style block - if (computeStyle(elm, 'display') === 'none') { - elm.style.display = 'block'; - } - } - - // Serialize form & JSON values - function serializeData(nodes) { - var querystring = '', subelm, i, j; - if (nodes.constructor === Object) { // Serialize JSON data - for (subelm in nodes) { - if (nodes.hasOwnProperty(subelm)) { - if (nodes[subelm].constructor === Array) { - for (i = 0; i < nodes[subelm].length; i += 1) { - querystring += '&' + queryPair(subelm, nodes[subelm][i]); - } - } else { - querystring += '&' + queryPair(subelm, nodes[subelm]); - } - } - } - } else { // Serialize node data - nodeLoop(function (elm) { - if (elm.nodeName === 'FORM') { - for (i = 0; i < elm.elements.length; i += 1) { - subelm = elm.elements[i]; - - if (!subelm.disabled) { - switch (subelm.type) { - // Ignore buttons, unsupported XHR 1 form fields - case 'button': - case 'image': - case 'file': - case 'submit': - case 'reset': - break; - - case 'select-one': - if (subelm.length > 0) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - case 'select-multiple': - for (j = 0; j < subelm.length; j += 1) { - if (subelm[j].selected) { - querystring += '&' + queryPair(subelm.name, subelm[j].value); - } - } - break; - - case 'checkbox': - case 'radio': - if (subelm.checked) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - // Everything else including shinny new HTML5 input types - default: - querystring += '&' + queryPair(subelm.name, subelm.value); - } - } - } - } - }, nodes); - } - // Tidy up first & - return (querystring.length > 0) ? querystring.substring(1) : ''; - } - - // Class helper - function classHelper(classes, action, nodes) { - var classarray, search, i, replace, has = false; - if (classes) { - // Trim any whitespace - classarray = classes.split(/\s+/); - nodeLoop(function (elm) { - for (i = 0; i < classarray.length; i += 1) { - var clz = classarray[i]; - if (action === 'remove') { - elm.classList.remove(clz); - } - else if (action === 'add') { - elm.classList.add(clz); - } - else if (action === 'toggle') { - elm.classList.toggle(clz); - } - else if (action === 'has') { - if (elm.classList.contains(clz)) { - has = true; - break; - } - } - - // search = new RegExp('\\b' + classarray[i] + '\\b', 'g'); - // replace = new RegExp(' *' + classarray[i] + '\\b', 'g'); - // if (action === 'remove') { - // elm.className = elm.className.replace(search, ''); - // } else if (action === 'toggle') { - // elm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i]; - // } else if (action === 'has') { - // if (elm.className.match(search)) { - // has = true; - // break; - // } - // } - } - }, nodes); - } - return has; - } - - // HTML insertion helper - function insertHtml(value, position, nodes) { - var tmpnodes, tmpnode; - if (value) { - nodeLoop(function (elm) { - // No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead - // Convert string to node. We can't innerHTML on a document fragment - tmpnodes = d.createElement('div'); - tmpnodes.innerHTML = value; - while ((tmpnode = tmpnodes.lastChild) !== null) { - // Catch error in unlikely case elm has been removed - try { - if (position === 'before') { - elm.parentNode.insertBefore(tmpnode, elm); - } else if (position === 'after') { - elm.parentNode.insertBefore(tmpnode, elm.nextSibling); - } else if (position === 'append') { - elm.appendChild(tmpnode); - } else if (position === 'prepend') { - elm.insertBefore(tmpnode, elm.firstChild); - } - } catch (e) { - break; - } - } - }, nodes); - } - } - - // Get nodes and return chibi - function chibi(selector) { - var cb, nodes = [], json = false, nodelist, i; - - if (selector) { - - // Element node, would prefer to use (selector instanceof HTMLElement) but no IE support - if (selector.nodeType && selector.nodeType === 1) { - nodes = [selector]; // return element as node list - } else if (typeof selector === 'object') { - // JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support - json = (typeof selector.length !== 'number'); - nodes = selector; - } else if (typeof selector === 'string') { - nodelist = d.querySelectorAll(selector); - - // Convert node list to array so results have full access to array methods - // Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway - for (i = 0; i < nodelist.length; i += 1) { - nodes[i] = nodelist[i]; - } - } - } - - // Only attach nodes if not JSON - cb = json ? {} : nodes; - - // Public functions - - // Executes a function on nodes - cb.each = function (fn) { - if (typeof fn === 'function') { - nodeLoop(function (elm) { - // <= IE 8 loses scope so need to apply - return fn.apply(elm, arguments); - }, nodes); - } - return cb; - }; - // Find first - cb.first = function () { - return chibi(nodes.shift()); - }; - // Find last - cb.last = function () { - return chibi(nodes.pop()); - }; - // Find odd - cb.odd = function () { - var odds = [], i; - for (i = 0; i < nodes.length; i += 2) { - odds.push(nodes[i]); - } - return chibi(odds); - }; - // Find even - cb.even = function () { - var evens = [], i; - for (i = 1; i < nodes.length; i += 2) { - evens.push(nodes[i]); - } - return chibi(evens); - }; - // Hide node - cb.hide = function () { - nodeLoop(function (elm) { - elm.style.display = 'none'; - }, nodes); - return cb; - }; - // Show node - cb.show = function () { - nodeLoop(function (elm) { - showCss(elm); - }, nodes); - return cb; - }; - // Toggle node display - cb.toggle = function (state) { - if (typeof state != 'undefined') { // ADDED - if (state) - cb.show(); - else - cb.hide(); - } else { - nodeLoop(function (elm) { - // computeStyle instead of style.display == 'none' catches elements that are hidden via style block - if (computeStyle(elm, 'display') === 'none') { - showCss(elm); - } else { - elm.style.display = 'none'; - } - - }, nodes); - } - return cb; - }; - // Remove node - cb.remove = function () { - nodeLoop(function (elm) { - // Catch error in unlikely case elm has been removed - try { - elm.parentNode.removeChild(elm); - } catch (e) { - } - }, nodes); - return chibi(); - }; - // Get/Set CSS - cb.css = function (property, value) { - if (property) { - if (value || value === '') { - nodeLoop(function (elm) { - setCss(elm, property, value); - }, nodes); - return cb; - } - if (nodes[0]) { - if (nodes[0].style[cssCamel(property)]) { - return nodes[0].style[cssCamel(property)]; - } - if (computeStyle(nodes[0], property)) { - return computeStyle(nodes[0], property); - } - } - } - }; - // Get class(es) - cb.getClass = function () { - if (nodes[0] && nodes[0].className.length > 0) { - // Weak IE trim support - return nodes[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '').replace(/\s+/, ' '); - } - }; - // Set (replaces) classes - cb.setClass = function (classes) { - if (classes || classes === '') { - nodeLoop(function (elm) { - elm.className = classes; - }, nodes); - } - return cb; - }; - // Add class - cb.addClass = function (classes) { - classHelper(classes, 'add', nodes); - // if (classes) { - // nodeLoop(function (elm) { - // elm.className += ' ' + classes; - // }, nodes); - // } - return cb; - }; - // Remove class - cb.removeClass = function (classes) { - classHelper(classes, 'remove', nodes); - return cb; - }; - // Toggle class - cb.toggleClass = function (classes, set) { - var method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove')); - classHelper(classes, method, nodes); - return cb; - }; - // Has class - cb.hasClass = function (classes) { - return classHelper(classes, 'has', nodes); - }; - // Get/set HTML - cb.html = function (value) { - if (value || value === '') { - nodeLoop(function (elm) { - elm.innerHTML = value; - }, nodes); - return cb; - } - if (nodes[0]) { - return nodes[0].innerHTML; - } - }; - // Insert HTML before selector - cb.htmlBefore = function (value) { - insertHtml(value, 'before', nodes); - return cb; - }; - // Insert HTML after selector - cb.htmlAfter = function (value) { - insertHtml(value, 'after', nodes); - return cb; - }; - // Insert HTML after selector innerHTML - cb.htmlAppend = function (value) { - insertHtml(value, 'append', nodes); - return cb; - }; - // Insert HTML before selector innerHTML - cb.htmlPrepend = function (value) { - insertHtml(value, 'prepend', nodes); - return cb; - }; - // Get/Set HTML attributes - cb.attr = function (property, value) { - if (property) { - property = property.toLowerCase(); - // IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway - if (typeof value !== 'undefined') {//FIXED BUG HERE - nodeLoop(function (elm) { - if (property === 'style') { - elm.style.cssText = value; - } else if (property === 'class') { - elm.className = value; - } else { - elm.setAttribute(property, value); - } - }, nodes); - return cb; - } - if (nodes[0]) { - if (property === 'style') { - if (nodes[0].style.cssText) { - return nodes[0].style.cssText; - } - } else if (property === 'class') { - if (nodes[0].className) { - return nodes[0].className; - } - } else { - if (nodes[0].getAttribute(property)) { - return nodes[0].getAttribute(property); - } - } - } - } - }; - // Get/Set HTML data property - cb.data = function (key, value) { - if (key) { - return cb.attr('data-' + key, value); - } - }; - // Get/Set form element values - cb.val = function (value) { - var values, i, j; - if (typeof value != 'undefined') { // FIXED A BUG HERE - nodeLoop(function (elm) { - switch (elm.nodeName) { - case 'SELECT': - if (typeof value === 'string' || typeof value === 'number') { - value = [value]; - } - for (i = 0; i < elm.length; i += 1) { - // Multiple select - for (j = 0; j < value.length; j += 1) { - elm[i].selected = ''; - if (elm[i].value === ""+value[j]) { - elm[i].selected = 'selected'; - break; - } - } - } - break; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - elm.value = value; - break; - } - }, nodes); - - return cb; - } - if (nodes[0]) { - switch (nodes[0].nodeName) { - case 'SELECT': - values = []; - for (i = 0; i < nodes[0].length; i += 1) { - if (nodes[0][i].selected) { - values.push(nodes[0][i].value); - } - } - return (values.length > 1) ? values : values[0]; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - return nodes[0].value; - } - } - }; - // Return matching checked checkbox or radios - cb.checked = function (check) { - if (typeof check === 'boolean') { - nodeLoop(function (elm) { - if (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) { - elm.checked = check; - } - }, nodes); - return cb; - } - if (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) { - return (!!nodes[0].checked); - } - }; - // Add event handler - cb.on = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.addEventListener(event, fn, false); - } else if (d.attachEvent) { - // <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions) - elm[event + fn] = function () { - return fn.apply(elm, arguments); - }; - elm.attachEvent('on' + event, elm[event + fn]); - } - }, nodes); - return cb; - }; - // Remove event handler - cb.off = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.removeEventListener(event, fn, false); - } else if (d.attachEvent) { - elm.detachEvent('on' + event, elm[event + fn]); - // Tidy up - elm[event + fn] = null; - } - }, nodes); - return cb; - }; - return cb; - } - - // Basic XHR - chibi.ajax = function (options) { // if options is a number, it's timeout in ms - var opts = extend({ - method: 'GET', - nocache: true, - timeout: 5000, - loader: true, - callback: null - }, options); - opts.method = opts.method.toUpperCase(); - - var loaderFn = opts.loader ? chibi._loader : function(){}; - var url = opts.url; - var method = opts.method; - var query = null; - - if (opts.data) { - query = serializeData(opts.data); - } - - if (query && (method === 'GET')) { - url += (url.indexOf('?') === -1) ? '?' + query : '&' + query; - query = null; - } - - var xhr = new XMLHttpRequest(); - - // prevent caching - if (opts.nocache) { - var ts = (+(new Date())).toString(36); - url += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts; - } - - loaderFn(true); - - xhr.open(method, url, true); - xhr.timeout = opts.timeout; - - // Abort after given timeout - var abortTmeo = setTimeout(function () { - console.error("XHR timed out."); - xhr.abort(); - loaderFn(false); - }, opts.timeout + 10); - - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - loaderFn(false); - - opts.callback && opts.callback(xhr.responseText, xhr.status); - - clearTimeout(abortTmeo); - } - }; - - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - if (method === 'POST') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - xhr.send(query); - return xhr; - }; - - chibi._loader = function(){}; - - // Alias to cb.ajax(url, 'get', callback) - chibi.get = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'GET'; - return chibi.ajax(opts); - }; - - // Alias to cb.ajax(url, 'post', callback) - chibi.post = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'POST'; - return chibi.ajax(opts); - }; - - // Fire on DOM ready - chibi.ready = function (fn) { - if (fn) { - if (domready) { - fn(); - return chibi; - } else { - readyfn.push(fn); - } - } - }; - - // Fire on page loaded - chibi.loaded = function (fn) { - if (fn) { - if (pageloaded) { - fn(); - return chibi; - } else { - loadedfn.push(fn); - } - } - }; - - var entityMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', - '`': '`', - '=': '=' - }; - - chibi.htmlEscape = function(string) { - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - }; - - // Set Chibi's global namespace here ($) - w.$ = chibi; -}()); -// keymaster.js -// (c) 2011-2013 Thomas Fuchs -// keymaster.js may be freely distributed under the MIT license. - -;(function(global){ - var k, - _handlers = {}, - _mods = { 16: false, 18: false, 17: false, 91: false }, - _scope = 'all', - // modifier keys - _MODIFIERS = { - '⇧': 16, shift: 16, - '⌥': 18, alt: 18, option: 18, - '⌃': 17, ctrl: 17, control: 17, - '⌘': 91, command: 91 - }, - // special keys - _MAP = { - backspace: 8, tab: 9, clear: 12, - enter: 13, 'return': 13, - esc: 27, escape: 27, space: 32, - left: 37, up: 38, - right: 39, down: 40, - del: 46, 'delete': 46, - home: 36, end: 35, - pageup: 33, pagedown: 34, - ',': 188, '.': 190, '/': 191, - '`': 192, '-': 189, '=': 187, - ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220, - // added: - insert: 45, - np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101, - np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106, - np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144, - }, - code = function(x){ - return _MAP[x] || x.toUpperCase().charCodeAt(0); - }, - _downKeys = []; - - for(k=1;k<20;k++) _MAP['f'+k] = 111+k; - - // IE doesn't support Array#indexOf, so have a simple replacement - function index(array, item){ - var i = array.length; - while(i--) if(array[i]===item) return i; - return -1; - } - - // for comparing mods before unassignment - function compareArray(a1, a2) { - if (a1.length != a2.length) return false; - for (var i = 0; i < a1.length; i++) { - if (a1[i] !== a2[i]) return false; - } - return true; - } - - var modifierMap = { - 16:'shiftKey', - 18:'altKey', - 17:'ctrlKey', - 91:'metaKey' - }; - function updateModifierKey(event) { - for(k in _mods) _mods[k] = event[modifierMap[k]]; - }; - - function isModifierPressed(mod) { - if (mod=='control'||mod=='ctrl') return _mods[17]; - if (mod=='shift') return _mods[16]; - if (mod=='meta') return _mods[91]; - if (mod=='alt') return _mods[18]; - return false; - } - - // handle keydown event - function dispatch(event) { - var key, handler, k, i, modifiersMatch, scope; - key = event.keyCode; - - if (index(_downKeys, key) == -1) { - _downKeys.push(key); - } - - // if a modifier key, set the key. property to true and return - if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko - if(key in _mods) { - _mods[key] = true; - // 'assignKey' from inside this closure is exported to window.key - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; - return; - } - updateModifierKey(event); - - // see if we need to ignore the keypress (filter() can can be overridden) - // by default ignore key presses if a select, textarea, or input is focused - if(!assignKey.filter.call(this, event)) return; - - // abort if no potentially matching shortcuts found - if (!(key in _handlers)) return; - - scope = getScope(); - - // for each potential shortcut - for (i = 0; i < _handlers[key].length; i++) { - handler = _handlers[key][i]; - - // see if it's in the current scope - if(handler.scope == scope || handler.scope == 'all'){ - // check if modifiers match if any - modifiersMatch = handler.mods.length > 0; - for(k in _mods) - if((!_mods[k] && index(handler.mods, +k) > -1) || - (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; - // call the handler and stop the event if neccessary - if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ - if(handler.method(event, handler)===false){ - if(event.preventDefault) event.preventDefault(); - else event.returnValue = false; - if(event.stopPropagation) event.stopPropagation(); - if(event.cancelBubble) event.cancelBubble = true; - } - } - } - } - }; - - // unset modifier keys on keyup - function clearModifier(event){ - var key = event.keyCode, k, - i = index(_downKeys, key); - - // remove key from _downKeys - if (i >= 0) { - _downKeys.splice(i, 1); - } - - if(key == 93 || key == 224) key = 91; - if(key in _mods) { - _mods[key] = false; - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; - } - }; - - function resetModifiers() { - for(k in _mods) _mods[k] = false; - for(k in _MODIFIERS) assignKey[k] = false; - }; - - // parse and assign shortcut - function assignKey(key, scope, method){ - var keys, mods; - keys = getKeys(key); - if (method === undefined) { - method = scope; - scope = 'all'; - } - - // for each shortcut - for (var i = 0; i < keys.length; i++) { - // set modifier keys if any - mods = []; - key = keys[i].split('+'); - if (key.length > 1){ - mods = getMods(key); - key = [key[key.length-1]]; - } - // convert to keycode and... - key = key[0] - key = code(key); - // ...store handler - if (!(key in _handlers)) _handlers[key] = []; - _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); - } - }; - - // unbind all handlers for given key in current scope - function unbindKey(key, scope) { - var multipleKeys, keys, - mods = [], - i, j, obj; - - multipleKeys = getKeys(key); - - for (j = 0; j < multipleKeys.length; j++) { - keys = multipleKeys[j].split('+'); - - if (keys.length > 1) { - mods = getMods(keys); - } - - key = keys[keys.length - 1]; - key = code(key); - - if (scope === undefined) { - scope = getScope(); - } - if (!_handlers[key]) { - return; - } - for (i = 0; i < _handlers[key].length; i++) { - obj = _handlers[key][i]; - // only clear handlers if correct scope and mods match - if (obj.scope === scope && compareArray(obj.mods, mods)) { - _handlers[key][i] = {}; - } - } - } - }; - - // Returns true if the key with code 'keyCode' is currently down - // Converts strings into key codes. - function isPressed(keyCode) { - if (typeof(keyCode)=='string') { - keyCode = code(keyCode); - } - return index(_downKeys, keyCode) != -1; - } - - function getPressedKeyCodes() { - return _downKeys.slice(0); - } - - function filter(event){ - var tagName = (event.target || event.srcElement).tagName; - // ignore keypressed in any elements that support keyboard data input - return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); - } - - // initialize key. to false - for(k in _MODIFIERS) assignKey[k] = false; - - // set current scope (default 'all') - function setScope(scope){ _scope = scope || 'all' }; - function getScope(){ return _scope || 'all' }; - - // delete all handlers for a given scope - function deleteScope(scope){ - var key, handlers, i; - - for (key in _handlers) { - handlers = _handlers[key]; - for (i = 0; i < handlers.length; ) { - if (handlers[i].scope === scope) handlers.splice(i, 1); - else i++; - } - } - }; - - // abstract key logic for assign and unassign - function getKeys(key) { - var keys; - key = key.replace(/\s/g, ''); - keys = key.split(','); - if ((keys[keys.length - 1]) == '') { - keys[keys.length - 2] += ','; - } - return keys; - } - - // abstract mods logic for assign and unassign - function getMods(key) { - var mods = key.slice(0, key.length - 1); - for (var mi = 0; mi < mods.length; mi++) - mods[mi] = _MODIFIERS[mods[mi]]; - return mods; - } - - // cross-browser events - function addEvent(object, event, method) { - if (object.addEventListener) - object.addEventListener(event, method, false); - else if(object.attachEvent) - object.attachEvent('on'+event, function(){ method(window.event) }); - }; - - // set the handlers globally on document - addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 - addEvent(document, 'keyup', clearModifier); - - // reset modifiers to false whenever the window is (re)focused. - addEvent(window, 'focus', resetModifiers); - - // store previously defined key - var previousKey = global.key; - - // restore previously defined key and return reference to our key object - function noConflict() { - var k = global.key; - global.key = previousKey; - return k; - } - - // set window.key and window.key.set/get/deleteScope, and the default filter - global.key = assignKey; - global.key.setScope = setScope; - global.key.getScope = getScope; - global.key.deleteScope = deleteScope; - global.key.filter = filter; - global.key.isPressed = isPressed; - global.key.isModifier = isModifierPressed; - global.key.getPressedKeyCodes = getPressedKeyCodes; - global.key.noConflict = noConflict; - global.key.unbind = unbindKey; - - if(typeof module !== 'undefined') module.exports = assignKey; - -})(this); -/** Make a node */ -function mk(e) {return document.createElement(e)} - -/** Find one by query */ -function qs(s) {return document.querySelector(s)} - -/** Find all by query */ -function qsa(s) {return document.querySelectorAll(s)} - -/** Convert any to bool safely */ -function bool(x) { - return (x === 1 || x === '1' || x === true || x === 'true'); -} - -/** - * Filter 'spacebar' and 'return' from keypress handler, - * and when they're pressed, fire the callback. - * use $(...).on('keypress', cr(handler)) - */ -function cr(hdl) { - return function(e) { - if (e.which == 10 || e.which == 13 || e.which == 32) { - hdl(); - } - }; -} - -/** Extend an objects with options */ -function extend(defaults, options) { - var target = {}; - - Object.keys(defaults).forEach(function(k){ - target[k] = defaults[k]; - }); - - Object.keys(options).forEach(function(k){ - target[k] = options[k]; - }); - - return target; -} - -/** Escape string for use as literal in RegExp */ -function rgxe(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); -} - -/** Format number to N decimal places, output as string */ -function numfmt(x, places) { - var pow = Math.pow(10, places); - return Math.round(x*pow) / pow; -} - -/** Get millisecond timestamp */ -function msNow() { - return +(new Date); -} - -/** Get ms elapsed since msNow() */ -function msElapsed(start) { - return msNow() - start; -} - -/** Shim for log base 10 */ -Math.log10 = Math.log10 || function(x) { - return Math.log(x) / Math.LN10; -}; - -/** - * Perform a substitution in the given string. - * - * Arguments - array or list of replacements. - * Arguments numeric keys will replace {0}, {1} etc. - * Named keys also work, ie. {foo: "bar"} -> replaces {foo} with bar. - * - * Braces are added to keys if missing. - * - * @returns {String} result - */ -String.prototype.format = function () { - var out = this; - var repl = arguments; - - if (arguments.length == 1 && (Array.isArray(arguments[0]) || typeof arguments[0] == 'object')) { - repl = arguments[0]; - } - - for (var ph in repl) { - if (repl.hasOwnProperty(ph)) { - var ph_orig = ph; - - if (!ph.match(/^\{.*\}$/)) { - ph = '{' + ph + '}'; - } - - // replace all occurrences - var pattern = new RegExp(rgxe(ph), "g"); - out = out.replace(pattern, repl[ph_orig]); - } - } - - return out; -}; - -/** HTML escape */ -function e(str) { - return $.htmlEscape(str); -} - -/** Check for undefined */ -function undef(x) { - return typeof x == 'undefined'; -} - -/** Safe json parse */ -function jsp(str) { - try { - return JSON.parse(str); - } catch(e) { - console.error(e); - return null; - } -} - -/** Create a character from ASCII code */ -function Chr(n) { - return String.fromCharCode(n); -} - -/** Decode number from 2B encoding */ -function parse2B(s, i) { - return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127; -} - -/** Decode number from 3B encoding */ -function parse3B(s, i) { - return (s.charCodeAt(i) - 1) + (s.charCodeAt(i+1) - 1) * 127 + (s.charCodeAt(i+2) - 1) * 127 * 127; -} - -/** Encode using 2B encoding, returns string. */ -function encode2B(n) { - var lsb, msb; - lsb = (n % 127); - n = ((n - lsb) / 127); - lsb += 1; - msb = (n + 1); - return Chr(lsb) + Chr(msb); -} - -/** Encode using 3B encoding, returns string. */ -function encode3B(n) { - var lsb, msb, xsb; - lsb = (n % 127); - n = (n - lsb) / 127; - lsb += 1; - msb = (n % 127); - n = (n - msb) / 127; - msb += 1; - xsb = (n + 1); - return Chr(lsb) + Chr(msb) + Chr(xsb); -} -/** Module for toggling a modal overlay */ -(function () { - var modal = {}; - var curCloseCb = null; - - modal.show = function (sel, closeCb) { - var $m = $(sel); - $m.removeClass('hidden visible'); - setTimeout(function () { - $m.addClass('visible'); - }, 1); - curCloseCb = closeCb; - }; - - modal.hide = function (sel) { - var $m = $(sel); - $m.removeClass('visible'); - setTimeout(function () { - $m.addClass('hidden'); - if (curCloseCb) curCloseCb(); - }, 500); // transition time - }; - - modal.init = function () { - // close modal by click outside the dialog - $('.Modal').on('click', function () { - if ($(this).hasClass('no-close')) return; // this is a no-close modal - modal.hide(this); - }); - - $('.Dialog').on('click', function (e) { - e.stopImmediatePropagation(); - }); - - // Hide all modals on esc - $(window).on('keydown', function (e) { - if (e.which == 27) { - modal.hide('.Modal'); - } - }); - }; - - window.Modal = modal; -})(); -(function (nt) { - var sel = '#notif'; - - var hideTmeo1; // timeout to start hiding (transition) - var hideTmeo2; // timeout to add the hidden class - - nt.show = function (message, timeout) { - $(sel).html(message); - Modal.show(sel); - - clearTimeout(hideTmeo1); - clearTimeout(hideTmeo2); - - if (undef(timeout)) timeout = 2500; - - hideTmeo1 = setTimeout(nt.hide, timeout); - }; - - nt.hide = function () { - var $m = $(sel); - $m.removeClass('visible'); - hideTmeo2 = setTimeout(function () { - $m.addClass('hidden'); - }, 250); // transition time - }; - - nt.init = function() { - $(sel).on('click', function() { - nt.hide(this); - }); - }; -})(window.Notify = {}); -/** Global generic init */ -$.ready(function () { - // Checkbox UI (checkbox CSS and hidden input with int value) - $('.Row.checkbox').forEach(function(x) { - var inp = x.querySelector('input'); - var box = x.querySelector('.box'); - - $(box).toggleClass('checked', inp.value); - - var hdl = function() { - inp.value = 1 - inp.value; - $(box).toggleClass('checked', inp.value) - }; - - $(x).on('click', hdl).on('keypress', cr(hdl)); - }); - - // Expanding boxes on mobile - $('.Box.mobcol,.Box.fold').forEach(function(x) { - var h = x.querySelector('h2'); - - var hdl = function() { - $(x).toggleClass('expanded'); - }; - $(h).on('click', hdl).on('keypress', cr(hdl)); - }); - - $('form').forEach(function(x) { - $(x).on('keypress', function(e) { - if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) { - x.submit(); - } - }) - }); - - // loader dots... - setInterval(function () { - $('.anim-dots').each(function (x) { - var $x = $(x); - var dots = $x.html() + '.'; - if (dots.length == 5) dots = '.'; - $x.html(dots); - }); - }, 1000); - - // flipping number boxes with the mouse wheel - $('input[type=number]').on('mousewheel', function(e) { - var $this = $(this); - var val = +$this.val(); - if (isNaN(val)) val = 1; - - var step = +($this.attr('step') || 1); - var min = +$this.attr('min'); - var max = +$this.attr('max'); - if(e.wheelDelta > 0) { - val += step; - } else { - val -= step; - } - - if (typeof min != 'undefined') val = Math.max(val, +min); - if (typeof max != 'undefined') val = Math.min(val, +max); - $this.val(val); - - if ("createEvent" in document) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); - $this[0].dispatchEvent(evt); - } else { - $this[0].fireEvent("onchange"); - } - - e.preventDefault(); - }); - - var errAt = location.search.indexOf('err='); - if (errAt !== -1 && qs('.Box.errors')) { - var errs = location.search.substr(errAt+4).split(','); - var hres = []; - errs.forEach(function(er) { - var lbl = qs('label[for="'+er+'"]'); - if (lbl) { - lbl.classList.add('error'); - hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, '')); - } else { - hres.push(er); - } - }); - - qs('.Box.errors .list').innerHTML = hres.join(', '); - qs('.Box.errors').classList.remove('hidden'); - } - - Modal.init(); - Notify.init(); - - // remove tabindixes from h2 if wide - if (window.innerWidth > 550) { - $('.Box h2').forEach(function (x) { - x.removeAttribute('tabindex'); - }); - - // brand works as a link back to term in widescreen mode - var br = qs('#brand'); - br && br.addEventListener('click', function() { - location.href='/'; // go to terminal - }); - } -}); - -$._loader = function(vis) { - $('#loader').toggleClass('show', vis); -}; - -function showPage() { - $('#content').addClass('load'); -} - -$.ready(function() { - if (window.noAutoShow !== true) { - setTimeout(function () { - showPage(); - }, 1); - } -}); - - -/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ -if (!String.fromCodePoint) { - (function() { - var defineProperty = (function() { - // IE 8 only supports `Object.defineProperty` on DOM elements - try { - var object = {}; - var $defineProperty = Object.defineProperty; - var result = $defineProperty(object, object, object) && $defineProperty; - } catch(error) {} - return result; - }()); - var stringFromCharCode = String.fromCharCode; - var floor = Math.floor; - var fromCodePoint = function() { - var MAX_SIZE = 0x4000; - var codeUnits = []; - var highSurrogate; - var lowSurrogate; - var index = -1; - var length = arguments.length; - if (!length) { - return ''; - } - var result = ''; - while (++index < length) { - var codePoint = Number(arguments[index]); - if ( - !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` - codePoint < 0 || // not a valid Unicode code point - codePoint > 0x10FFFF || // not a valid Unicode code point - floor(codePoint) != codePoint // not an integer - ) { - throw RangeError('Invalid code point: ' + codePoint); - } - if (codePoint <= 0xFFFF) { // BMP code point - codeUnits.push(codePoint); - } else { // Astral code point; split in surrogate halves - // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - codePoint -= 0x10000; - highSurrogate = (codePoint >> 10) + 0xD800; - lowSurrogate = (codePoint % 0x400) + 0xDC00; - codeUnits.push(highSurrogate, lowSurrogate); - } - if (index + 1 == length || codeUnits.length > MAX_SIZE) { - result += stringFromCharCode.apply(null, codeUnits); - codeUnits.length = 0; - } - } - return result; - }; - if (defineProperty) { - defineProperty(String, 'fromCodePoint', { - 'value': fromCodePoint, - 'configurable': true, - 'writable': true - }); - } else { - String.fromCodePoint = fromCodePoint; - } - }()); -} -// Generated from PHP locale file -var _tr = { - "wifi.connected_ip_is": "Connected, IP is ", - "wifi.not_conn": "Not connected.", - "wifi.enter_passwd": "Enter password for \":ssid:\"" -}; - -function tr(key) { return _tr[key] || '?'+key+'?'; } -(function(w) { - var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']; - var curSSID; - - // Get XX % for a slider input - function rangePt(inp) { - return Math.round(((inp.value / inp.max)*100)) + '%'; - } - - // Display selected STA SSID etc - function selectSta(name, password, ip) { - $('#sta_ssid').val(name); - $('#sta_password').val(password); - - $('#sta-nw').toggleClass('hidden', name.length == 0); - $('#sta-nw-nil').toggleClass('hidden', name.length > 0); - - $('#sta-nw .essid').html(e(name)); - var nopw = undef(password) || password.length == 0; - $('#sta-nw .passwd').toggleClass('hidden', nopw); - $('#sta-nw .nopasswd').toggleClass('hidden', !nopw); - $('#sta-nw .ip').html(ip.length>0 ? tr('wifi.connected_ip_is')+ip : tr('wifi.not_conn')); - } - - /** Update display for received response */ - function onScan(resp, status) { - //var ap_json = { - // "result": { - // "inProgress": "0", - // "APs": [ - // {"essid": "Chlivek", "bssid": "88:f7:c7:52:b3:99", "rssi": "204", "enc": "4", "channel": "1"}, - // {"essid": "TyNikdy", "bssid": "5c:f4:ab:0d:f1:1b", "rssi": "164", "enc": "3", "channel": "1"}, - // ] - // } - //}; - - if (status != 200) { - // bad response - rescan(5000); // wait 5sm then retry - return; - } - - try { - resp = JSON.parse(resp); - } catch (e) { - console.log(e); - rescan(5000); - return; - } - - var done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0); - rescan(done ? 15000 : 1000); - if (!done) return; // no redraw yet - - // clear the AP list - var $list = $('#ap-list'); - // remove old APs - $('#ap-list .AP').remove(); - - $list.toggleClass('hidden', !done); - $('#ap-loader').toggleClass('hidden', done); - - // scan done - resp.result.APs.sort(function (a, b) { - return b.rssi - a.rssi; - }).forEach(function (ap) { - ap.enc = parseInt(ap.enc); - - if (ap.enc > 4) return; // hide unsupported auths - - var item = mk('div'); - - var $item = $(item) - .data('ssid', ap.essid) - .data('pwd', ap.enc) - .attr('tabindex', 0) - .addClass('AP'); - - // mark current SSID - if (ap.essid == curSSID) { - $item.addClass('selected'); - } - - var inner = mk('div'); - $(inner).addClass('inner') - .htmlAppend('
{0}
'.format(ap.rssi_perc)) - .htmlAppend('
{0}
'.format($.htmlEscape(ap.essid))) - .htmlAppend('
{0}
'.format(authStr[ap.enc])); - - $item.on('click', function () { - var $th = $(this); - - var conn_ssid = $th.data('ssid'); - var conn_pass = ''; - - if (+$th.data('pwd')) { - // this AP needs a password - conn_pass = prompt(tr("wifi.enter_passwd").replace(":ssid:", conn_ssid)); - if (!conn_pass) return; - } - - $('#sta_password').val(conn_pass); - $('#sta_ssid').val(conn_ssid); - selectSta(conn_ssid, conn_pass, ''); - }); - - - item.appendChild(inner); - $list[0].appendChild(item); - }); - } - - function startScanning() { - $('#ap-loader').removeClass('hidden'); - $('#ap-scan').addClass('hidden'); - $('#ap-loader .anim-dots').html('.'); - - scanAPs(); - } - - /** Ask the CGI what APs are visible (async) */ - function scanAPs() { - if (_demo) { - onScan(_demo_aps, 200); - } else { - $.get('http://' + _root + '/cfg/wifi/scan', onScan); - } - } - - function rescan(time) { - setTimeout(scanAPs, time); - } - - /** Set up the WiFi page */ - function wifiInit(cfg) { - // Update slider value displays - $('.Row.range').forEach(function(x) { - var inp = x.querySelector('input'); - var disp1 = x.querySelector('.x-disp1'); - var disp2 = x.querySelector('.x-disp2'); - var t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - $(inp).on('input', function() { - t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - }); - }); - - // Forget STA credentials - $('#forget-sta').on('click', function() { - selectSta('', '', ''); - return false; - }); - - selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip); - curSSID = cfg.sta_active_ssid; - } - - w.init = wifiInit; - w.startScanning = startScanning; -})(window.WiFi = {}); -/** Handle connections */ -var Conn = (function() { - var ws; - var heartbeatTout; - var pingIv; - var xoff = false; - var autoXoffTout; - - function onOpen(evt) { - console.log("CONNECTED"); - } - - function onClose(evt) { - console.warn("SOCKET CLOSED, code "+evt.code+". Reconnecting..."); - setTimeout(function() { - init(); - }, 200); - // this happens when the buffer gets fucked up via invalid unicode. - // we basically use polling instead of socket then - } - - function onMessage(evt) { - try { - // . = heartbeat - switch (evt.data.charAt(0)) { - case 'B': - case 'T': - case 'S': - Screen.load(evt.data); - break; - - case '-': - //console.log('xoff'); - xoff = true; - autoXoffTout = setTimeout(function(){xoff=false;}, 250); - break; - - case '+': - //console.log('xon'); - xoff = false; - clearTimeout(autoXoffTout); - break; - } - heartbeat(); - } catch(e) { - console.error(e); - } - } - - function canSend() { - return !xoff; - } - - function doSend(message) { - if (_demo) { - console.log("TX: ", message); - return true; // Simulate success - } - if (xoff) { - // TODO queue - console.log("Can't send, flood control."); - return false; - } - - if (!ws) return false; // for dry testing - if (ws.readyState != 1) { - console.error("Socket not ready"); - return false; - } - if (typeof message != "string") { - message = JSON.stringify(message); - } - ws.send(message); - return true; - } - - function init() { - if (_demo) { - console.log("Demo mode!"); - Screen.load(_demo_screen); - showPage(); - return; - } - heartbeat(); - - ws = new WebSocket("ws://"+_root+"/term/update.ws"); - ws.onopen = onOpen; - ws.onclose = onClose; - ws.onmessage = onMessage; - - console.log("Opening socket."); - - // Ask for initial data - $.get('http://'+_root+'/term/init', function(resp, status) { - if (status !== 200) location.reload(true); - console.log("Data received!"); - Screen.load(resp); - heartbeat(); - - showPage(); - }); - } - - function heartbeat() { - clearTimeout(heartbeatTout); - heartbeatTout = setTimeout(heartbeatFail, 2000); - } - - function heartbeatFail() { - console.error("Heartbeat lost, probing server..."); - pingIv = setInterval(function() { - console.log("> ping"); - $.get('http://'+_root+'/system/ping', function(resp, status) { - if (status == 200) { - clearInterval(pingIv); - console.info("Server ready, reloading page..."); - location.reload(); - } - }, { - timeout: 100, - }); - }, 500); - } - - return { - ws: null, - init: init, - send: doSend, - canSend: canSend, // check flood control - }; -})(); -/** - * User input - * - * --- Rx messages: --- - * S - screen content (binary encoding of the entire screen with simple compression) - * T - text labels - Title and buttons, \0x01-separated - * B - beep - * . - heartbeat - * - * --- Tx messages --- - * s - string - * b - action button - * p - mb press - * r - mb release - * m - mouse move - */ -var Input = (function() { - var opts = { - np_alt: false, - cu_alt: false, - fn_alt: false, - mt_click: false, - mt_move: false, - no_keys: false, - }; - - /** Send a literal message */ - function sendStrMsg(str) { - return Conn.send("s"+str); - } - - /** Send a button event */ - function sendBtnMsg(n) { - Conn.send("b"+Chr(n)); - } - - /** Fn alt choice for key message */ - function fa(alt, normal) { - return opts.fn_alt ? alt : normal; - } - - /** Cursor alt choice for key message */ - function ca(alt, normal) { - return opts.cu_alt ? alt : normal; - } - - /** Numpad alt choice for key message */ - function na(alt, normal) { - return opts.np_alt ? alt : normal; - } - - function _bindFnKeys() { - var keymap = { - 'tab': '\x09', - 'backspace': '\x08', - 'enter': '\x0d', - 'ctrl+enter': '\x0a', - 'esc': '\x1b', - 'up': ca('\x1bOA', '\x1b[A'), - 'down': ca('\x1bOB', '\x1b[B'), - 'right': ca('\x1bOC', '\x1b[C'), - 'left': ca('\x1bOD', '\x1b[D'), - 'home': ca('\x1bOH', fa('\x1b[H', '\x1b[1~')), - 'insert': '\x1b[2~', - 'delete': '\x1b[3~', - 'end': ca('\x1bOF', fa('\x1b[F', '\x1b[4~')), - 'pageup': '\x1b[5~', - 'pagedown': '\x1b[6~', - 'f1': fa('\x1bOP', '\x1b[11~'), - 'f2': fa('\x1bOQ', '\x1b[12~'), - 'f3': fa('\x1bOR', '\x1b[13~'), - 'f4': fa('\x1bOS', '\x1b[14~'), - 'f5': '\x1b[15~', // note the disconnect - 'f6': '\x1b[17~', - 'f7': '\x1b[18~', - 'f8': '\x1b[19~', - 'f9': '\x1b[20~', - 'f10': '\x1b[21~', // note the disconnect - 'f11': '\x1b[23~', - 'f12': '\x1b[24~', - 'shift+f1': fa('\x1bO1;2P', '\x1b[25~'), - 'shift+f2': fa('\x1bO1;2Q', '\x1b[26~'), // note the disconnect - 'shift+f3': fa('\x1bO1;2R', '\x1b[28~'), - 'shift+f4': fa('\x1bO1;2S', '\x1b[29~'), // note the disconnect - 'shift+f5': fa('\x1b[15;2~', '\x1b[31~'), - 'shift+f6': fa('\x1b[17;2~', '\x1b[32~'), - 'shift+f7': fa('\x1b[18;2~', '\x1b[33~'), - 'shift+f8': fa('\x1b[19;2~', '\x1b[34~'), - 'shift+f9': fa('\x1b[20;2~', '\x1b[35~'), // 35-38 are not standard - but what is? - 'shift+f10': fa('\x1b[21;2~', '\x1b[36~'), - 'shift+f11': fa('\x1b[22;2~', '\x1b[37~'), - 'shift+f12': fa('\x1b[23;2~', '\x1b[38~'), - 'np_0': na('\x1bOp', '0'), - 'np_1': na('\x1bOq', '1'), - 'np_2': na('\x1bOr', '2'), - 'np_3': na('\x1bOs', '3'), - 'np_4': na('\x1bOt', '4'), - 'np_5': na('\x1bOu', '5'), - 'np_6': na('\x1bOv', '6'), - 'np_7': na('\x1bOw', '7'), - 'np_8': na('\x1bOx', '8'), - 'np_9': na('\x1bOy', '9'), - 'np_mul': na('\x1bOR', '*'), - 'np_add': na('\x1bOl', '+'), - 'np_sub': na('\x1bOS', '-'), - 'np_point': na('\x1bOn', '.'), - 'np_div': na('\x1bOQ', '/'), - // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest) - }; - - for (var k in keymap) { - if (keymap.hasOwnProperty(k)) { - bind(k, keymap[k]); - } - } - } - - /** Bind a keystroke to message */ - function bind(combo, str) { - // mac fix - allow also cmd - if (combo.indexOf('ctrl+') !== -1) { - combo += ',' + combo.replace('ctrl', 'command'); - } - - // unbind possible old binding - key.unbind(combo); - - key(combo, function (e) { - if (opts.no_keys) return; - e.preventDefault(); - sendStrMsg(str) - }); - } - - /** Bind/rebind key messages */ - function _initKeys() { - // This takes care of text characters typed - window.addEventListener('keypress', function(evt) { - if (opts.no_keys) return; - var str = ''; - if (evt.key) str = evt.key; - else if (evt.which) str = String.fromCodePoint(evt.which); - if (str.length>0 && str.charCodeAt(0) >= 32) { -// console.log("Typed ", str); - sendStrMsg(str); - } - }); - - // ctrl-letter codes are sent as simple low ASCII codes - for (var i = 1; i<=26;i++) { - bind('ctrl+' + String.fromCharCode(96+i), String.fromCharCode(i)); - } - bind('ctrl+]', '\x1b'); // alternate way to enter ESC - bind('ctrl+\\', '\x1c'); - bind('ctrl+[', '\x1d'); - bind('ctrl+^', '\x1e'); - bind('ctrl+_', '\x1f'); - - _bindFnKeys(); - } - - // mouse button states - var mb1 = 0; - var mb2 = 0; - var mb3 = 0; - - /** Init the Input module */ - function init() { - _initKeys(); - - // Button presses - $('#action-buttons button').forEach(function(s) { - s.addEventListener('click', function() { - sendBtnMsg(+this.dataset['n']); - }); - }); - - // global mouse state tracking - for motion reporting - window.addEventListener('mousedown', function(evt) { - if (evt.button == 0) mb1 = 1; - if (evt.button == 1) mb2 = 1; - if (evt.button == 2) mb3 = 1; - }); - - window.addEventListener('mouseup', function(evt) { - if (evt.button == 0) mb1 = 0; - if (evt.button == 1) mb2 = 0; - if (evt.button == 2) mb3 = 0; - }); - } - - /** Prepare modifiers byte for mouse message */ - function packModifiersForMouse() { - return (key.isModifier('ctrl')?1:0) | - (key.isModifier('shift')?2:0) | - (key.isModifier('alt')?4:0) | - (key.isModifier('meta')?8:0); - } - - return { - /** Init the Input module */ - init: init, - - /** Send a literal string message */ - sendString: sendStrMsg, - - /** Enable alternate key modes (cursors, numpad, fn) */ - setAlts: function(cu, np, fn) { - if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { - opts.cu_alt = cu; - opts.np_alt = np; - opts.fn_alt = fn; - - // rebind keys - codes have changed - _bindFnKeys(); - } - }, - - setMouseMode: function(click, move) { - opts.mt_click = click; - opts.mt_move = move; - }, - - // Mouse events - onMouseMove: function (x, y) { - if (!opts.mt_move) return; - var b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0; - var m = packModifiersForMouse(); - Conn.send("m" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - }, - onMouseDown: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseUp: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("r" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseWheel: function (x, y, dir) { - if (!opts.mt_click) return; - // -1 ... btn 4 (away from user) - // +1 ... btn 5 (towards user) - var m = packModifiersForMouse(); - var b = (dir < 0 ? 4 : 5); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - mouseTracksClicks: function() { - return opts.mt_click; - }, - blockKeys: function(yes) { - opts.no_keys = yes; - } - }; -})(); - -var Screen = (function () { - var W = 0, H = 0; // dimensions - var inited = false; - - var cursor = { - a: false, // active (blink state) - x: 0, // 0-based coordinates - y: 0, - fg: 7, // colors 0-15 - bg: 0, - attrs: 0, - suppress: false, // do not turn on in blink interval (for safe moving) - forceOn: false, // force on unless hanging: used to keep cursor visible during move - hidden: false, // do not show (DEC opt) - hanging: false, // cursor at column "W+1" - not visible - }; - - var screen = []; - var blinkIval; - var cursorFlashStartIval; - - // Some non-bold Fraktur symbols are outside the contiguous block - var frakturExceptions = { - 'C': '\u212d', - 'H': '\u210c', - 'I': '\u2111', - 'R': '\u211c', - 'Z': '\u2128', - }; - - // for BEL - var audioCtx = null; - try { - audioCtx = new (window.AudioContext || window.audioContext || window.webkitAudioContext)(); - } catch (er) { - console.error("No AudioContext!", er); - } - - /** Get cell under cursor */ - function _curCell() { - return screen[cursor.y*W + cursor.x]; - } - - /** Safely move cursor */ - function cursorSet(y, x) { - // Hide and prevent from showing up during the move - cursor.suppress = true; - _draw(_curCell(), false); - cursor.x = x; - cursor.y = y; - // Show again - cursor.suppress = false; - _draw(_curCell()); - } - - function alpha2fraktur(t) { - // perform substitution - if (t >= 'a' && t <= 'z') { - t = String.fromCodePoint(0x1d51e - 97 + t.charCodeAt(0)); - } - else if (t >= 'A' && t <= 'Z') { - // this set is incomplete, some exceptions are needed - if (frakturExceptions.hasOwnProperty(t)) { - t = frakturExceptions[t]; - } else { - t = String.fromCodePoint(0x1d504 - 65 + t.charCodeAt(0)); - } - } - return t; - } - - /** Update cell on display. inv = invert (for cursor) */ - function _draw(cell, inv) { - if (!cell) return; - if (typeof inv == 'undefined') { - inv = cursor.a && cursor.x == cell.x && cursor.y == cell.y; - } - - var fg, bg, cn, t; - - fg = inv ? cell.bg : cell.fg; - bg = inv ? cell.fg : cell.bg; - - t = cell.t; - if (!t.length) t = ' '; - - cn = 'fg' + fg + ' bg' + bg; - if (cell.attrs & (1<<0)) cn += ' bold'; - if (cell.attrs & (1<<1)) cn += ' faint'; - if (cell.attrs & (1<<2)) cn += ' italic'; - if (cell.attrs & (1<<3)) cn += ' under'; - if (cell.attrs & (1<<4)) cn += ' blink'; - if (cell.attrs & (1<<5)) { - cn += ' fraktur'; - t = alpha2fraktur(t); - } - if (cell.attrs & (1<<6)) cn += ' strike'; - - cell.slot.textContent = t; - cell.elem.className = cn; - } - - /** Show entire screen */ - function _drawAll() { - for (var i = W*H-1; i>=0; i--) { - _draw(screen[i]); - } - } - - function _rebuild(rows, cols) { - W = cols; - H = rows; - - /* Build screen & show */ - var cOuter, cInner, cell, screenDiv = qs('#screen'); - - // Empty the screen node - while (screenDiv.firstChild) screenDiv.removeChild(screenDiv.firstChild); - - screen = []; - - for(var i = 0; i < W*H; i++) { - cOuter = mk('span'); - cInner = mk('span'); - - /* Mouse tracking */ - (function() { - var x = i % W; - var y = Math.floor(i / W); - cOuter.addEventListener('mouseenter', function (evt) { - Input.onMouseMove(x, y); - }); - cOuter.addEventListener('mousedown', function (evt) { - Input.onMouseDown(x, y, evt.button+1); - }); - cOuter.addEventListener('mouseup', function (evt) { - Input.onMouseUp(x, y, evt.button+1); - }); - cOuter.addEventListener('contextmenu', function (evt) { - if (Input.mouseTracksClicks()) { - evt.preventDefault(); - } - }); - cOuter.addEventListener('mousewheel', function (evt) { - Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); - return false; - }); - })(); - - /* End of line */ - if ((i > 0) && (i % W == 0)) { - screenDiv.appendChild(mk('br')); - } - /* The cell */ - cOuter.appendChild(cInner); - screenDiv.appendChild(cOuter); - - cell = { - t: ' ', - fg: 7, - bg: 0, // the colors will be replaced immediately as we receive data (user won't see this) - attrs: 0, - elem: cOuter, - slot: cInner, - x: i % W, - y: Math.floor(i / W), - }; - screen.push(cell); - _draw(cell); - } - } - - /** Init the terminal */ - function _init() { - /* Cursor blinking */ - clearInterval(blinkIval); - blinkIval = setInterval(function () { - cursor.a = !cursor.a; - if (cursor.hidden || cursor.hanging) { - cursor.a = false; - } - - if (!cursor.suppress) { - _draw(_curCell(), cursor.forceOn || cursor.a); - } - }, 500); - - /* blink attribute animation */ - setInterval(function () { - $('#screen').removeClass('blink-hide'); - setTimeout(function () { - $('#screen').addClass('blink-hide'); - }, 800); // 200 ms ON - }, 1000); - - inited = true; - } - - // constants for decoding the update blob - var SEQ_SET_COLOR_ATTR = 1; - var SEQ_REPEAT = 2; - var SEQ_SET_COLOR = 3; - var SEQ_SET_ATTR = 4; - - /** Parse received screen update object (leading S removed already) */ - function _load_content(str) { - var i = 0, ci = 0, j, jc, num, num2, t = ' ', fg, bg, attrs, cell; - - if (!inited) _init(); - - var cursorMoved; - - // Set size - num = parse2B(str, i); i += 2; // height - num2 = parse2B(str, i); i += 2; // width - if (num != H || num2 != W) { - _rebuild(num, num2); - } - // console.log("Size ",num, num2); - - // Cursor position - num = parse2B(str, i); i += 2; // row - num2 = parse2B(str, i); i += 2; // col - cursorMoved = (cursor.x != num2 || cursor.y != num); - cursorSet(num, num2); - // console.log("Cursor at ",num, num2); - - // Attributes - num = parse2B(str, i); i += 2; // fg bg attribs - cursor.hidden = !(num & (1<<0)); // DEC opt "visible" - cursor.hanging = !!(num & (1<<1)); - // console.log("Attributes word ",num.toString(16)+'h'); - - Input.setAlts( - !!(num & (1<<2)), // cursors alt - !!(num & (1<<3)), // numpad alt - !!(num & (1<<4)) // fn keys alt - ); - - var mt_click = !!(num & (1<<5)); - var mt_move = !!(num & (1<<6)); - Input.setMouseMode( - mt_click, - mt_move - ); - $('#screen').toggleClass('noselect', mt_move); - - var show_buttons = !!(num & (1<<7)); - var show_config_links = !!(num & (1<<8)); - $('.x-term-conf-btn').toggleClass('hidden', !show_config_links); - $('#action-buttons').toggleClass('hidden', !show_buttons); - - fg = 7; - bg = 0; - attrs = 0; - - // Here come the content - while(i < str.length && ci> 4; - attrs = (num & 0xFF00)>>8; - } - else if (jc == SEQ_SET_COLOR) { - num = parse2B(str, i); i += 2; - fg = num & 0x0F; - bg = (num & 0xF0) >> 4; - } - else if (jc == SEQ_SET_ATTR) { - num = parse2B(str, i); i += 2; - attrs = num & 0xFF; - } - else if (jc == SEQ_REPEAT) { - num = parse2B(str, i); i += 2; - // console.log("Repeat x ",num); - for (; num>0 && ci 0 ? e(s) : " "; - x.style.opacity = s.length > 0 ? 1 : 0.2; - }) - } - - /** Audible beep for ASCII 7 */ - function _beep() { - var osc, gain; - if (!audioCtx) return; - - // Main beep - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.5; - osc.frequency.value = 750; - osc.type = 'sine'; - osc.start(); - osc.stop(audioCtx.currentTime+0.05); - - // Surrogate beep (making it sound like 'oops') - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.2; - osc.frequency.value = 400; - osc.type = 'sine'; - osc.start(audioCtx.currentTime+0.05); - osc.stop(audioCtx.currentTime+0.08); - } - - /** Load screen content from a binary sequence (new) */ - function load(str) { - //console.log(JSON.stringify(str)); - var content = str.substr(1); - switch(str.charAt(0)) { - case 'S': - _load_content(content); - break; - case 'T': - _load_labels(content); - break; - case 'B': - _beep(); - break; - default: - console.warn("Bad data message type, ignoring."); - console.log(str); - } - } - - return { - load: load, // full load (string) - }; -})(); -/** File upload utility */ -var TermUpl = (function() { - var lines, // array of lines without newlines - line_i, // current line index - fuTout, // timeout handle for line sending - send_delay_ms, // delay between lines (ms) - nl_str, // newline string to use - curLine, // current line (when using fuOil) - inline_pos; // Offset in line (for long lines) - - // lines longer than this are split to chunks - // sending a super-ling string through the socket is not a good idea - var MAX_LINE_LEN = 128; - - function fuOpen() { - fuStatus("Ready..."); - Modal.show('#fu_modal', onClose); - $('#fu_form').toggleClass('busy', false); - Input.blockKeys(true); - } - - function onClose() { - console.log("Upload modal closed."); - clearTimeout(fuTout); - line_i = 0; - Input.blockKeys(false); - } - - function fuStatus(msg) { - qs('#fu_prog').textContent = msg; - } - - function fuSend() { - var v = qs('#fu_text').value; - if (!v.length) { - fuClose(); - return; - } - - lines = v.split('\n'); - line_i = 0; - inline_pos = 0; // offset in line - send_delay_ms = qs('#fu_delay').value; - - // sanitize - 0 causes overflows - if (send_delay_ms < 0) { - send_delay_ms = 0; - qs('#fu_delay').value = send_delay_ms; - } - - nl_str = { - 'CR': '\r', - 'LF': '\n', - 'CRLF': '\r\n', - }[qs('#fu_crlf').value]; - - $('#fu_form').toggleClass('busy', true); - fuStatus("Starting..."); - fuSendLine(); - } - - function fuSendLine() { - if (!$('#fu_modal').hasClass('visible')) { - // Modal is closed, cancel - return; - } - - if (!Conn.canSend()) { - // postpone - fuTout = setTimeout(fuSendLine, 1); - return; - } - - if (inline_pos == 0) { - curLine = lines[line_i++] + nl_str; - } - - var chunk; - if ((curLine.length - inline_pos) <= MAX_LINE_LEN) { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos = 0; - } else { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos += MAX_LINE_LEN; - } - - if (!Input.sendString(chunk)) { - fuStatus("FAILED!"); - return; - } - - var all = lines.length; - - fuStatus(line_i+" / "+all+ " ("+(Math.round((line_i/all)*1000)/10)+"%)"); - - if (lines.length > line_i || inline_pos > 0) { - fuTout = setTimeout(fuSendLine, send_delay_ms); - } else { - closeWhenReady(); - } - } - - function closeWhenReady() { - if (!Conn.canSend()) { - // stuck in XOFF still, wait to process... - fuStatus("Waiting for Tx buffer..."); - setTimeout(closeWhenReady, 100); - } else { - fuStatus("Done."); - // delay to show it - setTimeout(function() { - fuClose(); - }, 100); - } - } - - function fuClose() { - Modal.hide('#fu_modal'); - } - - return { - init: function() { - qs('#fu_file').addEventListener('change', function (evt) { - var reader = new FileReader(); - var file = evt.target.files[0]; - console.log("Selected file type: "+file.type); - if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) { - // Deny load of blobs like img - can crash browser and will get corrupted anyway - if (!confirm("This does not look like a text file: "+file.type+"\nReally load?")) { - qs('#fu_file').value = ''; - return; - } - } - reader.onload = function(e) { - var txt = e.target.result.replace(/[\r\n]+/,'\n'); - qs('#fu_text').value = txt; - }; - console.log("Loading file..."); - reader.readAsText(file); - }, false); - }, - close: fuClose, - start: fuSend, - open: fuOpen, - } -})(); -/** Init the terminal sub-module - called from HTML */ -window.termInit = function () { - Conn.init(); - Input.init(); - TermUpl.init(); -}; diff --git a/html_orig/jssrc/appcommon.js b/html_orig/jssrc/appcommon.js deleted file mode 100644 index 6b1fad6..0000000 --- a/html_orig/jssrc/appcommon.js +++ /dev/null @@ -1,189 +0,0 @@ -/** Global generic init */ -$.ready(function () { - // Checkbox UI (checkbox CSS and hidden input with int value) - $('.Row.checkbox').forEach(function(x) { - var inp = x.querySelector('input'); - var box = x.querySelector('.box'); - - $(box).toggleClass('checked', inp.value); - - var hdl = function() { - inp.value = 1 - inp.value; - $(box).toggleClass('checked', inp.value) - }; - - $(x).on('click', hdl).on('keypress', cr(hdl)); - }); - - // Expanding boxes on mobile - $('.Box.mobcol,.Box.fold').forEach(function(x) { - var h = x.querySelector('h2'); - - var hdl = function() { - $(x).toggleClass('expanded'); - }; - $(h).on('click', hdl).on('keypress', cr(hdl)); - }); - - $('form').forEach(function(x) { - $(x).on('keypress', function(e) { - if ((e.keyCode == 10 || e.keyCode == 13) && e.ctrlKey) { - x.submit(); - } - }) - }); - - // loader dots... - setInterval(function () { - $('.anim-dots').each(function (x) { - var $x = $(x); - var dots = $x.html() + '.'; - if (dots.length == 5) dots = '.'; - $x.html(dots); - }); - }, 1000); - - // flipping number boxes with the mouse wheel - $('input[type=number]').on('mousewheel', function(e) { - var $this = $(this); - var val = +$this.val(); - if (isNaN(val)) val = 1; - - var step = +($this.attr('step') || 1); - var min = +$this.attr('min'); - var max = +$this.attr('max'); - if(e.wheelDelta > 0) { - val += step; - } else { - val -= step; - } - - if (typeof min != 'undefined') val = Math.max(val, +min); - if (typeof max != 'undefined') val = Math.min(val, +max); - $this.val(val); - - if ("createEvent" in document) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); - $this[0].dispatchEvent(evt); - } else { - $this[0].fireEvent("onchange"); - } - - e.preventDefault(); - }); - - var errAt = location.search.indexOf('err='); - if (errAt !== -1 && qs('.Box.errors')) { - var errs = location.search.substr(errAt+4).split(','); - var hres = []; - errs.forEach(function(er) { - var lbl = qs('label[for="'+er+'"]'); - if (lbl) { - lbl.classList.add('error'); - hres.push(lbl.childNodes[0].textContent.trim().replace(/: ?$/, '')); - } else { - hres.push(er); - } - }); - - qs('.Box.errors .list').innerHTML = hres.join(', '); - qs('.Box.errors').classList.remove('hidden'); - } - - Modal.init(); - Notify.init(); - - // remove tabindixes from h2 if wide - if (window.innerWidth > 550) { - $('.Box h2').forEach(function (x) { - x.removeAttribute('tabindex'); - }); - - // brand works as a link back to term in widescreen mode - var br = qs('#brand'); - br && br.addEventListener('click', function() { - location.href='/'; // go to terminal - }); - } -}); - -$._loader = function(vis) { - $('#loader').toggleClass('show', vis); -}; - -function showPage() { - $('#content').addClass('load'); -} - -$.ready(function() { - if (window.noAutoShow !== true) { - setTimeout(function () { - showPage(); - }, 1); - } -}); - - -/*! http://mths.be/fromcodepoint v0.1.0 by @mathias */ -if (!String.fromCodePoint) { - (function() { - var defineProperty = (function() { - // IE 8 only supports `Object.defineProperty` on DOM elements - try { - var object = {}; - var $defineProperty = Object.defineProperty; - var result = $defineProperty(object, object, object) && $defineProperty; - } catch(error) {} - return result; - }()); - var stringFromCharCode = String.fromCharCode; - var floor = Math.floor; - var fromCodePoint = function() { - var MAX_SIZE = 0x4000; - var codeUnits = []; - var highSurrogate; - var lowSurrogate; - var index = -1; - var length = arguments.length; - if (!length) { - return ''; - } - var result = ''; - while (++index < length) { - var codePoint = Number(arguments[index]); - if ( - !isFinite(codePoint) || // `NaN`, `+Infinity`, or `-Infinity` - codePoint < 0 || // not a valid Unicode code point - codePoint > 0x10FFFF || // not a valid Unicode code point - floor(codePoint) != codePoint // not an integer - ) { - throw RangeError('Invalid code point: ' + codePoint); - } - if (codePoint <= 0xFFFF) { // BMP code point - codeUnits.push(codePoint); - } else { // Astral code point; split in surrogate halves - // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - codePoint -= 0x10000; - highSurrogate = (codePoint >> 10) + 0xD800; - lowSurrogate = (codePoint % 0x400) + 0xDC00; - codeUnits.push(highSurrogate, lowSurrogate); - } - if (index + 1 == length || codeUnits.length > MAX_SIZE) { - result += stringFromCharCode.apply(null, codeUnits); - codeUnits.length = 0; - } - } - return result; - }; - if (defineProperty) { - defineProperty(String, 'fromCodePoint', { - 'value': fromCodePoint, - 'configurable': true, - 'writable': true - }); - } else { - String.fromCodePoint = fromCodePoint; - } - }()); -} diff --git a/html_orig/jssrc/chibi.js b/html_orig/jssrc/chibi.js deleted file mode 100755 index ae975ca..0000000 --- a/html_orig/jssrc/chibi.js +++ /dev/null @@ -1,703 +0,0 @@ -/*!chibi 3.0.7, Copyright 2012-2016 Kyle Barrow, released under MIT license */ - -// MODIFIED VERSION. -(function () { - 'use strict'; - - var readyfn = [], - loadedfn = [], - domready = false, - pageloaded = false, - d = document, - w = window; - - // Fire any function calls on ready event - function fireReady() { - var i; - domready = true; - for (i = 0; i < readyfn.length; i += 1) { - readyfn[i](); - } - readyfn = []; - } - - // Fire any function calls on loaded event - function fireLoaded() { - var i; - pageloaded = true; - // For browsers with no DOM loaded support - if (!domready) { - fireReady(); - } - for (i = 0; i < loadedfn.length; i += 1) { - loadedfn[i](); - } - loadedfn = []; - } - - // Check DOM ready, page loaded - if (d.addEventListener) { - // Standards - d.addEventListener('DOMContentLoaded', fireReady, false); - w.addEventListener('load', fireLoaded, false); - } else if (d.attachEvent) { - // IE - d.attachEvent('onreadystatechange', fireReady); - // IE < 9 - w.attachEvent('onload', fireLoaded); - } else { - // Anything else - w.onload = fireLoaded; - } - - // Utility functions - - // Loop through node array - function nodeLoop(fn, nodes) { - var i; - // Good idea to walk up the DOM - for (i = nodes.length - 1; i >= 0; i -= 1) { - fn(nodes[i]); - } - } - - // Convert to camel case - function cssCamel(property) { - return property.replace(/-\w/g, function (result) { - return result.charAt(1).toUpperCase(); - }); - } - - // Get computed style - function computeStyle(elm, property) { - // IE, everything else or null - return (elm.currentStyle) ? elm.currentStyle[cssCamel(property)] : (w.getComputedStyle) ? w.getComputedStyle(elm, null).getPropertyValue(property) : null; - - } - - // Returns URI encoded query string pair - function queryPair(name, value) { - return encodeURIComponent(name).replace(/%20/g, '+') + '=' + encodeURIComponent(value).replace(/%20/g, '+'); - } - - // Set CSS, important to wrap in try to prevent error thown on unsupported property - function setCss(elm, property, value) { - try { - elm.style[cssCamel(property)] = value; - } catch (e) { - } - } - - // Show CSS - function showCss(elm) { - elm.style.display = ''; - // For elements still hidden by style block - if (computeStyle(elm, 'display') === 'none') { - elm.style.display = 'block'; - } - } - - // Serialize form & JSON values - function serializeData(nodes) { - var querystring = '', subelm, i, j; - if (nodes.constructor === Object) { // Serialize JSON data - for (subelm in nodes) { - if (nodes.hasOwnProperty(subelm)) { - if (nodes[subelm].constructor === Array) { - for (i = 0; i < nodes[subelm].length; i += 1) { - querystring += '&' + queryPair(subelm, nodes[subelm][i]); - } - } else { - querystring += '&' + queryPair(subelm, nodes[subelm]); - } - } - } - } else { // Serialize node data - nodeLoop(function (elm) { - if (elm.nodeName === 'FORM') { - for (i = 0; i < elm.elements.length; i += 1) { - subelm = elm.elements[i]; - - if (!subelm.disabled) { - switch (subelm.type) { - // Ignore buttons, unsupported XHR 1 form fields - case 'button': - case 'image': - case 'file': - case 'submit': - case 'reset': - break; - - case 'select-one': - if (subelm.length > 0) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - case 'select-multiple': - for (j = 0; j < subelm.length; j += 1) { - if (subelm[j].selected) { - querystring += '&' + queryPair(subelm.name, subelm[j].value); - } - } - break; - - case 'checkbox': - case 'radio': - if (subelm.checked) { - querystring += '&' + queryPair(subelm.name, subelm.value); - } - break; - - // Everything else including shinny new HTML5 input types - default: - querystring += '&' + queryPair(subelm.name, subelm.value); - } - } - } - } - }, nodes); - } - // Tidy up first & - return (querystring.length > 0) ? querystring.substring(1) : ''; - } - - // Class helper - function classHelper(classes, action, nodes) { - var classarray, search, i, replace, has = false; - if (classes) { - // Trim any whitespace - classarray = classes.split(/\s+/); - nodeLoop(function (elm) { - for (i = 0; i < classarray.length; i += 1) { - var clz = classarray[i]; - if (action === 'remove') { - elm.classList.remove(clz); - } - else if (action === 'add') { - elm.classList.add(clz); - } - else if (action === 'toggle') { - elm.classList.toggle(clz); - } - else if (action === 'has') { - if (elm.classList.contains(clz)) { - has = true; - break; - } - } - - // search = new RegExp('\\b' + classarray[i] + '\\b', 'g'); - // replace = new RegExp(' *' + classarray[i] + '\\b', 'g'); - // if (action === 'remove') { - // elm.className = elm.className.replace(search, ''); - // } else if (action === 'toggle') { - // elm.className = (elm.className.match(search)) ? elm.className.replace(replace, '') : elm.className + ' ' + classarray[i]; - // } else if (action === 'has') { - // if (elm.className.match(search)) { - // has = true; - // break; - // } - // } - } - }, nodes); - } - return has; - } - - // HTML insertion helper - function insertHtml(value, position, nodes) { - var tmpnodes, tmpnode; - if (value) { - nodeLoop(function (elm) { - // No insertAdjacentHTML support for FF < 8 and IE doesn't allow insertAdjacentHTML table manipulation, so use this instead - // Convert string to node. We can't innerHTML on a document fragment - tmpnodes = d.createElement('div'); - tmpnodes.innerHTML = value; - while ((tmpnode = tmpnodes.lastChild) !== null) { - // Catch error in unlikely case elm has been removed - try { - if (position === 'before') { - elm.parentNode.insertBefore(tmpnode, elm); - } else if (position === 'after') { - elm.parentNode.insertBefore(tmpnode, elm.nextSibling); - } else if (position === 'append') { - elm.appendChild(tmpnode); - } else if (position === 'prepend') { - elm.insertBefore(tmpnode, elm.firstChild); - } - } catch (e) { - break; - } - } - }, nodes); - } - } - - // Get nodes and return chibi - function chibi(selector) { - var cb, nodes = [], json = false, nodelist, i; - - if (selector) { - - // Element node, would prefer to use (selector instanceof HTMLElement) but no IE support - if (selector.nodeType && selector.nodeType === 1) { - nodes = [selector]; // return element as node list - } else if (typeof selector === 'object') { - // JSON, document object or node list, would prefer to use (selector instanceof NodeList) but no IE support - json = (typeof selector.length !== 'number'); - nodes = selector; - } else if (typeof selector === 'string') { - nodelist = d.querySelectorAll(selector); - - // Convert node list to array so results have full access to array methods - // Array.prototype.slice.call not supported in IE < 9 and often slower than loop anyway - for (i = 0; i < nodelist.length; i += 1) { - nodes[i] = nodelist[i]; - } - } - } - - // Only attach nodes if not JSON - cb = json ? {} : nodes; - - // Public functions - - // Executes a function on nodes - cb.each = function (fn) { - if (typeof fn === 'function') { - nodeLoop(function (elm) { - // <= IE 8 loses scope so need to apply - return fn.apply(elm, arguments); - }, nodes); - } - return cb; - }; - // Find first - cb.first = function () { - return chibi(nodes.shift()); - }; - // Find last - cb.last = function () { - return chibi(nodes.pop()); - }; - // Find odd - cb.odd = function () { - var odds = [], i; - for (i = 0; i < nodes.length; i += 2) { - odds.push(nodes[i]); - } - return chibi(odds); - }; - // Find even - cb.even = function () { - var evens = [], i; - for (i = 1; i < nodes.length; i += 2) { - evens.push(nodes[i]); - } - return chibi(evens); - }; - // Hide node - cb.hide = function () { - nodeLoop(function (elm) { - elm.style.display = 'none'; - }, nodes); - return cb; - }; - // Show node - cb.show = function () { - nodeLoop(function (elm) { - showCss(elm); - }, nodes); - return cb; - }; - // Toggle node display - cb.toggle = function (state) { - if (typeof state != 'undefined') { // ADDED - if (state) - cb.show(); - else - cb.hide(); - } else { - nodeLoop(function (elm) { - // computeStyle instead of style.display == 'none' catches elements that are hidden via style block - if (computeStyle(elm, 'display') === 'none') { - showCss(elm); - } else { - elm.style.display = 'none'; - } - - }, nodes); - } - return cb; - }; - // Remove node - cb.remove = function () { - nodeLoop(function (elm) { - // Catch error in unlikely case elm has been removed - try { - elm.parentNode.removeChild(elm); - } catch (e) { - } - }, nodes); - return chibi(); - }; - // Get/Set CSS - cb.css = function (property, value) { - if (property) { - if (value || value === '') { - nodeLoop(function (elm) { - setCss(elm, property, value); - }, nodes); - return cb; - } - if (nodes[0]) { - if (nodes[0].style[cssCamel(property)]) { - return nodes[0].style[cssCamel(property)]; - } - if (computeStyle(nodes[0], property)) { - return computeStyle(nodes[0], property); - } - } - } - }; - // Get class(es) - cb.getClass = function () { - if (nodes[0] && nodes[0].className.length > 0) { - // Weak IE trim support - return nodes[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '').replace(/\s+/, ' '); - } - }; - // Set (replaces) classes - cb.setClass = function (classes) { - if (classes || classes === '') { - nodeLoop(function (elm) { - elm.className = classes; - }, nodes); - } - return cb; - }; - // Add class - cb.addClass = function (classes) { - classHelper(classes, 'add', nodes); - // if (classes) { - // nodeLoop(function (elm) { - // elm.className += ' ' + classes; - // }, nodes); - // } - return cb; - }; - // Remove class - cb.removeClass = function (classes) { - classHelper(classes, 'remove', nodes); - return cb; - }; - // Toggle class - cb.toggleClass = function (classes, set) { - var method = ((typeof set === 'undefined') ? 'toggle' : (+set ? 'add' : 'remove')); - classHelper(classes, method, nodes); - return cb; - }; - // Has class - cb.hasClass = function (classes) { - return classHelper(classes, 'has', nodes); - }; - // Get/set HTML - cb.html = function (value) { - if (value || value === '') { - nodeLoop(function (elm) { - elm.innerHTML = value; - }, nodes); - return cb; - } - if (nodes[0]) { - return nodes[0].innerHTML; - } - }; - // Insert HTML before selector - cb.htmlBefore = function (value) { - insertHtml(value, 'before', nodes); - return cb; - }; - // Insert HTML after selector - cb.htmlAfter = function (value) { - insertHtml(value, 'after', nodes); - return cb; - }; - // Insert HTML after selector innerHTML - cb.htmlAppend = function (value) { - insertHtml(value, 'append', nodes); - return cb; - }; - // Insert HTML before selector innerHTML - cb.htmlPrepend = function (value) { - insertHtml(value, 'prepend', nodes); - return cb; - }; - // Get/Set HTML attributes - cb.attr = function (property, value) { - if (property) { - property = property.toLowerCase(); - // IE < 9 doesn't allow style or class via get/setAttribute so switch. cssText returns prettier CSS anyway - if (typeof value !== 'undefined') {//FIXED BUG HERE - nodeLoop(function (elm) { - if (property === 'style') { - elm.style.cssText = value; - } else if (property === 'class') { - elm.className = value; - } else { - elm.setAttribute(property, value); - } - }, nodes); - return cb; - } - if (nodes[0]) { - if (property === 'style') { - if (nodes[0].style.cssText) { - return nodes[0].style.cssText; - } - } else if (property === 'class') { - if (nodes[0].className) { - return nodes[0].className; - } - } else { - if (nodes[0].getAttribute(property)) { - return nodes[0].getAttribute(property); - } - } - } - } - }; - // Get/Set HTML data property - cb.data = function (key, value) { - if (key) { - return cb.attr('data-' + key, value); - } - }; - // Get/Set form element values - cb.val = function (value) { - var values, i, j; - if (typeof value != 'undefined') { // FIXED A BUG HERE - nodeLoop(function (elm) { - switch (elm.nodeName) { - case 'SELECT': - if (typeof value === 'string' || typeof value === 'number') { - value = [value]; - } - for (i = 0; i < elm.length; i += 1) { - // Multiple select - for (j = 0; j < value.length; j += 1) { - elm[i].selected = ''; - if (elm[i].value === ""+value[j]) { - elm[i].selected = 'selected'; - break; - } - } - } - break; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - elm.value = value; - break; - } - }, nodes); - - return cb; - } - if (nodes[0]) { - switch (nodes[0].nodeName) { - case 'SELECT': - values = []; - for (i = 0; i < nodes[0].length; i += 1) { - if (nodes[0][i].selected) { - values.push(nodes[0][i].value); - } - } - return (values.length > 1) ? values : values[0]; - case 'INPUT': - case 'TEXTAREA': - case 'BUTTON': - return nodes[0].value; - } - } - }; - // Return matching checked checkbox or radios - cb.checked = function (check) { - if (typeof check === 'boolean') { - nodeLoop(function (elm) { - if (elm.nodeName === 'INPUT' && (elm.type === 'checkbox' || elm.type === 'radio')) { - elm.checked = check; - } - }, nodes); - return cb; - } - if (nodes[0] && nodes[0].nodeName === 'INPUT' && (nodes[0].type === 'checkbox' || nodes[0].type === 'radio')) { - return (!!nodes[0].checked); - } - }; - // Add event handler - cb.on = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.addEventListener(event, fn, false); - } else if (d.attachEvent) { - // <= IE 8 loses scope so need to apply, we add this to object so we can detach later (can't detach anonymous functions) - elm[event + fn] = function () { - return fn.apply(elm, arguments); - }; - elm.attachEvent('on' + event, elm[event + fn]); - } - }, nodes); - return cb; - }; - // Remove event handler - cb.off = function (event, fn) { - if (selector === w || selector === d) { - nodes = [selector]; - } - nodeLoop(function (elm) { - if (d.addEventListener) { - elm.removeEventListener(event, fn, false); - } else if (d.attachEvent) { - elm.detachEvent('on' + event, elm[event + fn]); - // Tidy up - elm[event + fn] = null; - } - }, nodes); - return cb; - }; - return cb; - } - - // Basic XHR - chibi.ajax = function (options) { // if options is a number, it's timeout in ms - var opts = extend({ - method: 'GET', - nocache: true, - timeout: 5000, - loader: true, - callback: null - }, options); - opts.method = opts.method.toUpperCase(); - - var loaderFn = opts.loader ? chibi._loader : function(){}; - var url = opts.url; - var method = opts.method; - var query = null; - - if (opts.data) { - query = serializeData(opts.data); - } - - if (query && (method === 'GET')) { - url += (url.indexOf('?') === -1) ? '?' + query : '&' + query; - query = null; - } - - var xhr = new XMLHttpRequest(); - - // prevent caching - if (opts.nocache) { - var ts = (+(new Date())).toString(36); - url += ((url.indexOf('?') === -1) ? '?' : '&') + '_=' + ts; - } - - loaderFn(true); - - xhr.open(method, url, true); - xhr.timeout = opts.timeout; - - // Abort after given timeout - var abortTmeo = setTimeout(function () { - console.error("XHR timed out."); - xhr.abort(); - loaderFn(false); - }, opts.timeout + 10); - - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - loaderFn(false); - - opts.callback && opts.callback(xhr.responseText, xhr.status); - - clearTimeout(abortTmeo); - } - }; - - xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); - if (method === 'POST') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - xhr.send(query); - return xhr; - }; - - chibi._loader = function(){}; - - // Alias to cb.ajax(url, 'get', callback) - chibi.get = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'GET'; - return chibi.ajax(opts); - }; - - // Alias to cb.ajax(url, 'post', callback) - chibi.post = function (url, callback, opts) { - opts = opts || {}; - opts.url = url; - opts.callback = callback; - opts.method = 'POST'; - return chibi.ajax(opts); - }; - - // Fire on DOM ready - chibi.ready = function (fn) { - if (fn) { - if (domready) { - fn(); - return chibi; - } else { - readyfn.push(fn); - } - } - }; - - // Fire on page loaded - chibi.loaded = function (fn) { - if (fn) { - if (pageloaded) { - fn(); - return chibi; - } else { - loadedfn.push(fn); - } - } - }; - - var entityMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/', - '`': '`', - '=': '=' - }; - - chibi.htmlEscape = function(string) { - return String(string).replace(/[&<>"'`=\/]/g, function (s) { - return entityMap[s]; - }); - }; - - // Set Chibi's global namespace here ($) - w.$ = chibi; -}()); diff --git a/html_orig/jssrc/keymaster.js b/html_orig/jssrc/keymaster.js deleted file mode 100644 index 88b9629..0000000 --- a/html_orig/jssrc/keymaster.js +++ /dev/null @@ -1,310 +0,0 @@ -// keymaster.js -// (c) 2011-2013 Thomas Fuchs -// keymaster.js may be freely distributed under the MIT license. - -;(function(global){ - var k, - _handlers = {}, - _mods = { 16: false, 18: false, 17: false, 91: false }, - _scope = 'all', - // modifier keys - _MODIFIERS = { - '⇧': 16, shift: 16, - '⌥': 18, alt: 18, option: 18, - '⌃': 17, ctrl: 17, control: 17, - '⌘': 91, command: 91 - }, - // special keys - _MAP = { - backspace: 8, tab: 9, clear: 12, - enter: 13, 'return': 13, - esc: 27, escape: 27, space: 32, - left: 37, up: 38, - right: 39, down: 40, - del: 46, 'delete': 46, - home: 36, end: 35, - pageup: 33, pagedown: 34, - ',': 188, '.': 190, '/': 191, - '`': 192, '-': 189, '=': 187, - ';': 186, '\'': 222, - '[': 219, ']': 221, '\\': 220, - // added: - insert: 45, - np_0: 96, np_1: 97, np_2: 98, np_3: 99, np_4: 100, np_5: 101, - np_6: 102, np_7: 103, np_8: 104, np_9: 105, np_mul: 106, - np_add: 107, np_sub: 109, np_point: 110, np_div: 111, numlock: 144, - }, - code = function(x){ - return _MAP[x] || x.toUpperCase().charCodeAt(0); - }, - _downKeys = []; - - for(k=1;k<20;k++) _MAP['f'+k] = 111+k; - - // IE doesn't support Array#indexOf, so have a simple replacement - function index(array, item){ - var i = array.length; - while(i--) if(array[i]===item) return i; - return -1; - } - - // for comparing mods before unassignment - function compareArray(a1, a2) { - if (a1.length != a2.length) return false; - for (var i = 0; i < a1.length; i++) { - if (a1[i] !== a2[i]) return false; - } - return true; - } - - var modifierMap = { - 16:'shiftKey', - 18:'altKey', - 17:'ctrlKey', - 91:'metaKey' - }; - function updateModifierKey(event) { - for(k in _mods) _mods[k] = event[modifierMap[k]]; - }; - - function isModifierPressed(mod) { - if (mod=='control'||mod=='ctrl') return _mods[17]; - if (mod=='shift') return _mods[16]; - if (mod=='meta') return _mods[91]; - if (mod=='alt') return _mods[18]; - return false; - } - - // handle keydown event - function dispatch(event) { - var key, handler, k, i, modifiersMatch, scope; - key = event.keyCode; - - if (index(_downKeys, key) == -1) { - _downKeys.push(key); - } - - // if a modifier key, set the key. property to true and return - if(key == 93 || key == 224) key = 91; // right command on webkit, command on Gecko - if(key in _mods) { - _mods[key] = true; - // 'assignKey' from inside this closure is exported to window.key - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = true; - return; - } - updateModifierKey(event); - - // see if we need to ignore the keypress (filter() can can be overridden) - // by default ignore key presses if a select, textarea, or input is focused - if(!assignKey.filter.call(this, event)) return; - - // abort if no potentially matching shortcuts found - if (!(key in _handlers)) return; - - scope = getScope(); - - // for each potential shortcut - for (i = 0; i < _handlers[key].length; i++) { - handler = _handlers[key][i]; - - // see if it's in the current scope - if(handler.scope == scope || handler.scope == 'all'){ - // check if modifiers match if any - modifiersMatch = handler.mods.length > 0; - for(k in _mods) - if((!_mods[k] && index(handler.mods, +k) > -1) || - (_mods[k] && index(handler.mods, +k) == -1)) modifiersMatch = false; - // call the handler and stop the event if neccessary - if((handler.mods.length == 0 && !_mods[16] && !_mods[18] && !_mods[17] && !_mods[91]) || modifiersMatch){ - if(handler.method(event, handler)===false){ - if(event.preventDefault) event.preventDefault(); - else event.returnValue = false; - if(event.stopPropagation) event.stopPropagation(); - if(event.cancelBubble) event.cancelBubble = true; - } - } - } - } - }; - - // unset modifier keys on keyup - function clearModifier(event){ - var key = event.keyCode, k, - i = index(_downKeys, key); - - // remove key from _downKeys - if (i >= 0) { - _downKeys.splice(i, 1); - } - - if(key == 93 || key == 224) key = 91; - if(key in _mods) { - _mods[key] = false; - for(k in _MODIFIERS) if(_MODIFIERS[k] == key) assignKey[k] = false; - } - }; - - function resetModifiers() { - for(k in _mods) _mods[k] = false; - for(k in _MODIFIERS) assignKey[k] = false; - }; - - // parse and assign shortcut - function assignKey(key, scope, method){ - var keys, mods; - keys = getKeys(key); - if (method === undefined) { - method = scope; - scope = 'all'; - } - - // for each shortcut - for (var i = 0; i < keys.length; i++) { - // set modifier keys if any - mods = []; - key = keys[i].split('+'); - if (key.length > 1){ - mods = getMods(key); - key = [key[key.length-1]]; - } - // convert to keycode and... - key = key[0] - key = code(key); - // ...store handler - if (!(key in _handlers)) _handlers[key] = []; - _handlers[key].push({ shortcut: keys[i], scope: scope, method: method, key: keys[i], mods: mods }); - } - }; - - // unbind all handlers for given key in current scope - function unbindKey(key, scope) { - var multipleKeys, keys, - mods = [], - i, j, obj; - - multipleKeys = getKeys(key); - - for (j = 0; j < multipleKeys.length; j++) { - keys = multipleKeys[j].split('+'); - - if (keys.length > 1) { - mods = getMods(keys); - } - - key = keys[keys.length - 1]; - key = code(key); - - if (scope === undefined) { - scope = getScope(); - } - if (!_handlers[key]) { - return; - } - for (i = 0; i < _handlers[key].length; i++) { - obj = _handlers[key][i]; - // only clear handlers if correct scope and mods match - if (obj.scope === scope && compareArray(obj.mods, mods)) { - _handlers[key][i] = {}; - } - } - } - }; - - // Returns true if the key with code 'keyCode' is currently down - // Converts strings into key codes. - function isPressed(keyCode) { - if (typeof(keyCode)=='string') { - keyCode = code(keyCode); - } - return index(_downKeys, keyCode) != -1; - } - - function getPressedKeyCodes() { - return _downKeys.slice(0); - } - - function filter(event){ - var tagName = (event.target || event.srcElement).tagName; - // ignore keypressed in any elements that support keyboard data input - return !(tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA'); - } - - // initialize key. to false - for(k in _MODIFIERS) assignKey[k] = false; - - // set current scope (default 'all') - function setScope(scope){ _scope = scope || 'all' }; - function getScope(){ return _scope || 'all' }; - - // delete all handlers for a given scope - function deleteScope(scope){ - var key, handlers, i; - - for (key in _handlers) { - handlers = _handlers[key]; - for (i = 0; i < handlers.length; ) { - if (handlers[i].scope === scope) handlers.splice(i, 1); - else i++; - } - } - }; - - // abstract key logic for assign and unassign - function getKeys(key) { - var keys; - key = key.replace(/\s/g, ''); - keys = key.split(','); - if ((keys[keys.length - 1]) == '') { - keys[keys.length - 2] += ','; - } - return keys; - } - - // abstract mods logic for assign and unassign - function getMods(key) { - var mods = key.slice(0, key.length - 1); - for (var mi = 0; mi < mods.length; mi++) - mods[mi] = _MODIFIERS[mods[mi]]; - return mods; - } - - // cross-browser events - function addEvent(object, event, method) { - if (object.addEventListener) - object.addEventListener(event, method, false); - else if(object.attachEvent) - object.attachEvent('on'+event, function(){ method(window.event) }); - }; - - // set the handlers globally on document - addEvent(document, 'keydown', function(event) { dispatch(event) }); // Passing _scope to a callback to ensure it remains the same by execution. Fixes #48 - addEvent(document, 'keyup', clearModifier); - - // reset modifiers to false whenever the window is (re)focused. - addEvent(window, 'focus', resetModifiers); - - // store previously defined key - var previousKey = global.key; - - // restore previously defined key and return reference to our key object - function noConflict() { - var k = global.key; - global.key = previousKey; - return k; - } - - // set window.key and window.key.set/get/deleteScope, and the default filter - global.key = assignKey; - global.key.setScope = setScope; - global.key.getScope = getScope; - global.key.deleteScope = deleteScope; - global.key.filter = filter; - global.key.isPressed = isPressed; - global.key.isModifier = isModifierPressed; - global.key.getPressedKeyCodes = getPressedKeyCodes; - global.key.noConflict = noConflict; - global.key.unbind = unbindKey; - - if(typeof module !== 'undefined') module.exports = assignKey; - -})(this); diff --git a/html_orig/jssrc/lang.js b/html_orig/jssrc/lang.js deleted file mode 100644 index 327dae9..0000000 --- a/html_orig/jssrc/lang.js +++ /dev/null @@ -1,8 +0,0 @@ -// Generated from PHP locale file -var _tr = { - "wifi.connected_ip_is": "Connected, IP is ", - "wifi.not_conn": "Not connected.", - "wifi.enter_passwd": "Enter password for \":ssid:\"" -}; - -function tr(key) { return _tr[key] || '?'+key+'?'; } diff --git a/html_orig/jssrc/modal.js b/html_orig/jssrc/modal.js deleted file mode 100644 index ce623cd..0000000 --- a/html_orig/jssrc/modal.js +++ /dev/null @@ -1,44 +0,0 @@ -/** Module for toggling a modal overlay */ -(function () { - var modal = {}; - var curCloseCb = null; - - modal.show = function (sel, closeCb) { - var $m = $(sel); - $m.removeClass('hidden visible'); - setTimeout(function () { - $m.addClass('visible'); - }, 1); - curCloseCb = closeCb; - }; - - modal.hide = function (sel) { - var $m = $(sel); - $m.removeClass('visible'); - setTimeout(function () { - $m.addClass('hidden'); - if (curCloseCb) curCloseCb(); - }, 500); // transition time - }; - - modal.init = function () { - // close modal by click outside the dialog - $('.Modal').on('click', function () { - if ($(this).hasClass('no-close')) return; // this is a no-close modal - modal.hide(this); - }); - - $('.Dialog').on('click', function (e) { - e.stopImmediatePropagation(); - }); - - // Hide all modals on esc - $(window).on('keydown', function (e) { - if (e.which == 27) { - modal.hide('.Modal'); - } - }); - }; - - window.Modal = modal; -})(); diff --git a/html_orig/jssrc/notif.js b/html_orig/jssrc/notif.js deleted file mode 100644 index ad08e51..0000000 --- a/html_orig/jssrc/notif.js +++ /dev/null @@ -1,32 +0,0 @@ -(function (nt) { - var sel = '#notif'; - - var hideTmeo1; // timeout to start hiding (transition) - var hideTmeo2; // timeout to add the hidden class - - nt.show = function (message, timeout) { - $(sel).html(message); - Modal.show(sel); - - clearTimeout(hideTmeo1); - clearTimeout(hideTmeo2); - - if (undef(timeout)) timeout = 2500; - - hideTmeo1 = setTimeout(nt.hide, timeout); - }; - - nt.hide = function () { - var $m = $(sel); - $m.removeClass('visible'); - hideTmeo2 = setTimeout(function () { - $m.addClass('hidden'); - }, 250); // transition time - }; - - nt.init = function() { - $(sel).on('click', function() { - nt.hide(this); - }); - }; -})(window.Notify = {}); diff --git a/html_orig/jssrc/term.js b/html_orig/jssrc/term.js deleted file mode 100644 index 2211c60..0000000 --- a/html_orig/jssrc/term.js +++ /dev/null @@ -1,6 +0,0 @@ -/** Init the terminal sub-module - called from HTML */ -window.termInit = function () { - Conn.init(); - Input.init(); - TermUpl.init(); -}; diff --git a/html_orig/jssrc/term_conn.js b/html_orig/jssrc/term_conn.js deleted file mode 100644 index 21be843..0000000 --- a/html_orig/jssrc/term_conn.js +++ /dev/null @@ -1,131 +0,0 @@ -/** Handle connections */ -var Conn = (function() { - var ws; - var heartbeatTout; - var pingIv; - var xoff = false; - var autoXoffTout; - - function onOpen(evt) { - console.log("CONNECTED"); - } - - function onClose(evt) { - console.warn("SOCKET CLOSED, code "+evt.code+". Reconnecting..."); - setTimeout(function() { - init(); - }, 200); - // this happens when the buffer gets fucked up via invalid unicode. - // we basically use polling instead of socket then - } - - function onMessage(evt) { - try { - // . = heartbeat - switch (evt.data.charAt(0)) { - case 'B': - case 'T': - case 'S': - Screen.load(evt.data); - break; - - case '-': - //console.log('xoff'); - xoff = true; - autoXoffTout = setTimeout(function(){xoff=false;}, 250); - break; - - case '+': - //console.log('xon'); - xoff = false; - clearTimeout(autoXoffTout); - break; - } - heartbeat(); - } catch(e) { - console.error(e); - } - } - - function canSend() { - return !xoff; - } - - function doSend(message) { - if (_demo) { - console.log("TX: ", message); - return true; // Simulate success - } - if (xoff) { - // TODO queue - console.log("Can't send, flood control."); - return false; - } - - if (!ws) return false; // for dry testing - if (ws.readyState != 1) { - console.error("Socket not ready"); - return false; - } - if (typeof message != "string") { - message = JSON.stringify(message); - } - ws.send(message); - return true; - } - - function init() { - if (_demo) { - console.log("Demo mode!"); - Screen.load(_demo_screen); - showPage(); - return; - } - heartbeat(); - - ws = new WebSocket("ws://"+_root+"/term/update.ws"); - ws.onopen = onOpen; - ws.onclose = onClose; - ws.onmessage = onMessage; - - console.log("Opening socket."); - - // Ask for initial data - $.get('http://'+_root+'/term/init', function(resp, status) { - if (status !== 200) location.reload(true); - console.log("Data received!"); - Screen.load(resp); - heartbeat(); - - showPage(); - }); - } - - function heartbeat() { - clearTimeout(heartbeatTout); - heartbeatTout = setTimeout(heartbeatFail, 2000); - } - - function heartbeatFail() { - console.error("Heartbeat lost, probing server..."); - pingIv = setInterval(function() { - console.log("> ping"); - $.get('http://'+_root+'/system/ping', function(resp, status) { - if (status == 200) { - clearInterval(pingIv); - console.info("Server ready, reloading page..."); - location.reload(); - } - }, { - timeout: 100, - }); - }, 500); - } - - return { - ws: null, - init: init, - send: doSend, - canSend: canSend, // check flood control - }; -})(); diff --git a/html_orig/jssrc/term_input.js b/html_orig/jssrc/term_input.js deleted file mode 100644 index 2d4277f..0000000 --- a/html_orig/jssrc/term_input.js +++ /dev/null @@ -1,262 +0,0 @@ -/** - * User input - * - * --- Rx messages: --- - * S - screen content (binary encoding of the entire screen with simple compression) - * T - text labels - Title and buttons, \0x01-separated - * B - beep - * . - heartbeat - * - * --- Tx messages --- - * s - string - * b - action button - * p - mb press - * r - mb release - * m - mouse move - */ -var Input = (function() { - var opts = { - np_alt: false, - cu_alt: false, - fn_alt: false, - mt_click: false, - mt_move: false, - no_keys: false, - }; - - /** Send a literal message */ - function sendStrMsg(str) { - return Conn.send("s"+str); - } - - /** Send a button event */ - function sendBtnMsg(n) { - Conn.send("b"+Chr(n)); - } - - /** Fn alt choice for key message */ - function fa(alt, normal) { - return opts.fn_alt ? alt : normal; - } - - /** Cursor alt choice for key message */ - function ca(alt, normal) { - return opts.cu_alt ? alt : normal; - } - - /** Numpad alt choice for key message */ - function na(alt, normal) { - return opts.np_alt ? alt : normal; - } - - function _bindFnKeys() { - var keymap = { - 'tab': '\x09', - 'backspace': '\x08', - 'enter': '\x0d', - 'ctrl+enter': '\x0a', - 'esc': '\x1b', - 'up': ca('\x1bOA', '\x1b[A'), - 'down': ca('\x1bOB', '\x1b[B'), - 'right': ca('\x1bOC', '\x1b[C'), - 'left': ca('\x1bOD', '\x1b[D'), - 'home': ca('\x1bOH', fa('\x1b[H', '\x1b[1~')), - 'insert': '\x1b[2~', - 'delete': '\x1b[3~', - 'end': ca('\x1bOF', fa('\x1b[F', '\x1b[4~')), - 'pageup': '\x1b[5~', - 'pagedown': '\x1b[6~', - 'f1': fa('\x1bOP', '\x1b[11~'), - 'f2': fa('\x1bOQ', '\x1b[12~'), - 'f3': fa('\x1bOR', '\x1b[13~'), - 'f4': fa('\x1bOS', '\x1b[14~'), - 'f5': '\x1b[15~', // note the disconnect - 'f6': '\x1b[17~', - 'f7': '\x1b[18~', - 'f8': '\x1b[19~', - 'f9': '\x1b[20~', - 'f10': '\x1b[21~', // note the disconnect - 'f11': '\x1b[23~', - 'f12': '\x1b[24~', - 'shift+f1': fa('\x1bO1;2P', '\x1b[25~'), - 'shift+f2': fa('\x1bO1;2Q', '\x1b[26~'), // note the disconnect - 'shift+f3': fa('\x1bO1;2R', '\x1b[28~'), - 'shift+f4': fa('\x1bO1;2S', '\x1b[29~'), // note the disconnect - 'shift+f5': fa('\x1b[15;2~', '\x1b[31~'), - 'shift+f6': fa('\x1b[17;2~', '\x1b[32~'), - 'shift+f7': fa('\x1b[18;2~', '\x1b[33~'), - 'shift+f8': fa('\x1b[19;2~', '\x1b[34~'), - 'shift+f9': fa('\x1b[20;2~', '\x1b[35~'), // 35-38 are not standard - but what is? - 'shift+f10': fa('\x1b[21;2~', '\x1b[36~'), - 'shift+f11': fa('\x1b[22;2~', '\x1b[37~'), - 'shift+f12': fa('\x1b[23;2~', '\x1b[38~'), - 'np_0': na('\x1bOp', '0'), - 'np_1': na('\x1bOq', '1'), - 'np_2': na('\x1bOr', '2'), - 'np_3': na('\x1bOs', '3'), - 'np_4': na('\x1bOt', '4'), - 'np_5': na('\x1bOu', '5'), - 'np_6': na('\x1bOv', '6'), - 'np_7': na('\x1bOw', '7'), - 'np_8': na('\x1bOx', '8'), - 'np_9': na('\x1bOy', '9'), - 'np_mul': na('\x1bOR', '*'), - 'np_add': na('\x1bOl', '+'), - 'np_sub': na('\x1bOS', '-'), - 'np_point': na('\x1bOn', '.'), - 'np_div': na('\x1bOQ', '/'), - // we don't implement numlock key (should change in numpad_alt mode, but it's even more useless than the rest) - }; - - for (var k in keymap) { - if (keymap.hasOwnProperty(k)) { - bind(k, keymap[k]); - } - } - } - - /** Bind a keystroke to message */ - function bind(combo, str) { - // mac fix - allow also cmd - if (combo.indexOf('ctrl+') !== -1) { - combo += ',' + combo.replace('ctrl', 'command'); - } - - // unbind possible old binding - key.unbind(combo); - - key(combo, function (e) { - if (opts.no_keys) return; - e.preventDefault(); - sendStrMsg(str) - }); - } - - /** Bind/rebind key messages */ - function _initKeys() { - // This takes care of text characters typed - window.addEventListener('keypress', function(evt) { - if (opts.no_keys) return; - var str = ''; - if (evt.key) str = evt.key; - else if (evt.which) str = String.fromCodePoint(evt.which); - if (str.length>0 && str.charCodeAt(0) >= 32) { -// console.log("Typed ", str); - sendStrMsg(str); - } - }); - - // ctrl-letter codes are sent as simple low ASCII codes - for (var i = 1; i<=26;i++) { - bind('ctrl+' + String.fromCharCode(96+i), String.fromCharCode(i)); - } - bind('ctrl+]', '\x1b'); // alternate way to enter ESC - bind('ctrl+\\', '\x1c'); - bind('ctrl+[', '\x1d'); - bind('ctrl+^', '\x1e'); - bind('ctrl+_', '\x1f'); - - _bindFnKeys(); - } - - // mouse button states - var mb1 = 0; - var mb2 = 0; - var mb3 = 0; - - /** Init the Input module */ - function init() { - _initKeys(); - - // Button presses - $('#action-buttons button').forEach(function(s) { - s.addEventListener('click', function() { - sendBtnMsg(+this.dataset['n']); - }); - }); - - // global mouse state tracking - for motion reporting - window.addEventListener('mousedown', function(evt) { - if (evt.button == 0) mb1 = 1; - if (evt.button == 1) mb2 = 1; - if (evt.button == 2) mb3 = 1; - }); - - window.addEventListener('mouseup', function(evt) { - if (evt.button == 0) mb1 = 0; - if (evt.button == 1) mb2 = 0; - if (evt.button == 2) mb3 = 0; - }); - } - - /** Prepare modifiers byte for mouse message */ - function packModifiersForMouse() { - return (key.isModifier('ctrl')?1:0) | - (key.isModifier('shift')?2:0) | - (key.isModifier('alt')?4:0) | - (key.isModifier('meta')?8:0); - } - - return { - /** Init the Input module */ - init: init, - - /** Send a literal string message */ - sendString: sendStrMsg, - - /** Enable alternate key modes (cursors, numpad, fn) */ - setAlts: function(cu, np, fn) { - if (opts.cu_alt != cu || opts.np_alt != np || opts.fn_alt != fn) { - opts.cu_alt = cu; - opts.np_alt = np; - opts.fn_alt = fn; - - // rebind keys - codes have changed - _bindFnKeys(); - } - }, - - setMouseMode: function(click, move) { - opts.mt_click = click; - opts.mt_move = move; - }, - - // Mouse events - onMouseMove: function (x, y) { - if (!opts.mt_move) return; - var b = mb1 ? 1 : mb2 ? 2 : mb3 ? 3 : 0; - var m = packModifiersForMouse(); - Conn.send("m" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - }, - onMouseDown: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseUp: function (x, y, b) { - if (!opts.mt_click) return; - if (b > 3 || b < 1) return; - var m = packModifiersForMouse(); - Conn.send("r" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - onMouseWheel: function (x, y, dir) { - if (!opts.mt_click) return; - // -1 ... btn 4 (away from user) - // +1 ... btn 5 (towards user) - var m = packModifiersForMouse(); - var b = (dir < 0 ? 4 : 5); - Conn.send("p" + encode2B(y) + encode2B(x) + encode2B(b) + encode2B(m)); - // console.log("B ",b," M ",m); - }, - mouseTracksClicks: function() { - return opts.mt_click; - }, - blockKeys: function(yes) { - opts.no_keys = yes; - } - }; -})(); - diff --git a/html_orig/jssrc/term_screen.js b/html_orig/jssrc/term_screen.js deleted file mode 100644 index a20a5c8..0000000 --- a/html_orig/jssrc/term_screen.js +++ /dev/null @@ -1,378 +0,0 @@ -var Screen = (function () { - var W = 0, H = 0; // dimensions - var inited = false; - - var cursor = { - a: false, // active (blink state) - x: 0, // 0-based coordinates - y: 0, - fg: 7, // colors 0-15 - bg: 0, - attrs: 0, - suppress: false, // do not turn on in blink interval (for safe moving) - forceOn: false, // force on unless hanging: used to keep cursor visible during move - hidden: false, // do not show (DEC opt) - hanging: false, // cursor at column "W+1" - not visible - }; - - var screen = []; - var blinkIval; - var cursorFlashStartIval; - - // Some non-bold Fraktur symbols are outside the contiguous block - var frakturExceptions = { - 'C': '\u212d', - 'H': '\u210c', - 'I': '\u2111', - 'R': '\u211c', - 'Z': '\u2128', - }; - - // for BEL - var audioCtx = null; - try { - audioCtx = new (window.AudioContext || window.audioContext || window.webkitAudioContext)(); - } catch (er) { - console.error("No AudioContext!", er); - } - - /** Get cell under cursor */ - function _curCell() { - return screen[cursor.y*W + cursor.x]; - } - - /** Safely move cursor */ - function cursorSet(y, x) { - // Hide and prevent from showing up during the move - cursor.suppress = true; - _draw(_curCell(), false); - cursor.x = x; - cursor.y = y; - // Show again - cursor.suppress = false; - _draw(_curCell()); - } - - function alpha2fraktur(t) { - // perform substitution - if (t >= 'a' && t <= 'z') { - t = String.fromCodePoint(0x1d51e - 97 + t.charCodeAt(0)); - } - else if (t >= 'A' && t <= 'Z') { - // this set is incomplete, some exceptions are needed - if (frakturExceptions.hasOwnProperty(t)) { - t = frakturExceptions[t]; - } else { - t = String.fromCodePoint(0x1d504 - 65 + t.charCodeAt(0)); - } - } - return t; - } - - /** Update cell on display. inv = invert (for cursor) */ - function _draw(cell, inv) { - if (!cell) return; - if (typeof inv == 'undefined') { - inv = cursor.a && cursor.x == cell.x && cursor.y == cell.y; - } - - var fg, bg, cn, t; - - fg = inv ? cell.bg : cell.fg; - bg = inv ? cell.fg : cell.bg; - - t = cell.t; - if (!t.length) t = ' '; - - cn = 'fg' + fg + ' bg' + bg; - if (cell.attrs & (1<<0)) cn += ' bold'; - if (cell.attrs & (1<<1)) cn += ' faint'; - if (cell.attrs & (1<<2)) cn += ' italic'; - if (cell.attrs & (1<<3)) cn += ' under'; - if (cell.attrs & (1<<4)) cn += ' blink'; - if (cell.attrs & (1<<5)) { - cn += ' fraktur'; - t = alpha2fraktur(t); - } - if (cell.attrs & (1<<6)) cn += ' strike'; - - cell.slot.textContent = t; - cell.elem.className = cn; - } - - /** Show entire screen */ - function _drawAll() { - for (var i = W*H-1; i>=0; i--) { - _draw(screen[i]); - } - } - - function _rebuild(rows, cols) { - W = cols; - H = rows; - - /* Build screen & show */ - var cOuter, cInner, cell, screenDiv = qs('#screen'); - - // Empty the screen node - while (screenDiv.firstChild) screenDiv.removeChild(screenDiv.firstChild); - - screen = []; - - for(var i = 0; i < W*H; i++) { - cOuter = mk('span'); - cInner = mk('span'); - - /* Mouse tracking */ - (function() { - var x = i % W; - var y = Math.floor(i / W); - cOuter.addEventListener('mouseenter', function (evt) { - Input.onMouseMove(x, y); - }); - cOuter.addEventListener('mousedown', function (evt) { - Input.onMouseDown(x, y, evt.button+1); - }); - cOuter.addEventListener('mouseup', function (evt) { - Input.onMouseUp(x, y, evt.button+1); - }); - cOuter.addEventListener('contextmenu', function (evt) { - if (Input.mouseTracksClicks()) { - evt.preventDefault(); - } - }); - cOuter.addEventListener('mousewheel', function (evt) { - Input.onMouseWheel(x, y, evt.deltaY>0?1:-1); - return false; - }); - })(); - - /* End of line */ - if ((i > 0) && (i % W == 0)) { - screenDiv.appendChild(mk('br')); - } - /* The cell */ - cOuter.appendChild(cInner); - screenDiv.appendChild(cOuter); - - cell = { - t: ' ', - fg: 7, - bg: 0, // the colors will be replaced immediately as we receive data (user won't see this) - attrs: 0, - elem: cOuter, - slot: cInner, - x: i % W, - y: Math.floor(i / W), - }; - screen.push(cell); - _draw(cell); - } - } - - /** Init the terminal */ - function _init() { - /* Cursor blinking */ - clearInterval(blinkIval); - blinkIval = setInterval(function () { - cursor.a = !cursor.a; - if (cursor.hidden || cursor.hanging) { - cursor.a = false; - } - - if (!cursor.suppress) { - _draw(_curCell(), cursor.forceOn || cursor.a); - } - }, 500); - - /* blink attribute animation */ - setInterval(function () { - $('#screen').removeClass('blink-hide'); - setTimeout(function () { - $('#screen').addClass('blink-hide'); - }, 800); // 200 ms ON - }, 1000); - - inited = true; - } - - // constants for decoding the update blob - var SEQ_SET_COLOR_ATTR = 1; - var SEQ_REPEAT = 2; - var SEQ_SET_COLOR = 3; - var SEQ_SET_ATTR = 4; - - /** Parse received screen update object (leading S removed already) */ - function _load_content(str) { - var i = 0, ci = 0, j, jc, num, num2, t = ' ', fg, bg, attrs, cell; - - if (!inited) _init(); - - var cursorMoved; - - // Set size - num = parse2B(str, i); i += 2; // height - num2 = parse2B(str, i); i += 2; // width - if (num != H || num2 != W) { - _rebuild(num, num2); - } - // console.log("Size ",num, num2); - - // Cursor position - num = parse2B(str, i); i += 2; // row - num2 = parse2B(str, i); i += 2; // col - cursorMoved = (cursor.x != num2 || cursor.y != num); - cursorSet(num, num2); - // console.log("Cursor at ",num, num2); - - // Attributes - num = parse2B(str, i); i += 2; // fg bg attribs - cursor.hidden = !(num & (1<<0)); // DEC opt "visible" - cursor.hanging = !!(num & (1<<1)); - // console.log("Attributes word ",num.toString(16)+'h'); - - Input.setAlts( - !!(num & (1<<2)), // cursors alt - !!(num & (1<<3)), // numpad alt - !!(num & (1<<4)) // fn keys alt - ); - - var mt_click = !!(num & (1<<5)); - var mt_move = !!(num & (1<<6)); - Input.setMouseMode( - mt_click, - mt_move - ); - $('#screen').toggleClass('noselect', mt_move); - - var show_buttons = !!(num & (1<<7)); - var show_config_links = !!(num & (1<<8)); - $('.x-term-conf-btn').toggleClass('hidden', !show_config_links); - $('#action-buttons').toggleClass('hidden', !show_buttons); - - fg = 7; - bg = 0; - attrs = 0; - - // Here come the content - while(i < str.length && ci> 4; - attrs = (num & 0xFF00)>>8; - } - else if (jc == SEQ_SET_COLOR) { - num = parse2B(str, i); i += 2; - fg = num & 0x0F; - bg = (num & 0xF0) >> 4; - } - else if (jc == SEQ_SET_ATTR) { - num = parse2B(str, i); i += 2; - attrs = num & 0xFF; - } - else if (jc == SEQ_REPEAT) { - num = parse2B(str, i); i += 2; - // console.log("Repeat x ",num); - for (; num>0 && ci 0 ? e(s) : " "; - x.style.opacity = s.length > 0 ? 1 : 0.2; - }) - } - - /** Audible beep for ASCII 7 */ - function _beep() { - var osc, gain; - if (!audioCtx) return; - - // Main beep - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.5; - osc.frequency.value = 750; - osc.type = 'sine'; - osc.start(); - osc.stop(audioCtx.currentTime+0.05); - - // Surrogate beep (making it sound like 'oops') - osc = audioCtx.createOscillator(); - gain = audioCtx.createGain(); - osc.connect(gain); - gain.connect(audioCtx.destination); - gain.gain.value = 0.2; - osc.frequency.value = 400; - osc.type = 'sine'; - osc.start(audioCtx.currentTime+0.05); - osc.stop(audioCtx.currentTime+0.08); - } - - /** Load screen content from a binary sequence (new) */ - function load(str) { - //console.log(JSON.stringify(str)); - var content = str.substr(1); - switch(str.charAt(0)) { - case 'S': - _load_content(content); - break; - case 'T': - _load_labels(content); - break; - case 'B': - _beep(); - break; - default: - console.warn("Bad data message type, ignoring."); - console.log(str); - } - } - - return { - load: load, // full load (string) - }; -})(); diff --git a/html_orig/jssrc/term_upload.js b/html_orig/jssrc/term_upload.js deleted file mode 100644 index 2c92110..0000000 --- a/html_orig/jssrc/term_upload.js +++ /dev/null @@ -1,146 +0,0 @@ -/** File upload utility */ -var TermUpl = (function() { - var lines, // array of lines without newlines - line_i, // current line index - fuTout, // timeout handle for line sending - send_delay_ms, // delay between lines (ms) - nl_str, // newline string to use - curLine, // current line (when using fuOil) - inline_pos; // Offset in line (for long lines) - - // lines longer than this are split to chunks - // sending a super-ling string through the socket is not a good idea - var MAX_LINE_LEN = 128; - - function fuOpen() { - fuStatus("Ready..."); - Modal.show('#fu_modal', onClose); - $('#fu_form').toggleClass('busy', false); - Input.blockKeys(true); - } - - function onClose() { - console.log("Upload modal closed."); - clearTimeout(fuTout); - line_i = 0; - Input.blockKeys(false); - } - - function fuStatus(msg) { - qs('#fu_prog').textContent = msg; - } - - function fuSend() { - var v = qs('#fu_text').value; - if (!v.length) { - fuClose(); - return; - } - - lines = v.split('\n'); - line_i = 0; - inline_pos = 0; // offset in line - send_delay_ms = qs('#fu_delay').value; - - // sanitize - 0 causes overflows - if (send_delay_ms < 0) { - send_delay_ms = 0; - qs('#fu_delay').value = send_delay_ms; - } - - nl_str = { - 'CR': '\r', - 'LF': '\n', - 'CRLF': '\r\n', - }[qs('#fu_crlf').value]; - - $('#fu_form').toggleClass('busy', true); - fuStatus("Starting..."); - fuSendLine(); - } - - function fuSendLine() { - if (!$('#fu_modal').hasClass('visible')) { - // Modal is closed, cancel - return; - } - - if (!Conn.canSend()) { - // postpone - fuTout = setTimeout(fuSendLine, 1); - return; - } - - if (inline_pos == 0) { - curLine = lines[line_i++] + nl_str; - } - - var chunk; - if ((curLine.length - inline_pos) <= MAX_LINE_LEN) { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos = 0; - } else { - chunk = curLine.substr(inline_pos, MAX_LINE_LEN); - inline_pos += MAX_LINE_LEN; - } - - if (!Input.sendString(chunk)) { - fuStatus("FAILED!"); - return; - } - - var all = lines.length; - - fuStatus(line_i+" / "+all+ " ("+(Math.round((line_i/all)*1000)/10)+"%)"); - - if (lines.length > line_i || inline_pos > 0) { - fuTout = setTimeout(fuSendLine, send_delay_ms); - } else { - closeWhenReady(); - } - } - - function closeWhenReady() { - if (!Conn.canSend()) { - // stuck in XOFF still, wait to process... - fuStatus("Waiting for Tx buffer..."); - setTimeout(closeWhenReady, 100); - } else { - fuStatus("Done."); - // delay to show it - setTimeout(function() { - fuClose(); - }, 100); - } - } - - function fuClose() { - Modal.hide('#fu_modal'); - } - - return { - init: function() { - qs('#fu_file').addEventListener('change', function (evt) { - var reader = new FileReader(); - var file = evt.target.files[0]; - console.log("Selected file type: "+file.type); - if (!file.type.match(/text\/.*|application\/(json|csv|.*xml.*|.*script.*)/)) { - // Deny load of blobs like img - can crash browser and will get corrupted anyway - if (!confirm("This does not look like a text file: "+file.type+"\nReally load?")) { - qs('#fu_file').value = ''; - return; - } - } - reader.onload = function(e) { - var txt = e.target.result.replace(/[\r\n]+/,'\n'); - qs('#fu_text').value = txt; - }; - console.log("Loading file..."); - reader.readAsText(file); - }, false); - }, - close: fuClose, - start: fuSend, - open: fuOpen, - } -})(); diff --git a/html_orig/jssrc/utils.js b/html_orig/jssrc/utils.js deleted file mode 100755 index d95c86c..0000000 --- a/html_orig/jssrc/utils.js +++ /dev/null @@ -1,161 +0,0 @@ -/** Make a node */ -function mk(e) {return document.createElement(e)} - -/** Find one by query */ -function qs(s) {return document.querySelector(s)} - -/** Find all by query */ -function qsa(s) {return document.querySelectorAll(s)} - -/** Convert any to bool safely */ -function bool(x) { - return (x === 1 || x === '1' || x === true || x === 'true'); -} - -/** - * Filter 'spacebar' and 'return' from keypress handler, - * and when they're pressed, fire the callback. - * use $(...).on('keypress', cr(handler)) - */ -function cr(hdl) { - return function(e) { - if (e.which == 10 || e.which == 13 || e.which == 32) { - hdl(); - } - }; -} - -/** Extend an objects with options */ -function extend(defaults, options) { - var target = {}; - - Object.keys(defaults).forEach(function(k){ - target[k] = defaults[k]; - }); - - Object.keys(options).forEach(function(k){ - target[k] = options[k]; - }); - - return target; -} - -/** Escape string for use as literal in RegExp */ -function rgxe(str) { - return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); -} - -/** Format number to N decimal places, output as string */ -function numfmt(x, places) { - var pow = Math.pow(10, places); - return Math.round(x*pow) / pow; -} - -/** Get millisecond timestamp */ -function msNow() { - return +(new Date); -} - -/** Get ms elapsed since msNow() */ -function msElapsed(start) { - return msNow() - start; -} - -/** Shim for log base 10 */ -Math.log10 = Math.log10 || function(x) { - return Math.log(x) / Math.LN10; -}; - -/** - * Perform a substitution in the given string. - * - * Arguments - array or list of replacements. - * Arguments numeric keys will replace {0}, {1} etc. - * Named keys also work, ie. {foo: "bar"} -> replaces {foo} with bar. - * - * Braces are added to keys if missing. - * - * @returns {String} result - */ -String.prototype.format = function () { - var out = this; - var repl = arguments; - - if (arguments.length == 1 && (Array.isArray(arguments[0]) || typeof arguments[0] == 'object')) { - repl = arguments[0]; - } - - for (var ph in repl) { - if (repl.hasOwnProperty(ph)) { - var ph_orig = ph; - - if (!ph.match(/^\{.*\}$/)) { - ph = '{' + ph + '}'; - } - - // replace all occurrences - var pattern = new RegExp(rgxe(ph), "g"); - out = out.replace(pattern, repl[ph_orig]); - } - } - - return out; -}; - -/** HTML escape */ -function e(str) { - return $.htmlEscape(str); -} - -/** Check for undefined */ -function undef(x) { - return typeof x == 'undefined'; -} - -/** Safe json parse */ -function jsp(str) { - try { - return JSON.parse(str); - } catch(e) { - console.error(e); - return null; - } -} - -/** Create a character from ASCII code */ -function Chr(n) { - return String.fromCharCode(n); -} - -/** Decode number from 2B encoding */ -function parse2B(s, i) { - return (s.charCodeAt(i++) - 1) + (s.charCodeAt(i) - 1) * 127; -} - -/** Decode number from 3B encoding */ -function parse3B(s, i) { - return (s.charCodeAt(i) - 1) + (s.charCodeAt(i+1) - 1) * 127 + (s.charCodeAt(i+2) - 1) * 127 * 127; -} - -/** Encode using 2B encoding, returns string. */ -function encode2B(n) { - var lsb, msb; - lsb = (n % 127); - n = ((n - lsb) / 127); - lsb += 1; - msb = (n + 1); - return Chr(lsb) + Chr(msb); -} - -/** Encode using 3B encoding, returns string. */ -function encode3B(n) { - var lsb, msb, xsb; - lsb = (n % 127); - n = (n - lsb) / 127; - lsb += 1; - msb = (n % 127); - n = (n - msb) / 127; - msb += 1; - xsb = (n + 1); - return Chr(lsb) + Chr(msb) + Chr(xsb); -} diff --git a/html_orig/jssrc/wifi.js b/html_orig/jssrc/wifi.js deleted file mode 100644 index ebed158..0000000 --- a/html_orig/jssrc/wifi.js +++ /dev/null @@ -1,163 +0,0 @@ -(function(w) { - var authStr = ['Open', 'WEP', 'WPA', 'WPA2', 'WPA/WPA2']; - var curSSID; - - // Get XX % for a slider input - function rangePt(inp) { - return Math.round(((inp.value / inp.max)*100)) + '%'; - } - - // Display selected STA SSID etc - function selectSta(name, password, ip) { - $('#sta_ssid').val(name); - $('#sta_password').val(password); - - $('#sta-nw').toggleClass('hidden', name.length == 0); - $('#sta-nw-nil').toggleClass('hidden', name.length > 0); - - $('#sta-nw .essid').html(e(name)); - var nopw = undef(password) || password.length == 0; - $('#sta-nw .passwd').toggleClass('hidden', nopw); - $('#sta-nw .nopasswd').toggleClass('hidden', !nopw); - $('#sta-nw .ip').html(ip.length>0 ? tr('wifi.connected_ip_is')+ip : tr('wifi.not_conn')); - } - - /** Update display for received response */ - function onScan(resp, status) { - //var ap_json = { - // "result": { - // "inProgress": "0", - // "APs": [ - // {"essid": "Chlivek", "bssid": "88:f7:c7:52:b3:99", "rssi": "204", "enc": "4", "channel": "1"}, - // {"essid": "TyNikdy", "bssid": "5c:f4:ab:0d:f1:1b", "rssi": "164", "enc": "3", "channel": "1"}, - // ] - // } - //}; - - if (status != 200) { - // bad response - rescan(5000); // wait 5sm then retry - return; - } - - try { - resp = JSON.parse(resp); - } catch (e) { - console.log(e); - rescan(5000); - return; - } - - var done = !bool(resp.result.inProgress) && (resp.result.APs.length > 0); - rescan(done ? 15000 : 1000); - if (!done) return; // no redraw yet - - // clear the AP list - var $list = $('#ap-list'); - // remove old APs - $('#ap-list .AP').remove(); - - $list.toggleClass('hidden', !done); - $('#ap-loader').toggleClass('hidden', done); - - // scan done - resp.result.APs.sort(function (a, b) { - return b.rssi - a.rssi; - }).forEach(function (ap) { - ap.enc = parseInt(ap.enc); - - if (ap.enc > 4) return; // hide unsupported auths - - var item = mk('div'); - - var $item = $(item) - .data('ssid', ap.essid) - .data('pwd', ap.enc) - .attr('tabindex', 0) - .addClass('AP'); - - // mark current SSID - if (ap.essid == curSSID) { - $item.addClass('selected'); - } - - var inner = mk('div'); - $(inner).addClass('inner') - .htmlAppend('
{0}
'.format(ap.rssi_perc)) - .htmlAppend('
{0}
'.format($.htmlEscape(ap.essid))) - .htmlAppend('
{0}
'.format(authStr[ap.enc])); - - $item.on('click', function () { - var $th = $(this); - - var conn_ssid = $th.data('ssid'); - var conn_pass = ''; - - if (+$th.data('pwd')) { - // this AP needs a password - conn_pass = prompt(tr("wifi.enter_passwd").replace(":ssid:", conn_ssid)); - if (!conn_pass) return; - } - - $('#sta_password').val(conn_pass); - $('#sta_ssid').val(conn_ssid); - selectSta(conn_ssid, conn_pass, ''); - }); - - - item.appendChild(inner); - $list[0].appendChild(item); - }); - } - - function startScanning() { - $('#ap-loader').removeClass('hidden'); - $('#ap-scan').addClass('hidden'); - $('#ap-loader .anim-dots').html('.'); - - scanAPs(); - } - - /** Ask the CGI what APs are visible (async) */ - function scanAPs() { - if (_demo) { - onScan(_demo_aps, 200); - } else { - $.get('http://' + _root + '/cfg/wifi/scan', onScan); - } - } - - function rescan(time) { - setTimeout(scanAPs, time); - } - - /** Set up the WiFi page */ - function wifiInit(cfg) { - // Update slider value displays - $('.Row.range').forEach(function(x) { - var inp = x.querySelector('input'); - var disp1 = x.querySelector('.x-disp1'); - var disp2 = x.querySelector('.x-disp2'); - var t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - $(inp).on('input', function() { - t = rangePt(inp); - $(disp1).html(t); - $(disp2).html(t); - }); - }); - - // Forget STA credentials - $('#forget-sta').on('click', function() { - selectSta('', '', ''); - return false; - }); - - selectSta(cfg.sta_ssid, cfg.sta_password, cfg.sta_active_ip); - curSSID = cfg.sta_active_ssid; - } - - w.init = wifiInit; - w.startScanning = startScanning; -})(window.WiFi = {}); diff --git a/html_orig/lang/en.php b/html_orig/lang/en.php deleted file mode 100644 index 3e63611..0000000 --- a/html_orig/lang/en.php +++ /dev/null @@ -1,180 +0,0 @@ - 'ESPTerm', - 'appname_demo' => 'ESPTerm DEMO', - - 'menu.cfg_wifi' => 'WiFi Settings', - 'menu.cfg_network' => 'Network Settings', - 'menu.cfg_term' => 'Terminal Settings', - 'menu.about' => 'About ESPTerm', - 'menu.help' => 'Quick Reference', - 'menu.term' => 'Back to Terminal', - 'menu.cfg_system' => 'System Settings', - 'menu.cfg_wifi_conn' => 'Connecting to Network', - - 'menu.settings' => 'Settings', - - 'title.term' => 'Terminal', - - 'term_nav.config' => 'Config', - 'term_nav.wifi' => 'WiFi', - 'term_nav.help' => 'Help', - 'term_nav.about' => 'About', - 'term_nav.paste' => 'Paste', - 'term_nav.upload' => 'Upload', - 'term_nav.keybd' => 'Keyboard', - 'term_nav.paste_prompt' => 'Paste text to send:', - - 'net.ap' => 'DHCP Server (AP)', - 'net.sta' => 'DHCP Client (Station)', - 'net.sta_mac' => 'Station MAC', - 'net.ap_mac' => 'AP MAC', - 'net.details' => 'MAC addresses', - - 'term.defaults' => 'Initial Settings', - 'term.expert' => 'Expert Options', - 'term.explain_initials' => ' - Those are the initial settings used after ESPTerm powers on or when the screen - reset command is received. Some options can be changed by the application via escape sequences, - those changes won\'t be saved in Flash. - ', - 'term.explain_expert' => ' - Those are advanced config options that usually don\'t need to be changed. - Edit them only if you know what you\'re doing.', - - 'term.example' => 'Default colors preview', - - 'term.reset_screen' => 'Reset screen & parser', - 'term.term_title' => 'Header text', - 'term.term_width' => 'Width / height', - 'term.default_fg_bg' => 'Text / background', - 'term.buttons' => 'Button labels', - 'term.theme' => 'Color scheme', - 'term.parser_tout_ms' => 'Parser timeout', - 'term.display_tout_ms' => 'Redraw delay', - 'term.display_cooldown_ms' => 'Redraw cooldown', - 'term.fn_alt_mode' => 'SS3 Fn keys', - 'term.show_config_links' => 'Show nav links', - 'term.show_buttons' => 'Show buttons', - 'term.loopback' => 'Local Echo', - 'term.button_msgs' => 'Button codes
(ASCII, dec, CSV)', - - // terminal color labels - 'color.0' => 'Black', - 'color.1' => 'Red', - 'color.2' => 'Green', - 'color.3' => 'Yellow', - 'color.4' => 'Blue', - 'color.5' => 'Purple', - 'color.6' => 'Cyan', - 'color.7' => 'Silver', - 'color.8' => 'Gray', - 'color.9' => 'Light Red', - 'color.10' => 'Light Green', - 'color.11' => 'Light Yellow', - 'color.12' => 'Light Blue', - 'color.13' => 'Light Purple', - 'color.14' => 'Light Cyan', - 'color.15' => 'White', - - 'net.explain_sta' => ' - Switch off Dynamic IP to configure the static IP address.', - - 'net.explain_ap' => ' - Those settings affect the built-in DHCP server in AP mode.', - - 'net.ap_dhcp_time' => 'Lease time', - 'net.ap_dhcp_start' => 'Pool start IP', - 'net.ap_dhcp_end' => 'Pool end IP', - 'net.ap_addr_ip' => 'Own IP address', - 'net.ap_addr_mask' => 'Subnet mask', - - 'net.sta_dhcp_enable' => 'Use dynamic IP', - 'net.sta_addr_ip' => 'ESPTerm static IP', - 'net.sta_addr_mask' => 'Subnet mask', - 'net.sta_addr_gw' => 'Gateway IP', - - 'wifi.ap' => 'Built-in Access Point', - 'wifi.sta' => 'Join Existing Network', - - 'wifi.enable' => 'Enabled', - 'wifi.tpw' => 'Transmit power', - 'wifi.ap_channel' => 'Channel', - 'wifi.ap_ssid' => 'AP SSID', - 'wifi.ap_password' => 'Password', - 'wifi.ap_hidden' => 'Hide SSID', - 'wifi.sta_info' => 'Selected', - - 'wifi.not_conn' => 'Not connected.', - 'wifi.sta_none' => 'None', - 'wifi.sta_active_pw' => '🔒 Password saved', - 'wifi.sta_active_nopw' => '🔓 Open access', - 'wifi.connected_ip_is' => 'Connected, IP is ', - 'wifi.sta_password' => 'Password:', - - 'wifi.scanning' => 'Scanning', - 'wifi.scan_now' => 'Click here to start scanning!', - 'wifi.cant_scan_no_sta' => 'Click here to enable client mode and start scanning!', - 'wifi.select_ssid' => 'Available networks:', - 'wifi.enter_passwd' => 'Enter password for ":ssid:"', - 'wifi.sta_explain' => 'After selecting a network, press Apply to connect.', - - 'wifi.conn.status' => 'Status:', - 'wifi.conn.back_to_config' => 'Back to WiFi config', - 'wifi.conn.telemetry_lost' => 'Telemetry lost; something went wrong, or your device disconnected.', - 'wifi.conn.explain_android_sucks' => ' - If you\'re configuring ESPTerm via a smartphone, or were connected - from another external network, your device may lose connection and this - progress indicator won\'t work. Please wait a while (~ 15 seconds), - then check if the connection succeeded.', - - 'wifi.conn.explain_reset' => ' - To force enable the built-in AP, hold the BOOT - button until the blue LED starts flashing. Hold the button longer (until the LED - flashes rapidly) for a "factory reset".', - - 'wifi.conn.disabled' =>"Station mode is disabled.", - 'wifi.conn.idle' =>"Idle, not connected and has no IP.", - 'wifi.conn.success' => "Connected! Received IP ", - 'wifi.conn.working' => "Connecting to selected AP", - 'wifi.conn.fail' => "Connection failed, check settings & try again. Cause: ", - - 'system.save_restore' => 'Save & Restore', - 'system.confirm_restore' => 'Restore all settings to their default values?', - 'system.confirm_restore_hard' => - 'Restore to firmware default settings? This will reset ' . - 'all active settings and switch to AP mode with the default SSID.', - 'system.confirm_store_defaults' => - 'Enter admin password to confirm you want to store the current settings as defaults.', - 'system.password' => 'Admin password:', - 'system.restore_defaults' => 'Reset active settings to defaults', - 'system.write_defaults' => 'Save active settings as defaults', - 'system.restore_hard' => 'Reset active settings to firmware defaults', - 'system.explain_persist' => ' - ESPTerm contains two persistent memory banks, one for default and - one for active settings. Active settings can be stored as defaults - by the administrator (password required). - ', - 'system.uart' => 'Serial Port', - 'system.explain_uart' => ' - This form controls the primary, communication UART. The debug UART is fixed at 115.200 baud, one stop-bit and no parity. - ', - 'uart.baud' => 'Baud rate', - 'uart.parity' => 'Parity', - 'uart.parity.none' => 'None', - 'uart.parity.odd' => 'Odd', - 'uart.parity.even' => 'Even', - 'uart.stop_bits' => 'Stop-bits', - 'uart.stop_bits.one' => 'One', - 'uart.stop_bits.one_and_half' => 'One and half', - 'uart.stop_bits.two' => 'Two', - - 'apply' => 'Apply!', - 'enabled' => 'Enabled', - 'disabled' => 'Disabled', - 'yes' => 'Yes', - 'no' => 'No', - 'confirm' => 'OK', - 'form_errors' => 'Validation errors for:', -]; diff --git a/html_orig/packjs.sh b/html_orig/packjs.sh deleted file mode 100755 index 0c910b2..0000000 --- a/html_orig/packjs.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -echo "Packing js..." - -cat jssrc/chibi.js \ - jssrc/keymaster.js \ - jssrc/utils.js \ - jssrc/modal.js \ - jssrc/notif.js \ - jssrc/appcommon.js \ - jssrc/lang.js \ - jssrc/wifi.js \ - jssrc/term_* \ - jssrc/term.js > js/app.js diff --git a/html_orig/pages/_cfg_menu.php b/html_orig/pages/_cfg_menu.php deleted file mode 100644 index db01711..0000000 --- a/html_orig/pages/_cfg_menu.php +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/html_orig/pages/_head.php b/html_orig/pages/_head.php deleted file mode 100644 index 3a39b02..0000000 --- a/html_orig/pages/_head.php +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - <?= $_GET['PAGE_TITLE'] ?> - - - - - -
- - -
-Loading… - -

- - - - diff --git a/html_orig/pages/_tail.php b/html_orig/pages/_tail.php deleted file mode 100644 index a450375..0000000 --- a/html_orig/pages/_tail.php +++ /dev/null @@ -1,13 +0,0 @@ - - -
- - - - -
- -
- - - diff --git a/html_orig/pages/about.php b/html_orig/pages/about.php deleted file mode 100644 index a40f181..0000000 --- a/html_orig/pages/about.php +++ /dev/null @@ -1,69 +0,0 @@ -
- -

ESP8266 Remote Terminal

- - - -

- © Ondřej Hruška, 2016-2017 - <ondra@ondrovo.com> -

- -

- Katedra měření, FEL ČVUT
- Department of Measurement, FEE CTU -

-
- -
-

Version

- - - - - - - - - - - - - -
ESPTermv%vers_fw%, built %date% at %time%
libesphttpdv%vers_httpd%
ESP IoT SDKv%vers_sdk%
-
- -
-

Issues

-

- Please report any issues to the bugtracker or send them by e-mail (see above). -

-

- Firmware updates can be downloaded from the releases page and flashed - with esptool.py. -

-
- -
-

Contributing

-

- You're welcome to submit your improvements and ideas to our GitHub repository! -

- -

- If you'd like to donate, please try PayPal or - LiberaPay. -

-
- -
-

Thanks

-

- The webserver is based on a fork of the - esphttpd library by Jeroen Domburg (Sprite_tm). -

-

- Using (modified) JS library chibi.js by - Kyle Barrow as a lightweight jQuery alternative. -

-
diff --git a/html_orig/pages/cfg_network.php b/html_orig/pages/cfg_network.php deleted file mode 100644 index 21fefc1..0000000 --- a/html_orig/pages/cfg_network.php +++ /dev/null @@ -1,98 +0,0 @@ - - -
-

- -
- -
- -
- - -
- -
- - required> -
- -
- - required> -
- -
- - required> -
- -
- -
-
- -
-

- -
- -
- -
- - required> -
- -
- - required> -
- -
- - required> -
- -
- - required> -
- -
- - -  min -
- -
- -
-
- -
-

- -
- -
-
- -
-
- - diff --git a/html_orig/pages/cfg_system.php b/html_orig/pages/cfg_system.php deleted file mode 100644 index d0287a3..0000000 --- a/html_orig/pages/cfg_system.php +++ /dev/null @@ -1,90 +0,0 @@ -
-

- -
- -
- -
- - - -
- -
- -
- -
- - - -
-
- - -
-

- -
- -
- -
- - -  bps -
- -
- - -
- -
- - -
- -
- -
-
- - diff --git a/html_orig/pages/cfg_term.php b/html_orig/pages/cfg_term.php deleted file mode 100644 index 5f38f25..0000000 --- a/html_orig/pages/cfg_term.php +++ /dev/null @@ -1,203 +0,0 @@ -
- -
- -
-

- -
- -
- -
- - -
- -
-
- 3031323334353637 -
- -
- 9091929394959697 -
- -
- 4041424344454647 -
- -
- 100101102103104105106107 -
-
- -
-
- -
-
- -
- -   -
- -
- -   -
- -
- - -
- -
- -   -   -   -   - -
- -
- -
-
- -
-

- -
- -
- -
- - -  ms -
- -
- - -  ms -
- -
- - -  ms -
- -
- -   -   -   -   - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- -
-
- - diff --git a/html_orig/pages/cfg_wifi.php b/html_orig/pages/cfg_wifi.php deleted file mode 100644 index 804f383..0000000 --- a/html_orig/pages/cfg_wifi.php +++ /dev/null @@ -1,123 +0,0 @@ -
-

- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - - -
- -
- - -
- -
- -
-
- -
-

- -
- - -
- -
- - -
- - - - -
- - -
- -
-
- -
- -
- - -
- -
- -
-
- - diff --git a/html_orig/pages/cfg_wifi_conn.php b/html_orig/pages/cfg_wifi_conn.php deleted file mode 100755 index 6474b4a..0000000 --- a/html_orig/pages/cfg_wifi_conn.php +++ /dev/null @@ -1,89 +0,0 @@ -

- -
-

.

- -
- -
-

-

-
- - diff --git a/html_orig/pages/help.php b/html_orig/pages/help.php deleted file mode 100644 index 575d4d5..0000000 --- a/html_orig/pages/help.php +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - diff --git a/html_orig/pages/help/charsets.php b/html_orig/pages/help/charsets.php deleted file mode 100644 index c21b1dc..0000000 --- a/html_orig/pages/help/charsets.php +++ /dev/null @@ -1,80 +0,0 @@ -
-

Alternate Character Sets

- -
-

- ESPTerm implements Alternate Character Sets as a way to print box drawing characters - and special symbols. A character set can change what each received ASCII character - is printed as on the screen (eg. "{" is "π" in codepage `0`). The implementation is based - on the original VT devices. -

- -

- Since ESPTerm also supports UTF-8, this feature is the most useful for applications - which can't print UTF-8 or already use alternate character sets for historical reasons. -

- -

Supported codepages

- -
    -
  • `B` - US ASCII (default)
  • -
  • `A` - UK ASCII: # replaced with £
  • -
  • `0` - Symbols and basic line drawing (standard DEC alternate character set)
  • -
  • `1` - Symbols and advanced line drawing (based on DOS codepage 437, ESPTerm specific)
  • -
- -

- All codepages use codes 32-127, 32 being space. A character with no entry in the active codepage - stays unchanged. -

- - $cp) { - echo "

Codepage `$name`

\n"; - echo '
'; - foreach($cp as $point) { - $dis = $point[1]==$point[2]?' class="none"' : ''; - echo "$point[0]$point[1]$point[2]
"; - } - echo '
'; - } - ?> - -

Switching commands

- -

- There are two character set slots, G0 and G1. - Those slots are selected as active using ASCII codes Shift In and Shift Out (those originally served for shifting - a red-black typewriter tape). Often only G0 is used for simplicity. -

- -

- Each slot (G0 and G1) can have a different codepage assigned. G0 and G1 and the active slot number are - saved and restored with the cursor and cleared with a screen reset (\ec). -

- -

The following commands are used:

- - - - - - - - - - - - - - - - - - - - -
CodeMeaning
`\e(x`Set G0 = codepage x
`\e)x`Set G1 = codepage x
_SO_ (14)Activate G0
_SI_ (15)Activate G1
-
- diff --git a/html_orig/pages/help/cmd_cursor.php b/html_orig/pages/help/cmd_cursor.php deleted file mode 100644 index 4dd0d13..0000000 --- a/html_orig/pages/help/cmd_cursor.php +++ /dev/null @@ -1,199 +0,0 @@ -
-

Commands: Cursor Functions

- -
-

- The coordinates are 1-based, origin is top left. The cursor can move within the entire screen, - or in the active Scrolling Region if Origin Mode is enabled. -

- -

After writing a character, the cursor advances to the right. If it has reached the end of the row, - it stays on the same line, but writing the next character makes it jump to the start of the next - line first, scrolling up if needed. If Auto-wrap mode is disabled, the cursor never wraps or scrolls - the screen. -

- -

- *Legend:* - Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. - If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. -

- -

Movement

- - - - - - - - - - - - - - - - - - - - - -
CodeMeaning
- - \e[nA \\ - \e[nB \\ - \e[nC \\ - \e[nD - - Move cursor up (`A`), down (`B`), right (`C`), left (`D`)
- - \e[nF \\ - \e[nE - - Go _n_ lines up (`F`) or down (`E`), start of line
- - \e[rd \\ - \e[cG \\ - \e[r;cH - - - Go to absolute position - row (`d`), column (`G`), or both (`H`). Use `\e[H` to go to 1,1. -
- `\e[6n` - - Query cursor position. Sent back as `\e[r;cR`. -
- -

Save / restore

- - - - - - - - - - - - - -
CodeMeaning
- - \e[s \\ - \e[u - - Save (`s`) or restore (`u`) cursor position
- - \e7 \\ - \e8 - - Save (`7`) or restore (`8`) cursor position and attributes
- -

Scrolling Region

- - - - - - - - - - - - - - - - - -
CodeMeaning
- `\e[a;br` - - Set scrolling region to rows _a_ through _b_ and go to 1,1. By default, the - scrolling region spans the entire screen height. The cursor can leave the region using - absolute position commands, unless Origin Mode (see below) is active. -
- - \e[?6h \\ - \e[?6l - - - Enable (`h`) or disable (`l`) Origin Mode and go to 1,1. In Origin Mode, all coordinates - are relative to the Scrolling Region and the cursor can't leave the region. -
- - \e[nS \\ - \e[nT - - - Move contents of the Scrolling Region up (`S`) or down (`T`), pad with empty - lines of the current background color. This is similar to what happens when AutoWrap - is enabled and some text is printed at the very end of the screen. -
- -

Tab stops

- - - - - - - - - - - - - - - - - -
CodeMeaning
- `\eH` - - Set tab stop at the current column. There are, by default, tabs every 8 columns. -
- - \e[nI \\ - \e[nZ - - Advance (`I`) or go back (`Z`) _n_ tab stops or end/start of line. ASCII _TAB_ (9) is equivalent to \e[1I
- - \e[0g \\ - \e[3g \\ - - Clear tab stop at the current column (`0`), or all columns (`3`).
- -

Other options

- - - - - - - - - - - - - -
CodeMeaning
- - \e[?7h \\ - \e[?7l - - Enable (`h`) or disable (`l`) cursor auto-wrap and screen auto-scroll
- - \e[?25h \\ - \e[?25l - - Show (`h`) or hide (`l`) the cursor
-
-
diff --git a/html_orig/pages/help/cmd_screen.php b/html_orig/pages/help/cmd_screen.php deleted file mode 100644 index 948b8a8..0000000 --- a/html_orig/pages/help/cmd_screen.php +++ /dev/null @@ -1,63 +0,0 @@ -
-

Commands: Screen Functions

- -
-

- Legend: - Italic letters such as _n_ are ASCII numbers that serve as arguments, separated with a semicolon. - If an argument is left out, it's treated as 0 or 1, depending on what makes sense for the command. -

- - - - - - - - - - - - - - - - - - - - - - - - - -
CodeMeaning
- `\e[mJ` - - Clear part of screen. _m_: 0 - from cursor, 1 - to cursor, 2 - all -
- `\e[mK` - - Erase part of line. _m_: 0 - from cursor, 1 - to cursor, 2 - all -
- `\e[nX` - Erase _n_ characters in line. -
- - \e[nL \\ - \e[nM - - - Insert (`L`) or delete (`M`) _n_ lines. Following lines are pulled up or pushed down. -
- - \e[n@ \\ - \e[nP - - - Insert (`@`) or delete (`P`) _n_ characters. The rest of the line is pulled left or pushed right. - Characters going past the end of line are lost. -
-
-
diff --git a/html_orig/pages/help/cmd_system.php b/html_orig/pages/help/cmd_system.php deleted file mode 100644 index d8956fc..0000000 --- a/html_orig/pages/help/cmd_system.php +++ /dev/null @@ -1,103 +0,0 @@ -
-

Commands: System Functions

- -
-

- It's possible to dynamically change the screen title text and action button labels. - Setting an empty label to a button makes it look disabled. The buttons send ASCII 1-5 when clicked. - Those changes are not retained after restart. -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CodeMeaning
`\ec` - Clear screen, reset attributes and cursor. - The screen size, title and button labels remain unchanged. -
`\e[5n` - Query device status, ESPTerm replies with `\e[0n` "device is OK". - Can be used to check if the terminal has booted up and is ready to receive commands. -
_CAN_ (24) - This ASCII code is not a command, but is sent by ESPTerm when it becomes ready to receive commands. - When this code is received on the UART, it means ESPTerm has restarted and is ready. Use this to detect - spontaneous restarts which require a full screen repaint. -
`\e]0;t\a`Set screen title to _t_ (this is a standard OSC command)
- - \e]80+n;t\a - - - Set label for button _n_ = 1-5 (code 81-85) to _t_ - e.g.`\e]81;Yes\a` - sets the first button text to "Yes". -
- - \e]90+n;m\a - - - Set message for button _n_ = 1-5 (code 81-85) to _m_ - e.g.`\e]94;iv\a` - sets the 3rd button to send string "iv" when pressed. -
- - \e[?800h \\ - \e[?800l - - - Show (`h`) or hide (`l`) action buttons (the blue buttons under the screen). -
- - \e[?801h \\ - \e[?801l - - - Show (`h`) or hide (`l`) menu/help links under the screen. -
- - \e[12h \\ - \e[12l - - - Enable (`h`) or disable (`l`) Send-Receive Mode (SRM). - SRM is the opposite of Local Echo, meaning `\e[12h` disables and `\e[12l` enables Local Echo. -
`\e[8;r;ct`Set screen size to _r_ rows and _c_ columns (this is a command borrowed from Xterm)
-
-
diff --git a/html_orig/pages/help/input.php b/html_orig/pages/help/input.php deleted file mode 100644 index d4fcdd4..0000000 --- a/html_orig/pages/help/input.php +++ /dev/null @@ -1,254 +0,0 @@ - -
-

User Input: Keyboard, Mouse

- -
-

Keyboard

- -

- The user can input text using their keyboard, or on Android, using the on-screen keyboard which is open using - a button beneath the screen. Supported are all printable characters, as well as many control keys, such as arrows, _Ctrl+letters_ - and function keys. Sequences sent by function keys are based on VT102 and Xterm. -

- -

- The codes sent by _Home_, _End_, _F1-F4_ and cursor keys are affected by various keyboard modes (_Application Cursor Keys_, - _Application Numpad Mode_, _SS3 Fn Keys Mode_). Some can be set in the Terminal Settings, - others via commands. -

- -

- Here are some examples of control key codes: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyCodeKeyCode
Up`\e[A`,~`\eOA`F1`\eOP`,~`\e[11\~`
Down`\e[B`,~`\eOB`F2`\eOQ`,~`\e[12\~`
Right`\e[C`,~`\eOC`F3`\eOR`,~`\e[13\~`
Left`\e[D`,~`\eOD`F4`\eOS`,~`\e[14\~`
Home`\eOH`,~`\e[H`,~`\e[1\~`F5`\e[15~`
End`\eOF`,~`\e[F`,~`\e[4\~`F6`\e[17\~`
Insert`\e[2\~`F7`\e[18\~`
Delete`\e[3\~`F8`\e[19\~`
Page Up`\e[5\~`F9`\e[20\~`
Page Down`\e[6\~`F10`\e[21\~`
Enter`\r` (13)F11`\e[23\~`
Ctrl+Enter`\n` (10)F12`\e[24\~`
Tab`\t` (9)ESC`\e` (27)
Backspace`\b` (8)Ctrl+A..ZASCII 1-26
- -

Action buttons

- -

- The blue buttons under the screen send ASCII codes 1, 2, 3, 4, 5, which incidentally - correspond to _Ctrl+A,B,C,D,E_. This choice was made to make button press parsing as simple as possible. -

- -

Mouse

- -

- ESPTerm implements standard mouse tracking modes based on Xterm. Mouse tracking can be used to implement - powerful user interactions such as on-screen buttons, draggable sliders or dials, menus etc. ESPTerm's - mouse tracking was tested using VTTest and should be compatible with all terminal applications - that request mouse tracking. -

- -

- Mouse can be tracked in different ways; some are easier to parse, others more powerful. The coordinates - can also be encoded in different ways. All mouse tracking options are set using option commands: - `CSI ? _n_ h` to enable, `CSI ? _n_ l` to disable option _n_. -

- -

Mouse Tracking Modes

- -

- All tracking modes produce three numbers which are then encoded and send to the application. - First is the _event number_ N, then the _X and Y coordinates_, 1-based. -

- -

- Mouse buttons are numbered: 1=left, 2=middle, 3=right. - Wheel works as two buttons (4 and 5) which generate only press events (no release). -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
OptionNameDescription
`9`*X10~mode* - This is the most basic tracking mode, in which only button presses are reported. - N = button - 1: (0 left, 1 middle, 2 right, 3, 4 wheel). -
`1000`*Normal~mode* - In Normal mode, both button presses and releases are reported. - The lower two bits of N indicate the button pressed: - `00b` (0) left, `01b` (1) middle, `10b` (2) right, `11b` (3) button release. - Wheel buttons are reported as 0 and 1 with added 64 (e.g. 64 and 65). - Normal mode also supports tracking of modifier keys, which are added to N as bit masks: - 4=_Shift_, 8=_Meta/Alt_, 16=_Control/Cmd_. Example: middle button with _Shift_ = 1 + 4 = `101b` (5). -
`1002`*Button-Event tracking* - This is similar to Normal mode (`1000`), but mouse motion with a button held is also reported. - A motion event is generated when the mouse cursor moves between screen character cells. - A motion event has the same N as a press event, but 32 is added. - For example, drag-drop event with the middle button will produce N = 1 (press), 33 (dragging) and 3 (release). -
`1003`*Any-Event tracking* - This mode is almost identical to Button Event tracking (1002), but motion events - are sent even when no mouse buttons are held. This could be used to draw on-screen mouse cursor, for example. - Motion events with no buttons will use N = 32 + _11b_ (35). -
`1004`*Focus~tracking* - Focus tracking is a separate function from the other mouse tracking modes, therefore they can be enabled together. - Focus tracking reports when the terminal window (in Xterm) gets or loses focus, or in ESPTerm's case, when any - user is connected. This can be used to pause/resume a game or on-screen animations. - Focus tracking mode sends `CSI I` when the terminal receives, and `CSI O` when it loses focus. -
-
- -

Mouse Report Encoding

- -

- The following encoding schemes can be used with any of the tracking modes (except Focus tracking, which is not affected). -

- -
- - - - - - - - - - - - - - - - - - - - - - -
OptionNameDescription
--*Normal~encoding* - This is the default encoding scheme used when no other option is selected. - In this mode, a mouse report has the format `CSI M _n_ _x_ _y_`, - where _n_, _x_ and _y_ are characters with ASCII value = 32 (space) + the respective number, e.g. - 0 becomes 32 (space), 1 becomes 33 (!). The reason for adding 32 is to avoid producing control characters. - Example: `\e[M !!` - left button press at coordinates 1,1 when using X10 mode. -
`1005`*UTF-8~encoding* - This scheme should encode each of the numbers as a UTF-8 code point, expanding the maximum possible value. - Since ESPTerm's screen size is limited and this has no practical benefit, this serves simply as an alias - to the normal scheme. -
`1006`*SGR~encoding* - In SGR encoding, the response looks like a SGR sequence with the three numbers as semicolon-separated - ASCII values. In this case 32 is not added like in the Normal and UTF-8 schemes, because - it would serve nor purpose here. Also, button release is not reported as 11b, - but using the normal button code while changing the final SGR character: `M` for button press - and `m` for button release. Example: `\e[2;80;24m` - the right button was released - at row 80, column 24. -
`1015`*URXVT~encoding* - This is similar to SGR encoding, but the final character is always `M` and the numbers are - like in the Normal scheme, with 32 added. This scheme has no real advantage over the previous schemes and - was added solely for completeness. -
-
-
-
diff --git a/html_orig/pages/help/nomenclature.php b/html_orig/pages/help/nomenclature.php deleted file mode 100644 index d5020a0..0000000 --- a/html_orig/pages/help/nomenclature.php +++ /dev/null @@ -1,84 +0,0 @@ -
-

Basic Intro & Nomenclature

- -
- VT102 - -

- ESPTerm emulates VT102 (pictured) with some additions from later VT models and Xterm. - All commonly used attributes and commands are supported. - ESPTerm is capable of displaying ncurses applications such as _Midnight Commander_ using _agetty_. -

- -

- ESPTerm accepts UTF-8 characters received on the communication UART and displays them on the screen, - interpreting some codes as Control Characters. Those are e.g. _Carriage Return_ (13), _Line Feed_ (10), - _Tab_ (9), _Backspace_ (8) and _Bell_ (7). -

- -

- Escape sequences start with the control character _ESC_ (27), - followed by any number of ASCII characters forming the body of the command. -

- -

Nomenclature & Command Types

- -

- Examples on this help page use the following symbols for special characters and command types:\\ - (spaces are for clarity only, _DO NOT_ include them in the commands!) -

- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameSymbolASCIIC stringFunction
*ESC*`\e``ESC` (27)`"\e"`, `"\x1b"`, `"\033"`Introduces an escape sequence. _(Note: `\e` is a GCC extension)_
*Bell*`\a``BEL`~(7)`"\a"`, `"\x7"`, `"\07"`Audible beep
*String Terminator*`ST``ESC \`~(27~92)
_or_~`\a`~(7)
`"\x1b\\"`, `"\a"`Terminates a string command (`\a` can be used as an alternative)
*Control Sequence Introducer*`CSI``ESC [``"\x1b["`Starts a CSI command. Examples: `\e[?7;10h`, `\e[2J`
*Operating System Command*`OSC``ESC ]``"\x1b]"`Starts an OSC command. Is followed by a command string terminated by `ST`. Example: `\e]0;My Screen Title\a`
*Select Graphic Rendition*`SGR``CSI n;n;nm``"\x1b[1;2;3m"`Set text attributes, like color or style. 0 to 10 numbers can be used, `\e[m` is treated as `\e[0m`
-
- -

There are also some other commands that don't follow the CSI, SGR or OSC pattern, such as `\e7` or - `\e#8`. A list of the most important escape sequences is presented in the following sections.

-
-
diff --git a/html_orig/pages/help/screen_behavior.php b/html_orig/pages/help/screen_behavior.php deleted file mode 100644 index 68e3641..0000000 --- a/html_orig/pages/help/screen_behavior.php +++ /dev/null @@ -1,17 +0,0 @@ -
-

Screen Behavior & Refreshing

- -
-

- The initial screen size, title text and button labels can be configured in Terminal Settings. -

- -

- Screen updates are sent to the browser through a WebSocket after some time of inactivity on the communication UART - (called "Redraw Delay"). After an update is sent, at least a time of "Redraw Cooldown" must elapse before the next - update can be sent. Those delays are used is to avoid burdening the server with tiny updates during a large screen - repaint. If you experience issues (broken image due to dropped bytes), try adjusting those config options. It may also - be useful to try different baud rates. -

-
-
diff --git a/html_orig/pages/help/sgr_colors.php b/html_orig/pages/help/sgr_colors.php deleted file mode 100644 index 85a1047..0000000 --- a/html_orig/pages/help/sgr_colors.php +++ /dev/null @@ -1,65 +0,0 @@ - -
-

Commands: Color SGR

- -
-

- Colors are set using SGR commands (like `\e[10;20;30m`). The following tables list the SGR codes to use. - Selected colors are used for any new text entered, as well as for empty space when using line and screen clearing commands. - The configured default colors can be restored using SGR 39 for foreground and SGR 49 for background. -

- -

- The actual color representation depends on a color theme which - can be selected in Terminal Settings. -

- -

Foreground colors

- -
- 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 -
- -
- 90 - 91 - 92 - 93 - 94 - 95 - 96 - 97 -
- -

Background colors

- -
- 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 -
- -
- 100 - 101 - 102 - 103 - 104 - 105 - 106 - 107 -
-
-
diff --git a/html_orig/pages/help/sgr_styles.php b/html_orig/pages/help/sgr_styles.php deleted file mode 100644 index a1e5237..0000000 --- a/html_orig/pages/help/sgr_styles.php +++ /dev/null @@ -1,26 +0,0 @@ -
-

Commands: Style SGR

- -
-

- All text attributes are set using SGR commands like `\e[10;20;30m`, with up to 10 numbers separated by semicolons. - To restore all attributes to their default states, use SGR 0: `\e[0m` or `\e[m`. -

- -

Those are the supported text attributes SGR codes:

- - - - - - - - - - - - - -
StyleEnableDisable
Bold121, 22
Faint222
Italic323
Underlined424
Blink525
Inverse727
Striked929
𝔉𝔯𝔞𝔨𝔱𝔲𝔯2023
-
-
diff --git a/html_orig/pages/help/troubleshooting.php b/html_orig/pages/help/troubleshooting.php deleted file mode 100644 index 49173d5..0000000 --- a/html_orig/pages/help/troubleshooting.php +++ /dev/null @@ -1,33 +0,0 @@ -
-

Tips & Troubleshooting

- -
-
    -
  • *Communication UART (Rx, Tx)* can be configured in the System Settings. - -
  • *Boot log and debug messages* are available on pin *GPIO2* (P2) at 115200\,baud, 1 stop bit, no parity. - Those messages may be disabled through compile flags. - -
  • *Loopback test*: Connect the Rx and Tx pins with a piece of wire. Anything you type in the browser should - appear on the screen. Set _Parser Timeout = 0_ in Terminal Settings - to be able to manually enter escape sequences. - -
  • There is very little RAM available to the webserver, and it can support at most 4 connections at the same time. - Each terminal session (open window with the terminal screen) uses one persistent connection for screen updates. - *Avoid leaving unused windows open*, or either the RAM or connections may be exhausted. - -
  • *For best performance*, use the module in Client mode (connected to external network) and minimize the number - of simultaneous connections. Enabling AP consumes extra RAM because the DHCP server and Captive Portal - DNS server are started. - -
  • In AP mode, *check that the WiFi channel used is clear*; interference may cause flaky connection. - A good mobile app to use for this is - WiFi Analyzer (Google Play). - Adjust the hotspot strength and range using the _Tx Power setting_. - -
  • Hold the BOOT button (GPIO0 to GND) for ~1 second to force enable AP. Hold it for ~6 seconds to restore default settings. - (This is indicated by the blue LED rapidly flashing). Default settings can be overwritten in the - System Settings. -
-
-
diff --git a/html_orig/pages/term.php b/html_orig/pages/term.php deleted file mode 100644 index ed9e627..0000000 --- a/html_orig/pages/term.php +++ /dev/null @@ -1,93 +0,0 @@ - - - - -

- -
-
- -
- -
-
- - - - - - diff --git a/html_orig/sass/_fontello.scss b/html_orig/sass/_fontello.scss deleted file mode 100644 index c36198f..0000000 --- a/html_orig/sass/_fontello.scss +++ /dev/null @@ -1,108 +0,0 @@ -@charset "UTF-8"; - -/* Fontello data, processed by the unpack script. */ - -@font-face { - font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'); -} - - -%fontello-icon-base { -&::before { - font-family: "fontello"; - font-style: normal; - font-weight: normal; - speak: none; - - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ -} -} - - -/* Fontello icon codes */ -$icon-codes: ( - - - keyboard: '\2328', - about: '\2605', - restore: '\267c', - configure: '\2699', - ok: '\2714', - help: '\2753', - donate: '\2764', - back: '\276e', - cancel: '\e801', - paste: '\f0ea', - network: '🌍', - github: '🐱', - persist: '💾', - download: '📥', - wifi: '📶', - terminal: '🖳', -); - -/* Fontello classes */ - - -.icn-keyboard::before { content: '\2328'; } -.icn-about::before { content: '\2605'; } -.icn-restore::before { content: '\267c'; } -.icn-configure::before { content: '\2699'; } -.icn-ok::before { content: '\2714'; } -.icn-help::before { content: '\2753'; } -.icn-donate::before { content: '\2764'; } -.icn-back::before { content: '\276e'; } -.icn-cancel::before { content: '\e801'; } -.icn-paste::before { content: '\f0ea'; } -.icn-network::before { content: '🌍'; } -.icn-github::before { content: '🐱'; } -.icn-persist::before { content: '💾'; } -.icn-download::before { content: '📥'; } -.icn-wifi::before { content: '📶'; } -.icn-terminal::before { content: '🖳'; } - -[class^="icn-"], [class*=" icn-"] { - @extend %fontello-icon-base; -} - -@mixin icon-base() { - @extend %fontello-icon-base; -} - -@mixin icon-content($icon-name) { - &::before { - content: map-get($icon-codes, $icon-name); - } -} - -@mixin icon($icon-name) { - @include icon-base(); - @include icon-content(\icon-name); -} diff --git a/html_orig/sass/_grid-settings.scss b/html_orig/sass/_grid-settings.scss deleted file mode 100755 index c0e6506..0000000 --- a/html_orig/sass/_grid-settings.scss +++ /dev/null @@ -1,17 +0,0 @@ - -// Customize Neat grid - -@import "lib/neat/neat-helpers"; - -// optionally change gri settings - -// Define breakpoints -$phone: new-breakpoint(max-width 544px); -$tablet: new-breakpoint(min-width 545px max-width 1000px); -$normal: new-breakpoint(min-width 1001px max-width 1376px); -$large: new-breakpoint(min-width 1377px); - -$tablet-max: new-breakpoint(max-width 1000px); -$normal-max: new-breakpoint(max-width 1376px); -$tablet-min: new-breakpoint(min-width 545px); -$normal-min: new-breakpoint(min-width 1001px); diff --git a/html_orig/sass/_normalize.scss b/html_orig/sass/_normalize.scss deleted file mode 100755 index 0b1750f..0000000 --- a/html_orig/sass/_normalize.scss +++ /dev/null @@ -1,439 +0,0 @@ -/* normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ - -*, *:before, *:after { - box-sizing: border-box; -} - - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -//article, -//aside, -//details, -//figcaption, -figure, -//footer, -//header, -//hgroup, -//main, -//menu, -nav -//section, -//summary -{ - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -//audio, -canvas, -progress -//video -{ - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ -// -//audio:not([controls]) { -// display: none; -// height: 0; -//} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ - -[hidden] -//template -{ - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -//abbr[title] { -// border-bottom: 1px dotted; -//} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b -//strong -{ - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ -// -//dfn { -// font-style: italic; -//} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -h2 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ -// -//mark { -// background: #ff0; -// color: #000; -//} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -//figure { -// margin: 1em 40px; -//} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -//kbd, -pre -//samp -{ - font-family: "DejaVu Sans Mono", "Inconsolata", monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -//optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -//html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -//input[type="number"]::-webkit-inner-spin-button, -//input[type="number"]::-webkit-outer-spin-button { -// height: auto; -//} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ -// -//input[type="search"] { -// -webkit-appearance: textfield; /* 1 */ -// box-sizing: content-box; /* 2 */ -//} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ -// -//input[type="search"]::-webkit-search-cancel-button, -//input[type="search"]::-webkit-search-decoration { -// -webkit-appearance: none; -//} - -/** - * Define consistent border, margin, and padding. - */ -// -//fieldset { -// border: 1px solid #c0c0c0; -// margin: 0 2px; -// padding: 0.35em 0.625em 0.75em; -//} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ -// -//optgroup { -// font-weight: bold; -//} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} diff --git a/html_orig/sass/_utils.scss b/html_orig/sass/_utils.scss deleted file mode 100755 index 7c7301a..0000000 --- a/html_orig/sass/_utils.scss +++ /dev/null @@ -1,55 +0,0 @@ -// Add a highlight for debugging -@mixin highlight($color) { - outline: 1px solid $color; - background: rgba($color, .05); - box-shadow: 0 0 2px 2px rgba($color, .2), inset 0 0 2px 2px rgba($color, .2); -} - -// Ellipsis, but for block elements -@mixin block-ellipsis($width: 100%) { - display: block; - max-width: $width; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - word-wrap: normal; -} - -// No margins, padding, borders -@mixin naked() { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; -} - -@mixin translate($x, $y) { - @include transform(translate($x, $y)); -} - -// Disallow wrapping -@mixin nowrap() { - white-space: nowrap; - word-wrap: normal; -} - -@mixin click-through() { - pointer-events: none; -} - -// Disallow text selection -@mixin noselect() { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -// Allow text selection -@mixin can-select() { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - cursor: text; -} diff --git a/html_orig/sass/app.scss b/html_orig/sass/app.scss deleted file mode 100755 index 2b9a473..0000000 --- a/html_orig/sass/app.scss +++ /dev/null @@ -1,57 +0,0 @@ -@import "normalize"; -@import "fontello"; -@import "lib/bourbon/bourbon"; - -@import "grid-settings"; -@import "lib/neat/neat"; - -@import "utils"; - -$form-label-w: 160px; -$form-label-gap: 8px; -$form-field-w: 250px; - -$c-red-outline: #ff0099; -$c-form-label-fg: white; -$c-form-field-bg: #3c3c3c; -$c-form-field-fg: white; -$c-form-highlight: #2972ba; -$c-form-highlight-a: #2ea1f9; - -$c-modal-bg: #242426; - -$screen-stack: "DejaVu Sans Mono", "Liberation Mono", "Inconsolata", monospace; - -@function dist($x) { - @return modular-scale($x, 1rem, $golden); -} - -@function fsize($x) { - @return modular-scale($x, 1em, $major-second); -} - -@import "layout/index"; -@import "form/index"; - -// import all our pages -@import "pages/wifi"; -@import "pages/term"; -@import "pages/about"; - -// media queries - -@include media($tablet-min) { - .mq-phone { display: none!important; } -} - -@include media($phone) { - .mq-tablet-min, .mq-no-phone { display: none !important; } -} - -@include media($normal-min) { - .mq-tablet-max { display: none !important; } -} - -@include media($tablet-max) { - .mq-normal-min { display: none !important; } -} diff --git a/html_orig/sass/form/_buttons.scss b/html_orig/sass/form/_buttons.scss deleted file mode 100755 index 5f36222..0000000 --- a/html_orig/sass/form/_buttons.scss +++ /dev/null @@ -1,58 +0,0 @@ -@import "fancy_button_mixins"; - -$btn-gray-f: #DDDDDD; -$btn-gray-b: #505050; -$btn-gray-l: #343434; // line - -$btn-green-f: #FEFEFE; -$btn-green-b: #2ca94b; -$btn-green-fa: #FEFEFE; -$btn-green-ba: #28ba5c; - -$btn-red-f: #FEFEFE; -$btn-red-b: #D04E51; -$btn-red-fa: #FEFEFE; -$btn-red-ba: #d4403f; - -$btn-blue-f: #FEFEFE; -$btn-blue-b: #3983cd; -$btn-blue-fa: #FEFEFE; -$btn-blue-ba: #2076C6; - -$btn-orange-f: #FEFEFE; -$btn-orange-b: #dd8751; -$btn-orange-fa: #FEFEFE; -$btn-orange-ba: #C6733F; - -button, input[type=submit], .button { - @include fancy-btn-base(); - - &.narrow { - min-width: initial; - } - - &::before { - vertical-align: -1px; - margin-left: 0; - } - - text-shadow: 1.5px 1.5px 2px rgba(black, 0.4); - - @include fancy-btn-colors($btn-blue-f, $btn-blue-b, $btn-blue-fa, $btn-blue-ba); - - &:focus { - outline-color: $c-red-outline; - } -} - -//input[type="submit"], .btn-green { -// @include fancy-btn-colors($btn-green-f, $btn-green-b, $btn-green-fa, $btn-green-ba); -//} - -//.btn-red { -// @include fancy-btn-colors($btn-red-f, $btn-red-b, $btn-red-fa, $btn-red-ba); -//} - -//.btn-blue { -// @include fancy-btn-colors($btn-blue-f, $btn-blue-b, $btn-blue-fa, $btn-blue-ba); -//} diff --git a/html_orig/sass/form/_fancy_button_mixins.scss b/html_orig/sass/form/_fancy_button_mixins.scss deleted file mode 100755 index c7d2a4f..0000000 --- a/html_orig/sass/form/_fancy_button_mixins.scss +++ /dev/null @@ -1,58 +0,0 @@ - -// Button styling -@mixin fancy-btn-base() { - text-align: center; - cursor: pointer; - display: inline-block; - border-radius: 2px; - padding: 0 0.6em; - border: 0 none; - //outline: 0 none !important; - line-height: 1.8em; - font-size: 1.1em; - margin-bottom: 3px; - min-width: 5em; - - @include noselect(); - - //&[class^="icon-"]::before, &[class*=" icon-"]::before { - // margin-left:0; - //} - - &:active { - position: relative; - top: 2px; - } - - //&, &:active, &:hover, &:visited { - // text-decoration: none; - //} -} - -@mixin fancy-btn-colors-full($text_p, $back_p, $side_p, $text_a, $back_a, $side_a) { - background-color: $back_p; - box-shadow: 0 3px 0 $side_p; - text-decoration: none !important; - - &, &:link, &:visited { - color: $text_p; - } - - &:hover, &:active, &.active, &.selected { - background-color: $back_a; - color: $text_a; - } - - &:hover, &.selected, &.active { - box-shadow: 0 3px 0 $side_a; - } - - // thinner shadow - &:active { - box-shadow: 0 1px 0 $side_a; - } -} - -@mixin fancy-btn-colors($text_p, $back_p, $text_a, $back_a) { - @include fancy-btn-colors-full($text_p, $back_p, darken($back_p, 14), $text_a, $back_a, darken($back_a, 16)); -} diff --git a/html_orig/sass/form/_form_elements.scss b/html_orig/sass/form/_form_elements.scss deleted file mode 100755 index d66e94c..0000000 --- a/html_orig/sass/form/_form_elements.scss +++ /dev/null @@ -1,82 +0,0 @@ -@import "buttons"; - -#{$all-text-inputs}, select, label.select-wrap { - width: $form-field-w; -} - -input[type="number"], input.short, select.short { - width: $form-field-w/2; -} - -#{$all-text-inputs}, select { - border: 0 none; - border-bottom: 2px solid $c-form-highlight; - background-color: $c-form-field-bg; - color: $c-form-field-fg; - padding: 6px; - line-height: 1em; - //outline: 0 none !important; - //-moz-outline: 0 none !important; - font-weight: normal; - - &:focus, &:hover { - border-bottom-color: $c-form-highlight-a; - } -} - -.Row.checkbox { - $h: 27px; - line-height: $h; - - .box { - overflow: hidden; - width: $h; - height: $h; - border: 1px solid #808080; - border-radius: 3px; - background: $c-form-field-bg; - display: inline-block; - position: relative; - cursor: pointer; - color: $c-form-highlight-a; - - &::before { - font-family: "fontello"; - position: absolute; - //content: '×'; - //content: '✓'; - left: 0; top: 0; right: 0; bottom: 0; - line-height: 25px; - text-align: center; - font-size: 20px; - vertical-align: middle; - display: none; - } - - @include icon-content('ok'); - - &.checked::before { - display: block; - } - } -} - -.Row.range { - .display { - margin-left: 1ex; - } - - label .display { font-weight: normal; } -} - -//#{$all-text-inputs} { -// @include can-select(); -//} - -//textarea { -// font-family: monospace; -// line-height: 1.2em; -// display: block; // fixes weird bottom margin -//} - -//@import "select"; diff --git a/html_orig/sass/form/_form_layout.scss b/html_orig/sass/form/_form_layout.scss deleted file mode 100755 index 9afe4d7..0000000 --- a/html_orig/sass/form/_form_layout.scss +++ /dev/null @@ -1,204 +0,0 @@ -// Unified Form wrapper -form { @include naked(); } - -.Box.errors { - .list { - color: crimson; - font-weight: bold; - } - - .lead { - color: white; - } -} - -.Row { - vertical-align: middle; - margin: 12px auto; - text-align: left; - line-height: 1.35em; - - display: flex; - flex-direction: row; - align-items: center; - - &:first-child { - margin-top: 0; - } - - &:last-child { - margin-bottom: 0; - } - - &.v { - display: block; - } - - .aside { - float: right; - margin-left: 5px; - margin-bottom: 5px; - - @include media($phone) { - margin: 0; float: none; - } - } - - .spacer { - width: $form-label-w; - - @include media($phone) { - display: none; - } - } - - // buttons2 is the same style, but different selector for use in the admin page - &.buttons, &.buttons2 { - margin: 16px auto; - input, .button { - margin-right: dist(-1); - } - } - - &.centered { - justify-content: center; - } - - &.message { - font-size: 1em; - //margin-left: $label-gap + $w-labels; - text-shadow: 1px 1px 3px black; - text-align: center; - - &.error { - color: crimson; - } - - &.ok { - color: #0fe851; - } - } - - &.separator { - padding-top: 14px; - border-top: 2px solid rgba(255, 255, 255, 0.1); - } - - textarea { - display: inline-block; - vertical-align: top; - min-height: 10rem; - flex-grow: 1; - - resize: vertical; - } - - label { - font-weight: bold; - color: $c-form-label-fg; - display: inline-block; - width: $form-label-w; - text-align: right; - text-shadow: 1px 1px 3px black; - - padding: $form-label-gap; - align-self: flex-start; - - @include noselect; - @include nowrap; - } - - label.error { - color: crimson; - } - - //.checkbox-wrap { - // display: inline-block; - // width: $form-label-w; - // padding: $form-label-gap; - // text-align: right; - // align-self: flex-start; - // - // input[type=checkbox] { - // margin: auto; - // width: auto; - // height: auto; - // } - // - // & + label { - // width: $form-field-w; - // padding-left: 0; - // text-align: left; - // cursor: pointer; - // } - //} - - input[type="range"] { - width: 200px; - } - - // special phone style - @include media($phone) { - flex-direction: column; - margin: 6px auto; - - &.buttons, &.centered, &.checkbox { - flex-direction: row; - } - - &.buttons { - justify-content: center; - - // remove margin on lats button - :last-child { - margin-right:0; - } - } - - label { - padding-left: 0; - text-align: left; - width: auto; - } - - .checkbox-wrap { - order: 1; - text-align: left; - padding-bottom: 0; - - border-radius: .4px; - width: auto; - - & + label { - width: auto; - } - } - - #{$all-text-inputs}, input[type="range"], textarea, select { - width: 100%; - } - } -} - -// red asterisk -form span.required { - color: red; -} - -.RadioGroup { - display: inline-block; - line-height: 1.5em; - vertical-align: middle; - - label { - width: auto; - text-align: left; - cursor: pointer; - font-weight: normal; - } - - input[type="radio"] { - vertical-align: middle; - margin: 0 0 0 5px; - } -} diff --git a/html_orig/sass/form/_index.scss b/html_orig/sass/form/_index.scss deleted file mode 100755 index f2e9a7a..0000000 --- a/html_orig/sass/form/_index.scss +++ /dev/null @@ -1,13 +0,0 @@ -@import 'fancy_button_mixins'; -@import 'buttons'; -@import 'form_elements'; - -%form-row-spacing { - & > * { - margin-right: dist(-2); - &:last-child { margin-right: 0 } - } -} - -@import 'form_layout'; -//@import 'select'; diff --git a/html_orig/sass/form/_select.scss b/html_orig/sass/form/_select.scss deleted file mode 100755 index 52bc498..0000000 --- a/html_orig/sass/form/_select.scss +++ /dev/null @@ -1,52 +0,0 @@ - -// target chrome only -@media screen and (-webkit-min-device-pixel-ratio: 0) { - select { padding-right: 18px } -} - -select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - - cursor: pointer; - line-height: 1.2em; - //padding: 3.5px; - - padding-right: 1em; - - // hack for firefox to disable dotted outline - &:-moz-focusring { - color: transparent; - text-shadow: 0 0 0 $c-form-field-fg; - } - - option { - background: $c-form-field-bg; - } -} - -label.select-wrap { - position: relative; - display: inline !important; - margin: 0 !important; - padding: 0 !important; - width: auto !important; - - &:after { - content: '<>'; /* will be rotated */ - font-family: "Consolas", monospace; - font-weight: bold; - color: $c-form-highlight-a; - - top: 50%; - @include transform(translate(0, -50%) rotate(90deg)); - - right: 2px; - - position:absolute; - z-index: 100; - - pointer-events: none; - } -} diff --git a/html_orig/sass/layout/_base.scss b/html_orig/sass/layout/_base.scss deleted file mode 100755 index bac9829..0000000 --- a/html_orig/sass/layout/_base.scss +++ /dev/null @@ -1,41 +0,0 @@ -html { - font-family: Arial, sans-serif; - color: #D0D0D0; - background: #131315; -} - -html, body { - @include naked(); - width: 100%; - height: 100%; - overflow: hidden; -} - -a, a:visited, a:link { - cursor: pointer; - color: #5abfff; - text-decoration: none; -} - -a:hover { - color: #5abfff; - text-decoration: underline; -} - -.hidden { - display: none !important; -} - -[onclick] { - cursor: pointer; -} - -ul > * { - padding-top: .3em; - padding-bottom: .3em; -} - -ul { - margin-top: 0; - margin-bottom: 0; -} diff --git a/html_orig/sass/layout/_box.scss b/html_orig/sass/layout/_box.scss deleted file mode 100755 index 219757f..0000000 --- a/html_orig/sass/layout/_box.scss +++ /dev/null @@ -1,179 +0,0 @@ -.botpad { - display:block; - height: 5em; -} - -.Box { - display: block; - max-width: 900px; - - margin-top: dist(0); - padding: dist(-1) dist(0); - - // clear floats - &::after { - content: ''; - display: block; - clear: both - } - - @include media($phone) { - margin-top: dist(-1); - } - - h1, h2 { - overflow: hidden; - } - - h1 + & { - margin-top: 0; - } - - h2 { - margin-top: 0; - margin-bottom: 0 !important; - } - - p:last-child { - margin-bottom: 0.5em; - } - - border-radius: 3px; - background-color: rgba(white, .07); - box-shadow: 0 0 4px black; - border: 1px solid #4f4f4f; - - &.wide { - width: initial; - max-width: initial; - } - - &.medium { - max-width: 1200px; - } - - //.Valfield { - // display: inline-block; - // min-width: 10em; - //} - - // Submit Top Right - &.str { - position: relative; - .Row.buttons { - position: absolute; - - @include media($phone) { - right: dist(0); - top: 1.8em; - margin: 1rem auto; - } - - @include media($tablet-min) { - right: 0; - top: 0; - margin-top: dist(-1); - } - } - } - - &.str.mobopen .Row.buttons { - top: 0; - margin-top: dist(-1); - } - - .Row.explain { - display: block; // this stops flex messing up text with inline tags - max-width: 600px; margin-left: 0; - line-height: 1.2; - - @include media($phone) { - margin-top: 60px; - } - - &.nomargintop { - margin-top: 12px !important; - } - - &.padleft { - - } - } - &.mobopen .Row.explain { - margin-top: 12px; // default from .Row - - @include media($phone) { - margin-top: 18px; - } - } -} - -@mixin mobcol-base { - h2 { - position: relative; - cursor: pointer; - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; - - &::after { - position: absolute; - right: 4px; - content: '▸'; - - top:50%; - font-size: 120%; - font-weight: bold; - transform: translate(0,-50%) rotate(90deg); - } - } - - &.expanded h2::after { - transform: translate(-25%,-50%) rotate(-90deg); - margin-bottom: dist(0); - } - - .Row { - display: none; - } - - &.expanded { - .Row { - display: flex; - - &.v { - display: block; - } - } - } -} - -.Box.fold { - @include mobcol-base; -} - -@include media($phone) { - .Box.fold, .Box.mobcol { - h2 { - padding: 2px 1.3rem 2px 5px; - margin: 0 -5px 0 -5px; - } - - &.expanded h2::after { - margin-bottom: dist(0); - } - } - - .Box.mobcol { - @include mobcol-base; - - #ap-box { - display: none; - } - - &.expanded { - #ap-box { - display: block; - } - } - } -} diff --git a/html_orig/sass/layout/_content.scss b/html_orig/sass/layout/_content.scss deleted file mode 100755 index 731c937..0000000 --- a/html_orig/sass/layout/_content.scss +++ /dev/null @@ -1,60 +0,0 @@ -#content { - flex-grow: 1; - position: relative; - - padding: dist(0); - @include media($phone) { - padding: dist(-1); - } - - overflow-y: auto; - - & > * { - margin-left: auto; - margin-right: auto; - } - - h1 { - text-align: center; - font-size: fsize(7); - margin-top: 0; - margin-bottom: dist(0); - } - - h2 { - font-size: fsize(3); - margin-bottom: dist(-1); - } - - @include media($phone) { - h1 { - font-size: fsize(5); - margin-bottom: dist(-1); - } - - h2 { - font-size: fsize(2); - margin-bottom: dist(-1); - } - } - - td, th { - padding: dist(-2); - } - - tbody th { - text-align: right; - width: $form-label-w; - color: $c-form-label-fg; - } -} - -#content { - // fade in effect - opacity: 0; - transition: opacity 0.15s ease-in; -} - -#content.load { - opacity: 1; -} diff --git a/html_orig/sass/layout/_index.scss b/html_orig/sass/layout/_index.scss deleted file mode 100755 index f37ef8d..0000000 --- a/html_orig/sass/layout/_index.scss +++ /dev/null @@ -1,9 +0,0 @@ -@import "base"; - -@import "outer-wrap"; -@import "menu"; -@import "content"; -@import "loader"; - -@import "box"; -@import "modal"; diff --git a/html_orig/sass/layout/_loader.scss b/html_orig/sass/layout/_loader.scss deleted file mode 100644 index 62af4cc..0000000 --- a/html_orig/sass/layout/_loader.scss +++ /dev/null @@ -1,18 +0,0 @@ -// Loader wheel in top right corner -#loader { - position: absolute; - right: dist(1); - top: dist(1); - - transition: opacity .2s; - opacity: 0; - - @include media($phone) { - top: dist(0); - right: dist(0); - } - - &.show { - opacity:1; - } -} diff --git a/html_orig/sass/layout/_menu.scss b/html_orig/sass/layout/_menu.scss deleted file mode 100755 index 4f78728..0000000 --- a/html_orig/sass/layout/_menu.scss +++ /dev/null @@ -1,111 +0,0 @@ -#menu { - $menu-bg: #3983CD; - $menu-hl: #5badff; //#1bd886; - $menu-fg: white; - - flex: 0 0 15rem; - background: $menu-bg; - - & > * { - display: block; - text-decoration: none; - padding: dist(-1) dist(0); - - @include nowrap; - @include noselect; - } - - #brand { - cursor: pointer; - color: $menu-fg; - background: darken($menu-bg, 10%); - font-size: 120%; - text-align: center; - position:relative; - transition: none; - font-weight: bold; - - margin-bottom: dist(0); - - @include media($phone) { - background: $menu-bg; - cursor: pointer; - margin-bottom: dist(-2); - - &::after { - position: absolute; - color: rgba(black, .4); - right: dist(0); - content: '▸'; - - top:50%; - font-size: 120%; - font-weight: bold; - transform: translate(0,-50%) rotate(90deg); - } - } - } - &.expanded #brand { - background: darken($menu-bg, 10%); - - @include media($phone) { - &:after { transform: translate(-25%,-50%) rotate(-90deg) } - } - } - - a { - font-size: 130%; - color: $menu-fg; - - transition: background-color 0.2s; - text-shadow: 0 0 5px rgba(black, .4); - - &:hover, &.selected { - background: $menu-hl; - text-shadow: 0 0 5px rgba(black, .6); - } - - &.selected { - position: relative; - box-shadow: 0 0 5px rgba(black, .5); - } - - &:focus { - outline-color: $c-red-outline; - } - - //&::before { - // content: "▸"; - // padding-right: .5rem; - // position: relative; - // top: -0.1rem; - //} - - // Fontello - &::before { - vertical-align: -2px; - margin-left: 0; - margin-right: 15px; - } - - @include media($phone) { - display: none; - &::before {margin-left: 10px;} - } - } - - &.expanded a { display:block } - - @include media($tablet) { - #brand { - font-size: 95%; - margin-bottom: dist(-1); - } - - a { font-size: 105%; } - - flex-basis: 10rem; - - & > * { padding: dist(-2) dist(-1); } - } -} diff --git a/html_orig/sass/layout/_modal.scss b/html_orig/sass/layout/_modal.scss deleted file mode 100755 index 708379d..0000000 --- a/html_orig/sass/layout/_modal.scss +++ /dev/null @@ -1,95 +0,0 @@ -.Modal { - z-index: 100; - position: fixed; - width: 100%; height: 100%; - left: 0; top: 0; right: 0; bottom: 0; - - display: flex; - justify-content: center; - align-items: center; - - transition: opacity .5s; - background: rgba(black, .65); - opacity: 0; - &.visible { opacity: 1 } - &.hidden { display: none } - - &.light { - background: rgba(black, .25); - } - - @include media($phone) { - flex-direction: column; - justify-content: flex-start; - overflow-y: auto; - .Dialog { - margin-top: dist(-1) !important; - flex-basis: unset; - flex-shrink: 0; - } - } -} - -.Dialog { - margin: dist(-1); - padding: dist(0); - overflow: hidden; - - //max-width: 100%; - //max-height: 100%; - flex-basis: 35rem; - //min-height: 15rem; - - background: $c-modal-bg;//#1c1c1e; - border-left: 6px solid $c-form-highlight; - border-right: 6px solid $c-form-highlight; - //border-top: 1px solid $c-form-highlight; - //border-bottom: 1px solid $c-form-highlight; - box-shadow: 0 0 6px 0 black; - - border-radius: 6px; - - h1,h2 { - margin-top:0; - } - - p:last-child { - margin-bottom: 0; - } -} - -// "toast" -.NotifyMsg { - position: fixed; - top: dist(1); - right: dist(2); - padding: dist(-1) dist(0); - - // center horizontally - //left: 50%; - //@include translate(-50%,0); - // hack to remove blur in chrome - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transform: translateZ(0) scale(1.0, 1.0); - - background: #3887d0; - &.error { - background: #d03e42; - } - - color: white; - text-shadow: 0 0 2px black; - box-shadow: 0 0 6px 0 rgba(black, .6); - border-radius: 5px; - - max-width: 80%; - - @include media($phone) { - width: calc(100% - #{dist(0)}); - } - - transition: opacity .5s; - opacity: 0; - &.visible { opacity: 1 } - &.hidden { display: none } -} diff --git a/html_orig/sass/layout/_outer-wrap.scss b/html_orig/sass/layout/_outer-wrap.scss deleted file mode 100755 index c32d3a8..0000000 --- a/html_orig/sass/layout/_outer-wrap.scss +++ /dev/null @@ -1,22 +0,0 @@ -/* Main outer container */ -#outer { - display: flex; - - position: absolute; - width: 100%; - height: 100%; - left: 0; - right: 0; - top: 0; - bottom: 0; - overflow: hidden; - - flex-direction: row; -} - -@include media($phone) { - #outer { - display: block; - overflow-y: scroll; - } -} diff --git a/html_orig/sass/lib/bourbon/_bourbon-deprecated-upcoming.scss b/html_orig/sass/lib/bourbon/_bourbon-deprecated-upcoming.scss deleted file mode 100755 index e6d1b8c..0000000 --- a/html_orig/sass/lib/bourbon/_bourbon-deprecated-upcoming.scss +++ /dev/null @@ -1,411 +0,0 @@ -// The following features have been deprecated and will be removed in the next MAJOR version release - -@mixin inline-block { - display: inline-block; - - @warn "The inline-block mixin is deprecated and will be removed in the next major version release"; -} - -@mixin button ($style: simple, $base-color: #4294f0, $text-size: inherit, $padding: 7px 18px) { - - @if type-of($style) == string and type-of($base-color) == color { - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == string and type-of($base-color) == number { - $padding: $text-size; - $text-size: $base-color; - $base-color: #4294f0; - - @if $padding == inherit { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == color and type-of($base-color) == color { - $base-color: $style; - $style: simple; - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == color and type-of($base-color) == number { - $padding: $text-size; - $text-size: $base-color; - $base-color: $style; - $style: simple; - - @if $padding == inherit { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - @if type-of($style) == number { - $padding: $base-color; - $text-size: $style; - $base-color: #4294f0; - $style: simple; - - @if $padding == #4294f0 { - $padding: 7px 18px; - } - - @include buttonstyle($style, $base-color, $text-size, $padding); - } - - &:disabled { - cursor: not-allowed; - opacity: 0.5; - } - - @warn "The button mixin is deprecated and will be removed in the next major version release"; -} - -// Selector Style Button -@mixin buttonstyle($type, $b-color, $t-size, $pad) { - // Grayscale button - @if $type == simple and $b-color == grayscale($b-color) { - @include simple($b-color, true, $t-size, $pad); - } - - @if $type == shiny and $b-color == grayscale($b-color) { - @include shiny($b-color, true, $t-size, $pad); - } - - @if $type == pill and $b-color == grayscale($b-color) { - @include pill($b-color, true, $t-size, $pad); - } - - @if $type == flat and $b-color == grayscale($b-color) { - @include flat($b-color, true, $t-size, $pad); - } - - // Colored button - @if $type == simple { - @include simple($b-color, false, $t-size, $pad); - } - - @else if $type == shiny { - @include shiny($b-color, false, $t-size, $pad); - } - - @else if $type == pill { - @include pill($b-color, false, $t-size, $pad); - } - - @else if $type == flat { - @include flat($b-color, false, $t-size, $pad); - } -} - -// Simple Button -@mixin simple($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border: adjust-color($base-color, $saturation: 9%, $lightness: -14%); - $inset-shadow: adjust-color($base-color, $saturation: -8%, $lightness: 15%); - $stop-gradient: adjust-color($base-color, $saturation: 9%, $lightness: -11%); - $text-shadow: adjust-color($base-color, $saturation: 15%, $lightness: -18%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border: grayscale($border); - $inset-shadow: grayscale($inset-shadow); - $stop-gradient: grayscale($stop-gradient); - $text-shadow: grayscale($text-shadow); - } - - border: 1px solid $border; - border-radius: 3px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: bold; - @include linear-gradient ($base-color, $stop-gradient); - padding: $padding; - text-decoration: none; - text-shadow: 0 1px 0 $text-shadow; - background-clip: padding-box; - - &:hover:not(:disabled) { - $base-color-hover: adjust-color($base-color, $saturation: -4%, $lightness: -5%); - $inset-shadow-hover: adjust-color($base-color, $saturation: -7%, $lightness: 5%); - $stop-gradient-hover: adjust-color($base-color, $saturation: 8%, $lightness: -14%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - $inset-shadow-hover: grayscale($inset-shadow-hover); - $stop-gradient-hover: grayscale($stop-gradient-hover); - } - - @include linear-gradient ($base-color-hover, $stop-gradient-hover); - - box-shadow: inset 0 1px 0 0 $inset-shadow-hover; - cursor: pointer; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $border-active: adjust-color($base-color, $saturation: 9%, $lightness: -14%); - $inset-shadow-active: adjust-color($base-color, $saturation: 7%, $lightness: -17%); - - @if $grayscale == true { - $border-active: grayscale($border-active); - $inset-shadow-active: grayscale($inset-shadow-active); - } - - border: 1px solid $border-active; - box-shadow: inset 0 0 8px 4px $inset-shadow-active, inset 0 0 8px 4px $inset-shadow-active; - } -} - -// Shiny Button -@mixin shiny($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border: adjust-color($base-color, $red: -117, $green: -111, $blue: -81); - $border-bottom: adjust-color($base-color, $red: -126, $green: -127, $blue: -122); - $fourth-stop: adjust-color($base-color, $red: -79, $green: -70, $blue: -46); - $inset-shadow: adjust-color($base-color, $red: 37, $green: 29, $blue: 12); - $second-stop: adjust-color($base-color, $red: -56, $green: -50, $blue: -33); - $text-shadow: adjust-color($base-color, $red: -140, $green: -141, $blue: -114); - $third-stop: adjust-color($base-color, $red: -86, $green: -75, $blue: -48); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border: grayscale($border); - $border-bottom: grayscale($border-bottom); - $fourth-stop: grayscale($fourth-stop); - $inset-shadow: grayscale($inset-shadow); - $second-stop: grayscale($second-stop); - $text-shadow: grayscale($text-shadow); - $third-stop: grayscale($third-stop); - } - - @include linear-gradient(top, $base-color 0%, $second-stop 50%, $third-stop 50%, $fourth-stop 100%); - - border: 1px solid $border; - border-bottom: 1px solid $border-bottom; - border-radius: 5px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: bold; - padding: $padding; - text-align: center; - text-decoration: none; - text-shadow: 0 -1px 1px $text-shadow; - - &:hover:not(:disabled) { - $first-stop-hover: adjust-color($base-color, $red: -13, $green: -15, $blue: -18); - $second-stop-hover: adjust-color($base-color, $red: -66, $green: -62, $blue: -51); - $third-stop-hover: adjust-color($base-color, $red: -93, $green: -85, $blue: -66); - $fourth-stop-hover: adjust-color($base-color, $red: -86, $green: -80, $blue: -63); - - @if $grayscale == true { - $first-stop-hover: grayscale($first-stop-hover); - $second-stop-hover: grayscale($second-stop-hover); - $third-stop-hover: grayscale($third-stop-hover); - $fourth-stop-hover: grayscale($fourth-stop-hover); - } - - @include linear-gradient(top, $first-stop-hover 0%, - $second-stop-hover 50%, - $third-stop-hover 50%, - $fourth-stop-hover 100%); - cursor: pointer; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $inset-shadow-active: adjust-color($base-color, $red: -111, $green: -116, $blue: -122); - - @if $grayscale == true { - $inset-shadow-active: grayscale($inset-shadow-active); - } - - box-shadow: inset 0 0 20px 0 $inset-shadow-active; - } -} - -// Pill Button -@mixin pill($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - $border-bottom: adjust-color($base-color, $hue: 8, $saturation: -11%, $lightness: -26%); - $border-sides: adjust-color($base-color, $hue: 4, $saturation: -21%, $lightness: -21%); - $border-top: adjust-color($base-color, $hue: -1, $saturation: -30%, $lightness: -15%); - $inset-shadow: adjust-color($base-color, $hue: -1, $saturation: -1%, $lightness: 7%); - $stop-gradient: adjust-color($base-color, $hue: 8, $saturation: 14%, $lightness: -10%); - $text-shadow: adjust-color($base-color, $hue: 5, $saturation: -19%, $lightness: -15%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - $text-shadow: adjust-color($base-color, $saturation: 10%, $lightness: 4%); - } - - @if $grayscale == true { - $border-bottom: grayscale($border-bottom); - $border-sides: grayscale($border-sides); - $border-top: grayscale($border-top); - $inset-shadow: grayscale($inset-shadow); - $stop-gradient: grayscale($stop-gradient); - $text-shadow: grayscale($text-shadow); - } - - border: 1px solid $border-top; - border-color: $border-top $border-sides $border-bottom; - border-radius: 16px; - box-shadow: inset 0 1px 0 0 $inset-shadow; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: normal; - line-height: 1; - @include linear-gradient ($base-color, $stop-gradient); - padding: $padding; - text-align: center; - text-decoration: none; - text-shadow: 0 -1px 1px $text-shadow; - background-clip: padding-box; - - &:hover:not(:disabled) { - $base-color-hover: adjust-color($base-color, $lightness: -4.5%); - $border-bottom: adjust-color($base-color, $hue: 8, $saturation: 13.5%, $lightness: -32%); - $border-sides: adjust-color($base-color, $hue: 4, $saturation: -2%, $lightness: -27%); - $border-top: adjust-color($base-color, $hue: -1, $saturation: -17%, $lightness: -21%); - $inset-shadow-hover: adjust-color($base-color, $saturation: -1%, $lightness: 3%); - $stop-gradient-hover: adjust-color($base-color, $hue: 8, $saturation: -4%, $lightness: -15.5%); - $text-shadow-hover: adjust-color($base-color, $hue: 5, $saturation: -5%, $lightness: -22%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - $border-bottom: grayscale($border-bottom); - $border-sides: grayscale($border-sides); - $border-top: grayscale($border-top); - $inset-shadow-hover: grayscale($inset-shadow-hover); - $stop-gradient-hover: grayscale($stop-gradient-hover); - $text-shadow-hover: grayscale($text-shadow-hover); - } - - @include linear-gradient ($base-color-hover, $stop-gradient-hover); - - background-clip: padding-box; - border: 1px solid $border-top; - border-color: $border-top $border-sides $border-bottom; - box-shadow: inset 0 1px 0 0 $inset-shadow-hover; - cursor: pointer; - text-shadow: 0 -1px 1px $text-shadow-hover; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $active-color: adjust-color($base-color, $hue: 4, $saturation: -12%, $lightness: -10%); - $border-active: adjust-color($base-color, $hue: 6, $saturation: -2.5%, $lightness: -30%); - $border-bottom-active: adjust-color($base-color, $hue: 11, $saturation: 6%, $lightness: -31%); - $inset-shadow-active: adjust-color($base-color, $hue: 9, $saturation: 2%, $lightness: -21.5%); - $text-shadow-active: adjust-color($base-color, $hue: 5, $saturation: -12%, $lightness: -21.5%); - - @if $grayscale == true { - $active-color: grayscale($active-color); - $border-active: grayscale($border-active); - $border-bottom-active: grayscale($border-bottom-active); - $inset-shadow-active: grayscale($inset-shadow-active); - $text-shadow-active: grayscale($text-shadow-active); - } - - background: $active-color; - border: 1px solid $border-active; - border-bottom: 1px solid $border-bottom-active; - box-shadow: inset 0 0 6px 3px $inset-shadow-active; - text-shadow: 0 -1px 1px $text-shadow-active; - } -} - -// Flat Button -@mixin flat($base-color, $grayscale: false, $textsize: inherit, $padding: 7px 18px) { - $color: hsl(0, 0, 100%); - - @if is-light($base-color) { - $color: hsl(0, 0, 20%); - } - - background-color: $base-color; - border-radius: 3px; - border: 0; - color: $color; - display: inline-block; - font-size: $textsize; - font-weight: bold; - padding: $padding; - text-decoration: none; - background-clip: padding-box; - - &:hover:not(:disabled){ - $base-color-hover: adjust-color($base-color, $saturation: 4%, $lightness: 5%); - - @if $grayscale == true { - $base-color-hover: grayscale($base-color-hover); - } - - background-color: $base-color-hover; - cursor: pointer; - } - - &:active:not(:disabled), - &:focus:not(:disabled) { - $base-color-active: adjust-color($base-color, $saturation: -4%, $lightness: -5%); - - @if $grayscale == true { - $base-color-active: grayscale($base-color-active); - } - - background-color: $base-color-active; - cursor: pointer; - } -} - -// Flexible grid -@function flex-grid($columns, $container-columns: $fg-max-columns) { - $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($width / $container-width); - - @warn "The flex-grid function is deprecated and will be removed in the next major version release"; -} - -// Flexible gutter -@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($gutter / $container-width); - - @warn "The flex-gutter function is deprecated and will be removed in the next major version release"; -} - -@function grid-width($n) { - @return $n * $gw-column + ($n - 1) * $gw-gutter; - - @warn "The grid-width function is deprecated and will be removed in the next major version release"; -} - -@function golden-ratio($value, $increment) { - @return modular-scale($increment, $value, $ratio: $golden); - - @warn "The golden-ratio function is deprecated and will be removed in the next major version release. Please use the modular-scale function, instead."; -} - -@mixin box-sizing($box) { - @include prefixer(box-sizing, $box, webkit moz spec); - - @warn "The box-sizing mixin is deprecated and will be removed in the next major version release. This property can now be used un-prefixed."; -} diff --git a/html_orig/sass/lib/bourbon/_bourbon.scss b/html_orig/sass/lib/bourbon/_bourbon.scss deleted file mode 100755 index 509fcc1..0000000 --- a/html_orig/sass/lib/bourbon/_bourbon.scss +++ /dev/null @@ -1,87 +0,0 @@ -// Bourbon 4.2.6 -// http://bourbon.io -// Copyright 2011-2015 thoughtbot, inc. -// MIT License - -@import "settings/prefixer"; -@import "settings/px-to-em"; -@import "settings/asset-pipeline"; - -@import "functions/assign-inputs"; -@import "functions/contains"; -@import "functions/contains-falsy"; -@import "functions/is-length"; -@import "functions/is-light"; -@import "functions/is-number"; -@import "functions/is-size"; -@import "functions/px-to-em"; -@import "functions/px-to-rem"; -@import "functions/shade"; -@import "functions/strip-units"; -@import "functions/tint"; -@import "functions/transition-property-name"; -@import "functions/unpack"; -@import "functions/modular-scale"; - -@import "helpers/convert-units"; -@import "helpers/directional-values"; -@import "helpers/font-source-declaration"; -@import "helpers/gradient-positions-parser"; -@import "helpers/linear-angle-parser"; -@import "helpers/linear-gradient-parser"; -@import "helpers/linear-positions-parser"; -@import "helpers/linear-side-corner-parser"; -@import "helpers/radial-arg-parser"; -@import "helpers/radial-positions-parser"; -@import "helpers/radial-gradient-parser"; -@import "helpers/render-gradients"; -@import "helpers/shape-size-stripper"; -@import "helpers/str-to-num"; - -@import "css3/animation"; -@import "css3/appearance"; -@import "css3/backface-visibility"; -@import "css3/background"; -@import "css3/background-image"; -@import "css3/border-image"; -@import "css3/calc"; -@import "css3/columns"; -@import "css3/filter"; -@import "css3/flex-box"; -@import "css3/font-face"; -@import "css3/font-feature-settings"; -@import "css3/hidpi-media-query"; -@import "css3/hyphens"; -@import "css3/image-rendering"; -@import "css3/keyframes"; -@import "css3/linear-gradient"; -@import "css3/perspective"; -@import "css3/placeholder"; -@import "css3/radial-gradient"; -@import "css3/selection"; -@import "css3/text-decoration"; -@import "css3/transform"; -@import "css3/transition"; -@import "css3/user-select"; - -@import "addons/border-color"; -@import "addons/border-radius"; -@import "addons/border-style"; -@import "addons/border-width"; -@import "addons/buttons"; -@import "addons/clearfix"; -@import "addons/ellipsis"; -@import "addons/font-stacks"; -@import "addons/hide-text"; -@import "addons/margin"; -@import "addons/padding"; -@import "addons/position"; -@import "addons/prefixer"; -@import "addons/retina-image"; -@import "addons/size"; -@import "addons/text-inputs"; -@import "addons/timing-functions"; -@import "addons/triangle"; -@import "addons/word-wrap"; - -@import "bourbon-deprecated-upcoming"; diff --git a/html_orig/sass/lib/bourbon/addons/_border-color.scss b/html_orig/sass/lib/bourbon/addons/_border-color.scss deleted file mode 100755 index 6f6ab36..0000000 --- a/html_orig/sass/lib/bourbon/addons/_border-color.scss +++ /dev/null @@ -1,26 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `border-color` on specific sides of a box. Use a `null` value to “skip” a side. -/// -/// @param {Arglist} $vals -/// List of arguments -/// -/// @example scss - Usage -/// .element { -/// @include border-color(#a60b55 #76cd9c null #e8ae1a); -/// } -/// -/// @example css - CSS Output -/// .element { -/// border-left-color: #e8ae1a; -/// border-right-color: #76cd9c; -/// border-top-color: #a60b55; -/// } -/// -/// @require {mixin} directional-property -/// -/// @output `border-color` - -@mixin border-color($vals...) { - @include directional-property(border, color, $vals...); -} diff --git a/html_orig/sass/lib/bourbon/addons/_border-radius.scss b/html_orig/sass/lib/bourbon/addons/_border-radius.scss deleted file mode 100755 index 1f65863..0000000 --- a/html_orig/sass/lib/bourbon/addons/_border-radius.scss +++ /dev/null @@ -1,48 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `border-radius` on both corners on the side of a box. -/// -/// @param {Number} $radii -/// List of arguments -/// -/// @example scss - Usage -/// .element-one { -/// @include border-top-radius(5px); -/// } -/// -/// .element-two { -/// @include border-left-radius(3px); -/// } -/// -/// @example css - CSS Output -/// .element-one { -/// border-top-left-radius: 5px; -/// border-top-right-radius: 5px; -/// } -/// -/// .element-two { -/// border-bottom-left-radius: 3px; -/// border-top-left-radius: 3px; -/// } -/// -/// @output `border-radius` - -@mixin border-top-radius($radii) { - border-top-left-radius: $radii; - border-top-right-radius: $radii; -} - -@mixin border-right-radius($radii) { - border-bottom-right-radius: $radii; - border-top-right-radius: $radii; -} - -@mixin border-bottom-radius($radii) { - border-bottom-left-radius: $radii; - border-bottom-right-radius: $radii; -} - -@mixin border-left-radius($radii) { - border-bottom-left-radius: $radii; - border-top-left-radius: $radii; -} diff --git a/html_orig/sass/lib/bourbon/addons/_border-style.scss b/html_orig/sass/lib/bourbon/addons/_border-style.scss deleted file mode 100755 index d86ee79..0000000 --- a/html_orig/sass/lib/bourbon/addons/_border-style.scss +++ /dev/null @@ -1,25 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `border-style` on specific sides of a box. Use a `null` value to “skip” a side. -/// -/// @param {Arglist} $vals -/// List of arguments -/// -/// @example scss - Usage -/// .element { -/// @include border-style(dashed null solid); -/// } -/// -/// @example css - CSS Output -/// .element { -/// border-bottom-style: solid; -/// border-top-style: dashed; -/// } -/// -/// @require {mixin} directional-property -/// -/// @output `border-style` - -@mixin border-style($vals...) { - @include directional-property(border, style, $vals...); -} diff --git a/html_orig/sass/lib/bourbon/addons/_border-width.scss b/html_orig/sass/lib/bourbon/addons/_border-width.scss deleted file mode 100755 index 0ea2d4b..0000000 --- a/html_orig/sass/lib/bourbon/addons/_border-width.scss +++ /dev/null @@ -1,25 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `border-width` on specific sides of a box. Use a `null` value to “skip” a side. -/// -/// @param {Arglist} $vals -/// List of arguments -/// -/// @example scss - Usage -/// .element { -/// @include border-width(1em null 20px); -/// } -/// -/// @example css - CSS Output -/// .element { -/// border-bottom-width: 20px; -/// border-top-width: 1em; -/// } -/// -/// @require {mixin} directional-property -/// -/// @output `border-width` - -@mixin border-width($vals...) { - @include directional-property(border, width, $vals...); -} diff --git a/html_orig/sass/lib/bourbon/addons/_buttons.scss b/html_orig/sass/lib/bourbon/addons/_buttons.scss deleted file mode 100755 index debeabc..0000000 --- a/html_orig/sass/lib/bourbon/addons/_buttons.scss +++ /dev/null @@ -1,64 +0,0 @@ -@charset "UTF-8"; - -/// Generates variables for all buttons. Please note that you must use interpolation on the variable: `#{$all-buttons}`. -/// -/// @example scss - Usage -/// #{$all-buttons} { -/// background-color: #f00; -/// } -/// -/// #{$all-buttons-focus}, -/// #{$all-buttons-hover} { -/// background-color: #0f0; -/// } -/// -/// #{$all-buttons-active} { -/// background-color: #00f; -/// } -/// -/// @example css - CSS Output -/// button, -/// input[type="button"], -/// input[type="reset"], -/// input[type="submit"] { -/// background-color: #f00; -/// } -/// -/// button:focus, -/// input[type="button"]:focus, -/// input[type="reset"]:focus, -/// input[type="submit"]:focus, -/// button:hover, -/// input[type="button"]:hover, -/// input[type="reset"]:hover, -/// input[type="submit"]:hover { -/// background-color: #0f0; -/// } -/// -/// button:active, -/// input[type="button"]:active, -/// input[type="reset"]:active, -/// input[type="submit"]:active { -/// background-color: #00f; -/// } -/// -/// @require assign-inputs -/// -/// @type List -/// -/// @todo Remove double assigned variables (Lines 59–62) in v5.0.0 - -$buttons-list: 'button', - 'input[type="button"]', - 'input[type="reset"]', - 'input[type="submit"]'; - -$all-buttons: assign-inputs($buttons-list); -$all-buttons-active: assign-inputs($buttons-list, active); -$all-buttons-focus: assign-inputs($buttons-list, focus); -$all-buttons-hover: assign-inputs($buttons-list, hover); - -$all-button-inputs: $all-buttons; -$all-button-inputs-active: $all-buttons-active; -$all-button-inputs-focus: $all-buttons-focus; -$all-button-inputs-hover: $all-buttons-hover; diff --git a/html_orig/sass/lib/bourbon/addons/_clearfix.scss b/html_orig/sass/lib/bourbon/addons/_clearfix.scss deleted file mode 100755 index 11313d6..0000000 --- a/html_orig/sass/lib/bourbon/addons/_clearfix.scss +++ /dev/null @@ -1,25 +0,0 @@ -@charset "UTF-8"; - -/// Provides an easy way to include a clearfix for containing floats. -/// -/// @link http://cssmojo.com/latest_new_clearfix_so_far/ -/// -/// @example scss - Usage -/// .element { -/// @include clearfix; -/// } -/// -/// @example css - CSS Output -/// .element::after { -/// clear: both; -/// content: ""; -/// display: table; -/// } - -@mixin clearfix { - &::after { - clear: both; - content: ""; - display: table; - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_ellipsis.scss b/html_orig/sass/lib/bourbon/addons/_ellipsis.scss deleted file mode 100755 index a367f65..0000000 --- a/html_orig/sass/lib/bourbon/addons/_ellipsis.scss +++ /dev/null @@ -1,30 +0,0 @@ -@charset "UTF-8"; - -/// Truncates text and adds an ellipsis to represent overflow. -/// -/// @param {Number} $width [100%] -/// Max-width for the string to respect before being truncated -/// -/// @example scss - Usage -/// .element { -/// @include ellipsis; -/// } -/// -/// @example css - CSS Output -/// .element { -/// display: inline-block; -/// max-width: 100%; -/// overflow: hidden; -/// text-overflow: ellipsis; -/// white-space: nowrap; -/// word-wrap: normal; -/// } - -@mixin ellipsis($width: 100%) { - display: inline-block; - max-width: $width; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - word-wrap: normal; -} diff --git a/html_orig/sass/lib/bourbon/addons/_font-stacks.scss b/html_orig/sass/lib/bourbon/addons/_font-stacks.scss deleted file mode 100755 index 57128f4..0000000 --- a/html_orig/sass/lib/bourbon/addons/_font-stacks.scss +++ /dev/null @@ -1,31 +0,0 @@ -@charset "UTF-8"; - -/// Georgia font stack. -/// -/// @type List - -$georgia: "Georgia", "Cambria", "Times New Roman", "Times", serif; - -/// Helvetica font stack. -/// -/// @type List - -$helvetica: "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; - -/// Lucida Grande font stack. -/// -/// @type List - -$lucida-grande: "Lucida Grande", "Tahoma", "Verdana", "Arial", sans-serif; - -/// Monospace font stack. -/// -/// @type List - -$monospace: "Bitstream Vera Sans Mono", "Consolas", "Courier", monospace; - -/// Verdana font stack. -/// -/// @type List - -$verdana: "Verdana", "Geneva", sans-serif; diff --git a/html_orig/sass/lib/bourbon/addons/_hide-text.scss b/html_orig/sass/lib/bourbon/addons/_hide-text.scss deleted file mode 100755 index 4caf20e..0000000 --- a/html_orig/sass/lib/bourbon/addons/_hide-text.scss +++ /dev/null @@ -1,27 +0,0 @@ -/// Hides the text in an element, commonly used to show an image. Some elements will need block-level styles applied. -/// -/// @link http://zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement -/// -/// @example scss - Usage -/// .element { -/// @include hide-text; -/// } -/// -/// @example css - CSS Output -/// .element { -/// overflow: hidden; -/// text-indent: 101%; -/// white-space: nowrap; -/// } -/// -/// @todo Remove height argument in v5.0.0 - -@mixin hide-text($height: null) { - overflow: hidden; - text-indent: 101%; - white-space: nowrap; - - @if $height { - @warn "The `hide-text` mixin has changed and no longer requires a height. The height argument will no longer be accepted in v5.0.0"; - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_margin.scss b/html_orig/sass/lib/bourbon/addons/_margin.scss deleted file mode 100755 index 674f4e5..0000000 --- a/html_orig/sass/lib/bourbon/addons/_margin.scss +++ /dev/null @@ -1,26 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `margin` on specific sides of a box. Use a `null` value to “skip” a side. -/// -/// @param {Arglist} $vals -/// List of arguments -/// -/// @example scss - Usage -/// .element { -/// @include margin(null 10px 3em 20vh); -/// } -/// -/// @example css - CSS Output -/// .element { -/// margin-bottom: 3em; -/// margin-left: 20vh; -/// margin-right: 10px; -/// } -/// -/// @require {mixin} directional-property -/// -/// @output `margin` - -@mixin margin($vals...) { - @include directional-property(margin, false, $vals...); -} diff --git a/html_orig/sass/lib/bourbon/addons/_padding.scss b/html_orig/sass/lib/bourbon/addons/_padding.scss deleted file mode 100755 index 40a5f00..0000000 --- a/html_orig/sass/lib/bourbon/addons/_padding.scss +++ /dev/null @@ -1,26 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for targeting `padding` on specific sides of a box. Use a `null` value to “skip” a side. -/// -/// @param {Arglist} $vals -/// List of arguments -/// -/// @example scss - Usage -/// .element { -/// @include padding(12vh null 10px 5%); -/// } -/// -/// @example css - CSS Output -/// .element { -/// padding-bottom: 10px; -/// padding-left: 5%; -/// padding-top: 12vh; -/// } -/// -/// @require {mixin} directional-property -/// -/// @output `padding` - -@mixin padding($vals...) { - @include directional-property(padding, false, $vals...); -} diff --git a/html_orig/sass/lib/bourbon/addons/_position.scss b/html_orig/sass/lib/bourbon/addons/_position.scss deleted file mode 100755 index e460f3f..0000000 --- a/html_orig/sass/lib/bourbon/addons/_position.scss +++ /dev/null @@ -1,48 +0,0 @@ -@charset "UTF-8"; - -/// Provides a quick method for setting an element’s position. Use a `null` value to “skip” a side. -/// -/// @param {Position} $position [relative] -/// A CSS position value -/// -/// @param {Arglist} $coordinates [null null null null] -/// List of values that correspond to the 4-value syntax for the edges of a box -/// -/// @example scss - Usage -/// .element { -/// @include position(absolute, 0 null null 10em); -/// } -/// -/// @example css - CSS Output -/// .element { -/// left: 10em; -/// position: absolute; -/// top: 0; -/// } -/// -/// @require {function} is-length -/// @require {function} unpack - -@mixin position($position: relative, $coordinates: null null null null) { - @if type-of($position) == list { - $coordinates: $position; - $position: relative; - } - - $coordinates: unpack($coordinates); - - $offsets: ( - top: nth($coordinates, 1), - right: nth($coordinates, 2), - bottom: nth($coordinates, 3), - left: nth($coordinates, 4) - ); - - position: $position; - - @each $offset, $value in $offsets { - @if is-length($value) { - #{$offset}: $value; - } - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_prefixer.scss b/html_orig/sass/lib/bourbon/addons/_prefixer.scss deleted file mode 100755 index 2b6f731..0000000 --- a/html_orig/sass/lib/bourbon/addons/_prefixer.scss +++ /dev/null @@ -1,66 +0,0 @@ -@charset "UTF-8"; - -/// A mixin for generating vendor prefixes on non-standardized properties. -/// -/// @param {String} $property -/// Property to prefix -/// -/// @param {*} $value -/// Value to use -/// -/// @param {List} $prefixes -/// Prefixes to define -/// -/// @example scss - Usage -/// .element { -/// @include prefixer(border-radius, 10px, webkit ms spec); -/// } -/// -/// @example css - CSS Output -/// .element { -/// -webkit-border-radius: 10px; -/// -moz-border-radius: 10px; -/// border-radius: 10px; -/// } -/// -/// @require {variable} $prefix-for-webkit -/// @require {variable} $prefix-for-mozilla -/// @require {variable} $prefix-for-microsoft -/// @require {variable} $prefix-for-opera -/// @require {variable} $prefix-for-spec - -@mixin prefixer($property, $value, $prefixes) { - @each $prefix in $prefixes { - @if $prefix == webkit { - @if $prefix-for-webkit { - -webkit-#{$property}: $value; - } - } @else if $prefix == moz { - @if $prefix-for-mozilla { - -moz-#{$property}: $value; - } - } @else if $prefix == ms { - @if $prefix-for-microsoft { - -ms-#{$property}: $value; - } - } @else if $prefix == o { - @if $prefix-for-opera { - -o-#{$property}: $value; - } - } @else if $prefix == spec { - @if $prefix-for-spec { - #{$property}: $value; - } - } @else { - @warn "Unrecognized prefix: #{$prefix}"; - } - } -} - -@mixin disable-prefix-for-all() { - $prefix-for-webkit: false !global; - $prefix-for-mozilla: false !global; - $prefix-for-microsoft: false !global; - $prefix-for-opera: false !global; - $prefix-for-spec: false !global; -} diff --git a/html_orig/sass/lib/bourbon/addons/_retina-image.scss b/html_orig/sass/lib/bourbon/addons/_retina-image.scss deleted file mode 100755 index 7febbd7..0000000 --- a/html_orig/sass/lib/bourbon/addons/_retina-image.scss +++ /dev/null @@ -1,25 +0,0 @@ -@mixin retina-image($filename, $background-size, $extension: png, $retina-filename: null, $retina-suffix: _2x, $asset-pipeline: $asset-pipeline) { - @if $asset-pipeline { - background-image: image-url("#{$filename}.#{$extension}"); - } @else { - background-image: url("#{$filename}.#{$extension}"); - } - - @include hidpi { - @if $asset-pipeline { - @if $retina-filename { - background-image: image-url("#{$retina-filename}.#{$extension}"); - } @else { - background-image: image-url("#{$filename}#{$retina-suffix}.#{$extension}"); - } - } @else { - @if $retina-filename { - background-image: url("#{$retina-filename}.#{$extension}"); - } @else { - background-image: url("#{$filename}#{$retina-suffix}.#{$extension}"); - } - } - - background-size: $background-size; - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_size.scss b/html_orig/sass/lib/bourbon/addons/_size.scss deleted file mode 100755 index a2992a3..0000000 --- a/html_orig/sass/lib/bourbon/addons/_size.scss +++ /dev/null @@ -1,51 +0,0 @@ -@charset "UTF-8"; - -/// Sets the `width` and `height` of the element. -/// -/// @param {List} $size -/// A list of at most 2 size values. -/// -/// If there is only a single value in `$size` it is used for both width and height. All units are supported. -/// -/// @example scss - Usage -/// .first-element { -/// @include size(2em); -/// } -/// -/// .second-element { -/// @include size(auto 10em); -/// } -/// -/// @example css - CSS Output -/// .first-element { -/// width: 2em; -/// height: 2em; -/// } -/// -/// .second-element { -/// width: auto; -/// height: 10em; -/// } -/// -/// @todo Refactor in 5.0.0 to use a comma-separated argument - -@mixin size($value) { - $width: nth($value, 1); - $height: $width; - - @if length($value) > 1 { - $height: nth($value, 2); - } - - @if is-size($height) { - height: $height; - } @else { - @warn "`#{$height}` is not a valid length for the `$height` parameter in the `size` mixin."; - } - - @if is-size($width) { - width: $width; - } @else { - @warn "`#{$width}` is not a valid length for the `$width` parameter in the `size` mixin."; - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_text-inputs.scss b/html_orig/sass/lib/bourbon/addons/_text-inputs.scss deleted file mode 100755 index df0967f..0000000 --- a/html_orig/sass/lib/bourbon/addons/_text-inputs.scss +++ /dev/null @@ -1,113 +0,0 @@ -@charset "UTF-8"; - -/// Generates variables for all text-based inputs. Please note that you must use interpolation on the variable: `#{$all-text-inputs}`. -/// -/// @example scss - Usage -/// #{$all-text-inputs} { -/// border: 1px solid #f00; -/// } -/// -/// #{$all-text-inputs-focus}, -/// #{$all-text-inputs-hover} { -/// border: 1px solid #0f0; -/// } -/// -/// #{$all-text-inputs-active} { -/// border: 1px solid #00f; -/// } -/// -/// @example css - CSS Output -/// input[type="color"], -/// input[type="date"], -/// input[type="datetime"], -/// input[type="datetime-local"], -/// input[type="email"], -/// input[type="month"], -/// input[type="number"], -/// input[type="password"], -/// input[type="search"], -/// input[type="tel"], -/// input[type="text"], -/// input[type="time"], -/// input[type="url"], -/// input[type="week"], -/// textarea { -/// border: 1px solid #f00; -/// } -/// -/// input[type="color"]:focus, -/// input[type="date"]:focus, -/// input[type="datetime"]:focus, -/// input[type="datetime-local"]:focus, -/// input[type="email"]:focus, -/// input[type="month"]:focus, -/// input[type="number"]:focus, -/// input[type="password"]:focus, -/// input[type="search"]:focus, -/// input[type="tel"]:focus, -/// input[type="text"]:focus, -/// input[type="time"]:focus, -/// input[type="url"]:focus, -/// input[type="week"]:focus, -/// textarea:focus, -/// input[type="color"]:hover, -/// input[type="date"]:hover, -/// input[type="datetime"]:hover, -/// input[type="datetime-local"]:hover, -/// input[type="email"]:hover, -/// input[type="month"]:hover, -/// input[type="number"]:hover, -/// input[type="password"]:hover, -/// input[type="search"]:hover, -/// input[type="tel"]:hover, -/// input[type="text"]:hover, -/// input[type="time"]:hover, -/// input[type="url"]:hover, -/// input[type="week"]:hover, -/// textarea:hover { -/// border: 1px solid #0f0; -/// } -/// -/// input[type="color"]:active, -/// input[type="date"]:active, -/// input[type="datetime"]:active, -/// input[type="datetime-local"]:active, -/// input[type="email"]:active, -/// input[type="month"]:active, -/// input[type="number"]:active, -/// input[type="password"]:active, -/// input[type="search"]:active, -/// input[type="tel"]:active, -/// input[type="text"]:active, -/// input[type="time"]:active, -/// input[type="url"]:active, -/// input[type="week"]:active, -/// textarea:active { -/// border: 1px solid #00f; -/// } -/// -/// @require assign-inputs -/// -/// @type List - -$text-inputs-list: //'input[type="color"]', - //'input[type="date"]', - //'input[type="datetime"]', - //'input[type="datetime-local"]', - //'input[type="email"]', - //'input[type="month"]', - 'input[type="number"]', - 'input[type="password"]', - //'input[type="search"]', - //'input[type="tel"]', - 'input[type="text"]', - //'input[type="time"]', - //'input[type="url"]', - //'input[type="week"]', - //'input:not([type])', - 'textarea'; - -$all-text-inputs: assign-inputs($text-inputs-list); -$all-text-inputs-active: assign-inputs($text-inputs-list, active); -$all-text-inputs-focus: assign-inputs($text-inputs-list, focus); -$all-text-inputs-hover: assign-inputs($text-inputs-list, hover); diff --git a/html_orig/sass/lib/bourbon/addons/_timing-functions.scss b/html_orig/sass/lib/bourbon/addons/_timing-functions.scss deleted file mode 100755 index 20e5f1d..0000000 --- a/html_orig/sass/lib/bourbon/addons/_timing-functions.scss +++ /dev/null @@ -1,34 +0,0 @@ -@charset "UTF-8"; - -/// CSS cubic-bezier timing functions. Timing functions courtesy of jquery.easie (github.com/jaukia/easie) -/// -/// Timing functions are the same as demoed here: http://jqueryui.com/resources/demos/effect/easing.html -/// -/// @type cubic-bezier - -$ease-in-quad: cubic-bezier(0.550, 0.085, 0.680, 0.530); -$ease-in-cubic: cubic-bezier(0.550, 0.055, 0.675, 0.190); -$ease-in-quart: cubic-bezier(0.895, 0.030, 0.685, 0.220); -$ease-in-quint: cubic-bezier(0.755, 0.050, 0.855, 0.060); -$ease-in-sine: cubic-bezier(0.470, 0.000, 0.745, 0.715); -$ease-in-expo: cubic-bezier(0.950, 0.050, 0.795, 0.035); -$ease-in-circ: cubic-bezier(0.600, 0.040, 0.980, 0.335); -$ease-in-back: cubic-bezier(0.600, -0.280, 0.735, 0.045); - -$ease-out-quad: cubic-bezier(0.250, 0.460, 0.450, 0.940); -$ease-out-cubic: cubic-bezier(0.215, 0.610, 0.355, 1.000); -$ease-out-quart: cubic-bezier(0.165, 0.840, 0.440, 1.000); -$ease-out-quint: cubic-bezier(0.230, 1.000, 0.320, 1.000); -$ease-out-sine: cubic-bezier(0.390, 0.575, 0.565, 1.000); -$ease-out-expo: cubic-bezier(0.190, 1.000, 0.220, 1.000); -$ease-out-circ: cubic-bezier(0.075, 0.820, 0.165, 1.000); -$ease-out-back: cubic-bezier(0.175, 0.885, 0.320, 1.275); - -$ease-in-out-quad: cubic-bezier(0.455, 0.030, 0.515, 0.955); -$ease-in-out-cubic: cubic-bezier(0.645, 0.045, 0.355, 1.000); -$ease-in-out-quart: cubic-bezier(0.770, 0.000, 0.175, 1.000); -$ease-in-out-quint: cubic-bezier(0.860, 0.000, 0.070, 1.000); -$ease-in-out-sine: cubic-bezier(0.445, 0.050, 0.550, 0.950); -$ease-in-out-expo: cubic-bezier(1.000, 0.000, 0.000, 1.000); -$ease-in-out-circ: cubic-bezier(0.785, 0.135, 0.150, 0.860); -$ease-in-out-back: cubic-bezier(0.680, -0.550, 0.265, 1.550); diff --git a/html_orig/sass/lib/bourbon/addons/_triangle.scss b/html_orig/sass/lib/bourbon/addons/_triangle.scss deleted file mode 100755 index 8a1ed9c..0000000 --- a/html_orig/sass/lib/bourbon/addons/_triangle.scss +++ /dev/null @@ -1,63 +0,0 @@ -@mixin triangle($size, $color, $direction) { - $width: nth($size, 1); - $height: nth($size, length($size)); - $foreground-color: nth($color, 1); - $background-color: if(length($color) == 2, nth($color, 2), transparent); - height: 0; - width: 0; - - @if ($direction == up) or ($direction == down) or ($direction == right) or ($direction == left) { - $width: $width / 2; - $height: if(length($size) > 1, $height, $height/2); - - @if $direction == up { - border-bottom: $height solid $foreground-color; - border-left: $width solid $background-color; - border-right: $width solid $background-color; - } @else if $direction == right { - border-bottom: $width solid $background-color; - border-left: $height solid $foreground-color; - border-top: $width solid $background-color; - } @else if $direction == down { - border-left: $width solid $background-color; - border-right: $width solid $background-color; - border-top: $height solid $foreground-color; - } @else if $direction == left { - border-bottom: $width solid $background-color; - border-right: $height solid $foreground-color; - border-top: $width solid $background-color; - } - } @else if ($direction == up-right) or ($direction == up-left) { - border-top: $height solid $foreground-color; - - @if $direction == up-right { - border-left: $width solid $background-color; - } @else if $direction == up-left { - border-right: $width solid $background-color; - } - } @else if ($direction == down-right) or ($direction == down-left) { - border-bottom: $height solid $foreground-color; - - @if $direction == down-right { - border-left: $width solid $background-color; - } @else if $direction == down-left { - border-right: $width solid $background-color; - } - } @else if ($direction == inset-up) { - border-color: $background-color $background-color $foreground-color; - border-style: solid; - border-width: $height $width; - } @else if ($direction == inset-down) { - border-color: $foreground-color $background-color $background-color; - border-style: solid; - border-width: $height $width; - } @else if ($direction == inset-right) { - border-color: $background-color $background-color $background-color $foreground-color; - border-style: solid; - border-width: $width $height; - } @else if ($direction == inset-left) { - border-color: $background-color $foreground-color $background-color $background-color; - border-style: solid; - border-width: $width $height; - } -} diff --git a/html_orig/sass/lib/bourbon/addons/_word-wrap.scss b/html_orig/sass/lib/bourbon/addons/_word-wrap.scss deleted file mode 100755 index 64856a9..0000000 --- a/html_orig/sass/lib/bourbon/addons/_word-wrap.scss +++ /dev/null @@ -1,29 +0,0 @@ -@charset "UTF-8"; - -/// Provides an easy way to change the `word-wrap` property. -/// -/// @param {String} $wrap [break-word] -/// Value for the `word-break` property. -/// -/// @example scss - Usage -/// .wrapper { -/// @include word-wrap(break-word); -/// } -/// -/// @example css - CSS Output -/// .wrapper { -/// overflow-wrap: break-word; -/// word-break: break-all; -/// word-wrap: break-word; -/// } - -@mixin word-wrap($wrap: break-word) { - overflow-wrap: $wrap; - word-wrap: $wrap; - - @if $wrap == break-word { - word-break: break-all; - } @else { - word-break: $wrap; - } -} diff --git a/html_orig/sass/lib/bourbon/css3/_animation.scss b/html_orig/sass/lib/bourbon/css3/_animation.scss deleted file mode 100755 index aac675f..0000000 --- a/html_orig/sass/lib/bourbon/css3/_animation.scss +++ /dev/null @@ -1,43 +0,0 @@ -// http://www.w3.org/TR/css3-animations/#the-animation-name-property- -// Each of these mixins support comma separated lists of values, which allows different transitions for individual properties to be described in a single style rule. Each value in the list corresponds to the value at that same position in the other properties. - -@mixin animation($animations...) { - @include prefixer(animation, $animations, webkit moz spec); -} - -@mixin animation-name($names...) { - @include prefixer(animation-name, $names, webkit moz spec); -} - -@mixin animation-duration($times...) { - @include prefixer(animation-duration, $times, webkit moz spec); -} - -@mixin animation-timing-function($motions...) { - // ease | linear | ease-in | ease-out | ease-in-out - @include prefixer(animation-timing-function, $motions, webkit moz spec); -} - -@mixin animation-iteration-count($values...) { - // infinite | - @include prefixer(animation-iteration-count, $values, webkit moz spec); -} - -@mixin animation-direction($directions...) { - // normal | alternate - @include prefixer(animation-direction, $directions, webkit moz spec); -} - -@mixin animation-play-state($states...) { - // running | paused - @include prefixer(animation-play-state, $states, webkit moz spec); -} - -@mixin animation-delay($times...) { - @include prefixer(animation-delay, $times, webkit moz spec); -} - -@mixin animation-fill-mode($modes...) { - // none | forwards | backwards | both - @include prefixer(animation-fill-mode, $modes, webkit moz spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_appearance.scss b/html_orig/sass/lib/bourbon/css3/_appearance.scss deleted file mode 100755 index abddc02..0000000 --- a/html_orig/sass/lib/bourbon/css3/_appearance.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin appearance($value) { - @include prefixer(appearance, $value, webkit moz ms o spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_backface-visibility.scss b/html_orig/sass/lib/bourbon/css3/_backface-visibility.scss deleted file mode 100755 index fc68e2d..0000000 --- a/html_orig/sass/lib/bourbon/css3/_backface-visibility.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin backface-visibility($visibility) { - @include prefixer(backface-visibility, $visibility, webkit spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_background-image.scss b/html_orig/sass/lib/bourbon/css3/_background-image.scss deleted file mode 100755 index 6ed19ab..0000000 --- a/html_orig/sass/lib/bourbon/css3/_background-image.scss +++ /dev/null @@ -1,42 +0,0 @@ -//************************************************************************// -// Background-image property for adding multiple background images with -// gradients, or for stringing multiple gradients together. -//************************************************************************// - -@mixin background-image($images...) { - $webkit-images: (); - $spec-images: (); - - @each $image in $images { - $webkit-image: (); - $spec-image: (); - - @if (type-of($image) == string) { - $url-str: str-slice($image, 1, 3); - $gradient-type: str-slice($image, 1, 6); - - @if $url-str == "url" { - $webkit-image: $image; - $spec-image: $image; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser($image); - $webkit-image: map-get($gradients, webkit-image); - $spec-image: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser($image); - $webkit-image: map-get($gradients, webkit-image); - $spec-image: map-get($gradients, spec-image); - } - } - - $webkit-images: append($webkit-images, $webkit-image, comma); - $spec-images: append($spec-images, $spec-image, comma); - } - - background-image: $webkit-images; - background-image: $spec-images; -} diff --git a/html_orig/sass/lib/bourbon/css3/_background.scss b/html_orig/sass/lib/bourbon/css3/_background.scss deleted file mode 100755 index 019db0e..0000000 --- a/html_orig/sass/lib/bourbon/css3/_background.scss +++ /dev/null @@ -1,55 +0,0 @@ -//************************************************************************// -// Background property for adding multiple backgrounds using shorthand -// notation. -//************************************************************************// - -@mixin background($backgrounds...) { - $webkit-backgrounds: (); - $spec-backgrounds: (); - - @each $background in $backgrounds { - $webkit-background: (); - $spec-background: (); - $background-type: type-of($background); - - @if $background-type == string or $background-type == list { - $background-str: if($background-type == list, nth($background, 1), $background); - - $url-str: str-slice($background-str, 1, 3); - $gradient-type: str-slice($background-str, 1, 6); - - @if $url-str == "url" { - $webkit-background: $background; - $spec-background: $background; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser("#{$background}"); - $webkit-background: map-get($gradients, webkit-image); - $spec-background: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser("#{$background}"); - $webkit-background: map-get($gradients, webkit-image); - $spec-background: map-get($gradients, spec-image); - } - - @else { - $webkit-background: $background; - $spec-background: $background; - } - } - - @else { - $webkit-background: $background; - $spec-background: $background; - } - - $webkit-backgrounds: append($webkit-backgrounds, $webkit-background, comma); - $spec-backgrounds: append($spec-backgrounds, $spec-background, comma); - } - - background: $webkit-backgrounds; - background: $spec-backgrounds; -} diff --git a/html_orig/sass/lib/bourbon/css3/_border-image.scss b/html_orig/sass/lib/bourbon/css3/_border-image.scss deleted file mode 100755 index cf568ce..0000000 --- a/html_orig/sass/lib/bourbon/css3/_border-image.scss +++ /dev/null @@ -1,59 +0,0 @@ -@mixin border-image($borders...) { - $webkit-borders: (); - $spec-borders: (); - - @each $border in $borders { - $webkit-border: (); - $spec-border: (); - $border-type: type-of($border); - - @if $border-type == string or list { - $border-str: if($border-type == list, nth($border, 1), $border); - - $url-str: str-slice($border-str, 1, 3); - $gradient-type: str-slice($border-str, 1, 6); - - @if $url-str == "url" { - $webkit-border: $border; - $spec-border: $border; - } - - @else if $gradient-type == "linear" { - $gradients: _linear-gradient-parser("#{$border}"); - $webkit-border: map-get($gradients, webkit-image); - $spec-border: map-get($gradients, spec-image); - } - - @else if $gradient-type == "radial" { - $gradients: _radial-gradient-parser("#{$border}"); - $webkit-border: map-get($gradients, webkit-image); - $spec-border: map-get($gradients, spec-image); - } - - @else { - $webkit-border: $border; - $spec-border: $border; - } - } - - @else { - $webkit-border: $border; - $spec-border: $border; - } - - $webkit-borders: append($webkit-borders, $webkit-border, comma); - $spec-borders: append($spec-borders, $spec-border, comma); - } - - -webkit-border-image: $webkit-borders; - border-image: $spec-borders; - border-style: solid; -} - -//Examples: -// @include border-image(url("image.png")); -// @include border-image(url("image.png") 20 stretch); -// @include border-image(linear-gradient(45deg, orange, yellow)); -// @include border-image(linear-gradient(45deg, orange, yellow) stretch); -// @include border-image(linear-gradient(45deg, orange, yellow) 20 30 40 50 stretch round); -// @include border-image(radial-gradient(top, cover, orange, yellow, orange)); diff --git a/html_orig/sass/lib/bourbon/css3/_calc.scss b/html_orig/sass/lib/bourbon/css3/_calc.scss deleted file mode 100755 index 0bfc738..0000000 --- a/html_orig/sass/lib/bourbon/css3/_calc.scss +++ /dev/null @@ -1,4 +0,0 @@ -@mixin calc($property, $value) { - #{$property}: -webkit-calc(#{$value}); - #{$property}: calc(#{$value}); -} diff --git a/html_orig/sass/lib/bourbon/css3/_columns.scss b/html_orig/sass/lib/bourbon/css3/_columns.scss deleted file mode 100755 index 9611767..0000000 --- a/html_orig/sass/lib/bourbon/css3/_columns.scss +++ /dev/null @@ -1,47 +0,0 @@ -@mixin columns($arg: auto) { - // || - @include prefixer(columns, $arg, webkit moz spec); -} - -@mixin column-count($int: auto) { - // auto || integer - @include prefixer(column-count, $int, webkit moz spec); -} - -@mixin column-gap($length: normal) { - // normal || length - @include prefixer(column-gap, $length, webkit moz spec); -} - -@mixin column-fill($arg: auto) { - // auto || length - @include prefixer(column-fill, $arg, webkit moz spec); -} - -@mixin column-rule($arg) { - // || || - @include prefixer(column-rule, $arg, webkit moz spec); -} - -@mixin column-rule-color($color) { - @include prefixer(column-rule-color, $color, webkit moz spec); -} - -@mixin column-rule-style($style: none) { - // none | hidden | dashed | dotted | double | groove | inset | inset | outset | ridge | solid - @include prefixer(column-rule-style, $style, webkit moz spec); -} - -@mixin column-rule-width ($width: none) { - @include prefixer(column-rule-width, $width, webkit moz spec); -} - -@mixin column-span($arg: none) { - // none || all - @include prefixer(column-span, $arg, webkit moz spec); -} - -@mixin column-width($length: auto) { - // auto || length - @include prefixer(column-width, $length, webkit moz spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_filter.scss b/html_orig/sass/lib/bourbon/css3/_filter.scss deleted file mode 100755 index b8f8ffb..0000000 --- a/html_orig/sass/lib/bourbon/css3/_filter.scss +++ /dev/null @@ -1,4 +0,0 @@ -@mixin filter($function: none) { - // [ - @include prefixer(perspective, $depth, webkit moz spec); -} - -@mixin perspective-origin($value: 50% 50%) { - @include prefixer(perspective-origin, $value, webkit moz spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_placeholder.scss b/html_orig/sass/lib/bourbon/css3/_placeholder.scss deleted file mode 100755 index 5682fd0..0000000 --- a/html_orig/sass/lib/bourbon/css3/_placeholder.scss +++ /dev/null @@ -1,8 +0,0 @@ -@mixin placeholder { - $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input"; - @each $placeholder in $placeholders { - &:#{$placeholder}-placeholder { - @content; - } - } -} diff --git a/html_orig/sass/lib/bourbon/css3/_radial-gradient.scss b/html_orig/sass/lib/bourbon/css3/_radial-gradient.scss deleted file mode 100755 index 8da076e..0000000 --- a/html_orig/sass/lib/bourbon/css3/_radial-gradient.scss +++ /dev/null @@ -1,39 +0,0 @@ -// Requires Sass 3.1+ -@mixin radial-gradient($g1, $g2, - $g3: null, $g4: null, - $g5: null, $g6: null, - $g7: null, $g8: null, - $g9: null, $g10: null, - $pos: null, - $shape-size: null, - $fallback: null) { - - $data: _radial-arg-parser($g1, $g2, $pos, $shape-size); - $g1: nth($data, 1); - $g2: nth($data, 2); - $pos: nth($data, 3); - $shape-size: nth($data, 4); - - $full: $g1, $g2, $g3, $g4, $g5, $g6, $g7, $g8, $g9, $g10; - - // Strip deprecated cover/contain for spec - $shape-size-spec: _shape-size-stripper($shape-size); - - // Set $g1 as the default fallback color - $first-color: nth($full, 1); - $fallback-color: nth($first-color, 1); - - @if (type-of($fallback) == color) or ($fallback == "transparent") { - $fallback-color: $fallback; - } - - // Add Commas and spaces - $shape-size: if($shape-size, "#{$shape-size}, ", null); - $pos: if($pos, "#{$pos}, ", null); - $pos-spec: if($pos, "at #{$pos}", null); - $shape-size-spec: if(($shape-size-spec != " ") and ($pos == null), "#{$shape-size-spec}, ", "#{$shape-size-spec} "); - - background-color: $fallback-color; - background-image: -webkit-radial-gradient(unquote(#{$pos}#{$shape-size}#{$full})); - background-image: unquote("radial-gradient(#{$shape-size-spec}#{$pos-spec}#{$full})"); -} diff --git a/html_orig/sass/lib/bourbon/css3/_selection.scss b/html_orig/sass/lib/bourbon/css3/_selection.scss deleted file mode 100755 index 23303ab..0000000 --- a/html_orig/sass/lib/bourbon/css3/_selection.scss +++ /dev/null @@ -1,42 +0,0 @@ -@charset "UTF-8"; - -/// Outputs the spec and prefixed versions of the `::selection` pseudo-element. -/// -/// @param {Bool} $current-selector [false] -/// If set to `true`, it takes the current element into consideration. -/// -/// @example scss - Usage -/// .element { -/// @include selection(true) { -/// background-color: #ffbb52; -/// } -/// } -/// -/// @example css - CSS Output -/// .element::-moz-selection { -/// background-color: #ffbb52; -/// } -/// -/// .element::selection { -/// background-color: #ffbb52; -/// } - -@mixin selection($current-selector: false) { - @if $current-selector { - &::-moz-selection { - @content; - } - - &::selection { - @content; - } - } @else { - ::-moz-selection { - @content; - } - - ::selection { - @content; - } - } -} diff --git a/html_orig/sass/lib/bourbon/css3/_text-decoration.scss b/html_orig/sass/lib/bourbon/css3/_text-decoration.scss deleted file mode 100755 index 9222746..0000000 --- a/html_orig/sass/lib/bourbon/css3/_text-decoration.scss +++ /dev/null @@ -1,19 +0,0 @@ -@mixin text-decoration($value) { -// || || - @include prefixer(text-decoration, $value, moz); -} - -@mixin text-decoration-line($line: none) { -// none || underline || overline || line-through - @include prefixer(text-decoration-line, $line, moz); -} - -@mixin text-decoration-style($style: solid) { -// solid || double || dotted || dashed || wavy - @include prefixer(text-decoration-style, $style, moz webkit); -} - -@mixin text-decoration-color($color: currentColor) { -// currentColor || - @include prefixer(text-decoration-color, $color, moz); -} diff --git a/html_orig/sass/lib/bourbon/css3/_transform.scss b/html_orig/sass/lib/bourbon/css3/_transform.scss deleted file mode 100755 index 8ee6509..0000000 --- a/html_orig/sass/lib/bourbon/css3/_transform.scss +++ /dev/null @@ -1,15 +0,0 @@ -@mixin transform($property: none) { - // none | - @include prefixer(transform, $property, webkit moz ms o spec); -} - -@mixin transform-origin($axes: 50%) { - // x-axis - left | center | right | length | % - // y-axis - top | center | bottom | length | % - // z-axis - length - @include prefixer(transform-origin, $axes, webkit moz ms o spec); -} - -@mixin transform-style($style: flat) { - @include prefixer(transform-style, $style, webkit moz ms o spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_transition.scss b/html_orig/sass/lib/bourbon/css3/_transition.scss deleted file mode 100755 index 3c785ed..0000000 --- a/html_orig/sass/lib/bourbon/css3/_transition.scss +++ /dev/null @@ -1,71 +0,0 @@ -// Shorthand mixin. Supports multiple parentheses-deliminated values for each variable. -// Example: @include transition (all 2s ease-in-out); -// @include transition (opacity 1s ease-in 2s, width 2s ease-out); -// @include transition-property (transform, opacity); - -@mixin transition($properties...) { - // Fix for vendor-prefix transform property - $needs-prefixes: false; - $webkit: (); - $moz: (); - $spec: (); - - // Create lists for vendor-prefixed transform - @each $list in $properties { - @if nth($list, 1) == "transform" { - $needs-prefixes: true; - $list1: -webkit-transform; - $list2: -moz-transform; - $list3: (); - - @each $var in $list { - $list3: join($list3, $var); - - @if $var != "transform" { - $list1: join($list1, $var); - $list2: join($list2, $var); - } - } - - $webkit: append($webkit, $list1); - $moz: append($moz, $list2); - $spec: append($spec, $list3); - } @else { - $webkit: append($webkit, $list, comma); - $moz: append($moz, $list, comma); - $spec: append($spec, $list, comma); - } - } - - @if $needs-prefixes { - -webkit-transition: $webkit; - -moz-transition: $moz; - transition: $spec; - } @else { - @if length($properties) >= 1 { - @include prefixer(transition, $properties, webkit moz spec); - } @else { - $properties: all 0.15s ease-out 0s; - @include prefixer(transition, $properties, webkit moz spec); - } - } -} - -@mixin transition-property($properties...) { - -webkit-transition-property: transition-property-names($properties, "webkit"); - -moz-transition-property: transition-property-names($properties, "moz"); - transition-property: transition-property-names($properties, false); -} - -@mixin transition-duration($times...) { - @include prefixer(transition-duration, $times, webkit moz spec); -} - -@mixin transition-timing-function($motions...) { - // ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier() - @include prefixer(transition-timing-function, $motions, webkit moz spec); -} - -@mixin transition-delay($times...) { - @include prefixer(transition-delay, $times, webkit moz spec); -} diff --git a/html_orig/sass/lib/bourbon/css3/_user-select.scss b/html_orig/sass/lib/bourbon/css3/_user-select.scss deleted file mode 100755 index d4e5551..0000000 --- a/html_orig/sass/lib/bourbon/css3/_user-select.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin user-select($value: none) { - @include prefixer(user-select, $value, webkit moz ms spec); -} diff --git a/html_orig/sass/lib/bourbon/functions/_assign-inputs.scss b/html_orig/sass/lib/bourbon/functions/_assign-inputs.scss deleted file mode 100755 index f8aba96..0000000 --- a/html_orig/sass/lib/bourbon/functions/_assign-inputs.scss +++ /dev/null @@ -1,11 +0,0 @@ -@function assign-inputs($inputs, $pseudo: null) { - $list: (); - - @each $input in $inputs { - $input: unquote($input); - $input: if($pseudo, $input + ":" + $pseudo, $input); - $list: append($list, $input, comma); - } - - @return $list; -} diff --git a/html_orig/sass/lib/bourbon/functions/_contains-falsy.scss b/html_orig/sass/lib/bourbon/functions/_contains-falsy.scss deleted file mode 100755 index c096fdb..0000000 --- a/html_orig/sass/lib/bourbon/functions/_contains-falsy.scss +++ /dev/null @@ -1,20 +0,0 @@ -@charset "UTF-8"; - -/// Checks if a list does not contains a value. -/// -/// @access private -/// -/// @param {List} $list -/// The list to check against. -/// -/// @return {Bool} - -@function contains-falsy($list) { - @each $item in $list { - @if not $item { - @return true; - } - } - - @return false; -} diff --git a/html_orig/sass/lib/bourbon/functions/_contains.scss b/html_orig/sass/lib/bourbon/functions/_contains.scss deleted file mode 100755 index 3dec27d..0000000 --- a/html_orig/sass/lib/bourbon/functions/_contains.scss +++ /dev/null @@ -1,26 +0,0 @@ -@charset "UTF-8"; - -/// Checks if a list contains a value(s). -/// -/// @access private -/// -/// @param {List} $list -/// The list to check against. -/// -/// @param {List} $values -/// A single value or list of values to check for. -/// -/// @example scss - Usage -/// contains($list, $value) -/// -/// @return {Bool} - -@function contains($list, $values...) { - @each $value in $values { - @if type-of(index($list, $value)) != "number" { - @return false; - } - } - - @return true; -} diff --git a/html_orig/sass/lib/bourbon/functions/_is-length.scss b/html_orig/sass/lib/bourbon/functions/_is-length.scss deleted file mode 100755 index 5826e78..0000000 --- a/html_orig/sass/lib/bourbon/functions/_is-length.scss +++ /dev/null @@ -1,11 +0,0 @@ -@charset "UTF-8"; - -/// Checks for a valid CSS length. -/// -/// @param {String} $value - -@function is-length($value) { - @return type-of($value) != "null" and (str-slice($value + "", 1, 4) == "calc" - or index(auto inherit initial 0, $value) - or (type-of($value) == "number" and not(unitless($value)))); -} diff --git a/html_orig/sass/lib/bourbon/functions/_is-light.scss b/html_orig/sass/lib/bourbon/functions/_is-light.scss deleted file mode 100755 index 92d90ac..0000000 --- a/html_orig/sass/lib/bourbon/functions/_is-light.scss +++ /dev/null @@ -1,21 +0,0 @@ -@charset "UTF-8"; - -/// Programatically determines whether a color is light or dark. -/// -/// @link http://robots.thoughtbot.com/closer-look-color-lightness -/// -/// @param {Color (Hex)} $color -/// -/// @example scss - Usage -/// is-light($color) -/// -/// @return {Bool} - -@function is-light($hex-color) { - $-local-red: red(rgba($hex-color, 1)); - $-local-green: green(rgba($hex-color, 1)); - $-local-blue: blue(rgba($hex-color, 1)); - $-local-lightness: ($-local-red * 0.2126 + $-local-green * 0.7152 + $-local-blue * 0.0722) / 255; - - @return $-local-lightness > 0.6; -} diff --git a/html_orig/sass/lib/bourbon/functions/_is-number.scss b/html_orig/sass/lib/bourbon/functions/_is-number.scss deleted file mode 100755 index a64e0bf..0000000 --- a/html_orig/sass/lib/bourbon/functions/_is-number.scss +++ /dev/null @@ -1,11 +0,0 @@ -@charset "UTF-8"; - -/// Checks for a valid number. -/// -/// @param {Number} $value -/// -/// @require {function} contains - -@function is-number($value) { - @return contains("0" "1" "2" "3" "4" "5" "6" "7" "8" "9" 0 1 2 3 4 5 6 7 8 9, $value); -} diff --git a/html_orig/sass/lib/bourbon/functions/_is-size.scss b/html_orig/sass/lib/bourbon/functions/_is-size.scss deleted file mode 100755 index 661789a..0000000 --- a/html_orig/sass/lib/bourbon/functions/_is-size.scss +++ /dev/null @@ -1,13 +0,0 @@ -@charset "UTF-8"; - -/// Checks for a valid CSS size. -/// -/// @param {String} $value -/// -/// @require {function} contains -/// @require {function} is-length - -@function is-size($value) { - @return is-length($value) - or contains("fill" "fit-content" "min-content" "max-content", $value); -} diff --git a/html_orig/sass/lib/bourbon/functions/_modular-scale.scss b/html_orig/sass/lib/bourbon/functions/_modular-scale.scss deleted file mode 100755 index 20fa388..0000000 --- a/html_orig/sass/lib/bourbon/functions/_modular-scale.scss +++ /dev/null @@ -1,69 +0,0 @@ -// Scaling Variables -$golden: 1.618; -$minor-second: 1.067; -$major-second: 1.125; -$minor-third: 1.2; -$major-third: 1.25; -$perfect-fourth: 1.333; -$augmented-fourth: 1.414; -$perfect-fifth: 1.5; -$minor-sixth: 1.6; -$major-sixth: 1.667; -$minor-seventh: 1.778; -$major-seventh: 1.875; -$octave: 2; -$major-tenth: 2.5; -$major-eleventh: 2.667; -$major-twelfth: 3; -$double-octave: 4; - -$modular-scale-ratio: $perfect-fourth !default; -$modular-scale-base: em($em-base) !default; - -@function modular-scale($increment, $value: $modular-scale-base, $ratio: $modular-scale-ratio) { - $v1: nth($value, 1); - $v2: nth($value, length($value)); - $value: $v1; - - // scale $v2 to just above $v1 - @while $v2 > $v1 { - $v2: ($v2 / $ratio); // will be off-by-1 - } - @while $v2 < $v1 { - $v2: ($v2 * $ratio); // will fix off-by-1 - } - - // check AFTER scaling $v2 to prevent double-counting corner-case - $double-stranded: $v2 > $v1; - - @if $increment > 0 { - @for $i from 1 through $increment { - @if $double-stranded and ($v1 * $ratio) > $v2 { - $value: $v2; - $v2: ($v2 * $ratio); - } @else { - $v1: ($v1 * $ratio); - $value: $v1; - } - } - } - - @if $increment < 0 { - // adjust $v2 to just below $v1 - @if $double-stranded { - $v2: ($v2 / $ratio); - } - - @for $i from $increment through -1 { - @if $double-stranded and ($v1 / $ratio) < $v2 { - $value: $v2; - $v2: ($v2 / $ratio); - } @else { - $v1: ($v1 / $ratio); - $value: $v1; - } - } - } - - @return $value; -} diff --git a/html_orig/sass/lib/bourbon/functions/_px-to-em.scss b/html_orig/sass/lib/bourbon/functions/_px-to-em.scss deleted file mode 100755 index ae81a44..0000000 --- a/html_orig/sass/lib/bourbon/functions/_px-to-em.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Convert pixels to ems -// eg. for a relational value of 12px write em(12) when the parent is 16px -// if the parent is another value say 24px write em(12, 24) - -@function em($pxval, $base: $em-base) { - @if not unitless($pxval) { - $pxval: strip-units($pxval); - } - @if not unitless($base) { - $base: strip-units($base); - } - @return ($pxval / $base) * 1em; -} diff --git a/html_orig/sass/lib/bourbon/functions/_px-to-rem.scss b/html_orig/sass/lib/bourbon/functions/_px-to-rem.scss deleted file mode 100755 index 0ac941e..0000000 --- a/html_orig/sass/lib/bourbon/functions/_px-to-rem.scss +++ /dev/null @@ -1,15 +0,0 @@ -// Convert pixels to rems -// eg. for a relational value of 12px write rem(12) -// Assumes $em-base is the font-size of - -@function rem($pxval) { - @if not unitless($pxval) { - $pxval: strip-units($pxval); - } - - $base: $em-base; - @if not unitless($base) { - $base: strip-units($base); - } - @return ($pxval / $base) * 1rem; -} diff --git a/html_orig/sass/lib/bourbon/functions/_shade.scss b/html_orig/sass/lib/bourbon/functions/_shade.scss deleted file mode 100755 index 8aaf2c6..0000000 --- a/html_orig/sass/lib/bourbon/functions/_shade.scss +++ /dev/null @@ -1,24 +0,0 @@ -@charset "UTF-8"; - -/// Mixes a color with black. -/// -/// @param {Color} $color -/// -/// @param {Number (Percentage)} $percent -/// The amount of black to be mixed in. -/// -/// @example scss - Usage -/// .element { -/// background-color: shade(#ffbb52, 60%); -/// } -/// -/// @example css - CSS Output -/// .element { -/// background-color: #664a20; -/// } -/// -/// @return {Color} - -@function shade($color, $percent) { - @return mix(#000, $color, $percent); -} diff --git a/html_orig/sass/lib/bourbon/functions/_strip-units.scss b/html_orig/sass/lib/bourbon/functions/_strip-units.scss deleted file mode 100755 index 6c5f3e8..0000000 --- a/html_orig/sass/lib/bourbon/functions/_strip-units.scss +++ /dev/null @@ -1,17 +0,0 @@ -@charset "UTF-8"; - -/// Strips the unit from a number. -/// -/// @param {Number (With Unit)} $value -/// -/// @example scss - Usage -/// $dimension: strip-units(10em); -/// -/// @example css - CSS Output -/// $dimension: 10; -/// -/// @return {Number (Unitless)} - -@function strip-units($value) { - @return ($value / ($value * 0 + 1)); -} diff --git a/html_orig/sass/lib/bourbon/functions/_tint.scss b/html_orig/sass/lib/bourbon/functions/_tint.scss deleted file mode 100755 index 2e33814..0000000 --- a/html_orig/sass/lib/bourbon/functions/_tint.scss +++ /dev/null @@ -1,24 +0,0 @@ -@charset "UTF-8"; - -/// Mixes a color with white. -/// -/// @param {Color} $color -/// -/// @param {Number (Percentage)} $percent -/// The amount of white to be mixed in. -/// -/// @example scss - Usage -/// .element { -/// background-color: tint(#6ecaa6, 40%); -/// } -/// -/// @example css - CSS Output -/// .element { -/// background-color: #a8dfc9; -/// } -/// -/// @return {Color} - -@function tint($color, $percent) { - @return mix(#fff, $color, $percent); -} diff --git a/html_orig/sass/lib/bourbon/functions/_transition-property-name.scss b/html_orig/sass/lib/bourbon/functions/_transition-property-name.scss deleted file mode 100755 index 18348b9..0000000 --- a/html_orig/sass/lib/bourbon/functions/_transition-property-name.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Return vendor-prefixed property names if appropriate -// Example: transition-property-names((transform, color, background), moz) -> -moz-transform, color, background -//************************************************************************// -@function transition-property-names($props, $vendor: false) { - $new-props: (); - - @each $prop in $props { - $new-props: append($new-props, transition-property-name($prop, $vendor), comma); - } - - @return $new-props; -} - -@function transition-property-name($prop, $vendor: false) { - // put other properties that need to be prefixed here aswell - @if $vendor and $prop == transform { - @return unquote('-'+$vendor+'-'+$prop); - } - @else { - @return $prop; - } -} diff --git a/html_orig/sass/lib/bourbon/functions/_unpack.scss b/html_orig/sass/lib/bourbon/functions/_unpack.scss deleted file mode 100755 index 4367935..0000000 --- a/html_orig/sass/lib/bourbon/functions/_unpack.scss +++ /dev/null @@ -1,27 +0,0 @@ -@charset "UTF-8"; - -/// Converts shorthand to the 4-value syntax. -/// -/// @param {List} $shorthand -/// -/// @example scss - Usage -/// .element { -/// margin: unpack(1em 2em); -/// } -/// -/// @example css - CSS Output -/// .element { -/// margin: 1em 2em 1em 2em; -/// } - -@function unpack($shorthand) { - @if length($shorthand) == 1 { - @return nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1) nth($shorthand, 1); - } @else if length($shorthand) == 2 { - @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 1) nth($shorthand, 2); - } @else if length($shorthand) == 3 { - @return nth($shorthand, 1) nth($shorthand, 2) nth($shorthand, 3) nth($shorthand, 2); - } @else { - @return $shorthand; - } -} diff --git a/html_orig/sass/lib/bourbon/helpers/_convert-units.scss b/html_orig/sass/lib/bourbon/helpers/_convert-units.scss deleted file mode 100755 index e0a65a0..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_convert-units.scss +++ /dev/null @@ -1,21 +0,0 @@ -//************************************************************************// -// Helper function for str-to-num fn. -// Source: http://sassmeister.com/gist/9647408 -//************************************************************************// -@function _convert-units($number, $unit) { - $strings: "px", "cm", "mm", "%", "ch", "pica", "in", "em", "rem", "pt", "pc", "ex", "vw", "vh", "vmin", "vmax", "deg", "rad", "grad", "turn"; - $units: 1px, 1cm, 1mm, 1%, 1ch, 1pica, 1in, 1em, 1rem, 1pt, 1pc, 1ex, 1vw, 1vh, 1vmin, 1vmax, 1deg, 1rad, 1grad, 1turn; - $index: index($strings, $unit); - - @if not $index { - @warn "Unknown unit `#{$unit}`."; - @return false; - } - - @if type-of($number) != "number" { - @warn "`#{$number} is not a number`"; - @return false; - } - - @return $number * nth($units, $index); -} diff --git a/html_orig/sass/lib/bourbon/helpers/_directional-values.scss b/html_orig/sass/lib/bourbon/helpers/_directional-values.scss deleted file mode 100755 index 6ee538d..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_directional-values.scss +++ /dev/null @@ -1,96 +0,0 @@ -@charset "UTF-8"; - -/// Directional-property mixins are shorthands for writing properties like the following -/// -/// @ignore You can also use `false` instead of `null`. -/// -/// @param {List} $vals -/// List of directional values -/// -/// @example scss - Usage -/// .element { -/// @include border-style(dotted null); -/// @include margin(null 0 10px); -/// } -/// -/// @example css - CSS Output -/// .element { -/// border-bottom-style: dotted; -/// border-top-style: dotted; -/// margin-bottom: 10px; -/// margin-left: 0; -/// margin-right: 0; -/// } -/// -/// @require {function} contains-falsy -/// -/// @return {List} - -@function collapse-directionals($vals) { - $output: null; - - $a: nth($vals, 1); - $b: if(length($vals) < 2, $a, nth($vals, 2)); - $c: if(length($vals) < 3, $a, nth($vals, 3)); - $d: if(length($vals) < 2, $a, nth($vals, if(length($vals) < 4, 2, 4))); - - @if $a == 0 { $a: 0; } - @if $b == 0 { $b: 0; } - @if $c == 0 { $c: 0; } - @if $d == 0 { $d: 0; } - - @if $a == $b and $a == $c and $a == $d { $output: $a; } - @else if $a == $c and $b == $d { $output: $a $b; } - @else if $b == $d { $output: $a $b $c; } - @else { $output: $a $b $c $d; } - - @return $output; -} - -/// Output directional properties, for instance `margin`. -/// -/// @access private -/// -/// @param {String} $pre -/// Prefix to use -/// @param {String} $suf -/// Suffix to use -/// @param {List} $vals -/// List of values -/// -/// @require {function} collapse-directionals -/// @require {function} contains-falsy - -@mixin directional-property($pre, $suf, $vals) { - // Property Names - $top: $pre + "-top" + if($suf, "-#{$suf}", ""); - $bottom: $pre + "-bottom" + if($suf, "-#{$suf}", ""); - $left: $pre + "-left" + if($suf, "-#{$suf}", ""); - $right: $pre + "-right" + if($suf, "-#{$suf}", ""); - $all: $pre + if($suf, "-#{$suf}", ""); - - $vals: collapse-directionals($vals); - - @if contains-falsy($vals) { - @if nth($vals, 1) { #{$top}: nth($vals, 1); } - - @if length($vals) == 1 { - @if nth($vals, 1) { #{$right}: nth($vals, 1); } - } @else { - @if nth($vals, 2) { #{$right}: nth($vals, 2); } - } - - @if length($vals) == 2 { - @if nth($vals, 1) { #{$bottom}: nth($vals, 1); } - @if nth($vals, 2) { #{$left}: nth($vals, 2); } - } @else if length($vals) == 3 { - @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } - @if nth($vals, 2) { #{$left}: nth($vals, 2); } - } @else if length($vals) == 4 { - @if nth($vals, 3) { #{$bottom}: nth($vals, 3); } - @if nth($vals, 4) { #{$left}: nth($vals, 4); } - } - } @else { - #{$all}: $vals; - } -} diff --git a/html_orig/sass/lib/bourbon/helpers/_font-source-declaration.scss b/html_orig/sass/lib/bourbon/helpers/_font-source-declaration.scss deleted file mode 100755 index 7f17586..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_font-source-declaration.scss +++ /dev/null @@ -1,43 +0,0 @@ -// Used for creating the source string for fonts using @font-face -// Reference: http://goo.gl/Ru1bKP - -@function font-url-prefixer($asset-pipeline) { - @if $asset-pipeline == true { - @return font-url; - } @else { - @return url; - } -} - -@function font-source-declaration( - $font-family, - $file-path, - $asset-pipeline, - $file-formats, - $font-url) { - - $src: (); - - $formats-map: ( - eot: "#{$file-path}.eot?#iefix" format("embedded-opentype"), - woff2: "#{$file-path}.woff2" format("woff2"), - woff: "#{$file-path}.woff" format("woff"), - ttf: "#{$file-path}.ttf" format("truetype"), - svg: "#{$file-path}.svg##{$font-family}" format("svg") - ); - - @each $key, $values in $formats-map { - @if contains($file-formats, $key) { - $file-path: nth($values, 1); - $font-format: nth($values, 2); - - @if $asset-pipeline == true { - $src: append($src, font-url($file-path) $font-format, comma); - } @else { - $src: append($src, url($file-path) $font-format, comma); - } - } - } - - @return $src; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_gradient-positions-parser.scss b/html_orig/sass/lib/bourbon/helpers/_gradient-positions-parser.scss deleted file mode 100755 index 07d30b6..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_gradient-positions-parser.scss +++ /dev/null @@ -1,13 +0,0 @@ -@function _gradient-positions-parser($gradient-type, $gradient-positions) { - @if $gradient-positions - and ($gradient-type == linear) - and (type-of($gradient-positions) != color) { - $gradient-positions: _linear-positions-parser($gradient-positions); - } - @else if $gradient-positions - and ($gradient-type == radial) - and (type-of($gradient-positions) != color) { - $gradient-positions: _radial-positions-parser($gradient-positions); - } - @return $gradient-positions; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_linear-angle-parser.scss b/html_orig/sass/lib/bourbon/helpers/_linear-angle-parser.scss deleted file mode 100755 index e0401ed..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_linear-angle-parser.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Private function for linear-gradient-parser -@function _linear-angle-parser($image, $first-val, $prefix, $suffix) { - $offset: null; - $unit-short: str-slice($first-val, str-length($first-val) - 2, str-length($first-val)); - $unit-long: str-slice($first-val, str-length($first-val) - 3, str-length($first-val)); - - @if ($unit-long == "grad") or - ($unit-long == "turn") { - $offset: if($unit-long == "grad", -100grad * 3, -0.75turn); - } - - @else if ($unit-short == "deg") or - ($unit-short == "rad") { - $offset: if($unit-short == "deg", -90 * 3, 1.6rad); - } - - @if $offset { - $num: _str-to-num($first-val); - - @return ( - webkit-image: -webkit- + $prefix + ($offset - $num) + $suffix, - spec-image: $image - ); - } -} diff --git a/html_orig/sass/lib/bourbon/helpers/_linear-gradient-parser.scss b/html_orig/sass/lib/bourbon/helpers/_linear-gradient-parser.scss deleted file mode 100755 index 48a8f77..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_linear-gradient-parser.scss +++ /dev/null @@ -1,41 +0,0 @@ -@function _linear-gradient-parser($image) { - $image: unquote($image); - $gradients: (); - $start: str-index($image, "("); - $end: str-index($image, ","); - $first-val: str-slice($image, $start + 1, $end - 1); - - $prefix: str-slice($image, 1, $start); - $suffix: str-slice($image, $end, str-length($image)); - - $has-multiple-vals: str-index($first-val, " "); - $has-single-position: unquote(_position-flipper($first-val) + ""); - $has-angle: is-number(str-slice($first-val, 1, 1)); - - @if $has-multiple-vals { - $gradients: _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals); - } - - @else if $has-single-position != "" { - $pos: unquote($has-single-position + ""); - - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $prefix + "to " + $pos + $suffix - ); - } - - @else if $has-angle { - // Rotate degree for webkit - $gradients: _linear-angle-parser($image, $first-val, $prefix, $suffix); - } - - @else { - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $image - ); - } - - @return $gradients; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_linear-positions-parser.scss b/html_orig/sass/lib/bourbon/helpers/_linear-positions-parser.scss deleted file mode 100755 index 96d6a6d..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_linear-positions-parser.scss +++ /dev/null @@ -1,61 +0,0 @@ -@function _linear-positions-parser($pos) { - $type: type-of(nth($pos, 1)); - $spec: null; - $degree: null; - $side: null; - $corner: null; - $length: length($pos); - // Parse Side and corner positions - @if ($length > 1) { - @if nth($pos, 1) == "to" { // Newer syntax - $side: nth($pos, 2); - - @if $length == 2 { // eg. to top - // Swap for backwards compatibility - $degree: _position-flipper(nth($pos, 2)); - } - @else if $length == 3 { // eg. to top left - $corner: nth($pos, 3); - } - } - @else if $length == 2 { // Older syntax ("top left") - $side: _position-flipper(nth($pos, 1)); - $corner: _position-flipper(nth($pos, 2)); - } - - @if ("#{$side} #{$corner}" == "left top") or ("#{$side} #{$corner}" == "top left") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "right top") or ("#{$side} #{$corner}" == "top right") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "right bottom") or ("#{$side} #{$corner}" == "bottom right") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - @else if ("#{$side} #{$corner}" == "left bottom") or ("#{$side} #{$corner}" == "bottom left") { - $degree: _position-flipper(#{$side}) _position-flipper(#{$corner}); - } - $spec: to $side $corner; - } - @else if $length == 1 { - // Swap for backwards compatibility - @if $type == string { - $degree: $pos; - $spec: to _position-flipper($pos); - } - @else { - $degree: -270 - $pos; //rotate the gradient opposite from spec - $spec: $pos; - } - } - $degree: unquote($degree + ","); - $spec: unquote($spec + ","); - @return $degree $spec; -} - -@function _position-flipper($pos) { - @return if($pos == left, right, null) - if($pos == right, left, null) - if($pos == top, bottom, null) - if($pos == bottom, top, null); -} diff --git a/html_orig/sass/lib/bourbon/helpers/_linear-side-corner-parser.scss b/html_orig/sass/lib/bourbon/helpers/_linear-side-corner-parser.scss deleted file mode 100755 index 7a69125..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_linear-side-corner-parser.scss +++ /dev/null @@ -1,31 +0,0 @@ -// Private function for linear-gradient-parser -@function _linear-side-corner-parser($image, $first-val, $prefix, $suffix, $has-multiple-vals) { - $val-1: str-slice($first-val, 1, $has-multiple-vals - 1); - $val-2: str-slice($first-val, $has-multiple-vals + 1, str-length($first-val)); - $val-3: null; - $has-val-3: str-index($val-2, " "); - - @if $has-val-3 { - $val-3: str-slice($val-2, $has-val-3 + 1, str-length($val-2)); - $val-2: str-slice($val-2, 1, $has-val-3 - 1); - } - - $pos: _position-flipper($val-1) _position-flipper($val-2) _position-flipper($val-3); - $pos: unquote($pos + ""); - - // Use old spec for webkit - @if $val-1 == "to" { - @return ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ); - } - - // Bring the code up to spec - @else { - @return ( - webkit-image: -webkit- + $image, - spec-image: $prefix + "to " + $pos + $suffix - ); - } -} diff --git a/html_orig/sass/lib/bourbon/helpers/_radial-arg-parser.scss b/html_orig/sass/lib/bourbon/helpers/_radial-arg-parser.scss deleted file mode 100755 index 56c6030..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_radial-arg-parser.scss +++ /dev/null @@ -1,69 +0,0 @@ -@function _radial-arg-parser($g1, $g2, $pos, $shape-size) { - @each $value in $g1, $g2 { - $first-val: nth($value, 1); - $pos-type: type-of($first-val); - $spec-at-index: null; - - // Determine if spec was passed to mixin - @if type-of($value) == list { - $spec-at-index: if(index($value, at), index($value, at), false); - } - @if $spec-at-index { - @if $spec-at-index > 1 { - @for $i from 1 through ($spec-at-index - 1) { - $shape-size: $shape-size nth($value, $i); - } - @for $i from ($spec-at-index + 1) through length($value) { - $pos: $pos nth($value, $i); - } - } - @else if $spec-at-index == 1 { - @for $i from ($spec-at-index + 1) through length($value) { - $pos: $pos nth($value, $i); - } - } - $g1: null; - } - - // If not spec calculate correct values - @else { - @if ($pos-type != color) or ($first-val != "transparent") { - @if ($pos-type == number) - or ($first-val == "center") - or ($first-val == "top") - or ($first-val == "right") - or ($first-val == "bottom") - or ($first-val == "left") { - - $pos: $value; - - @if $pos == $g1 { - $g1: null; - } - } - - @else if - ($first-val == "ellipse") - or ($first-val == "circle") - or ($first-val == "closest-side") - or ($first-val == "closest-corner") - or ($first-val == "farthest-side") - or ($first-val == "farthest-corner") - or ($first-val == "contain") - or ($first-val == "cover") { - - $shape-size: $value; - - @if $value == $g1 { - $g1: null; - } - - @else if $value == $g2 { - $g2: null; - } - } - } - } - } - @return $g1, $g2, $pos, $shape-size; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_radial-gradient-parser.scss b/html_orig/sass/lib/bourbon/helpers/_radial-gradient-parser.scss deleted file mode 100755 index 5444d80..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_radial-gradient-parser.scss +++ /dev/null @@ -1,50 +0,0 @@ -@function _radial-gradient-parser($image) { - $image: unquote($image); - $gradients: (); - $start: str-index($image, "("); - $end: str-index($image, ","); - $first-val: str-slice($image, $start + 1, $end - 1); - - $prefix: str-slice($image, 1, $start); - $suffix: str-slice($image, $end, str-length($image)); - - $is-spec-syntax: str-index($first-val, "at"); - - @if $is-spec-syntax and $is-spec-syntax > 1 { - $keyword: str-slice($first-val, 1, $is-spec-syntax - 2); - $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); - $pos: append($pos, $keyword, comma); - - $gradients: ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ); - } - - @else if $is-spec-syntax == 1 { - $pos: str-slice($first-val, $is-spec-syntax + 3, str-length($first-val)); - - $gradients: ( - webkit-image: -webkit- + $prefix + $pos + $suffix, - spec-image: $image - ); - } - - @else if str-index($image, "cover") or str-index($image, "contain") { - @warn "Radial-gradient needs to be updated to conform to latest spec."; - - $gradients: ( - webkit-image: null, - spec-image: $image - ); - } - - @else { - $gradients: ( - webkit-image: -webkit- + $image, - spec-image: $image - ); - } - - @return $gradients; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_radial-positions-parser.scss b/html_orig/sass/lib/bourbon/helpers/_radial-positions-parser.scss deleted file mode 100755 index 3c552ad..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_radial-positions-parser.scss +++ /dev/null @@ -1,18 +0,0 @@ -@function _radial-positions-parser($gradient-pos) { - $shape-size: nth($gradient-pos, 1); - $pos: nth($gradient-pos, 2); - $shape-size-spec: _shape-size-stripper($shape-size); - - $pre-spec: unquote(if($pos, "#{$pos}, ", null)) - unquote(if($shape-size, "#{$shape-size},", null)); - $pos-spec: if($pos, "at #{$pos}", null); - - $spec: "#{$shape-size-spec} #{$pos-spec}"; - - // Add comma - @if ($spec != " ") { - $spec: "#{$spec},"; - } - - @return $pre-spec $spec; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_render-gradients.scss b/html_orig/sass/lib/bourbon/helpers/_render-gradients.scss deleted file mode 100755 index 5765676..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_render-gradients.scss +++ /dev/null @@ -1,26 +0,0 @@ -// User for linear and radial gradients within background-image or border-image properties - -@function _render-gradients($gradient-positions, $gradients, $gradient-type, $vendor: false) { - $pre-spec: null; - $spec: null; - $vendor-gradients: null; - @if $gradient-type == linear { - @if $gradient-positions { - $pre-spec: nth($gradient-positions, 1); - $spec: nth($gradient-positions, 2); - } - } - @else if $gradient-type == radial { - $pre-spec: nth($gradient-positions, 1); - $spec: nth($gradient-positions, 2); - } - - @if $vendor { - $vendor-gradients: -#{$vendor}-#{$gradient-type}-gradient(#{$pre-spec} $gradients); - } - @else if $vendor == false { - $vendor-gradients: "#{$gradient-type}-gradient(#{$spec} #{$gradients})"; - $vendor-gradients: unquote($vendor-gradients); - } - @return $vendor-gradients; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_shape-size-stripper.scss b/html_orig/sass/lib/bourbon/helpers/_shape-size-stripper.scss deleted file mode 100755 index ee5eda4..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_shape-size-stripper.scss +++ /dev/null @@ -1,10 +0,0 @@ -@function _shape-size-stripper($shape-size) { - $shape-size-spec: null; - @each $value in $shape-size { - @if ($value == "cover") or ($value == "contain") { - $value: null; - } - $shape-size-spec: "#{$shape-size-spec} #{$value}"; - } - @return $shape-size-spec; -} diff --git a/html_orig/sass/lib/bourbon/helpers/_str-to-num.scss b/html_orig/sass/lib/bourbon/helpers/_str-to-num.scss deleted file mode 100755 index 3ef1d87..0000000 --- a/html_orig/sass/lib/bourbon/helpers/_str-to-num.scss +++ /dev/null @@ -1,50 +0,0 @@ -//************************************************************************// -// Helper function for linear/radial-gradient-parsers. -// Source: http://sassmeister.com/gist/9647408 -//************************************************************************// -@function _str-to-num($string) { - // Matrices - $strings: "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"; - $numbers: 0 1 2 3 4 5 6 7 8 9; - - // Result - $result: 0; - $divider: 0; - $minus: false; - - // Looping through all characters - @for $i from 1 through str-length($string) { - $character: str-slice($string, $i, $i); - $index: index($strings, $character); - - @if $character == "-" { - $minus: true; - } - - @else if $character == "." { - $divider: 1; - } - - @else { - @if not $index { - $result: if($minus, $result * -1, $result); - @return _convert-units($result, str-slice($string, $i)); - } - - $number: nth($numbers, $index); - - @if $divider == 0 { - $result: $result * 10; - } - - @else { - // Move the decimal dot to the left - $divider: $divider * 10; - $number: $number / $divider; - } - - $result: $result + $number; - } - } - @return if($minus, $result * -1, $result); -} diff --git a/html_orig/sass/lib/bourbon/settings/_asset-pipeline.scss b/html_orig/sass/lib/bourbon/settings/_asset-pipeline.scss deleted file mode 100755 index 4c6afc5..0000000 --- a/html_orig/sass/lib/bourbon/settings/_asset-pipeline.scss +++ /dev/null @@ -1,7 +0,0 @@ -@charset "UTF-8"; - -/// A global setting to enable or disable the `$asset-pipeline` variable for all functions that accept it. -/// -/// @type Bool - -$asset-pipeline: false !default; diff --git a/html_orig/sass/lib/bourbon/settings/_prefixer.scss b/html_orig/sass/lib/bourbon/settings/_prefixer.scss deleted file mode 100755 index 8c39051..0000000 --- a/html_orig/sass/lib/bourbon/settings/_prefixer.scss +++ /dev/null @@ -1,9 +0,0 @@ -@charset "UTF-8"; - -/// Global variables to enable or disable vendor prefixes - -$prefix-for-webkit: true !default; -$prefix-for-mozilla: true !default; -$prefix-for-microsoft: true !default; -$prefix-for-opera: true !default; -$prefix-for-spec: true !default; diff --git a/html_orig/sass/lib/bourbon/settings/_px-to-em.scss b/html_orig/sass/lib/bourbon/settings/_px-to-em.scss deleted file mode 100755 index f2f9a3e..0000000 --- a/html_orig/sass/lib/bourbon/settings/_px-to-em.scss +++ /dev/null @@ -1 +0,0 @@ -$em-base: 16px !default; diff --git a/html_orig/sass/lib/neat/_neat-helpers.scss b/html_orig/sass/lib/neat/_neat-helpers.scss deleted file mode 100755 index 9c182d2..0000000 --- a/html_orig/sass/lib/neat/_neat-helpers.scss +++ /dev/null @@ -1,8 +0,0 @@ -// Functions -@import "functions/private"; -@import "functions/new-breakpoint"; - -// Settings -@import "settings/grid"; -@import "settings/visual-grid"; -@import "settings/disable-warnings"; diff --git a/html_orig/sass/lib/neat/_neat.scss b/html_orig/sass/lib/neat/_neat.scss deleted file mode 100755 index e46e169..0000000 --- a/html_orig/sass/lib/neat/_neat.scss +++ /dev/null @@ -1,23 +0,0 @@ -// Neat 1.7.2 -// http://neat.bourbon.io -// Copyright 2012-2015 thoughtbot, inc. -// MIT License - -// Helpers -@import "neat-helpers"; - -// Grid -@import "grid/private"; -@import "grid/box-sizing"; -@import "grid/omega"; -@import "grid/outer-container"; -@import "grid/span-columns"; -@import "grid/row"; -@import "grid/shift"; -@import "grid/pad"; -@import "grid/fill-parent"; -@import "grid/media"; -@import "grid/to-deprecate"; -@import "grid/visual-grid"; -@import "grid/display-context"; -@import "grid/direction-context"; diff --git a/html_orig/sass/lib/neat/functions/_new-breakpoint.scss b/html_orig/sass/lib/neat/functions/_new-breakpoint.scss deleted file mode 100755 index 41ab955..0000000 --- a/html_orig/sass/lib/neat/functions/_new-breakpoint.scss +++ /dev/null @@ -1,49 +0,0 @@ -@charset "UTF-8"; - -/// Returns a media context (media query / grid context) that can be stored in a variable and passed to `media()` as a single-keyword argument. Media contexts defined using `new-breakpoint` are used by the visual grid, as long as they are defined before importing Neat. -/// -/// @param {List} $query -/// A list of media query features and values. Each `$feature` should have a corresponding `$value`. -/// -/// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. -/// -/// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). -/// -/// @param {Number (unitless)} $total-columns [$grid-columns] -/// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. -/// -/// @example scss - Usage -/// $mobile: new-breakpoint(max-width 480px 4); -/// -/// .element { -/// @include media($mobile) { -/// @include span-columns(4); -/// } -/// } -/// -/// @example css - CSS Output -/// @media screen and (max-width: 480px) { -/// .element { -/// display: block; -/// float: left; -/// margin-right: 7.42297%; -/// width: 100%; -/// } -/// .element:last-child { -/// margin-right: 0; -/// } -/// } - -@function new-breakpoint($query: $feature $value $columns, $total-columns: $grid-columns) { - @if length($query) == 1 { - $query: $default-feature nth($query, 1) $total-columns; - } @else if is-even(length($query)) { - $query: append($query, $total-columns); - } - - @if is-not(belongs-to($query, $visual-grid-breakpoints)) { - $visual-grid-breakpoints: append($visual-grid-breakpoints, $query, comma) !global; - } - - @return $query; -} diff --git a/html_orig/sass/lib/neat/functions/_private.scss b/html_orig/sass/lib/neat/functions/_private.scss deleted file mode 100755 index 872d4dc..0000000 --- a/html_orig/sass/lib/neat/functions/_private.scss +++ /dev/null @@ -1,114 +0,0 @@ -// Not function for Libsass compatibility -// https://github.com/sass/libsass/issues/368 -@function is-not($value) { - @return if($value, false, true); -} - -// Checks if a number is even -@function is-even($int) { - @return $int % 2 == 0; -} - -// Checks if an element belongs to a list or not -@function belongs-to($tested-item, $list) { - @return is-not(not-belongs-to($tested-item, $list)); -} - -@function not-belongs-to($tested-item, $list) { - @return is-not(index($list, $tested-item)); -} - -// Contains display value -@function contains-display-value($query) { - @return belongs-to(table, $query) - or belongs-to(block, $query) - or belongs-to(inline-block, $query) - or belongs-to(inline, $query); -} - -// Parses the first argument of span-columns() -@function container-span($span: $span) { - @if length($span) == 3 { - $container-columns: nth($span, 3); - @return $container-columns; - } @else if length($span) == 2 { - $container-columns: nth($span, 2); - @return $container-columns; - } - - @return $grid-columns; -} - -@function container-shift($shift: $shift) { - $parent-columns: $grid-columns !default !global; - - @if length($shift) == 3 { - $container-columns: nth($shift, 3); - @return $container-columns; - } @else if length($shift) == 2 { - $container-columns: nth($shift, 2); - @return $container-columns; - } - - @return $parent-columns; -} - -// Generates a striped background -@function gradient-stops($grid-columns, $color: $visual-grid-color) { - $transparent: transparent; - - $column-width: flex-grid(1, $grid-columns); - $gutter-width: flex-gutter($grid-columns); - $column-offset: $column-width; - - $values: ($transparent 0, $color 0); - - @for $i from 1 to $grid-columns*2 { - @if is-even($i) { - $values: append($values, $transparent $column-offset, comma); - $values: append($values, $color $column-offset, comma); - $column-offset: $column-offset + $column-width; - } @else { - $values: append($values, $color $column-offset, comma); - $values: append($values, $transparent $column-offset, comma); - $column-offset: $column-offset + $gutter-width; - } - } - - @return $values; -} - -// Layout direction -@function get-direction($layout, $default) { - $direction: null; - - @if to-upper-case($layout) == "LTR" or to-upper-case($layout) == "RTL" { - $direction: direction-from-layout($layout); - } @else { - $direction: direction-from-layout($default); - } - - @return $direction; -} - -@function direction-from-layout($layout) { - $direction: null; - - @if to-upper-case($layout) == "LTR" { - $direction: right; - } @else { - $direction: left; - } - - @return $direction; -} - -@function get-opposite-direction($direction) { - $opposite-direction: left; - - @if $direction == "left" { - $opposite-direction: right; - } - - @return $opposite-direction; -} diff --git a/html_orig/sass/lib/neat/grid/_box-sizing.scss b/html_orig/sass/lib/neat/grid/_box-sizing.scss deleted file mode 100755 index b6d3fec..0000000 --- a/html_orig/sass/lib/neat/grid/_box-sizing.scss +++ /dev/null @@ -1,15 +0,0 @@ -@charset "UTF-8"; - -@if $border-box-sizing == true { - html { // http://bit.ly/1qk2tVR - box-sizing: border-box; - } - - * { - &, - &::after, - &::before { - box-sizing: inherit; - } - } -} diff --git a/html_orig/sass/lib/neat/grid/_direction-context.scss b/html_orig/sass/lib/neat/grid/_direction-context.scss deleted file mode 100755 index 7b0d46e..0000000 --- a/html_orig/sass/lib/neat/grid/_direction-context.scss +++ /dev/null @@ -1,33 +0,0 @@ -@charset "UTF-8"; - -/// Changes the direction property used by other mixins called in the code block argument. -/// -/// @param {String} $direction [left-to-right] -/// Layout direction to be used within the block. Can be `left-to-right` or `right-to-left`. -/// -/// @example scss - Usage -/// @include direction-context(right-to-left) { -/// .right-to-left-block { -/// @include span-columns(6); -/// } -/// } -/// -/// @example css - CSS Output -/// .right-to-left-block { -/// float: right; -/// ... -/// } - -@mixin direction-context($direction: left-to-right) { - $scope-direction: $layout-direction; - - @if to-lower-case($direction) == "left-to-right" { - $layout-direction: LTR !global; - } @else if to-lower-case($direction) == "right-to-left" { - $layout-direction: RTL !global; - } - - @content; - - $layout-direction: $scope-direction !global; -} diff --git a/html_orig/sass/lib/neat/grid/_display-context.scss b/html_orig/sass/lib/neat/grid/_display-context.scss deleted file mode 100755 index ed9b063..0000000 --- a/html_orig/sass/lib/neat/grid/_display-context.scss +++ /dev/null @@ -1,28 +0,0 @@ -@charset "UTF-8"; - -/// Changes the display property used by other mixins called in the code block argument. -/// -/// @param {String} $display [block] -/// Display value to be used within the block. Can be `table` or `block`. -/// -/// @example scss -/// @include display-context(table) { -/// .display-table { -/// @include span-columns(6); -/// } -/// } -/// -/// @example css -/// .display-table { -/// display: table-cell; -/// ... -/// } - -@mixin display-context($display: block) { - $scope-display: $container-display-table; - $container-display-table: $display == table !global; - - @content; - - $container-display-table: $scope-display !global; -} diff --git a/html_orig/sass/lib/neat/grid/_fill-parent.scss b/html_orig/sass/lib/neat/grid/_fill-parent.scss deleted file mode 100755 index 415f0b1..0000000 --- a/html_orig/sass/lib/neat/grid/_fill-parent.scss +++ /dev/null @@ -1,22 +0,0 @@ -@charset "UTF-8"; - -/// Forces the element to fill its parent container. -/// -/// @example scss - Usage -/// .element { -/// @include fill-parent; -/// } -/// -/// @example css - CSS Output -/// .element { -/// width: 100%; -/// box-sizing: border-box; -/// } - -@mixin fill-parent() { - width: 100%; - - @if $border-box-sizing == false { - box-sizing: border-box; - } -} diff --git a/html_orig/sass/lib/neat/grid/_media.scss b/html_orig/sass/lib/neat/grid/_media.scss deleted file mode 100755 index bd516e9..0000000 --- a/html_orig/sass/lib/neat/grid/_media.scss +++ /dev/null @@ -1,92 +0,0 @@ -@charset "UTF-8"; - -/// Outputs a media-query block with an optional grid context (the total number of columns used in the grid). -/// -/// @param {List} $query -/// A list of media query features and values, where each `$feature` should have a corresponding `$value`. -/// For a list of valid values for `$feature`, click [here](http://www.w3.org/TR/css3-mediaqueries/#media1). -/// -/// If there is only a single `$value` in `$query`, `$default-feature` is going to be used. -/// -/// The number of total columns in the grid can be set by passing `$columns` at the end of the list (overrides `$total-columns`). -/// -/// -/// @param {Number (unitless)} $total-columns [$grid-columns] -/// - Number of columns to use in the new grid context. Can be set as a shorthand in the first parameter. -/// -/// @example scss - Usage -/// .responsive-element { -/// @include media(769px) { -/// @include span-columns(6); -/// } -/// } -/// -/// .new-context-element { -/// @include media(min-width 320px max-width 480px, 6) { -/// @include span-columns(6); -/// } -/// } -/// -/// @example css - CSS Output -/// @media screen and (min-width: 769px) { -/// .responsive-element { -/// display: block; -/// float: left; -/// margin-right: 2.35765%; -/// width: 48.82117%; -/// } -/// -/// .responsive-element:last-child { -/// margin-right: 0; -/// } -/// } -/// -/// @media screen and (min-width: 320px) and (max-width: 480px) { -/// .new-context-element { -/// display: block; -/// float: left; -/// margin-right: 4.82916%; -/// width: 100%; -/// } -/// -/// .new-context-element:last-child { -/// margin-right: 0; -/// } -/// } - -@mixin media($query: $feature $value $columns, $total-columns: $grid-columns) { - @if length($query) == 1 { - @media screen and ($default-feature: nth($query, 1)) { - $default-grid-columns: $grid-columns; - $grid-columns: $total-columns !global; - @content; - $grid-columns: $default-grid-columns !global; - } - } @else { - $loop-to: length($query); - $media-query: "screen and "; - $default-grid-columns: $grid-columns; - $grid-columns: $total-columns !global; - - @if is-not(is-even(length($query))) { - $grid-columns: nth($query, $loop-to) !global; - $loop-to: $loop-to - 1; - } - - $i: 1; - @while $i <= $loop-to { - $media-query: $media-query + "(" + nth($query, $i) + ": " + nth($query, $i + 1) + ") "; - - @if ($i + 1) != $loop-to { - $media-query: $media-query + "and "; - } - - $i: $i + 2; - } - - @media #{$media-query} { - @content; - $grid-columns: $default-grid-columns !global; - } - } -} diff --git a/html_orig/sass/lib/neat/grid/_omega.scss b/html_orig/sass/lib/neat/grid/_omega.scss deleted file mode 100755 index 80f918a..0000000 --- a/html_orig/sass/lib/neat/grid/_omega.scss +++ /dev/null @@ -1,87 +0,0 @@ -@charset "UTF-8"; - -/// Removes the element's gutter margin, regardless of its position in the grid hierarchy or display property. It can target a specific element, or every `nth-child` occurrence. Works only with `block` layouts. -/// -/// @param {List} $query [block] -/// List of arguments. Supported arguments are `nth-child` selectors (targets a specific pseudo element) and `auto` (targets `last-child`). -/// -/// When passed an `nth-child` argument of type `*n` with `block` display, the omega mixin automatically adds a clear to the `*n+1` th element. Note that composite arguments such as `2n+1` do not support this feature. -/// -/// **Deprecation warning**: The omega mixin will no longer take a `$direction` argument. To change the layout direction, use `row($direction)` or set `$default-layout-direction` instead. -/// -/// @example scss - Usage -/// .element { -/// @include omega; -/// } -/// -/// .nth-element { -/// @include omega(4n); -/// } -/// -/// @example css - CSS Output -/// .element { -/// margin-right: 0; -/// } -/// -/// .nth-element:nth-child(4n) { -/// margin-right: 0; -/// } -/// -/// .nth-element:nth-child(4n+1) { -/// clear: left; -/// } - -@mixin omega($query: block, $direction: default) { - $table: belongs-to(table, $query); - $auto: belongs-to(auto, $query); - - @if $direction != default { - @include -neat-warn("The omega mixin will no longer take a $direction argument. To change the layout direction, use the direction(){...} mixin."); - } @else { - $direction: get-direction($layout-direction, $default-layout-direction); - } - - @if $table { - @include -neat-warn("The omega mixin no longer removes padding in table layouts."); - } - - @if length($query) == 1 { - @if $auto { - &:last-child { - margin-#{$direction}: 0; - } - } - - @else if contains-display-value($query) and $table == false { - margin-#{$direction}: 0; - } - - @else { - @include nth-child($query, $direction); - } - } @else if length($query) == 2 { - @if $auto { - &:last-child { - margin-#{$direction}: 0; - } - } @else { - @include nth-child(nth($query, 1), $direction); - } - } @else { - @include -neat-warn("Too many arguments passed to the omega() mixin."); - } -} - -@mixin nth-child($query, $direction) { - $opposite-direction: get-opposite-direction($direction); - - &:nth-child(#{$query}) { - margin-#{$direction}: 0; - } - - @if type-of($query) == number and unit($query) == "n" { - &:nth-child(#{$query}+1) { - clear: $opposite-direction; - } - } -} diff --git a/html_orig/sass/lib/neat/grid/_outer-container.scss b/html_orig/sass/lib/neat/grid/_outer-container.scss deleted file mode 100755 index 5a375bb..0000000 --- a/html_orig/sass/lib/neat/grid/_outer-container.scss +++ /dev/null @@ -1,38 +0,0 @@ -@charset "UTF-8"; - -/// Makes an element a outer container by centring it in the viewport, clearing its floats, and setting its `max-width`. -/// Although optional, using `outer-container` is recommended. The mixin can be called on more than one element per page, as long as they are not nested. -/// -/// @param {Number [unit]} $local-max-width [$max-width] -/// Max width to be applied to the element. Can be a percentage or a measure. -/// -/// @example scss - Usage -/// .element { -/// @include outer-container(100%); -/// } -/// -/// @example css - CSS Output -/// .element { -/// *zoom: 1; -/// max-width: 100%; -/// margin-left: auto; -/// margin-right: auto; -/// } -/// -/// .element:before, .element:after { -/// content: " "; -/// display: table; -/// } -/// -/// .element:after { -/// clear: both; -/// } - -@mixin outer-container($local-max-width: $max-width) { - @include clearfix; - max-width: $local-max-width; - margin: { - left: auto; - right: auto; - } -} diff --git a/html_orig/sass/lib/neat/grid/_pad.scss b/html_orig/sass/lib/neat/grid/_pad.scss deleted file mode 100755 index d697e1b..0000000 --- a/html_orig/sass/lib/neat/grid/_pad.scss +++ /dev/null @@ -1,25 +0,0 @@ -@charset "UTF-8"; - -/// Adds padding to the element. -/// -/// @param {List} $padding [flex-gutter()] -/// A list of padding value(s) to use. Passing `default` in the list will result in using the gutter width as a padding value. -/// -/// @example scss - Usage -/// .element { -/// @include pad(30px -20px 10px default); -/// } -/// -/// @example css - CSS Output -/// .element { -/// padding: 30px -20px 10px 2.35765%; -/// } - -@mixin pad($padding: flex-gutter()) { - $padding-list: null; - @each $value in $padding { - $value: if($value == 'default', flex-gutter(), $value); - $padding-list: join($padding-list, $value); - } - padding: $padding-list; -} diff --git a/html_orig/sass/lib/neat/grid/_private.scss b/html_orig/sass/lib/neat/grid/_private.scss deleted file mode 100755 index 4c4e18c..0000000 --- a/html_orig/sass/lib/neat/grid/_private.scss +++ /dev/null @@ -1,35 +0,0 @@ -$parent-columns: $grid-columns !default; -$fg-column: $column; -$fg-gutter: $gutter; -$fg-max-columns: $grid-columns; -$container-display-table: false !default; -$layout-direction: LTR !default; - -@function flex-grid($columns, $container-columns: $fg-max-columns) { - $width: $columns * $fg-column + ($columns - 1) * $fg-gutter; - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($width / $container-width); -} - -@function flex-gutter($container-columns: $fg-max-columns, $gutter: $fg-gutter) { - $container-width: $container-columns * $fg-column + ($container-columns - 1) * $fg-gutter; - @return percentage($gutter / $container-width); -} - -@function grid-width($n) { - @return $n * $gw-column + ($n - 1) * $gw-gutter; -} - -@function get-parent-columns($columns) { - @if $columns != $grid-columns { - $parent-columns: $columns !global; - } @else { - $parent-columns: $grid-columns !global; - } - - @return $parent-columns; -} - -@function is-display-table($container-is-display-table, $display) { - @return $container-is-display-table == true or $display == table; -} diff --git a/html_orig/sass/lib/neat/grid/_row.scss b/html_orig/sass/lib/neat/grid/_row.scss deleted file mode 100755 index 4d913a9..0000000 --- a/html_orig/sass/lib/neat/grid/_row.scss +++ /dev/null @@ -1,52 +0,0 @@ -@charset "UTF-8"; - -/// Designates the element as a row of columns in the grid layout. It clears the floats on the element and sets its display property. Rows can't be nested, but there can be more than one row element—with different display properties—per layout. -/// -/// @param {String} $display [default] -/// Sets the display property of the element and the display context that will be used by its children. Can be `block` or `table`. -/// -/// @param {String} $direction [$default-layout-direction] -/// Sets the layout direction. Can be `LTR` (left-to-right) or `RTL` (right-to-left). -/// -/// @example scss - Usage -/// .element { -/// @include row(); -/// } -/// -/// @example css - CSS Output -/// .element { -/// *zoom: 1; -/// display: block; -/// } -/// -/// .element:before, .element:after { -/// content: " "; -/// display: table; -/// } -/// -/// .element:after { -/// clear: both; -/// } - -@mixin row($display: default, $direction: $default-layout-direction) { - @if $direction != $default-layout-direction { - @include -neat-warn("The $direction argument will be deprecated in future versions in favor of the direction(){...} mixin."); - } - - $layout-direction: $direction !global; - - @if $display != default { - @include -neat-warn("The $display argument will be deprecated in future versions in favor of the display(){...} mixin."); - } - - @if $display == table { - display: table; - @include fill-parent; - table-layout: fixed; - $container-display-table: true !global; - } @else { - @include clearfix; - display: block; - $container-display-table: false !global; - } -} diff --git a/html_orig/sass/lib/neat/grid/_shift.scss b/html_orig/sass/lib/neat/grid/_shift.scss deleted file mode 100755 index c0f24cd..0000000 --- a/html_orig/sass/lib/neat/grid/_shift.scss +++ /dev/null @@ -1,50 +0,0 @@ -@charset "UTF-8"; - -/// Translates an element horizontally by a number of columns. Positive arguments shift the element to the active layout direction, while negative ones shift it to the opposite direction. -/// -/// @param {Number (unitless)} $n-columns [1] -/// Number of columns by which the element shifts. -/// -/// @example scss - Usage -/// .element { -/// @include shift(-3); -/// } -/// -/// @example css - CSS output -/// .element { -/// margin-left: -25.58941%; -/// } - -@mixin shift($n-columns: 1) { - @include shift-in-context($n-columns); -} - -/// Translates an element horizontally by a number of columns, in a specific nesting context. -/// -/// @param {List} $shift -/// A list containing the number of columns to shift (`$columns`) and the number of columns of the parent element (`$container-columns`). -/// -/// The two values can be separated with any string such as `of`, `/`, etc. -/// -/// @example scss - Usage -/// .element { -/// @include shift(-3 of 6); -/// } -/// -/// @example css - CSS output -/// .element { -/// margin-left: -52.41458%; -/// } - -@mixin shift-in-context($shift: $columns of $container-columns) { - $n-columns: nth($shift, 1); - $parent-columns: container-shift($shift) !global; - - $direction: get-direction($layout-direction, $default-layout-direction); - $opposite-direction: get-opposite-direction($direction); - - margin-#{$opposite-direction}: $n-columns * flex-grid(1, $parent-columns) + $n-columns * flex-gutter($parent-columns); - - // Reset nesting context - $parent-columns: $grid-columns !global; -} diff --git a/html_orig/sass/lib/neat/grid/_span-columns.scss b/html_orig/sass/lib/neat/grid/_span-columns.scss deleted file mode 100755 index f128399..0000000 --- a/html_orig/sass/lib/neat/grid/_span-columns.scss +++ /dev/null @@ -1,94 +0,0 @@ -@charset "UTF-8"; - -/// Specifies the number of columns an element should span. If the selector is nested the number of columns of its parent element should be passed as an argument as well. -/// -/// @param {List} $span -/// A list containing `$columns`, the unitless number of columns the element spans (required), and `$container-columns`, the number of columns the parent element spans (optional). -/// -/// If only one value is passed, it is assumed that it's `$columns` and that that `$container-columns` is equal to `$grid-columns`, the total number of columns in the grid. -/// -/// The values can be separated with any string such as `of`, `/`, etc. -/// -/// `$columns` also accepts decimals for when it's necessary to break out of the standard grid. E.g. Passing `2.4` in a standard 12 column grid will divide the row into 5 columns. -/// -/// @param {String} $display [block] -/// Sets the display property of the element. By default it sets the display propert of the element to `block`. -/// -/// If passed `block-collapse`, it also removes the margin gutter by adding it to the element width. -/// -/// If passed `table`, it sets the display property to `table-cell` and calculates the width of the element without taking gutters into consideration. The result does not align with the block-based grid. -/// -/// @example scss - Usage -/// .element { -/// @include span-columns(6); -/// -/// .nested-element { -/// @include span-columns(2 of 6); -/// } -/// } -/// -/// @example css - CSS Output -/// .element { -/// display: block; -/// float: left; -/// margin-right: 2.35765%; -/// width: 48.82117%; -/// } -/// -/// .element:last-child { -/// margin-right: 0; -/// } -/// -/// .element .nested-element { -/// display: block; -/// float: left; -/// margin-right: 4.82916%; -/// width: 30.11389%; -/// } -/// -/// .element .nested-element:last-child { -/// margin-right: 0; -/// } - -@mixin span-columns($span: $columns of $container-columns, $display: block) { - $columns: nth($span, 1); - $container-columns: container-span($span); - - $parent-columns: get-parent-columns($container-columns) !global; - - $direction: get-direction($layout-direction, $default-layout-direction); - $opposite-direction: get-opposite-direction($direction); - - $display-table: is-display-table($container-display-table, $display); - - @if $display-table { - display: table-cell; - width: percentage($columns / $container-columns); - } @else { - float: #{$opposite-direction}; - - @if $display != no-display { - display: block; - } - - @if $display == collapse { - @include -neat-warn("The 'collapse' argument will be deprecated. Use 'block-collapse' instead."); - } - - @if $display == collapse or $display == block-collapse { - width: flex-grid($columns, $container-columns) + flex-gutter($container-columns); - - &:last-child { - width: flex-grid($columns, $container-columns); - } - - } @else { - margin-#{$direction}: flex-gutter($container-columns); - width: flex-grid($columns, $container-columns); - - &:last-child { - margin-#{$direction}: 0; - } - } - } -} diff --git a/html_orig/sass/lib/neat/grid/_to-deprecate.scss b/html_orig/sass/lib/neat/grid/_to-deprecate.scss deleted file mode 100755 index aeea079..0000000 --- a/html_orig/sass/lib/neat/grid/_to-deprecate.scss +++ /dev/null @@ -1,97 +0,0 @@ -@charset "UTF-8"; - -@mixin breakpoint($query:$feature $value $columns, $total-columns: $grid-columns) { - @include -neat-warn("The breakpoint() mixin was renamed to media() in Neat 1.0. Please update your project with the new syntax before the next version bump."); - - @if length($query) == 1 { - @media screen and ($default-feature: nth($query, 1)) { - $default-grid-columns: $grid-columns; - $grid-columns: $total-columns; - @content; - $grid-columns: $default-grid-columns; - } - } @else if length($query) == 2 { - @media screen and (nth($query, 1): nth($query, 2)) { - $default-grid-columns: $grid-columns; - $grid-columns: $total-columns; - @content; - $grid-columns: $default-grid-columns; - } - } @else if length($query) == 3 { - @media screen and (nth($query, 1): nth($query, 2)) { - $default-grid-columns: $grid-columns; - $grid-columns: nth($query, 3); - @content; - $grid-columns: $default-grid-columns; - } - } @else if length($query) == 4 { - @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { - $default-grid-columns: $grid-columns; - $grid-columns: $total-columns; - @content; - $grid-columns: $default-grid-columns; - } - } @else if length($query) == 5 { - @media screen and (nth($query, 1): nth($query, 2)) and (nth($query, 3): nth($query, 4)) { - $default-grid-columns: $grid-columns; - $grid-columns: nth($query, 5); - @content; - $grid-columns: $default-grid-columns; - } - } @else { - @include -neat-warn("Wrong number of arguments for breakpoint(). Read the documentation for more details."); - } -} - -@mixin nth-omega($nth, $display: block, $direction: default) { - @include -neat-warn("The nth-omega() mixin is deprecated. Please use omega() instead."); - @include omega($nth $display, $direction); -} - -/// Resets the active display property to `block`. Particularly useful when changing the display property in a single row. -/// -/// @example scss - Usage -/// .element { -/// @include row(table); -/// // Context changed to table display -/// } -/// -/// @include reset-display; -/// // Context is reset to block display - -@mixin reset-display { - $container-display-table: false !global; - @include -neat-warn("Resetting $display will be deprecated in future versions in favor of the display(){...} mixin."); -} - -/// Resets the active layout direction to the default value set in `$default-layout-direction`. Particularly useful when changing the layout direction in a single row. -/// -/// @example scss - Usage -/// .element { -/// @include row($direction: RTL); -/// // Context changed to right-to-left -/// } -/// -/// @include reset-layout-direction; -/// // Context is reset to left-to-right - -@mixin reset-layout-direction { - $layout-direction: $default-layout-direction !global; - @include -neat-warn("Resetting $direction will be deprecated in future versions in favor of the direction(){...} mixin."); -} - -/// Resets both the active layout direction and the active display property. -/// -/// @example scss - Usage -/// .element { -/// @include row(table, RTL); -/// // Context changed to table table and right-to-left -/// } -/// -/// @include reset-all; -/// // Context is reset to block display and left-to-right - -@mixin reset-all { - @include reset-display; - @include reset-layout-direction; -} diff --git a/html_orig/sass/lib/neat/grid/_visual-grid.scss b/html_orig/sass/lib/neat/grid/_visual-grid.scss deleted file mode 100755 index 1192d82..0000000 --- a/html_orig/sass/lib/neat/grid/_visual-grid.scss +++ /dev/null @@ -1,42 +0,0 @@ -@charset "UTF-8"; - -@mixin grid-column-gradient($values...) { - background-image: -webkit-linear-gradient(left, $values); - background-image: -moz-linear-gradient(left, $values); - background-image: -ms-linear-gradient(left, $values); - background-image: -o-linear-gradient(left, $values); - background-image: unquote("linear-gradient(to left, #{$values})"); -} - -@if $visual-grid == true or $visual-grid == yes { - body:before { - @include grid-column-gradient(gradient-stops($grid-columns)); - content: ""; - display: inline-block; - height: 100%; - left: 0; - margin: 0 auto; - max-width: $max-width; - opacity: $visual-grid-opacity; - pointer-events: none; - position: fixed; - right: 0; - width: 100%; - - @if $visual-grid-index == back { - z-index: -1; - } - - @else if $visual-grid-index == front { - z-index: 9999; - } - - @each $breakpoint in $visual-grid-breakpoints { - @if $breakpoint { - @include media($breakpoint) { - @include grid-column-gradient(gradient-stops($grid-columns)); - } - } - } - } -} diff --git a/html_orig/sass/lib/neat/settings/_disable-warnings.scss b/html_orig/sass/lib/neat/settings/_disable-warnings.scss deleted file mode 100755 index 3f9b92a..0000000 --- a/html_orig/sass/lib/neat/settings/_disable-warnings.scss +++ /dev/null @@ -1,13 +0,0 @@ -@charset "UTF-8"; - -/// Disable all deprecation warnings. Defaults to `false`. Set with a `!global` flag. -/// -/// @type Bool - -$disable-warnings: false !default; - -@mixin -neat-warn($message) { - @if $disable-warnings == false { - @warn "#{$message}"; - } -} diff --git a/html_orig/sass/lib/neat/settings/_grid.scss b/html_orig/sass/lib/neat/settings/_grid.scss deleted file mode 100755 index c4e55dc..0000000 --- a/html_orig/sass/lib/neat/settings/_grid.scss +++ /dev/null @@ -1,51 +0,0 @@ -@charset "UTF-8"; - -/// Sets the relative width of a single grid column. The unit used should be the same one used to define `$gutter`. To learn more about modular-scale() see [Bourbon docs](http://bourbon.io/docs/#modular-scale). Set with a `!global` flag. -/// -/// @type Number (Unit) - -$column: modular-scale(3, 1em, $golden) !default; - -/// Sets the relative width of a single grid gutter. The unit used should be the same one used to define `$column`. To learn more about modular-scale() see [Bourbon docs](http://bourbon.io/docs/#modular-scale). Set with the `!global` flag. -/// -/// @type Number (Unit) - -$gutter: modular-scale(1, 1em, $golden) !default; - -/// Sets the total number of columns in the grid. Its value can be overridden inside a media query using the `media()` mixin. Set with the `!global` flag. -/// -/// @type Number (Unitless) - -$grid-columns: 12 !default; - -/// Sets the max-width property of the element that includes `outer-container()`. To learn more about `em()` see [Bourbon docs](http://bourbon.io/docs/#px-to-em). Set with the `!global` flag. -/// -/// @type Number (Unit) -/// -$max-width: em(1088) !default; - -/// When set to true, it sets the box-sizing property of all elements to `border-box`. Set with a `!global` flag. -/// -/// @type Bool -/// -/// @example css - CSS Output -/// html { -/// box-sizing: border-box; } -/// -/// *, *::after, *::before { -/// box-sizing: inherit; -/// } - -$border-box-sizing: true !default; - -/// Sets the default [media feature](http://www.w3.org/TR/css3-mediaqueries/#media) that `media()` and `new-breakpoint()` revert to when only a breakpoint value is passed. Set with a `!global` flag. -/// -/// @type String - -$default-feature: min-width; // Default @media feature for the breakpoint() mixin - -///Sets the default layout direction of the grid. Can be `LTR` or `RTL`. Set with a `!global` flag. -/// -///@type String - -$default-layout-direction: LTR !default; diff --git a/html_orig/sass/lib/neat/settings/_visual-grid.scss b/html_orig/sass/lib/neat/settings/_visual-grid.scss deleted file mode 100755 index 9cd1815..0000000 --- a/html_orig/sass/lib/neat/settings/_visual-grid.scss +++ /dev/null @@ -1,27 +0,0 @@ -@charset "UTF-8"; - -/// Displays the visual grid when set to true. The overlaid grid may be few pixels off depending on the browser's rendering engine and pixel rounding algorithm. Set with the `!global` flag. -/// -/// @type Bool - -$visual-grid: false !default; - -/// Sets the visual grid color. Set with `!global` flag. -/// -/// @type Color - -$visual-grid-color: #eee !default; - -/// Sets the `z-index` property of the visual grid. Can be `back` (behind content) or `front` (in front of content). Set with `!global` flag. -/// -/// @type String - -$visual-grid-index: back !default; - -/// Sets the opacity property of the visual grid. Set with `!global` flag. -/// -/// @type Number (unitless) - -$visual-grid-opacity: 0.4 !default; - -$visual-grid-breakpoints: () !default; diff --git a/html_orig/sass/pages/_about.scss b/html_orig/sass/pages/_about.scss deleted file mode 100644 index 072d2f5..0000000 --- a/html_orig/sass/pages/_about.scss +++ /dev/null @@ -1,128 +0,0 @@ -.page-about { - .Box { - padding-left:dist(0); - padding-right:dist(0); - - a {font-weight: bold;} - } - - #logo { - float:right; - height: 130px; - } - - // mobile friendly - #logo2 { - max-width: 100%; - margin: 1rem; - } - - td { - white-space: normal; - } -} - -.page-help { - code { - background: rgba(33, 97, 109, 0.31); - border-radius: 1px; - padding: 0 2px; - } -} - -.colorprev { - margin-top: dist(-2); - margin-bottom: dist(-2); - span { - display: inline-block; - width: 2em; - padding: dist(-2) 0; - text-align: center; - } -} - -.Row table { - &,td,th{ - border: 1px solid #666; - } - - th,td { - white-space: normal; - } - - th { - background-color: rgba(255,255,255,.1); - } -} - -.ansiref { - &.w100 { - width: 100%; - - td:nth-child(1) { - width: 8em; - } - } -} - -.nomen { - width: 100%; - - code { - white-space: nowrap; - } - - td:last-child { - min-width: 15em; - } -} - -.tscroll { - overflow-x: auto; -} - -.charset { - line-height: 1; - - div { - display: inline-block; - width: 2.7em; - border: 1px solid #666; - height: 3em; - margin: 1px; - position: relative; - - span { - display: block; - position: absolute; - } - - span:nth-child(1) { - left: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; - } - - span:nth-child(2) { - right: .2em; - top: .2em; - height: 1em; - font-size: 85%; - color: #999; - } - - span:nth-child(3) { - width: 100%; - font-size: 105%; - text-align: center; - bottom: .4em; - font-family: $screen-stack; - } - - &.none { - opacity: .4; - } - } -} diff --git a/html_orig/sass/pages/_term.scss b/html_orig/sass/pages/_term.scss deleted file mode 100755 index 162e031..0000000 --- a/html_orig/sass/pages/_term.scss +++ /dev/null @@ -1,315 +0,0 @@ -body.term { - #content { - padding-left: 0; - padding-right: 0; - - h1 { - font-size: fsize(5); - @include media($phone) { - font-size: fsize(3); - } - } - - // longer duration to load everything in background nicely - transition: opacity 0.25s ease-in; - } -} - -#screen { - white-space: nowrap; - background: #111213; - padding: 6px; - display: inline-block; - border: 2px solid #3983CD; - - font-size: 20px; // some font heights cause visual glitches with some font renderers. This should be configurable. - font-family: $screen-stack; - - span { - white-space: pre; - } - - > span { - position: relative; - cursor: pointer; - - &::before { - content: " "; - } - - > span { - position:absolute; - left: 0; - z-index: 1; - } - } - - &.noselect { - @include noselect(); - } -} - -#action-buttons { - margin-top: 10px; - white-space: nowrap; - - button { - margin: 0 3px; - padding: 8px 5px; - min-width: 62px; - cursor: pointer; - font-weight: bold; - - &:focus { - outline: 0 none !important; - } - } -} - -#term-nav { - padding-top: 1.5em; - text-align: center; - - a { - text-decoration: none; - padding: 5px 5px; - border-radius: 2px; - position: relative; - - &, &:visited, &:link { - color: #336085; - } - - &:hover { - color: #5abfff; - background: #1b273c; - } - - &:active { - top: 1px; - } - - i::before { - display: inline; - } - - span { - margin-left: .2em; - } - - @include media($phone) { - span { - display: none; - } - - font-size: 130%; - padding: 6px; - } - } - - .icn-keyboard { - text-decoration: none; - font-size: 130%; // make it bigger - icon is too small to be recognizable - vertical-align: middle; - } -} - -#term-wrap { - text-align: center; -} - -// Dummy input field used to open android keyboard -#softkb-input { - position: absolute; - top: -9999px; -} - -#fu_modal { - align-items: flex-start; -} - -#fu_form { - //border: 1px solid #3983CD; - //border-radius: 2px; - //padding: 0 dist(0); - //background: #333e58; - padding: dist(0); - margin-top: 100px; // offset - - z-index: 1000; - - label { - width: 8em; - display: inline-block; - } - - input[type="number"], select { - width: 10em; - } - - textarea { - width: 100%; - min-height: 8em; - margin-top: dist(-1); - resize: vertical; - } - - .fu-buttons { - text-align: center; - padding: dist(-2); - margin-top: dist(-2); - border-radius: 3px; - } - - .fu-prog-box { - display: none; - } - - &.busy { - background: rgba($c-modal-bg, .3); - border-left-color: rgba($c-form-highlight, .3); - border-right-color: rgba($c-form-highlight, .3); - - .fu-content { - @include click-through; - opacity: .3; - } - - .fu-buttons { - text-align: left; - background: $c-modal-bg; - border: 1px solid $c-form-highlight; - } - - .fu-prog-box { - display: inline-block; - } - } -} - -// Tango -.theme-0 { - $term-colors: - #111213, #CC0000, #4E9A06, #C4A000, #3465A4, #75507B, #06989A, #D3D7CF, - #555753, #EF2929, #8AE234, #FCE94F, #729FCF, #AD7FA8, #34E2E2, #EEEEEC; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// Linux -.theme-1 { - $term-colors: - #000000, #aa0000, #00aa00, #aa5500, #0000aa, #aa00aa, #00aaaa, #aaaaaa, - #555555, #ff5555, #55ff55, #ffff55, #5555ff, #ff55ff, #55ffff, #ffffff; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// xterm -.theme-2 { - $term-colors: - #000000, #cd0000, #00cd00, #cdcd00, #0000ee, #cd00cd, #00cdcd, #e5e5e5, - #7f7f7f, #ff0000, #00ff00, #ffff00, #5c5cff, #ff00ff, #00ffff, #ffffff; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// rxvt -.theme-3 { - $term-colors: - #000000, #cd0000, #00cd00, #cdcd00, #0000cd, #cd00cd, #00cdcd, #faebd7, - #404040, #ff0000, #00ff00, #ffff00, #0000ff, #ff00ff, #00ffff, #ffffff; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// Ambience -.theme-4 { - $term-colors: - #2e3436, #cc0000, #4e9a06, #c4a000, #3465a4, #75507b, #06989a, #d3d7cf, - #555753, #ef2929, #8ae234, #fce94f, #729fcf, #ad7fa8, #34e2e2, #eeeeec; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// Solarized -.theme-5 { - $term-colors: - #073642, #dc322f, #859900, #b58900, #268bd2, #d33682, #2aa198, #eee8d5, - #002b36, #cb4b16, #586e75, #657b83, #839496, #6c71c4, #93a1a1, #fdf6e3; - @for $i from 1 through length($term-colors) { - $c: nth($term-colors, $i); - .fg#{$i - 1} { color: $c; } - .bg#{$i - 1} { background-color: $c; } - } -} - -// Attributes -.bold { - font-weight: bold !important; -} - -.faint span { // content of faint is wrapped in span - opacity: 0.6; -} - -.italic { - font-style: italic; -} - -.under { - text-decoration: underline; -} - -.strike { - text-decoration: line-through; -} - -.underline.strike { - text-decoration: underline line-through; -} - -.blink-hide .blink { - color: transparent; -} -// - -.Row.color-preview { - font-family: monospace; - font-size: 16pt; - display: block; - margin-bottom: 0; - - padding-left: $form-label-w; - - @include media($phone) { - padding-left: 0; - font-size: 14pt; - } - - .colorprev { - display:block; - margin: 0; - cursor: pointer; - } -} - -#color-example { - display: inline-block; - padding: 5px; -} diff --git a/html_orig/sass/pages/_wifi.scss b/html_orig/sass/pages/_wifi.scss deleted file mode 100755 index b71f8dc..0000000 --- a/html_orig/sass/pages/_wifi.scss +++ /dev/null @@ -1,186 +0,0 @@ -#ap-list { - column-count: 3; - column-gap: 0; - - @include media($tablet) { - column-count: 2; - } - - @include media($phone) { - column-count: 1; - } - - margin: 0 (- dist(-3)); -} - -#ap-loader, #ap-noscan, #ap-scan { - background: rgba(white, .1); - border-radius: 5px; - padding: dist(-2); - margin-bottom: dist(-2); - margin-top: dist(-2); - font-size: 110%; -} - -#ap-noscan { - font-weight: bold; -} - -#ap-box { - padding-top: dist(-2); - - label { - display: block; - color: white; - font-weight: bold; - margin-bottom: dist(-3); - } -} - -#psk-modal form { - @extend %form-row-spacing; - display: flex; - align-items: center; - margin: dist(-2); - - input[type=password] { - min-width: 5rem; - } -} - -#wificonfbox form { - @extend %form-row-spacing; -} - -%ap-inner { - cursor: pointer; - @include noselect; - - position: relative; - &:active { - left: 0; - top: 1px; - } - - border-radius: 3px; - color: #222; - - background: #afafaf; - transition: background-color 0.5s; - &:hover { background: white } - - display: flex; - - .rssi { - min-width: 2.5rem; - flex: 0 0 15%; - text-align: right; - - &:after { - padding-left: dist(-5); - content: '%'; - font-size: fsize(-1); - } - } - - .essid { - flex: 1 1 70%; - min-width: 0; - text-overflow: ellipsis; - overflow: hidden; - font-weight: bold; - } - - .auth { - flex: 0 0 15%; - } -} - -.AP { - // can't use margins inside a column - - break-inside: avoid-column; - max-width: 500px; - padding: dist(-3); - - &.selected .inner {//#70dfa3 - background: #42a6f9 !important; // override the hover effect #43de81 - cursor: default; - top: 0 !important; // no click effect - } - - .inner { - @extend %ap-inner; - - & > * { - padding: dist(-1); - @include nowrap; - } - } -} - -.AP-preview-nil { - padding: 8px; - border-radius: 5px; - border: 1px dashed #ddd; - width: 250px; - height: 94px; -} - -.AP-preview { - .wrap { - @extend %ap-inner; - - flex-direction: row; - background: #ddd !important; // override the hover effect #43de81 - cursor: default; - top: 0 !important; // no click effect - overflow: hidden; - - .inner { - display: flex; - flex-direction: column; - - & > * { - padding: dist(-1); - @include nowrap; - } - } - .forget { - align-self: stretch; - line-height: 100%; - padding: dist(-1); - border-left: 1px solid #bbb; - display: flex; - align-items: center; - - &, &:hover { - color: black; - text-decoration: none; - } - - font-size: 28px; - - &:hover { - background: #dc4a6a; - color: white; - border-left: 1px solid #666; - border-bottom-right-radius: 3px; - border-top-right-radius: 3px; - } - - &:active { - position: relative; - padding-top: calc(#{dist(-1)} + 1px); - } - } - - .essid, .passwd, .nopasswd { - padding-bottom: 0; - } - - .x-passwd { - font-family: monospace; - } - } -} diff --git a/html_orig/sass/utils/_background-tiling.scss b/html_orig/sass/utils/_background-tiling.scss deleted file mode 100755 index c1c5916..0000000 --- a/html_orig/sass/utils/_background-tiling.scss +++ /dev/null @@ -1,68 +0,0 @@ - -// Utilities for background tiling - -// Use a tile as background (w, h - size of time) -@mixin tile_xy($w, $h, $x, $y) { - background-position: (-$x*$w) (-$y*$h); -} - - -// Use a square tile as background (size - w & h of time) -@mixin tile($size, $x, $y) { - @include tile_xy($size, $size, $x, $y); -} - - -// Button with sprite-sheet -// A B -// B:hover B:hover -@mixin tile_btn_h($w, $h, $x) { - @include tile_xy($w, $h, $x, 0); - &:hover { - @include tile_xy($w, $h, $x, 1); - } -} - -// active the same as hover -@mixin tile_btn_h_act($w, $h, $x) { - @include tile_xy($w, $h, $x, 0); - &:hover, &.active { - @include tile_xy($w, $h, $x, 1); - } -} - - - -// Button with sprite-sheet -// A A:hover -// B B:hover -@mixin tile_btn_v($w, $h, $y) { - @include tile_xy($w, $h, 0, $y); - &:hover { - @include tile_xy($w, $h, 1, $y); - } -} - -// active the same as hover -@mixin tile_btn_v_act($w, $h, $y) { - @include tile_xy($w, $h, 0, $y); - &:hover, &.active { - @include tile_xy($w, $h, 1, $y); - } -} - -@mixin inset-shadow-top($w, $c) { - box-shadow: inset 0 $w ($w*2) (-$w) $c; -} - -@mixin inset-shadow-bottom($w, $c) { - box-shadow: inset 0 (-$w) ($w*2) (-$w) $c; -} - -@mixin inset-shadow-left($w, $c) { - box-shadow: inset $w 0 ($w*2) (-$w) $c; -} - -@mixin inset-shadow-right($w, $c) { - box-shadow: inset (-$w) 0 ($w*2) (-$w) $c; -} diff --git a/html_orig/sass/utils/_index.scss b/html_orig/sass/utils/_index.scss deleted file mode 100755 index 4e98733..0000000 --- a/html_orig/sass/utils/_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "background-tiling"; -@import "pointer"; -@import "misc"; diff --git a/html_orig/sass/utils/_misc.scss b/html_orig/sass/utils/_misc.scss deleted file mode 100755 index 91c0d77..0000000 --- a/html_orig/sass/utils/_misc.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Add a highlight for debugging -@mixin highlight($color) { - outline: 1px solid $color; - background: rgba($color, .05); - box-shadow: 0 0 2px 2px rgba($color, .2), inset 0 0 2px 2px rgba($color, .2); -} - -// Ellipsis, but for block elements -@mixin block-ellipsis($width: 100%) { - display: block; - max-width: $width; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - word-wrap: normal; -} - -// No margins, padding, borders -@mixin naked() { - border: 0 none; - margin: 0; - padding: 0; - text-decoration: none; -} - -@mixin translate($x, $y) { - @include transform(translate($x, $y)); -} - -// Disallow wrapping -@mixin nowrap() { - white-space: nowrap; - word-wrap: normal; -} diff --git a/html_orig/sass/utils/_pointer.scss b/html_orig/sass/utils/_pointer.scss deleted file mode 100755 index c6a9179..0000000 --- a/html_orig/sass/utils/_pointer.scss +++ /dev/null @@ -1,26 +0,0 @@ - -@mixin click-through() { - pointer-events: none; -} - - -// Disallow text selection -@mixin noselect() { - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - - -// Allow text selection -@mixin can-select() { - -webkit-user-select: text; - -khtml-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - - cursor: text; -} diff --git a/html_orig/server.sh b/html_orig/server.sh deleted file mode 100755 index 467ae0b..0000000 --- a/html_orig/server.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -xterm -e "php -S 0.0.0.0:2000" diff --git a/showmem.php b/showmem.php new file mode 100755 index 0000000..0137910 --- /dev/null +++ b/showmem.php @@ -0,0 +1,58 @@ +#!/bin/env php + $bv); + }); +} + +$all_sections = array_diff($all_sections, [ + '.comment', + '.xtensa.info', + '.xt.lit', + '.xt.prop', + '.literal', + '.irom0.literal', + '.data', +]); + +$widths = []; +foreach($all_sections as $k) { + $widths[$k] = max(8, strlen($k)); + printf("%".($widths[$k])."s ", $k); +} +echo "\n";//.str_repeat('-',array_sum($widths))."\n"; + +foreach ($table as $file => $map) { + foreach ($all_sections as $space) { + $b = isset($map[$space]) ? $map[$space] : 0; + printf("%".$widths[$space]."d ", $b); + } + echo " $file\n"; +} diff --git a/user/ansi_parser.c b/user/ansi_parser.c index 7cc8e9c..3f53c87 100644 --- a/user/ansi_parser.c +++ b/user/ansi_parser.c @@ -37,7 +37,7 @@ static const int ansi_en_main = 1; // Max nr of CSI parameters #define CSI_N_MAX 10 -#define STR_CHAR_MAX 64 +#define ANSI_STR_LEN 64 static volatile int cs = -1; static volatile bool inside_string = false; @@ -105,7 +105,7 @@ ansi_parser(char newchar) static int arg_ni; static int arg_cnt; static int arg[CSI_N_MAX]; - static char string_buffer[STR_CHAR_MAX]; + static char string_buffer[ANSI_STR_LEN]; static int str_ni; // This is used to detect timeout delay (time since last rx char) diff --git a/user/ansi_parser.rl b/user/ansi_parser.rl index c127f6c..2f74623 100644 --- a/user/ansi_parser.rl +++ b/user/ansi_parser.rl @@ -12,7 +12,7 @@ // Max nr of CSI parameters #define CSI_N_MAX 10 -#define STR_CHAR_MAX 64 +#define ANSI_STR_LEN 64 static volatile int cs = -1; static volatile bool inside_string = false; @@ -80,7 +80,7 @@ ansi_parser(char newchar) static int arg_ni; static int arg_cnt; static int arg[CSI_N_MAX]; - static char string_buffer[STR_CHAR_MAX]; + static char string_buffer[ANSI_STR_LEN]; static int str_ni; // This is used to detect timeout delay (time since last rx char) diff --git a/user/apars_csi.c b/user/apars_csi.c index e0de27d..a83e8ba 100644 --- a/user/apars_csi.c +++ b/user/apars_csi.c @@ -34,6 +34,7 @@ typedef struct { // Disambiguations static inline void switch_csi_Plain(CSI_Data *opts); static inline void switch_csi_NoLeadInterBang(CSI_Data *opts); +static inline void switch_csi_NoLeadInterSpace(CSI_Data *opts); static inline void switch_csi_LeadGreater(CSI_Data *opts); static inline void switch_csi_LeadQuest(CSI_Data *opts); static inline void switch_csi_LeadEquals(CSI_Data *opts); @@ -48,7 +49,8 @@ static inline void do_csi_set_private_option(CSI_Data *opts); /** * Show warning and dump context for invalid CSI */ -static void warn_bad_csi(void) +static void ICACHE_FLASH_ATTR +warn_bad_csi(void) { ansi_noimpl_r("Unknown CSI"); apars_show_context(); @@ -112,9 +114,9 @@ apars_handle_csi(char leadchar, const int *params, int count, char interchar, ch // switch_csi_NoLeadInterDollar(opts); // break; -// case ' ': -// switch_csi_NoLeadInterSpace(opts); -// break; + case ' ': + switch_csi_NoLeadInterSpace(&opts); + break; // case ',': // switch_csi_NoLeadInterComma(opts); @@ -242,8 +244,7 @@ switch_csi_Plain(CSI_Data *opts) break; case 'b': - // TODO repeat preceding graphic character n1 times - ansi_noimpl("Repeat char"); + screen_repeat_last_character(n1); return; // Set X @@ -409,6 +410,36 @@ switch_csi_NoLeadInterBang(CSI_Data *opts) } +/** + * CSI none Pm SP key + */ +static inline void ICACHE_FLASH_ATTR +switch_csi_NoLeadInterSpace(CSI_Data *opts) +{ + int n; + switch(opts->key) { + case 'q': + // DECSCUSR + // CSI Ps SP q + // Set cursor style (DECSCUSR, VT520). + // Ps = 0 -> blinking block. + // Ps = 1 -> blinking block (default). + // Ps = 2 -> steady block. + // Ps = 3 -> blinking underline. + // Ps = 4 -> steady underline. + // Ps = 5 -> blinking bar (xterm). + // Ps = 6 -> steady bar (xterm). + n = opts->n[0]; + if (n > 6) n = 1; // use default if bad value set + screen_cursor_shape((enum CursorShape) n); + break; + + default: + warn_bad_csi(); + } +} + + /** * CSI > Pm inter key */ @@ -456,27 +487,32 @@ switch_csi_LeadEquals(CSI_Data *opts) static inline void ICACHE_FLASH_ATTR switch_csi_LeadQuest(CSI_Data *opts) { + int n = 0; switch(opts->key) { case 's': // Save private attributes - ansi_noimpl("Save private attrs"); - apars_show_context(); // TODO priv attr s/r + for (int i = 0; i < opts->count; i++) { + n = opts->n[i]; + screen_save_private_opt(n); + } break; case 'r': // Restore private attributes - ansi_noimpl("Restore private attrs"); - apars_show_context(); // TODO priv attr s/r + for (int i = 0; i < opts->count; i++) { + n = opts->n[i]; + screen_restore_private_opt(n); + } break; case 'J': // Erase screen selectively // TODO selective erase - ansi_noimpl("Selective screen erase"); + switch_csi_Plain(opts); // ignore the ?, do normal erase break; case 'K': // Erase line selectively // TODO selective erase - ansi_noimpl("Selective line erase"); + switch_csi_Plain(opts); // ignore the ?, do normal erase break; case 'l': @@ -511,8 +547,36 @@ do_csi_sgr(CSI_Data *opts) // -- set color -- else if (n >= SGR_FG_START && n <= SGR_FG_END) screen_set_fg((Color) (n - SGR_FG_START)); // ANSI normal fg else if (n >= SGR_BG_START && n <= SGR_BG_END) screen_set_bg((Color) (n - SGR_BG_START)); // ANSI normal bg - else if (n == SGR_FG_DEFAULT) screen_set_fg(termconf_scratch.default_fg); // default fg - else if (n == SGR_BG_DEFAULT) screen_set_bg(termconf_scratch.default_bg); // default bg + // AIX bright colors -- + else if (n >= SGR_FG_BRT_START && n <= SGR_FG_BRT_END) screen_set_fg((Color) ((n - SGR_FG_BRT_START) + 8)); // AIX bright fg + else if (n >= SGR_BG_BRT_START && n <= SGR_BG_BRT_END) screen_set_bg((Color) ((n - SGR_BG_BRT_START) + 8)); // AIX bright bg + // reset color + else if (n == SGR_FG_DEFAULT) screen_set_fg(termconf_live.default_fg); // default fg + else if (n == SGR_BG_DEFAULT) screen_set_bg(termconf_live.default_bg); // default bg + // 256 colors + else if (n == SGR_FG_256 || n == SGR_BG_256) { + if (i < count-2) { + if (opts->n[i + 1] == 5) { + u8 color = (u8) opts->n[i + 2]; + bool fg = n == SGR_FG_256; + if (fg) { + screen_set_fg(color); + } else { + screen_set_bg(color); + } + } + else { + ansi_warn("SGR syntax err"); + apars_show_context(); + break; // abandon further + } + i += 2; + } else { + ansi_warn("SGR syntax err"); + apars_show_context(); + break; // abandon further + } + } // -- set attr -- else if (n == SGR_BOLD) screen_set_sgr(ATTR_BOLD, 1); else if (n == SGR_FAINT) screen_set_sgr(ATTR_FAINT, 1); @@ -522,17 +586,18 @@ do_csi_sgr(CSI_Data *opts) else if (n == SGR_STRIKE) screen_set_sgr(ATTR_STRIKE, 1); else if (n == SGR_FRAKTUR) screen_set_sgr(ATTR_FRAKTUR, 1); else if (n == SGR_INVERSE) screen_set_sgr_inverse(1); + else if (n == SGR_CONCEAL) screen_set_sgr_conceal(1); + else if (n == SGR_OVERLINE) screen_set_sgr(ATTR_OVERLINE, 1); // -- clear attr -- - else if (n == SGR_OFF(SGR_BOLD)) screen_set_sgr(ATTR_BOLD, 0); // can also mean "Double Underline" - else if (n == SGR_OFF(SGR_FAINT)) screen_set_sgr(ATTR_FAINT | ATTR_BOLD, 0); // "normal" - else if (n == SGR_OFF(SGR_ITALIC)) screen_set_sgr(ATTR_ITALIC | ATTR_FRAKTUR, 0); // there is no dedicated OFF code for Fraktur - else if (n == SGR_OFF(SGR_UNDERLINE)) screen_set_sgr(ATTR_UNDERLINE, 0); - else if (n == SGR_OFF(SGR_BLINK)) screen_set_sgr(ATTR_BLINK, 0); - else if (n == SGR_OFF(SGR_STRIKE)) screen_set_sgr(ATTR_STRIKE, 0); - else if (n == SGR_OFF(SGR_INVERSE)) screen_set_sgr_inverse(0); - // -- AIX bright colors -- - else if (n >= SGR_FG_BRT_START && n <= SGR_FG_BRT_END) screen_set_fg((Color) ((n - SGR_FG_BRT_START) + 8)); // AIX bright fg - else if (n >= SGR_BG_BRT_START && n <= SGR_BG_BRT_END) screen_set_bg((Color) ((n - SGR_BG_BRT_START) + 8)); // AIX bright bg + else if (n == SGR_NO_BOLD) screen_set_sgr(ATTR_BOLD, 0); // can also mean "Double Underline" + else if (n == SGR_NO_BOLD_FAINT) screen_set_sgr(ATTR_FAINT | ATTR_BOLD, 0); // "normal" + else if (n == SGR_NO_ITALIC_FRACTUR) screen_set_sgr(ATTR_ITALIC | ATTR_FRAKTUR, 0); // there is no dedicated OFF code for Fraktur + else if (n == SGR_NO_UNDERLINE) screen_set_sgr(ATTR_UNDERLINE, 0); + else if (n == SGR_NO_BLINK) screen_set_sgr(ATTR_BLINK, 0); + else if (n == SGR_NO_STRIKE) screen_set_sgr(ATTR_STRIKE, 0); + else if (n == SGR_NO_INVERSE) screen_set_sgr_inverse(0); + else if (n == SGR_NO_CONCEAL) screen_set_sgr_conceal(0); + else if (n == SGR_NO_OVERLINE) screen_set_sgr(ATTR_OVERLINE, 0); else { ansi_noimpl("SGR %d", n); } @@ -557,7 +622,7 @@ do_csi_set_option(CSI_Data *opts) } else if (n == 12) { // SRM is inverted, according to vt510 manual - termconf_scratch.loopback = !yn; + termconf_live.loopback = !yn; } else if (n == 20) { screen_set_newline_mode(yn); @@ -599,7 +664,8 @@ do_csi_set_private_option(CSI_Data *opts) } else if (n == 3) { // DECCOLM 132 column mode - not implemented due to RAM demands - ansi_noimpl("132col"); + // XXX 132col + // ansi_noimpl("132col"); // DECCOLM side effects as per // https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/deccolm-cls.html @@ -623,7 +689,7 @@ do_csi_set_private_option(CSI_Data *opts) // Key auto-repeat // We don't implement this currently, but it could be added // - discard repeated keypress events between keydown and keyup. - ansi_noimpl("Auto-repeat toggle"); + // XXX auto repeat toggle } else if (n == 9 || (n >= 1000 && n <= 1006) || n == 1015) { // 9 - X10 tracking @@ -643,23 +709,25 @@ do_csi_set_private_option(CSI_Data *opts) else if (n == 1006) mouse_tracking.encoding = yn ? MTE_SGR : MTE_SIMPLE; else if (n == 1015) mouse_tracking.encoding = yn ? MTE_URXVT : MTE_SIMPLE; - dbg("Mouse mode=%d, enc=%d, foctr=%d", + ansi_dbg("Mouse mode=%d, enc=%d, foctr=%d", mouse_tracking.mode, mouse_tracking.encoding, mouse_tracking.focus_tracking); } else if (n == 12) { - // TODO Cursor blink on/off - ansi_noimpl("Cursor blink toggle"); + screen_cursor_blink(yn); + } + else if (n == 25) { + screen_set_cursor_visible(yn); } else if (n == 40) { // allow/disallow 80->132 mode // not implemented because of RAM demands - ansi_noimpl("132col enable"); + // ansi_noimpl("132col enable"); } else if (n == 45) { // reverse wrap-around - ansi_noimpl("Reverse Wraparound"); + screen_reverse_wrap_enable(yn); } else if (n == 69) { // horizontal margins @@ -672,12 +740,7 @@ do_csi_set_private_option(CSI_Data *opts) } else if (n == 1048) { // same as DECSC - save/restore cursor with attributes - if (yn) { - screen_cursor_save(true); - } - else { - screen_cursor_restore(true); - } + screen_cursor_save(yn); } else if (n == 1049) { // save/restore cursor and screen and clear it @@ -694,17 +757,14 @@ do_csi_set_private_option(CSI_Data *opts) } else if (n == 2004) { // Bracketed paste mode - ansi_noimpl("Bracketed paste"); - } - else if (n == 25) { - screen_set_cursor_visible(yn); + screen_set_bracketed_paste(yn); } else if (n == 800) { // ESPTerm: Toggle display of buttons - termconf_scratch.show_buttons = yn; + termconf_live.show_buttons = yn; screen_notifyChange(CHANGE_CONTENT); // this info is included in the screen preamble } else if (n == 801) { // ESPTerm: Toggle display of config links - termconf_scratch.show_config_links = yn; + termconf_live.show_config_links = yn; screen_notifyChange(CHANGE_CONTENT); // this info is included in the screen preamble } else { @@ -729,14 +789,14 @@ do_csi_xterm_screen_cmd(CSI_Data *opts) case 18: // Report the size of the text area in characters. case 19: // Report the size of the screen in characters. - sprintf(resp_buf, "\033[8;%d;%dt", termconf_scratch.height, termconf_scratch.width); + sprintf(resp_buf, "\033[8;%d;%dt", termconf_live.height, termconf_live.width); apars_respond(resp_buf); break; case 20: // Report icon case 21: // Report title apars_respond("\033]l"); - apars_respond(termconf_scratch.title); + apars_respond(termconf_live.title); apars_respond("\033\\"); break; @@ -748,7 +808,7 @@ do_csi_xterm_screen_cmd(CSI_Data *opts) break; case 24: // Set Height only - screen_resize(opts->n[1], termconf_scratch.width); + screen_resize(opts->n[1], termconf_live.width); break; default: @@ -760,7 +820,7 @@ do_csi_xterm_screen_cmd(CSI_Data *opts) // data tables for the DECREPTPARM command response struct DECREPTPARM_parity { int parity; const char * msg; }; -static const struct DECREPTPARM_parity DECREPTPARM_parity_arr[] = { +static const struct DECREPTPARM_parity DECREPTPARM_parity_arr[] ESP_CONST_DATA = { {PARITY_NONE, "1"}, {PARITY_ODD, "4"}, {PARITY_EVEN, "5"}, @@ -768,7 +828,7 @@ static const struct DECREPTPARM_parity DECREPTPARM_parity_arr[] = { }; struct DECREPTPARM_baud { int baud; const char * msg; }; -static const struct DECREPTPARM_baud DECREPTPARM_baud_arr[] = { +static const struct DECREPTPARM_baud DECREPTPARM_baud_arr[] ESP_CONST_DATA = { {BIT_RATE_300, "48"}, {BIT_RATE_600, "56"}, {BIT_RATE_1200, "64"}, diff --git a/user/apars_dcs.c b/user/apars_dcs.c index a454d5e..5238582 100644 --- a/user/apars_dcs.c +++ b/user/apars_dcs.c @@ -47,12 +47,12 @@ apars_handle_dcs(const char *buffer) } else if (buffer[2] == 'r') { // DECSTBM - Query scrolling region - sprintf(buf, "\033P1$r%d;%dr\033\\", 1, termconf_scratch.height); // 1-80 TODO real extent of scrolling region + sprintf(buf, "\033P1$r%d;%dr\033\\", 1, termconf_live.height); // 1-80 TODO real extent of scrolling region apars_respond(buf); } else if (buffer[2] == 's') { // DECSLRM - Query horizontal margins - sprintf(buf, "\033P1$r%d;%ds\033\\", 1, termconf_scratch.width); // Can erase - TODO real extent of horiz margins if implemented + sprintf(buf, "\033P1$r%d;%ds\033\\", 1, termconf_live.width); // Can erase - TODO real extent of horiz margins if implemented apars_respond(buf); } else if (buffer[2] == 'm') { diff --git a/user/apars_osc.c b/user/apars_osc.c index 83ac913..df68d07 100644 --- a/user/apars_osc.c +++ b/user/apars_osc.c @@ -14,13 +14,14 @@ #include "apars_logging.h" #include "screen.h" #include "ansi_parser.h" +#include "cgi_sockets.h" /** * Helper function to parse incoming OSC (Operating System Control) * @param buffer - the OSC body (after OSC and before ST) */ void ICACHE_FLASH_ATTR -apars_handle_osc(const char *buffer) +apars_handle_osc(char *buffer) { int n = 0; char c = 0; @@ -36,13 +37,25 @@ apars_handle_osc(const char *buffer) // Do something with the data string and number // (based on xterm manpage) if (n == 0 || n == 2) { + // Window title (or "icon name" in Xterm) screen_set_title(buffer); } - else if (n >= 81 && n <= 85) { // ESPTerm: action button label + else if (n == 4) { + // XXX setting RGB color, ignore + } + else if (n == 9) { + // iTerm2-style "growl" notifications + buffer--; + buffer[0] = 'G'; + notify_growl(buffer); + } + else if (n >= 81 && n <= 85) { + // ESPTerm: action button label screen_set_button_text(n - 80, buffer); } - else if (n >= 91 && n <= 95) { // ESPTerm: action button text - strncpy(termconf_scratch.btn_msg[n - 91], buffer, TERM_BTN_MSG_LEN); + else if (n >= 91 && n <= 95) { + // ESPTerm: action button message + strncpy(termconf_live.btn_msg[n - 91], buffer, TERM_BTN_MSG_LEN); } else { ansi_noimpl("OSC %d ; %s ST", n, buffer); diff --git a/user/apars_osc.h b/user/apars_osc.h index cd2c96f..b2c6253 100644 --- a/user/apars_osc.h +++ b/user/apars_osc.h @@ -5,6 +5,6 @@ #ifndef ESP_VT100_FIRMWARE_APARS_OSC_H #define ESP_VT100_FIRMWARE_APARS_OSC_H -void apars_handle_osc(const char *buffer); +void apars_handle_osc(char *buffer); #endif //ESP_VT100_FIRMWARE_APARS_OSC_H diff --git a/user/apars_short.c b/user/apars_short.c index b9bace9..64ae3ab 100644 --- a/user/apars_short.c +++ b/user/apars_short.c @@ -139,7 +139,7 @@ void ICACHE_FLASH_ATTR apars_handle_short_cmd(char c) break; case 'F': // bottom left - screen_cursor_set(termconf_scratch.height-1, 0); + screen_cursor_set(termconf_live.height-1, 0); break; case 'D': // move cursor down, scroll screen up if needed diff --git a/user/apars_string.c b/user/apars_string.c index 08de067..dbd2382 100644 --- a/user/apars_string.c +++ b/user/apars_string.c @@ -21,7 +21,7 @@ // ----- Generic String cmd - disambiguation ----- void ICACHE_FLASH_ATTR -apars_handle_string_cmd(char leadchar, const char *buffer) +apars_handle_string_cmd(char leadchar, char *buffer) { switch (leadchar) { case 'k': // ESC k TITLE ST (defined in GNU screen manpage) diff --git a/user/apars_string.h b/user/apars_string.h index 1305905..da566b1 100644 --- a/user/apars_string.h +++ b/user/apars_string.h @@ -5,6 +5,7 @@ #ifndef ESP_VT100_FIRMWARE_APARS_STRING_H #define ESP_VT100_FIRMWARE_APARS_STRING_H -void apars_handle_string_cmd(char leadchar, const char *buffer); +// not const char so some edits can be made when processing +void apars_handle_string_cmd(char leadchar, char *buffer); #endif //ESP_VT100_FIRMWARE_APARS_STRING_H diff --git a/user/apars_utf8.c b/user/apars_utf8.c index a01a16b..b3f502c 100644 --- a/user/apars_utf8.c +++ b/user/apars_utf8.c @@ -37,7 +37,7 @@ apars_handle_plainchar(char c) if (utf_i == 0) { // start if (c == 192 || c == 193 || c >= 245) { - // forbidden codes + // forbidden codes (would be an overlong sequence) goto fail; } diff --git a/user/cgi_logging.h b/user/cgi_logging.h new file mode 100644 index 0000000..db1cf2b --- /dev/null +++ b/user/cgi_logging.h @@ -0,0 +1,18 @@ +// +// Created by MightyPork on 2017/09/10. +// + +#ifndef ESPTERM_CGI_LOGGING_H +#define ESPTERM_CGI_LOGGING_H + +#if DEBUG_CGI +#define cgi_warn warn +#define cgi_dbg dbg +#define cgi_info info +#else +#define cgi_warn(fmt, ...) +#define cgi_dbg(fmt, ...) +#define cgi_info(fmt, ...) +#endif + +#endif //ESPTERM_CGI_LOGGING_H diff --git a/user/cgi_main.c b/user/cgi_main.c index 32a885d..bb8bbfb 100644 --- a/user/cgi_main.c +++ b/user/cgi_main.c @@ -33,32 +33,12 @@ httpd_cgi_state ICACHE_FLASH_ATTR tplScreen(HttpdConnData *connData, char *token sprintf(buff, "%d", termconf->theme); tplSend(connData, buff, -1); } - - return HTTPD_CGI_DONE; -} - -httpd_cgi_state ICACHE_FLASH_ATTR -cgiTermInitialImage(HttpdConnData *connData) -{ - const int bufsiz = 512; - char buff[bufsiz]; - - if (connData->conn == NULL) { - //Connection aborted. Clean up. - // Release data object - screenSerializeToBuffer(NULL, 0, &connData->cgiData); - return HTTPD_CGI_DONE; - } - - if (connData->cgiData == NULL) { - httpdStartResponse(connData, 200); - httpdHeader(connData, "Content-Type", "application/octet-stream"); - httpdEndHeaders(connData); + else if (streq(token, "want_all_fn")) { + sprintf(buff, "%d", termconf->want_all_fn); + tplSend(connData, buff, -1); } - httpd_cgi_state cont = screenSerializeToBuffer(buff, bufsiz, &connData->cgiData); - httpdSend(connData, buff, -1); // no encode - return cont; + return HTTPD_CGI_DONE; } /** "About" page */ @@ -82,9 +62,18 @@ tplAbout(HttpdConnData *connData, char *token, void **arg) else if (streq(token, "vers_sdk")) { tplSend(connData, STR(ESP_SDK_VERSION), -1); } + else if (streq(token, "hash_backend")) { + tplSend(connData, GIT_HASH_BACKEND, -1); + } + else if (streq(token, "hash_frontend")) { + tplSend(connData, GIT_HASH_FRONTEND, -1); + } else if (streq(token, "githubrepo")) { tplSend(connData, TERMINAL_GITHUB_REPO, -1); } + else if (streq(token, "githubrepo_front")) { + tplSend(connData, TERMINAL_GITHUB_REPO_FRONT, -1); + } return HTTPD_CGI_DONE; } diff --git a/user/cgi_network.c b/user/cgi_network.c index 66bed17..b87dd96 100644 --- a/user/cgi_network.c +++ b/user/cgi_network.c @@ -8,6 +8,7 @@ configuring the network settings #include "wifimgr.h" #include "persist.h" #include "helpers.h" +#include "cgi_logging.h" #define SET_REDIR_SUC "/cfg/network" #define SET_REDIR_ERR SET_REDIR_SUC"?err=" @@ -43,7 +44,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) // ---- AP DHCP server lease time ---- if (GET_ARG("ap_dhcp_time")) { - dbg("Setting DHCP lease time to: %s min.", buff); + cgi_dbg("Setting DHCP lease time to: %s min.", buff); int min = atoi(buff); if (min >= 1 && min <= 2880) { if (wificonf->ap_dhcp_time != min) { @@ -51,7 +52,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Lease time %s out of allowed range 1-2880.", buff); + cgi_warn("Lease time %s out of allowed range 1-2880.", buff); redir_url += sprintf(redir_url, "ap_dhcp_time,"); } } @@ -59,7 +60,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) // ---- AP DHCP start and end IP ---- if (GET_ARG("ap_dhcp_start")) { - dbg("Setting DHCP range start IP to: \"%s\"", buff); + cgi_dbg("Setting DHCP range start IP to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->ap_dhcp_range.start_ip.addr != ip) { @@ -67,13 +68,13 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Bad IP: %s", buff); + cgi_warn("Bad IP: %s", buff); redir_url += sprintf(redir_url, "ap_dhcp_start,"); } } if (GET_ARG("ap_dhcp_end")) { - dbg("Setting DHCP range end IP to: \"%s\"", buff); + cgi_dbg("Setting DHCP range end IP to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->ap_dhcp_range.end_ip.addr != ip) { @@ -81,7 +82,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Bad IP: %s", buff); + cgi_warn("Bad IP: %s", buff); redir_url += sprintf(redir_url, "ap_dhcp_end,"); } } @@ -89,7 +90,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) // ---- AP local address & config ---- if (GET_ARG("ap_addr_ip")) { - dbg("Setting AP local IP to: \"%s\"", buff); + cgi_dbg("Setting AP local IP to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->ap_addr.ip.addr != ip) { @@ -98,13 +99,13 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Bad IP: %s", buff); + cgi_warn("Bad IP: %s", buff); redir_url += sprintf(redir_url, "ap_addr_ip,"); } } if (GET_ARG("ap_addr_mask")) { - dbg("Setting AP local IP netmask to: \"%s\"", buff); + cgi_dbg("Setting AP local IP netmask to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->ap_addr.netmask.addr != ip) { @@ -114,7 +115,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Bad IP mask: %s", buff); + cgi_warn("Bad IP mask: %s", buff); redir_url += sprintf(redir_url, "ap_addr_mask,"); } } @@ -123,7 +124,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) // DHCP enable / disable (disable means static IP is enabled) if (GET_ARG("sta_dhcp_enable")) { - dbg("DHCP enable = %s", buff); + cgi_dbg("DHCP enable = %s", buff); int enable = atoi(buff); if (wificonf->sta_dhcp_enable != enable) { wificonf->sta_dhcp_enable = (bool)enable; @@ -134,7 +135,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) // ---- Station IP config (Static IP) ---- if (GET_ARG("sta_addr_ip")) { - dbg("Setting Station mode static IP to: \"%s\"", buff); + cgi_dbg("Setting Station mode static IP to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->sta_addr.ip.addr != ip) { @@ -142,13 +143,13 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.sta = true; } } else { - warn("Bad IP: %s", buff); + cgi_warn("Bad IP: %s", buff); redir_url += sprintf(redir_url, "sta_addr_ip,"); } } if (GET_ARG("sta_addr_mask")) { - dbg("Setting Station mode static IP netmask to: \"%s\"", buff); + cgi_dbg("Setting Station mode static IP netmask to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0 && ip != 0xFFFFFFFFUL) { if (wificonf->sta_addr.netmask.addr != ip) { @@ -156,13 +157,13 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.sta = true; } } else { - warn("Bad IP mask: %s", buff); + cgi_warn("Bad IP mask: %s", buff); redir_url += sprintf(redir_url, "sta_addr_mask,"); } } if (GET_ARG("sta_addr_gw")) { - dbg("Setting Station mode static IP default gateway to: \"%s\"", buff); + cgi_dbg("Setting Station mode static IP default gateway to: \"%s\"", buff); u32 ip = ipaddr_addr(buff); if (ip != 0) { if (wificonf->sta_addr.gw.addr != ip) { @@ -170,14 +171,14 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) wifi_change_flags.sta = true; } } else { - warn("Bad gw IP: %s", buff); + cgi_warn("Bad gw IP: %s", buff); redir_url += sprintf(redir_url, "sta_addr_gw,"); } } if (redir_url_buf[strlen(SET_REDIR_ERR)] == 0) { // All was OK - info("Set network params - success, applying in 1000 ms"); + cgi_info("Set network params - success, applying in 1000 ms"); // Settings are applied only if all was OK persist_store(); @@ -190,7 +191,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiNetworkSetParams(HttpdConnData *connData) httpdRedirect(connData, SET_REDIR_SUC); } else { - warn("Some WiFi settings did not validate, asking for correction"); + cgi_warn("Some WiFi settings did not validate, asking for correction"); // Some errors, appended to the URL as ?err= httpdRedirect(connData, redir_url_buf); } diff --git a/user/cgi_persist.c b/user/cgi_persist.c index 92bfefd..4828b8a 100644 --- a/user/cgi_persist.c +++ b/user/cgi_persist.c @@ -6,6 +6,7 @@ Cgi/template routines for configuring non-wifi settings #include "cgi_persist.h" #include "persist.h" #include "helpers.h" +#include "cgi_logging.h" #define SET_REDIR_SUC "/cfg/admin" @@ -29,9 +30,9 @@ cgiPersistWriteDefaults(HttpdConnData *connData) // width and height must always go together so we can do max size validation if (GET_ARG("pw")) { - dbg("Entered password for admin: %s", buff); + cgi_dbg("Entered password for admin: %s", buff); if (verify_admin_pw(buff)) { - dbg("pw is OK"); + cgi_dbg("pw is OK"); persist_set_as_default(); diff --git a/user/cgi_sockets.c b/user/cgi_sockets.c index 2e6d8bc..6fcf87a 100644 --- a/user/cgi_sockets.c +++ b/user/cgi_sockets.c @@ -8,6 +8,7 @@ #include "ansi_parser.h" #include "jstring.h" #include "uart_driver.h" +#include "cgi_logging.h" // Heartbeat interval in ms #define HB_TIME 1000 @@ -47,6 +48,7 @@ notifyCooldownTimCb(void *arg) static void ICACHE_FLASH_ATTR notifyContentTimCb(void *arg) { + Websock *ws = arg; void *data = NULL; int max_bl, total_bl; char sock_buff[SOCK_BUF_LEN]; @@ -65,8 +67,14 @@ notifyContentTimCb(void *arg) int flg = 0; if (cont == HTTPD_CGI_MORE) flg |= WEBSOCK_FLAG_MORE; if (i > 0) flg |= WEBSOCK_FLAG_CONT; - cgiWebsockBroadcast(URL_WS_UPDATE, sock_buff, (int) strlen(sock_buff), flg); + if (ws) { + cgiWebsocketSend(ws, sock_buff, (int) strlen(sock_buff), flg); + } else { + cgiWebsockBroadcast(URL_WS_UPDATE, sock_buff, (int) strlen(sock_buff), flg); + } if (cont == HTTPD_CGI_DONE) break; + + system_soft_wdt_feed(); } // cleanup @@ -112,6 +120,16 @@ send_beep(void) } +/** Pop-up notification (from iTerm2) */ +void ICACHE_FLASH_ATTR +notify_growl(char *msg) +{ + // TODO via timer... + // here's some potential for a race error with the other broadcast functions :C + cgiWebsockBroadcast(URL_WS_UPDATE, msg, (int) strlen(msg), 0); +} + + /** * Broadcast screen state to sockets. * This is a callback for the Screen module, @@ -226,7 +244,7 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags) switch (c) { case 's': // pass string verbatim - if (termconf_scratch.loopback) { + if (termconf_live.loopback) { for (int i = 1; i < len; i++) { ansi_parser(data[i]); } @@ -247,10 +265,16 @@ void ICACHE_FLASH_ATTR updateSockRx(Websock *ws, char *data, int len, int flags) // action button press btnNum = (u8) (data[1]); if (btnNum > 0 && btnNum < 10) { - UART_SendAsync(termconf_scratch.btn_msg[btnNum-1], -1); + UART_SendAsync(termconf_live.btn_msg[btnNum-1], -1); } break; + case 'i': + // requests initial load + ws_dbg("Client requests initial load"); + notifyContentTimCb(ws); + break; + case 'm': case 'p': case 'r': diff --git a/user/cgi_sockets.h b/user/cgi_sockets.h index 83998cf..3d3a711 100644 --- a/user/cgi_sockets.h +++ b/user/cgi_sockets.h @@ -12,6 +12,9 @@ void notify_empty_txbuf(void); void send_beep(void); +/** open pop-up notification */ +void notify_growl(char *msg); + // defined in the makefile #if DEBUG_INPUT #define ws_warn warn diff --git a/user/cgi_system.c b/user/cgi_system.c index ee45b6b..1b70289 100755 --- a/user/cgi_system.c +++ b/user/cgi_system.c @@ -8,6 +8,7 @@ #include "syscfg.h" #include "uart_driver.h" #include "ansi_parser.h" +#include "cgi_logging.h" #define SET_REDIR_SUC "/cfg/system" #define SET_REDIR_ERR SET_REDIR_SUC"?err=" @@ -90,7 +91,7 @@ cgiSystemCfgSetParams(HttpdConnData *connData) } if (GET_ARG("uart_baud")) { - dbg("Baud rate: %s", buff); + cgi_dbg("Baud rate: %s", buff); int baud = atoi(buff); if (baud == BIT_RATE_300 || baud == BIT_RATE_600 || @@ -110,43 +111,43 @@ cgiSystemCfgSetParams(HttpdConnData *connData) baud == BIT_RATE_3686400) { sysconf->uart_baudrate = (u32) baud; } else { - warn("Bad baud rate %s", buff); + cgi_warn("Bad baud rate %s", buff); redir_url += sprintf(redir_url, "uart_baud,"); } } if (GET_ARG("uart_parity")) { - dbg("Parity: %s", buff); + cgi_dbg("Parity: %s", buff); int parity = atoi(buff); if (parity >= 0 && parity <= 2) { sysconf->uart_parity = (UartParityMode) parity; } else { - warn("Bad parity %s", buff); + cgi_warn("Bad parity %s", buff); redir_url += sprintf(redir_url, "uart_parity,"); } } if (GET_ARG("uart_stopbits")) { - dbg("Stop bits: %s", buff); + cgi_dbg("Stop bits: %s", buff); int stopbits = atoi(buff); if (stopbits >= 1 && stopbits <= 3) { sysconf->uart_stopbits = (UartStopBitsNum) stopbits; } else { - warn("Bad stopbits %s", buff); + cgi_warn("Bad stopbits %s", buff); redir_url += sprintf(redir_url, "uart_stopbits,"); } } if (redir_url_buf[strlen(SET_REDIR_ERR)] == 0) { // All was OK - info("Set system params - success, saving..."); + cgi_info("Set system params - success, saving..."); sysconf_apply_settings(); persist_store(); httpdRedirect(connData, SET_REDIR_SUC); } else { - warn("Some settings did not validate, asking for correction"); + cgi_warn("Some settings did not validate, asking for correction"); // Some errors, appended to the URL as ?err= httpdRedirect(connData, redir_url_buf); } diff --git a/user/cgi_term_cfg.c b/user/cgi_term_cfg.c index 6b8ec41..b902844 100644 --- a/user/cgi_term_cfg.c +++ b/user/cgi_term_cfg.c @@ -8,6 +8,7 @@ Cgi/template routines for configuring non-wifi settings #include "persist.h" #include "screen.h" #include "helpers.h" +#include "cgi_logging.h" #define SET_REDIR_SUC "/cfg/term" #define SET_REDIR_ERR SET_REDIR_SUC"?err=" @@ -21,6 +22,7 @@ cgiTermCfgSetParams(HttpdConnData *connData) char buff[50]; char redir_url_buf[100]; int32 n, w, h; + bool notify_screen_content = 0, notify_screen_labels = 0; bool shall_clear_screen = false; @@ -35,40 +37,40 @@ cgiTermCfgSetParams(HttpdConnData *connData) // width and height must always go together so we can do max size validation if (GET_ARG("term_width")) { - dbg("Default screen width: %s", buff); + cgi_dbg("Default screen width: %s", buff); w = atoi(buff); if (w > 1) { if (GET_ARG("term_height")) { - dbg("Default screen height: %s", buff); + cgi_dbg("Default screen height: %s", buff); h = atoi(buff); if (h > 1) { if (w * h <= MAX_SCREEN_SIZE) { if (termconf->width != w || termconf->height != h) { termconf->width = w; termconf->height = h; - shall_clear_screen = true; + shall_clear_screen = true; // this causes a notify } } else { - warn("Bad dimensions: %d x %d (total %d)", w, h, w*h); + cgi_warn("Bad dimensions: %d x %d (total %d)", w, h, w*h); redir_url += sprintf(redir_url, "term_width,term_height,"); } } else { - warn("Bad height: \"%s\"", buff); + cgi_warn("Bad height: \"%s\"", buff); redir_url += sprintf(redir_url, "term_width,"); } } else { - warn("Missing height arg!"); + cgi_warn("Missing height arg!"); // this wont happen normally when the form is used redir_url += sprintf(redir_url, "term_width,term_height,"); } } else { - warn("Bad width: \"%s\"", buff); + cgi_warn("Bad width: \"%s\"", buff); redir_url += sprintf(redir_url, "term_width,"); } } if (GET_ARG("default_bg")) { - dbg("Screen default BG: %s", buff); + cgi_dbg("Screen default BG: %s", buff); n = atoi(buff); if (n >= 0 && n < 16) { if (termconf->default_bg != n) { @@ -76,108 +78,139 @@ cgiTermCfgSetParams(HttpdConnData *connData) shall_clear_screen = true; } } else { - warn("Bad color %s", buff); + cgi_warn("Bad color %s", buff); redir_url += sprintf(redir_url, "default_bg,"); } } + if (GET_ARG("default_fg")) { + cgi_dbg("Screen default FG: %s", buff); + n = atoi(buff); + if (n >= 0 && n < 16) { + if (termconf->default_fg != n) { + termconf->default_fg = (u8) n; + shall_clear_screen = true; + } + } else { + cgi_warn("Bad color %s", buff); + redir_url += sprintf(redir_url, "default_fg,"); + } + } + if (GET_ARG("parser_tout_ms")) { - dbg("Parser timeout: %s ms", buff); + cgi_dbg("Parser timeout: %s ms", buff); n = atoi(buff); if (n >= 0) { termconf->parser_tout_ms = n; } else { - warn("Bad parser timeout %s", buff); + cgi_warn("Bad parser timeout %s", buff); redir_url += sprintf(redir_url, "parser_tout_ms,"); } } if (GET_ARG("display_tout_ms")) { - dbg("Display update idle timeout: %s ms", buff); + cgi_dbg("Display update idle timeout: %s ms", buff); n = atoi(buff); if (n > 0) { termconf->display_tout_ms = n; } else { - warn("Bad update timeout %s", buff); + cgi_warn("Bad update timeout %s", buff); redir_url += sprintf(redir_url, "display_tout_ms,"); } } if (GET_ARG("display_cooldown_ms")) { - dbg("Display update cooldown: %s ms", buff); + cgi_dbg("Display update cooldown: %s ms", buff); n = atoi(buff); if (n > 0) { termconf->display_cooldown_ms = n; } else { - warn("Bad cooldown %s", buff); + cgi_warn("Bad cooldown %s", buff); redir_url += sprintf(redir_url, "display_cooldown_ms,"); } } if (GET_ARG("fn_alt_mode")) { - dbg("FN alt mode: %s", buff); + cgi_dbg("FN alt mode: %s", buff); n = atoi(buff); termconf->fn_alt_mode = (bool)n; + notify_screen_content = true; + } + + if (GET_ARG("want_all_fn")) { + cgi_dbg("AllFN mode: %s", buff); + n = atoi(buff); + termconf->want_all_fn = (bool)n; + } + + if (GET_ARG("crlf_mode")) { + cgi_dbg("CRLF mode: %s", buff); + n = atoi(buff); + termconf->crlf_mode = (bool)n; + notify_screen_content = true; } if (GET_ARG("show_buttons")) { - dbg("Show buttons: %s", buff); + cgi_dbg("Show buttons: %s", buff); n = atoi(buff); termconf->show_buttons = (bool)n; + notify_screen_content = true; } if (GET_ARG("show_config_links")) { - dbg("Show config links: %s", buff); + cgi_dbg("Show config links: %s", buff); n = atoi(buff); termconf->show_config_links = (bool)n; + notify_screen_content = true; } if (GET_ARG("loopback")) { - dbg("Loopback: %s", buff); + cgi_dbg("Loopback: %s", buff); n = atoi(buff); termconf->loopback = (bool)n; } - if (GET_ARG("default_fg")) { - dbg("Screen default FG: %s", buff); + if (GET_ARG("theme")) { + cgi_dbg("Screen color theme: %s", buff); n = atoi(buff); - if (n >= 0 && n < 16) { - if (termconf->default_fg != n) { - termconf->default_fg = (u8) n; - shall_clear_screen = true; - } + if (n >= 0 && n <= 5) { // ALWAYS ADJUST WHEN ADDING NEW THEME! + termconf->theme = (u8) n; + // this can't be notified, page must reload. } else { - warn("Bad color %s", buff); - redir_url += sprintf(redir_url, "default_fg,"); + cgi_warn("Bad theme num: %s", buff); + redir_url += sprintf(redir_url, "theme,"); } } - if (GET_ARG("theme")) { - dbg("Screen color theme: %s", buff); + if (GET_ARG("cursor_shape")) { + cgi_dbg("Cursor shape: %s", buff); n = atoi(buff); - if (n >= 0 && n <= 5) { // ALWAYS ADJUST WHEN ADDING NEW THEME! - termconf->theme = (u8) n; + if (n >= 0 && n <= 6 && n != 1) { + termconf->cursor_shape = (enum CursorShape) n; + notify_screen_content = true; } else { - warn("Bad theme num: %s", buff); - redir_url += sprintf(redir_url, "theme,"); + cgi_warn("Bad cursor_shape num: %s", buff); + redir_url += sprintf(redir_url, "cursor_shape,"); } } if (GET_ARG("term_title")) { - dbg("Terminal title default text: \"%s\"", buff); + cgi_dbg("Terminal title default text: \"%s\"", buff); strncpy_safe(termconf->title, buff, 64); // ATTN those must match the values in + notify_screen_labels = true; } for (int btn_i = 1; btn_i <= TERM_BTN_COUNT; btn_i++) { sprintf(buff, "btn%d", btn_i); if (GET_ARG(buff)) { - dbg("Button%d default text: \"%s\"", btn_i, buff); + cgi_dbg("Button%d default text: \"%s\"", btn_i, buff); strncpy_safe(termconf->btn[btn_i-1], buff, TERM_BTN_LEN); + notify_screen_labels = true; } sprintf(buff, "bm%d", btn_i); if (GET_ARG(buff)) { - dbg("Button%d message (ASCII): \"%s\"", btn_i, buff); + cgi_dbg("Button%d message (ASCII): \"%s\"", btn_i, buff); // parse: comma,space or semicolon separated decimal values of ASCII codes char c; @@ -191,18 +224,18 @@ cgiTermCfgSetParams(HttpdConnData *connData) if(lastsp) continue; if (acu==0 || acu>255) { - warn("Bad value! %d", acu); + cgi_warn("Bad value! %d", acu); redir_url += sprintf(redir_url, "bm%d,", btn_i); break; } if (char_i >= TERM_BTN_MSG_LEN-1) { - warn("Too long! %d", acu); + cgi_warn("Too long! %d", acu); redir_url += sprintf(redir_url, "bm%d,", btn_i); break; } - dbg("acu %d", acu); + cgi_dbg("acu %d", acu); buff_bm[char_i++] = (char)acu; // prepare for next char @@ -213,20 +246,20 @@ cgiTermCfgSetParams(HttpdConnData *connData) acu *= 10; acu += c - '0'; } else { - warn("Bad syntax!"); + cgi_warn("Bad syntax!"); redir_url += sprintf(redir_url, "bm%d,", btn_i); break; } } if (lastsp && char_i == 0) { - warn("Required!"); + cgi_warn("Required!"); redir_url += sprintf(redir_url, "bm%d,", btn_i); } if (!lastsp) { buff_bm[char_i++] = (char)acu; } buff_bm[char_i] = 0; - dbg("%s, chari = %d", buff_bm, char_i); + cgi_dbg("%s, chari = %d", buff_bm, char_i); strncpy(termconf->btn_msg[btn_i-1], buff_bm, TERM_BTN_MSG_LEN); } @@ -244,9 +277,17 @@ cgiTermCfgSetParams(HttpdConnData *connData) terminal_apply_settings_noclear(); } + if (notify_screen_content) { + screen_notifyChange(CHANGE_CONTENT); + } + + if (notify_screen_labels) { + screen_notifyChange(CHANGE_LABELS); + } + httpdRedirect(connData, SET_REDIR_SUC); } else { - warn("Some settings did not validate, asking for correction"); + cgi_warn("Some settings did not validate, asking for correction"); // Some errors, appended to the URL as ?err= httpdRedirect(connData, redir_url_buf); } @@ -286,6 +327,12 @@ tplTermCfg(HttpdConnData *connData, char *token, void **arg) else if (streq(token, "fn_alt_mode")) { sprintf(buff, "%d", (int)termconf->fn_alt_mode); } + else if (streq(token, "want_all_fn")) { + sprintf(buff, "%d", (int)termconf->want_all_fn); + } + else if (streq(token, "crlf_mode")) { + sprintf(buff, "%d", (int)termconf->crlf_mode); + } else if (streq(token, "show_buttons")) { sprintf(buff, "%d", (int)termconf->show_buttons); } @@ -304,6 +351,9 @@ tplTermCfg(HttpdConnData *connData, char *token, void **arg) else if (streq(token, "default_fg")) { sprintf(buff, "%d", termconf->default_fg); } + else if (streq(token, "cursor_shape")) { + sprintf(buff, "%d", termconf->cursor_shape); + } else if (streq(token, "term_title")) { strncpy_safe(buff, termconf->title, BUFLEN); } diff --git a/user/cgi_wifi.c b/user/cgi_wifi.c index 82f9971..df904f3 100644 --- a/user/cgi_wifi.c +++ b/user/cgi_wifi.c @@ -19,6 +19,7 @@ Cgi/template routines for the /wifi url. #include "wifimgr.h" #include "persist.h" #include "helpers.h" +#include "cgi_logging.h" #define SET_REDIR_SUC "/cfg/wifi" #define SET_REDIR_ERR SET_REDIR_SUC"?err=" @@ -116,7 +117,7 @@ void ICACHE_FLASH_ATTR wifiScanDoneCb(void *arg, STATUS status) { int n; struct bss_info *bss_link = (struct bss_info *) arg; - dbg("wifiScanDoneCb %d", status); + cgi_dbg("wifiScanDoneCb %d", status); if (status != OK) { cgiWifiAps.scanInProgress = 0; return; @@ -141,7 +142,7 @@ void ICACHE_FLASH_ATTR wifiScanDoneCb(void *arg, STATUS status) return; } cgiWifiAps.noAps = n; - info("Scan done: found %d APs", n); + cgi_info("Scan done: found %d APs", n); // Copy access point data to the static struct n = 0; @@ -288,7 +289,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiConnStatus(HttpdConnData *connData) } STATION_STATUS st = wifi_station_get_connect_status(); - dbg("CONN STATE = %d", st); + cgi_dbg("CONN STATE = %d", st); switch(st) { case STATION_IDLE: sprintf(buff, "{\"status\": \"idle\"}"); // unclear when this is used @@ -360,18 +361,18 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) // ---- WiFi opmode ---- if (GET_ARG("opmode")) { - dbg("Setting WiFi opmode to: %s", buff); + cgi_dbg("Setting WiFi opmode to: %s", buff); int mode = atoi(buff); if (mode > NULL_MODE && mode < MAX_MODE) { wificonf->opmode = (WIFI_MODE) mode; } else { - warn("Bad opmode value \"%s\"", buff); + cgi_warn("Bad opmode value \"%s\"", buff); redir_url += sprintf(redir_url, "opmode,"); } } if (GET_ARG("ap_enable")) { - dbg("Enable AP: %s", buff); + cgi_dbg("Enable AP: %s", buff); int enable = atoi(buff); if (enable) { @@ -382,7 +383,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) } if (GET_ARG("sta_enable")) { - dbg("Enable STA: %s", buff); + cgi_dbg("Enable STA: %s", buff); int enable = atoi(buff); if (enable) { @@ -396,7 +397,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) // ---- AP transmit power ---- if (GET_ARG("tpw")) { - dbg("Setting AP power to: %s", buff); + cgi_dbg("Setting AP power to: %s", buff); int tpw = atoi(buff); if (tpw >= 0 && tpw <= 82) { // 0 actually isn't 0 but quite low. 82 is very strong if (wificonf->tpw != tpw) { @@ -404,7 +405,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("tpw %s out of allowed range 0-82.", buff); + cgi_warn("tpw %s out of allowed range 0-82.", buff); redir_url += sprintf(redir_url, "tpw,"); } } @@ -412,7 +413,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) // ---- AP channel (applies in AP-only mode) ---- if (GET_ARG("ap_channel")) { - info("ap_channel = %s", buff); + cgi_info("ap_channel = %s", buff); int channel = atoi(buff); if (channel > 0 && channel < 15) { if (wificonf->ap_channel != channel) { @@ -420,7 +421,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) wifi_change_flags.ap = true; } } else { - warn("Bad channel value \"%s\", allowed 1-14", buff); + cgi_warn("Bad channel value \"%s\", allowed 1-14", buff); redir_url += sprintf(redir_url, "ap_channel,"); } } @@ -439,12 +440,12 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) if (strlen(buff) > 0) { if (!streq(wificonf->ap_ssid, buff)) { - info("Setting SSID to \"%s\"", buff); + cgi_info("Setting SSID to \"%s\"", buff); strncpy_safe(wificonf->ap_ssid, buff, SSID_LEN); wifi_change_flags.ap = true; } } else { - warn("Bad SSID len."); + cgi_warn("Bad SSID len."); redir_url += sprintf(redir_url, "ap_ssid,"); } } @@ -456,12 +457,12 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) // but it may lock them out. if (strlen(buff) == 0 || (strlen(buff) >= 8 && strlen(buff) < PASSWORD_LEN-1)) { if (!streq(wificonf->ap_password, buff)) { - info("Setting AP password to \"%s\"", buff); + cgi_info("Setting AP password to \"%s\"", buff); strncpy_safe(wificonf->ap_password, buff, PASSWORD_LEN); wifi_change_flags.ap = true; } } else { - warn("Bad password len."); + cgi_warn("Bad password len."); redir_url += sprintf(redir_url, "ap_password,"); } } @@ -469,7 +470,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) // ---- Hide AP network (do not announce) ---- if (GET_ARG("ap_hidden")) { - dbg("AP hidden = %s", buff); + cgi_dbg("AP hidden = %s", buff); int hidden = atoi(buff); if (hidden != wificonf->ap_hidden) { wificonf->ap_hidden = (hidden != 0); @@ -482,7 +483,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) if (GET_ARG("sta_ssid")) { if (!streq(wificonf->sta_ssid, buff)) { // No verification needed, at worst it fails to connect - info("Setting station SSID to: \"%s\"", buff); + cgi_info("Setting station SSID to: \"%s\"", buff); strncpy_safe(wificonf->sta_ssid, buff, SSID_LEN); wifi_change_flags.sta = true; sta_ssid_pw_changed = true; @@ -494,7 +495,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) if (GET_ARG("sta_password")) { if (!streq(wificonf->sta_password, buff)) { // No verification needed, at worst it fails to connect - info("Setting station password to: \"%s\"", buff); + cgi_info("Setting station password to: \"%s\"", buff); strncpy_safe(wificonf->sta_password, buff, PASSWORD_LEN); wifi_change_flags.sta = true; sta_ssid_pw_changed = true; @@ -503,7 +504,7 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) if (redir_url_buf[strlen(SET_REDIR_ERR)] == 0) { // All was OK - info("Set WiFi params - success, applying in 2000 ms"); + cgi_info("Set WiFi params - success, applying in 2000 ms"); // Settings are applied only if all was OK // @@ -523,14 +524,14 @@ httpd_cgi_state ICACHE_FLASH_ATTR cgiWiFiSetParams(HttpdConnData *connData) && wificonf->sta_ssid[0] != 0) { // User wants to connect - info("User wants to connect to SSID, redirecting to ConnStatus page."); + cgi_info("User wants to connect to SSID, redirecting to ConnStatus page."); httpdRedirect(connData, "/cfg/wifi/connecting"); } else { httpdRedirect(connData, SET_REDIR_SUC); } } else { - warn("Some WiFi settings did not validate, asking for correction"); + cgi_warn("Some WiFi settings did not validate, asking for correction"); // Some errors, appended to the URL as ?err= httpdRedirect(connData, redir_url_buf); } diff --git a/user/character_sets.h b/user/character_sets.h index 2e4b688..ae79948 100644 --- a/user/character_sets.h +++ b/user/character_sets.h @@ -9,15 +9,7 @@ // Tables must be contiguous! -#define CODEPAGE_A_BEGIN 35 -#define CODEPAGE_A_END 35 - -static const u16 codepage_A[] = - {// Unicode ASCII SYM - // %%BEGIN:A%% - 0x20a4, // 35 # £ - // %%END:A%% - }; +// Full range of UTF-8 is now supported, if needed, but the table must be changed to uint32_t #define CODEPAGE_0_BEGIN 96 #define CODEPAGE_0_END 126 @@ -26,7 +18,7 @@ static const u16 codepage_A[] = * translates VT100 ACS escape codes to Unicode values. * Based on rxvt-unicode screen.C table. */ -static const u16 codepage_0[] = +static const u16 codepage_0[] ESP_CONST_DATA = {// Unicode ASCII SYM // %%BEGIN:0%% 0x2666, // 96 ` ♦ @@ -66,7 +58,7 @@ static const u16 codepage_0[] = #define CODEPAGE_1_BEGIN 33 #define CODEPAGE_1_END 126 -static const u16 codepage_1[] = +static const u16 codepage_1[] ESP_CONST_DATA = {// Unicode ASCII SYM DOS // %%BEGIN:1%% 0x263A, // 33 ! ☺ (1) - low ASCII symbols from DOS, moved to +32 diff --git a/user/persist.c b/user/persist.c index dd89036..5bb22d3 100644 --- a/user/persist.c +++ b/user/persist.c @@ -16,36 +16,36 @@ PersistBlock persist; static void ICACHE_FLASH_ATTR apply_live_settings(void) { - dbg("[Persist] Applying live settings..."); + persist_dbg("[Persist] Applying live settings..."); - dbg("[Persist] > system"); + persist_dbg("[Persist] > system"); sysconf_apply_settings(); - dbg("[Persist] > wifi"); + persist_dbg("[Persist] > wifi"); wifimgr_apply_settings(); - dbg("[Persist] > terminal"); + persist_dbg("[Persist] > terminal"); terminal_apply_settings(); - dbg("[Persist] Live settings applied."); + persist_dbg("[Persist] Live settings applied."); // ... } static void ICACHE_FLASH_ATTR restore_live_settings_to_hard_defaults(void) { - dbg("[Persist] Restore to hard defaults..."); + persist_dbg("[Persist] Restore to hard defaults..."); - dbg("[Persist] > system"); + persist_dbg("[Persist] > system"); sysconf_restore_defaults(); - dbg("[Persist] > wifi"); + persist_dbg("[Persist] > wifi"); wifimgr_restore_defaults(); - dbg("[Persist] > terminal"); + persist_dbg("[Persist] > terminal"); terminal_restore_defaults(); - dbg("[Persist] Restored to hard defaults."); + persist_dbg("[Persist] Restored to hard defaults."); // ... } @@ -103,14 +103,14 @@ compute_checksum(AppConfigBundle *bundle) void ICACHE_FLASH_ATTR persist_load(void) { - info("[Persist] Loading stored settings from FLASH..."); + persist_info("[Persist] Loading stored settings from FLASH..."); - dbg("AppConfigBundle memory map:"); - dbg("> WiFiConfigBundle at %4d (error %2d)", wconf_at, wconf_at - 0); - dbg("> SystemConfigBundle at %4d (error %2d)", sconf_at, sconf_at - WIFICONF_SIZE); - dbg("> TerminalConfigBundle at %4d (error %2d)", tconf_at, tconf_at - WIFICONF_SIZE - SYSCONF_SIZE); - dbg("> Checksum at %4d (error %2d)", cksum_at, cksum_at - (APPCONF_SIZE - 4)); - dbg("> Total size = %d bytes (error %d)", sizeof(AppConfigBundle), APPCONF_SIZE - sizeof(AppConfigBundle)); + persist_dbg("AppConfigBundle memory map:"); + persist_dbg("> WiFiConfigBundle at %4d (error %2d)", wconf_at, wconf_at - 0); + persist_dbg("> SystemConfigBundle at %4d (error %2d)", sconf_at, sconf_at - WIFICONF_SIZE); + persist_dbg("> TerminalConfigBundle at %4d (error %2d)", tconf_at, tconf_at - WIFICONF_SIZE - SYSCONF_SIZE); + persist_dbg("> Checksum at %4d (error %2d)", cksum_at, cksum_at - (APPCONF_SIZE - 4)); + persist_dbg("> Total size = %d bytes (error %d)", sizeof(AppConfigBundle), APPCONF_SIZE - sizeof(AppConfigBundle)); bool hard_reset = false; @@ -124,7 +124,7 @@ persist_load(void) error("[Persist] Checksum verification: FAILED"); hard_reset = true; } else { - info("[Persist] Checksum verification: PASSED"); + persist_info("[Persist] Checksum verification: PASSED"); } if (hard_reset) { @@ -142,13 +142,13 @@ persist_load(void) apply_live_settings(); } - info("[Persist] All settings loaded and applied."); + persist_info("[Persist] All settings loaded and applied."); } void ICACHE_FLASH_ATTR persist_store(void) { - info("[Persist] Storing all settings to FLASH..."); + persist_info("[Persist] Storing all settings to FLASH..."); // Update checksums before write persist.current.checksum = compute_checksum(&persist.current); @@ -157,7 +157,7 @@ persist_store(void) if (!system_param_save_with_protect(PERSIST_SECTOR_ID, &persist, sizeof(PersistBlock))) { error("[Persist] Store to flash failed!"); } - info("[Persist] All settings persisted."); + persist_info("[Persist] All settings persisted."); } /** @@ -166,13 +166,13 @@ persist_store(void) void ICACHE_FLASH_ATTR persist_load_hard_default(void) { - info("[Persist] Restoring live settings to hard defaults..."); + persist_info("[Persist] Restoring live settings to hard defaults..."); // Set live config to default values restore_live_settings_to_hard_defaults(); persist_store(); - info("[Persist] Settings restored to hard defaults."); + persist_info("[Persist] Settings restored to hard defaults."); apply_live_settings(); // apply } @@ -183,13 +183,13 @@ persist_load_hard_default(void) void ICACHE_FLASH_ATTR persist_restore_default(void) { - info("[Persist] Restoring live settings to stored defaults..."); + persist_info("[Persist] Restoring live settings to stored defaults..."); memcpy(&persist.current, &persist.defaults, sizeof(AppConfigBundle)); apply_live_settings(); persist_store(); - info("[Persist] Settings restored to stored defaults."); + persist_info("[Persist] Settings restored to stored defaults."); } /** @@ -198,11 +198,11 @@ persist_restore_default(void) void ICACHE_FLASH_ATTR persist_set_as_default(void) { - info("[Persist] Storing live settings as defaults.."); + persist_info("[Persist] Storing live settings as defaults.."); // current -> defaults memcpy(&persist.defaults, &persist.current, sizeof(AppConfigBundle)); persist_store(); - info("[Persist] Default settings updated."); + persist_info("[Persist] Default settings updated."); } diff --git a/user/persist.h b/user/persist.h index aba195b..1cc8a67 100644 --- a/user/persist.h +++ b/user/persist.h @@ -65,4 +65,14 @@ void persist_restore_default(void); void persist_set_as_default(void); void persist_store(void); +#if DEBUG_PERSIST +#define persist_warn warn +#define persist_dbg dbg +#define persist_info info +#else +#define persist_warn(fmt, ...) +#define persist_dbg(fmt, ...) +#define persist_info(fmt, ...) +#endif + #endif //ESP_VT100_FIRMWARE_PERSIST_H diff --git a/user/routes.c b/user/routes.c index 6523cc3..7711b0e 100644 --- a/user/routes.c +++ b/user/routes.c @@ -22,7 +22,7 @@ static int wifiPassFn(HttpdConnData *connData, int no, char *user, int userLen, /** * Application routes */ -HttpdBuiltInUrl routes[] = { +const HttpdBuiltInUrl routes[] ESP_CONST_DATA = { // redirect func for the captive portal ROUTE_CGI_ARG("*", cgiRedirectApClientToHostname, "esp-terminal.ap"), @@ -32,7 +32,6 @@ HttpdBuiltInUrl routes[] = { ROUTE_FILE("/help/?", "/help.html"), // --- Sockets --- - ROUTE_CGI("/term/init", cgiTermInitialImage), ROUTE_WS(URL_WS_UPDATE, updateSockConnect), // --- System control --- diff --git a/user/routes.h b/user/routes.h index cc266c0..2ba843f 100644 --- a/user/routes.h +++ b/user/routes.h @@ -4,7 +4,7 @@ #include #include -extern HttpdBuiltInUrl routes[]; +extern const HttpdBuiltInUrl routes[]; /** Broadcast screen state to sockets */ void screen_notifyChange(); diff --git a/user/screen.c b/user/screen.c index 4ac8e37..95b70d1 100644 --- a/user/screen.c +++ b/user/screen.c @@ -7,17 +7,18 @@ #include "apars_logging.h" #include "jstring.h" #include "character_sets.h" +#include "utf8.h" TerminalConfigBundle * const termconf = &persist.current.termconf; -TerminalConfigBundle termconf_scratch; +TerminalConfigBundle termconf_live; MouseTrackingConfig mouse_tracking; // forward declare static void utf8_remap(char* out, char g, char charset); -#define W termconf_scratch.width -#define H termconf_scratch.height +#define W termconf_live.width +#define H termconf_live.height /** * Highest permissible value of the color attribute @@ -27,10 +28,10 @@ static void utf8_remap(char* out, char g, char charset); /** * Screen cell data type (16 bits) */ -typedef struct __attribute__((packed)){ - char c[4]; // space for a full unicode character - Color fg : 4; - Color bg : 4; +typedef struct __attribute__((packed)) { + UnicodeCacheRef symbol : 8; + Color fg; + Color bg; u8 attrs; } Cell; @@ -40,21 +41,17 @@ typedef struct __attribute__((packed)){ static Cell screen[MAX_SCREEN_SIZE]; -#define TABSTOP_WORDS 5 -/** - * Tab stops bitmap - */ -static u32 tab_stops[TABSTOP_WORDS]; +#define TABSTOP_WORDS 5 /** * Screen state structure */ static struct { bool numpad_alt_mode; //!< DECNKM - Numpad Application Mode bool cursors_alt_mode; //!< DECCKM - Cursors Application mode + bool bracketed_paste; - bool newline_mode; //!< LNM - CR automatically sends LF - bool reverse; //!< DECSCNM - Reverse video + bool reverse_video; //!< DECSCNM - Reverse video bool insert_mode; //!< IRM - Insert mode (move rest of the line to the right) bool cursor_visible; //!< DECTCEM - Cursor visible @@ -62,14 +59,17 @@ static struct { // Vertical margin bounds (inclusive start/end of scrolling region) int vm0; int vm1; + + u32 tab_stops[TABSTOP_WORDS]; // tab stops bitmap + char last_char[4]; } scr; #define R0 scr.vm0 #define R1 scr.vm1 #define RH (scr.vm1 - scr.vm0 + 1) // horizontal edges - will be useful if horizontal margin is implemented -#define C0 0 -#define C1 (W-1) +//#define C0 0 +//#define C1 (W-1) typedef struct { /* Cursor position */ @@ -79,6 +79,7 @@ typedef struct { /* SGR */ bool inverse; //!< not in attrs bc it's applied server-side (not sent to browser) + bool conceal; //!< similar to inverse, causes all to be replaced by SP u8 attrs; Color fg; //!< Foreground color for writing Color bg; //!< Background color for writing @@ -92,6 +93,7 @@ typedef struct { /** Options saved with cursor */ bool auto_wrap; //!< DECAWM - Wrapping when EOL + bool reverse_wrap; //!< Reverse-wraparound Mode. DECSET 45 bool origin_mode; //!< DECOM - absolute positioning is relative to vertical margins } CursorTypeDef; @@ -106,6 +108,36 @@ static CursorTypeDef cursor; static CursorTypeDef cursor_sav; bool cursor_saved = false; +/** This structure holds old state when switching to an alternate buffer */ +static struct { + bool alternate_active; + char title[TERM_TITLE_LEN]; + char btn[TERM_BTN_COUNT][TERM_BTN_LEN]; + char btn_msg[TERM_BTN_COUNT][TERM_BTN_MSG_LEN]; + u32 width; + u32 height; + int vm0; + int vm1; + u32 tab_stops[TABSTOP_WORDS]; +} state_backup; + +/** options backup (save/restore) */ +static struct { + bool cursors_alt_mode; + bool reverse_video; + bool origin_mode; + bool auto_wrap; + enum MTM mouse_tracking; + enum MTE mouse_encoding; + bool focus_tracking; + bool cursor_blink; + bool cursor_visible; + bool reverse_wrap; + bool bracketed_paste; + bool show_buttons; + bool show_config_links; +} opt_backup; + /** * This is used to prevent premature change notifications * (from nested calls) @@ -151,9 +183,12 @@ terminal_restore_defaults(void) termconf->fn_alt_mode = SCR_DEF_FN_ALT_MODE; termconf->config_version = TERMCONF_VERSION; termconf->display_cooldown_ms = SCR_DEF_DISPLAY_COOLDOWN_MS; - termconf->loopback = 0; - termconf->show_buttons = 1; - termconf->show_config_links = 1; + termconf->loopback = false; + termconf->show_buttons = SCR_DEF_SHOW_BUTTONS; + termconf->show_config_links = SCR_DEF_SHOW_MENU; + termconf->cursor_shape = SCR_DEF_CURSOR_SHAPE; + termconf->crlf_mode = SCR_DEF_CRLF; + termconf->want_all_fn = SCR_DEF_ALLFN; } /** @@ -174,14 +209,14 @@ terminal_apply_settings_noclear(void) // Migrate to v1 if (termconf->config_version < 1) { - dbg("termconf: Updating to version 1"); + persist_dbg("termconf: Updating to version 1"); termconf->display_cooldown_ms = SCR_DEF_DISPLAY_COOLDOWN_MS; changed = 1; } // Migrate to v2 if (termconf->config_version < 2) { - dbg("termconf: Updating to version 2"); + persist_dbg("termconf: Updating to version 2"); termconf->loopback = 0; termconf->show_config_links = 1; termconf->show_buttons = 1; @@ -190,13 +225,28 @@ terminal_apply_settings_noclear(void) // Migrate to v3 if (termconf->config_version < 3) { - dbg("termconf: Updating to version 3"); + persist_dbg("termconf: Updating to version 3"); for(int i=1; i <= TERM_BTN_COUNT; i++) { sprintf(termconf->btn_msg[i-1], "%c", i); } changed = 1; } + // Migrate to v4 + if (termconf->config_version < 4) { + persist_dbg("termconf: Updating to version 4"); + termconf->cursor_shape = CURSOR_BLOCK_BL; + termconf->crlf_mode = false; + changed = 1; + } + + // Migrate to v5 + if (termconf->config_version < 4) { + persist_dbg("termconf: Updating to version 5"); + termconf->want_all_fn = 0; + changed = 1; + } + termconf->config_version = TERMCONF_VERSION; // Validation... @@ -209,13 +259,13 @@ terminal_apply_settings_noclear(void) changed = 1; } - memcpy(&termconf_scratch, termconf, sizeof(TerminalConfigBundle)); + memcpy(&termconf_live, termconf, sizeof(TerminalConfigBundle)); if (W*H > MAX_SCREEN_SIZE) { error("BAD SCREEN SIZE: %d rows x %d cols", H, W); error("reverting terminal settings to default"); terminal_restore_defaults(); changed = true; - memcpy(&termconf_scratch, termconf, sizeof(TerminalConfigBundle)); + memcpy(&termconf_live, termconf, sizeof(TerminalConfigBundle)); screen_init(); } @@ -233,9 +283,18 @@ terminal_apply_settings_noclear(void) void ICACHE_FLASH_ATTR screen_init(void) { - dbg("Screen buffer size = %d bytes", sizeof(screen)); + if(DEBUG_HEAP) dbg("Screen buffer size = %d bytes", sizeof(screen)); NOTIFY_LOCK(); + Cell sample; + sample.symbol = ' '; + sample.fg = termconf->default_fg; + sample.bg = termconf->default_bg; + sample.attrs = 0; + for (unsigned int i = 0; i < MAX_SCREEN_SIZE; i++) { + memcpy(&screen[i], &sample, sizeof(Cell)); + } + screen_reset(); NOTIFY_DONE(); } @@ -258,15 +317,26 @@ cursor_reset(void) } /** - * Reset the cursor position & colors + * Reset the screen - called by ESC c */ static void ICACHE_FLASH_ATTR -decopt_reset(void) +screen_reset_on_resize(void) { - scr.cursor_visible = true; - scr.insert_mode = false; - cursor.origin_mode = false; - cursor.auto_wrap = true; + ansi_dbg("Screen partial reset due to resize"); + NOTIFY_LOCK(); + + cursor.x = 0; + cursor.y = 0; + cursor.hanging = false; + + scr.vm0 = 0; + scr.vm1 = H-1; + + // size is left unchanged + screen_clear(CLEAR_ALL); + unicode_cache_clear(); + + NOTIFY_DONE(); } /** @@ -275,10 +345,11 @@ decopt_reset(void) void ICACHE_FLASH_ATTR screen_reset_sgr(void) { - cursor.fg = termconf_scratch.default_fg; - cursor.bg = termconf_scratch.default_bg; + cursor.fg = termconf->default_fg; + cursor.bg = termconf->default_bg; cursor.attrs = 0; cursor.inverse = false; + cursor.conceal = false; } /** @@ -287,19 +358,30 @@ screen_reset_sgr(void) void ICACHE_FLASH_ATTR screen_reset(void) { + ansi_dbg("Screen reset."); NOTIFY_LOCK(); cursor_reset(); - decopt_reset(); + unicode_cache_clear(); + + // DECopts + scr.cursor_visible = true; + scr.insert_mode = false; + cursor.origin_mode = false; + cursor.auto_wrap = true; + cursor.reverse_wrap = false; + termconf_live.cursor_shape = termconf->cursor_shape; scr.numpad_alt_mode = false; scr.cursors_alt_mode = false; - scr.newline_mode = false; - scr.reverse = false; + termconf_live.crlf_mode = termconf->crlf_mode; + scr.reverse_video = false; scr.vm0 = 0; scr.vm1 = H-1; + state_backup.alternate_active = false; + mouse_tracking.encoding = MTE_SIMPLE; mouse_tracking.focus_tracking = false; mouse_tracking.mode = MTM_NONE; @@ -307,13 +389,26 @@ screen_reset(void) // size is left unchanged screen_clear(CLEAR_ALL); - screen_clear_all_tabs(); - // Set initial tabstops for (int i = 0; i < TABSTOP_WORDS; i++) { - tab_stops[i] = 0x80808080; + scr.tab_stops[i] = 0x80808080; } + // initial values in the save buffer in case of receiving restore without storing first + opt_backup.cursors_alt_mode = scr.cursors_alt_mode; + opt_backup.reverse_video = scr.reverse_video; + opt_backup.origin_mode = cursor.origin_mode; + opt_backup.auto_wrap = cursor.auto_wrap; + opt_backup.mouse_tracking = mouse_tracking.mode; + opt_backup.mouse_encoding = mouse_tracking.encoding; + opt_backup.focus_tracking = mouse_tracking.focus_tracking; + opt_backup.cursor_blink = CURSOR_BLINKS(termconf_live.cursor_shape); + opt_backup.cursor_visible = scr.cursor_visible; + opt_backup.reverse_wrap = cursor.reverse_wrap; + opt_backup.bracketed_paste = scr.bracketed_paste; + opt_backup.show_buttons = termconf_live.show_buttons; + opt_backup.show_config_links = termconf_live.show_config_links; + NOTIFY_DONE(); } @@ -325,7 +420,42 @@ screen_reset(void) void ICACHE_FLASH_ATTR screen_swap_state(bool alternate) { - // TODO impl - backup/restore title, size, global attributes (not SGR) + if (alternate == state_backup.alternate_active) { + ansi_warn("No swap, already alternate = %d", alternate); + return; // nothing to do + } + + if (alternate) { + ansi_dbg("Swap to alternate"); + // store old state + memcpy(state_backup.title, termconf_live.title, TERM_TITLE_LEN); + memcpy(state_backup.btn, termconf_live.btn, sizeof(termconf_live.btn)); + memcpy(state_backup.btn_msg, termconf_live.btn_msg, sizeof(termconf_live.btn_msg)); + memcpy(state_backup.tab_stops, scr.tab_stops, sizeof(scr.tab_stops)); + state_backup.vm0 = scr.vm0; + state_backup.vm1 = scr.vm1; + // remember old size. may have to resize when returning + state_backup.width = W; + state_backup.height = H; + // TODO backup screen content (if this is ever possible) + } + else { + ansi_dbg("Unswap from alternate"); + NOTIFY_LOCK(); + memcpy(termconf_live.title, state_backup.title, TERM_TITLE_LEN); + memcpy(termconf_live.btn, state_backup.btn, sizeof(termconf_live.btn)); + memcpy(termconf_live.btn_msg, state_backup.btn_msg, sizeof(termconf_live.btn_msg)); + memcpy(scr.tab_stops, state_backup.tab_stops, sizeof(scr.tab_stops)); + scr.vm0 = state_backup.vm0; + scr.vm1 = state_backup.vm1; + // this may clear the screen as a side effect if size changed + screen_resize(state_backup.height, state_backup.width); + // TODO restore screen content (if this is ever possible) + NOTIFY_DONE(); + screen_notifyChange(CHANGE_LABELS); + } + + state_backup.alternate_active = alternate; } //endregion @@ -335,19 +465,19 @@ screen_swap_state(bool alternate) void ICACHE_FLASH_ATTR screen_clear_all_tabs(void) { - memset(tab_stops, 0, sizeof(tab_stops)); + memset(scr.tab_stops, 0, sizeof(scr.tab_stops)); } void ICACHE_FLASH_ATTR screen_set_tab(void) { - tab_stops[cursor.x/32] |= (1<<(cursor.x%32)); + scr.tab_stops[cursor.x/32] |= (1<<(cursor.x%32)); } void ICACHE_FLASH_ATTR screen_clear_tab(void) { - tab_stops[cursor.x/32] &= ~(1<<(cursor.x%32)); + scr.tab_stops[cursor.x/32] &= ~(1<<(cursor.x%32)); } /** @@ -365,7 +495,7 @@ next_tab_stop(void) int offs = (cursor.x+1)%32; int cp = cursor.x; while (idx < TABSTOP_WORDS) { - u32 w = tab_stops[idx]; + u32 w = scr.tab_stops[idx]; w >>= offs; for(;offs<32;offs++) { cp++; @@ -395,7 +525,7 @@ prev_tab_stop(void) int offs = (cursor.x-1)%32; int cp = cursor.x; while (idx >= 0) { - u32 w = tab_stops[idx]; + u32 w = scr.tab_stops[idx]; w <<= 31-offs; if (w == 0) { cp -= cp%32; @@ -462,15 +592,14 @@ clear_range(unsigned int from, unsigned int to) Color bg = (cursor.inverse) ? cursor.fg : cursor.bg; Cell sample; - sample.c[0] = ' '; - sample.c[1] = 0; - sample.c[2] = 0; - sample.c[3] = 0; + sample.symbol = ' '; sample.fg = fg; sample.bg = bg; sample.attrs = 0; for (unsigned int i = from; i <= to; i++) { + UnicodeCacheRef symbol = screen[i].symbol; + if (IS_UNICODE_CACHE_REF(symbol)) unicode_cache_remove(symbol); memcpy(&screen[i], &sample, sizeof(Cell)); } } @@ -535,10 +664,14 @@ screen_clear_in_line(unsigned int count) } } -void screen_insert_lines(unsigned int lines) +void ICACHE_FLASH_ATTR +screen_insert_lines(unsigned int lines) { if (!cursor_inside_region()) return; // can't insert if not inside region NOTIFY_LOCK(); + + // FIXME remove cleared & overwritten cells from unicode cache! + // shift the following lines int targetStart = cursor.y + lines; if (targetStart > R1) { @@ -559,11 +692,14 @@ void screen_insert_lines(unsigned int lines) NOTIFY_DONE(); } -void screen_delete_lines(unsigned int lines) +void ICACHE_FLASH_ATTR +screen_delete_lines(unsigned int lines) { if (!cursor_inside_region()) return; // can't delete if not inside region NOTIFY_LOCK(); + // FIXME remove cleared & overwritten cells from unicode cache! + // shift lines up int targetEnd = R1 - lines - 1; if (targetEnd <= cursor.y) { @@ -580,9 +716,13 @@ void screen_delete_lines(unsigned int lines) NOTIFY_DONE(); } -void screen_insert_characters(unsigned int count) +void ICACHE_FLASH_ATTR +screen_insert_characters(unsigned int count) { NOTIFY_LOCK(); + + // FIXME remove cleared & overwritten cells from unicode cache! + int targetStart = cursor.x + count; if (targetStart >= W) { targetStart = W-1; @@ -597,9 +737,12 @@ void screen_insert_characters(unsigned int count) NOTIFY_DONE(); } -void screen_delete_characters(unsigned int count) +void ICACHE_FLASH_ATTR +screen_delete_characters(unsigned int count) { NOTIFY_LOCK(); + + // FIXME remove cleared & overwritten cells from unicode cache! int targetEnd = W - count; if (targetEnd > cursor.x) { // do the moving @@ -627,12 +770,9 @@ screen_fill_with_E(void) screen_reset(); // based on observation from xterm Cell sample; - sample.c[0] = 'E'; - sample.c[1] = 0; - sample.c[2] = 0; - sample.c[3] = 0; - sample.fg = termconf_scratch.default_fg; - sample.bg = termconf_scratch.default_bg; + sample.symbol = 'E'; + sample.fg = termconf->default_fg; + sample.bg = termconf->default_bg; sample.attrs = 0; for (unsigned int i = 0; i <= W*H-1; i++) { @@ -650,29 +790,30 @@ screen_fill_with_E(void) void ICACHE_FLASH_ATTR screen_resize(int rows, int cols) { - NOTIFY_LOCK(); // sanitize if (cols < 1 || rows < 1) { - error("Screen size must be positive"); - goto done; + error("Bad size: %d x %d", cols, rows); + return; } if (cols * rows > MAX_SCREEN_SIZE) { - error("Max screen size exceeded"); - goto done; + error("Too big size: %d x %d", cols, rows); + return; } + if (W == cols && H == rows) return; // Do nothing + + NOTIFY_LOCK(); W = cols; H = rows; - screen_reset(); - done: + screen_reset_on_resize(); NOTIFY_DONE(); } void ICACHE_FLASH_ATTR screen_set_title(const char *title) { - strncpy(termconf_scratch.title, title, TERM_TITLE_LEN); + strncpy(termconf_live.title, title, TERM_TITLE_LEN); screen_notifyChange(CHANGE_LABELS); } @@ -684,7 +825,7 @@ screen_set_title(const char *title) void ICACHE_FLASH_ATTR screen_set_button_text(int num, const char *text) { - strncpy(termconf_scratch.btn[num-1], text, TERM_BTN_LEN); + strncpy(termconf_live.btn[num-1], text, TERM_BTN_LEN); screen_notifyChange(CHANGE_LABELS); } @@ -705,6 +846,8 @@ screen_scroll_up(unsigned int lines) goto done; } + // FIXME remove cleared & overwritten cells from unicode cache! + int y; for (y = R0; y <= R1 - lines; y++) { memcpy(screen + y * W, screen + (y + lines) * W, W * sizeof(Cell)); @@ -728,6 +871,8 @@ screen_scroll_down(unsigned int lines) goto done; } + // FIXME remove cleared & overwritten cells from unicode cache! + // bad cmd if (lines == 0) { goto done; @@ -766,6 +911,33 @@ screen_set_scrolling_region(int from, int to) //region --- Cursor manipulation --- +/** set cursor type */ +void ICACHE_FLASH_ATTR +screen_cursor_shape(enum CursorShape shape) +{ + NOTIFY_LOCK(); + if (shape == CURSOR_DEFAULT) shape = termconf->cursor_shape; + termconf_live.cursor_shape = shape; + NOTIFY_DONE(); +} + +/** set cursor blink option */ +void ICACHE_FLASH_ATTR +screen_cursor_blink(bool blink) +{ + NOTIFY_LOCK(); + if (blink) { + if (termconf_live.cursor_shape == CURSOR_BLOCK) termconf_live.cursor_shape = CURSOR_BLOCK_BL; + if (termconf_live.cursor_shape == CURSOR_BAR) termconf_live.cursor_shape = CURSOR_BAR_BL; + if (termconf_live.cursor_shape == CURSOR_UNDERLINE) termconf_live.cursor_shape = CURSOR_UNDERLINE_BL; + } else { + if (termconf_live.cursor_shape == CURSOR_BLOCK_BL) termconf_live.cursor_shape = CURSOR_BLOCK; + if (termconf_live.cursor_shape == CURSOR_BAR_BL) termconf_live.cursor_shape = CURSOR_BAR; + if (termconf_live.cursor_shape == CURSOR_UNDERLINE_BL) termconf_live.cursor_shape = CURSOR_UNDERLINE; + } + NOTIFY_DONE(); +} + /** * Set cursor position */ @@ -849,7 +1021,34 @@ screen_cursor_move(int dy, int dx, bool scroll) cursor.x += dx; cursor.y += dy; if (cursor.x >= (int)W) cursor.x = W - 1; - if (cursor.x < (int)0) cursor.x = 0; + if (cursor.x < (int)0) { + if (cursor.auto_wrap && cursor.reverse_wrap) { + // this is mimicking a behavior from xterm that allows any number of steps backwards with reverse wraparound enabled + int steps = -cursor.x; + if(steps > W*H) steps = W*H; // avoid something stupid causing infinite loop here + for(;steps>0;steps--) { + if (cursor.x > 0) { + // backspace should go to col 79 if "hanging" after 80 (as if it never actually left the 80th col) + cursor.hanging = false; + cursor.x--; + } + else { + if (cursor.y > 0) { + // end of previous line + cursor.y--; + cursor.x = W - 1; + } + else { + // end of screen, end of line (wrap around) + cursor.y = R1; + cursor.x = W - 1; + } + } + } + } else { + cursor.x = 0; + } + } if (cursor.y < R0) { if (was_inside) { @@ -890,6 +1089,7 @@ screen_cursor_move(int dy, int dx, bool scroll) void ICACHE_FLASH_ATTR screen_cursor_save(bool withAttrs) { + (void)withAttrs; // always save with attribs memcpy(&cursor_sav, &cursor, sizeof(CursorTypeDef)); cursor_saved = true; @@ -958,13 +1158,21 @@ screen_wrap_enable(bool enable) cursor.auto_wrap = enable; } +/** + * Enable reverse wraparound + */ +void ICACHE_FLASH_ATTR +screen_reverse_wrap_enable(bool enable) +{ + cursor.reverse_wrap = enable; +} + /** * Set cursor foreground color */ void ICACHE_FLASH_ATTR screen_set_fg(Color color) { - if (color > COLOR_MAX) color = COLOR_MAX; cursor.fg = color; } @@ -974,7 +1182,6 @@ screen_set_fg(Color color) void ICACHE_FLASH_ATTR screen_set_bg(Color color) { - if (color > COLOR_MAX) color = COLOR_MAX; cursor.bg = color; } @@ -995,6 +1202,12 @@ screen_set_sgr_inverse(bool ena) cursor.inverse = ena; } +void ICACHE_FLASH_ATTR +screen_set_sgr_conceal(bool ena) +{ + cursor.conceal = ena; +} + void ICACHE_FLASH_ATTR screen_set_charset_n(int Gx) { @@ -1035,14 +1248,24 @@ void ICACHE_FLASH_ATTR screen_set_reverse_video(bool reverse) { NOTIFY_LOCK(); - scr.reverse = reverse; + scr.reverse_video = reverse; + NOTIFY_DONE(); +} + +void ICACHE_FLASH_ATTR +screen_set_bracketed_paste(bool ena) +{ + NOTIFY_LOCK(); + scr.bracketed_paste = ena; NOTIFY_DONE(); } void ICACHE_FLASH_ATTR screen_set_newline_mode(bool nlm) { - scr.newline_mode = nlm; + NOTIFY_LOCK(); + termconf_live.crlf_mode = nlm; + NOTIFY_DONE(); } void ICACHE_FLASH_ATTR @@ -1052,6 +1275,79 @@ screen_set_origin_mode(bool region_origin) screen_cursor_set(0, 0); } +static void ICACHE_FLASH_ATTR +do_save_private_opt(int n, bool save) +{ +#define SAVE_RESTORE(sf, of) do { if (save) sf=(of); else of=(sf); } while(0) + switch (n) { + case 1: + SAVE_RESTORE(opt_backup.cursors_alt_mode, scr.cursors_alt_mode); + break; + case 5: + SAVE_RESTORE(opt_backup.reverse_video, scr.reverse_video); + break; + case 6: + SAVE_RESTORE(opt_backup.origin_mode, cursor.origin_mode); + break; + case 7: + SAVE_RESTORE(opt_backup.auto_wrap, cursor.auto_wrap); + break; + case 9: + case 1000: + case 1001: // hilite, not implemented + case 1002: + case 1003: + SAVE_RESTORE(opt_backup.mouse_tracking, mouse_tracking.mode); + break; + case 1004: + SAVE_RESTORE(opt_backup.focus_tracking, mouse_tracking.focus_tracking); + break; + case 1005: + case 1006: + case 1015: + SAVE_RESTORE(opt_backup.mouse_encoding, mouse_tracking.encoding); + break; + case 12: // cursor blink + if (save) { + opt_backup.cursor_blink = CURSOR_BLINKS(termconf_live.cursor_shape); + } else { + screen_cursor_blink(opt_backup.cursor_blink); + } + break; + case 25: + SAVE_RESTORE(opt_backup.cursor_visible, scr.cursor_visible); + break; + case 45: + SAVE_RESTORE(opt_backup.reverse_wrap, cursor.reverse_wrap); + break; + case 2004: + SAVE_RESTORE(opt_backup.bracketed_paste, scr.bracketed_paste); + break; + case 800: + SAVE_RESTORE(opt_backup.show_buttons, termconf_live.show_buttons); + break; + case 801: + SAVE_RESTORE(opt_backup.show_config_links, termconf_live.show_config_links); + break; + default: + ansi_warn("Cannot store ?%d", n); + } +} + +void ICACHE_FLASH_ATTR +screen_save_private_opt(int n) +{ + do_save_private_opt(n, true); +} + +void ICACHE_FLASH_ATTR +screen_restore_private_opt(int n) +{ + NOTIFY_LOCK(); + do_save_private_opt(n, false); + NOTIFY_DONE(); +} + void ICACHE_FLASH_ATTR screen_report_sgr(char *buffer) { @@ -1066,53 +1362,17 @@ screen_report_sgr(char *buffer) if (cursor.inverse) buffer += sprintf(buffer, ";%d", SGR_INVERSE); if (cursor.fg != termconf->default_fg) buffer += sprintf(buffer, ";%d", ((cursor.fg > 7) ? SGR_FG_BRT_START : SGR_FG_START) + (cursor.fg&7)); if (cursor.bg != termconf->default_bg) buffer += sprintf(buffer, ";%d", ((cursor.bg > 7) ? SGR_BG_BRT_START : SGR_BG_START) + (cursor.bg&7)); + (void)buffer; } //endregion //region --- Printing --- -/** - * Set a character in the cursor color, move to right with wrap. - */ -void ICACHE_FLASH_ATTR -screen_putchar(const char *ch) +static const char* ICACHE_FLASH_ATTR +putchar_graphic(const char *ch) { - NOTIFY_LOCK(); - - // clear "hanging" flag if not possible - clear_invalid_hanging(); - - // Special treatment for CRLF - switch (ch[0]) { - case CR: - screen_cursor_set_x(0); - goto done; - - case LF: - screen_cursor_move(1, 0, true); // can scroll - if (scr.newline_mode) { - // like CR - screen_cursor_set_x(0); - } - goto done; - - case BS: - if (cursor.x > 0) { - // backspace should go to col 79 if "hanging" after 80 (as if it never actually left the 80th col) - cursor.hanging = false; - cursor.x--; - } - // we should not wrap around, and backspace should not even clear the cell (verified in xterm) - goto done; - - default: - if (ch[0] < SP) { - // Discard - warn("Ignoring control char %d", (int)ch[0]); - goto done; - } - } + static char buf[4]; if (cursor.hanging) { // perform the scheduled wrap if hanging @@ -1137,13 +1397,12 @@ screen_putchar(const char *ch) if (cursor.x < W-1 && scr.insert_mode) screen_insert_characters(1); if (ch[1] == 0 && ch[0] <= 0x7f) { - // we have len=1 and ASCII - utf8_remap(c->c, ch[0], (cursor.charsetN == 0) ? cursor.charset0 : cursor.charset1); - } - else { - // copy unicode char - strncpy(c->c, ch, 4); + // we have len=1 and ASCII, can be re-mapped using a table + utf8_remap(buf, ch[0], (cursor.charsetN == 0) ? cursor.charset0 : cursor.charset1); + ch = buf; } + unicode_cache_remove(c->symbol); + c->symbol = unicode_cache_add((const u8 *)ch); if (cursor.inverse) { c->fg = cursor.bg; @@ -1161,10 +1420,83 @@ screen_putchar(const char *ch) cursor.x = W - 1; } + return ch; +} + +/** + * Set a character in the cursor color, move to right with wrap. + */ +void ICACHE_FLASH_ATTR +screen_putchar(const char *ch) +{ + NOTIFY_LOCK(); + + // clear "hanging" flag if not possible + clear_invalid_hanging(); + + if (cursor.conceal) { + ch = " "; + } + + // Special treatment for CRLF + switch (ch[0]) { + case DEL: + goto done; + + case CR: + screen_cursor_set_x(0); + goto done; + + case LF: + screen_cursor_move(1, 0, true); // can scroll + goto done; + + case BS: + screen_cursor_move(0, -1, false); + // we should not wrap around, and backspace should not even clear the cell (verified in xterm) + goto done; + + default: + if (ch[0] < SP) { + // Discard + warn("Ignoring control char %d", (int)ch[0]); + goto done; + } + } + + const char *result = putchar_graphic(ch); + + // Remember the resulting character + // If we re-mapped ASCII to high UTF, the following Repeat command will + // not have to call the remap function repeatedly. + strncpy(scr.last_char, result, 4); + done: NOTIFY_DONE(); } +/** + * Repeat last graphic character + * @param count + */ +void ICACHE_FLASH_ATTR +screen_repeat_last_character(int count) +{ + NOTIFY_LOCK(); + if (scr.last_char[0]==0) { + scr.last_char[0] = ' '; + scr.last_char[1] = 0; + } + + if (count > W*H) count = W*H; + + while (count > 0) { + putchar_graphic(scr.last_char); + count--; + } + NOTIFY_DONE(); +} + /** * UTF remap * @param out - output char[4] @@ -1193,10 +1525,7 @@ utf8_remap(char *out, char g, char charset) break; case CS_A_UKASCII: /* UK, replaces # with GBP */ - if ((g >= CODEPAGE_A_BEGIN) && (g <= CODEPAGE_A_END)) { - n = codepage_A[g - CODEPAGE_A_BEGIN]; - if (n) utf = n; - } + if (g == '#') utf = 0x20a4; // £ break; default: @@ -1205,28 +1534,7 @@ utf8_remap(char *out, char g, char charset) break; } - // Encode to UTF-8 - if (utf > 0x7F) { - // formulas taken from: https://gist.github.com/yamamushi/5823402 - if ((utf >= 0x80) && (utf <= 0x07FF)) { - // 2-byte unicode - out[0] = (char) ((utf >> 0x06) ^ 0xC0); - out[1] = (char) (((utf ^ 0xFFC0) | 0x80) & ~0x40); - out[2]=0; - } - else { - // 3-byte unicode - out[0] = (char) (((utf ^ 0xFC0FFF) >> 0x0C) | 0xE0); - out[1] = (char) ((((utf ^ 0xFFF03F) >> 0x06) | 0x80) & ~0x40); - out[2] = (char) (((utf ^ 0xFFFC0) | 0x80) & ~0x40); - out[3]=0; - } - // Missing 4-byte formulas :( - } else { - // low ASCII - out[0] = (char) utf; - out[1] = 0; - } + utf8_encode(out, utf); } //endregion @@ -1236,7 +1544,9 @@ struct ScreenSerializeState { Color lastFg; Color lastBg; bool lastAttrs; + UnicodeCacheRef lastSymbol; char lastChar[4]; + u8 lastCharLen; int index; }; @@ -1248,14 +1558,15 @@ struct ScreenSerializeState { void ICACHE_FLASH_ATTR screenSerializeLabelsToBuffer(char *buffer, size_t buf_len) { + (void)buf_len; // let's just assume it's long enough - called with the huge websocket buffer sprintf(buffer, "T%s\x01%s\x01%s\x01%s\x01%s\x01%s", // use 0x01 as separator - termconf_scratch.title, - termconf_scratch.btn[0], - termconf_scratch.btn[1], - termconf_scratch.btn[2], - termconf_scratch.btn[3], - termconf_scratch.btn[4] + termconf_live.title, + termconf_live.btn[0], + termconf_live.btn[1], + termconf_live.btn[2], + termconf_live.btn[3], + termconf_live.btn[4] ); } @@ -1282,16 +1593,38 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) } Cell *cell, *cell0; - WordB2 w1, w2, w3, w4, w5; + WordB2 w1; WordB3 lw1; - size_t remain = buf_len; int used = 0; + size_t remain = buf_len; char *bb = buffer; - // Ideally we'd use snprintf here! -#define bufprint(fmt, ...) do { \ - used = sprintf(bb, fmt, ##__VA_ARGS__); \ - if(used>0) { bb += used; remain -= used; } \ +#define bufput_c(c) do { \ + *bb = (char)c; bb++; \ + remain--; \ + } while(0) + +#define bufput_2B(n) do { \ + encode2B((u16) n, &w1); \ + bufput_c(w1.lsb); \ + bufput_c(w1.msb); \ + } while(0) + +#define bufput_3B(n) do { \ + encode3B((u32) n, &lw1); \ + bufput_c(lw1.lsb); \ + bufput_c(lw1.msb); \ + bufput_c(lw1.xsb); \ + } while(0) + +#define bufput_t2B(t, n) do { \ + bufput_c(t); \ + bufput_2B(n); \ + } while(0) + +#define bufput_t3B(t, n) do { \ + bufput_c(t); \ + bufput_3B(n); \ } while(0) if (ss == NULL) { @@ -1300,29 +1633,39 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) ss->lastBg = 0; ss->lastFg = 0; ss->lastAttrs = 0; - memset(ss->lastChar, 0, 4); // this ensures the first char is never "repeat" - - encode2B((u16) H, &w1); - encode2B((u16) W, &w2); - encode2B((u16) cursor.y, &w3); - encode2B((u16) cursor.x, &w4); - encode2B((u16) ( - (scr.cursor_visible ? 1<<0 : 0) | - (cursor.hanging ? 1<<1 : 0) | - (scr.cursors_alt_mode ? 1<<2 : 0) | - (scr.numpad_alt_mode ? 1<<3 : 0) | - (termconf->fn_alt_mode ? 1<<4 : 0) | - ((mouse_tracking.mode>MTM_NONE) ? 1<<5 : 0) | // disables context menu - ((mouse_tracking.mode>=MTM_NORMAL) ? 1<<6 : 0) | // disables selecting - (termconf_scratch.show_buttons ? 1<<7 : 0) | - (termconf_scratch.show_config_links ? 1<<8 : 0) - ) - , &w5); + ss->lastCharLen = 0; + ss->lastSymbol = 32; + strncpy(ss->lastChar, " ", 4); + bufput_c('S'); // H W X Y Attribs - bufprint("S%c%c%c%c%c%c%c%c%c%c", w1.lsb, w1.msb, w2.lsb, w2.msb, w3.lsb, w3.msb, w4.lsb, w4.msb, w5.lsb, w5.msb); + bufput_2B(H); + bufput_2B(W); + bufput_2B(cursor.y); + bufput_2B(cursor.x); + // 3B has 18 free bits + bufput_3B( + (scr.cursor_visible << 0) | + (cursor.hanging << 1) | + (scr.cursors_alt_mode << 2) | + (scr.numpad_alt_mode << 3) | + (termconf_live.fn_alt_mode << 4) | + ((mouse_tracking.mode>MTM_NONE) << 5) | // disables context menu + ((mouse_tracking.mode>=MTM_NORMAL) << 6) | // disables selecting + (termconf_live.show_buttons << 7) | + (termconf_live.show_config_links << 8) | + ((termconf_live.cursor_shape&0x07) << 9) | // 9,10,11 - cursor shape based on DECSCUSR + (termconf_live.crlf_mode << 12) | + (scr.bracketed_paste << 13) + ); } +#define SEQ_TAG_REPEAT '\x02' +#define SEQ_TAG_COLORS '\x03' +#define SEQ_TAG_ATTRS '\x04' +#define SEQ_TAG_FG '\x05' +#define SEQ_TAG_BG '\x06' + int i = ss->index; while(i < W*H && remain > 12) { cell = cell0 = &screen[i]; @@ -1333,7 +1676,7 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) && cell->fg == ss->lastFg && cell->bg == ss->lastBg && cell->attrs == ss->lastAttrs - && strneq(cell->c, ss->lastChar, 4)) { + && cell->symbol == ss->lastSymbol) { // Repeat repCnt++; cell = &screen[++i]; @@ -1342,11 +1685,13 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) if (repCnt == 0) { // No repeat bool changeAttrs = cell0->attrs != ss->lastAttrs; - bool changeColors = (cell0->fg != ss->lastFg || cell0->bg != ss->lastBg); + bool changeFg = cell0->fg != ss->lastFg; + bool changeBg = cell0->bg != ss->lastBg; + bool changeColors = changeFg && changeBg; Color fg, bg; // Reverse fg and bg if we're in global reverse mode - if (! scr.reverse) { + if (! scr.reverse_video) { fg = cell0->fg; bg = cell0->bg; } @@ -1355,42 +1700,56 @@ screenSerializeToBuffer(char *buffer, size_t buf_len, void **data) bg = cell0->fg; } - if (!changeAttrs && changeColors) { - encode2B(fg | (bg<<4), &w1); - bufprint("\x03%c%c", w1.lsb, w1.msb); + if (changeColors) { + bufput_t3B(SEQ_TAG_COLORS, bg<<8 | fg); } - else if (changeAttrs && !changeColors) { - // attrs only - encode2B(cell0->attrs, &w1); - bufprint("\x04%c%c", w1.lsb, w1.msb); + else if (changeFg) { + bufput_t2B(SEQ_TAG_FG, fg); } - else if (changeAttrs && changeColors) { - // colors and attrs - encode3B((u32) (fg | (bg<<4) | (cell0->attrs<<8)), &lw1); - bufprint("\x01%c%c%c", lw1.lsb, lw1.msb, lw1.xsb); + else if (changeBg) { + bufput_t2B(SEQ_TAG_BG, bg); + } + + if (changeAttrs) { + bufput_t2B(SEQ_TAG_ATTRS, cell0->attrs); } // copy the symbol, until first 0 or reached 4 bytes char c; - int j = 0; - while ((c = cell->c[j++]) != 0 && j < 4) { - bufprint("%c", c); + ss->lastCharLen = 0; + unicode_cache_retrieve(cell->symbol, (u8 *) ss->lastChar); + for(int j=0; j<4; j++) { + c = ss->lastChar[j]; + if(!c) break; + bufput_c(c); + ss->lastCharLen++; } ss->lastFg = cell0->fg; ss->lastBg = cell0->bg; ss->lastAttrs = cell0->attrs; - memcpy(ss->lastChar, cell0->c, 4); + ss->lastSymbol = cell0->symbol; i++; } else { - // Repeat count - encode2B((u16) repCnt, &w1); - bufprint("\x02%c%c", w1.lsb, w1.msb); + // last character was repeated repCnt times + int savings = ss->lastCharLen*repCnt; + if (savings > 3) { + // Repeat count + bufput_t2B(SEQ_TAG_REPEAT, repCnt); + } else { + // repeat it manually + for(int k = 0; k < repCnt; k++) { + for (int j = 0; j < ss->lastCharLen; j++) { + bufput_c(ss->lastChar[j]); + } + } + } } } ss->index = i; + bufput_c('\0'); // terminate the string if (i < W*H-1) { return HTTPD_CGI_MORE; diff --git a/user/screen.h b/user/screen.h index d89d10a..30a1833 100644 --- a/user/screen.h +++ b/user/screen.h @@ -37,15 +37,16 @@ // Size designed for the terminal config structure // Must be constant to avoid corrupting user config after upgrade #define TERMCONF_SIZE 300 +#define TERMCONF_VERSION 5 #define TERM_BTN_LEN 10 #define TERM_BTN_MSG_LEN 10 #define TERM_TITLE_LEN 64 #define TERM_BTN_COUNT 5 -#define SCR_DEF_DISPLAY_TOUT_MS 10 -#define SCR_DEF_DISPLAY_COOLDOWN_MS 30 -#define SCR_DEF_PARSER_TOUT_MS 10 +#define SCR_DEF_DISPLAY_TOUT_MS 12 +#define SCR_DEF_DISPLAY_COOLDOWN_MS 35 +#define SCR_DEF_PARSER_TOUT_MS 0 #define SCR_DEF_FN_ALT_MODE true // true - SS3 codes, easier to parse & for xterm compatibility #define SCR_DEF_WIDTH 26 #define SCR_DEF_HEIGHT 10 @@ -54,9 +55,24 @@ /** Maximum screen size (determines size of the static data array) */ #define MAX_SCREEN_SIZE (80*25) -#define TERMCONF_VERSION 3 +enum CursorShape { + CURSOR_BLOCK_BL = 0, + CURSOR_DEFAULT = 1, // this is translated to a user configured style + CURSOR_BLOCK = 2, + CURSOR_UNDERLINE_BL = 3, + CURSOR_UNDERLINE = 4, + CURSOR_BAR_BL = 5, + CURSOR_BAR = 6, +}; + +#define SCR_DEF_SHOW_BUTTONS 0 +#define SCR_DEF_SHOW_MENU 1 +#define SCR_DEF_CURSOR_SHAPE CURSOR_BLOCK_BL +#define SCR_DEF_CRLF 0 +#define SCR_DEF_ALLFN 0 // --- Persistent Settings --- +#define CURSOR_BLINKS(shape) ((shape)==CURSOR_BLOCK_BL||(shape)==CURSOR_UNDERLINE_BL||(shape)==CURSOR_BAR_BL) typedef struct { u32 width; @@ -75,6 +91,9 @@ typedef struct { bool show_buttons; bool show_config_links; char btn_msg[TERM_BTN_COUNT][TERM_BTN_MSG_LEN]; + enum CursorShape cursor_shape; + bool crlf_mode; + bool want_all_fn; } TerminalConfigBundle; // Live config @@ -84,7 +103,7 @@ extern TerminalConfigBundle * const termconf; * Transient live config with no persist, can be modified via esc sequences. * terminal_apply_settings() copies termconf to this struct, erasing old scratch changes */ -extern TerminalConfigBundle termconf_scratch; +extern TerminalConfigBundle termconf_live; enum MTM { MTM_NONE = 0, @@ -173,6 +192,10 @@ void screen_scroll_down(unsigned int lines); // --- Cursor control --- +/** Set cursor shape */ +void screen_cursor_shape(enum CursorShape shape); +/** Toggle cursor blink (modifies shape) */ +void screen_cursor_blink(bool blink); /** Set cursor position */ void screen_cursor_set(int y, int x); /** Read cursor pos to given vars */ @@ -196,6 +219,8 @@ void screen_set_insert_mode(bool insert); void screen_set_newline_mode(bool nlm); /** Enable auto wrap */ void screen_wrap_enable(bool enable); +/** Enable reverse wrap-around */ +void screen_reverse_wrap_enable(bool enable); /** Set scrolling region */ void screen_set_scrolling_region(int from, int to); /** Enable or disable origin remap to top left of scrolling region */ @@ -212,6 +237,7 @@ typedef uint8_t Color; // 0-16 #define ATTR_BLINK (1<<4) #define ATTR_FRAKTUR (1<<5) #define ATTR_STRIKE (1<<6) +#define ATTR_OVERLINE (1<<7) /** Set cursor foreground color */ void screen_set_fg(Color color); @@ -221,6 +247,8 @@ void screen_set_bg(Color color); void screen_set_sgr(u8 attrs, bool ena); /** Set the inverse attribute */ void screen_set_sgr_inverse(bool ena); +/** Conceal style */ +void screen_set_sgr_conceal(bool ena); /** Reset cursor attribs */ void screen_reset_sgr(void); @@ -234,6 +262,12 @@ void screen_set_numpad_alt_mode(bool app_mode); void screen_set_cursors_alt_mode(bool app_mode); /** Set reverse video mode */ void screen_set_reverse_video(bool reverse); +/** Save DECOPT */ +void screen_save_private_opt(int n); +/** Restore DECOPT */ +void screen_restore_private_opt(int n); +/** Set bracketed paste */ +void screen_set_bracketed_paste(bool ena); // --- Charset --- @@ -271,6 +305,12 @@ void screen_putchar(const char *ch); */ void screen_fill_with_E(void); +/** + * Repeat last graphic character + * @param count + */ +void screen_repeat_last_character(int count); + // --- Queries --- /** Report current SGR as num;num;... for DAC query */ diff --git a/user/serial.c b/user/serial.c index e27d8c8..4ecb128 100644 --- a/user/serial.c +++ b/user/serial.c @@ -4,7 +4,7 @@ #include "ansi_parser.h" #include "syscfg.h" -#define LOGBUF_SIZE 2048 +#define LOGBUF_SIZE 512 static char logbuf[LOGBUF_SIZE]; static u32 lb_nw = 1; static u32 lb_ls = 0; @@ -18,9 +18,10 @@ static void buf_putc(char c) } } -static void buf_pop(void *unused) +static void ICACHE_FLASH_ATTR +buf_pop(void *unused) { - u32 quantity = 32; + u32 quantity = 16; u32 old_ls; while (quantity > 0) { // stop when done @@ -30,7 +31,7 @@ static void buf_pop(void *unused) lb_ls++; if (lb_ls >= LOGBUF_SIZE) lb_ls = 0; - if (OK == UART_WriteCharCRLF(UART1, logbuf[lb_ls], 1000)) { + if (OK == UART_WriteCharCRLF(UART1, logbuf[lb_ls], 5)) { quantity--; } else { // try another time diff --git a/user/sgr.h b/user/sgr.h index d87c3df..e4a3aaf 100644 --- a/user/sgr.h +++ b/user/sgr.h @@ -14,15 +14,29 @@ enum SGR_CODES { SGR_BLINK = 5, SGR_BLINK_FAST = 6, SGR_INVERSE = 7, + SGR_CONCEAL = 8, SGR_STRIKE = 9, SGR_FRAKTUR = 20, + SGR_OVERLINE = 53, + + SGR_NO_BOLD = 21, + SGR_NO_BOLD_FAINT = 22, + SGR_NO_ITALIC_FRACTUR = 23, + SGR_NO_UNDERLINE = 24, + SGR_NO_BLINK = 25, + SGR_NO_INVERSE = 27, + SGR_NO_CONCEAL = 28, + SGR_NO_STRIKE = 29, + SGR_NO_OVERLINE = 55, SGR_FG_START = 30, SGR_FG_END = 37, SGR_FG_DEFAULT = 39, + SGR_FG_256 = 38, SGR_BG_START = 40, SGR_BG_END = 47, + SGR_BG_256 = 48, SGR_BG_DEFAULT = 49, SGR_FG_BRT_START = 90, @@ -32,6 +46,4 @@ enum SGR_CODES { SGR_BG_BRT_END = 107, }; -#define SGR_OFF(n) (20+(n)) - #endif //ESP_VT100_FIRMWARE_SGR_H diff --git a/user/uart_buffer.c b/user/uart_buffer.c index a32f8d8..6eaf5d3 100644 --- a/user/uart_buffer.c +++ b/user/uart_buffer.c @@ -62,7 +62,8 @@ UART_AsyncBufferInit(uint32 buf_size) * @param pdata - data src * @param data_len - data len */ -static void UART_WriteToAsyncBuffer(struct UartBuffer *pCur, const char *pdata, uint16 data_len) +static void ICACHE_FLASH_ATTR +UART_WriteToAsyncBuffer(struct UartBuffer *pCur, const char *pdata, uint16 data_len) { if (data_len == 0) return; diff --git a/user/uart_handler.c b/user/uart_handler.c index 59d8f67..a3d0a00 100755 --- a/user/uart_handler.c +++ b/user/uart_handler.c @@ -118,7 +118,8 @@ void ICACHE_FLASH_ATTR UART_SetupAsyncReceiver(void) * * @param events */ -static void uart_recvTask(os_event_t *events) +static void ICACHE_FLASH_ATTR +uart_recvTask(os_event_t *events) { //#define PROCESS_CHUNK_LEN 64 // static char buf[PROCESS_CHUNK_LEN]; @@ -158,7 +159,8 @@ static void uart_recvTask(os_event_t *events) * * @param events */ -static void uart_processTask(os_event_t *events) +static void ICACHE_FLASH_ATTR +uart_processTask(os_event_t *events) { static char buf[PROCESS_CHUNK_LEN]; diff --git a/user/user_main.c b/user/user_main.c index c51b3f5..5cdb3e0 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -64,12 +64,12 @@ static void ICACHE_FLASH_ATTR prHeapTimerCb(void *arg) if (diff == 0) { if (cnt == 5) { // only every 5 secs if no change - dbg("Free heap: %d bytes", heap); + dbg("FH: %d", heap); cnt = 0; } } else { // report change - dbg("Free heap: %d bytes (%s%d)", heap, cc, diff); + dbg("FH: %d (%s%d)", heap, cc, diff); cnt = 0; } @@ -79,13 +79,14 @@ static void ICACHE_FLASH_ATTR prHeapTimerCb(void *arg) // Deferred init static void user_start(void *unused); +static void user_start2(void *unused); + +static ETSTimer userStartTimer; +static ETSTimer prHeapTimer; //Main routine. Initialize stdout, the I/O, filesystem and the webserver and we're done. void ICACHE_FLASH_ATTR user_init(void) { - static ETSTimer userStartTimer; - static ETSTimer prHeapTimer; - serialInitBase(); // Prevent WiFi starting and connecting by default @@ -113,25 +114,21 @@ void ICACHE_FLASH_ATTR user_init(void) #if DEBUG_HEAP // Heap use timer & blink - os_timer_disarm(&prHeapTimer); - os_timer_setfn(&prHeapTimer, prHeapTimerCb, NULL); - os_timer_arm(&prHeapTimer, 1000, 1); + TIMER_START(&prHeapTimer, prHeapTimerCb, 1000, 1); #endif // do later (some functions do not work if called from user_init) - os_timer_disarm(&userStartTimer); - os_timer_setfn(&userStartTimer, user_start, NULL); - os_timer_arm(&userStartTimer, 10, 0); + TIMER_START(&userStartTimer, user_start, 10, 0); } -static void user_start(void *unused) + +static void ICACHE_FLASH_ATTR user_start(void *unused) { // Load and apply stored settings, or defaults if stored settings are invalid persist_load(); captdnsInit(); httpdInit(routes, 80); - screen_init(); // Print the CANCEL character to indicate the module has restarted // Critically important for client application if any kind of screen persistence / content re-use is needed diff --git a/user/utf8.c b/user/utf8.c new file mode 100644 index 0000000..bc67de0 --- /dev/null +++ b/user/utf8.c @@ -0,0 +1,178 @@ +// +// Created by MightyPork on 2017/09/10. +// + +#include +#include "utf8.h" + +typedef struct __attribute__((packed)) { + char bytes[4]; + uint16_t count; +} UnicodeCacheSlot; + +static UnicodeCacheSlot cache[UNICODE_CACHE_SIZE]; + +#define REF_TO_ID(c) (u8)((c) >= 127 ? (c) - 95 : (c)) +#define ID_TO_REF(c) (UnicodeCacheRef)((c) > 31 ? (c) + 95 : c) + +/** + * Clear the entire cache + * @return + */ +void ICACHE_FLASH_ATTR +unicode_cache_clear(void) { + utfc_dbg("utf8 cache clear!"); + for (int slot = 0; slot < UNICODE_CACHE_SIZE; slot++) { + cache[slot].count=0; + } +} + +/** + * Add a code point to the cache. ASCII is passed through. + * If the code point is already stored, its use counter is incremented. + * + * @param bytes - utf8 bytes + * @return the obtained look-up reference + */ +UnicodeCacheRef ICACHE_FLASH_ATTR +unicode_cache_add(const u8 *bytes) { + if (bytes[0] < 32) { + utfc_warn("utf8 cache bad char '%c'", bytes[0]); + return '?'; + } + if (bytes[0] < 127) return bytes[0]; // ASCII, bypass + + u8 slot; + for (slot = 0; slot < UNICODE_CACHE_SIZE; slot++) { + if (strneq(cache[slot].bytes, bytes, 4)) { + cache[slot].count++; + if (cache[slot].count == 1) { + utfc_dbg("utf8 cache new '%.4s' @ %d", bytes, slot); + } else { + utfc_dbg("utf8 cache inc '%.4s' @ %d, %d uses", bytes, slot, cache[slot].count); + } + goto suc; + } + } + for (slot = 0; slot < UNICODE_CACHE_SIZE; slot++) { + if (cache[slot].count==0) { + // empty slot, store it + strncpy(cache[slot].bytes, (const char *) bytes, 4); // this will zero out the remainder + cache[slot].count = 1; + utfc_dbg("utf8 cache new '%.4s' @ %d", bytes, slot); + goto suc; + } + } + error("utf8 cache full"); + return '?'; // fallback to normal ASCII that will show to the user + suc: + return ID_TO_REF(slot); +} + +/** + * Look up a code point in the cache by reference. Do not change the use counter. + * + * @param ref - reference obtained earlier using unicode_cache_add() + * @param target - buffer of size 4 to hold the result. + * @return true if the look-up succeeded + */ +bool ICACHE_FLASH_ATTR +unicode_cache_retrieve(UnicodeCacheRef ref, u8 *target) { + if (!IS_UNICODE_CACHE_REF(ref)) { + // ASCII, bypass + target[0] = ref; + target[1] = 0; + return true; + } + + u8 slot = REF_TO_ID(ref); + if (cache[slot].count == 0) { + // "use after free" + target[0] = '?'; + target[1] = 0; + utfc_warn("utf8 cache use-after-free @ %d ('%.4s')", slot, cache[slot].bytes); + return false; + } + + //utfc_dbg("utf8 cache hit '%.4s' @ %d", cache[slot].bytes, slot, cache[slot].count); + strncpy((char*)target, cache[slot].bytes, 4); + return true; +} + +/** + * Remove an occurence of a code point from the cache. + * If the code point is used more than once, the use counter is decremented. + * + * @param ref - reference to remove or reduce + * @return true if the code point was found in the cache + */ +bool ICACHE_FLASH_ATTR +unicode_cache_remove(UnicodeCacheRef ref) { + if (!IS_UNICODE_CACHE_REF(ref)) return true; // ASCII, bypass + + u8 slot = REF_TO_ID(ref); + + if (cache[slot].count == 0) { + utfc_warn("utf8 cache double-free @ %d ('%.4s')", slot, cache[slot].bytes); + return false; + } + + cache[slot].count--; + if (cache[slot].count) { + utfc_dbg("utf8 cache sub '%.4s' @ %d, %d uses remain", cache[slot].bytes, slot, cache[slot].count); + } else { + utfc_dbg("utf8 cache del '%.4s' @ %d", cache[slot].bytes, slot); + } + return true; +} + + +/** + * Encode a code point using UTF-8 + * + * @param out - output buffer (min 4 characters), will be 0-terminated if shorten than 4 + * @param utf - code point 0-0x10FFFF + * @return number of bytes on success, 0 on failure (also produces U+FFFD, which uses 3 bytes) + */ +int ICACHE_FLASH_ATTR +utf8_encode(char *out, uint32_t utf) +{ + if (utf <= 0x7F) { + // Plain ASCII + out[0] = (char) utf; + out[1] = 0; + return 1; + } + else if (utf <= 0x07FF) { + // 2-byte unicode + out[0] = (char) (((utf >> 6) & 0x1F) | 0xC0); + out[1] = (char) (((utf >> 0) & 0x3F) | 0x80); + out[2] = 0; + return 2; + } + else if (utf <= 0xFFFF) { + // 3-byte unicode + out[0] = (char) (((utf >> 12) & 0x0F) | 0xE0); + out[1] = (char) (((utf >> 6) & 0x3F) | 0x80); + out[2] = (char) (((utf >> 0) & 0x3F) | 0x80); + out[3] = 0; + return 3; + } + else if (utf <= 0x10FFFF) { + // 4-byte unicode + out[0] = (char) (((utf >> 18) & 0x07) | 0xF0); + out[1] = (char) (((utf >> 12) & 0x3F) | 0x80); + out[2] = (char) (((utf >> 6) & 0x3F) | 0x80); + out[3] = (char) (((utf >> 0) & 0x3F) | 0x80); +// out[4] = 0; + return 4; + } + else { + // error - use replacement character + out[0] = (char) 0xEF; + out[1] = (char) 0xBF; + out[2] = (char) 0xBD; + out[3] = 0; + return 0; + } +} diff --git a/user/utf8.h b/user/utf8.h new file mode 100644 index 0000000..d0c0e57 --- /dev/null +++ b/user/utf8.h @@ -0,0 +1,72 @@ +// +// Created by MightyPork on 2017/09/10. +// + +#ifndef ESPTERM_UTF8_H +#define ESPTERM_UTF8_H + +#include + +// 160 is maximum possible +#define UNICODE_CACHE_SIZE 100 + +typedef u8 UnicodeCacheRef; +#define IS_UNICODE_CACHE_REF(c) ((c) < 32 || (c) >= 127) + +/** + * Clear the entire cache + * @return + */ +void unicode_cache_clear(void); + +/** + * Add a code point to the cache. ASCII is passed through. + * If the code point is already stored, its use counter is incremented. + * + * @param bytes - utf8 bytes + * @return the obtained look-up reference + */ +UnicodeCacheRef unicode_cache_add(const u8 *bytes); + +/** + * Look up a code point in the cache by reference. Do not change the use counter. + * + * @param ref - reference obtained earlier using unicode_cache_add() + * @param target - buffer of size 4 to hold the result. + * @return true if the look-up succeeded + */ +bool unicode_cache_retrieve(UnicodeCacheRef ref, u8 *target); + +/** + * Remove an occurence of a code point from the cache. + * If the code point is used more than once, the use counter is decremented. + * + * @param ref - reference to remove or reduce + * @return true if the code point was found in the cache + */ +bool unicode_cache_remove(UnicodeCacheRef ref); + + +/** + * Encode a code point using UTF-8 + * + * @author Ondřej Hruška + * @license MIT + * + * @param out - output buffer (min 4 characters), will be 0-terminated if shorten than 4 + * @param utf - code point 0-0x10FFFF + * @return number of bytes on success, 0 on failure (also produces U+FFFD, which uses 3 bytes) + */ +int utf8_encode(char *out, uint32_t utf); + +#if DEBUG_UTFCACHE +#define utfc_warn warn +#define utfc_dbg dbg +#define utfc_info info +#else +#define utfc_warn(fmt, ...) +#define utfc_dbg(fmt, ...) +#define utfc_info(fmt, ...) +#endif + +#endif //ESPTERM_UTF8_H diff --git a/user/version.h b/user/version.h index c4ef1ed..ff966a1 100644 --- a/user/version.h +++ b/user/version.h @@ -6,11 +6,12 @@ #define ESP_VT100_FIRMWARE_VERSION_H #define FW_V_MAJOR 1 -#define FW_V_MINOR 0 -#define FW_V_PATCH 2 +#define FW_V_MINOR 1 +#define FW_V_PATCH 0 -#define FIRMWARE_VERSION STR(FW_V_MAJOR) "." STR(FW_V_MINOR) "." STR(FW_V_PATCH) "+" GIT_HASH +#define FIRMWARE_VERSION STR(FW_V_MAJOR) "." STR(FW_V_MINOR) "." STR(FW_V_PATCH) #define FIRMWARE_VERSION_NUM (FW_V_MAJOR*1000 + FW_V_MINOR*10 + FW_V_PATCH) // this is used in ID queries -#define TERMINAL_GITHUB_REPO "https://github.com/MightyPork/ESPTerm" +#define TERMINAL_GITHUB_REPO "https://github.com/espterm/espterm-firmware" +#define TERMINAL_GITHUB_REPO_FRONT "https://github.com/espterm/espterm-front-end" #endif //ESP_VT100_FIRMWARE_VERSION_H diff --git a/user/wifimgr.c b/user/wifimgr.c index 942f5f4..2d20f9e 100644 --- a/user/wifimgr.c +++ b/user/wifimgr.c @@ -48,28 +48,28 @@ wifimgr_restore_defaults(void) static void ICACHE_FLASH_ATTR configure_station(void) { - info("[WiFi] Configuring Station mode..."); + wifi_info("[WiFi] Configuring Station mode..."); struct station_config conf; strcpy((char *) conf.ssid, (char *) wificonf->sta_ssid); strcpy((char *) conf.password, (char *) wificonf->sta_password); - dbg("[WiFi] Connecting to \"%s\", password \"%s\"", conf.ssid, conf.password); + wifi_dbg("[WiFi] Connecting to \"%s\"%s password", conf.ssid, conf.password[0]!=0?" using saved":", no"); conf.bssid_set = 0; conf.bssid[0] = 0; wifi_station_disconnect(); wifi_station_set_config_current(&conf); if (wificonf->sta_dhcp_enable) { - dbg("[WiFi] Starting DHCP..."); + wifi_dbg("[WiFi] Starting DHCP..."); if (!wifi_station_dhcpc_start()) { error("[WiFi] DHCP failed to start!"); return; } } else { - info("[WiFi] Setting up static IP..."); - dbg("[WiFi] Client.ip = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.ip.addr)); - dbg("[WiFi] Client.mask = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.netmask.addr)); - dbg("[WiFi] Client.gw = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.gw.addr)); + wifi_info("[WiFi] Setting up static IP..."); + wifi_dbg("[WiFi] Client.ip = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.ip.addr)); + wifi_dbg("[WiFi] Client.mask = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.netmask.addr)); + wifi_dbg("[WiFi] Client.gw = "IPSTR, GOOD_IP2STR(wificonf->sta_addr.gw.addr)); wifi_station_dhcpc_stop(); // Load static IP config @@ -79,7 +79,7 @@ configure_station(void) } } - info("[WiFi] Trying to connect to AP..."); + wifi_info("[WiFi] Trying to connect to AP..."); wifi_station_connect(); } @@ -88,7 +88,7 @@ configure_ap(void) { bool suc; - info("[WiFi] Configuring SoftAP mode..."); + wifi_info("[WiFi] Configuring SoftAP mode..."); // AP is enabled struct softap_config conf; conf.channel = wificonf->ap_channel; @@ -110,10 +110,10 @@ configure_ap(void) } // Set IP - info("[WiFi] Configuring SoftAP local IP..."); - dbg("[WiFi] SoftAP.ip = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.ip.addr)); - dbg("[WiFi] SoftAP.mask = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.netmask.addr)); - dbg("[WiFi] SoftAP.gw = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.gw.addr)); + wifi_info("[WiFi] Configuring SoftAP local IP..."); + wifi_dbg("[WiFi] SoftAP.ip = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.ip.addr)); + wifi_dbg("[WiFi] SoftAP.mask = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.netmask.addr)); + wifi_dbg("[WiFi] SoftAP.gw = "IPSTR, GOOD_IP2STR(wificonf->ap_addr.gw.addr)); wifi_softap_dhcps_stop(); @@ -123,10 +123,10 @@ configure_ap(void) return; } - info("[WiFi] Configuring SoftAP DHCP server..."); - dbg("[WiFi] DHCP.start = "IPSTR, GOOD_IP2STR(wificonf->ap_dhcp_range.start_ip.addr)); - dbg("[WiFi] DHCP.end = "IPSTR, GOOD_IP2STR(wificonf->ap_dhcp_range.end_ip.addr)); - dbg("[WiFi] DHCP.lease = %d minutes", wificonf->ap_dhcp_time); + wifi_info("[WiFi] Configuring SoftAP DHCP server..."); + wifi_dbg("[WiFi] DHCP.start = "IPSTR, GOOD_IP2STR(wificonf->ap_dhcp_range.start_ip.addr)); + wifi_dbg("[WiFi] DHCP.end = "IPSTR, GOOD_IP2STR(wificonf->ap_dhcp_range.end_ip.addr)); + wifi_dbg("[WiFi] DHCP.lease = %d minutes", wificonf->ap_dhcp_time); if (!wifi_softap_set_dhcps_lease(&wificonf->ap_dhcp_range)) { error("[WiFi] DHCP address range set fail!"); @@ -154,7 +154,7 @@ configure_ap(void) void ICACHE_FLASH_ATTR wifimgr_apply_settings(void) { - info("[WiFi] Initializing..."); + wifi_info("[WiFi] Initializing..."); // !!! Update to current version !!! @@ -190,5 +190,5 @@ wifimgr_apply_settings(void) wifi_change_flags.ap = false; wifi_change_flags.sta = false; - info("[WiFi] WiFi settings applied."); + wifi_info("[WiFi] WiFi settings applied."); } diff --git a/user/wifimgr.h b/user/wifimgr.h index 5dc9043..33c49bb 100644 --- a/user/wifimgr.h +++ b/user/wifimgr.h @@ -60,4 +60,14 @@ void wifimgr_restore_defaults(void); void wifimgr_apply_settings(void); +#if DEBUG_WIFI +#define wifi_warn warn +#define wifi_dbg dbg +#define wifi_info info +#else +#define wifi_warn(fmt, ...) +#define wifi_dbg(fmt, ...) +#define wifi_info(fmt, ...) +#endif + #endif //ESP_VT100_FIRMWARE_WIFI_MANAGER_H