aleman 1.16.2 → 1.16.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/ChangeLog +17 -1
  2. package/menu/addons/click/click.js +4 -4
  3. package/menu/addons/item-click/item-click.js +4 -1
  4. package/menu/addons/j/j.js +1 -0
  5. package/menu/rules/build-menu/fixture/build-menu-fix.js +2 -2
  6. package/menu/rules/build-menu/fixture/icon-fix.js +2 -2
  7. package/menu/rules/build-menu/fixture/nested-fix.js +2 -2
  8. package/menu/rules/build-menu/index.js +2 -1
  9. package/nemo/README.md +28 -0
  10. package/nemo/addons/click/click.js +37 -0
  11. package/nemo/addons/click/fixture/click-fix.js +8 -0
  12. package/nemo/addons/click/fixture/click.js +8 -0
  13. package/nemo/addons/click/fixture/not-fn.js +8 -0
  14. package/nemo/addons/context-menu.js +50 -0
  15. package/nemo/addons/down/down.js +44 -0
  16. package/nemo/addons/down/fixture/down-fix.js +16 -0
  17. package/nemo/addons/down/fixture/down.js +16 -0
  18. package/nemo/addons/down/fixture/infinite-scroll-fix.js +16 -0
  19. package/nemo/addons/down/fixture/infinite-scroll.js +16 -0
  20. package/nemo/addons/enter/enter.js +30 -0
  21. package/nemo/addons/enter/fixture/enter-fix.js +8 -0
  22. package/nemo/addons/enter/fixture/enter.js +8 -0
  23. package/nemo/addons/escape/escape.js +11 -0
  24. package/nemo/addons/escape/fixture/escape-fix.js +8 -0
  25. package/nemo/addons/escape/fixture/escape.js +8 -0
  26. package/nemo/addons/gg/fixture/gg-fix.js +8 -0
  27. package/nemo/addons/gg/fixture/gg.js +8 -0
  28. package/nemo/addons/gg/fixture/hide.js +8 -0
  29. package/nemo/addons/gg/fixture/submenu-fix.js +17 -0
  30. package/nemo/addons/gg/fixture/submenu.js +18 -0
  31. package/nemo/addons/gg/gg.js +26 -0
  32. package/nemo/addons/index.js +25 -0
  33. package/nemo/addons/item-click/fixture/item-click-fix.js +8 -0
  34. package/nemo/addons/item-click/fixture/item-click.js +8 -0
  35. package/nemo/addons/item-click/fixture/no-click.js +8 -0
  36. package/nemo/addons/item-click/fixture/not-fn.js +8 -0
  37. package/nemo/addons/item-click/fixture/run-fix.js +8 -0
  38. package/nemo/addons/item-click/fixture/run.js +8 -0
  39. package/nemo/addons/item-click/item-click.js +43 -0
  40. package/nemo/addons/j/fixture/infinite-scroll-fix.js +8 -0
  41. package/nemo/addons/j/fixture/infinite-scroll.js +8 -0
  42. package/nemo/addons/j/fixture/j-fix.js +8 -0
  43. package/nemo/addons/j/fixture/j.js +8 -0
  44. package/nemo/addons/j/fixture/m.js +8 -0
  45. package/nemo/addons/j/fixture/submenu-fix.js +8 -0
  46. package/nemo/addons/j/fixture/submenu-infinite-scroll-fix.js +16 -0
  47. package/nemo/addons/j/fixture/submenu-infinite-scroll.js +16 -0
  48. package/nemo/addons/j/fixture/submenu.js +8 -0
  49. package/nemo/addons/j/j.js +10 -0
  50. package/nemo/addons/k/fixture/infinite-scroll-fix.js +8 -0
  51. package/nemo/addons/k/fixture/infinite-scroll.js +8 -0
  52. package/nemo/addons/k/fixture/k-fix.js +8 -0
  53. package/nemo/addons/k/fixture/k.js +8 -0
  54. package/nemo/addons/k/fixture/m.js +8 -0
  55. package/nemo/addons/k/fixture/submenu-fix.js +8 -0
  56. package/nemo/addons/k/fixture/submenu.js +8 -0
  57. package/nemo/addons/k/k.js +34 -0
  58. package/nemo/addons/left.js +11 -0
  59. package/nemo/addons/menu/get-menu-path.js +12 -0
  60. package/nemo/addons/mouse-leave/fixture/mouse-enter-fix.js +8 -0
  61. package/nemo/addons/mouse-leave/fixture/mouse-enter.js +8 -0
  62. package/nemo/addons/mouse-leave/fixture/unselect-all.js +8 -0
  63. package/nemo/addons/mouse-leave/index.js +10 -0
  64. package/nemo/addons/right.js +23 -0
  65. package/nemo/addons/run/index.js +17 -0
  66. package/nemo/addons/set-position/calculate.js +28 -0
  67. package/nemo/addons/set-position/set-position.js +35 -0
  68. package/nemo/addons/shift-g/fixture/hide.js +8 -0
  69. package/nemo/addons/shift-g/fixture/shift-g-fix.js +8 -0
  70. package/nemo/addons/shift-g/fixture/shift-g.js +8 -0
  71. package/nemo/addons/shift-g/shift-g.js +41 -0
  72. package/nemo/addons/submenu/index.js +12 -0
  73. package/nemo/addons/up.js +42 -0
  74. package/nemo/hydrate-menu.js +47 -0
  75. package/nemo/importmap.js +8 -0
  76. package/nemo/menu.css +65 -0
  77. package/nemo/nemo.js +117 -0
  78. package/nemo/rules/build-menu/fixture/build-menu-fix.js +16 -0
  79. package/nemo/rules/build-menu/fixture/build-menu.js +3 -0
  80. package/nemo/rules/build-menu/index.js +101 -0
  81. package/nemo/rules/hide-submenu/fixture/hide-submenu-fix.js +17 -0
  82. package/nemo/rules/hide-submenu/fixture/hide-submenu.js +18 -0
  83. package/nemo/rules/hide-submenu/fixture/no-menu.js +16 -0
  84. package/nemo/rules/hide-submenu/fixture/show-submenu.js +18 -0
  85. package/nemo/rules/hide-submenu/index.js +35 -0
  86. package/nemo/rules/index.js +21 -0
  87. package/nemo/rules/menu/fixture/hide-menu-fix.js +3 -0
  88. package/nemo/rules/menu/fixture/hide-menu.js +3 -0
  89. package/nemo/rules/menu/fixture/no-menu.js +3 -0
  90. package/nemo/rules/menu/fixture/show-menu-fix.js +1 -0
  91. package/nemo/rules/menu/fixture/show-menu.js +1 -0
  92. package/nemo/rules/menu/index.js +40 -0
  93. package/nemo/rules/select/fixture/no-current.js +8 -0
  94. package/nemo/rules/select/fixture/no-data-name.js +4 -0
  95. package/nemo/rules/select/fixture/no-index.js +8 -0
  96. package/nemo/rules/select/fixture/no-next.js +5 -0
  97. package/nemo/rules/select/fixture/no-parent.js +2 -0
  98. package/nemo/rules/select/fixture/select-fix.js +8 -0
  99. package/nemo/rules/select/fixture/select.js +8 -0
  100. package/nemo/rules/select/fixture/submenu-fix.js +17 -0
  101. package/nemo/rules/select/fixture/submenu.js +18 -0
  102. package/nemo/rules/select/fixture/wrong-data-name.js +4 -0
  103. package/nemo/rules/select/index.js +94 -0
  104. package/nemo/rules/set-position/fixture/no-style-fix.js +2 -0
  105. package/nemo/rules/set-position/fixture/no-style.js +2 -0
  106. package/nemo/rules/set-position/fixture/not-menu.js +2 -0
  107. package/nemo/rules/set-position/fixture/same-position.js +2 -0
  108. package/nemo/rules/set-position/fixture/set-position-fix.js +2 -0
  109. package/nemo/rules/set-position/fixture/set-position.js +2 -0
  110. package/nemo/rules/set-position/index.js +76 -0
  111. package/nemo/rules/submenu/fixture/last-selected-fix.js +53 -0
  112. package/nemo/rules/submenu/fixture/last-selected.js +54 -0
  113. package/nemo/rules/submenu/fixture/li.js +3 -0
  114. package/nemo/rules/submenu/fixture/no-submenu-selected.js +17 -0
  115. package/nemo/rules/submenu/fixture/no-submenu.js +54 -0
  116. package/nemo/rules/submenu/fixture/not-menu.js +17 -0
  117. package/nemo/rules/submenu/fixture/submenu-fix.js +53 -0
  118. package/nemo/rules/submenu/fixture/submenu.js +54 -0
  119. package/nemo/rules/submenu/index.js +76 -0
  120. package/nemo/rules/unselect-all/fixture/hide.js +8 -0
  121. package/nemo/rules/unselect-all/fixture/nested-fix.js +17 -0
  122. package/nemo/rules/unselect-all/fixture/nested.js +18 -0
  123. package/nemo/rules/unselect-all/fixture/no-data-name.js +4 -0
  124. package/nemo/rules/unselect-all/fixture/no-parent.js +2 -0
  125. package/nemo/rules/unselect-all/fixture/unselect-all-fix.js +8 -0
  126. package/nemo/rules/unselect-all/fixture/unselect-all.js +8 -0
  127. package/nemo/rules/unselect-all/index.js +51 -0
  128. package/nemo/rules/unselect-all-submenu-items/fixture/show-submenu-fix.js +33 -0
  129. package/nemo/rules/unselect-all-submenu-items/fixture/show-submenu.js +34 -0
  130. package/nemo/rules/unselect-all-submenu-items/fixture/unselect-all-submenu-items-fix.js +33 -0
  131. package/nemo/rules/unselect-all-submenu-items/fixture/unselect-all-submenu-items.js +33 -0
  132. package/nemo/rules/unselect-all-submenu-items/index.js +30 -0
  133. package/nemo/rules/unselect-wrongly-selected/fixture/hide.js +17 -0
  134. package/nemo/rules/unselect-wrongly-selected/fixture/unselect-wrongly-selected-fix.js +17 -0
  135. package/nemo/rules/unselect-wrongly-selected/fixture/unselect-wrongly-selected.js +17 -0
  136. package/nemo/rules/unselect-wrongly-selected/index.js +39 -0
  137. package/nemo/state/parse-state.js +91 -0
  138. package/nemo/state/print-state.js +14 -0
  139. package/nemo/state/state.js +123 -0
  140. package/package.json +4 -2
@@ -0,0 +1,8 @@
1
+ <ul data-name="menu" class="menu menu-hidden">
2
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
3
+ <label data-menu-path="View">View</label>
4
+ </li>
5
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-item-selected">
6
+ <label data-menu-path="Edit">Edit</label>
7
+ </li>
8
+ </ul>;
@@ -0,0 +1,51 @@
1
+ import {operator, types} from 'putout';
2
+
3
+ const {
4
+ hasTagName,
5
+ removeClassName,
6
+ hasDataName,
7
+ containsClassName,
8
+ } = operator;
9
+
10
+ const {isJSXElement} = types;
11
+ const SELECTED = 'menu-item-selected';
12
+
13
+ export const report = () => `Unselect all`;
14
+
15
+ export const fix = (path) => {
16
+ removeClassName(path, SELECTED);
17
+ };
18
+
19
+ export const traverse = ({push, options}) => ({
20
+ JSXElement(path) {
21
+ const {
22
+ index,
23
+ name = 'menu',
24
+ command,
25
+ } = options;
26
+
27
+ if (command === 'hide')
28
+ return;
29
+
30
+ if (index !== -1)
31
+ return;
32
+
33
+ if (!hasTagName(path, 'li'))
34
+ return;
35
+
36
+ if (!isJSXElement(path.parentPath))
37
+ return;
38
+
39
+ if (!hasDataName(path.parentPath, name))
40
+ return;
41
+
42
+ const children = path.parentPath
43
+ .get('children')
44
+ .filter(isJSXElement);
45
+
46
+ for (const child of children) {
47
+ if (containsClassName(child, SELECTED))
48
+ push(child);
49
+ }
50
+ },
51
+ });
@@ -0,0 +1,33 @@
1
+ <ul data-name="menu" class="menu menu-hidden">
2
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
3
+ <label data-menu-path="View">View</label>
4
+ </li>
5
+ <li data-name="menu-item" className="menu-item icon icon-edit">
6
+ <label data-menu-path="New">New</label>
7
+ <ul class="menu menu-hidden">
8
+ <li data-name="menu-item" className="menu-item icon icon-view">
9
+ <label data-menu-path="New.File">File</label>
10
+ </li>
11
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-item-selected">
12
+ <label data-menu-path="New.Directory">Directory</label>
13
+ </li>
14
+ </ul>;
15
+ </li>
16
+ </ul>;
17
+
18
+ <ul data-name="menu" class="menu menu-hidden">
19
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
20
+ <label data-menu-path="View">View</label>
21
+ </li>
22
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-show-submenu">
23
+ <label data-menu-path="New">New</label>
24
+ <ul data-name="menu" class="menu menu-hidden">
25
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
26
+ <label data-menu-path="New.File">File</label>
27
+ </li>
28
+ <li data-name="menu-item" className="menu-item icon icon-edit">
29
+ <label data-menu-path="New.Directory">Directory</label>
30
+ </li>
31
+ </ul>;
32
+ </li>
33
+ </ul>;
@@ -0,0 +1,34 @@
1
+ <ul data-name="menu" class="menu menu-hidden">
2
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
3
+ <label data-menu-path="View">View</label>
4
+ </li>
5
+ <li data-name="menu-item" className="menu-item icon icon-edit">
6
+ <label data-menu-path="New">New</label>
7
+ <ul class="menu menu-hidden">
8
+ <li data-name="menu-item" className="menu-item icon icon-view">
9
+ <label data-menu-path="New.File">File</label>
10
+ </li>
11
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-item-selected">
12
+ <label data-menu-path="New.Directory">Directory</label>
13
+ </li>
14
+ </ul>;
15
+ </li>
16
+ </ul>;
17
+
18
+ <ul data-name="menu" class="menu menu-hidden">
19
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
20
+ <label data-menu-path="View">View</label>
21
+ </li>
22
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-show-submenu">
23
+ <label data-menu-path="New">New</label>
24
+ <ul data-name="menu" class="menu menu-hidden">
25
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
26
+ <label data-menu-path="New.File">File</label>
27
+ </li>
28
+ <li data-name="menu-item" className="menu-item icon icon-edit">
29
+ <label data-menu-path="New.Directory">Directory</label>
30
+ </li>
31
+ </ul>;
32
+ </li>
33
+ </ul>;
34
+
@@ -0,0 +1,33 @@
1
+ <ul data-name="menu" class="menu menu-hidden">
2
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
3
+ <label data-menu-path="View">View</label>
4
+ </li>
5
+ <li data-name="menu-item" className="menu-item icon icon-edit">
6
+ <label data-menu-path="New">New</label>
7
+ <ul class="menu menu-hidden">
8
+ <li data-name="menu-item" className="menu-item icon icon-view">
9
+ <label data-menu-path="New.File">File</label>
10
+ </li>
11
+ <li data-name="menu-item" className="menu-item icon icon-edit">
12
+ <label data-menu-path="New.Directory">Directory</label>
13
+ </li>
14
+ </ul>;
15
+ </li>
16
+ </ul>;
17
+
18
+ <ul data-name="menu" class="menu menu-hidden">
19
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
20
+ <label data-menu-path="View">View</label>
21
+ </li>
22
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-show-submenu">
23
+ <label data-menu-path="New">New</label>
24
+ <ul data-name="menu" class="menu menu-hidden">
25
+ <li data-name="menu-item" className="menu-item icon icon-view">
26
+ <label data-menu-path="New.File">File</label>
27
+ </li>
28
+ <li data-name="menu-item" className="menu-item icon icon-edit">
29
+ <label data-menu-path="New.Directory">Directory</label>
30
+ </li>
31
+ </ul>;
32
+ </li>
33
+ </ul>;
@@ -0,0 +1,33 @@
1
+ <ul data-name="menu" class="menu menu-hidden">
2
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
3
+ <label data-menu-path="View">View</label>
4
+ </li>
5
+ <li data-name="menu-item" className="menu-item icon icon-edit">
6
+ <label data-menu-path="New">New</label>
7
+ <ul class="menu menu-hidden">
8
+ <li data-name="menu-item" className="menu-item icon icon-view">
9
+ <label data-menu-path="New.File">File</label>
10
+ </li>
11
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-item-selected">
12
+ <label data-menu-path="New.Directory">Directory</label>
13
+ </li>
14
+ </ul>;
15
+ </li>
16
+ </ul>;
17
+
18
+ <ul data-name="menu" class="menu menu-hidden">
19
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
20
+ <label data-menu-path="View">View</label>
21
+ </li>
22
+ <li data-name="menu-item" className="menu-item icon icon-edit menu-show-submenu">
23
+ <label data-menu-path="New">New</label>
24
+ <ul data-name="menu" class="menu menu-hidden">
25
+ <li data-name="menu-item" className="menu-item icon icon-view menu-item-selected">
26
+ <label data-menu-path="New.File">File</label>
27
+ </li>
28
+ <li data-name="menu-item" className="menu-item icon icon-edit">
29
+ <label data-menu-path="New.Directory">Directory</label>
30
+ </li>
31
+ </ul>;
32
+ </li>
33
+ </ul>;
@@ -0,0 +1,30 @@
1
+ import {operator, types} from 'putout';
2
+
3
+ const {isJSXElement} = types;
4
+ const {
5
+ hasTagName,
6
+ removeClassName,
7
+ } = operator;
8
+
9
+ export const report = () => `Unselect all submenu items`;
10
+
11
+ export const fix = (path) => {
12
+ removeClassName(path, 'menu-item-selected');
13
+ };
14
+
15
+ export const traverse = ({push, options}) => ({
16
+ JSXElement(path) {
17
+ const {showSubmenu} = options;
18
+
19
+ if (showSubmenu)
20
+ return;
21
+
22
+ if (!hasTagName(path, 'li'))
23
+ return;
24
+
25
+ if (!isJSXElement(path.parentPath.parentPath.parentPath))
26
+ return;
27
+
28
+ push(path);
29
+ },
30
+ });
@@ -0,0 +1,17 @@
1
+ // second selected
2
+ <ul data-name="menu" class="menu menu-hidden">
3
+ <li data-menu-path="Upload" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view menu-item-selected">
4
+ <label data-menu-path="Upload">Upload</label>
5
+ </li>
6
+ <li data-menu-path="New" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit menu-item-selected">
7
+ <label data-menu-path="New">New</label>
8
+ <ul data-name="menu" class="menu menu-hidden">
9
+ <li data-menu-path="New.File" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view menu-item-selected">
10
+ <label data-menu-path="Upload">Upload</label>
11
+ </li>
12
+ <li data-menu-path="Directory" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit">
13
+ <label data-menu-path="New.Directory">New</label>
14
+ </li>
15
+ </ul>
16
+ </li>
17
+ </ul>;
@@ -0,0 +1,17 @@
1
+ // second selected
2
+ <ul data-name="menu" class="menu menu-hidden">
3
+ <li data-menu-path="Upload" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view">
4
+ <label data-menu-path="Upload">Upload</label>
5
+ </li>
6
+ <li data-menu-path="New" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit menu-item-selected">
7
+ <label data-menu-path="New">New</label>
8
+ <ul data-name="menu" class="menu menu-hidden">
9
+ <li data-menu-path="New.File" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view menu-item-selected">
10
+ <label data-menu-path="Upload">Upload</label>
11
+ </li>
12
+ <li data-menu-path="Directory" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit">
13
+ <label data-menu-path="New.Directory">New</label>
14
+ </li>
15
+ </ul>
16
+ </li>
17
+ </ul>;
@@ -0,0 +1,17 @@
1
+ // second selected
2
+ <ul data-name="menu" class="menu menu-hidden">
3
+ <li data-menu-path="Upload" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view menu-item-selected">
4
+ <label data-menu-path="Upload">Upload</label>
5
+ </li>
6
+ <li data-menu-path="New" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit menu-item-selected">
7
+ <label data-menu-path="New">New</label>
8
+ <ul data-name="menu" class="menu menu-hidden">
9
+ <li data-menu-path="New.File" data-name="menu-item" data-menu-index="0" className="menu-item icon icon-view menu-item-selected">
10
+ <label data-menu-path="Upload">Upload</label>
11
+ </li>
12
+ <li data-menu-path="Directory" data-name="menu-item" data-menu-index="1" className="menu-item icon icon-edit">
13
+ <label data-menu-path="New.Directory">New</label>
14
+ </li>
15
+ </ul>
16
+ </li>
17
+ </ul>;
@@ -0,0 +1,39 @@
1
+ import {operator} from 'putout';
2
+
3
+ const {
4
+ getAttributeValue,
5
+ hasTagName,
6
+ removeClassName,
7
+ containsClassName,
8
+ } = operator;
9
+
10
+ export const report = () => `Unselect wrongly selected`;
11
+
12
+ export const fix = (path) => {
13
+ removeClassName(path, 'menu-item-selected');
14
+ };
15
+
16
+ export const traverse = ({push, options}) => ({
17
+ JSXElement(path) {
18
+ const {index = 1, command} = options;
19
+
20
+ if (command === 'hide')
21
+ return;
22
+
23
+ if (!hasTagName(path, 'li'))
24
+ return;
25
+
26
+ if (hasTagName(path.parentPath.parentPath, 'li'))
27
+ return;
28
+
29
+ if (!containsClassName(path, 'menu-item-selected'))
30
+ return;
31
+
32
+ const dataMenuIndex = Number(getAttributeValue(path, 'data-menu-index'));
33
+
34
+ if (index === dataMenuIndex)
35
+ return;
36
+
37
+ push(path);
38
+ },
39
+ });
@@ -0,0 +1,91 @@
1
+ const {assign} = Object;
2
+
3
+ export const parseState = (source) => {
4
+ const lines = source.split('\n');
5
+ const items = [];
6
+ const state = {
7
+ index: -1,
8
+ submenuIndex: -1,
9
+ insideSubmenu: false,
10
+ show: true,
11
+ position: {
12
+ x: 0,
13
+ y: 20,
14
+ },
15
+ items,
16
+ };
17
+
18
+ for (let index = 0; index < lines.length; index++) {
19
+ const line = lines[index];
20
+ const {
21
+ mark,
22
+ name,
23
+ hasSubmenu,
24
+ show,
25
+ } = parseLine(line);
26
+
27
+ const selected = mark === '+';
28
+
29
+ if (selected)
30
+ state.index = index;
31
+
32
+ const current = {
33
+ selected,
34
+ name,
35
+ path: name,
36
+ };
37
+
38
+ if (hasSubmenu) {
39
+ assign(current, {
40
+ submenu: {
41
+ show,
42
+ items: [],
43
+ },
44
+ });
45
+
46
+ for (; index < lines.length; index++) {
47
+ const line = lines[index];
48
+ const {mark, name: submenuName} = parseLine(line);
49
+
50
+ const selected = mark === '+';
51
+
52
+ if (selected)
53
+ state.index = index;
54
+
55
+ current.submenu.items.push({
56
+ selected,
57
+ name,
58
+ path: `${name}.${submenuName}`,
59
+ });
60
+ }
61
+ }
62
+
63
+ items.push(current);
64
+ }
65
+
66
+ return state;
67
+ };
68
+
69
+ function parseLine(line) {
70
+ let hasSubmenu = false;
71
+ let show = false;
72
+
73
+ if (line.endsWith('*')) {
74
+ line = line.slice(0, -1);
75
+ hasSubmenu = true;
76
+ } else if (line.endsWith('>')) {
77
+ line = line.slice(0, -1);
78
+ hasSubmenu = true;
79
+ show = true;
80
+ }
81
+
82
+ const [mark, ...nameChars] = line;
83
+ const name = nameChars.join('');
84
+
85
+ return {
86
+ mark,
87
+ name,
88
+ hasSubmenu,
89
+ show,
90
+ };
91
+ }
@@ -0,0 +1,14 @@
1
+ export const printState = ({items}) => {
2
+ const result = [];
3
+
4
+ for (const {selected, name, submenu} of items) {
5
+ const selectionMark = selected ? '+' : '-';
6
+ const submenuMark = submenu ? submenu.show ? '>' : '*' : '';
7
+
8
+ const current = `${selectionMark}${name}${submenuMark}`;
9
+
10
+ result.push(current);
11
+ }
12
+
13
+ return result.join('\n');
14
+ };
@@ -0,0 +1,123 @@
1
+ const isObject = (a) => a && typeof a === 'object';
2
+ const {entries} = Object;
3
+
4
+ export const createState = ({name = 'menu', menu = {}}) => {
5
+ const items = createMenuItems(menu);
6
+ const result = {
7
+ name,
8
+ infiniteScroll: false,
9
+ index: -1,
10
+ submenuIndex: -1,
11
+ insideSubmenu: false,
12
+ show: true,
13
+ position: {
14
+ x: 0,
15
+ y: 20,
16
+ },
17
+ items,
18
+ };
19
+
20
+ return result;
21
+ };
22
+
23
+ function createMenuItems(menu, path = '') {
24
+ const items = [];
25
+
26
+ for (const [name, submenu] of entries(menu)) {
27
+ const current = {
28
+ name,
29
+ path: !path ? name : `${path}.${name}`,
30
+ selected: false,
31
+ };
32
+
33
+ if (isObject(submenu))
34
+ current.submenu = {
35
+ show: false,
36
+ items: createMenuItems(submenu, name),
37
+ };
38
+
39
+ items.push(current);
40
+ }
41
+
42
+ return items;
43
+ }
44
+
45
+ export const updateState = (command, state, options = {}) => {
46
+ const {count = 1, infiniteScroll = state.infiniteScroll} = options;
47
+
48
+ for (let i = 0; i < count; i++) {
49
+ if (command === 'down') {
50
+ down(state, {
51
+ infiniteScroll,
52
+ });
53
+ continue;
54
+ }
55
+
56
+ if (command === 'up') {
57
+ up(state, {
58
+ infiniteScroll,
59
+ });
60
+ continue;
61
+ }
62
+ }
63
+
64
+ return state;
65
+ };
66
+
67
+ function down(state, {infiniteScroll}) {
68
+ let {index, items} = state;
69
+ const current = items[index];
70
+
71
+ if (index === -1) {
72
+ const [first] = items;
73
+ ++index;
74
+ first.selected = true;
75
+ } else if (index < items.length - 1) {
76
+ current.selected = false;
77
+ ++index;
78
+ const next = items[index];
79
+
80
+ next.selected = true;
81
+
82
+ if (next.submenu)
83
+ next.submenu.show = true;
84
+ }
85
+
86
+ if (infiniteScroll && index === items.length - 1) {
87
+ items[index].selected = false;
88
+ index = 0;
89
+ items[index].selected = true;
90
+ }
91
+
92
+ state.index = index;
93
+
94
+ return state;
95
+ }
96
+
97
+ function up(state, {infiniteScroll}) {
98
+ let {index, items} = state;
99
+ const current = items[index];
100
+
101
+ if (index > 0) {
102
+ current.selected = false;
103
+
104
+ if (current.submenu)
105
+ current.submenu.show = false;
106
+
107
+ --index;
108
+ items[index].selected = true;
109
+
110
+ state.index = index;
111
+ return state;
112
+ }
113
+
114
+ if (infiniteScroll) {
115
+ items[index].selected = false;
116
+ index = items.length - 1;
117
+ items[index].selected = true;
118
+
119
+ state.index = index;
120
+ }
121
+
122
+ return state;
123
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aleman",
3
- "version": "1.16.2",
3
+ "version": "1.16.4",
4
4
  "type": "module",
5
5
  "author": "coderaiser <mnemonic.enemy@gmail.com> (https://github.com/coderaiser)",
6
6
  "description": "🐊Putout-based framework for web",
@@ -11,7 +11,8 @@
11
11
  "url": "git+https://github.com/putoutjs/aleman.git"
12
12
  },
13
13
  "exports": {
14
- "./menu": "./menu/menu.js"
14
+ "./menu": "./menu/menu.js",
15
+ "./nemo": "./menu/nemo.js"
15
16
  },
16
17
  "scripts": {
17
18
  "test": "madrun test",
@@ -50,6 +51,7 @@
50
51
  "eslint-plugin-putout": "^28.0.0",
51
52
  "just-kebab-case": "^4.2.0",
52
53
  "madrun": "^11.0.0",
54
+ "montag": "^1.2.1",
53
55
  "nodemon": "^3.0.1",
54
56
  "supertape": "^11.3.0",
55
57
  "try-catch": "^3.0.1"