@dreamcommerce/aurora 2.23.6-1 → 2.23.6-11

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.
@@ -83,8 +83,18 @@ var Content = function Content(_ref) {
83
83
 
84
84
  var _useState5 = React.useState(false),
85
85
  _useState6 = _rollupPluginBabelHelpers.slicedToArray(_useState5, 2),
86
- fitOnBottomOfScrollableParent = _useState6[0],
87
- setFitOnBottomOfScrollableParent = _useState6[1];
86
+ contentShouldAppearOnTop = _useState6[0],
87
+ setContentShouldAppearOnTop = _useState6[1];
88
+
89
+ var _useState7 = React.useState(false),
90
+ _useState8 = _rollupPluginBabelHelpers.slicedToArray(_useState7, 2),
91
+ contentShouldAppearOnBottom = _useState8[0],
92
+ setContentShouldAppearOnBottom = _useState8[1];
93
+
94
+ var _useState9 = React.useState(false),
95
+ _useState10 = _rollupPluginBabelHelpers.slicedToArray(_useState9, 2),
96
+ fitOnBottomOfScrollableParent = _useState10[0],
97
+ setFitOnBottomOfScrollableParent = _useState10[1];
88
98
 
89
99
  var dropdownIdRef = React.useRef("dropdown-".concat(v4['default']()));
90
100
 
@@ -95,15 +105,15 @@ var Content = function Content(_ref) {
95
105
 
96
106
  var dropdown = getDropdown(dropdownIdRef.current);
97
107
 
98
- var _useState7 = React.useState({
108
+ var _useState11 = React.useState({
99
109
  top: '0px',
100
110
  bottom: '0px',
101
111
  left: '0px',
102
112
  zIndex: constants.DROPDOWN_Z_INDEX
103
113
  }),
104
- _useState8 = _rollupPluginBabelHelpers.slicedToArray(_useState7, 2),
105
- styles = _useState8[0],
106
- setStyles = _useState8[1];
114
+ _useState12 = _rollupPluginBabelHelpers.slicedToArray(_useState11, 2),
115
+ styles = _useState12[0],
116
+ setStyles = _useState12[1];
107
117
 
108
118
  var windowYScroll = window.scrollY;
109
119
  var windowHeightMinusYOffset = window.innerHeight - windowYScroll;
@@ -143,8 +153,6 @@ var Content = function Content(_ref) {
143
153
 
144
154
  var dropdownIsOutsideTopViewport = checkIfIsOutsideTopViewport();
145
155
  var dropdownIsOutsideBottomViewport = checkIfIsOutsideBottomViewport();
146
- var contentShouldAppearOnTop = (dropdownIsOutsideBottomViewport || verticalPosition === 'top' && !dropdownIsOutsideTopViewport) && !fitOnBottomOfScrollableParent;
147
- var contentShouldAppearOnBottom = dropdownIsOutsideTopViewport || verticalPosition === 'bottom' && !dropdownIsOutsideBottomViewport;
148
156
  var contentClassName = classnames__default['default'](css_classes.jsDropdownContentClass, main_module['default'][css_classes.cssDropdownContent], contentShouldAppearOnTop && "".concat(main_module$1['default'][css_classes.cssDropdownContentOnTop], " ").concat(main_module$2['default'][css_classes.cssDropdownContentOnTop]), contentShouldAppearOnBottom && "".concat(main_module$1['default'][css_classes.cssDropdownContentOnBottom], " ").concat(main_module$2['default'][css_classes.cssDropdownContentOnBottom]), arrowSide === 'right' && main_module['default'][css_classes.cssDropdownArrowHorizontalDirectionRight], contentShouldAppearOnTop && main_module['default'][css_classes.cssDropdownArrowVerticalDirectionBottom], cssClass);
149
157
  var screenWidthName = use_screen_detect.useScreenDetect();
150
158
  var refs = [contentRef];
@@ -248,16 +256,28 @@ var Content = function Content(_ref) {
248
256
  var _contentRef$current;
249
257
 
250
258
  var scrollableParentHeight = scrollableParent === null || scrollableParent === void 0 ? void 0 : scrollableParent.scrollHeight;
251
- var scrollableParentBottomSpace = scrollableParentHeight - wrapperRect.bottom;
259
+ var scrollableParentBottomSpace = scrollableParentHeight - (wrapperRect.bottom - scrollableParent.offsetTop + scrollableParent.scrollTop);
252
260
  var dropdownHeight = contentRef === null || contentRef === void 0 || (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.offsetHeight;
261
+ console.log('----------------------');
262
+ console.log('scrollableParent', scrollableParent);
263
+ console.log('scrollableParentHeight', scrollableParentHeight);
264
+ console.log('scrollableParentBottomSpace', scrollableParentBottomSpace);
265
+ console.log('wrapperRef.current', wrapperRef.current);
266
+ console.log('wrapperRect - bottom', wrapperRect.bottom + scrollableParent.scrollTop);
267
+ console.log('----------------------');
253
268
  if (dropdownHeight) setFitOnBottomOfScrollableParent(scrollableParentBottomSpace > dropdownHeight);
254
269
  });
270
+ setContentShouldAppearOnTop((dropdownIsOutsideBottomViewport || verticalPosition === 'top' && !dropdownIsOutsideTopViewport) && !fitOnBottomOfScrollableParent);
271
+ setContentShouldAppearOnBottom(dropdownIsOutsideTopViewport || verticalPosition === 'bottom' && !dropdownIsOutsideBottomViewport);
255
272
  return function () {
256
273
  scrollableParent.removeEventListener('scroll', handleWindowScroll);
257
274
  scrollableParent.removeEventListener('scroll', setParentScrollTopValue);
258
275
  clearTimeout(checkIfFitInScrollableParent);
259
276
  };
260
277
  }, [isOpen]);
278
+ React.useEffect(function () {
279
+ console.log('fitOnBottomOfScrollableParent', fitOnBottomOfScrollableParent);
280
+ }, [fitOnBottomOfScrollableParent, isOpen]);
261
281
  return /*#__PURE__*/reactDom.createPortal( /*#__PURE__*/React__default['default'].createElement(reactTransitionGroup.TransitionGroup, {
262
282
  component: null
263
283
  }, isOpen === true ? /*#__PURE__*/React__default['default'].createElement(reactTransitionGroup.CSSTransition, {
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oEAAwE;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wDAA4D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,6BAA6B,oEAAwE;AACrG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB,wDAA4D;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
@@ -74,8 +74,18 @@ var Content = function Content(_ref) {
74
74
 
75
75
  var _useState5 = useState(false),
76
76
  _useState6 = _slicedToArray(_useState5, 2),
77
- fitOnBottomOfScrollableParent = _useState6[0],
78
- setFitOnBottomOfScrollableParent = _useState6[1];
77
+ contentShouldAppearOnTop = _useState6[0],
78
+ setContentShouldAppearOnTop = _useState6[1];
79
+
80
+ var _useState7 = useState(false),
81
+ _useState8 = _slicedToArray(_useState7, 2),
82
+ contentShouldAppearOnBottom = _useState8[0],
83
+ setContentShouldAppearOnBottom = _useState8[1];
84
+
85
+ var _useState9 = useState(false),
86
+ _useState10 = _slicedToArray(_useState9, 2),
87
+ fitOnBottomOfScrollableParent = _useState10[0],
88
+ setFitOnBottomOfScrollableParent = _useState10[1];
79
89
 
80
90
  var dropdownIdRef = useRef("dropdown-".concat(v4()));
81
91
 
@@ -86,15 +96,15 @@ var Content = function Content(_ref) {
86
96
 
87
97
  var dropdown = getDropdown(dropdownIdRef.current);
88
98
 
89
- var _useState7 = useState({
99
+ var _useState11 = useState({
90
100
  top: '0px',
91
101
  bottom: '0px',
92
102
  left: '0px',
93
103
  zIndex: DROPDOWN_Z_INDEX
94
104
  }),
95
- _useState8 = _slicedToArray(_useState7, 2),
96
- styles = _useState8[0],
97
- setStyles = _useState8[1];
105
+ _useState12 = _slicedToArray(_useState11, 2),
106
+ styles = _useState12[0],
107
+ setStyles = _useState12[1];
98
108
 
99
109
  var windowYScroll = window.scrollY;
100
110
  var windowHeightMinusYOffset = window.innerHeight - windowYScroll;
@@ -134,8 +144,6 @@ var Content = function Content(_ref) {
134
144
 
135
145
  var dropdownIsOutsideTopViewport = checkIfIsOutsideTopViewport();
136
146
  var dropdownIsOutsideBottomViewport = checkIfIsOutsideBottomViewport();
137
- var contentShouldAppearOnTop = (dropdownIsOutsideBottomViewport || verticalPosition === 'top' && !dropdownIsOutsideTopViewport) && !fitOnBottomOfScrollableParent;
138
- var contentShouldAppearOnBottom = dropdownIsOutsideTopViewport || verticalPosition === 'bottom' && !dropdownIsOutsideBottomViewport;
139
147
  var contentClassName = classnames(jsDropdownContentClass, cssClasses[cssDropdownContent], contentShouldAppearOnTop && "".concat(cssClasses$1[cssDropdownContentOnTop], " ").concat(cssClasses$2[cssDropdownContentOnTop]), contentShouldAppearOnBottom && "".concat(cssClasses$1[cssDropdownContentOnBottom], " ").concat(cssClasses$2[cssDropdownContentOnBottom]), arrowSide === 'right' && cssClasses[cssDropdownArrowHorizontalDirectionRight], contentShouldAppearOnTop && cssClasses[cssDropdownArrowVerticalDirectionBottom], cssClass);
140
148
  var screenWidthName = useScreenDetect();
141
149
  var refs = [contentRef];
@@ -239,16 +247,28 @@ var Content = function Content(_ref) {
239
247
  var _contentRef$current;
240
248
 
241
249
  var scrollableParentHeight = scrollableParent === null || scrollableParent === void 0 ? void 0 : scrollableParent.scrollHeight;
242
- var scrollableParentBottomSpace = scrollableParentHeight - wrapperRect.bottom;
250
+ var scrollableParentBottomSpace = scrollableParentHeight - (wrapperRect.bottom - scrollableParent.offsetTop + scrollableParent.scrollTop);
243
251
  var dropdownHeight = contentRef === null || contentRef === void 0 || (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 ? void 0 : _contentRef$current.offsetHeight;
252
+ console.log('----------------------');
253
+ console.log('scrollableParent', scrollableParent);
254
+ console.log('scrollableParentHeight', scrollableParentHeight);
255
+ console.log('scrollableParentBottomSpace', scrollableParentBottomSpace);
256
+ console.log('wrapperRef.current', wrapperRef.current);
257
+ console.log('wrapperRect - bottom', wrapperRect.bottom + scrollableParent.scrollTop);
258
+ console.log('----------------------');
244
259
  if (dropdownHeight) setFitOnBottomOfScrollableParent(scrollableParentBottomSpace > dropdownHeight);
245
260
  });
261
+ setContentShouldAppearOnTop((dropdownIsOutsideBottomViewport || verticalPosition === 'top' && !dropdownIsOutsideTopViewport) && !fitOnBottomOfScrollableParent);
262
+ setContentShouldAppearOnBottom(dropdownIsOutsideTopViewport || verticalPosition === 'bottom' && !dropdownIsOutsideBottomViewport);
246
263
  return function () {
247
264
  scrollableParent.removeEventListener('scroll', handleWindowScroll);
248
265
  scrollableParent.removeEventListener('scroll', setParentScrollTopValue);
249
266
  clearTimeout(checkIfFitInScrollableParent);
250
267
  };
251
268
  }, [isOpen]);
269
+ useEffect(function () {
270
+ console.log('fitOnBottomOfScrollableParent', fitOnBottomOfScrollableParent);
271
+ }, [fitOnBottomOfScrollableParent, isOpen]);
252
272
  return /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(TransitionGroup, {
253
273
  component: null
254
274
  }, isOpen === true ? /*#__PURE__*/React.createElement(CSSTransition, {
@@ -1 +1 @@
1
- {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA,+BAA+B,oEAAwE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
1
+ {"version":3,"file":null,"sources":[null],"sourcesContent":[null],"names":[],"mappings":"AAAA;AACA,+BAA+B,oEAAwE;AACvG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,wDAA4D;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@dreamcommerce/aurora",
3
3
  "packageManager": "yarn@3.2.0",
4
4
  "sideEffects": false,
5
- "version": "2.23.6-1",
5
+ "version": "2.23.6-11",
6
6
  "description": "aurora",
7
7
  "author": "k0ssak",
8
8
  "license": "MIT",