@pictogrammers/components 0.3.2 → 0.4.0

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 (294) hide show
  1. package/README.md +11 -12
  2. package/favicon.svg +20 -0
  3. package/index.html +67 -49
  4. package/main.js +2 -0
  5. package/main.js.LICENSE.txt +10 -0
  6. package/package.json +6 -6
  7. package/pg/annoy/README.md +0 -5
  8. package/pg/annoy/__examples__/basic/basic.css +3 -0
  9. package/pg/annoy/__examples__/basic/basic.html +4 -7
  10. package/pg/annoy/__examples__/basic/basic.ts +3 -1
  11. package/pg/annoy/annoy.css +29 -198
  12. package/pg/annoy/annoy.html +5 -56
  13. package/pg/annoy/annoy.ts +4 -25
  14. package/pg/app/README.md +11 -0
  15. package/pg/app/__examples__/basic/basic.css +8 -0
  16. package/pg/app/__examples__/basic/basic.html +15 -0
  17. package/pg/app/__examples__/basic/basic.ts +13 -0
  18. package/pg/app/app.css +108 -0
  19. package/pg/app/app.html +16 -0
  20. package/pg/app/app.ts +45 -0
  21. package/pg/app/index.ts +3 -0
  22. package/pg/avatar/__examples__/basic/basic.ts +5 -3
  23. package/pg/button/README.md +3 -0
  24. package/pg/button/button.css +13 -12
  25. package/pg/button/button.spec.ts +35 -0
  26. package/pg/button/button.ts +17 -12
  27. package/pg/buttonLink/buttonLink.css +3 -2
  28. package/pg/buttonMenu/README.md +54 -0
  29. package/pg/buttonMenu/__examples__/basic/basic.html +6 -0
  30. package/pg/buttonMenu/__examples__/basic/basic.ts +43 -0
  31. package/pg/buttonMenu/buttonMenu.css +12 -0
  32. package/pg/buttonMenu/buttonMenu.html +4 -0
  33. package/pg/buttonMenu/buttonMenu.ts +63 -0
  34. package/pg/buttonMenu/index.ts +3 -0
  35. package/pg/buttonToggle/__examples__/basic/basic.ts +2 -2
  36. package/pg/buttonToggle/__examples__/persist/persist.html +10 -0
  37. package/pg/buttonToggle/__examples__/persist/persist.ts +35 -0
  38. package/pg/cardUser/__examples__/basic/basic.ts +0 -1
  39. package/pg/cardUser/cardUser.css +2 -10
  40. package/pg/cardUser/cardUser.html +0 -5
  41. package/pg/cardUser/cardUser.ts +0 -6
  42. package/pg/database/README.md +1 -1
  43. package/pg/database/__examples__/basic/basic.html +2 -1
  44. package/pg/database/__examples__/basic/basic.ts +3 -3
  45. package/pg/dropdown/dropdown.ts +0 -19
  46. package/pg/grid/__examples__/basic/basic.html +2 -2
  47. package/pg/grid/__examples__/basic/basic.ts +3 -2
  48. package/pg/grid/grid.ts +0 -1
  49. package/pg/icon/README.md +6 -5
  50. package/pg/icon/__examples__/basic/basic.html +2 -2
  51. package/pg/icon/__examples__/basic/basic.ts +1 -1
  52. package/pg/icon/icon.ts +6 -0
  53. package/pg/inputCheckList/__examples__/basic/basic.ts +5 -5
  54. package/pg/inputCheckList/inputCheckList.ts +2 -0
  55. package/pg/inputFileLocal/inputFileLocal.css +3 -2
  56. package/pg/inputPixelEditor/README.md +132 -0
  57. package/pg/inputPixelEditor/__examples__/basic/basic.css +29 -0
  58. package/pg/inputPixelEditor/__examples__/basic/basic.html +63 -0
  59. package/pg/inputPixelEditor/__examples__/basic/basic.ts +200 -0
  60. package/pg/inputPixelEditor/__examples__/basic/openUtils.ts +41 -0
  61. package/pg/inputPixelEditor/__examples__/basic/saveUtil.ts +35 -0
  62. package/pg/inputPixelEditor/index.ts +3 -0
  63. package/pg/inputPixelEditor/inputPixelEditor.css +27 -0
  64. package/pg/inputPixelEditor/inputPixelEditor.html +3 -0
  65. package/pg/inputPixelEditor/inputPixelEditor.ts +839 -0
  66. package/pg/inputPixelEditor/utils/bitmapToMask.ts +202 -0
  67. package/pg/inputPixelEditor/utils/cloneGrid.ts +17 -0
  68. package/pg/inputPixelEditor/utils/constants.ts +1 -0
  69. package/pg/inputPixelEditor/utils/createLayer.ts +8 -0
  70. package/pg/inputPixelEditor/utils/debounce.ts +5 -0
  71. package/pg/inputPixelEditor/utils/diffGrid.ts +26 -0
  72. package/pg/inputPixelEditor/utils/fillGrid.ts +11 -0
  73. package/pg/inputPixelEditor/utils/getEllipseOutlinePixels.ts +105 -0
  74. package/pg/inputPixelEditor/utils/getEllipsePixels.ts +28 -0
  75. package/pg/inputPixelEditor/utils/getGuides.ts +232 -0
  76. package/pg/inputPixelEditor/utils/getLinePixels.ts +18 -0
  77. package/pg/inputPixelEditor/utils/getRectangleOutlinePixels.ts +20 -0
  78. package/pg/inputPixelEditor/utils/getRectanglePixels.ts +15 -0
  79. package/pg/inputPixelEditor/utils/inputMode.ts +8 -0
  80. package/pg/inputPixelEditor/utils/interateGrid.ts +7 -0
  81. package/pg/inputPixelEditor/utils/isEmptyGrid.ts +3 -0
  82. package/pg/inputPixelEditor/utils/maskToBitmap.ts +66 -0
  83. package/pg/inputRange/__examples__/basic/basic.ts +4 -4
  84. package/pg/inputRange/inputRange.ts +6 -4
  85. package/pg/inputSelect/README.md +1 -1
  86. package/pg/inputSelect/__examples__/basic/basic.ts +7 -5
  87. package/pg/inputSelect/inputSelect.css +15 -12
  88. package/pg/inputSelect/inputSelect.html +3 -3
  89. package/pg/inputSelect/inputSelect.ts +33 -30
  90. package/pg/inputText/__examples__/basic/basic.ts +6 -6
  91. package/pg/inputText/inputText.css +1 -0
  92. package/pg/inputUserSelect/README.md +1 -1
  93. package/pg/inputUserSelect/inputUserSelect.ts +1 -1
  94. package/pg/listTag/__examples__/basic/basic.ts +4 -5
  95. package/pg/markdown/README.md +17 -3
  96. package/pg/markdown/__examples__/basic/basic.ts +2 -2
  97. package/pg/markdown/__examples__/basic/constants.ts +1 -1
  98. package/pg/markdown/markdown.css +11 -0
  99. package/pg/menu/README.md +46 -0
  100. package/pg/menu/__examples__/basic/basic.html +6 -0
  101. package/pg/menu/__examples__/basic/basic.ts +46 -0
  102. package/pg/menu/index.ts +3 -0
  103. package/pg/menu/menu.css +19 -0
  104. package/pg/menu/menu.html +1 -0
  105. package/pg/menu/menu.ts +119 -0
  106. package/pg/menuDivider/README.md +7 -0
  107. package/pg/menuDivider/__examples__/basic/basic.html +3 -0
  108. package/pg/menuDivider/__examples__/basic/basic.ts +28 -0
  109. package/pg/menuDivider/index.ts +3 -0
  110. package/pg/menuDivider/menuDivider.css +9 -0
  111. package/pg/menuDivider/menuDivider.html +1 -0
  112. package/pg/menuDivider/menuDivider.ts +22 -0
  113. package/pg/menuIcon/menuIcon.ts +43 -36
  114. package/pg/menuItem/README.md +32 -0
  115. package/pg/menuItem/__examples__/basic/basic.html +26 -0
  116. package/pg/menuItem/__examples__/basic/basic.ts +41 -0
  117. package/pg/menuItem/index.ts +3 -0
  118. package/pg/menuItem/menuItem.css +97 -0
  119. package/pg/menuItem/menuItem.html +1 -0
  120. package/pg/menuItem/menuItem.ts +77 -0
  121. package/pg/menuItemIcon/README.md +32 -0
  122. package/pg/menuItemIcon/__examples__/basic/basic.html +34 -0
  123. package/pg/menuItemIcon/__examples__/basic/basic.ts +55 -0
  124. package/pg/menuItemIcon/index.ts +3 -0
  125. package/pg/menuItemIcon/menuItemIcon.css +106 -0
  126. package/pg/menuItemIcon/menuItemIcon.html +4 -0
  127. package/pg/menuItemIcon/menuItemIcon.ts +156 -0
  128. package/pg/modalAlert/__examples__/basic/basic.ts +1 -1
  129. package/pg/modalAlert/modalAlert.css +1 -4
  130. package/pg/modalAlert/modalAlert.ts +18 -4
  131. package/pg/modification/__examples__/basic/basic.ts +1 -2
  132. package/pg/modification/__examples__/basic/constants.ts +25 -50
  133. package/pg/modification/modification.ts +1 -1
  134. package/pg/overlay/overlay.ts +13 -12
  135. package/pg/overlayContextMenu/README.md +35 -0
  136. package/pg/overlayContextMenu/__examples__/basic/basic.css +23 -0
  137. package/pg/overlayContextMenu/__examples__/basic/basic.html +7 -0
  138. package/pg/overlayContextMenu/__examples__/basic/basic.ts +87 -0
  139. package/pg/overlayContextMenu/index.ts +3 -0
  140. package/pg/overlayContextMenu/overlayContextMenu.css +16 -0
  141. package/pg/overlayContextMenu/overlayContextMenu.html +3 -0
  142. package/pg/overlayContextMenu/overlayContextMenu.ts +98 -0
  143. package/pg/overlayMenu/README.md +33 -0
  144. package/pg/overlayMenu/__examples__/basic/basic.css +3 -0
  145. package/pg/overlayMenu/__examples__/basic/basic.html +5 -0
  146. package/pg/overlayMenu/__examples__/basic/basic.ts +62 -0
  147. package/pg/overlayMenu/index.ts +3 -0
  148. package/pg/overlayMenu/overlayMenu.css +16 -0
  149. package/pg/overlayMenu/overlayMenu.html +3 -0
  150. package/pg/overlayMenu/overlayMenu.ts +67 -0
  151. package/pg/overlaySelectMenu/README.md +33 -0
  152. package/pg/overlaySelectMenu/__examples__/basic/basic.css +3 -0
  153. package/pg/overlaySelectMenu/__examples__/basic/basic.html +5 -0
  154. package/pg/overlaySelectMenu/__examples__/basic/basic.ts +62 -0
  155. package/pg/overlaySelectMenu/index.ts +3 -0
  156. package/pg/overlaySelectMenu/overlaySelectMenu.css +17 -0
  157. package/pg/overlaySelectMenu/overlaySelectMenu.html +3 -0
  158. package/pg/overlaySelectMenu/overlaySelectMenu.ts +96 -0
  159. package/pg/overlaySubMenu/README.md +35 -0
  160. package/pg/overlaySubMenu/index.ts +3 -0
  161. package/pg/overlaySubMenu/overlaySubMenu.css +27 -0
  162. package/pg/overlaySubMenu/overlaySubMenu.html +3 -0
  163. package/pg/overlaySubMenu/overlaySubMenu.ts +103 -0
  164. package/pg/picker/picker.ts +1 -19
  165. package/pg/scroll/__examples__/basic/basic.ts +1 -1
  166. package/pg/search/__examples__/basic/basic.ts +10 -7
  167. package/pg/search/search.css +2 -2
  168. package/pg/shared/models/user.ts +0 -2
  169. package/pg/tab/tab.ts +0 -10
  170. package/pg/tabs/partials/tab.css +42 -0
  171. package/pg/tabs/partials/tab.ts +70 -0
  172. package/pg/tabs/tabs.css +0 -53
  173. package/pg/tabs/tabs.ts +54 -70
  174. package/pg/toast/README.md +35 -6
  175. package/pg/toast/__examples__/basic/basic.html +7 -0
  176. package/pg/toast/__examples__/basic/basic.ts +76 -0
  177. package/pg/toast/toast.css +3 -0
  178. package/pg/toast/toast.ts +20 -4
  179. package/pg/tooltip/addTooltip.ts +3 -1
  180. package/pg/tooltip/tooltip.ts +1 -1
  181. package/pg/tree/README.md +67 -0
  182. package/pg/tree/__examples__/basic/basic.html +10 -0
  183. package/pg/tree/__examples__/basic/basic.ts +162 -0
  184. package/pg/tree/index.ts +3 -0
  185. package/pg/tree/tree.css +28 -0
  186. package/pg/tree/tree.html +1 -0
  187. package/pg/tree/tree.ts +217 -0
  188. package/pg/treeButtonIcon/README.md +39 -0
  189. package/pg/treeButtonIcon/index.ts +3 -0
  190. package/pg/treeButtonIcon/treeButtonIcon.css +18 -0
  191. package/pg/treeButtonIcon/treeButtonIcon.html +3 -0
  192. package/pg/treeButtonIcon/treeButtonIcon.ts +42 -0
  193. package/pg/treeItem/README.md +3 -0
  194. package/pg/treeItem/index.ts +3 -0
  195. package/pg/treeItem/treeItem.css +263 -0
  196. package/pg/treeItem/treeItem.html +16 -0
  197. package/pg/treeItem/treeItem.ts +558 -0
  198. package/pgAnnoy.js +1 -0
  199. package/pgApp.js +1 -0
  200. package/pgAvatar.js +1 -0
  201. package/pgButton.js +1 -0
  202. package/pgButtonGroup.js +1 -0
  203. package/pgButtonLink.js +1 -0
  204. package/pgButtonMenu.js +1 -0
  205. package/pgButtonToggle.js +1 -0
  206. package/pgCard.js +1 -0
  207. package/pgCardUser.js +1 -0
  208. package/pgColor.js +1 -0
  209. package/pgDatabase.js +1 -0
  210. package/pgDropdown.js +1 -0
  211. package/pgGrid.js +1 -0
  212. package/pgHeader.js +1 -0
  213. package/pgIcon.js +1 -0
  214. package/pgInputCheck.js +1 -0
  215. package/pgInputCheckList.js +1 -0
  216. package/pgInputFileLocal.js +1 -0
  217. package/pgInputHexRgb.js +1 -0
  218. package/pgInputPixelEditor.js +1 -0
  219. package/pgInputRange.js +1 -0
  220. package/pgInputSelect.js +1 -0
  221. package/pgInputText.js +1 -0
  222. package/pgInputTextIcon.js +1 -0
  223. package/pgInputUserSelect.js +1 -0
  224. package/pgListTag.js +1 -0
  225. package/pgMarkdown.js +2 -0
  226. package/pgMarkdown.js.LICENSE.txt +10 -0
  227. package/pgMenu.js +1 -0
  228. package/pgMenuDivider.js +1 -0
  229. package/pgMenuIcon.js +1 -0
  230. package/pgMenuItem.js +1 -0
  231. package/pgMenuItemIcon.js +1 -0
  232. package/pgModalAlert.js +1 -0
  233. package/pgModification.js +1 -0
  234. package/pgNav.js +1 -0
  235. package/pgOverlay.js +1 -0
  236. package/pgOverlayContextMenu.js +1 -0
  237. package/pgOverlayMenu.js +1 -0
  238. package/pgOverlaySelectMenu.js +1 -0
  239. package/pgOverlaySubMenu.js +1 -0
  240. package/pgPicker.js +1 -0
  241. package/pgPreview.js +1 -0
  242. package/pgScroll.js +1 -0
  243. package/pgSearch.js +1 -0
  244. package/pgTab.js +1 -0
  245. package/pgTabs.js +1 -0
  246. package/pgToast.js +1 -0
  247. package/pgToasts.js +1 -0
  248. package/pgTooltip.js +1 -0
  249. package/pgTree.js +1 -0
  250. package/pgTreeButtonIcon.js +1 -0
  251. package/pgTreeItem.js +1 -0
  252. package/theme-ui3.css +31 -0
  253. package/@types/css.d.ts +0 -4
  254. package/@types/html.d.ts +0 -4
  255. package/dist/main.js +0 -3819
  256. package/dist/pgAnnoy.js +0 -116
  257. package/dist/pgAvatar.js +0 -136
  258. package/dist/pgButton.js +0 -116
  259. package/dist/pgButtonGroup.js +0 -116
  260. package/dist/pgButtonLink.js +0 -116
  261. package/dist/pgButtonToggle.js +0 -146
  262. package/dist/pgCard.js +0 -116
  263. package/dist/pgCardUser.js +0 -196
  264. package/dist/pgColor.js +0 -136
  265. package/dist/pgDatabase.js +0 -236
  266. package/dist/pgDropdown.js +0 -686
  267. package/dist/pgGrid.js +0 -126
  268. package/dist/pgHeader.js +0 -116
  269. package/dist/pgIcon.js +0 -116
  270. package/dist/pgInputCheck.js +0 -116
  271. package/dist/pgInputCheckList.js +0 -126
  272. package/dist/pgInputFileLocal.js +0 -116
  273. package/dist/pgInputHexRgb.js +0 -126
  274. package/dist/pgInputRange.js +0 -116
  275. package/dist/pgInputSelect.js +0 -116
  276. package/dist/pgInputText.js +0 -116
  277. package/dist/pgInputTextIcon.js +0 -176
  278. package/dist/pgInputUserSelect.js +0 -116
  279. package/dist/pgListTag.js +0 -136
  280. package/dist/pgMarkdown.js +0 -346
  281. package/dist/pgMenuIcon.js +0 -206
  282. package/dist/pgModalAlert.js +0 -126
  283. package/dist/pgModification.js +0 -396
  284. package/dist/pgNav.js +0 -116
  285. package/dist/pgOverlay.js +0 -96
  286. package/dist/pgPicker.js +0 -116
  287. package/dist/pgPreview.js +0 -116
  288. package/dist/pgScroll.js +0 -266
  289. package/dist/pgSearch.js +0 -146
  290. package/dist/pgTab.js +0 -116
  291. package/dist/pgTabs.js +0 -136
  292. package/dist/pgToast.js +0 -136
  293. package/dist/pgToasts.js +0 -136
  294. package/dist/pgTooltip.js +0 -126
@@ -0,0 +1,70 @@
1
+ import { Component, Prop, Part, node, forEach } from '@pictogrammers/element';
2
+
3
+ import template from './tab.html';
4
+ import style from './tab.css';
5
+
6
+ @Component({
7
+ selector: 'pg-partial-tab',
8
+ template,
9
+ style
10
+ })
11
+ export default class PgPartialTab extends HTMLElement {
12
+
13
+ @Prop() index: number;
14
+ @Prop() label: string = '';
15
+ @Prop() selected: boolean = false;
16
+
17
+ @Part() $tab: HTMLLIElement;
18
+ @Part() $button: HTMLButtonElement;
19
+
20
+ connectedCallback() {
21
+ this.$button.addEventListener('click', this.#handleClick.bind(this));
22
+ this.$button.addEventListener('keydown', this.#handleKeyDown.bind(this));
23
+ }
24
+
25
+ render(changes) {
26
+ if (changes.label) {
27
+ this.$button.textContent = this.label;
28
+ }
29
+ if (changes.selected) {
30
+ this.$button.classList.toggle('selected', this.selected);
31
+ }
32
+ }
33
+
34
+ #handleClick() {
35
+ const selectEvent = new CustomEvent('select', {
36
+ detail: {
37
+ index: this.index
38
+ }
39
+ });
40
+ this.dispatchEvent(selectEvent);
41
+ }
42
+
43
+ #handleKeyDown(e: KeyboardEvent) {
44
+ switch(e.key) {
45
+ case 'ArrowLeft':
46
+ const arrowLeftEvent = new CustomEvent('arrowleft', {
47
+ detail: {
48
+ index: this.index
49
+ }
50
+ });
51
+ this.dispatchEvent(arrowLeftEvent);
52
+ e.preventDefault();
53
+ break;
54
+ case 'ArrowRight':
55
+ const arrowRightEvent = new CustomEvent('arrowright', {
56
+ detail: {
57
+ index: this.index
58
+ }
59
+ });
60
+ this.dispatchEvent(arrowRightEvent);
61
+ e.preventDefault();
62
+ break;
63
+ }
64
+ }
65
+
66
+ focus() {
67
+ this.$button.focus();
68
+ }
69
+
70
+ }
package/pg/tabs/tabs.css CHANGED
@@ -14,56 +14,3 @@
14
14
  [part="tab"] {
15
15
  margin-right: 0.25rem;
16
16
  }
17
-
18
- [part="button"] {
19
- position: relative;
20
- display: flex;
21
- line-height: calc(2.5rem - 0.5px);
22
- border-top: 1px solid transparent;
23
- border-right: 1px solid transparent;
24
- border-bottom: 0;
25
- border-left: 1px solid transparent;
26
- border-radius: 0.25rem 0.25rem 0 0;
27
- padding: 0 0.75rem;
28
- text-decoration: none;
29
- color: var(--pg-tab-border, #453C4F);
30
- align-items: center;
31
- align-content: center;
32
- box-sizing: border-box;
33
- outline: none;
34
- background: transparent;
35
- }
36
-
37
- [part="tab"].active [part="button"] {
38
- border-color: var(--pg-tab-border, #453C4F);
39
- font-weight: bold;
40
- background: #fff;
41
- cursor: default;
42
- height: calc(2.5rem + 0.5px);
43
- }
44
-
45
- [part="button"]:not(.active):hover {
46
- border-color: var(--pg-tab-border, #453C4F);
47
- }
48
-
49
- [part="button"]:active::before {
50
- content: '';
51
- position: absolute;
52
- top: -1px;
53
- right: -1px;
54
- bottom: 0;
55
- left: -1px;
56
- border-radius: 0.25rem 0.25rem 0 0;
57
- box-shadow: 0 0 0 3px var(--pg-search-focus-glow, rgb(79, 143, 249, 0.6));
58
- }
59
-
60
- [part="button"]:focus::before {
61
- content: '';
62
- position: absolute;
63
- top: -1px;
64
- right: -1px;
65
- bottom: 0;
66
- left: -1px;
67
- border-radius: 0.25rem 0.25rem 0 0;
68
- box-shadow: 0 0 0 3px var(--pg-search-focus-glow, rgb(79, 143, 249, 0.5));
69
- }
package/pg/tabs/tabs.ts CHANGED
@@ -1,10 +1,9 @@
1
- import { Component, Prop, Part, node } from '@pictogrammers/element';
2
- import { list, item } from '../shared/list';
1
+ import { Component, Prop, Part, node, forEach } from '@pictogrammers/element';
3
2
  import PgTab from '../tab/tab';
4
3
 
5
4
  import template from './tabs.html';
6
5
  import style from './tabs.css';
7
- import partialTab from './partials/tab.html';
6
+ import PgPartialTab from './partials/tab';
8
7
 
9
8
  @Component({
10
9
  selector: 'pg-tabs',
@@ -13,90 +12,75 @@ import partialTab from './partials/tab.html';
13
12
  })
14
13
  export default class PgTabs extends HTMLElement {
15
14
 
16
- @Part() $tabset: HTMLDivElement;
15
+ @Part() $tabset: HTMLUListElement;
17
16
  @Part() $slot: HTMLSlotElement;
18
17
 
19
- tabs: any[] = [];
18
+ @Prop() tabs: any[] = [];
19
+
20
+ #selectedTab: number = 0;
21
+ #focusedTab: number = 0;
20
22
 
21
23
  connectedCallback() {
22
- this.addEventListener('tab', this.handleTab.bind(this));
24
+ this.addEventListener('tab', this.#handleTab.bind(this));
23
25
  this.$slot.addEventListener('slotchange', this.handleSlotChange.bind(this));
24
- }
25
-
26
- handleTab(e: CustomEvent) {
27
- const { detail } = e;
28
- this.tabs.push(detail);
29
- list(
30
- this.$tabset,
31
- this.tabs,
32
- 'id',
33
- (tab: any) => {
34
- const n = node<HTMLDivElement>(partialTab, {
35
- button: {
36
- innerText: tab.label
26
+ forEach({
27
+ container: this.$tabset,
28
+ items: this.tabs,
29
+ type(tab: any) {
30
+ return PgPartialTab;
31
+ },
32
+ connect: ($tab: PgPartialTab, tab) => {
33
+ $tab.addEventListener('select', (e: any) => {
34
+ const $tabs = Array.from(this.$tabset.children) as PgPartialTab[];
35
+ const { index } = e.detail;
36
+ const elements = this.$slot.assignedElements() as PgTab[];
37
+ elements[this.#selectedTab].hide();
38
+ $tabs[this.#selectedTab].selected = false;
39
+ elements[index].show();
40
+ $tab.selected = true;
41
+ this.#selectedTab = index;
42
+ });
43
+ $tab.addEventListener('arrowleft', (e: any) => {
44
+ const $tabs = Array.from(this.$tabset.children) as PgPartialTab[];
45
+ const { index } = e.detail;
46
+ if (this.tabs.length > 1) {
47
+ if (index === 0) {
48
+ this.#focusedTab = this.tabs.length - 1;
49
+ } else {
50
+ this.#focusedTab = index - 1;
51
+ }
52
+ $tabs[this.#focusedTab].focus();
37
53
  }
38
54
  });
39
- const button = n.querySelector<HTMLDivElement>('[part="tab"]');
40
- button?.addEventListener('click', (e) => {
41
- this.selectTab(tab.id);
42
- this.dispatchEvent(new CustomEvent<any>('select', { detail: tab }));
55
+ $tab.addEventListener('arrowright', (e: any) => {
56
+ const $tabs = Array.from(this.$tabset.children) as PgPartialTab[];
57
+ const { index } = e.detail;
58
+ if (this.tabs.length > 1) {
59
+ if (index === this.tabs.length - 1) {
60
+ this.#focusedTab = 0;
61
+ } else {
62
+ this.#focusedTab++;
63
+ }
64
+ $tabs[this.#focusedTab].focus();
65
+ }
43
66
  });
44
- button?.addEventListener('keydown', this.handleTabKeypress.bind(this));
45
- if (this.tabs[0].id === tab.id) {
46
- button?.classList.add('active');
47
- }
48
- return n;
49
- },
50
- (tab, $item) => {
51
-
52
67
  }
53
- );
54
- e.stopPropagation();
68
+ });
55
69
  }
56
70
 
57
- handleTabKeypress(e) {
58
- const tabs = Array.from(this.$tabset.children, x => x.children[0]);
59
- if (tabs.length === 1) {
60
- return;
61
- }
62
- const index = tabs.findIndex(x => x === e.target);
63
- const previousIndex = index === 0 ? tabs.length - 1 : index - 1;
64
- const nextIndex = index === tabs.length - 1 ? 0 : index + 1;
65
- const previousTab = this.tabs[previousIndex];
66
- const previousButton = tabs[previousIndex] as HTMLButtonElement;
67
- const nextTab = this.tabs[nextIndex];
68
- const nextButton = tabs[nextIndex] as HTMLButtonElement;
69
- switch(e.key) {
70
- case 'ArrowLeft':
71
- if (previousTab) {
72
- previousButton.focus();
73
- this.selectTab(previousTab.id);
74
- }
75
- break;
76
- case 'ArrowRight':
77
- if (nextTab) {
78
- nextButton.focus();
79
- this.selectTab(nextTab.id);
80
- }
81
- break;
82
- }
71
+ #handleTab(e: CustomEvent) {
72
+ const { detail } = e;
73
+ this.tabs.push(detail);
74
+ e.stopPropagation();
83
75
  }
84
76
 
85
- handleSlotChange(e) {
77
+ handleSlotChange(e: Event) {
78
+ const tabs = Array.from(this.$tabset.children) as PgPartialTab[];
86
79
  const elements = this.$slot.assignedElements() as PgTab[];
87
80
  if (elements.length !== 0) {
88
81
  elements[0].show();
82
+ tabs[0].selected = true;
89
83
  }
90
84
  }
91
85
 
92
- selectTab(id: string) {
93
- const tabs = Array.from(this.$tabset.children) as HTMLElement[];
94
- for (let tab of tabs) {
95
- tab.classList.toggle('active', tab.dataset['key'] === id);
96
- }
97
- const elements = this.$slot.assignedElements() as PgTab[];
98
- elements.forEach(e => e.hide());
99
- const tab = elements.find(e => e.uuid === id) as PgTab;
100
- tab.show();
101
- }
102
86
  }
@@ -1,13 +1,42 @@
1
- # `<pg-toast>`
1
+ # `PgToast`
2
2
 
3
- The `pg-toast` lives inside of the `pg-toasts` element.
3
+ The `PgToast` utility will open a toast in the top right of the page.
4
4
 
5
5
  ```typescript
6
- import '@pictogrammers/components/pgToast.js';
6
+ import PgToast from '@pictogrammers/components/pgToast';
7
7
  ```
8
8
 
9
- ```html
10
- <pg-toast></pg-toast>
9
+ ```typescript
10
+ PgToast.open({
11
+ type: 'info',
12
+ message: 'Loading...',
13
+ loading: true
14
+ });
15
+
16
+ // On Success
17
+ this.handleToast.resolve({
18
+ type: 'success',
19
+ message: 'Saved',
20
+ timeout: 5
21
+ });
22
+ // On Error
23
+ this.handleToast.reject({
24
+ type: 'error',
25
+ message: 'Saved',
26
+ timeout: 5
27
+ });
28
+ // Close open toast with no config
29
+ disconnectedCallback() {
30
+ this.handleToast?.resolve();
31
+ }
11
32
  ```
12
33
 
13
- This is entirely a presentational component.
34
+ | Prop | default | Description |
35
+ | ---- | ------- | ----------- |
36
+ | `type` | `info` | `info`, `warning`, `success`, `error` |
37
+ | `message` | `''` | Message string. |
38
+ | `timeout` | `undefined` | Timeout in seconds |
39
+
40
+ Toasts can be updated in place without adding to the queue by using the `handleToast` config.
41
+
42
+ Toasts with a `timeout` will automatically hide and any future `handleToast` executions will add to the queue as a new toast.
@@ -0,0 +1,7 @@
1
+ <div>
2
+ <button part="toastInfo">Info</button>
3
+ <button part="toastWarning">Warning</button>
4
+ <button part="toastError">Error</button>
5
+ <button part="toastLoading">Loading (mock 3 seconds)</button>
6
+ <button part="toastToggle">Toggle Toast</button>
7
+ </div>
@@ -0,0 +1,76 @@
1
+ import { Component, Part } from '@pictogrammers/element';
2
+ import PgToast from '../../toast';
3
+
4
+ import template from './basic.html';
5
+
6
+ @Component({
7
+ selector: 'x-pg-toast-basic',
8
+ template
9
+ })
10
+ export default class XPgToastsBasic extends HTMLElement {
11
+
12
+ @Part() $toastInfo: HTMLButtonElement;
13
+ @Part() $toastWarning: HTMLButtonElement;
14
+ @Part() $toastError: HTMLButtonElement;
15
+ @Part() $toastLoading: HTMLButtonElement;
16
+ @Part() $toastToggle: HTMLButtonElement;
17
+
18
+ connectedCallback() {
19
+ this.$toastInfo.addEventListener('click', this.handleInfo.bind(this));
20
+ this.$toastWarning.addEventListener('click', this.handleWarning.bind(this));
21
+ this.$toastError.addEventListener('click', this.handleError.bind(this));
22
+ this.$toastLoading.addEventListener('click', this.handleLoading.bind(this));
23
+ this.$toastToggle.addEventListener('click', this.handleToggle.bind(this));
24
+ }
25
+
26
+ handleInfo() {
27
+ PgToast.open({
28
+ type: 'info',
29
+ message: 'Hello World! With really long content that wraps rows.',
30
+ });
31
+ }
32
+
33
+ handleWarning() {
34
+ PgToast.open({
35
+ type: 'warning',
36
+ message: 'Hello World! Warning',
37
+ });
38
+ }
39
+
40
+ handleError() {
41
+ PgToast.open({
42
+ type: 'error',
43
+ message: 'Hello World! Error',
44
+ });
45
+ }
46
+
47
+ async handleLoading() {
48
+ const toast = await PgToast.open({
49
+ type: 'info',
50
+ message: 'Loading...',
51
+ loading: true
52
+ });
53
+ setTimeout(() => {
54
+ toast({
55
+ type: 'success',
56
+ message: 'Saved record.',
57
+ timeout: 5
58
+ });
59
+ }, 3000);
60
+ }
61
+
62
+ cacheToast: any;
63
+ async handleToggle() {
64
+ if (!this.cacheToast) {
65
+ this.cacheToast = await PgToast.open({
66
+ type: 'info',
67
+ message: 'Loading...',
68
+ loading: true
69
+ });
70
+ } else {
71
+ this.cacheToast();
72
+ this.cacheToast = null;
73
+ }
74
+ }
75
+
76
+ }
@@ -1,4 +1,7 @@
1
1
  [part~=button] {
2
+ position: fixed;
3
+ top: 1rem;
4
+ right: 1rem;
2
5
  display: flex;
3
6
  background: #737E9E;
4
7
  box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.4);
package/pg/toast/toast.ts CHANGED
@@ -1,16 +1,18 @@
1
1
  import { Component, Prop, Part } from '@pictogrammers/element';
2
2
  import { uuid } from '../shared/uuid';
3
- import { removeToast } from '../shared/toast';
4
3
 
5
4
  import template from './toast.html';
6
5
  import style from './toast.css';
6
+ import PgOverlay from '../overlay/overlay';
7
+
8
+ const toasts = [];
7
9
 
8
10
  @Component({
9
11
  selector: 'pg-toast',
10
12
  style,
11
13
  template
12
14
  })
13
- export default class PgToast extends HTMLElement {
15
+ export default class PgToast extends PgOverlay {
14
16
  @Prop() loading: boolean = false;
15
17
  @Prop() message: string = '';
16
18
  @Prop() type: string = 'default';
@@ -22,16 +24,30 @@ export default class PgToast extends HTMLElement {
22
24
  @Part() $message: HTMLSpanElement;
23
25
  @Part() $loading: HTMLSpanElement;
24
26
 
27
+ static open(props: any = {}): Promise<any> {
28
+ // ToDo: validate props
29
+ super.open(props);
30
+ const key = uuid();
31
+ return Promise.resolve(function (config?: any) {
32
+ const scopedKey = key;
33
+ if (config === undefined) {
34
+ this.toasts.find(t => t.key === scopedKey).remove();
35
+ }
36
+ });
37
+ }
38
+
25
39
  toasts: any[] = [];
26
40
 
27
41
  connectedCallback() {
42
+ // Position toast
43
+ // close toast
28
44
  this.$button.addEventListener('click', () => {
29
- removeToast(this.key);
45
+ this.remove();
30
46
  });
31
47
  }
32
48
 
33
49
  render() {
34
- this.$message.innerText = this.message;
50
+ this.$message.textContent = this.message;
35
51
  this.$loading.classList.toggle('hide', !this.loading);
36
52
  this.$button.classList.toggle('error', this.type === 'error');
37
53
  this.$button.classList.toggle('warning', this.type === 'warning');
@@ -1,3 +1,5 @@
1
+ import { BOTTOM } from "./position";
2
+
1
3
  export function addTooltip($part, render, position?) {
2
4
  function handleMouseEnter() {
3
5
  $part.dispatchEvent(
@@ -6,7 +8,7 @@ export function addTooltip($part, render, position?) {
6
8
  visible: true,
7
9
  rect: $part.getBoundingClientRect(),
8
10
  text: render(),
9
- position: position
11
+ position: position ?? BOTTOM
10
12
  },
11
13
  bubbles: true,
12
14
  composed: true
@@ -141,7 +141,7 @@ export default class PgTooltip extends HTMLElement {
141
141
  @Part() $tooltipArrow: HTMLDivElement;
142
142
 
143
143
  render(changes) {
144
- this.$tooltipText.innerText = this.text;
144
+ this.$tooltipText.textContent = this.text;
145
145
  this.style.position = 'absolute';
146
146
  if (changes.visible) {
147
147
  this.style.display = this.visible ? 'block' : 'none';
@@ -0,0 +1,67 @@
1
+ # Tree
2
+
3
+ The `pg-tree` is used to render a tree list of items.
4
+
5
+ - Folder / Item symbols
6
+ - Drag and Drop
7
+ - Context Menu
8
+
9
+ ## Usage
10
+
11
+ While setup for a normal file tree this can be used for any folder structure.
12
+
13
+ ## Events
14
+
15
+ - select
16
+ - rename
17
+ - menu
18
+ - action
19
+ - drop
20
+
21
+ ```typescript
22
+ this.$tree.addEventListener('select', (e: any) => {
23
+ const { items } = e.detail;
24
+ this.selectedItems = items;
25
+ });
26
+ ```
27
+
28
+ ```typescript
29
+ this.$tree.addEventListener('rename', (e: any) => {
30
+ const { indexes, label } = e.detail;
31
+ const item = this.#getItem(indexes);
32
+ item.label = label;
33
+ });
34
+ ```
35
+
36
+ ```typescript
37
+ this.$tree.addEventListener('menu', (e: any) => {
38
+ // menu item click
39
+ });
40
+ ```
41
+
42
+ ```typescript
43
+ this.$tree.addEventListener('action', (e: any) => {
44
+ const { item, actionIndex } = e.detail;
45
+ // item is a wrapper with all utility functions
46
+ switch(actionIndex) {
47
+ case 0:
48
+ // select in view
49
+ break;
50
+ case 1:
51
+ item.remove();
52
+ break;
53
+ }
54
+ });
55
+ ```
56
+
57
+ ```typescript
58
+ this.$tree.addEventListener('drop', (e: any) => {
59
+ // cancelable
60
+ const { items, dropIndexes } = e.detail;
61
+ // If folder ignore items under folder
62
+
63
+ items.forEach(() => {
64
+ item.move(dropIndexes);
65
+ })
66
+ });
67
+ ```
@@ -0,0 +1,10 @@
1
+ <div style="background: #F1F1F1;padding: 0.25rem;">
2
+ <div style="background: #FFF; max-width: 20rem">
3
+ <pg-tree part="tree"></pg-tree>
4
+ </div>
5
+ </div>
6
+ <h2>Tools</h2>
7
+ <button part="addItem">Add Item</button>
8
+ <button part="addFolder">Add Folder</button>
9
+ <button part="removeItem">Remove Item</button>
10
+ <button part="updateItem">Update Selected Label Item</button>