@pictogrammers/components 0.3.1

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 (379) hide show
  1. package/@types/css.d.ts +4 -0
  2. package/@types/html.d.ts +4 -0
  3. package/README.md +49 -0
  4. package/dist/main.js +3819 -0
  5. package/dist/pgAnnoy.js +116 -0
  6. package/dist/pgAvatar.js +136 -0
  7. package/dist/pgButton.js +116 -0
  8. package/dist/pgButtonGroup.js +116 -0
  9. package/dist/pgButtonLink.js +116 -0
  10. package/dist/pgButtonToggle.js +146 -0
  11. package/dist/pgCard.js +116 -0
  12. package/dist/pgCardUser.js +196 -0
  13. package/dist/pgColor.js +136 -0
  14. package/dist/pgDatabase.js +236 -0
  15. package/dist/pgDropdown.js +686 -0
  16. package/dist/pgGrid.js +126 -0
  17. package/dist/pgHeader.js +116 -0
  18. package/dist/pgIcon.js +116 -0
  19. package/dist/pgInputCheck.js +116 -0
  20. package/dist/pgInputCheckList.js +126 -0
  21. package/dist/pgInputFileLocal.js +116 -0
  22. package/dist/pgInputHexRgb.js +126 -0
  23. package/dist/pgInputRange.js +116 -0
  24. package/dist/pgInputSelect.js +116 -0
  25. package/dist/pgInputText.js +116 -0
  26. package/dist/pgInputTextIcon.js +176 -0
  27. package/dist/pgInputUserSelect.js +116 -0
  28. package/dist/pgListTag.js +136 -0
  29. package/dist/pgMarkdown.js +346 -0
  30. package/dist/pgMenuIcon.js +206 -0
  31. package/dist/pgModalAlert.js +126 -0
  32. package/dist/pgModification.js +396 -0
  33. package/dist/pgNav.js +116 -0
  34. package/dist/pgOverlay.js +96 -0
  35. package/dist/pgPicker.js +116 -0
  36. package/dist/pgPreview.js +116 -0
  37. package/dist/pgScroll.js +266 -0
  38. package/dist/pgSearch.js +146 -0
  39. package/dist/pgTab.js +116 -0
  40. package/dist/pgTabs.js +136 -0
  41. package/dist/pgToast.js +136 -0
  42. package/dist/pgToasts.js +136 -0
  43. package/dist/pgTooltip.js +126 -0
  44. package/index.html +302 -0
  45. package/package.json +25 -0
  46. package/pg/annoy/README.md +18 -0
  47. package/pg/annoy/__examples__/basic/basic.html +8 -0
  48. package/pg/annoy/__examples__/basic/basic.ts +11 -0
  49. package/pg/annoy/annoy.css +238 -0
  50. package/pg/annoy/annoy.html +59 -0
  51. package/pg/annoy/annoy.ts +48 -0
  52. package/pg/annoy/index.ts +3 -0
  53. package/pg/avatar/README.md +23 -0
  54. package/pg/avatar/__examples__/basic/basic.html +6 -0
  55. package/pg/avatar/__examples__/basic/basic.ts +41 -0
  56. package/pg/avatar/__examples__/basic/constants.ts +1 -0
  57. package/pg/avatar/avatar.css +45 -0
  58. package/pg/avatar/avatar.html +8 -0
  59. package/pg/avatar/avatar.spec.ts +51 -0
  60. package/pg/avatar/avatar.ts +37 -0
  61. package/pg/avatar/index.ts +3 -0
  62. package/pg/button/README.md +51 -0
  63. package/pg/button/__examples__/basic/basic.html +11 -0
  64. package/pg/button/__examples__/basic/basic.ts +11 -0
  65. package/pg/button/__examples__/states/states.html +8 -0
  66. package/pg/button/__examples__/states/states.ts +20 -0
  67. package/pg/button/button.css +91 -0
  68. package/pg/button/button.html +3 -0
  69. package/pg/button/button.ts +45 -0
  70. package/pg/button/index.ts +3 -0
  71. package/pg/buttonGroup/README.md +28 -0
  72. package/pg/buttonGroup/__examples__/basic/basic.html +12 -0
  73. package/pg/buttonGroup/__examples__/basic/basic.ts +11 -0
  74. package/pg/buttonGroup/buttonGroup.css +4 -0
  75. package/pg/buttonGroup/buttonGroup.html +1 -0
  76. package/pg/buttonGroup/buttonGroup.spec.ts +30 -0
  77. package/pg/buttonGroup/buttonGroup.ts +50 -0
  78. package/pg/buttonGroup/index.ts +3 -0
  79. package/pg/buttonLink/README.md +51 -0
  80. package/pg/buttonLink/__examples__/basic/basic.html +17 -0
  81. package/pg/buttonLink/__examples__/basic/basic.ts +11 -0
  82. package/pg/buttonLink/buttonLink.css +91 -0
  83. package/pg/buttonLink/buttonLink.html +3 -0
  84. package/pg/buttonLink/buttonLink.ts +46 -0
  85. package/pg/buttonLink/index.ts +3 -0
  86. package/pg/buttonToggle/README.md +54 -0
  87. package/pg/buttonToggle/__examples__/basic/basic.html +10 -0
  88. package/pg/buttonToggle/__examples__/basic/basic.ts +23 -0
  89. package/pg/buttonToggle/buttonToggle.css +8 -0
  90. package/pg/buttonToggle/buttonToggle.html +4 -0
  91. package/pg/buttonToggle/buttonToggle.ts +44 -0
  92. package/pg/buttonToggle/index.ts +3 -0
  93. package/pg/card/README.md +21 -0
  94. package/pg/card/__examples__/basic/basic.html +5 -0
  95. package/pg/card/__examples__/basic/basic.ts +11 -0
  96. package/pg/card/card.css +11 -0
  97. package/pg/card/card.html +3 -0
  98. package/pg/card/card.spec.ts +30 -0
  99. package/pg/card/card.ts +13 -0
  100. package/pg/card/index.ts +3 -0
  101. package/pg/cardUser/README.md +22 -0
  102. package/pg/cardUser/__examples__/basic/basic.html +3 -0
  103. package/pg/cardUser/__examples__/basic/basic.ts +30 -0
  104. package/pg/cardUser/__examples__/basic/constants.ts +1 -0
  105. package/pg/cardUser/cardUser.css +67 -0
  106. package/pg/cardUser/cardUser.html +23 -0
  107. package/pg/cardUser/cardUser.spec.ts +46 -0
  108. package/pg/cardUser/cardUser.ts +53 -0
  109. package/pg/cardUser/index.ts +3 -0
  110. package/pg/color/README.md +13 -0
  111. package/pg/color/__examples__/basic/basic.html +4 -0
  112. package/pg/color/__examples__/basic/basic.ts +20 -0
  113. package/pg/color/color.css +21 -0
  114. package/pg/color/color.html +1 -0
  115. package/pg/color/color.ts +97 -0
  116. package/pg/color/constants.ts +357 -0
  117. package/pg/color/index.ts +3 -0
  118. package/pg/color/utils.ts +27 -0
  119. package/pg/database/README.md +28 -0
  120. package/pg/database/__examples__/basic/basic.html +9 -0
  121. package/pg/database/__examples__/basic/basic.ts +37 -0
  122. package/pg/database/database.css +0 -0
  123. package/pg/database/database.html +0 -0
  124. package/pg/database/database.ts +42 -0
  125. package/pg/database/index.ts +3 -0
  126. package/pg/dropdown/README.md +13 -0
  127. package/pg/dropdown/__examples__/basic/basic.html +14 -0
  128. package/pg/dropdown/__examples__/basic/basic.ts +11 -0
  129. package/pg/dropdown/dropdown.css +46 -0
  130. package/pg/dropdown/dropdown.html +5 -0
  131. package/pg/dropdown/dropdown.ts +60 -0
  132. package/pg/dropdown/index.ts +3 -0
  133. package/pg/grid/README.md +97 -0
  134. package/pg/grid/__examples__/basic/basic.html +29 -0
  135. package/pg/grid/__examples__/basic/basic.ts +139 -0
  136. package/pg/grid/grid.css +68 -0
  137. package/pg/grid/grid.html +6 -0
  138. package/pg/grid/grid.spec.ts +66 -0
  139. package/pg/grid/grid.ts +417 -0
  140. package/pg/grid/index.ts +3 -0
  141. package/pg/header/README.md +23 -0
  142. package/pg/header/__examples__/basic/basic.html +8 -0
  143. package/pg/header/__examples__/basic/basic.ts +11 -0
  144. package/pg/header/header.css +42 -0
  145. package/pg/header/header.html +15 -0
  146. package/pg/header/header.ts +28 -0
  147. package/pg/header/index.ts +3 -0
  148. package/pg/icon/README.md +26 -0
  149. package/pg/icon/__examples__/basic/basic.html +16 -0
  150. package/pg/icon/__examples__/basic/basic.ts +34 -0
  151. package/pg/icon/__examples__/basic/constants.ts +2 -0
  152. package/pg/icon/icon.css +9 -0
  153. package/pg/icon/icon.html +3 -0
  154. package/pg/icon/icon.spec.ts +46 -0
  155. package/pg/icon/icon.ts +23 -0
  156. package/pg/icon/index.ts +3 -0
  157. package/pg/inputCheck/README.md +32 -0
  158. package/pg/inputCheck/__examples__/basic/basic.html +8 -0
  159. package/pg/inputCheck/__examples__/basic/basic.ts +23 -0
  160. package/pg/inputCheck/index.ts +3 -0
  161. package/pg/inputCheck/inputCheck.css +45 -0
  162. package/pg/inputCheck/inputCheck.html +6 -0
  163. package/pg/inputCheck/inputCheck.ts +42 -0
  164. package/pg/inputCheckList/README.md +35 -0
  165. package/pg/inputCheckList/__examples__/basic/basic.html +4 -0
  166. package/pg/inputCheckList/__examples__/basic/basic.ts +31 -0
  167. package/pg/inputCheckList/index.ts +3 -0
  168. package/pg/inputCheckList/inputCheckList.css +70 -0
  169. package/pg/inputCheckList/inputCheckList.html +1 -0
  170. package/pg/inputCheckList/inputCheckList.ts +103 -0
  171. package/pg/inputCheckList/templates/option.html +8 -0
  172. package/pg/inputFileLocal/README.md +30 -0
  173. package/pg/inputFileLocal/__examples__/basic/basic.html +4 -0
  174. package/pg/inputFileLocal/__examples__/basic/basic.ts +23 -0
  175. package/pg/inputFileLocal/index.ts +3 -0
  176. package/pg/inputFileLocal/inputFileLocal.css +80 -0
  177. package/pg/inputFileLocal/inputFileLocal.html +5 -0
  178. package/pg/inputFileLocal/inputFileLocal.ts +82 -0
  179. package/pg/inputHexRgb/README.md +15 -0
  180. package/pg/inputHexRgb/__examples__/basic/basic.html +4 -0
  181. package/pg/inputHexRgb/__examples__/basic/basic.ts +23 -0
  182. package/pg/inputHexRgb/index.ts +3 -0
  183. package/pg/inputHexRgb/inputHexRgb.css +96 -0
  184. package/pg/inputHexRgb/inputHexRgb.html +9 -0
  185. package/pg/inputHexRgb/inputHexRgb.ts +79 -0
  186. package/pg/inputHexRgb/utils.ts +27 -0
  187. package/pg/inputRange/README.md +18 -0
  188. package/pg/inputRange/__examples__/basic/basic.html +9 -0
  189. package/pg/inputRange/__examples__/basic/basic.ts +30 -0
  190. package/pg/inputRange/index.ts +3 -0
  191. package/pg/inputRange/inputRange.css +0 -0
  192. package/pg/inputRange/inputRange.html +1 -0
  193. package/pg/inputRange/inputRange.ts +53 -0
  194. package/pg/inputSelect/README.md +25 -0
  195. package/pg/inputSelect/__examples__/basic/basic.html +6 -0
  196. package/pg/inputSelect/__examples__/basic/basic.ts +30 -0
  197. package/pg/inputSelect/index.ts +3 -0
  198. package/pg/inputSelect/inputSelect.css +36 -0
  199. package/pg/inputSelect/inputSelect.html +4 -0
  200. package/pg/inputSelect/inputSelect.ts +57 -0
  201. package/pg/inputText/README.md +27 -0
  202. package/pg/inputText/__examples__/basic/basic.html +9 -0
  203. package/pg/inputText/__examples__/basic/basic.ts +30 -0
  204. package/pg/inputText/index.ts +3 -0
  205. package/pg/inputText/inputText.css +20 -0
  206. package/pg/inputText/inputText.html +1 -0
  207. package/pg/inputText/inputText.spec.ts +59 -0
  208. package/pg/inputText/inputText.ts +59 -0
  209. package/pg/inputTextIcon/README.md +26 -0
  210. package/pg/inputTextIcon/index.ts +3 -0
  211. package/pg/inputTextIcon/inputTextIcon.css +24 -0
  212. package/pg/inputTextIcon/inputTextIcon.html +4 -0
  213. package/pg/inputTextIcon/inputTextIcon.spec.ts +44 -0
  214. package/pg/inputTextIcon/inputTextIcon.ts +26 -0
  215. package/pg/inputUserSelect/README.md +31 -0
  216. package/pg/inputUserSelect/__examples__/basic/basic.html +4 -0
  217. package/pg/inputUserSelect/__examples__/basic/basic.ts +25 -0
  218. package/pg/inputUserSelect/__examples__/basic/constants.ts +33 -0
  219. package/pg/inputUserSelect/index.ts +3 -0
  220. package/pg/inputUserSelect/inputUserSelect.css +174 -0
  221. package/pg/inputUserSelect/inputUserSelect.html +18 -0
  222. package/pg/inputUserSelect/inputUserSelect.ts +266 -0
  223. package/pg/listTag/README.md +26 -0
  224. package/pg/listTag/__examples__/basic/basic.html +16 -0
  225. package/pg/listTag/__examples__/basic/basic.ts +53 -0
  226. package/pg/listTag/__examples__/basic/constants.ts +22 -0
  227. package/pg/listTag/index.ts +3 -0
  228. package/pg/listTag/listTag.css +9 -0
  229. package/pg/listTag/listTag.html +1 -0
  230. package/pg/listTag/listTag.ts +48 -0
  231. package/pg/listTag/partials/tag.html +3 -0
  232. package/pg/markdown/README.md +13 -0
  233. package/pg/markdown/__examples__/basic/basic.html +3 -0
  234. package/pg/markdown/__examples__/basic/basic.ts +51 -0
  235. package/pg/markdown/__examples__/basic/constants.ts +129 -0
  236. package/pg/markdown/index.ts +5 -0
  237. package/pg/markdown/markdown.css +760 -0
  238. package/pg/markdown/markdown.html +1 -0
  239. package/pg/markdown/markdown.md +123 -0
  240. package/pg/markdown/markdown.spec.ts +87 -0
  241. package/pg/markdown/markdown.ts +381 -0
  242. package/pg/markdown/markdownReplace.ts +7 -0
  243. package/pg/menuIcon/README.md +13 -0
  244. package/pg/menuIcon/__examples__/basic/basic.html +3 -0
  245. package/pg/menuIcon/__examples__/basic/basic.ts +15 -0
  246. package/pg/menuIcon/index.ts +3 -0
  247. package/pg/menuIcon/menuIcon.css +168 -0
  248. package/pg/menuIcon/menuIcon.html +64 -0
  249. package/pg/menuIcon/menuIcon.ts +271 -0
  250. package/pg/modalAlert/README.md +17 -0
  251. package/pg/modalAlert/__examples__/basic/basic.html +4 -0
  252. package/pg/modalAlert/__examples__/basic/basic.ts +27 -0
  253. package/pg/modalAlert/index.ts +3 -0
  254. package/pg/modalAlert/modalAlert.css +43 -0
  255. package/pg/modalAlert/modalAlert.html +22 -0
  256. package/pg/modalAlert/modalAlert.ts +45 -0
  257. package/pg/modification/README.md +34 -0
  258. package/pg/modification/__examples__/basic/basic.html +8 -0
  259. package/pg/modification/__examples__/basic/basic.ts +63 -0
  260. package/pg/modification/__examples__/basic/constants.ts +416 -0
  261. package/pg/modification/index.ts +3 -0
  262. package/pg/modification/modification.css +311 -0
  263. package/pg/modification/modification.html +1 -0
  264. package/pg/modification/modification.spec.ts +33 -0
  265. package/pg/modification/modification.ts +201 -0
  266. package/pg/modification/type/date.html +1 -0
  267. package/pg/modification/type/iconAliasCreated.html +13 -0
  268. package/pg/modification/type/iconAliasDeleted.html +13 -0
  269. package/pg/modification/type/iconAuthorModified.html +13 -0
  270. package/pg/modification/type/iconCreated.html +13 -0
  271. package/pg/modification/type/iconDeleted.html +13 -0
  272. package/pg/modification/type/iconDeprecated.html +13 -0
  273. package/pg/modification/type/iconDescriptionModified.html +10 -0
  274. package/pg/modification/type/iconModified.html +14 -0
  275. package/pg/modification/type/iconRenamed.html +13 -0
  276. package/pg/modification/type/iconTagCreated.html +13 -0
  277. package/pg/modification/type/iconTagDeleted.html +13 -0
  278. package/pg/modification/type/news.html +5 -0
  279. package/pg/nav/README.md +16 -0
  280. package/pg/nav/__examples__/basic/basic.html +5 -0
  281. package/pg/nav/__examples__/basic/basic.ts +11 -0
  282. package/pg/nav/index.ts +3 -0
  283. package/pg/nav/nav.css +14 -0
  284. package/pg/nav/nav.html +16 -0
  285. package/pg/nav/nav.ts +21 -0
  286. package/pg/overlay/README.md +37 -0
  287. package/pg/overlay/__examples__/basic/basic.css +3 -0
  288. package/pg/overlay/__examples__/basic/basic.html +3 -0
  289. package/pg/overlay/__examples__/basic/basic.ts +13 -0
  290. package/pg/overlay/index.ts +3 -0
  291. package/pg/overlay/overlay.ts +26 -0
  292. package/pg/picker/README.md +13 -0
  293. package/pg/picker/index.ts +3 -0
  294. package/pg/picker/picker.css +56 -0
  295. package/pg/picker/picker.html +8 -0
  296. package/pg/picker/picker.ts +66 -0
  297. package/pg/preview/README.md +19 -0
  298. package/pg/preview/__examples__/basic/basic.html +11 -0
  299. package/pg/preview/__examples__/basic/basic.ts +22 -0
  300. package/pg/preview/index.ts +3 -0
  301. package/pg/preview/preview.css +34 -0
  302. package/pg/preview/preview.html +5 -0
  303. package/pg/preview/preview.ts +38 -0
  304. package/pg/scroll/README.md +42 -0
  305. package/pg/scroll/__examples__/basic/basic.css +4 -0
  306. package/pg/scroll/__examples__/basic/basic.html +11 -0
  307. package/pg/scroll/__examples__/basic/basic.ts +88 -0
  308. package/pg/scroll/index.ts +3 -0
  309. package/pg/scroll/scroll.css +7 -0
  310. package/pg/scroll/scroll.html +3 -0
  311. package/pg/scroll/scroll.ts +158 -0
  312. package/pg/search/README.md +59 -0
  313. package/pg/search/__examples__/basic/basic.html +3 -0
  314. package/pg/search/__examples__/basic/basic.ts +29 -0
  315. package/pg/search/__examples__/basic/constants.ts +3 -0
  316. package/pg/search/index.ts +3 -0
  317. package/pg/search/search.css +188 -0
  318. package/pg/search/search.html +18 -0
  319. package/pg/search/search.ts +252 -0
  320. package/pg/search/utils.ts +12 -0
  321. package/pg/shared/README.md +28 -0
  322. package/pg/shared/copy.ts +25 -0
  323. package/pg/shared/database.ts +35 -0
  324. package/pg/shared/databaseService.ts +230 -0
  325. package/pg/shared/debounce.ts +12 -0
  326. package/pg/shared/enums/modificationType.ts +19 -0
  327. package/pg/shared/filter.ts +14 -0
  328. package/pg/shared/http.ts +83 -0
  329. package/pg/shared/iconFilter.spec.ts +61 -0
  330. package/pg/shared/iconFilter.ts +71 -0
  331. package/pg/shared/list.ts +34 -0
  332. package/pg/shared/models/alias.ts +40 -0
  333. package/pg/shared/models/font.ts +31 -0
  334. package/pg/shared/models/fontIcon.ts +25 -0
  335. package/pg/shared/models/fontVersion.ts +22 -0
  336. package/pg/shared/models/icon.ts +97 -0
  337. package/pg/shared/models/modification.ts +45 -0
  338. package/pg/shared/models/style.ts +12 -0
  339. package/pg/shared/models/tag.ts +37 -0
  340. package/pg/shared/models/user.ts +35 -0
  341. package/pg/shared/models/version.ts +20 -0
  342. package/pg/shared/removeDiacritics.ts +94 -0
  343. package/pg/shared/toast.ts +47 -0
  344. package/pg/shared/uuid.ts +6 -0
  345. package/pg/tab/README.md +18 -0
  346. package/pg/tab/index.ts +3 -0
  347. package/pg/tab/tab.css +13 -0
  348. package/pg/tab/tab.html +3 -0
  349. package/pg/tab/tab.ts +51 -0
  350. package/pg/tabs/README.md +31 -0
  351. package/pg/tabs/__examples__/basic/basic.html +13 -0
  352. package/pg/tabs/__examples__/basic/basic.ts +11 -0
  353. package/pg/tabs/index.ts +3 -0
  354. package/pg/tabs/partials/tab.html +3 -0
  355. package/pg/tabs/tabs.css +69 -0
  356. package/pg/tabs/tabs.html +4 -0
  357. package/pg/tabs/tabs.ts +102 -0
  358. package/pg/toast/README.md +13 -0
  359. package/pg/toast/index.ts +3 -0
  360. package/pg/toast/toast.css +112 -0
  361. package/pg/toast/toast.html +13 -0
  362. package/pg/toast/toast.ts +39 -0
  363. package/pg/toasts/README.md +37 -0
  364. package/pg/toasts/__examples__/basic/basic.html +11 -0
  365. package/pg/toasts/__examples__/basic/basic.ts +86 -0
  366. package/pg/toasts/index.ts +3 -0
  367. package/pg/toasts/toasts.css +8 -0
  368. package/pg/toasts/toasts.html +1 -0
  369. package/pg/toasts/toasts.ts +51 -0
  370. package/pg/tooltip/README.md +51 -0
  371. package/pg/tooltip/__examples__/basic/basic.css +38 -0
  372. package/pg/tooltip/__examples__/basic/basic.html +21 -0
  373. package/pg/tooltip/__examples__/basic/basic.ts +55 -0
  374. package/pg/tooltip/addTooltip.ts +31 -0
  375. package/pg/tooltip/index.ts +20 -0
  376. package/pg/tooltip/position.ts +15 -0
  377. package/pg/tooltip/tooltip.css +36 -0
  378. package/pg/tooltip/tooltip.html +4 -0
  379. package/pg/tooltip/tooltip.ts +170 -0
@@ -0,0 +1,51 @@
1
+ import { selectComponent, getAttributes } from '@pictogrammers/element';
2
+
3
+ import './avatar';
4
+ import PgAvatar from './avatar';
5
+
6
+ import { User } from '../shared/models/user';
7
+
8
+ const PG_AVATAR = 'pg-avatar';
9
+ const AVATAR = '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';
10
+ const DEFAULT_AVATAR = 'data:image/png;base64,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';
11
+
12
+ describe('pg-avatar', () => {
13
+
14
+ beforeEach(() => {
15
+ var c = document.createElement(PG_AVATAR);
16
+ document.body.appendChild(c);
17
+ });
18
+
19
+ afterEach(() => {
20
+ while (document.body.firstChild) {
21
+ document.body.removeChild(document.body.firstChild);
22
+ }
23
+ });
24
+
25
+ it('should be registered', () => {
26
+ expect(customElements.get(PG_AVATAR)).toBeDefined();
27
+ });
28
+
29
+ it('should only expose known props', () => {
30
+ const props = getAttributes(PG_AVATAR)
31
+ expect(props.length).toBe(1);
32
+ expect(props).toContain('user');
33
+ });
34
+
35
+ it('should default avatar picture', () => {
36
+ const component = selectComponent<PgAvatar>(PG_AVATAR);
37
+ const { $img } = component;
38
+ expect($img.getAttribute('src')).toEqual(DEFAULT_AVATAR);
39
+ });
40
+
41
+ it('img should be set', async () => {
42
+ const component = selectComponent<PgAvatar>(PG_AVATAR);
43
+ const { $img } = component;
44
+ const user = new User();
45
+ const encoded = `data:image/png;base64,${AVATAR}`;
46
+ user.base64 = encoded;
47
+ component.user = user;
48
+ expect($img.getAttribute('src')).toEqual(encoded);
49
+ });
50
+
51
+ });
@@ -0,0 +1,37 @@
1
+ import { Component, Prop, Part } from '@pictogrammers/element';
2
+
3
+ import template from './avatar.html';
4
+ import style from './avatar.css';
5
+
6
+ import { User } from '../shared/models/user';
7
+ import { addTooltip } from '../tooltip/addTooltip';
8
+
9
+ const noAvatar = 'data:image/png;base64,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';
10
+
11
+ @Component({
12
+ selector: 'pg-avatar',
13
+ style,
14
+ template
15
+ })
16
+ export default class PgAvatar extends HTMLElement {
17
+ @Prop() user: User = new User();
18
+
19
+ @Part() $img: HTMLImageElement;
20
+ @Part() $sponsored: HTMLAnchorElement;
21
+
22
+ connectedCallback() {
23
+ addTooltip(this.$sponsored, () => {
24
+ return `Sponsor ${this.user.name} on GitHub`;
25
+ });
26
+ }
27
+
28
+ render(changes) {
29
+ if (changes.user) {
30
+ this.$img.src = this.user.base64 || noAvatar;
31
+ this.$sponsored.style.display = this.user.sponsored ? 'flex' : 'none';
32
+ if (this.user.sponsored) {
33
+ this.$sponsored.href = `https://github.com/sponsors/${this.user.github}`;
34
+ }
35
+ }
36
+ }
37
+ }
@@ -0,0 +1,3 @@
1
+ import PgAvatar from './avatar';
2
+
3
+ export default PgAvatar;
@@ -0,0 +1,51 @@
1
+ # `<pg-button>`
2
+
3
+ The `pg-button` component is essentially just a styled button, but it also allows special rendering for `pg-button-group` and `pg-icon`.
4
+
5
+ ```typescript
6
+ import '@pictogrammers/components/pg/button';
7
+ import PgButton from '@pictogrammers/components/pg/button';
8
+ ```
9
+
10
+ ```html
11
+ <pg-button>Click Me!</pg-button>
12
+ ```
13
+
14
+ | Slots | Tested | Description |
15
+ | ----------- | -------- | ----------- |
16
+ | default | &#x2705; | Button contents. |
17
+
18
+ | Attribute | Tested | Description |
19
+ | ---------- | -------- | ----------- |
20
+ | block | | block sizing |
21
+ | active | | Depressed visual state. |
22
+ | start | | Internal Only |
23
+ | end | | Internal Only |
24
+ | center | | Internal Only |
25
+
26
+ | Events | Tested | Description |
27
+ | ---------- | -------- | ----------- |
28
+ | click | &#x2705; | Standard click. |
29
+
30
+ | CSS Variables | Default | Description |
31
+ | ------------------- | --------- | ----------- |
32
+ | `--pg-button-color` | `#453C4F` | Text color |
33
+ | `--pg-button-background-color` | `#fff` | Background color |
34
+ | `--pg-button-border-color` | `#453C4F` | Border color |
35
+ | `--pg-button-hover-color` | `#fff` | `:hover` Text color |
36
+ | `--pg-button-hover-background-color` | `#453C4F` | `:hover` Background color |
37
+ | `--pg-button-hover-border-color` | `#453C4F` | `:hover` Border color |
38
+ | `--pg-button-active-color` | `#fff` | `active` Text color |
39
+ | `--pg-button-active-background-color` | `#453C4F` | `active` Background color |
40
+ | `--pg-button-active-border-color` | `#453C4F` | `active` Border color |
41
+
42
+ ### Slots
43
+
44
+ Special styling is applied for `pg-icon`.
45
+
46
+ ```html
47
+ <pg-button>
48
+ <pg-icon path="M...Z"></pg-icon>
49
+ Hello!
50
+ </pg-button>
51
+ ```
@@ -0,0 +1,11 @@
1
+ <div class="example">
2
+ <div class="example-flex">
3
+ <pg-button>Example Button</pg-button>
4
+ <pg-button><pg-icon path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"></pg-icon></pg-button>
5
+ <pg-button>
6
+ <pg-icon path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"></pg-icon>
7
+ With Icon
8
+ </pg-button>
9
+ </div>
10
+ <pg-button block>Block Button</pg-button>
11
+ </div>
@@ -0,0 +1,11 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import template from './basic.html';
4
+
5
+ @Component({
6
+ selector: 'x-pg-button-basic',
7
+ template
8
+ })
9
+ export default class XPgButtonBasic extends HTMLElement {
10
+
11
+ }
@@ -0,0 +1,8 @@
1
+ <h4>Active</h4>
2
+ <pg-button active part="active">Button</pg-button>
3
+ <h4>Start</h4>
4
+ <pg-button start>Button</pg-button>
5
+ <h4>Center</h4>
6
+ <pg-button center>Button</pg-button>
7
+ <h4>End</h4>
8
+ <pg-button end>Button</pg-button>
@@ -0,0 +1,20 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+ import PgButton from '../../button';
3
+
4
+ import template from './states.html';
5
+
6
+ @Component({
7
+ selector: 'x-pg-button-states',
8
+ template
9
+ })
10
+ export default class XPgButtonStates extends HTMLElement {
11
+ @Part() $active: PgButton;
12
+
13
+ connectedCallback() {
14
+ this.$active.addEventListener('click', this.handleActive.bind(this));
15
+ }
16
+
17
+ handleActive() {
18
+ this.$active.active = !this.$active.active;
19
+ }
20
+ }
@@ -0,0 +1,91 @@
1
+ :host {
2
+ display: flex;
3
+ }
4
+
5
+ [part="button"] {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ align-content: center;
9
+ font-family: var(--pg-font-family);
10
+ font-size: 1rem;
11
+ line-height: 1.5rem;
12
+ border: 1px solid var(--pg-button-border-color, #453C4F);
13
+ background-color: var(--pg-button-background-color, #fff);
14
+ color: var(--pg-button-color, #453C4F);
15
+ padding: var(--pg-button-padding, 0.25rem 0.5rem);
16
+ border-radius: 0.25rem;
17
+ outline: none;
18
+ --pg-icon-color: var(--pg-button-color, #453C4F);
19
+ }
20
+
21
+ [part="button"]:hover {
22
+ border: 1px solid var(--pg-button-hover-border-color, #453C4F);
23
+ background-color: var(--pg-button-hover-background-color, #453C4F);
24
+ color: var(--pg-button-hover-color, #fff);
25
+ --pg-icon-color: var(--pg-button-hover-color, #fff);
26
+ }
27
+
28
+ [part="button"]:active {
29
+ box-shadow: 0 1px 0.25rem rgba(0, 0, 0, 0.5) inset;
30
+ position: relative;
31
+ }
32
+
33
+ [part="button"]:focus {
34
+ position: relative;
35
+ }
36
+
37
+ [part="button"]:active::before {
38
+ content: '';
39
+ position: absolute;
40
+ top: -1px;
41
+ right: -1px;
42
+ bottom: -1px;
43
+ left: -1px;
44
+ border-radius: 0.25rem;
45
+ box-shadow: 0 0 0 3px var(--pg-search-focus-glow, rgb(79, 143, 249, 0.6));
46
+ }
47
+ [part="button"]:focus::before {
48
+ content: '';
49
+ position: absolute;
50
+ top: -1px;
51
+ right: -1px;
52
+ bottom: -1px;
53
+ left: -1px;
54
+ border-radius: 0.25rem;
55
+ box-shadow: 0 0 0 3px var(--pg-search-focus-glow, rgb(79, 143, 249, 0.5));
56
+ }
57
+
58
+ [part="button"].start {
59
+ border-top-right-radius: 0;
60
+ border-bottom-right-radius: 0;
61
+ margin-right: -1px;
62
+ }
63
+
64
+ [part="button"].center {
65
+ border-radius: 0;
66
+ margin-right: -1px;
67
+ }
68
+
69
+ [part="button"].end {
70
+ border-top-left-radius: 0;
71
+ border-bottom-left-radius: 0;
72
+ }
73
+
74
+ [part="button"].active {
75
+ box-shadow: 0 1px 0.25rem rgba(0, 0, 0, 0.5) inset;
76
+ background-color: rgba(69, 60, 79, 0.1);
77
+ color: var(--pg-button-color, #453C4F);
78
+ }
79
+ [part="button"].active:hover {
80
+ box-shadow: 0 1px 0.25rem rgba(0, 0, 0, 0.5) inset;
81
+ background-color: var(--pg-button-color, #453C4F);
82
+ color: var(--pg-button-hover-color, #fff);
83
+ }
84
+
85
+ [part="button"].block {
86
+ flex: 1;
87
+ }
88
+
89
+ ::slotted {
90
+ align-self: center;
91
+ }
@@ -0,0 +1,3 @@
1
+ <button part="button">
2
+ <slot></slot>
3
+ </button>
@@ -0,0 +1,45 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import template from './button.html';
4
+ import style from './button.css';
5
+
6
+ @Component({
7
+ selector: 'pg-button',
8
+ style,
9
+ template
10
+ })
11
+ export default class PgButton extends HTMLElement {
12
+ @Prop() active: string | boolean = false;
13
+ @Prop() block: string | boolean = false;
14
+ @Prop() start: string | boolean = false;
15
+ @Prop() center: string | boolean = false;
16
+ @Prop() end: string | boolean = false;
17
+
18
+ @Part() $button: HTMLButtonElement;
19
+
20
+ connectedCallback() {
21
+ this.$button.addEventListener('click', (e) => {
22
+ e.stopPropagation();
23
+ this.dispatchEvent(new CustomEvent('click'));
24
+ });
25
+ }
26
+
27
+ render(changes) {
28
+ const t = [true, 'true', ''];
29
+ if (changes.active) {
30
+ this.$button.classList.toggle('active', t.includes(this.active));
31
+ }
32
+ if (changes.start) {
33
+ this.$button.classList.toggle('start', t.includes(this.start));
34
+ }
35
+ if (changes.end) {
36
+ this.$button.classList.toggle('end', t.includes(this.end));
37
+ }
38
+ if (changes.center) {
39
+ this.$button.classList.toggle('center', t.includes(this.center));
40
+ }
41
+ if (changes.block) {
42
+ this.$button.classList.toggle('block', t.includes(this.block));
43
+ }
44
+ }
45
+ }
@@ -0,0 +1,3 @@
1
+ import PgButton from './button';
2
+
3
+ export default PgButton;
@@ -0,0 +1,28 @@
1
+ # `<pg-button-group>`
2
+
3
+ The `pg-button-group` wraps the `pg-button` component.
4
+
5
+ ```typescript
6
+ import '@pictogrammers/components/pg/buttonGroup';
7
+ import PgButtonGroup from '@pictogrammers/components/pg/buttonGroup';
8
+ ```
9
+
10
+ ```html
11
+ <pg-button-group>
12
+ <pg-button active>Hello</pg-button>
13
+ <pg-button>World</pg-button>
14
+ </pg-button-group>
15
+ ```
16
+
17
+ ### Slots
18
+
19
+ Special styling is applied for `pg-button`.
20
+
21
+ ```html
22
+ <pg-button-group>
23
+ <pg-button>
24
+ <pg-icon path="M...Z"></pg-icon>
25
+ With Icons
26
+ </pg-button>
27
+ </pg-button-group>
28
+ ```
@@ -0,0 +1,12 @@
1
+ <div class="example example-flex">
2
+ <pg-button-group>
3
+ <pg-button><pg-icon path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"></pg-icon></pg-button>
4
+ <pg-button>
5
+ <pg-icon path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z"></pg-icon>
6
+ With Icon
7
+ </pg-button>
8
+ <pg-button active>
9
+ active
10
+ </pg-button>
11
+ </pg-button-group>
12
+ </div>
@@ -0,0 +1,11 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import template from './basic.html';
4
+
5
+ @Component({
6
+ selector: 'x-pg-button-group-basic',
7
+ template
8
+ })
9
+ export default class XPgButtonGroupBasic extends HTMLElement {
10
+
11
+ }
@@ -0,0 +1,4 @@
1
+ :host {
2
+ display: inline-flex;
3
+ flex-direction: row;
4
+ }
@@ -0,0 +1 @@
1
+ <slot part="slot"></slot>
@@ -0,0 +1,30 @@
1
+ import { selectComponent, getAttributes } from '@pictogrammers/element';
2
+
3
+ import './buttonGroup';
4
+ import PgButtonGroup from './buttonGroup';
5
+
6
+ const PG_BUTTON_GROUP = 'pg-button-group';
7
+
8
+ describe('pg-button-group', () => {
9
+
10
+ beforeEach(() => {
11
+ var c = document.createElement(PG_BUTTON_GROUP);
12
+ document.body.appendChild(c);
13
+ });
14
+
15
+ afterEach(() => {
16
+ while (document.body.firstChild) {
17
+ document.body.removeChild(document.body.firstChild);
18
+ }
19
+ });
20
+
21
+ it('should be registered', () => {
22
+ expect(customElements.get(PG_BUTTON_GROUP)).toBeDefined();
23
+ });
24
+
25
+ it('should only expose known props', () => {
26
+ const props = getAttributes(PG_BUTTON_GROUP);
27
+ expect(props.length).toBe(0);
28
+ });
29
+
30
+ });
@@ -0,0 +1,50 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import template from './buttonGroup.html';
4
+ import style from './buttonGroup.css';
5
+ import PgButton from '../button/button';
6
+ import PgButtonLink from '../buttonLink/buttonLink';
7
+
8
+ const PG_BUTTON = 'PG-BUTTON';
9
+ const PG_BUTTON_LINK = 'PG-BUTTON-LINK';
10
+
11
+ function isButton(ele: PgButton | PgButtonLink) {
12
+ return ele.tagName === PG_BUTTON || ele.tagName === PG_BUTTON_LINK;
13
+ }
14
+
15
+ @Component({
16
+ selector: 'pg-button-group',
17
+ style,
18
+ template
19
+ })
20
+ export default class PgButtonGroup extends HTMLElement {
21
+ @Part() $slot: HTMLSlotElement;
22
+
23
+ connectedCallback() {
24
+ this.$slot.addEventListener('slotchange', this.handleSlotChange.bind(this))
25
+ }
26
+
27
+ handleSlotChange(e) {
28
+ const elements = this.$slot.assignedElements();
29
+ if (elements.length !== 0) {
30
+ const first = elements[0] as PgButton;
31
+ if (isButton(first)) {
32
+ first.start = true;
33
+ }
34
+ const last = elements[elements.length - 1] as PgButton;
35
+ if (isButton(last)) {
36
+ last.end = true;
37
+ }
38
+ for (let i = 0; i < elements.length; i++) {
39
+ const element = elements[i] as PgButton;
40
+ if (isButton(element)) {
41
+ element.center = !element.start && !element.end;
42
+ }
43
+ }
44
+ }
45
+ }
46
+
47
+ render(changes) {
48
+
49
+ }
50
+ }
@@ -0,0 +1,3 @@
1
+ import PgButtonGroup from './buttonGroup';
2
+
3
+ export default PgButtonGroup;
@@ -0,0 +1,51 @@
1
+ # `<pg-button>`
2
+
3
+ The `pg-button-link` component is essentially just a styled anchor, but it also allows special rendering for `pg-button-group` and `pg-icon`.
4
+
5
+ ```typescript
6
+ import '@pictogrammers/components/pg/buttonLink';
7
+ import PgButtonLink from '@pictogrammers/components/pg/buttonLink';
8
+ ```
9
+
10
+ ```html
11
+ <pg-button-link>Click Me!</pg-button-link>
12
+ ```
13
+
14
+ | Slots | Tested | Description |
15
+ | ----------- | -------- | ----------- |
16
+ | default | &#x2705; | Button contents. |
17
+
18
+ | Attribute | Tested | Description |
19
+ | ---------- | -------- | ----------- |
20
+ | block | | block sizing |
21
+ | active | | Depressed visual state. |
22
+ | start | | Internal Only |
23
+ | end | | Internal Only |
24
+ | center | | Internal Only |
25
+
26
+ | Events | Tested | Description |
27
+ | ---------- | -------- | ----------- |
28
+ | click | &#x2705; | Standard click. |
29
+
30
+ | CSS Variables | Default | Description |
31
+ | ------------------- | --------- | ----------- |
32
+ | `--pg-button-color` | `#453C4F` | Text color |
33
+ | `--pg-button-background-color` | `#fff` | Background color |
34
+ | `--pg-button-border-color` | `#453C4F` | Border color |
35
+ | `--pg-button-hover-color` | `#fff` | `:hover` Text color |
36
+ | `--pg-button-hover-background-color` | `#453C4F` | `:hover` Background color |
37
+ | `--pg-button-hover-border-color` | `#453C4F` | `:hover` Border color |
38
+ | `--pg-button-active-color` | `#fff` | `active` Text color |
39
+ | `--pg-button-active-background-color` | `#453C4F` | `active` Background color |
40
+ | `--pg-button-active-border-color` | `#453C4F` | `active` Border color |
41
+
42
+ ### Slots
43
+
44
+ Special styling is applied for `pg-icon`.
45
+
46
+ ```html
47
+ <pg-button-link>
48
+ <pg-icon path="M...Z"></pg-icon>
49
+ Hello!
50
+ </pg-button-link>
51
+ ```
@@ -0,0 +1,17 @@
1
+ <div class="example">
2
+ <div class="example-flex">
3
+ <pg-button-link href="#test">Example Button Link</pg-button-link>
4
+ <pg-button-link href="#test">
5
+ <pg-icon
6
+ path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z">
7
+ </pg-icon>
8
+ </pg-button-link>
9
+ <pg-button-link href="#test">
10
+ <pg-icon
11
+ path="M12,19.2C9.5,19.2 7.29,17.92 6,16C6.03,14 10,12.9 12,12.9C14,12.9 17.97,14 18,16C16.71,17.92 14.5,19.2 12,19.2M12,5A3,3 0 0,1 15,8A3,3 0 0,1 12,11A3,3 0 0,1 9,8A3,3 0 0,1 12,5M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12C22,6.47 17.5,2 12,2Z">
12
+ </pg-icon>
13
+ With Icon
14
+ </pg-button-link>
15
+ </div>
16
+ <pg-button-link href="#test" block>Block Button Link</pg-button-link>
17
+ </div>
@@ -0,0 +1,11 @@
1
+ import { Component, Part, Prop } from '@pictogrammers/element';
2
+
3
+ import template from './basic.html';
4
+
5
+ @Component({
6
+ selector: 'x-pg-button-link-basic',
7
+ template
8
+ })
9
+ export default class XPgButtonLinkBasic extends HTMLElement {
10
+
11
+ }