Ajout d'une extension

This commit is contained in:
Gauvain Boiché
2020-04-04 18:27:27 +02:00
parent c3ed8cc1c1
commit 3a964fe237
387 changed files with 58921 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
<div data-shop-carousel-data="true"
data-arrows="{{ SHOP_CAROUSEL_ARROWS ? 'true' : 'false' }}"
data-dots="{{ SHOP_CAROUSEL_DOTS ? 'true' : 'false' }}"
data-fade="{{ SHOP_CAROUSEL_FADE ? 'true' : 'false' }}"
data-autoplay="{{ SHOP_CAROUSEL_PLAY ? 'true' : 'false' }}"
data-autoplay-speed="{{ SHOP_CAROUSEL_PLAY_SPEED }}"
data-speed="{{ SHOP_CAROUSEL_SPEED }}"
></div>

View File

@@ -0,0 +1,235 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block main %}
<div class="aps-row">
<div class="aps-col s12">
<div class="shop-title">
<h1 class="aps-no-mar shop-text-darkgray">{{ TITLE }}</h1>
</div>
</div>
{% if not S_ACTIVE %}
<div class="aps-col s12">
<div class="aps-button-red">
<strong>{{ lang('ASS_CATEGORY_INACTIVE') }}</strong>
</div>
</div>
{% endif %}
{% if DESC_HTML %}
{% if ICON %}
<div class="aps-col s2">
<div class="aps-panel aps-center">
<div class="aps-panel-content">
<i class="fa {{ ICON }} fa-fw fa-5x icon-aps-blue" aria-hidden="true"></i>
</div>
</div>
</div>
{% endif %}
<div class="aps-col s{{ ICON ? 10 : 12 }}">
<div class="aps-panel">
<div class="aps-panel-content content">
{{ DESC_HTML }}
</div>
</div>
</div>
{% endif %}
</div>
<div class="aps-row">
{% for item in ass_items %}
<div class="aps-col s6 m{{ T_PANEL_SIZE }}">
{{ include('@phpbbstudio_ass/ass_item_panel.html') }}
</div>
{% else %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content aps-center">
<strong class="error">{{ lang('ASS_ITEMS_NONE') }}</strong>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="aps-row">
<div class="aps-col s2">
<form class="aps-form" method="get" action="{{ U_VIEW }}">
<div class="shop-block dropdown-container dropdown-container-left dropdown-up dropdown-right dropdown-button-control">
<span class="shop-block aps-button-blue aps-center dropdown-trigger" title="{{ lang('SORT_OPTIONS') }}">
<i class="icon fa-sort-amount-asc fa-fw" aria-hidden="true"></i>
</span>
<div class="dropdown hidden shop-category-dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<fieldset>
<div class="aps-row">
<div class="aps-col s4">
<label for="title">
{{ lang('ASS_ITEM_TITLE') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<input class="full" id="title" name="title" type="text" value="{{ SORT_TITLE }}">
</div>
<div class="aps-col s4">
<label for="type">
{{ lang('ASS_ITEM_TYPE') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<select class="full" id="type" name="type">
{% for value, option in SORT_TYPE_ARRAY %}
<option value="{{ value }}"{{ value == SORT_TYPE ? ' selected' }}>{{ lang(option) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s4">
<label for="above">
{{ lang('ASS_PRICE_ABOVE') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<input class="full" id="above" name="above" type="number" step="{{ aps_step() }}" value="{{ SORT_ABOVE }}">
</div>
<div class="aps-col s4">
<label for="below">
{{ lang('ASS_PRICE_BELOW') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<input class="full" id="below" name="below" type="number" step="{{ aps_step() }}" value="{{ SORT_BELOW }}">
</div>
<div class="aps-col s4">
<label for="sale">
{{ lang('ASS_ON_SALE') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8 aps-center">
<div class="aps-row">
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" id="sale" name="sale" type="radio" value="1"{{ SORT_SALE == 1 ? ' checked' }}>
<span class="aps-button-green shop-block"><i class="icon fa-check fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" name="sale" type="radio" value="-1"{{ SORT_SALE == -1 ? ' checked' }}>
<span class="aps-button-red shop-block"><i class="icon fa-times fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" name="sale" type="radio" value="0"{{ not SORT_SALE ? ' checked' }}>
<span class="aps-button-blue shop-block"><i class="icon fa-minus fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
</div>
</div>
<div class="aps-col s4 aps-no-mar-bot">
<label for="gift">
{{ lang('ASS_GIFTABLE') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8 aps-no-mar-bot aps-center">
<div class="aps-row">
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" id="gift" name="gift" type="radio" value="1"{{ SORT_GIFT == 1 ? ' checked' }}>
<span class="aps-button-green shop-block"><i class="icon fa-check fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" name="gift" type="radio" value="-1"{{ SORT_GIFT == -1 ? ' checked' }}>
<span class="aps-button-red shop-block"><i class="icon fa-times fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
<label class="aps-col s4 aps-no-mar shop-no-pad-left">
<input class="aps-bool" name="gift" type="radio" value="0"{{ not SORT_GIFT ? ' checked' }}>
<span class="aps-button-blue shop-block"><i class="icon fa-minus fa-fw shop-text-indent-3" aria-hidden="true"></i></span>
</label>
</div>
</div>
<div class="aps-col s12 aps-no-mar">
<hr class="dashed">
</div>
<div class="aps-col s4">
<label for="display">
{{ lang('DISPLAY') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<select class="full" id="display" name="display">
{% for value, option in SORT_DAYS_ARRAY %}
<option value="{{ value }}"{{ value == SORT_DAYS ? ' selected' }}>{{ lang(option) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s4">
<label for="sort">
{{ lang('SORT_BY') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<select class="full" id="sort" name="sort">
{% for value, option in SORT_SORT_ARRAY %}
<option value="{{ value }}"{{ value == SORT_SORT ? ' selected' }}>{{ lang(option.title) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s4 aps-no-mar-bot">
<label for="direction">
{{ lang('SORT_DIRECTION') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8 aps-no-mar-bot">
<select class="full" id="direction" name="direction">
{% for value, option in SORT_DIR_ARRAY %}
<option value="{{ value }}"{{ value == SORT_DIR ? ' selected' }}>{{ lang(option.title) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s12 aps-center aps-no-mar-bot">
<hr class="dashed">
<input class="aps-button-green" type="submit" value="{{ lang('GO') }}">
</div>
</div>
</fieldset>
</div>
</div>
</div>
</form>
</div>
<div class="aps-col s8">
{% if shop_pagination|length %}
{{ include('@phpbbstudio_ass/ass_pagination.html') }}
{% endif %}
</div>
<div class="aps-col s2">
<div class="aps-center shop-pagination-text">
{{ ITEMS_COUNT }}
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,3 @@
<form action="{{ S_CONFIRM_ACTION }}" method="post">
<p>{{ MESSAGE_TEXT }}</p>
</form>

View File

@@ -0,0 +1,70 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDECSS '@phpbbstudio_ass/ass_exception.css' %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block main %}
<div class="shop-exception">
<div class="aps-panel shop-exception-title">
<div class="aps-panel-content">
<h1>{{ lang('ASS_ERROR_TITLE', aps_name()) ~ lang('ELLIPSIS') }}</h1>
</div>
<div class="shop-exception-code">
<span>{{ EXCEPTION_CODE }}</span>
</div>
</div>
<div class="aps-panel shop-exception-text">
<div class="aps-panel-content">
<p class="aps-no-mar">{{ EXCEPTION_TEXT }}</p>
</div>
{% if EXCEPTION_DESC %}
<div class="aps-panel-content">
<p class="aps-no-mar">{{ EXCEPTION_DESC }}</p>
</div>
{% endif %}
<div class="aps-panel-content aps-center">
<a class="aps-button-blue" href="{{ U_INDEX }}">{{ lang('FORUM_INDEX') }}</a>
<a class="aps-button-blue" href="{{ path('phpbbstudio_ass_shop') }}">{{ lang('ASS_SHOP_INDEX') }}</a>
</div>
</div>
<div class="shop-exception-pot">{{ include('@phpbbstudio_ass/images/gold-pot.svg') }}</div>
<div class="shop-exception-rainbow">{% for i in 1..5 %}<span></span>{% endfor %}</div>
<div class="shop-exception-tree">{{ include('@phpbbstudio_ass/images/tree.svg') }}</div>
<div class="shop-exception-trees">{{ include('@phpbbstudio_ass/images/trees.svg') }}</div>
<div class="shop-exception-mountain">{{ include('@phpbbstudio_ass/images/mountain-summit.svg') }}</div>
<div class="shop-exception-mountain-left">{{ include('@phpbbstudio_ass/images/mountain-summit.svg') }}</div>
<div class="shop-exception-mountain-right">{{ include('@phpbbstudio_ass/images/rising-graph.svg') }}</div>
<i class="icon fa-male fa-fw"></i>
<i class="icon fa-fw shop-icons"></i>
<i class="icon fa-comment fa-fw fa-flip-horizontal"></i>
<i class="icon fa-map-signs fa-fw"></i>
<span class="fa-trees left">
<i class="icon fa-tree fa-fw"></i>
<i class="icon fa-tree fa-fw"></i>
<i class="icon fa-tree fa-fw"></i>
</span>
<span class="fa-trees">
<i class="icon fa-tree fa-fw"></i>
<i class="icon fa-tree fa-fw"></i>
</span>
<span class="fa-trees right">
<i class="icon fa-tree fa-fw"></i>
<i class="icon fa-tree fa-fw"></i>
<i class="icon fa-tree fa-fw"></i>
</span>
</div>
{% endblock %}

View File

@@ -0,0 +1,156 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% endblock %}
{% block main %}
<div class="shop-title shop-mar-bot">
<h1 class="aps-no-mar shop-text-darkgray">{{ lang('ASS_HISTORY') }}</h1>
</div>
{% for log in ass_logs %}
<div class="aps-panel shop-mar-bot">
<div class="aps-panel-header">
<div class="aps-row">
<div class="aps-col s8 aps-no-mar">
{% if log.U_CATEGORY %}
<a class="shop-text-darkgray shop-panel-header-link" href="{{ log.U_CATEGORY }}" data-item-title="{{ log.CATEGORY_TITLE }}">
{{ log.CATEGORY_TITLE }}
</a>
{% else %}
<span class="shop-text-darkgray shop-panel-header-link">{{ log.CATEGORY_TITLE }}</span>
{% endif %}
<i class="icon fa-angle-right fa-fw icon-aps-blue" aria-hidden="true"></i>
{% if log.U_ITEM %}
<a class="shop-text-darkgray shop-panel-header-link shop-bold" href="{{ log.U_ITEM }}" data-item-title="{{ log.ITEM_TITLE }}">
{{ log.ITEM_TITLE }}
</a>
{% else %}
<span class="shop-text-darkgray shop-panel-header-link shop-bold">
{{ log.ITEM_TITLE }}
</span>
{% endif %}
</div>
<div class="aps-col s4 aps-no-mar shop-text-right shop-text-lightgray">
{{ log.LOG_TIME }}
</div>
</div>
</div>
<div class="aps-panel-content">
<div class="aps-row">
<div class="aps-col s12 m6 aps-no-mar shop-darken-span">
{% if log.S_PURCHASE %}
{% if log.RECIPIENT %}
{% if log.S_GIFT_RECEIVED %}
<span>{{ lang('ASS_LOG_ITEM_RECEIVED', log.USER) }}</span>
{% else %}
<span>{{ lang('ASS_LOG_ITEM_GIFTED', log.RECIPIENT) }}</span>
{% endif %}
{% else %}
<span>{{ lang('ASS_LOG_ITEM_PURCHASED') }}</span>
{% endif %}
{% else %}
<span>{{ lang('ASS_LOG_ITEM_USED') ~ lang('COLON') }}</span> {{ log.LOG_ACTION }}
{% endif %}
</div>
<div class="aps-col s4 m2 aps-no-mar aps-center">{{ aps_display(log.POINTS_OLD, false) }}</div>
<div class="aps-col s4 m2 aps-no-mar aps-center{{ log.POINTS_SUM ? ' aps-negative' }}">{{ aps_display(log.POINTS_SUM, false) }}</div>
<div class="aps-col s4 m2 aps-no-mar aps-center">{{ aps_display(log.POINTS_NEW, false) }}</div>
</div>
</div>
</div>
{% else %}
<div class="aps-panel aps-center">
<div class="aps-panel-content">
<p class="aps-no-mar shop-padding error">{{ lang('ASS_HISTORY_EMPTY') ~ lang('ELLIPSIS') }}</p>
</div>
<div class="aps-panel-footer">
<a class="aps-button-green shop-button-active" href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP_INDEX') }}">
<i class="icon {{ aps_config('ass_shop_icon') }} fa-fw" aria-hidden="true"></i>
<span>{{ lang('ASS_SHOP_INDEX') }}</span>
</a>
</div>
</div>
{% endfor %}
{% if ass_logs|length %}
<div class="aps-row">
<div class="aps-col s2">
<form class="aps-form" method="get" action="{{ U_VIEW }}">
<div class="shop-block dropdown-container dropdown-container-left dropdown-up dropdown-right dropdown-button-control">
<span class="shop-block aps-button-blue aps-center dropdown-trigger" title="{{ lang('SORT_OPTIONS') }}">
<i class="icon fa-sort-amount-asc fa-fw" aria-hidden="true"></i>
</span>
<div class="dropdown hidden shop-category-dropdown">
<div class="pointer"><div class="pointer-inner"></div></div>
<div class="dropdown-contents">
<fieldset>
<div class="aps-row">
<div class="aps-col s4">
<label for="display">
{{ lang('DISPLAY') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<select id="display" name="display">
{% for value, option in SORT_DISPLAY_ARRAY %}
<option value="{{ value }}"{{ value == SORT_DISPLAY ? ' selected' }}>{{ lang(option.title) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s4">
<label for="sort">
{{ lang('SORT_BY') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8">
<select class="full" id="sort" name="sort">
{% for value, option in SORT_SORT_ARRAY %}
<option value="{{ value }}"{{ value == SORT_SORT ? ' selected' }}>{{ lang(option.title) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s4 aps-no-mar-bot">
<label for="direction">
{{ lang('SORT_DIRECTION') ~ lang('COLON') }}
</label>
</div>
<div class="aps-col s8 aps-no-mar-bot">
<select class="full" id="direction" name="direction">
{% for value, option in SORT_DIR_ARRAY %}
<option value="{{ value }}"{{ value == SORT_DIR ? ' selected' }}>{{ lang(option.title) }}</option>
{% endfor %}
</select>
</div>
<div class="aps-col s12 aps-center aps-no-mar-bot">
<hr class="dashed">
<input class="aps-button-green" type="submit" value="{{ lang('GO') }}">
</div>
</div>
</fieldset>
</div>
</div>
</div>
</form>
</div>
<div class="aps-col s8">
{% if shop_pagination|length %}
{{ include('@phpbbstudio_ass/ass_pagination.html') }}
{% endif %}
</div>
<div class="aps-col s2">
<div class="aps-center shop-pagination-text">
{{ TOTAL_LOGS }}
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,136 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDECSS '@phpbbstudio_ass/jquery-ui.min.css' %}
{% INCLUDEJS '@phpbbstudio_ass/js/jquery-ui.min.js' %}
{% INCLUDEJS '@phpbbstudio_ass/js/sketch.js' %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %}
{% EVENT phpbbstudio_ass_includes_inventory %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block nav_right %}
<li>
<a class="aps-list-item" href="{{ path('phpbbstudio_ass_history') }}" title="{{ lang('ASS_HISTORY') }}">
<i class="icon fa-history fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_HISTORY') }}</span>
</a>
</li>
{% endblock %}
{% block main %}
{% if ass_categories|length %}
<div class="shop-inventory-overlay"></div>
<div class="aps-row">
<div class="aps-col m5 shop-inventory-list{{ ITEM_INFO ? ' shop-inventory-with-item' }} aps-no-mar-bot">
<div class="aps-panel-content">
{% for category in ass_categories %}
<div class="shop-title shop-mar-bot">
<h1 class="aps-no-mar shop-text-large shop-text-darkgray">{{ category.TITLE }}</h1>
</div>
{% for batch in category.items|batch(3) %}
<div class="aps-row shop-inventory-row">
{% for item in batch %}
<div class="aps-col s12 m4 shop-fake-min-width">
<section class="shop-inventory-panel">
<a class="aps-panel shop-inventory-link" href="{{ item.U_INVENTORY }}">
{% if item.S_TYPE_ERROR %}
<i class="icon fa-exclamation-triangle icon-white shop-panel-icon shop-panel-icon-tiny shop-panel-icon-red"></i>
{% elseif item.STACK_COUNT > 1 %}
<span class="icon icon-white shop-panel-icon shop-panel-icon-tiny shop-panel-icon-purple"><strong class="shop-inventory-stack">{{ item.STACK_COUNT }}</strong></span>
{% elseif item.S_HAS_EXPIRED %}
<i class="icon fa-hourglass-end icon-white shop-panel-icon shop-panel-icon-tiny shop-panel-icon-red"></i>
{% elseif item.S_WILL_EXPIRE %}
<i class="icon fa-hourglass-half icon-white shop-panel-icon shop-panel-icon-tiny shop-panel-icon-orange"></i>
{% elseif item.S_GIFTED %}
<i class="icon {{ aps_config('ass_gift_icon') }} icon-white shop-panel-icon shop-panel-icon-tiny shop-panel-icon-blue"></i>
{% endif %}
<div class="aps-panel-content {{ item.BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical' }}"{% if item.BACKGROUND_SRC %} style="background-image: url({{ item.BACKGROUND_SRC }})"{% endif %}>
{% if not item.BACKGROUND_SRC %}
<i class="icon {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-fw shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
</div>
<div class="aps-panel-footer shop-bold shop-text-small shop-text-darkgray shop-text-ellipsis" title="{{ item.TITLE }}">
{{ item.TITLE }}
</div>
</a>
{{ include('@phpbbstudio_ass/ass_item_inventory.html') }}
</section>
</div>
{% endfor %}
</div>
{% endfor %}
{% endfor %}
</div>
<div class="aps-panel-footer aps-row aps-center">
<div class="aps-col s3 aps-no-mar shop-no-pad">
<a class="aps-button-blue shop-block" href="{{ U_VIEW_SHOP }}" title="{{ L_VIEW_SHOP }}">
<i class="fa {{ aps_config('ass_shop_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_SHOP_INDEX') }}</span>
</a>
</div>
<div class="aps-col s1"></div>
<div class="aps-col s2 aps-no-mar shop-no-pad" title="{{ aps_name() }}">
{{ aps_icon() }}
<strong class="shop-block">{{ aps_display(user.data.user_points, false) }}</strong>
</div>
<div class="aps-col s2 aps-no-mar shop-no-pad">
<i class="icon {{ T_SHOP_ICON }} fa-fw"></i>
<strong class="shop-block">{{ COUNT_TOTAL }}</strong>
</div>
<div class="aps-col s2 aps-no-mar shop-no-pad">
<i class="icon fa-hourglass-start fa-fw"></i>
<strong class="shop-block">{{ COUNT_EXPIRE }}</strong>
</div>
<div class="aps-col s2 aps-no-mar shop-no-pad">
<i class="icon {{ aps_config('ass_gift_icon') }} fa-fw"></i>
<strong class="shop-block">{{ COUNT_GIFTS }}</strong>
</div>
</div>
</div>
<div class="aps-col m7 aps-no-mar-bot">
<div class="shop-inventory-info">
<div class="shop-inventory-proxy">
<div class="shop-inventory-card">
{{ aps_icon(true) }}
</div>
</div>
{% if ITEM_INFO %}
{{ include('@phpbbstudio_ass/ass_item_inventory.html', {item: ITEM_INFO, S_GIFT_ANIMATION: S_IS_GIFT, S_LOADED_ITEM: true}) }}
{% endif %}
</div>
</div>
</div>
{% else %}
<div class="aps-panel aps-center">
<div class="aps-panel-content">
<p class="aps-no-mar shop-padding error">{{ lang('ASS_ITEMS_NONE_INVENTORY') ~ lang('ELLIPSIS') }}</p>
</div>
<div class="aps-panel-footer">
<a class="aps-button-green shop-button-active" href="{{ U_VIEW_SHOP }}" title="{{ L_VIEW_SHOP }}">
<i class="icon {{ T_SHOP_ICON }} fa-fw" aria-hidden="true"></i>
<span>{{ L_VIEW_SHOP }}</span>
</a>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,286 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDEJS '@phpbbstudio_ass/js/slick.min.js' %}
{% INCLUDECSS '@phpbbstudio_ass/slick.css' %}
{% INCLUDECSS '@phpbbstudio_ass/ass_item.css' %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block nav_right %}
<li class="shop-item-help-label">
<label class="aps-list-item shop-cursor-pointer" for="shop-item-help-input" title="{{ lang('ASS_ITEM_HELP') }}">
<i class="icon fa-question fa-fw icon-white" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_ITEM_HELP') }}</span>
</label>
</li>
{% endblock %}
{% block main %}
{{ include('@phpbbstudio_ass/ass_carousel.html') }}
<input class="shop-item-help-input" id="shop-item-help-input" type="checkbox" />
{% set delay = 3 %}
<div class="shop-item-help">
<div class="aps-row" data-shop-item="{{ ID }}">
{% if ICON %}
<div class="aps-col s2">
<div class="aps-panel aps-center shop-relative">
<span class="shop-item-helper bottom-right delay-{{ delay }}">{{ lang('ASS_ITEM_ICON') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content">
<i class="fa {{ ICON }} fa-3x icon-aps-blue shop-text-indent-10" aria-hidden="true"></i>
</div>
</div>
</div>
{% endif %}
<div class="aps-col s{{ ICON ? 10 : 12 }}">
<div class="shop-title shop-relative">
<span class="shop-item-helper bottom-left delay-{{ delay }}">{{ lang('ASS_ITEM_TITLE') }}</span>
{% set delay = delay + 1 %}
<h1 class="aps-no-mar shop-text-darkgray">{{ TITLE }}</h1>
</div>
</div>
{% if not S_ACTIVE %}
<div class="aps-col s12">
<div class="aps-button-red">
<strong>{{ lang('ASS_ITEM_INACTIVE') }}</strong>
</div>
</div>
{% endif %}
<div class="aps-col s12 m6">
<div class="aps-panel shop-relative">
<span class="shop-item-helper right delay-{{ delay }}">{{ lang('ASS_ITEM_IMAGE') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content aps-center shop-panel-height {{ BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical shop-center' }}"{% if BACKGROUND_SRC %} style="background-image: url({{ BACKGROUND_SRC }})"{% endif %}>
{% if S_FEATURED and S_SALE and SHOP_PANEL_FEATURED_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_SALE_ICON }}"></i>
{% elseif S_FEATURED and SHOP_PANEL_FEATURED_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_ICON }}" title="{{ lang('ASS_FEATURED') }}"></i>
{% elseif S_SALE and SHOP_PANEL_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_SALE_ICON }}" title="{{ lang('ASS_ON_SALE') }}"></i>
{% endif %}
{% if not BACKGROUND_SRC %}
<i class="icon {{ aps_config('ass_no_image_icon') }} shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
</div>
</div>
</div>
<div class="aps-col s12 m6 aps-row">
<div class="aps-col s6">
<div class="aps-panel">
<span class="shop-item-helper right delay-{{ delay }}">{{ lang('ASS_ITEM_PRICE') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content aps-center">
{% if S_SALE %}
<span class="aps-positive" title="{{ lang('ASS_ON_SALE') }}">{{ aps_display(SALE_PRICE) }}</span>
{% else %}
{{ aps_display(PRICE) }}
{% endif %}
</div>
</div>
</div>
<div class="aps-col s6">
<div class="aps-panel">
<span class="shop-item-helper left delay-{{ delay }}">{{ lang('ASS_ITEM_STOCK') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content aps-center" title="{{ lang(S_STOCK_UNLIMITED ? 'ASS_UNLIMITED_STOCK' : (STOCK ? 'ASS_STOCK' : 'ASS_STOCK_OUT')) }}">
{% if S_STOCK_UNLIMITED %}
<strong>&infin;</strong>
{% elseif STOCK %}
<strong class="shop-item-stock {{ STOCK ? 'icon-gold' : 'error' }}">{{ STOCK }}</strong>&thinsp;/{{ STOCK_INITIAL }}
{% endif %}
</div>
</div>
</div>
{% if not S_GIFT_ONLY %}
<div class="aps-col s{{ S_GIFT and S_CAN_GIFT ? 8 : 12 }}">
<a class="aps-button-{{ not S_OUT_OF_STOCK ? 'green shop-relative' : 'red shop-cursor-ban' }} aps-center shop-block shop-bold shop-button-active"{% if not S_OUT_OF_STOCK %} href="{{ U_PURCHASE }}" data-shop-link="shop_purchase"{% endif %}>
{% if not S_OUT_OF_STOCK %}
<span class="shop-item-helper right delay-{{ delay }}">{{ lang('ASS_ITEM_PURCHASE') }}</span>
{% set delay = delay + 1 %}
{% endif %}
{{ lang(S_OUT_OF_STOCK ? 'ASS_STOCK_OUT' : 'ASS_PURCHASE') }}
</a>
</div>
{% endif %}
{% if S_GIFT and S_CAN_GIFT %}
<div class="aps-col s{{ S_GIFT_ONLY ? 12 : 4 }}">
<a class="aps-button-{{ S_GIFT_ONLY and S_OUT_OF_STOCK ? 'red' : 'blue' }} aps-center shop-block shop-relative{{ S_GIFT_ONLY ? ' shop-bold shop-button-active' }}{{ not S_GIFT_ONLY and S_OUT_OF_STOCK ? ' shop-button-disabled' }}"{% if not S_OUT_OF_STOCK %} href="{{ U_GIFT }}" title="{{ lang('ASS_GIFT') }}" data-shop-link="shop_purchase"{% endif %}>
{% if not S_OUT_OF_STOCK %}
<span class="shop-item-helper left delay-{{ delay }}">{{ lang('ASS_ITEM_GIFT') }}</span>
{% set delay = delay + 1 %}
{% endif %}
<i class="icon {{ aps_config('ass_gift_icon') }} fa-fw" aria-hidden="true"></i>
<span{% if not S_GIFT_ONLY %} class="sr-only"{% endif %}>{{ lang('ASS_GIFT') }}</span>
</a>
</div>
{% endif %}
<div class="aps-col s12">
<div class="aps-panel shop-relative">
<span class="shop-item-helper left delay-{{ delay }}">{{ lang('ASS_ITEM_INFORMATION') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content">
<ul class="fa-ul shop-darken-span">
<li>
<i class="icon fa-hashtag fa-li"></i>
{% if COUNT %}
{{ lang('ASS_ITEM_USE_COUNT', COUNT) }}
{% else %}
{{ lang('ASS_ITEM_USE_UNLIMITED') }}
{% endif %}
</li>
<li>
<i class="icon fa-hourglass-start fa-li"></i>
{% if EXPIRE_WITHIN %}
{{ lang('ASS_ITEM_EXPIRE_WITHIN', EXPIRE_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_EXPIRE_NEVER') }}
{% endif %}
</li>
<li>
<i class="icon fa-undo fa-li"></i>
{% if REFUND_WITHIN %}
{{ lang('ASS_ITEM_REFUND_WITHIN', REFUND_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_REFUND_NEVER') }}
{% endif %}
</li>
</ul>
</div>
</div>
</div>
<div class="aps-col s12">
<div class="aps-row aps-panel">
<div class="aps-col s{{ EDIT_TIME ? 6 : 12 }} aps-no-mar-bot shop-relative" title="{{ lang('ASS_TIME_CREATED') }}">
<span class="shop-item-helper top-right delay-{{ delay }}">{{ lang('ASS_ITEM_CREATE_TIME') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content shop-padding">
<i class="icon fa-check-square-o fa-fw"></i>
{{ user.format_date(CREATE_TIME) }}
</div>
</div>
{% if EDIT_TIME %}
<div class="aps-col s6 aps-no-mar-bot shop-relative" title="{{ lang('ASS_TIME_EDITED') }}">
<span class="shop-item-helper top-left delay-{{ delay }}">{{ lang('ASS_ITEM_EDIT_TIME') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content shop-padding">
<i class="icon fa-pencil-square-o fa-fw"></i>
{{ user.format_date(EDIT_TIME) }}
</div>
</div>
{% endif %}
</div>
</div>
{% if S_SALE %}
<div class="aps-col s12 aps-center">
<em>{{ lang('ASS_SALE_END_ON', user.format_date(SALE_UNTIL_UNIX)) }}</em>
</div>
{% endif %}
{% if AVAILABLE_UNTIL_UNIX and S_AVAILABLE %}
<div class="aps-col s12 aps-center">
<em>{{ lang('ASS_AVAILABILITY_END_ON', user.format_date(AVAILABLE_UNTIL_UNIX)) }}</em>
</div>
{% endif %}
</div>
{% if DESC_HTML %}
<div class="aps-col s12">
<div class="aps-panel shop-relative">
<span class="shop-item-helper right delay-{{ delay }}">{{ lang('ASS_ITEM_DESCRIPTION') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-content content">
{{ DESC_HTML }}
</div>
</div>
</div>
{% endif %}
</div>
{% if IMAGES_SRC %}
<div class="aps-row">
<div class="aps-col s12 shop-fake-width">
<span class="shop-item-helper right delay-{{ delay }}">{{ lang('ASS_ITEM_IMAGES') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel">
<div class="aps-panel-content">
<div data-shop-carousel="images">
{% for image in IMAGES_SRC %}
<div>
<img class="shop-carousel-images" src="{{ image }}" alt="{{ TITLE }}" />
</div>
{% endfor %}
</div>
</div>
<div class="aps-panel-footer">
{% for image in IMAGES_SRC %}
<img class="shop-carousel-nav-img" src="{{ image }}" alt="{{ TITLE }}" />
{% endfor %}
</div>
</div>
</div>
</div>
{% endif %}
{% if ass_related|length %}
<div class="aps-row">
<div class="aps-col s12">
<div class="aps-panel shop-relative">
<span class="shop-item-helper left delay-{{ delay }}">{{ lang('ASS_RELATED_ITEMS') }}</span>
{% set delay = delay + 1 %}
<div class="aps-panel-header">
<h3>{{ lang('ASS_RELATED_ITEMS') }}</h3>
</div>
<div class="aps-panel-content">
<div class="aps-row">
{% for item in ass_related %}
<div class="aps-col s6 m3">
{{ include('@phpbbstudio_ass/ass_item_panel.html') }}
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -0,0 +1,37 @@
<div class="shop-relative shop-panel-height shop-padding {{ item.BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical' }}" data-shop-item="{{ item.ID }}"{% if item.BACKGROUND_SRC %} style="background-image: url({{ item.BACKGROUND_SRC }})"{% endif %}>
{% if not item.BACKGROUND_SRC %}
<i class="icon {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-fw shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
<div class="shop-panel-bottom aps-center">
{% if S_CAN_PURCHASE and not item.S_GIFT_ONLY %}
{% if item.S_OUT_OF_STOCK %}
<span class="aps-button-red shop-button-active pull-left" title="{{ lang('ASS_STOCK_OUT') }}">
<i class="icon {{ aps_config('ass_shop_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_PURCHASE') }}</span>
</span>
{% else %}
<a class="aps-button-green pull-left" href="{{ item.U_PURCHASE }}" title="{{ lang('ASS_PURCHASE') }}" data-shop-link="ass_purchase">
<i class="icon {{ aps_config('ass_shop_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_PURCHASE') }}</span>
</a>
{% endif %}
{% endif %}
{% if S_CAN_GIFT and item.S_GIFT %}
<a class="aps-button-blue pull-right" href="{{ item.U_GIFT }}" title="{{ lang('ASS_GIFT') }}" data-shop-link="ass_gift">
<i class="icon {{ aps_config('ass_gift_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_GIFT') }}</span>
</a>
{% endif %}
<a class="shop-text-large shop-panel-header-link" href="{{ item.U_VIEW }}" data-item-title="{{ item.TITLE }}">
{{ item.TITLE }}
</a>
{% if item.S_OUT_OF_STOCK %}
<span class="shop-block shop-text-med aps-negative" title="{{ lang('ASS_STOCK_OUT') }}">{{ aps_display(item.PRICE) }}</span>
{% elseif item.S_SALE %}
<span class="shop-block shop-text-med aps-positive" title="{{ lang('ASS_ON_SALE') }}">{{ aps_display(item.SALE_PRICE) }}</span>
{% else %}
<span class="shop-block shop-text-med shop-text-blue">{{ aps_display(item.PRICE) }}</span>
{% endif %}
</div>
</div>

View File

@@ -0,0 +1,185 @@
<div class="shop-inventory-item" data-shop-item="{{ item.ID }}">
{% if S_GIFT_ANIMATION %}
<div class="shop-inventory-gift shop-zoom-hide">
<div class="shop-inventory-gift-icon">
<i class="fa fa-gift"></i>
</div>
<span class="shop-stars shop-stars-top shop-zoom-out">
{% for i in 1..5 %}
<i class="fa fa-star"></i>
{% endfor %}
</span>
<span class="shop-stars shop-stars-bottom shop-zoom-out">
{% for i in 1..5 %}
<i class="fa fa-star"></i>
{% endfor %}
</span>
<svg class="shop-zoom-out" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 -1 400 402">
<path d="M 400 200 A 200 200 0 0 1 200 400 A 200 200 0 0 1 0 200 A 200 200 0 0 1 200 0 A 200 200 0 0 1 400 200 Z"></path>
<path d="M 219.566 206.068 M 200 395 C 92.303 395 5 307.697 5 200 C 5 92.303 92.303 5 200 5 C 307.697 5 395 92.303 395 200"></path>
<path d="M 250.689 383.163 C 234.552 387.619 217.554 390 200 390 C 95.066 390 10 304.934 10 200 C 10 95.066 95.066 10 200 10 C 304.934 10 390 95.066 390 200 C 390 210.848 389.091 221.483 387.345 231.834"></path>
<path d="M 385 200 C 385 302.173 302.173 385 200 385 C 97.827 385 15 302.173 15 200 C 15 97.827 97.827 15 200 15 C 302.173 15 385 97.827 385 200 Z"></path>
<path d="M 200 380 M 181.098 379.019 C 90.57 369.572 20 293.028 20 200 C 20 100.588 100.588 20 200 20 C 292.203 20 368.213 89.323 378.752 178.693"></path>
<path d="M 200 375 C 103.35 375 25 296.65 25 200 C 25 103.35 103.35 25 200 25 C 296.65 25 375 103.35 375 200"></path>
<path d="M 219.433 31.099 C 304.17 40.741 370 112.682 370 200 C 370 287.453 303.966 359.482 219.038 368.946 M 200 370 M 175.05 368.182 C 92.99 356.113 30 285.413 30 200 C 30 114.408 93.254 43.59 175.567 31.743"></path>
<path d="M 365 200 C 365 291.127 291.127 365 200 365 C 108.873 365 35 291.127 35 200 C 35 108.873 108.873 35 200 35 C 291.127 35 365 108.873 365 200 Z"></path>
</svg>
</div>
{% endif %}
<div class="aps-row{{ S_GIFT_ANIMATION ? ' shop-zoom-in' }}">
<div class="aps-col s1 shop-no-pad">
{% if item.U_STACK_PREV %}
<a class="aps-button-blue" href="{{ item.U_STACK_PREV }}" title="{{ lang('PREVIOUS') }}">
<i class="icon fa-chevron-left fa-fw"></i>
</a>
{% endif %}
</div>
<div class="aps-col s10 shop-no-pad">
<h2 class="aps-no-mar aps-center shop-padding shop-no-pad-bot shop-text-darkgray">{{ item.TITLE }}</h2>
</div>
<div class="aps-col s1 shop-no-pad">
{% if item.U_STACK_NEXT %}
<a class="aps-button-blue" href="{{ item.U_STACK_NEXT }}" title="{{ lang('NEXT') }}">
<i class="icon fa-chevron-right fa-fw"></i>
</a>
{% endif %}
</div>
{% if U_DOWNLOAD_FILE and S_LOADED_ITEM %}
<div class="aps-col s12 shop-no-pad">
<div class="aps-panel">
<div class="aps-panel-content shop-text-darkgray">
<script>
setTimeout(function() {
window.location = '{{ U_DOWNLOAD_FILE|e('js') }}';
}, 1500);
</script>
{{ lang('ASS_TYPE_FILE_START') }}
</div>
<div class="aps-panel-content">
{{ lang('ASS_TYPE_FILE_START_NOT') }}
</div>
<div class="aps-panel-footer aps-center">
<a class="aps-button-green shop-button-active" href="{{ U_DOWNLOAD_FILE }}">
<i class="icon fa-download fa-fw" aria-hidden="true"></i>
<span>{{ item.ACTIVATE }}</span>
</a>
</div>
</div>
</div>
{% endif %}
{% if item.S_TYPE_ERROR %}
<div class="aps-col s12 shop-no-pad">
<div class="aps-panel">
<div class="aps-panel-header error">
<i class="icon fa-exclamation-triangle icon-white shop-panel-icon shop-panel-icon-red"></i>
{{ lang('ERROR') }}
</div>
<div class="aps-panel-content shop-text-darkgray">
{{ lang('ASS_ITEM_TYPE_NOT_EXIST') }}
</div>
<div class="aps-panel-content">
{{ lang('ASS_ERROR_LOGGED') }}
</div>
</div>
</div>
{% endif %}
{% if item.S_LIMIT or item.S_HAS_EXPIRED or item.S_WILL_EXPIRE %}
<div class="aps-col s12 shop-no-pad">
<div class="aps-button-{{ item.S_LIMIT or item.S_HAS_EXPIRED ? 'red' : 'blue' }} shop-button-active shop-cursor-normal">
{{ lang(item.S_LIMIT ? 'ASS_ITEM_USE_REACHED' : (item.S_HAS_EXPIRED ? 'ASS_ITEM_EXPIRED' : 'ASS_ITEM_EXPIRE_SOON')) }}
</div>
</div>
{% endif %}
{% if item.S_GIFTED %}
<div class="aps-col s12 shop-no-pad">
<div class="aps-panel">
<i class="icon {{ aps_config('ass_gift_icon') }} icon-white shop-panel-icon shop-panel-icon-small shop-panel-icon-blue"></i>
<div class="aps-panel-content">
{{ lang('ASS_GIFTED_BY', item.GIFTER_NAME) }}
</div>
</div>
</div>
{% endif %}
<div class="aps-col s3 shop-no-pad-left shop-inventory-item-img">
<div class="aps-panel">
<div class="aps-panel-content shop-no-pad {{ item.BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical' }}"{% if item.BACKGROUND_SRC %} style="background-image: url({{ item.BACKGROUND_SRC }})"{% endif %}>
{% if not item.BACKGROUND_SRC %}
<i class="icon {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-fw shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
</div>
</div>
</div>
<div class="aps-col s9 shop-no-pad-left shop-no-pad-right">
<div class="aps-panel">
<div class="aps-panel-content">
<ul class="fa-ul">
<li title="{{ lang('ASS_USAGES') }}">
<i class="icon fa-li fa-hashtag" aria-hidden="true"></i>
<span><strong class="shop-text-darkgray shop-inventory-item-count">{{ item.USE_COUNT }}</strong>&thinsp;/{{ item.COUNT ?: '&infin;' }}</span>
</li>
<li{% if not item.USE_UNIX %} class="hidden"{% endif %} title="{{ lang('ASS_USED_LAST') }}">
<i class="icon fa-li fa-clock-o" aria-hidden="true"></i>
<span class="shop-inventory-item-time">{{ user.format_date(item.USE_UNIX) }}</span>
</li>
<li title="{{ lang('ASS_EXPIRATION_DATE') }}">
<i class="icon fa-li fa-hourglass-end" aria-hidden="true"></i>
<span>{{ item.EXPIRE_SECONDS ? user.format_date(item.PURCHASE_UNIX + item.EXPIRE_SECONDS) : lang('NEVER') }}</span>
</li>
<li title="{{ lang('ASS_REFUND_BEFORE') }}">
<i class="icon fa-li fa-undo" aria-hidden="true"></i>
<span>{{ item.REFUND_SECONDS ? user.format_date(item.PURCHASE_UNIX + item.REFUND_SECONDS) : lang('NEVER') }}</span>
</li>
<li title="{{ lang(item.S_GIFTED ? 'ASS_GIFT_TIME' : 'ASS_PURCHASE_TIME') }}">
<i class="icon fa-li {{ aps_config(item.S_GIFTED ? 'ass_gift_icon' : 'ass_shop_icon') }}" aria-hidden="true"></i>
<span>{{ user.format_date(item.PURCHASE_UNIX) }}</span>
</li>
</ul>
</div>
</div>
</div>
<div class="aps-col s8 shop-no-pad-left">
{% if not item.S_HAS_EXPIRED and not item.S_LIMIT and not item.S_TYPE_ERROR %}
<a class="aps-button-green aps-center shop-block{{ not S_LOADED_ITEM or not U_DOWNLOAD_FILE ? ' shop-button-active' }}" href="{{ item.U_ACTIVATE }}" title="{{ item.ACTIVATE }}"{% if item.S_AJAX %} data-shop-link="{{ item.S_AJAX }}"{% endif %}>
{{ item.ACTIVATE }}
</a>
{% endif %}
</div>
{% if item.S_REFUND %}
<div class="aps-col s2 shop-no-pad shop-inventory-refund">
<a class="aps-button-blue aps-center shop-block" href="{{ item.U_REFUND }}" title="{{ lang('ASS_REFUND') }}" data-shop-link="shop_inventory_delete">
<i class="icon fa-undo fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_REFUND') }}</span>
</a>
</div>
{% endif %}
<div class="aps-col s{{ item.S_REFUND ? 2 : 4 }} shop-no-pad-right">
<a class="aps-button-red aps-center shop-block" href="{{ item.U_DELETE }}" title="{{ lang('ASS_DELETE') }}" data-shop-link="shop_inventory_delete">
<i class="icon fa-trash fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_DELETE') }}</span>
</a>
</div>
{% if item.DESC_HTML %}
<div class="aps-col s12 shop-no-pad">
<div class="aps-panel">
<div class="aps-panel-content content">
{{ item.DESC_HTML }}
</div>
</div>
</div>
{% endif %}
</div>
</div>

View File

@@ -0,0 +1,47 @@
<div class="aps-panel" data-shop-item="{{ item.ID }}">
<div class="aps-panel-header">
{% if ITEM_PANEL_ICON %}
<i class="icon shop-panel-icon{{ ITEM_PANEL_ICON }}"></i>
{% elseif item.S_FEATURED and item.S_SALE and SHOP_PANEL_FEATURED_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_SALE_ICON }}"></i>
{% elseif item.S_FEATURED and SHOP_PANEL_FEATURED_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_ICON }}" title="{{ lang('ASS_FEATURED') }}"></i>
{% elseif item.S_SALE and SHOP_PANEL_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_SALE_ICON }}" title="{{ lang('ASS_ON_SALE') }}"></i>
{% endif %}
<h3 class="shop-block"><a class="shop-text-darkgray shop-block shop-panel-header-link" href="{{ item.U_VIEW }}" data-item-title="{{ item.TITLE }}">{{ item.TITLE }}</a></h3>
</div>
<div class="aps-panel-content shop-panel-height {{ item.BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical' }}"{% if item.BACKGROUND_SRC %} style="background-image: url({{ item.BACKGROUND_SRC }})"{% endif %}>
{% if not item.BACKGROUND_SRC %}
<i class="icon {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-fw shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
</div>
<div class="aps-row aps-panel-footer">
<div class="aps-col s6 aps-no-mar-bot shop-no-pad">
{% if S_CAN_PURCHASE and not item.S_OUT_OF_STOCK and not item.S_GIFT_ONLY %}
<a class="aps-button-green shop-panel-footer-button" href="{{ item.U_PURCHASE }}" title="{{ lang('ASS_PURCHASE') }}" data-shop-link="ass_purchase">
<i class="icon {{ aps_config('ass_shop_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_PURCHASE') }}</span>
</a>
{% elseif item.S_GIFT and S_CAN_GIFT %}
<a class="aps-button-blue shop-panel-footer-button" href="{{ item.U_GIFT }}" title="{{ lang('ASS_GIFT') }}" data-shop-link="ass_gift">
<i class="icon {{ aps_config('ass_gift_icon') }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ASS_GIFT') }}</span>
</a>
{% elseif not item.S_STOCK_UNLIMITED %}
<strong class="shop-item-stock {{ item.STOCK ? 'icon-gold' : 'error' }}" title="{{ lang(item.STOCK ? 'ASS_STOCK' : 'ASS_STOCK_OUT') }}">{{ item.STOCK }}</strong>&thinsp;/{{ item.STOCK_INITIAL }}
{% elseif item.ICON %}
<i class="icon {{ item.ICON }} fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ item.TITLE }}</span>
{% endif %}
</div>
<div class="aps-col s6 aps-no-mar-bot shop-no-pad shop-text-right">
{% if item.S_SALE %}
<span class="aps-positive" title="{{ lang('ASS_ON_SALE') }}">{{ aps_display(item.SALE_PRICE) }}</span>
{% else %}
{{ aps_display(item.PRICE) }}
{% endif %}
</div>
</div>
</div>

View File

@@ -0,0 +1 @@
<p>{{ MESSAGE_TEXT }}</p>

View File

@@ -0,0 +1,45 @@
<nav>
{# Pagination's aria-labels should NOT be translated! #}
<ul class="shop-pagination aps-center" aria-label="pagination">
{% for item in shop_pagination %}
{% if item.S_IS_PREV or (not item.S_IS_PREV and loop.first) %}
<li>
<a class="aps-button-blue shop-block{{ not item.S_IS_PREV ? ' shop-button-disabled' }}"{% if item.S_IS_PREV %} href="{{ U_SHOP_PAGINATION_PREVIOUS_PAGE }}"{% endif %} aria-label="Previous page" role="button">
<i class="icon fa-chevron-left fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('PREVIOUS') }}</span>
</a>
</li>
{% endif %}
{% if item.S_IS_ELLIPSIS %}
<li>
<span class="aps-button-blue shop-block shop-button-disabled" role="separator">
<i class="icon fa-ellipsis-h fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('ELLIPSIS') }}</span>
</span>
</li>
{% elseif item.S_IS_CURRENT %}
<li>
<a class="aps-button-blue shop-block shop-button-active" href="{{ item.PAGE_URL }}" aria-label="Page {{ item.PAGE_NUMBER }}, Current page" aria-current="true" role="button">
{{ item.PAGE_NUMBER }}
</a>
</li>
{% elseif not item.S_IS_PREV and not item.S_IS_NEXT %}
<li>
<a class="aps-button-blue shop-block" href="{{ item.PAGE_URL }}" aria-label="Page {{ item.PAGE_NUMBER }}" aria-current="true" role="button">
{{ item.PAGE_NUMBER }}
</a>
</li>
{% endif %}
{% if item.S_IS_NEXT or (not item.S_IS_NEXT and loop.last) %}
<li>
<a class="aps-button-blue shop-block{{ not item.S_IS_NEXT ? ' shop-button-disabled' }}"{% if item.S_IS_NEXT %} href="{{ U_SHOP_PAGINATION_NEXT_PAGE }}"{% endif %} aria-label="Next page" role="button">
<i class="icon fa-chevron-right fa-fw" aria-hidden="true"></i>
<span class="sr-only">{{ lang('NEXT') }}</span>
</a>
</li>
{% endif %}
{% endfor %}
</ul>
</nav>

View File

@@ -0,0 +1,191 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block main %}
<div class="aps-row">
{% if ICON %}
<div class="aps-col s2">
<div class="aps-panel aps-center">
<div class="aps-panel-content">
<i class="fa {{ ICON }} fa-fw fa-3x icon-aps-blue" aria-hidden="true"></i>
</div>
</div>
</div>
{% endif %}
<div class="aps-col s{{ ICON ? 10 : 12 }}">
<div class="shop-title">
<h1 class="aps-no-mar shop-text-darkgray">{{ TITLE }}</h1>
</div>
</div>
<div class="aps-col s12 m6">
<div class="aps-panel">
<div class="aps-panel-content aps-center shop-panel-height {{ BACKGROUND_SRC ? 'shop-panel-background' : 'shop-vertical' }}"{% if BACKGROUND_SRC %} style="background-image: url({{ BACKGROUND_SRC }})"{% endif %}>
{% if S_FEATURED and S_SALE and SHOP_PANEL_FEATURED_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_SALE_ICON }}"></i>
{% elseif S_FEATURED and SHOP_PANEL_FEATURED_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_FEATURED_ICON }}" title="{{ lang('ASS_FEATURED') }}"></i>
{% elseif S_SALE and SHOP_PANEL_SALE_ICON %}
<i class="icon shop-panel-icon{{ SHOP_PANEL_SALE_ICON }}" title="{{ lang('ASS_ON_SALE') }}"></i>
{% endif %}
{% if not BACKGROUND_SRC %}
<i class="icon {{ aps_config('ass_no_image_icon') }} fa-fw shop-text-indent-10 icon-xl icon-lightgray"></i>
{% endif %}
</div>
</div>
</div>
<div class="aps-col s12 m6 aps-row">
{% if S_CONFIRM_ACTION %}
<div class="aps-col s6">
<div class="aps-panel">
<div class="aps-panel-content aps-center">
{% if S_SALE %}
<span class="aps-positive" title="{{ lang('ASS_ON_SALE') }}">{{ aps_display(ASS_PURCHASE_PRICE) }}</span>
{% else %}
{{ aps_display(ASS_PURCHASE_PRICE) }}
{% endif %}
</div>
</div>
</div>
<div class="aps-col s6">
<div class="aps-panel">
<div class="aps-panel-content aps-center" title="{{ lang(S_STOCK_UNLIMITED ? 'ASS_UNLIMITED_STOCK' : (STOCK ? 'ASS_STOCK' : 'ASS_STOCK_OUT')) }}">
{% if S_STOCK_UNLIMITED %}
<strong>&infin;</strong>
{% elseif STOCK %}
<strong class="{{ STOCK ? 'icon-gold' : 'error' }}">{{ STOCK }}</strong>&thinsp;/{{ STOCK_INITIAL }}
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content">
<ul class="fa-ul shop-darken-span">
<li>
<i class="icon fa-hashtag fa-li"></i>
{% if COUNT %}
{{ lang('ASS_ITEM_USE_COUNT', COUNT) }}
{% else %}
{{ lang('ASS_ITEM_USE_UNLIMITED') }}
{% endif %}
</li>
<li>
<i class="icon fa-hourglass-start fa-li"></i>
{% if EXPIRE_WITHIN %}
{{ lang('ASS_ITEM_EXPIRE_WITHIN', EXPIRE_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_EXPIRE_NEVER') }}
{% endif %}
</li>
<li>
<i class="icon fa-undo fa-li"></i>
{% if REFUND_WITHIN %}
{{ lang('ASS_ITEM_REFUND_WITHIN', REFUND_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_REFUND_NEVER') }}
{% endif %}
</li>
</ul>
</div>
</div>
</div>
{% if S_CONFIRM_ACTION %}
<div class="aps-col s12">
<form class="aps-form" id="confirm" action="{{ S_CONFIRM_ACTION }}" method="post">
<div class="aps-panel">
<div class="aps-panel-header">
<h3>{{ MESSAGE_TITLE }}</h3>
</div>
{% if not S_ASS_PURCHASE %}
<div class="aps-panel-content">
<label class="shop-block shop-mar-bot" for="username">{{ lang('ASS_GIFT_USER') }}</label>
<input id="username" name="username" type="text" placeholder="{{ lang('USERNAME') }}">
</div>
{% endif %}
<div class="aps-panel-content">
{{ MESSAGE_TEXT }}
</div>
<div class="aps-panel-footer aps-center">
{{ S_HIDDEN_FIELDS }}
<input class="aps-button-green" type="submit" name="confirm" value="{{ lang('YES') }}" />&nbsp;
<a class="aps-button-red" href="{{ path('phpbbstudio_ass_shop') }}">{{ lang('NO') }}</a>
</div>
</div>
</form>
</div>
{% else %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-header">
<h3>{{ lang(S_ASS_PURCHASE ? 'ASS_PURCHASE' : 'ASS_GIFT') }}</h3>
</div>
<div class="aps-panel-content">
<p>
{% if S_ASS_PURCHASE %}
<span class="shop-text-darkgray shop-block">{{ lang('ASS_PURCHASE_SUCCESS') }}</span>
{{ lang('ASS_INVENTORY_ADDED') }}
{% else %}
<span class="shop-text-darkgray shop-block">{{ lang('ASS_GIFT_SUCCESS') }}</span>
{{ lang('ASS_INVENTORY_ADDED_USER', RECIPIENT_NAME) }}
{% endif %}
</p>
<p>
<span class="shop-block">
{{ lang('ASS_POINTS_DEDUCTED') ~ lang('COLON') }}
{{ aps_display(ASS_PURCHASE_PRICE) }}
</span>
<span class="shop-block">
{{ lang('ASS_POINTS_BALANCE', aps_name()) ~ lang('COLON') }}
{{ aps_display(NEW_USER_POINTS) }}
</span>
</p>
{% if EXPIRE_UNIX %}
<p>
<span class="shop-block">{{ lang('ASS_ITEM_USE_BEFORE') }}</span>
{{ user.format_date(EXPIRE_UNIX) }}
</p>
{% endif %}
<p>
{% if S_ASS_PURCHASE %}
<a class="aps-button-blue" href="{{ U_INVENTORY }}">{{ lang('ASS_INVENTORY_GO') }}</a>
{% else %}
<a class="aps-button-blue" href="{{ path('phpbbstudio_ass_shop') }}">{{ lang('ASS_SHOP_INDEX') }}</a>
{% if U_SEND_PM %}
<a class="aps-button-green" href="{{ U_SEND_PM }}">{{ lang('SEND_PRIVATE_MESSAGE') }}</a>
{% endif %}
{% endif %}
</p>
</div>
</div>
</div>
{% endif %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,144 @@
<div class="aps-main">
<div class="aps-body">
<div class="aps-row">
<div class="aps-col s12">
<div class="shop-title">
<h1 class="aps-no-mar shop-text-darkgray">{{ TITLE }}</h1>
</div>
</div>
{% if not S_PURCHASE_SUCCESS %}
<div class="aps-col s6">
<div class="aps-panel">
<div class="aps-panel-content aps-center">
{% if S_SALE %}
<span class="aps-positive" title="{{ lang('ASS_ON_SALE') }}">{{ aps_display(ASS_PURCHASE_PRICE) }}</span>
{% else %}
{{ aps_display(ASS_PURCHASE_PRICE) }}
{% endif %}
</div>
</div>
</div>
<div class="aps-col s6">
<div class="aps-panel">
<div class="aps-panel-content aps-center" title="{{ lang(S_STOCK_UNLIMITED ? 'ASS_UNLIMITED_STOCK' : (STOCK ? 'ASS_STOCK' : 'ASS_STOCK_OUT')) }}">
{% if S_STOCK_UNLIMITED %}
<strong>&infin;</strong>
{% elseif STOCK %}
<strong class="{{ STOCK ? 'icon-gold' : 'error' }}">{{ STOCK }}</strong>&thinsp;/{{ STOCK_INITIAL }}
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content">
<ul class="fa-ul shop-darken-span shop-text-left">
<li>
<i class="icon fa-hashtag fa-li"></i>
{% if COUNT %}
{{ lang('ASS_ITEM_USE_COUNT', COUNT) }}
{% else %}
{{ lang('ASS_ITEM_USE_UNLIMITED') }}
{% endif %}
</li>
<li>
<i class="icon fa-hourglass-start fa-li"></i>
{% if EXPIRE_WITHIN %}
{{ lang('ASS_ITEM_EXPIRE_WITHIN', EXPIRE_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_EXPIRE_NEVER') }}
{% endif %}
</li>
<li>
<i class="icon fa-undo fa-li"></i>
{% if REFUND_WITHIN %}
{{ lang('ASS_ITEM_REFUND_WITHIN', REFUND_WITHIN) }}
{% else %}
{{ lang('ASS_ITEM_REFUND_NEVER') }}
{% endif %}
</li>
</ul>
</div>
</div>
</div>
{% if not S_PURCHASE_SUCCESS and not S_ASS_PURCHASE %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content">
<form class="aps-form">
<label class="shop-block shop-mar-bot" for="username">{{ lang('ASS_GIFT_USER') }}</label>
<input id="username" name="username" type="text" placeholder="{{ lang('USERNAME') }}">
</form>
</div>
</div>
</div>
{% endif %}
{% if S_ASS_PURCHASE and not S_PURCHASE_SUCCESS %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content">
{% if ASS_ITEM_STACK %}
{{ lang('ASS_WARNING_STACK', ASS_ITEM_STACK) }}
{% else %}
{{ lang('ASS_ERROR_NOT_OWNED') }}
{% endif %}
</div>
</div>
</div>
{% endif %}
<div class="aps-col s12">
<div class="aps-panel">
<div class="aps-panel-content">
{% if not S_PURCHASE_SUCCESS %}
{{ MESSAGE_TEXT }}
{% else %}
<p>
{% if S_ASS_PURCHASE %}
<span class="shop-text-darkgray shop-block">{{ lang('ASS_PURCHASE_SUCCESS') }}</span>
{{ lang('ASS_INVENTORY_ADDED') }}
{% else %}
<span class="shop-text-darkgray shop-block">{{ lang('ASS_GIFT_SUCCESS') }}</span>
{{ lang('ASS_INVENTORY_ADDED_USER', RECIPIENT_NAME) }}
{% endif %}
</p>
<p>
<span class="shop-block">
{{ lang('ASS_POINTS_DEDUCTED') ~ lang('COLON') }}
{{ aps_display(ASS_PURCHASE_PRICE) }}
</span>
<span class="shop-block">
{{ lang('ASS_POINTS_BALANCE', aps_name()) ~ lang('COLON') }}
{{ aps_display(NEW_USER_POINTS) }}
</span>
</p>
{% if EXPIRE_UNIX %}
<p>
<span class="shop-block">{{ lang('ASS_ITEM_USE_BEFORE') }}</span>
{{ user.format_date(EXPIRE_UNIX) }}
</p>
{% endif %}
<p>
{% if S_ASS_PURCHASE %}
<a class="aps-button-blue" href="{{ U_INVENTORY }}">{{ lang('ASS_INVENTORY_GO') }}</a>
{% else %}
<a class="aps-button-blue" href="{{ path('phpbbstudio_ass_shop') }}">{{ lang('ASS_SHOP_INDEX') }}</a>
{% if U_SEND_PM %}
<a class="aps-button-green" href="{{ U_SEND_PM }}">{{ lang('SEND_PRIVATE_MESSAGE') }}</a>
{% endif %}
{% endif %}
</p>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,64 @@
{% extends '@phpbbstudio_aps/aps_main.html' %}
{% block includes %}
{% INCLUDEJS '@phpbbstudio_ass/js/slick.min.js' %}
{% INCLUDECSS '@phpbbstudio_ass/slick.css' %}
{% INCLUDEJS '@phpbbstudio_ass/js/ass_common.js' %}
{% INCLUDECSS '@phpbbstudio_ass/ass_common.css' %}
{% endblock %}
{% block nav %}
{% for category in ass_shop_categories %}
<li>
<a class="aps-list-item{{ category.S_SELECTED ? ' aps-list-active' }}" href="{{ category.U_VIEW }}" title="{{ category.TITLE }}">
{% if category.ICON %}<i class="icon {{ category.ICON }} fa-fw" aria-hidden="true"></i>{% endif %}
<span class="sr-only">{{ category.TITLE }}</span>
</a>
</li>
{% endfor %}
{% endblock %}
{% block main %}
{{ include('@phpbbstudio_ass/ass_carousel.html') }}
<div class="aps-row">
{% for panel, data in ass_panels %}
{% if attribute(loops, 'ass_' ~ panel) is defined %}
{% set items = attribute(loops, 'ass_' ~ panel) %}
{% if data.carousel %}
<div class="aps-col s12 m6 shop-fake-width">
<div class="aps-panel">
<div class="aps-panel-header">
{% set icon = attribute(_context, 'SHOP_PANEL_' ~ panel|upper ~ '_ICON') %}
{% if icon %}
<i class="icon shop-panel-icon{{ icon }}"></i>
{% endif %}
<h3>{{ lang(data.title) }}</h3>
</div>
<div class="aps-panel-content shop-overflow shop-no-pad">
<div data-shop-carousel="true">
{% for item in items %}
{{ include('@phpbbstudio_ass/ass_item_carousel.html') }}
{% else %}
<div class="aps-center shop-vertical shop-padding shop-panel-height">
<strong class="error">{{ lang('ASS_ITEMS_NONE') }}</strong>
</div>
{% endfor %}
</div>
</div>
<div class="aps-panel-footer shop-carousel-footer"></div>
</div>
</div>
{% else %}
{% for item in items %}
<div class="aps-col s6 m{{ aps_config('ass_panel_' ~ panel ~ '_width') }}">
{{ include('@phpbbstudio_ass/ass_item_panel.html', { ITEM_PANEL_ICON: attribute(_context, 'SHOP_PANEL_' ~ panel|upper ~ '_ICON') }) }}
</div>
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,27 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if available|length %}
<div class="aps-collection">
{% for item in available %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span><br />
<em>
<i class="icon calender-times-o fa-fw" aria-hidden="true"></i>
{{ user.format_date(item.AVAILABLE_UNTIL_UNIX) }}
</em>
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
<i class="icon fa-external-link fa-fw"></i>
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,13 @@
{% block width %}s12 m4{% endblock %}
{% block content %}
<div class="aps-collection">
{% for user in buyers %}
<div class="aps-collection-item aps-avatar">
{{ user.AVATAR ? user.AVATAR }}
<span class="title">{{ user.NAME }}</span>
<p>{{ user.COUNT }}</p>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% block width %}s12 m6 aps-js{% endblock %}
{% block content %}
<canvas data-aps-chart="pie"
data-aps-time="{{ aps_config('aps_display_graph_time') }}"
data-aps-empty="{{ lang('APS_POINTS_DATA_EMPTY', aps_name()) }}"
aria-label="{{ lang('APS_POINTS_PER_FORUM', aps_name()) }}"
role="img">
<p>{{ lang('APS_POINTS_PER_FORUM', aps_name()) }}</p>
</canvas>
<div class="hidden">
{% for forum in aps_forums %}
<div data-aps-labels="{{ forum.NAME|e }}"
data-aps-value="{{ aps_format(forum.POINTS) }}">
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,27 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if featured|length %}
<div class="aps-collection">
{% for item in featured %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span><br />
<em>
<i class="icon {{ aps_config('ass_panel_featured_icon') ?: 'calender-times-o' }} fa-fw" aria-hidden="true"></i>
{{ user.format_date(item.FEATURED_UNTIL_UNIX) }}
</em>
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
<i class="icon fa-external-link fa-fw"></i>
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,13 @@
{% block width %}s12 m4{% endblock %}
{% block content %}
<div class="aps-collection">
{% for user in gifters %}
<div class="aps-collection-item aps-avatar">
{{ user.AVATAR ? user.AVATAR }}
<span class="title">{{ user.NAME }}</span>
<p>{{ user.COUNT }}</p>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,23 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if limited|length %}
<div class="aps-collection">
{% for item in limited %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span>
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
{{ item.STOCK }}
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,23 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if purchases|length %}
<div class="aps-collection">
{% for item in purchases %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span><br />
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
{{ item.PURCHASES }}
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% block width %}s12 m6 aps-js{% endblock %}
{% block content %}
<canvas data-aps-chart="pie"
data-aps-time="{{ aps_config('aps_display_graph_time') }}"
data-aps-empty="{{ lang('APS_POINTS_DATA_EMPTY', aps_name()) }}"
aria-label="{{ lang('ASS_PURCHASES_PER_GROUP', aps_name()) }}"
role="img">
<p>{{ lang('APS_PURCHASES_PER_GROUP', aps_name()) }}</p>
</canvas>
<div class="hidden">
{% for category in purchases_category %}
<div data-aps-labels="{{ category.NAME|e }}"
data-aps-value="{{ category.PURCHASES }}">
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,18 @@
{% block width %}s12 m6 aps-js{% endblock %}
{% block content %}
<canvas data-aps-chart="pie"
data-aps-time="{{ aps_config('aps_display_graph_time') }}"
data-aps-empty="{{ lang('APS_POINTS_DATA_EMPTY', aps_name()) }}"
aria-label="{{ lang('ASS_PURCHASES_PER_GROUP', aps_name()) }}"
role="img">
<p>{{ lang('APS_PURCHASES_PER_GROUP', aps_name()) }}</p>
</canvas>
<div class="hidden">
{% for group in purchases_group %}
<div data-aps-labels="{{ group.NAME|e }}"
data-aps-value="{{ group.PURCHASES }}">
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,27 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if recent|length %}
<div class="aps-collection">
{% for item in recent %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span><br />
<em>
<i class="icon fa-pencil-square-o fa-fw" aria-hidden="true"></i>
{{ user.format_date(item.CREATE_TIME) }}
</em>
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
<i class="icon fa-external-link fa-fw"></i>
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,27 @@
{% block width %}s12 m6{% endblock %}
{% block content %}
{% if sale|length %}
<div class="aps-collection">
{% for item in sale %}
<div class="aps-collection-item aps-avatar">
{% if item.BACKGROUND_SRC %}
<img class="avatar" src="{{ item.BACKGROUND_SRC }}" alt="{{ item.TITLE }}" />
{% else %}
<i class="avatar fa {{ item.ICON ?: aps_config('ass_no_image_icon') }} fa-3x icon-gray" aria-hidden="true"></i>
{% endif %}
<span class="title">{{ item.TITLE }}</span><br />
<em>
<i class="icon {{ aps_config('ass_panel_sale_icon') ?: 'calender-times-o' }} fa-fw" aria-hidden="true"></i>
{{ user.format_date(item.SALE_UNTIL_UNIX) }}
</em>
<a class="aps-secondary-content" href="{{ item.U_VIEW }}">
<i class="icon fa-external-link fa-fw"></i>
</a>
</div>
{% endfor %}
</div>
{% else %}
<div class="error aps-center">{{ lang('ASS_ITEMS_NONE') }}</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,13 @@
{% block width %}s12 m4{% endblock %}
{% block content %}
<div class="aps-collection">
{% for user in spenders %}
<div class="aps-collection-item aps-avatar">
{{ user.AVATAR ? user.AVATAR }}
<span class="title">{{ user.NAME }}</span>
<p>{{ aps_display(user.COUNT) }}</p>
</div>
{% endfor %}
</div>
{% endblock %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_PROFILE_LIST_AFTER %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_PROFILE_LIST_BEFORE %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_QUICK_LINKS_AFTER %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_QUICK_LINKS_BEFORE %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_USER_PROFILE_APPEND %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_NAVBAR_HEADER_USER_PROFILE_PREPEND %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,5 @@
{% if S_ASS_SHOP %}
<div class="studio-spinner" id="studio_spinner">
{% for i in 1..8 %}<span></span>{% endfor %}
</div>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_FOOTER_BREADCRUMB_APPEND %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_FOOTER_TEAMLINK_AFTER %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_FOOTER_TEAMLINK_BEFORE %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_FOOTER_TIMEZONE_AFTER %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_FOOTER_TIMEZONE_BEFORE %}
<li class="rightside">
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_HEADER_NAVIGATION_APPEND %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,7 @@
{% if S_ASS_ENABLED and S_ASS_OVERALL_HEADER_NAVIGATION_PREPEND %}
<li>
<a href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}" role="menuitem">
<i class="icon {{ ASS_SHOP_ICON }} fa-fw" aria-hidden="true"></i><span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% endif %}

View File

@@ -0,0 +1,16 @@
{% if S_ASS_ENABLED %}
<li>
<a class="aps-list-item{{ S_ASS_SHOP ? ' aps-list-active' }}" href="{{ path('phpbbstudio_ass_shop') }}" title="{{ lang('ASS_SHOP') }}">
<i class="icon {{ aps_config('ass_shop_icon') }} fa-fw"></i>
<span>{{ lang('ASS_SHOP') }}</span>
</a>
</li>
{% if S_REGISTERED_USER %}
<li>
<a class="aps-list-item{{ S_ASS_INVENTORY ? ' aps-list-active' }}" href="{{ path('phpbbstudio_ass_inventory') }}" title="{{ lang('ASS_INVENTORY') }}">
<i class="icon {{ aps_config('ass_inventory_icon') }} fa-fw"></i>
<span>{{ lang('ASS_INVENTORY') }}</span>
</a>
</li>
{% endif %}
{% endif %}

View File

@@ -0,0 +1,640 @@
jQuery(function($) {
let studio = {
body: '.aps-body',
link: '[data-shop-link]',
ajax: {
alert: $('#phpbb_alert'),
data: $('#darkenwrapper'),
spinner: $('#studio_spinner'),
timer: null
},
carousel: {
items: $('[data-shop-carousel]'),
item: $('[data-shop-carousel-data]'),
data: {
dotsClass: 'shop-carousel-dots',
nextArrow: '<button class="aps-button-blue shop-carousel-next" type="button"><i class="icon fa-chevron-right fa-fw"></i></button>',
prevArrow: '<button class="aps-button-blue shop-carousel-prev" type="button"><i class="icon fa-chevron-left fa-fw"></i></button>',
draggable: true
}
},
inventory: {
card: $('.shop-inventory-card'),
info: $('.shop-inventory-info'),
items: $('.shop-inventory-list .shop-inventory-panel'),
proxy: $('.shop-inventory-proxy'),
classes: {
card: '.shop-inventory-card',
cardActive: 'shop-inventory-card-active',
cardPaused: 'shop-inventory-card-paused',
item: '.shop-inventory-item',
itemAnimate: 'shop-inventory-item-animate',
itemCount: '.shop-inventory-item-count',
itemTime: '.shop-inventory-item-time',
link: '.shop-inventory-link',
panel: '.shop-inventory-panel',
refund: '.shop-inventory-refund',
row: '.shop-inventory-row',
stack: '.shop-inventory-stack'
}
},
sketch: {
dots: [],
pool: [],
limit: 280,
timer: null,
timeout: 1500,
colours: ['#12a3eb', '#12a3eb', '#2172b8', '#18a39b', '#82c545', '#f8b739', '#f06045', '#ed2861', '#c12680', '#5d3191'],
drawing: null,
overlay: $('.shop-inventory-overlay'),
}
};
/**
* Set up carousel items.
*
* @return {void}
*/
studio.carousel.setup = function() {
let none = false,
data = studio.carousel.item.data();
if (data) {
none = !data.dots && !data.arrows;
delete data['shopCarouselData'];
}
// Register all carousel items
studio.carousel.items.each(function() {
let $footer = $(this).parent().next('.aps-panel-footer');
let slickData = $.extend({}, data, studio.carousel.data);
if ($(this).data('shop-carousel') === 'images') {
$.extend(slickData, {
arrows: false,
asNavFor: $footer,
dots: false,
fade: true,
slidesToScroll: 1,
slidesToShow: 1
});
} else {
$.extend(slickData, {
appendDots: $footer,
appendArrows: $footer
});
}
// Initiate a Slick instance
$(this).slick(slickData);
if ($(this).data('shop-carousel') === 'images') {
$footer.slick({
arrows: false,
asNavFor: this,
centerMode: true,
dots: false,
focusOnSelect: true,
slidesToScroll: 1,
slidesToShow: 3
});
}
// If there are no navigation arrows or dots, remove the footer
if (none) {
$footer.remove();
}
});
/**
* Remove the carousel data element.
*/
studio.carousel.item.remove();
};
studio.carousel.setup();
/**
* Show the loader for Shop AJAX requests.
*
* @return {void}
*/
studio.ajax.loading = function() {
if (!studio.ajax.spinner.is(':visible')) {
studio.ajax.spinner.fadeIn(100);
studio.ajax.clear();
studio.ajax.timer = setTimeout(studio.ajax.timeout, 60000)
}
};
/**
* Show the time out message for Shop AJAX requests.
*
* @return {void}
*/
studio.ajax.timeout = function() {
studio.ajax.message({
title: studio.ajax.alert.attr('data-l-err'),
html: studio.ajax.alert.attr('data-l-timeout-processing-req'),
type: 'error'
});
};
/**
* Get the localised message for Shop AJAX request errors.
*
* @param {string} attribute
* @return {string}
*/
studio.ajax.data.get = function(attribute) {
return $(this).attr(`data-ajax-error-${attribute}`);
};
/**
* Clear the timer for Shop AJAX requests.
*
* @return {void}
*/
studio.ajax.clear = function() {
if (studio.ajax.timer !== null) {
clearTimeout(studio.ajax.timer);
studio.ajax.timer = null;
}
};
/**
* The error handler for Shop AJAX requests.
*
* @param {Object} jqXHR
* @param {Object} jqXHR.responseJSON
* @param {String} jqXHR.responseText
* @param {string} textStatus
* @param {string} errorThrown
* @return {void}
*/
studio.ajax.error = function(jqXHR, textStatus, errorThrown) {
if (typeof console !== 'undefined' && console.log) {
console.log(`AJAX error. status: ${textStatus}, message: ${errorThrown}`);
}
studio.ajax.clear();
let responseText, errorText = '';
try {
responseText = JSON.parse(jqXHR.responseText);
responseText = responseText.message;
} catch (e) {}
if (typeof responseText === 'string' && responseText.length > 0) {
errorText = responseText;
} else if (typeof errorThrown === 'string' && errorThrown.length > 0) {
errorText = errorThrown;
} else {
errorText = studio.ajax.data.get(`text-${textStatus}`);
if (typeof errorText !== 'string' || !errorText.length) {
errorText = studio.ajax.data.get('text');
}
}
studio.ajax.message({
title: typeof jqXHR.responseJSON !== 'undefined' ? jqXHR.responseJSON.title : studio.ajax.data.get('title', false),
html: errorText,
type: 'error'
});
};
/**
* The success handler for Shop AJAX requests.
*
* @param {Object} r
* @param {function} callback
* @return {void}
*/
studio.ajax.success = function(r, callback) {
studio.ajax.clear();
/**
* @param {string} r.MESSAGE_BODY The message template body
* @param {string} r.YES_VALUE The "yes" language string
* @param {string} r.S_CONFIRM_ACTION The confirm_box() action
* @param {string} r.S_HIDDEN_FIELDS The confirm_box() hidden fields
*/
// If there is no confirm action (not a confirm_box())
if (typeof r.S_CONFIRM_ACTION === 'undefined') {
// Call the callback
if (typeof phpbb.ajaxCallbacks[callback] === 'function') {
phpbb.ajaxCallbacks[callback].call(this, r);
}
// Show the message
studio.ajax.message({
title: r.MESSAGE_TITLE,
html: r.MESSAGE_TEXT
});
} else {
// Show the confirm box
studio.ajax.message({
title: r.MESSAGE_TITLE,
html: r.MESSAGE_BODY,
type: 'question',
showCancelButton: true,
confirmButtonText: r.YES_VALUE
}).then((result) => {
// A button was pressed, was it the Confirm button?
if (result.value) {
let data = $('form', swal.getContent()).serialize();
data = data ? `${data}&` : '';
data = data + $(`<form>${r.S_HIDDEN_FIELDS}</form>`).serialize() + `&confirm=${r.YES_VALUE}`;
// Make the request
studio.ajax.request(r.S_CONFIRM_ACTION, callback, 'POST', data);
}
});
$('input', swal.getContent()).on('keydown', function(e) {
if (e.which === 13) {
swal.clickConfirm();
e.preventDefault();
return false;
}
});
}
};
/**
* Show a message for Shop AJAX requests.
*
* @param {Object} options
* @return {swal}
*/
studio.ajax.message = function(options) {
return swal.fire($.extend({
type: 'success',
cancelButtonClass: 'aps-button-alert aps-button-red',
confirmButtonClass: 'aps-button-alert aps-button-green shop-button-active',
showCloseButton: true,
buttonsStyling: false,
}, options));
};
/**
* Make a Shop AJAX request.
*
* @param {string} url
* @param {function} callback
* @param {string=} type
* @param {Object=} data
* @return {void}
*/
studio.ajax.request = function(url, callback, type, data) {
// Start the loading function
studio.ajax.loading();
// Make the request
let request = $.ajax({
url: url,
type: type || 'GET',
data: data || '',
error: studio.ajax.error,
success: function(r) {
studio.ajax.success(r, callback)
},
});
// No matter what the request returns, always stop the spinner
request.always(function() {
if (studio.ajax.spinner.is(':visible')){
studio.ajax.spinner.fadeOut(100);
}
});
};
/**
* Register all shop links for Shop AJAX requests.
*/
$(studio.body).on('click', studio.link, function(e) {
studio.ajax.request($(this).attr('href'), $(this).data('shop-link'));
e.preventDefault();
});
/**
* Remove an inventory item.
*
* @param {Object} r
* @return {void}
*/
studio.inventory.remove = function(r) {
let $items = $(`[data-shop-item="${r.id}"]`),
$section = $items.parents(studio.inventory.classes.panel),
$column = $section.parent('.aps-col'),
$row = $column.parent(studio.inventory.classes.row);
let $stack = $section.find(studio.inventory.classes.stack),
stack = typeof $stack !== 'undefined' ? parseInt($stack.text()) : false;
if (stack === false) {
$items.remove();
$section.remove();
$column.remove();
if ($row.children().length === 0) {
$row.remove();
}
} else {
$items.not($section.find($items)).remove();
if (r.index > 1) {
let replaceUrl = location.href.slice(0, -r.index.toString().length) + '1';
$section.find(studio.inventory.classes.link).attr('href', replaceUrl);
phpbb.history.replaceUrl(replaceUrl);
}
if (stack === 2) {
$stack.parent().remove();
} else {
$stack.text(stack - 1);
}
if (r.item) {
$items.replaceWith(r.item);
} else {
$section.draggable('destroy');
$section.addClass('shop-cursor-pointer');
}
}
};
/**
* Add AJAX callback for purchasing a Shop item.
*
* @param {Object} r The response object
* @param {string} r.points The new points value
* @param {number|bool} r.stock The new stock value
* @return {void}
*/
phpbb.addAjaxCallback('shop_purchase', function(r) {
$('.aps-menu > .aps-list-right > :first-child > span').text(r.points);
if (r.stock !== false) {
let $item = $(`[data-shop-item="${r.id}"]`);
$item.find('.shop-item-stock').text(r.stock);
if (r.stock === 0) {
$item.find('[data-shop-link="shop_purchase"]').remove();
}
}
});
/**
* Add AJAX callback for deleting a Shop item.
*
* @return {void}
*/
phpbb.addAjaxCallback('shop_inventory_delete', studio.inventory.remove);
/**
* Add AJAX callback for using a Shop item.
*
* @param {Object} r The response object
* @param {number} r.id The item identifier
* @param {Object} r.data The item data
* @param {number} r.data.use_count The item use count
* @param {string} r.data.use_time The item use time
* @param {bool} r.delete The delete indicator
* @param {bool} r.success The success indicator
* @param {string} r.file A window location for downloading a file
* @param {int} r.index The item stack index
* @return {void}
*/
phpbb.addAjaxCallback('shop_inventory_use', function(r) {
if (r.success) {
if (r.delete) {
studio.inventory.remove(r);
} else {
let $item = $(`[data-shop-item="${r.id}"]`),
$refund = $item.find(studio.inventory.classes.refund).remove();
$refund.remove();
$refund.next().removeClass('s2').addClass('s4');
if (r.data) {
$item.find(studio.inventory.classes.itemCount).text(r.data['use_count']);
$item.find(studio.inventory.classes.itemTime).text(r.data['use_time']).parent().show();
}
if (r.limit) {
let notice = '<div class="aps-col s12 shop-no-pad"><div class="aps-button-red shop-button-active shop-cursor-normal">' + r.limit + '</div></div>';
$item.find('> .aps-row > :first-child').after(notice);
$item.find('[data-shop-link="shop_inventory_use"]').remove();
}
}
if (r.file) {
setTimeout(function() {
window.location = r.file;
}, 1500);
}
}
});
/**
* Register the inventory items as draggables.
*
* @return {void}
*/
studio.inventory.items.each(function() {
$(this).draggable({
appendTo: studio.body,
containment: studio.body,
helper: 'clone',
scope: 'inventory',
snap: studio.inventory.classes.card,
snapMode: 'inner',
start: function(e, ui) {
studio.inventory.info.children().not(studio.inventory.proxy).remove();
$(this).draggable('instance').offset.click = {
left: Math.floor(ui.helper.width() / 2),
top: Math.floor(ui.helper.height() / 2)
};
studio.sketch.create(ui.helper);
},
stop: function() {
studio.sketch.timer = setTimeout(studio.sketch.destroy, studio.sketch.timeout);
}
});
});
/**
* Register the inventory 'placeholder card' as droppable.
*
* @return {void}
*/
studio.inventory.card.each(function() {
$(this).droppable({
activeClass: studio.inventory.classes.cardActive,
hoverClass: studio.inventory.classes.cardPaused,
scope: 'inventory',
drop: function(e, ui) {
let clone = ui.draggable.clone(false),
link = clone.find(studio.inventory.classes.link),
item = clone.find(studio.inventory.classes.item);
studio.inventory.info.append(clone);
clone.removeClass('ui-draggable ui-draggable-handle');
link.remove();
item.addClass(studio.inventory.classes.itemAnimate);
},
})
});
studio.sketch.dot = function(x, y, radius) {
this.init(x, y, radius);
};
studio.sketch.dot.prototype = {
init: function(x, y, radius) {
this.alive = true;
this.radius = radius || 10;
this.wander = 0.15;
this.theta = random(TWO_PI);
this.drag = 0.92;
this.color = '#12a3eb';
this.x = x || 0.0;
this.y = y || 0.0;
this.vx = 0.0;
this.vy = 0.0;
},
move: function() {
this.x += this.vx;
this.y += this.vy;
this.vx *= this.drag;
this.vy *= this.drag;
this.theta += random(-0.5, 0.5) * this.wander;
this.vx += Math.sin(this.theta) * 0.1;
this.vy += Math.cos(this.theta) * 0.1;
this.radius *= 0.96;
this.alive = this.radius > 0.5;
},
draw: function( ctx ) {
ctx.beginPath();
ctx.arc(this.x, this.y, this.radius, 0, TWO_PI);
ctx.fillStyle = this.color;
ctx.fill();
}
};
studio.sketch.create = function(helper) {
studio.sketch.clear();
studio.sketch.drawing = Sketch.create({
container: studio.sketch.overlay[0],
eventTarget: helper[0],
retina: 'auto'
});
studio.sketch.drawing.spawn = function(x, y) {
let dot, theta, force;
if (studio.sketch.dots.length >= studio.sketch.limit) {
studio.sketch.pool.push(studio.sketch.dots.shift());
}
dot = studio.sketch.pool.length ? studio.sketch.pool.pop() : new studio.sketch.dot();
dot.init( x, y, random(5, 40));
dot.wander = random(0.5, 2.0);
dot.color = random(studio.sketch.colours);
dot.drag = random(0.9, 0.99);
theta = random(TWO_PI);
force = random(2, 8);
dot.vx = Math.sin(theta) * force;
dot.vy = Math.cos(theta) * force;
studio.sketch.dots.push(dot);
};
studio.sketch.drawing.update = function() {
let i, dot;
for (i = studio.sketch.dots.length - 1; i >= 0; i--) {
dot = studio.sketch.dots[i];
if (dot.alive) {
dot.move();
} else {
studio.sketch.pool.push(studio.sketch.dots.splice(i, 1)[0]);
}
}
};
studio.sketch.drawing.draw = function() {
studio.sketch.drawing.globalCompositeOperation = 'lighter';
for (let i = studio.sketch.dots.length - 1; i >= 0; i--) {
studio.sketch.dots[i].draw(studio.sketch.drawing);
}
};
studio.sketch.drawing.mousemove = function() {
let touch, max, i, j, n;
for (i = 0, n = studio.sketch.drawing.touches.length; i < n; i++) {
touch = studio.sketch.drawing.touches[i];
max = random(1, 4);
for (j = 0; j < max; j++) {
studio.sketch.drawing.spawn(touch.x, touch.y);
}
}
};
};
studio.sketch.clear = function() {
if (studio.sketch.timer !== null) {
clearTimeout(studio.sketch.timer);
studio.sketch.timer = null;
}
studio.sketch.destroy();
};
studio.sketch.destroy = function() {
if (studio.sketch.drawing !== null) {
studio.sketch.drawing.clear();
studio.sketch.drawing.destroy();
studio.sketch.drawing = null;
}
};
});

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,631 @@
/* Copyright (C) 2013 Justin Windle, http://soulwire.co.uk */
(function ( root, factory ) {
if ( typeof exports === 'object' ) {
// CommonJS like
module.exports = factory(root, root.document);
} else if ( typeof define === 'function' && define.amd ) {
// AMD
define( function() { return factory( root, root.document ); });
} else {
// Browser global
root.Sketch = factory( root, root.document );
}
}( typeof window !== "undefined" ? window : this, function ( window, document ) {
"use strict";
/*
----------------------------------------------------------------------
Config
----------------------------------------------------------------------
*/
var MATH_PROPS = 'E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min'.split( ' ' );
var HAS_SKETCH = '__hasSketch';
var M = Math;
var CANVAS = 'canvas';
var WEBGL = 'webgl';
var DOM = 'dom';
var doc = document;
var win = window;
var instances = [];
var defaults = {
fullscreen: true,
autostart: true,
autoclear: true,
autopause: true,
container: doc.body,
interval: 1,
globals: true,
retina: false,
type: CANVAS
};
var keyMap = {
8: 'BACKSPACE',
9: 'TAB',
13: 'ENTER',
16: 'SHIFT',
27: 'ESCAPE',
32: 'SPACE',
37: 'LEFT',
38: 'UP',
39: 'RIGHT',
40: 'DOWN'
};
/*
----------------------------------------------------------------------
Utilities
----------------------------------------------------------------------
*/
function isArray( object ) {
return Object.prototype.toString.call( object ) == '[object Array]';
}
function isFunction( object ) {
return typeof object == 'function';
}
function isNumber( object ) {
return typeof object == 'number';
}
function isString( object ) {
return typeof object == 'string';
}
function keyName( code ) {
return keyMap[ code ] || String.fromCharCode( code );
}
function extend( target, source, overwrite ) {
for ( var key in source )
if ( overwrite || !( key in target ) )
target[ key ] = source[ key ];
return target;
}
function proxy( method, context ) {
return function() {
method.apply( context, arguments );
};
}
function clone( target ) {
var object = {};
for ( var key in target ) {
if ( key === 'webkitMovementX' || key === 'webkitMovementY' )
continue;
if ( isFunction( target[ key ] ) )
object[ key ] = proxy( target[ key ], target );
else
object[ key ] = target[ key ];
}
return object;
}
/*
----------------------------------------------------------------------
Constructor
----------------------------------------------------------------------
*/
function constructor( context ) {
var request, handler, target, parent, bounds, index, suffix, clock, node, copy, type, key, val, min, max, w, h;
var counter = 0;
var touches = [];
var resized = false;
var setup = false;
var ratio = win.devicePixelRatio || 1;
var isDiv = context.type == DOM;
var is2D = context.type == CANVAS;
var mouse = {
x: 0.0, y: 0.0,
ox: 0.0, oy: 0.0,
dx: 0.0, dy: 0.0
};
var eventMap = [
context.eventTarget || context.element,
pointer, 'mousedown', 'touchstart',
pointer, 'mousemove', 'touchmove',
pointer, 'mouseup', 'touchend',
pointer, 'click',
pointer, 'mouseout',
pointer, 'mouseover',
doc,
keypress, 'keydown', 'keyup',
win,
active, 'focus', 'blur',
resize, 'resize'
];
var keys = {}; for ( key in keyMap ) keys[ keyMap[ key ] ] = false;
function trigger( method ) {
if ( isFunction( method ) )
method.apply( context, [].splice.call( arguments, 1 ) );
}
function bind( on ) {
for ( index = 0; index < eventMap.length; index++ ) {
node = eventMap[ index ];
if ( isString( node ) )
target[ ( on ? 'add' : 'remove' ) + 'EventListener' ].call( target, node, handler, false );
else if ( isFunction( node ) )
handler = node;
else target = node;
}
}
function update() {
cAF( request );
request = rAF( update );
if ( !setup ) {
trigger( context.setup );
setup = isFunction( context.setup );
}
if ( !resized ) {
trigger( context.resize );
resized = isFunction( context.resize );
}
if ( context.running && !counter ) {
context.dt = ( clock = +new Date() ) - context.now;
context.millis += context.dt;
context.now = clock;
trigger( context.update );
// Pre draw
if ( is2D ) {
if ( context.retina ) {
context.save();
if (context.autoclear) {
context.scale( ratio, ratio );
}
}
if ( context.autoclear )
context.clear();
}
// Draw
trigger( context.draw );
// Post draw
if ( is2D && context.retina )
context.restore();
}
counter = ++counter % context.interval;
}
function resize() {
target = isDiv ? context.style : context.canvas;
suffix = isDiv ? 'px' : '';
w = context.width;
h = context.height;
if ( context.fullscreen ) {
h = context.height = win.innerHeight;
w = context.width = win.innerWidth;
}
if ( context.retina && is2D && ratio ) {
target.style.height = h + 'px';
target.style.width = w + 'px';
w *= ratio;
h *= ratio;
}
if ( target.height !== h )
target.height = h + suffix;
if ( target.width !== w )
target.width = w + suffix;
if ( is2D && !context.autoclear && context.retina )
context.scale( ratio, ratio );
if ( setup ) trigger( context.resize );
}
function align( touch, target ) {
bounds = target.getBoundingClientRect();
touch.x = touch.pageX - bounds.left - (win.scrollX || win.pageXOffset);
touch.y = touch.pageY - bounds.top - (win.scrollY || win.pageYOffset);
return touch;
}
function augment( touch, target ) {
align( touch, context.element );
target = target || {};
target.ox = target.x || touch.x;
target.oy = target.y || touch.y;
target.x = touch.x;
target.y = touch.y;
target.dx = target.x - target.ox;
target.dy = target.y - target.oy;
return target;
}
function process( event ) {
event.preventDefault();
copy = clone( event );
copy.originalEvent = event;
if ( copy.touches ) {
touches.length = copy.touches.length;
for ( index = 0; index < copy.touches.length; index++ )
touches[ index ] = augment( copy.touches[ index ], touches[ index ] );
} else {
touches.length = 0;
touches[0] = augment( copy, mouse );
}
extend( mouse, touches[0], true );
return copy;
}
function pointer( event ) {
event = process( event );
min = ( max = eventMap.indexOf( type = event.type ) ) - 1;
context.dragging =
/down|start/.test( type ) ? true :
/up|end/.test( type ) ? false :
context.dragging;
while( min )
isString( eventMap[ min ] ) ?
trigger( context[ eventMap[ min-- ] ], event ) :
isString( eventMap[ max ] ) ?
trigger( context[ eventMap[ max++ ] ], event ) :
min = 0;
}
function keypress( event ) {
key = event.keyCode;
val = event.type == 'keyup';
keys[ key ] = keys[ keyName( key ) ] = !val;
trigger( context[ event.type ], event );
}
function active( event ) {
if ( context.autopause )
( event.type == 'blur' ? stop : start )();
trigger( context[ event.type ], event );
}
// Public API
function start() {
context.now = +new Date();
context.running = true;
}
function stop() {
context.running = false;
}
function toggle() {
( context.running ? stop : start )();
}
function clear() {
if ( is2D )
context.clearRect( 0, 0, context.width * ratio, context.height * ratio );
}
function destroy() {
parent = context.element.parentNode;
index = instances.indexOf( context );
if ( parent ) parent.removeChild( context.element );
if ( ~index ) instances.splice( index, 1 );
bind( false );
stop();
}
extend( context, {
touches: touches,
mouse: mouse,
keys: keys,
dragging: false,
running: false,
millis: 0,
now: NaN,
dt: NaN,
destroy: destroy,
toggle: toggle,
clear: clear,
start: start,
stop: stop
});
instances.push( context );
return ( context.autostart && start(), bind( true ), resize(), update(), context );
}
/*
----------------------------------------------------------------------
Global API
----------------------------------------------------------------------
*/
var element, context, Sketch = {
CANVAS: CANVAS,
WEB_GL: WEBGL,
WEBGL: WEBGL,
DOM: DOM,
instances: instances,
install: function( context ) {
if ( !context[ HAS_SKETCH ] ) {
for ( var i = 0; i < MATH_PROPS.length; i++ )
context[ MATH_PROPS[i] ] = M[ MATH_PROPS[i] ];
extend( context, {
TWO_PI: M.PI * 2,
HALF_PI: M.PI / 2,
QUARTER_PI: M.PI / 4,
random: function( min, max ) {
if ( isArray( min ) )
return min[ ~~( M.random() * min.length ) ];
if ( !isNumber( max ) )
max = min || 1, min = 0;
return min + M.random() * ( max - min );
},
lerp: function( min, max, amount ) {
return min + amount * ( max - min );
},
map: function( num, minA, maxA, minB, maxB ) {
return ( num - minA ) / ( maxA - minA ) * ( maxB - minB ) + minB;
}
});
context[ HAS_SKETCH ] = true;
}
},
create: function( options ) {
options = extend( options || {}, defaults );
if ( options.globals ) Sketch.install( self );
element = options.element = options.element || doc.createElement( options.type === DOM ? 'div' : 'canvas' );
context = options.context = options.context || (function() {
switch( options.type ) {
case CANVAS:
return element.getContext( '2d', options );
case WEBGL:
return element.getContext( 'webgl', options ) || element.getContext( 'experimental-webgl', options );
case DOM:
return element.canvas = element;
}
})();
( options.container || doc.body ).appendChild( element );
return Sketch.augment( context, options );
},
augment: function( context, options ) {
options = extend( options || {}, defaults );
options.element = context.canvas || context;
options.element.className += ' sketch';
extend( context, options, true );
return constructor( context );
}
};
/*
----------------------------------------------------------------------
Shims
----------------------------------------------------------------------
*/
var vendors = [ 'ms', 'moz', 'webkit', 'o' ];
var scope = self;
var then = 0;
var a = 'AnimationFrame';
var b = 'request' + a;
var c = 'cancel' + a;
var rAF = scope[ b ];
var cAF = scope[ c ];
for ( var i = 0; i < vendors.length && !rAF; i++ ) {
rAF = scope[ vendors[ i ] + 'Request' + a ];
cAF = scope[ vendors[ i ] + 'Cancel' + a ];
}
scope[ b ] = rAF = rAF || function( callback ) {
var now = +new Date();
var dt = M.max( 0, 16 - ( now - then ) );
var id = setTimeout( function() {
callback( now + dt );
}, dt );
then = now + dt;
return id;
};
scope[ c ] = cAF = cAF || function( id ) {
clearTimeout( id );
};
/*
----------------------------------------------------------------------
Output
----------------------------------------------------------------------
*/
return Sketch;
}));

View File

@@ -0,0 +1,2 @@
/* Copyright (C) 2013 Justin Windle, http://soulwire.co.uk */
!function(e,t){"object"==typeof exports?module.exports=t(e,e.document):"function"==typeof define&&define.amd?define(function(){return t(e,e.document)}):e.Sketch=t(e,e.document)}("undefined"!=typeof window?window:this,function(e,t){"use strict";function n(e){return"[object Array]"==Object.prototype.toString.call(e)}function o(e){return"function"==typeof e}function r(e){return"number"==typeof e}function i(e){return"string"==typeof e}function u(e){return C[e]||String.fromCharCode(e)}function a(e,t,n){for(var o in t)!n&&o in e||(e[o]=t[o]);return e}function c(e,t){return function(){e.apply(t,arguments)}}function l(e){var t={};for(var n in e)"webkitMovementX"!==n&&"webkitMovementY"!==n&&(o(e[n])?t[n]=c(e[n],e):t[n]=e[n]);return t}function s(e){function t(t){o(t)&&t.apply(e,[].splice.call(arguments,1))}function n(e){for(_=0;_<ee.length;_++)B=ee[_],i(B)?S[(e?"add":"remove")+"EventListener"].call(S,B,N,!1):o(B)?N=B:S=B}function r(){I(A),A=R(r),K||(t(e.setup),K=o(e.setup)),U||(t(e.resize),U=o(e.resize)),e.running&&!q&&(e.dt=(z=+new Date)-e.now,e.millis+=e.dt,e.now=z,t(e.update),Z&&(e.retina&&(e.save(),e.autoclear&&e.scale(V,V)),e.autoclear&&e.clear()),t(e.draw),Z&&e.retina&&e.restore()),q=++q%e.interval}function c(){S=J?e.style:e.canvas,D=J?"px":"",Y=e.width,j=e.height,e.fullscreen&&(j=e.height=v.innerHeight,Y=e.width=v.innerWidth),e.retina&&Z&&V&&(S.style.height=j+"px",S.style.width=Y+"px",Y*=V,j*=V),S.height!==j&&(S.height=j+D),S.width!==Y&&(S.width=Y+D),Z&&!e.autoclear&&e.retina&&e.scale(V,V),K&&t(e.resize)}function s(e,t){return L=t.getBoundingClientRect(),e.x=e.pageX-L.left-(v.scrollX||v.pageXOffset),e.y=e.pageY-L.top-(v.scrollY||v.pageYOffset),e}function f(t,n){return s(t,e.element),n=n||{},n.ox=n.x||t.x,n.oy=n.y||t.y,n.x=t.x,n.y=t.y,n.dx=n.x-n.ox,n.dy=n.y-n.oy,n}function d(e){if(e.preventDefault(),G=l(e),G.originalEvent=e,G.touches)for(Q.length=G.touches.length,_=0;_<G.touches.length;_++)Q[_]=f(G.touches[_],Q[_]);else Q.length=0,Q[0]=f(G,$);return a($,Q[0],!0),G}function p(n){for(n=d(n),M=(X=ee.indexOf(W=n.type))-1,e.dragging=!!/down|start/.test(W)||!/up|end/.test(W)&&e.dragging;M;)i(ee[M])?t(e[ee[M--]],n):i(ee[X])?t(e[ee[X++]],n):M=0}function g(n){F=n.keyCode,H="keyup"==n.type,te[F]=te[u(F)]=!H,t(e[n.type],n)}function m(n){e.autopause&&("blur"==n.type?E:y)(),t(e[n.type],n)}function y(){e.now=+new Date,e.running=!0}function E(){e.running=!1}function k(){(e.running?E:y)()}function P(){Z&&e.clearRect(0,0,e.width*V,e.height*V)}function T(){O=e.element.parentNode,_=b.indexOf(e),O&&O.removeChild(e.element),~_&&b.splice(_,1),n(!1),E()}var A,N,S,O,L,_,D,z,B,G,W,F,H,M,X,Y,j,q=0,Q=[],U=!1,K=!1,V=v.devicePixelRatio||1,J=e.type==w,Z=e.type==h,$={x:0,y:0,ox:0,oy:0,dx:0,dy:0},ee=[e.eventTarget||e.element,p,"mousedown","touchstart",p,"mousemove","touchmove",p,"mouseup","touchend",p,"click",p,"mouseout",p,"mouseover",x,g,"keydown","keyup",v,m,"focus","blur",c,"resize"],te={};for(F in C)te[C[F]]=!1;return a(e,{touches:Q,mouse:$,keys:te,dragging:!1,running:!1,millis:0,now:NaN,dt:NaN,destroy:T,toggle:k,clear:P,start:y,stop:E}),b.push(e),e.autostart&&y(),n(!0),c(),r(),e}for(var f,d,p="E LN10 LN2 LOG2E LOG10E PI SQRT1_2 SQRT2 abs acos asin atan ceil cos exp floor log round sin sqrt tan atan2 pow max min".split(" "),g="__hasSketch",m=Math,h="canvas",y="webgl",w="dom",x=t,v=e,b=[],E={fullscreen:!0,autostart:!0,autoclear:!0,autopause:!0,container:x.body,interval:1,globals:!0,retina:!1,type:h},C={8:"BACKSPACE",9:"TAB",13:"ENTER",16:"SHIFT",27:"ESCAPE",32:"SPACE",37:"LEFT",38:"UP",39:"RIGHT",40:"DOWN"},k={CANVAS:h,WEB_GL:y,WEBGL:y,DOM:w,instances:b,install:function(e){if(!e[g]){for(var t=0;t<p.length;t++)e[p[t]]=m[p[t]];a(e,{TWO_PI:2*m.PI,HALF_PI:m.PI/2,QUARTER_PI:m.PI/4,random:function(e,t){return n(e)?e[~~(m.random()*e.length)]:(r(t)||(t=e||1,e=0),e+m.random()*(t-e))},lerp:function(e,t,n){return e+n*(t-e)},map:function(e,t,n,o,r){return(e-t)/(n-t)*(r-o)+o}}),e[g]=!0}},create:function(e){return e=a(e||{},E),e.globals&&k.install(self),f=e.element=e.element||x.createElement(e.type===w?"div":"canvas"),d=e.context=e.context||function(){switch(e.type){case h:return f.getContext("2d",e);case y:return f.getContext("webgl",e)||f.getContext("experimental-webgl",e);case w:return f.canvas=f}}(),(e.container||x.body).appendChild(f),k.augment(d,e)},augment:function(e,t){return t=a(t||{},E),t.element=e.canvas||e,t.element.className+=" sketch",a(e,t,!0),s(e)}},P=["ms","moz","webkit","o"],T=self,A=0,N="AnimationFrame",S="request"+N,O="cancel"+N,R=T[S],I=T[O],L=0;L<P.length&&!R;L++)R=T[P[L]+"Request"+N],I=T[P[L]+"Cancel"+N];return T[S]=R=R||function(e){var t=+new Date,n=m.max(0,16-(t-A)),o=setTimeout(function(){e(t+n)},n);return A=t+n,o},T[O]=I=I||function(e){clearTimeout(e)},k});

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,347 @@
/**
*
* phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package.
*
* @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
.aps-body {
margin: 0;
padding: 0;
}
.shop-exception {
position: relative;
overflow: hidden;
min-height: 600px;
}
.shop-exception-title {
position: relative;
margin: 32px;
}
.shop-exception-title .aps-panel-content {
padding: 16px;
}
.shop-exception-title h1 {
color: #313131;
margin: 0;
padding: 0;
}
.shop-exception-text {
z-index: 2;
width: 60%;
margin: 32px 32px 150px;
}
.shop-exception-text .aps-panel-content {
color: #3d4851;
padding: 16px;
}
.shop-exception-code {
border-radius: 4px;
box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
position: absolute;
z-index: 3;
top: 100%;
right: -20px;
transform-origin: center -20px;
animation: swing ease-in-out 1s infinite alternate;
}
.shop-exception-code span {
font-size: 32px;
background: #3d4851;
border: 4px solid #f9f9f9;
border-radius: 4px;
color: #ffffff;
display: block;
margin: 0;
padding: 4px 12px;
}
.shop-exception-code:after {
border: 1px solid #999999;
border-right: none;
border-bottom: none;
position: absolute;
z-index: 0;
top: -10px;
left: calc(50% - 5px);
width: 20px;
height: 20px;
content: "";
transform: rotate(45deg);
}
.shop-exception-code:before {
background: #000000;
border-radius: 50%;
position: absolute;
z-index: 5;
top: -14px;
left: 54%;
width: 5px;
height: 5px;
content: "";
}
@keyframes swing {
0% { transform: rotate(3deg); }
100% { transform: rotate(-3deg); }
}
.shop-exception .fa-male,
.shop-exception .fa-comment,
.shop-exception .fa-map-signs,
.shop-exception .shop-icons {
color: #3d4851;
position: absolute;
}
.shop-exception .fa-male {
font-size: 36px;
bottom: 0;
left: 400px;
}
.shop-exception .fa-comment {
font-size: 24px;
bottom: 36px;
left: 380px;
}
.shop-exception .fa-map-signs {
font-size: 18px;
bottom: 27px;
left: 262px;
}
.shop-exception .shop-icons {
font-size: 12px;
color: #ffffff;
z-index: 1;
bottom: 41px;
left: 390px;
}
.shop-exception .shop-icons:before {
content: "";
animation: icons 30s ease-in-out infinite;
}
.shop-exception .fa-trees {
position: absolute;
bottom: 0;
left: 185px;
display: inline-block;
width: 100px;
height: 20px;
}
.shop-exception .fa-trees.left {
left: 85px;
}
.shop-exception .fa-trees.right {
right: 0;
left: unset;
}
.shop-exception .fa-trees .fa-tree {
font-size: 18px;
background: #3d4851;
-webkit-background-clip: text;
text-shadow: -2px 0 0 #ffffff;
color: transparent;
position: absolute;
z-index: 1;
bottom: 0;
-webkit-text-fill-color: transparent;
}
.shop-exception .fa-trees .fa-tree:nth-child(1) { left: 12px; }
.shop-exception .fa-trees .fa-tree:nth-child(2) { left: 0; }
.shop-exception .fa-trees .fa-tree:nth-child(3) {
text-shadow: 2px 0 0 #f9f9f9;
left: 19px;
}
.shop-exception-mountain,
.shop-exception-mountain-left,
.shop-exception-mountain-right {
color: #3d4851;
position: absolute;
bottom: -50px;
left: -10px;
width: 200px;
height: 200px;
fill: #3d4851;
}
.shop-exception-mountain {
bottom: -60px;
left: 100px;
}
.shop-exception-mountain-right {
right: 0;
bottom: -20px;
left: unset;
}
.shop-exception-tree,
.shop-exception-trees {
position: absolute;
bottom: 0;
left: 500px;
width: 60px;
height: 60px;
fill: #3d4851;
}
.shop-exception-tree {
left: 550px;
}
.shop-exception-pot svg {
position: absolute;
z-index: 1;
right: 20%;
bottom: 0;
width: 200px;
height: 200px;
}
.shop-exception-rainbow {
position: absolute;
z-index: 1;
right: 0;
bottom: 190px;
overflow: hidden;
width: calc(20% + 154px);
height: calc(100% - 200px - 128px - 39px - 20px);
}
.shop-exception-rainbow span {
border-top: 5px solid transparent;
border-left: 21.5px solid transparent;
position: absolute;
width: 100%;
height: 100%;
}
.shop-exception-rainbow span:nth-of-type(1) {
border-color: #5bd6fd;
border-top-left-radius: 50%;
}
.shop-exception-rainbow span:nth-of-type(2) {
border-color: #1fd7c3;
border-top-left-radius: 45%;
bottom: -5px;
left: 21.5px;
}
.shop-exception-rainbow span:nth-of-type(3) {
border-color: #ffe76c;
border-top-left-radius: 40%;
bottom: -10px;
left: 43px;
}
.shop-exception-rainbow span:nth-of-type(4) {
border-color: #ffb44d;
border-top-left-radius: 35%;
bottom: -15px;
left: 65px;
}
.shop-exception-rainbow span:nth-of-type(5) {
border-color: #ff7f5a;
border-top-left-radius: 30%;
bottom: -20px;
left: 86px;
}
@keyframes icons {
0% { content: "\f128"; }
2% { opacity: 1; }
15% {
opacity: 1;
content: "\f128";
}
18% { opacity: 0; }
20% { content: "\f05e"; }
22% { opacity: 1; }
35% {
opacity: 1;
content: "\f05e";
}
38% { opacity: 0; }
40% {
content: "\f12a";
}
42% { opacity: 1; }
55% {
opacity: 1;
content: "\f12a";
}
58% { opacity: 0; }
60% { content: "\f129"; }
62% { opacity: 1; }
75% {
opacity: 1;
content: "\f129";
}
78% { opacity: 0; }
80% { content: "\f00d"; }
82% { opacity: 1; }
95% {
opacity: 1;
content: "\f00d";
}
98% { opacity: 0; }
100% { content: "\f128"; }
}
@media all and (max-width: 800px) {
.shop-exception-text {
width: initial;
}
.shop-exception-tree,
.shop-exception-trees,
.shop-exception .fa-male,
.shop-exception .fa-comment,
.shop-exception .fa-map-signs,
.shop-exception .shop-icons {
display: none;
}
}

View File

@@ -0,0 +1,314 @@
/**
*
* phpBB Studio - Advanced Shop System. An extension for the phpBB Forum Software package.
*
* @copyright (c) 2019, phpBB Studio, https://www.phpbbstudio.com
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
.shop-item-help-label {
display: none;
}
@media all and (min-width: 800px) {
.aps-body {
margin: 0;
padding: 0;
}
.shop-item-help {
padding: 21px;
}
.shop-item-help-label {
display: block;
}
.shop-item-help-input {
display: none;
}
.shop-item-help,
.shop-item-help > .aps-row,
.shop-item-help-input:checked + .shop-item-help .shop-item-helper {
-webkit-transition: all 0.3s ease-in-out;
-moz-transition: all 0.3s ease-in-out;
-o-transition: all 0.3s ease-in-out;
transition: all 0.3s ease-in-out;
}
.shop-item-help-input:checked {
opacity: 0;
position: fixed;
z-index: 15;
top: 0;
left: 0;
display: block;
width: 100vw;
height: 100vh;
}
.shop-item-help-input:checked + .shop-item-help {
background: #d6d6d6;
}
.shop-item-help-input:checked + .shop-item-help > .aps-row {
-webkit-transform: scale(0.8);
-moz-transform: scale(0.8);
-o-transform: scale(0.8);
-ms-transform: scale(0.8);
transform: scale(0.8);
}
.shop-item-help-input:checked + .shop-item-help > .aps-row .shop-title {
background-color: #f9f9f9;
border-color: #bcbcbc;
}
.shop-item-help-input:checked + .shop-item-help > .aps-row .aps-panel,
.shop-item-help-input:checked + .shop-item-help > .aps-row .aps-panel-header,
.shop-item-help-input:checked + .shop-item-help > .aps-row .aps-panel-footer {
background-color: #f9f9f9;
}
.shop-item-help-input:checked + .shop-item-help > .aps-row .shop-panel-background {
-webkit-filter: grayscale(50%);
filter: grayscale(50%);
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper {
opacity: 1;
z-index: 11;
height: auto;
}
.shop-item-helper {
font-size: 16px;
font-weight: normal;
font-style: italic;
text-align: center;
background: #ffffff;
border: 1px solid #12a3eb;
border-radius: 4px;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.9);
color: #313131;
opacity: 0;
position: absolute;
display: inline-block;
min-width: 200px;
height: 0;
padding: 4px 8px;
-webkit-transform: scale(1.5);
-moz-transform: scale(1.5);
-o-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.top-left,
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.top-right {
top: 100%;
left: 50%;
-webkit-transform: scale(1.2) translateY(100%);
-moz-transform: scale(1.2) translateY(100%);
-o-transform: scale(1.2) translateY(100%);
-ms-transform: scale(1.2) translateY(100%);
transform: scale(1.2) translateY(100%);
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.top-right {
right: 50%;
left: unset;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.bottom-left,
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.bottom-right {
bottom: 100%;
left: 50%;
-webkit-transform: scale(1.2) translateY(-100%);
-moz-transform: scale(1.2) translateY(-100%);
-o-transform: scale(1.2) translateY(-100%);
-ms-transform: scale(1.2) translateY(-100%);
transform: scale(1.2) translateY(-100%);
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.bottom-right {
right: 50%;
left: unset;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.left {
top: 50%;
left: 100%;
-webkit-transform: scale(1.2) translate(48px, calc(-50% + 4px));
-moz-transform: scale(1.2) translate(48px, calc(-50% + 4px));
-o-transform: scale(1.2) translate(48px, calc(-50% + 4px));
-ms-transform: scale(1.2) translate(48px, calc(-50% + 4px));
transform: scale(1.2) translate(48px, calc(-50% + 4px));
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.right {
top: 50%;
right: 100%;
-webkit-transform: scale(1.2) translate(-48px, calc(-50% + 4px));
-moz-transform: scale(1.2) translate(-48px, calc(-50% + 4px));
-o-transform: scale(1.2) translate(-48px, calc(-50% + 4px));
-ms-transform: scale(1.2) translate(-48px, calc(-50% + 4px));
transform: scale(1.2) translate(-48px, calc(-50% + 4px));
}
.shop-item-helper:after {
font-family: FontAwesome, sans-serif;
font-weight: bold;
font-style: normal;
line-height: 21px;
text-align: center;
text-indent: 1px;
background: linear-gradient(#59bef1, #1092d3);
border: 1px solid #12a3eb;
border-radius: 50%;
text-shadow: none;
color: #ffffff;
position: absolute;
width: 24px;
height: 24px;
}
.shop-item-helper.top-left:after {
top: 0;
left: 0;
content: "\f106";
transform: translate(50%, -50%);
}
.shop-item-helper.top-right:after {
top: 0;
right: 0;
content: "\f106";
transform: translate(-50%, -50%);
}
.shop-item-helper.bottom-left:after {
bottom: 0;
left: 0;
content: "\f107";
transform: translate(50%, 50%);
}
.shop-item-helper.bottom-right:after {
text-indent: 1px;
right: 0;
bottom: 0;
content: "\f107";
transform: translate(-50%, 50%);
}
.shop-item-helper.right:after {
text-indent: 3px;
top: 50%;
right: 0;
content: "\f105";
transform: translate(50%, -50%);
}
.shop-item-helper.left:after {
text-indent: -1px;
top: 50%;
left: 0;
content: "\f104";
transform: translate(-50%, -50%);
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper,
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-3 {
-webkit-transition-delay: 0.3s;
-moz-transition-delay: 0.3s;
-o-transition-delay: 0.3s;
transition-delay: 0.3s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-4 {
-webkit-transition-delay: 0.4s;
-moz-transition-delay: 0.4s;
-o-transition-delay: 0.4s;
transition-delay: 0.4s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-5 {
-webkit-transition-delay: 0.5s;
-moz-transition-delay: 0.5s;
-o-transition-delay: 0.5s;
transition-delay: 0.5s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-6 {
-webkit-transition-delay: 0.6s;
-moz-transition-delay: 0.6s;
-o-transition-delay: 0.6s;
transition-delay: 0.6s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-7 {
-webkit-transition-delay: 0.7s;
-moz-transition-delay: 0.7s;
-o-transition-delay: 0.7s;
transition-delay: 0.7s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-8 {
-webkit-transition-delay: 0.8s;
-moz-transition-delay: 0.8s;
-o-transition-delay: 0.8s;
transition-delay: 0.8s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-9 {
-webkit-transition-delay: 0.9s;
-moz-transition-delay: 0.9s;
-o-transition-delay: 0.9s;
transition-delay: 0.9s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-10 {
-webkit-transition-delay: 1s;
-moz-transition-delay: 1s;
-o-transition-delay: 1s;
transition-delay: 1s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-11 {
-webkit-transition-delay: 1.1s;
-moz-transition-delay: 1.1s;
-o-transition-delay: 1.1s;
transition-delay: 1.1s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-12 {
-webkit-transition-delay: 1.2s;
-moz-transition-delay: 1.2s;
-o-transition-delay: 1.2s;
transition-delay: 1.2s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-13 {
-webkit-transition-delay: 1.3s;
-moz-transition-delay: 1.3s;
-o-transition-delay: 1.3s;
transition-delay: 1.3s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-14 {
-webkit-transition-delay: 1.4s;
-moz-transition-delay: 1.4s;
-o-transition-delay: 1.4s;
transition-delay: 1.4s;
}
.shop-item-help-input:checked + .shop-item-help .shop-item-helper.delay-15 {
-webkit-transition-delay: 1.5s;
-moz-transition-delay: 1.5s;
-o-transition-delay: 1.5s;
transition-delay: 1.5s;
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by Fontastic.me</metadata>
<defs>
<font id="slick" horiz-adv-x="512">
<font-face font-family="slick" units-per-em="512" ascent="480" descent="-32"/>
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#8594;" d="M241 113l130 130c4 4 6 8 6 13 0 5-2 9-6 13l-130 130c-3 3-7 5-12 5-5 0-10-2-13-5l-29-30c-4-3-6-7-6-12 0-5 2-10 6-13l87-88-87-88c-4-3-6-8-6-13 0-5 2-9 6-12l29-30c3-3 8-5 13-5 5 0 9 2 12 5z m234 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8592;" d="M296 113l29 30c4 3 6 7 6 12 0 5-2 10-6 13l-87 88 87 88c4 3 6 8 6 13 0 5-2 9-6 12l-29 30c-3 3-8 5-13 5-5 0-9-2-12-5l-130-130c-4-4-6-8-6-13 0-5 2-9 6-13l130-130c3-3 7-5 12-5 5 0 10 2 13 5z m179 143c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#8226;" d="M475 256c0-40-9-77-29-110-20-34-46-60-80-80-33-20-70-29-110-29-40 0-77 9-110 29-34 20-60 46-80 80-20 33-29 70-29 110 0 40 9 77 29 110 20 34 46 60 80 80 33 20 70 29 110 29 40 0 77-9 110-29 34-20 60-46 80-80 20-33 29-70 29-110z"/>
<glyph unicode="&#97;" d="M475 439l0-128c0-5-1-9-5-13-4-4-8-5-13-5l-128 0c-8 0-13 3-17 11-3 7-2 14 4 20l40 39c-28 26-62 39-100 39-20 0-39-4-57-11-18-8-33-18-46-32-14-13-24-28-32-46-7-18-11-37-11-57 0-20 4-39 11-57 8-18 18-33 32-46 13-14 28-24 46-32 18-7 37-11 57-11 23 0 44 5 64 15 20 9 38 23 51 42 2 1 4 3 7 3 3 0 5-1 7-3l39-39c2-2 3-3 3-6 0-2-1-4-2-6-21-25-46-45-76-59-29-14-60-20-93-20-30 0-58 5-85 17-27 12-51 27-70 47-20 19-35 43-47 70-12 27-17 55-17 85 0 30 5 58 17 85 12 27 27 51 47 70 19 20 43 35 70 47 27 12 55 17 85 17 28 0 55-5 81-15 26-11 50-26 70-45l37 37c6 6 12 7 20 4 8-4 11-9 11-17z"/>
</font></defs></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 79.536 79.536">
<g>
<path d="M79.536,61.441H0l3.946-6.846l12.285-21.284c2.175-3.76,5.722-3.76,7.889,0
c0,0,2.853,4.942,3.197,5.52c1.634-2.825,10.341-17.916,10.341-17.916c2.18-3.76,5.725-3.76,7.894,0l17.301,29.968
c0.891-1.548,1.771-3.064,2.443-4.256c1.574-2.713,4.127-2.713,5.707,0c1.563,2.724,4.127,7.166,5.701,9.869L79.536,61.441z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 98 98">
<g>
<path d="M96.44,10.932L73.294,48.637c-0.857,1.399-2.54,1.626-3.736,0.506l-11.195-10.48
c-1.197-1.12-2.92-0.919-3.826,0.449L38.823,62.814c-0.906,1.367-2.641,1.582-3.853,0.478l-7.32-6.675
c-1.212-1.104-3.044-0.962-4.07,0.317L0.533,85.673C-0.494,86.952,0.009,88,1.646,88H98V11.374C98,9.733,97.297,9.532,96.44,10.932
z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 402 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="-271 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path d="m121,422c66.16797,0 120,-61.55859 120,-136c0,-58.67187 -33.47656,-92.71484 -35.1875,-95.74219c0.85938,-4.75781 5.1875,-19.24609 5.1875,-39.25781c0,-66.16797 -40.37109,-121 -90,-121s-91,54.83203 -91,121c0,19.98828 4.35156,34.64453 5.1875,39.25781c-1.69531,3 -35.1875,35.9961 -35.1875,95.74219c0,74.44141 54.83203,136 121,136zm0,0"/>
<path d="m15,542l482,0c8.28906,0 15,-6.71094 15,-15s-6.71094,-15 -15,-15l-15,0l0,-30l15,0c8.28906,0 15,-6.71094 15,-15s-6.71094,-15 -15,-15l-15,0l0,-45c0,-8.28906 -6.71094,-15 -15,-15l-91,0c-8.28906,0 -15,6.71094 -15,15l0,45l-15,0c-8.28906,0 -15,6.71094 -15,15s6.71094,15 15,15l15,0l0,30l-60,0l0,-63.32422c-9.69531,2.17188 -19.72656,3.32422 -30,3.32422c-10.11719,0 -20.125,-1.27344 -30,-3.5625l0,63.5625l-90,0l0,-63.32422c-9.69531,2.17188 -19.72656,3.32422 -30,3.32422s-20.30469,-1.15234 -30,-3.32422l0,63.32422l-76,0c-8.28906,0 -15,6.71094 -15,15s6.71094,15 15,15zm376,-60l61,0l0,30l-61,0l0,-30zm0,0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,5 @@
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path d="m121,422c66.16797,0 120,-61.55859 120,-136c0,-58.67187 -33.47656,-92.71484 -35.1875,-95.74219c0.85938,-4.75781 5.1875,-19.24609 5.1875,-39.25781c0,-66.16797 -40.37109,-121 -90,-121s-91,54.83203 -91,121c0,19.98828 4.35156,34.64453 5.1875,39.25781c-1.69531,3 -35.1875,35.9961 -35.1875,95.74219c0,74.44141 54.83203,136 121,136zm0,0"/>
<path d="m237.99609,183.125c27.14454,38.52344 33.00391,76.625 33.00391,102.875c0,48.60156 -19.31641,93.22656 -49.81641,123.44922c15.21875,7.87109 31.9961,12.55078 49.81641,12.55078c66.16797,0 120,-61.55859 120,-136c0,-59.74609 -33.49219,-92.74219 -35.1875,-95.74219c0.83594,-4.61328 5.1875,-19.26953 5.1875,-39.25781c0,-66.16797 -40.37109,-121 -90,-121c-21.46484,0 -40.93359,10.48438 -56.41797,27.26953c16.27735,25.60547 26.41797,58.5625 26.41797,93.73047c0,12.94922 -1.49219,23.98047 -3.00391,32.125zm0,0"/>
<path d="m15,542l482,0c8.28906,0 15,-6.71094 15,-15s-6.71094,-15 -15,-15l-15,0l0,-30l15,0c8.28906,0 15,-6.71094 15,-15s-6.71094,-15 -15,-15l-15,0l0,-45c0,-8.28906 -6.71094,-15 -15,-15l-91,0c-8.28906,0 -15,6.71094 -15,15l0,45l-15,0c-8.28906,0 -15,6.71094 -15,15s6.71094,15 15,15l15,0l0,30l-60,0l0,-63.32422c-9.69531,2.17188 -19.72656,3.32422 -30,3.32422c-10.11719,0 -20.125,-1.27344 -30,-3.5625l0,63.5625l-90,0l0,-63.32422c-9.69531,2.17188 -19.72656,3.32422 -30,3.32422s-20.30469,-1.15234 -30,-3.32422l0,63.32422l-76,0c-8.28906,0 -15,6.71094 -15,15s6.71094,15 15,15zm376,-60l61,0l0,30l-61,0l0,-30zm0,0"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,440 @@
/*! jQuery UI - v1.12.1 - 2019-07-19
* http://jqueryui.com
* Includes: draggable.css, theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=base&cornerRadiusShadow=8px&offsetLeftShadow=0px&offsetTopShadow=0px&thicknessShadow=5px&opacityShadow=30&bgImgOpacityShadow=0&bgTextureShadow=flat&bgColorShadow=666666&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=aaaaaa&iconColorError=cc0000&fcError=5f3f3f&borderColorError=f1a899&bgTextureError=flat&bgColorError=fddfdf&iconColorHighlight=777620&fcHighlight=777620&borderColorHighlight=dad55e&bgTextureHighlight=flat&bgColorHighlight=fffa90&iconColorActive=ffffff&fcActive=ffffff&borderColorActive=003eff&bgTextureActive=flat&bgColorActive=007fff&iconColorHover=555555&fcHover=2b2b2b&borderColorHover=cccccc&bgTextureHover=flat&bgColorHover=ededed&iconColorDefault=777777&fcDefault=454545&borderColorDefault=c5c5c5&bgTextureDefault=flat&bgColorDefault=f6f6f6&iconColorContent=444444&fcContent=333333&borderColorContent=dddddd&bgTextureContent=flat&bgColorContent=ffffff&iconColorHeader=444444&fcHeader=333333&borderColorHeader=dddddd&bgTextureHeader=flat&bgColorHeader=e9e9e9&cornerRadius=3px&fwDefault=normal&fsDefault=1em&ffDefault=Arial%2CHelvetica%2Csans-serif
* Copyright jQuery Foundation and other contributors; Licensed MIT */
.ui-draggable-handle {
-ms-touch-action: none;
touch-action: none;
}
/* Component containers
----------------------------------*/
.ui-widget {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget .ui-widget {
font-size: 1em;
}
.ui-widget input,
.ui-widget select,
.ui-widget textarea,
.ui-widget button {
font-family: Arial,Helvetica,sans-serif;
font-size: 1em;
}
.ui-widget.ui-widget-content {
border: 1px solid #c5c5c5;
}
.ui-widget-content {
border: 1px solid #dddddd;
background: #ffffff;
color: #333333;
}
.ui-widget-content a {
color: #333333;
}
.ui-widget-header {
border: 1px solid #dddddd;
background: #e9e9e9;
color: #333333;
font-weight: bold;
}
.ui-widget-header a {
color: #333333;
}
/* Interaction states
----------------------------------*/
.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default,
.ui-button,
/* We use html here because we need a greater specificity to make sure disabled
works properly when clicked or hovered */
html .ui-button.ui-state-disabled:hover,
html .ui-button.ui-state-disabled:active {
border: 1px solid #c5c5c5;
background: #f6f6f6;
font-weight: normal;
color: #454545;
}
.ui-state-default a,
.ui-state-default a:link,
.ui-state-default a:visited,
a.ui-button,
a:link.ui-button,
a:visited.ui-button,
.ui-button {
color: #454545;
text-decoration: none;
}
.ui-state-hover,
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
.ui-widget-content .ui-state-focus,
.ui-widget-header .ui-state-focus,
.ui-button:hover,
.ui-button:focus {
border: 1px solid #cccccc;
background: #ededed;
font-weight: normal;
color: #2b2b2b;
}
.ui-state-hover a,
.ui-state-hover a:hover,
.ui-state-hover a:link,
.ui-state-hover a:visited,
.ui-state-focus a,
.ui-state-focus a:hover,
.ui-state-focus a:link,
.ui-state-focus a:visited,
a.ui-button:hover,
a.ui-button:focus {
color: #2b2b2b;
text-decoration: none;
}
.ui-visual-focus {
box-shadow: 0 0 3px 1px rgb(94, 158, 214);
}
.ui-state-active,
.ui-widget-content .ui-state-active,
.ui-widget-header .ui-state-active,
a.ui-button:active,
.ui-button:active,
.ui-button.ui-state-active:hover {
border: 1px solid #003eff;
background: #007fff;
font-weight: normal;
color: #ffffff;
}
.ui-icon-background,
.ui-state-active .ui-icon-background {
border: #003eff;
background-color: #ffffff;
}
.ui-state-active a,
.ui-state-active a:link,
.ui-state-active a:visited {
color: #ffffff;
text-decoration: none;
}
/* Interaction Cues
----------------------------------*/
.ui-state-highlight,
.ui-widget-content .ui-state-highlight,
.ui-widget-header .ui-state-highlight {
border: 1px solid #dad55e;
background: #fffa90;
color: #777620;
}
.ui-state-checked {
border: 1px solid #dad55e;
background: #fffa90;
}
.ui-state-highlight a,
.ui-widget-content .ui-state-highlight a,
.ui-widget-header .ui-state-highlight a {
color: #777620;
}
.ui-state-error,
.ui-widget-content .ui-state-error,
.ui-widget-header .ui-state-error {
border: 1px solid #f1a899;
background: #fddfdf;
color: #5f3f3f;
}
.ui-state-error a,
.ui-widget-content .ui-state-error a,
.ui-widget-header .ui-state-error a {
color: #5f3f3f;
}
.ui-state-error-text,
.ui-widget-content .ui-state-error-text,
.ui-widget-header .ui-state-error-text {
color: #5f3f3f;
}
.ui-priority-primary,
.ui-widget-content .ui-priority-primary,
.ui-widget-header .ui-priority-primary {
font-weight: bold;
}
.ui-priority-secondary,
.ui-widget-content .ui-priority-secondary,
.ui-widget-header .ui-priority-secondary {
opacity: .7;
filter:Alpha(Opacity=70); /* support: IE8 */
font-weight: normal;
}
.ui-state-disabled,
.ui-widget-content .ui-state-disabled,
.ui-widget-header .ui-state-disabled {
opacity: .35;
filter:Alpha(Opacity=35); /* support: IE8 */
background-image: none;
}
.ui-state-disabled .ui-icon {
filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
}
/* Icons
----------------------------------*/
/* states and images */
.ui-icon {
width: 16px;
height: 16px;
}
.ui-icon,
.ui-widget-content .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-widget-header .ui-icon {
background-image: url("images/ui-icons_444444_256x240.png");
}
.ui-state-hover .ui-icon,
.ui-state-focus .ui-icon,
.ui-button:hover .ui-icon,
.ui-button:focus .ui-icon {
background-image: url("images/ui-icons_555555_256x240.png");
}
.ui-state-active .ui-icon,
.ui-button:active .ui-icon {
background-image: url("images/ui-icons_ffffff_256x240.png");
}
.ui-state-highlight .ui-icon,
.ui-button .ui-state-highlight.ui-icon {
background-image: url("images/ui-icons_777620_256x240.png");
}
.ui-state-error .ui-icon,
.ui-state-error-text .ui-icon {
background-image: url("images/ui-icons_cc0000_256x240.png");
}
.ui-button .ui-icon {
background-image: url("images/ui-icons_777777_256x240.png");
}
/* positioning */
.ui-icon-blank { background-position: 16px 16px; }
.ui-icon-caret-1-n { background-position: 0 0; }
.ui-icon-caret-1-ne { background-position: -16px 0; }
.ui-icon-caret-1-e { background-position: -32px 0; }
.ui-icon-caret-1-se { background-position: -48px 0; }
.ui-icon-caret-1-s { background-position: -65px 0; }
.ui-icon-caret-1-sw { background-position: -80px 0; }
.ui-icon-caret-1-w { background-position: -96px 0; }
.ui-icon-caret-1-nw { background-position: -112px 0; }
.ui-icon-caret-2-n-s { background-position: -128px 0; }
.ui-icon-caret-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: -65px -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: -65px -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: 1px -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-on { background-position: -96px -144px; }
.ui-icon-radio-off { 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-start { background-position: -80px -160px; }
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
.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-all,
.ui-corner-top,
.ui-corner-left,
.ui-corner-tl {
border-top-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-top,
.ui-corner-right,
.ui-corner-tr {
border-top-right-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-left,
.ui-corner-bl {
border-bottom-left-radius: 3px;
}
.ui-corner-all,
.ui-corner-bottom,
.ui-corner-right,
.ui-corner-br {
border-bottom-right-radius: 3px;
}
/* Overlays */
.ui-widget-overlay {
background: #aaaaaa;
opacity: .3;
filter: Alpha(Opacity=30); /* support: IE8 */
}
.ui-widget-shadow {
-webkit-box-shadow: 0px 0px 5px #666666;
box-shadow: 0px 0px 5px #666666;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,119 @@
/* Slider */
.slick-slider
{
position: relative;
display: block;
box-sizing: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-touch-callout: none;
-khtml-user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list
{
position: relative;
display: block;
overflow: hidden;
margin: 0;
padding: 0;
}
.slick-list:focus
{
outline: none;
}
.slick-list.dragging
{
cursor: pointer;
cursor: hand;
}
.slick-slider .slick-track,
.slick-slider .slick-list
{
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track
{
position: relative;
top: 0;
left: 0;
display: block;
margin-left: auto;
margin-right: auto;
}
.slick-track:before,
.slick-track:after
{
display: table;
content: '';
}
.slick-track:after
{
clear: both;
}
.slick-loading .slick-track
{
visibility: hidden;
}
.slick-slide
{
display: none;
float: left;
height: 100%;
min-height: 1px;
}
[dir='rtl'] .slick-slide
{
float: right;
}
.slick-slide img
{
display: block;
}
.slick-slide.slick-loading img
{
display: none;
}
.slick-slide.dragging img
{
pointer-events: none;
}
.slick-initialized .slick-slide
{
display: block;
}
.slick-loading .slick-slide
{
visibility: hidden;
}
.slick-vertical .slick-slide
{
display: block;
height: auto;
border: 1px solid transparent;
}
.slick-arrow.slick-hidden {
display: none;
}