lexgui 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/lexgui.js CHANGED
@@ -12,7 +12,7 @@ console.warn( 'Script _build/lexgui.js_ is depracated and will be removed soon.
12
12
  */
13
13
 
14
14
  var LX = {
15
- version: "0.5.3",
15
+ version: "0.5.4",
16
16
  ready: false,
17
17
  components: [], // Specific pre-build components
18
18
  signals: {}, // Events and triggers
@@ -783,7 +783,7 @@ function _createCommandbar( root )
783
783
  className: "gs-tabs"
784
784
  } );
785
785
 
786
- const gsTabs = tabArea.addTabs();
786
+ const gsTabs = tabArea.addTabs( { parentClass: "p-2" } );
787
787
  let gsFilter = null;
788
788
 
789
789
  // These tabs will serve as buttons by now
@@ -939,6 +939,7 @@ function _createCommandbar( root )
939
939
  * @param {Object} options
940
940
  * container: Root location for the gui (default is the document body)
941
941
  * id: Id of the main area
942
+ * rootClass: Extra class to the root container
942
943
  * skipRoot: Skip adding LX root container
943
944
  * skipDefaultArea: Skip creation of main area
944
945
  * strictViewport: Use only window area
@@ -955,8 +956,14 @@ function init( options = { } )
955
956
 
956
957
  var root = document.createElement( 'div' );
957
958
  root.id = "lexroot";
959
+ root.className = "lexcontainer";
958
960
  root.tabIndex = -1;
959
961
 
962
+ if( options.rootClass )
963
+ {
964
+ root.className += ` ${ options.rootClass }`;
965
+ }
966
+
960
967
  var modal = document.createElement( 'div' );
961
968
  modal.id = "modal";
962
969
 
@@ -969,7 +976,7 @@ function init( options = { } )
969
976
 
970
977
  if( options.container )
971
978
  {
972
- this.container = document.getElementById( options.container );
979
+ this.container = options.container.constructor === String ? document.getElementById( options.container ) : options.container;
973
980
  }
974
981
 
975
982
  this.usingStrictViewport = options.strictViewport ?? true;
@@ -1007,7 +1014,7 @@ function init( options = { } )
1007
1014
  this.notifications.className = "";
1008
1015
  this.notifications.iWidth = 0;
1009
1016
  notifSection.appendChild( this.notifications );
1010
- this.container.appendChild( notifSection );
1017
+ document.body.appendChild( notifSection );
1011
1018
 
1012
1019
  this.notifications.addEventListener( "mouseenter", () => {
1013
1020
  this.notifications.classList.add( "list" );
@@ -1324,6 +1331,7 @@ LX.toast = toast;
1324
1331
  * @param {String} className
1325
1332
  * @param {Object} options
1326
1333
  * style: Style attributes to override
1334
+ * asElement: Returns the badge as HTMLElement [false]
1327
1335
  */
1328
1336
 
1329
1337
  function badge( text, className, options = {} )
@@ -1332,7 +1340,7 @@ function badge( text, className, options = {} )
1332
1340
  container.innerHTML = text;
1333
1341
  container.className = "lexbadge " + ( className ?? "" );
1334
1342
  Object.assign( container.style, options.style ?? {} );
1335
- return container.outerHTML;
1343
+ return ( options.asElement ?? false ) ? container : container.outerHTML;
1336
1344
  }
1337
1345
 
1338
1346
  LX.badge = badge;
@@ -1341,21 +1349,84 @@ LX.badge = badge;
1341
1349
  * @method makeContainer
1342
1350
  * @param {Array} size
1343
1351
  * @param {String} className
1352
+ * @param {String} innerHTML
1353
+ * @param {HTMLElement} parent
1344
1354
  * @param {Object} overrideStyle
1345
1355
  */
1346
1356
 
1347
- function makeContainer( size, className, overrideStyle = {} )
1357
+ function makeContainer( size, className, innerHTML, parent, overrideStyle = {} )
1348
1358
  {
1349
1359
  const container = document.createElement( "div" );
1350
1360
  container.className = "lexcontainer " + ( className ?? "" );
1361
+ container.innerHTML = innerHTML ?? "";
1351
1362
  container.style.width = size && size[ 0 ] ? size[ 0 ] : "100%";
1352
1363
  container.style.height = size && size[ 1 ] ? size[ 1 ] : "100%";
1353
1364
  Object.assign( container.style, overrideStyle );
1365
+
1366
+ if( parent )
1367
+ {
1368
+ if( parent.attach ) // Use attach method if possible
1369
+ {
1370
+ parent.attach( container );
1371
+ }
1372
+ else // its a native HTMLElement
1373
+ {
1374
+ parent.appendChild( container );
1375
+ }
1376
+ }
1377
+
1354
1378
  return container;
1355
1379
  }
1356
1380
 
1357
1381
  LX.makeContainer = makeContainer;
1358
1382
 
1383
+ /**
1384
+ * @method asTooltip
1385
+ * @param {HTMLElement} trigger
1386
+ * @param {String} content
1387
+ */
1388
+
1389
+ function asTooltip( trigger, content )
1390
+ {
1391
+ console.assert( trigger, "You need a trigger to generate a tooltip!" );
1392
+
1393
+ let tooltipDom = null;
1394
+
1395
+ trigger.addEventListener( "mouseenter", function(e) {
1396
+
1397
+ console.log(e.target);
1398
+
1399
+ LX.root.querySelectorAll( ".lextooltip" ).forEach( e => e.remove() );
1400
+
1401
+ let rect = this.getBoundingClientRect();
1402
+ rect.x += document.scrollingElement.scrollLeft;
1403
+ rect.y += document.scrollingElement.scrollTop;
1404
+
1405
+ tooltipDom = document.createElement( "div" );
1406
+ tooltipDom.className = "lextooltip";
1407
+ tooltipDom.innerHTML = content;
1408
+
1409
+ doAsync( () => {
1410
+ tooltipDom.style.top = ( rect.y - tooltipDom.offsetHeight - 6 ) + "px";
1411
+ tooltipDom.style.left = ( rect.x + rect.width * 0.5 - tooltipDom.offsetWidth * 0.5 ) + "px";
1412
+ } )
1413
+
1414
+ LX.root.appendChild( tooltipDom );
1415
+ } );
1416
+
1417
+ trigger.addEventListener( "mouseleave", function(e) {
1418
+ if( !tooltipDom ) return;
1419
+
1420
+ tooltipDom.dataset[ "closed" ] = true;
1421
+
1422
+ doAsync( () => {
1423
+ tooltipDom.remove();
1424
+ }, 300 )
1425
+ } )
1426
+ }
1427
+
1428
+ LX.asTooltip = asTooltip;
1429
+
1359
1430
  /*
1360
1431
  * Events and Signals
1361
1432
  */
@@ -1598,7 +1669,7 @@ class DropdownMenu {
1598
1669
  }
1599
1670
 
1600
1671
  const menuItem = document.createElement('div');
1601
- menuItem.className = "lexdropdownmenuitem" + ( item.name ? "" : " label" ) + ( item.disabled ?? false ? " disabled" : "" );
1672
+ menuItem.className = "lexdropdownmenuitem" + ( item.name ? "" : " label" ) + ( item.disabled ?? false ? " disabled" : "" ) + ( ` ${ item.className ?? "" }` );
1602
1673
  menuItem.id = pKey;
1603
1674
  menuItem.innerHTML = `<span>${ key }</span>`;
1604
1675
 
@@ -1819,9 +1890,9 @@ class Area {
1819
1890
  this.sections = [];
1820
1891
  this.panels = [];
1821
1892
 
1822
- if( !options.skipAppend )
1893
+ let lexroot = document.getElementById("lexroot");
1894
+ if( lexroot && !options.skipAppend )
1823
1895
  {
1824
- let lexroot = document.getElementById("lexroot");
1825
1896
  lexroot.appendChild( this.root );
1826
1897
  }
1827
1898
 
@@ -1968,7 +2039,7 @@ class Area {
1968
2039
  attach( content ) {
1969
2040
 
1970
2041
  // Append to last split section if area has been split
1971
- if( this.sections.length)
2042
+ if( this.sections.length )
1972
2043
  {
1973
2044
  this.sections[ 1 ].attach( content );
1974
2045
  return;
@@ -2004,7 +2075,7 @@ class Area {
2004
2075
 
2005
2076
  const type = options.type || "horizontal";
2006
2077
  const sizes = options.sizes || [ "50%", "50%" ];
2007
- const auto = (options.sizes === 'auto');
2078
+ const auto = (options.sizes === 'auto') || ( options.sizes && options.sizes[ 0 ] == "auto" && options.sizes[ 1 ] == "auto" );
2008
2079
 
2009
2080
  if( !sizes[ 1 ] )
2010
2081
  {
@@ -2108,8 +2179,8 @@ class Area {
2108
2179
  const resizeObserver = new ResizeObserver( entries => {
2109
2180
  for ( const entry of entries )
2110
2181
  {
2111
- const bb = entry.contentRect;
2112
- area2.root.style.height = "calc(100% - " + ( bb.height + 4) + "px )";
2182
+ const size = entry.target.getComputedSize();
2183
+ area2.root.style.height = "calc(100% - " + ( size.height ) + "px )";
2113
2184
  }
2114
2185
  });
2115
2186
 
@@ -2390,6 +2461,11 @@ class Area {
2390
2461
  bar.root.className += " sticky top-0";
2391
2462
  }
2392
2463
 
2464
+ if( options.parentClass )
2465
+ {
2466
+ bar.root.className += ` ${ options.parentClass }`;
2467
+ }
2468
+
2393
2469
  return menubar;
2394
2470
  }
2395
2471
 
@@ -2421,6 +2497,11 @@ class Area {
2421
2497
  bar.attach( sidebar );
2422
2498
  bar.isSidebar = true;
2423
2499
 
2500
+ if( options.parentClass )
2501
+ {
2502
+ bar.root.className += ` ${ options.parentClass }`;
2503
+ }
2504
+
2424
2505
  return sidebar;
2425
2506
  }
2426
2507
 
@@ -2523,7 +2604,10 @@ class Area {
2523
2604
  }
2524
2605
  }
2525
2606
 
2526
- callback( value, event, button.root );
2607
+ if( callback )
2608
+ {
2609
+ callback( value, event, button.root );
2610
+ }
2527
2611
 
2528
2612
  }, _options );
2529
2613
  }
@@ -2580,6 +2664,7 @@ class Area {
2580
2664
  /**
2581
2665
  * @method addTabs
2582
2666
  * @param {Object} options:
2667
+ * parentClass: Add extra class to tab buttons container
2583
2668
  */
2584
2669
 
2585
2670
  addTabs( options = {} ) {
@@ -2699,7 +2784,6 @@ function flushCss(element) {
2699
2784
 
2700
2785
  class Tabs {
2701
2786
 
2702
- static TAB_SIZE = 28;
2703
2787
  static TAB_ID = 0;
2704
2788
 
2705
2789
  constructor( area, options = {} ) {
@@ -2707,10 +2791,10 @@ class Tabs {
2707
2791
  this.onclose = options.onclose;
2708
2792
 
2709
2793
  let container = document.createElement('div');
2710
- container.className = "lexareatabs " + (options.fit ? "fit" : "row");
2794
+ container.className = "lexareatabs " + ( options.fit ? "fit" : "row" );
2711
2795
 
2712
2796
  const folding = options.folding ?? false;
2713
- if(folding) container.classList.add("folding");
2797
+ if( folding ) container.classList.add("folding");
2714
2798
 
2715
2799
  let that = this;
2716
2800
 
@@ -2783,10 +2867,15 @@ class Tabs {
2783
2867
 
2784
2868
  area.root.classList.add( "lexareatabscontainer" );
2785
2869
 
2786
- area.split({ type: 'vertical', sizes: options.sizes ?? "auto", resize: false, top: 6 });
2787
- area.sections[ 0 ].attach( container );
2870
+ const [ tabButtons, content ] = area.split({ type: 'vertical', sizes: options.sizes ?? "auto", resize: false, top: 2 });
2871
+ tabButtons.attach( container );
2788
2872
 
2789
- this.area = area.sections[1];
2873
+ if( options.parentClass )
2874
+ {
2875
+ container.parentElement.className += ` ${ options.parentClass }`;
2876
+ }
2877
+
2878
+ this.area = content;
2790
2879
  this.area.root.className += " lexareatabscontent";
2791
2880
 
2792
2881
  if( options.contentClass )
@@ -2814,7 +2903,6 @@ class Tabs {
2814
2903
  this.thumb.style.transition = "none";
2815
2904
  this.thumb.style.transform = "translate( " + ( tabEl.childIndex * tabEl.offsetWidth ) + "px )";
2816
2905
  this.thumb.style.width = ( tabEl.offsetWidth ) + "px";
2817
- this.thumb.style.height = ( tabEl.offsetHeight ) + "px";
2818
2906
  flushCss( this.thumb );
2819
2907
  this.thumb.style.transition = transition;
2820
2908
  });
@@ -2856,7 +2944,7 @@ class Tabs {
2856
2944
  if( isSelected )
2857
2945
  {
2858
2946
  this.root.querySelectorAll( 'span' ).forEach( s => s.classList.remove( 'selected' ) );
2859
- this.area.root.querySelectorAll( '.lextabcontent' ).forEach( c => c.style.display = 'none' );
2947
+ this.area.root.querySelectorAll( ':scope > .lextabcontent' ).forEach( c => c.style.display = 'none' );
2860
2948
  }
2861
2949
 
2862
2950
  isSelected = !Object.keys( this.tabs ).length && !this.folding ? true : isSelected;
@@ -2914,7 +3002,7 @@ class Tabs {
2914
3002
  tabEl.parentElement.querySelectorAll( 'span' ).forEach( s => s.classList.remove( 'selected' ));
2915
3003
  tabEl.classList.toggle('selected', ( this.folding && tabEl.selected ));
2916
3004
  // Manage visibility
2917
- scope.area.root.querySelectorAll( '.lextabcontent' ).forEach( c => c.style.display = 'none' );
3005
+ scope.area.root.querySelectorAll( ':scope > .lextabcontent' ).forEach( c => c.style.display = 'none' );
2918
3006
  contentEl.style.display = contentEl.originalDisplay;
2919
3007
  scope.selected = tabEl.dataset.name;
2920
3008
  }
@@ -2933,8 +3021,7 @@ class Tabs {
2933
3021
  if( scope.thumb )
2934
3022
  {
2935
3023
  scope.thumb.style.transform = "translate( " + ( tabEl.childIndex * tabEl.offsetWidth ) + "px )";
2936
- scope.thumb.style.width = ( tabEl.offsetWidth - 5 ) + "px";
2937
- scope.thumb.style.height = ( tabEl.offsetHeight - 6 ) + "px";
3024
+ scope.thumb.style.width = ( tabEl.offsetWidth ) + "px";
2938
3025
  scope.thumb.item = tabEl;
2939
3026
  }
2940
3027
  });
@@ -2987,7 +3074,6 @@ class Tabs {
2987
3074
  {
2988
3075
  this.thumb.style.transform = "translate( " + ( tabEl.childIndex * tabEl.offsetWidth ) + "px )";
2989
3076
  this.thumb.style.width = ( tabEl.offsetWidth ) + "px";
2990
- this.thumb.style.height = ( tabEl.offsetHeight ) + "px";
2991
3077
  this.thumb.item = tabEl;
2992
3078
  }
2993
3079
 
@@ -3119,7 +3205,7 @@ class Menubar {
3119
3205
  const hasSubmenu = subitem[ subkey ].length;
3120
3206
  const isCheckbox = subitem[ 'type' ] == 'checkbox';
3121
3207
  let subentry = document.createElement('div');
3122
- subentry.tabIndex = "1";
3208
+ subentry.tabIndex = "-1";
3123
3209
  subentry.className = "lexmenuboxentry";
3124
3210
  subentry.className += (i == o[k].length - 1 ? " last" : "") + ( subitem.disabled ? " disabled" : "" );
3125
3211
 
@@ -3206,12 +3292,10 @@ class Menubar {
3206
3292
  });
3207
3293
 
3208
3294
  subentry.addEventListener("blur", e => {
3209
-
3210
- if( e.target && e.target.className.includes( "lexmenu" ) )
3295
+ if( e.relatedTarget && !e.relatedTarget.className.includes( "lexmenu" ) )
3211
3296
  {
3212
- return;
3297
+ this._resetMenubar();
3213
3298
  }
3214
- this._resetMenubar();
3215
3299
  });
3216
3300
 
3217
3301
  // Add icon if has submenu, else check for shortcut
@@ -3667,6 +3751,7 @@ class SideBar {
3667
3751
 
3668
3752
  /**
3669
3753
  * @param {Object} options
3754
+ * className: Extra class to customize root element
3670
3755
  * filter: Add search bar to filter entries [false]
3671
3756
  * displaySelected: Indicate if an entry is displayed as selected
3672
3757
  * skipHeader: Do not use sidebar header [false]
@@ -3690,7 +3775,7 @@ class SideBar {
3690
3775
  constructor( options = {} ) {
3691
3776
 
3692
3777
  this.root = document.createElement( "div" );
3693
- this.root.className = "lexsidebar";
3778
+ this.root.className = "lexsidebar " + ( options.className ?? "" );
3694
3779
 
3695
3780
  this._displaySelected = options.displaySelected ?? false;
3696
3781
 
@@ -3777,10 +3862,10 @@ class SideBar {
3777
3862
 
3778
3863
  // Set width depending on header/footer
3779
3864
  doAsync( () => {
3780
- // This account for header, footer and all inner paddings
3781
- const contentOffset = ( this.header?.offsetHeight ?? 0 ) +
3782
- ( this.filter?.offsetHeight ?? 0 ) +
3783
- ( this.footer?.offsetHeight ?? 0 );
3865
+ // This account for header, footer and all inner margins
3866
+ const contentOffset = ( parseInt( this.header?.getComputedSize().height ) ?? 0 ) +
3867
+ ( parseInt( this.filter?.getComputedSize().height ) ?? 0 ) +
3868
+ ( parseInt( this.footer?.getComputedSize().height ) ?? 0 );
3784
3869
  this.content.style.height = `calc(100% - ${ contentOffset }px)`;
3785
3870
  }, 10 );
3786
3871
 
@@ -4066,8 +4151,13 @@ class SideBar {
4066
4151
  let currentGroup = null;
4067
4152
 
4068
4153
  let entry = document.createElement( 'div' );
4069
- entry.className = "lexsidebarentry " + ( options.className ?? "" );
4070
4154
  entry.id = item.name = pKey;
4155
+ entry.className = "lexsidebarentry " + ( options.className ?? "" );
4156
+
4157
+ if( this.displaySelected && options.selected )
4158
+ {
4159
+ entry.classList.add( "selected" );
4160
+ }
4071
4161
 
4072
4162
  if( item.group )
4073
4163
  {
@@ -4137,6 +4227,7 @@ class SideBar {
4137
4227
  }
4138
4228
 
4139
4229
  let itemDom = document.createElement( 'div' );
4230
+ itemDom.className = "lexsidebarentrycontent";
4140
4231
  entry.appendChild( itemDom );
4141
4232
  item.dom = entry;
4142
4233
 
@@ -4157,14 +4248,31 @@ class SideBar {
4157
4248
  {
4158
4249
  if( options.icon )
4159
4250
  {
4160
- let itemIcon = document.createElement( 'i' );
4161
- itemIcon.className = options.icon;
4251
+ let itemIcon = null;
4252
+
4253
+ // @legacy
4254
+ if( options.icon.includes( "fa-" ) )
4255
+ {
4256
+ itemIcon = document.createElement( 'i' );
4257
+ itemIcon.className = options.icon;
4258
+ }
4259
+ else
4260
+ {
4261
+ itemIcon = LX.makeIcon( options.icon );
4262
+ }
4263
+
4264
+ itemIcon.classList.add( "lexsidebarentryicon" );
4162
4265
  itemDom.appendChild( itemIcon );
4163
4266
  }
4164
4267
 
4165
4268
  let itemName = document.createElement( 'a' );
4166
4269
  itemName.innerHTML = key;
4167
4270
  itemDom.appendChild( itemName );
4271
+
4272
+ if( options.content )
4273
+ {
4274
+ itemDom.appendChild( options.content );
4275
+ }
4168
4276
  }
4169
4277
 
4170
4278
  const isCollapsable = options.collapsable != undefined ? options.collapsable : ( options.collapsable || item[ key ].length );
@@ -5393,6 +5501,7 @@ class TextInput extends Widget {
5393
5501
  let container = document.createElement( 'div' );
5394
5502
  container.className = ( options.warning ? " lexwarning" : "" );
5395
5503
  container.style.display = "flex";
5504
+ container.style.position = "relative";
5396
5505
  this.root.appendChild( container );
5397
5506
 
5398
5507
  this.disabled = ( options.disabled || options.warning ) ?? ( options.url ? true : false );
@@ -5448,6 +5557,7 @@ class TextInput extends Widget {
5448
5557
 
5449
5558
  if( options.icon )
5450
5559
  {
5560
+ wValue.style.paddingLeft = "1.75rem";
5451
5561
  let icon = document.createElement( 'a' );
5452
5562
  icon.className = "inputicon " + options.icon;
5453
5563
  container.appendChild( icon );
@@ -5486,7 +5596,7 @@ class TextInput extends Widget {
5486
5596
  }
5487
5597
  }
5488
5598
 
5489
- LX.Text = Text;
5599
+ LX.TextInput = TextInput;
5490
5600
 
5491
5601
  /**
5492
5602
  * @class TextArea
@@ -5524,6 +5634,13 @@ class TextArea extends Widget {
5524
5634
  this.root.appendChild( container );
5525
5635
 
5526
5636
  let wValue = document.createElement( "textarea" );
5637
+
5638
+ if( !( options.resize ?? true ) )
5639
+ {
5640
+ wValue.style.resize = "none";
5641
+ }
5642
+
5643
+ wValue.className = ( options.inputClass ?? "" );
5527
5644
  wValue.value = wValue.iValue = value || "";
5528
5645
  wValue.style.width = "100%";
5529
5646
  wValue.style.textAlign = options.float ?? "";
@@ -5594,9 +5711,36 @@ class Button extends Widget {
5594
5711
  };
5595
5712
 
5596
5713
  this.onSetValue = ( newValue, skipCallback, event ) => {
5597
- wValue.innerHTML =
5598
- ( options.icon ? "<a class='" + options.icon + "'></a>" :
5599
- ( options.img ? "<img src='" + options.img + "'>" : "<span>" + ( newValue || "" ) + "</span>" ) );
5714
+
5715
+ wValue.innerHTML = `<span></span>`;
5716
+
5717
+ if( options.icon )
5718
+ {
5719
+ let icon = null;
5720
+
5721
+ // @legacy
5722
+ if( options.icon.includes( "fa-" ) )
5723
+ {
5724
+ icon = document.createElement( 'a' );
5725
+ icon.className = options.icon;
5726
+ }
5727
+ else
5728
+ {
5729
+ icon = LX.makeIcon( options.icon );
5730
+ }
5731
+
5732
+ wValue.prepend( icon );
5733
+ }
5734
+ else if( options.img )
5735
+ {
5736
+ let img = document.createElement( 'img' );
5737
+ img.src = options.img;
5738
+ wValue.prepend( img );
5739
+ }
5740
+ else
5741
+ {
5742
+ wValue.innerHTML = `<span>${ ( newValue || "" ) }</span>`;
5743
+ }
5600
5744
  };
5601
5745
 
5602
5746
  this.onResize = ( rect ) => {
@@ -5605,7 +5749,7 @@ class Button extends Widget {
5605
5749
  };
5606
5750
 
5607
5751
  var wValue = document.createElement( 'button' );
5608
- wValue.title = options.title ?? "";
5752
+ wValue.title = options.tooltip ? "" : ( options.title ?? "" );
5609
5753
  wValue.className = "lexbutton " + ( options.buttonClass ?? "" );
5610
5754
 
5611
5755
  if( options.icon )
@@ -5620,9 +5764,7 @@ class Button extends Widget {
5620
5764
  wValue.classList.add( "selected" );
5621
5765
  }
5622
5766
 
5623
- wValue.innerHTML =
5624
- ( options.icon ? "<a class='" + options.icon + "'></a>" :
5625
- ( options.img ? "<img src='" + options.img + "'>" : "<span>" + ( value || "" ) + "</span>" ) );
5767
+ this.onSetValue( value, true );
5626
5768
 
5627
5769
  if( options.disabled )
5628
5770
  {
@@ -5643,6 +5785,11 @@ class Button extends Widget {
5643
5785
  this._trigger( new IEvent( name, value, e ), callback );
5644
5786
  });
5645
5787
 
5788
+ if( options.tooltip )
5789
+ {
5790
+ LX.asTooltip( wValue, options.title ?? name );
5791
+ }
5792
+
5646
5793
  doAsync( this.onResize.bind( this ) );
5647
5794
  }
5648
5795
  }
@@ -8480,7 +8627,7 @@ class Table extends Widget {
8480
8627
  // Append header
8481
8628
  if( this.filter || this.customFilters || this.toggleColumns )
8482
8629
  {
8483
- const headerContainer = LX.makeContainer( [ "100%", "auto" ] );
8630
+ const headerContainer = LX.makeContainer( [ "100%", "auto" ], "flex flex-row" );
8484
8631
 
8485
8632
  if( this.filter )
8486
8633
  {
@@ -9479,6 +9626,7 @@ class Panel {
9479
9626
  * disabled: Make the widget disabled [false]
9480
9627
  * required: Make the input required
9481
9628
  * placeholder: Add input placeholder
9629
+ * icon: Icon (if any) to append at the input start
9482
9630
  * pattern: Regular expression that value must match
9483
9631
  * trigger: Choose onchange trigger (default, input) [default]
9484
9632
  * inputWidth: Width of the text input
@@ -9502,6 +9650,7 @@ class Panel {
9502
9650
  * hideName: Don't use name as label [false]
9503
9651
  * disabled: Make the widget disabled [false]
9504
9652
  * placeholder: Add input placeholder
9653
+ * resize: Allow resize [true]
9505
9654
  * trigger: Choose onchange trigger (default, input) [default]
9506
9655
  * inputWidth: Width of the text input
9507
9656
  * float: Justify input text content
@@ -10305,6 +10454,9 @@ class Footer {
10305
10454
  wrapper.className = "w-full";
10306
10455
  root.appendChild( wrapper );
10307
10456
 
10457
+ // const hr = document.createElement( "hr" );
10458
+ // wrapper.appendChild( hr );
10459
+
10308
10460
  if( options.columns && options.columns.constructor == Array )
10309
10461
  {
10310
10462
  const cols = document.createElement( "div" );
@@ -10341,9 +10493,6 @@ class Footer {
10341
10493
 
10342
10494
  if( options.credits || options.socials )
10343
10495
  {
10344
- const hr = document.createElement( "hr" );
10345
- wrapper.appendChild( hr );
10346
-
10347
10496
  const creditsSocials = document.createElement( "div" );
10348
10497
  creditsSocials.className = "credits-and-socials";
10349
10498
  wrapper.appendChild( creditsSocials );
@@ -11052,8 +11201,8 @@ class CanvasCurve {
11052
11201
  element.style.minHeight = "20px";
11053
11202
 
11054
11203
  element.bgcolor = options.bgColor || LX.getThemeColor( "global-intense-background" );
11055
- element.pointscolor = options.pointsColor || LX.getThemeColor( "global-selected" );
11056
- element.activepointscolor = options.activePointsColor || LX.getThemeColor( "global-selected-light" );
11204
+ element.pointscolor = options.pointsColor || LX.getThemeColor( "global-color-accent" );
11205
+ element.activepointscolor = options.activePointsColor || LX.getThemeColor( "global-color-accent-light" );
11057
11206
  element.linecolor = options.lineColor || "#555";
11058
11207
  element.value = value || [];
11059
11208
  element.xrange = options.xrange || [ 0, 1 ]; // min, max
@@ -11069,8 +11218,8 @@ class CanvasCurve {
11069
11218
 
11070
11219
  LX.addSignal( "@on_new_color_scheme", (el, value) => {
11071
11220
  element.bgcolor = options.bgColor || LX.getThemeColor( "global-intense-background" );
11072
- element.pointscolor = options.pointsColor || LX.getThemeColor( "global-selected" );
11073
- element.activepointscolor = options.activePointsColor || LX.getThemeColor( "global-selected-light" );
11221
+ element.pointscolor = options.pointsColor || LX.getThemeColor( "global-color-accent" );
11222
+ element.activepointscolor = options.activePointsColor || LX.getThemeColor( "global-color-accent-light" );
11074
11223
  this.redraw();
11075
11224
  } );
11076
11225
 
@@ -11399,7 +11548,7 @@ class CanvasDial {
11399
11548
  element.style.minWidth = element.style.minHeight = "50px";
11400
11549
 
11401
11550
  element.bgcolor = options.bgColor || LX.getThemeColor( "global-dark-background" );
11402
- element.pointscolor = options.pointsColor || LX.getThemeColor( "global-selected-light" );
11551
+ element.pointscolor = options.pointsColor || LX.getThemeColor( "global-color-accent-light" );
11403
11552
  element.linecolor = options.lineColor || "#555";
11404
11553
  element.value = value || [];
11405
11554
  element.xrange = options.xrange || [ 0, 1 ]; // min, max
@@ -12679,44 +12828,44 @@ Object.assign(LX, {
12679
12828
  * Request file from url
12680
12829
  * @method requestText
12681
12830
  * @param {String} url
12682
- * @param {Function} on_complete
12683
- * @param {Function} on_error
12831
+ * @param {Function} onComplete
12832
+ * @param {Function} onError
12684
12833
  **/
12685
- requestText(url, on_complete, on_error ) {
12686
- return this.request({ url: url, dataType:"text", success: on_complete, error: on_error });
12834
+ requestText( url, onComplete, onError ) {
12835
+ return this.request({ url: url, dataType:"text", success: onComplete, error: onError });
12687
12836
  },
12688
12837
 
12689
12838
  /**
12690
12839
  * Request file from url
12691
12840
  * @method requestJSON
12692
12841
  * @param {String} url
12693
- * @param {Function} on_complete
12694
- * @param {Function} on_error
12842
+ * @param {Function} onComplete
12843
+ * @param {Function} onError
12695
12844
  **/
12696
- requestJSON(url, on_complete, on_error ) {
12697
- return this.request({ url: url, dataType:"json", success: on_complete, error: on_error });
12845
+ requestJSON( url, onComplete, onError ) {
12846
+ return this.request({ url: url, dataType:"json", success: onComplete, error: onError });
12698
12847
  },
12699
12848
 
12700
12849
  /**
12701
12850
  * Request binary file from url
12702
12851
  * @method requestBinary
12703
12852
  * @param {String} url
12704
- * @param {Function} on_complete
12705
- * @param {Function} on_error
12853
+ * @param {Function} onComplete
12854
+ * @param {Function} onError
12706
12855
  **/
12707
- requestBinary(url, on_complete, on_error ) {
12708
- return this.request({ url: url, dataType:"binary", success: on_complete, error: on_error });
12856
+ requestBinary( url, onComplete, onError ) {
12857
+ return this.request({ url: url, dataType:"binary", success: onComplete, error: onError });
12709
12858
  },
12710
12859
 
12711
12860
  /**
12712
12861
  * Request script and inserts it in the DOM
12713
12862
  * @method requireScript
12714
12863
  * @param {String|Array} url the url of the script or an array containing several urls
12715
- * @param {Function} on_complete
12716
- * @param {Function} on_error
12717
- * @param {Function} on_progress (if several files are required, on_progress is called after every file is added to the DOM)
12864
+ * @param {Function} onComplete
12865
+ * @param {Function} onError
12866
+ * @param {Function} onProgress (if several files are required, onProgress is called after every file is added to the DOM)
12718
12867
  **/
12719
- requireScript(url, on_complete, on_error, on_progress, version ) {
12868
+ requireScript( url, onComplete, onError, onProgress, version ) {
12720
12869
 
12721
12870
  if(!url)
12722
12871
  throw("invalid URL");
@@ -12741,15 +12890,17 @@ Object.assign(LX, {
12741
12890
  loaded_scripts.push(this);
12742
12891
  if(total)
12743
12892
  {
12744
- if(on_progress)
12745
- on_progress(this.original_src, this.num);
12893
+ if( onProgress )
12894
+ {
12895
+ onProgress( this.original_src, this.num );
12896
+ }
12746
12897
  }
12747
- else if(on_complete)
12748
- on_complete( loaded_scripts );
12898
+ else if(onComplete)
12899
+ onComplete( loaded_scripts );
12749
12900
  };
12750
- if(on_error)
12901
+ if(onError)
12751
12902
  script.onerror = function(err) {
12752
- on_error(err, this.original_src, this.num );
12903
+ onError(err, this.original_src, this.num );
12753
12904
  }
12754
12905
  document.getElementsByTagName('head')[0].appendChild(script);
12755
12906
  }
@@ -12838,10 +12989,11 @@ Element.prototype.addClass = function( className ) {
12838
12989
  }
12839
12990
 
12840
12991
  Element.prototype.getComputedSize = function() {
12841
- const cs = getComputedStyle( this );
12992
+ // Since we use "box-sizing: border-box" now,
12993
+ // it's all included in offsetWidth/offsetHeight
12842
12994
  return {
12843
- width: this.offsetWidth + cs.getPropertyValue('marginLeft') + cs.getPropertyValue('marginRight'),
12844
- height: this.offsetHeight + cs.getPropertyValue('marginTop') + cs.getPropertyValue('marginBottom')
12995
+ width: this.offsetWidth,
12996
+ height: this.offsetHeight
12845
12997
  }
12846
12998
  }
12847
12999
 
@@ -12853,6 +13005,18 @@ Element.prototype.getParentArea = function() {
12853
13005
  }
12854
13006
  }
12855
13007
 
13008
+ Element.prototype.listen = function( eventName, callback, callbackName ) {
13009
+ callbackName = callbackName ?? ( "_on" + eventName );
13010
+ this[ callbackName ] = callback;
13011
+ this.addEventListener( eventName, callback );
13012
+ }
13013
+
13014
+ Element.prototype.ignore = function( eventName, callbackName ) {
13015
+ callbackName = callbackName ?? ( "_on" + eventName );
13016
+ const callback = this[ callbackName ];
13017
+ this.removeEventListener( eventName, callback );
13018
+ }
13019
+
12856
13020
  LX.UTILS = {
12857
13021
  getTime() { return new Date().getTime() },
12858
13022
  compareThreshold( v, p, n, t ) { return Math.abs(v - p) >= t || Math.abs(v - n) >= t },
@@ -12953,6 +13117,7 @@ LX.ICONS = {
12953
13117
  "edit": [512, 512, [], "regular", "M441 58.9L453.1 71c9.4 9.4 9.4 24.6 0 33.9L424 134.1 377.9 88 407 58.9c9.4-9.4 24.6-9.4 33.9 0zM209.8 256.2L344 121.9 390.1 168 255.8 302.2c-2.9 2.9-6.5 5-10.4 6.1l-58.5 16.7 16.7-58.5c1.1-3.9 3.2-7.5 6.1-10.4zM373.1 25L175.8 222.2c-8.7 8.7-15 19.4-18.3 31.1l-28.6 100c-2.4 8.4-.1 17.4 6.1 23.6s15.2 8.5 23.6 6.1l100-28.6c11.8-3.4 22.5-9.7 31.1-18.3L487 138.9c28.1-28.1 28.1-73.7 0-101.8L474.9 25C446.8-3.1 401.2-3.1 373.1 25zM88 64C39.4 64 0 103.4 0 152L0 424c0 48.6 39.4 88 88 88l272 0c48.6 0 88-39.4 88-88l0-112c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 112c0 22.1-17.9 40-40 40L88 464c-22.1 0-40-17.9-40-40l0-272c0-22.1 17.9-40 40-40l112 0c13.3 0 24-10.7 24-24s-10.7-24-24-24L88 64z"],
12954
13118
  "envelope": [512, 512, [], "regular", "M64 112c-8.8 0-16 7.2-16 16l0 22.1L220.5 291.7c20.7 17 50.4 17 71.1 0L464 150.1l0-22.1c0-8.8-7.2-16-16-16L64 112zM48 212.2L48 384c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-171.8L322 328.8c-38.4 31.5-93.7 31.5-132 0L48 212.2zM0 128C0 92.7 28.7 64 64 64l384 0c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 448c-35.3 0-64-28.7-64-64L0 128z"],
12955
13119
  "envelope-open": [512, 512, [], "regular", "M255.4 48.2c.2-.1 .4-.2 .6-.2s.4 .1 .6 .2L460.6 194c2.1 1.5 3.4 3.9 3.4 6.5l0 13.6L291.5 355.7c-20.7 17-50.4 17-71.1 0L48 214.1l0-13.6c0-2.6 1.2-5 3.4-6.5L255.4 48.2zM48 276.2L190 392.8c38.4 31.5 93.7 31.5 132 0L464 276.2 464 456c0 4.4-3.6 8-8 8L56 464c-4.4 0-8-3.6-8-8l0-179.8zM256 0c-10.2 0-20.2 3.2-28.5 9.1L23.5 154.9C8.7 165.4 0 182.4 0 200.5L0 456c0 30.9 25.1 56 56 56l400 0c30.9 0 56-25.1 56-56l0-255.5c0-18.1-8.7-35.1-23.4-45.6L284.5 9.1C276.2 3.2 266.2 0 256 0z"],
13120
+ "inbox": [24, 24, [], "regular", "M22 12H16l-2 3h-4l-2-3H2M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11Z", null, "fill=none stroke-width=2 stroke-linejoin=round stroke-linecap=round"],
12956
13121
  "map": [576, 512, [], "regular", "M565.6 36.2C572.1 40.7 576 48.1 576 56l0 336c0 10-6.2 18.9-15.5 22.4l-168 64c-5.2 2-10.9 2.1-16.1 .3L192.5 417.5l-160 61c-7.4 2.8-15.7 1.8-22.2-2.7S0 463.9 0 456L0 120c0-10 6.1-18.9 15.5-22.4l168-64c5.2-2 10.9-2.1 16.1-.3L383.5 94.5l160-61c7.4-2.8 15.7-1.8 22.2 2.7zM48 136.5l0 284.6 120-45.7 0-284.6L48 136.5zM360 422.7l0-285.4-144-48 0 285.4 144 48zm48-1.5l120-45.7 0-284.6L408 136.5l0 284.6z"],
12957
13122
  "note-sticky": [448, 512, ["sticky-note"], "regular", "M64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l224 0 0-80c0-17.7 14.3-32 32-32l80 0 0-224c0-8.8-7.2-16-16-16L64 80zM288 480L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l320 0c35.3 0 64 28.7 64 64l0 224 0 5.5c0 17-6.7 33.3-18.7 45.3l-90.5 90.5c-12 12-28.3 18.7-45.3 18.7l-5.5 0z"],
12958
13123
  "file": [384, 512, [], "regular", "M320 464c8.8 0 16-7.2 16-16l0-288-80 0c-17.7 0-32-14.3-32-32l0-80L64 48c-8.8 0-16 7.2-16 16l0 384c0 8.8 7.2 16 16 16l256 0zM0 64C0 28.7 28.7 0 64 0L229.5 0c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3L384 448c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 64z"],
@@ -12960,7 +13125,10 @@ LX.ICONS = {
12960
13125
  "file-code": [384, 512, [], "regular", "M64 464c-8.8 0-16-7.2-16-16L48 64c0-8.8 7.2-16 16-16l160 0 0 80c0 17.7 14.3 32 32 32l80 0 0 288c0 8.8-7.2 16-16 16L64 464zM64 0C28.7 0 0 28.7 0 64L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-293.5c0-17-6.7-33.3-18.7-45.3L274.7 18.7C262.7 6.7 246.5 0 229.5 0L64 0zm97 289c9.4-9.4 9.4-24.6 0-33.9s-24.6-9.4-33.9 0L79 303c-9.4 9.4-9.4 24.6 0 33.9l48 48c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-31-31 31-31zM257 255c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l31 31-31 31c-9.4 9.4-9.4 24.6 0 33.9s24.6 9.4 33.9 0l48-48c9.4-9.4 9.4-24.6 0-33.9l-48-48z"],
12961
13126
  "file-zip": [384, 512, [], "regular", "M64 464c-8.8 0-16-7.2-16-16L48 64c0-8.8 7.2-16 16-16l48 0c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16l48 0 0 80c0 17.7 14.3 32 32 32l80 0 0 288c0 8.8-7.2 16-16 16L64 464zM64 0C28.7 0 0 28.7 0 64L0 448c0 35.3 28.7 64 64 64l256 0c35.3 0 64-28.7 64-64l0-293.5c0-17-6.7-33.3-18.7-45.3L274.7 18.7C262.7 6.7 246.5 0 229.5 0L64 0zm48 112c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0c-8.8 0-16 7.2-16 16zm0 64c0 8.8 7.2 16 16 16l32 0c8.8 0 16-7.2 16-16s-7.2-16-16-16l-32 0c-8.8 0-16 7.2-16 16zm-6.3 71.8L82.1 335.9c-1.4 5.4-2.1 10.9-2.1 16.4c0 35.2 28.8 63.7 64 63.7s64-28.5 64-63.7c0-5.5-.7-11.1-2.1-16.4l-23.5-88.2c-3.7-14-16.4-23.8-30.9-23.8l-14.8 0c-14.5 0-27.2 9.7-30.9 23.8zM128 336l32 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0c-8.8 0-16-7.2-16-16s7.2-16 16-16z"],
12962
13127
  "file-pdf": [512, 512, [], "regular", "M64 464l48 0 0 48-48 0c-35.3 0-64-28.7-64-64L0 64C0 28.7 28.7 0 64 0L229.5 0c17 0 33.3 6.7 45.3 18.7l90.5 90.5c12 12 18.7 28.3 18.7 45.3L384 304l-48 0 0-144-80 0c-17.7 0-32-14.3-32-32l0-80L64 48c-8.8 0-16 7.2-16 16l0 384c0 8.8 7.2 16 16 16zM176 352l32 0c30.9 0 56 25.1 56 56s-25.1 56-56 56l-16 0 0 32c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-48 0-80c0-8.8 7.2-16 16-16zm32 80c13.3 0 24-10.7 24-24s-10.7-24-24-24l-16 0 0 48 16 0zm96-80l32 0c26.5 0 48 21.5 48 48l0 64c0 26.5-21.5 48-48 48l-32 0c-8.8 0-16-7.2-16-16l0-128c0-8.8 7.2-16 16-16zm32 128c8.8 0 16-7.2 16-16l0-64c0-8.8-7.2-16-16-16l-16 0 0 96 16 0zm80-112c0-8.8 7.2-16 16-16l48 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 32 32 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-32 0 0 48c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-64 0-64z"],
13128
+ "box-archive": [24, 24, [], "regular", "M2 3a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v3a1 1 0 0 1-1 1H2V3Zm2 5h16v11a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V8Zm6 4h4", null, "fill=none stroke-width=2 stroke-linecap=round stroke-linejoin=round"],
13129
+ "box-archive-x": [24, 24, [], "regular", "M3 3h18a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1ZM4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8M9.5 17l5-5m-5-0l5 5", null, "fill=none stroke-width=2 stroke-linecap=round stroke-linejoin=round"],
12963
13130
  "scroll": [576, 512, ["script"], "solid", "M0 80l0 48c0 17.7 14.3 32 32 32l16 0 48 0 0-80c0-26.5-21.5-48-48-48S0 53.5 0 80zM112 32c10 13.4 16 30 16 48l0 304c0 35.3 28.7 64 64 64s64-28.7 64-64l0-5.3c0-32.4 26.3-58.7 58.7-58.7L480 320l0-192c0-53-43-96-96-96L112 32zM464 480c61.9 0 112-50.1 112-112c0-8.8-7.2-16-16-16l-245.3 0c-14.7 0-26.7 11.9-26.7 26.7l0 5.3c0 53-43 96-96 96l176 0 96 0z"],
13131
+ "paper-plane": [512, 512, [], "", "M16.1 260.2c-22.6 12.9-20.5 47.3 3.6 57.3L160 376l0 103.3c0 18.1 14.6 32.7 32.7 32.7c9.7 0 18.9-4.3 25.1-11.8l62-74.3 123.9 51.6c18.9 7.9 40.8-4.5 43.9-24.7l64-416c1.9-12.1-3.4-24.3-13.5-31.2s-23.3-7.5-34-1.4l-448 256zm52.1 25.5L409.7 90.6 190.1 336l1.2 1L68.2 285.7zM403.3 425.4L236.7 355.9 450.8 116.6 403.3 425.4z"],
12964
13132
  "floppy-disk": [448, 512, ["save"], "regular", "M48 96l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-245.5c0-4.2-1.7-8.3-4.7-11.3l33.9-33.9c12 12 18.7 28.3 18.7 45.3L448 416c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96C0 60.7 28.7 32 64 32l245.5 0c17 0 33.3 6.7 45.3 18.7l74.5 74.5-33.9 33.9L320.8 84.7c-.3-.3-.5-.5-.8-.8L320 184c0 13.3-10.7 24-24 24l-192 0c-13.3 0-24-10.7-24-24L80 80 64 80c-8.8 0-16 7.2-16 16zm80-16l0 80 144 0 0-80L128 80zm32 240a64 64 0 1 1 128 0 64 64 0 1 1 -128 0z"],
12965
13133
  "download": [512, 512, [], "solid", "M288 32c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 242.7-73.4-73.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l128 128c12.5 12.5 32.8 12.5 45.3 0l128-128c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L288 274.7 288 32zM64 352c-35.3 0-64 28.7-64 64l0 32c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-32c0-35.3-28.7-64-64-64l-101.5 0-45.3 45.3c-25 25-65.5 25-90.5 0L165.5 352 64 352zm368 56a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"],
12966
13134
  "upload": [512, 512, [], "solid", "M288 109.3L288 352c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-242.7-73.4 73.4c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l128-128c12.5-12.5 32.8-12.5 45.3 0l128 128c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L288 109.3zM64 352l128 0c0 35.3 28.7 64 64 64s64-28.7 64-64l128 0c35.3 0 64 28.7 64 64l0 32c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64l0-32c0-35.3 28.7-64 64-64zM432 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z"],
@@ -12970,6 +13138,7 @@ LX.ICONS = {
12970
13138
  "eye": [576, 512, [], "regular", "M288 80c-65.2 0-118.8 29.6-159.9 67.7C89.6 183.5 63 226 49.4 256c13.6 30 40.2 72.5 78.6 108.3C169.2 402.4 222.8 432 288 432s118.8-29.6 159.9-67.7C486.4 328.5 513 286 526.6 256c-13.6-30-40.2-72.5-78.6-108.3C406.8 109.6 353.2 80 288 80zM95.4 112.6C142.5 68.8 207.2 32 288 32s145.5 36.8 192.6 80.6c46.8 43.5 78.1 95.4 93 131.1c3.3 7.9 3.3 16.7 0 24.6c-14.9 35.7-46.2 87.7-93 131.1C433.5 443.2 368.8 480 288 480s-145.5-36.8-192.6-80.6C48.6 356 17.3 304 2.5 268.3c-3.3-7.9-3.3-16.7 0-24.6C17.3 208 48.6 156 95.4 112.6zM288 336c44.2 0 80-35.8 80-80s-35.8-80-80-80c-.7 0-1.3 0-2 0c1.3 5.1 2 10.5 2 16c0 35.3-28.7 64-64 64c-5.5 0-10.9-.7-16-2c0 .7 0 1.3 0 2c0 44.2 35.8 80 80 80zm0-208a128 128 0 1 1 0 256 128 128 0 1 1 0-256z"],
12971
13139
  "eye-slash": [640, 512, [], "regular", "M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z"],
12972
13140
  "comment": [512, 512, [], "regular", "M123.6 391.3c12.9-9.4 29.6-11.8 44.6-6.4c26.5 9.6 56.2 15.1 87.8 15.1c124.7 0 208-80.5 208-160s-83.3-160-208-160S48 160.5 48 240c0 32 12.4 62.8 35.7 89.2c8.6 9.7 12.8 22.5 11.8 35.5c-1.4 18.1-5.7 34.7-11.3 49.4c17-7.9 31.1-16.7 39.4-22.7zM21.2 431.9c1.8-2.7 3.5-5.4 5.1-8.1c10-16.6 19.5-38.4 21.4-62.9C17.7 326.8 0 285.1 0 240C0 125.1 114.6 32 256 32s256 93.1 256 208s-114.6 208-256 208c-37.1 0-72.3-6.4-104.1-17.9c-11.9 8.7-31.3 20.6-54.3 30.6c-15.1 6.6-32.3 12.6-50.1 16.1c-.8 .2-1.6 .3-2.4 .5c-4.4 .8-8.7 1.5-13.2 1.9c-.2 0-.5 .1-.7 .1c-5.1 .5-10.2 .8-15.3 .8c-6.5 0-12.3-3.9-14.8-9.9c-2.5-6-1.1-12.8 3.4-17.4c4.1-4.2 7.8-8.7 11.3-13.5c1.7-2.3 3.3-4.6 4.8-6.9l.3-.5z"],
13141
+ "comments": [640, 512, [], "regular", "M88.2 309.1c9.8-18.3 6.8-40.8-7.5-55.8C59.4 230.9 48 204 48 176c0-63.5 63.8-128 160-128s160 64.5 160 128s-63.8 128-160 128c-13.1 0-25.8-1.3-37.8-3.6c-10.4-2-21.2-.6-30.7 4.2c-4.1 2.1-8.3 4.1-12.6 6c-16 7.2-32.9 13.5-49.9 18c2.8-4.6 5.4-9.1 7.9-13.6c1.1-1.9 2.2-3.9 3.2-5.9zM208 352c114.9 0 208-78.8 208-176S322.9 0 208 0S0 78.8 0 176c0 41.8 17.2 80.1 45.9 110.3c-.9 1.7-1.9 3.5-2.8 5.1c-10.3 18.4-22.3 36.5-36.6 52.1c-6.6 7-8.3 17.2-4.6 25.9C5.8 378.3 14.4 384 24 384c43 0 86.5-13.3 122.7-29.7c4.8-2.2 9.6-4.5 14.2-6.8c15.1 3 30.9 4.5 47.1 4.5zM432 480c16.2 0 31.9-1.6 47.1-4.5c4.6 2.3 9.4 4.6 14.2 6.8C529.5 498.7 573 512 616 512c9.6 0 18.2-5.7 22-14.5c3.8-8.8 2-19-4.6-25.9c-14.2-15.6-26.2-33.7-36.6-52.1c-.9-1.7-1.9-3.4-2.8-5.1C622.8 384.1 640 345.8 640 304c0-94.4-87.9-171.5-198.2-175.8c4.1 15.2 6.2 31.2 6.2 47.8l0 .6c87.2 6.7 144 67.5 144 127.4c0 28-11.4 54.9-32.7 77.2c-14.3 15-17.3 37.6-7.5 55.8c1.1 2 2.2 4 3.2 5.9c2.5 4.5 5.2 9 7.9 13.6c-17-4.5-33.9-10.7-49.9-18c-4.3-1.9-8.5-3.9-12.6-6c-9.5-4.8-20.3-6.2-30.7-4.2c-12.1 2.4-24.8 3.6-37.8 3.6c-61.7 0-110-26.5-136.8-62.3c-16 5.4-32.8 9.4-50 11.8C279 439.8 350 480 432 480z"],
12973
13142
  "message": [512, 512, [], "regular", "M160 368c26.5 0 48 21.5 48 48l0 16 72.5-54.4c8.3-6.2 18.4-9.6 28.8-9.6L448 368c8.8 0 16-7.2 16-16l0-288c0-8.8-7.2-16-16-16L64 48c-8.8 0-16 7.2-16 16l0 288c0 8.8 7.2 16 16 16l96 0zm48 124l-.2 .2-5.1 3.8-17.1 12.8c-4.8 3.6-11.3 4.2-16.8 1.5s-8.8-8.2-8.8-14.3l0-21.3 0-6.4 0-.3 0-4 0-48-48 0-48 0c-35.3 0-64-28.7-64-64L0 64C0 28.7 28.7 0 64 0L448 0c35.3 0 64 28.7 64 64l0 288c0 35.3-28.7 64-64 64l-138.7 0L208 492z"],
12974
13143
  "folder": [512, 512, [], "regular", "M0 96C0 60.7 28.7 32 64 32l132.1 0c19.1 0 37.4 7.6 50.9 21.1L289.9 96 448 96c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l384 0c8.8 0 16-7.2 16-16l0-256c0-8.8-7.2-16-16-16l-161.4 0c-10.6 0-20.8-4.2-28.3-11.7L213.1 87c-4.5-4.5-10.6-7-17-7L64 80z"],
12975
13144
  "folder-closed": [512, 512, [], "regular", "M251.7 127.6s0 0 0 0c10.5 10.5 24.7 16.4 39.6 16.4L448 144c8.8 0 16 7.2 16 16l0 32L48 192l0-96c0-8.8 7.2-16 16-16l133.5 0c4.2 0 8.3 1.7 11.3 4.7l33.9-33.9L208.8 84.7l42.9 42.9zM48 240l416 0 0 176c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16l0-176zM285.7 93.7L242.7 50.7c-12-12-28.3-18.7-45.3-18.7L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-256c0-35.3-28.7-64-64-64L291.3 96c-2.1 0-4.2-.8-5.7-2.3z"],
@@ -12983,27 +13152,33 @@ LX.ICONS = {
12983
13152
  "up": [448, 512, [], "solid", "M201.4 137.4c12.5-12.5 32.8-12.5 45.3 0l160 160c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L224 205.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l160-160z"],
12984
13153
  "down": [448, 512, [], "solid", "M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"],
12985
13154
  "arrows": [512, 512, ["arrows-up-down-left-right"], "solid", "M278.6 9.4c-12.5-12.5-32.8-12.5-45.3 0l-64 64c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l9.4-9.4L224 224l-114.7 0 9.4-9.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-64 64c-12.5 12.5-12.5 32.8 0 45.3l64 64c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-9.4-9.4L224 288l0 114.7-9.4-9.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l64 64c12.5 12.5 32.8 12.5 45.3 0l64-64c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-9.4 9.4L288 288l114.7 0-9.4 9.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l64-64c12.5-12.5 12.5-32.8 0-45.3l-64-64c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l9.4 9.4L288 224l0-114.7 9.4 9.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-64-64z"],
13155
+ "arrow-pointer": [320, 512, [], "solid", "M0 55.2L0 426c0 12.2 9.9 22 22 22c6.3 0 12.4-2.7 16.6-7.5L121.2 346l58.1 116.3c7.9 15.8 27.1 22.2 42.9 14.3s22.2-27.1 14.3-42.9L179.8 320l118.1 0c12.2 0 22.1-9.9 22.1-22.1c0-6.3-2.7-12.3-7.4-16.5L38.6 37.9C34.3 34.1 28.9 32 23.2 32C10.4 32 0 42.4 0 55.2z"],
13156
+ "reply": [24, 24, [], "regular", "M9 17L4 12L9 7M4 12H16A4 4 0 0 1 20 16V18", null, "fill=none stroke-width=2 stroke-linejoin=round stroke-linecap=round"],
13157
+ "reply-all": [24, 24, [], "regular", "M7 17L2 12L7 7M12 17L7 12L12 7M7 12H18A4 4 0 0 1 22 16V18", null, "fill=none stroke-width=2 stroke-linejoin=round stroke-linecap=round"],
13158
+ "forward": [24, 24, [], "regular", "M15 17L20 12L15 7M4 18V16A4 4 0 0 1 8 12H20", null, "fill=none stroke-width=2 stroke-linejoin=round stroke-linecap=round"],
12986
13159
  "rotate": [512, 512, [], "solid", "M142.9 142.9c-17.5 17.5-30.1 38-37.8 59.8c-5.9 16.7-24.2 25.4-40.8 19.5s-25.4-24.2-19.5-40.8C55.6 150.7 73.2 122 97.6 97.6c87.2-87.2 228.3-87.5 315.8-1L455 55c6.9-6.9 17.2-8.9 26.2-5.2s14.8 12.5 14.8 22.2l0 128c0 13.3-10.7 24-24 24l-8.4 0c0 0 0 0 0 0L344 224c-9.7 0-18.5-5.8-22.2-14.8s-1.7-19.3 5.2-26.2l41.1-41.1c-62.6-61.5-163.1-61.2-225.3 1zM16 312c0-13.3 10.7-24 24-24l7.6 0 .7 0L168 288c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-41.1 41.1c62.6 61.5 163.1 61.2 225.3-1c17.5-17.5 30.1-38 37.8-59.8c5.9-16.7 24.2-25.4 40.8-19.5s25.4 24.2 19.5 40.8c-10.8 30.6-28.4 59.3-52.9 83.8c-87.2 87.2-228.3 87.5-315.8 1L57 457c-6.9 6.9-17.2 8.9-26.2 5.2S16 449.7 16 440l0-119.6 0-.7 0-7.6z"],
12987
13160
  "rotate-right": [512, 512, ["rotate-forward"], "solid", "M463.5 224l8.5 0c13.3 0 24-10.7 24-24l0-128c0-9.7-5.8-18.5-14.8-22.2s-19.3-1.7-26.2 5.2L413.4 96.6c-87.6-86.5-228.7-86.2-315.8 1c-87.5 87.5-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3c62.2-62.2 162.7-62.5 225.3-1L327 183c-6.9 6.9-8.9 17.2-5.2 26.2s12.5 14.8 22.2 14.8l119.5 0z"],
12988
13161
  "rotate-left": [512, 512, ["rotate-back"], "solid", "M48.5 224L40 224c-13.3 0-24-10.7-24-24L16 72c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2L98.6 96.6c87.6-86.5 228.7-86.2 315.8 1c87.5 87.5 87.5 229.3 0 316.8s-229.3 87.5-316.8 0c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0c62.5 62.5 163.8 62.5 226.3 0s62.5-163.8 0-226.3c-62.2-62.2-162.7-62.5-225.3-1L185 183c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8L48.5 224z"],
12989
- "arrow-pointer": [320, 512, [], "solid", "M0 55.2L0 426c0 12.2 9.9 22 22 22c6.3 0 12.4-2.7 16.6-7.5L121.2 346l58.1 116.3c7.9 15.8 27.1 22.2 42.9 14.3s22.2-27.1 14.3-42.9L179.8 320l118.1 0c12.2 0 22.1-9.9 22.1-22.1c0-6.3-2.7-12.3-7.4-16.5L38.6 37.9C34.3 34.1 28.9 32 23.2 32C10.4 32 0 42.4 0 55.2z"],
12990
13162
  "hand-pointer": [448, 512, [], "regular", "M160 64c0-8.8 7.2-16 16-16s16 7.2 16 16l0 136c0 10.3 6.6 19.5 16.4 22.8s20.6-.1 26.8-8.3c3-3.9 7.6-6.4 12.8-6.4c8.8 0 16 7.2 16 16c0 10.3 6.6 19.5 16.4 22.8s20.6-.1 26.8-8.3c3-3.9 7.6-6.4 12.8-6.4c7.8 0 14.3 5.6 15.7 13c1.6 8.2 7.3 15.1 15.1 18s16.7 1.6 23.3-3.6c2.7-2.1 6.1-3.4 9.9-3.4c8.8 0 16 7.2 16 16l0 16 0 104c0 39.8-32.2 72-72 72l-56 0-59.8 0-.9 0c-37.4 0-72.4-18.7-93.2-49.9L50.7 312.9c-4.9-7.4-2.9-17.3 4.4-22.2s17.3-2.9 22.2 4.4L116 353.2c5.9 8.8 16.8 12.7 26.9 9.7s17-12.4 17-23l0-19.9 0-256zM176 0c-35.3 0-64 28.7-64 64l0 197.7C91.2 238 55.5 232.8 28.5 250.7C-.9 270.4-8.9 310.1 10.8 339.5L78.3 440.8c29.7 44.5 79.6 71.2 133.1 71.2l.9 0 59.8 0 56 0c66.3 0 120-53.7 120-120l0-104 0-16c0-35.3-28.7-64-64-64c-4.5 0-8.8 .5-13 1.3c-11.7-15.4-30.2-25.3-51-25.3c-6.9 0-13.5 1.1-19.7 3.1C288.7 170.7 269.6 160 248 160c-2.7 0-5.4 .2-8 .5L240 64c0-35.3-28.7-64-64-64zm48 304c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 96c0 8.8 7.2 16 16 16s16-7.2 16-16l0-96zm48-16c-8.8 0-16 7.2-16 16l0 96c0 8.8 7.2 16 16 16s16-7.2 16-16l0-96c0-8.8-7.2-16-16-16zm80 16c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 96c0 8.8 7.2 16 16 16s16-7.2 16-16l0-96z"],
12991
13163
  "log-in": [512, 512, [], "solid", "M352 96l64 0c17.7 0 32 14.3 32 32l0 256c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32l64 0c53 0 96-43 96-96l0-256c0-53-43-96-96-96l-64 0c-17.7 0-32 14.3-32 32s14.3 32 32 32zm-9.4 182.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L242.7 224 32 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l210.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128z"],
12992
13164
  "log-out": [512, 512, [], "solid", "M502.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L402.7 224 192 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l210.7 0-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l128-128zM160 96c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 32C43 32 0 75 0 128L0 384c0 53 43 96 96 96l64 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-64 0c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l64 0z"],
12993
- "menu-arrows": [512, 512, [], "solid", "M352 144l96 112-96 112M160 144L64 256l96 112", "transform=rotate(90)", "fill=none stroke=currentColor stroke-width=60 stroke-linejoin=round stroke-linecap=round"],
13165
+ "menu-arrows": [512, 512, [], "solid", "M352 144l96 112-96 112M160 144L64 256l96 112", "transform=rotate(90)", "fill=none stroke-width=60 stroke-linejoin=round stroke-linecap=round"],
12994
13166
  "more": [128, 512, [], "solid", "M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"],
12995
13167
  "minus": [448, 512, [], "solid", "M432 256c0 17.7-14.3 32-32 32L48 288c-17.7 0-32-14.3-32-32s14.3-32 32-32l352 0c17.7 0 32 14.3 32 32z"],
12996
13168
  "more-horizontal": [448, 512, [], "solid", "M8 256a56 56 0 1 1 112 0A56 56 0 1 1 8 256zm160 0a56 56 0 1 1 112 0 56 56 0 1 1 -112 0zm216-56a56 56 0 1 1 0 112 56 56 0 1 1 0-112z"],
12997
13169
  "plus": [448, 512, [], "solid", "M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z"],
12998
13170
  "circle-plus": [24, 24, [], "regular", "M12 8V16M8 12H16M22 12C22 17.5228 17.5228 22 12 22C6.47715 22 2 17.5228 2 12C2 6.47715 6.47715 2 12 2C17.5228 2 22 6.47715 22 12Z", null, "fill=none stroke-width=2 stroke-linecap=round stroke-linejoin=round"],
13171
+ "circle-info": [24, 24, [], "regular", "M12 2a10 10 0 1 1 0 20 10 10 0 0 1 0-20ZM12 8v4M12 16h.01", null, "fill=none stroke-width=2 stroke-linejoin=round stroke-linecap=round"],
12999
13172
  "search": [512, 512, [], "solid", "M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"],
13000
13173
  "compass": [512, 512, [], "regular", "M464 256A208 208 0 1 0 48 256a208 208 0 1 0 416 0zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zm306.7 69.1L162.4 380.6c-19.4 7.5-38.5-11.6-31-31l55.5-144.3c3.3-8.5 9.9-15.1 18.4-18.4l144.3-55.5c19.4-7.5 38.5 11.6 31 31L325.1 306.7c-3.2 8.5-9.9 15.1-18.4 18.4zM288 256a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"],
13001
- "sidebar": [512, 512, [], "regular", "M64 64h384a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H64a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32zm128 0v384", null, "fill=none stroke=currentColor stroke-width=50 stroke-linejoin=round stroke-linecap=round"],
13174
+ "clock": [512, 512, [], "regular", "M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"],
13175
+ "sidebar": [512, 512, [], "regular", "M64 64h384a32 32 0 0 1 32 32v320a32 32 0 0 1-32 32H64a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32zm128 0v384", null, "fill=none stroke-width=50 stroke-linejoin=round stroke-linecap=round"],
13002
13176
  "table-cells": [512, 512, [], "solid", "M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zm88 64l0 64-88 0 0-64 88 0zm56 0l88 0 0 64-88 0 0-64zm240 0l0 64-88 0 0-64 88 0zM64 224l88 0 0 64-88 0 0-64zm232 0l0 64-88 0 0-64 88 0zm64 0l88 0 0 64-88 0 0-64zM152 352l0 64-88 0 0-64 88 0zm56 0l88 0 0 64-88 0 0-64zm240 0l0 64-88 0 0-64 88 0z"],
13003
13177
  "table-cells-large": [512, 512, [], "solid", "M448 96l0 128-160 0 0-128 160 0zm0 192l0 128-160 0 0-128 160 0zM224 224L64 224 64 96l160 0 0 128zM64 288l160 0 0 128L64 416l0-128zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"],
13004
13178
  "lightbulb": [384, 512, [], "regular", "M297.2 248.9C311.6 228.3 320 203.2 320 176c0-70.7-57.3-128-128-128S64 105.3 64 176c0 27.2 8.4 52.3 22.8 72.9c3.7 5.3 8.1 11.3 12.8 17.7c0 0 0 0 0 0c12.9 17.7 28.3 38.9 39.8 59.8c10.4 19 15.7 38.8 18.3 57.5L109 384c-2.2-12-5.9-23.7-11.8-34.5c-9.9-18-22.2-34.9-34.5-51.8c0 0 0 0 0 0s0 0 0 0c-5.2-7.1-10.4-14.2-15.4-21.4C27.6 247.9 16 213.3 16 176C16 78.8 94.8 0 192 0s176 78.8 176 176c0 37.3-11.6 71.9-31.4 100.3c-5 7.2-10.2 14.3-15.4 21.4c0 0 0 0 0 0s0 0 0 0c-12.3 16.8-24.6 33.7-34.5 51.8c-5.9 10.8-9.6 22.5-11.8 34.5l-48.6 0c2.6-18.7 7.9-38.6 18.3-57.5c11.5-20.9 26.9-42.1 39.8-59.8c0 0 0 0 0 0s0 0 0 0s0 0 0 0c4.7-6.4 9-12.4 12.7-17.7zM192 128c-26.5 0-48 21.5-48 48c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-44.2 35.8-80 80-80c8.8 0 16 7.2 16 16s-7.2 16-16 16zm0 384c-44.2 0-80-35.8-80-80l0-16 160 0 0 16c0 44.2-35.8 80-80 80z"],
13005
13179
  "flag": [448, 512, [], "regular", "M48 24C48 10.7 37.3 0 24 0S0 10.7 0 24L0 64 0 350.5 0 400l0 88c0 13.3 10.7 24 24 24s24-10.7 24-24l0-100 80.3-20.1c41.1-10.3 84.6-5.5 122.5 13.4c44.2 22.1 95.5 24.8 141.7 7.4l34.7-13c12.5-4.7 20.8-16.6 20.8-30l0-279.7c0-23-24.2-38-44.8-27.7l-9.6 4.8c-46.3 23.2-100.8 23.2-147.1 0c-35.1-17.6-75.4-22-113.5-12.5L48 52l0-28zm0 77.5l96.6-24.2c27-6.7 55.5-3.6 80.4 8.8c54.9 27.4 118.7 29.7 175 6.8l0 241.8-24.4 9.1c-33.7 12.6-71.2 10.7-103.4-5.4c-48.2-24.1-103.3-30.1-155.6-17.1L48 338.5l0-237z"],
13006
13180
  "shuffle": [512, 512, [], "solid", "M403.8 34.4c12-5 25.7-2.2 34.9 6.9l64 64c6 6 9.4 14.1 9.4 22.6s-3.4 16.6-9.4 22.6l-64 64c-9.2 9.2-22.9 11.9-34.9 6.9s-19.8-16.6-19.8-29.6l0-32-32 0c-10.1 0-19.6 4.7-25.6 12.8L284 229.3 244 176l31.2-41.6C293.3 110.2 321.8 96 352 96l32 0 0-32c0-12.9 7.8-24.6 19.8-29.6zM164 282.7L204 336l-31.2 41.6C154.7 401.8 126.2 416 96 416l-64 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l64 0c10.1 0 19.6-4.7 25.6-12.8L164 282.7zm274.6 188c-9.2 9.2-22.9 11.9-34.9 6.9s-19.8-16.6-19.8-29.6l0-32-32 0c-30.2 0-58.7-14.2-76.8-38.4L121.6 172.8c-6-8.1-15.5-12.8-25.6-12.8l-64 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l64 0c30.2 0 58.7 14.2 76.8 38.4L326.4 339.2c6 8.1 15.5 12.8 25.6 12.8l32 0 0-32c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l64 64c6 6 9.4 14.1 9.4 22.6s-3.4 16.6-9.4 22.6l-64 64z"],
13181
+ "shopping-cart": [24, 24, [], "regular", "M8 20a1 1 0 1 0 0 2 1 1 0 0 0 0-2ZM19 20a1 1 0 1 0 0 2 1 1 0 0 0 0-2ZM2.05 2.05h2l2.66 12.42a2 2 0 0 0 2 1.58h9.78a2 2 0 0 0 1.95-1.57l1.65-7.43H5.12", null, "fill=none stroke-width=2 stroke-linecap=round stroke-linejoin=round"],
13007
13182
  "credit-card": [576, 512, [], "regular", "M512 80c8.8 0 16 7.2 16 16l0 32L48 128l0-32c0-8.8 7.2-16 16-16l448 0zm16 144l0 192c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16l0-192 480 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l448 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zm56 304c-13.3 0-24 10.7-24 24s10.7 24 24 24l48 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0zm128 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l112 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-112 0z"],
13008
13183
  "lock": [448, 512, [], "solid", "M144 144l0 48 160 0 0-48c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192l0-48C80 64.5 144.5 0 224 0s144 64.5 144 144l0 48 16 0c35.3 0 64 28.7 64 64l0 192c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 256c0-35.3 28.7-64 64-64l16 0z"],
13009
13184
  "lock-open": [576, 512, [], "solid", "M352 144c0-44.2 35.8-80 80-80s80 35.8 80 80l0 48c0 17.7 14.3 32 32 32s32-14.3 32-32l0-48C576 64.5 511.5 0 432 0S288 64.5 288 144l0 48L64 192c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-192c0-35.3-28.7-64-64-64l-32 0 0-48z"],