Commit 071588e2 authored by Clément Fauconnier's avatar Clément Fauconnier

added 3 widgets

parent 24b9d7f1
module.exports = function (grunt) {
var baseSrc = 'js/src';
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.initConfig({
uglify: {
options: {
separator: ';'
},
compile: {
src: [
baseSrc + '/Sankore/klass.js',
baseSrc + '/**/*.js'
],
dest: 'dist/calculator.js'
}
},
watch: {
scripts: {
files: 'js/src/**/*.js',
tasks: ['scripts:dist']
}
}
});
grunt.registerTask('default', ['dist', 'watch']);
grunt.registerTask('dist', ['scripts:dist']);
grunt.registerTask('scripts:dist', ['uglify:compile']);
};
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets"
xmlns:ub="http://uniboard.mnemis.com/widgets"
id="http://uniboard.mnemis.com/widgets/calculator"
version="1.1"
width="460"
height="418"
minimum_width="460"
minimum_height="418"
ub:resizable="true"
ub:transparent="true">
<name>Calculator</name>
<content src="index.html"/>
</widget>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Unpredictable Calculator</title>
<script src="js/sankore.js" type="text/javascript"></script>
<script src="dist/calculator.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="css/calculator.css" />
</head>
<body>
<div id="ubwidget"></div>
<script type="text/javascript">
var unpredictable = false;
var c = Sankore.Calculator.create('ubwidget', {
locale: window.sankore ? window.sankore.locale() : 'fr_FR',
unpredictableMode: unpredictable,
ready: function () {
var self = this, state = {}, timer = null;
if (window.sankore) {
try {
state = JSON.parse(window.sankore.preference('state'));
} catch (e) {}
this.eventDispatcher.addEventSubscriber({
events: [
'calculator.output_changed', 'calculator.memory_changed', 'calculator.layout_changed',
'editor.layout_created', 'editor.layout_removed', 'editor.layout_changed', 'editor.button_selected',
'keystroke_line.changed'
],
listener: function () {
if (null !== timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
window.sankore.setPreference('state', JSON.stringify(self.getState()));
timer = null;
}, 350);
}
});
}
this.init(state);
}
});
</script>
</body>
</html>
/*jshint browser:true, devel:true*/
if (!('sankore' in window)) {
window.sankore = {
preferences: {
state: ''
},
setPreference: function (name, value) {
console.log('Preference "' + name + '" set to : ' + value);
this.preferences[name] = value;
},
preference: function (name) {
console.log('Accessing "' + name + '"');
return this.preferences[name] || '';
},
locale: function () {
return window.navigator.language;
}
};
}
\ No newline at end of file
/*global klass:true, Sankore:true*/
(function() {
"use strict";
klass.define('Sankore', 'Button', klass.extend({
constructor: function (text, command, useLimit, editable) {
this.text = text;
this.command = command;
this.useLimit = typeof useLimit === 'undefined' ? -1 : useLimit;
this.editable = typeof editable === 'undefined' ? true : editable;
},
isEditable: function () {
return this.editable;
},
isUsable: function () {
return this.useLimit === -1;
},
isDisabled: function () {
return this.useLimit === 0;
},
clone: function () {
return Sankore.Button.create(
this.text,
this.command,
this.useLimit,
this.editable
);
}
}));
})();
\ No newline at end of file
/*jshint plusplus: true*/
/*global klass: true, Sankore: true*/
(function () {
"use strict";
klass.define('Sankore.Calculus', 'Engine', klass.extend({
constructor: function () {
this.expressions = [];
this.operators = [];
},
init: function () {
this.expressions = [];
this.operators = [];
},
evaluate: function (expressionString) {
var tokens = [],
lastToken,
penultimateToken,
item;
expressionString = expressionString.replace(/\s+/g, '');
for (var i in expressionString) {
item = expressionString[i];
if (tokens.length > 0) {
lastToken = tokens[tokens.length - 1];
} else {
lastToken = undefined;
}
if (tokens.length > 1) {
penultimateToken = tokens[tokens.length - 2];
} else {
penultimateToken = undefined;
}
if ('0123456789.'.indexOf(item) !== -1) {
if (
!isNaN(Number(lastToken)) ||
lastToken === '.' ||
lastToken === '-.' ||
(
lastToken === '-' &&
(
penultimateToken === '(' ||
penultimateToken === undefined
)
)
) {
tokens[tokens.length - 1] += item;
} else {
tokens.push(item);
}
} else {
tokens.push(item);
}
}
for (var j in tokens) {
if (tokens[j].length > 1 && tokens[j].charAt(tokens[j].length - 1) === '.') {
throw Sankore.Util.Error.create('InvalidExpression', 'Trailing comma');
}
}
return this.computeExpression(tokens);
},
computeExpression: function (tokens) {
var operatorCheck = function (stack, token) {
var prec = Sankore.Calculus.BinaryOperation.getOperatorPrecedence,
top;
while (true) {
top = stack.operators[stack.operators.length - 1];
if (stack.operators.length === 0 || top === '(' || prec(token) > prec(top)) {
return stack.operators.push(token);
}
stack.reduce();
}
};
this.init();
for (var i in tokens) {
switch (tokens[i]) {
case '(':
this.operators.push(tokens[i]);
break;
case ')':
if (this.operators.length === 0) {
throw Sankore.Util.Error.create('InvalidExpression', 'Trailing closing brackets');
}
while (this.operators.length !== 0 && this.operators[this.operators.length - 1] !== '(') {
this.reduce();
}
if (this.operators[this.operators.length - 1] === '(') {
this.operators.pop(); // get rid of the extra paren '('
}
break;
case '+':
case '-':
case '*':
case '/':
case ':':
operatorCheck(this, tokens[i]);
break;
default:
this.expressions.push(Sankore.Calculus.Operand.create(tokens[i]));
}
}
while (this.operators.length !== 0) {
this.reduce();
}
// if there's not one and only one expression in the stack, the expression is invalid
if (this.expressions.length !== 1) {
throw Sankore.Util.Error.create('InvalidExpression', '"' + tokens.join(' ') + '" is not a valid expression');
}
return this.expressions.pop();
},
reduce: function () {
var right = this.expressions.pop(),
left = this.expressions.pop(),
operator = this.operators.pop(),
operation;
if (typeof operator === 'undefined' || typeof left === 'undefined' || typeof right === 'undefined') {
throw Sankore.Util.Error.create('InvalidExpression', 'Invalid expression');
}
if (operator === ':') {
operation = Sankore.Calculus.EuclideanDivisionOperation.create(left, right);
} else {
operation = Sankore.Calculus.BinaryOperation.create(left, operator, right);
}
this.expressions.push(operation);
}
}));
})();
\ No newline at end of file
/*global klass:true, Sankore:true */
(function () {
"use strict";
/**
* Base class for expression
*/
klass.define('Sankore.Calculus', 'Expression', klass.extend({
constructor: function () {
},
getValue: function () {
return null;
},
isInteger: function () {
try {
var value = this.getValue();
return value === Math.floor(value);
} catch (e) {
return 0;
}
},
toString: function () {
return '';
},
isCompound: function () {
return false;
}
}));
/**
* Calculus operand
*/
klass.define('Sankore.Calculus', 'Operand', Sankore.Calculus.Expression.extend({
constructor: function (value) {
this.value = Number(value);
if (isNaN(this.value)) {
throw Sankore.Util.Error.create('InvalidNumber', '"' + String(value) + '" is a not a number');
}
},
getValue: function () {
return this.value;
},
toString: function () {
return String(this.value);
}
}));
/**
* Unary operator (+, -)
*/
klass.define('Sankore.Calculus', 'Operation', Sankore.Calculus.Expression.extend({
constructor: function (operator, right) {
this.operator = operator;
if (!Sankore.Calculus.Expression.isPrototypeOf(right)) {
right = Sankore.Calculus.Operand.create(right);
}
this.right = right;
},
getPrecedence: function () {
return Sankore.Calculus.Operation.getOperatorPrecedence(this.operator);
},
isLeftAssociative: function () {
return false;
},
isCompound: function () {
return true;
},
getValue: function () {
var value = Number(this.right.getValue());
if (this.operator === '-') {
value *= -1;
}
return value;
},
toString: function () {
var string = this.right.toString();
if (this.operator !== '-') {
return string;
}
if (this.right.isCompound()) {
string = '(' + string + ')';
}
return '-' + string;
}
}));
Sankore.Calculus.Operation.getOperatorPrecedence = function (operator) {
switch (operator) {
case '+':
case '-':
return 1;
case '*':
case '/':
case ':':
return 2;
}
};
/**
* Binary operator (+, -, *, /)
*/
klass.define('Sankore.Calculus', 'BinaryOperation', Sankore.Calculus.Operation.extend({
constructor: function (left, operator, right) {
Sankore.Calculus.Operation.constructor.call(this, operator, right);
if (!Sankore.Calculus.Expression.isPrototypeOf(left)) {
left = Sankore.Calculus.Operand.create(left);
}
this.left = left;
},
isLeftAssociative: function () {
return true;
},
getValue: function () {
var leftValue = this.left.getValue(),
rightValue = this.right.getValue();
switch (this.operator) {
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
if (0 === rightValue) {
throw Sankore.Util.Error.create('ZeroDivision', 'Division by zero');
}
return leftValue / rightValue;
default:
throw Sankore.Util.Error.create('InvalidOperator', 'This is not a valid operator : ' + this.operator);
}
},
toString: function () {
if (this.isInteger()) {
return String(this.getValue());
}
var leftString = this.left.toString(),
rightString = this.right.toString(),
string = '';
if (Sankore.Calculus.Operation.isPrototypeOf(this.left)) {
if (this.left.getPrecedence() < this.getPrecedence()) {
leftString = '(' + leftString + ')';
}
}
if (Sankore.Calculus.Operation.isPrototypeOf(this.right)) {
if (this.right.getPrecedence() < this.getPrecedence()) {
rightString = '(' + rightString + ')';
}
}
return leftString + String(this.operator) + rightString;
}
}));
/**
* Euclidean division operator
*/
klass.define('Sankore.Calculus', 'EuclideanDivisionOperation', Sankore.Calculus.BinaryOperation.extend({
constructor: function (left, right) {
Sankore.Calculus.BinaryOperation.constructor.call(this, left, ':', right);
},
getValue: function () {
var rightValue = this.right.getValue();
if (0 === rightValue) {
throw Sankore.Util.Error.create('ZeroDivision', 'Division by zero');
}
return Math.floor(this.left.getValue() / rightValue);
},
getRemainder: function () {
var rightValue = this.right.getValue();
if (0 === rightValue) {
throw Sankore.Util.Error.create('ZeroDivision', 'Division by zero');
}
return this.left.getValue() % rightValue;
}
}));
})();
\ No newline at end of file
/*global klass:true, Sankore:true*/
(function () {
"use strict";
klass.define('Sankore', 'Command', klass.extend({
constructor: function (id, name, closure) {
this.id = id;
this.name = name;
this.closure = closure;
},
getId: function () {
return this.id;
},
getName: function () {
return this.name;
},
exec: function (scope, args) {
this.closure.call(scope, args);
},
isInterrupting: function () {
return false;
},
isInternal: function () {
return false;
}
}));
klass.define('Sankore', 'InterruptingCommand', Sankore.Command.extend({
constructor: function (id, name, closure) {
Sankore.Command.constructor.call(this, id, name, closure);
},
isInterrupting: function () {
return true;
}
}));
klass.define('Sankore', 'InternalCommand', Sankore.Command.extend({
constructor: function (id, name, closure) {
Sankore.Command.constructor.call(this, id, name, closure);
},
isInternal: function () {
return true;
}
}));
})();
\ No newline at end of file
/*global klass:true, Sankore:true*/
(function () {
"use strict";
klass.define('Sankore.Editor', 'Layout', klass.extend({
constructor: function (data) {
this.id = data.id || null;
this.name = data.name || null;
this.description = data.description || null;
this.editable = false;
this.buttonMap = data.buttonMap || {};
},
setEditable: function (editable) {
this.editable = !! editable;
},
isEditable: function () {
return this.editable;
},
getButton: function (slot) {
return this.buttonMap[slot] || null;
},
clone: function () {
var clonedMap = {};
for (var index in this.buttonMap) {
if (this.buttonMap.hasOwnProperty(index)) {
clonedMap[index] = this.buttonMap[index].clone();
}
}
return Sankore.Editor.Layout.create({
id: this.id,
name: this.name,
description: this.description,
editable: this.editable,
buttonMap: clonedMap
});
}
}));
})();
\ No newline at end of file
/*global klass:true, Sankore:true*/
(function () {
"use strict";
klass.define('Sankore', 'KeystrokeLine', klass.extend({
constructor: function (dispatcher) {
this.dispatcher = dispatcher;
this.keystrokes = [];
this.caret = 0;
},
notify: function () {
this.dispatcher.notify('keystroke_line.changed', this);
},
hit: function (keystroke) {
this.keystrokes.splice(this.caret, 0, keystroke);
this.caret++;
this.notify();
},
del: function () {
if (this.caret > 0) {
var deleted = this.keystrokes.splice(this.caret - 1, 1)[0];
this.caret--;
this.notify();
return deleted;
}
},
moveCaretLeft: function () {
if (this.caret > 0) {
this.caret--;
this.notify();
}
},
moveCaretRight: function () {
if (this.caret < this.keystrokes.length) {
this.caret++;
this.notify();
}
},
moveCaretToEnd: function () {
this.caret = this.keystrokes.length;
this.notify();
},
reset: function () {
this.caret = 0;
this.keystrokes = [];
this.notify();
},
count: function () {
return this.keystrokes.length;
},
at: function (index) {
if (typeof this.keystrokes[index] !== 'undefined') {
return this.keystrokes[index];
}
throw Sankore.Util.Error.create('OutOfRangeError', 'No keystroke at index ' + index);
},
getAsText: function () {
return [
this.getTextAtRange(0, this.caret),
this.getTextAtRange(this.caret, this.keystrokes.length)
];
},
getTextAtRange: function (from, to) {
var i, output = '';
if (from < 0) {
throw Sankore.Util.Error.create('OutOfRangeError', 'Cannot get keystroke before index 0');
}
if (from > this.keystrokes.length) {
throw Sankore.Util.Error.create('OutOfRangeError', 'Cannot get keystroke after index ' + this.keystrokes.length);
}
for (i = from; i < to; i++) {
output += this.at(i).text;
}
return output;
},
getState: function () {
return {
keystrokes: this.keystrokes,
caret: this.caret
};
},
loadState: function (state) {
this.keystrokes = state.keystrokes || {};
this.caret = state.caret || 0;
this.notify();
}
}));
})();
\ No newline at end of file
/*globals klass:true, Sankore:true*/
(function() {
"use strict";
klass.define('Sankore', 'Text', klass.extend({
constructor: function (id, screen, button, type, editable) {
this.id = id;
this.screen = screen;
this.button = button;
this.type = typeof type !== 'undefined' ? type : 'normal';
this.editable = typeof editable !== 'undefined' ? !!editable : true;
},
isEditable: function () {
return this.editable;
},
setEditable: function (editable) {
this.editable = !!editable;
}
}));
})();
\ No newline at end of file
/*globals klass:true Sankore:true*/
(function(){
"use strict";
klass.define('Sankore.Util', 'Error', klass.extend({
constructor: function (name, message) {
this.name = name;
this.message = message;
},
toString: function () {
return this.name + ': ' + this.message;
}
}));
})();
\ No newline at end of file
/*globals klass: true, Sankore:true*/
(function () {
"use strict";
klass.define('Sankore.Util', 'EventDispatcher', klass.extend({
constructor: function () {
this.eventListeners = {};
},
addEventSubscriber: function(subscriber) {
for (var i in subscriber.events) {
this.addEventListener(subscriber.events[i], subscriber.listener);
}
return this;
},
addEventListener: function (event, closure, id) {
if (typeof this.eventListeners[event] === 'undefined') {
this.eventListeners[event] = [];
}
if (typeof id === 'undefined') {
this.eventListeners[event].push(closure);
} else {
this.eventListeners[event][id] = closure;
}
return this;
},
removeEventListener: function (event, id) {
delete this.eventListeners[event][id];
},
removeAllEventListeners: function (event) {
this.eventListeners[event] = [];
},
notify: function (event, obj) {
var closure;
for (closure in this.eventListeners[event]) {
this.eventListeners[event][closure](obj);
}
}
}));
})();
\ No newline at end of file
/*globals klass: true, Sankore: true*/
(function() {
"use strict";
klass.define('Sankore.Util', 'Hash', klass.extend({
constructor: function (elements) {
this.elements = elements || {};
},
length: function () {
return this.keys().length;
},
keys: function () {
return Object.keys(this.elements);
},
set: function (id, value) {
this.elements[id] = value;
},
add: function (id, values) {
for (var i in values) {
this.set(values[i][id], values[i]);
}
},
has: function (id) {
return this.keys().indexOf(id) !== -1;
},
get: function (id, def) {
if (typeof this.elements[id] !== 'undefined') {
return this.elements[id];
}
if (typeof def !== 'undefined') {
return def;
}
return null;
},
pos: function (id) {
var pos = 0;
for (var i in this.elements) {
if (this.elements.hasOwnProperty(i) && i === id) {
return pos;
}
pos++;
}
return null;
},
remove: function (id) {
return delete this.elements[id];
},
map: function (closure) {
var output = [],
called;
for (var id in this.elements) {
if (this.elements.hasOwnProperty(id)) {
called = closure.call(this, id, this.elements[id]);
if (called) {
output.push(called);
}
}
}
return output;
}
}));
})();
\ No newline at end of file
/*jshint devel:true, browser:true*/
/*globals klass:true, Sankore:true*/
(function () {
"use strict";
klass.define('Sankore.Util', 'I18N', klass.extend({
catalogs: Sankore.Util.Hash.create(),
constructor: function () {
this.catalog = {};
},
load: function (locale) {
var localeId = locale.split(/-|_/)[0].toLowerCase();
if (!Sankore.Util.I18N.catalogs.has(localeId)) {
localeId = 'en';
}
this.catalog = Sankore.Util.I18N.catalogs.get(localeId, {});
},
translate: function (id) {
return id.split('.').reduce(
function (root, id) {
if (root && id in root) {
return root[id];
}
return null;
},
this.catalog
) || id;
}
}));
// global instance
Sankore.Util.i18n = Sankore.Util.I18N.create();
// global helper
window._ = function (id) {
return Sankore.Util.i18n.translate(id);
};
})();
\ No newline at end of file
(function() {
Sankore.Util.I18N.catalogs.set('en', {
layout: {
classic_name: 'Basic calculator',
new_name: 'New calculator'
},
text: {
del: 'DEL',
comma: '.'
},
command: {
zero: '0 digit',
one: '1 digit',
two: '2 digit',
three: '3 digit',
four: '4 digit',
five: '5 digit',
six: '6 digit',
seven: '7 digit',
eight: '8 digit',
nine: '9 digit',
plus: 'Addition',
minus: 'Subtraction',
times: 'Multiplication',
divide: 'Division',
euclidean_divide: 'Euclidean division',
equal: 'Equal',
comma: 'Comma',
open_parenthesis: 'Open parenthesis',
close_parenthesis: 'Close parenthesis',
op: 'Constant operator',
memory_add: 'Memory addition',
memory_sub: 'Memory substraction',
memory_recall: 'Memory recall',
memory_clear: 'Memory clear',
clear: 'Clear',
left: 'Move left',
right: 'Move right',
del: 'Delete'
},
controls: {
editor: 'Editor',
reset: 'RST'
},
editor: {
run_button: 'Run',
remove_alert: 'Delete this calculator?',
layout_name: {
label: 'Name'
},
layout_description: {
label: 'Description'
},
assignation: {
enabled: 'Click on a button to edit it',
disabled: 'This calculator is not editable',
text: {
label: 'Display text'
},
command: {
label: 'Command'
},
use_limit: {
label: 'Use limit',
help: '0 for disabled, empty for unlimited'
}
}
},
error: {
common: 'Error',
zero_division: 'Div/0 error'
}
});
})();
\ No newline at end of file
(function() {
Sankore.Util.I18N.catalogs.set('fr', {
layout: {
classic_name: 'Calculatrice standard',
new_name: 'Nouvelle calculatrice'
},
text: {
del: 'EFF',
comma: ','
},
command: {
zero: 'Chiffre 0',
one: 'Chiffre 1',
two: 'Chiffre 2',
three: 'Chiffre 3',
four: 'Chiffre 4',
five: 'Chiffre 5',
six: 'Chiffre 6',
seven: 'Chiffre 7',
eight: 'Chiffre 8',
nine: 'Chiffre 9',
plus: 'Addition',
minus: 'Soustraction',
times: 'Multiplication',
divide: 'Division',
euclidean_divide: 'Division euclidienne',
equal: 'Egalité',
comma: 'Virgule',
open_parenthesis: 'Parenthèse ouvrante',
close_parenthesis: 'Parenthèse fermante',
op: 'Opérateur constant',
memory_add: 'Addition mémoire',
memory_sub: 'Soustraction mémoire',
memory_recall: 'Rappel mémoire',
memory_clear: 'R.A.Z. mémoire',
clear: 'R.A.Z.',
left: 'Déplacement à gauche',
right: 'Déplacement à droite',
del: 'Suppression'
},
controls: {
editor: 'Editeur',
reset: 'RAZ'
},
editor: {
run_button: 'Utiliser',
remove_alert: 'Supprimer cette calculatrice ?',
layout_name: {
label: 'Nom'
},
layout_description: {
label: 'Description'
},
assignation: {
enabled: 'Cliquez sur une touche pour la modifier',
disabled: 'Cette calculatrice n\'est pas modifiable',
text: {
label: 'Texte à afficher'
},
command: {
label: 'Commande'
},
use_limit: {
label: 'Nb d\'utilisation',
help: '0 pour désactiver, vide pour illimité'
}
}
},
error: {
common: 'Erreur',
zero_division: 'Erreur div/0'
}
});
})();
\ No newline at end of file
/*global window:true*/
(function () {
"use strict";
// polyfill
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis ? this : oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
window.klass = {
create: function () {
var self = Object.create(this);
if (typeof self.constructor === "function") {
self.constructor.apply(self, arguments);
}
return self;
},
extend: function (object) {
var self = Object.create(this);
if (!object) {
return self;
}
Object.keys(object).forEach(function (key) {
self[key] = object[key];
});
return self;
},
define: function (namespace, name, object) {
var createNamespace = function (namespace, root) {
var namespaceParts = namespace.split('.'),
first;
if (namespaceParts.length > 0) {
first = namespaceParts.shift();
if (typeof root[first] === 'undefined') {
root[first] = {};
}
if (namespaceParts.length > 0) {
return createNamespace(namespaceParts.join('.'), root[first]);
}
return root[first];
}
return null;
},
ns = createNamespace(namespace, window);
ns[name] = object;
}
};
})();
\ No newline at end of file
* {
margin: 0;
padding: 0;
}
body{
margin:0px;
}
.ubw-container{
float:left;
margin:3px;
margin-right:0px;
margin-top: 2px;
background-image:url(../images/back_small.png);
overflow: hidden;
}
.ubw-body{
margin:5px;
margin-left: 9px;
margin-right: 0px;
}
.ubw-inspector{
position:absolute;
background-color:rgb(252, 252, 252);
border:1px solid #cccccc;
line-height:20px;
font-family:Arial, Helvetica, sans-serif;
font-weight:normal;
font-size:20px;
color:#333333;
}
.ubw-inpubox{
min-width:28px;
min-height:37px;
color:#333333;
background-image: url(../images/button_out.png);
border-left:1px solid rgb(231, 231, 231);
border-right:1px solid rgb(231, 231, 231);
border-bottom:1px solid rgb(221, 221, 221);
border-top:1px solid rgb(241, 241, 241);
}
/*BUTTONS*/
.ubw-button-wrapper{
float:left;
position:relative;
/*border:solid 1px yellow;*/
margin-right:-7px;
z-index:0;
font-family:Arial, Helvetica, sans-serif;
font-weight:normal;
font-size:30px;
overflow:visible;
}
.ubw-button-canvas{
width:auto;
float:left;
position:relative;
overflow:visible;
}
table{
line-height:90%;
}
.ubw-button-body{
position:relative;
float:left;
width:auto;
height:auto;
overflow:visible
text-align:center;
vertical-align:middle;
cursor:pointer;
}
.ubw-button-content{
height:auto;
width:auto;
text-align:center;
overflow:visible;
}
.ubw-button-over{
}
.ubw-button-out{
}
span.colored{
color: #0080ff;
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment