@shortfuse/materialdesignweb 0.0.9 → 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 (392) hide show
  1. package/.browserslistrc +3 -0
  2. package/.eslintrc.json +146 -27
  3. package/.stylelintrc.json +598 -2
  4. package/.vscode/launch.json +20 -5
  5. package/.vscode/settings.json +3 -0
  6. package/.vscode/tasks.json +19 -10
  7. package/CHANGELOG.md +24 -0
  8. package/README.md +84 -2
  9. package/adapters/datatable/column.js +203 -0
  10. package/adapters/datatable/index.js +972 -0
  11. package/adapters/dom/index.js +601 -0
  12. package/adapters/list/index.js +69 -0
  13. package/adapters/search/index.js +521 -0
  14. package/components/appbar/_spec.scss +225 -0
  15. package/components/appbar/_theme.scss +0 -0
  16. package/components/appbar/index.scss +2 -0
  17. package/components/banner/_spec.scss +118 -0
  18. package/components/banner/_theme.scss +0 -0
  19. package/components/banner/index.scss +2 -0
  20. package/components/bottomnav/README.md +85 -0
  21. package/components/bottomnav/_spec.scss +157 -0
  22. package/components/bottomnav/_theme.scss +0 -0
  23. package/components/bottomnav/index.js +122 -0
  24. package/components/bottomnav/index.scss +2 -0
  25. package/components/bottomnav/item.js +89 -0
  26. package/components/{core/button → button}/README.md +16 -22
  27. package/components/button/_spec.scss +161 -0
  28. package/components/button/_theme.scss +65 -0
  29. package/components/button/index.eta +32 -0
  30. package/components/button/index.js +43 -0
  31. package/components/button/index.pug +18 -0
  32. package/components/button/index.scss +2 -0
  33. package/components/card/_spec.scss +249 -0
  34. package/components/card/_theme.scss +0 -0
  35. package/components/card/index.scss +2 -0
  36. package/components/chip/_spec.scss +134 -0
  37. package/components/chip/_theme.scss +177 -0
  38. package/components/chip/index.js +21 -0
  39. package/components/chip/index.scss +2 -0
  40. package/components/chip/item.js +20 -0
  41. package/components/datatable/_spec.scss +288 -0
  42. package/components/datatable/_theme.scss +154 -0
  43. package/components/datatable/cell.js +45 -0
  44. package/components/datatable/columnheader.js +47 -0
  45. package/components/datatable/index.js +388 -0
  46. package/components/datatable/index.scss +2 -0
  47. package/components/datatable/row.js +49 -0
  48. package/components/datatable/rowheader.js +18 -0
  49. package/components/dialog/_spec.scss +213 -0
  50. package/components/dialog/_theme.scss +0 -0
  51. package/components/dialog/index.js +627 -0
  52. package/components/dialog/index.scss +2 -0
  53. package/components/divider/_spec.scss +13 -0
  54. package/components/divider/_theme.scss +0 -0
  55. package/components/divider/index.scss +2 -0
  56. package/components/elevation/_spec.scss +9 -0
  57. package/components/elevation/_theme.scss +0 -0
  58. package/components/elevation/index.scss +2 -0
  59. package/components/fab/_spec.scss +222 -0
  60. package/components/fab/_theme.scss +0 -0
  61. package/components/fab/index.js +103 -0
  62. package/components/fab/index.scss +2 -0
  63. package/components/grid/_spec.scss +312 -0
  64. package/components/grid/_theme.scss +0 -0
  65. package/components/grid/index.scss +2 -0
  66. package/components/layout/_mixins.scss +33 -0
  67. package/components/layout/_spec.scss +1012 -0
  68. package/components/layout/_theme.scss +44 -0
  69. package/components/layout/index.js +464 -0
  70. package/components/layout/index.scss +2 -0
  71. package/components/list/_spec.scss +397 -0
  72. package/components/list/_theme.scss +111 -0
  73. package/components/list/content.js +110 -0
  74. package/components/list/index.js +260 -0
  75. package/components/list/index.scss +2 -0
  76. package/components/list/item.js +170 -0
  77. package/components/list/secondary.js +46 -0
  78. package/components/menu/_spec.scss +362 -0
  79. package/components/menu/_theme.scss +0 -0
  80. package/components/menu/index.js +721 -0
  81. package/components/menu/index.scss +2 -0
  82. package/components/menu/item.js +239 -0
  83. package/components/{core/progress/style.scss → progress/_spec.scss} +36 -25
  84. package/components/progress/_theme.scss +0 -0
  85. package/components/progress/index.js +36 -0
  86. package/components/progress/index.scss +2 -0
  87. package/components/selection/_spec.scss +386 -0
  88. package/components/selection/_theme.scss +166 -0
  89. package/components/selection/index.eta +60 -0
  90. package/components/selection/index.js +76 -0
  91. package/components/selection/index.pug +30 -0
  92. package/components/selection/index.scss +2 -0
  93. package/components/selection/input.js +56 -0
  94. package/components/selection/radiogroup.js +47 -0
  95. package/components/slider/_spec.scss +64 -0
  96. package/components/slider/_theme.scss +0 -0
  97. package/components/slider/index.scss +2 -0
  98. package/components/snackbar/_spec.scss +195 -0
  99. package/components/snackbar/_theme.scss +0 -0
  100. package/components/snackbar/index.js +344 -0
  101. package/components/snackbar/index.scss +2 -0
  102. package/components/tab/_spec.scss +235 -0
  103. package/components/tab/_theme.scss +0 -0
  104. package/components/tab/content.js +205 -0
  105. package/components/tab/index.js +260 -0
  106. package/components/tab/index.scss +2 -0
  107. package/components/tab/item.js +89 -0
  108. package/components/tab/list.js +210 -0
  109. package/components/tab/panel.js +54 -0
  110. package/components/template/_theme.scss +27 -0
  111. package/components/{core/textfield → textfield}/README.md +70 -50
  112. package/components/textfield/_mixins.scss +52 -0
  113. package/components/textfield/_spec.scss +809 -0
  114. package/components/textfield/_theme.scss +299 -0
  115. package/components/textfield/index.eta +74 -0
  116. package/components/textfield/index.js +168 -0
  117. package/components/textfield/index.pug +30 -0
  118. package/components/textfield/index.scss +2 -0
  119. package/components/tooltip/_spec.scss +188 -0
  120. package/components/tooltip/_theme.scss +0 -0
  121. package/components/tooltip/index.scss +2 -0
  122. package/components/type/_spec.scss +224 -0
  123. package/components/type/_theme.scss +0 -0
  124. package/components/type/index.scss +2 -0
  125. package/core/_breakpoint.scss +189 -0
  126. package/core/_elevation.scss +38 -0
  127. package/core/_length.scss +9 -0
  128. package/core/_motion.scss +31 -0
  129. package/core/_platform.scss +34 -0
  130. package/core/_type.scss +127 -0
  131. package/core/aria/attributes.js +141 -0
  132. package/core/aria/button.js +50 -0
  133. package/core/aria/keyboard.js +93 -0
  134. package/core/aria/rovingtabindex.js +178 -0
  135. package/core/aria/tab.js +60 -0
  136. package/core/color/_spec.scss +0 -0
  137. package/core/color/_theme.scss +390 -0
  138. package/core/color/index.scss +2 -0
  139. package/core/document/index.js +39 -0
  140. package/core/dom.js +271 -0
  141. package/core/overlay/_spec.scss +31 -0
  142. package/core/overlay/_theme.scss +171 -0
  143. package/core/overlay/index.js +108 -0
  144. package/core/overlay/index.scss +2 -0
  145. package/core/ripple/_spec.scss +197 -0
  146. package/core/ripple/_theme.scss +40 -0
  147. package/core/ripple/index.js +294 -0
  148. package/core/ripple/index.scss +2 -0
  149. package/core/theme/_config.scss +2 -0
  150. package/core/theme/_mixins.scss +172 -0
  151. package/{components/theming/palettes.scss → core/theme/_palettes.scss} +173 -150
  152. package/core/theme/_variables.scss +24 -0
  153. package/core/theme/index.js +50 -0
  154. package/core/throttler.js +42 -0
  155. package/core/transition/index.js +468 -0
  156. package/docs/_flex.scss +22 -0
  157. package/docs/_menuoptions.js +183 -0
  158. package/docs/_mixins.pug +155 -0
  159. package/docs/_partials/_androidnavbar.eta +5 -0
  160. package/docs/_partials/_androidstatusbar.eta +13 -0
  161. package/docs/_partials/_appbar.eta +29 -0
  162. package/docs/_partials/_buttontest.eta +31 -0
  163. package/docs/_partials/_header.eta +149 -0
  164. package/docs/_partials/_navlistitem.eta +16 -0
  165. package/docs/_partials/_target.eta +1 -0
  166. package/docs/_sample-utils.js +93 -0
  167. package/docs/_storage.js +33 -0
  168. package/docs/docs.scss +295 -0
  169. package/docs/index.eta +16 -0
  170. package/docs/index.js +0 -0
  171. package/docs/pages/appbar.eta +114 -0
  172. package/docs/pages/appbar.js +0 -0
  173. package/docs/pages/appbar.pug +78 -0
  174. package/docs/pages/bottomnav.eta +188 -0
  175. package/docs/pages/bottomnav.js +115 -0
  176. package/docs/pages/bottomnav.pug +137 -0
  177. package/docs/pages/button.eta +124 -0
  178. package/docs/pages/button.js +224 -0
  179. package/docs/pages/button.pug +121 -0
  180. package/docs/pages/card.eta +90 -0
  181. package/docs/pages/card.js +177 -0
  182. package/docs/pages/card.pug +74 -0
  183. package/docs/pages/chip.eta +122 -0
  184. package/docs/pages/chip.js +82 -0
  185. package/docs/pages/chip.pug +91 -0
  186. package/docs/pages/color.eta +143 -0
  187. package/docs/pages/color.js +262 -0
  188. package/docs/pages/color.pug +121 -0
  189. package/docs/pages/datatable.eta +323 -0
  190. package/docs/pages/datatable.js +164 -0
  191. package/docs/pages/datatable.pug +283 -0
  192. package/docs/pages/dialog.eta +186 -0
  193. package/docs/pages/dialog.js +177 -0
  194. package/docs/pages/dialog.pug +132 -0
  195. package/docs/pages/dom.eta +26 -0
  196. package/docs/pages/dom.js +143 -0
  197. package/docs/pages/dom.pug +22 -0
  198. package/docs/pages/elevation.eta +35 -0
  199. package/docs/pages/elevation.js +0 -0
  200. package/docs/pages/elevation.pug +25 -0
  201. package/docs/pages/fab.eta +99 -0
  202. package/docs/pages/fab.js +44 -0
  203. package/docs/pages/fab.pug +66 -0
  204. package/docs/pages/grid.eta +135 -0
  205. package/docs/pages/grid.js +128 -0
  206. package/docs/pages/grid.pug +95 -0
  207. package/docs/pages/layout.eta +8 -0
  208. package/docs/pages/layout.js +0 -0
  209. package/docs/pages/layout.pug +7 -0
  210. package/docs/pages/list.eta +465 -0
  211. package/docs/pages/list.js +9 -0
  212. package/docs/pages/list.pug +326 -0
  213. package/docs/pages/menu.eta +276 -0
  214. package/docs/pages/menu.js +217 -0
  215. package/docs/pages/menu.pug +205 -0
  216. package/docs/pages/overlay.eta +69 -0
  217. package/docs/pages/overlay.js +4 -0
  218. package/docs/pages/overlay.pug +55 -0
  219. package/docs/pages/progress.eta +23 -0
  220. package/docs/pages/progress.js +12 -0
  221. package/docs/pages/progress.pug +16 -0
  222. package/docs/pages/ripple.eta +27 -0
  223. package/docs/pages/ripple.js +4 -0
  224. package/docs/pages/ripple.pug +21 -0
  225. package/docs/pages/search.eta +246 -0
  226. package/docs/pages/search.js +243 -0
  227. package/docs/pages/search.pug +165 -0
  228. package/docs/pages/selection.eta +111 -0
  229. package/docs/pages/selection.js +13 -0
  230. package/docs/pages/selection.pug +74 -0
  231. package/docs/pages/slider.eta +23 -0
  232. package/docs/pages/slider.js +0 -0
  233. package/docs/pages/slider.pug +17 -0
  234. package/docs/pages/snackbar.eta +83 -0
  235. package/docs/pages/snackbar.js +158 -0
  236. package/docs/pages/snackbar.pug +60 -0
  237. package/docs/pages/tab.eta +421 -0
  238. package/docs/pages/tab.js +151 -0
  239. package/docs/pages/tab.pug +304 -0
  240. package/docs/pages/textfield.eta +486 -0
  241. package/docs/pages/textfield.js +254 -0
  242. package/docs/pages/textfield.pug +360 -0
  243. package/docs/pages/tooltip.eta +94 -0
  244. package/docs/pages/tooltip.js +0 -0
  245. package/docs/pages/tooltip.pug +78 -0
  246. package/docs/pages/transition.eta +117 -0
  247. package/docs/pages/transition.js +54 -0
  248. package/docs/pages/transition.pug +76 -0
  249. package/docs/pages/type.eta +31 -0
  250. package/docs/pages/type.js +0 -0
  251. package/docs/pages/type.pug +29 -0
  252. package/docs/postrender.js +39 -0
  253. package/docs/prerender.js +16 -0
  254. package/docs/pwa/_dialogs.eta +143 -0
  255. package/docs/pwa/_dialogs.pug +96 -0
  256. package/docs/pwa/_menus.eta +16 -0
  257. package/docs/pwa/_menus.pug +11 -0
  258. package/docs/pwa/pwa-prerender.js +3 -0
  259. package/docs/pwa/pwa.eta +480 -0
  260. package/docs/pwa/pwa.js +306 -0
  261. package/docs/pwa/pwa.pug +325 -0
  262. package/docs/pwa/pwa.scss +26 -0
  263. package/docs/spec.scss +26 -0
  264. package/docs/themes/_component-themes.scss +26 -0
  265. package/docs/themes/theme-colored-fallbacks.scss +17 -0
  266. package/docs/themes/theme-colored.scss +17 -0
  267. package/docs/themes/theme-default-fallbacks.scss +17 -0
  268. package/docs/themes/theme-default.scss +17 -0
  269. package/jsconfig.json +4 -2
  270. package/package.json +43 -28
  271. package/scripts/deploy-docs.sh +9 -0
  272. package/templates/index.eta +2 -0
  273. package/templates/index.pug +3 -0
  274. package/utils/function.js +3 -0
  275. package/webpack.config.cjs +257 -0
  276. package/components/_index.scss +0 -4
  277. package/components/all-components.scss +0 -14
  278. package/components/common/functions.scss +0 -173
  279. package/components/common/mixins.scss +0 -107
  280. package/components/common/motion.scss +0 -36
  281. package/components/common/ripple.scss +0 -92
  282. package/components/common/variables.scss +0 -48
  283. package/components/complex/dialog/style.scss +0 -159
  284. package/components/complex/dialog/theming.scss +0 -29
  285. package/components/complex/navdrawer/style.scss +0 -477
  286. package/components/complex/navdrawer/theming.scss +0 -58
  287. package/components/complex/search/index.js +0 -492
  288. package/components/core/bottomnav/README.md +0 -85
  289. package/components/core/bottomnav/index.js +0 -140
  290. package/components/core/bottomnav/style.scss +0 -173
  291. package/components/core/bottomnav/theming.scss +0 -42
  292. package/components/core/button/index.js +0 -52
  293. package/components/core/button/style.scss +0 -283
  294. package/components/core/button/theming.scss +0 -131
  295. package/components/core/list/index.js +0 -94
  296. package/components/core/list/style.scss +0 -269
  297. package/components/core/list/theming.scss +0 -74
  298. package/components/core/menu/index.js +0 -127
  299. package/components/core/menu/style.scss +0 -239
  300. package/components/core/menu/theming.scss +0 -55
  301. package/components/core/progress/index.js +0 -33
  302. package/components/core/selection/style.scss +0 -249
  303. package/components/core/selection/theming.scss +0 -49
  304. package/components/core/switch/style.scss +0 -3
  305. package/components/core/tab/index.js +0 -174
  306. package/components/core/tab/style.scss +0 -202
  307. package/components/core/tab/theming.scss +0 -43
  308. package/components/core/textfield/index.js +0 -169
  309. package/components/core/textfield/style.scss +0 -672
  310. package/components/core/textfield/theming.scss +0 -262
  311. package/components/core/toolbar/style.scss +0 -109
  312. package/components/core/toolbar/theming.scss +0 -28
  313. package/components/core/tooltip/style.scss +0 -127
  314. package/components/core/type/style.scss +0 -133
  315. package/components/core/type/theming.scss +0 -25
  316. package/components/index.js +0 -24
  317. package/components/template/theming.scss +0 -31
  318. package/components/theming/theming.scss +0 -504
  319. package/docs/bottomnav.html +0 -171
  320. package/docs/bottomnav.min.js +0 -383
  321. package/docs/button.html +0 -322
  322. package/docs/button.min.js +0 -251
  323. package/docs/components.min.css +0 -1
  324. package/docs/components.min.js +0 -83
  325. package/docs/dialog.html +0 -103
  326. package/docs/dialog.min.js +0 -160
  327. package/docs/docs.min.css +0 -1
  328. package/docs/docs.min.js +0 -83
  329. package/docs/index.html +0 -55
  330. package/docs/index.min.js +0 -83
  331. package/docs/list.html +0 -442
  332. package/docs/list.min.js +0 -312
  333. package/docs/menu.html +0 -185
  334. package/docs/menu.min.js +0 -370
  335. package/docs/navdrawer.html +0 -199
  336. package/docs/navdrawer.min.js +0 -244
  337. package/docs/progress.html +0 -75
  338. package/docs/progress.min.js +0 -162
  339. package/docs/search.html +0 -230
  340. package/docs/search.min.js +0 -1202
  341. package/docs/selection.html +0 -188
  342. package/docs/selection.min.js +0 -160
  343. package/docs/src/complex/dialog.js +0 -3
  344. package/docs/src/complex/dialog.pug +0 -44
  345. package/docs/src/complex/navdrawer.js +0 -82
  346. package/docs/src/complex/navdrawer.pug +0 -109
  347. package/docs/src/complex/search.js +0 -207
  348. package/docs/src/complex/search.pug +0 -143
  349. package/docs/src/components.scss +0 -1
  350. package/docs/src/core/bottomnav.js +0 -22
  351. package/docs/src/core/bottomnav.pug +0 -93
  352. package/docs/src/core/button.js +0 -16
  353. package/docs/src/core/button.pug +0 -73
  354. package/docs/src/core/list.js +0 -21
  355. package/docs/src/core/list.pug +0 -246
  356. package/docs/src/core/menu.js +0 -33
  357. package/docs/src/core/menu.pug +0 -108
  358. package/docs/src/core/progress.js +0 -11
  359. package/docs/src/core/progress.pug +0 -17
  360. package/docs/src/core/selection.js +0 -4
  361. package/docs/src/core/selection.pug +0 -92
  362. package/docs/src/core/tab.js +0 -21
  363. package/docs/src/core/tab.pug +0 -180
  364. package/docs/src/core/textfield.js +0 -15
  365. package/docs/src/core/textfield.pug +0 -274
  366. package/docs/src/core/toolbar.js +0 -4
  367. package/docs/src/core/toolbar.pug +0 -79
  368. package/docs/src/core/tooltip.js +0 -4
  369. package/docs/src/core/tooltip.pug +0 -76
  370. package/docs/src/core/type.js +0 -4
  371. package/docs/src/core/type.pug +0 -36
  372. package/docs/src/docs.scss +0 -200
  373. package/docs/src/index.pug +0 -5
  374. package/docs/src/mixins.pug +0 -72
  375. package/docs/src/targetHandler.js +0 -50
  376. package/docs/src/theming.ie11.scss +0 -35
  377. package/docs/src/theming.scss +0 -36
  378. package/docs/tab.html +0 -301
  379. package/docs/tab.min.js +0 -397
  380. package/docs/textfield.html +0 -476
  381. package/docs/textfield.min.js +0 -381
  382. package/docs/theming.ie11.min.css +0 -1
  383. package/docs/theming.ie11.min.js +0 -83
  384. package/docs/theming.min.css +0 -1
  385. package/docs/theming.min.js +0 -83
  386. package/docs/toolbar.html +0 -213
  387. package/docs/toolbar.min.js +0 -160
  388. package/docs/tooltip.html +0 -138
  389. package/docs/tooltip.min.js +0 -160
  390. package/docs/type.html +0 -94
  391. package/docs/type.min.js +0 -160
  392. package/webpack.config.js +0 -176
@@ -0,0 +1,4 @@
1
+ import { iterateArrayLike } from '../../core/dom.js';
2
+ import * as Ripple from '../../core/ripple/index.js';
3
+
4
+ iterateArrayLike(document.querySelectorAll('.js .mdw-ripple'), Ripple.attach);
@@ -0,0 +1,21 @@
1
+ include ../_mixins.pug
2
+
3
+ +header("ripple")
4
+ .mdw-grid(mdw-margin-top mdw-margin-bottom mdw-stretch)
5
+ .mdw-grid__item(mdw-colspan="4")
6
+ .mdw-grid__content
7
+ h6.mdw-type Javascript
8
+ .display-flex.flex-column.js
9
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="default" mdw-surface="binary") Default Ink
10
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="primary" mdw-surface="binary") Primary Ink
11
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="secondary" mdw-surface="binary") Secondary Ink
12
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="warn" mdw-surface="binary") Warn Ink
13
+ .mdw-grid__item(mdw-colspan="4")
14
+ .mdw-grid__content
15
+ h6.mdw-type CSS Only
16
+ .display-flex.flex-column
17
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="default" mdw-surface="binary") Default Ink
18
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="primary" mdw-surface="binary") Primary Ink
19
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="secondary" mdw-surface="binary") Secondary Ink
20
+ .demo-core-item.mdw-elevation.mdw-ripple.mdw-theme(mdw-elevation="1" mdw-ink="warn" mdw-surface="binary") Warn Ink
21
+ script(src='ripple.min.js')
@@ -0,0 +1,246 @@
1
+ <% var T = '../../templates/index.eta' %>
2
+ <% layout('../_partials/_header.eta', {page: 'search'}) %>
3
+ <div class="comparison js">
4
+ <div class="render">
5
+ <div class="display-flex" style="padding:8px;">
6
+ <div class="flex-1 display-flex" flex-column>
7
+ <p>Text field dropdown with:</p>
8
+ <ul>
9
+ <li>one-time search on first input</li>
10
+ <li>startsWith text filter</li>
11
+ <li>append input on selection</li>
12
+ </ul>
13
+ <div>
14
+ <label class="mdw-textfield mdw-theme" id="search-textfield-custom1" mdw-ink="secondary">
15
+ <input class="mdw-textfield__input" placeholder=" " />
16
+ <div class="mdw-textfield__border">
17
+ <div class="mdw-textfield__outline-gap">
18
+ <div class="mdw-textfield__label">Property</div>
19
+ </div>
20
+ </div>
21
+ <div class="mdw-textfield__dropdown mdw-theme" mdw-surface="card" mdw-type="list" mdw-hide>
22
+ <div class="custom-busy-indicator display-flex" flex-align-items="center">
23
+ <div class="mdw-progress-circle">
24
+ <svg viewBox="0 0 24 24">
25
+ <path d="M12 3.25A8.75 8.75 0 1 1 3.25 12"></path>
26
+ <path d="M12 3.25A8.75 8.75 0 1 1 3.25 12 A 8.75 8.75 0 0 1 12 3.25"></path>
27
+ </svg>
28
+ </div>
29
+ <div>Searching...</div>
30
+ </div>
31
+ <div class="mdw-list" id="search-list-custom1"></div>
32
+ </div>
33
+ </label>
34
+ </div>
35
+ <p>Current Selection: <span id="search-result-custom1"></span></p>
36
+ <p>Text field dropdown with:</p>
37
+ <ul>
38
+ <li>input-based search</li>
39
+ <li>300ms debounce</li>
40
+ <li>replace input on selection</li>
41
+ <li>disabled item filter</li>
42
+ </ul>
43
+ <div>
44
+ <label class="mdw-textfield mdw-theme" id="search-textfield-custom2" mdw-ink="primary" mdw-outlined>
45
+ <input class="mdw-textfield__input" placeholder=" " />
46
+ <div class="mdw-textfield__border">
47
+ <div class="mdw-textfield__outline-gap">
48
+ <div class="mdw-textfield__label">Property</div>
49
+ </div>
50
+ </div>
51
+ <div class="mdw-textfield__dropdown mdw-theme" mdw-surface="card" mdw-type="list" mdw-hide>
52
+ <div class="custom-busy-indicator display-flex" flex-align-items="center">
53
+ <div class="mdw-progress-circle">
54
+ <svg viewBox="0 0 24 24">
55
+ <path d="M12 3.25A8.75 8.75 0 1 1 3.25 12"></path>
56
+ <path d="M12 3.25A8.75 8.75 0 1 1 3.25 12 A 8.75 8.75 0 0 1 12 3.25"></path>
57
+ </svg>
58
+ </div>
59
+ <div>Searching...</div>
60
+ </div>
61
+ <div class="custom-no-results-indicator display-flex" flex-align-items="center" style="display:none">No results found</div>
62
+ <div class="mdw-list" id="search-list-custom2"></div>
63
+ </div>
64
+ </label>
65
+ </div>
66
+ <p>Current Selection: <span id="search-result-custom2"></span></p>
67
+ </div>
68
+ </div>
69
+ </div>
70
+ </div>
71
+ <div class="comparison js">
72
+ <div class="render">
73
+ <div class="androidstatusbar mdw-theme" mdw-surface="primary 700" mdw-dark>
74
+ <div>12:30</div>
75
+ <i class="material-icons" style="letter-spacing:2px;padding:0 2px;">&#xE1BA;&#xE1C8;&#xE1A4;</i>
76
+ </div>
77
+ <div class="mdw-appbar mdw-theme" mdw-surface="primary 500" mdw-dark>
78
+ <div class="mdw-appbar__action">
79
+ <div class="mdw-appbar__start">
80
+ <a class="mdw-button mdw-overlay mdw-ripple material-icons" mdw-icon tabindex="0">arrow_back</a>
81
+ </div>
82
+ <div class="mdw-appbar__title" mdw-custom>
83
+ <div class="mdw-textfield mdw-theme" id="search-textfield-simple" mdw-solo mdw-ink="secondary">
84
+ <input class="mdw-textfield__input" placeholder="Search" />
85
+ </div>
86
+ </div>
87
+ <div class="mdw-appbar__end">
88
+ <a class="mdw-button mdw-overlay mdw-ripple material-icons" mdw-icon tabindex="0">clear</a>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ <div class="content">
93
+ <ul class="mdw-list" id="search-list-simple">
94
+ <li class="mdw-list__item">
95
+ <a class="mdw-list__content">Attractions</a>
96
+ </li>
97
+ <li class="mdw-list__item">
98
+ <a class="mdw-list__content">Dining</a>
99
+ </li>
100
+ <li class="mdw-list__item">
101
+ <a class="mdw-list__content">Education</a>
102
+ </li>
103
+ <li class="mdw-list__item">
104
+ <a class="mdw-list__content">Family</a>
105
+ </li>
106
+ <li class="mdw-list__item">
107
+ <a class="mdw-list__content">Health</a>
108
+ </li>
109
+ <li class="mdw-list__item">
110
+ <a class="mdw-list__content">Office</a>
111
+ </li>
112
+ <li class="mdw-list__item">
113
+ <a class="mdw-list__content">Promotions</a>
114
+ </li>
115
+ <li class="mdw-list__item">
116
+ <a class="mdw-list__content">Radio</a>
117
+ </li>
118
+ <li class="mdw-list__item">
119
+ <a class="mdw-list__content">Recipes</a>
120
+ </li>
121
+ <li class="mdw-list__item">
122
+ <a class="mdw-list__content">Sports</a>
123
+ </li>
124
+ <li class="mdw-list__item">
125
+ <a class="mdw-list__content">Travel</a>
126
+ </li>
127
+ </ul>
128
+ </div>
129
+ <div class="androidnavbar">
130
+ <i class="material-icons back-button">&#xE3C8;</i>
131
+ <i class="material-icons">&#xE836;</i>
132
+ <i class="material-icons">&#xE835;</i>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ <div class="comparison js">
137
+ <div class="render">
138
+ <div class="androidstatusbar mdw-theme" mdw-surface="primary 700" mdw-dark>
139
+ <div>12:30</div>
140
+ <i class="material-icons" style="letter-spacing:2px;padding:0 2px;">&#xE1BA;&#xE1C8;&#xE1A4;</i>
141
+ </div>
142
+ <div class="mdw-appbar mdw-theme" mdw-surface="primary 500" mdw-dark>
143
+ <div class="mdw-appbar__action">
144
+ <div class="mdw-appbar__start">
145
+ <a class="mdw-button mdw-overlay mdw-ripple material-icons" mdw-icon tabindex="0">arrow_back</a>
146
+ </div>
147
+ <div class="mdw-appbar__title" mdw-custom>
148
+ <div class="mdw-textfield mdw-theme" id="search-textfield-multiline" mdw-solo mdw-ink="secondary">
149
+ <input class="mdw-textfield__input" placeholder="Search" />
150
+ </div>
151
+ </div>
152
+ <div class="mdw-appbar__end">
153
+ <a class="mdw-button mdw-overlay mdw-ripple material-icons" mdw-icon tabindex="0">clear</a>
154
+ </div>
155
+ </div>
156
+ </div>
157
+ <div class="content">
158
+ <ul class="mdw-list" id="search-list-multiline">
159
+ <li class="mdw-list__subheader mdw-theme" mdw-ink="medium">Today</li>
160
+ <li class="mdw-list__item">
161
+ <div class="mdw-list__content mdw-overlay mdw-ripple">
162
+ <div class="mdw-list__avatar">
163
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
164
+ </div>
165
+ <div class="mdw-list__text">
166
+ <div class="mdw-list__text-line">Brunch this weekend?</div>
167
+ <div class="mdw-list__text-block">Ali Connors<span class="mdw-theme" mdw-ink="medium"> &mdash; I'll be in your neighborhood doing errands this weekend. Do you want to meet?</span></div>
168
+ </div>
169
+ </div>
170
+ </li>
171
+ <li class="mdw-list__item">
172
+ <div class="mdw-list__content">
173
+ <div class="mdw-list__avatar">
174
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
175
+ </div>
176
+ <div class="mdw-list__text">
177
+ <div class="mdw-list__text-line">Summer BBQ<span class="mdw-theme" mdw-ink="medium"> 4</span></div>
178
+ <div class="mdw-list__text-block">to Alex, Scott, Jennifer<span class="mdw-theme" mdw-ink="medium"> &mdash; Wish I could come. but I'm out of town this weekend.</span></div>
179
+ </div>
180
+ </div>
181
+ </li>
182
+ <li class="mdw-list__item">
183
+ <div class="mdw-list__content">
184
+ <div class="mdw-list__avatar">
185
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
186
+ </div>
187
+ <div class="mdw-list__text">
188
+ <div class="mdw-list__text-line">Oui oui</div>
189
+ <div class="mdw-list__text-block">Sandra Adams<span class="mdw-theme" mdw-ink="medium"> &mdash; Do you have Paris recommendations? Have you ever been?</span></div>
190
+ </div>
191
+ </div>
192
+ </li>
193
+ <li class="mdw-list__item">
194
+ <div class="mdw-list__content">
195
+ <div class="mdw-list__avatar">
196
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
197
+ </div>
198
+ <div class="mdw-list__text">
199
+ <div class="mdw-list__text-line">Birthday gift</div>
200
+ <div class="mdw-list__text-block">Trevor Hansen<span class="mdw-theme" mdw-ink="medium"> &mdash; Have any ideas about what we should get Heidi for her birthday?</span></div>
201
+ </div>
202
+ </div>
203
+ </li>
204
+ <li class="mdw-list__item">
205
+ <div class="mdw-list__content">
206
+ <div class="mdw-list__avatar">
207
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
208
+ </div>
209
+ <div class="mdw-list__text">
210
+ <div class="mdw-list__text-line">Recipe to try</div>
211
+ <div class="mdw-list__text-block">Britta Holt<span class="mdw-theme" mdw-ink="medium"> &mdash; We should eat this: Grated Squash, Corn, and tomatillo Tacos J</span></div>
212
+ </div>
213
+ </div>
214
+ </li>
215
+ <li class="mdw-list__item">
216
+ <div class="mdw-list__content">
217
+ <div class="mdw-list__avatar">
218
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
219
+ </div>
220
+ <div class="mdw-list__text">
221
+ <div class="mdw-list__text-line">Giants game</div>
222
+ <div class="mdw-list__text-block">David Park<span class="mdw-theme" mdw-ink="medium"> &mdash; Any interest in seeing</span></div>
223
+ </div>
224
+ </div>
225
+ </li>
226
+ <li class="mdw-list__item">
227
+ <div class="mdw-list__content">
228
+ <div class="mdw-list__avatar">
229
+ <i class="material-icons" style="font-size:40px;">&#xE853;</i>
230
+ </div>
231
+ <div class="mdw-list__text">
232
+ <div class="mdw-list__text-line">Montauk weekend</div>
233
+ <div class="mdw-list__text-block">-----</div>
234
+ </div>
235
+ </div>
236
+ </li>
237
+ </ul>
238
+ </div>
239
+ <div class="androidnavbar">
240
+ <i class="material-icons back-button">&#xE3C8;</i>
241
+ <i class="material-icons">&#xE836;</i>
242
+ <i class="material-icons">&#xE835;</i>
243
+ </div>
244
+ </div>
245
+ </div>
246
+ <script src="search.min.js"></script>
@@ -0,0 +1,243 @@
1
+ import ListAdapter from '../../adapters/list/index.js';
2
+ import SearchAdapter from '../../adapters/search/index.js';
3
+ import * as ListContent from '../../components/list/content.js';
4
+ import * as ListItem from '../../components/list/item.js';
5
+ import * as TextField from '../../components/textfield/index.js';
6
+ import { iterateArrayLike, setTextNode } from '../../core/dom.js';
7
+
8
+ /** @typedef {{line1:string, line2:string}} CustomSearchResult */
9
+
10
+ /** @type {SearchAdapter<any>} */
11
+ let searchDocsSimple;
12
+ /** @type {SearchAdapter<any>} */
13
+ let searchDocsMultiline;
14
+
15
+ /**
16
+ * @param {string} [filter]
17
+ * @return {CustomSearchResult[]}
18
+ */
19
+ function performFakeSearch(filter) {
20
+ const results = [];
21
+ // eslint-disable-next-line guard-for-in, no-restricted-syntax
22
+ for (const key in navigator) {
23
+ /** @type {keyof Navigator} */
24
+ const navKey = (key);
25
+ const value = navigator[navKey] && navigator[navKey].toString();
26
+ if (!filter || key.indexOf(filter) !== -1 || (value && value.indexOf(filter) !== -1)) {
27
+ results.push({ line1: key, line2: value });
28
+ }
29
+ }
30
+ return results;
31
+ }
32
+
33
+ /**
34
+ * @param {HTMLElement} element
35
+ * @return {void}
36
+ */
37
+ function hideElement(element) {
38
+ element.style.setProperty('display', 'none');
39
+ }
40
+ /**
41
+ * @param {HTMLElement} element
42
+ * @return {void}
43
+ */
44
+ function showElement(element) {
45
+ element.style.setProperty('display', '');
46
+ }
47
+
48
+ /**
49
+ * @param {HTMLLIElement} listItemElement
50
+ * @param {CustomSearchResult} result
51
+ * @return {void}
52
+ */
53
+ function searchResultRenderer(listItemElement, result) {
54
+ if (!listItemElement.children.length) {
55
+ const markup = `
56
+ <div class="mdw-list__content mdw-theme" mdw-ink="secondary" aria-selected="false">
57
+ <div class="mdw-list__text">
58
+ <div class="mdw-list__text-line"></div>
59
+ <div class="mdw-list__text-line"></div>
60
+ </div>
61
+ </div>`;
62
+ // eslint-disable-next-line no-param-reassign
63
+ listItemElement.innerHTML = markup;
64
+ ListItem.attach(listItemElement);
65
+ }
66
+ const lines = listItemElement.getElementsByClassName('mdw-list__text-line');
67
+ setTextNode(lines[0], result.line1);
68
+ setTextNode(lines[1], result.line2);
69
+ }
70
+
71
+ /** @return {void} */
72
+ function buildCustomSearch1() {
73
+ const textfield = document.getElementById('search-textfield-custom1');
74
+ const list = document.getElementById('search-list-custom1');
75
+ /** @type {HTMLElement} */
76
+ const busyIndicator = (textfield.getElementsByClassName('custom-busy-indicator')[0]);
77
+
78
+ // For purpose of this demo results are cached.
79
+ // Actual filter is performed by SearchAdapter
80
+
81
+ /** @type {ListAdapter<CustomSearchResult>} */
82
+ const customListAdapter = new ListAdapter({
83
+ element: list,
84
+ datasource: [],
85
+ render: searchResultRenderer,
86
+ });
87
+
88
+ /** @type {CustomSearchResult[]} */
89
+ let myCachedResults = null;
90
+
91
+ /** @type {SearchAdapter<CustomSearchResult>} */
92
+ const searchDocsCustom = new SearchAdapter({
93
+ textfield,
94
+ list,
95
+ searchOnFocus: false,
96
+ dropdown: true,
97
+ textFilter: 'startsWith',
98
+ suggestionMethod: 'append',
99
+ performSearch(input, resolve) {
100
+ // Use precached results
101
+ if (myCachedResults != null) {
102
+ resolve(myCachedResults);
103
+ return;
104
+ }
105
+
106
+ // Display a busy indicator
107
+ showElement(busyIndicator);
108
+
109
+ // Add results to a cached search adapter
110
+ myCachedResults = performFakeSearch();
111
+
112
+ // Let busy indicator spin to illustrate loading
113
+ setTimeout(() => {
114
+ // Send back the search results
115
+ resolve(myCachedResults);
116
+ }, 2000);
117
+ },
118
+ updateList(searchResults, resolve) {
119
+ // SearchAdapter signaling the UI is ready to update with search results
120
+
121
+ if (customListAdapter.datasource === searchResults) {
122
+ // Search results have already been mapped. Nothing to do.
123
+ // SearchAdapter handles item filtering.
124
+ resolve();
125
+ return;
126
+ }
127
+
128
+ // Directly assign search results as ListAdapter's data source
129
+ customListAdapter.datasource = searchResults;
130
+
131
+ // Remove busy indicator
132
+ hideElement(busyIndicator);
133
+
134
+ // Tell ListAdapter to perform a full refresh
135
+ customListAdapter.refresh();
136
+ resolve();
137
+ },
138
+ });
139
+
140
+ searchDocsCustom.list.addEventListener(ListContent.ACTIVATE_EVENT, (event) => {
141
+ /** @type {HTMLElement} */
142
+ const listContentElement = (event.target);
143
+ /** @type {HTMLLIElement} */
144
+ const listItemElement = (listContentElement.parentElement);
145
+ const selectedItem = customListAdapter.elementDataMap.get(listItemElement);
146
+ const text = `${selectedItem.line1}:${selectedItem.line2}`;
147
+ document.getElementById('search-result-custom1').textContent = text;
148
+ });
149
+ }
150
+
151
+ /** @return {void} */
152
+ function buildCustomSearch2() {
153
+ const textfield = document.getElementById('search-textfield-custom2');
154
+ const list = document.getElementById('search-list-custom2');
155
+ /** @type {HTMLElement} */
156
+ const busyIndicator = (textfield.getElementsByClassName('custom-busy-indicator')[0]);
157
+ /** @type {HTMLElement} */
158
+ const noResultsIndicator = (textfield.getElementsByClassName('custom-no-results-indicator')[0]);
159
+
160
+ /** @type {ListAdapter<CustomSearchResult>} */
161
+ const customListAdapter = new ListAdapter({
162
+ element: list,
163
+ datasource: [],
164
+ render: searchResultRenderer,
165
+ });
166
+
167
+ // For purpose of this query is "searched" every time with no cache.
168
+ // SearchAdapter performs no filter
169
+
170
+ /** @type {SearchAdapter<CustomSearchResult>} */
171
+ const searchDocsCustom = new SearchAdapter({
172
+ textfield,
173
+ list,
174
+ debounce: 300,
175
+ dropdown: true,
176
+ filterItems: false,
177
+ performSearch(searchTerm, resolve) {
178
+ // Clear ListAdapter
179
+ customListAdapter.clear();
180
+
181
+ showElement(busyIndicator);
182
+ hideElement(noResultsIndicator);
183
+
184
+ const myData = performFakeSearch(searchTerm);
185
+ setTimeout(() => {
186
+ // Spin for 1000ms
187
+ resolve(myData);
188
+ }, 1000);
189
+ },
190
+ updateList(items, resolve) {
191
+ hideElement(busyIndicator);
192
+
193
+ if (!items.length) {
194
+ showElement(noResultsIndicator);
195
+ resolve();
196
+ return;
197
+ }
198
+
199
+ // Assign results to ListAdapter
200
+ customListAdapter.datasource = items;
201
+ customListAdapter.refresh();
202
+
203
+ resolve();
204
+ },
205
+ });
206
+ searchDocsCustom.list.addEventListener(ListContent.ACTIVATE_EVENT, (event) => {
207
+ /** @type {HTMLElement} */
208
+ const listContentElement = (event.target);
209
+ /** @type {HTMLLIElement} */
210
+ const listItemElement = (listContentElement.parentElement);
211
+ const selectedItem = customListAdapter.elementDataMap.get(listItemElement);
212
+ const text = `${selectedItem.line1}:${selectedItem.line2}`;
213
+ document.getElementById('search-result-custom2').textContent = text;
214
+ });
215
+ }
216
+
217
+ /** @return {void} */
218
+ function setupSearches() {
219
+ if (!searchDocsSimple) {
220
+ searchDocsSimple = new SearchAdapter({
221
+ textfield: document.getElementById('search-textfield-simple'),
222
+ list: document.getElementById('search-list-simple'),
223
+ });
224
+ }
225
+ if (!searchDocsMultiline) {
226
+ searchDocsMultiline = new SearchAdapter({
227
+ textfield: document.getElementById('search-textfield-multiline'),
228
+ list: document.getElementById('search-list-multiline'),
229
+ suggestionMethod: 'none',
230
+ });
231
+ }
232
+
233
+ buildCustomSearch1();
234
+ buildCustomSearch2();
235
+ }
236
+
237
+ /** @return {void} */
238
+ function initializeMdwComponents() {
239
+ iterateArrayLike(document.querySelectorAll('.js .mdw-textfield'), TextField.attach);
240
+ }
241
+
242
+ initializeMdwComponents();
243
+ setupSearches();
@@ -0,0 +1,165 @@
1
+ include ../_mixins.pug
2
+
3
+ +header("search")
4
+ .comparison.js
5
+ .render
6
+ .display-flex(style="padding:8px")
7
+ .flex-1.display-flex(flex-column)
8
+ p Text field dropdown with:
9
+ ul
10
+ li one-time search on first input
11
+ li startsWith text filter
12
+ li append input on selection
13
+ div
14
+ label.mdw-textfield#search-textfield-custom1.mdw-theme(mdw-ink="secondary")
15
+ input.mdw-textfield__input(placeholder=" ")
16
+ .mdw-textfield__border
17
+ .mdw-textfield__outline-gap
18
+ .mdw-textfield__label Property
19
+ .mdw-textfield__dropdown.mdw-theme(mdw-surface="card" mdw-type="list" mdw-hide)
20
+ .custom-busy-indicator.display-flex(flex-align-items="center")
21
+ .mdw-progress-circle
22
+ svg(viewBox="0 0 24 24")
23
+ path(d="M12 3.25A8.75 8.75 0 1 1 3.25 12")
24
+ path(d="M12 3.25A8.75 8.75 0 1 1 3.25 12 A 8.75 8.75 0 0 1 12 3.25")
25
+ span Searching...
26
+ .mdw-list#search-list-custom1
27
+ p Current Selection:
28
+ span#search-result-custom1
29
+ p Text field dropdown with:
30
+ ul
31
+ li input-based search
32
+ li 300ms debounce
33
+ li replace input on selection
34
+ li disabled item filter
35
+ div
36
+ label.mdw-textfield#search-textfield-custom2.mdw-theme(mdw-ink="primary" mdw-outlined)
37
+ input.mdw-textfield__input(placeholder=" ")
38
+ .mdw-textfield__border
39
+ .mdw-textfield__outline-gap
40
+ .mdw-textfield__label Property
41
+ .mdw-textfield__dropdown.mdw-theme(mdw-surface="card" mdw-type="list" mdw-hide)
42
+ .custom-busy-indicator.display-flex(flex-align-items="center")
43
+ .mdw-progress-circle
44
+ svg(viewBox="0 0 24 24")
45
+ path(d="M12 3.25A8.75 8.75 0 1 1 3.25 12")
46
+ path(d="M12 3.25A8.75 8.75 0 1 1 3.25 12 A 8.75 8.75 0 0 1 12 3.25")
47
+ span Searching...
48
+ .custom-no-results-indicator.display-flex(flex-align-items="center" style="display:none")
49
+ span No results found.
50
+ .mdw-list#search-list-custom2
51
+ p Current Selection:
52
+ span#search-result-custom2
53
+ .comparison.js
54
+ .render
55
+ +androidstatusbar('primary 700', 'dark')
56
+ .mdw-appbar.mdw-theme(mdw-surface="primary 500" mdw-dark)
57
+ .mdw-appbar__action
58
+ .mdw-appbar__start
59
+ +mdwButton({ icon:true }).material-icons arrow_back
60
+ .mdw-appbar__title(mdw-custom)
61
+ .mdw-textfield#search-textfield-simple.mdw-theme(mdw-solo mdw-ink="secondary")
62
+ input.mdw-textfield__input(placeholder="Search")
63
+ .mdw-appbar__end
64
+ +mdwButton({ icon:true }).material-icons clear
65
+ .content
66
+ ul.mdw-list#search-list-simple
67
+ li.mdw-list__item
68
+ a.mdw-list__content Attractions
69
+ li.mdw-list__item
70
+ a.mdw-list__content Dining
71
+ li.mdw-list__item
72
+ a.mdw-list__content Education
73
+ li.mdw-list__item
74
+ a.mdw-list__content Family
75
+ li.mdw-list__item
76
+ a.mdw-list__content Health
77
+ li.mdw-list__item
78
+ a.mdw-list__content Office
79
+ li.mdw-list__item
80
+ a.mdw-list__content Promotions
81
+ li.mdw-list__item
82
+ a.mdw-list__content Radio
83
+ li.mdw-list__item
84
+ a.mdw-list__content Recipes
85
+ li.mdw-list__item
86
+ a.mdw-list__content Sports
87
+ li.mdw-list__item
88
+ a.mdw-list__content Travel
89
+ +androidnavbar
90
+
91
+ .comparison.js
92
+ .render
93
+ +androidstatusbar('primary 700', 'dark')
94
+ .mdw-appbar.mdw-theme(mdw-surface="primary 500" mdw-dark)
95
+ .mdw-appbar__action
96
+ .mdw-appbar__start
97
+ +mdwButton({ icon:true }).material-icons arrow_back
98
+ .mdw-appbar__title(mdw-custom)
99
+ .mdw-textfield#search-textfield-multiline.mdw-theme(mdw-solo mdw-ink="secondary")
100
+ input.mdw-textfield__input(placeholder="Search")
101
+ .mdw-appbar__end
102
+ +mdwButton({ icon:true}).material-icons clear
103
+ .content
104
+ ul.mdw-list#search-list-multiline
105
+ li.mdw-list__subheader.mdw-theme(mdw-ink="medium") Today
106
+ li.mdw-list__item
107
+ .mdw-list__content.mdw-overlay.mdw-ripple
108
+ .mdw-list__avatar
109
+ i.material-icons(style="font-size:40px") &#xE853;
110
+ .mdw-list__text
111
+ .mdw-list__text-line Brunch this weekend?
112
+ .mdw-list__text-block Ali Connors
113
+ span.mdw-theme(mdw-ink="medium") &mdash; I'll be in your neighborhood doing errands this weekend. Do you want to meet?
114
+ li.mdw-list__item
115
+ .mdw-list__content
116
+ .mdw-list__avatar
117
+ i.material-icons(style="font-size:40px") &#xE853;
118
+ .mdw-list__text
119
+ .mdw-list__text-line Summer BBQ
120
+ span.mdw-theme(mdw-ink="medium") 4
121
+ .mdw-list__text-block to Alex, Scott, Jennifer
122
+ span.mdw-theme(mdw-ink="medium") &mdash; Wish I could come. but I'm out of town this weekend.
123
+ li.mdw-list__item
124
+ .mdw-list__content
125
+ .mdw-list__avatar
126
+ i.material-icons(style="font-size:40px") &#xE853;
127
+ .mdw-list__text
128
+ .mdw-list__text-line Oui oui
129
+ .mdw-list__text-block Sandra Adams
130
+ span.mdw-theme(mdw-ink="medium") &mdash; Do you have Paris recommendations? Have you ever been?
131
+ li.mdw-list__item
132
+ .mdw-list__content
133
+ .mdw-list__avatar
134
+ i.material-icons(style="font-size:40px") &#xE853;
135
+ .mdw-list__text
136
+ .mdw-list__text-line Birthday gift
137
+ .mdw-list__text-block Trevor Hansen
138
+ span.mdw-theme(mdw-ink="medium") &mdash; Have any ideas about what we should get Heidi for her birthday?
139
+ li.mdw-list__item
140
+ .mdw-list__content
141
+ .mdw-list__avatar
142
+ i.material-icons(style="font-size:40px") &#xE853;
143
+ .mdw-list__text
144
+ .mdw-list__text-line Recipe to try
145
+ .mdw-list__text-block Britta Holt
146
+ span.mdw-theme(mdw-ink="medium") &mdash; We should eat this: Grated Squash, Corn, and tomatillo Tacos J
147
+ li.mdw-list__item
148
+ .mdw-list__content
149
+ .mdw-list__avatar
150
+ i.material-icons(style="font-size:40px") &#xE853;
151
+ .mdw-list__text
152
+ .mdw-list__text-line Giants game
153
+ .mdw-list__text-block David Park
154
+ span.mdw-theme(mdw-ink="medium") &mdash; Any interest in seeing
155
+ li.mdw-list__item
156
+ .mdw-list__content
157
+ .mdw-list__avatar
158
+ i.material-icons(style="font-size:40px") &#xE853;
159
+ .mdw-list__text
160
+ .mdw-list__text-line Montauk weekend
161
+ .mdw-list__text-block -----
162
+ +androidnavbar
163
+
164
+
165
+ script(src='search.min.js')