Compare commits
2 Commits
535170d5a2
...
e4504daca0
Author | SHA1 | Date |
---|---|---|
|
e4504daca0 | 4 weeks ago |
|
ab0e715500 | 4 weeks ago |
@ -1,6 +0,0 @@ |
|||
''' |
|||
数据库管理功能类 |
|||
''' |
|||
class DBManager: |
|||
def __init__(self): |
|||
pass |
@ -0,0 +1,90 @@ |
|||
#结果合并功能函数模块 |
|||
import re |
|||
|
|||
def my_merge(fun_name,result): |
|||
if fun_name == "enum4linux": |
|||
result = enum4linux_merge(result) |
|||
else: |
|||
pass |
|||
return result |
|||
|
|||
|
|||
#--------------------enum4linux-------------------- |
|||
def enum4linux_merge(result): |
|||
print("enum4linux") |
|||
# 1.用户列表(用于密码爆破) |
|||
users = extract_users(result) |
|||
# 2. 共享目录(用于未授权访问/文件泄露) |
|||
shares = extract_shares(result) |
|||
# 3. 密码策略(指导爆破规则) |
|||
policy = extract_password_policy(result) |
|||
# 4. 操作系统信息(用于漏洞匹配) |
|||
os_info = extract_os_info(result) |
|||
# 整合输出 |
|||
result = f"Users:{users}\nShares:{shares}\nPolicy:{policy}\nOS Info:{os_info}\n" |
|||
print(result) |
|||
return result |
|||
|
|||
def extract_users(data): |
|||
"""提取所有用户列表(含 RID)""" |
|||
users = {} |
|||
pattern = re.compile(r"user:\[(.*?)\] rid:\[(0x[a-fA-F0-9]+)\]") |
|||
matches = pattern.findall(data) |
|||
for user, rid in matches: |
|||
users[user] = rid |
|||
return users |
|||
|
|||
def extract_shares(data): |
|||
"""提取共享目录并清理 ANSI 转义码""" |
|||
shares = [] |
|||
share_block = re.search(r"Share Enumeration.*?=\n(.*?)\n\n", data, re.DOTALL) |
|||
if share_block: |
|||
lines = share_block.group(1).split('\n') |
|||
for line in lines: |
|||
# 清理 ANSI 转义码(如 \x1b[35m) |
|||
line_clean = re.sub(r'\x1b\[[0-9;]*m', '', line) |
|||
if 'Disk' in line_clean or 'IPC' in line_clean: |
|||
parts = list(filter(None, line_clean.split())) |
|||
if len(parts) >= 3: |
|||
share = { |
|||
"name": parts[0], |
|||
"type": parts[1], |
|||
"access": "Unknown" |
|||
} |
|||
# 提取清理后的访问权限 |
|||
access_line = re.search(rf"//.*{re.escape(parts[0])}.*Mapping: (.*?) ", data) |
|||
if access_line: |
|||
access_clean = re.sub(r'\x1b\[[0-9;]*m', '', access_line.group(1)) |
|||
share["access"] = access_clean |
|||
shares.append(share) |
|||
return shares |
|||
|
|||
def extract_password_policy(data): |
|||
"""提取密码策略""" |
|||
policy = {} |
|||
policy_block = re.search(r"Password Policy Information.*?=\n(.*?)\n\n", data, re.DOTALL) |
|||
if not policy_block: |
|||
return policy |
|||
|
|||
policy_text = policy_block.group(1) |
|||
# 提取最小密码长度(处理未匹配情况) |
|||
min_length_match = re.search(r"Minimum password length: (\d+)", policy_text) |
|||
policy["min_length"] = min_length_match.group(1) if min_length_match else "未知" |
|||
|
|||
# 提取密码复杂性要求 |
|||
complexity_match = re.search(r"Password Complexity: (Enabled|Disabled)", policy_text) |
|||
policy["complexity"] = complexity_match.group(1) if complexity_match else "未知" |
|||
|
|||
# 提取账户锁定阈值 |
|||
lockout_match = re.search(r"Account Lockout Threshold: (\d+|None)", policy_text) |
|||
policy["lockout_threshold"] = lockout_match.group(1) if lockout_match else "未知" |
|||
return policy |
|||
|
|||
def extract_os_info(data): |
|||
"""提取操作系统信息""" |
|||
os_info = {} |
|||
match = re.search(r"server \(([^)]+)\)", data) |
|||
if match: |
|||
os_info["samba_version"] = match.group(1) |
|||
return os_info |
|||
#------------------------------------------------ |
@ -0,0 +1 @@ |
|||
测试文件 |
@ -1 +0,0 @@ |
|||
[{"role": "system", "content": "你是一位资深的渗透测试专家,需要动态控制整个渗透测试过程,包括信息收集、漏洞扫描、漏洞利用等阶段,最终生成渗透测试报告。由你规划执行的指令,我会根据你的指令执行并提交结果,你再对结果进行分析,规划并生成下一步指令,直到完成渗透测试,生成测试报告。生成的指令需满足如下约束:1.只返回具体的shell指令或Python代码,不要包含注释和说明;2.shell指令以```bash(.*?)```包裹,python代码以```python(.*?)```包裹;3.针对提供的Python代码,需要包含错误处理,并将执行结果保存到文件中(为每个任务指定唯一文件名),执行结束返回success或failure和该文件名;4.如果认为渗透测试已完成,请生成生成报告的python代码,并返回success和complete"}, {"role": "user", "content": "现在开始对目标192.168.204.137进行渗透测试,已知信息无,请提供下一步执行的指令。"}, {"role": "assistant", "content": "```bash\nnmap -Pn -sS -sV -O -T4 -p- 192.168.204.137 -oN nmap_initial_scan.txt\n```"}] |
@ -0,0 +1,17 @@ |
|||
import subprocess |
|||
import tempfile |
|||
import os |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class DirbTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
instruction = instruction.strip() |
|||
if " -o" not in instruction: |
|||
instruction += " -o dirout.txt" |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -0,0 +1,13 @@ |
|||
from tools.ToolBase import ToolBase |
|||
from mycode.Result_merge import my_merge |
|||
|
|||
class Enum4linuxTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
result = my_merge("enum4linux", result) |
|||
return result |
@ -0,0 +1,11 @@ |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class MkdirTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -0,0 +1,11 @@ |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class PrintfTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -0,0 +1,84 @@ |
|||
import subprocess |
|||
import tempfile |
|||
import os |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class PsqlTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 60 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
|||
|
|||
def do_worker_script(self,str_instruction,timeout,ext_params): |
|||
# 创建临时文件保存输出 |
|||
with tempfile.NamedTemporaryFile(delete=False) as tmpfile: |
|||
output_file = tmpfile.name |
|||
|
|||
# 构建并执行 script 命令 |
|||
script_cmd = f"script -c '{str_instruction}' {output_file}" |
|||
try: |
|||
result = subprocess.run(script_cmd, shell=True, text=True,timeout=timeout) |
|||
# 读取输出文件内容 |
|||
with open(output_file, 'r') as f: |
|||
output = f.read() |
|||
lines = output.splitlines() |
|||
# 跳过第一行(Script started)和最后一行(Script done) |
|||
ftp_output = lines[1:-1] |
|||
output = '\n'.join(ftp_output) |
|||
except subprocess.TimeoutExpired: |
|||
output = "命令超时返回" |
|||
try: |
|||
with open(output_file, 'r') as f: |
|||
partial_output = f.read() |
|||
if partial_output: |
|||
output += f"\n部分输出:\n{partial_output}" |
|||
except FileNotFoundError: |
|||
pass # 文件可能未创建 |
|||
except subprocess.CalledProcessError as e: |
|||
output = f"错误: {e}" |
|||
finally: |
|||
# 删除临时文件 |
|||
try: |
|||
os.remove(output_file) |
|||
except FileNotFoundError: |
|||
pass # 文件可能未创建 |
|||
return output |
|||
|
|||
def execute_instruction1(self, instruction_old): |
|||
''' |
|||
执行指令:验证合法性 -> 执行 -> 分析结果 |
|||
*****如果指令要做验证,只做白名单,所有逻辑不是全放开就是白名单***** |
|||
:param instruction_old: |
|||
:return: |
|||
bool:true-正常返回给大模型处理下一步,false-结果不返回给大模型,2--需要人工确认的指令 |
|||
str:执行的指令 |
|||
str:执行指令的结果-解析过滤后的结果--也是提交给LLM的结果 |
|||
str:执行指令的结果-原结果 |
|||
object:补充参数-封装一个对象: 0-不知是否攻击成功,1-明确存在漏洞,2-明确不存在漏洞 |
|||
''' |
|||
|
|||
ext_params = self.create_extparams() |
|||
# 第一步:验证指令合法性 |
|||
instruction,timeout = self.validate_instruction(instruction_old) |
|||
if not instruction: |
|||
ext_params.is_user= True |
|||
return False,instruction_old,"该指令暂不执行!由用户确认是否要兼容支持","",ext_params #未 |
|||
#过滤修改后的指令是否需要判重?同样指令再执行结果一致?待定---#? |
|||
|
|||
# 第二步:执行指令 |
|||
output = self.do_worker_script(instruction,timeout,ext_params) |
|||
|
|||
# 第三步:分析执行结果 |
|||
if isinstance(output,bytes):#若是bytes则转成str |
|||
output = output.decode('utf-8', errors='ignore') |
|||
|
|||
analysis = self.analyze_result(output,instruction,"","") |
|||
|
|||
if not analysis: #analysis为“” 不提交LLM |
|||
ext_params.is_user = True |
|||
return False,instruction,analysis,output,ext_params |
|||
return True,instruction, analysis,output,ext_params |
@ -0,0 +1,11 @@ |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class ShowmountTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -1,29 +1,25 @@ |
|||
import os |
|||
import shlex |
|||
import re |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class SmtpuserenumTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
timeout = 0 |
|||
# 分割指令为参数列表 |
|||
cmd_parts = shlex.split(instruction) |
|||
new_cmd = [] |
|||
# 获取当前程序所在目录 |
|||
current_path = os.path.dirname(os.path.realpath(__file__)) |
|||
new_user_path = os.path.join(current_path, "../payload", "users") |
|||
|
|||
i = 0 |
|||
while i < len(cmd_parts): |
|||
part = cmd_parts[i] |
|||
new_cmd.append(part) |
|||
# 检测到-P参数 |
|||
if part == "-U" and i + 1 < len(cmd_parts): # 用户名 |
|||
# 替换下一参数为指定路径 |
|||
new_cmd.append(new_user_path) |
|||
i += 1 # 跳过原路径参数 |
|||
i += 1 |
|||
|
|||
return " ".join(shlex.quote(p) for p in new_cmd),timeout |
|||
match = re.search(r'-U\s+(\S+)', instruction) |
|||
if match: |
|||
file_path = match.group(1) |
|||
# 检查该文件是否存在 |
|||
if not os.path.isfile(file_path): |
|||
# 替换原文件路径为新的路径 |
|||
instruction = instruction.replace(file_path, new_user_path) |
|||
|
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
|
@ -0,0 +1,11 @@ |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class SwaksTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -0,0 +1,11 @@ |
|||
from tools.ToolBase import ToolBase |
|||
|
|||
class TouchTool(ToolBase): |
|||
def validate_instruction(self, instruction): |
|||
#指令过滤 |
|||
timeout = 0 |
|||
return instruction,timeout |
|||
|
|||
def analyze_result(self, result,instruction,stderr,stdout): |
|||
#指令结果分析 |
|||
return result |
@ -0,0 +1,4 @@ |
|||
from quart import Blueprint |
|||
#定义模块 |
|||
api = Blueprint('api',__name__) |
|||
from . import user |
@ -0,0 +1,143 @@ |
|||
import os |
|||
import hashlib |
|||
from quart import Quart, render_template, request, session, redirect, url_for,jsonify,send_file,flash |
|||
from quart_sqlalchemy import SQLAlchemy |
|||
from quart_session import Session |
|||
from web.common.utils import generate_captcha,login_required |
|||
from myutils.ConfigManager import myCongif |
|||
from . import api |
|||
from web.common.errors import handle_error |
|||
|
|||
|
|||
@api.route('/user/code',methods=['GET']) |
|||
async def user_get_code(): #获取验证码 |
|||
captcha_text, buffer = generate_captcha() |
|||
print(captcha_text) |
|||
session['captcha'] = captcha_text # 记录验证码? |
|||
return await send_file(buffer, mimetype='image/png') |
|||
|
|||
|
|||
@api.route('/user/login',methods=['POST']) |
|||
async def user_login(): #用户登录 |
|||
try: |
|||
form = await request.form |
|||
username = form['username'] |
|||
password = form['password'] |
|||
captcha = form['captcha'] |
|||
except Exception as e: |
|||
await flash('请求数据格式错误', 'error') |
|||
return redirect(url_for('main.login')) |
|||
#return jsonify({'error': '请求数据格式错误'}), 400 |
|||
|
|||
if captcha != session.get('captcha'): |
|||
# 验证码验证过后,需要失效 |
|||
session.pop('captcha', None) |
|||
await flash('验证码错误', 'error') |
|||
return redirect(url_for('main.login')) |
|||
#return jsonify({'error': '验证码错误'}), 400 |
|||
#return 'captcha error!', 400 |
|||
#比对用户名和密码 |
|||
strsql = f"select password from user where username = '{username}'" |
|||
db_password = mDBM.do_select(strsql,1) |
|||
passwd_md5 = get_md5(password) |
|||
if db_password: |
|||
if db_password[0] == passwd_md5: #后续需要对密码进行MD5加默 |
|||
print("登录成功") |
|||
session['user'] = username |
|||
return redirect(url_for('main.get_html', html='view_main.html')) |
|||
await flash('用户名或密码错误', 'error') |
|||
return redirect(url_for('main.login')) |
|||
|
|||
@api.route('/user/userinfo',methods=['GET']) |
|||
@login_required |
|||
async def user_info(): #获取用户列表 |
|||
strsql = "select username,status,people,tellnum from user;"; |
|||
data = mDBM.do_select(strsql) |
|||
if data: |
|||
user_list = [{"username": user[0], "status": user[1], |
|||
"people":user[2],"tellnum":user[3]} for user in data] |
|||
return jsonify(user_list) |
|||
else: |
|||
return jsonify(0) |
|||
|
|||
|
|||
@api.route('/user/adduser',methods=['POST']) |
|||
@login_required |
|||
async def user_adduser(): #新增用户 |
|||
username = (await request.form)['username'] |
|||
people = (await request.form)['people'] |
|||
tellnum = (await request.form)['tellnum'] |
|||
strsql = f"select username from user where username = '{username}';" |
|||
password = myCongif.get_data('pw') |
|||
data = mDBM.do_select(strsql) |
|||
if data: |
|||
reStatus = 0 |
|||
reMsg = '用户名重复,请重新输入!' |
|||
else: |
|||
strsql = (f"INSERT INTO user (username ,password ,status,people,tellnum ) VALUES " |
|||
f"('{username}','{password}',1,'{people}','{tellnum}');") |
|||
ret = mDBM.do_sql(strsql) |
|||
if ret == True: |
|||
reStatus = 1 |
|||
reMsg = '添加用户成功' |
|||
else: |
|||
reStatus = 0 |
|||
reMsg = '添加用户异常,请联系管理员处理!' |
|||
return jsonify({'status':reStatus,'msg':reMsg}) |
|||
|
|||
@api.route('/user/passwd',methods=['POST']) |
|||
@login_required |
|||
async def user_change_passwd(): #修改密码 |
|||
json_data = await request.get_json() |
|||
oldpasswd = json_data.get('oldpasswd') |
|||
newpasswd = json_data.get('newpasswd') |
|||
old_md5= get_md5(oldpasswd) |
|||
print(old_md5) |
|||
strsql = f"select id from user where password='{old_md5}';" |
|||
data = mDBM.do_select(strsql,1) |
|||
reStatus = 0 |
|||
if data: |
|||
new_md5 = get_md5(newpasswd) |
|||
strsql = f"update user set password = '{new_md5}' where password = '{old_md5}';" |
|||
ret = mDBM.do_sql(strsql) |
|||
if ret: |
|||
reStatus = 1 |
|||
reMsg = '修改密码成功' |
|||
else: |
|||
reMsg = '修改密码失败,请联系技术支持!' |
|||
else: |
|||
reMsg = '原密码错误,请确认!' |
|||
return jsonify({'status':reStatus,'msg':reMsg}) |
|||
|
|||
|
|||
@api.route('/user/changeuser',methods=['POST']) |
|||
@login_required |
|||
async def user_change_user_info(): #修改用户信息 |
|||
username = (await request.form)['username'] |
|||
people = (await request.form)['people'] |
|||
tellnum = (await request.form)['tellnum'] |
|||
strsql = f"update user set people='{people}',tellnum='{tellnum}' where username='{username}';" |
|||
ret = mDBM.do_sql(strsql) |
|||
if ret == True: |
|||
reStatus = 1 |
|||
reMsg = '修改用户信息成功' |
|||
else: |
|||
reStatus = 0 |
|||
reMsg = '修改失败,请联系管理员处理!' |
|||
return jsonify({'status': reStatus, 'msg': reMsg}) |
|||
|
|||
@api.route('/user/<int:user_id>', methods=['GET']) |
|||
async def get_user(user_id): |
|||
try: |
|||
user = user_id |
|||
if user: |
|||
return jsonify(user) |
|||
else: |
|||
return jsonify({'error': 'User not found'}), 404 |
|||
except Exception as e: |
|||
return handle_error(e) |
|||
|
|||
def get_md5(value): |
|||
md5 = hashlib.md5() # 创建一个md5对象 |
|||
md5.update(value.encode('utf-8')) # 使用utf-8编码更新待计算的字符串 |
|||
return md5.hexdigest() # 返回十六进制的MD5值 |
@ -0,0 +1,65 @@ |
|||
from quart import Quart,session,redirect, url_for |
|||
from quart_session import Session |
|||
from quart_cors import cors |
|||
from pymemcache.client import base |
|||
from .main import main |
|||
from .API import api |
|||
from functools import wraps |
|||
from myutils.ConfigManager import myCongif |
|||
# from quart_sqlalchemy import SQLAlchemy |
|||
# from flask_migrate import Migrate |
|||
|
|||
#app.config['SECRET_KEY'] = 'mysecret' #密钥 --需要放配置文件 |
|||
#socketio = SocketIO(app) |
|||
|
|||
# Create the custom backend for quart-session |
|||
class MemcachedSessionInterface: #只是能用,不明所以 |
|||
def __init__(self, client): |
|||
self.client = client |
|||
|
|||
async def open_session(self, app, request): |
|||
sid = request.cookies.get(app.session_cookie_name) |
|||
if not sid: |
|||
sid = self._generate_sid() |
|||
val = await self.client.get(self.key_prefix + sid) |
|||
if val is not None: |
|||
return self._deserialize(val) |
|||
return self._get_default_session() |
|||
|
|||
async def save_session(self, app, session, response): |
|||
val = self._serialize(session) |
|||
await self.client.set(self.key_prefix + session.sid, val, self.expire) |
|||
|
|||
def create_app(): |
|||
app = Quart(__name__) |
|||
app.config['SECRET_KEY'] = 'zfxxkj_2024_!@#' |
|||
|
|||
if myCongif.get_data("model_platform") == "acl": |
|||
app.config['SESSION_TYPE'] = 'memcached' # session类型 |
|||
elif myCongif.get_data("model_platform") =="cpu": |
|||
app.config['SESSION_TYPE'] = 'redis' # session类型 |
|||
|
|||
#app.config['SESSION_FILE_DIR'] = './sessions' # session保存路径 |
|||
#app.config['SESSION_MEMCACHED'] = base.Client(('localhost', 11211)) |
|||
app.config['SESSION_PERMANENT'] = True # 如果设置为True,则关闭浏览器session就失效。 |
|||
app.config['SESSION_USE_SIGNER'] = False # 是否对发送到浏览器上session的cookie值进行加密 |
|||
|
|||
memcached_client = base.Client(('localhost', 11211)) |
|||
app.session_interface = MemcachedSessionInterface(memcached_client) |
|||
Session(app) |
|||
|
|||
# 注册main |
|||
app.register_blueprint(main) |
|||
#注册API模块 |
|||
app.register_blueprint(api,url_prefix = '/api') |
|||
return app |
|||
|
|||
|
|||
def login_required(f): |
|||
@wraps(f) |
|||
async def decorated_function(*args, **kwargs): |
|||
if 'user' not in session: |
|||
return redirect(url_for('main.login')) |
|||
return await f(*args, **kwargs) |
|||
return decorated_function |
|||
|
@ -0,0 +1,4 @@ |
|||
from quart import jsonify |
|||
|
|||
def handle_error(e): |
|||
return jsonify({'error':str(e)}),500 |
@ -0,0 +1,10 @@ |
|||
from app import db |
|||
import datetime |
|||
|
|||
class Captcha(db.Model): |
|||
id = db.Column(db.Integer, primary_key=True) |
|||
captcha_text = db.Column(db.String(10), nullable=False) |
|||
timestamp = db.Column(db.DateTime, default=datetime.datetime.utcnow) |
|||
|
|||
def __init__(self, captcha_text): |
|||
self.captcha_text = captcha_text |
@ -0,0 +1,43 @@ |
|||
from PIL import Image, ImageDraw, ImageFont,ImageFilter |
|||
import random |
|||
import string |
|||
import io |
|||
from functools import wraps |
|||
from quart import session, redirect, url_for |
|||
|
|||
def generate_captcha(): |
|||
characters = string.ascii_uppercase + string.digits |
|||
captcha_text = ''.join(random.choices(characters, k=6)) |
|||
|
|||
font = ImageFont.truetype("arial.ttf", 36) |
|||
image = Image.new('RGB', (200, 60), color=(255, 255, 255)) |
|||
draw = ImageDraw.Draw(image) |
|||
|
|||
for i in range(6): |
|||
draw.text((10 + i * 30, 10), captcha_text[i], font=font, |
|||
fill=(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))) |
|||
# 模糊化处理 |
|||
image = image.filter(ImageFilter.BLUR) |
|||
|
|||
# 将图片保存到BytesIO流中 |
|||
buffer = io.BytesIO() |
|||
image.save(buffer, 'jpeg') |
|||
buffer.seek(0) |
|||
|
|||
# captcha_path = os.path.join('static', 'captcha', f'{captcha_text}.png') |
|||
# image.save(captcha_path) |
|||
# return captcha_text, f'static/captcha/{captcha_text}.png' |
|||
return captcha_text, buffer |
|||
|
|||
|
|||
def verify_captcha(user_input, actual_captcha): |
|||
return user_input == actual_captcha |
|||
|
|||
|
|||
def login_required(f): |
|||
@wraps(f) |
|||
async def decorated_function(*args, **kwargs): |
|||
if 'user' not in session: |
|||
return redirect(url_for('main.index',error='未登录,请重新登录')) |
|||
return await f(*args, **kwargs) |
|||
return decorated_function |
@ -0,0 +1,5 @@ |
|||
from quart import Blueprint |
|||
|
|||
main = Blueprint('main', __name__,static_folder='static/resources',template_folder='templates') |
|||
|
|||
from . import routes |
@ -0,0 +1,83 @@ |
|||
import os |
|||
from web.main import main |
|||
from quart import render_template, send_from_directory,request |
|||
from quart import session, redirect, url_for,flash |
|||
from functools import wraps |
|||
from myutils.ConfigManager import myCongif |
|||
from werkzeug.utils import secure_filename |
|||
|
|||
''' |
|||
页面路由 |
|||
''' |
|||
|
|||
def login_required(f): |
|||
@wraps(f) |
|||
async def decorated_function(*args, **kwargs): |
|||
if 'user' not in session: |
|||
return redirect(url_for('main.index',error='未登录,请重新登录')) |
|||
return await f(*args, **kwargs) |
|||
return decorated_function |
|||
|
|||
@main.route('/') |
|||
async def index(): |
|||
#return await render_template('实时预览.html') |
|||
return await render_template('login.html') |
|||
#return await render_template('index_webrtc.html') |
|||
|
|||
@main.route('/login', methods=['GET', 'POST']) |
|||
async def login(): |
|||
if request.method == 'POST': |
|||
form = await request.form |
|||
username = form.get('username') |
|||
password = form.get('password') |
|||
# Add your login logic here |
|||
if username == 'admin' and password == 'password': |
|||
return redirect(url_for('main.dashboard')) # Assuming you have a dashboard route |
|||
else: |
|||
return "Invalid credentials", 401 |
|||
return await render_template('login.html') |
|||
|
|||
@main.route('/dashboard') |
|||
async def dashboard(): |
|||
return "Welcome to the dashboard!" |
|||
|
|||
@main.route('/favicon.ico') |
|||
async def favicon(): |
|||
return await send_from_directory('web/main/static', 'favicon.ico') |
|||
|
|||
@main.route('/<html>') |
|||
@login_required |
|||
async def get_html(html): |
|||
return await render_template(html) |
|||
|
|||
|
|||
''' |
|||
各种配置文件路由 |
|||
''' |
|||
@main.route('/data/<file>') |
|||
async def data(file): |
|||
return await send_from_directory('web/main/static/data', file) |
|||
|
|||
@main.route('/files/<path:subdir>/<file>') |
|||
async def files(subdir,file): |
|||
return await send_from_directory(os.path.join('web/main/static/files', subdir), file) |
|||
|
|||
@main.route('/images/<path:subdir>/<file>') |
|||
async def images(subdir,file): |
|||
return await send_from_directory(os.path.join('web/main/static/images', subdir), file) |
|||
|
|||
@main.route('/resources/<file>') |
|||
async def resources(file): |
|||
return await send_from_directory('web/main/static/resources', file) |
|||
|
|||
@main.route('/resources/<path:subdir>/<file>') |
|||
async def resources_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('web/main/static/resources', subdir), file) |
|||
|
|||
@main.route('/resources/css/<path:subdir>/<file>') |
|||
async def resources_css_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('web/main/static/resources/css', subdir), file) |
|||
|
|||
@main.route('/resources/scripts/<path:subdir>/<file>') |
|||
async def resources_scripts_dir(subdir,file): |
|||
return await send_from_directory(os.path.join('web/main/static/resources/scripts', subdir), file) |
@ -0,0 +1,7 @@ |
|||
$axure.loadDocument( |
|||
(function() { |
|||
var _ = function() { var r={},a=arguments; for(var i=0; i<a.length; i+=2) r[a[i]]=a[i+1]; return r; } |
|||
var _creator = function() { return _(b,_(c,d,e,f,g,d,h,d,i,d,j,k,l,d,m,f,n,f,o,d,p,f),q,_(r,[_(s,t,u,v,w,x,y,z),_(s,A,u,B,w,x,y,C),_(s,D,u,E,w,x,y,F),_(s,G,u,H,w,x,y,I),_(s,J,u,K,w,x,y,L),_(s,M,u,N,w,x,y,O)]),P,[Q,R,S],T,[U,V,W],X,_(Y,Z),ba,_(bb,_(s,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,_(bm,bn,bo,bp,bq,br),bs,bt,bu,f,bv,bw,bx,bi,by,bi,bz,bA,bB,f,bC,_(bD,bE,bF,bE),bG,_(bH,bE,bI,bE),bJ,d,bK,f,bL,bc,bM,_(bm,bn,bo,bN),bO,_(bm,bn,bo,bP),bQ,bR,bS,bn,bq,bR,bT,bU,bV,bW,bX,bY,bZ,ca,cb,ca,cc,ca,cd,ca,ce,_(),cf,null,cg,null,ch,bU,ci,_(cj,f,ck,cl,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cv,_(cj,f,ck,bE,cm,cl,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cu)),cw,_(cj,f,ck,br,cm,br,cn,cl,co,bE,bo,_(cp,cq,cr,cq,cs,cq,ct,cx)),cy,cz),cA,_(cB,_(s,cC),cD,_(s,cE),cf,_(s,cF,bQ,bU),cG,_(s,cH,bT,bk),cI,_(s,cJ,bl,_(bm,bn,bo,bN,bq,br),bQ,bU,bT,bk,bM,_(bm,bn,bo,cK)),cL,_(s,cM,bs,cN,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cS,_(s,cT,bs,cU,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cV,_(s,cW,bs,cX,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),cY,_(s,cZ,bs,da,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),db,_(s,dc,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dd,_(s,de,bs,df,bf,cO,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dg,_(s,dh,bs,da,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),di,_(s,dj,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,cR,bZ,bU,cb,bU,cc,bU,cd,bU),dk,_(s,dl,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,bY),dn,_(s,dp,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),dq,_(s,dr,bl,_(bm,bn,bo,dm,bq,br),bv,cQ,bX,cR),ds,_(s,dt,bv,cQ,bX,cR),du,_(s,dv,bQ,bU,bM,_(bm,bn,bo,cP),bv,cQ,bX,bY),dw,_(s,dx),dy,_(s,dz,bM,_(bm,bn,bo,cP)),dA,_(s,dB,bl,_(bm,bn,bo,dC,bq,br)),dD,_(s,dE,bM,_(bm,bn,bo,dF)),dG,_(s,dH,bM,_(bm,bn,bo,bN)),dI,_(s,dJ,bQ,bU,bM,_(bm,bn,bo,bp)),dK,_(s,dL)),dM,_(dN,cE,dO,cW,dP,dh)));}; |
|||
var b="configuration",c="showPageNotes",d=true,e="showPageNoteNames",f=false,g="showAnnotations",h="showAnnotationsSidebar",i="showConsole",j="linkStyle",k="displayMultipleTargetsOnly",l="linkFlowsToPages",m="linkFlowsToPagesNewWindow",n="useLabels",o="useViews",p="loadFeedbackPlugin",q="sitemap",r="rootNodes",s="id",t="f8hzm0",u="pageName",v="登录",w="type",x="Wireframe",y="url",z="登录.html",A="tm5q63",B="实时预览",C="实时预览.html",D="20xynf",E="通道管理",F="通道管理.html",G="ey1jts",H="算法管理",I="算法管理.html",J="idexti",K="系统管理",L="系统管理.html",M="su6kdn",N="用户管理",O="用户管理.html",P="additionalJs",Q="plugins/sitemap/sitemap.js",R="plugins/page_notes/page_notes.js",S="plugins/debug/debug.js",T="additionalCss",U="plugins/sitemap/styles/sitemap.css",V="plugins/page_notes/styles/page_notes.css",W="plugins/debug/styles/debug.css",X="globalVariables",Y="onloadvariable",Z="",ba="stylesheet",bb="defaultStyle",bc="627587b6038d43cca051c114ac41ad32",bd="fontName",be="'Arial Normal', 'Arial', sans-serif",bf="fontWeight",bg="400",bh="fontStyle",bi="normal",bj="fontStretch",bk="5",bl="foreGroundFill",bm="fillType",bn="solid",bo="color",bp=0xFF333333,bq="opacity",br=1,bs="fontSize",bt="13px",bu="underline",bv="horizontalAlignment",bw="center",bx="lineSpacing",by="characterSpacing",bz="letterCase",bA="none",bB="strikethrough",bC="location",bD="x",bE=0,bF="y",bG="size",bH="width",bI="height",bJ="visible",bK="limbo",bL="baseStyle",bM="fill",bN=0xFFFFFFFF,bO="borderFill",bP=0xFF797979,bQ="borderWidth",bR="1",bS="linePattern",bT="cornerRadius",bU="0",bV="borderVisibility",bW="all",bX="verticalAlignment",bY="middle",bZ="paddingLeft",ca="2",cb="paddingTop",cc="paddingRight",cd="paddingBottom",ce="stateStyles",cf="image",cg="imageFilter",ch="rotation",ci="outerShadow",cj="on",ck="offsetX",cl=5,cm="offsetY",cn="blurRadius",co="spread",cp="r",cq=0,cr="g",cs="b",ct="a",cu=0.349019607843137,cv="innerShadow",cw="textShadow",cx=0.647058823529412,cy="viewOverride",cz="19e82109f102476f933582835c373474",cA="customStyles",cB="box_1",cC="4b7bfc596114427989e10bb0b557d0ce",cD="shape",cE="40519e9ec4264601bfb12c514e4f4867",cF="75a91ee5b9d042cfa01b8d565fe289c0",cG="button",cH="c9f35713a1cf4e91a0f2dbac65e6fb5c",cI="primary_button",cJ="cd64754845384de3872fb4a066432c1f",cK=0xFF169BD5,cL="heading_1",cM="1111111151944dfba49f67fd55eb1f88",cN="32px",cO="bold",cP=0xFFFFFF,cQ="left",cR="top",cS="heading_2",cT="b3a15c9ddde04520be40f94c8168891e",cU="24px",cV="heading_3",cW="8c7a4c5ad69a4369a5f7788171ac0b32",cX="18px",cY="heading_4",cZ="e995c891077945c89c0b5fe110d15a0b",da="14px",db="heading_5",dc="386b19ef4be143bd9b6c392ded969f89",dd="heading_6",de="fc3b9a13b5574fa098ef0a1db9aac861",df="10px",dg="label",dh="2285372321d148ec80932747449c36c9",di="paragraph",dj="4988d43d80b44008a4a415096f1632af",dk="text_field",dl="44157808f2934100b68f2394a66b2bba",dm=0xFF000000,dn="droplist",dp="85f724022aae41c594175ddac9c289eb",dq="list_box",dr="d5a74867db1f49ceb7c59e94129aa67a",ds="radio_button",dt="4eb5516f311c4bdfa0cb11d7ea75084e",du="tree_node",dv="93a4c3353b6f4562af635b7116d6bf94",dw="table_cell",dx="33ea2511485c479dbf973af3302f2352",dy="menu_item",dz="2036b2baccbc41f0b9263a6981a11a42",dA="form_hint",dB="4889d666e8ad4c5e81e59863039a5cc0",dC=0xFF999999,dD="form_disabled",dE="9bd0236217a94d89b0314c8c7fc75f16",dF=0xFFF0F0F0,dG="flow_shape",dH="caddf88798f04a469d3bb16589ed2a5d",dI="icon",dJ="26c731cb771b44a88eb8b6e97e78c80e",dK="ellipse",dL="78a26aa073ac4ed2b3c192ce4be8b862",dM="duplicateStyles",dN="55037c00beca4ab981fb8ff744aa5f75",dO="aa017f6a23d447e8a77c4c2eea3d335c",dP="4eea517f5eec41269a0db429802a7adf"; |
|||
return _creator(); |
|||
})()); |
@ -0,0 +1,105 @@ |
|||
.ax_default { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:400; |
|||
font-style:normal; |
|||
font-size:13px; |
|||
letter-spacing:normal; |
|||
color:#333333; |
|||
vertical-align:none; |
|||
text-align:center; |
|||
line-height:normal; |
|||
text-transform:none; |
|||
} |
|||
.box_1 { |
|||
} |
|||
.shape { |
|||
} |
|||
.image { |
|||
} |
|||
.button { |
|||
} |
|||
.primary_button { |
|||
color:#FFFFFF; |
|||
} |
|||
.heading_1 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:32px; |
|||
text-align:left; |
|||
} |
|||
.heading_2 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:24px; |
|||
text-align:left; |
|||
} |
|||
.heading_3 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:18px; |
|||
text-align:left; |
|||
} |
|||
.heading_4 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:14px; |
|||
text-align:left; |
|||
} |
|||
.heading_5 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
text-align:left; |
|||
} |
|||
.heading_6 { |
|||
font-family:'Arial Normal', 'Arial', sans-serif; |
|||
font-weight:bold; |
|||
font-style:normal; |
|||
font-size:10px; |
|||
text-align:left; |
|||
} |
|||
.label { |
|||
font-size:14px; |
|||
text-align:left; |
|||
} |
|||
.paragraph { |
|||
text-align:left; |
|||
} |
|||
.text_field { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.droplist { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.list_box { |
|||
color:#000000; |
|||
text-align:left; |
|||
} |
|||
.radio_button { |
|||
text-align:left; |
|||
} |
|||
.tree_node { |
|||
text-align:left; |
|||
} |
|||
.table_cell { |
|||
} |
|||
.menu_item { |
|||
} |
|||
.form_hint { |
|||
color:#999999; |
|||
} |
|||
.form_disabled { |
|||
} |
|||
.flow_shape { |
|||
} |
|||
.icon { |
|||
} |
|||
.ellipse { |
|||
} |
|||
textarea, select, input, button { outline: none; } |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,171 @@ |
|||
// use this to isolate the scope
|
|||
(function () { |
|||
|
|||
if(!$axure.document.configuration.showConsole) { return; } |
|||
|
|||
$(document).ready(function () { |
|||
$axure.player.createPluginHost({ |
|||
id: 'debugHost', |
|||
context: 'inspect', |
|||
title: 'Console', |
|||
gid: 3 |
|||
}); |
|||
|
|||
generateDebug(); |
|||
|
|||
$('#variablesClearLink').click(clearvars_click); |
|||
$('#traceClear').click(cleartrace_click); |
|||
$('#traceToggle').click(stoptrace_click); |
|||
$('#traceStart').click(starttrace_click); |
|||
$('#traceClear').hide(); |
|||
$('#traceToggle').hide(); |
|||
|
|||
$('#closeConsole').click(close); |
|||
|
|||
var currentStack= []; |
|||
var finishedStack = []; |
|||
|
|||
$axure.messageCenter.addMessageListener(function (message, data) { |
|||
if(message == 'axCompositeEventMessage') { |
|||
for(var i = 0; i < data.length; i++) { |
|||
processMessages(data[i].message, data[i].data); |
|||
} |
|||
} else processMessages(message, data); |
|||
}); |
|||
|
|||
var processMessages = function(message, data) { |
|||
if(message == 'globalVariableValues') { |
|||
$('#variablesDiv').empty(); |
|||
for(var key in data) { |
|||
var value = data[key] == '' ? '(blank)' : data[key]; |
|||
$('#variablesDiv').append('<div class="variableList"><div class="variableName">' + key + '</div><div class="variableValue">' + value + '</div></div>'); |
|||
} |
|||
} else if(message == 'axEvent') { |
|||
var addToStack = "<div class='axEventBlock'>"; |
|||
addToStack += "<div class='axEventContainer'>"; |
|||
addToStack += " <div class='axTime'>" + new Date().toLocaleTimeString() + "</div>"; |
|||
addToStack += " <div class='axEvent'>" + data.event.description + ": </div>"; |
|||
addToStack += " <div class='axLabel'>" + data.label + " (" + data.type + ")</div>"; |
|||
addToStack += "</div>"; |
|||
|
|||
currentStack.push(addToStack); |
|||
} else if (message == 'axEventComplete') { |
|||
currentStack[currentStack.length - 1] += "</div>"; |
|||
finishedStack.push(currentStack.pop()); |
|||
if(currentStack.length == 0) { |
|||
$('#traceEmptyState').hide(); |
|||
$('#traceClear').show(); |
|||
$('#traceToggle').show(); |
|||
|
|||
for(var i = finishedStack.length - 1; i >= 0; i--) { |
|||
if($('#traceDiv').children().length > 99) $('#traceDiv').children().last().remove(); |
|||
$('#traceDiv').prepend(finishedStack[i]); |
|||
} |
|||
finishedStack = []; |
|||
} |
|||
} else if (message == 'axCase') { |
|||
//var addToStack = "<div class='axCaseContainer' style='background-color: #" + data.color + "'>";
|
|||
var addToStack = "<div class='axCaseContainer'>"; |
|||
addToStack += " <div class='axCaseItem'>" + data.item + "</div>"; |
|||
if (data.description) { addToStack += " <div class='axCaseDescription' title='" + data.description + "'>" + data.description + "</div>" }; |
|||
addToStack += "</div>"; |
|||
|
|||
currentStack[currentStack.length - 1] += addToStack; |
|||
} else if (message == 'axAction') { |
|||
var addToStack = "<div class='axActionContainer'>"; |
|||
addToStack += " <div class='axActionItem'>" + data.name + "</div>"; |
|||
//addToStack += " <div class='axActionItem'>" + data.item + "</div>";
|
|||
//if (data.description) { addToStack += " <div class='axActionDescription' title='" + data.description + "'>" + data.description + "</div>" };
|
|||
addToStack += "</div>"; |
|||
|
|||
currentStack[currentStack.length - 1] += addToStack; |
|||
} else if (message == 'axInfo') { |
|||
var addToStack = "<div class='axInfoContainer'>"; |
|||
addToStack += " <div class='axInfoItem'>" + data.item + "</div>"; |
|||
if (data.description) { addToStack += " <div class='axInfoDescription' title='" + data.longDescription + "'>" + data.description + "</div>" }; |
|||
addToStack += "</div>"; |
|||
|
|||
currentStack[currentStack.length - 1] += addToStack; |
|||
} |
|||
} |
|||
|
|||
// bind to the page load
|
|||
$axure.page.bind('load.debug', function () { |
|||
var traceStr = $axure.player.getHashStringVar(TRACE_VAR_NAME); |
|||
if (traceStr.length > 0) $axure.messageCenter.setState("isTracing", true); |
|||
else $axure.messageCenter.setState("isTracing", false); |
|||
$axure.messageCenter.postMessage('getGlobalVariables', ''); |
|||
|
|||
return false; |
|||
}); |
|||
|
|||
function clearvars_click(event) { |
|||
$axure.messageCenter.postMessage('resetGlobalVariables', ''); |
|||
} |
|||
|
|||
function close() { |
|||
$axure.player.pluginClose("debugHost"); |
|||
} |
|||
|
|||
function cleartrace_click(event) { |
|||
$('#traceDiv').html(''); |
|||
} |
|||
|
|||
function starttrace_click(event) { |
|||
$axure.messageCenter.setState("isTracing", true); |
|||
//$('#traceDiv').html('');
|
|||
$('#traceEmptyState').hide(); |
|||
$('#traceClear').show(); |
|||
$('#traceToggle').text('Stop Trace'); |
|||
$('#traceToggle').off("click"); |
|||
$('#traceToggle').click(stoptrace_click); |
|||
$('#traceToggle').show(); |
|||
console.log("starting trace"); |
|||
$axure.player.setVarInCurrentUrlHash(TRACE_VAR_NAME, 1); |
|||
} |
|||
|
|||
function stoptrace_click(event) { |
|||
$axure.messageCenter.setState("isTracing", false); |
|||
$('#traceDiv').prepend('<div class="tracePausedNotification">Trace Paused<div>'); |
|||
$('#traceToggle').text('Restart Trace'); |
|||
$('#traceToggle').off("click"); |
|||
$('#traceToggle').click(starttrace_click); |
|||
console.log("stopping trace"); |
|||
$axure.player.deleteVarFromCurrentUrlHash(TRACE_VAR_NAME); |
|||
} |
|||
}); |
|||
|
|||
function generateDebug() { |
|||
var pageNotesUi = "<div id='debugHeader'>"; |
|||
pageNotesUi += "<div id='debugToolbar'>"; |
|||
pageNotesUi += "<div id='consoleTitle' class='pluginNameHeader'>Console</div>"; |
|||
|
|||
pageNotesUi += "</div>"; |
|||
pageNotesUi += "</div>"; |
|||
|
|||
pageNotesUi += "<div id='variablesContainer' style='max-height:300px; overflow-y:auto'>"; |
|||
pageNotesUi += "<div id='variablesTitle' class='sectionTitle'>Variables</div>"; |
|||
pageNotesUi += "<a id='variablesClearLink' class='traceOption'>Reset Variables</a>"; |
|||
pageNotesUi += "<div id='variablesDiv'></div></div>"; |
|||
pageNotesUi += "<div id='traceContainer'>"; |
|||
|
|||
pageNotesUi += "<div id='traceHeader'>"; |
|||
pageNotesUi += "<span class='sectionTitle'>Trace</span><a id='traceClear' class='traceOption'>Clear Trace</a><a id='traceToggle' class='traceOption'>Stop Trace</a>"; |
|||
pageNotesUi += "</div>"; |
|||
pageNotesUi += "</div>"; |
|||
pageNotesUi += "<div id='debugScrollContainer'>"; |
|||
pageNotesUi += "<div id='debugContainer'>"; |
|||
|
|||
|
|||
pageNotesUi += "<div id='traceEmptyState'>"; |
|||
pageNotesUi += "<div class='startInstructions'>Click the button below to start recording interactions as you click through the prototype.</div>"; |
|||
pageNotesUi += "<div id='traceStart' class='startButton'>Start Trace</div>"; |
|||
pageNotesUi += "</div>"; |
|||
pageNotesUi += "<div id='traceDiv'></div></div>"; |
|||
pageNotesUi += "</div></div>"; |
|||
|
|||
$('#debugHost').html(pageNotesUi); |
|||
$('#traceEmptyState').show(); |
|||
} |
|||
|
|||
})(); |
@ -0,0 +1,265 @@ |
|||
#debugHost { |
|||
display: flex; |
|||
flex-direction: column; |
|||
font-size: 13px; |
|||
color: #4a4a4a; |
|||
height: 100%; |
|||
} |
|||
|
|||
#debugHostBtn { |
|||
order: 4; |
|||
} |
|||
|
|||
#debugHostBtn a { |
|||
background: url('images/console_panel_on.svg') no-repeat center center, linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#debugHostBtn a.selected, #debugHostBtn a.selected:hover { |
|||
background: url('images/console_panel_off.svg') no-repeat center center, linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#debugToolbar { |
|||
margin-left: 8px; |
|||
} |
|||
|
|||
#variablesClearLink { |
|||
display: inline-block; |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
#variablesClearLink:hover { |
|||
color: #0a6cd6; |
|||
} |
|||
|
|||
#traceClearLink { |
|||
display: inline-block; |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
#traceClearLink:hover { |
|||
color: #0a6cd6; |
|||
} |
|||
|
|||
#debugScrollContainer |
|||
{ |
|||
overflow: auto; |
|||
width: 100%; |
|||
-webkit-overflow-scrolling: touch; |
|||
flex: 1; |
|||
} |
|||
|
|||
#debugContainer { |
|||
padding: 10px 0px 10px 0px; |
|||
} |
|||
|
|||
#consoleTitle { |
|||
clear: right; |
|||
margin: 12px 0px; |
|||
} |
|||
|
|||
.variableName |
|||
{ |
|||
font-weight: bold; |
|||
} |
|||
|
|||
.variableDiv |
|||
{ |
|||
margin-bottom: 20px; |
|||
line-height: 16px; |
|||
|
|||
} |
|||
|
|||
#variablesDiv |
|||
{ |
|||
clear: right; |
|||
} |
|||
|
|||
#variablesContainer { |
|||
border-bottom: solid 1px #e7e7e7; |
|||
padding: 0px 10px 12px 10px; |
|||
} |
|||
|
|||
#traceContainer { |
|||
margin-bottom: 5px; |
|||
padding: 15px 10px 0px 10px; |
|||
} |
|||
|
|||
#variablesTitle { |
|||
margin-bottom: 9px; |
|||
} |
|||
|
|||
.sectionTitle { |
|||
font-size: 11px; |
|||
color: #2c2c2c; |
|||
display: inline-block; |
|||
} |
|||
|
|||
.debugToolbarButton |
|||
{ |
|||
font-size: 1em; |
|||
color: #069; |
|||
} |
|||
|
|||
.axEventBlock { |
|||
display: inline-block; |
|||
width: 100%; |
|||
margin: 5px 0px 5px 0px; |
|||
line-height: 21px; |
|||
border-bottom: solid 5px #e7e7e7; |
|||
} |
|||
|
|||
.axEventContainer { |
|||
background-color: #e7e7e7; |
|||
padding: 0px 10px 0px 10px; |
|||
} |
|||
|
|||
.axTime { |
|||
margin: 0px 0px 0px 5px; |
|||
font-size: 10px; |
|||
color: #575757; |
|||
display: inline-block; |
|||
float: right; |
|||
} |
|||
|
|||
.axLabel { |
|||
display: inline-block; |
|||
} |
|||
|
|||
.axEvent { |
|||
margin: 0px 0px 2px 0px; |
|||
font-size: 15px; |
|||
font-weight: bold; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
} |
|||
|
|||
.axCaseContainer, .axActionContainer, .axInfoContainer { |
|||
justify-content: space-between; |
|||
padding: 0px 10px 0px 10px; |
|||
} |
|||
.axCaseContainer { |
|||
border-top: solid 2px #e7e7e7; |
|||
/*background-color: #47b6b5;*/ |
|||
background-color: #e7e7e7; |
|||
/*color: #ffffff;*/ |
|||
} |
|||
.axActionContainer { |
|||
border-top: solid 3px #e7e7e7; |
|||
} |
|||
.axInfoContainer { |
|||
border-top: solid 1px #e7e7e7; |
|||
} |
|||
|
|||
.axCaseItem, .axActionItem, .axInfoItem { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
} |
|||
.axCaseItem { |
|||
font-size: 15px; |
|||
font-weight: bold; |
|||
} |
|||
.axActionItem { |
|||
font-weight: bold; |
|||
} |
|||
.axInfoItem { |
|||
color: #8c8c8c; |
|||
} |
|||
|
|||
.axCaseDescription { |
|||
flex: 5 0 33%; |
|||
margin-left: 10px; |
|||
text-align: right; |
|||
} |
|||
/*.axActionDescription, .axInfoDescription { |
|||
flex: 5 0 33%; |
|||
margin-left: 10px; |
|||
text-align: right; |
|||
}*/ |
|||
.axCaseDescription, .axActionDescription { |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
white-space: nowrap; |
|||
} |
|||
.axInfoDescription, .axActionDescription { |
|||
color: #8c8c8c; |
|||
font-size: 11px; |
|||
} |
|||
|
|||
.variableName { |
|||
width: 55%; |
|||
line-height: 0.92; |
|||
text-align: left; |
|||
color: #0891b3; |
|||
display: inline-block; |
|||
word-wrap: break-word; |
|||
vertical-align: top; |
|||
} |
|||
|
|||
.variableValue { |
|||
width: 45%; |
|||
line-height: 0.92; |
|||
text-align: right; |
|||
color: #373d48; |
|||
display: inline-block; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.traceEvent { |
|||
border-bottom: solid 1px #e7e7e7; |
|||
} |
|||
|
|||
.tracePausedNotification { |
|||
height: 25px; |
|||
/*background-color: #e7e7e7;*/ |
|||
border-radius: 5px; |
|||
line-height: 25px; |
|||
margin: 5px 10px; |
|||
text-align: center |
|||
} |
|||
|
|||
#traceEmptyState.emptyStateContainer { |
|||
margin-top: 0px; |
|||
} |
|||
|
|||
.variableList{ |
|||
width: 100%; |
|||
margin-bottom: 4px; |
|||
} |
|||
|
|||
.traceOption { |
|||
margin-left: 11px; |
|||
height: 16px; |
|||
float: right; |
|||
font-size: 12px; |
|||
font-style: italic; |
|||
line-height: 1.45; |
|||
text-align: right; |
|||
color: #8c8c8c; |
|||
text-decoration: underline; |
|||
display: inline-block; |
|||
} |
|||
|
|||
.startInstructions { |
|||
margin: auto; |
|||
width: 179px; |
|||
font-size: 11px; |
|||
text-align: center; |
|||
color: #666666; |
|||
} |
|||
|
|||
.startButton { |
|||
margin: auto; |
|||
margin-top: 10px; |
|||
width: 181px; |
|||
height: 24px; |
|||
border-radius: 2px; |
|||
border: solid 1px #008fe0; |
|||
text-align: center; |
|||
line-height: 24px; |
|||
color: #008fe0; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.debugLinksContainer { |
|||
text-align: right; |
|||
} |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,474 @@ |
|||
// use this to isolate the scope
|
|||
(function () { |
|||
// No notes shown specified by generation config
|
|||
if (!$axure.document.configuration.showPageNotes && !$axure.document.configuration.showAnnotationsSidebar && !$axure.document.configuration.showAnnotations) { return; } |
|||
|
|||
$(window.document).ready(function () { |
|||
// Load right panel for Page Notes
|
|||
if ($axure.document.configuration.showPageNotes || $axure.document.configuration.showAnnotationsSidebar) { |
|||
$axure.player.createPluginHost({ |
|||
id: 'pageNotesHost', |
|||
context: 'inspect', |
|||
title: 'Documentation', |
|||
gid: 2, |
|||
}); |
|||
} |
|||
|
|||
// Load footnotes on widgets
|
|||
if ($axure.document.configuration.showAnnotations) { |
|||
$('#overflowMenuContainer').prepend('<div id="showNotesOption" class="showOption" style="order: 3"><div class="overflowOptionCheckbox"></div>Show Note Markers</div>'); |
|||
} |
|||
|
|||
createNotesOverlay(); |
|||
generatePageNotes(); |
|||
|
|||
if ($axure.player.isMobileMode()) { |
|||
$('#showNotesOption').hide(); |
|||
} else { |
|||
$('#showNotesOption').click(footnotes_click); |
|||
$('#showNotesOption').find('.overflowOptionCheckbox').addClass('selected'); |
|||
} |
|||
|
|||
function populateNotes(pageForNotes) { |
|||
var hasNotes = false; |
|||
if ($axure.document.configuration.showPageNotes) { |
|||
var pageNoteUi = ''; |
|||
|
|||
function populatePageNotes(pageOrMaster) { |
|||
//populate the page notes
|
|||
var notes = pageOrMaster.notes; |
|||
if (notes && !$.isEmptyObject(notes)) { |
|||
pageNoteUi += "<div class='notesPageNameHeader'>" + pageOrMaster.pageName + "</div>"; |
|||
|
|||
var showNames = $axure.document.configuration.showPageNoteNames; |
|||
for(var noteName in notes) { |
|||
pageNoteUi += "<div class='pageNoteContainer'>"; |
|||
if(showNames) { |
|||
pageNoteUi += "<div class='pageNoteName'>" + noteName + "</div>"; |
|||
} |
|||
pageNoteUi += "<div class='pageNote'>" + linkify(notes[noteName]) + "</div>"; |
|||
pageNoteUi += "</div>"; |
|||
//$('#pageNotesContent').append(pageNoteUi);
|
|||
|
|||
hasNotes = true; |
|||
} |
|||
} |
|||
} |
|||
|
|||
populatePageNotes(pageForNotes); |
|||
if (pageForNotes.masterNotes) { |
|||
for (var i = 0; i < pageForNotes.masterNotes.length; i++) { |
|||
populatePageNotes(pageForNotes.masterNotes[i]); |
|||
} |
|||
} |
|||
|
|||
if (pageNoteUi.length > 0) { |
|||
pageNoteUi += "<div class='lineDivider'></div>"; |
|||
var pageNotesHeader = "<div id='pageNotesSectionHeader' class='notesSectionHeader pluginNameHeader'>Page Notes</div>"; |
|||
$('#pageNotesContent').append(pageNotesHeader + pageNoteUi); |
|||
} |
|||
} |
|||
|
|||
if ($axure.document.configuration.showAnnotationsSidebar) { |
|||
var widgetNoteUi = ''; |
|||
//var widgetNotes = pageForNotes.widgetNotes;
|
|||
function populateWidgetNotes(widgetNotes){ |
|||
if (widgetNotes) { |
|||
for (var i = 0; i < widgetNotes.length; i++) { |
|||
var widgetNote = widgetNotes[i]; |
|||
widgetNoteUi += "<div class='widgetNoteContainer' data-id='" + widgetNote["ownerId"] + "'>"; |
|||
widgetNoteUi += "<div class='widgetNoteFootnote'>" + widgetNote["fn"] + "</div>"; |
|||
widgetNoteUi += "<div class='widgetNoteLabel'>" + widgetNote["label"] + "</div>"; |
|||
|
|||
for (var widgetNoteName in widgetNote) { |
|||
if (widgetNoteName != "label" && widgetNoteName != "fn" && widgetNoteName != "ownerId") { |
|||
widgetNoteUi += "<div class='pageNoteName'>" + widgetNoteName + "</div>"; |
|||
widgetNoteUi += "<div class='pageNote'>" + linkify(widgetNote[widgetNoteName]) + "</div>"; |
|||
//widgetNoteUi += "<div class='nondottedDivider'></div>";
|
|||
} |
|||
} |
|||
widgetNoteUi += "</div>"; |
|||
//widgetNoteUi += "<div class='nondottedDivider'></div>";
|
|||
//$('#pageNotesContent').append(widgetNoteUi);
|
|||
hasNotes = true; |
|||
} |
|||
} |
|||
} |
|||
|
|||
populateWidgetNotes(pageForNotes.widgetNotes); |
|||
if (pageForNotes.masterNotes) { |
|||
for (var i = 0; i < pageForNotes.masterNotes.length; i++) { |
|||
populateWidgetNotes(pageForNotes.masterNotes[i].widgetNotes); |
|||
} |
|||
} |
|||
|
|||
if (widgetNoteUi.length > 0) { |
|||
var widgetNotesHeader = "<div id='widgetNotesSectionHeader' class='notesSectionHeader pluginNameHeader'>Widget Notes</div>"; |
|||
$('#pageNotesContent').append(widgetNotesHeader + widgetNoteUi); |
|||
|
|||
//$('.widgetNoteContainer').children(':last-child').remove();
|
|||
//$('.widgetNoteFootnote').append("<div class='annnoteline'></div><div class='annnoteline'></div><div class='annnoteline'></div>");
|
|||
$('.widgetNoteContainer').click(function () { |
|||
var wasSelected = $(this).hasClass('widgetNoteContainerSelected'); |
|||
$('.widgetNoteContainerSelected').removeClass('widgetNoteContainerSelected'); |
|||
if (!wasSelected) $(this).addClass('widgetNoteContainerSelected'); |
|||
|
|||
var dimStr = $('.currentAdaptiveView').attr('data-dim'); |
|||
var h = dimStr ? dimStr.split('x')[1] : '0'; |
|||
var $leftPanel = $('.leftPanel:visible'); |
|||
var leftPanelOffset = (!$axure.player.isMobileMode() && $leftPanel.length > 0) ? $leftPanel.width() : 0; |
|||
var $rightPanel = $('.rightPanel:visible'); |
|||
var rightPanelOffset = (!$axure.player.isMobileMode() && $rightPanel.length > 0) ? $rightPanel.width() : 0; |
|||
var viewDimensions = { |
|||
h: h != '0' ? h : '', |
|||
scaleVal: $('.vpScaleOption').find('.selectedRadioButton').parent().attr('val'), |
|||
height: $('.rightPanel').height(), |
|||
panelWidthOffset: leftPanelOffset + rightPanelOffset |
|||
}; |
|||
$axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: this.getAttribute('data-id'), value: !wasSelected, view: viewDimensions}); |
|||
}); |
|||
} |
|||
|
|||
|
|||
//if (pageForNotes.masterNotes) {
|
|||
// for (var i = 0; i < pageForNotes.masterNotes.length; i++) {
|
|||
// var master = pageForNotes.masterNotes[i];
|
|||
// hasNotes = populateNotes(master) || hasNotes;
|
|||
// }
|
|||
//}
|
|||
} |
|||
|
|||
return hasNotes; |
|||
} |
|||
|
|||
// bind to the page load
|
|||
$axure.page.bind('load.page_notes', function () { |
|||
closeAllDialogs(); |
|||
|
|||
var hasNotes = false; |
|||
|
|||
$('#pageNotesContent').html(""); |
|||
hasNotes = populateNotes($axure.page); |
|||
|
|||
if(hasNotes) $('#pageNotesEmptyState').hide(); |
|||
else $('#pageNotesEmptyState').show(); |
|||
|
|||
//If footnotes enabled for this prototype...
|
|||
if ($axure.player.isMobileMode()) { |
|||
$axure.messageCenter.postMessage('annotationToggle', false); |
|||
} else if($axure.document.configuration.showAnnotations == true) { |
|||
//If the fn var is defined and set to 0, hide footnotes
|
|||
//else if hide-footnotes button selected, hide them
|
|||
var fnVal = $axure.player.getHashStringVar(FOOTNOTES_VAR_NAME); |
|||
if(fnVal.length > 0 && fnVal == 0) { |
|||
$('#showNotesOption').find('.overflowOptionCheckbox').removeClass('selected'); |
|||
$axure.messageCenter.postMessage('annotationToggle', false); |
|||
} else if(!$('#showNotesOption').find('.overflowOptionCheckbox').hasClass('selected')) { |
|||
//If the footnotes button isn't selected, hide them on this loaded page
|
|||
$axure.messageCenter.postMessage('annotationToggle', false); |
|||
} |
|||
} |
|||
|
|||
// Get multiple click call if not removing beforehand
|
|||
$('#notesOverlay').off('click'); |
|||
$('#notesOverlay').on('click', '.closeNotesDialog', function () { |
|||
var ownerId = $(this).attr("data-ownerid"); |
|||
_toggleAnnDialog(ownerId); |
|||
}); |
|||
|
|||
$axure.player.updatePlugins(); |
|||
return false; |
|||
}); |
|||
|
|||
$axure.messageCenter.addMessageListener(function (message, data) { |
|||
//var messageData = { id: elementId, x: event.pageX, y: event.pageY }
|
|||
if (message == 'toggleAnnDialog') { |
|||
_toggleAnnDialog(data.id, data.x, data.y, data.page); |
|||
} |
|||
}); |
|||
|
|||
}); |
|||
|
|||
function linkify(text) { |
|||
var urlRegex = /(\b(((https?|ftp|file):\/\/)|(www\.))[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; |
|||
return text.replace(urlRegex, function (url, b, c) { |
|||
var url2 = (c == 'www.') ? 'http://' + url : url; |
|||
return '<a href="' + url2 + '" target="_blank" class="noteLink">' + url + '</a>'; |
|||
}); |
|||
} |
|||
|
|||
function getWidgetNotesHtml(ownerId, page) { |
|||
var pageForNotes = page || $axure.page; |
|||
var widgetNoteUi = ''; |
|||
|
|||
widgetNoteUi += "<div data-ownerid='" + ownerId + "' class='closeNotesDialog'></div>"; |
|||
widgetNoteUi += "<div class='notesDialogScroll'>"; |
|||
|
|||
function getNotesForPage(widgetNotes) { |
|||
for (var i = 0; i < widgetNotes.length; i++) { |
|||
var widgetNote = widgetNotes[i]; |
|||
if (widgetNote["ownerId"] == ownerId) { |
|||
widgetNoteUi += "<div class='widgetNoteContainer' data-id='" + widgetNote["ownerId"] + "'>"; |
|||
widgetNoteUi += "<div class='widgetNoteFootnote'>" + widgetNote["fn"] + "</div>"; |
|||
widgetNoteUi += "<div class='widgetNoteLabel'>" + widgetNote["label"] + "</div>"; |
|||
|
|||
for (var widgetNoteName in widgetNote) { |
|||
if (widgetNoteName != "label" && widgetNoteName != "fn" && widgetNoteName != "ownerId") { |
|||
widgetNoteUi += "<div class='pageNoteName'>" + widgetNoteName + "</div>"; |
|||
widgetNoteUi += "<div class='pageNote'>" + linkify(widgetNote[widgetNoteName]) + "</div>"; |
|||
} |
|||
} |
|||
widgetNoteUi += "</div>"; |
|||
} |
|||
} |
|||
} |
|||
|
|||
getNotesForPage(pageForNotes.widgetNotes); |
|||
if (pageForNotes.masterNotes) { |
|||
for (var i = 0; i < pageForNotes.masterNotes.length; i++) { |
|||
getNotesForPage(pageForNotes.masterNotes[i].widgetNotes); |
|||
} |
|||
} |
|||
|
|||
widgetNoteUi += "</div>"; |
|||
widgetNoteUi += "<div class='resizeNotesDialog'></div>"; |
|||
|
|||
return widgetNoteUi; |
|||
} |
|||
|
|||
var maxZIndex = 1; |
|||
var dialogs = {}; |
|||
var _toggleAnnDialog = function (id, srcLeft, srcTop, page) { |
|||
|
|||
if(dialogs[id]) { |
|||
var $dialog = dialogs[id]; |
|||
// reset the dialog
|
|||
dialogs[id] = undefined; |
|||
$dialog.find('.notesDialogScroll').getNiceScroll().remove(); |
|||
$dialog.remove(); |
|||
return; |
|||
} |
|||
|
|||
var bufferH = 10; |
|||
var bufferV = 10; |
|||
var blnLeft = false; |
|||
var blnAbove = false; |
|||
var mfPos = $('#mainPanelContainer').position(); |
|||
var viewablePanelLeftMargin = parseInt($('#mainPanelContainer').css('margin-left')); |
|||
|
|||
var sourceTop = srcTop + mfPos.top; |
|||
var sourceLeft = srcLeft + viewablePanelLeftMargin; |
|||
|
|||
var width = 300; |
|||
var height = 300; |
|||
|
|||
if(sourceLeft > width + bufferH) { |
|||
blnLeft = true; |
|||
} |
|||
if(sourceTop > height + bufferV) { |
|||
blnAbove = true; |
|||
} |
|||
|
|||
var top = 0; |
|||
var left = 0; |
|||
if(blnAbove) top = sourceTop - height - 20; |
|||
else top = sourceTop + 10; |
|||
if(blnLeft) left = sourceLeft - width - 4; |
|||
else left = sourceLeft - 6; |
|||
|
|||
//need to set the zindex
|
|||
maxZIndex = maxZIndex + 1; |
|||
|
|||
var $dialog = $('<div class="notesDialog"></div>') |
|||
.appendTo('#notesOverlay') |
|||
.html(getWidgetNotesHtml(id, page)); |
|||
|
|||
$dialog.css({ 'left': left, 'top': top, 'z-index': maxZIndex }); |
|||
|
|||
$dialog.find('.notesDialogScroll').niceScroll({ cursorcolor: "#8c8c8c", cursorborder: "0px solid #fff" }); |
|||
|
|||
$dialog.find('.notesDialogScroll').on($axure.eventNames.mouseDownName, function(event) { |
|||
event.stopPropagation(); |
|||
}); |
|||
|
|||
$dialog.find('.closeNotesDialog').on($axure.eventNames.mouseDownName, function (event) { |
|||
event.stopPropagation(); |
|||
}); |
|||
|
|||
$dialog.on($axure.eventNames.mouseDownName, startDialogMove); |
|||
var startMouseX; |
|||
var startMouseY; |
|||
var startDialogX; |
|||
var startDialogY; |
|||
function startDialogMove() { |
|||
startMouseX = window.event.pageX; |
|||
startMouseY = window.event.pageY; |
|||
var position = $dialog.position(); |
|||
startDialogX = position.left; |
|||
startDialogY = position.top; |
|||
|
|||
$dialog.addClass('active'); |
|||
$('<div class="splitterMask"></div>').insertAfter($('#notesOverlay')); |
|||
$(document).bind($axure.eventNames.mouseMoveName, doDialogMove).bind($axure.eventNames.mouseUpName, endDialogMove); |
|||
|
|||
$dialog.find('.notesDialogScroll').getNiceScroll().hide(); |
|||
} |
|||
|
|||
function doDialogMove() { |
|||
var currentX = window.event.pageX; |
|||
var currentY = window.event.pageY; |
|||
$dialog.css({ 'left': startDialogX + currentX - startMouseX, 'top': startDialogY + currentY - startMouseY }); |
|||
} |
|||
|
|||
function endDialogMove() { |
|||
$('div.splitterMask').remove(); |
|||
$dialog.removeClass('active'); |
|||
$(document).unbind($axure.eventNames.mouseMoveName, doDialogMove).unbind($axure.eventNames.mouseUpName, endDialogMove); |
|||
|
|||
$dialog.find('.notesDialogScroll').getNiceScroll().resize(); |
|||
$dialog.find('.notesDialogScroll').getNiceScroll().show(); |
|||
} |
|||
|
|||
$dialog.find('.resizeNotesDialog').on($axure.eventNames.mouseDownName, startDialogResize); |
|||
|
|||
var startDialogW; |
|||
var startDialogH; |
|||
function startDialogResize() { |
|||
event.stopPropagation(); |
|||
|
|||
startMouseX = window.event.pageX; |
|||
startMouseY = window.event.pageY; |
|||
startDialogW = Number($dialog.css('width').replace('px','')); |
|||
startDialogH = Number($dialog.css('height').replace('px', '')); |
|||
|
|||
$dialog.addClass('active'); |
|||
$('<div class="splitterMask"></div>').insertAfter($('#notesOverlay')); |
|||
$(document).bind($axure.eventNames.mouseMoveName, doDialogResize).bind($axure.eventNames.mouseUpName, endDialogResize); |
|||
|
|||
$dialog.find('.notesDialogScroll').getNiceScroll().hide(); |
|||
} |
|||
|
|||
function doDialogResize() { |
|||
var currentX = window.event.pageX; |
|||
var currentY = window.event.pageY; |
|||
var newWidth = Math.max(200, startDialogW + currentX - startMouseX); |
|||
var newHeight = Math.max(200, startDialogH + currentY - startMouseY); |
|||
$dialog.css({ 'width': newWidth, 'height': newHeight }); |
|||
} |
|||
|
|||
function endDialogResize() { |
|||
$('div.splitterMask').remove(); |
|||
$dialog.removeClass('active'); |
|||
$(document).unbind($axure.eventNames.mouseMoveName, doDialogResize).unbind($axure.eventNames.mouseUpName, endDialogResize); |
|||
|
|||
$dialog.find('.notesDialogScroll').getNiceScroll().resize(); |
|||
$dialog.find('.notesDialogScroll').getNiceScroll().show(); |
|||
} |
|||
|
|||
dialogs[id] = $dialog; |
|||
|
|||
// scroll ... just for IE
|
|||
//window.scrollTo(scrollX, scrollY);
|
|||
}; |
|||
|
|||
$(document).on('sidebarCollapse', function (event, data) { |
|||
clearSelection(); |
|||
}); |
|||
|
|||
$(document).on('pluginShown', function (event, data) { |
|||
if(data != 2) { |
|||
clearSelection(); |
|||
} |
|||
}); |
|||
|
|||
function clearSelection() { |
|||
var selectedNote = $('#pageNotesContainer').find('.widgetNoteContainerSelected'); |
|||
if(selectedNote.length > 0) { |
|||
selectedNote.removeClass('widgetNoteContainerSelected'); |
|||
//var dimStr = $('.currentAdaptiveView').attr('data-dim');
|
|||
//var h = dimStr ? dimStr.split('x')[1] : '0';
|
|||
//var $leftPanel = $('.leftPanel:visible');
|
|||
//var leftPanelOffset = (!$axure.player.isMobileMode() && $leftPanel.length > 0) ? $leftPanel.width() : 0;
|
|||
//var $rightPanel = $('.rightPanel:visible');
|
|||
//var rightPanelOffset = (!$axure.player.isMobileMode() && $rightPanel.length > 0) ? $rightPanel.width() : 0;
|
|||
//var viewDimensions = {
|
|||
// h: h != '0' ? h : '',
|
|||
// scaleVal: $('.vpScaleOption').find('.selectedRadioButton').parent().attr('val'),
|
|||
// scrollLeft: $('#clipFrameScroll').scrollLeft(),
|
|||
// scrollTop: $('#clipFrameScroll').scrollTop(),
|
|||
// height: $('.rightPanel').height(),
|
|||
// panelWidthOffset: leftPanelOffset + rightPanelOffset
|
|||
//};
|
|||
//$axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: '', value: false, view: viewDimensions });
|
|||
$axure.messageCenter.postMessage('toggleSelectWidgetNote', { id: '', value: false }); |
|||
//$axure.messageCenter.postMessage('toggleSelectWidgetNote', '');
|
|||
} |
|||
} |
|||
|
|||
function closeAllDialogs() { |
|||
for (var id in dialogs) { |
|||
var $dialog = dialogs[id]; |
|||
if ($dialog !== undefined) _toggleAnnDialog(id); |
|||
} |
|||
} |
|||
|
|||
$axure.player.toggleFootnotes = function(val) { |
|||
var scaleCheckDiv = $('#showNotesOption').find('.overflowOptionCheckbox'); |
|||
if (scaleCheckDiv.hasClass('selected')) { |
|||
if (!val) $('#showNotesOption').click(); |
|||
} else { |
|||
if (val) $('#showNotesOption').click(); |
|||
} |
|||
} |
|||
|
|||
function footnotes_click(event) { |
|||
var scaleCheckDiv = $('#showNotesOption').find('.overflowOptionCheckbox'); |
|||
if (scaleCheckDiv.hasClass('selected')) { |
|||
closeAllDialogs(); |
|||
|
|||
scaleCheckDiv.removeClass('selected'); |
|||
$axure.messageCenter.postMessage('annotationToggle', false); |
|||
//Add 'fn' hash string var so that footnotes stay hidden across reloads
|
|||
$axure.player.setVarInCurrentUrlHash(FOOTNOTES_VAR_NAME, 0); |
|||
} else { |
|||
scaleCheckDiv.addClass('selected'); |
|||
$axure.messageCenter.postMessage('annotationToggle', true); |
|||
//Delete 'fn' hash string var if it exists since default is visible
|
|||
$axure.player.deleteVarFromCurrentUrlHash(FOOTNOTES_VAR_NAME); |
|||
} |
|||
} |
|||
|
|||
function createNotesOverlay() { |
|||
var $targetPanel = $('#clippingBounds'); |
|||
|
|||
if (!$('#notesOverlay').length) { |
|||
var notesOverlay = document.createElement('div'); |
|||
notesOverlay.setAttribute('id', 'notesOverlay'); |
|||
|
|||
$targetPanel.prepend(notesOverlay); |
|||
$(notesOverlay).append(' '); |
|||
} |
|||
} |
|||
|
|||
function generatePageNotes() { |
|||
var pageNotesUi = "<div id='pageNotesHeader'>"; |
|||
|
|||
pageNotesUi += "<div id='pageNotesToolbar' style='height: 12px;'>"; |
|||
pageNotesUi += "</div>"; |
|||
pageNotesUi += "</div>"; |
|||
|
|||
|
|||
pageNotesUi += "<div id='pageNotesScrollContainer'>"; |
|||
pageNotesUi += "<div id='pageNotesContainer'>"; |
|||
pageNotesUi += "<div id='pageNotesEmptyState' class='emptyStateContainer'><div class='emptyStateTitle'>No notes for this page.</div><div class='emptyStateContent'>Notes added in Axure RP will appear here.</div><div class='dottedDivider'></div></div>"; |
|||
pageNotesUi += "<span id='pageNotesContent'></span>"; |
|||
pageNotesUi += "</div></div>"; |
|||
|
|||
$('#pageNotesHost').html(pageNotesUi); |
|||
|
|||
if(!$axure.document.configuration.showAnnotations) { |
|||
$('#pageNotesHost .pageNameHeader').css('padding-right', '55px'); |
|||
} |
|||
} |
|||
|
|||
})(); |
After Width: | Height: | Size: 340 B |
After Width: | Height: | Size: 340 B |
@ -0,0 +1,209 @@ |
|||
#pageNotesHost { |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100%; |
|||
} |
|||
|
|||
#pageNotesHostBtn { |
|||
order: 2; |
|||
} |
|||
|
|||
#pageNotesHostBtn a { |
|||
background: url('images/notes_panel_on.svg') no-repeat center center,linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#pageNotesHostBtn a.selected, #pageNotesHostBtn a.selected:hover { |
|||
background: url('images/notes_panel_off.svg') no-repeat center center,linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#pageNotesScrollContainer { |
|||
overflow: auto; |
|||
width: 100%; |
|||
flex: 1; |
|||
-webkit-overflow-scrolling: touch; |
|||
} |
|||
|
|||
#pageNotesContent { |
|||
overflow: visible; |
|||
} |
|||
|
|||
.pageNoteContainer { |
|||
padding: 0px 12px 8px 12px; |
|||
} |
|||
|
|||
.mobileMode .pageNoteContainer { |
|||
padding: 0px 16px 8px 17px; |
|||
} |
|||
|
|||
.pageNoteName { |
|||
font-size: 13px; |
|||
font-weight: bold; |
|||
color: #2c2c2c; |
|||
margin: 15px 0px 5px 0px; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.pageNote { |
|||
font-size: 13px; |
|||
color: #2a2e38; |
|||
line-height: 1.67; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
.pageNote ul { |
|||
list-style: disc; |
|||
padding: 0px 0px 0px 40px; |
|||
} |
|||
|
|||
.pageNote ul ul{ |
|||
list-style: circle; |
|||
} |
|||
|
|||
.pageNote ul ul ul{ |
|||
list-style: square; |
|||
} |
|||
|
|||
.pageNote ul ul ul ul { |
|||
list-style: disc; |
|||
} |
|||
|
|||
.pageNote ul ul ul ul ul { |
|||
list-style: circle; |
|||
} |
|||
|
|||
.pageNote ul ul ul ul ul ul { |
|||
list-style: square; |
|||
} |
|||
|
|||
.widgetNoteContainer { |
|||
padding: 12px; |
|||
border-bottom: 1px solid transparent; |
|||
border-top: 1px solid transparent; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.mobileMode .widgetNoteContainer { |
|||
padding: 12px 16px 12px 17px; |
|||
} |
|||
|
|||
.widgetNoteContainerSelected { |
|||
background-color: white; |
|||
border-bottom: 1px solid #c2c2c2; |
|||
border-top: 1px solid #c2c2c2; |
|||
} |
|||
|
|||
.widgetNoteFootnote { |
|||
display: inline-block; |
|||
padding-top: 1px; |
|||
background-color: #fff849; |
|||
font-size: 11px; |
|||
font-weight: bold; |
|||
line-height: 16px; |
|||
margin-right: 8px; |
|||
padding: 0px 5px; |
|||
color: #000; |
|||
} |
|||
|
|||
div.annnoteline { |
|||
display: inline-block; |
|||
width: 9px; |
|||
height: 1px; |
|||
border-bottom: 1px solid white; |
|||
margin-top: 1px; |
|||
} |
|||
|
|||
.widgetNoteLabel { |
|||
font-size: 13px; |
|||
font-weight: 600; |
|||
color: #58167d; |
|||
margin-top: 4px; |
|||
float: right; |
|||
} |
|||
|
|||
.noteLink { |
|||
text-decoration: inherit; |
|||
color: inherit; |
|||
} |
|||
|
|||
.noteLink:hover { |
|||
background-color: white; |
|||
} |
|||
|
|||
.notesSectionHeader { |
|||
margin: 0px 8px 0px 12px; |
|||
} |
|||
|
|||
.notesPageNameHeader { |
|||
margin: 8px 8px 15px 12px; |
|||
} |
|||
|
|||
.mobileMode .notesPageNameHeader { |
|||
margin: 18px 14px 5px 16px; |
|||
} |
|||
|
|||
#notesOverlay { |
|||
width: 0; |
|||
height: 0; |
|||
position: absolute; |
|||
overflow: visible; |
|||
z-index: 1; |
|||
} |
|||
|
|||
div.closeNotesDialog { |
|||
position: absolute; |
|||
top: 6px; |
|||
right: 6px; |
|||
width: 11px; |
|||
height: 10px; |
|||
object-fit: contain; |
|||
background: url(../../../resources/images/close_x.svg) no-repeat center center, linear-gradient(transparent, transparent); |
|||
margin-left: auto; |
|||
cursor: pointer; |
|||
} |
|||
|
|||
div.resizeNotesDialog { |
|||
position: absolute; |
|||
bottom: 2px; |
|||
right: 2px; |
|||
width: 11px; |
|||
height: 10px; |
|||
object-fit: contain; |
|||
background: url(../../../resources/images/resize.svg) no-repeat center center, linear-gradient(transparent, transparent); |
|||
margin-left: auto; |
|||
cursor: nwse-resize; |
|||
} |
|||
|
|||
div.notesDialog { |
|||
position: absolute; |
|||
padding: 16px 3px 10px 3px; |
|||
background-color: #efefef; |
|||
width: 300px; |
|||
height: 300px; |
|||
line-height: normal; |
|||
border: #8F949A solid 1px; |
|||
box-shadow: 2px 2px 4px 0 rgba(0, 0, 0, 0.4); |
|||
cursor: move; |
|||
display: flex; |
|||
flex-direction: column; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
div.notesDialog.active { |
|||
user-select: none; |
|||
} |
|||
|
|||
div.notesDialog .widgetNoteContainer { |
|||
cursor: auto; |
|||
padding: 2px 26px 16px 14px; |
|||
} |
|||
|
|||
div.notesDialogScroll { |
|||
overflow-x: hidden; |
|||
overflow-y: auto; |
|||
height: 100%; |
|||
cursor: auto; |
|||
} |
|||
|
|||
.mobileMode .pageNoteName, .mobileMode #pageNotesToolbar, .mobileMode .dottedDivider { |
|||
display: none; |
|||
} |
@ -0,0 +1,479 @@ |
|||
// use this to isolate the scope
|
|||
(function() { |
|||
|
|||
if(!$axure.document.configuration.showRecordPlay) { return; } |
|||
|
|||
$(window.document).ready(function() { |
|||
$axure.player.createPluginHost({ |
|||
id: 'recordPlayHost', |
|||
context: 'interface', |
|||
title: 'Recording' |
|||
}); |
|||
_generateRecordPlay(); |
|||
|
|||
$('#recordButton').click(_recordClick); |
|||
$('#playButton').click(_playClick); |
|||
$('#stopButton').click(_stopClick); |
|||
$('#deleteButton').click(_deleteClick); |
|||
|
|||
// bind to the page load
|
|||
|
|||
$axure.page.bind('load.page_notes', function() { |
|||
|
|||
$.ajax({ |
|||
type: "POST", |
|||
url: '/RecordController/ListRecordings', |
|||
success: function(response) { |
|||
|
|||
$('#recordNameHeader').html(""); |
|||
$('#recordPlayContent').html(""); |
|||
//populate the notes
|
|||
|
|||
axRecordingList = []; |
|||
|
|||
if(!eventList) { |
|||
recordingIndex = 0; |
|||
eventList = []; |
|||
recordingStartTime = 0; |
|||
bulkEventElement = ""; |
|||
lastBulkEvent = {}; |
|||
} |
|||
|
|||
for(var idx in response.recordingList) { |
|||
getOneRecording(response.recordingList[idx]); |
|||
} |
|||
|
|||
return false; |
|||
}, |
|||
// dataType: 'json'
|
|||
}); |
|||
}); |
|||
}); |
|||
|
|||
var nameMatcher = new RegExp("^axRecording[0-9]{4}$", "i"); |
|||
var indexMatcher = new RegExp("[0-9]{4}$", "i"); |
|||
|
|||
var convertFromJson = function(oneRecording) { |
|||
|
|||
if(nameMatcher.exec(oneRecording.recordingName)) { |
|||
var myArray = indexMatcher.exec(oneRecording.recordingName); |
|||
var currIdx = parseInt(myArray); |
|||
if(recordingIndex < currIdx) { |
|||
recordingIndex = currIdx; |
|||
} |
|||
} |
|||
|
|||
|
|||
for(var idx in oneRecording.eventList) { |
|||
var thisEvent = oneRecording.eventList[idx]; |
|||
thisEvent.eventInfo = {}; |
|||
thisEvent.eventInfo.srcElement = thisEvent.elementID; |
|||
// TODO: check that this is correct.
|
|||
|
|||
if(isBulkMouse(thisEvent.eventType)) { |
|||
thisEvent.eventInfo.mousePositions = []; |
|||
thisEvent.eventInfo.mousePositions = thisEvent.mousePositions; |
|||
thisEvent.timeStamp = thisEvent.mousePositions[0].timeStamp; |
|||
} |
|||
if(isSingleMouse(thisEvent.eventType)) { |
|||
thisEvent.eventInfo.cursor = {}; |
|||
thisEvent.eventInfo.cursor = thisEvent.cursor; |
|||
|
|||
} |
|||
if(thisEvent.eventType === 'OnDrag') { |
|||
thisEvent.eventInfo.dragInfo = {}; |
|||
thisEvent.eventInfo.dragInfo = thisEvent.dragInfo; |
|||
thisEvent.timeStamp = thisEvent.dragInfo.startTime; |
|||
} |
|||
|
|||
} |
|||
return oneRecording; |
|||
}; |
|||
|
|||
var getOneRecording = function(recordingItem) { |
|||
$.ajax({ |
|||
type: "POST", |
|||
url: '/RecordController/GetRecording', |
|||
data: { 'recordingId': recordingItem.recordingId }, |
|||
success: function(response) { |
|||
axRecordingList[axRecordingList.length] = convertFromJson(response); |
|||
var axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode'); |
|||
axRecordingContainer.append(_formAxRecordingBranch(response)); |
|||
_attachEventTriggers(response); |
|||
}, // dataType: 'json'
|
|||
}); |
|||
|
|||
}; |
|||
|
|||
var axRecordingList; |
|||
var eventList; |
|||
var recordingIndex; |
|||
var recordingStartTime; |
|||
var recordingId; |
|||
var recordingName; |
|||
|
|||
|
|||
var leadingZeros = function(number, digits) { // because this thing doesn't have string.format (or does it?)
|
|||
var recurseLeadingZeros = function(number, digitsLeft) { |
|||
if(digitsLeft > 0) { |
|||
return recurseLeadingZeros("0" + number, digitsLeft - 1); |
|||
} else { |
|||
return number; |
|||
} |
|||
}; |
|||
return recurseLeadingZeros(number, digits - String(number).length); |
|||
}; |
|||
|
|||
|
|||
var generateRecordingName = function() { |
|||
return "axRecording" + leadingZeros(recordingIndex, 4); |
|||
}; |
|||
|
|||
var isSingleMouse = function(eventType) { |
|||
return (eventType === 'OnClick' || |
|||
eventType === 'OnMouseUp' || |
|||
eventType === 'OnMouseDown' || |
|||
eventType === 'OnMouseOver' || |
|||
eventType === 'OnKeyUp' || |
|||
eventType === 'OnSelectedChange' || |
|||
eventType === 'OnSelect' || |
|||
eventType === 'OnUnselect' || |
|||
eventType === 'OnTextChange' || |
|||
eventType === 'OnMouseOut'); |
|||
}; |
|||
|
|||
var isBulkMouse = function(eventType) { |
|||
return (eventType === 'OnMouseHover' || |
|||
eventType === 'OnMouseMove'); |
|||
}; |
|||
|
|||
var bulkEventElement; |
|||
var lastBulkEvent; |
|||
|
|||
|
|||
$axure.messageCenter.addMessageListener(function(message, eventData) { |
|||
var lastEvent, lastBulkData; |
|||
|
|||
if(message === 'logEvent') { |
|||
|
|||
if(bulkEventElement !== eventData.elementID) { |
|||
lastBulkEvent = {}; |
|||
bulkEventElement = eventData.elementID; |
|||
} |
|||
|
|||
if(isBulkMouse(eventData.eventType)) { |
|||
lastEvent = lastBulkEvent[eventData.eventType]; |
|||
|
|||
if(lastEvent) { |
|||
// this is the second or third or whatever onmousemove in a row
|
|||
lastBulkData = lastEvent.eventInfo.mousePositions; |
|||
lastBulkData[lastBulkData.length] = { |
|||
cursor: eventData.eventInfo.cursor, |
|||
timeStamp: eventData.timeStamp |
|||
}; |
|||
} else { |
|||
|
|||
eventData.eventInfo.mousePositions = []; |
|||
eventData.eventInfo.mousePositions[0] = { |
|||
cursor: eventData.eventInfo.cursor, |
|||
timeStamp: eventData.timeStamp |
|||
}; |
|||
eventList[eventList.length] = eventData; |
|||
lastBulkEvent[eventData.eventType] = eventData; |
|||
} |
|||
} else { |
|||
var z = true; |
|||
} |
|||
|
|||
if(isSingleMouse(eventData.eventType) ) { |
|||
eventList[eventList.length] = eventData; |
|||
lastBulkEvent = {}; |
|||
bulkEventElement = eventData.elementID; |
|||
} |
|||
|
|||
if(eventData.eventType === 'OnDrag') { |
|||
|
|||
lastEvent = lastBulkEvent[eventData.eventType]; |
|||
|
|||
if (lastEvent) { |
|||
// this is the second or third or whatever onmousemove in a row
|
|||
lastBulkData = lastEvent.eventInfo.mousePositions; |
|||
lastBulkData[lastBulkData.length] = { |
|||
dragInfo: eventData.eventInfo.dragInfo, |
|||
timeStamp: eventData.timeStamp |
|||
}; |
|||
} else { |
|||
eventData.eventInfo.mousePositions = []; |
|||
eventData.eventInfo.mousePositions[0] = { |
|||
dragInfo: eventData.eventInfo.dragInfo, |
|||
timeStamp: eventData.timeStamp |
|||
}; |
|||
eventList[eventList.length] = eventData; |
|||
lastBulkEvent[eventData.eventType] = eventData; |
|||
} |
|||
} |
|||
// if(eventData.eventType === 'OnKeyUp') {
|
|||
// transmissionFields.eventInfo = eventData.eventInfo;
|
|||
// $.ajax({
|
|||
// type: "POST",
|
|||
// url: '/RecordController/LogMouseClick',
|
|||
// data: transmissionFields,
|
|||
// });
|
|||
// }
|
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
var _recordClick = function(event) { |
|||
$('#recordButton').addClass('recordPlayButtonSelected'); |
|||
recordingIndex++; |
|||
// $axure.recording.startRecord();
|
|||
|
|||
recordingStartTime = new Date().getTime(); |
|||
|
|||
$.ajax({ |
|||
type: "POST", |
|||
url: '/RecordController/CreateRecording', |
|||
data: { |
|||
'recordingName': generateRecordingName(), |
|||
timeStamp: recordingStartTime |
|||
}, |
|||
success: function(response) { |
|||
recordingId = response.recordingId; |
|||
recordingName = response.recordingName; |
|||
$axure.messageCenter.postMessage('startRecording', {'recordingId' : recordingId, 'recordingName': recordingName}); |
|||
}, |
|||
// dataType: 'json'
|
|||
}); |
|||
|
|||
}; |
|||
|
|||
var _playClick = function(event) { |
|||
$('#playButton').addClass('recordPlayButtonSelected'); |
|||
}; |
|||
|
|||
var _stopClick = function(event) { |
|||
var axRecording, axObjectDictionary, axRecordingContainer, transmissionFields; |
|||
$('#sitemapLinksContainer').toggle(); |
|||
if($('#recordButton').is('.recordPlayButtonSelected')) { |
|||
$('#recordButton').removeClass('recordPlayButtonSelected'); |
|||
// $axure.recording.stopRecord();
|
|||
|
|||
axRecording = { |
|||
'recordingId' : recordingId, |
|||
'recordingName': recordingName, |
|||
'eventList': eventList |
|||
}; |
|||
|
|||
axRecordingList[axRecordingList.length] = axRecording; |
|||
axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode'); |
|||
axRecordingContainer.append(_formAxRecordingBranch(axRecording)); |
|||
_attachEventTriggers(axRecording); |
|||
|
|||
lastBulkEvent = {}; |
|||
|
|||
var recordingStepList = []; |
|||
|
|||
for(var eventListIdx in eventList) { |
|||
var eventListItem = eventList[eventListIdx]; |
|||
|
|||
if(eventListItem.eventType === 'OnDrag') { |
|||
var lastDrag = eventListItem.eventInfo.mousePositions[eventListItem.eventInfo.mousePositions.length - 1].dragInfo; |
|||
eventListItem.eventInfo.dragInfo.currentX = lastDrag.currentX; |
|||
eventListItem.eventInfo.dragInfo.currentY = lastDrag.currentY; |
|||
eventListItem.eventInfo.dragInfo.currentTime = lastDrag.currentTime; |
|||
eventListItem.eventInfo.dragInfo.xDelta = eventListItem.eventInfo.dragInfo.currentX - eventListItem.eventInfo.dragInfo.lastX; |
|||
eventListItem.eventInfo.dragInfo.yDelta = eventListItem.eventInfo.dragInfo.currentY - eventListItem.eventInfo.dragInfo.lastY; |
|||
transmissionFields = {}; |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']); |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['dragInfo']); |
|||
transmissionFields.recordingId = recordingId; |
|||
} |
|||
|
|||
if(isSingleMouse(eventListItem.eventType)) { |
|||
transmissionFields = {}; |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem, ['timeStamp', 'eventType', 'elementID', 'path']); |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['cursor']); |
|||
transmissionFields.recordingId = recordingId; |
|||
} |
|||
|
|||
if(isBulkMouse(eventListItem.eventType)) { |
|||
transmissionFields = {}; |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']); |
|||
transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['mousePositions']); |
|||
transmissionFields.recordingId = recordingId; |
|||
} |
|||
recordingStepList[recordingStepList.length] = transmissionFields; |
|||
} |
|||
|
|||
eventList = []; |
|||
$axure.messageCenter.postMessage('stopRecording', axObjectDictionary); |
|||
|
|||
var jsonText = { |
|||
'recordingName': recordingName, |
|||
'recordingId': recordingId, |
|||
recordingStart: new Date().getTime(), |
|||
recordingEnd: recordingStartTime, |
|||
'eventList': recordingStepList |
|||
}; |
|||
|
|||
$.ajax({ |
|||
type: "POST", |
|||
url: '/RecordController/StopRecording', |
|||
data: { 'jsonText': JSON.stringify(jsonText) } |
|||
|
|||
}); |
|||
|
|||
} |
|||
|
|||
if($('#playButton').is('.recordPlayButtonSelected')) { |
|||
$('#playButton').removeClass('recordPlayButtonSelected'); |
|||
} |
|||
}; |
|||
|
|||
var _deleteClick = function(event) { |
|||
$.ajax({ |
|||
type: "POST", |
|||
url: '/RecordController/DeleteRecordings', |
|||
success: function(response) { |
|||
var x = true; |
|||
}, // dataType: 'json'
|
|||
}); |
|||
}; |
|||
|
|||
var tackItOn = function(destination, source, fields) { |
|||
|
|||
for(var idx in fields) { |
|||
destination[fields[idx]] = source[fields[idx]]; |
|||
} |
|||
return destination; |
|||
}; |
|||
|
|||
var makeFirstLetterLower = function(eventName) { |
|||
return eventName.substr(0, 1).toLowerCase() + eventName.substr(1); |
|||
}; |
|||
|
|||
var _attachEventTriggers = function(axRecording) { |
|||
for(var eventIdx in axRecording.eventList) { |
|||
var eventObject = axRecording.eventList[eventIdx]; |
|||
var eventID = axRecording['recordingId'] + '_' + eventObject.timeStamp; |
|||
currentEvent = eventID; |
|||
$('#' + eventID).click(_triggerEvent(axRecording['recordingId'], eventObject.timeStamp)); |
|||
// $('#' + eventID).click(event.trigger);
|
|||
} |
|||
}; |
|||
|
|||
var _formAxRecordingBranch = function(axRecording) { |
|||
var eventObject, eventID, RDOID; |
|||
var recordPlayUi = '<ul class="recordingTree">'; |
|||
recordPlayUi += "<li class='recordingNode recordingExpandableNode'>"; |
|||
recordPlayUi += '<div class="recordingContainer" style="margin-left:15px">'; |
|||
recordPlayUi += '<a class="recordingPlusMinusLink"><span class="recordingMinus"></span></a>'; |
|||
recordPlayUi += '<a class="recordingPageLink" nodeurl="home.html">'; |
|||
recordPlayUi += '<span class="recordingPageIcon"></span>'; |
|||
recordPlayUi += '<span class="recordingPageName">' + axRecording['recordingName'] + '</span>'; |
|||
recordPlayUi += '</a>'; |
|||
|
|||
recordPlayUi += '<ul>'; |
|||
|
|||
for(eventID in axRecording.eventList) { |
|||
|
|||
eventObject = axRecording.eventList[eventID]; |
|||
|
|||
recordPlayUi += '<li class="recordingNode recordingLeafNode">'; |
|||
recordPlayUi += '<div class="recordingEventContainer" style="margin-left:44px">'; |
|||
var eventID = axRecording['recordingId'] + '_' + eventObject.timeStamp; |
|||
recordPlayUi += '<a id="' + eventID + '" class="sitemapPageLink">'; |
|||
recordPlayUi += 'Event ID: ' + eventID + '<br/>'; |
|||
|
|||
recordPlayUi += '<span class="sitemapPageIcon"></span>'; |
|||
recordPlayUi += '<span class="sitemapPageName">'; |
|||
|
|||
recordPlayUi += 'elementID: ' + eventObject.elementID + '<br/>'; |
|||
recordPlayUi += 'eventType: ' + eventObject.eventType + '<br/>'; |
|||
// recordPlayUi += 'cursor: ' + eventObject.eventInfo.cursor.x + ',' + eventObject.eventInfo.cursor.y + '<br/>';
|
|||
|
|||
for(RDOID in eventObject.path) { |
|||
recordPlayUi += '/' + eventObject.path[RDOID]; |
|||
} |
|||
recordPlayUi += '<br/>'; |
|||
recordPlayUi += '</span>'; |
|||
recordPlayUi += '</a>'; |
|||
recordPlayUi += '</div>'; |
|||
recordPlayUi += '</li>'; |
|||
} |
|||
|
|||
recordPlayUi += '</ul>'; |
|||
|
|||
recordPlayUi += '</div>'; |
|||
|
|||
recordPlayUi += "</li>"; |
|||
recordPlayUi += "</ul>"; |
|||
|
|||
return recordPlayUi; |
|||
}; |
|||
|
|||
var currentEvent = ''; |
|||
|
|||
var _triggerEvent = function(axRecording, timeStamp) { |
|||
// $axure.messageCenter.postMessage('triggerEvent', false);
|
|||
|
|||
|
|||
for(var axRecordingIdx in axRecordingList) { |
|||
if(axRecordingList[axRecordingIdx].recordingId === axRecording) { |
|||
for(var eventIdx in axRecordingList[axRecordingIdx].eventList) { |
|||
if(axRecordingList[axRecordingIdx].eventList[eventIdx].timeStamp === timeStamp) { |
|||
|
|||
var thisEvent = axRecordingList[axRecordingIdx].eventList[eventIdx]; |
|||
// thisEvent.trigger();
|
|||
|
|||
var thisEventInfo, lowerEventType; |
|||
lowerEventType = thisEvent.eventType.toLowerCase(); |
|||
if(lowerEventType === 'onclick' || lowerEventType === 'onmousein') { |
|||
thisEventInfo = {}; |
|||
thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['cursor', 'timeStamp', 'srcElement']); |
|||
if(thisEvent.eventInfo.inputType) { |
|||
thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['inputType', 'inputValue']); |
|||
} |
|||
} else { |
|||
thisEventInfo = thisEvent.eventInfo; |
|||
} |
|||
|
|||
var thisParameters = { |
|||
'element': thisEvent.elementID, |
|||
'eventInfo': thisEventInfo, |
|||
// 'axEventObject': thisEvent.eventObject,
|
|||
'eventType': thisEvent.eventType |
|||
}; |
|||
|
|||
return function() { |
|||
$axure.messageCenter.postMessage('playEvent', thisParameters); |
|||
}; |
|||
|
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
var _generateRecordPlay = function() { |
|||
var recordPlayUi = "<div id='recordPlayContainer'>"; |
|||
|
|||
recordPlayUi += "<div id='recordPlayToolbar'>"; |
|||
|
|||
recordPlayUi += "<div style='height:30px;'>"; |
|||
|
|||
recordPlayUi += "<a id='recordButton' title='Start a Recording' class='recordPlayButton'></a>"; |
|||
recordPlayUi += "<a id='playButton' title='Play Back a Recording' class='recordPlayButton'></a>"; |
|||
recordPlayUi += "<a id='stopButton' title='Stop' class='recordPlayButton'></a>"; |
|||
recordPlayUi += "<a id='deleteButton' title='Delete All Recordings' class='recordPlayButton'></a>"; |
|||
recordPlayUi += "</div>"; |
|||
|
|||
recordPlayUi += "<div id='recordingContainer'><li class='recordingNode recordingRootNode'></li></div>"; |
|||
recordPlayUi += "</div>"; |
|||
|
|||
$('#recordPlayHost').html(recordPlayUi); |
|||
}; |
|||
|
|||
})(); |
@ -0,0 +1,90 @@ |
|||
#recordPlayHost { |
|||
font-size: 12px; |
|||
color:#333; |
|||
height: 100%; |
|||
} |
|||
|
|||
|
|||
#recordPlayContainer |
|||
{ |
|||
overflow: auto; |
|||
width: 100%; |
|||
height: 100%; |
|||
padding: 10px 10px 10px 10px; |
|||
} |
|||
|
|||
#recordPlayToolbar |
|||
{ |
|||
margin: 5px 5px 5px 5px; |
|||
height: 22px; |
|||
} |
|||
|
|||
#recordPlayToolbar .recordPlayButton |
|||
{ |
|||
float: left; |
|||
width: 22px; |
|||
height: 22px; |
|||
border: 1px solid transparent; |
|||
} |
|||
|
|||
#recordPlayToolbar .recordPlayButton:hover |
|||
{ |
|||
border: 1px solid rgb(0,157,217); |
|||
background-color : rgb(166,221,242); |
|||
} |
|||
|
|||
#recordPlayToolbar .recordPlayButton:active |
|||
{ |
|||
border: 1px solid rgb(0,157,217); |
|||
background-color : rgb(204,235,248); |
|||
} |
|||
|
|||
#recordPlayToolbar .recordPlayButtonSelected { |
|||
border: 1px solid rgb(0,157,217); |
|||
background-color : rgb(204,235,248); |
|||
} |
|||
|
|||
/* removed images */ |
|||
/*#recordButton { |
|||
background: url('../../sitemap/styles/images/233_hyperlink_16.png') no-repeat center center; |
|||
} |
|||
|
|||
#playButton { |
|||
background: url('../../sitemap/styles/images/225_responsive_16.png') no-repeat center center; |
|||
} |
|||
|
|||
#stopButton { |
|||
background: url('../../sitemap/styles/images/228_togglenotes_16.png') no-repeat center center; |
|||
} |
|||
|
|||
#deleteButton { |
|||
background: url('../../sitemap/styles/images/231_event_16.png') no-repeat center center; |
|||
}*/ |
|||
|
|||
#recordNameHeader |
|||
{ |
|||
/* yeah??*/ |
|||
font-size: 13px; |
|||
font-weight: bold; |
|||
height: 23px; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
#recordPlayContent |
|||
{ |
|||
/* yeah??*/ |
|||
overflow: visible; |
|||
} |
|||
|
|||
.recordPlayName |
|||
{ |
|||
font-size: 12px; |
|||
margin-bottom: 5px; |
|||
text-decoration: underline; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.recordPlay |
|||
{ |
|||
margin-bottom: 10px; |
|||
} |
@ -0,0 +1,562 @@ |
|||
var currentNodeUrl = ''; |
|||
var allNodeUrls = []; |
|||
|
|||
var openNextPage = $axure.player.openNextPage = function () { |
|||
var index = allNodeUrls.indexOf(currentNodeUrl) + 1; |
|||
if(index >= allNodeUrls.length) return; |
|||
var nextNodeUrl = allNodeUrls[index]; |
|||
currentNodeUrl = nextNodeUrl; |
|||
$('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown(); |
|||
}; |
|||
|
|||
var openPreviousPage = $axure.player.openPreviousPage = function () { |
|||
var index = allNodeUrls.indexOf(currentNodeUrl) - 1; |
|||
if(index < 0) return; |
|||
var nextNodeUrl = allNodeUrls[index]; |
|||
currentNodeUrl = nextNodeUrl; |
|||
$('.sitemapPageLink[nodeUrl="' + nextNodeUrl + '"]').parent().mousedown(); |
|||
}; |
|||
|
|||
// use this to isolate the scope
|
|||
(function() { |
|||
|
|||
var SHOW_HIDE_ANIMATION_DURATION = 0; |
|||
|
|||
var HIGHLIGHT_INTERACTIVE_VAR_NAME = 'hi'; |
|||
|
|||
var currentPageLoc = ''; |
|||
var currentPlayerLoc = ''; |
|||
var currentPageHashString = ''; |
|||
|
|||
$(window.document).ready(function() { |
|||
$axure.player.createPluginHost({ |
|||
id: 'sitemapHost', |
|||
context: 'project', |
|||
title: 'Project Pages', |
|||
gid: 1, |
|||
}); |
|||
|
|||
$(window.document).bind('keyup', function (e) { |
|||
if (e.target.localName == "textarea" || e.target.localName == "input" || event.target.isContentEditable) return; |
|||
switch(e.which) { |
|||
case 188: |
|||
openPreviousPage(); |
|||
break; |
|||
case 190: |
|||
openNextPage(); |
|||
break; |
|||
default: return; // exit this handler for other keys
|
|||
} |
|||
}); |
|||
|
|||
generateSitemap(); |
|||
var pageCount = $('.sitemapPageLink').length; |
|||
|
|||
$('.leftArrow').click(openPreviousPage); |
|||
$('.rightArrow').click(openNextPage); |
|||
|
|||
$('.sitemapPlusMinusLink').click(collapse_click); |
|||
$('.sitemapPageLink').parent().mousedown(node_click); |
|||
|
|||
$('#interfaceAdaptiveViewsListContainer').hide(); |
|||
|
|||
$('#projectOptionsShowHotspots').click(showHotspots_click); |
|||
$('#searchIcon').click(searchBoxClose_click); |
|||
$('#searchDiv').click(searchBoxExpand_click); |
|||
$('#searchBox').keyup(search_input_keyup); |
|||
|
|||
// bind to the page load
|
|||
$axure.page.bind('load.sitemap', function() { |
|||
currentPageLoc = $axure.page.location.split("#")[0]; |
|||
var decodedPageLoc = decodeURI(currentPageLoc); |
|||
currentNodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/') ? decodedPageLoc.lastIndexOf('/') + 1 : 0); |
|||
currentPlayerLoc = $(location).attr('href').split("#")[0].split("?")[0]; |
|||
currentPageHashString = '#p=' + currentNodeUrl.substr(0, currentNodeUrl.lastIndexOf('.')); |
|||
|
|||
$axure.player.setVarInCurrentUrlHash(PAGE_ID_NAME, $axure.player.getPageIdByUrl(currentNodeUrl)); |
|||
$axure.player.setVarInCurrentUrlHash(PAGE_URL_NAME, currentNodeUrl.substring(0, currentNodeUrl.lastIndexOf('.html'))); |
|||
|
|||
$('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight'); |
|||
var $currentNode = $('.sitemapPageLink[nodeUrl="' + currentNodeUrl + '"]'); |
|||
$currentNode.parent().parent().addClass('sitemapHighlight'); |
|||
|
|||
var pageName = $axure.page.pageName; |
|||
$('.pageNameHeader').html(pageName); |
|||
|
|||
if ($currentNode.length > 0 && pageCount > 1) { |
|||
var currentNode = $currentNode[0]; |
|||
var currentNum = $('.sitemapPageLink').index(currentNode) + 1; |
|||
$('.pageCountHeader').html('(' + currentNum + ' of ' + pageCount + ')'); |
|||
} else $('.pageCountHeader').html(''); |
|||
|
|||
//If highlight var is present and set to 1 or else if
|
|||
//sitemap highlight button is selected then highlight interactive elements
|
|||
var hiVal = $axure.player.getHashStringVar(HIGHLIGHT_INTERACTIVE_VAR_NAME); |
|||
if(hiVal.length > 0 && hiVal == 1) { |
|||
$('#showHotspotsOption').find('.overflowOptionCheckbox').addClass('selected'); |
|||
if ($('#projectOptionsHotspotsCheckbox').length > 0) $('#projectOptionsHotspotsCheckbox').addClass('selected'); |
|||
$axure.messageCenter.postMessage('highlightInteractive', true); |
|||
} else if ($('#showHotspotsOption').find('.overflowOptionCheckbox').hasClass('selected')) { |
|||
$axure.messageCenter.postMessage('highlightInteractive', true); |
|||
} |
|||
|
|||
generateAdaptiveViews(false); |
|||
if (MOBILE_DEVICE) generateAdaptiveViews(true); |
|||
|
|||
$axure.player.suspendRefreshViewPort = true; |
|||
|
|||
//Set the current view if it is defined in the hash string
|
|||
//If the view is invalid, set it to 'auto' in the string
|
|||
//ELSE set the view based on the currently selected view in the toolbar menu
|
|||
var viewStr = $axure.player.getHashStringVar(ADAPTIVE_VIEW_VAR_NAME); |
|||
if(viewStr.length > 0) { |
|||
var $view = $('.adaptiveViewOption[val="' + viewStr + '"]'); |
|||
if($view.length > 0) $view.click(); |
|||
else $('.adaptiveViewOption[val="auto"]').click(); |
|||
} else if($('.selectedRadioButton').length > 0) { |
|||
var $viewOption = $('.selectedRadioButton').parents('.adaptiveViewOption'); |
|||
$viewOption.click(); |
|||
} |
|||
updateAdaptiveViewHeader(); |
|||
|
|||
function setDefaultScaleForDevice() { |
|||
if(MOBILE_DEVICE && $axure.player.isMobileMode()) { |
|||
$('.projectOptionsScaleRow[val="0"]').click(); |
|||
} else { |
|||
$('.vpScaleOption[val="0"]').click(); |
|||
} |
|||
} |
|||
|
|||
var scaleStr = $axure.player.getHashStringVar(SCALE_VAR_NAME); |
|||
if(scaleStr.length > 0) { |
|||
var $scale = $('.vpScaleOption[val="' + scaleStr + '"]'); |
|||
if($scale.length > 0) $scale.click(); |
|||
else setDefaultScaleForDevice(); |
|||
} else { |
|||
setDefaultScaleForDevice(); |
|||
} |
|||
|
|||
var rotateStr = $axure.player.getHashStringVar(ROT_VAR_NAME); |
|||
if(rotateStr.length > 0) { |
|||
$('#vpRotate').prop('checked', true); |
|||
} |
|||
|
|||
$axure.player.suspendRefreshViewPort = false; |
|||
|
|||
if (!$axure.player.isViewOverridden()) $axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() }); |
|||
|
|||
$axure.player.refreshViewPort(); |
|||
|
|||
$axure.messageCenter.postMessage('finishInit'); |
|||
|
|||
showMainPanel(); |
|||
return false; |
|||
}); |
|||
|
|||
var $vpContainer = $('#interfaceScaleListContainer'); |
|||
|
|||
var scaleOptions = '<div class="vpScaleOption" val="0"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Default Scale</div>'; |
|||
scaleOptions += '<div class="vpScaleOption" val="1"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to Width</div>'; |
|||
scaleOptions += '<div class="vpScaleOption" val="2"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to Fit</div>'; |
|||
$(scaleOptions).appendTo($vpContainer); |
|||
|
|||
$('#overflowMenuContainer').append('<div id="showHotspotsOption" class="showOption" style="order: 1"><div class="overflowOptionCheckbox"></div>Show Hotspots</div>'); |
|||
$('#overflowMenuContainer').append($vpContainer); |
|||
$vpContainer.show(); |
|||
|
|||
$('#showHotspotsOption').click(showHotspots_click); |
|||
$('.vpScaleOption').click(vpScaleOption_click); |
|||
$('.vpScaleOption').mouseup(function (event) { |
|||
event.stopPropagation(); |
|||
}); |
|||
|
|||
if (MOBILE_DEVICE) { |
|||
var scaleOptions = '<div class="projectOptionsScaleRow" val="1"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Scale to fit width</div>'; |
|||
scaleOptions += '<div class="projectOptionsScaleRow" val="0"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Original size (100%)</div>'; |
|||
scaleOptions += '<div class="projectOptionsScaleRow" val="2" style="border-bottom: solid 1px #c7c7c7"><div class="scaleRadioButton"><div class="selectedRadioButtonFill"></div></div>Fit all to screen</div>'; |
|||
$(scaleOptions).appendTo($('#projectOptionsScaleContainer')); |
|||
|
|||
$('.projectOptionsScaleRow').click(vpScaleOption_click); |
|||
} |
|||
|
|||
$('#searchBox').focusin(function() { |
|||
if($(this).is('.searchBoxHint')) { |
|||
$(this).val(''); |
|||
$(this).removeClass('searchBoxHint'); |
|||
} |
|||
}).focusout(function() { |
|||
if($(this).val() == '') { |
|||
$(this).addClass('searchBoxHint'); |
|||
} |
|||
}); |
|||
|
|||
|
|||
$('#searchBox').focusout(); |
|||
}); |
|||
|
|||
var _formatViewDimension = function(dim) { |
|||
if(dim == 0) return 'any'; |
|||
if(dim.toString().includes('.')) return dim.toFixed(2); |
|||
return dim; |
|||
}; |
|||
|
|||
function generateAdaptiveViews(forProjectOptions) { |
|||
var $container = forProjectOptions ? $('#projectOptionsAdaptiveViewsContainer') : $('#interfaceAdaptiveViewsListContainer'); |
|||
var $viewSelect = forProjectOptions ? $('#projectOptionsViewSelect') : $('#viewSelect'); |
|||
var adaptiveViewOptionClass = forProjectOptions ? 'projectOptionsAdaptiveViewRow' : 'adaptiveViewOption'; |
|||
var currentViewClass = forProjectOptions ? '' : 'currentAdaptiveView'; |
|||
|
|||
$container.empty(); |
|||
$viewSelect.empty(); |
|||
|
|||
//Fill out adaptive view container with prototype's defined adaptive views, as well as the default, and Auto
|
|||
var viewsList = '<div class="' + adaptiveViewOptionClass + '" val="auto"><div class="adapViewRadioButton selectedRadioButton"><div class="selectedRadioButtonFill"></div></div>Adaptive</div>'; |
|||
var viewSelect = '<option value="auto">Adaptive</option>'; |
|||
if (typeof $axure.page.defaultAdaptiveView.name != 'undefined') { |
|||
//If the name is a blank string, make the view name the width if non-zero, else 'any'
|
|||
var defaultView = $axure.page.defaultAdaptiveView; |
|||
var defaultViewName = defaultView.name; |
|||
|
|||
var widthString = _formatViewDimension(defaultView.size.width); |
|||
var heightString = _formatViewDimension(defaultView.size.height); |
|||
|
|||
var viewString = defaultViewName + ' (' + widthString + ' x ' + heightString + ')'; |
|||
|
|||
viewsList += '<div class="' + adaptiveViewOptionClass + ' ' + currentViewClass + '" val="default"data-dim="' + defaultView.size.width + 'x' + defaultView.size.height + '">' + |
|||
'<div class="adapViewRadioButton"><div class="selectedRadioButtonFill"></div></div>' + viewString + '</div>'; |
|||
viewSelect += '<option value="default">' + viewString + '</option>'; |
|||
} |
|||
|
|||
var useViews = $axure.document.configuration.useViews; |
|||
var hasViews = false; |
|||
if(useViews) { |
|||
for(var viewIndex = 0; viewIndex < $axure.page.adaptiveViews.length; viewIndex++) { |
|||
var currView = $axure.page.adaptiveViews[viewIndex]; |
|||
|
|||
var widthString = _formatViewDimension(currView.size.width); |
|||
var heightString = _formatViewDimension(currView.size.height); |
|||
|
|||
var viewString = currView.name + ' (' + widthString + ' x ' + heightString + ')'; |
|||
viewsList += '<div class="' + adaptiveViewOptionClass + |
|||
((forProjectOptions && (viewIndex == $axure.page.adaptiveViews.length - 1)) ? '" style="border-bottom: solid 1px #c7c7c7; margin-bottom: 15px;' : '') + |
|||
'" val="' + |
|||
currView.id + |
|||
'" data-dim="' + |
|||
currView.size.width + |
|||
'x' + |
|||
currView.size.height + |
|||
'"><div class="adapViewRadioButton"><div class="selectedRadioButtonFill"></div></div>' + |
|||
viewString + |
|||
'</div>'; |
|||
viewSelect += '<option value="' + currView.id + '">' + viewString + '</option>'; |
|||
|
|||
hasViews = true; |
|||
} |
|||
} |
|||
|
|||
$container.append(viewsList); |
|||
$viewSelect.append(viewSelect); |
|||
|
|||
if (!hasViews) { |
|||
if (forProjectOptions) { |
|||
$('#projectOptionsAdaptiveViewsHeader').hide(); |
|||
$('#projectOptionsAdaptiveViewsContainer').hide(); |
|||
} else $('#interfaceAdaptiveViewsContainer').hide(); |
|||
} else { |
|||
if (forProjectOptions) { |
|||
$('#projectOptionsAdaptiveViewsHeader').show(); |
|||
$('#projectOptionsAdaptiveViewsContainer').show(); |
|||
} else $('#interfaceAdaptiveViewsContainer').show(); |
|||
} |
|||
|
|||
$(('.' + adaptiveViewOptionClass)).click(adaptiveViewOption_click); |
|||
|
|||
if (!forProjectOptions) { |
|||
$(('.' + adaptiveViewOptionClass)).mouseup(function (event) { |
|||
event.stopPropagation(); |
|||
}); |
|||
} |
|||
} |
|||
|
|||
|
|||
function collapse_click(event) { |
|||
if($(this).children('.sitemapPlus').length > 0) { |
|||
expand_click($(this)); |
|||
} else { |
|||
$(this) |
|||
.children('.sitemapMinus').removeClass('sitemapMinus').addClass('sitemapPlus').end() |
|||
.closest('li').children('ul').hide(SHOW_HIDE_ANIMATION_DURATION); |
|||
} |
|||
event.stopPropagation(); |
|||
} |
|||
|
|||
function expand_click($this) { |
|||
$this |
|||
.children('.sitemapPlus').removeClass('sitemapPlus').addClass('sitemapMinus').end() |
|||
.closest('li').children('ul').show(SHOW_HIDE_ANIMATION_DURATION); |
|||
} |
|||
|
|||
function searchBoxExpand_click(event) { |
|||
if (!$('#searchIcon').hasClass('sitemapToolbarButtonSelected')) { |
|||
$('#searchIcon').addClass('sitemapToolbarButtonSelected') |
|||
$('#searchBox').width(0); |
|||
$('#searchBox').show(); |
|||
$('#searchBox').animate({ width: '95%' }, { duration: 200, complete: function () { $('#searchBox').focus(); } }); |
|||
} |
|||
} |
|||
|
|||
function searchBoxClose_click(event) { |
|||
if ($('#searchIcon').hasClass('sitemapToolbarButtonSelected')) { |
|||
$('#searchBox').animate({ width: '0%' }, { duration: 200, |
|||
complete: function () { |
|||
$('#searchBox').hide(); |
|||
$('#searchIcon').removeClass('sitemapToolbarButtonSelected') |
|||
}}); |
|||
$('#searchBox').val(''); |
|||
$('#searchBox').keyup(); |
|||
} |
|||
} |
|||
|
|||
function node_click(event) { |
|||
hideMainPanel(); |
|||
$('#sitemapTreeContainer').find('.sitemapHighlight').removeClass('sitemapHighlight'); |
|||
$(this).parent().addClass('sitemapHighlight'); |
|||
$axure.page.navigate($(this).children('.sitemapPageLink')[0].getAttribute('nodeUrl'), true); |
|||
} |
|||
|
|||
function hideMainPanel() { |
|||
$('#mainPanel').css('opacity', '0'); |
|||
$('#clippingBounds').css('opacity', '0'); |
|||
} |
|||
function showMainPanel() { |
|||
$('#mainPanel').animate({ opacity: 1 }, 10); |
|||
$('#clippingBounds').animate({ opacity: 1 }, 10); |
|||
} |
|||
|
|||
$axure.messageCenter.addMessageListener(function(message, data) { |
|||
if(message == 'adaptiveViewChange') { |
|||
$('.adaptiveViewOption').removeClass('currentAdaptiveView'); |
|||
if(data.viewId) {$('.adaptiveViewOption[val="' + data.viewId + '"]').addClass('currentAdaptiveView');} |
|||
else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView'); |
|||
|
|||
//when we set adaptive view through user event, we want to update the checkmark on sitemap
|
|||
if(data.forceSwitchTo) { |
|||
$('.adapViewRadioButton').find('.selectedRadioButtonFill').hide(); |
|||
$('.adapViewRadioButton').removeClass('selectedRadioButton'); |
|||
$('div[val="' + data.forceSwitchTo + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton'); |
|||
$('div[val="' + data.forceSwitchTo + '"]').find('.selectedRadioButtonFill').show(); |
|||
} |
|||
|
|||
updateAdaptiveViewHeader(); |
|||
$axure.player.refreshViewPort(); |
|||
|
|||
} else if(message == 'previousPage') { |
|||
openPreviousPage(); |
|||
} else if(message == 'nextPage') { |
|||
openNextPage(); |
|||
} |
|||
}); |
|||
|
|||
$axure.player.toggleHotspots = function (val) { |
|||
var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox'); |
|||
if ($(overflowMenuCheckbox).hasClass('selected')) { |
|||
if (!val) $('#showHotspotsOption').click(); |
|||
} else { |
|||
if (val) $('#showHotspotsOption').click(); |
|||
} |
|||
} |
|||
|
|||
function showHotspots_click(event) { |
|||
var overflowMenuCheckbox = $('#showHotspotsOption').find('.overflowOptionCheckbox'); |
|||
var projOptionsCheckbox = $('#projectOptionsHotspotsCheckbox'); |
|||
|
|||
if ($(overflowMenuCheckbox).hasClass('selected')) { |
|||
overflowMenuCheckbox.removeClass('selected'); |
|||
if (projOptionsCheckbox.length > 0 ) projOptionsCheckbox.removeClass('selected'); |
|||
$axure.messageCenter.postMessage('highlightInteractive', false); |
|||
//Delete 'hi' hash string var if it exists since default is unselected
|
|||
$axure.player.deleteVarFromCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME); |
|||
} else { |
|||
overflowMenuCheckbox.addClass('selected'); |
|||
if (projOptionsCheckbox.length > 0) projOptionsCheckbox.addClass('selected'); |
|||
$axure.messageCenter.postMessage('highlightInteractive', true); |
|||
//Add 'hi' hash string var so that stay highlighted across reloads
|
|||
$axure.player.setVarInCurrentUrlHash(HIGHLIGHT_INTERACTIVE_VAR_NAME, 1); |
|||
} |
|||
} |
|||
|
|||
|
|||
function adaptiveViewOption_click(event) { |
|||
var currVal = $(this).attr('val'); |
|||
|
|||
$('.adaptiveViewOption').removeClass('currentAdaptiveView'); |
|||
if(currVal) {$('.adaptiveViewOption[val="' + currVal + '"]').addClass('currentAdaptiveView');} |
|||
else $('.adaptiveViewOption[val="default"]').addClass('currentAdaptiveView'); |
|||
|
|||
$('.adapViewRadioButton').find('.selectedRadioButtonFill').hide(); |
|||
$('.adapViewRadioButton').removeClass('selectedRadioButton'); |
|||
$('div[val="' + currVal + '"]').find('.adapViewRadioButton').addClass('selectedRadioButton'); |
|||
$('div[val="' + currVal + '"]').find('.selectedRadioButtonFill').show(); |
|||
|
|||
selectAdaptiveView(currVal); |
|||
$axure.player.closePopup(); |
|||
updateAdaptiveViewHeader(); |
|||
} |
|||
|
|||
var selectAdaptiveView = $axure.player.selectAdaptiveView = function(currVal) { |
|||
if (currVal == 'auto') { |
|||
$axure.messageCenter.postMessage('setAdaptiveViewForSize', { 'width': $('#mainPanel').width(), 'height': $('#mainPanel').height() }); |
|||
$axure.player.deleteVarFromCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME); |
|||
} else { |
|||
currentPageLoc = $axure.page.location.split("#")[0]; |
|||
var decodedPageLoc = decodeURI(currentPageLoc); |
|||
var nodeUrl = decodedPageLoc.substr(decodedPageLoc.lastIndexOf('/') |
|||
? decodedPageLoc.lastIndexOf('/') + 1 |
|||
: 0); |
|||
var adaptiveData = { |
|||
src: nodeUrl |
|||
}; |
|||
|
|||
adaptiveData.view = currVal; |
|||
$axure.messageCenter.postMessage('switchAdaptiveView', adaptiveData); |
|||
$axure.player.setVarInCurrentUrlHash(ADAPTIVE_VIEW_VAR_NAME, currVal); |
|||
} |
|||
} |
|||
|
|||
$axure.player.updateAdaptiveViewHeader = updateAdaptiveViewHeader = function () { |
|||
var hasDefinedDim = true; |
|||
var dimensionlessViewStr = '(any x any)'; |
|||
|
|||
var viewString = $('.adaptiveViewOption.currentAdaptiveView').text(); |
|||
if (viewString != null && viewString.indexOf(dimensionlessViewStr) >= 0) hasDefinedDim = false; |
|||
|
|||
if (!hasDefinedDim) { |
|||
var viewName = viewString.substring(0, viewString.lastIndexOf(' (')); |
|||
var widthString = $('#mainPanelContainer').width(); |
|||
viewString = viewName + ' (' + widthString + ' x any)'; |
|||
} |
|||
|
|||
$('.adaptiveViewHeader').html(viewString); |
|||
} |
|||
|
|||
$axure.player.selectScaleOption = function (scaleVal) { |
|||
var $scale = $('.vpScaleOption[val="' + scaleVal + '"]'); |
|||
if ($scale.length > 0) $scale.click(); |
|||
} |
|||
|
|||
function vpScaleOption_click(event) { |
|||
var scaleCheckDiv = $(this).find('.scaleRadioButton'); |
|||
var scaleVal = $(this).attr('val'); |
|||
if (scaleCheckDiv.hasClass('selectedRadioButton')) return false; |
|||
|
|||
var $selectedScaleOption = $('.vpScaleOption[val="' + scaleVal + '"], .projectOptionsScaleRow[val="' + scaleVal + '"]'); |
|||
var $allScaleOptions = $('.vpScaleOption, .projectOptionsScaleRow'); |
|||
$allScaleOptions.find('.scaleRadioButton').removeClass('selectedRadioButton'); |
|||
$allScaleOptions.find('.selectedRadioButtonFill').hide(); |
|||
$selectedScaleOption.find('.scaleRadioButton').addClass('selectedRadioButton'); |
|||
$selectedScaleOption.find('.selectedRadioButtonFill').show(); |
|||
|
|||
if (scaleVal == '0') { |
|||
$axure.player.deleteVarFromCurrentUrlHash(SCALE_VAR_NAME); |
|||
} else if (typeof scaleVal !== 'undefined') { |
|||
$axure.player.setVarInCurrentUrlHash(SCALE_VAR_NAME, scaleVal); |
|||
} |
|||
|
|||
$axure.player.refreshViewPort(); |
|||
} |
|||
|
|||
function search_input_keyup(event) { |
|||
var searchVal = $(this).val().toLowerCase(); |
|||
//If empty search field, show all nodes, else grey+hide all nodes and
|
|||
//ungrey+unhide all matching nodes, as well as unhide their parent nodes
|
|||
if(searchVal == '') { |
|||
$('.sitemapPageName').removeClass('sitemapGreyedName'); |
|||
$('.sitemapNode').show(); |
|||
} else { |
|||
$('.sitemapNode').hide(); |
|||
|
|||
$('.sitemapPageName').addClass('sitemapGreyedName').each(function() { |
|||
var nodeName = $(this).text().toLowerCase(); |
|||
if(nodeName.indexOf(searchVal) != -1) { |
|||
$(this).removeClass('sitemapGreyedName').parents('.sitemapNode:first').show().parents('.sitemapExpandableNode').show(); |
|||
} |
|||
}); |
|||
} |
|||
} |
|||
|
|||
|
|||
function generateSitemap() { |
|||
var treeUl = "<div id='sitemapHeader'' class='sitemapHeader'>"; |
|||
treeUl += "<div id='sitemapToolbar' class='sitemapToolbar'>"; |
|||
|
|||
treeUl += '<div id="searchDiv"><span id="searchIcon" class="sitemapToolbarButton"></span><input id="searchBox" type="text"/></div>'; |
|||
treeUl += "<div class='leftArrow sitemapToolbarButton'></div>"; |
|||
treeUl += "<div class='rightArrow sitemapToolbarButton'></div>"; |
|||
|
|||
treeUl += "</div>"; |
|||
treeUl += "</div>"; |
|||
|
|||
///////////////////
|
|||
|
|||
var sitemapTitle = $axure.player.getProjectName(); |
|||
if (!sitemapTitle) sitemapTitle = "Pages"; |
|||
treeUl += "<div class='sitemapPluginNameHeader pluginNameHeader'>" + sitemapTitle + "</div>"; |
|||
|
|||
treeUl += "<div id='sitemapTreeContainer'>"; |
|||
treeUl += "<ul class='sitemapTree' style='clear:both;'>"; |
|||
var rootNodes = $axure.document.sitemap.rootNodes; |
|||
for(var i = 0; i < rootNodes.length; i++) { |
|||
treeUl += generateNode(rootNodes[i], 0); |
|||
} |
|||
treeUl += "</ul></div>"; |
|||
|
|||
if (!MOBILE_DEVICE) { |
|||
treeUl += "<div id='changePageInstructions' class='pageSwapInstructions'>Use "; |
|||
treeUl += '<span class="backKeys"></span>'; |
|||
treeUl += " and "; |
|||
treeUl += '<span class="forwardKeys"></span>'; |
|||
treeUl += " keys<br>to move between pages"; |
|||
treeUl += "</div>"; |
|||
} |
|||
|
|||
$('#sitemapHost').html(treeUl); |
|||
} |
|||
|
|||
function generateNode(node, level) { |
|||
var hasChildren = (node.children && node.children.length > 0); |
|||
var margin, returnVal; |
|||
if(hasChildren) { |
|||
margin = (9 + level * 17); |
|||
returnVal = "<li class='sitemapNode sitemapExpandableNode'><div><div class='sitemapPageLinkContainer' style='margin-left:" + margin + "px'><a class='sitemapPlusMinusLink'><span class='sitemapMinus'></span></a>"; |
|||
} else { |
|||
margin = (19 + level * 17); |
|||
returnVal = "<li class='sitemapNode sitemapLeafNode'><div><div class='sitemapPageLinkContainer' style='margin-left:" + margin + "px'>"; |
|||
} |
|||
|
|||
var isFolder = node.type == "Folder"; |
|||
if(!isFolder) { |
|||
returnVal += "<a class='sitemapPageLink' nodeUrl='" + node.url + "'>"; |
|||
allNodeUrls.push(node.url); |
|||
} |
|||
returnVal += "<span class='sitemapPageIcon"; |
|||
if(node.type == "Flow"){ returnVal += " sitemapFlowIcon";} |
|||
if(isFolder) { returnVal += " sitemapFolderIcon"; } |
|||
|
|||
returnVal += "'></span><span class='sitemapPageName'>"; |
|||
returnVal += $('<div/>').text(node.pageName).html(); |
|||
returnVal += "</span>"; |
|||
if(!isFolder) returnVal += "</a>"; |
|||
returnVal += "</div></div>"; |
|||
|
|||
if(hasChildren) { |
|||
returnVal += "<ul>"; |
|||
for(var i = 0; i < node.children.length; i++) { |
|||
var child = node.children[i]; |
|||
returnVal += generateNode(child, level + 1); |
|||
} |
|||
returnVal += "</ul>"; |
|||
} |
|||
returnVal += "</li>"; |
|||
return returnVal; |
|||
} |
|||
})(); |
After Width: | Height: | Size: 940 B |
After Width: | Height: | Size: 820 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 224 B |
After Width: | Height: | Size: 563 B |
After Width: | Height: | Size: 175 B |
After Width: | Height: | Size: 577 B |
After Width: | Height: | Size: 265 B |
After Width: | Height: | Size: 170 B |
After Width: | Height: | Size: 293 B |
After Width: | Height: | Size: 293 B |
After Width: | Height: | Size: 451 B |
After Width: | Height: | Size: 451 B |
@ -0,0 +1,384 @@ |
|||
|
|||
#sitemapHost { |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100%; |
|||
} |
|||
|
|||
#sitemapHostBtn a { |
|||
background: url('images/sitemap_panel_on.svg') no-repeat center center, linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#sitemapHostBtn a.selected, #sitemapHostBtn a.selected:hover { |
|||
background: url('images/sitemap_panel_off.svg') no-repeat center center, linear-gradient(transparent, transparent); |
|||
} |
|||
|
|||
#sitemapHost .pageButtonHeader { |
|||
top: -27px; |
|||
} |
|||
|
|||
#sitemapTreeContainer { |
|||
overflow: auto; |
|||
width: 100%; |
|||
flex: 1; |
|||
-webkit-overflow-scrolling: touch; |
|||
} |
|||
|
|||
.mobileMode #sitemapTreeContainer { |
|||
margin-left: 5px; |
|||
overflow-x: hidden; |
|||
} |
|||
|
|||
.sitemapTree { |
|||
margin: 0px 0px 10px 0px; |
|||
overflow:visible; |
|||
} |
|||
|
|||
.sitemapTree ul { |
|||
list-style-type: none; |
|||
margin: 0px 0px 0px 0px; |
|||
padding-left: 0px; |
|||
} |
|||
|
|||
ul.sitemapTree { |
|||
display: inline-block; |
|||
min-width: 100%; |
|||
} |
|||
|
|||
.pageSwapInstructions { |
|||
width: 129px; |
|||
font-size: 12px; |
|||
text-align: center; |
|||
color: #8c8c8c; |
|||
margin: 0 auto; |
|||
padding: 12px 0px; |
|||
line-height: 20px; |
|||
} |
|||
|
|||
.sitemapMinus, .sitemapPlus { |
|||
vertical-align:middle; |
|||
background-repeat: no-repeat; |
|||
margin-right: 3px; |
|||
width: 7px; |
|||
height: 8px; |
|||
object-fit: contain; |
|||
display:inline-block; |
|||
} |
|||
.sitemapMinus { |
|||
margin-bottom: 0px; |
|||
background: url('images/open_item.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
.sitemapPlus { |
|||
margin-bottom: 2px; |
|||
background: url('images/closed_item.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.mobileMode .sitemapMinus, .mobileMode .sitemapPlus { |
|||
width: 10.5px; |
|||
height: 12px; |
|||
margin-right: 5px; |
|||
background-size: contain; |
|||
} |
|||
|
|||
.sitemapPageLink { |
|||
margin-left: 0px; |
|||
} |
|||
|
|||
.sitemapPageIcon { |
|||
margin: 0px 6px -3px 3px; |
|||
width: 16px; |
|||
height: 16px; |
|||
display: inline-block; |
|||
background: url('images/page_lt_grey.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.mobileMode .sitemapPageIcon { |
|||
margin-right: 7px; |
|||
background-size: contain; |
|||
} |
|||
|
|||
.sitemapFolderIcon { |
|||
background: url('images/folder_closed_blue.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.mobileMode .sitemapFolderIcon { |
|||
width: 18px; |
|||
height: 18px; |
|||
margin-left: 1px; |
|||
background-position-y: 1px; |
|||
background-size: contain; |
|||
} |
|||
|
|||
.sitemapFlowIcon { |
|||
background: url('images/flow.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.sitemapFolderOpenIcon { |
|||
background: url('images/folder_open.png') no-repeat center center; |
|||
background: url('images/folder_open.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.sitemapPageName { |
|||
font-size: 14px; |
|||
line-height: 1.93; |
|||
color: #4a4a4a; |
|||
} |
|||
|
|||
.sitemapPageName.mobileText { |
|||
line-height: 1.69; |
|||
} |
|||
|
|||
.sitemapNode { |
|||
white-space:nowrap; |
|||
} |
|||
|
|||
.sitemapPageLinkContainer { |
|||
cursor: pointer; |
|||
padding-right: 10px; |
|||
} |
|||
|
|||
.mobileMode .sitemapPageLinkContainer { |
|||
margin-bottom: 13px; |
|||
} |
|||
|
|||
.sitemapHighlight { |
|||
background-color: #e6e6e6; |
|||
} |
|||
|
|||
.sitemapGreyedName |
|||
{ |
|||
color: #AAA; |
|||
} |
|||
|
|||
.sitemapPluginNameHeader { |
|||
margin: 13px 9px 5px 9px; |
|||
font-size: 14px; |
|||
color: #444444; |
|||
} |
|||
|
|||
.sitemapHeader { |
|||
padding-top: 7px; |
|||
} |
|||
|
|||
.mobileMode .sitemapHeader { |
|||
padding-top: 0px; |
|||
} |
|||
|
|||
.sitemapToolbar { |
|||
margin: 0px 3px 0px 5px; |
|||
display: flex; |
|||
align-items: center; |
|||
justify-content: flex-end; |
|||
} |
|||
|
|||
.sitemapToolbarButton { |
|||
width: 19px; |
|||
height: 18px; |
|||
border: 1px solid transparent; |
|||
cursor: pointer; |
|||
flex: 0 0 auto; |
|||
} |
|||
|
|||
.hashover .sitemapToolbarButton:hover { |
|||
border-radius: 3px; |
|||
background-color: #e6e6e6 !important; |
|||
} |
|||
|
|||
.sitemapToolbarButton.sitemapToolbarButtonSelected, .sitemapToolbarButton.sitemapToolbarButtonSelected:hover{ |
|||
background-color: inherit !important; |
|||
} |
|||
|
|||
.leftArrow { |
|||
background: url('images/left_arrow.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
margin-left: 11px; |
|||
} |
|||
|
|||
.rightArrow { |
|||
background: url('images/right_arrow.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
margin-left: 3px; |
|||
margin-right: 2px; |
|||
} |
|||
|
|||
#searchIcon { |
|||
width: 10px; |
|||
height: 10px; |
|||
object-fit: contain; |
|||
background: url('images/search_on.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
vertical-align: bottom; |
|||
padding: 5px 4px 5px 4px; |
|||
display: inline-block; |
|||
} |
|||
|
|||
#searchIcon.sitemapToolbarButtonSelected { |
|||
padding: 5px 3px 5px 5px; |
|||
border-top-left-radius: 5px; |
|||
border-bottom-left-radius: 5px; |
|||
border-left: solid 1px #cccccc; |
|||
border-top: solid 1px #cccccc; |
|||
border-bottom: solid 1px #cccccc; |
|||
background: url('images/search_off.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
background-color: #FFFFFF !important; |
|||
} |
|||
|
|||
.backKeys { |
|||
width: 20px; |
|||
height: 21px; |
|||
object-fit: contain; |
|||
vertical-align: bottom; |
|||
margin: 2px; |
|||
display: inline-block; |
|||
background: url('images/back_keys.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
.forwardKeys { |
|||
width: 20px; |
|||
height: 21px; |
|||
object-fit: contain; |
|||
vertical-align: bottom; |
|||
margin: 2px; |
|||
display: inline-block; |
|||
background: url('images/forward_keys.svg') no-repeat center center, linear-gradient(transparent,transparent); |
|||
} |
|||
|
|||
#interfaceAdaptiveViewsListContainer { |
|||
position: absolute; |
|||
display: none; |
|||
width: 220px; |
|||
left: 155px; |
|||
padding: 6px 9px; |
|||
top: 36px; |
|||
} |
|||
|
|||
#interfaceScaleListContainer { |
|||
padding: 7.5px 9px 12px 16px; |
|||
margin-top: 9px; |
|||
border-top: solid 1px #bdbcbc; |
|||
order: 10; |
|||
} |
|||
|
|||
.adaptiveViewOption, .vpPresetOption, .vpScaleOption { |
|||
padding: 3px 0px 3px 0px; |
|||
color: #3B3B3B; |
|||
display: flex; |
|||
} |
|||
|
|||
.projectOptionsScaleRow, .projectOptionsAdaptiveViewRow, .projectOptionsHotspotsRow { |
|||
border-top: solid 1px #c7c7c7; |
|||
display: flex; |
|||
padding: 13px 7px 13px 0px; |
|||
} |
|||
|
|||
.adaptiveViewOption:hover, .vpScaleOption:hover, .vpPresetOption:hover, .projectOptionsAdaptiveViewRow:hover, .projectOptionsScaleRow:hover |
|||
{ |
|||
cursor: pointer; |
|||
} |
|||
|
|||
.scaleRadioButton, .adapViewRadioButton { |
|||
border: solid 1px #8c8c8c; |
|||
display: inline-block; |
|||
position: relative; |
|||
width: 12px; |
|||
height: 12px; |
|||
border-radius: 48px; |
|||
margin-right: 12px; |
|||
top: 2px; |
|||
flex-shrink: 0; |
|||
} |
|||
|
|||
.mobileMode .scaleRadioButton, .mobileMode .adapViewRadioButton { |
|||
width: 20px; |
|||
height: 20px; |
|||
border-radius: 60px; |
|||
margin-right: 22px; |
|||
margin-left: 22px; |
|||
top: 0px; |
|||
flex-shrink: 0; |
|||
} |
|||
|
|||
.selectedRadioButton { |
|||
border: solid 1px #20aca9; |
|||
} |
|||
|
|||
.selectedRadioButtonFill { |
|||
position: relative; |
|||
display: none; |
|||
background-color: #20aca9; |
|||
margin: auto; |
|||
width: 8px; |
|||
height: 8px; |
|||
border-radius: 30px; |
|||
top: 2px; |
|||
} |
|||
.mobileMode .selectedRadioButtonFill { |
|||
width: 12px; |
|||
height: 12px; |
|||
border-radius: 48px; |
|||
top: 4px; |
|||
} |
|||
|
|||
#searchDiv { |
|||
display: flex; |
|||
margin-right: auto; |
|||
flex: 1; |
|||
} |
|||
|
|||
#searchBox { |
|||
display: none; |
|||
width: 0%; |
|||
height: 22px; |
|||
padding-left: 5px; |
|||
border-radius: 0px 5px 5px 0px; |
|||
border-right: solid 1px #cccccc; |
|||
border-top: solid 1px #cccccc; |
|||
border-bottom: solid 1px #cccccc; |
|||
border-left: none; |
|||
-webkit-appearance: none; |
|||
} |
|||
|
|||
#searchBox:focus { |
|||
outline-width: 0; |
|||
} |
|||
|
|||
.searchBoxHint { |
|||
color: #8f949a; |
|||
} |
|||
|
|||
#sitemapHost.popup #searchDiv{ |
|||
display: none; |
|||
} |
|||
|
|||
#sitemapHost.popup #sitemapHeader{ |
|||
display: none; |
|||
} |
|||
|
|||
#sitemapHost.popup #changePageInstructions{ |
|||
display: none; |
|||
} |
|||
|
|||
.mobileMode #sitemapHeader { |
|||
display: none; |
|||
} |
|||
|
|||
|
|||
|
|||
/* Expo Sitemap |
|||
******************************************************************************/ |
|||
|
|||
.expoSitemapNode { |
|||
padding: 15px; |
|||
text-align: center; |
|||
} |
|||
|
|||
.sitemapPageImg { |
|||
max-width: 90%; |
|||
max-height: 150px; |
|||
} |
|||
|
|||
.popup .sitemapPageImg { |
|||
display: none; |
|||
} |
|||
|
|||
.popup .expoSitemapNode { |
|||
padding: 0 0 0 10px; |
|||
text-align: left; |
|||
} |
@ -0,0 +1,35 @@ |
|||
<html> |
|||
<head> |
|||
<title></title> |
|||
</head> |
|||
<body> |
|||
<br /> |
|||
<div style="width:100%; text-align:center; font-family:Arial; font-size:12px;" id=other></div> |
|||
<br /> |
|||
<div style="width:100%; text-align:center; font-family:Arial; font-size:12px;"> |
|||
<button onclick="parent.window.close();"> |
|||
Close |
|||
</button> |
|||
</div> |
|||
|
|||
<SCRIPT src="axurerp_pagescript.js"></SCRIPT> |
|||
|
|||
<script language=javascript> |
|||
function getQueryVariable(variable) { |
|||
var query = window.location.hash.substring(1); |
|||
var vars = query.split("&&&"); |
|||
for (var i=0;i<vars.length;i++) { |
|||
var pair = vars[i].split("="); |
|||
if (pair[0] == variable) { |
|||
return decodeURI(pair[1]); |
|||
} |
|||
} |
|||
} |
|||
|
|||
var other = document.getElementById('other'); |
|||
other.innerHTML = getQueryVariable('other'); |
|||
|
|||
</script> |
|||
|
|||
</body> |
|||
</html> |
@ -0,0 +1,292 @@ |
|||
/* so the window resize fires within a frame in IE7 */ |
|||
html, body { |
|||
height: 100%; |
|||
} |
|||
|
|||
.mobileFrameCursor div * { |
|||
cursor: inherit !important; |
|||
} |
|||
|
|||
a { |
|||
color: inherit; |
|||
} |
|||
|
|||
p { |
|||
margin: 0px; |
|||
text-rendering: optimizeLegibility; |
|||
font-feature-settings: "kern" 1; |
|||
-webkit-font-feature-settings: "kern"; |
|||
-moz-font-feature-settings: "kern"; |
|||
-moz-font-feature-settings: "kern=1"; |
|||
font-kerning: normal; |
|||
} |
|||
|
|||
ul { |
|||
margin:0px; |
|||
} |
|||
|
|||
iframe { |
|||
background: #FFFFFF; |
|||
} |
|||
|
|||
/* to match IE with C, FF */ |
|||
input { |
|||
padding: 1px 0px 1px 0px; |
|||
box-sizing: border-box; |
|||
-moz-box-sizing: border-box; |
|||
} |
|||
|
|||
input[type=text]::-ms-clear { |
|||
width: 0; |
|||
height: 0; |
|||
display: none; |
|||
} |
|||
|
|||
textarea { |
|||
margin: 0px; |
|||
box-sizing: border-box; |
|||
-moz-box-sizing: border-box; |
|||
} |
|||
|
|||
.focused:focus, .selectedFocused:focus { |
|||
outline: none; |
|||
} |
|||
|
|||
div.intcases { |
|||
font-family: arial; |
|||
font-size: 12px; |
|||
text-align:left; |
|||
border:1px solid #AAA; |
|||
background:#FFF none repeat scroll 0% 0%; |
|||
z-index:9999; |
|||
visibility:hidden; |
|||
position:absolute; |
|||
padding: 0px; |
|||
border-radius: 3px; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
div.intcaselink { |
|||
cursor: pointer; |
|||
padding: 3px 8px 3px 8px; |
|||
margin: 5px; |
|||
background:#EEE none repeat scroll 0% 0%; |
|||
border:1px solid #AAA; |
|||
border-radius: 3px; |
|||
} |
|||
|
|||
div.refpageimage { |
|||
position: absolute; |
|||
left: 0px; |
|||
top: 0px; |
|||
font-size: 0px; |
|||
width: 16px; |
|||
height: 16px; |
|||
cursor: pointer; |
|||
background-image: url(images/newwindow.gif); |
|||
background-repeat: no-repeat; |
|||
} |
|||
|
|||
div.annnoteimage { |
|||
position: absolute; |
|||
left: 0px; |
|||
top: 0px; |
|||
font-size: 0px; |
|||
/*width: 16px; |
|||
height: 12px;*/ |
|||
cursor: help; |
|||
/*background-image: url(images/note.gif);*/ |
|||
/*background-repeat: no-repeat;*/ |
|||
width: 13px; |
|||
height: 12px; |
|||
padding-top: 1px; |
|||
text-align: center; |
|||
background-color: #138CDD; |
|||
-moz-box-shadow: 1px 1px 3px #aaa; |
|||
-webkit-box-shadow: 1px 1px 3px #aaa; |
|||
box-shadow: 1px 1px 3px #aaa; |
|||
} |
|||
|
|||
div.annnoteline { |
|||
display: inline-block; |
|||
width: 9px; |
|||
height: 1px; |
|||
border-bottom: 1px solid white; |
|||
margin-top: 1px; |
|||
} |
|||
|
|||
div.annnotelabel { |
|||
/*position: absolute; |
|||
left: 0px; |
|||
top: 0px;*/ |
|||
font-family: Helvetica,Arial; |
|||
white-space: nowrap; |
|||
|
|||
padding-top: 1px; |
|||
background-color: #fff849; |
|||
font-size: 10px; |
|||
font-weight: bold; |
|||
line-height: 14px; |
|||
margin-right: 3px; |
|||
padding: 0px 4px; |
|||
color: #000; |
|||
|
|||
-moz-box-shadow: 1px 1px 3px #aaa; |
|||
-webkit-box-shadow: 1px 1px 3px #aaa; |
|||
box-shadow: 1px 1px 3px #aaa; |
|||
} |
|||
|
|||
div.annnote { |
|||
display: flex; |
|||
position: absolute; |
|||
cursor: help; |
|||
line-height: 14px; |
|||
} |
|||
|
|||
.annotation { |
|||
font-size: 12px; |
|||
padding-left: 2px; |
|||
margin-bottom: 5px; |
|||
} |
|||
|
|||
.annotationName { |
|||
/*font-size: 13px; |
|||
font-weight: bold; |
|||
margin-bottom: 3px; |
|||
white-space: nowrap;*/ |
|||
|
|||
font-family: 'Trebuchet MS'; |
|||
font-size: 14px; |
|||
font-weight: bold; |
|||
margin-bottom: 5px; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
.annotationValue { |
|||
font-family: Arial, Helvetica, Sans-Serif; |
|||
font-size: 12px; |
|||
color: #4a4a4a; |
|||
line-height: 21px; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.noteLink { |
|||
text-decoration: inherit; |
|||
color: inherit; |
|||
} |
|||
|
|||
.noteLink:hover { |
|||
background-color: white; |
|||
} |
|||
|
|||
/* this is a fix for the issue where dialogs jump around and takes the text-align from the body */ |
|||
.dialogFix { |
|||
position:absolute; |
|||
text-align:left; |
|||
border: 1px solid #8f949a; |
|||
} |
|||
|
|||
|
|||
@keyframes pulsate { |
|||
from { |
|||
box-shadow: 0 0 10px #15d6ba; |
|||
} |
|||
to { |
|||
box-shadow: 0 0 20px #15d6ba; |
|||
} |
|||
} |
|||
|
|||
@-webkit-keyframes pulsate { |
|||
from { |
|||
-webkit-box-shadow: 0 0 10px #15d6ba; |
|||
box-shadow: 0 0 10px #15d6ba; |
|||
} |
|||
to { |
|||
-webkit-box-shadow: 0 0 20px #15d6ba; |
|||
box-shadow: 0 0 20px #15d6ba; |
|||
} |
|||
} |
|||
|
|||
@-moz-keyframes pulsate { |
|||
from { |
|||
-moz-box-shadow: 0 0 10px #15d6ba; |
|||
box-shadow: 0 0 10px #15d6ba; |
|||
} |
|||
to { |
|||
-moz-box-shadow: 0 0 20px #15d6ba; |
|||
box-shadow: 0 0 20px #15d6ba; |
|||
} |
|||
} |
|||
|
|||
.legacyPulsateBorder { |
|||
/*border: 5px solid #15d6ba; |
|||
margin: -5px;*/ |
|||
-moz-box-shadow: 0 0 10px 3px #15d6ba; |
|||
box-shadow: 0 0 10px 3px #15d6ba; |
|||
} |
|||
|
|||
.pulsateBorder { |
|||
animation-name: pulsate; |
|||
animation-timing-function: ease-in-out; |
|||
animation-duration: 0.9s; |
|||
animation-iteration-count: infinite; |
|||
animation-direction: alternate; |
|||
|
|||
-webkit-animation-name: pulsate; |
|||
-webkit-animation-timing-function: ease-in-out; |
|||
-webkit-animation-duration: 0.9s; |
|||
-webkit-animation-iteration-count: infinite; |
|||
-webkit-animation-direction: alternate; |
|||
|
|||
-moz-animation-name: pulsate; |
|||
-moz-animation-timing-function: ease-in-out; |
|||
-moz-animation-duration: 0.9s; |
|||
-moz-animation-iteration-count: infinite; |
|||
-moz-animation-direction: alternate; |
|||
} |
|||
|
|||
.ax_default_hidden, .ax_default_unplaced{ |
|||
display: none; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
.widgetNoteSelected { |
|||
-moz-box-shadow: 0 0 10px 3px #138CDD; |
|||
box-shadow: 0 0 10px 3px #138CDD; |
|||
/*-moz-box-shadow: 0 0 20px #3915d6; |
|||
box-shadow: 0 0 20px #3915d6;*/ |
|||
/*border: 3px solid #3915d6;*/ |
|||
/*margin: -3px;*/ |
|||
} |
|||
|
|||
|
|||
.singleImg { |
|||
display: none; |
|||
visibility: hidden; |
|||
} |
|||
|
|||
#ios-safari { |
|||
overflow: auto; |
|||
-webkit-overflow-scrolling: touch; |
|||
} |
|||
|
|||
#ios-safari-html { |
|||
display: block; |
|||
overflow: auto; |
|||
-webkit-overflow-scrolling: touch; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
right: 0; |
|||
bottom: 0; |
|||
} |
|||
|
|||
#ios-safari-fixed { |
|||
position: absolute; |
|||
pointer-events: none; |
|||
width: initial; |
|||
} |
|||
|
|||
#ios-safari-fixed div { |
|||
pointer-events: auto; |
|||
} |
@ -0,0 +1,15 @@ |
|||
.form-control-dark { |
|||
border-color: var(--bs-gray); |
|||
} |
|||
.form-control-dark:focus { |
|||
border-color: #fff; |
|||
box-shadow: 0 0 0 .25rem rgba(255, 255, 255, .25); |
|||
} |
|||
|
|||
.text-small { |
|||
font-size: 85%; |
|||
} |
|||
|
|||
.dropdown-toggle { |
|||
outline: 0; |
|||
} |
@ -0,0 +1,25 @@ |
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
|||
<html> |
|||
<head> |
|||
<title></title> |
|||
</head> |
|||
<body> |
|||
<p> |
|||
<img border="0" src="note.gif" width="1" height="1"> |
|||
<img border="0" src="newwindow.gif" width="1" height="1"> |
|||
<img border="0" src="ui-bg_flat_0_aaaaaa_40x100.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_glass_55_fbf9ee_1x400.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_glass_65_ffffff_1x400.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_glass_75_dadada_1x400.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_glass_75_e6e6e6_1x400.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_glass_75_ffffff_1x400.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_highlight-soft_75_cccccc_1x100.png" width="1" height="1"> |
|||
<img border="0" src="ui-bg_inset-soft_95_fef1ec_1x100.png" width="1" height="1"> |
|||
<img border="0" src="ui-icons_222222_256x240.png" width="1" height="1"> |
|||
<img border="0" src="ui-icons_2e83ff_256x240.png" width="1" height="1"> |
|||
<img border="0" src="ui-icons_454545_256x240.png" width="1" height="1"> |
|||
<img border="0" src="ui-icons_888888_256x240.png" width="1" height="1"> |
|||
<img border="0" src="ui-icons_cd0a0a_256x240.png" width="1" height="1"> |
|||
</p> |
|||
</body> |
|||
</html> |
After Width: | Height: | Size: 112 B |
After Width: | Height: | Size: 98 B |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 180 B |
After Width: | Height: | Size: 120 B |
After Width: | Height: | Size: 105 B |
After Width: | Height: | Size: 111 B |
After Width: | Height: | Size: 110 B |
After Width: | Height: | Size: 107 B |
After Width: | Height: | Size: 101 B |
After Width: | Height: | Size: 123 B |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
After Width: | Height: | Size: 4.3 KiB |
@ -0,0 +1,412 @@ |
|||
/* |
|||
* jQuery UI CSS Framework |
|||
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) |
|||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. |
|||
*/ |
|||
|
|||
/* Layout helpers |
|||
----------------------------------*/ |
|||
.ui-helper-hidden { display: none; } |
|||
.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } |
|||
.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } |
|||
.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } |
|||
.ui-helper-clearfix { display: inline-block; } |
|||
/* required comment for clearfix to work in Opera \*/ |
|||
* html .ui-helper-clearfix { height:1%; } |
|||
.ui-helper-clearfix { display:block; } |
|||
/* end clearfix */ |
|||
.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } |
|||
|
|||
|
|||
/* Interaction Cues |
|||
----------------------------------*/ |
|||
.ui-state-disabled { cursor: default !important; } |
|||
|
|||
|
|||
/* Icons |
|||
----------------------------------*/ |
|||
|
|||
/* states and images */ |
|||
.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } |
|||
|
|||
|
|||
/* Misc visuals |
|||
----------------------------------*/ |
|||
|
|||
/* Overlays */ |
|||
.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }/* Accordion |
|||
----------------------------------*/ |
|||
.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } |
|||
.ui-accordion .ui-accordion-li-fix { display: inline; } |
|||
.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } |
|||
.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em 2.2em; } |
|||
.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } |
|||
.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; } |
|||
.ui-accordion .ui-accordion-content-active { display: block; } |
|||
|
|||
/* Datepicker |
|||
----------------------------------*/ |
|||
.ui-datepicker { width: 17em; padding: .2em .2em 0; } |
|||
.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } |
|||
.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } |
|||
.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } |
|||
.ui-datepicker .ui-datepicker-prev { left:2px; } |
|||
.ui-datepicker .ui-datepicker-next { right:2px; } |
|||
.ui-datepicker .ui-datepicker-prev-hover { left:1px; } |
|||
.ui-datepicker .ui-datepicker-next-hover { right:1px; } |
|||
.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } |
|||
.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } |
|||
.ui-datepicker .ui-datepicker-title select { float:left; font-size:1em; margin:1px 0; } |
|||
.ui-datepicker select.ui-datepicker-month-year {width: 100%;} |
|||
.ui-datepicker select.ui-datepicker-month, |
|||
.ui-datepicker select.ui-datepicker-year { width: 49%;} |
|||
.ui-datepicker .ui-datepicker-title select.ui-datepicker-year { float: right; } |
|||
.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } |
|||
.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } |
|||
.ui-datepicker td { border: 0; padding: 1px; } |
|||
.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } |
|||
.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } |
|||
.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } |
|||
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } |
|||
|
|||
/* with multiple calendars */ |
|||
.ui-datepicker.ui-datepicker-multi { width:auto; } |
|||
.ui-datepicker-multi .ui-datepicker-group { float:left; } |
|||
.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } |
|||
.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } |
|||
.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } |
|||
.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } |
|||
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } |
|||
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } |
|||
.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } |
|||
.ui-datepicker-row-break { clear:both; width:100%; } |
|||
|
|||
/* RTL support */ |
|||
.ui-datepicker-rtl { direction: rtl; } |
|||
.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } |
|||
.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } |
|||
.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } |
|||
.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } |
|||
.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } |
|||
.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } |
|||
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } |
|||
.ui-datepicker-rtl .ui-datepicker-group { float:right; } |
|||
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } |
|||
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } |
|||
|
|||
/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ |
|||
.ui-datepicker-cover { |
|||
display: none; /*sorry for IE5*/ |
|||
display/**/: block; /*sorry for IE5*/ |
|||
position: absolute; /*must have*/ |
|||
z-index: -1; /*must have*/ |
|||
filter: mask(); /*must have*/ |
|||
top: -4px; /*must have*/ |
|||
left: -4px; /*must have*/ |
|||
width: 200px; /*must have*/ |
|||
height: 200px; /*must have*/ |
|||
} |
|||
|
|||
/* Dialog |
|||
----------------------------------*/ |
|||
.ui-dialog { position: relative; padding: 0px; width: 300px;} |
|||
.ui-dialog .ui-dialog-titlebar { padding: .3em .3em .1em .8em; font-size:.7em; position: relative; background-image: none; } |
|||
.ui-dialog .ui-dialog-title { float: left; margin: .1em 0 .2em; |
|||
font-family: 'Trebuchet MS'; |
|||
font-size: 15px; |
|||
font-weight: normal; |
|||
color: #ffffff;} |
|||
.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .1em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } |
|||
.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } |
|||
.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { /*padding: 0;*/ } |
|||
.ui-dialog .ui-dialog-content { border: 0; padding: .5em .2em; background: none; overflow: auto; zoom: 1; background-color: #ffffff;} |
|||
.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } |
|||
.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; } |
|||
.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } |
|||
.ui-draggable .ui-dialog-titlebar { cursor: move; background-color: #8f949a; border-bottom: 1px solid #d9d9d9;} |
|||
|
|||
/* Progressbar |
|||
----------------------------------*/ |
|||
.ui-progressbar { height:2em; text-align: left; } |
|||
.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* Resizable |
|||
----------------------------------*/ |
|||
.ui-resizable { position: relative;} |
|||
.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} |
|||
.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } |
|||
.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0px; } |
|||
.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0px; } |
|||
.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0px; height: 100%; } |
|||
.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0px; height: 100%; } |
|||
.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } |
|||
.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } |
|||
.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } |
|||
.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Slider |
|||
----------------------------------*/ |
|||
.ui-slider { position: relative; text-align: left; } |
|||
.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } |
|||
.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; } |
|||
|
|||
.ui-slider-horizontal { height: .8em; } |
|||
.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } |
|||
.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } |
|||
.ui-slider-horizontal .ui-slider-range-min { left: 0; } |
|||
.ui-slider-horizontal .ui-slider-range-max { right: 0; } |
|||
|
|||
.ui-slider-vertical { width: .8em; height: 100px; } |
|||
.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } |
|||
.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } |
|||
.ui-slider-vertical .ui-slider-range-min { bottom: 0; } |
|||
.ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs |
|||
----------------------------------*/ |
|||
.ui-tabs { padding: .2em; zoom: 1; } |
|||
.ui-tabs .ui-tabs-nav { list-style: none; position: relative; padding: .2em .2em 0; } |
|||
.ui-tabs .ui-tabs-nav li { position: relative; float: left; border-bottom-width: 0 !important; margin: 0 .2em -1px 0; padding: 0; } |
|||
.ui-tabs .ui-tabs-nav li a { float: left; text-decoration: none; padding: .5em 1em; } |
|||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected { padding-bottom: 1px; border-bottom-width: 0; } |
|||
.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } |
|||
.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ |
|||
.ui-tabs .ui-tabs-panel { padding: 1em 1.4em; display: block; border-width: 0; background: none; } |
|||
.ui-tabs .ui-tabs-hide { display: none !important; } |
|||
/* |
|||
* jQuery UI CSS Framework |
|||
* Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about) |
|||
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses. |
|||
* To view and modify this theme, visit http://jqueryui.com/themeroller/ |
|||
*/ |
|||
|
|||
|
|||
/* Component containers |
|||
----------------------------------*/ |
|||
.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } |
|||
.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } |
|||
.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_glass_75_ffffff_1x400.png)/*{bgImgUrlContent}*/ 0/*{bgContentXPos}*/ 0/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } |
|||
.ui-widget-content a { /*color: #222222*//*{fcContent}*/; } |
|||
.ui-widget-header { border: none /*1px solid #aaaaaa*//*{borderColorHeader}*/; background: #D3D3D3/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 0/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #000000/*{fcHeader}*/; font-weight: bold; } |
|||
.ui-widget-header a { color: #222222/*{fcHeader}*/; } |
|||
|
|||
/* Interaction states |
|||
----------------------------------*/ |
|||
.ui-state-default, .ui-widget-content .ui-state-default { border: none /*1px solid #d3d3d3*//*{borderColorDefault}*/; /*background: #e6e6e6*//*{bgColorDefault}*/ /*url(images/ui-bg_glass_75_e6e6e6_1x400.png)*//*{bgImgUrlDefault}*/ /*0*//*{bgDefaultXPos}*/ /*50%*//*{bgDefaultYPos}*/ /*repeat-x*//*{bgDefaultRepeat}*/ font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; outline: none; } |
|||
.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; outline: none; } |
|||
.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus { border: none /*1px solid #999999*//*{borderColorHover}*/; /*background: #dadada*//*{bgColorHover}*/ /*url(images/ui-bg_glass_75_dadada_1x400.png)*//*{bgImgUrlHover}*/ /*0*//*{bgHoverXPos}*/ /*50%*//*{bgHoverYPos}*/ /*repeat-x*//*{bgHoverRepeat}*/ font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; outline: none; } |
|||
.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; outline: none; } |
|||
.ui-state-active, .ui-widget-content .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 0/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; outline: none; } |
|||
.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; outline: none; text-decoration: none; } |
|||
|
|||
/* Interaction Cues |
|||
----------------------------------*/ |
|||
.ui-state-highlight, .ui-widget-content .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 0/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } |
|||
.ui-state-highlight a, .ui-widget-content .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } |
|||
.ui-state-error, .ui-widget-content .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_inset-soft_95_fef1ec_1x100.png)/*{bgImgUrlError}*/ 0/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } |
|||
.ui-state-error a, .ui-widget-content .ui-state-error a { color: #363636/*{fcError}*/; } |
|||
.ui-state-error-text, .ui-widget-content .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } |
|||
.ui-state-disabled, .ui-widget-content .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } |
|||
.ui-priority-primary, .ui-widget-content .ui-priority-primary { font-weight: bold; } |
|||
.ui-priority-secondary, .ui-widget-content .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } |
|||
|
|||
/* Icons |
|||
----------------------------------*/ |
|||
|
|||
/* states and images */ |
|||
.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } |
|||
.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } |
|||
.ui-widget-header .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHeader}*/; } |
|||
.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } |
|||
.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHover}*/; } |
|||
.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } |
|||
.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } |
|||
.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } |
|||
|
|||
/* positioning */ |
|||
.ui-icon-carat-1-n { background-position: 0 0; } |
|||
.ui-icon-carat-1-ne { background-position: -16px 0; } |
|||
.ui-icon-carat-1-e { background-position: -32px 0; } |
|||
.ui-icon-carat-1-se { background-position: -48px 0; } |
|||
.ui-icon-carat-1-s { background-position: -64px 0; } |
|||
.ui-icon-carat-1-sw { background-position: -80px 0; } |
|||
.ui-icon-carat-1-w { background-position: -96px 0; } |
|||
.ui-icon-carat-1-nw { background-position: -112px 0; } |
|||
.ui-icon-carat-2-n-s { background-position: -128px 0; } |
|||
.ui-icon-carat-2-e-w { background-position: -144px 0; } |
|||
.ui-icon-triangle-1-n { background-position: 0 -16px; } |
|||
.ui-icon-triangle-1-ne { background-position: -16px -16px; } |
|||
.ui-icon-triangle-1-e { background-position: -32px -16px; } |
|||
.ui-icon-triangle-1-se { background-position: -48px -16px; } |
|||
.ui-icon-triangle-1-s { background-position: -64px -16px; } |
|||
.ui-icon-triangle-1-sw { background-position: -80px -16px; } |
|||
.ui-icon-triangle-1-w { background-position: -96px -16px; } |
|||
.ui-icon-triangle-1-nw { background-position: -112px -16px; } |
|||
.ui-icon-triangle-2-n-s { background-position: -128px -16px; } |
|||
.ui-icon-triangle-2-e-w { background-position: -144px -16px; } |
|||
.ui-icon-arrow-1-n { background-position: 0 -32px; } |
|||
.ui-icon-arrow-1-ne { background-position: -16px -32px; } |
|||
.ui-icon-arrow-1-e { background-position: -32px -32px; } |
|||
.ui-icon-arrow-1-se { background-position: -48px -32px; } |
|||
.ui-icon-arrow-1-s { background-position: -64px -32px; } |
|||
.ui-icon-arrow-1-sw { background-position: -80px -32px; } |
|||
.ui-icon-arrow-1-w { background-position: -96px -32px; } |
|||
.ui-icon-arrow-1-nw { background-position: -112px -32px; } |
|||
.ui-icon-arrow-2-n-s { background-position: -128px -32px; } |
|||
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } |
|||
.ui-icon-arrow-2-e-w { background-position: -160px -32px; } |
|||
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } |
|||
.ui-icon-arrowstop-1-n { background-position: -192px -32px; } |
|||
.ui-icon-arrowstop-1-e { background-position: -208px -32px; } |
|||
.ui-icon-arrowstop-1-s { background-position: -224px -32px; } |
|||
.ui-icon-arrowstop-1-w { background-position: -240px -32px; } |
|||
.ui-icon-arrowthick-1-n { background-position: 0 -48px; } |
|||
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } |
|||
.ui-icon-arrowthick-1-e { background-position: -32px -48px; } |
|||
.ui-icon-arrowthick-1-se { background-position: -48px -48px; } |
|||
.ui-icon-arrowthick-1-s { background-position: -64px -48px; } |
|||
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } |
|||
.ui-icon-arrowthick-1-w { background-position: -96px -48px; } |
|||
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } |
|||
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } |
|||
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } |
|||
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } |
|||
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } |
|||
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } |
|||
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } |
|||
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } |
|||
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } |
|||
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } |
|||
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } |
|||
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } |
|||
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } |
|||
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } |
|||
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } |
|||
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } |
|||
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } |
|||
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } |
|||
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } |
|||
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } |
|||
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } |
|||
.ui-icon-arrow-4 { background-position: 0 -80px; } |
|||
.ui-icon-arrow-4-diag { background-position: -16px -80px; } |
|||
.ui-icon-extlink { background-position: -32px -80px; } |
|||
.ui-icon-newwin { background-position: -48px -80px; } |
|||
.ui-icon-refresh { background-position: -64px -80px; } |
|||
.ui-icon-shuffle { background-position: -80px -80px; } |
|||
.ui-icon-transfer-e-w { background-position: -96px -80px; } |
|||
.ui-icon-transferthick-e-w { background-position: -112px -80px; } |
|||
.ui-icon-folder-collapsed { background-position: 0 -96px; } |
|||
.ui-icon-folder-open { background-position: -16px -96px; } |
|||
.ui-icon-document { background-position: -32px -96px; } |
|||
.ui-icon-document-b { background-position: -48px -96px; } |
|||
.ui-icon-note { background-position: -64px -96px; } |
|||
.ui-icon-mail-closed { background-position: -80px -96px; } |
|||
.ui-icon-mail-open { background-position: -96px -96px; } |
|||
.ui-icon-suitcase { background-position: -112px -96px; } |
|||
.ui-icon-comment { background-position: -128px -96px; } |
|||
.ui-icon-person { background-position: -144px -96px; } |
|||
.ui-icon-print { background-position: -160px -96px; } |
|||
.ui-icon-trash { background-position: -176px -96px; } |
|||
.ui-icon-locked { background-position: -192px -96px; } |
|||
.ui-icon-unlocked { background-position: -208px -96px; } |
|||
.ui-icon-bookmark { background-position: -224px -96px; } |
|||
.ui-icon-tag { background-position: -240px -96px; } |
|||
.ui-icon-home { background-position: 0 -112px; } |
|||
.ui-icon-flag { background-position: -16px -112px; } |
|||
.ui-icon-calendar { background-position: -32px -112px; } |
|||
.ui-icon-cart { background-position: -48px -112px; } |
|||
.ui-icon-pencil { background-position: -64px -112px; } |
|||
.ui-icon-clock { background-position: -80px -112px; } |
|||
.ui-icon-disk { background-position: -96px -112px; } |
|||
.ui-icon-calculator { background-position: -112px -112px; } |
|||
.ui-icon-zoomin { background-position: -128px -112px; } |
|||
.ui-icon-zoomout { background-position: -144px -112px; } |
|||
.ui-icon-search { background-position: -160px -112px; } |
|||
.ui-icon-wrench { background-position: -176px -112px; } |
|||
.ui-icon-gear { background-position: -192px -112px; } |
|||
.ui-icon-heart { background-position: -208px -112px; } |
|||
.ui-icon-star { background-position: -224px -112px; } |
|||
.ui-icon-link { background-position: -240px -112px; } |
|||
.ui-icon-cancel { background-position: 0 -128px; } |
|||
.ui-icon-plus { background-position: -16px -128px; } |
|||
.ui-icon-plusthick { background-position: -32px -128px; } |
|||
.ui-icon-minus { background-position: -48px -128px; } |
|||
.ui-icon-minusthick { background-position: -64px -128px; } |
|||
.ui-icon-close { background-position: -80px -128px; } |
|||
.ui-icon-closethick { background-position: -96px -128px; } |
|||
.ui-icon-key { background-position: -112px -128px; } |
|||
.ui-icon-lightbulb { background-position: -128px -128px; } |
|||
.ui-icon-scissors { background-position: -144px -128px; } |
|||
.ui-icon-clipboard { background-position: -160px -128px; } |
|||
.ui-icon-copy { background-position: -176px -128px; } |
|||
.ui-icon-contact { background-position: -192px -128px; } |
|||
.ui-icon-image { background-position: -208px -128px; } |
|||
.ui-icon-video { background-position: -224px -128px; } |
|||
.ui-icon-script { background-position: -240px -128px; } |
|||
.ui-icon-alert { background-position: 0 -144px; } |
|||
.ui-icon-info { background-position: -16px -144px; } |
|||
.ui-icon-notice { background-position: -32px -144px; } |
|||
.ui-icon-help { background-position: -48px -144px; } |
|||
.ui-icon-check { background-position: -64px -144px; } |
|||
.ui-icon-bullet { background-position: -80px -144px; } |
|||
.ui-icon-radio-off { background-position: -96px -144px; } |
|||
.ui-icon-radio-on { background-position: -112px -144px; } |
|||
.ui-icon-pin-w { background-position: -128px -144px; } |
|||
.ui-icon-pin-s { background-position: -144px -144px; } |
|||
.ui-icon-play { background-position: 0 -160px; } |
|||
.ui-icon-pause { background-position: -16px -160px; } |
|||
.ui-icon-seek-next { background-position: -32px -160px; } |
|||
.ui-icon-seek-prev { background-position: -48px -160px; } |
|||
.ui-icon-seek-end { background-position: -64px -160px; } |
|||
.ui-icon-seek-first { background-position: -80px -160px; } |
|||
.ui-icon-stop { background-position: -96px -160px; } |
|||
.ui-icon-eject { background-position: -112px -160px; } |
|||
.ui-icon-volume-off { background-position: -128px -160px; } |
|||
.ui-icon-volume-on { background-position: -144px -160px; } |
|||
.ui-icon-power { background-position: 0 -176px; } |
|||
.ui-icon-signal-diag { background-position: -16px -176px; } |
|||
.ui-icon-signal { background-position: -32px -176px; } |
|||
.ui-icon-battery-0 { background-position: -48px -176px; } |
|||
.ui-icon-battery-1 { background-position: -64px -176px; } |
|||
.ui-icon-battery-2 { background-position: -80px -176px; } |
|||
.ui-icon-battery-3 { background-position: -96px -176px; } |
|||
.ui-icon-circle-plus { background-position: 0 -192px; } |
|||
.ui-icon-circle-minus { background-position: -16px -192px; } |
|||
.ui-icon-circle-close { background-position: -32px -192px; } |
|||
.ui-icon-circle-triangle-e { background-position: -48px -192px; } |
|||
.ui-icon-circle-triangle-s { background-position: -64px -192px; } |
|||
.ui-icon-circle-triangle-w { background-position: -80px -192px; } |
|||
.ui-icon-circle-triangle-n { background-position: -96px -192px; } |
|||
.ui-icon-circle-arrow-e { background-position: -112px -192px; } |
|||
.ui-icon-circle-arrow-s { background-position: -128px -192px; } |
|||
.ui-icon-circle-arrow-w { background-position: -144px -192px; } |
|||
.ui-icon-circle-arrow-n { background-position: -160px -192px; } |
|||
.ui-icon-circle-zoomin { background-position: -176px -192px; } |
|||
.ui-icon-circle-zoomout { background-position: -192px -192px; } |
|||
.ui-icon-circle-check { background-position: -208px -192px; } |
|||
.ui-icon-circlesmall-plus { background-position: 0 -208px; } |
|||
.ui-icon-circlesmall-minus { background-position: -16px -208px; } |
|||
.ui-icon-circlesmall-close { background-position: -32px -208px; } |
|||
.ui-icon-squaresmall-plus { background-position: -48px -208px; } |
|||
.ui-icon-squaresmall-minus { background-position: -64px -208px; } |
|||
.ui-icon-squaresmall-close { background-position: -80px -208px; } |
|||
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } |
|||
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } |
|||
.ui-icon-grip-solid-vertical { background-position: -32px -224px; } |
|||
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } |
|||
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } |
|||
.ui-icon-grip-diagonal-se { background-position: -80px -224px; } |
|||
|
|||
|
|||
/* Misc visuals |
|||
----------------------------------*/ |
|||
|
|||
/* Corner radius */ |
|||
.ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-top { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-bottom { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-right { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-left { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; } |
|||
.ui-corner-all { -moz-border-radius: 0px/*{cornerRadius}*/; -webkit-border-radius: 0px/*{cornerRadius}*/; } |
|||
|
|||
/* Overlays */ |
|||
.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ none/*{bgImgUrlOverlay}*/ 0/*{bgOverlayXPos}*/ 0/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } |
|||
.ui-widget-shadow { margin: -4px/*{offsetTopShadow}*/ 0 0 -4px/*{offsetLeftShadow}*/; padding: 4px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ none/*{bgImgUrlShadow}*/ 0/*{bgShadowXPos}*/ 0/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .35;filter:Alpha(Opacity=35)/*{opacityShadow}*/; -moz-border-radius: 4px/*{cornerRadiusShadow}*/; -webkit-border-radius: 4px/*{cornerRadiusShadow}*/; } |
@ -0,0 +1,12 @@ |
|||
@font-face { |
|||
font-family: 'Source Sans Pro'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('previewfonts/SourceSansPro-Regular.woff2') format('woff2'), url('previewfonts/SourceSansPro-Regular.woff') format('woff'); |
|||
} |
|||
@font-face { |
|||
font-family: 'Source Sans Pro Semibold'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), url('previewfonts/SourceSansPro-Semibold.woff2') format('woff2'), url('previewfonts/SourceSansPro-Semibold.woff') format('woff'); |
|||
} |