fotoramajs 4.4.8 → 4.4.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 67d438259c7e801ec727ac663d8daee2d0f9354e
4
- data.tar.gz: e53d3c6fcf173380ccf855b98482fdf2a5cca8f6
3
+ metadata.gz: 2ccddb075349fb4fe8dc3e0a87c7ca0bd2006de5
4
+ data.tar.gz: bfb83706eb867718e09cdc35535908da76afdad5
5
5
  SHA512:
6
- metadata.gz: 5ef51eae85f58f5bb76accdfe7810d2ee5aa502f982934ccd65a1b9befb185af974001bbac8b7d975dc11f89dbf4f4fdb266c169c73ecc1a94567976d1aaa459
7
- data.tar.gz: 736fc744dc6fa65063f0a2ec72c9022de6c56b84b1fa44c7cdd69ac835a1ad105553e8c33862ae2e7c083d57b0ab5680099bf3fe3d0a956b7b0575d53aac17d4
6
+ metadata.gz: 5f926b72d06de9aadd55d8f440a637a3d5d350b360b4f2eb2b9105137c2e8bbd3abe8fa0a95087f47caa4d572e0ba3b31e00f39f3c5699187f6d69e60227c187
7
+ data.tar.gz: 1215b72c076090ca75f845a49c7dbf96cb03b689ea0ac5cbe17a68be51e963c4e75198a03a299dea9ffd0094cf7c88fc0b555359afca89c87f5b6270f0bd1fa1
@@ -1,3 +1,3 @@
1
1
  module Fotoramajs
2
- VERSION = "4.4.8"
2
+ VERSION = "4.4.9"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Fotorama 4.4.8 | http://fotorama.io/license/
2
+ * Fotorama 4.4.9 | http://fotorama.io/license/
3
3
  */
4
4
  (function (window, document, location, $, undefined) {
5
5
  "use strict";
@@ -16,12 +16,12 @@ var _fotoramaClass = 'fotorama',
16
16
  wrapNoShadowsClass = wrapClass + '--no-shadows',
17
17
  wrapPanYClass = wrapClass + '--pan-y',
18
18
  wrapRtlClass = wrapClass + '--rtl',
19
+ wrapOnlyActiveClass = wrapClass + '--only-active',
19
20
 
20
21
  stageClass = _fotoramaClass + '__stage',
21
22
  stageFrameClass = stageClass + '__frame',
22
23
  stageFrameVideoClass = stageFrameClass + '--video',
23
24
  stageShaftClass = stageClass + '__shaft',
24
- stageOnlyActiveClass = stageClass + '--only-active',
25
25
 
26
26
  grabClass = _fotoramaClass + '__grab',
27
27
  pointerClass = _fotoramaClass + '__pointer',
@@ -1269,10 +1269,11 @@ function smartClick ($el, fn, _options) {
1269
1269
  onMove: _options.onMove || noop,
1270
1270
  onTouchEnd: _options.onTouchEnd || noop,
1271
1271
  onEnd: function (result) {
1272
- if (result.moved || _options.tail.checked) return;
1272
+ //console.log('smartClick result.moved', result.moved);
1273
+ if (result.moved) return;
1273
1274
  fn.call(this, startEvent);
1274
1275
  }
1275
- }), _options.tail);
1276
+ }), {noMove: true});
1276
1277
  });
1277
1278
  }
1278
1279
 
@@ -1343,8 +1344,12 @@ function getDirectionSign (forward) {
1343
1344
  }
1344
1345
 
1345
1346
  function slide ($el, options) {
1346
- var elPos = Math.round(options.pos),
1347
- onEndFn = options.onEnd || noop;
1347
+ var elData = $el.data(),
1348
+ elPos = Math.round(options.pos),
1349
+ onEndFn = function () {
1350
+ elData.sliding = false;
1351
+ (options.onEnd || noop)();
1352
+ };
1348
1353
 
1349
1354
  if (typeof options.overPos !== 'undefined' && options.overPos !== options.pos) {
1350
1355
  elPos = options.overPos;
@@ -1357,6 +1362,8 @@ function slide ($el, options) {
1357
1362
  var translate = $.extend(getTranslate(elPos, options._001), options.width && {width: options.width});
1358
1363
  //console.timeEnd('var translate = $.extend');
1359
1364
 
1365
+ elData.sliding = true;
1366
+
1360
1367
  if (CSS3) {
1361
1368
  $el.css($.extend(getDuration(options.time), translate));
1362
1369
  if (options.time > 10) {
@@ -1420,6 +1427,7 @@ function extendEvent (e) {
1420
1427
  var touch = (e.touches || [])[0] || e;
1421
1428
  e._x = touch.pageX;
1422
1429
  e._y = touch.clientY;
1430
+ e._now = $.now();
1423
1431
  }
1424
1432
 
1425
1433
  function touch ($el, options) {
@@ -1431,11 +1439,13 @@ function touch ($el, options) {
1431
1439
  controlTouch,
1432
1440
  touchFLAG,
1433
1441
  targetIsSelectFLAG,
1434
- targetIsLinkFlag;
1442
+ targetIsLinkFlag,
1443
+ tolerance,
1444
+ moved;
1435
1445
 
1436
1446
  function onStart (e) {
1437
1447
  $target = $(e.target);
1438
- tail.checked = targetIsSelectFLAG = targetIsLinkFlag = false;
1448
+ tail.checked = targetIsSelectFLAG = targetIsLinkFlag = moved = false;
1439
1449
 
1440
1450
  if (touchEnabledFLAG
1441
1451
  || tail.flow
@@ -1447,6 +1457,8 @@ function touch ($el, options) {
1447
1457
  touchFLAG = e.type === 'touchstart';
1448
1458
  targetIsLinkFlag = $target.is('a, a *', el);
1449
1459
 
1460
+ tolerance = (tail.noMove || tail.noSwipe) ? 16 : !tail.snap ? 4 : 0;
1461
+
1450
1462
  extendEvent(e);
1451
1463
 
1452
1464
  startEvent = lastEvent = e;
@@ -1488,6 +1500,10 @@ function touch ($el, options) {
1488
1500
  (options.onMove || noop).call(el, e, {touch: touchFLAG});
1489
1501
  }
1490
1502
 
1503
+ if (!moved && Math.sqrt(Math.pow(xDiff, 2) + Math.pow(yDiff, 2)) > tolerance) {
1504
+ moved = true;
1505
+ }
1506
+
1491
1507
  tail.checked = tail.checked || xWin || yWin;
1492
1508
  }
1493
1509
 
@@ -1512,7 +1528,8 @@ function touch ($el, options) {
1512
1528
  preventEventTimeout = setTimeout(function () {
1513
1529
  preventEvent = false;
1514
1530
  }, 1000);
1515
- (options.onEnd || noop).call(el, {moved: tail.checked, $target: $target, control: controlTouch, touch: touchFLAG, startEvent: startEvent, aborted: !e || e.type === 'MSPointerCancel'});
1531
+
1532
+ (options.onEnd || noop).call(el, {moved: moved, $target: $target, control: controlTouch, touch: touchFLAG, startEvent: startEvent, aborted: !e || e.type === 'MSPointerCancel'});
1516
1533
  ////console.timeEnd('touch.js onEnd');
1517
1534
  }
1518
1535
 
@@ -1577,11 +1594,13 @@ function moveOnTouch ($el, options) {
1577
1594
  snap,
1578
1595
  slowFLAG,
1579
1596
  controlFLAG,
1580
- movedFLAG;
1597
+ moved,
1598
+ tracked;
1581
1599
 
1582
1600
  function startTracking (e) {
1601
+ tracked = true;
1583
1602
  startCoo = coo = e._x;
1584
- startTime = $.now();
1603
+ startTime = e._now;
1585
1604
 
1586
1605
  moveTrack = [
1587
1606
  [startTime, startCoo]
@@ -1589,28 +1608,26 @@ function moveOnTouch ($el, options) {
1589
1608
 
1590
1609
  startElPos = moveElPos = tail.noMove ? 0 : stop($el, (options.getPos || noop)(), options._001);
1591
1610
 
1592
- // startTime - endTime < TOUCH_TIMEOUT * 3 && e.preventDefault(); // double tap
1593
-
1594
1611
  (options.onStart || noop).call(el, e);
1595
1612
  }
1596
1613
 
1597
1614
  function onStart (e, result) {
1598
- min = elData.min;
1599
- max = elData.max;
1600
- snap = elData.snap;
1615
+ min = tail.min;
1616
+ max = tail.max;
1617
+ snap = tail.snap;
1601
1618
 
1602
1619
  slowFLAG = e.altKey;
1603
- movedFLAG = false;
1620
+ tracked = moved = false;
1604
1621
 
1605
1622
  controlFLAG = result.control;
1606
1623
 
1607
- if (!controlFLAG) {
1624
+ if (!controlFLAG && !elData.sliding) {
1608
1625
  startTracking(e);
1609
1626
  }
1610
1627
  }
1611
1628
 
1612
1629
  function onMove (e, result) {
1613
- if (controlFLAG) {
1630
+ if (!tracked) {
1614
1631
  controlFLAG = false;
1615
1632
  startTracking(e);
1616
1633
  }
@@ -1618,7 +1635,7 @@ function moveOnTouch ($el, options) {
1618
1635
  if (!tail.noSwipe) {
1619
1636
  coo = e._x;
1620
1637
 
1621
- moveTrack.push([$.now(), coo]);
1638
+ moveTrack.push([e._now, coo]);
1622
1639
 
1623
1640
  moveElPos = startElPos - (startCoo - coo);
1624
1641
 
@@ -1632,8 +1649,8 @@ function moveOnTouch ($el, options) {
1632
1649
 
1633
1650
  if (!tail.noMove) {
1634
1651
  $el.css(getTranslate(moveElPos, options._001));
1635
- if (!movedFLAG) {
1636
- movedFLAG = true;
1652
+ if (!moved) {
1653
+ moved = true;
1637
1654
  // only for mouse
1638
1655
  result.touch || MS_POINTER || $el.addClass(grabbingClass);
1639
1656
  }
@@ -1647,9 +1664,13 @@ function moveOnTouch ($el, options) {
1647
1664
  ////console.time('moveontouch.js onEnd');
1648
1665
  if (controlFLAG) return;
1649
1666
 
1667
+ if (!tracked) {
1668
+ startTracking(result.startEvent);
1669
+ }
1670
+
1650
1671
  result.touch || MS_POINTER || $el.removeClass(grabbingClass);
1651
1672
 
1652
- endTime = new Date().getTime();
1673
+ endTime = $.now();
1653
1674
 
1654
1675
  var _backTimeIdeal = endTime - TOUCH_TIMEOUT,
1655
1676
  _backTime,
@@ -1712,8 +1733,7 @@ function moveOnTouch ($el, options) {
1712
1733
 
1713
1734
  time *= slowFLAG ? 10 : 1;
1714
1735
 
1715
- (options.onEnd || noop).call(el, $.extend(result, {pos: moveElPos, newPos: newPos, overPos: overPos, time: time, moved: longTouchFLAG ? snap : Math.abs(moveElPos - startElPos) > (snap ? 0 : 3)}));
1716
- ////console.timeEnd('moveontouch.js onEnd');
1736
+ (options.onEnd || noop).call(el, $.extend(result, {moved: result.moved || longTouchFLAG && snap, pos: moveElPos, newPos: newPos, overPos: overPos, time: time}));
1717
1737
  }
1718
1738
 
1719
1739
  tail = $.extend(touch(options.$wrap, {
@@ -1721,8 +1741,7 @@ function moveOnTouch ($el, options) {
1721
1741
  onMove: onMove,
1722
1742
  onTouchEnd: options.onTouchEnd,
1723
1743
  onEnd: onEnd,
1724
- select: options.select,
1725
- control: options.control
1744
+ select: options.select
1726
1745
  }), tail);
1727
1746
 
1728
1747
  return tail;
@@ -2129,15 +2148,15 @@ jQuery.Fotorama = function ($fotorama, opts) {
2129
2148
  }
2130
2149
 
2131
2150
  function setStageShaftMinmaxAndSnap () {
2132
- stageShaftData.min = o_loop ? -Infinity : -getPosByIndex(size - 1, measures.w, opts.margin, repositionIndex);
2133
- stageShaftData.max = o_loop ? Infinity : -getPosByIndex(0, measures.w, opts.margin, repositionIndex);
2134
- stageShaftData.snap = measures.w + opts.margin;
2151
+ stageShaftTouchTail.min = o_loop ? -Infinity : -getPosByIndex(size - 1, measures.w, opts.margin, repositionIndex);
2152
+ stageShaftTouchTail.max = o_loop ? Infinity : -getPosByIndex(0, measures.w, opts.margin, repositionIndex);
2153
+ stageShaftTouchTail.snap = measures.w + opts.margin;
2135
2154
  }
2136
2155
 
2137
2156
  function setNavShaftMinmax () {
2138
- navShaftData.min = Math.min(0, measures.W - $navShaft.width());
2139
- navShaftData.max = 0;
2140
- $navShaft.toggleClass(grabClass, !(navShaftTouchTail.noMove = navShaftData.min === navShaftData.max));
2157
+ navShaftTouchTail.min = Math.min(0, measures.W - $navShaft.width());
2158
+ navShaftTouchTail.max = 0;
2159
+ $navShaft.toggleClass(grabClass, !(navShaftTouchTail.noMove = navShaftTouchTail.min === navShaftTouchTail.max));
2141
2160
  }
2142
2161
 
2143
2162
  function eachIndex (indexes, type, fn) {
@@ -2520,10 +2539,10 @@ jQuery.Fotorama = function ($fotorama, opts) {
2520
2539
  function slideNavShaft (options) {
2521
2540
  var $guessNavFrame = data[options.guessIndex][navFrameKey];
2522
2541
  if ($guessNavFrame) {
2523
- var overflowFLAG = navShaftData.min !== navShaftData.max,
2542
+ var overflowFLAG = navShaftTouchTail.min !== navShaftTouchTail.max,
2524
2543
  activeNavFrameBounds = overflowFLAG && getNavFrameBounds(that.activeFrame[navFrameKey]),
2525
2544
  l = overflowFLAG && (options.keep && slideNavShaft.l ? slideNavShaft.l : minMaxLimit((options.coo || measures.w / 2) - getNavFrameBounds($guessNavFrame).c, activeNavFrameBounds.min, activeNavFrameBounds.max)),
2526
- pos = overflowFLAG && minMaxLimit(l, navShaftData.min, navShaftData.max),
2545
+ pos = overflowFLAG && minMaxLimit(l, navShaftTouchTail.min, navShaftTouchTail.max),
2527
2546
  time = options.time * .9;
2528
2547
 
2529
2548
  slide($navShaft, {
@@ -2536,7 +2555,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2536
2555
 
2537
2556
  //if (time) thumbsDraw(pos);
2538
2557
 
2539
- setShadow($nav, findShadowEdge(pos, navShaftData.min, navShaftData.max));
2558
+ setShadow($nav, findShadowEdge(pos, navShaftTouchTail.min, navShaftTouchTail.max));
2540
2559
  slideNavShaft.l = l;
2541
2560
  }
2542
2561
  }
@@ -2736,7 +2755,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2736
2755
  updateTouchTails('go', true);
2737
2756
  ////console.timeEnd('updateTouchTails');
2738
2757
  ////console.time('triggerEvent');
2739
- triggerEvent('show', {
2758
+ options.reset || triggerEvent('show', {
2740
2759
  user: options.user,
2741
2760
  time: time
2742
2761
  });
@@ -2752,7 +2771,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
2752
2771
 
2753
2772
  skipReposition || stageShaftReposition(true);
2754
2773
 
2755
- triggerEvent('showend', {
2774
+ options.reset || triggerEvent('showend', {
2756
2775
  user: options.user
2757
2776
  });
2758
2777
 
@@ -2912,7 +2931,9 @@ jQuery.Fotorama = function ($fotorama, opts) {
2912
2931
  windowHeight = $WINDOW.height() - (o_nav ? $nav.height() : 0);
2913
2932
 
2914
2933
  if (measureIsValid(width)) {
2915
- $wrap.css({width: width, minWidth: measures.minwidth, maxWidth: measures.maxwidth});
2934
+ $wrap
2935
+ .addClass(wrapOnlyActiveClass)
2936
+ .css({width: width, minWidth: measures.minwidth, maxWidth: measures.maxwidth});
2916
2937
 
2917
2938
  width = measures.W = measures.w = $wrap.width();
2918
2939
 
@@ -2937,10 +2958,9 @@ jQuery.Fotorama = function ($fotorama, opts) {
2937
2958
  stageShaftReposition();
2938
2959
 
2939
2960
  $stage
2940
- .addClass(stageOnlyActiveClass)
2941
2961
  .stop()
2942
2962
  .animate({width: width, height: height}, time, function () {
2943
- $stage.removeClass(stageOnlyActiveClass);
2963
+ $wrap.removeClass(wrapOnlyActiveClass);
2944
2964
  });
2945
2965
 
2946
2966
  if (o_nav) {
@@ -3117,9 +3137,9 @@ jQuery.Fotorama = function ($fotorama, opts) {
3117
3137
  }
3118
3138
  ////console.timeEnd('stageShaftTouchTail.onEnd');
3119
3139
  },
3120
- getPos: function () {
3121
- return -getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex);
3122
- },
3140
+ // getPos: function () {
3141
+ // return -getPosByIndex(dirtyIndex, measures.w, opts.margin, repositionIndex);
3142
+ // },
3123
3143
  _001: true,
3124
3144
  timeLow: 1,
3125
3145
  timeHigh: 1,
@@ -3153,7 +3173,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3153
3173
  onEnd: onEnd
3154
3174
  });
3155
3175
  thumbsDraw(result.newPos);
3156
- o_shadows && setShadow($nav, findShadowEdge(result.newPos, navShaftData.min, navShaftData.max));
3176
+ o_shadows && setShadow($nav, findShadowEdge(result.newPos, navShaftTouchTail.min, navShaftTouchTail.max));
3157
3177
  } else {
3158
3178
  onEnd();
3159
3179
  }
@@ -3180,9 +3200,9 @@ jQuery.Fotorama = function ($fotorama, opts) {
3180
3200
  onTouchStart();
3181
3201
  onTouchEnd();
3182
3202
  var newPos = stop($navShaft) + direction * .25;
3183
- $navShaft.css(getTranslate(minMaxLimit(newPos, navShaftData.min, navShaftData.max)));
3184
- o_shadows && setShadow($nav, findShadowEdge(newPos, navShaftData.min, navShaftData.max));
3185
- navWheelTail.prevent = {'<': newPos >= navShaftData.max, '>': newPos <= navShaftData.min};
3203
+ $navShaft.css(getTranslate(minMaxLimit(newPos, navShaftTouchTail.min, navShaftTouchTail.max)));
3204
+ o_shadows && setShadow($nav, findShadowEdge(newPos, navShaftTouchTail.min, navShaftTouchTail.max));
3205
+ navWheelTail.prevent = {'<': newPos >= navShaftTouchTail.max, '>': newPos <= navShaftTouchTail.min};
3186
3206
  clearTimeout(navWheelTail.t);
3187
3207
  navWheelTail.t = setTimeout(function () {
3188
3208
  thumbsDraw(newPos, true)
@@ -3218,8 +3238,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3218
3238
  onTouchStart();
3219
3239
  stageShaftTouchTail.control = true;
3220
3240
  },
3221
- onTouchEnd: onTouchEnd,
3222
- tail: stageShaftTouchTail
3241
+ onTouchEnd: onTouchEnd
3223
3242
  });
3224
3243
 
3225
3244
  function reset () {
@@ -3237,9 +3256,7 @@ jQuery.Fotorama = function ($fotorama, opts) {
3237
3256
  }
3238
3257
 
3239
3258
  if (size) {
3240
- ////console.log('activeIndex', activeIndex);
3241
3259
  if (changeToRtl()) return;
3242
- ////console.log('No changeToRtl, activeIndex is', activeIndex);
3243
3260
 
3244
3261
  if ($videoPlaying) {
3245
3262
  unloadVideo($videoPlaying, true);
@@ -3248,11 +3265,13 @@ jQuery.Fotorama = function ($fotorama, opts) {
3248
3265
  activeIndexes = [];
3249
3266
  detachFrames(STAGE_FRAME_KEY);
3250
3267
 
3251
- that.show({index: activeIndex, time: 0});
3268
+ that.show({index: activeIndex, time: 0, reset: reset.ok});
3252
3269
  that.resize();
3253
3270
  } else {
3254
3271
  that.destroy();
3255
3272
  }
3273
+
3274
+ reset.ok = true;
3256
3275
  }
3257
3276
 
3258
3277
  function changeToRtl () {
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Fotorama 4.4.8 | http://fotorama.io/license/
2
+ * Fotorama 4.4.9 | http://fotorama.io/license/
3
3
  */
4
4
  .fotorama__stage__shaft,
5
5
  .fotorama__stage__frame,
@@ -254,6 +254,7 @@
254
254
  .fotorama__nav {
255
255
  overflow: hidden;
256
256
  position: relative;
257
+ max-width: 100%;
257
258
  }
258
259
 
259
260
  .fotorama__wrap--pan-y {
@@ -330,11 +331,16 @@
330
331
  display: block;
331
332
  }
332
333
 
333
- .fotorama__stage--only-active .fotorama__stage__frame {
334
+ .fotorama__wrap--only-active .fotorama__stage,
335
+ .fotorama__wrap--only-active .fotorama__nav {
336
+ max-width: 99999px !important;
337
+ }
338
+
339
+ .fotorama__wrap--only-active .fotorama__stage__frame {
334
340
  visibility: hidden;
335
341
  }
336
342
 
337
- .fotorama__stage--only-active .fotorama__stage__frame.fotorama__active {
343
+ .fotorama__wrap--only-active .fotorama__stage__frame.fotorama__active {
338
344
  visibility: visible;
339
345
  }
340
346
 
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fotoramajs
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.8
4
+ version: 4.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Polikarpov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-15 00:00:00.000000000 Z
11
+ date: 2013-12-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sprockets
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2'
27
27
  description: Fotorama is a simple, stunning, powerful JavaScript gallery. This is
@@ -32,7 +32,7 @@ executables: []
32
32
  extensions: []
33
33
  extra_rdoc_files: []
34
34
  files:
35
- - .gitignore
35
+ - ".gitignore"
36
36
  - Gemfile
37
37
  - MIT-LICENSE.txt
38
38
  - README.md
@@ -54,19 +54,18 @@ require_paths:
54
54
  - lib
55
55
  required_ruby_version: !ruby/object:Gem::Requirement
56
56
  requirements:
57
- - - '>='
57
+ - - ">="
58
58
  - !ruby/object:Gem::Version
59
59
  version: '0'
60
60
  required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  requirements:
62
- - - '>='
62
+ - - ">="
63
63
  - !ruby/object:Gem::Version
64
64
  version: '0'
65
65
  requirements: []
66
66
  rubyforge_project:
67
- rubygems_version: 2.0.3
67
+ rubygems_version: 2.2.0
68
68
  signing_key:
69
69
  specification_version: 4
70
70
  summary: Fotorama is a simple, stunning, powerful JavaScript gallery.
71
71
  test_files: []
72
- has_rdoc: