Initial commit - prestashop-icons package

Semantic icon helper for PrestaShop modules.
- Maps icon names to Font Awesome or Material Icons
- Auto-detects admin context (Material) vs front (FA default)
- Reads icon preference from ps_mpr_config table
- Theme detection for Material Icons
- PHP class + JavaScript helper

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-26 14:49:04 +01:00
commit 19db248bb4
4 changed files with 654 additions and 0 deletions

153
js/mpr-icons.js Normal file
View File

@@ -0,0 +1,153 @@
/**
* MprIcons - Semantic Icon Helper for PrestaShop (JavaScript)
*
* Simple API: MprIcons.get('account') - that's it.
*
* Set window.mprIconSet from PHP to configure (defaults to 'fontawesome').
*
* @package myprestarocks/prestashop-icons
*/
var MprIcons = (function() {
'use strict';
var FA = 'fontawesome';
var MATERIAL = 'material';
var map = {
// User
'account': ['fa fa-user', 'person'],
'user': ['fa fa-user', 'person'],
'logout': ['fa fa-sign-out', 'logout'],
'login': ['fa fa-sign-in', 'login'],
// E-commerce
'cart': ['fa fa-shopping-cart', 'shopping_cart'],
'orders': ['fa fa-list', 'receipt_long'],
'truck': ['fa fa-truck', 'local_shipping'],
'credit-card': ['fa fa-credit-card', 'credit_card'],
'gift': ['fa fa-gift', 'card_giftcard'],
'tag': ['fa fa-tag', 'local_offer'],
'percent': ['fa fa-percent', 'percent'],
// Status
'success': ['fa fa-check', 'check'],
'error': ['fa fa-times', 'close'],
'warning': ['fa fa-exclamation-triangle', 'warning'],
'info': ['fa fa-info-circle', 'info'],
// Actions
'edit': ['fa fa-pencil', 'edit'],
'delete': ['fa fa-trash', 'delete'],
'search': ['fa fa-search', 'search'],
'settings': ['fa fa-cog', 'settings'],
'download': ['fa fa-download', 'download'],
'upload': ['fa fa-upload', 'upload'],
'refresh': ['fa fa-refresh', 'refresh'],
'save': ['fa fa-save', 'save'],
'print': ['fa fa-print', 'print'],
'copy': ['fa fa-copy', 'content_copy'],
// UI
'close': ['fa fa-times', 'close'],
'check': ['fa fa-check', 'check'],
'plus': ['fa fa-plus', 'add'],
'minus': ['fa fa-minus', 'remove'],
'menu': ['fa fa-bars', 'menu'],
'more': ['fa fa-ellipsis-v', 'more_vert'],
// Arrows
'arrow-left': ['fa fa-arrow-left', 'arrow_back'],
'arrow-right': ['fa fa-arrow-right', 'arrow_forward'],
'arrow-up': ['fa fa-arrow-up', 'arrow_upward'],
'arrow-down': ['fa fa-arrow-down', 'arrow_downward'],
'chevron-left': ['fa fa-chevron-left', 'chevron_left'],
'chevron-right': ['fa fa-chevron-right', 'chevron_right'],
'chevron-up': ['fa fa-chevron-up', 'expand_less'],
'chevron-down': ['fa fa-chevron-down', 'expand_more'],
// Communication
'email': ['fa fa-envelope', 'email'],
'phone': ['fa fa-phone', 'phone'],
'comment': ['fa fa-comment', 'comment'],
'chat': ['fa fa-comments', 'chat'],
// Security
'lock': ['fa fa-lock', 'lock'],
'unlock': ['fa fa-unlock', 'lock_open'],
'shield': ['fa fa-shield', 'shield'],
'key': ['fa fa-key', 'vpn_key'],
// Misc
'home': ['fa fa-home', 'home'],
'address': ['fa fa-map-marker', 'location_on'],
'calendar': ['fa fa-calendar', 'calendar_today'],
'clock': ['fa fa-clock-o', 'schedule'],
'heart': ['fa fa-heart', 'favorite'],
'star': ['fa fa-star', 'star'],
'eye': ['fa fa-eye', 'visibility'],
'eye-off': ['fa fa-eye-slash', 'visibility_off'],
'file': ['fa fa-file', 'description'],
'folder': ['fa fa-folder', 'folder'],
'image': ['fa fa-image', 'image'],
'link': ['fa fa-link', 'link'],
'external': ['fa fa-external-link', 'open_in_new'],
'help': ['fa fa-question-circle', 'help'],
// Loading
'spinner': ['fa fa-spinner fa-spin', 'hourglass_empty'],
'loading': ['fa fa-circle-o-notch fa-spin', 'autorenew']
};
function getIconSet() {
return window.mprIconSet || FA;
}
function get(name, extraClass) {
if (!map[name]) return '';
var set = getIconSet();
var extra = extraClass ? ' ' + extraClass : '';
if (set === MATERIAL) {
return '<i class="material-icons' + extra + '">' + map[name][1] + '</i>';
}
return '<i class="' + map[name][0] + extra + '"></i>';
}
function raw(name) {
if (!map[name]) return '';
var set = getIconSet();
return set === MATERIAL ? map[name][1] : map[name][0];
}
function create(name, extraClass) {
var html = get(name, extraClass);
if (!html) return null;
var temp = document.createElement('div');
temp.innerHTML = html;
return temp.firstChild;
}
function exists(name) {
return !!map[name];
}
function list() {
return Object.keys(map);
}
return {
get: get,
raw: raw,
create: create,
exists: exists,
list: list,
FA: FA,
MATERIAL: MATERIAL
};
})();
if (typeof module !== 'undefined' && module.exports) {
module.exports = MprIcons;
}