├── LICENSE ├── README.md ├── plotly-user.asd ├── screenshot-readme.png ├── src ├── clog-plotly-extensions.lisp ├── plotly-user.lisp └── plotly.lisp └── www ├── boot.html ├── css ├── images │ ├── ui-icons_444444_256x240.png │ ├── ui-icons_555555_256x240.png │ ├── ui-icons_777620_256x240.png │ ├── ui-icons_777777_256x240.png │ ├── ui-icons_cc0000_256x240.png │ └── ui-icons_ffffff_256x240.png ├── jquery-ui.css ├── jquery-ui.structure.css ├── jquery-ui.theme.css └── w3.css ├── favicon.ico ├── img ├── clogicon.png ├── clogwicon.png ├── lisplogo_128.png └── lisplogo_warning2_128.png ├── js ├── jquery-ui.js └── jquery.min.js └── robots.txt /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2023, Andrew J. Berkley 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | 1. Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | 2. Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | 3. Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived from 17 | this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 23 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # plotly-user 2 | 3 | This package is just in its infancy. 4 | 5 | A Common Lisp package for interactive investigation of data sets and 6 | fits using 2D and 3D plots. The visual interface is browser based using plotly, 7 | but the intent is the user spends most of their time at the Common 8 | Lisp REPL working with data and generating plots in the browser as 9 | they investigate data. 10 | 11 | I do want a significant amount of interactivity from the browser based interface 12 | though--- it isn't just going to provide static plots. That's because I am aiming 13 | to replace my current workflow which uses Matlab. The interactivity 14 | out of the box of plotly isn't even close to what Matlab provides, but I think 15 | a minimally acceptable feature set is achievable without too much work. Using 16 | CLOG to push most of the interactivity code to the Common Lisp server side is nice 17 | because I prefer coding in Common Lisp over Javascript, but it's unlikely I'll 18 | completely avoid having to shim things into the Javascript side. 19 | 20 | ## Installing 21 | ``` 22 | cd ~/quicklisp/local-projects 23 | git clone https://github.com/ajberkley/plotly-user.git 24 | git clone https://github.com/rabbibotton/clog-plotly.git 25 | git clone https://github.com/rabbibotton/clog.git 26 | git clone https://github.com/fukamachi/lack.git 27 | git clone https://github.com/fukamachi/clack.git 28 | ``` 29 | 30 | ``` 31 | CL-USER> (quicklisp:quickload "PLOTLY-USER") 32 | CL-USER> (in-package "PLOTLY-USER") 33 | PLOTLY-USER> (maybe-start-workbench) 34 | PLOTLY-USER> (demo) 35 | ``` 36 | 37 | This should result in: 38 | ![Screenshot](./screenshot-readme.png) 39 | 40 | ## Main dependencies 41 | [CLOG](https://github.com/rabbibotton/clog): This provides the browser based user interface and is a great framework for quick development of such things. 42 | 43 | [SHASHT](https://github.com/yitzchak/shasht): We talk back and forth to the browser through JSON, so need a JSON encoder. This one worked easily. 44 | 45 | [PLOTLY](https://plotly.com/javascript/): The javascript plotly library is the visualization library. 46 | 47 | Alexandria: the main collection of lisp niceties. 48 | 49 | ## Intended interactions 50 | 51 | It would be good to support the data-frame used by 52 | [Lisp-Stat](https://github.com/Lisp-Stat). It would be nice to make 53 | this package work nicely with Lisp-Stat, which uses Vega for the 54 | current plotting which does not handle 3D data sets in a useful way. 55 | -------------------------------------------------------------------------------- /plotly-user.asd: -------------------------------------------------------------------------------- 1 | (asdf:defsystem #:plotly-user 2 | :description "Generate pretty plots in your browser from the REPL" 3 | :author "Andrew J. Berkley " 4 | :license "BSD 3-clause" 5 | :version "0.0.1" 6 | :serial t 7 | :entry-point "plotly-user:maybe-start-workbench" 8 | :depends-on (#:clog #:clog-plotly #:alexandria #:shasht #:bordeaux-threads) 9 | :components ((:module "src" 10 | :components ((:file "plotly") 11 | (:file "plotly-user") 12 | (:file "clog-plotly-extensions"))) 13 | (:module "www"))) 14 | 15 | -------------------------------------------------------------------------------- /screenshot-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/screenshot-readme.png -------------------------------------------------------------------------------- /src/clog-plotly-extensions.lisp: -------------------------------------------------------------------------------- 1 | (in-package :clog-plotly) 2 | ;; code that clog-plotly should have but doesn't yet 3 | 4 | ;; we want which button, where the nearest point is 5 | ;; we can't get clicks on title --- for that we'd need to grab the underlying d3 6 | ;; title thing and bind a callback on it. We also can't get clicks on the x or y 7 | ;; axis. I think just having an editing mode come up when you double click the plot... 8 | 9 | ;; So, if you single click on a point, we get it and can just turn on an annotation. 10 | 11 | (defmethod set-on-plotly-click ((obj clog-plotly-element) handler &key one-time cancel-event) 12 | (clog::set-event obj "plotly_click" 13 | handler 14 | :call-back-script "+ '{ \"x\":' + data.points[0].x + ', \"y\":' + data.points[0].y + ', \"z\":' + (data.points[0].z || false) + '}'" 15 | :cancel-event cancel-event 16 | :one-time one-time)) 17 | 18 | (defgeneric new-plot-plotly* (clog-plotly-element json-data json-layout &optional json-config) 19 | (:documentation "Plot with plotly json-data and json-layout")) 20 | 21 | (defmethod new-plot-plotly* ((obj clog-plotly-element) json-data json-layout &optional (json-config "")) 22 | (js-execute obj (format nil "Plotly.newPlot(~A, ~A, ~A, ~A)" 23 | (script-id obj) json-data json-layout json-config))) 24 | -------------------------------------------------------------------------------- /src/plotly-user.lisp: -------------------------------------------------------------------------------- 1 | (defpackage #:plotly-user 2 | (:use #:cl #:clog-plotly #:plotly) 3 | (:import-from #:clog) 4 | (:import-from #:clog-gui) 5 | (:import-from #:shasht) 6 | (:import-from #:alexandria #:compose) 7 | (:import-from #:bordeaux-threads #:make-lock #:with-lock-held) 8 | (:documentation 9 | "An interactive data exploration workspace. The underlying plotting is handled by 10 | plotly in a browser which we talk to via CLOG. 11 | 12 | Goals: reproduce much of the functionality that matlab provides in 13 | terms of interactive plotting. Provide a persistent work space for 14 | working with plots of data.") 15 | (:export 16 | #:maybe-start-workbench 17 | #:get-active-plot 18 | )) 19 | 20 | (in-package :plotly-user) 21 | 22 | ;; Trying to avoid providing a full windowing system, we provide for 23 | ;; multiple browser connections with two main modes, a tabbed plot container, 24 | ;; and a free form windowed plot container, on top of the subplot feature of 25 | ;; plotly. We provide for multiple browser tabs / browsers connected simultaneously 26 | ;; to the same repl (instead of providing a full windowing system) 27 | 28 | (defclass browser-window-plot-container () 29 | ((body :accessor body :initarg :body) 30 | (name :accessor name :initarg :name) 31 | (plots :accessor plots :initarg :plots :initform (make-instance 'plots))) 32 | (:documentation "An active window in the browser with an associated clog-body.")) 33 | 34 | (defclass full-screen-tabbed-plot-container (browser-window-plot-container) ()) 35 | 36 | (defclass free-form-plot-container (browser-window-plot-container) ()) 37 | 38 | (defgeneric plot-container-visible (plot-container)) 39 | 40 | (defgeneric close-plot (container plot)) 41 | 42 | (defmethod close-plot ((container free-form-plot-container) plot) 43 | (clog-gui:window-close (parent plot))) 44 | 45 | (defgeneric focus (container plot)) 46 | 47 | (defmethod focus ((container free-form-plot-container) plot) 48 | (setf *current-browser-window* container) 49 | (clog-gui:window-focus (parent plot)) 50 | (setf (current-plot (plots container)) plot)) 51 | 52 | (defgeneric new-plot (container &optional id)) 53 | 54 | (defvar *browser-windows* nil 55 | "A list of browser-window-plot-containers. Remember, this is a singleton service -- 56 | the user is interacting from a REPL to a browser.") 57 | 58 | (defvar *current-browser-window* nil 59 | "The last active window -- where the user last clicked usually, or the one with the 60 | last drawn on figure or the last selected figure with (figure n).") 61 | 62 | (defun set-active-browser-window (browser-window) 63 | (setf *current-browser-window* browser-window)) 64 | 65 | (defun get-active-browser-window () 66 | (or *current-browser-window* (nth 0 *browser-windows*))) 67 | 68 | (defun connected (browser-window) 69 | (and (body browser-window) (clog::validp (body browser-window)))) 70 | 71 | (defun browser-window-active (browser-window) 72 | (not (string= (clog:query (clog:html-document (body browser-window)) "hidden") "true"))) 73 | 74 | (defun reset-state () 75 | (setf *browser-windows* nil 76 | *current-browser-window* nil) 77 | (reset-ids) 78 | (values)) 79 | 80 | (defun get-current-plot (&optional (create-if-does-not-exist t)) 81 | "Return a `plot' that is active, or create a new one (including a browser connection)" 82 | (let* ((browser-window (get-active-browser-window)) 83 | (plots (and browser-window (plots browser-window)))) 84 | (or (current-plot plots) 85 | (when create-if-does-not-exist 86 | (unless browser-window 87 | (setf browser-window (maybe-start-workbench))) 88 | (new-plot browser-window))))) 89 | 90 | (defclass plot (plotly-plot) 91 | ((id :reader plot-id :type fixnum :initarg :id :documentation "A unique numeric id, 92 | used for user short hand access through (figure id).") 93 | (name :accessor plot-name :type string :initarg :name :initform "" 94 | :documentation "A user set id, usually the title of the plot frame") 95 | (plotly :accessor clog-plotly :initarg :clog-plotly-element :documentation " 96 | Hold a reference to a `clog-plotly:clog-plotly-element'.") 97 | (parent :accessor parent :initarg :parent :documentation "A `clog-gui:clog-gui-window'") 98 | (hold :accessor hold :initform nil :type (member nil :on :all) 99 | :documentation "State of 'trace hold'. nil means new traces should clear the plot 100 | first, :on means they should be appended, :all means they should be appended and a new 101 | color / marker should be chosen automatically for them (not implemented).") 102 | (closing :accessor closing :initform nil :documentation "Set to t when the figure is 103 | being closed, to handle multiple callbacks without confusion.") 104 | (data :accessor data :initform nil :documentation "Stores the data needed to recreate the plot")) 105 | (:documentation "Represents a plotly plot and the gui window frame around it.")) 106 | 107 | (defgeneric serialize (plot) 108 | (:documentation "")) 109 | 110 | (defgeneric deserialize (plot) 111 | (:documentation "")) 112 | 113 | (defclass plots () 114 | ((plots-lock :reader plots-lock :initform (make-lock "plots-lock")) 115 | (plots :accessor plots :initform (make-hash-table :test 'eql :synchronized nil) 116 | :documentation "A hashtable mapping figure-id to a `plotly::plot'") 117 | (current-plot :accessor current-plot :initform nil)) 118 | (:documentation "A collection of plots on a GUI. There is an 119 | current-plot, which is the last that was drawn to, or clicked in, 120 | like matlab. There may be multiple plots collections.")) 121 | 122 | (defgeneric plot-by-id (plots id) 123 | (:documentation "Given an id return a `plotly::plot' or nil if it does not exist in 124 | collection PLOTS") 125 | (:method ((plots plots) id) 126 | (with-lock-held ((plots-lock plots)) 127 | (gethash id (plots plots))))) 128 | 129 | (defgeneric remove-plot (plots id) 130 | (:method ((plots plots) id) 131 | (with-lock-held ((plots-lock plots)) 132 | (remhash id (plots plots))))) 133 | 134 | (defgeneric register-plot (plots plot id) 135 | (:method ((plots plots) plot id) 136 | (with-lock-held ((plots-lock plots)) 137 | (setf (gethash id (plots plots)) plot)))) 138 | 139 | ;; Unique global IDs for figures. Figure ids are not sequential as 140 | ;; users can ask for figure ids by calling (figure 100). So we just 141 | ;; set an arbitrary upper-limit, and scan for free figures when 142 | ;; needed. More complex schemes aren't worth it. 143 | 144 | (defvar *allocated-figure-ids* (make-array 128 :element-type 'bit :initial-element 0)) 145 | (defvar *figure-id-lock* (make-lock "figure-id-lock")) 146 | (defun reset-ids () 147 | (with-lock-held (*figure-id-lock*) 148 | (setf *allocated-figure-ids* (make-array 128 :element-type 'bit :initial-element 0)))) 149 | (defun return-figure-id (id) 150 | (with-lock-held (*figure-id-lock*) 151 | (setf (sbit *allocated-figure-ids* id) 0))) 152 | (defun expand-figure-id-table/no-lock 153 | (&optional (new-length (* 2 (length *allocated-figure-ids*)))) 154 | "Must be called within the *figure-id-lock*" 155 | (let ((new-array (make-array new-length :element-type 'bit))) 156 | (replace new-array *allocated-figure-ids*) 157 | (setf *allocated-figure-ids* new-array))) 158 | (defun figure-id-allocated (id) 159 | (with-lock-held (*figure-id-lock*) 160 | (= (sbit *allocated-figure-ids* id) 1))) 161 | (defun allocate-figure-id (&optional requested-id) 162 | "Returns id" 163 | (with-lock-held (*figure-id-lock*) 164 | (cond 165 | ((null requested-id) 166 | (let ((new-id (position 0 *allocated-figure-ids*))) 167 | (cond (new-id 168 | (setf (sbit *allocated-figure-ids* new-id) 1) 169 | new-id) 170 | (t 171 | (expand-figure-id-table/no-lock) 172 | (let ((position (position 0 *allocated-figure-ids*))) 173 | (setf (sbit *allocated-figure-ids* position) 1) 174 | position))))) 175 | ((and requested-id (> requested-id (1+ (length *allocated-figure-ids*)))) 176 | (expand-figure-id-table/no-lock (1+ requested-id)) 177 | (setf (sbit *allocated-figure-ids* requested-id) 1) 178 | requested-id) 179 | (requested-id 180 | (when (= (sbit *allocated-figure-ids* requested-id) 0) 181 | (setf (sbit *allocated-figure-ids* requested-id) 1)) 182 | requested-id)))) 183 | 184 | (defun get-active-plot (&optional (container (get-active-browser-window))) 185 | "Used internally; get the last clicked plot, or the zeroth plot, or create a new figure 186 | with an empty plot. Returns a `plot'" 187 | (unless container 188 | (setf container (maybe-start-workbench))) 189 | (or (current-plot (plots container)) 190 | (setf (current-plot (plots container)) (new-plot container)))) 191 | 192 | (defmethod new-plot ((container free-form-plot-container) &optional (id (allocate-figure-id))) 193 | (funcall 'on-file-new-plot (body container) id)) 194 | 195 | (defun on-file-new-plot (obj &optional (id (allocate-figure-id))) 196 | "Handles the callback when someone clicks NEW PLOT in a windowed 197 | browser window, also used to generate a new figure from the repl when 198 | calling (figure)." 199 | (declare (optimize (debug 3))) 200 | (let* ((browser-window (loop for browser-window = (clog:connection-data-item obj "container") 201 | until browser-window 202 | finally (return browser-window) 203 | do (sleep 0.1))) ;; sometimes container is not fully up yet 204 | (app (plots browser-window)) 205 | (name (format nil "Plot ~A" id)) 206 | (win (clog-gui:create-gui-window obj :title name 207 | :has-pinner t :keep-on-top t 208 | :top (+ 50 (* 500 (mod (floor id 2) 2))) 209 | :left (+ 0 (* 500 (mod id 2))) 210 | :width 500 :height 500)) 211 | (div (clog:create-div (clog-gui:window-content win))) 212 | (plotly (clog-plotly:create-clog-plotly-element div))) 213 | (clog-plotly:attach-clog-plotly plotly) 214 | (let* ((plot (make-instance 'plot :name name :parent win :id id :clog-plotly-element plotly)) 215 | (mark-current-bring-to-front 216 | (lambda (&rest rest) (declare (ignore rest)) 217 | (unless (closing plot) 218 | (set-active-browser-window browser-window) 219 | (setf (current-plot (plots browser-window)) plot) 220 | (clog-gui:window-to-top-by-title (body browser-window) name))))) 221 | (clog:set-on-click win mark-current-bring-to-front) 222 | (clog:set-on-click plotly mark-current-bring-to-front) 223 | (register-plot (plots browser-window) plot id) 224 | (clog-gui:set-on-window-size-done win (lambda (&rest rest) 225 | (declare (ignore rest)) 226 | (setf (plotly:width (plotly:layout plot)) (- (clog:width win) 10)) 227 | (setf (plotly:height (plotly:layout plot)) (- (clog:height win) 10)) 228 | (let ((new-size (serialize-to-json (plotly:layout plot)))) 229 | (relayout-plotly plotly new-size)))) 230 | (clog-gui:set-on-window-close win (lambda (&rest rest) 231 | (declare (ignore rest) (optimize (debug 3))) 232 | (let ((id (plot-id plot))) 233 | (return-figure-id id) 234 | (remove-plot app id)) 235 | (when (or (eq (current-plot app) plot) 236 | (zerop (hash-table-count (plots app)))) 237 | (setf (current-plot app) nil)) 238 | (setf (closing plot) t))) 239 | plot))) 240 | 241 | (defun create-windowed-plot-view (body) 242 | (clog-gui:clog-gui-initialize body) 243 | (clog:add-class body "w3-cyan") 244 | (let* ((menu (clog-gui:create-gui-menu-bar body)) 245 | (file (clog-gui:create-gui-menu-drop-down menu :content "File")) 246 | (win (clog-gui:create-gui-menu-drop-down menu :content "Window"))) 247 | (clog-gui:create-gui-menu-item file :content "New Plot" :on-click 'on-file-new-plot) 248 | (clog-gui:create-gui-menu-item win :content "Tile all" :on-click 'tile-all-windows) 249 | (clog-gui:create-gui-menu-item win :content "Maximize All" :on-click 'maximize-all-windows) 250 | (clog-gui:create-gui-menu-item win :content "Normalize All" :on-click 'normalize-all-windows) 251 | (clog-gui:create-gui-menu-full-screen menu)) 252 | (clog:set-on-before-unload (clog:window body) (lambda(obj) 253 | (declare (ignore obj)) 254 | ;; return empty string to prevent nav off page 255 | ""))) 256 | 257 | (defun on-new-browser-window 258 | (body &key (browser-window-name (format nil "~A: plot workbench" (length *browser-windows*))) 259 | (type (or :windowed :tabbed))) 260 | (setf (clog:title (clog:html-document body)) browser-window-name) 261 | (let ((container (make-instance 'free-form-plot-container 262 | :body body :name browser-window-name))) 263 | (push container *browser-windows*) ;; not thread safe 264 | ;; (clog:debug-mode body) -- makes the console in the browser more useful 265 | (ecase type 266 | (:windowed (create-windowed-plot-view body))) 267 | ;; Why doesn't MathJax 3.x work? 268 | (clog:load-script 269 | (clog:html-document (clog:connection-data-item body "clog-body")) 270 | "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML") 271 | (format t "Associated with new container ~A~%" container) 272 | (setf (clog:connection-data-item body "container") container))) 273 | 274 | (defun maybe-start-workbench (&optional (index 0)) 275 | "Open up a browser window if it is not already connected. Returns a 276 | `browser-window'" 277 | (let ((workbench (nth index *browser-windows*))) 278 | (cond 279 | ((and workbench (connected workbench)) 280 | workbench) 281 | (t 282 | (let ((old-window (car *browser-windows*))) 283 | (clog:initialize 'on-new-browser-window) 284 | (clog:open-browser) 285 | (loop for container = (car *browser-windows*) 286 | until (not (eq container old-window)) 287 | finally (return container))))))) 288 | 289 | (defun figure (&optional number (browser-window (get-active-browser-window))) 290 | "Create a new figure, or make an extant figure active and bring it to the front" 291 | (declare (optimize (debug 3))) 292 | (let ((browser-window (or browser-window (maybe-start-workbench)))) 293 | (cond 294 | ((and number (figure-id-allocated number)) 295 | (multiple-value-bind (browser-window figure) 296 | (find-figure number) 297 | (focus browser-window figure) 298 | (plot-by-id (plots browser-window) number))) 299 | ((and number (not (figure-id-allocated number))) 300 | (allocate-figure-id number) 301 | (focus browser-window (new-plot browser-window number))) 302 | (t 303 | (focus browser-window (new-plot browser-window)))))) 304 | 305 | (defun find-figure (number) 306 | (loop for browser-window in *browser-windows* 307 | for found = (plot-by-id (plots browser-window) number) 308 | until found 309 | finally (return (values browser-window found)))) 310 | 311 | (defun close-figure (number) 312 | "Close a figure" 313 | (multiple-value-bind (browser-window figure) 314 | (find-figure number) 315 | (when figure (close-plot browser-window figure)))) 316 | 317 | (defun plot-to-active-plot (plotly-plot &key config (active-plot (get-active-plot))) 318 | "config should be a plotly:plotly-config" 319 | (maybe-start-workbench) 320 | (let ((plotly (plotly:clog-plotly active-plot))) 321 | (clog-plotly::new-plot-plotly* 322 | plotly 323 | (serialize-to-json (plotly:traces plotly-plot)) 324 | (serialize-to-json (plotly:layout plotly-plot)) 325 | (if config (serialize-to-json config) "")))) 326 | 327 | ;; Uncertain numbers, for representing the x and y positions of data with 328 | ;; potentially asymmetric error bars 329 | 330 | (defstruct (uncertain-number (:constructor %make-uncertain-number (x s+ s-))) 331 | x s+ s-) 332 | 333 | (defun uncertain-number-s (x) 334 | (assert (= (uncertain-number-s+ x) (uncertain-number-s- x))) 335 | (uncertain-number-s+ x)) 336 | 337 | (defun make-uncertain-number (x &key s s+ s-) 338 | (%make-uncertain-number x (or s+ s) (or s- s))) 339 | 340 | (defun maybe-uncertain-to-certain (x) 341 | (if (uncertain-number-p x) (uncertain-number-x x) x)) 342 | 343 | ;; MATLAB like interfaces 344 | (defun hall () 345 | "Set the current plot to append new traces, and automatically 346 | cycle colors/markers (not currently implemented, behaves like (hon)) 347 | matlab: hold all" 348 | (setf (plotly:hold (get-active-plot)) :all)) 349 | 350 | (defun hoff () 351 | "Set the current plot to be cleared if new traces are added. 352 | matlab: hold off" 353 | (setf (plotly:hold (get-active-plot)) nil)) 354 | 355 | (defun hon (&optional (plot (get-active-plot))) 356 | "Set the current plot to append new traces to the plot. matlab: hold on" 357 | (setf (plotly:hold plot) t)) 358 | 359 | (defun refresh (plot) 360 | "Redraw. Use if you have modified, for example, the layout of the plot." 361 | (let ((plotly (plotly:clog-plotly plot))) 362 | (relayout-plotly plotly (serialize-to-json (plotly:layout plot)))) 363 | plot) 364 | 365 | (defun xlim (min max &optional (plot (get-active-plot))) 366 | "Change the visible x-range on a plot. Acts on the last clicked 367 | plot or the plot you specify (for example what is returned from 368 | creating/activating a figure with: (figure 1)). matlab: xlim([min max])" 369 | (setf (plotly:range (plotly:x-axis (plotly:layout plot))) (list min max)) 370 | (refresh plot)) 371 | 372 | (defun ylim (min max &optional (plot (get-active-plot))) 373 | "Change the visible y-range on a plot. Acts on the last clicked 374 | plot or the plot you specify (for example what is returned from 375 | creating/activating a figure with: (figure 1). matlab: ylim([min max])" 376 | (setf (plotly:range (plotly:y-axis (plotly:layout plot))) (list min max)) 377 | (refresh plot)) 378 | 379 | ;; Tools for plotting 380 | (defun data-and-style-to-traces (data-and-style) 381 | (map 'list 382 | (lambda (x) 383 | (destructuring-bind (&key data color marker marker-size line name) 384 | x 385 | (let ((data 386 | (if (not (listp (elt data 0))) 387 | (loop for count from 0 for d in data collect (list count d)) 388 | data)) 389 | (trace 390 | (make-instance 'plotly:scatter-trace :name name 391 | :x (mapcar (compose #'maybe-uncertain-to-certain #'first) data) 392 | :y (mapcar (compose #'maybe-uncertain-to-certain #'second) data)))) 393 | (when (uncertain-number-p (elt (elt data 0) 0)) ;; x-error-bars 394 | (setf (plotly:trace-error-x trace) 395 | (make-instance 'plotly:error-bar :symmetric t 396 | :array (mapcar (compose #'uncertain-number-s+ #'first) data)))) 397 | (when (uncertain-number-p (elt (elt data 0) 1)) 398 | (setf (plotly:trace-error-y trace) 399 | (make-instance 400 | 'plotly:error-bar :symmetric nil 401 | :array (mapcar (compose #'uncertain-number-s+ #'second) data) 402 | :arrayminus (mapcar (compose #'uncertain-number-s- #'second) data)))) 403 | (when line 404 | (setf (plotly:trace-line trace) 405 | (make-instance 'plotly:line :color color :line-dash line :width 2.0))) 406 | (when marker 407 | (setf (plotly:trace-marker trace) 408 | (make-instance 'plotly:marker :color color :size (or marker-size 8) :symbol marker))) 409 | (setf (plotly:trace-mode trace) 410 | (cond 411 | ((and marker line) "lines+markers") 412 | (line "lines") 413 | (t "markers"))) 414 | trace))) 415 | data-and-style)) 416 | 417 | (defun plot-data (data &rest rest) 418 | "Plot a single 2D trace or multiple 2D traces. Not a particularly good interface, but 419 | fine for playing with now. Example: 420 | (plot-data 421 | (loop for x from -10 below 10 422 | collect (list (make-uncertain-number (+ x (- (random 1.0) 0.5)) 423 | :s+ (random 0.5d0) :s- (random 0.5d0)) 424 | (make-uncertain-number (+ x (- (random 1d0) 0.5)) 425 | :s+ (random 0.5d0) :s- (random 0.5d0)))) 426 | :x-axis-label \"$\\text{Time }(\\mu\\text{s})$\" :y-axis-label \"$\\sqrt{signal}$\" 427 | :title \"A plot\" :line \"solid\" :marker \"cross\" :color \"red\" :legend '(\"my trace name\"))" 428 | (declare (optimize (debug 3))) 429 | (maybe-start-workbench) 430 | (destructuring-bind (&key color marker marker-size line title x-axis-label y-axis-label legend) 431 | (if (stringp (first rest)) 432 | (print (append (parse-matlab-style (first rest)) (cdr rest))) 433 | rest) 434 | (unless (listp legend) (setf legend (list legend))) 435 | (let* ((plot (get-active-plot)) 436 | (hold (plotly:hold plot)) 437 | (ensure-list-data 438 | (if (= (length (first data)) 2) 439 | (list (list :data data :color color :marker marker :marker-size marker-size :line line :name (or (elt legend 0) ""))) 440 | (if legend 441 | (mapcar (lambda (d l) (list :data d :color color :marker marker :marker-size marker-size :line line :name l)) 442 | data legend) 443 | (mapcar (lambda (d) (list :data d :color color :marker marker :marker-size marker-size :line line)) 444 | data))))) 445 | ;; TODO make hold all cycle colors/markers if not specified 446 | (if hold 447 | (setf (plotly:data plot) (append (plotly:data plot) ensure-list-data)) 448 | (setf (plotly:data plot) ensure-list-data)) 449 | (setf (plotly:traces plot) (data-and-style-to-traces (plotly:data plot))) 450 | (setf (plotly:width (plotly:layout plot)) (- (clog:width (plotly:parent plot)) 10)) 451 | (setf (plotly:height (plotly:layout plot)) (- (clog:height (plotly:parent plot)) 10)) 452 | (setf (plotly:text (plotly:title (plotly:layout plot))) 453 | (or title (plotly:text (plotly:title (plotly:layout plot))))) 454 | (setf (plotly:text (plotly:title (plotly:x-axis (plotly:layout plot)))) 455 | (or x-axis-label (plotly:text (plotly:title (plotly:x-axis (plotly:layout plot)))))) 456 | (setf (plotly:text (plotly:title (plotly:y-axis (plotly:layout plot)))) 457 | (or y-axis-label (plotly:text (plotly:title (plotly:y-axis (plotly:layout plot)))))) 458 | ;; Annotations don't work well yet. Trying to let plotly handle editing of them 459 | ;; makes a mess since we want to be in control of the plot. We cannot poke at them 460 | ;; or their arrows, etc. 461 | (let ((last-called (get-universal-time))) 462 | (clog-plotly::set-on-plotly-click (clog-plotly plot) 463 | (lambda (data &aux (now (get-universal-time))) 464 | (unless (= now last-called) 465 | (setf last-called now) 466 | (let ((ht (shasht:read-json data))) 467 | (toggle-annotation 468 | (layout plot) 469 | (make-instance 'plotly:annotation 470 | :x (gethash "x" ht) 471 | :y (gethash "y" ht) 472 | :text 473 | (format nil "~,3f, ~,3f" 474 | (gethash "x" ht) 475 | (gethash "y" ht)) 476 | :showarrow t)) 477 | (refresh plot)))))) 478 | (plot-to-active-plot plot ;; :config (make-instance 'plotly:plotly-config :editable t ) 479 | ))) 480 | (values)) 481 | 482 | ;; Converting from matlab single string styles to plotly styles 483 | (defun search-and-delete (search-string string) 484 | (let ((position (search search-string string))) 485 | (if position 486 | (values t (concatenate 'string (subseq string 0 position) (subseq string (+ position (length search-string))))) 487 | (values nil string)))) 488 | 489 | (defun parse-matlab-style (&optional (matlab-style "")) 490 | (let ((color "b") (marker nil) (line nil)) 491 | ;; I don't even know the syntax 492 | (loop for marker-long-name across #("square" "diamond" "pentagram" "hexagram") 493 | do (multiple-value-bind (found remainder) 494 | (search-and-delete marker-long-name matlab-style) 495 | (when found 496 | (setf marker marker-long-name) 497 | (setf matlab-style remainder)))) 498 | (loop for line-name across #("--" ":" "-." "-") 499 | for converted-line-name across #("dashed" "dot" "dashdot" "solid") 500 | do (multiple-value-bind (found remainder) 501 | (search-and-delete line-name matlab-style) 502 | (when found 503 | (setf line converted-line-name) 504 | (setf matlab-style remainder)))) 505 | (unless (= (length matlab-style) 0) 506 | (let ((maybe-color (matlab-colour->plotly-colour (elt matlab-style 0)))) 507 | (when maybe-color (setf color maybe-color) (setf matlab-style (subseq matlab-style 1))))) 508 | (unless (= (length matlab-style) 0) 509 | (let ((maybe-marker (matlab-marker->plotly-marker (elt matlab-style 0)))) 510 | (when maybe-marker (setf marker maybe-marker) (setf matlab-style (subseq matlab-style 1))))) 511 | (unless (= (length matlab-style) 0) 512 | (let ((maybe-color (matlab-colour->plotly-colour (elt matlab-style 0)))) 513 | (when maybe-color (setf color maybe-color) (setf matlab-style (subseq matlab-style 1))))) 514 | (append (when color (list :color color)) 515 | (when marker (list :marker marker)) 516 | (when line (list :line line))))) 517 | 518 | (defun matlab-marker->plotly-marker (marker-char) 519 | ;; Not complete 520 | (case marker-char 521 | (#\. "circle-dot") 522 | (#\o "circle-open") 523 | (#\d "diamond") 524 | (#\x "x") 525 | (#\* "asterix") 526 | (#\+ "cross") 527 | (#\^ "triangle-up") 528 | (#\v "triangle-down") 529 | (#\> "triangle-right") 530 | (#\< "triangle-left") 531 | (#\| "line-ns") 532 | (#\_ "line-ew"))) 533 | 534 | (defun matlab-colour->plotly-colour (colour-char) 535 | ;; translates matlab colour specifiers to plotly colours 536 | (case colour-char 537 | (#\r "red") 538 | (#\g "green") 539 | (#\b "blue") 540 | (#\c "cyan") 541 | (#\m "magenta") 542 | (#\y "yellow") 543 | (#\k "black") 544 | (#\w "white"))) 545 | 546 | (defun scatter3d (triplets &key (color "blue") (size 4) (plot (get-active-plot))) 547 | "no real features yet... 548 | (let (data) 549 | (loop for x from -0.7 below 0.7 by 0.05 550 | do 551 | (loop for y from -0.7 below 0.7 by 0.05 552 | do 553 | (push (list x y (* (cos (* 2 pi x x)) (cos (* 2 pi y y)))) data))) 554 | (scatter3d data))" 555 | (maybe-start-workbench) 556 | (let* ((marker (make-instance 'plotly:marker :symbol "circle" :size size :color color)) 557 | (x (mapcar #'first triplets)) 558 | (y (mapcar #'second triplets)) 559 | (z (mapcar #'third triplets)) 560 | (traces (list (make-instance 'plotly:3d-trace :x x :y y 561 | :z z 562 | :marker marker 563 | :type "scatter3d"))) 564 | (layout (make-instance 'plotly:plot-layout 565 | :width (- (clog:width (plotly:parent plot)) 10) 566 | :height (- (clog:height (plotly:parent plot)) 10)))) 567 | (plot-to-active-plot 568 | (make-instance 'plotly-plot :traces traces :layout layout) 569 | :active-plot plot))) 570 | 571 | (defun surface (x y z &key (plot (get-active-plot))) 572 | "Z should be a 2D, x and y 1d sequences. 573 | (let* ((x (loop for x from -4 below 4 by 0.1 collect x)) 574 | (y (loop for y from -8 below 8 by 0.1 collect y)) 575 | (z (make-array (list (length y) (length x))))) 576 | (loop for x in x 577 | for xidx from 0 578 | do (loop for y in y 579 | for yidx from 0 580 | do (setf (aref z yidx xidx) (* (cos (+ (* x x) (* y y))))))) 581 | (surface x y z))" 582 | (maybe-start-workbench) 583 | (let* ((traces (list (make-instance 'plotly:3d-trace :x x :y y :z z 584 | :type "surface"))) 585 | (layout (make-instance 'plotly:plot-layout 586 | :width (- (clog:width (plotly:parent plot)) 10) 587 | :height (- (clog:height (plotly:parent plot)) 10)))) 588 | (plot-to-active-plot 589 | (make-instance 'plotly-plot :traces traces :layout layout) 590 | :active-plot plot))) 591 | 592 | (defun label-and-title-plot (&optional x-label y-label title) 593 | "Add x-label, y-label, and title. title works on 3d plots, but x-label and 594 | y-label doesn't... I just haven't read the plotly docs on 3d scatter plots yet." 595 | (let* ((plot (get-active-plot)) 596 | (layout (plotly:layout plot))) 597 | (setf (plotly:text (plotly:title (plotly:x-axis layout))) x-label) 598 | (setf (plotly:text (plotly:title (plotly:y-axis layout))) y-label) 599 | (setf (plotly:text (plotly:title layout)) title) 600 | (refresh plot))) 601 | 602 | (defun demo () 603 | (maybe-start-workbench) 604 | (figure) 605 | (hoff) 606 | (plot-data 607 | (loop for x from -10 below 10 608 | collect (list (make-uncertain-number (+ x (- (random 1.0) 0.5)) 609 | :s+ (random 0.5d0) :s- (random 0.5d0)) 610 | (make-uncertain-number (+ x (- (random 1d0) 0.5)) 611 | :s+ (random 0.5d0) :s- (random 0.5d0)))) 612 | :x-axis-label "$\\text{Time }(\\mu\\text{s})$" :y-axis-label "$\\sqrt{signal}$" 613 | :title "A plot" :line "solid" :marker "square" :color "red" :legend '("my first trace")) 614 | (hon) 615 | (plot-data 616 | (loop for x from -10 below 10 617 | collect (list (make-uncertain-number (+ x (- (random 1.0) 0.5)) 618 | :s+ (random 0.5d0) :s- (random 0.5d0)) 619 | (make-uncertain-number (- (+ x (- (random 1d0) 0.5))) 620 | :s+ (random 0.5d0) :s- (random 0.5d0)))) 621 | :x-axis-label "$\\text{Time }(\\mu\\text{s})$" :y-axis-label "$\\sqrt{signal}$" 622 | :marker-size 4 623 | :title "A plot" :line "solid" :marker "circle" :color "blue" :legend '("my second trace")) 624 | (figure) 625 | (let (data) 626 | (loop for x from -0.7 below 0.7 by 0.05 627 | do 628 | (loop for y from -0.7 below 0.7 by 0.05 629 | do 630 | (push (list x y (* (cos (* 2 pi x x)) (cos (* 2 pi y y)))) data))) 631 | (scatter3d data)) 632 | (figure) 633 | (let* ((x (loop for x from -4 below 4 by 0.1 collect x)) 634 | (y (loop for y from -8 below 8 by 0.1 collect y)) 635 | (z (make-array (list (length y) (length x))))) 636 | (loop for x in x 637 | for xidx from 0 638 | do (loop for y in y 639 | for yidx from 0 640 | do (setf (aref z yidx xidx) (* (cos (+ (* x x) (* y y))))))) 641 | (surface x y z))) 642 | -------------------------------------------------------------------------------- /src/plotly.lisp: -------------------------------------------------------------------------------- 1 | (defpackage #:plotly 2 | (:documentation 3 | "This package is responsible for generating javascript objects 4 | (encoded in JSON) which can be used in calls to the plotly javascript 5 | library. You create a CLOS object populating the necessary slots, 6 | then call (serialize-to-json that-object) (or list there-of) and then 7 | use it in a call through CLOG-PLOTLY (for example) to plotly running 8 | in a browser. 9 | 10 | This package ends at the call (serialize-to-json scatter-trace), for 11 | example. The mechanism of interaction with the javascript plotly 12 | library is direct serialization of CLOS objects where their slot 13 | names match the javascript slots in the plotly library. I have not 14 | done a complete mapping of them, nor have I added any documentation. 15 | Generally if there is a feature you want to use, find the slot that 16 | controls it, and when you create your object set that slot to the 17 | appropriate plotly string (or keyword). Unbound slots are not 18 | serialized.") 19 | (:use #:cl #:clog-plotly) 20 | (:import-from #:alexandria #:compose) 21 | (:export 22 | #:serialize-to-json 23 | 24 | #:plot-layout 25 | #:margin 26 | #:xaxis 27 | #:yaxis 28 | 29 | #:trace-type 30 | #:scatter-trace 31 | #:trace-name 32 | #:trace-visible 33 | #:trace-showlegend 34 | #:trace-opacity 35 | #:trace-mode 36 | #:trace-x 37 | #:trace-y 38 | #:trace-text 39 | #:trace-xaxis 40 | #:trace-yaxis 41 | #:trace-marker 42 | #:trace-line 43 | #:trace-textfont 44 | #:trace-error-x 45 | #:trace-error-y 46 | 47 | #:error-bar 48 | #:error-bar-array 49 | #:error-bar-arrayminus 50 | 51 | #:line 52 | #:line-dash 53 | 54 | ;; For both error-bar and line 55 | #:color 56 | #:thickness 57 | #:visible 58 | #:width 59 | 60 | #:marker 61 | #:marker-color 62 | #:marker-colorbar 63 | #:size 64 | #:marker-symbol 65 | #:font-family 66 | #:plotly-font 67 | #:title-font 68 | #:text 69 | #:title 70 | #:axis-title 71 | #:plotly-plot 72 | #:plot 73 | #:plot-id 74 | #:plot-name 75 | #:clog-plotly 76 | #:parent 77 | #:hold 78 | #:traces 79 | #:plot-title 80 | #:make-plot-title 81 | #:last-touched 82 | #:data 83 | #:height 84 | #:layout 85 | #:range 86 | #:x-axis 87 | #:y-axis 88 | #:3d-trace 89 | #:plotly-config 90 | #:annotation 91 | #:add-annotation 92 | #:toggle-annotation)) 93 | 94 | (in-package #:plotly) 95 | 96 | ;; We directly map the javascript objects to CLOS objects and provide 97 | ;; for serializing them to json. This gives us at least a modicum of 98 | ;; programming niceness. 99 | 100 | (defgeneric serialize-to-json (object &optional stream)) 101 | 102 | (defmethod serialize-to-json (object &optional stream) 103 | (let ((shasht:*symbol-name-function* (alexandria:compose #'string-downcase #'symbol-name))) 104 | (shasht:write-json object stream))) 105 | 106 | (defmethod serialize-to-json ((object sequence) &optional stream) 107 | (let ((shasht:*symbol-name-function* (alexandria:compose #'string-downcase #'symbol-name))) 108 | (shasht:write-json object stream))) 109 | 110 | (defclass plot-layout () 111 | ((margin :accessor margin :initform (make-instance 'margin :t 20) :initarg :margin) 112 | (width :accessor width :initarg :width) 113 | (height :accessor height :initarg :height) 114 | (title :accessor title :initform (make-instance 'title) :type title :initarg :title) 115 | (xaxis :accessor x-axis :initform (make-instance 'axis) :type axis :initarg :x-axis) 116 | (yaxis :accessor y-axis :initform (make-instance 'axis) :type axis :initarg :y-axis) 117 | (annotations :initarg :annotations :accessor annotations :initform (make-array 0 :adjustable t :fill-pointer 0)))) 118 | 119 | (defun ensure-annotations (plot-layout) 120 | (check-type plot-layout plot-layout) 121 | (unless (slot-boundp plot-layout 'annotations) 122 | (setf (annotations plot-layout) (make-array 0 :adjustable t :fill-pointer 0)))) 123 | 124 | (defun add-annotation (plot-layout annotation) 125 | (ensure-annotations plot-layout) 126 | (check-type annotation annotation) 127 | (vector-push-extend annotation (annotations plot-layout))) 128 | 129 | (defun annotation-equal (a b) 130 | (check-type a annotation) 131 | (check-type b annotation) 132 | (and (= (slot-value a 'x) (slot-value b 'x)) 133 | (= (slot-value a 'y) (slot-value b 'y)))) 134 | 135 | (defun toggle-annotation (plot-layout annotation) 136 | (ensure-annotations plot-layout) 137 | (let ((previous (find annotation (annotations plot-layout) :test 'annotation-equal))) 138 | (if previous 139 | (let ((new (remove previous (annotations plot-layout)))) 140 | (setf (annotations plot-layout) (make-array (length new) :adjustable t :fill-pointer t ))) 141 | (add-annotation plot-layout annotation)))) 142 | 143 | (defclass annotation () 144 | ((xref :initarg :xref :initform "x") ;; or "paper" 145 | (yref :initarg :yref :initform "y") 146 | (x :initarg :x) 147 | (y :initarg :y) 148 | (xanchor :initarg :xanchor ) ;; or "left" "center" "right" 149 | (yanchor :initarg :yanchor) ;; "top" "center" ? 150 | (text :initarg :text :initform "annotation") 151 | (showarrow :initarg :showarrow :initform nil) 152 | (arrowhead :initarg :arrowhead) 153 | (ax :initarg :ax) 154 | (ay :initarg :ay))) 155 | 156 | ;; Because we use :common-lisp, t is defined as a constant, so we 157 | ;; cannot use it as a symbol name which breaks our auto-json 158 | ;; serialization for margin which has a "t" slot. So, we provide a t 159 | ;; hidden in the hidden-t package which doesn't use the :common-lisp 160 | ;; package. 161 | 162 | (defpackage #:hidden-t 163 | (:export #:t)) 164 | 165 | (in-package #:plotly) 166 | (defclass margin () 167 | ((hidden-t:t :initarg :t) 168 | (b :initarg :b) (l :initarg :l) (r :initarg :r))) 169 | 170 | ;; See https://plotly.com/javascript/reference/scatter/ 171 | (defclass scatter-trace () 172 | ((type :initform "scatter") 173 | (name :initform "" :accessor trace-name :type string :initarg :name) 174 | (visible :initform t :accessor trace-visible :type (member t nil "legendonly")) 175 | (showlegend :initform t :accessor trace-showlegend :type boolean) 176 | ;;(legendrank :initform 1000 :accessor trace-legendrank :type fixnum) 177 | ;;(legendgroup :initform "" :accessor trace-legendgroup :type string) 178 | ;;(legendgrouptitle :initform nil :accessor legendgrouptitle :type legendgrouptitle) 179 | ;;(legendwidth :initform 0.1 :accessor trace-legendwidth :type (real 0.0)) ;; width fraction or px 180 | (opacity :initform 1 :accessor trace-opacity :type (real 0.0 1.0)) 181 | (mode :type string :initform "none" :accessor trace-mode) ;; lines, markers, test joined with + or none 182 | ;; ids 183 | (x :accessor trace-x :type sequence :initarg :x) 184 | (y :accessor trace-y :type sequence :initarg :y) 185 | ;; x0, dx, y0, dy 186 | (text :accessor trace-text :type sequence :initform nil) ;; strings for each x,y pair 187 | ;; controlled by hoverinfo and if hovertext is not set 188 | ;; (textposition :accessor trace-textposition :initform nil) 189 | ;; either "top left" | "top center" ... or an array of these 190 | ;; texttemplate 191 | ;; hovertext 192 | ;; hoverinfo 193 | ;; hovertemplate 194 | ;; xhoverformat 195 | ;; yhoverformat 196 | ;; meta 197 | ;; customdata 198 | (xaxis :accessor trace-xaxis :type string :initform "x") ;; which axis this is drawn against 199 | (yaxis :accessor trace-yaxis :type string :initform "y") 200 | ;;(orientation :accessor trace-orientation :type string... 201 | ;; (groupnorm 202 | ;; alignmentgroup 203 | ;; offsetgroup 204 | ;; stackgroup 205 | ;; xperiod, xperiodalignmnet, xperiod0 206 | ;; yperiod, yperiodalignment, yperiod0 207 | (marker :accessor trace-marker :type marker) 208 | (line :accessor trace-line :type line) 209 | (textfont :accessor trace-textfont :type (or null plotly-font)) ;; for any text 210 | (error_x :accessor trace-error-x :type (or null error-bar)) 211 | (error_y :accessor trace-error-y :type (or null error-bar)) 212 | ;;selectedpoints selected unselected 213 | ;; cliponaxis connectgaps 214 | ;; fill fillcolor fillpattern 215 | ;; hoverlabel 216 | ;; hoveron 217 | ;; stackgaps xcalendar ycalendar uirevision 218 | )) 219 | 220 | (defclass 3d-trace () 221 | ((type :initform "scatter3d" :initarg :type) 222 | (name :initform "" :accessor trace-name :type string :initarg :name) 223 | (visible :initform t :accessor trace-visible :type (member t nil "legendonly")) 224 | (showlegend :initform t :accessor trace-showlegend :type boolean) 225 | (opacity :initform 1 :accessor trace-opacity :type (real 0.0 1.0)) 226 | (mode :type string :initform "markers" :accessor trace-mode :initarg :mode) 227 | (x :accessor trace-x :type sequence :initarg :x) 228 | (y :accessor trace-y :type sequence :initarg :y) 229 | (z :accessor trace-y :type sequence :initarg :z) 230 | (xaxis :accessor trace-xaxis :type string ;; :initform "x" 231 | ) ;; which axis this is drawn against 232 | (yaxis :accessor trace-yaxis :type string ;; :initform "y" 233 | ) 234 | ;;(orientation :accessor trace-orientation :type string... 235 | ;; (groupnorm 236 | ;; alignmentgroup 237 | ;; offsetgroup 238 | ;; stackgroup 239 | ;; xperiod, xperiodalignmnet, xperiod0 240 | ;; yperiod, yperiodalignment, yperiod0 241 | (marker :accessor trace-marker :type marker :initarg :marker) 242 | (line :accessor trace-line :type line) 243 | (textfont :accessor trace-textfont :type (or null plotly-font)) ;; for any text 244 | (error_x :accessor trace-error-x :type (or null error-bar)) 245 | (error_y :accessor trace-error-y :type (or null error-bar)) 246 | ;;selectedpoints selected unselected 247 | ;; cliponaxis connectgaps 248 | ;; fill fillcolor fillpattern 249 | ;; hoverlabel 250 | ;; hoveron 251 | ;; stackgaps xcalendar ycalendar uirevision 252 | )) 253 | 254 | (defclass error-bar () 255 | ((array :accessor error-bar-array :initarg :array) 256 | (arrayminus :accessor error-bar-arrayminus :initarg :arrayminus) 257 | (color :accessor color) 258 | (thickness :accessor thickness) 259 | (type :initform "data") 260 | (symmetric :initarg :symmetric) 261 | (visible :accessor visible) 262 | (width :type (real 0.0) :accessor width))) 263 | 264 | (defclass line () 265 | ((color :accessor color :initarg :color) 266 | (dash :type (or null string) :accessor line-dash :initarg :line-dash) 267 | ;; shape for splines or steps 268 | ;; simplify 269 | ;; smoothing 270 | (width :type (integer 0) :accessor width :initarg :width))) 271 | 272 | (defclass marker () 273 | (;;angle 274 | ;;angleref 275 | autocolorscale 276 | cauto 277 | cmax 278 | cmid 279 | cmin 280 | (color :accessor marker-color :initarg :color) ;; will be a numerical array assigning colors to each point 281 | coloraxis 282 | (colorbar :type (or null colorbar) :accessor marker-colorbar) 283 | colorscale 284 | ;;gradient 285 | ;;line 286 | ;;maxdisplayed 287 | ;;opacity 288 | ;;reversescale 289 | showscale ;; colorbar displayed or not, only used if color is set 290 | (size :initform 12 :type (or number sequence) :accessor size :initarg :size) ;; number or array of nums marker size in px 291 | ;;sizemin sizemode sizeref standoff 292 | (symbol :type string :accessor marker-symbol :initarg :symbol) 293 | )) 294 | 295 | (defclass colorbar () 296 | (bgcolor 297 | bordercolor 298 | borderwidth 299 | dtick 300 | expoentformat 301 | labelalias 302 | len 303 | lenmode 304 | minexponent 305 | nticks 306 | orientation 307 | outlinecolor 308 | outlinewidth 309 | separatethousands 310 | showexponent 311 | showticklabels 312 | showtickprefix 313 | showticksuffix 314 | thickness 315 | thicknessmode 316 | tick0 317 | tickangle 318 | tickcolor 319 | (tickfont :initform nil :type (or plotly-font null)) 320 | tickformat 321 | ;;tickformatstops, ticklabeloverflow ticklabelposition ticklabelstep 322 | ;; ticklen tickmode tickprefix ticks ticksuffix ticktext tickvals 323 | (title :type colorbar-title) 324 | ;; x, y 325 | ;; xanchor xpad yanchor ypad 326 | )) 327 | 328 | (defclass plotly-font () 329 | ((color :initarg :color :type string :initform "black" :accessor color) 330 | (family :initarg :family :type string :initform "Courier New, monospace" :accessor font-family) 331 | (size :initarg :size :type integer :initform 14 :accessor size))) 332 | 333 | (defclass title () 334 | ((font :type plotly-font :accessor title-font :initform (make-instance 'plotly-font :size 14) 335 | :initarg :font) 336 | (text :type string :accessor text :initarg :text :initform "") 337 | (automargin :type boolean :initform t :initarg :automargin))) 338 | 339 | (defclass plot-title (title) 340 | ((xref :initform "paper") 341 | (x :initform 0.5) 342 | (yref :initform "paper") 343 | (y :initform 1.0) 344 | (yanchor :initform "bottom") 345 | (font :initform (make-instance 'plotly-font :size 14)))) 346 | 347 | (defun make-plot-title (text &optional (size 14)) 348 | (make-instance 'plot-title :font (make-instance 'plotly-font :size size) :text text)) 349 | 350 | (defclass colorbar-title (title) 351 | (side)) 352 | 353 | (defclass axis-title (title) 354 | ((standoff :accessor axis-title-standoff))) 355 | 356 | (defclass plot-trace () ()) 357 | 358 | (defclass plotly-plot () 359 | ((traces 360 | :initarg :traces 361 | :accessor traces 362 | :type traces 363 | :documentation "List of traces on the plot") 364 | (layout 365 | :initarg :layout 366 | :accessor layout 367 | :type plot-layout 368 | :initform (make-instance 'plot-layout) 369 | :documentation "Plot layout"))) 370 | 371 | (defclass axis () 372 | (anchor 373 | automargin 374 | autorange 375 | autotypenumbers 376 | calendar 377 | categoryarray 378 | categoryorder 379 | color 380 | constrain 381 | constraintoward 382 | dividercolor 383 | dividerwidth 384 | domain 385 | dtick 386 | exponentformat 387 | fixedrange 388 | gridcolor 389 | griddash 390 | gridwidth 391 | hoverformat 392 | labelalias 393 | layer ;; "above traces" or "below traces" 394 | linecolor 395 | linewidth 396 | matches 397 | minexponent 398 | (minor :initarg :minor) 399 | mirror 400 | nticks ;; number of ticks in tickmode auto 401 | overlaying 402 | position 403 | (range :accessor range :initarg :range) 404 | ;; rangebreaks 405 | ;; rangemode 406 | ;; rangeselector 407 | ;; rangeslider 408 | ;; scaleanchor 409 | ;; scaleratio 410 | ;; separatethousands 411 | ;; showdividers 412 | ;; showexponent 413 | showgrid 414 | showline 415 | showspikes 416 | showticklabels 417 | showtickprefix 418 | showticksuffic 419 | side 420 | ;; spikecolor 421 | ;; spikedash 422 | ;; spikemode 423 | ;; spikesnap 424 | ;; spikethickness 425 | tick0 426 | tickangle 427 | tickcolor 428 | (tickfont :initarg :tickfont) 429 | tickformat 430 | tickformatstops 431 | ticklabelmode 432 | ticklabeloverflow 433 | ticklabelposition 434 | ticklabelstep 435 | ticklen 436 | (tickmode :initarg :tickmode) ;; "auto" 437 | tickprefix 438 | ticks 439 | tickson 440 | ticksuffix 441 | ticktext 442 | tickwidth 443 | (title :type axis-title :initform (make-instance 'axis-title) :accessor title) 444 | type ;; -, linear, log, date, category, multicategory 445 | uirevision 446 | (visible :initarg :visible) 447 | (zeroline :initarg :zeroline) 448 | (zerolinecolor :initarg :zerolinecolor) 449 | (zerolinewidth :initarg :zerolinewidth))) 450 | 451 | (defclass minor () 452 | (dtick 453 | gridcolor 454 | griddash 455 | gridwidth 456 | nticks 457 | showgrid 458 | tick0 459 | tickcolor 460 | ticklen 461 | tickmode 462 | ticks 463 | tickvals 464 | tickwidth)) 465 | 466 | 467 | (defclass plotly-config () 468 | ((editable :initarg :editable))) 469 | -------------------------------------------------------------------------------- /www/boot.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /www/css/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /www/css/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /www/css/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /www/css/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /www/css/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /www/css/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/css/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /www/css/jquery-ui.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.13.1 - 2022-01-20 2 | * http://jqueryui.com 3 | * Includes: core.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, draggable.css, resizable.css, progressbar.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css 4 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 5 | * Copyright jQuery Foundation and other contributors; Licensed MIT */ 6 | 7 | /* Layout helpers 8 | ----------------------------------*/ 9 | .ui-helper-hidden { 10 | display: none; 11 | } 12 | .ui-helper-hidden-accessible { 13 | border: 0; 14 | clip: rect(0 0 0 0); 15 | height: 1px; 16 | margin: -1px; 17 | overflow: hidden; 18 | padding: 0; 19 | position: absolute; 20 | width: 1px; 21 | } 22 | .ui-helper-reset { 23 | margin: 0; 24 | padding: 0; 25 | border: 0; 26 | outline: 0; 27 | line-height: 1.3; 28 | text-decoration: none; 29 | font-size: 100%; 30 | list-style: none; 31 | } 32 | .ui-helper-clearfix:before, 33 | .ui-helper-clearfix:after { 34 | content: ""; 35 | display: table; 36 | border-collapse: collapse; 37 | } 38 | .ui-helper-clearfix:after { 39 | clear: both; 40 | } 41 | .ui-helper-zfix { 42 | width: 100%; 43 | height: 100%; 44 | top: 0; 45 | left: 0; 46 | position: absolute; 47 | opacity: 0; 48 | -ms-filter: "alpha(opacity=0)"; /* support: IE8 */ 49 | } 50 | 51 | .ui-front { 52 | z-index: 100; 53 | } 54 | 55 | 56 | /* Interaction Cues 57 | ----------------------------------*/ 58 | .ui-state-disabled { 59 | cursor: default !important; 60 | pointer-events: none; 61 | } 62 | 63 | 64 | /* Icons 65 | ----------------------------------*/ 66 | .ui-icon { 67 | display: inline-block; 68 | vertical-align: middle; 69 | margin-top: -.25em; 70 | position: relative; 71 | text-indent: -99999px; 72 | overflow: hidden; 73 | background-repeat: no-repeat; 74 | } 75 | 76 | .ui-widget-icon-block { 77 | left: 50%; 78 | margin-left: -8px; 79 | display: block; 80 | } 81 | 82 | /* Misc visuals 83 | ----------------------------------*/ 84 | 85 | /* Overlays */ 86 | .ui-widget-overlay { 87 | position: fixed; 88 | top: 0; 89 | left: 0; 90 | width: 100%; 91 | height: 100%; 92 | } 93 | .ui-accordion .ui-accordion-header { 94 | display: block; 95 | cursor: pointer; 96 | position: relative; 97 | margin: 2px 0 0 0; 98 | padding: .5em .5em .5em .7em; 99 | font-size: 100%; 100 | } 101 | .ui-accordion .ui-accordion-content { 102 | padding: 1em 2.2em; 103 | border-top: 0; 104 | overflow: auto; 105 | } 106 | .ui-autocomplete { 107 | position: absolute; 108 | top: 0; 109 | left: 0; 110 | cursor: default; 111 | } 112 | .ui-menu { 113 | list-style: none; 114 | padding: 0; 115 | margin: 0; 116 | display: block; 117 | outline: 0; 118 | } 119 | .ui-menu .ui-menu { 120 | position: absolute; 121 | } 122 | .ui-menu .ui-menu-item { 123 | margin: 0; 124 | cursor: pointer; 125 | /* support: IE10, see #8844 */ 126 | list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); 127 | } 128 | .ui-menu .ui-menu-item-wrapper { 129 | position: relative; 130 | padding: 3px 1em 3px .4em; 131 | } 132 | .ui-menu .ui-menu-divider { 133 | margin: 5px 0; 134 | height: 0; 135 | font-size: 0; 136 | line-height: 0; 137 | border-width: 1px 0 0 0; 138 | } 139 | .ui-menu .ui-state-focus, 140 | .ui-menu .ui-state-active { 141 | margin: -1px; 142 | } 143 | 144 | /* icon support */ 145 | .ui-menu-icons { 146 | position: relative; 147 | } 148 | .ui-menu-icons .ui-menu-item-wrapper { 149 | padding-left: 2em; 150 | } 151 | 152 | /* left-aligned */ 153 | .ui-menu .ui-icon { 154 | position: absolute; 155 | top: 0; 156 | bottom: 0; 157 | left: .2em; 158 | margin: auto 0; 159 | } 160 | 161 | /* right-aligned */ 162 | .ui-menu .ui-menu-icon { 163 | left: auto; 164 | right: 0; 165 | } 166 | .ui-button { 167 | padding: .4em 1em; 168 | display: inline-block; 169 | position: relative; 170 | line-height: normal; 171 | margin-right: .1em; 172 | cursor: pointer; 173 | vertical-align: middle; 174 | text-align: center; 175 | -webkit-user-select: none; 176 | -moz-user-select: none; 177 | -ms-user-select: none; 178 | user-select: none; 179 | 180 | /* Support: IE <= 11 */ 181 | overflow: visible; 182 | } 183 | 184 | .ui-button, 185 | .ui-button:link, 186 | .ui-button:visited, 187 | .ui-button:hover, 188 | .ui-button:active { 189 | text-decoration: none; 190 | } 191 | 192 | /* to make room for the icon, a width needs to be set here */ 193 | .ui-button-icon-only { 194 | width: 2em; 195 | box-sizing: border-box; 196 | text-indent: -9999px; 197 | white-space: nowrap; 198 | } 199 | 200 | /* no icon support for input elements */ 201 | input.ui-button.ui-button-icon-only { 202 | text-indent: 0; 203 | } 204 | 205 | /* button icon element(s) */ 206 | .ui-button-icon-only .ui-icon { 207 | position: absolute; 208 | top: 50%; 209 | left: 50%; 210 | margin-top: -8px; 211 | margin-left: -8px; 212 | } 213 | 214 | .ui-button.ui-icon-notext .ui-icon { 215 | padding: 0; 216 | width: 2.1em; 217 | height: 2.1em; 218 | text-indent: -9999px; 219 | white-space: nowrap; 220 | 221 | } 222 | 223 | input.ui-button.ui-icon-notext .ui-icon { 224 | width: auto; 225 | height: auto; 226 | text-indent: 0; 227 | white-space: normal; 228 | padding: .4em 1em; 229 | } 230 | 231 | /* workarounds */ 232 | /* Support: Firefox 5 - 40 */ 233 | input.ui-button::-moz-focus-inner, 234 | button.ui-button::-moz-focus-inner { 235 | border: 0; 236 | padding: 0; 237 | } 238 | .ui-controlgroup { 239 | vertical-align: middle; 240 | display: inline-block; 241 | } 242 | .ui-controlgroup > .ui-controlgroup-item { 243 | float: left; 244 | margin-left: 0; 245 | margin-right: 0; 246 | } 247 | .ui-controlgroup > .ui-controlgroup-item:focus, 248 | .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { 249 | z-index: 9999; 250 | } 251 | .ui-controlgroup-vertical > .ui-controlgroup-item { 252 | display: block; 253 | float: none; 254 | width: 100%; 255 | margin-top: 0; 256 | margin-bottom: 0; 257 | text-align: left; 258 | } 259 | .ui-controlgroup-vertical .ui-controlgroup-item { 260 | box-sizing: border-box; 261 | } 262 | .ui-controlgroup .ui-controlgroup-label { 263 | padding: .4em 1em; 264 | } 265 | .ui-controlgroup .ui-controlgroup-label span { 266 | font-size: 80%; 267 | } 268 | .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { 269 | border-left: none; 270 | } 271 | .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { 272 | border-top: none; 273 | } 274 | .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { 275 | border-right: none; 276 | } 277 | .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { 278 | border-bottom: none; 279 | } 280 | 281 | /* Spinner specific style fixes */ 282 | .ui-controlgroup-vertical .ui-spinner-input { 283 | 284 | /* Support: IE8 only, Android < 4.4 only */ 285 | width: 75%; 286 | width: calc( 100% - 2.4em ); 287 | } 288 | .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { 289 | border-top-style: solid; 290 | } 291 | 292 | .ui-checkboxradio-label .ui-icon-background { 293 | box-shadow: inset 1px 1px 1px #ccc; 294 | border-radius: .12em; 295 | border: none; 296 | } 297 | .ui-checkboxradio-radio-label .ui-icon-background { 298 | width: 16px; 299 | height: 16px; 300 | border-radius: 1em; 301 | overflow: visible; 302 | border: none; 303 | } 304 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, 305 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { 306 | background-image: none; 307 | width: 8px; 308 | height: 8px; 309 | border-width: 4px; 310 | border-style: solid; 311 | } 312 | .ui-checkboxradio-disabled { 313 | pointer-events: none; 314 | } 315 | .ui-datepicker { 316 | width: 17em; 317 | padding: .2em .2em 0; 318 | display: none; 319 | } 320 | .ui-datepicker .ui-datepicker-header { 321 | position: relative; 322 | padding: .2em 0; 323 | } 324 | .ui-datepicker .ui-datepicker-prev, 325 | .ui-datepicker .ui-datepicker-next { 326 | position: absolute; 327 | top: 2px; 328 | width: 1.8em; 329 | height: 1.8em; 330 | } 331 | .ui-datepicker .ui-datepicker-prev-hover, 332 | .ui-datepicker .ui-datepicker-next-hover { 333 | top: 1px; 334 | } 335 | .ui-datepicker .ui-datepicker-prev { 336 | left: 2px; 337 | } 338 | .ui-datepicker .ui-datepicker-next { 339 | right: 2px; 340 | } 341 | .ui-datepicker .ui-datepicker-prev-hover { 342 | left: 1px; 343 | } 344 | .ui-datepicker .ui-datepicker-next-hover { 345 | right: 1px; 346 | } 347 | .ui-datepicker .ui-datepicker-prev span, 348 | .ui-datepicker .ui-datepicker-next span { 349 | display: block; 350 | position: absolute; 351 | left: 50%; 352 | margin-left: -8px; 353 | top: 50%; 354 | margin-top: -8px; 355 | } 356 | .ui-datepicker .ui-datepicker-title { 357 | margin: 0 2.3em; 358 | line-height: 1.8em; 359 | text-align: center; 360 | } 361 | .ui-datepicker .ui-datepicker-title select { 362 | font-size: 1em; 363 | margin: 1px 0; 364 | } 365 | .ui-datepicker select.ui-datepicker-month, 366 | .ui-datepicker select.ui-datepicker-year { 367 | width: 45%; 368 | } 369 | .ui-datepicker table { 370 | width: 100%; 371 | font-size: .9em; 372 | border-collapse: collapse; 373 | margin: 0 0 .4em; 374 | } 375 | .ui-datepicker th { 376 | padding: .7em .3em; 377 | text-align: center; 378 | font-weight: bold; 379 | border: 0; 380 | } 381 | .ui-datepicker td { 382 | border: 0; 383 | padding: 1px; 384 | } 385 | .ui-datepicker td span, 386 | .ui-datepicker td a { 387 | display: block; 388 | padding: .2em; 389 | text-align: right; 390 | text-decoration: none; 391 | } 392 | .ui-datepicker .ui-datepicker-buttonpane { 393 | background-image: none; 394 | margin: .7em 0 0 0; 395 | padding: 0 .2em; 396 | border-left: 0; 397 | border-right: 0; 398 | border-bottom: 0; 399 | } 400 | .ui-datepicker .ui-datepicker-buttonpane button { 401 | float: right; 402 | margin: .5em .2em .4em; 403 | cursor: pointer; 404 | padding: .2em .6em .3em .6em; 405 | width: auto; 406 | overflow: visible; 407 | } 408 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { 409 | float: left; 410 | } 411 | 412 | /* with multiple calendars */ 413 | .ui-datepicker.ui-datepicker-multi { 414 | width: auto; 415 | } 416 | .ui-datepicker-multi .ui-datepicker-group { 417 | float: left; 418 | } 419 | .ui-datepicker-multi .ui-datepicker-group table { 420 | width: 95%; 421 | margin: 0 auto .4em; 422 | } 423 | .ui-datepicker-multi-2 .ui-datepicker-group { 424 | width: 50%; 425 | } 426 | .ui-datepicker-multi-3 .ui-datepicker-group { 427 | width: 33.3%; 428 | } 429 | .ui-datepicker-multi-4 .ui-datepicker-group { 430 | width: 25%; 431 | } 432 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, 433 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { 434 | border-left-width: 0; 435 | } 436 | .ui-datepicker-multi .ui-datepicker-buttonpane { 437 | clear: left; 438 | } 439 | .ui-datepicker-row-break { 440 | clear: both; 441 | width: 100%; 442 | font-size: 0; 443 | } 444 | 445 | /* RTL support */ 446 | .ui-datepicker-rtl { 447 | direction: rtl; 448 | } 449 | .ui-datepicker-rtl .ui-datepicker-prev { 450 | right: 2px; 451 | left: auto; 452 | } 453 | .ui-datepicker-rtl .ui-datepicker-next { 454 | left: 2px; 455 | right: auto; 456 | } 457 | .ui-datepicker-rtl .ui-datepicker-prev:hover { 458 | right: 1px; 459 | left: auto; 460 | } 461 | .ui-datepicker-rtl .ui-datepicker-next:hover { 462 | left: 1px; 463 | right: auto; 464 | } 465 | .ui-datepicker-rtl .ui-datepicker-buttonpane { 466 | clear: right; 467 | } 468 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { 469 | float: left; 470 | } 471 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, 472 | .ui-datepicker-rtl .ui-datepicker-group { 473 | float: right; 474 | } 475 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, 476 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { 477 | border-right-width: 0; 478 | border-left-width: 1px; 479 | } 480 | 481 | /* Icons */ 482 | .ui-datepicker .ui-icon { 483 | display: block; 484 | text-indent: -99999px; 485 | overflow: hidden; 486 | background-repeat: no-repeat; 487 | left: .5em; 488 | top: .3em; 489 | } 490 | .ui-dialog { 491 | position: absolute; 492 | top: 0; 493 | left: 0; 494 | padding: .2em; 495 | outline: 0; 496 | } 497 | .ui-dialog .ui-dialog-titlebar { 498 | padding: .4em 1em; 499 | position: relative; 500 | } 501 | .ui-dialog .ui-dialog-title { 502 | float: left; 503 | margin: .1em 0; 504 | white-space: nowrap; 505 | width: 90%; 506 | overflow: hidden; 507 | text-overflow: ellipsis; 508 | } 509 | .ui-dialog .ui-dialog-titlebar-close { 510 | position: absolute; 511 | right: .3em; 512 | top: 50%; 513 | width: 20px; 514 | margin: -10px 0 0 0; 515 | padding: 1px; 516 | height: 20px; 517 | } 518 | .ui-dialog .ui-dialog-content { 519 | position: relative; 520 | border: 0; 521 | padding: .5em 1em; 522 | background: none; 523 | overflow: auto; 524 | } 525 | .ui-dialog .ui-dialog-buttonpane { 526 | text-align: left; 527 | border-width: 1px 0 0 0; 528 | background-image: none; 529 | margin-top: .5em; 530 | padding: .3em 1em .5em .4em; 531 | } 532 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { 533 | float: right; 534 | } 535 | .ui-dialog .ui-dialog-buttonpane button { 536 | margin: .5em .4em .5em 0; 537 | cursor: pointer; 538 | } 539 | .ui-dialog .ui-resizable-n { 540 | height: 2px; 541 | top: 0; 542 | } 543 | .ui-dialog .ui-resizable-e { 544 | width: 2px; 545 | right: 0; 546 | } 547 | .ui-dialog .ui-resizable-s { 548 | height: 2px; 549 | bottom: 0; 550 | } 551 | .ui-dialog .ui-resizable-w { 552 | width: 2px; 553 | left: 0; 554 | } 555 | .ui-dialog .ui-resizable-se, 556 | .ui-dialog .ui-resizable-sw, 557 | .ui-dialog .ui-resizable-ne, 558 | .ui-dialog .ui-resizable-nw { 559 | width: 7px; 560 | height: 7px; 561 | } 562 | .ui-dialog .ui-resizable-se { 563 | right: 0; 564 | bottom: 0; 565 | } 566 | .ui-dialog .ui-resizable-sw { 567 | left: 0; 568 | bottom: 0; 569 | } 570 | .ui-dialog .ui-resizable-ne { 571 | right: 0; 572 | top: 0; 573 | } 574 | .ui-dialog .ui-resizable-nw { 575 | left: 0; 576 | top: 0; 577 | } 578 | .ui-draggable .ui-dialog-titlebar { 579 | cursor: move; 580 | } 581 | .ui-draggable-handle { 582 | -ms-touch-action: none; 583 | touch-action: none; 584 | } 585 | .ui-resizable { 586 | position: relative; 587 | } 588 | .ui-resizable-handle { 589 | position: absolute; 590 | font-size: 0.1px; 591 | display: block; 592 | -ms-touch-action: none; 593 | touch-action: none; 594 | } 595 | .ui-resizable-disabled .ui-resizable-handle, 596 | .ui-resizable-autohide .ui-resizable-handle { 597 | display: none; 598 | } 599 | .ui-resizable-n { 600 | cursor: n-resize; 601 | height: 7px; 602 | width: 100%; 603 | top: -5px; 604 | left: 0; 605 | } 606 | .ui-resizable-s { 607 | cursor: s-resize; 608 | height: 7px; 609 | width: 100%; 610 | bottom: -5px; 611 | left: 0; 612 | } 613 | .ui-resizable-e { 614 | cursor: e-resize; 615 | width: 7px; 616 | right: -5px; 617 | top: 0; 618 | height: 100%; 619 | } 620 | .ui-resizable-w { 621 | cursor: w-resize; 622 | width: 7px; 623 | left: -5px; 624 | top: 0; 625 | height: 100%; 626 | } 627 | .ui-resizable-se { 628 | cursor: se-resize; 629 | width: 12px; 630 | height: 12px; 631 | right: 1px; 632 | bottom: 1px; 633 | } 634 | .ui-resizable-sw { 635 | cursor: sw-resize; 636 | width: 9px; 637 | height: 9px; 638 | left: -5px; 639 | bottom: -5px; 640 | } 641 | .ui-resizable-nw { 642 | cursor: nw-resize; 643 | width: 9px; 644 | height: 9px; 645 | left: -5px; 646 | top: -5px; 647 | } 648 | .ui-resizable-ne { 649 | cursor: ne-resize; 650 | width: 9px; 651 | height: 9px; 652 | right: -5px; 653 | top: -5px; 654 | } 655 | .ui-progressbar { 656 | height: 2em; 657 | text-align: left; 658 | overflow: hidden; 659 | } 660 | .ui-progressbar .ui-progressbar-value { 661 | margin: -1px; 662 | height: 100%; 663 | } 664 | .ui-progressbar .ui-progressbar-overlay { 665 | background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); 666 | height: 100%; 667 | -ms-filter: "alpha(opacity=25)"; /* support: IE8 */ 668 | opacity: 0.25; 669 | } 670 | .ui-progressbar-indeterminate .ui-progressbar-value { 671 | background-image: none; 672 | } 673 | .ui-selectable { 674 | -ms-touch-action: none; 675 | touch-action: none; 676 | } 677 | .ui-selectable-helper { 678 | position: absolute; 679 | z-index: 100; 680 | border: 1px dotted black; 681 | } 682 | .ui-selectmenu-menu { 683 | padding: 0; 684 | margin: 0; 685 | position: absolute; 686 | top: 0; 687 | left: 0; 688 | display: none; 689 | } 690 | .ui-selectmenu-menu .ui-menu { 691 | overflow: auto; 692 | overflow-x: hidden; 693 | padding-bottom: 1px; 694 | } 695 | .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { 696 | font-size: 1em; 697 | font-weight: bold; 698 | line-height: 1.5; 699 | padding: 2px 0.4em; 700 | margin: 0.5em 0 0 0; 701 | height: auto; 702 | border: 0; 703 | } 704 | .ui-selectmenu-open { 705 | display: block; 706 | } 707 | .ui-selectmenu-text { 708 | display: block; 709 | margin-right: 20px; 710 | overflow: hidden; 711 | text-overflow: ellipsis; 712 | } 713 | .ui-selectmenu-button.ui-button { 714 | text-align: left; 715 | white-space: nowrap; 716 | width: 14em; 717 | } 718 | .ui-selectmenu-icon.ui-icon { 719 | float: right; 720 | margin-top: 0; 721 | } 722 | .ui-slider { 723 | position: relative; 724 | text-align: left; 725 | } 726 | .ui-slider .ui-slider-handle { 727 | position: absolute; 728 | z-index: 2; 729 | width: 1.2em; 730 | height: 1.2em; 731 | cursor: pointer; 732 | -ms-touch-action: none; 733 | touch-action: none; 734 | } 735 | .ui-slider .ui-slider-range { 736 | position: absolute; 737 | z-index: 1; 738 | font-size: .7em; 739 | display: block; 740 | border: 0; 741 | background-position: 0 0; 742 | } 743 | 744 | /* support: IE8 - See #6727 */ 745 | .ui-slider.ui-state-disabled .ui-slider-handle, 746 | .ui-slider.ui-state-disabled .ui-slider-range { 747 | filter: inherit; 748 | } 749 | 750 | .ui-slider-horizontal { 751 | height: .8em; 752 | } 753 | .ui-slider-horizontal .ui-slider-handle { 754 | top: -.3em; 755 | margin-left: -.6em; 756 | } 757 | .ui-slider-horizontal .ui-slider-range { 758 | top: 0; 759 | height: 100%; 760 | } 761 | .ui-slider-horizontal .ui-slider-range-min { 762 | left: 0; 763 | } 764 | .ui-slider-horizontal .ui-slider-range-max { 765 | right: 0; 766 | } 767 | 768 | .ui-slider-vertical { 769 | width: .8em; 770 | height: 100px; 771 | } 772 | .ui-slider-vertical .ui-slider-handle { 773 | left: -.3em; 774 | margin-left: 0; 775 | margin-bottom: -.6em; 776 | } 777 | .ui-slider-vertical .ui-slider-range { 778 | left: 0; 779 | width: 100%; 780 | } 781 | .ui-slider-vertical .ui-slider-range-min { 782 | bottom: 0; 783 | } 784 | .ui-slider-vertical .ui-slider-range-max { 785 | top: 0; 786 | } 787 | .ui-sortable-handle { 788 | -ms-touch-action: none; 789 | touch-action: none; 790 | } 791 | .ui-spinner { 792 | position: relative; 793 | display: inline-block; 794 | overflow: hidden; 795 | padding: 0; 796 | vertical-align: middle; 797 | } 798 | .ui-spinner-input { 799 | border: none; 800 | background: none; 801 | color: inherit; 802 | padding: .222em 0; 803 | margin: .2em 0; 804 | vertical-align: middle; 805 | margin-left: .4em; 806 | margin-right: 2em; 807 | } 808 | .ui-spinner-button { 809 | width: 1.6em; 810 | height: 50%; 811 | font-size: .5em; 812 | padding: 0; 813 | margin: 0; 814 | text-align: center; 815 | position: absolute; 816 | cursor: default; 817 | display: block; 818 | overflow: hidden; 819 | right: 0; 820 | } 821 | /* more specificity required here to override default borders */ 822 | .ui-spinner a.ui-spinner-button { 823 | border-top-style: none; 824 | border-bottom-style: none; 825 | border-right-style: none; 826 | } 827 | .ui-spinner-up { 828 | top: 0; 829 | } 830 | .ui-spinner-down { 831 | bottom: 0; 832 | } 833 | .ui-tabs { 834 | position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 835 | padding: .2em; 836 | } 837 | .ui-tabs .ui-tabs-nav { 838 | margin: 0; 839 | padding: .2em .2em 0; 840 | } 841 | .ui-tabs .ui-tabs-nav li { 842 | list-style: none; 843 | float: left; 844 | position: relative; 845 | top: 0; 846 | margin: 1px .2em 0 0; 847 | border-bottom-width: 0; 848 | padding: 0; 849 | white-space: nowrap; 850 | } 851 | .ui-tabs .ui-tabs-nav .ui-tabs-anchor { 852 | float: left; 853 | padding: .5em 1em; 854 | text-decoration: none; 855 | } 856 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { 857 | margin-bottom: -1px; 858 | padding-bottom: 1px; 859 | } 860 | .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, 861 | .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, 862 | .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { 863 | cursor: text; 864 | } 865 | .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { 866 | cursor: pointer; 867 | } 868 | .ui-tabs .ui-tabs-panel { 869 | display: block; 870 | border-width: 0; 871 | padding: 1em 1.4em; 872 | background: none; 873 | } 874 | .ui-tooltip { 875 | padding: 8px; 876 | position: absolute; 877 | z-index: 9999; 878 | max-width: 300px; 879 | } 880 | body .ui-tooltip { 881 | border-width: 2px; 882 | } 883 | 884 | /* Component containers 885 | ----------------------------------*/ 886 | .ui-widget { 887 | font-family: Arial,Helvetica,sans-serif; 888 | font-size: 1em; 889 | } 890 | .ui-widget .ui-widget { 891 | font-size: 1em; 892 | } 893 | .ui-widget input, 894 | .ui-widget select, 895 | .ui-widget textarea, 896 | .ui-widget button { 897 | font-family: Arial,Helvetica,sans-serif; 898 | font-size: 1em; 899 | } 900 | .ui-widget.ui-widget-content { 901 | border: 1px solid #c5c5c5; 902 | } 903 | .ui-widget-content { 904 | border: 1px solid #dddddd; 905 | background: #ffffff; 906 | color: #333333; 907 | } 908 | .ui-widget-content a { 909 | color: #333333; 910 | } 911 | .ui-widget-header { 912 | border: 1px solid #dddddd; 913 | background: #e9e9e9; 914 | color: #333333; 915 | font-weight: bold; 916 | } 917 | .ui-widget-header a { 918 | color: #333333; 919 | } 920 | 921 | /* Interaction states 922 | ----------------------------------*/ 923 | .ui-state-default, 924 | .ui-widget-content .ui-state-default, 925 | .ui-widget-header .ui-state-default, 926 | .ui-button, 927 | 928 | /* We use html here because we need a greater specificity to make sure disabled 929 | works properly when clicked or hovered */ 930 | html .ui-button.ui-state-disabled:hover, 931 | html .ui-button.ui-state-disabled:active { 932 | border: 1px solid #c5c5c5; 933 | background: #f6f6f6; 934 | font-weight: normal; 935 | color: #454545; 936 | } 937 | .ui-state-default a, 938 | .ui-state-default a:link, 939 | .ui-state-default a:visited, 940 | a.ui-button, 941 | a:link.ui-button, 942 | a:visited.ui-button, 943 | .ui-button { 944 | color: #454545; 945 | text-decoration: none; 946 | } 947 | .ui-state-hover, 948 | .ui-widget-content .ui-state-hover, 949 | .ui-widget-header .ui-state-hover, 950 | .ui-state-focus, 951 | .ui-widget-content .ui-state-focus, 952 | .ui-widget-header .ui-state-focus, 953 | .ui-button:hover, 954 | .ui-button:focus { 955 | border: 1px solid #cccccc; 956 | background: #ededed; 957 | font-weight: normal; 958 | color: #2b2b2b; 959 | } 960 | .ui-state-hover a, 961 | .ui-state-hover a:hover, 962 | .ui-state-hover a:link, 963 | .ui-state-hover a:visited, 964 | .ui-state-focus a, 965 | .ui-state-focus a:hover, 966 | .ui-state-focus a:link, 967 | .ui-state-focus a:visited, 968 | a.ui-button:hover, 969 | a.ui-button:focus { 970 | color: #2b2b2b; 971 | text-decoration: none; 972 | } 973 | 974 | .ui-visual-focus { 975 | box-shadow: 0 0 3px 1px rgb(94, 158, 214); 976 | } 977 | .ui-state-active, 978 | .ui-widget-content .ui-state-active, 979 | .ui-widget-header .ui-state-active, 980 | a.ui-button:active, 981 | .ui-button:active, 982 | .ui-button.ui-state-active:hover { 983 | border: 1px solid #003eff; 984 | background: #007fff; 985 | font-weight: normal; 986 | color: #ffffff; 987 | } 988 | .ui-icon-background, 989 | .ui-state-active .ui-icon-background { 990 | border: #003eff; 991 | background-color: #ffffff; 992 | } 993 | .ui-state-active a, 994 | .ui-state-active a:link, 995 | .ui-state-active a:visited { 996 | color: #ffffff; 997 | text-decoration: none; 998 | } 999 | 1000 | /* Interaction Cues 1001 | ----------------------------------*/ 1002 | .ui-state-highlight, 1003 | .ui-widget-content .ui-state-highlight, 1004 | .ui-widget-header .ui-state-highlight { 1005 | border: 1px solid #dad55e; 1006 | background: #fffa90; 1007 | color: #777620; 1008 | } 1009 | .ui-state-checked { 1010 | border: 1px solid #dad55e; 1011 | background: #fffa90; 1012 | } 1013 | .ui-state-highlight a, 1014 | .ui-widget-content .ui-state-highlight a, 1015 | .ui-widget-header .ui-state-highlight a { 1016 | color: #777620; 1017 | } 1018 | .ui-state-error, 1019 | .ui-widget-content .ui-state-error, 1020 | .ui-widget-header .ui-state-error { 1021 | border: 1px solid #f1a899; 1022 | background: #fddfdf; 1023 | color: #5f3f3f; 1024 | } 1025 | .ui-state-error a, 1026 | .ui-widget-content .ui-state-error a, 1027 | .ui-widget-header .ui-state-error a { 1028 | color: #5f3f3f; 1029 | } 1030 | .ui-state-error-text, 1031 | .ui-widget-content .ui-state-error-text, 1032 | .ui-widget-header .ui-state-error-text { 1033 | color: #5f3f3f; 1034 | } 1035 | .ui-priority-primary, 1036 | .ui-widget-content .ui-priority-primary, 1037 | .ui-widget-header .ui-priority-primary { 1038 | font-weight: bold; 1039 | } 1040 | .ui-priority-secondary, 1041 | .ui-widget-content .ui-priority-secondary, 1042 | .ui-widget-header .ui-priority-secondary { 1043 | opacity: .7; 1044 | -ms-filter: "alpha(opacity=70)"; /* support: IE8 */ 1045 | font-weight: normal; 1046 | } 1047 | .ui-state-disabled, 1048 | .ui-widget-content .ui-state-disabled, 1049 | .ui-widget-header .ui-state-disabled { 1050 | opacity: .35; 1051 | -ms-filter: "alpha(opacity=35)"; /* support: IE8 */ 1052 | background-image: none; 1053 | } 1054 | .ui-state-disabled .ui-icon { 1055 | -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */ 1056 | } 1057 | 1058 | /* Icons 1059 | ----------------------------------*/ 1060 | 1061 | /* states and images */ 1062 | .ui-icon { 1063 | width: 16px; 1064 | height: 16px; 1065 | } 1066 | .ui-icon, 1067 | .ui-widget-content .ui-icon { 1068 | background-image: url("images/ui-icons_444444_256x240.png"); 1069 | } 1070 | .ui-widget-header .ui-icon { 1071 | background-image: url("images/ui-icons_444444_256x240.png"); 1072 | } 1073 | .ui-state-hover .ui-icon, 1074 | .ui-state-focus .ui-icon, 1075 | .ui-button:hover .ui-icon, 1076 | .ui-button:focus .ui-icon { 1077 | background-image: url("images/ui-icons_555555_256x240.png"); 1078 | } 1079 | .ui-state-active .ui-icon, 1080 | .ui-button:active .ui-icon { 1081 | background-image: url("images/ui-icons_ffffff_256x240.png"); 1082 | } 1083 | .ui-state-highlight .ui-icon, 1084 | .ui-button .ui-state-highlight.ui-icon { 1085 | background-image: url("images/ui-icons_777620_256x240.png"); 1086 | } 1087 | .ui-state-error .ui-icon, 1088 | .ui-state-error-text .ui-icon { 1089 | background-image: url("images/ui-icons_cc0000_256x240.png"); 1090 | } 1091 | .ui-button .ui-icon { 1092 | background-image: url("images/ui-icons_777777_256x240.png"); 1093 | } 1094 | 1095 | /* positioning */ 1096 | /* Three classes needed to override `.ui-button:hover .ui-icon` */ 1097 | .ui-icon-blank.ui-icon-blank.ui-icon-blank { 1098 | background-image: none; 1099 | } 1100 | .ui-icon-caret-1-n { background-position: 0 0; } 1101 | .ui-icon-caret-1-ne { background-position: -16px 0; } 1102 | .ui-icon-caret-1-e { background-position: -32px 0; } 1103 | .ui-icon-caret-1-se { background-position: -48px 0; } 1104 | .ui-icon-caret-1-s { background-position: -65px 0; } 1105 | .ui-icon-caret-1-sw { background-position: -80px 0; } 1106 | .ui-icon-caret-1-w { background-position: -96px 0; } 1107 | .ui-icon-caret-1-nw { background-position: -112px 0; } 1108 | .ui-icon-caret-2-n-s { background-position: -128px 0; } 1109 | .ui-icon-caret-2-e-w { background-position: -144px 0; } 1110 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 1111 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 1112 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 1113 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 1114 | .ui-icon-triangle-1-s { background-position: -65px -16px; } 1115 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 1116 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 1117 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 1118 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 1119 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 1120 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 1121 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 1122 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 1123 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 1124 | .ui-icon-arrow-1-s { background-position: -65px -32px; } 1125 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 1126 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 1127 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 1128 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 1129 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 1130 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 1131 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 1132 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 1133 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 1134 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 1135 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 1136 | .ui-icon-arrowthick-1-n { background-position: 1px -48px; } 1137 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 1138 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 1139 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 1140 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 1141 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 1142 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 1143 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 1144 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 1145 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 1146 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 1147 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 1148 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 1149 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 1150 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 1151 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 1152 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 1153 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 1154 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 1155 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 1156 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 1157 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 1158 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 1159 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 1160 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 1161 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 1162 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 1163 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 1164 | .ui-icon-arrow-4 { background-position: 0 -80px; } 1165 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 1166 | .ui-icon-extlink { background-position: -32px -80px; } 1167 | .ui-icon-newwin { background-position: -48px -80px; } 1168 | .ui-icon-refresh { background-position: -64px -80px; } 1169 | .ui-icon-shuffle { background-position: -80px -80px; } 1170 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 1171 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 1172 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 1173 | .ui-icon-folder-open { background-position: -16px -96px; } 1174 | .ui-icon-document { background-position: -32px -96px; } 1175 | .ui-icon-document-b { background-position: -48px -96px; } 1176 | .ui-icon-note { background-position: -64px -96px; } 1177 | .ui-icon-mail-closed { background-position: -80px -96px; } 1178 | .ui-icon-mail-open { background-position: -96px -96px; } 1179 | .ui-icon-suitcase { background-position: -112px -96px; } 1180 | .ui-icon-comment { background-position: -128px -96px; } 1181 | .ui-icon-person { background-position: -144px -96px; } 1182 | .ui-icon-print { background-position: -160px -96px; } 1183 | .ui-icon-trash { background-position: -176px -96px; } 1184 | .ui-icon-locked { background-position: -192px -96px; } 1185 | .ui-icon-unlocked { background-position: -208px -96px; } 1186 | .ui-icon-bookmark { background-position: -224px -96px; } 1187 | .ui-icon-tag { background-position: -240px -96px; } 1188 | .ui-icon-home { background-position: 0 -112px; } 1189 | .ui-icon-flag { background-position: -16px -112px; } 1190 | .ui-icon-calendar { background-position: -32px -112px; } 1191 | .ui-icon-cart { background-position: -48px -112px; } 1192 | .ui-icon-pencil { background-position: -64px -112px; } 1193 | .ui-icon-clock { background-position: -80px -112px; } 1194 | .ui-icon-disk { background-position: -96px -112px; } 1195 | .ui-icon-calculator { background-position: -112px -112px; } 1196 | .ui-icon-zoomin { background-position: -128px -112px; } 1197 | .ui-icon-zoomout { background-position: -144px -112px; } 1198 | .ui-icon-search { background-position: -160px -112px; } 1199 | .ui-icon-wrench { background-position: -176px -112px; } 1200 | .ui-icon-gear { background-position: -192px -112px; } 1201 | .ui-icon-heart { background-position: -208px -112px; } 1202 | .ui-icon-star { background-position: -224px -112px; } 1203 | .ui-icon-link { background-position: -240px -112px; } 1204 | .ui-icon-cancel { background-position: 0 -128px; } 1205 | .ui-icon-plus { background-position: -16px -128px; } 1206 | .ui-icon-plusthick { background-position: -32px -128px; } 1207 | .ui-icon-minus { background-position: -48px -128px; } 1208 | .ui-icon-minusthick { background-position: -64px -128px; } 1209 | .ui-icon-close { background-position: -80px -128px; } 1210 | .ui-icon-closethick { background-position: -96px -128px; } 1211 | .ui-icon-key { background-position: -112px -128px; } 1212 | .ui-icon-lightbulb { background-position: -128px -128px; } 1213 | .ui-icon-scissors { background-position: -144px -128px; } 1214 | .ui-icon-clipboard { background-position: -160px -128px; } 1215 | .ui-icon-copy { background-position: -176px -128px; } 1216 | .ui-icon-contact { background-position: -192px -128px; } 1217 | .ui-icon-image { background-position: -208px -128px; } 1218 | .ui-icon-video { background-position: -224px -128px; } 1219 | .ui-icon-script { background-position: -240px -128px; } 1220 | .ui-icon-alert { background-position: 0 -144px; } 1221 | .ui-icon-info { background-position: -16px -144px; } 1222 | .ui-icon-notice { background-position: -32px -144px; } 1223 | .ui-icon-help { background-position: -48px -144px; } 1224 | .ui-icon-check { background-position: -64px -144px; } 1225 | .ui-icon-bullet { background-position: -80px -144px; } 1226 | .ui-icon-radio-on { background-position: -96px -144px; } 1227 | .ui-icon-radio-off { background-position: -112px -144px; } 1228 | .ui-icon-pin-w { background-position: -128px -144px; } 1229 | .ui-icon-pin-s { background-position: -144px -144px; } 1230 | .ui-icon-play { background-position: 0 -160px; } 1231 | .ui-icon-pause { background-position: -16px -160px; } 1232 | .ui-icon-seek-next { background-position: -32px -160px; } 1233 | .ui-icon-seek-prev { background-position: -48px -160px; } 1234 | .ui-icon-seek-end { background-position: -64px -160px; } 1235 | .ui-icon-seek-start { background-position: -80px -160px; } 1236 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 1237 | .ui-icon-seek-first { background-position: -80px -160px; } 1238 | .ui-icon-stop { background-position: -96px -160px; } 1239 | .ui-icon-eject { background-position: -112px -160px; } 1240 | .ui-icon-volume-off { background-position: -128px -160px; } 1241 | .ui-icon-volume-on { background-position: -144px -160px; } 1242 | .ui-icon-power { background-position: 0 -176px; } 1243 | .ui-icon-signal-diag { background-position: -16px -176px; } 1244 | .ui-icon-signal { background-position: -32px -176px; } 1245 | .ui-icon-battery-0 { background-position: -48px -176px; } 1246 | .ui-icon-battery-1 { background-position: -64px -176px; } 1247 | .ui-icon-battery-2 { background-position: -80px -176px; } 1248 | .ui-icon-battery-3 { background-position: -96px -176px; } 1249 | .ui-icon-circle-plus { background-position: 0 -192px; } 1250 | .ui-icon-circle-minus { background-position: -16px -192px; } 1251 | .ui-icon-circle-close { background-position: -32px -192px; } 1252 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 1253 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 1254 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 1255 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 1256 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 1257 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 1258 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 1259 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 1260 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 1261 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 1262 | .ui-icon-circle-check { background-position: -208px -192px; } 1263 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 1264 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 1265 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 1266 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 1267 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 1268 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 1269 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 1270 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 1271 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 1272 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 1273 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 1274 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 1275 | 1276 | 1277 | /* Misc visuals 1278 | ----------------------------------*/ 1279 | 1280 | /* Corner radius */ 1281 | .ui-corner-all, 1282 | .ui-corner-top, 1283 | .ui-corner-left, 1284 | .ui-corner-tl { 1285 | border-top-left-radius: 3px; 1286 | } 1287 | .ui-corner-all, 1288 | .ui-corner-top, 1289 | .ui-corner-right, 1290 | .ui-corner-tr { 1291 | border-top-right-radius: 3px; 1292 | } 1293 | .ui-corner-all, 1294 | .ui-corner-bottom, 1295 | .ui-corner-left, 1296 | .ui-corner-bl { 1297 | border-bottom-left-radius: 3px; 1298 | } 1299 | .ui-corner-all, 1300 | .ui-corner-bottom, 1301 | .ui-corner-right, 1302 | .ui-corner-br { 1303 | border-bottom-right-radius: 3px; 1304 | } 1305 | 1306 | /* Overlays */ 1307 | .ui-widget-overlay { 1308 | background: #aaaaaa; 1309 | opacity: .003; 1310 | -ms-filter: Alpha(Opacity=.3); /* support: IE8 */ 1311 | } 1312 | .ui-widget-shadow { 1313 | -webkit-box-shadow: 0px 0px 5px #666666; 1314 | box-shadow: 0px 0px 5px #666666; 1315 | } 1316 | -------------------------------------------------------------------------------- /www/css/jquery-ui.structure.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.13.1 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | */ 11 | /* Layout helpers 12 | ----------------------------------*/ 13 | .ui-helper-hidden { 14 | display: none; 15 | } 16 | .ui-helper-hidden-accessible { 17 | border: 0; 18 | clip: rect(0 0 0 0); 19 | height: 1px; 20 | margin: -1px; 21 | overflow: hidden; 22 | padding: 0; 23 | position: absolute; 24 | width: 1px; 25 | } 26 | .ui-helper-reset { 27 | margin: 0; 28 | padding: 0; 29 | border: 0; 30 | outline: 0; 31 | line-height: 1.3; 32 | text-decoration: none; 33 | font-size: 100%; 34 | list-style: none; 35 | } 36 | .ui-helper-clearfix:before, 37 | .ui-helper-clearfix:after { 38 | content: ""; 39 | display: table; 40 | border-collapse: collapse; 41 | } 42 | .ui-helper-clearfix:after { 43 | clear: both; 44 | } 45 | .ui-helper-zfix { 46 | width: 100%; 47 | height: 100%; 48 | top: 0; 49 | left: 0; 50 | position: absolute; 51 | opacity: 0; 52 | -ms-filter: "alpha(opacity=0)"; /* support: IE8 */ 53 | } 54 | 55 | .ui-front { 56 | z-index: 100; 57 | } 58 | 59 | 60 | /* Interaction Cues 61 | ----------------------------------*/ 62 | .ui-state-disabled { 63 | cursor: default !important; 64 | pointer-events: none; 65 | } 66 | 67 | 68 | /* Icons 69 | ----------------------------------*/ 70 | .ui-icon { 71 | display: inline-block; 72 | vertical-align: middle; 73 | margin-top: -.25em; 74 | position: relative; 75 | text-indent: -99999px; 76 | overflow: hidden; 77 | background-repeat: no-repeat; 78 | } 79 | 80 | .ui-widget-icon-block { 81 | left: 50%; 82 | margin-left: -8px; 83 | display: block; 84 | } 85 | 86 | /* Misc visuals 87 | ----------------------------------*/ 88 | 89 | /* Overlays */ 90 | .ui-widget-overlay { 91 | position: fixed; 92 | top: 0; 93 | left: 0; 94 | width: 100%; 95 | height: 100%; 96 | } 97 | .ui-accordion .ui-accordion-header { 98 | display: block; 99 | cursor: pointer; 100 | position: relative; 101 | margin: 2px 0 0 0; 102 | padding: .5em .5em .5em .7em; 103 | font-size: 100%; 104 | } 105 | .ui-accordion .ui-accordion-content { 106 | padding: 1em 2.2em; 107 | border-top: 0; 108 | overflow: auto; 109 | } 110 | .ui-autocomplete { 111 | position: absolute; 112 | top: 0; 113 | left: 0; 114 | cursor: default; 115 | } 116 | .ui-menu { 117 | list-style: none; 118 | padding: 0; 119 | margin: 0; 120 | display: block; 121 | outline: 0; 122 | } 123 | .ui-menu .ui-menu { 124 | position: absolute; 125 | } 126 | .ui-menu .ui-menu-item { 127 | margin: 0; 128 | cursor: pointer; 129 | /* support: IE10, see #8844 */ 130 | list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); 131 | } 132 | .ui-menu .ui-menu-item-wrapper { 133 | position: relative; 134 | padding: 3px 1em 3px .4em; 135 | } 136 | .ui-menu .ui-menu-divider { 137 | margin: 5px 0; 138 | height: 0; 139 | font-size: 0; 140 | line-height: 0; 141 | border-width: 1px 0 0 0; 142 | } 143 | .ui-menu .ui-state-focus, 144 | .ui-menu .ui-state-active { 145 | margin: -1px; 146 | } 147 | 148 | /* icon support */ 149 | .ui-menu-icons { 150 | position: relative; 151 | } 152 | .ui-menu-icons .ui-menu-item-wrapper { 153 | padding-left: 2em; 154 | } 155 | 156 | /* left-aligned */ 157 | .ui-menu .ui-icon { 158 | position: absolute; 159 | top: 0; 160 | bottom: 0; 161 | left: .2em; 162 | margin: auto 0; 163 | } 164 | 165 | /* right-aligned */ 166 | .ui-menu .ui-menu-icon { 167 | left: auto; 168 | right: 0; 169 | } 170 | .ui-button { 171 | padding: .4em 1em; 172 | display: inline-block; 173 | position: relative; 174 | line-height: normal; 175 | margin-right: .1em; 176 | cursor: pointer; 177 | vertical-align: middle; 178 | text-align: center; 179 | -webkit-user-select: none; 180 | -moz-user-select: none; 181 | -ms-user-select: none; 182 | user-select: none; 183 | 184 | /* Support: IE <= 11 */ 185 | overflow: visible; 186 | } 187 | 188 | .ui-button, 189 | .ui-button:link, 190 | .ui-button:visited, 191 | .ui-button:hover, 192 | .ui-button:active { 193 | text-decoration: none; 194 | } 195 | 196 | /* to make room for the icon, a width needs to be set here */ 197 | .ui-button-icon-only { 198 | width: 2em; 199 | box-sizing: border-box; 200 | text-indent: -9999px; 201 | white-space: nowrap; 202 | } 203 | 204 | /* no icon support for input elements */ 205 | input.ui-button.ui-button-icon-only { 206 | text-indent: 0; 207 | } 208 | 209 | /* button icon element(s) */ 210 | .ui-button-icon-only .ui-icon { 211 | position: absolute; 212 | top: 50%; 213 | left: 50%; 214 | margin-top: -8px; 215 | margin-left: -8px; 216 | } 217 | 218 | .ui-button.ui-icon-notext .ui-icon { 219 | padding: 0; 220 | width: 2.1em; 221 | height: 2.1em; 222 | text-indent: -9999px; 223 | white-space: nowrap; 224 | 225 | } 226 | 227 | input.ui-button.ui-icon-notext .ui-icon { 228 | width: auto; 229 | height: auto; 230 | text-indent: 0; 231 | white-space: normal; 232 | padding: .4em 1em; 233 | } 234 | 235 | /* workarounds */ 236 | /* Support: Firefox 5 - 40 */ 237 | input.ui-button::-moz-focus-inner, 238 | button.ui-button::-moz-focus-inner { 239 | border: 0; 240 | padding: 0; 241 | } 242 | .ui-controlgroup { 243 | vertical-align: middle; 244 | display: inline-block; 245 | } 246 | .ui-controlgroup > .ui-controlgroup-item { 247 | float: left; 248 | margin-left: 0; 249 | margin-right: 0; 250 | } 251 | .ui-controlgroup > .ui-controlgroup-item:focus, 252 | .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { 253 | z-index: 9999; 254 | } 255 | .ui-controlgroup-vertical > .ui-controlgroup-item { 256 | display: block; 257 | float: none; 258 | width: 100%; 259 | margin-top: 0; 260 | margin-bottom: 0; 261 | text-align: left; 262 | } 263 | .ui-controlgroup-vertical .ui-controlgroup-item { 264 | box-sizing: border-box; 265 | } 266 | .ui-controlgroup .ui-controlgroup-label { 267 | padding: .4em 1em; 268 | } 269 | .ui-controlgroup .ui-controlgroup-label span { 270 | font-size: 80%; 271 | } 272 | .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { 273 | border-left: none; 274 | } 275 | .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { 276 | border-top: none; 277 | } 278 | .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { 279 | border-right: none; 280 | } 281 | .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { 282 | border-bottom: none; 283 | } 284 | 285 | /* Spinner specific style fixes */ 286 | .ui-controlgroup-vertical .ui-spinner-input { 287 | 288 | /* Support: IE8 only, Android < 4.4 only */ 289 | width: 75%; 290 | width: calc( 100% - 2.4em ); 291 | } 292 | .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { 293 | border-top-style: solid; 294 | } 295 | 296 | .ui-checkboxradio-label .ui-icon-background { 297 | box-shadow: inset 1px 1px 1px #ccc; 298 | border-radius: .12em; 299 | border: none; 300 | } 301 | .ui-checkboxradio-radio-label .ui-icon-background { 302 | width: 16px; 303 | height: 16px; 304 | border-radius: 1em; 305 | overflow: visible; 306 | border: none; 307 | } 308 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, 309 | .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { 310 | background-image: none; 311 | width: 8px; 312 | height: 8px; 313 | border-width: 4px; 314 | border-style: solid; 315 | } 316 | .ui-checkboxradio-disabled { 317 | pointer-events: none; 318 | } 319 | .ui-datepicker { 320 | width: 17em; 321 | padding: .2em .2em 0; 322 | display: none; 323 | } 324 | .ui-datepicker .ui-datepicker-header { 325 | position: relative; 326 | padding: .2em 0; 327 | } 328 | .ui-datepicker .ui-datepicker-prev, 329 | .ui-datepicker .ui-datepicker-next { 330 | position: absolute; 331 | top: 2px; 332 | width: 1.8em; 333 | height: 1.8em; 334 | } 335 | .ui-datepicker .ui-datepicker-prev-hover, 336 | .ui-datepicker .ui-datepicker-next-hover { 337 | top: 1px; 338 | } 339 | .ui-datepicker .ui-datepicker-prev { 340 | left: 2px; 341 | } 342 | .ui-datepicker .ui-datepicker-next { 343 | right: 2px; 344 | } 345 | .ui-datepicker .ui-datepicker-prev-hover { 346 | left: 1px; 347 | } 348 | .ui-datepicker .ui-datepicker-next-hover { 349 | right: 1px; 350 | } 351 | .ui-datepicker .ui-datepicker-prev span, 352 | .ui-datepicker .ui-datepicker-next span { 353 | display: block; 354 | position: absolute; 355 | left: 50%; 356 | margin-left: -8px; 357 | top: 50%; 358 | margin-top: -8px; 359 | } 360 | .ui-datepicker .ui-datepicker-title { 361 | margin: 0 2.3em; 362 | line-height: 1.8em; 363 | text-align: center; 364 | } 365 | .ui-datepicker .ui-datepicker-title select { 366 | font-size: 1em; 367 | margin: 1px 0; 368 | } 369 | .ui-datepicker select.ui-datepicker-month, 370 | .ui-datepicker select.ui-datepicker-year { 371 | width: 45%; 372 | } 373 | .ui-datepicker table { 374 | width: 100%; 375 | font-size: .9em; 376 | border-collapse: collapse; 377 | margin: 0 0 .4em; 378 | } 379 | .ui-datepicker th { 380 | padding: .7em .3em; 381 | text-align: center; 382 | font-weight: bold; 383 | border: 0; 384 | } 385 | .ui-datepicker td { 386 | border: 0; 387 | padding: 1px; 388 | } 389 | .ui-datepicker td span, 390 | .ui-datepicker td a { 391 | display: block; 392 | padding: .2em; 393 | text-align: right; 394 | text-decoration: none; 395 | } 396 | .ui-datepicker .ui-datepicker-buttonpane { 397 | background-image: none; 398 | margin: .7em 0 0 0; 399 | padding: 0 .2em; 400 | border-left: 0; 401 | border-right: 0; 402 | border-bottom: 0; 403 | } 404 | .ui-datepicker .ui-datepicker-buttonpane button { 405 | float: right; 406 | margin: .5em .2em .4em; 407 | cursor: pointer; 408 | padding: .2em .6em .3em .6em; 409 | width: auto; 410 | overflow: visible; 411 | } 412 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { 413 | float: left; 414 | } 415 | 416 | /* with multiple calendars */ 417 | .ui-datepicker.ui-datepicker-multi { 418 | width: auto; 419 | } 420 | .ui-datepicker-multi .ui-datepicker-group { 421 | float: left; 422 | } 423 | .ui-datepicker-multi .ui-datepicker-group table { 424 | width: 95%; 425 | margin: 0 auto .4em; 426 | } 427 | .ui-datepicker-multi-2 .ui-datepicker-group { 428 | width: 50%; 429 | } 430 | .ui-datepicker-multi-3 .ui-datepicker-group { 431 | width: 33.3%; 432 | } 433 | .ui-datepicker-multi-4 .ui-datepicker-group { 434 | width: 25%; 435 | } 436 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, 437 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { 438 | border-left-width: 0; 439 | } 440 | .ui-datepicker-multi .ui-datepicker-buttonpane { 441 | clear: left; 442 | } 443 | .ui-datepicker-row-break { 444 | clear: both; 445 | width: 100%; 446 | font-size: 0; 447 | } 448 | 449 | /* RTL support */ 450 | .ui-datepicker-rtl { 451 | direction: rtl; 452 | } 453 | .ui-datepicker-rtl .ui-datepicker-prev { 454 | right: 2px; 455 | left: auto; 456 | } 457 | .ui-datepicker-rtl .ui-datepicker-next { 458 | left: 2px; 459 | right: auto; 460 | } 461 | .ui-datepicker-rtl .ui-datepicker-prev:hover { 462 | right: 1px; 463 | left: auto; 464 | } 465 | .ui-datepicker-rtl .ui-datepicker-next:hover { 466 | left: 1px; 467 | right: auto; 468 | } 469 | .ui-datepicker-rtl .ui-datepicker-buttonpane { 470 | clear: right; 471 | } 472 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { 473 | float: left; 474 | } 475 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, 476 | .ui-datepicker-rtl .ui-datepicker-group { 477 | float: right; 478 | } 479 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, 480 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { 481 | border-right-width: 0; 482 | border-left-width: 1px; 483 | } 484 | 485 | /* Icons */ 486 | .ui-datepicker .ui-icon { 487 | display: block; 488 | text-indent: -99999px; 489 | overflow: hidden; 490 | background-repeat: no-repeat; 491 | left: .5em; 492 | top: .3em; 493 | } 494 | .ui-dialog { 495 | position: absolute; 496 | top: 0; 497 | left: 0; 498 | padding: .2em; 499 | outline: 0; 500 | } 501 | .ui-dialog .ui-dialog-titlebar { 502 | padding: .4em 1em; 503 | position: relative; 504 | } 505 | .ui-dialog .ui-dialog-title { 506 | float: left; 507 | margin: .1em 0; 508 | white-space: nowrap; 509 | width: 90%; 510 | overflow: hidden; 511 | text-overflow: ellipsis; 512 | } 513 | .ui-dialog .ui-dialog-titlebar-close { 514 | position: absolute; 515 | right: .3em; 516 | top: 50%; 517 | width: 20px; 518 | margin: -10px 0 0 0; 519 | padding: 1px; 520 | height: 20px; 521 | } 522 | .ui-dialog .ui-dialog-content { 523 | position: relative; 524 | border: 0; 525 | padding: .5em 1em; 526 | background: none; 527 | overflow: auto; 528 | } 529 | .ui-dialog .ui-dialog-buttonpane { 530 | text-align: left; 531 | border-width: 1px 0 0 0; 532 | background-image: none; 533 | margin-top: .5em; 534 | padding: .3em 1em .5em .4em; 535 | } 536 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { 537 | float: right; 538 | } 539 | .ui-dialog .ui-dialog-buttonpane button { 540 | margin: .5em .4em .5em 0; 541 | cursor: pointer; 542 | } 543 | .ui-dialog .ui-resizable-n { 544 | height: 2px; 545 | top: 0; 546 | } 547 | .ui-dialog .ui-resizable-e { 548 | width: 2px; 549 | right: 0; 550 | } 551 | .ui-dialog .ui-resizable-s { 552 | height: 2px; 553 | bottom: 0; 554 | } 555 | .ui-dialog .ui-resizable-w { 556 | width: 2px; 557 | left: 0; 558 | } 559 | .ui-dialog .ui-resizable-se, 560 | .ui-dialog .ui-resizable-sw, 561 | .ui-dialog .ui-resizable-ne, 562 | .ui-dialog .ui-resizable-nw { 563 | width: 7px; 564 | height: 7px; 565 | } 566 | .ui-dialog .ui-resizable-se { 567 | right: 0; 568 | bottom: 0; 569 | } 570 | .ui-dialog .ui-resizable-sw { 571 | left: 0; 572 | bottom: 0; 573 | } 574 | .ui-dialog .ui-resizable-ne { 575 | right: 0; 576 | top: 0; 577 | } 578 | .ui-dialog .ui-resizable-nw { 579 | left: 0; 580 | top: 0; 581 | } 582 | .ui-draggable .ui-dialog-titlebar { 583 | cursor: move; 584 | } 585 | .ui-draggable-handle { 586 | -ms-touch-action: none; 587 | touch-action: none; 588 | } 589 | .ui-resizable { 590 | position: relative; 591 | } 592 | .ui-resizable-handle { 593 | position: absolute; 594 | font-size: 0.1px; 595 | display: block; 596 | -ms-touch-action: none; 597 | touch-action: none; 598 | } 599 | .ui-resizable-disabled .ui-resizable-handle, 600 | .ui-resizable-autohide .ui-resizable-handle { 601 | display: none; 602 | } 603 | .ui-resizable-n { 604 | cursor: n-resize; 605 | height: 7px; 606 | width: 100%; 607 | top: -5px; 608 | left: 0; 609 | } 610 | .ui-resizable-s { 611 | cursor: s-resize; 612 | height: 7px; 613 | width: 100%; 614 | bottom: -5px; 615 | left: 0; 616 | } 617 | .ui-resizable-e { 618 | cursor: e-resize; 619 | width: 7px; 620 | right: -5px; 621 | top: 0; 622 | height: 100%; 623 | } 624 | .ui-resizable-w { 625 | cursor: w-resize; 626 | width: 7px; 627 | left: -5px; 628 | top: 0; 629 | height: 100%; 630 | } 631 | .ui-resizable-se { 632 | cursor: se-resize; 633 | width: 12px; 634 | height: 12px; 635 | right: 1px; 636 | bottom: 1px; 637 | } 638 | .ui-resizable-sw { 639 | cursor: sw-resize; 640 | width: 9px; 641 | height: 9px; 642 | left: -5px; 643 | bottom: -5px; 644 | } 645 | .ui-resizable-nw { 646 | cursor: nw-resize; 647 | width: 9px; 648 | height: 9px; 649 | left: -5px; 650 | top: -5px; 651 | } 652 | .ui-resizable-ne { 653 | cursor: ne-resize; 654 | width: 9px; 655 | height: 9px; 656 | right: -5px; 657 | top: -5px; 658 | } 659 | .ui-progressbar { 660 | height: 2em; 661 | text-align: left; 662 | overflow: hidden; 663 | } 664 | .ui-progressbar .ui-progressbar-value { 665 | margin: -1px; 666 | height: 100%; 667 | } 668 | .ui-progressbar .ui-progressbar-overlay { 669 | background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); 670 | height: 100%; 671 | -ms-filter: "alpha(opacity=25)"; /* support: IE8 */ 672 | opacity: 0.25; 673 | } 674 | .ui-progressbar-indeterminate .ui-progressbar-value { 675 | background-image: none; 676 | } 677 | .ui-selectable { 678 | -ms-touch-action: none; 679 | touch-action: none; 680 | } 681 | .ui-selectable-helper { 682 | position: absolute; 683 | z-index: 100; 684 | border: 1px dotted black; 685 | } 686 | .ui-selectmenu-menu { 687 | padding: 0; 688 | margin: 0; 689 | position: absolute; 690 | top: 0; 691 | left: 0; 692 | display: none; 693 | } 694 | .ui-selectmenu-menu .ui-menu { 695 | overflow: auto; 696 | overflow-x: hidden; 697 | padding-bottom: 1px; 698 | } 699 | .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { 700 | font-size: 1em; 701 | font-weight: bold; 702 | line-height: 1.5; 703 | padding: 2px 0.4em; 704 | margin: 0.5em 0 0 0; 705 | height: auto; 706 | border: 0; 707 | } 708 | .ui-selectmenu-open { 709 | display: block; 710 | } 711 | .ui-selectmenu-text { 712 | display: block; 713 | margin-right: 20px; 714 | overflow: hidden; 715 | text-overflow: ellipsis; 716 | } 717 | .ui-selectmenu-button.ui-button { 718 | text-align: left; 719 | white-space: nowrap; 720 | width: 14em; 721 | } 722 | .ui-selectmenu-icon.ui-icon { 723 | float: right; 724 | margin-top: 0; 725 | } 726 | .ui-slider { 727 | position: relative; 728 | text-align: left; 729 | } 730 | .ui-slider .ui-slider-handle { 731 | position: absolute; 732 | z-index: 2; 733 | width: 1.2em; 734 | height: 1.2em; 735 | cursor: pointer; 736 | -ms-touch-action: none; 737 | touch-action: none; 738 | } 739 | .ui-slider .ui-slider-range { 740 | position: absolute; 741 | z-index: 1; 742 | font-size: .7em; 743 | display: block; 744 | border: 0; 745 | background-position: 0 0; 746 | } 747 | 748 | /* support: IE8 - See #6727 */ 749 | .ui-slider.ui-state-disabled .ui-slider-handle, 750 | .ui-slider.ui-state-disabled .ui-slider-range { 751 | filter: inherit; 752 | } 753 | 754 | .ui-slider-horizontal { 755 | height: .8em; 756 | } 757 | .ui-slider-horizontal .ui-slider-handle { 758 | top: -.3em; 759 | margin-left: -.6em; 760 | } 761 | .ui-slider-horizontal .ui-slider-range { 762 | top: 0; 763 | height: 100%; 764 | } 765 | .ui-slider-horizontal .ui-slider-range-min { 766 | left: 0; 767 | } 768 | .ui-slider-horizontal .ui-slider-range-max { 769 | right: 0; 770 | } 771 | 772 | .ui-slider-vertical { 773 | width: .8em; 774 | height: 100px; 775 | } 776 | .ui-slider-vertical .ui-slider-handle { 777 | left: -.3em; 778 | margin-left: 0; 779 | margin-bottom: -.6em; 780 | } 781 | .ui-slider-vertical .ui-slider-range { 782 | left: 0; 783 | width: 100%; 784 | } 785 | .ui-slider-vertical .ui-slider-range-min { 786 | bottom: 0; 787 | } 788 | .ui-slider-vertical .ui-slider-range-max { 789 | top: 0; 790 | } 791 | .ui-sortable-handle { 792 | -ms-touch-action: none; 793 | touch-action: none; 794 | } 795 | .ui-spinner { 796 | position: relative; 797 | display: inline-block; 798 | overflow: hidden; 799 | padding: 0; 800 | vertical-align: middle; 801 | } 802 | .ui-spinner-input { 803 | border: none; 804 | background: none; 805 | color: inherit; 806 | padding: .222em 0; 807 | margin: .2em 0; 808 | vertical-align: middle; 809 | margin-left: .4em; 810 | margin-right: 2em; 811 | } 812 | .ui-spinner-button { 813 | width: 1.6em; 814 | height: 50%; 815 | font-size: .5em; 816 | padding: 0; 817 | margin: 0; 818 | text-align: center; 819 | position: absolute; 820 | cursor: default; 821 | display: block; 822 | overflow: hidden; 823 | right: 0; 824 | } 825 | /* more specificity required here to override default borders */ 826 | .ui-spinner a.ui-spinner-button { 827 | border-top-style: none; 828 | border-bottom-style: none; 829 | border-right-style: none; 830 | } 831 | .ui-spinner-up { 832 | top: 0; 833 | } 834 | .ui-spinner-down { 835 | bottom: 0; 836 | } 837 | .ui-tabs { 838 | position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ 839 | padding: .2em; 840 | } 841 | .ui-tabs .ui-tabs-nav { 842 | margin: 0; 843 | padding: .2em .2em 0; 844 | } 845 | .ui-tabs .ui-tabs-nav li { 846 | list-style: none; 847 | float: left; 848 | position: relative; 849 | top: 0; 850 | margin: 1px .2em 0 0; 851 | border-bottom-width: 0; 852 | padding: 0; 853 | white-space: nowrap; 854 | } 855 | .ui-tabs .ui-tabs-nav .ui-tabs-anchor { 856 | float: left; 857 | padding: .5em 1em; 858 | text-decoration: none; 859 | } 860 | .ui-tabs .ui-tabs-nav li.ui-tabs-active { 861 | margin-bottom: -1px; 862 | padding-bottom: 1px; 863 | } 864 | .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, 865 | .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, 866 | .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { 867 | cursor: text; 868 | } 869 | .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { 870 | cursor: pointer; 871 | } 872 | .ui-tabs .ui-tabs-panel { 873 | display: block; 874 | border-width: 0; 875 | padding: 1em 1.4em; 876 | background: none; 877 | } 878 | .ui-tooltip { 879 | padding: 8px; 880 | position: absolute; 881 | z-index: 9999; 882 | max-width: 300px; 883 | } 884 | body .ui-tooltip { 885 | border-width: 2px; 886 | } 887 | -------------------------------------------------------------------------------- /www/css/jquery-ui.theme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI CSS Framework 1.13.1 3 | * http://jqueryui.com 4 | * 5 | * Copyright jQuery Foundation and other contributors 6 | * Released under the MIT license. 7 | * http://jquery.org/license 8 | * 9 | * http://api.jqueryui.com/category/theming/ 10 | * 11 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?bgShadowXPos=&bgOverlayXPos=&bgErrorXPos=&bgHighlightXPos=&bgContentXPos=&bgHeaderXPos=&bgActiveXPos=&bgHoverXPos=&bgDefaultXPos=&bgShadowYPos=&bgOverlayYPos=&bgErrorYPos=&bgHighlightYPos=&bgContentYPos=&bgHeaderYPos=&bgActiveYPos=&bgHoverYPos=&bgDefaultYPos=&bgShadowRepeat=&bgOverlayRepeat=&bgErrorRepeat=&bgHighlightRepeat=&bgContentRepeat=&bgHeaderRepeat=&bgActiveRepeat=&bgHoverRepeat=&bgDefaultRepeat=&iconsHover=url(%22images%2Fui-icons_555555_256x240.png%22)&iconsHighlight=url(%22images%2Fui-icons_777620_256x240.png%22)&iconsHeader=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsError=url(%22images%2Fui-icons_cc0000_256x240.png%22)&iconsDefault=url(%22images%2Fui-icons_777777_256x240.png%22)&iconsContent=url(%22images%2Fui-icons_444444_256x240.png%22)&iconsActive=url(%22images%2Fui-icons_ffffff_256x240.png%22)&bgImgUrlShadow=&bgImgUrlOverlay=&bgImgUrlHover=&bgImgUrlHighlight=&bgImgUrlHeader=&bgImgUrlError=&bgImgUrlDefault=&bgImgUrlContent=&bgImgUrlActive=&opacityFilterShadow=Alpha(Opacity%3D30)&opacityFilterOverlay=Alpha(Opacity%3D30)&opacityShadowPerc=30&opacityOverlayPerc=30&iconColorHover=%23555555&iconColorHighlight=%23777620&iconColorHeader=%23444444&iconColorError=%23cc0000&iconColorDefault=%23777777&iconColorContent=%23444444&iconColorActive=%23ffffff&bgImgOpacityShadow=0&bgImgOpacityOverlay=0&bgImgOpacityError=95&bgImgOpacityHighlight=55&bgImgOpacityContent=75&bgImgOpacityHeader=75&bgImgOpacityActive=65&bgImgOpacityHover=75&bgImgOpacityDefault=75&bgTextureShadow=flat&bgTextureOverlay=flat&bgTextureError=flat&bgTextureHighlight=flat&bgTextureContent=flat&bgTextureHeader=flat&bgTextureActive=flat&bgTextureHover=flat&bgTextureDefault=flat&cornerRadius=3px&fwDefault=normal&ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&cornerRadiusShadow=8px&thicknessShadow=5px&offsetLeftShadow=0px&offsetTopShadow=0px&opacityShadow=.3&bgColorShadow=%23666666&opacityOverlay=.3&bgColorOverlay=%23aaaaaa&fcError=%235f3f3f&borderColorError=%23f1a899&bgColorError=%23fddfdf&fcHighlight=%23777620&borderColorHighlight=%23dad55e&bgColorHighlight=%23fffa90&fcContent=%23333333&borderColorContent=%23dddddd&bgColorContent=%23ffffff&fcHeader=%23333333&borderColorHeader=%23dddddd&bgColorHeader=%23e9e9e9&fcActive=%23ffffff&borderColorActive=%23003eff&bgColorActive=%23007fff&fcHover=%232b2b2b&borderColorHover=%23cccccc&bgColorHover=%23ededed&fcDefault=%23454545&borderColorDefault=%23c5c5c5&bgColorDefault=%23f6f6f6 12 | */ 13 | 14 | 15 | /* Component containers 16 | ----------------------------------*/ 17 | .ui-widget { 18 | font-family: Arial,Helvetica,sans-serif; 19 | font-size: 1em; 20 | } 21 | .ui-widget .ui-widget { 22 | font-size: 1em; 23 | } 24 | .ui-widget input, 25 | .ui-widget select, 26 | .ui-widget textarea, 27 | .ui-widget button { 28 | font-family: Arial,Helvetica,sans-serif; 29 | font-size: 1em; 30 | } 31 | .ui-widget.ui-widget-content { 32 | border: 1px solid #c5c5c5; 33 | } 34 | .ui-widget-content { 35 | border: 1px solid #dddddd; 36 | background: #ffffff; 37 | color: #333333; 38 | } 39 | .ui-widget-content a { 40 | color: #333333; 41 | } 42 | .ui-widget-header { 43 | border: 1px solid #dddddd; 44 | background: #e9e9e9; 45 | color: #333333; 46 | font-weight: bold; 47 | } 48 | .ui-widget-header a { 49 | color: #333333; 50 | } 51 | 52 | /* Interaction states 53 | ----------------------------------*/ 54 | .ui-state-default, 55 | .ui-widget-content .ui-state-default, 56 | .ui-widget-header .ui-state-default, 57 | .ui-button, 58 | 59 | /* We use html here because we need a greater specificity to make sure disabled 60 | works properly when clicked or hovered */ 61 | html .ui-button.ui-state-disabled:hover, 62 | html .ui-button.ui-state-disabled:active { 63 | border: 1px solid #c5c5c5; 64 | background: #f6f6f6; 65 | font-weight: normal; 66 | color: #454545; 67 | } 68 | .ui-state-default a, 69 | .ui-state-default a:link, 70 | .ui-state-default a:visited, 71 | a.ui-button, 72 | a:link.ui-button, 73 | a:visited.ui-button, 74 | .ui-button { 75 | color: #454545; 76 | text-decoration: none; 77 | } 78 | .ui-state-hover, 79 | .ui-widget-content .ui-state-hover, 80 | .ui-widget-header .ui-state-hover, 81 | .ui-state-focus, 82 | .ui-widget-content .ui-state-focus, 83 | .ui-widget-header .ui-state-focus, 84 | .ui-button:hover, 85 | .ui-button:focus { 86 | border: 1px solid #cccccc; 87 | background: #ededed; 88 | font-weight: normal; 89 | color: #2b2b2b; 90 | } 91 | .ui-state-hover a, 92 | .ui-state-hover a:hover, 93 | .ui-state-hover a:link, 94 | .ui-state-hover a:visited, 95 | .ui-state-focus a, 96 | .ui-state-focus a:hover, 97 | .ui-state-focus a:link, 98 | .ui-state-focus a:visited, 99 | a.ui-button:hover, 100 | a.ui-button:focus { 101 | color: #2b2b2b; 102 | text-decoration: none; 103 | } 104 | 105 | .ui-visual-focus { 106 | box-shadow: 0 0 3px 1px rgb(94, 158, 214); 107 | } 108 | .ui-state-active, 109 | .ui-widget-content .ui-state-active, 110 | .ui-widget-header .ui-state-active, 111 | a.ui-button:active, 112 | .ui-button:active, 113 | .ui-button.ui-state-active:hover { 114 | border: 1px solid #003eff; 115 | background: #007fff; 116 | font-weight: normal; 117 | color: #ffffff; 118 | } 119 | .ui-icon-background, 120 | .ui-state-active .ui-icon-background { 121 | border: #003eff; 122 | background-color: #ffffff; 123 | } 124 | .ui-state-active a, 125 | .ui-state-active a:link, 126 | .ui-state-active a:visited { 127 | color: #ffffff; 128 | text-decoration: none; 129 | } 130 | 131 | /* Interaction Cues 132 | ----------------------------------*/ 133 | .ui-state-highlight, 134 | .ui-widget-content .ui-state-highlight, 135 | .ui-widget-header .ui-state-highlight { 136 | border: 1px solid #dad55e; 137 | background: #fffa90; 138 | color: #777620; 139 | } 140 | .ui-state-checked { 141 | border: 1px solid #dad55e; 142 | background: #fffa90; 143 | } 144 | .ui-state-highlight a, 145 | .ui-widget-content .ui-state-highlight a, 146 | .ui-widget-header .ui-state-highlight a { 147 | color: #777620; 148 | } 149 | .ui-state-error, 150 | .ui-widget-content .ui-state-error, 151 | .ui-widget-header .ui-state-error { 152 | border: 1px solid #f1a899; 153 | background: #fddfdf; 154 | color: #5f3f3f; 155 | } 156 | .ui-state-error a, 157 | .ui-widget-content .ui-state-error a, 158 | .ui-widget-header .ui-state-error a { 159 | color: #5f3f3f; 160 | } 161 | .ui-state-error-text, 162 | .ui-widget-content .ui-state-error-text, 163 | .ui-widget-header .ui-state-error-text { 164 | color: #5f3f3f; 165 | } 166 | .ui-priority-primary, 167 | .ui-widget-content .ui-priority-primary, 168 | .ui-widget-header .ui-priority-primary { 169 | font-weight: bold; 170 | } 171 | .ui-priority-secondary, 172 | .ui-widget-content .ui-priority-secondary, 173 | .ui-widget-header .ui-priority-secondary { 174 | opacity: .7; 175 | -ms-filter: "alpha(opacity=70)"; /* support: IE8 */ 176 | font-weight: normal; 177 | } 178 | .ui-state-disabled, 179 | .ui-widget-content .ui-state-disabled, 180 | .ui-widget-header .ui-state-disabled { 181 | opacity: .35; 182 | -ms-filter: "alpha(opacity=35)"; /* support: IE8 */ 183 | background-image: none; 184 | } 185 | .ui-state-disabled .ui-icon { 186 | -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */ 187 | } 188 | 189 | /* Icons 190 | ----------------------------------*/ 191 | 192 | /* states and images */ 193 | .ui-icon { 194 | width: 16px; 195 | height: 16px; 196 | } 197 | .ui-icon, 198 | .ui-widget-content .ui-icon { 199 | background-image: url("images/ui-icons_444444_256x240.png"); 200 | } 201 | .ui-widget-header .ui-icon { 202 | background-image: url("images/ui-icons_444444_256x240.png"); 203 | } 204 | .ui-state-hover .ui-icon, 205 | .ui-state-focus .ui-icon, 206 | .ui-button:hover .ui-icon, 207 | .ui-button:focus .ui-icon { 208 | background-image: url("images/ui-icons_555555_256x240.png"); 209 | } 210 | .ui-state-active .ui-icon, 211 | .ui-button:active .ui-icon { 212 | background-image: url("images/ui-icons_ffffff_256x240.png"); 213 | } 214 | .ui-state-highlight .ui-icon, 215 | .ui-button .ui-state-highlight.ui-icon { 216 | background-image: url("images/ui-icons_777620_256x240.png"); 217 | } 218 | .ui-state-error .ui-icon, 219 | .ui-state-error-text .ui-icon { 220 | background-image: url("images/ui-icons_cc0000_256x240.png"); 221 | } 222 | .ui-button .ui-icon { 223 | background-image: url("images/ui-icons_777777_256x240.png"); 224 | } 225 | 226 | /* positioning */ 227 | /* Three classes needed to override `.ui-button:hover .ui-icon` */ 228 | .ui-icon-blank.ui-icon-blank.ui-icon-blank { 229 | background-image: none; 230 | } 231 | .ui-icon-caret-1-n { background-position: 0 0; } 232 | .ui-icon-caret-1-ne { background-position: -16px 0; } 233 | .ui-icon-caret-1-e { background-position: -32px 0; } 234 | .ui-icon-caret-1-se { background-position: -48px 0; } 235 | .ui-icon-caret-1-s { background-position: -65px 0; } 236 | .ui-icon-caret-1-sw { background-position: -80px 0; } 237 | .ui-icon-caret-1-w { background-position: -96px 0; } 238 | .ui-icon-caret-1-nw { background-position: -112px 0; } 239 | .ui-icon-caret-2-n-s { background-position: -128px 0; } 240 | .ui-icon-caret-2-e-w { background-position: -144px 0; } 241 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 242 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 243 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 244 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 245 | .ui-icon-triangle-1-s { background-position: -65px -16px; } 246 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 247 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 248 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 249 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 250 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 251 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 252 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 253 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 254 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 255 | .ui-icon-arrow-1-s { background-position: -65px -32px; } 256 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 257 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 258 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 259 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 260 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 261 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 262 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 263 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 264 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 265 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 266 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 267 | .ui-icon-arrowthick-1-n { background-position: 1px -48px; } 268 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 269 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 270 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 271 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 272 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 273 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 274 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 275 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 276 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 277 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 278 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 279 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 280 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 281 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 282 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 283 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 284 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 285 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 286 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 287 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 288 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 289 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 290 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 291 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 292 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 293 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 294 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 295 | .ui-icon-arrow-4 { background-position: 0 -80px; } 296 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 297 | .ui-icon-extlink { background-position: -32px -80px; } 298 | .ui-icon-newwin { background-position: -48px -80px; } 299 | .ui-icon-refresh { background-position: -64px -80px; } 300 | .ui-icon-shuffle { background-position: -80px -80px; } 301 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 302 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 303 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 304 | .ui-icon-folder-open { background-position: -16px -96px; } 305 | .ui-icon-document { background-position: -32px -96px; } 306 | .ui-icon-document-b { background-position: -48px -96px; } 307 | .ui-icon-note { background-position: -64px -96px; } 308 | .ui-icon-mail-closed { background-position: -80px -96px; } 309 | .ui-icon-mail-open { background-position: -96px -96px; } 310 | .ui-icon-suitcase { background-position: -112px -96px; } 311 | .ui-icon-comment { background-position: -128px -96px; } 312 | .ui-icon-person { background-position: -144px -96px; } 313 | .ui-icon-print { background-position: -160px -96px; } 314 | .ui-icon-trash { background-position: -176px -96px; } 315 | .ui-icon-locked { background-position: -192px -96px; } 316 | .ui-icon-unlocked { background-position: -208px -96px; } 317 | .ui-icon-bookmark { background-position: -224px -96px; } 318 | .ui-icon-tag { background-position: -240px -96px; } 319 | .ui-icon-home { background-position: 0 -112px; } 320 | .ui-icon-flag { background-position: -16px -112px; } 321 | .ui-icon-calendar { background-position: -32px -112px; } 322 | .ui-icon-cart { background-position: -48px -112px; } 323 | .ui-icon-pencil { background-position: -64px -112px; } 324 | .ui-icon-clock { background-position: -80px -112px; } 325 | .ui-icon-disk { background-position: -96px -112px; } 326 | .ui-icon-calculator { background-position: -112px -112px; } 327 | .ui-icon-zoomin { background-position: -128px -112px; } 328 | .ui-icon-zoomout { background-position: -144px -112px; } 329 | .ui-icon-search { background-position: -160px -112px; } 330 | .ui-icon-wrench { background-position: -176px -112px; } 331 | .ui-icon-gear { background-position: -192px -112px; } 332 | .ui-icon-heart { background-position: -208px -112px; } 333 | .ui-icon-star { background-position: -224px -112px; } 334 | .ui-icon-link { background-position: -240px -112px; } 335 | .ui-icon-cancel { background-position: 0 -128px; } 336 | .ui-icon-plus { background-position: -16px -128px; } 337 | .ui-icon-plusthick { background-position: -32px -128px; } 338 | .ui-icon-minus { background-position: -48px -128px; } 339 | .ui-icon-minusthick { background-position: -64px -128px; } 340 | .ui-icon-close { background-position: -80px -128px; } 341 | .ui-icon-closethick { background-position: -96px -128px; } 342 | .ui-icon-key { background-position: -112px -128px; } 343 | .ui-icon-lightbulb { background-position: -128px -128px; } 344 | .ui-icon-scissors { background-position: -144px -128px; } 345 | .ui-icon-clipboard { background-position: -160px -128px; } 346 | .ui-icon-copy { background-position: -176px -128px; } 347 | .ui-icon-contact { background-position: -192px -128px; } 348 | .ui-icon-image { background-position: -208px -128px; } 349 | .ui-icon-video { background-position: -224px -128px; } 350 | .ui-icon-script { background-position: -240px -128px; } 351 | .ui-icon-alert { background-position: 0 -144px; } 352 | .ui-icon-info { background-position: -16px -144px; } 353 | .ui-icon-notice { background-position: -32px -144px; } 354 | .ui-icon-help { background-position: -48px -144px; } 355 | .ui-icon-check { background-position: -64px -144px; } 356 | .ui-icon-bullet { background-position: -80px -144px; } 357 | .ui-icon-radio-on { background-position: -96px -144px; } 358 | .ui-icon-radio-off { background-position: -112px -144px; } 359 | .ui-icon-pin-w { background-position: -128px -144px; } 360 | .ui-icon-pin-s { background-position: -144px -144px; } 361 | .ui-icon-play { background-position: 0 -160px; } 362 | .ui-icon-pause { background-position: -16px -160px; } 363 | .ui-icon-seek-next { background-position: -32px -160px; } 364 | .ui-icon-seek-prev { background-position: -48px -160px; } 365 | .ui-icon-seek-end { background-position: -64px -160px; } 366 | .ui-icon-seek-start { background-position: -80px -160px; } 367 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 368 | .ui-icon-seek-first { background-position: -80px -160px; } 369 | .ui-icon-stop { background-position: -96px -160px; } 370 | .ui-icon-eject { background-position: -112px -160px; } 371 | .ui-icon-volume-off { background-position: -128px -160px; } 372 | .ui-icon-volume-on { background-position: -144px -160px; } 373 | .ui-icon-power { background-position: 0 -176px; } 374 | .ui-icon-signal-diag { background-position: -16px -176px; } 375 | .ui-icon-signal { background-position: -32px -176px; } 376 | .ui-icon-battery-0 { background-position: -48px -176px; } 377 | .ui-icon-battery-1 { background-position: -64px -176px; } 378 | .ui-icon-battery-2 { background-position: -80px -176px; } 379 | .ui-icon-battery-3 { background-position: -96px -176px; } 380 | .ui-icon-circle-plus { background-position: 0 -192px; } 381 | .ui-icon-circle-minus { background-position: -16px -192px; } 382 | .ui-icon-circle-close { background-position: -32px -192px; } 383 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 384 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 385 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 386 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 387 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 388 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 389 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 390 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 391 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 392 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 393 | .ui-icon-circle-check { background-position: -208px -192px; } 394 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 395 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 396 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 397 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 398 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 399 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 400 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 401 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 402 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 403 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 404 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 405 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 406 | 407 | 408 | /* Misc visuals 409 | ----------------------------------*/ 410 | 411 | /* Corner radius */ 412 | .ui-corner-all, 413 | .ui-corner-top, 414 | .ui-corner-left, 415 | .ui-corner-tl { 416 | border-top-left-radius: 3px; 417 | } 418 | .ui-corner-all, 419 | .ui-corner-top, 420 | .ui-corner-right, 421 | .ui-corner-tr { 422 | border-top-right-radius: 3px; 423 | } 424 | .ui-corner-all, 425 | .ui-corner-bottom, 426 | .ui-corner-left, 427 | .ui-corner-bl { 428 | border-bottom-left-radius: 3px; 429 | } 430 | .ui-corner-all, 431 | .ui-corner-bottom, 432 | .ui-corner-right, 433 | .ui-corner-br { 434 | border-bottom-right-radius: 3px; 435 | } 436 | 437 | /* Overlays */ 438 | .ui-widget-overlay { 439 | background: #aaaaaa; 440 | opacity: .003; 441 | -ms-filter: Alpha(Opacity=.3); /* support: IE8 */ 442 | } 443 | .ui-widget-shadow { 444 | -webkit-box-shadow: 0px 0px 5px #666666; 445 | box-shadow: 0px 0px 5px #666666; 446 | } 447 | -------------------------------------------------------------------------------- /www/css/w3.css: -------------------------------------------------------------------------------- 1 | /* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ 2 | html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} 3 | /* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ 4 | html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} 5 | article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} 6 | audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} 7 | audio:not([controls]){display:none;height:0}[hidden],template{display:none} 8 | a{background-color:transparent}a:active,a:hover{outline-width:0} 9 | abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} 10 | b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} 11 | small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} 12 | sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} 13 | code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} 14 | button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} 15 | button,input{overflow:visible}button,select{text-transform:none} 16 | button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} 17 | button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} 18 | button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} 19 | fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} 20 | legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} 21 | [type=checkbox],[type=radio]{padding:0} 22 | [type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} 23 | [type=search]{-webkit-appearance:textfield;outline-offset:-2px} 24 | [type=search]::-webkit-search-decoration{-webkit-appearance:none} 25 | ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} 26 | /* End extract */ 27 | html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} 28 | h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} 29 | .w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} 30 | h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} 31 | hr{border:0;border-top:1px solid #eee;margin:20px 0} 32 | .w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} 33 | .w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} 34 | .w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} 35 | .w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} 36 | .w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} 37 | .w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} 38 | .w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} 39 | .w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} 40 | .w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} 41 | .w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} 42 | .w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} 43 | .w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} 44 | .w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} 45 | .w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} 46 | .w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} 47 | .w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} 48 | .w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} 49 | .w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} 50 | .w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} 51 | .w3-dropdown-hover:hover .w3-dropdown-content{display:block} 52 | .w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} 53 | .w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} 54 | .w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} 55 | .w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} 56 | .w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} 57 | .w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} 58 | .w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} 59 | .w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} 60 | .w3-main,#main{transition:margin-left .4s} 61 | .w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} 62 | .w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} 63 | .w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} 64 | .w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} 65 | .w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} 66 | .w3-bar .w3-button{white-space:normal} 67 | .w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} 68 | .w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} 69 | .w3-responsive{display:block;overflow-x:auto} 70 | .w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, 71 | .w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} 72 | .w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} 73 | .w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} 74 | .w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} 75 | .w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} 76 | @media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} 77 | .w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} 78 | .w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} 79 | @media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} 80 | .w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} 81 | .w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} 82 | .w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} 83 | .w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} 84 | .w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} 85 | .w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} 86 | .w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} 87 | @media (max-width:1205px){.w3-auto{max-width:95%}} 88 | @media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} 89 | .w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} 90 | .w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} 91 | .w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} 92 | @media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} 93 | @media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} 94 | @media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} 95 | @media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} 96 | .w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} 97 | .w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} 98 | .w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} 99 | .w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} 100 | .w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} 101 | .w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} 102 | .w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} 103 | .w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 104 | .w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 105 | .w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} 106 | .w3-display-position{position:absolute} 107 | .w3-circle{border-radius:50%} 108 | .w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} 109 | .w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} 110 | .w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} 111 | .w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} 112 | .w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} 113 | .w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} 114 | .w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} 115 | .w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} 116 | .w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} 117 | .w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} 118 | .w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} 119 | .w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} 120 | .w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} 121 | .w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} 122 | .w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} 123 | .w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} 124 | .w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} 125 | .w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} 126 | .w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} 127 | .w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} 128 | .w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} 129 | .w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} 130 | .w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} 131 | .w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} 132 | .w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} 133 | .w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} 134 | .w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} 135 | .w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} 136 | .w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} 137 | .w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} 138 | .w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} 139 | .w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} 140 | .w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} 141 | .w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} 142 | .w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} 143 | .w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} 144 | .w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} 145 | .w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} 146 | .w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} 147 | .w3-left{float:left!important}.w3-right{float:right!important} 148 | .w3-button:hover{color:#000!important;background-color:#ccc!important} 149 | .w3-transparent,.w3-hover-none:hover{background-color:transparent!important} 150 | .w3-hover-none:hover{box-shadow:none!important} 151 | /* Colors */ 152 | .w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} 153 | .w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} 154 | .w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} 155 | .w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} 156 | .w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} 157 | .w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} 158 | .w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} 159 | .w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} 160 | .w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} 161 | .w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} 162 | .w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} 163 | .w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} 164 | .w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} 165 | .w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} 166 | .w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} 167 | .w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} 168 | .w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} 169 | .w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} 170 | .w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} 171 | .w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} 172 | .w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} 173 | .w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} 174 | .w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} 175 | .w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} 176 | .w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} 177 | .w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} 178 | .w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} 179 | .w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} 180 | .w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} 181 | .w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} 182 | .w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} 183 | .w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} 184 | .w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} 185 | .w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} 186 | .w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} 187 | .w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} 188 | .w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} 189 | .w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} 190 | .w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} 191 | .w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} 192 | .w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} 193 | .w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} 194 | .w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} 195 | .w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} 196 | .w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} 197 | .w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} 198 | .w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} 199 | .w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} 200 | .w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} 201 | .w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} 202 | .w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} 203 | .w3-text-white,.w3-hover-text-white:hover{color:#fff!important} 204 | .w3-text-black,.w3-hover-text-black:hover{color:#000!important} 205 | .w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} 206 | .w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} 207 | .w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} 208 | .w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} 209 | .w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} 210 | .w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} 211 | .w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} 212 | .w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} 213 | .w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} 214 | .w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} 215 | .w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} 216 | .w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} 217 | .w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} 218 | .w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} 219 | .w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} 220 | .w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} 221 | .w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} 222 | .w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} 223 | .w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} 224 | .w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} 225 | .w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} 226 | .w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} 227 | .w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} 228 | .w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} 229 | .w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} 230 | .w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} 231 | .w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} 232 | .w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} 233 | .w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} 234 | .w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} 235 | .w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} -------------------------------------------------------------------------------- /www/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/favicon.ico -------------------------------------------------------------------------------- /www/img/clogicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/img/clogicon.png -------------------------------------------------------------------------------- /www/img/clogwicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/img/clogwicon.png -------------------------------------------------------------------------------- /www/img/lisplogo_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/img/lisplogo_128.png -------------------------------------------------------------------------------- /www/img/lisplogo_warning2_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ajberkley/plotly-user/d4c4b9723a55faff7727cf2a68145d6b38c9e97d/www/img/lisplogo_warning2_128.png -------------------------------------------------------------------------------- /www/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | --------------------------------------------------------------------------------