@gogocat/data-bind 1.11.0 → 2.0.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 (274) hide show
  1. package/.editorconfig +14 -14
  2. package/.vscode/launch.json +12 -12
  3. package/CONFIGURATION.md +294 -0
  4. package/REACTIVE_MODE.md +553 -0
  5. package/README.md +266 -829
  6. package/babel.config.json +30 -0
  7. package/dist/js/_escape.d.ts +14 -0
  8. package/dist/js/_escape.d.ts.map +1 -0
  9. package/dist/js/applyBinding.d.ts +11 -0
  10. package/dist/js/applyBinding.d.ts.map +1 -0
  11. package/dist/js/attrBinding.d.ts +12 -0
  12. package/dist/js/attrBinding.d.ts.map +1 -0
  13. package/dist/js/binder.d.ts +67 -0
  14. package/dist/js/binder.d.ts.map +1 -0
  15. package/dist/js/changeBinding.d.ts +19 -0
  16. package/dist/js/changeBinding.d.ts.map +1 -0
  17. package/dist/js/commentWrapper.d.ts +39 -0
  18. package/dist/js/commentWrapper.d.ts.map +1 -0
  19. package/dist/js/config.d.ts +55 -0
  20. package/dist/js/config.d.ts.map +1 -0
  21. package/dist/js/createBindingOption.d.ts +32 -0
  22. package/dist/js/createBindingOption.d.ts.map +1 -0
  23. package/dist/js/createEventBinding.d.ts +10 -0
  24. package/dist/js/createEventBinding.d.ts.map +1 -0
  25. package/dist/js/cssBinding.d.ts +15 -0
  26. package/dist/js/cssBinding.d.ts.map +1 -0
  27. package/dist/js/dataBind.js +2772 -2519
  28. package/dist/js/dataBind.min.js +8 -1
  29. package/dist/js/dataBind.min.js.map +1 -1
  30. package/dist/js/domWalker.d.ts +9 -0
  31. package/dist/js/domWalker.d.ts.map +1 -0
  32. package/dist/js/forOfBinding.d.ts +12 -0
  33. package/dist/js/forOfBinding.d.ts.map +1 -0
  34. package/dist/js/hoverBinding.d.ts +13 -0
  35. package/dist/js/hoverBinding.d.ts.map +1 -0
  36. package/dist/js/ifBinding.d.ts +12 -0
  37. package/dist/js/ifBinding.d.ts.map +1 -0
  38. package/dist/js/index.d.ts +10 -0
  39. package/dist/js/index.d.ts.map +1 -0
  40. package/dist/js/modelBinding.d.ts +12 -0
  41. package/dist/js/modelBinding.d.ts.map +1 -0
  42. package/dist/js/postProcess.d.ts +3 -0
  43. package/dist/js/postProcess.d.ts.map +1 -0
  44. package/dist/js/pubSub.d.ts +11 -0
  45. package/dist/js/pubSub.d.ts.map +1 -0
  46. package/dist/js/reactiveProxy.d.ts +28 -0
  47. package/dist/js/reactiveProxy.d.ts.map +1 -0
  48. package/dist/js/renderForOfBinding.d.ts +8 -0
  49. package/dist/js/renderForOfBinding.d.ts.map +1 -0
  50. package/dist/js/renderIfBinding.d.ts +22 -0
  51. package/dist/js/renderIfBinding.d.ts.map +1 -0
  52. package/dist/js/renderIteration.d.ts +16 -0
  53. package/dist/js/renderIteration.d.ts.map +1 -0
  54. package/dist/js/renderTemplate.d.ts +14 -0
  55. package/dist/js/renderTemplate.d.ts.map +1 -0
  56. package/dist/js/renderTemplatesBinding.d.ts +19 -0
  57. package/dist/js/renderTemplatesBinding.d.ts.map +1 -0
  58. package/dist/js/showBinding.d.ts +13 -0
  59. package/dist/js/showBinding.d.ts.map +1 -0
  60. package/dist/js/switchBinding.d.ts +13 -0
  61. package/dist/js/switchBinding.d.ts.map +1 -0
  62. package/dist/js/textBinding.d.ts +13 -0
  63. package/dist/js/textBinding.d.ts.map +1 -0
  64. package/dist/js/types/_escape.d.ts +14 -0
  65. package/dist/js/types/_escape.d.ts.map +1 -0
  66. package/dist/js/types/applyBinding.d.ts +11 -0
  67. package/dist/js/types/applyBinding.d.ts.map +1 -0
  68. package/dist/js/types/attrBinding.d.ts +12 -0
  69. package/dist/js/types/attrBinding.d.ts.map +1 -0
  70. package/dist/js/types/binder.d.ts +67 -0
  71. package/dist/js/types/binder.d.ts.map +1 -0
  72. package/dist/js/types/changeBinding.d.ts +19 -0
  73. package/dist/js/types/changeBinding.d.ts.map +1 -0
  74. package/dist/js/types/commentWrapper.d.ts +39 -0
  75. package/dist/js/types/commentWrapper.d.ts.map +1 -0
  76. package/dist/js/types/config.d.ts +55 -0
  77. package/dist/js/types/config.d.ts.map +1 -0
  78. package/dist/js/types/createBindingOption.d.ts +32 -0
  79. package/dist/js/types/createBindingOption.d.ts.map +1 -0
  80. package/dist/js/types/createEventBinding.d.ts +10 -0
  81. package/dist/js/types/createEventBinding.d.ts.map +1 -0
  82. package/dist/js/types/cssBinding.d.ts +15 -0
  83. package/dist/js/types/cssBinding.d.ts.map +1 -0
  84. package/dist/js/types/domWalker.d.ts +9 -0
  85. package/dist/js/types/domWalker.d.ts.map +1 -0
  86. package/dist/js/types/forOfBinding.d.ts +12 -0
  87. package/dist/js/types/forOfBinding.d.ts.map +1 -0
  88. package/dist/js/types/hoverBinding.d.ts +13 -0
  89. package/dist/js/types/hoverBinding.d.ts.map +1 -0
  90. package/dist/js/types/ifBinding.d.ts +12 -0
  91. package/dist/js/types/ifBinding.d.ts.map +1 -0
  92. package/dist/js/types/index.d.ts +10 -0
  93. package/dist/js/types/index.d.ts.map +1 -0
  94. package/dist/js/types/modelBinding.d.ts +12 -0
  95. package/dist/js/types/modelBinding.d.ts.map +1 -0
  96. package/dist/js/types/postProcess.d.ts +3 -0
  97. package/dist/js/types/postProcess.d.ts.map +1 -0
  98. package/dist/js/types/pubSub.d.ts +11 -0
  99. package/dist/js/types/pubSub.d.ts.map +1 -0
  100. package/dist/js/types/reactiveProxy.d.ts +28 -0
  101. package/dist/js/types/reactiveProxy.d.ts.map +1 -0
  102. package/dist/js/types/renderForOfBinding.d.ts +8 -0
  103. package/dist/js/types/renderForOfBinding.d.ts.map +1 -0
  104. package/dist/js/types/renderIfBinding.d.ts +22 -0
  105. package/dist/js/types/renderIfBinding.d.ts.map +1 -0
  106. package/dist/js/types/renderIteration.d.ts +16 -0
  107. package/dist/js/types/renderIteration.d.ts.map +1 -0
  108. package/dist/js/types/renderTemplate.d.ts +14 -0
  109. package/dist/js/types/renderTemplate.d.ts.map +1 -0
  110. package/dist/js/types/renderTemplatesBinding.d.ts +19 -0
  111. package/dist/js/types/renderTemplatesBinding.d.ts.map +1 -0
  112. package/dist/js/types/showBinding.d.ts +13 -0
  113. package/dist/js/types/showBinding.d.ts.map +1 -0
  114. package/dist/js/types/switchBinding.d.ts +13 -0
  115. package/dist/js/types/switchBinding.d.ts.map +1 -0
  116. package/dist/js/types/textBinding.d.ts +13 -0
  117. package/dist/js/types/textBinding.d.ts.map +1 -0
  118. package/dist/js/types/types.d.ts +111 -0
  119. package/dist/js/types/types.d.ts.map +1 -0
  120. package/dist/js/types/util.d.ts +119 -0
  121. package/dist/js/types/util.d.ts.map +1 -0
  122. package/dist/js/types.d.ts +111 -0
  123. package/dist/js/types.d.ts.map +1 -0
  124. package/dist/js/util.d.ts +119 -0
  125. package/dist/js/util.d.ts.map +1 -0
  126. package/eslint.config.js +124 -0
  127. package/examples/DBMONSTER_COMPARISON.md +123 -0
  128. package/examples/afterRenderDemo.html +119 -0
  129. package/examples/bootstrap/css/animate.css +1579 -1579
  130. package/examples/bootstrap/css/bootstrap.min.css +6 -6
  131. package/examples/bootstrap/css/homeservices.css +378 -390
  132. package/examples/bootstrap/css/open-iconic.css +511 -511
  133. package/examples/bootstrap/fonts/open-iconic.svg +543 -543
  134. package/examples/bootstrap/js/compMessageDialog.js +20 -19
  135. package/examples/bootstrap/js/compSearchBar.js +12 -19
  136. package/examples/bootstrap/js/compSearchResults.js +50 -46
  137. package/examples/bootstrap/js/featureAdsResult.json +65 -65
  138. package/examples/bootstrap/js/searchResult.json +57 -57
  139. package/examples/bootstrap.html +343 -332
  140. package/examples/css/baseTodo.css +141 -141
  141. package/examples/css/dbMonsterStyles.css +27 -27
  142. package/examples/css/indexTodo.css +374 -374
  143. package/examples/dbmonsterForOfReactive.html +40 -0
  144. package/examples/dbmonsterReact.html +19 -0
  145. package/examples/forOfBindingSimpleDebug.html +45 -0
  146. package/examples/form.html +20 -4
  147. package/examples/globalConfig.html +131 -0
  148. package/examples/js/afterRenderDemo.js +190 -0
  149. package/examples/js/appTodo.js +46 -46
  150. package/examples/js/attrBindingDemo.js +2 -2
  151. package/examples/js/dbMonApp.js +24 -26
  152. package/examples/js/dbMonAppReact.jsx +79 -0
  153. package/examples/js/dbMonAppReactive.js +28 -0
  154. package/examples/js/fiberDemo.js +4 -4
  155. package/examples/js/filtersDemo.js +8 -8
  156. package/examples/js/forOfDemo.js +7 -9
  157. package/examples/js/forOfDemoComplex.js +44 -17
  158. package/examples/js/form.js +44 -12
  159. package/examples/js/globalConfig.js +117 -0
  160. package/examples/js/ifBindingDemo.js +16 -16
  161. package/examples/js/reactiveDemo.js +119 -0
  162. package/examples/js/switchBindingDemo.js +8 -8
  163. package/examples/react-dbmonster/dist/bundle.js +43 -0
  164. package/examples/react-dbmonster/package-lock.json +537 -0
  165. package/examples/react-dbmonster/package.json +16 -0
  166. package/examples/react-dbmonster/src/index.jsx +80 -0
  167. package/examples/reactiveDemo.html +127 -0
  168. package/examples/refreshRateTest.html +75 -75
  169. package/index.html +841 -0
  170. package/package.json +31 -34
  171. package/rollup.config.js +79 -36
  172. package/src/{_escape.js → _escape.ts} +19 -17
  173. package/src/applyBinding.ts +179 -0
  174. package/src/{attrBinding.js → attrBinding.ts} +14 -13
  175. package/src/binder.ts +289 -0
  176. package/src/changeBinding.ts +93 -0
  177. package/src/{commentWrapper.js → commentWrapper.ts} +33 -30
  178. package/src/config.ts +107 -0
  179. package/src/createBindingOption.ts +91 -0
  180. package/src/createEventBinding.ts +88 -0
  181. package/src/{cssBinding.js → cssBinding.ts} +13 -11
  182. package/src/{domWalker.js → domWalker.ts} +44 -30
  183. package/src/{forOfBinding.js → forOfBinding.ts} +4 -3
  184. package/src/hoverBinding.ts +84 -0
  185. package/src/{ifBinding.js → ifBinding.ts} +14 -12
  186. package/src/index.ts +53 -0
  187. package/src/{modelBinding.js → modelBinding.ts} +11 -9
  188. package/src/postProcess.ts +22 -0
  189. package/src/{pubSub.js → pubSub.ts} +24 -15
  190. package/src/reactiveProxy.ts +285 -0
  191. package/src/{renderForOfBinding.js → renderForOfBinding.ts} +55 -33
  192. package/src/{renderIfBinding.js → renderIfBinding.ts} +45 -20
  193. package/src/renderIteration.ts +53 -0
  194. package/src/renderTemplate.ts +165 -0
  195. package/src/renderTemplatesBinding.ts +73 -0
  196. package/src/{showBinding.js → showBinding.ts} +4 -3
  197. package/src/{switchBinding.js → switchBinding.ts} +18 -15
  198. package/src/{textBinding.js → textBinding.ts} +5 -4
  199. package/src/types.ts +124 -0
  200. package/src/util.ts +810 -0
  201. package/test/css/reporter.css +9 -9
  202. package/test/fixtures/dataBindBootstrap.html +2 -2
  203. package/test/fixtures/formBindings.html +9 -1
  204. package/test/globals.d.ts +19 -0
  205. package/test/helpers/testHelper.js +46 -11
  206. package/test/mocks/featureAdsResult.json +65 -65
  207. package/test/mocks/searchResult.json +57 -57
  208. package/test/specs/{attrBinding.spec.js → attrBinding.spec.ts} +103 -106
  209. package/test/specs/{binder.spec.js → binder.spec.ts} +29 -27
  210. package/test/specs/blurBinding.spec.ts +60 -0
  211. package/test/specs/chainableUse.spec.ts +125 -0
  212. package/test/specs/clickBinding.spec.ts +194 -0
  213. package/test/specs/{cssBinding.spec.js → cssBinding.spec.ts} +72 -79
  214. package/test/specs/{dataBindBootstrap.spec.js → dataBindBootstrap.spec.ts} +332 -313
  215. package/test/specs/{filter.spec.js → filter.spec.ts} +75 -76
  216. package/test/specs/{forOfBinding.spec.js → forOfBinding.spec.ts} +208 -219
  217. package/test/specs/formBinding.spec.ts +272 -0
  218. package/test/specs/ifBinding.spec.ts +165 -0
  219. package/test/specs/{nestedComponent.spec.js → nestedComponent.spec.ts} +88 -88
  220. package/test/specs/reactiveProxy.spec.ts +465 -0
  221. package/test/specs/{showBinding.spec.js → showBinding.spec.ts} +148 -149
  222. package/test/specs/{switchBinding.spec.js → switchBinding.spec.ts} +172 -173
  223. package/test/specs/templateBinding.spec.ts +273 -0
  224. package/test/specs/{textBinding.spec.js → textBinding.spec.ts} +47 -48
  225. package/test/tsconfig.json +31 -0
  226. package/test-output.txt +200 -0
  227. package/test-reactive.html +224 -0
  228. package/tsconfig.json +28 -0
  229. package/vendors/lodash.custom.js +4577 -4577
  230. package/vendors/lodash.custom.min.js +45 -45
  231. package/vitest.config.js +27 -0
  232. package/.eslintrc.js +0 -1
  233. package/.grunt/grunt-contrib-jasmine/boot.js +0 -161
  234. package/.grunt/grunt-contrib-jasmine/dist/js/dataBind.js +0 -9
  235. package/.grunt/grunt-contrib-jasmine/grunt-template-jasmine-istanbul/reporter.js +0 -23
  236. package/.grunt/grunt-contrib-jasmine/jasmine-html.js +0 -853
  237. package/.grunt/grunt-contrib-jasmine/jasmine.css +0 -271
  238. package/.grunt/grunt-contrib-jasmine/jasmine.js +0 -9761
  239. package/.grunt/grunt-contrib-jasmine/jasmine_favicon.png +0 -0
  240. package/.grunt/grunt-contrib-jasmine/json2.js +0 -489
  241. package/.grunt/grunt-contrib-jasmine/reporter.js +0 -107
  242. package/coverage/coverage.json +0 -1
  243. package/coverage/lcov/lcov-report/base.css +0 -213
  244. package/coverage/lcov/lcov-report/index.html +0 -93
  245. package/coverage/lcov/lcov-report/js/dataBind.js.html +0 -6596
  246. package/coverage/lcov/lcov-report/js/index.html +0 -93
  247. package/coverage/lcov/lcov-report/prettify.css +0 -1
  248. package/coverage/lcov/lcov-report/prettify.js +0 -1
  249. package/coverage/lcov/lcov-report/sort-arrow-sprite.png +0 -0
  250. package/coverage/lcov/lcov-report/sorter.js +0 -158
  251. package/coverage/lcov/lcov.info +0 -1991
  252. package/eslintrc.json +0 -40
  253. package/examples/bootstrap/js/bootstrap.min.js +0 -6
  254. package/examples/bootstrap/js/popper.min.js +0 -5
  255. package/examples/bootstrap/js/searchSuggestion.js +0 -58
  256. package/examples/bootstrap/js/typeahead.jquery.js +0 -1538
  257. package/gruntfile.js +0 -92
  258. package/gulpfile.js +0 -32
  259. package/src/binder.js +0 -422
  260. package/src/changeBinding.js +0 -57
  261. package/src/config.js +0 -65
  262. package/src/createBindingOption.js +0 -66
  263. package/src/createEventBinding.js +0 -46
  264. package/src/eventSystem.js +0 -46
  265. package/src/hoverBinding.js +0 -57
  266. package/src/index.js +0 -26
  267. package/src/renderTemplate.js +0 -128
  268. package/src/util.js +0 -648
  269. package/test/specs/blurBinding.spec.js +0 -57
  270. package/test/specs/formBinding.spec.js +0 -292
  271. package/test/specs/ifBinding.spec.js +0 -169
  272. package/test/specs/templateBinding.spec.js +0 -117
  273. package/vendors/jasmine-jquery.js +0 -841
  274. package/vendors/jquery-3.2.1.min.js +0 -4
@@ -5,9 +5,9 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
6
6
  <meta name="description" content="" />
7
7
  <meta name="author" content="" />
8
- <title>Bootstrap 4 dataBind Demo</title>
9
- <!-- Bootstrap core CSS -->
10
- <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
8
+ <title>Bootstrap 5 dataBind Demo</title>
9
+ <!-- Bootstrap 5 CSS -->
10
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
11
11
  <link rel="stylesheet" href="bootstrap/css/open-iconic.css" />
12
12
  <link rel="stylesheet" href="bootstrap/css/homeservices.css" />
13
13
  </head>
@@ -18,8 +18,8 @@
18
18
  <button
19
19
  class="navbar-toggler"
20
20
  type="button"
21
- data-toggle="collapse"
22
- data-target="#navbarsExampleDefault"
21
+ data-bs-toggle="collapse"
22
+ data-bs-target="#navbarsExampleDefault"
23
23
  aria-controls="navbarsExampleDefault"
24
24
  aria-expanded="false"
25
25
  aria-label="Toggle navigation"
@@ -28,11 +28,11 @@
28
28
  </button>
29
29
 
30
30
  <div class="collapse navbar-collapse" id="navbarsExampleDefault">
31
- <ul class="navbar-nav mr-auto">
31
+ <ul class="navbar-nav me-auto">
32
32
  <li class="nav-item active">
33
33
  <a class="nav-link" href="#"
34
34
  >Home
35
- <span class="sr-only">(current)</span>
35
+ <span class="visually-hidden">(current)</span>
36
36
  </a>
37
37
  </li>
38
38
  <li class="nav-item">
@@ -46,16 +46,16 @@
46
46
  class="nav-link dropdown-toggle"
47
47
  href="http://example.com"
48
48
  id="dropdown01"
49
- data-toggle="dropdown"
49
+ data-bs-toggle="dropdown"
50
50
  aria-haspopup="true"
51
51
  aria-expanded="false"
52
52
  >Dropdown</a
53
53
  >
54
- <div class="dropdown-menu" aria-labelledby="dropdown01">
55
- <a class="dropdown-item" href="#">Action</a>
56
- <a class="dropdown-item" href="#">Another action</a>
57
- <a class="dropdown-item" href="#">Something else here</a>
58
- </div>
54
+ <ul class="dropdown-menu" aria-labelledby="dropdown01">
55
+ <li><a class="dropdown-item" href="#">Action</a></li>
56
+ <li><a class="dropdown-item" href="#">Another action</a></li>
57
+ <li><a class="dropdown-item" href="#">Something else here</a></li>
58
+ </ul>
59
59
  </li>
60
60
  </ul>
61
61
  </div>
@@ -74,8 +74,8 @@
74
74
  <div class="search-bar" data-bind-comp="search-bar" data-server-rendered>
75
75
  <div class="container">
76
76
  <form id="search-form" data-bind-submit="onSearchSubmit">
77
- <div class="form-row">
78
- <div class="col-8" id="scrollable-dropdown-menu">
77
+ <div class="row g-2">
78
+ <div class="col-12 col-md-7 position-relative" id="scrollable-dropdown-menu">
79
79
  <input
80
80
  id="searchWord"
81
81
  name="searchWord"
@@ -91,26 +91,28 @@
91
91
  >
92
92
  <span class="search-bar__focus-bar"></span>
93
93
  </div>
94
- <div class="col-3 input-group">
95
- <span class="oi search-bar__map-marker" data-glyph="map-marker"></span>
96
- <input
97
- id="location"
98
- name="location"
99
- type="text"
100
- class="form-control"
101
- data-bind-model="searchLocation"
102
- data-bind-change="onSearchLocationChange"
103
- placeholder="Location"
104
- value="Sydney"
105
- aria-label="Location"
106
- />
94
+ <div class="col-8 col-md-3 position-relative">
95
+ <div class="d-flex">
96
+ <span class="oi search-bar__map-marker" data-glyph="map-marker"></span>
97
+ <input
98
+ id="location"
99
+ name="location"
100
+ type="text"
101
+ class="form-control"
102
+ data-bind-model="searchLocation"
103
+ data-bind-change="onSearchLocationChange"
104
+ placeholder="Location"
105
+ value="Sydney"
106
+ aria-label="Location"
107
+ />
108
+ </div>
107
109
  <span class="search-bar__focus-bar"></span>
108
110
  </div>
109
- <div class="col">
111
+ <div class="col-4 col-md-2">
110
112
  <button class="btn btn-success search-bar__btn" type="submit">
111
113
  <span class="spinner spinner--search" data-bind-show="searching"></span>
112
114
  <span data-bind-show="!searching">
113
- <span class="sr-only">Search</span>
115
+ <span class="visually-hidden">Search</span>
114
116
  <span class="oi" data-glyph="magnifying-glass" aria-hidden="true"></span>
115
117
  </span>
116
118
  </button>
@@ -127,315 +129,331 @@
127
129
 
128
130
  <div
129
131
  id="search-result-columns"
130
- class="card-columns"
132
+ class="row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 g-3"
131
133
  data-bind-tmp="{id: 'searchResultItem', data: '$root', append: true}"
132
134
  >
133
- <div class="card result-item" data-index="0">
134
- <img class="card-img-top result-item__img" src="bootstrap/images/pic-home.jpg" alt="Card image" />
135
- <div class="card-body">
136
- <h4 class="card-title">Card title that wraps to a new line</h4>
137
- <p class="card-text">
138
- This is a longer card with supporting text below as a natural lead-in to additional content.
139
- This content is a little bit longer.
140
- </p>
141
- </div>
142
- <div class="card-footer result-item__footer">
143
- <div class="result-item__icon-checkbox-wrap">
144
- <input
145
- class="result-item__icon result-item__icon-checkbox"
146
- type="checkbox"
147
- id="adid0"
148
- name="adid0"
135
+ <div class="col">
136
+ <div class="card result-item h-100" data-index="0">
137
+ <img class="card-img-top result-item__img" src="bootstrap/images/pic-home.jpg" alt="Card image" />
138
+ <div class="card-body">
139
+ <h4 class="card-title">Card title that wraps to a new line</h4>
140
+ <p class="card-text">
141
+ This is a longer card with supporting text below as a natural lead-in to additional content.
142
+ This content is a little bit longer.
143
+ </p>
144
+ </div>
145
+ <div class="card-footer result-item__footer">
146
+ <div class="result-item__icon-checkbox-wrap">
147
+ <input
148
+ class="result-item__icon result-item__icon-checkbox"
149
+ type="checkbox"
150
+ id="adid0"
151
+ name="adid0"
152
+ data-index="0"
153
+ data-bind-model="searchResults[0].selected"
154
+ data-bind-change="onAdMessageCheck"
155
+ />
156
+ <label
157
+ for="adid0"
158
+ class="oi result-item__icon-checkbox-label"
159
+ data-glyph="task"
160
+ aria-label="Message this seller"
161
+ ></label>
162
+ </div>
163
+ <span
164
+ class="oi result-item__icon"
165
+ data-glyph="bookmark"
166
+ data-bind-css="searchResults[0].bookmarkedCss"
167
+ data-bind-click="onAdBookmarkClick"
149
168
  data-index="0"
150
- data-bind-model="searchResults[0].selected"
151
- data-bind-change="onAdMessageCheck"
152
- />
153
- <label
154
- for="adid0"
155
- class="oi result-item__icon-checkbox-label"
156
- data-glyph="task"
157
- aria-label="Message this seller"
158
- ></label>
169
+ ></span>
170
+ <span class="oi result-item__icon" data-glyph="thumb-up">99</span>
159
171
  </div>
160
- <span
161
- class="oi result-item__icon"
162
- data-glyph="bookmark"
163
- data-bind-css="searchResults[0].bookmarkedCss"
164
- data-bind-click="onAdBookmarkClick"
165
- data-index="0"
166
- ></span>
167
- <span class="oi result-item__icon" data-glyph="thumb-up">99</span>
168
172
  </div>
169
173
  </div>
170
174
 
171
- <div class="card result-item" data-index="1">
172
- <div class="card-body">
173
- <h4 class="card-title">Card title</h4>
174
- <p class="card-text">
175
- This is a wider card with supporting text below as a natural lead-in to additional content.
176
- This card has even longer content than the first to show that equal height action.
177
- </p>
178
- </div>
179
- <div class="card-footer result-item__footer">
180
- <div class="result-item__icon-checkbox-wrap">
181
- <input
182
- class="result-item__icon result-item__icon-checkbox"
183
- type="checkbox"
184
- id="adid1"
185
- name="adid1"
175
+ <div class="col">
176
+ <div class="card result-item h-100" data-index="1">
177
+ <div class="card-body">
178
+ <h4 class="card-title">Card title</h4>
179
+ <p class="card-text">
180
+ This is a wider card with supporting text below as a natural lead-in to additional content.
181
+ This card has even longer content than the first to show that equal height action.
182
+ </p>
183
+ </div>
184
+ <div class="card-footer result-item__footer">
185
+ <div class="result-item__icon-checkbox-wrap">
186
+ <input
187
+ class="result-item__icon result-item__icon-checkbox"
188
+ type="checkbox"
189
+ id="adid1"
190
+ name="adid1"
191
+ data-index="1"
192
+ data-bind-model="searchResults[1].selected"
193
+ data-bind-change="onAdMessageCheck"
194
+ />
195
+ <label
196
+ for="adid1"
197
+ class="oi result-item__icon-checkbox-label"
198
+ data-glyph="task"
199
+ aria-label="Message this seller"
200
+ ></label>
201
+ </div>
202
+ <span
203
+ class="oi result-item__icon"
204
+ data-glyph="bookmark"
205
+ data-bind-css="searchResults[1].bookmarkedCss"
206
+ data-bind-click="onAdBookmarkClick"
186
207
  data-index="1"
187
- data-bind-model="searchResults[1].selected"
188
- data-bind-change="onAdMessageCheck"
189
- />
190
- <label
191
- for="adid1"
192
- class="oi result-item__icon-checkbox-label"
193
- data-glyph="task"
194
- aria-label="Message this seller"
195
- ></label>
208
+ ></span>
209
+ <span class="oi result-item__icon" data-glyph="thumb-up">9</span>
196
210
  </div>
197
- <span
198
- class="oi result-item__icon"
199
- data-glyph="bookmark"
200
- data-bind-css="searchResults[1].bookmarkedCss"
201
- data-bind-click="onAdBookmarkClick"
202
- data-index="1"
203
- ></span>
204
- <span class="oi result-item__icon" data-glyph="thumb-up">9</span>
205
211
  </div>
206
212
  </div>
207
213
 
208
- <div class="card result-item" data-index="2">
209
- <img class="card-img-top result-item__img" src="bootstrap/images/pic-deck.jpg" alt="Card image" />
210
- <div class="card-body">
211
- <h4 class="card-title">Card title</h4>
212
- <p class="card-text">
213
- This card has supporting text below as a natural lead-in to additional content.
214
- </p>
215
- </div>
216
- <div class="card-footer result-item__footer">
217
- <div class="result-item__icon-checkbox-wrap">
218
- <input
219
- class="result-item__icon result-item__icon-checkbox"
220
- type="checkbox"
221
- id="adid2"
222
- name="adid2"
214
+ <div class="col">
215
+ <div class="card result-item h-100" data-index="2">
216
+ <img class="card-img-top result-item__img" src="bootstrap/images/pic-deck.jpg" alt="Card image" />
217
+ <div class="card-body">
218
+ <h4 class="card-title">Card title</h4>
219
+ <p class="card-text">
220
+ This card has supporting text below as a natural lead-in to additional content.
221
+ </p>
222
+ </div>
223
+ <div class="card-footer result-item__footer">
224
+ <div class="result-item__icon-checkbox-wrap">
225
+ <input
226
+ class="result-item__icon result-item__icon-checkbox"
227
+ type="checkbox"
228
+ id="adid2"
229
+ name="adid2"
230
+ data-index="2"
231
+ data-bind-model="searchResults[2].selected"
232
+ data-bind-change="onAdMessageCheck"
233
+ />
234
+ <label
235
+ for="adid2"
236
+ class="oi result-item__icon-checkbox-label"
237
+ data-glyph="task"
238
+ aria-label="Message this seller"
239
+ ></label>
240
+ </div>
241
+ <span
242
+ class="oi result-item__icon"
243
+ data-glyph="bookmark"
244
+ data-bind-css="searchResults[2].bookmarkedCss"
245
+ data-bind-click="onAdBookmarkClick"
223
246
  data-index="2"
224
- data-bind-model="searchResults[2].selected"
225
- data-bind-change="onAdMessageCheck"
226
- />
227
- <label
228
- for="adid2"
229
- class="oi result-item__icon-checkbox-label"
230
- data-glyph="task"
231
- aria-label="Message this seller"
232
- ></label>
247
+ ></span>
248
+ <span class="oi result-item__icon" data-glyph="thumb-up">24</span>
233
249
  </div>
234
- <span
235
- class="oi result-item__icon"
236
- data-glyph="bookmark"
237
- data-bind-css="searchResults[2].bookmarkedCss"
238
- data-bind-click="onAdBookmarkClick"
239
- data-index="2"
240
- ></span>
241
- <span class="oi result-item__icon" data-glyph="thumb-up">24</span>
242
250
  </div>
243
251
  </div>
244
252
 
245
- <div class="card result-item result-item--highlight" data-index="3">
246
- <img
247
- class="card-img-top result-item__img"
248
- src="bootstrap/images/pic-carpenter.jpg"
249
- alt="Card image"
250
- />
251
- <div class="card-body">
252
- <h4 class="card-title">Card title</h4>
253
- <p class="card-text">
254
- This card has supporting text below as a natural lead-in to additional content.
255
- </p>
256
- </div>
257
- <div class="card-footer result-item__footer">
258
- <div class="result-item__icon-checkbox-wrap">
259
- <input
260
- class="result-item__icon result-item__icon-checkbox"
261
- type="checkbox"
262
- id="adid3"
263
- name="adid3"
253
+ <div class="col">
254
+ <div class="card result-item result-item--highlight h-100" data-index="3">
255
+ <img
256
+ class="card-img-top result-item__img"
257
+ src="bootstrap/images/pic-carpenter.jpg"
258
+ alt="Card image"
259
+ />
260
+ <div class="card-body">
261
+ <h4 class="card-title">Card title</h4>
262
+ <p class="card-text">
263
+ This card has supporting text below as a natural lead-in to additional content.
264
+ </p>
265
+ </div>
266
+ <div class="card-footer result-item__footer">
267
+ <div class="result-item__icon-checkbox-wrap">
268
+ <input
269
+ class="result-item__icon result-item__icon-checkbox"
270
+ type="checkbox"
271
+ id="adid3"
272
+ name="adid3"
273
+ data-index="3"
274
+ data-bind-model="searchResults[3].selected"
275
+ data-bind-change="onAdMessageCheck"
276
+ />
277
+ <label
278
+ for="adid3"
279
+ class="oi result-item__icon-checkbox-label"
280
+ data-glyph="task"
281
+ aria-label="Message this seller"
282
+ ></label>
283
+ </div>
284
+ <span
285
+ class="oi result-item__icon"
286
+ data-glyph="bookmark"
287
+ data-bind-css="searchResults[3].bookmarkedCss"
288
+ data-bind-click="onAdBookmarkClick"
264
289
  data-index="3"
265
- data-bind-model="searchResults[3].selected"
266
- data-bind-change="onAdMessageCheck"
267
- />
268
- <label
269
- for="adid3"
270
- class="oi result-item__icon-checkbox-label"
271
- data-glyph="task"
272
- aria-label="Message this seller"
273
- ></label>
290
+ ></span>
291
+ <span class="oi result-item__icon" data-glyph="thumb-up">8</span>
274
292
  </div>
275
- <span
276
- class="oi result-item__icon"
277
- data-glyph="bookmark"
278
- data-bind-css="searchResults[3].bookmarkedCss"
279
- data-bind-click="onAdBookmarkClick"
280
- data-index="3"
281
- ></span>
282
- <span class="oi result-item__icon" data-glyph="thumb-up">8</span>
283
293
  </div>
284
294
  </div>
285
295
 
286
- <div class="card result-item" data-index="4">
287
- <div class="card-body">
288
- <h4 class="card-title">Card title</h4>
289
- <p class="card-text">
290
- This card has supporting text below as a natural lead-in to additional content.
291
- </p>
292
- </div>
293
- <div class="card-footer result-item__footer">
294
- <div class="result-item__icon-checkbox-wrap">
295
- <input
296
- class="result-item__icon result-item__icon-checkbox"
297
- type="checkbox"
298
- id="adid4"
299
- name="adid4"
296
+ <div class="col">
297
+ <div class="card result-item h-100" data-index="4">
298
+ <div class="card-body">
299
+ <h4 class="card-title">Card title</h4>
300
+ <p class="card-text">
301
+ This card has supporting text below as a natural lead-in to additional content.
302
+ </p>
303
+ </div>
304
+ <div class="card-footer result-item__footer">
305
+ <div class="result-item__icon-checkbox-wrap">
306
+ <input
307
+ class="result-item__icon result-item__icon-checkbox"
308
+ type="checkbox"
309
+ id="adid4"
310
+ name="adid4"
311
+ data-index="4"
312
+ data-bind-model="searchResults[4].selected"
313
+ data-bind-change="onAdMessageCheck"
314
+ />
315
+ <label
316
+ for="adid4"
317
+ class="oi result-item__icon-checkbox-label"
318
+ data-glyph="task"
319
+ aria-label="Message this seller"
320
+ ></label>
321
+ </div>
322
+ <span
323
+ class="oi result-item__icon"
324
+ data-glyph="bookmark"
325
+ data-bind-css="searchResults[4].bookmarkedCss"
326
+ data-bind-click="onAdBookmarkClick"
300
327
  data-index="4"
301
- data-bind-model="searchResults[4].selected"
302
- data-bind-change="onAdMessageCheck"
303
- />
304
- <label
305
- for="adid4"
306
- class="oi result-item__icon-checkbox-label"
307
- data-glyph="task"
308
- aria-label="Message this seller"
309
- ></label>
328
+ ></span>
329
+ <span class="oi result-item__icon" data-glyph="thumb-up">68</span>
310
330
  </div>
311
- <span
312
- class="oi result-item__icon"
313
- data-glyph="bookmark"
314
- data-bind-css="searchResults[4].bookmarkedCss"
315
- data-bind-click="onAdBookmarkClick"
316
- data-index="4"
317
- ></span>
318
- <span class="oi result-item__icon" data-glyph="thumb-up">68</span>
319
331
  </div>
320
332
  </div>
321
333
 
322
- <div class="card result-item" data-index="5">
323
- <img
324
- class="card-img-top result-item__img"
325
- src="bootstrap/images/pic-bathrooms.jpg"
326
- alt="Card image"
327
- />
328
- <div class="card-body">
329
- <h4 class="card-title">Card title that wraps to a new line</h4>
330
- <p class="card-text">
331
- This is a longer card with supporting text below as a natural lead-in to additional content.
332
- This content is a little bit longer.
333
- </p>
334
- </div>
335
- <div class="card-footer result-item__footer">
336
- <div class="result-item__icon-checkbox-wrap">
337
- <input
338
- class="result-item__icon result-item__icon-checkbox"
339
- type="checkbox"
340
- id="adid5"
341
- name="adid5"
334
+ <div class="col">
335
+ <div class="card result-item h-100" data-index="5">
336
+ <img
337
+ class="card-img-top result-item__img"
338
+ src="bootstrap/images/pic-bathrooms.jpg"
339
+ alt="Card image"
340
+ />
341
+ <div class="card-body">
342
+ <h4 class="card-title">Card title that wraps to a new line</h4>
343
+ <p class="card-text">
344
+ This is a longer card with supporting text below as a natural lead-in to additional content.
345
+ This content is a little bit longer.
346
+ </p>
347
+ </div>
348
+ <div class="card-footer result-item__footer">
349
+ <div class="result-item__icon-checkbox-wrap">
350
+ <input
351
+ class="result-item__icon result-item__icon-checkbox"
352
+ type="checkbox"
353
+ id="adid5"
354
+ name="adid5"
355
+ data-index="5"
356
+ data-bind-model="searchResults[5].selected"
357
+ data-bind-change="onAdMessageCheck"
358
+ />
359
+ <label
360
+ for="adid5"
361
+ class="oi result-item__icon-checkbox-label"
362
+ data-glyph="task"
363
+ aria-label="Message this seller"
364
+ ></label>
365
+ </div>
366
+ <span
367
+ class="oi result-item__icon active"
368
+ data-glyph="bookmark"
369
+ data-bind-css="searchResults[5].bookmarkedCss"
370
+ data-bind-click="onAdBookmarkClick"
342
371
  data-index="5"
343
- data-bind-model="searchResults[5].selected"
344
- data-bind-change="onAdMessageCheck"
345
- />
346
- <label
347
- for="adid5"
348
- class="oi result-item__icon-checkbox-label"
349
- data-glyph="task"
350
- aria-label="Message this seller"
351
- ></label>
372
+ ></span>
373
+ <span class="oi result-item__icon" data-glyph="thumb-up">99+</span>
352
374
  </div>
353
- <span
354
- class="oi result-item__icon active"
355
- data-glyph="bookmark"
356
- data-bind-css="searchResults[5].bookmarkedCss"
357
- data-bind-click="onAdBookmarkClick"
358
- data-index="5"
359
- ></span>
360
- <span class="oi result-item__icon" data-glyph="thumb-up">99+</span>
361
375
  </div>
362
376
  </div>
363
377
 
364
- <div class="card result-item" data-index="6">
365
- <div class="card-body">
366
- <h4 class="card-title">Card title</h4>
367
- <p class="card-text">
368
- This is a wider card with supporting text below as a natural lead-in to additional content.
369
- This card has even longer content than the first to show that equal height action.
370
- </p>
371
- </div>
372
- <div class="card-footer result-item__footer">
373
- <div class="result-item__icon-checkbox-wrap">
374
- <input
375
- class="result-item__icon result-item__icon-checkbox"
376
- type="checkbox"
377
- id="adid6"
378
- name="adid6"
378
+ <div class="col">
379
+ <div class="card result-item h-100" data-index="6">
380
+ <div class="card-body">
381
+ <h4 class="card-title">Card title</h4>
382
+ <p class="card-text">
383
+ This is a wider card with supporting text below as a natural lead-in to additional content.
384
+ This card has even longer content than the first to show that equal height action.
385
+ </p>
386
+ </div>
387
+ <div class="card-footer result-item__footer">
388
+ <div class="result-item__icon-checkbox-wrap">
389
+ <input
390
+ class="result-item__icon result-item__icon-checkbox"
391
+ type="checkbox"
392
+ id="adid6"
393
+ name="adid6"
394
+ data-index="6"
395
+ data-bind-model="searchResults[6].selected"
396
+ data-bind-change="onAdMessageCheck"
397
+ />
398
+ <label
399
+ for="adid6"
400
+ class="oi result-item__icon-checkbox-label"
401
+ data-glyph="task"
402
+ aria-label="Message this seller"
403
+ ></label>
404
+ </div>
405
+ <span
406
+ class="oi result-item__icon"
407
+ data-glyph="bookmark"
408
+ data-bind-css="searchResults[6].bookmarkedCss"
409
+ data-bind-click="onAdBookmarkClick"
379
410
  data-index="6"
380
- data-bind-model="searchResults[6].selected"
381
- data-bind-change="onAdMessageCheck"
382
- />
383
- <label
384
- for="adid6"
385
- class="oi result-item__icon-checkbox-label"
386
- data-glyph="task"
387
- aria-label="Message this seller"
388
- ></label>
411
+ ></span>
412
+ <span class="oi result-item__icon" data-glyph="thumb-up">9</span>
389
413
  </div>
390
- <span
391
- class="oi result-item__icon"
392
- data-glyph="bookmark"
393
- data-bind-css="searchResults[6].bookmarkedCss"
394
- data-bind-click="onAdBookmarkClick"
395
- data-index="6"
396
- ></span>
397
- <span class="oi result-item__icon" data-glyph="thumb-up">9</span>
398
414
  </div>
399
415
  </div>
400
416
 
401
- <div class="card result-item" data-index="7">
402
- <img
403
- class="card-img-top result-item__img"
404
- src="bootstrap/images/pic-backyard.jpg"
405
- alt="Card image"
406
- />
407
- <div class="card-body">
408
- <h4 class="card-title">Card title</h4>
409
- <p class="card-text">
410
- This card has supporting text below as a natural lead-in to additional content.
411
- </p>
412
- </div>
413
- <div class="card-footer result-item__footer">
414
- <div class="result-item__icon-checkbox-wrap">
415
- <input
416
- class="result-item__icon result-item__icon-checkbox"
417
- type="checkbox"
418
- id="adid7"
419
- name="adid7"
417
+ <div class="col">
418
+ <div class="card result-item h-100" data-index="7">
419
+ <img
420
+ class="card-img-top result-item__img"
421
+ src="bootstrap/images/pic-backyard.jpg"
422
+ alt="Card image"
423
+ />
424
+ <div class="card-body">
425
+ <h4 class="card-title">Card title</h4>
426
+ <p class="card-text">
427
+ This card has supporting text below as a natural lead-in to additional content.
428
+ </p>
429
+ </div>
430
+ <div class="card-footer result-item__footer">
431
+ <div class="result-item__icon-checkbox-wrap">
432
+ <input
433
+ class="result-item__icon result-item__icon-checkbox"
434
+ type="checkbox"
435
+ id="adid7"
436
+ name="adid7"
437
+ data-index="7"
438
+ data-bind-model="searchResults[7].selected"
439
+ data-bind-change="onAdMessageCheck"
440
+ />
441
+ <label
442
+ for="adid7"
443
+ class="oi result-item__icon-checkbox-label"
444
+ data-glyph="task"
445
+ aria-label="Message this seller"
446
+ ></label>
447
+ </div>
448
+ <span
449
+ class="oi result-item__icon"
450
+ data-glyph="bookmark"
451
+ data-bind-css="searchResults[7].bookmarkedCss"
452
+ data-bind-click="onAdBookmarkClick"
420
453
  data-index="7"
421
- data-bind-model="searchResults[7].selected"
422
- data-bind-change="onAdMessageCheck"
423
- />
424
- <label
425
- for="adid7"
426
- class="oi result-item__icon-checkbox-label"
427
- data-glyph="task"
428
- aria-label="Message this seller"
429
- ></label>
454
+ ></span>
455
+ <span class="oi result-item__icon" data-glyph="thumb-up">24</span>
430
456
  </div>
431
- <span
432
- class="oi result-item__icon"
433
- data-glyph="bookmark"
434
- data-bind-css="searchResults[7].bookmarkedCss"
435
- data-bind-click="onAdBookmarkClick"
436
- data-index="7"
437
- ></span>
438
- <span class="oi result-item__icon" data-glyph="thumb-up">24</span>
439
457
  </div>
440
458
  </div>
441
459
  </div>
@@ -454,8 +472,8 @@
454
472
  class="mass-message__trigger-wrap"
455
473
  data-bind-css="messageTriggerCss"
456
474
  data-bind-click="onMessageTriggerClick"
457
- data-toggle="modal"
458
- data-target="#message-modal"
475
+ data-bs-toggle="modal"
476
+ data-bs-target="#message-modal"
459
477
  >
460
478
  <div class="mass-message__trigger">
461
479
  <span class="oi mass-message__trigger-icon" data-glyph="pencil" aria-label="write message"></span>
@@ -483,9 +501,7 @@
483
501
  <form id="formMessage" data-bind-submit="onMessageSubmit">
484
502
  <div class="modal-header">
485
503
  <h5 class="modal-title" id="exampleModalLabel">Send Message</h5>
486
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
487
- <span aria-hidden="true">&times;</span>
488
- </button>
504
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
489
505
  </div>
490
506
  <div class="modal-body">
491
507
  <div data-bind-show="!sendingMessage">
@@ -525,7 +541,7 @@
525
541
  </p>
526
542
  </div>
527
543
  <div class="modal-footer">
528
- <button type="button" class="btn btn-outline-secondary" data-dismiss="modal">
544
+ <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">
529
545
  Close
530
546
  </button>
531
547
  <button
@@ -544,24 +560,26 @@
544
560
 
545
561
  <!-- searchResultItem test with deep nested templates -->
546
562
  <template id="searchResultItem">
547
- <div
548
- class="card result-item"
549
- data-bind-css="$data.highlightCss"
550
- data-bind-for="result of $root.searchResults"
551
- >
552
- <img
553
- data-bind-if="result.image"
554
- data-bind-attr="{
555
- src: $data.image,
556
- alt: $data.title
557
- }"
558
- class="card-img-top result-item__img"
563
+ <div class="col">
564
+ <div
565
+ class="card result-item h-100"
566
+ data-bind-css="$data.highlightCss"
567
+ data-bind-for="result of $root.searchResults"
559
568
  >
560
- <div
561
- class="card-body"
562
- data-bind-tmp="{id: 'searchResultItemBody', data: 'result'}"
563
- ></div>
564
- <div data-bind-tmp="{id: 'searchResultItemFooter', data: 'result'}" ></div>
569
+ <img
570
+ data-bind-if="result.image"
571
+ data-bind-attr="{
572
+ src: $data.image,
573
+ alt: $data.title
574
+ }"
575
+ class="card-img-top result-item__img"
576
+ >
577
+ <div
578
+ class="card-body"
579
+ data-bind-tmp="{id: 'searchResultItemBody', data: 'result'}"
580
+ ></div>
581
+ <div data-bind-tmp="{id: 'searchResultItemFooter', data: 'result'}" ></div>
582
+ </div>
565
583
  </div>
566
584
  </template>
567
585
 
@@ -610,15 +628,8 @@
610
628
  ></span>
611
629
  </template>
612
630
 
613
- <!-- bootstrap 4 JavaScript -->
614
- <!-- jQuery first, then Popper.js, then Bootstrap JS -->
615
- <script src="../vendors/jquery-3.2.1.min.js"></script>
616
- <script src="bootstrap/js/popper.min.js"></script>
617
- <script src="bootstrap/js/bootstrap.min.js"></script>
618
-
619
- <!-- twitter typeahead JavaScript -->
620
- <script src="bootstrap/js/typeahead.jquery.js"></script>
621
- <script src="bootstrap/js/searchSuggestion.js"></script>
631
+ <!-- Bootstrap 5 JavaScript -->
632
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
622
633
 
623
634
  <!-- dataBind JavaScript -->
624
635
  <script src="../vendors/lodash.custom.min.js"></script>