lexgui 0.6.2 → 0.6.3

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.
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  var LX = {
9
- version: "0.6.2",
9
+ version: "0.6.3",
10
10
  ready: false,
11
11
  components: [], // Specific pre-build components
12
12
  signals: {}, // Events and triggers
@@ -718,7 +718,7 @@ function makeCodeSnippet( code, size, options = { } )
718
718
  }
719
719
  else if( l.constructor == Array ) // It's a range
720
720
  {
721
- for( let i = ( l[0] - 1 ); i <= ( l[1] - 1 ); i++ )
721
+ for( let i = ( l[ 0 ] - 1 ); i <= ( l[ 1 ] - 1 ); i++ )
722
722
  {
723
723
  code.childNodes[ i ].classList.add( "added" );
724
724
  }
@@ -737,7 +737,7 @@ function makeCodeSnippet( code, size, options = { } )
737
737
  }
738
738
  else if( l.constructor == Array ) // It's a range
739
739
  {
740
- for( let i = ( l[0] - 1 ); i <= ( l[1] - 1 ); i++ )
740
+ for( let i = ( l[ 0 ] - 1 ); i <= ( l[ 1 ] - 1 ); i++ )
741
741
  {
742
742
  code.childNodes[ i ].classList.add( "removed" );
743
743
  }
@@ -857,6 +857,7 @@ function makeIcon( iconName, options = { } )
857
857
 
858
858
  // Resolve variant
859
859
  const requestedVariant = options.variant ?? "regular";
860
+ data = ( ( requestedVariant == "solid" ) ? LX.ICONS[ `${ iconName }@solid` ] : data ) ?? data;
860
861
  const variant = data[ 3 ];
861
862
 
862
863
  // Create internal icon if variant is the same as requested, there's no lucide/fallback data or if variant is "regular" (default)
@@ -1018,6 +1019,9 @@ class vec2 {
1018
1019
  nrm ( v0 = new vec2() ) { v0.set( this.x, this.y ); return v0.mul( 1.0 / this.len(), v0 ); }
1019
1020
  dst ( v ) { return v.sub( this ).len(); }
1020
1021
  clp ( min, max, v0 = new vec2() ) { v0.set( clamp( this.x, min, max ), clamp( this.y, min, max ) ); return v0; }
1022
+
1023
+ fromArray ( array ) { this.x = array[ 0 ]; this.y = array[ 1 ]; }
1024
+ toArray () { return this.xy }
1021
1025
  };
1022
1026
 
1023
1027
  LX.vec2 = vec2;
@@ -1501,9 +1505,12 @@ async function init( options = { } )
1501
1505
  this.main_area = new Area( { id: options.id ?? 'mainarea' } );
1502
1506
  }
1503
1507
 
1504
- if( ( options.autoTheme ?? true ) && window.matchMedia && window.matchMedia( "(prefers-color-scheme: light)" ).matches )
1508
+ if( ( options.autoTheme ?? true ) )
1505
1509
  {
1506
- LX.setTheme( "light" );
1510
+ if( window.matchMedia && window.matchMedia( "(prefers-color-scheme: light)" ).matches )
1511
+ {
1512
+ LX.setTheme( "light" );
1513
+ }
1507
1514
 
1508
1515
  window.matchMedia( "(prefers-color-scheme: dark)" ).addEventListener( "change", event => {
1509
1516
  LX.setTheme( event.matches ? "dark" : "light" );
@@ -1916,13 +1923,10 @@ function asTooltip( trigger, content, options = {} )
1916
1923
  } );
1917
1924
 
1918
1925
  trigger.addEventListener( "mouseleave", function(e) {
1919
- if( !tooltipDom ) return;
1920
-
1921
- tooltipDom.dataset[ "closed" ] = true;
1922
-
1923
- doAsync( () => {
1926
+ if( tooltipDom )
1927
+ {
1924
1928
  tooltipDom.remove();
1925
- }, 300 )
1929
+ }
1926
1930
  } )
1927
1931
  }
1928
1932
 
@@ -2996,7 +3000,7 @@ class Calendar {
2996
3000
 
2997
3001
  constructor( dateString, options = {} ) {
2998
3002
 
2999
- this.root = LX.makeContainer( ["256px", "auto"], "border p-3 bg-primary rounded-lg text-md" );
3003
+ this.root = LX.makeContainer( ["256px", "auto"], "p-1 text-md" );
3000
3004
 
3001
3005
  this.onChange = options.onChange;
3002
3006
  this.untilToday = options.untilToday;
@@ -4025,7 +4029,7 @@ class Area {
4025
4029
  {
4026
4030
  for( let i = 0; i < float.length; i++ )
4027
4031
  {
4028
- const t = float[i];
4032
+ const t = float[ i ];
4029
4033
  switch( t )
4030
4034
  {
4031
4035
  case 'h': break;
@@ -5656,8 +5660,9 @@ class Widget {
5656
5660
  static TABLE = 34;
5657
5661
  static TABS = 35;
5658
5662
  static DATE = 36;
5659
- static LABEL = 37;
5660
- static BLANK = 38;
5663
+ static MAP2D = 37;
5664
+ static LABEL = 38;
5665
+ static BLANK = 39;
5661
5666
 
5662
5667
  static NO_CONTEXT_TYPES = [
5663
5668
  Widget.BUTTON,
@@ -5780,8 +5785,17 @@ class Widget {
5780
5785
  }
5781
5786
 
5782
5787
  _canPaste() {
5783
- return this.type === Widget.CUSTOM ? navigator.clipboard.customIdx !== undefined && this.customIdx == navigator.clipboard.customIdx :
5784
- navigator.clipboard.type === this.type;
5788
+ let pasteAllowed = this.type === Widget.CUSTOM ?
5789
+ ( navigator.clipboard.customIdx !== undefined && this.customIdx == navigator.clipboard.customIdx ) : navigator.clipboard.type === this.type;
5790
+
5791
+ pasteAllowed &= ( this.disabled !== true );
5792
+
5793
+ if( this.onAllowPaste )
5794
+ {
5795
+ pasteAllowed = this.onAllowPaste( pasteAllowed );
5796
+ }
5797
+
5798
+ return pasteAllowed;
5785
5799
  }
5786
5800
 
5787
5801
  _trigger( event, callback, scope = this ) {
@@ -5818,7 +5832,7 @@ class Widget {
5818
5832
  if (a == null || b == null) return false;
5819
5833
  if (a.length !== b.length) return false;
5820
5834
  for (var i = 0; i < a.length; ++i) {
5821
- if (a[i] !== b[i]) return false;
5835
+ if (a[ i ] !== b[ i ]) return false;
5822
5836
  }
5823
5837
  return true;
5824
5838
  })( value, this._initialValue ) : ( value == this._initialValue );
@@ -5893,6 +5907,7 @@ class Widget {
5893
5907
  case Widget.TABLE: return "Table";
5894
5908
  case Widget.TABS: return "Tabs";
5895
5909
  case Widget.DATE: return "Date";
5910
+ case Widget.MAP2D: return "Map2D";
5896
5911
  case Widget.LABEL: return "Label";
5897
5912
  case Widget.BLANK: return "Blank";
5898
5913
  case Widget.CUSTOM: return this.customName;
@@ -6098,12 +6113,14 @@ class NodeTree {
6098
6113
  const nodeFilterInput = this.domEl.querySelector( ".lexnodetreefilter" );
6099
6114
 
6100
6115
  node.children = node.children ?? [];
6116
+
6101
6117
  if( nodeFilterInput && nodeFilterInput.value != "" && !node.id.includes( nodeFilterInput.value ) )
6102
6118
  {
6103
6119
  for( var i = 0; i < node.children.length; ++i )
6104
6120
  {
6105
6121
  this._createItem( node, node.children[ i ], level + 1, selectedId );
6106
6122
  }
6123
+
6107
6124
  return;
6108
6125
  }
6109
6126
 
@@ -6448,7 +6465,7 @@ class NodeTree {
6448
6465
 
6449
6466
  const index = dragged.parent.children.findIndex(n => n.id == dragged.id);
6450
6467
  const removed = dragged.parent.children.splice(index, 1);
6451
- target.children.push( removed[0] );
6468
+ target.children.push( removed[ 0 ] );
6452
6469
  that.refresh();
6453
6470
  delete window.__tree_node_dragged;
6454
6471
  });
@@ -6528,13 +6545,14 @@ class NodeTree {
6528
6545
  inputContainer.appendChild( visibilityBtn.root );
6529
6546
  }
6530
6547
 
6531
- const _hasChild = function( parent, id ) {
6532
- if( !parent.length ) return;
6533
- for( var c of parent.children )
6548
+ const _hasChild = function( node, id ) {
6549
+ if( node.id == id ) return true;
6550
+ let found = false;
6551
+ for( var c of ( node?.children ?? [] ) )
6534
6552
  {
6535
- if( c.id == id ) return true;
6536
- return _hasChild( c, id );
6553
+ found |= _hasChild( c, id );
6537
6554
  }
6555
+ return found;
6538
6556
  };
6539
6557
 
6540
6558
  const exists = _hasChild( node, selectedId );
@@ -6561,6 +6579,7 @@ class NodeTree {
6561
6579
 
6562
6580
  this.data = newData ?? this.data;
6563
6581
  this.domEl.querySelector( "ul" ).innerHTML = "";
6582
+
6564
6583
  if( this.data.constructor === Object )
6565
6584
  {
6566
6585
  this._createItem( null, this.data, 0, selectedId );
@@ -6590,15 +6609,14 @@ class NodeTree {
6590
6609
  this.refresh( null, id );
6591
6610
 
6592
6611
  this.domEl.querySelectorAll( ".selected" ).forEach( i => i.classList.remove( "selected" ) );
6593
- this.selected.length = 0;
6594
6612
 
6595
- var el = this.domEl.querySelector( "#" + id );
6596
- if( el )
6597
- {
6598
- el.classList.add( "selected" );
6599
- this.selected = [ el.treeData ];
6600
- el.focus();
6601
- }
6613
+ // Element should exist, since tree was refreshed to show it
6614
+ const el = this.domEl.querySelector( "#" + id );
6615
+ console.assert( el, "NodeTree: Can't select node " + id );
6616
+
6617
+ el.classList.add( "selected" );
6618
+ this.selected = [ el.treeData ];
6619
+ el.focus();
6602
6620
  }
6603
6621
  }
6604
6622
 
@@ -6859,8 +6877,16 @@ class TextArea extends Widget {
6859
6877
 
6860
6878
  container.appendChild( wValue );
6861
6879
 
6862
- if( options.disabled ?? false ) wValue.setAttribute( "disabled", true );
6863
- if( options.placeholder ) wValue.setAttribute( "placeholder", options.placeholder );
6880
+ if( options.disabled ?? false )
6881
+ {
6882
+ this.disabled = true;
6883
+ wValue.setAttribute( "disabled", true );
6884
+ }
6885
+
6886
+ if( options.placeholder )
6887
+ {
6888
+ wValue.setAttribute( "placeholder", options.placeholder );
6889
+ }
6864
6890
 
6865
6891
  const trigger = options.trigger ?? "default";
6866
6892
 
@@ -6978,6 +7004,7 @@ class Button extends Widget {
6978
7004
 
6979
7005
  if( options.disabled )
6980
7006
  {
7007
+ this.disabled = true;
6981
7008
  wValue.setAttribute( "disabled", true );
6982
7009
  }
6983
7010
 
@@ -8206,7 +8233,7 @@ class Tags extends Widget {
8206
8233
 
8207
8234
  for( let i = 0; i < value.length; ++i )
8208
8235
  {
8209
- const tagName = value[i];
8236
+ const tagName = value[ i ];
8210
8237
  const tag = document.createElement('span');
8211
8238
  tag.className = "lextag";
8212
8239
  tag.innerHTML = tagName;
@@ -8803,7 +8830,7 @@ class NumberInput extends Widget {
8803
8830
 
8804
8831
  if( options.disabled )
8805
8832
  {
8806
- vecinput.disabled = true;
8833
+ this.disabled = vecinput.disabled = true;
8807
8834
  }
8808
8835
 
8809
8836
  // Add slider below
@@ -8959,7 +8986,7 @@ class Vector extends Widget {
8959
8986
  super( Widget.VECTOR, name, [].concat( value ), options );
8960
8987
 
8961
8988
  this.onGetValue = () => {
8962
- let inputs = this.root.querySelectorAll( "input" );
8989
+ let inputs = this.root.querySelectorAll( "input[type='number']" );
8963
8990
  let value = [];
8964
8991
  for( var v of inputs )
8965
8992
  {
@@ -9001,6 +9028,7 @@ class Vector extends Widget {
9001
9028
  container.className = "lexvector";
9002
9029
  this.root.appendChild( container );
9003
9030
 
9031
+ this.disabled = ( options.disabled ?? false );
9004
9032
  const that = this;
9005
9033
 
9006
9034
  for( let i = 0; i < numComponents; ++i )
@@ -9031,7 +9059,7 @@ class Vector extends Widget {
9031
9059
  const dragIcon = LX.makeIcon( "MoveVertical", { iconClass: "drag-icon hidden-opacity", svgClass: "sm" } );
9032
9060
  box.appendChild( dragIcon );
9033
9061
 
9034
- if( options.disabled )
9062
+ if( this.disabled )
9035
9063
  {
9036
9064
  vecinput.disabled = true;
9037
9065
  }
@@ -10116,7 +10144,7 @@ class Table extends Widget {
10116
10144
  delete this.activeCustomFilters[ key ];
10117
10145
  }
10118
10146
  const activeFilters = Object.keys( this.activeCustomFilters ).filter( k => this.activeCustomFilters[ k ] == f.name );
10119
- const filterBadgesHtml = activeFilters.reduce( ( acc, key ) => acc += LX.badge( key, "bg-tertiary text-sm" ), "" );
10147
+ const filterBadgesHtml = activeFilters.reduce( ( acc, key ) => acc += LX.badge( key, "bg-tertiary fg-secondary text-sm border-0" ), "" );
10120
10148
  spanName.innerHTML = icon.innerHTML + f.name + ( activeFilters.length ? separatorHtml : "" ) + filterBadgesHtml;
10121
10149
  this.refresh();
10122
10150
  }
@@ -10128,7 +10156,7 @@ class Table extends Widget {
10128
10156
  else if( f.type == "range" )
10129
10157
  {
10130
10158
  console.assert( f.min != undefined && f.max != undefined, "Range filter needs min and max values!" );
10131
- const container = LX.makeContainer( ["240px", "auto"], "border bg-primary rounded-lg text-md" );
10159
+ const container = LX.makeContainer( ["240px", "auto"], "text-md" );
10132
10160
  const panel = new Panel();
10133
10161
  LX.makeContainer( ["100%", "auto"], "px-3 p-2 pb-0 text-md font-medium", f.name, container );
10134
10162
 
@@ -10141,13 +10169,13 @@ class Table extends Widget {
10141
10169
  panel.addNumber( null, f.start, (v) => {
10142
10170
  f.start = v;
10143
10171
  const inUse = ( f.start != f.min || f.end != f.max );
10144
- spanName.innerHTML = icon.innerHTML + f.name + ( inUse ? separatorHtml + LX.badge( `${ f.start } - ${ f.end } ${ f.units ?? "" }`, "bg-tertiary text-sm" ) : "" );
10172
+ spanName.innerHTML = icon.innerHTML + f.name + ( inUse ? separatorHtml + LX.badge( `${ f.start } - ${ f.end } ${ f.units ?? "" }`, "bg-tertiary fg-secondary text-sm border-0" ) : "" );
10145
10173
  this.refresh();
10146
10174
  }, { skipSlider: true, min: f.min, max: f.max, step: f.step, units: f.units } );
10147
10175
  panel.addNumber( null, f.end, (v) => {
10148
10176
  f.end = v;
10149
10177
  const inUse = ( f.start != f.min || f.end != f.max );
10150
- spanName.innerHTML = icon.innerHTML + f.name + ( inUse ? separatorHtml + LX.badge( `${ f.start } - ${ f.end } ${ f.units ?? "" }`, "bg-tertiary text-sm" ) : "" );
10178
+ spanName.innerHTML = icon.innerHTML + f.name + ( inUse ? separatorHtml + LX.badge( `${ f.start } - ${ f.end } ${ f.units ?? "" }`, "bg-tertiary fg-secondary text-sm border-0" ) : "" );
10151
10179
  this.refresh();
10152
10180
  }, { skipSlider: true, min: f.min, max: f.max, step: f.step, units: f.units } );
10153
10181
  panel.addButton( null, "Reset", () => {
@@ -10180,7 +10208,7 @@ class Table extends Widget {
10180
10208
  }
10181
10209
  }
10182
10210
  this.refresh();
10183
- }, { title: "Reset filters", icon: "X" } );
10211
+ }, { title: "Reset filters", tooltip: true, icon: "X" } );
10184
10212
  headerContainer.appendChild( this._resetCustomFiltersBtn.root );
10185
10213
  this._resetCustomFiltersBtn.root.classList.add( "hidden" );
10186
10214
  }
@@ -10328,7 +10356,7 @@ class Table extends Widget {
10328
10356
  let movePending = null;
10329
10357
 
10330
10358
  document.addEventListener( 'mouseup', (e) => {
10331
- if( !rIdx ) return;
10359
+ if( rIdx === null ) return;
10332
10360
  document.removeEventListener( "mousemove", onMove );
10333
10361
  const fromRow = table.rows[ rIdx ];
10334
10362
  fromRow.dY = 0;
@@ -10342,14 +10370,33 @@ class Table extends Widget {
10342
10370
  if( movePending )
10343
10371
  {
10344
10372
  // Modify inner data first
10373
+ // Origin row should go to the target row, and the rest should be moved up/down
10345
10374
  const fromIdx = rIdx - 1;
10346
10375
  const targetIdx = movePending[ 1 ] - 1;
10347
- var b = data.body[fromIdx];
10348
- data.body[fromIdx] = data.body[targetIdx];
10376
+ const b = data.body[ fromIdx ];
10377
+ let targetOffset = 0;
10378
+
10379
+ if( fromIdx == targetIdx ) return;
10380
+ if( fromIdx > targetIdx ) // Move up
10381
+ {
10382
+ for( let i = fromIdx; i > targetIdx; --i )
10383
+ {
10384
+ data.body[ i ] = data.body[ i - 1 ];
10385
+ }
10386
+ }
10387
+ else // Move down
10388
+ {
10389
+ targetOffset = 1;
10390
+ for( let i = fromIdx; i < targetIdx; ++i )
10391
+ {
10392
+ data.body[ i ] = data.body[ i + 1 ];
10393
+ }
10394
+ }
10395
+
10349
10396
  data.body[targetIdx] = b;
10350
10397
 
10351
10398
  const parent = movePending[ 0 ].parentNode;
10352
- parent.insertChildAtIndex( movePending[ 0 ], movePending[ 1 ] );
10399
+ parent.insertChildAtIndex( movePending[ 0 ], targetIdx + targetOffset );
10353
10400
  movePending = null;
10354
10401
  }
10355
10402
 
@@ -10405,7 +10452,7 @@ class Table extends Widget {
10405
10452
  }
10406
10453
  }
10407
10454
 
10408
- const show = Object.values( acfMap ).reduce( ( e, acc ) => acc *= e );
10455
+ const show = Object.values( acfMap ).reduce( ( e, acc ) => acc *= e, true );
10409
10456
  if( !show )
10410
10457
  {
10411
10458
  continue;
@@ -10440,7 +10487,7 @@ class Table extends Widget {
10440
10487
  }
10441
10488
  }
10442
10489
 
10443
- const show = Object.values( acfMap ).reduce( ( e, acc ) => acc *= e );
10490
+ const show = Object.values( acfMap ).reduce( ( e, acc ) => acc *= e, true );
10444
10491
  if( !show )
10445
10492
  {
10446
10493
  continue;
@@ -10474,7 +10521,7 @@ class Table extends Widget {
10474
10521
  row.addEventListener("mouseenter", function(e) {
10475
10522
  e.preventDefault();
10476
10523
 
10477
- if( rIdx && ( this.rowIndex != rIdx ) && ( eventCatched != this.rowIndex ) )
10524
+ if( rIdx != null && ( this.rowIndex != rIdx ) && ( eventCatched != this.rowIndex ) )
10478
10525
  {
10479
10526
  eventCatched = this.rowIndex;
10480
10527
  const fromRow = table.rows[ rIdx ];
@@ -10483,7 +10530,7 @@ class Table extends Widget {
10483
10530
  movePending = [ fromRow, undo ? (this.rowIndex-1) : this.rowIndex ];
10484
10531
  this.style.transform = undo ? `` : `translateY(-${this.offsetHeight}px)`;
10485
10532
  } else {
10486
- movePending = [ fromRow, undo ? (this.rowIndex) : (this.rowIndex-1) ];
10533
+ movePending = [ fromRow, undo ? (this.rowIndex+1) : (this.rowIndex) ];
10487
10534
  this.style.transform = undo ? `` : `translateY(${this.offsetHeight}px)`;
10488
10535
  }
10489
10536
  doAsync( () => {
@@ -10694,6 +10741,53 @@ class DatePicker extends Widget {
10694
10741
 
10695
10742
  LX.DatePicker = DatePicker;
10696
10743
 
10744
+ /**
10745
+ * @class Map2D
10746
+ * @description Map2D Widget
10747
+ */
10748
+
10749
+ class Map2D extends Widget {
10750
+
10751
+ constructor( name, points, callback, options = {} ) {
10752
+
10753
+ super( Widget.MAP2D, name, null, options );
10754
+
10755
+ this.onGetValue = () => {
10756
+ return this.map2d.weightsObj;
10757
+ };
10758
+
10759
+ this.onSetValue = ( newValue, skipCallback, event ) => {
10760
+ // if( !skipCallback )
10761
+ // {
10762
+ // this._trigger( new IEvent( name, curveInstance.element.value, event ), callback );
10763
+ // }
10764
+ };
10765
+
10766
+ this.onResize = ( rect ) => {
10767
+ const realNameWidth = ( this.root.domName?.style.width ?? "0px" );
10768
+ container.style.width = `calc( 100% - ${ realNameWidth })`;
10769
+ };
10770
+
10771
+ var container = document.createElement( "div" );
10772
+ container.className = "lexmap2d";
10773
+ this.root.appendChild( container );
10774
+
10775
+ this.map2d = new CanvasMap2D( points, callback, options );
10776
+
10777
+ const calendarIcon = LX.makeIcon( "SquareMousePointer" );
10778
+ const calendarButton = new Button( null, "Open Map", () => {
10779
+ this._popover = new Popover( calendarButton.root, [ this.map2d ] );
10780
+ }, { buttonClass: `flex flex-row px-3 fg-secondary justify-between` } );
10781
+
10782
+ calendarButton.root.querySelector( "button" ).appendChild( calendarIcon );
10783
+ container.appendChild( calendarButton.root );
10784
+
10785
+ doAsync( this.onResize.bind( this ) );
10786
+ }
10787
+ }
10788
+
10789
+ LX.Map2D = Map2D;
10790
+
10697
10791
  /**
10698
10792
  * @class Panel
10699
10793
  */
@@ -10797,7 +10891,7 @@ class Panel {
10797
10891
  const signal = this.widgets[ w ].options.signal;
10798
10892
  for( let i = 0; i < LX.signals[signal].length; i++ )
10799
10893
  {
10800
- if( LX.signals[signal][i] == this.widgets[ w ] )
10894
+ if( LX.signals[signal][ i ] == this.widgets[ w ] )
10801
10895
  {
10802
10896
  LX.signals[signal] = [...LX.signals[signal].slice(0, i), ...LX.signals[signal].slice(i+1)];
10803
10897
  }
@@ -10809,11 +10903,11 @@ class Panel {
10809
10903
  {
10810
10904
  for( let w = 0; w < this.signals.length; w++ )
10811
10905
  {
10812
- let widget = Object.values(this.signals[ w ])[0];
10906
+ let widget = Object.values(this.signals[ w ])[ 0 ];
10813
10907
  let signal = widget.options.signal;
10814
10908
  for( let i = 0; i < LX.signals[signal].length; i++ )
10815
10909
  {
10816
- if( LX.signals[signal][i] == widget )
10910
+ if( LX.signals[signal][ i ] == widget )
10817
10911
  {
10818
10912
  LX.signals[signal] = [...LX.signals[signal].slice(0, i), ...LX.signals[signal].slice(i+1)];
10819
10913
  }
@@ -11866,6 +11960,19 @@ class Panel {
11866
11960
  const widget = new DatePicker( name, dateString, callback, options );
11867
11961
  return this._attachWidget( widget );
11868
11962
  }
11963
+
11964
+ /**
11965
+ * @method addMap2D
11966
+ * @param {String} name Widget name
11967
+ * @param {Array} points
11968
+ * @param {Function} callback
11969
+ * @param {Object} options:
11970
+ */
11971
+
11972
+ addMap2D( name, points, callback, options = { } ) {
11973
+ const widget = new Map2D( name, points, callback, options );
11974
+ return this._attachWidget( widget );
11975
+ }
11869
11976
  }
11870
11977
 
11871
11978
  LX.Panel = Panel;
@@ -12014,7 +12121,7 @@ class Branch {
12014
12121
  this.grabber = grabber;
12015
12122
 
12016
12123
  function getBranchHeight() {
12017
- return that.root.offsetHeight - that.root.children[0].offsetHeight;
12124
+ return that.root.offsetHeight - that.root.children[ 0 ].offsetHeight;
12018
12125
  }
12019
12126
 
12020
12127
  let that = this;
@@ -12474,7 +12581,7 @@ class PocketDialog extends Dialog {
12474
12581
  if( this.size )
12475
12582
  {
12476
12583
  if( !this.minimized ) this.root.style.height = "auto";
12477
- else this.root.style.height = this.size[1];
12584
+ else this.root.style.height = this.size[ 1 ];
12478
12585
  }
12479
12586
 
12480
12587
  this.root.classList.toggle("minimized");
@@ -12493,7 +12600,7 @@ class PocketDialog extends Dialog {
12493
12600
  {
12494
12601
  for( let i = 0; i < float.length; i++ )
12495
12602
  {
12496
- const t = float[i];
12603
+ const t = float[ i ];
12497
12604
  switch( t )
12498
12605
  {
12499
12606
  case 'b':
@@ -12783,7 +12890,7 @@ class ContextMenu {
12783
12890
  return;
12784
12891
  }
12785
12892
 
12786
- if( children.find( c => Object.keys(c)[0] == key ) == null )
12893
+ if( children.find( c => Object.keys(c)[ 0 ] == key ) == null )
12787
12894
  {
12788
12895
  const parent = {};
12789
12896
  parent[ key ] = [];
@@ -12824,7 +12931,7 @@ class ContextMenu {
12824
12931
 
12825
12932
  setColor( token, color ) {
12826
12933
 
12827
- if(color[0] !== '#')
12934
+ if(color[ 0 ] !== '#')
12828
12935
  color = rgbToHex(color);
12829
12936
 
12830
12937
  this.colors[ token ] = color;
@@ -12928,8 +13035,8 @@ class CanvasCurve {
12928
13035
  element.resample = function( samples ) {
12929
13036
 
12930
13037
  let r = [];
12931
- let dx = (element.xrange[1] - element.xrange[ 0 ]) / samples;
12932
- for( let i = element.xrange[0]; i <= element.xrange[1]; i += dx )
13038
+ let dx = (element.xrange[ 1 ] - element.xrange[ 0 ]) / samples;
13039
+ for( let i = element.xrange[ 0 ]; i <= element.xrange[ 1 ]; i += dx )
12933
13040
  {
12934
13041
  r.push( element.getValueAt(i) );
12935
13042
  }
@@ -12940,8 +13047,8 @@ class CanvasCurve {
12940
13047
 
12941
13048
  for( let i = 0; i < element.value; i++ )
12942
13049
  {
12943
- let value = element.value[i];
12944
- if(value[0] < v[0]) continue;
13050
+ let value = element.value[ i ];
13051
+ if(value[ 0 ] < v[ 0 ]) continue;
12945
13052
  element.value.splice(i,0,v);
12946
13053
  redraw();
12947
13054
  return;
@@ -12953,14 +13060,14 @@ class CanvasCurve {
12953
13060
 
12954
13061
  //value to canvas
12955
13062
  function convert(v) {
12956
- return [ canvas.width * ( v[0] - element.xrange[0])/ (element.xrange[1]),
12957
- canvas.height * (v[1] - element.yrange[0])/ (element.yrange[1])];
13063
+ return [ canvas.width * ( v[ 0 ] - element.xrange[ 0 ])/ (element.xrange[ 1 ]),
13064
+ canvas.height * (v[ 1 ] - element.yrange[ 0 ])/ (element.yrange[ 1 ])];
12958
13065
  }
12959
13066
 
12960
13067
  //canvas to value
12961
13068
  function unconvert(v) {
12962
- return [(v[0] * element.xrange[1] / canvas.width + element.xrange[0]),
12963
- (v[1] * element.yrange[1] / canvas.height + element.yrange[0])];
13069
+ return [(v[ 0 ] * element.xrange[ 1 ] / canvas.width + element.xrange[ 0 ]),
13070
+ (v[ 1 ] * element.yrange[ 1 ] / canvas.height + element.yrange[ 0 ])];
12964
13071
  }
12965
13072
 
12966
13073
  let selected = -1;
@@ -13148,7 +13255,7 @@ class CanvasCurve {
13148
13255
  options.callback.call( element, element.value, e );
13149
13256
  }
13150
13257
 
13151
- function distance(a,b) { return Math.sqrt( Math.pow(b[0]-a[0],2) + Math.pow(b[1]-a[1],2) ); };
13258
+ function distance(a,b) { return Math.sqrt( Math.pow(b[ 0 ]-a[ 0 ],2) + Math.pow(b[ 1 ]-a[ 1 ],2) ); };
13152
13259
 
13153
13260
  function computeSelected( x, y ) {
13154
13261
 
@@ -13260,8 +13367,8 @@ class CanvasDial {
13260
13367
  element.resample = function( samples ) {
13261
13368
 
13262
13369
  var r = [];
13263
- var dx = (element.xrange[1] - element.xrange[ 0 ]) / samples;
13264
- for( var i = element.xrange[0]; i <= element.xrange[1]; i += dx)
13370
+ var dx = (element.xrange[ 1 ] - element.xrange[ 0 ]) / samples;
13371
+ for( var i = element.xrange[ 0 ]; i <= element.xrange[ 1 ]; i += dx)
13265
13372
  {
13266
13373
  r.push( element.getValueAt(i) );
13267
13374
  }
@@ -13286,15 +13393,15 @@ class CanvasDial {
13286
13393
  //value to canvas
13287
13394
  function convert(v, r) {
13288
13395
 
13289
- Math.pow(v[0],2)
13290
- return [ canvas.width * ( v[0] - element.xrange[0])/ (element.xrange[1]),
13291
- canvas.height * (v[1] - element.yrange[0])/ (element.yrange[1])];
13396
+ Math.pow(v[ 0 ],2)
13397
+ return [ canvas.width * ( v[ 0 ] - element.xrange[ 0 ])/ (element.xrange[ 1 ]),
13398
+ canvas.height * (v[ 1 ] - element.yrange[ 0 ])/ (element.yrange[ 1 ])];
13292
13399
  }
13293
13400
 
13294
13401
  //canvas to value
13295
13402
  function unconvert(v) {
13296
- return [(v[0] * element.xrange[1] / canvas.width + element.xrange[0]),
13297
- (v[1] * element.yrange[1] / canvas.height + element.yrange[0])];
13403
+ return [(v[ 0 ] * element.xrange[ 1 ] / canvas.width + element.xrange[ 0 ]),
13404
+ (v[ 1 ] * element.yrange[ 1 ] / canvas.height + element.yrange[ 0 ])];
13298
13405
  }
13299
13406
 
13300
13407
  var selected = -1;
@@ -13476,7 +13583,7 @@ class CanvasDial {
13476
13583
  options.callback.call( element, element.value, e );
13477
13584
  }
13478
13585
 
13479
- function distance(a,b) { return Math.sqrt( Math.pow(b[0]-a[0],2) + Math.pow(b[1]-a[1],2) ); };
13586
+ function distance(a,b) { return Math.sqrt( Math.pow(b[ 0 ]-a[ 0 ],2) + Math.pow(b[ 1 ]-a[ 1 ],2) ); };
13480
13587
 
13481
13588
  function computeSelected( x, y ) {
13482
13589
 
@@ -13521,6 +13628,439 @@ class CanvasDial {
13521
13628
 
13522
13629
  LX.Dial = Dial;
13523
13630
 
13631
+ // Based on LGraphMap2D from @tamats (jagenjo)
13632
+ // https://github.com/jagenjo/litescene.js
13633
+ class CanvasMap2D {
13634
+
13635
+ static COLORS = [ [255, 0, 0], [0, 255, 0], [0, 0, 255], [0, 128, 128], [128, 0, 128], [128, 128, 0], [255, 128, 0], [255, 0, 128], [0, 128, 255], [128, 0, 255] ];
13636
+ static GRID_SIZE = 64;
13637
+
13638
+ /**
13639
+ * @constructor Map2D
13640
+ * @param {Array} initialPoints
13641
+ * @param {Function} callback
13642
+ * @param {Object} options
13643
+ * circular
13644
+ * showNames
13645
+ * size
13646
+ */
13647
+
13648
+ constructor( initialPoints, callback, options = {} ) {
13649
+
13650
+ this.circular = options.circular ?? false;
13651
+ this.showNames = options.showNames ?? true;
13652
+ this.size = options.size ?? [ 200, 200 ];
13653
+
13654
+ this.points = initialPoints ?? [];
13655
+ this.callback = callback;
13656
+ this.weights = [];
13657
+ this.weightsObj = {};
13658
+ this.currentPosition = new LX.vec2( 0.5, 0.5 );
13659
+ this.circleCenter = [ 0, 0 ];
13660
+ this.circleRadius = 1;
13661
+ this.margin = 8;
13662
+ this.dragging = false;
13663
+
13664
+ this._valuesChanged = true;
13665
+ this._selectedPoint = null;
13666
+
13667
+ this.root = LX.makeContainer( ["auto", "auto"] );
13668
+ this.root.tabIndex = "1";
13669
+
13670
+ this.root.addEventListener( "mousedown", innerMouseDown );
13671
+
13672
+ const that = this;
13673
+
13674
+ function innerMouseDown( e )
13675
+ {
13676
+ var doc = that.root.ownerDocument;
13677
+ doc.addEventListener("mouseup", innerMouseUp);
13678
+ doc.addEventListener("mousemove", innerMouseMove);
13679
+ e.stopPropagation();
13680
+ e.preventDefault();
13681
+
13682
+ that.dragging = true;
13683
+ return true;
13684
+ }
13685
+
13686
+ function innerMouseMove( e )
13687
+ {
13688
+ if( !that.dragging )
13689
+ {
13690
+ return;
13691
+ }
13692
+
13693
+ const margin = that.margin;
13694
+ const rect = that.root.getBoundingClientRect();
13695
+
13696
+ let pos = new LX.vec2();
13697
+ pos.set( e.x - rect.x - that.size[ 0 ] * 0.5, e.y - rect.y - that.size[ 1 ] * 0.5 );
13698
+ var cpos = that.currentPosition;
13699
+ cpos.set(
13700
+ LX.clamp( pos.x / ( that.size[ 0 ] * 0.5 - margin ), -1, 1 ),
13701
+ LX.clamp( pos.y / ( that.size[ 1 ] * 0.5 - margin ), -1, 1 )
13702
+ );
13703
+
13704
+ if( that.circular )
13705
+ {
13706
+ const center = new LX.vec2( 0, 0 );
13707
+ const dist = cpos.dst( center );
13708
+ if( dist > 1 )
13709
+ {
13710
+ cpos = cpos.nrm();
13711
+ }
13712
+ }
13713
+
13714
+ that.renderToCanvas( that.canvas.getContext( "2d", { willReadFrequently: true } ), that.canvas );
13715
+
13716
+ that.computeWeights( cpos );
13717
+
13718
+ if( that.callback )
13719
+ {
13720
+ that.callback( that.weightsObj, that.weights, cpos );
13721
+ }
13722
+
13723
+ return true;
13724
+ }
13725
+
13726
+ function innerMouseUp( e )
13727
+ {
13728
+ that.dragging = false;
13729
+
13730
+ var doc = that.root.ownerDocument;
13731
+ doc.removeEventListener("mouseup", innerMouseUp);
13732
+ doc.removeEventListener("mousemove", innerMouseMove);
13733
+ }
13734
+
13735
+ this.canvas = document.createElement( "canvas" );
13736
+ this.canvas.width = this.size[ 0 ];
13737
+ this.canvas.height = this.size[ 1 ];
13738
+ this.root.appendChild( this.canvas );
13739
+
13740
+ const ctx = this.canvas.getContext( "2d", { willReadFrequently: true } );
13741
+ this.renderToCanvas( ctx, this.canvas );
13742
+ }
13743
+
13744
+ /**
13745
+ * @method computeWeights
13746
+ * @param {LX.vec2} p
13747
+ * @description Iterate for every cell to see if our point is nearer to the cell than the nearest point of the cell,
13748
+ * If that is the case we increase the weight of the nearest point. At the end we normalize the weights of the points by the number of near points
13749
+ * and that give us the weight for every point
13750
+ */
13751
+
13752
+ computeWeights( p ) {
13753
+
13754
+ if( !this.points.length )
13755
+ {
13756
+ return;
13757
+ }
13758
+
13759
+ let values = this._precomputedWeights;
13760
+ if( !values || this._valuesChanged )
13761
+ {
13762
+ values = this.precomputeWeights();
13763
+ }
13764
+
13765
+ let weights = this.weights;
13766
+ weights.length = this.points.length;
13767
+ for(var i = 0; i < weights.length; ++i)
13768
+ {
13769
+ weights[ i ] = 0;
13770
+ }
13771
+
13772
+ const gridSize = CanvasMap2D.GRID_SIZE;
13773
+
13774
+ let totalInside = 0;
13775
+ let pos2 = new LX.vec2();
13776
+
13777
+ for( var y = 0; y < gridSize; ++y )
13778
+ {
13779
+ for( var x = 0; x < gridSize; ++x )
13780
+ {
13781
+ pos2.set( ( x / gridSize) * 2 - 1, ( y / gridSize ) * 2 - 1 );
13782
+
13783
+ var dataPos = x * 2 + y * gridSize * 2;
13784
+ var pointIdx = values[ dataPos ];
13785
+
13786
+ var isInside = p.dst( pos2 ) < ( values[ dataPos + 1] + 0.001 ); // epsilon
13787
+ if( isInside )
13788
+ {
13789
+ weights[ pointIdx ] += 1;
13790
+ totalInside++;
13791
+ }
13792
+ }
13793
+ }
13794
+
13795
+ for( var i = 0; i < weights.length; ++i )
13796
+ {
13797
+ weights[ i ] /= totalInside;
13798
+ this.weightsObj[ this.points[ i ].name ] = weights[ i ];
13799
+ }
13800
+
13801
+ return weights;
13802
+ }
13803
+
13804
+ /**
13805
+ * @method precomputeWeights
13806
+ * @description Precompute for every cell, which is the closest point of the points set and how far it is from the center of the cell
13807
+ * We store point index and distance in this._precomputedWeights. This is done only when the points set change
13808
+ */
13809
+
13810
+ precomputeWeights() {
13811
+
13812
+ this._valuesChanged = false;
13813
+
13814
+ const numPoints = this.points.length;
13815
+ const gridSize = CanvasMap2D.GRID_SIZE;
13816
+ const totalNums = 2 * gridSize * gridSize;
13817
+
13818
+ let position = new LX.vec2();
13819
+
13820
+ if( !this._precomputedWeights || this._precomputedWeights.length != totalNums )
13821
+ {
13822
+ this._precomputedWeights = new Float32Array( totalNums );
13823
+ }
13824
+
13825
+ let values = this._precomputedWeights;
13826
+ this._precomputedWeightsGridSize = gridSize;
13827
+
13828
+ for( let y = 0; y < gridSize; ++y )
13829
+ {
13830
+ for( let x = 0; x < gridSize; ++x )
13831
+ {
13832
+ let nearest = -1;
13833
+ let minDistance = 100000;
13834
+
13835
+ for( let i = 0; i < numPoints; ++i )
13836
+ {
13837
+ position.set( ( x / gridSize ) * 2 - 1, ( y / gridSize ) * 2 - 1 );
13838
+
13839
+ let pointPosition = new LX.vec2();
13840
+ pointPosition.fromArray( this.points[ i ].pos );
13841
+ let dist = position.dst( pointPosition );
13842
+ if( dist > minDistance )
13843
+ {
13844
+ continue;
13845
+ }
13846
+
13847
+ nearest = i;
13848
+ minDistance = dist;
13849
+ }
13850
+
13851
+ values[ x * 2 + y * 2 * gridSize ] = nearest;
13852
+ values[ x * 2 + y * 2 * gridSize + 1 ] = minDistance;
13853
+ }
13854
+ }
13855
+
13856
+ return values;
13857
+ }
13858
+
13859
+ /**
13860
+ * @method precomputeWeightsToImage
13861
+ * @param {LX.vec2} p
13862
+ */
13863
+
13864
+ precomputeWeightsToImage( p ) {
13865
+
13866
+ if( !this.points.length )
13867
+ {
13868
+ return null;
13869
+ }
13870
+
13871
+ const gridSize = CanvasMap2D.GRID_SIZE;
13872
+ var values = this._precomputedWeights;
13873
+ if( !values || this._valuesChanged || this._precomputedWeightsGridSize != gridSize )
13874
+ {
13875
+ values = this.precomputeWeights();
13876
+ }
13877
+
13878
+ var canvas = this.imageCanvas;
13879
+ if( !canvas )
13880
+ {
13881
+ canvas = this.imageCanvas = document.createElement( "canvas" );
13882
+ }
13883
+
13884
+ canvas.width = canvas.height = gridSize;
13885
+ var ctx = canvas.getContext( "2d", { willReadFrequently: true } );
13886
+
13887
+ var weights = this.weights;
13888
+ weights.length = this.points.length;
13889
+ for (var i = 0; i < weights.length; ++i)
13890
+ {
13891
+ weights[ i ] = 0;
13892
+ }
13893
+
13894
+ let totalInside = 0;
13895
+ let pixels = ctx.getImageData( 0, 0, gridSize, gridSize );
13896
+ let pos2 = new LX.vec2();
13897
+
13898
+ for( var y = 0; y < gridSize; ++y )
13899
+ {
13900
+ for( var x = 0; x < gridSize; ++x )
13901
+ {
13902
+ pos2.set( ( x / gridSize ) * 2 - 1, ( y / gridSize ) * 2 - 1 );
13903
+
13904
+ const pixelPos = x * 4 + y * gridSize * 4;
13905
+ const dataPos = x * 2 + y * gridSize * 2;
13906
+ const pointIdx = values[ dataPos ];
13907
+ const c = CanvasMap2D.COLORS[ pointIdx % CanvasMap2D.COLORS.length ];
13908
+
13909
+ var isInside = p.dst( pos2 ) < ( values[ dataPos + 1 ] + 0.001 );
13910
+ if( isInside )
13911
+ {
13912
+ weights[ pointIdx ] += 1;
13913
+ totalInside++;
13914
+ }
13915
+
13916
+ pixels.data[ pixelPos ] = c[ 0 ] + ( isInside ? 128 : 0 );
13917
+ pixels.data[ pixelPos + 1 ] = c[ 1 ] + ( isInside ? 128 : 0 );
13918
+ pixels.data[ pixelPos + 2 ] = c[ 2 ] + ( isInside ? 128 : 0 );
13919
+ pixels.data[ pixelPos + 3 ] = 255;
13920
+ }
13921
+ }
13922
+
13923
+ for( let i = 0; i < weights.length; ++i )
13924
+ {
13925
+ weights[ i ] /= totalInside;
13926
+ }
13927
+
13928
+ ctx.putImageData( pixels, 0, 0 );
13929
+ return canvas;
13930
+ }
13931
+
13932
+ addPoint( name, pos ) {
13933
+ if( this.findPoint( name ) )
13934
+ {
13935
+ console.warn("CanvasMap2D.addPoint: There is already a point with that name" );
13936
+ return;
13937
+ }
13938
+
13939
+ if( !pos )
13940
+ {
13941
+ pos = [ this.currentPosition[ 0 ], this.currentPosition[ 1 ] ];
13942
+ }
13943
+
13944
+ pos[ 0 ] = LX.clamp( pos[ 0 ], -1, 1 );
13945
+ pos[ 1 ] = LX.clamp( pos[ 1 ], -1, 1 );
13946
+
13947
+ const point = { name, pos };
13948
+ this.points.push( point );
13949
+ this._valuesChanged = true;
13950
+ return point;
13951
+ }
13952
+
13953
+ removePoint( name ) {
13954
+ const removeIdx = this.points.findIndex( (p) => p.name == name );
13955
+ if( removeIdx > -1 )
13956
+ {
13957
+ this.points.splice( removeIdx, 1 );
13958
+ this._valuesChanged = true;
13959
+ }
13960
+ }
13961
+
13962
+ findPoint( name ) {
13963
+ return this.points.find( p => p.name == name );
13964
+ }
13965
+
13966
+ clear() {
13967
+ this.points.length = 0;
13968
+ this._precomputedWeights = null;
13969
+ this._canvas = null;
13970
+ this._selectedPoint = null;
13971
+ }
13972
+
13973
+ renderToCanvas( ctx, canvas ) {
13974
+
13975
+ const margin = this.margin;
13976
+ const w = this.size[ 0 ];
13977
+ const h = this.size[ 1 ];
13978
+
13979
+ ctx.fillStyle = "black";
13980
+ ctx.strokeStyle = "#BBB";
13981
+
13982
+ ctx.clearRect( 0, 0, w, h );
13983
+
13984
+ if( this.circular )
13985
+ {
13986
+ this.circleCenter[ 0 ] = w * 0.5;
13987
+ this.circleCenter[ 1 ] = h * 0.5;
13988
+ this.circleRadius = h * 0.5 - margin;
13989
+
13990
+ ctx.lineWidth = 1;
13991
+ ctx.beginPath();
13992
+ ctx.arc( this.circleCenter[ 0 ], this.circleCenter[ 1 ], this.circleRadius, 0, Math.PI * 2 );
13993
+ ctx.fill();
13994
+ ctx.stroke();
13995
+ ctx.beginPath();
13996
+ ctx.moveTo( this.circleCenter[ 0 ] + 0.5, this.circleCenter[ 1 ] - this.circleRadius );
13997
+ ctx.lineTo( this.circleCenter[ 0 ] + 0.5, this.circleCenter[ 1 ] + this.circleRadius );
13998
+ ctx.moveTo( this.circleCenter[ 0 ] - this.circleRadius, this.circleCenter[ 1 ]);
13999
+ ctx.lineTo( this.circleCenter[ 0 ] + this.circleRadius, this.circleCenter[ 1 ]);
14000
+ ctx.stroke();
14001
+ }
14002
+ else
14003
+ {
14004
+ ctx.fillRect( margin, margin, w - margin * 2, h - margin * 2 );
14005
+ ctx.strokeRect( margin, margin, w - margin * 2, h - margin * 2 );
14006
+ }
14007
+
14008
+ var image = this.precomputeWeightsToImage( this.currentPosition );
14009
+ if( image )
14010
+ {
14011
+ ctx.globalAlpha = 0.5;
14012
+ ctx.imageSmoothingEnabled = false;
14013
+ if( this.circular )
14014
+ {
14015
+ ctx.save();
14016
+ ctx.beginPath();
14017
+ ctx.arc( this.circleCenter[ 0 ], this.circleCenter[ 1 ], this.circleRadius, 0, Math.PI * 2 );
14018
+ ctx.clip();
14019
+ ctx.drawImage( image, this.circleCenter[ 0 ] - this.circleRadius, this.circleCenter[ 1 ] - this.circleRadius, this.circleRadius * 2, this.circleRadius * 2 );
14020
+ ctx.restore();
14021
+ }
14022
+ else
14023
+ {
14024
+ ctx.drawImage( image, margin, margin, w - margin * 2, h - margin * 2 );
14025
+ }
14026
+ ctx.imageSmoothingEnabled = true;
14027
+ ctx.globalAlpha = 1;
14028
+ }
14029
+
14030
+ for( let i = 0; i < this.points.length; ++i )
14031
+ {
14032
+ const point = this.points[ i ];
14033
+ let x = point.pos[ 0 ] * 0.5 + 0.5;
14034
+ let y = point.pos[ 1 ] * 0.5 + 0.5;
14035
+ x = x * ( w - margin * 2 ) + margin;
14036
+ y = y * ( h - margin * 2 ) + margin;
14037
+ x = LX.clamp( x, margin, w - margin );
14038
+ y = LX.clamp( y, margin, h - margin );
14039
+ ctx.fillStyle = ( point == this._selectedPoint ) ? "#CDF" : "#BCD";
14040
+ ctx.beginPath();
14041
+ ctx.arc( x, y, 3, 0, Math.PI * 2 );
14042
+ ctx.fill();
14043
+ if( this.showNames )
14044
+ {
14045
+ ctx.fillText( point.name, x + 5, y + 5 );
14046
+ }
14047
+ }
14048
+
14049
+ ctx.fillStyle = "white";
14050
+ ctx.beginPath();
14051
+ var x = this.currentPosition.x * 0.5 + 0.5;
14052
+ var y = this.currentPosition.y * 0.5 + 0.5;
14053
+ x = x * ( w - margin * 2 ) + margin;
14054
+ y = y * ( h - margin * 2 ) + margin;
14055
+ x = LX.clamp( x, margin, w - margin );
14056
+ y = LX.clamp( y, margin, h - margin );
14057
+ ctx.arc( x, y, 4, 0, Math.PI * 2 );
14058
+ ctx.fill();
14059
+ }
14060
+ }
14061
+
14062
+ LX.CanvasMap2D = CanvasMap2D;
14063
+
13524
14064
  class AssetViewEvent {
13525
14065
 
13526
14066
  static NONE = 0;
@@ -14261,7 +14801,7 @@ class AssetView {
14261
14801
 
14262
14802
  for( let i = 0; i < e.dataTransfer.files.length; ++i )
14263
14803
  {
14264
- const file = e.dataTransfer.files[i];
14804
+ const file = e.dataTransfer.files[ i ];
14265
14805
 
14266
14806
  const result = this.currentData.find( e => e.id === file.name );
14267
14807
  if(result) continue;
@@ -14476,7 +15016,7 @@ Object.assign(LX, {
14476
15016
  if( request.data )
14477
15017
  {
14478
15018
  for( var i in request.data)
14479
- data.append(i,request.data[i]);
15019
+ data.append(i,request.data[ i ]);
14480
15020
  }
14481
15021
 
14482
15022
  xhr.send( data );
@@ -14541,8 +15081,8 @@ Object.assign(LX, {
14541
15081
  var script = document.createElement('script');
14542
15082
  script.num = i;
14543
15083
  script.type = 'text/javascript';
14544
- script.src = url[i] + ( version ? "?version=" + version : "" );
14545
- script.original_src = url[i];
15084
+ script.src = url[ i ] + ( version ? "?version=" + version : "" );
15085
+ script.original_src = url[ i ];
14546
15086
  script.async = false;
14547
15087
  script.onload = function( e ) {
14548
15088
  total--;
@@ -14561,7 +15101,7 @@ Object.assign(LX, {
14561
15101
  script.onerror = function(err) {
14562
15102
  onError(err, this.original_src, this.num );
14563
15103
  }
14564
- document.getElementsByTagName('head')[0].appendChild(script);
15104
+ document.getElementsByTagName('head')[ 0 ].appendChild(script);
14565
15105
  }
14566
15106
  },
14567
15107
 
@@ -14732,13 +15272,13 @@ LX.UTILS = {
14732
15272
  // Draw an open curve, not connected at the ends
14733
15273
  for( var i = 0; i < (n - 4); i += 2 )
14734
15274
  {
14735
- cp = cp.concat(LX.UTILS.getControlPoints(pts[i],pts[i+1],pts[i+2],pts[i+3],pts[i+4],pts[i+5],t));
15275
+ cp = cp.concat(LX.UTILS.getControlPoints(pts[ i ],pts[i+1],pts[i+2],pts[i+3],pts[i+4],pts[i+5],t));
14736
15276
  }
14737
15277
 
14738
15278
  for( var i = 2; i < ( pts.length - 5 ); i += 2 )
14739
15279
  {
14740
15280
  ctx.beginPath();
14741
- ctx.moveTo(pts[i], pts[i+1]);
15281
+ ctx.moveTo(pts[ i ], pts[i+1]);
14742
15282
  ctx.bezierCurveTo(cp[2*i-2],cp[2*i-1],cp[2*i],cp[2*i+1],pts[i+2],pts[i+3]);
14743
15283
  ctx.stroke();
14744
15284
  ctx.closePath();
@@ -14761,7 +15301,7 @@ LX.UTILS = {
14761
15301
  }
14762
15302
  };
14763
15303
 
14764
- LX.ICONS = {
15304
+ const RAW_ICONS = {
14765
15305
  // Internals
14766
15306
  "Clone": [512, 512, [], "regular", "M64 464l224 0c8.8 0 16-7.2 16-16l0-64 48 0 0 64c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 224c0-35.3 28.7-64 64-64l64 0 0 48-64 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16zM224 304l224 0c8.8 0 16-7.2 16-16l0-224c0-8.8-7.2-16-16-16L224 48c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16zm-64-16l0-224c0-35.3 28.7-64 64-64L448 0c35.3 0 64 28.7 64 64l0 224c0 35.3-28.7 64-64 64l-224 0c-35.3 0-64-28.7-64-64z"],
14767
15307
  "IdBadge": [384, 512, [], "regular", "M256 48l0 16c0 17.7-14.3 32-32 32l-64 0c-17.7 0-32-14.3-32-32l0-16L64 48c-8.8 0-16 7.2-16 16l0 384c0 8.8 7.2 16 16 16l256 0c8.8 0 16-7.2 16-16l0-384c0-8.8-7.2-16-16-16l-64 0zM0 64C0 28.7 28.7 0 64 0L320 0c35.3 0 64 28.7 64 64l0 384c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 64zM160 320l64 0c44.2 0 80 35.8 80 80c0 8.8-7.2 16-16 16L96 416c-8.8 0-16-7.2-16-16c0-44.2 35.8-80 80-80zm-32-96a64 64 0 1 1 128 0 64 64 0 1 1 -128 0z"],
@@ -14778,8 +15318,7 @@ LX.ICONS = {
14778
15318
  "ClosedCaptioning": [576, 512, ["CC"], "regular", "M512 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l448 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 32zM200 208c14.2 0 27 6.1 35.8 16c8.8 9.9 24 10.7 33.9 1.9s10.7-24 1.9-33.9c-17.5-19.6-43.1-32-71.5-32c-53 0-96 43-96 96s43 96 96 96c28.4 0 54-12.4 71.5-32c8.8-9.9 8-25-1.9-33.9s-25-8-33.9 1.9c-8.8 9.9-21.6 16-35.8 16c-26.5 0-48-21.5-48-48s21.5-48 48-48zm144 48c0-26.5 21.5-48 48-48c14.2 0 27 6.1 35.8 16c8.8 9.9 24 10.7 33.9 1.9s10.7-24 1.9-33.9c-17.5-19.6-43.1-32-71.5-32c-53 0-96 43-96 96s43 96 96 96c28.4 0 54-12.4 71.5-32c8.8-9.9 8-25-1.9-33.9s-25-8-33.9 1.9c-8.8 9.9-21.6 16-35.8 16c-26.5 0-48-21.5-48-48z"],
14779
15319
  "ChildReaching": [384, 512, [], "solid", "M256 64A64 64 0 1 0 128 64a64 64 0 1 0 128 0zM152.9 169.3c-23.7-8.4-44.5-24.3-58.8-45.8L74.6 94.2C64.8 79.5 45 75.6 30.2 85.4s-18.7 29.7-8.9 44.4L40.9 159c18.1 27.1 42.8 48.4 71.1 62.4L112 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-96 32 0 0 96c0 17.7 14.3 32 32 32s32-14.3 32-32l0-258.4c29.1-14.2 54.4-36.2 72.7-64.2l18.2-27.9c9.6-14.8 5.4-34.6-9.4-44.3s-34.6-5.5-44.3 9.4L291 122.4c-21.8 33.4-58.9 53.6-98.8 53.6c-12.6 0-24.9-2-36.6-5.8c-.9-.3-1.8-.7-2.7-.9z"],
14780
15320
  "HourglassHalf": [384, 512, [], "regular", "M0 24C0 10.7 10.7 0 24 0L360 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-8 0 0 19c0 40.3-16 79-44.5 107.5L225.9 256l81.5 81.5C336 366 352 404.7 352 445l0 19 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24L24 512c-13.3 0-24-10.7-24-24s10.7-24 24-24l8 0 0-19c0-40.3 16-79 44.5-107.5L158.1 256 76.5 174.5C48 146 32 107.3 32 67l0-19-8 0C10.7 48 0 37.3 0 24zM110.5 371.5c-3.9 3.9-7.5 8.1-10.7 12.5l184.4 0c-3.2-4.4-6.8-8.6-10.7-12.5L192 289.9l-81.5 81.5zM284.2 128C297 110.4 304 89 304 67l0-19L80 48l0 19c0 22.1 7 43.4 19.8 61l184.4 0z"],
14781
- "PaperPlane": [512, 512, [], "regular", "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"],
14782
- // "PaperPlane": [512, 512, [], "solid", "M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480l0-83.6c0-4 1.5-7.8 4.2-10.8L331.8 202.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8 17.7 316.6C7.1 311.3 .3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4z"],
15321
+ "PaperPlane": [512, 512, [], "regular", "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"],
14783
15322
  "Axis3DArrows": [24, 24, [], "solid", "m12 2l4 4h-3v7.85l6.53 3.76L21 15.03l1.5 5.47l-5.5 1.46l1.53-2.61L12 15.58l-6.53 3.77L7 21.96L1.5 20.5L3 15.03l1.47 2.58L11 13.85V6H8z"],
14784
15323
  "PersonWalkingDashedLineArrowRight": [640, 512, [], "solid", "M208 96a48 48 0 1 0 0-96 48 48 0 1 0 0 96zM123.7 200.5c1-.4 1.9-.8 2.9-1.2l-16.9 63.5c-5.6 21.1-.1 43.6 14.7 59.7l70.7 77.1 22 88.1c4.3 17.1 21.7 27.6 38.8 23.3s27.6-21.7 23.3-38.8l-23-92.1c-1.9-7.8-5.8-14.9-11.2-20.8l-49.5-54 19.3-65.5 9.6 23c4.4 10.6 12.5 19.3 22.8 24.5l26.7 13.3c15.8 7.9 35 1.5 42.9-14.3s1.5-35-14.3-42.9L281 232.7l-15.3-36.8C248.5 154.8 208.3 128 163.7 128c-22.8 0-45.3 4.8-66.1 14l-8 3.5c-32.9 14.6-58.1 42.4-69.4 76.5l-2.6 7.8c-5.6 16.8 3.5 34.9 20.2 40.5s34.9-3.5 40.5-20.2l2.6-7.8c5.7-17.1 18.3-30.9 34.7-38.2l8-3.5zm-30 135.1L68.7 398 9.4 457.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L116.3 441c4.6-4.6 8.2-10.1 10.6-16.1l14.5-36.2-40.7-44.4c-2.5-2.7-4.8-5.6-7-8.6zM550.6 153.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L530.7 224 384 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l146.7 0-25.4 25.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l80-80c12.5-12.5 12.5-32.8 0-45.3l-80-80zM392 0c-13.3 0-24 10.7-24 24l0 48c0 13.3 10.7 24 24 24s24-10.7 24-24l0-48c0-13.3-10.7-24-24-24zm24 152c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 16c0 13.3 10.7 24 24 24s24-10.7 24-24l0-16zM392 320c-13.3 0-24 10.7-24 24l0 16c0 13.3 10.7 24 24 24s24-10.7 24-24l0-16c0-13.3-10.7-24-24-24zm24 120c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 48c0 13.3 10.7 24 24 24s24-10.7 24-24l0-48z"],
14785
15324
  "PersonWalkingArrowLoopLeft": [640, 512, [], "solid", "M208 96a48 48 0 1 0 0-96 48 48 0 1 0 0 96zM123.7 200.5c1-.4 1.9-.8 2.9-1.2l-16.9 63.5c-5.6 21.1-.1 43.6 14.7 59.7l70.7 77.1 22 88.1c4.3 17.1 21.7 27.6 38.8 23.3s27.6-21.7 23.3-38.8l-23-92.1c-1.9-7.8-5.8-14.9-11.2-20.8l-49.5-54 19.3-65.5 9.6 23c4.4 10.6 12.5 19.3 22.8 24.5l26.7 13.3c15.8 7.9 35 1.5 42.9-14.3s1.5-35-14.3-42.9L281 232.7l-15.3-36.8C248.5 154.8 208.3 128 163.7 128c-22.8 0-45.3 4.8-66.1 14l-8 3.5c-32.9 14.6-58.1 42.4-69.4 76.5l-2.6 7.8c-5.6 16.8 3.5 34.9 20.2 40.5s34.9-3.5 40.5-20.2l2.6-7.8c5.7-17.1 18.3-30.9 34.7-38.2l8-3.5zm-30 135.1L68.7 398 9.4 457.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L116.3 441c4.6-4.6 8.2-10.1 10.6-16.1l14.5-36.2-40.7-44.4c-2.5-2.7-4.8-5.6-7-8.6zm347.7 119c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L461.3 384l18.7 0c88.4 0 160-71.6 160-160s-71.6-160-160-160L352 64c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c53 0 96 43 96 96s-43 96-96 96l-18.7 0 25.4-25.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-80 80c-12.5 12.5-12.5 32.8 0 45.3l80 80z"],
@@ -14799,10 +15338,10 @@ LX.ICONS = {
14799
15338
  "HandLizard": [512, 512, [], "regular", "M72 112c-13.3 0-24 10.7-24 24s10.7 24 24 24l168 0c35.3 0 64 28.7 64 64s-28.7 64-64 64l-104 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l152 0c4.5 0 8.9 1.3 12.7 3.6l64 40c7 4.4 11.3 12.1 11.3 20.4l0 24c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-10.7L281.1 384 136 384c-39.8 0-72-32.2-72-72s32.2-72 72-72l104 0c8.8 0 16-7.2 16-16s-7.2-16-16-16L72 208c-39.8 0-72-32.2-72-72S32.2 64 72 64l209.6 0c46.7 0 90.9 21.5 119.7 58.3l78.4 100.1c20.9 26.7 32.3 59.7 32.3 93.7L512 424c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-107.9c0-23.2-7.8-45.8-22.1-64.1L363.5 151.9c-19.7-25.2-49.9-39.9-81.9-39.9L72 112z"],
14800
15339
  "HandPeace": [512, 512, [], "regular", "M250.8 1.4c-35.2-3.7-66.6 21.8-70.3 57L174 119 156.7 69.6C145 36.3 108.4 18.8 75.1 30.5S24.2 78.8 35.9 112.1L88.7 262.2C73.5 276.7 64 297.3 64 320c0 0 0 0 0 0l0 24c0 92.8 75.2 168 168 168l48 0c92.8 0 168-75.2 168-168l0-72 0-16 0-32c0-35.3-28.7-64-64-64c-7.9 0-15.4 1.4-22.4 4c-10.4-21.3-32.3-36-57.6-36c-.7 0-1.5 0-2.2 0l5.9-56.3c3.7-35.2-21.8-66.6-57-70.3zm-.2 155.4C243.9 166.9 240 179 240 192l0 48c0 .7 0 1.4 0 2c-5.1-1.3-10.5-2-16-2l-7.4 0-5.4-15.3 17-161.3c.9-8.8 8.8-15.2 17.6-14.2s15.2 8.8 14.2 17.6l-9.5 90.1zM111.4 85.6L165.7 240 144 240c-4 0-8 .3-11.9 .9L81.2 96.2c-2.9-8.3 1.5-17.5 9.8-20.4s17.5 1.5 20.4 9.8zM288 192c0-8.8 7.2-16 16-16s16 7.2 16 16l0 32 0 16c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-48zm38.4 108c10.4 21.3 32.3 36 57.6 36c5.5 0 10.9-.7 16-2l0 10c0 66.3-53.7 120-120 120l-48 0c-66.3 0-120-53.7-120-120l0-24s0 0 0 0c0-17.7 14.3-32 32-32l80 0c8.8 0 16 7.2 16 16s-7.2 16-16 16l-40 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l40 0c35.3 0 64-28.7 64-64c0-.7 0-1.4 0-2c5.1 1.3 10.5 2 16 2c7.9 0 15.4-1.4 22.4-4zM400 272c0 8.8-7.2 16-16 16s-16-7.2-16-16l0-32 0-16c0-8.8 7.2-16 16-16s16 7.2 16 16l0 32 0 16z"],
14801
15340
  "CircleNodes": [512, 512, [], "solid", "M418.4 157.9c35.3-8.3 61.6-40 61.6-77.9c0-44.2-35.8-80-80-80c-43.4 0-78.7 34.5-80 77.5L136.2 151.1C121.7 136.8 101.9 128 80 128c-44.2 0-80 35.8-80 80s35.8 80 80 80c12.2 0 23.8-2.7 34.1-7.6L259.7 407.8c-2.4 7.6-3.7 15.8-3.7 24.2c0 44.2 35.8 80 80 80s80-35.8 80-80c0-27.7-14-52.1-35.4-66.4l37.8-207.7zM156.3 232.2c2.2-6.9 3.5-14.2 3.7-21.7l183.8-73.5c3.6 3.5 7.4 6.7 11.6 9.5L317.6 354.1c-5.5 1.3-10.8 3.1-15.8 5.5L156.3 232.2z"],
14802
- "CircleRight": [512, 512, [], "solid", "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 256zM294.6 151.2c-4.2-4.6-10.1-7.2-16.4-7.2C266 144 256 154 256 166.3l0 41.7-96 0c-17.7 0-32 14.3-32 32l0 32c0 17.7 14.3 32 32 32l96 0 0 41.7c0 12.3 10 22.3 22.3 22.3c6.2 0 12.1-2.6 16.4-7.2l84-91c3.5-3.8 5.4-8.7 5.4-13.9s-1.9-10.1-5.4-13.9l-84-91z"],
14803
- "CircleUp": [512, 512, [], "solid", "M256 48a208 208 0 1 1 0 416 208 208 0 1 1 0-416zm0 464A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM151.2 217.4c-4.6 4.2-7.2 10.1-7.2 16.4c0 12.3 10 22.3 22.3 22.3l41.7 0 0 96c0 17.7 14.3 32 32 32l32 0c17.7 0 32-14.3 32-32l0-96 41.7 0c12.3 0 22.3-10 22.3-22.3c0-6.2-2.6-12.1-7.2-16.4l-91-84c-3.8-3.5-8.7-5.4-13.9-5.4s-10.1 1.9-13.9 5.4l-91 84z"],
14804
- "CircleLeft": [512, 512, [], "solid", "M48 256a208 208 0 1 1 416 0A208 208 0 1 1 48 256zm464 0A256 256 0 1 0 0 256a256 256 0 1 0 512 0zM217.4 376.9c4.2 4.5 10.1 7.1 16.3 7.1c12.3 0 22.3-10 22.3-22.3l0-57.7 96 0c17.7 0 32-14.3 32-32l0-32c0-17.7-14.3-32-32-32l-96 0 0-57.7c0-12.3-10-22.3-22.3-22.3c-6.2 0-12.1 2.6-16.3 7.1L117.5 242.2c-3.5 3.8-5.5 8.7-5.5 13.8s2 10.1 5.5 13.8l99.9 107.1z"],
14805
- "CircleDown": [512, 512, [], "solid", "M256 464a208 208 0 1 1 0-416 208 208 0 1 1 0 416zM256 0a256 256 0 1 0 0 512A256 256 0 1 0 256 0zM376.9 294.6c4.5-4.2 7.1-10.1 7.1-16.3c0-12.3-10-22.3-22.3-22.3L304 256l0-96c0-17.7-14.3-32-32-32l-32 0c-17.7 0-32 14.3-32 32l0 96-57.7 0C138 256 128 266 128 278.3c0 6.2 2.6 12.1 7.1 16.3l107.1 99.9c3.8 3.5 8.7 5.5 13.8 5.5s10.1-2 13.8-5.5l107.1-99.9z"],
15341
+ "CircleRight": [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 256zM294.6 151.2c-4.2-4.6-10.1-7.2-16.4-7.2C266 144 256 154 256 166.3l0 41.7-96 0c-17.7 0-32 14.3-32 32l0 32c0 17.7 14.3 32 32 32l96 0 0 41.7c0 12.3 10 22.3 22.3 22.3c6.2 0 12.1-2.6 16.4-7.2l84-91c3.5-3.8 5.4-8.7 5.4-13.9s-1.9-10.1-5.4-13.9l-84-91z"],
15342
+ "CircleUp": [512, 512, [], "regular", "M256 48a208 208 0 1 1 0 416 208 208 0 1 1 0-416zm0 464A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM151.2 217.4c-4.6 4.2-7.2 10.1-7.2 16.4c0 12.3 10 22.3 22.3 22.3l41.7 0 0 96c0 17.7 14.3 32 32 32l32 0c17.7 0 32-14.3 32-32l0-96 41.7 0c12.3 0 22.3-10 22.3-22.3c0-6.2-2.6-12.1-7.2-16.4l-91-84c-3.8-3.5-8.7-5.4-13.9-5.4s-10.1 1.9-13.9 5.4l-91 84z"],
15343
+ "CircleLeft": [512, 512, [], "regular", "M48 256a208 208 0 1 1 416 0A208 208 0 1 1 48 256zm464 0A256 256 0 1 0 0 256a256 256 0 1 0 512 0zM217.4 376.9c4.2 4.5 10.1 7.1 16.3 7.1c12.3 0 22.3-10 22.3-22.3l0-57.7 96 0c17.7 0 32-14.3 32-32l0-32c0-17.7-14.3-32-32-32l-96 0 0-57.7c0-12.3-10-22.3-22.3-22.3c-6.2 0-12.1 2.6-16.3 7.1L117.5 242.2c-3.5 3.8-5.5 8.7-5.5 13.8s2 10.1 5.5 13.8l99.9 107.1z"],
15344
+ "CircleDown": [512, 512, [], "regular", "M256 464a208 208 0 1 1 0-416 208 208 0 1 1 0 416zM256 0a256 256 0 1 0 0 512A256 256 0 1 0 256 0zM376.9 294.6c4.5-4.2 7.1-10.1 7.1-16.3c0-12.3-10-22.3-22.3-22.3L304 256l0-96c0-17.7-14.3-32-32-32l-32 0c-17.7 0-32 14.3-32 32l0 96-57.7 0C138 256 128 266 128 278.3c0 6.2 2.6 12.1 7.1 16.3l107.1 99.9c3.8 3.5 8.7 5.5 13.8 5.5s10.1-2 13.8-5.5l107.1-99.9z"],
14806
15345
  "WindowRestore": [512, 512, [], "solid", "M432 48L208 48c-17.7 0-32 14.3-32 32l0 16-48 0 0-16c0-44.2 35.8-80 80-80L432 0c44.2 0 80 35.8 80 80l0 224c0 44.2-35.8 80-80 80l-16 0 0-48 16 0c17.7 0 32-14.3 32-32l0-224c0-17.7-14.3-32-32-32zM48 448c0 8.8 7.2 16 16 16l256 0c8.8 0 16-7.2 16-16l0-192L48 256l0 192zM64 128l256 0c35.3 0 64 28.7 64 64l0 256c0 35.3-28.7 64-64 64L64 512c-35.3 0-64-28.7-64-64L0 192c0-35.3 28.7-64 64-64z"],
14807
15346
  "WindowMaximize": [512, 512, [], "solid", "M.3 89.5C.1 91.6 0 93.8 0 96L0 224 0 416c0 35.3 28.7 64 64 64l384 0c35.3 0 64-28.7 64-64l0-192 0-128c0-35.3-28.7-64-64-64L64 32c-2.2 0-4.4 .1-6.5 .3c-9.2 .9-17.8 3.8-25.5 8.2C21.8 46.5 13.4 55.1 7.7 65.5c-3.9 7.3-6.5 15.4-7.4 24zM48 224l416 0 0 192c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16l0-192z"],
14808
15347
  "WindowMinimize": [512, 512, [], "solid", "M24 432c-13.3 0-24 10.7-24 24s10.7 24 24 24l464 0c13.3 0 24-10.7 24-24s-10.7-24-24-24L24 432z"],
@@ -14873,7 +15412,6 @@ LX.ICONS = {
14873
15412
  "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"],
14874
15413
  "Play": [384, 512, [], "solid", "M73 39c-14.8-9.1-33.4-9.4-48.5-.9S0 62.6 0 80L0 432c0 17.4 9.4 33.4 24.5 41.9s33.7 8.1 48.5-.9L361 297c14.3-8.7 23-24.2 23-41s-8.7-32.2-23-41L73 39z"],
14875
15414
  "Pause": [320, 512, [], "solid", "M48 64C21.5 64 0 85.5 0 112L0 400c0 26.5 21.5 48 48 48l32 0c26.5 0 48-21.5 48-48l0-288c0-26.5-21.5-48-48-48L48 64zm192 0c-26.5 0-48 21.5-48 48l0 288c0 26.5 21.5 48 48 48l32 0c26.5 0 48-21.5 48-48l0-288c0-26.5-21.5-48-48-48l-32 0z"],
14876
- "PlusCircle": [512, 512, [], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM232 344l0-64-64 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l64 0 0-64c0-13.3 10.7-24 24-24s24 10.7 24 24l0 64 64 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-64 0 0 64c0 13.3-10.7 24-24 24s-24-10.7-24-24z"],
14877
15415
  "LogIn": [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"],
14878
15416
  "LogOut": [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"],
14879
15417
  "MousePointer": [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"],
@@ -14883,29 +15421,48 @@ LX.ICONS = {
14883
15421
  "CircleCheck": [512, 512, ["CheckCircle2"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"],
14884
15422
  "CirclePlay": [512, 512, [], "solid", "M0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zM188.3 147.1c-7.6 4.2-12.3 12.3-12.3 20.9l0 176c0 8.7 4.7 16.7 12.3 20.9s16.8 4.1 24.3-.5l144-88c7.1-4.4 11.5-12.1 11.5-20.5s-4.4-16.1-11.5-20.5l-144-88c-7.4-4.5-16.7-4.7-24.3-.5z"],
14885
15423
  "CirclePause": [512, 512, [], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM224 192l0 128c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-128c0-17.7 14.3-32 32-32s32 14.3 32 32zm128 0l0 128c0 17.7-14.3 32-32 32s-32-14.3-32-32l0-128c0-17.7 14.3-32 32-32s32 14.3 32 32z"],
15424
+ "CirclePlus": [512, 512, ["PlusCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM232 344l0-64-64 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l64 0 0-64c0-13.3 10.7-24 24-24s24 10.7 24 24l0 64 64 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-64 0 0 64c0 13.3-10.7 24-24 24s-24-10.7-24-24z"],
15425
+ "CircleMinus": [512, 512, ["MinusCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM184 232l144 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-144 0c-13.3 0-24-10.7-24-24s10.7-24 24-24z"],
14886
15426
  "CircleStop": [512, 512, [], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM192 160l128 0c17.7 0 32 14.3 32 32l0 128c0 17.7-14.3 32-32 32l-128 0c-17.7 0-32-14.3-32-32l0-128c0-17.7 14.3-32 32-32z"],
14887
15427
  "CircleDot": [512, 512, [], "solid", "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 256zm256-96a96 96 0 1 1 0 192 96 96 0 1 1 0-192z"],
14888
15428
  "CircleHelp": [512, 512, ["HelpCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM169.8 165.3c7.9-22.3 29.1-37.3 52.8-37.3l58.3 0c34.9 0 63.1 28.3 63.1 63.1c0 22.6-12.1 43.5-31.7 54.8L280 264.4c-.2 13-10.9 23.6-24 23.6c-13.3 0-24-10.7-24-24l0-13.5c0-8.6 4.6-16.5 12.1-20.8l44.3-25.4c4.7-2.7 7.6-7.7 7.6-13.1c0-8.4-6.8-15.1-15.1-15.1l-58.3 0c-3.4 0-6.4 2.1-7.5 5.3l-.4 1.2c-4.4 12.5-18.2 19-30.6 14.6s-19-18.2-14.6-30.6l.4-1.2zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"],
15429
+ "CircleArrowUp": [512, 512, ["ArrowUpCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM385 215c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-71-71L280 392c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-214.1-71 71c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9L239 103c9.4-9.4 24.6-9.4 33.9 0L385 215z"],
15430
+ "CircleArrowDown": [512, 512, ["ArrowDownCircle"], "solid", "M256 0a256 256 0 1 0 0 512A256 256 0 1 0 256 0zM127 297c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l71 71L232 120c0-13.3 10.7-24 24-24s24 10.7 24 24l0 214.1 71-71c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L273 409c-9.4 9.4-24.6 9.4-33.9 0L127 297z"],
15431
+ "CircleArrowLeft": [512, 512, ["ArrowLeftCircle"], "solid", "M512 256A256 256 0 1 0 0 256a256 256 0 1 0 512 0zM215 127c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-71 71L392 232c13.3 0 24 10.7 24 24s-10.7 24-24 24l-214.1 0 71 71c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0L103 273c-9.4-9.4-9.4-24.6 0-33.9L215 127z"],
15432
+ "CircleArrowRight": [512, 512, ["ArrowRightCircle"], "solid", "M0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM297 385c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l71-71L120 280c-13.3 0-24-10.7-24-24s10.7-24 24-24l214.1 0-71-71c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0L409 239c9.4 9.4 9.4 24.6 0 33.9L297 385z"],
15433
+ "CircleAlert": [512, 512, ["AlertCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm0-384c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"],
15434
+ "CircleUser": [512, 512, ["UserCircle"], "solid", "M399 384.2C376.9 345.8 335.4 320 288 320l-64 0c-47.4 0-88.9 25.8-111 64.2c35.2 39.2 86.2 63.8 143 63.8s107.8-24.7 143-63.8zM0 256a256 256 0 1 1 512 0A256 256 0 1 1 0 256zm256 16a72 72 0 1 0 0-144 72 72 0 1 0 0 144z"],
15435
+ "CircleChevronRight": [512, 512, ["ChevronRightCircle"], "solid", "M0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM241 377c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l87-87-87-87c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0L345 239c9.4 9.4 9.4 24.6 0 33.9L241 377z"],
15436
+ "CircleChevronDown": [512, 512, ["ChevronDownCircle"], "solid", "M256 0a256 256 0 1 0 0 512A256 256 0 1 0 256 0zM135 241c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l87 87 87-87c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L273 345c-9.4 9.4-24.6 9.4-33.9 0L135 241z"],
15437
+ "CircleChevronUp": [512, 512, ["ChevronUpCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM377 271c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-87-87-87 87c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9L239 167c9.4-9.4 24.6-9.4 33.9 0L377 271z"],
15438
+ "CircleChevronLeft": [512, 512, ["ChevronLeftCircle"], "solid", "M512 256A256 256 0 1 0 0 256a256 256 0 1 0 512 0zM271 135c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-87 87 87 87c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0L167 273c-9.4-9.4-9.4-24.6 0-33.9L271 135z"],
15439
+ "CircleX": [512, 512, ["XCircle"], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM175 175c9.4-9.4 24.6-9.4 33.9 0l47 47 47-47c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-47 47 47 47c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-47-47-47 47c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l47-47-47-47c-9.4-9.4-9.4-24.6 0-33.9z"],
14889
15440
  "Apple": [384, 512, [], "solid", "M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"],
14890
15441
  "Chrome": [512, 512, [], "solid", "M0 256C0 209.4 12.47 165.6 34.27 127.1L144.1 318.3C166 357.5 207.9 384 256 384C270.3 384 283.1 381.7 296.8 377.4L220.5 509.6C95.9 492.3 0 385.3 0 256zM365.1 321.6C377.4 302.4 384 279.1 384 256C384 217.8 367.2 183.5 340.7 160H493.4C505.4 189.6 512 222.1 512 256C512 397.4 397.4 511.1 256 512L365.1 321.6zM477.8 128H256C193.1 128 142.3 172.1 130.5 230.7L54.19 98.47C101 38.53 174 0 256 0C350.8 0 433.5 51.48 477.8 128V128zM168 256C168 207.4 207.4 168 256 168C304.6 168 344 207.4 344 256C344 304.6 304.6 344 256 344C207.4 344 168 304.6 168 256z"],
14891
15442
  "Facebook": [512, 512, [], "solid", "M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z"],
14892
15443
  "Github": [496, 512, [], "solid", "M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"],
14893
15444
  "Youtube": [576, 512, [], "solid", "M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z"],
14894
- // Some Aliases
14895
- "VR": "VrCardboard",
14896
- "Script": "Scroll",
14897
- "Media": "PhotoFilm",
14898
- "CC": "ClosedCaptioning",
14899
- "ASL": "HandsAslInterpreting",
14900
- "HandRock": "HandBackFist",
14901
- "Chain": "Link",
14902
- "ChainBroken": "LinkOff",
14903
- "ChainOff": "LinkOff",
14904
- "Unlink": "LinkOff",
14905
- "HelpCircle": "CircleHelp",
14906
- "CheckCircle2": "CircleCheck"
15445
+ "CircleRight@solid": [512, 512, [], "solid", "M0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zm395.3 11.3l-112 112c-4.6 4.6-11.5 5.9-17.4 3.5s-9.9-8.3-9.9-14.8l0-64-96 0c-17.7 0-32-14.3-32-32l0-32c0-17.7 14.3-32 32-32l96 0 0-64c0-6.5 3.9-12.3 9.9-14.8s12.9-1.1 17.4 3.5l112 112c6.2 6.2 6.2 16.4 0 22.6z"],
15446
+ "CircleUp@solid": [512, 512, [], "solid", "M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm11.3-395.3l112 112c4.6 4.6 5.9 11.5 3.5 17.4s-8.3 9.9-14.8 9.9l-64 0 0 96c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-96-64 0c-6.5 0-12.3-3.9-14.8-9.9s-1.1-12.9 3.5-17.4l112-112c6.2-6.2 16.4-6.2 22.6 0z"],
15447
+ "CircleLeft@solid": [512, 512, [], "solid", "M512 256A256 256 0 1 0 0 256a256 256 0 1 0 512 0zM116.7 244.7l112-112c4.6-4.6 11.5-5.9 17.4-3.5s9.9 8.3 9.9 14.8l0 64 96 0c17.7 0 32 14.3 32 32l0 32c0 17.7-14.3 32-32 32l-96 0 0 64c0 6.5-3.9 12.3-9.9 14.8s-12.9 1.1-17.4-3.5l-112-112c-6.2-6.2-6.2-16.4 0-22.6z"],
15448
+ "CircleDown@solid": [512, 512, [], "solid", "M256 0a256 256 0 1 0 0 512A256 256 0 1 0 256 0zM244.7 395.3l-112-112c-4.6-4.6-5.9-11.5-3.5-17.4s8.3-9.9 14.8-9.9l64 0 0-96c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 96 64 0c6.5 0 12.3 3.9 14.8 9.9s1.1 12.9-3.5 17.4l-112 112c-6.2 6.2-16.4 6.2-22.6 0z"],
15449
+ "PaperPlane@solid": [512, 512, [], "solid", "M498.1 5.6c10.1 7 15.4 19.1 13.5 31.2l-64 416c-1.5 9.7-7.4 18.2-16 23s-18.9 5.4-28 1.6L284 427.7l-68.5 74.1c-8.9 9.7-22.9 12.9-35.2 8.1S160 493.2 160 480l0-83.6c0-4 1.5-7.8 4.2-10.8L331.8 202.8c5.8-6.3 5.6-16-.4-22s-15.7-6.4-22-.7L106 360.8 17.7 316.6C7.1 311.3 .3 300.7 0 288.9s5.9-22.8 16.1-28.7l448-256c10.7-6.1 23.9-5.5 34 1.4z"],
14907
15450
  }
14908
15451
 
15452
+ // Generate Alias icons
15453
+
15454
+ LX.ICONS = (() => {
15455
+ const aliasIcons = {};
15456
+
15457
+ for( let i in RAW_ICONS )
15458
+ {
15459
+ const aliases = RAW_ICONS[ i ][ 2 ];
15460
+ aliases.forEach( a => aliasIcons[ a ] = i );
15461
+ }
15462
+
15463
+ return { ...RAW_ICONS, ...aliasIcons };
15464
+ })();
15465
+
14909
15466
  // Alias for Lucide Icons
14910
15467
  LX.LucideIconAlias = {
14911
15468
  "Stop": "Square",