lightview 1.8.2 → 2.0.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 (262) hide show
  1. package/.codacy/cli.sh +149 -0
  2. package/.codacy/codacy.yaml +15 -0
  3. package/.github/instructions/codacy.instructions.md +72 -0
  4. package/.wranglerignore +21 -0
  5. package/README.md +1330 -19
  6. package/_headers +4 -0
  7. package/build.js +70 -0
  8. package/components/actions/button.js +151 -0
  9. package/components/actions/dropdown.js +120 -0
  10. package/components/actions/modal.js +146 -0
  11. package/components/actions/swap.js +118 -0
  12. package/components/daisyui.js +288 -0
  13. package/components/data-display/accordion.js +128 -0
  14. package/components/data-display/alert.js +112 -0
  15. package/components/data-display/avatar.js +170 -0
  16. package/components/data-display/badge.js +82 -0
  17. package/components/data-display/card.js +151 -0
  18. package/components/data-display/carousel.js +94 -0
  19. package/components/data-display/chart.js +220 -0
  20. package/components/data-display/chat.js +128 -0
  21. package/components/data-display/collapse.js +103 -0
  22. package/components/data-display/countdown.js +69 -0
  23. package/components/data-display/diff.js +111 -0
  24. package/components/data-display/kbd.js +65 -0
  25. package/components/data-display/loading.js +75 -0
  26. package/components/data-display/progress.js +79 -0
  27. package/components/data-display/radial-progress.js +88 -0
  28. package/components/data-display/skeleton.js +66 -0
  29. package/components/data-display/stats.js +159 -0
  30. package/components/data-display/table.js +146 -0
  31. package/components/data-display/timeline.js +146 -0
  32. package/components/data-display/toast.js +72 -0
  33. package/components/data-display/tooltip.js +74 -0
  34. package/components/data-input/checkbox.js +253 -0
  35. package/components/data-input/file-input.js +224 -0
  36. package/components/data-input/input.js +264 -0
  37. package/components/data-input/radio.js +338 -0
  38. package/components/data-input/range.js +204 -0
  39. package/components/data-input/rating.js +219 -0
  40. package/components/data-input/select.js +287 -0
  41. package/components/data-input/textarea.js +287 -0
  42. package/components/data-input/toggle.js +201 -0
  43. package/components/index.js +137 -0
  44. package/components/layout/divider.js +72 -0
  45. package/components/layout/drawer.js +142 -0
  46. package/components/layout/footer.js +100 -0
  47. package/components/layout/hero.js +109 -0
  48. package/components/layout/indicator.js +90 -0
  49. package/components/layout/join.js +78 -0
  50. package/components/layout/navbar.js +110 -0
  51. package/components/navigation/breadcrumbs.js +91 -0
  52. package/components/navigation/dock.js +103 -0
  53. package/components/navigation/menu.js +126 -0
  54. package/components/navigation/pagination.js +105 -0
  55. package/components/navigation/steps.js +89 -0
  56. package/components/navigation/tabs.css +177 -0
  57. package/components/navigation/tabs.js +123 -0
  58. package/components/theme/theme-switch.css +65 -0
  59. package/components/theme/theme-switch.js +177 -0
  60. package/docs/about.html +164 -0
  61. package/docs/api/computed.html +184 -0
  62. package/docs/api/effects.html +173 -0
  63. package/docs/api/elements.html +180 -0
  64. package/docs/api/enhance.html +225 -0
  65. package/docs/api/hypermedia.html +165 -0
  66. package/docs/api/index.html +178 -0
  67. package/docs/api/nav.html +18 -0
  68. package/docs/api/signals.html +136 -0
  69. package/docs/api/state.html +217 -0
  70. package/docs/assets/images/logo-favicon.svg +42 -0
  71. package/docs/assets/images/logo-static.svg +40 -0
  72. package/docs/assets/images/logo.svg +66 -0
  73. package/docs/assets/js/examplify.js +395 -0
  74. package/docs/assets/styles/site.css +1102 -0
  75. package/docs/assets/styles/themes.css +236 -0
  76. package/docs/components/accordion.html +439 -0
  77. package/docs/components/alert.html +528 -0
  78. package/docs/components/avatar.html +586 -0
  79. package/docs/components/badge.html +531 -0
  80. package/docs/components/breadcrumbs.html +278 -0
  81. package/docs/components/button.html +579 -0
  82. package/docs/components/card.html +561 -0
  83. package/docs/components/carousel.html +286 -0
  84. package/docs/components/chart-area.html +702 -0
  85. package/docs/components/chart-bar.html +782 -0
  86. package/docs/components/chart-column.html +735 -0
  87. package/docs/components/chart-line.html +794 -0
  88. package/docs/components/chart-pie.html +823 -0
  89. package/docs/components/chart.html +610 -15
  90. package/docs/components/chat.html +547 -0
  91. package/docs/components/checkbox.html +641 -0
  92. package/docs/components/collapse.html +536 -0
  93. package/docs/components/component-nav.html +53 -0
  94. package/docs/components/countdown.html +470 -0
  95. package/docs/components/diff.html +245 -0
  96. package/docs/components/divider.html +240 -0
  97. package/docs/components/dock.html +277 -0
  98. package/docs/components/drawer.html +515 -0
  99. package/docs/components/dropdown.html +479 -0
  100. package/docs/components/file-input.html +591 -0
  101. package/docs/components/footer.html +301 -0
  102. package/docs/components/gallery.html +504 -0
  103. package/docs/components/hero.html +264 -0
  104. package/docs/components/index.css +840 -0
  105. package/docs/components/index.html +735 -0
  106. package/docs/components/indicator.html +342 -0
  107. package/docs/components/input.html +644 -0
  108. package/docs/components/join.html +285 -0
  109. package/docs/components/kbd.html +322 -0
  110. package/docs/components/loading.html +521 -0
  111. package/docs/components/menu.html +461 -0
  112. package/docs/components/modal.html +639 -0
  113. package/docs/components/navbar.html +321 -0
  114. package/docs/components/pagination.html +279 -0
  115. package/docs/components/progress.html +514 -0
  116. package/docs/components/radial-progress.html +434 -0
  117. package/docs/components/radio.html +655 -0
  118. package/docs/components/range.html +611 -0
  119. package/docs/components/rating.html +642 -0
  120. package/docs/components/select.html +696 -0
  121. package/docs/components/sidebar-setup.js +93 -0
  122. package/docs/components/skeleton.html +447 -0
  123. package/docs/components/spinner.html +68 -0
  124. package/docs/components/stats.html +486 -0
  125. package/docs/components/steps.html +356 -0
  126. package/docs/components/swap.html +517 -0
  127. package/docs/components/switch.html +68 -0
  128. package/docs/components/table.html +668 -0
  129. package/docs/components/tabs.html +506 -0
  130. package/docs/components/text-input.html +68 -0
  131. package/docs/components/textarea.html +603 -0
  132. package/docs/components/timeline.html +485 -42
  133. package/docs/components/toast.html +474 -0
  134. package/docs/components/toggle.html +564 -0
  135. package/docs/components/tooltip.html +423 -0
  136. package/docs/examples/getting-started-example.html +40 -0
  137. package/docs/examples/index.html +93 -0
  138. package/docs/getting-started/index.html +739 -0
  139. package/docs/getting-started/reviews.html +23 -0
  140. package/docs/getting-started/reviews.odom +108 -0
  141. package/docs/getting-started/reviews.vdom +84 -0
  142. package/docs/index.html +132 -42
  143. package/docs/playground.html +416 -0
  144. package/docs/router.html +285 -0
  145. package/docs/styles/index.html +190 -0
  146. package/functions/_middleware.js +32 -0
  147. package/index.html +309 -0
  148. package/lightview-router.js +364 -0
  149. package/lightview-x.js +1577 -0
  150. package/lightview.js +659 -1200
  151. package/middleware/locale.js +25 -0
  152. package/middleware/markdown.js +44 -0
  153. package/middleware/notFound.js +37 -0
  154. package/package.json +27 -41
  155. package/watch.js +92 -0
  156. package/wrangler.toml +12 -0
  157. package/.idea/lightview.iml +0 -12
  158. package/.idea/modules.xml +0 -8
  159. package/.idea/vcs.xml +0 -6
  160. package/LICENSE +0 -21
  161. package/codepen-no-tabs-embed.css +0 -2
  162. package/docs/CNAME +0 -1
  163. package/docs/api.html +0 -674
  164. package/docs/blank.html +0 -10
  165. package/docs/comparedto.html +0 -89
  166. package/docs/components/chart-repl.html +0 -69
  167. package/docs/components/components.js +0 -113
  168. package/docs/components/contents.html +0 -17
  169. package/docs/components/gantt-repl.html +0 -61
  170. package/docs/components/gantt.html +0 -42
  171. package/docs/components/gauge-repl.html +0 -66
  172. package/docs/components/gauge.html +0 -20
  173. package/docs/components/orgchart-repl.html +0 -64
  174. package/docs/components/orgchart.html +0 -41
  175. package/docs/components/repl-as-src.html +0 -17
  176. package/docs/components/repl-repl.html +0 -95
  177. package/docs/components/repl.html +0 -527
  178. package/docs/components/timeline-repl.html +0 -72
  179. package/docs/components.html +0 -14
  180. package/docs/css/highlightjs.min.css +0 -9
  181. package/docs/css/tutorial.css +0 -35
  182. package/docs/examples/anchor.html +0 -11
  183. package/docs/examples/chart.html +0 -34
  184. package/docs/examples/counter.html +0 -26
  185. package/docs/examples/counter.test.mjs +0 -47
  186. package/docs/examples/counter2.html +0 -26
  187. package/docs/examples/directives.html +0 -79
  188. package/docs/examples/foreign.html +0 -50
  189. package/docs/examples/forgeinform.html +0 -98
  190. package/docs/examples/form.html +0 -61
  191. package/docs/examples/gauge.html +0 -18
  192. package/docs/examples/invalid-template-literals.html +0 -44
  193. package/docs/examples/medium/remote.html +0 -60
  194. package/docs/examples/message.html +0 -18
  195. package/docs/examples/nested.html +0 -11
  196. package/docs/examples/object-bound-form.html +0 -34
  197. package/docs/examples/remote-server.js +0 -51
  198. package/docs/examples/remote.html +0 -34
  199. package/docs/examples/remote.json +0 -1
  200. package/docs/examples/scratch.html +0 -69
  201. package/docs/examples/sensors/index.html +0 -44
  202. package/docs/examples/sensors/sensor-server.js +0 -30
  203. package/docs/examples/shared.html +0 -41
  204. package/docs/examples/template.html +0 -33
  205. package/docs/examples/timeline.html +0 -21
  206. package/docs/examples/todo.html +0 -40
  207. package/docs/examples/top.html +0 -10
  208. package/docs/examples/types.html +0 -94
  209. package/docs/examples/xor.html +0 -62
  210. package/docs/examples.html +0 -25
  211. package/docs/javascript/codejar.min.js +0 -8
  212. package/docs/javascript/highlightjs.min.js +0 -1173
  213. package/docs/javascript/isomorphic-git.js +0 -9
  214. package/docs/javascript/json5.min.js +0 -1
  215. package/docs/javascript/lightning-fs.js +0 -1
  216. package/docs/javascript/lightview.js +0 -1285
  217. package/docs/javascript/marked.min.js +0 -6
  218. package/docs/javascript/peerjs.min.js +0 -70
  219. package/docs/javascript/turndown.js +0 -973
  220. package/docs/javascript/types.js +0 -606
  221. package/docs/javascript/utils.js +0 -45
  222. package/docs/lightview.html +0 -63
  223. package/docs/old_index.html +0 -965
  224. package/docs/old_index.md +0 -1132
  225. package/docs/slidein.html +0 -51
  226. package/docs/tutorial/0-getting-started.html +0 -67
  227. package/docs/tutorial/1-intro-to-variables.html +0 -103
  228. package/docs/tutorial/10-template-components.html +0 -80
  229. package/docs/tutorial/11-linked-components.html +0 -76
  230. package/docs/tutorial/12-imported-components.html +0 -67
  231. package/docs/tutorial/13-input-binding.html +0 -94
  232. package/docs/tutorial/14-automatic-variable-creation.html +0 -74
  233. package/docs/tutorial/15-form-binding.html +0 -110
  234. package/docs/tutorial/16-if-directive.html +0 -60
  235. package/docs/tutorial/17-loop-directives.html +0 -83
  236. package/docs/tutorial/18-sanitizing-and-escaping-input.html +0 -79
  237. package/docs/tutorial/2-imported-and-exported-variables.html +0 -80
  238. package/docs/tutorial/3-data-types.html +0 -89
  239. package/docs/tutorial/4-extended-data-types.html +0 -83
  240. package/docs/tutorial/5-extended-functional-types.html +0 -96
  241. package/docs/tutorial/5.1-extended-functional-types.html +0 -79
  242. package/docs/tutorial/5.2-extended-functional-types.html +0 -70
  243. package/docs/tutorial/6-conventional-javascript.html +0 -75
  244. package/docs/tutorial/7-monitoring-with-observers.html +0 -107
  245. package/docs/tutorial/8-event-listeners.html +0 -65
  246. package/docs/tutorial/9-intro-to-components.html +0 -91
  247. package/docs/tutorial/contents.html +0 -32
  248. package/docs/tutorial/my-component.html +0 -29
  249. package/docs/tutorial/remote-value.json +0 -4
  250. package/docs/websiterepl.html +0 -46
  251. package/jest-puppeteer.config.js +0 -5
  252. package/jest.config.json +0 -12
  253. package/lightview.min.js +0 -1
  254. package/lightview_good.js +0 -1267
  255. package/lightview_optimized.js +0 -1274
  256. package/repl_hold.html +0 -320
  257. package/test/basic.html +0 -104
  258. package/test/basic.test.mjs +0 -315
  259. package/test/extended.html +0 -29
  260. package/test/extended.test.mjs +0 -448
  261. package/types.js +0 -607
  262. package/unsplash.key +0 -1
@@ -0,0 +1,735 @@
1
+ <!-- SEO-friendly SPA Shim -->
2
+ <script src="/lightview-router.js"></script>
3
+ <script>
4
+ if (window.LightviewRouter) {
5
+ LightviewRouter.base('/index.html');
6
+ }
7
+ </script>
8
+ <script type="module" src="../../components/data-display/chart.js"></script>
9
+
10
+ <!-- Load the page-specific stylesheet -->
11
+ <link rel="stylesheet" href="./index.css">
12
+
13
+ <!-- Gallery Structure -->
14
+ <div class="gallery-page">
15
+ <div class="gallery-layout">
16
+ <!-- Sidebar Overlay -->
17
+ <div id="sidebar-overlay" class="sidebar-overlay"></div>
18
+
19
+ <!-- Sidebar -->
20
+ <div id="gallery-sidebar" class="gallery-sidebar" style="visibility: hidden" src="./component-nav.html"></div>
21
+
22
+ <!-- Main Content -->
23
+ <div id="gallery-main" class="gallery-main">
24
+ <!-- Header Container -->
25
+ <div
26
+ style="position: sticky; top: 0; z-index: 30; background: var(--gallery-surface); border-bottom: 1px solid var(--gallery-border); backdrop-filter: blur(8px);">
27
+ <!-- Breadcrumbs Row -->
28
+ <div style="padding: 0.75rem 1.5rem 0;">
29
+ <script>
30
+ (() => {
31
+ const { Breadcrumbs } = Lightview.tags;
32
+ const breadcrumbs = Breadcrumbs({
33
+ id: 'page-breadcrumbs',
34
+ items: [
35
+ { label: 'Components', href: '/docs/components' },
36
+ { label: 'Chart Column' }
37
+ ]
38
+ });
39
+ document.currentScript.replaceWith(breadcrumbs.domEl);
40
+ })();
41
+ </script>
42
+ </div>
43
+ <!-- Title Row -->
44
+ <div class="gallery-header"
45
+ style="border-bottom: none; height: auto; padding-top: 0.5rem; padding-bottom: 0.75rem;">
46
+ <button id="toggle-btn" class="toggle-btn" aria-label="Toggle Sidebar">
47
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="toggle-icon"
48
+ style="stroke: currentColor; stroke-width: 2;">
49
+ <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7" />
50
+ <path stroke-linecap="round" stroke-linejoin="round" d="M11 19l-7-7 7-7" />
51
+ </svg>
52
+ </button>
53
+ <h1 class="gallery-title">Chart Column</h1>
54
+ </div>
55
+ </div>
56
+
57
+ <!-- Content -->
58
+ <div class="gallery-content">
59
+ <div class="section-content" style="max-width: 1000px;">
60
+ <p class="text-lg" style="opacity: 0.7; margin-bottom: 1.5rem;">
61
+ Column charts display data as vertical bars. The column height represents the data value.
62
+ </p>
63
+
64
+ <!-- Basic Usage -->
65
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
66
+ <div class="card-body">
67
+ <h2 class="card-title">Basic Usage</h2>
68
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">
69
+ To visualize data with a column chart, use <code>type: 'column'</code>.
70
+ </p>
71
+
72
+ <!-- Tabs -->
73
+ <script>
74
+ window.switchBasicColumnTab = (tabId) => {
75
+ const tabs = ['tagged', 'vdom', 'object'];
76
+ tabs.forEach(t => {
77
+ const tabEl = document.getElementById(`basic-column-tab-btn-${t}`);
78
+ const contentEl = document.getElementById(`basic-column-syntax-${t}`);
79
+ if (t === tabId) {
80
+ tabEl.classList.add('syntax-tab-active');
81
+ contentEl.style.display = 'block';
82
+ } else {
83
+ tabEl.classList.remove('syntax-tab-active');
84
+ contentEl.style.display = 'none';
85
+ }
86
+ });
87
+ };
88
+ </script>
89
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
90
+ <button id="basic-column-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
91
+ onclick="switchBasicColumnTab('tagged')">Tagged</button>
92
+ <button id="basic-column-tab-btn-vdom" role="tab" class="syntax-tab"
93
+ onclick="switchBasicColumnTab('vdom')">vDOM</button>
94
+ <button id="basic-column-tab-btn-object" role="tab" class="syntax-tab"
95
+ onclick="switchBasicColumnTab('object')">Object DOM</button>
96
+ </div>
97
+
98
+ <!-- Tagged Syntax -->
99
+ <div id="basic-column-syntax-tagged">
100
+ <pre><script>
101
+ examplify(document.currentScript.nextElementSibling, {
102
+ at: document.currentScript.parentElement,
103
+ scripts: ['/lightview.js', '/lightview-x.js'],
104
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
105
+ type: 'module',
106
+ minHeight: 250,
107
+ autoRun: true
108
+ });
109
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
110
+ const { tags, $ } = Lightview;
111
+ const { Chart, span } = tags;
112
+
113
+ const chart = Chart({
114
+ type: 'column',
115
+ labels: true,
116
+ style: 'width: 100%; max-width: 600px; height: 250px; margin: 0 auto;'
117
+ },
118
+ Chart.Body({},
119
+ Chart.Row({}, Chart.Label({}, 'Jan'), Chart.Data({ value: 0.4 }, span({ class: 'data' }, '40%'))),
120
+ Chart.Row({}, Chart.Label({}, 'Feb'), Chart.Data({ value: 0.6 }, span({ class: 'data' }, '60%'))),
121
+ Chart.Row({}, Chart.Label({}, 'Mar'), Chart.Data({ value: 0.8 }, span({ class: 'data' }, '80%'))),
122
+ Chart.Row({}, Chart.Label({}, 'Apr'), Chart.Data({ value: 0.5 }, span({ class: 'data' }, '50%')))
123
+ )
124
+ );
125
+
126
+ $('#example').content(chart);</code></pre>
127
+ </div>
128
+
129
+ <!-- vDOM Syntax -->
130
+ <div id="basic-column-syntax-vdom" style="display: none;">
131
+ <pre><script>
132
+ examplify(document.currentScript.nextElementSibling, {
133
+ at: document.currentScript.parentElement,
134
+ scripts: ['/lightview.js', '/lightview-x.js'],
135
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
136
+ type: 'module',
137
+ minHeight: 250
138
+ });
139
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
140
+ const { tags, $ } = Lightview;
141
+ const { Chart, span } = tags;
142
+
143
+ const months = [
144
+ { label: 'Jan', value: 0.4, text: '40%' },
145
+ { label: 'Feb', value: 0.6, text: '60%' },
146
+ { label: 'Mar', value: 0.8, text: '80%' },
147
+ { label: 'Apr', value: 0.5, text: '50%' }
148
+ ];
149
+
150
+ const chart = {
151
+ tag: Chart,
152
+ attributes: { type: 'column', labels: true, style: 'width: 100%; max-width: 600px; height: 250px; margin: 0 auto;' },
153
+ children: [
154
+ {
155
+ tag: Chart.Body,
156
+ children: months.map(m => ({
157
+ tag: Chart.Row,
158
+ children: [
159
+ { tag: Chart.Label, children: [m.label] },
160
+ { tag: Chart.Data, attributes: { value: m.value }, children: [{ tag: span, attributes: { class: 'data' }, children: [m.text] }] }
161
+ ]
162
+ }))
163
+ }
164
+ ]
165
+ };
166
+
167
+ $('#example').content(chart);</code></pre>
168
+ </div>
169
+
170
+ <!-- Object DOM Syntax -->
171
+ <div id="basic-column-syntax-object" style="display: none;">
172
+ <pre><script>
173
+ examplify(document.currentScript.nextElementSibling, {
174
+ at: document.currentScript.parentElement,
175
+ scripts: ['/lightview.js', '/lightview-x.js'],
176
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
177
+ type: 'module',
178
+ minHeight: 250
179
+ });
180
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
181
+ const { $ } = Lightview;
182
+
183
+ const chart = {
184
+ Chart: {
185
+ type: 'column',
186
+ labels: true,
187
+ style: 'width: 100%; max-width: 600px; height: 250px; margin: 0 auto;',
188
+ children: [
189
+ {
190
+ 'Chart.Body': {
191
+ children: [
192
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Jan'] } }, { 'Chart.Data': { value: 0.4, children: [{ span: { class: 'data', children: ['40%'] } }] } }] } },
193
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Feb'] } }, { 'Chart.Data': { value: 0.6, children: [{ span: { class: 'data', children: ['60%'] } }] } }] } },
194
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Mar'] } }, { 'Chart.Data': { value: 0.8, children: [{ span: { class: 'data', children: ['80%'] } }] } }] } },
195
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Apr'] } }, { 'Chart.Data': { value: 0.5, children: [{ span: { class: 'data', children: ['50%'] } }] } }] } }
196
+ ]
197
+ }
198
+ }
199
+ ]
200
+ }
201
+ };
202
+
203
+ $('#example').content(chart);</code></pre>
204
+ </div>
205
+ </div>
206
+ </div>
207
+
208
+ <!-- Multiple Datasets -->
209
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
210
+ <div class="card-body">
211
+ <h2 class="card-title">Multiple Datasets</h2>
212
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">
213
+ Add multiple <code>Chart.Data</code> elements per row and set
214
+ <code>multiple: true</code>.
215
+ </p>
216
+
217
+ <!-- Tabs -->
218
+ <script>
219
+ window.switchMultipleColumnTab = (tabId) => {
220
+ const tabs = ['tagged', 'vdom', 'object'];
221
+ tabs.forEach(t => {
222
+ const tabEl = document.getElementById(`multiple-column-tab-btn-${t}`);
223
+ const contentEl = document.getElementById(`multiple-column-syntax-${t}`);
224
+ if (t === tabId) {
225
+ tabEl.classList.add('syntax-tab-active');
226
+ contentEl.style.display = 'block';
227
+ } else {
228
+ tabEl.classList.remove('syntax-tab-active');
229
+ contentEl.style.display = 'none';
230
+ }
231
+ });
232
+ };
233
+ </script>
234
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
235
+ <button id="multiple-column-tab-btn-tagged" role="tab"
236
+ class="syntax-tab syntax-tab-active"
237
+ onclick="switchMultipleColumnTab('tagged')">Tagged</button>
238
+ <button id="multiple-column-tab-btn-vdom" role="tab" class="syntax-tab"
239
+ onclick="switchMultipleColumnTab('vdom')">vDOM</button>
240
+ <button id="multiple-column-tab-btn-object" role="tab" class="syntax-tab"
241
+ onclick="switchMultipleColumnTab('object')">Object DOM</button>
242
+ </div>
243
+
244
+ <!-- Tagged Syntax -->
245
+ <div id="multiple-column-syntax-tagged">
246
+ <pre><script>
247
+ examplify(document.currentScript.nextElementSibling, {
248
+ at: document.currentScript.parentElement,
249
+ scripts: ['/lightview.js', '/lightview-x.js'],
250
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
251
+ type: 'module',
252
+ minHeight: 280,
253
+ autoRun: true
254
+ });
255
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
256
+ const { tags, $ } = Lightview;
257
+ const { Chart } = tags;
258
+
259
+ const chart = Chart({
260
+ type: 'column',
261
+ multiple: true,
262
+ labels: true,
263
+ primaryAxis: true,
264
+ spacing: 5,
265
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;'
266
+ },
267
+ Chart.Body({},
268
+ Chart.Row({},
269
+ Chart.Label({}, 'Q1'),
270
+ Chart.Data({ value: 0.4, color: '#4CAF50' }),
271
+ Chart.Data({ value: 0.6, color: '#2196F3' }),
272
+ Chart.Data({ value: 0.3, color: '#FF9800' })
273
+ ),
274
+ Chart.Row({},
275
+ Chart.Label({}, 'Q2'),
276
+ Chart.Data({ value: 0.5, color: '#4CAF50' }),
277
+ Chart.Data({ value: 0.7, color: '#2196F3' }),
278
+ Chart.Data({ value: 0.5, color: '#FF9800' })
279
+ ),
280
+ Chart.Row({},
281
+ Chart.Label({}, 'Q3'),
282
+ Chart.Data({ value: 0.7, color: '#4CAF50' }),
283
+ Chart.Data({ value: 0.5, color: '#2196F3' }),
284
+ Chart.Data({ value: 0.8, color: '#FF9800' })
285
+ ),
286
+ Chart.Row({},
287
+ Chart.Label({}, 'Q4'),
288
+ Chart.Data({ value: 0.9, color: '#4CAF50' }),
289
+ Chart.Data({ value: 0.8, color: '#2196F3' }),
290
+ Chart.Data({ value: 0.6, color: '#FF9800' })
291
+ )
292
+ )
293
+ );
294
+
295
+ $('#example').content(chart);</code></pre>
296
+ </div>
297
+
298
+ <!-- vDOM Syntax -->
299
+ <div id="multiple-column-syntax-vdom" style="display: none;">
300
+ <pre><script>
301
+ examplify(document.currentScript.nextElementSibling, {
302
+ at: document.currentScript.parentElement,
303
+ scripts: ['/lightview.js', '/lightview-x.js'],
304
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
305
+ type: 'module',
306
+ minHeight: 280
307
+ });
308
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
309
+ const { tags, $ } = Lightview;
310
+ const { Chart } = tags;
311
+
312
+ const quarters = [
313
+ { label: 'Q1', values: [0.4, 0.6, 0.3] },
314
+ { label: 'Q2', values: [0.5, 0.7, 0.5] },
315
+ { label: 'Q3', values: [0.7, 0.5, 0.8] },
316
+ { label: 'Q4', values: [0.9, 0.8, 0.6] }
317
+ ];
318
+ const colors = ['#4CAF50', '#2196F3', '#FF9800'];
319
+
320
+ const chart = {
321
+ tag: Chart,
322
+ attributes: {
323
+ type: 'column',
324
+ multiple: true,
325
+ labels: true,
326
+ primaryAxis: true,
327
+ spacing: 5,
328
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;'
329
+ },
330
+ children: [
331
+ {
332
+ tag: Chart.Body,
333
+ children: quarters.map(q => ({
334
+ tag: Chart.Row,
335
+ children: [
336
+ { tag: Chart.Label, children: [q.label] },
337
+ ...q.values.map((value, i) => ({
338
+ tag: Chart.Data,
339
+ attributes: { value, color: colors[i] }
340
+ }))
341
+ ]
342
+ }))
343
+ }
344
+ ]
345
+ };
346
+
347
+ $('#example').content(chart);</code></pre>
348
+ </div>
349
+
350
+ <!-- Object DOM Syntax -->
351
+ <div id="multiple-column-syntax-object" style="display: none;">
352
+ <pre><script>
353
+ examplify(document.currentScript.nextElementSibling, {
354
+ at: document.currentScript.parentElement,
355
+ scripts: ['/lightview.js', '/lightview-x.js'],
356
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
357
+ type: 'module',
358
+ minHeight: 280
359
+ });
360
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
361
+ const { $ } = Lightview;
362
+
363
+ const chart = {
364
+ Chart: {
365
+ type: 'column',
366
+ multiple: true,
367
+ labels: true,
368
+ primaryAxis: true,
369
+ spacing: 5,
370
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;',
371
+ children: [
372
+ {
373
+ 'Chart.Body': {
374
+ children: [
375
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Q1'] } }, { 'Chart.Data': { value: 0.4, color: '#4CAF50' } }, { 'Chart.Data': { value: 0.6, color: '#2196F3' } }, { 'Chart.Data': { value: 0.3, color: '#FF9800' } }] } },
376
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Q2'] } }, { 'Chart.Data': { value: 0.5, color: '#4CAF50' } }, { 'Chart.Data': { value: 0.7, color: '#2196F3' } }, { 'Chart.Data': { value: 0.5, color: '#FF9800' } }] } },
377
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Q3'] } }, { 'Chart.Data': { value: 0.7, color: '#4CAF50' } }, { 'Chart.Data': { value: 0.5, color: '#2196F3' } }, { 'Chart.Data': { value: 0.8, color: '#FF9800' } }] } },
378
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['Q4'] } }, { 'Chart.Data': { value: 0.9, color: '#4CAF50' } }, { 'Chart.Data': { value: 0.8, color: '#2196F3' } }, { 'Chart.Data': { value: 0.6, color: '#FF9800' } }] } }
379
+ ]
380
+ }
381
+ }
382
+ ]
383
+ }
384
+ };
385
+
386
+ $('#example').content(chart);</code></pre>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
391
+ <!-- Axes -->
392
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
393
+ <div class="card-body">
394
+ <h2 class="card-title">Axes</h2>
395
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">
396
+ Control axis visibility with <code>primaryAxis</code> and <code>secondaryAxis</code>.
397
+ </p>
398
+
399
+ <!-- Tabs -->
400
+ <script>
401
+ window.switchAxesColumnTab = (tabId) => {
402
+ const tabs = ['tagged', 'vdom', 'object'];
403
+ tabs.forEach(t => {
404
+ const tabEl = document.getElementById(`axes-column-tab-btn-${t}`);
405
+ const contentEl = document.getElementById(`axes-column-syntax-${t}`);
406
+ if (t === tabId) {
407
+ tabEl.classList.add('syntax-tab-active');
408
+ contentEl.style.display = 'block';
409
+ } else {
410
+ tabEl.classList.remove('syntax-tab-active');
411
+ contentEl.style.display = 'none';
412
+ }
413
+ });
414
+ };
415
+ </script>
416
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
417
+ <button id="axes-column-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
418
+ onclick="switchAxesColumnTab('tagged')">Tagged</button>
419
+ <button id="axes-column-tab-btn-vdom" role="tab" class="syntax-tab"
420
+ onclick="switchAxesColumnTab('vdom')">vDOM</button>
421
+ <button id="axes-column-tab-btn-object" role="tab" class="syntax-tab"
422
+ onclick="switchAxesColumnTab('object')">Object DOM</button>
423
+ </div>
424
+
425
+ <!-- Tagged Syntax -->
426
+ <div id="axes-column-syntax-tagged">
427
+ <pre><script>
428
+ examplify(document.currentScript.nextElementSibling, {
429
+ at: document.currentScript.parentElement,
430
+ scripts: ['/lightview.js', '/lightview-x.js'],
431
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
432
+ type: 'module',
433
+ minHeight: 280,
434
+ autoRun: true
435
+ });
436
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
437
+ const { tags, $ } = Lightview;
438
+ const { Chart, span } = tags;
439
+
440
+ const chart = Chart({
441
+ type: 'column',
442
+ labels: true,
443
+ primaryAxis: true,
444
+ secondaryAxis: 'show-10-secondary-axes',
445
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;'
446
+ },
447
+ Chart.Body({},
448
+ Chart.Row({}, Chart.Label({}, 'A'), Chart.Data({ value: 0.2 }, span({ class: 'data' }, '20%'))),
449
+ Chart.Row({}, Chart.Label({}, 'B'), Chart.Data({ value: 0.4 }, span({ class: 'data' }, '40%'))),
450
+ Chart.Row({}, Chart.Label({}, 'C'), Chart.Data({ value: 0.6 }, span({ class: 'data' }, '60%'))),
451
+ Chart.Row({}, Chart.Label({}, 'D'), Chart.Data({ value: 0.8 }, span({ class: 'data' }, '80%'))),
452
+ Chart.Row({}, Chart.Label({}, 'E'), Chart.Data({ value: 1.0 }, span({ class: 'data' }, '100%')))
453
+ )
454
+ );
455
+
456
+ $('#example').content(chart);</code></pre>
457
+ </div>
458
+
459
+ <!-- vDOM Syntax -->
460
+ <div id="axes-column-syntax-vdom" style="display: none;">
461
+ <pre><script>
462
+ examplify(document.currentScript.nextElementSibling, {
463
+ at: document.currentScript.parentElement,
464
+ scripts: ['/lightview.js', '/lightview-x.js'],
465
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
466
+ type: 'module',
467
+ minHeight: 280
468
+ });
469
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
470
+ const { tags, $ } = Lightview;
471
+ const { Chart, span } = tags;
472
+
473
+ const data = [
474
+ { label: 'A', value: 0.2, text: '20%' },
475
+ { label: 'B', value: 0.4, text: '40%' },
476
+ { label: 'C', value: 0.6, text: '60%' },
477
+ { label: 'D', value: 0.8, text: '80%' },
478
+ { label: 'E', value: 1.0, text: '100%' }
479
+ ];
480
+
481
+ const chart = {
482
+ tag: Chart,
483
+ attributes: {
484
+ type: 'column',
485
+ labels: true,
486
+ primaryAxis: true,
487
+ secondaryAxis: 'show-10-secondary-axes',
488
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;'
489
+ },
490
+ children: [
491
+ {
492
+ tag: Chart.Body,
493
+ children: data.map(d => ({
494
+ tag: Chart.Row,
495
+ children: [
496
+ { tag: Chart.Label, children: [d.label] },
497
+ { tag: Chart.Data, attributes: { value: d.value }, children: [{ tag: span, attributes: { class: 'data' }, children: [d.text] }] }
498
+ ]
499
+ }))
500
+ }
501
+ ]
502
+ };
503
+
504
+ $('#example').content(chart);</code></pre>
505
+ </div>
506
+
507
+ <!-- Object DOM Syntax -->
508
+ <div id="axes-column-syntax-object" style="display: none;">
509
+ <pre><script>
510
+ examplify(document.currentScript.nextElementSibling, {
511
+ at: document.currentScript.parentElement,
512
+ scripts: ['/lightview.js', '/lightview-x.js'],
513
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
514
+ type: 'module',
515
+ minHeight: 280
516
+ });
517
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
518
+ const { $ } = Lightview;
519
+
520
+ const chart = {
521
+ Chart: {
522
+ type: 'column',
523
+ labels: true,
524
+ primaryAxis: true,
525
+ secondaryAxis: 'show-10-secondary-axes',
526
+ style: 'width: 100%; max-width: 600px; height: 280px; margin: 0 auto;',
527
+ children: [
528
+ {
529
+ 'Chart.Body': {
530
+ children: [
531
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['A'] } }, { 'Chart.Data': { value: 0.2, children: [{ span: { class: 'data', children: ['20%'] } }] } }] } },
532
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['B'] } }, { 'Chart.Data': { value: 0.4, children: [{ span: { class: 'data', children: ['40%'] } }] } }] } },
533
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['C'] } }, { 'Chart.Data': { value: 0.6, children: [{ span: { class: 'data', children: ['60%'] } }] } }] } },
534
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['D'] } }, { 'Chart.Data': { value: 0.8, children: [{ span: { class: 'data', children: ['80%'] } }] } }] } },
535
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['E'] } }, { 'Chart.Data': { value: 1.0, children: [{ span: { class: 'data', children: ['100%'] } }] } }] } }
536
+ ]
537
+ }
538
+ }
539
+ ]
540
+ }
541
+ };
542
+
543
+ $('#example').content(chart);</code></pre>
544
+ </div>
545
+ </div>
546
+ </div>
547
+
548
+ <!-- Spacing -->
549
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
550
+ <div class="card-body">
551
+ <h2 class="card-title">Spacing</h2>
552
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">
553
+ Control the gap between columns with the <code>spacing</code> prop (1-20).
554
+ </p>
555
+
556
+ <!-- Tabs -->
557
+ <script>
558
+ window.switchSpacingColumnTab = (tabId) => {
559
+ const tabs = ['tagged', 'vdom', 'object'];
560
+ tabs.forEach(t => {
561
+ const tabEl = document.getElementById(`spacing-column-tab-btn-${t}`);
562
+ const contentEl = document.getElementById(`spacing-column-syntax-${t}`);
563
+ if (t === tabId) {
564
+ tabEl.classList.add('syntax-tab-active');
565
+ contentEl.style.display = 'block';
566
+ } else {
567
+ tabEl.classList.remove('syntax-tab-active');
568
+ contentEl.style.display = 'none';
569
+ }
570
+ });
571
+ };
572
+ </script>
573
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
574
+ <button id="spacing-column-tab-btn-tagged" role="tab"
575
+ class="syntax-tab syntax-tab-active"
576
+ onclick="switchSpacingColumnTab('tagged')">Tagged</button>
577
+ <button id="spacing-column-tab-btn-vdom" role="tab" class="syntax-tab"
578
+ onclick="switchSpacingColumnTab('vdom')">vDOM</button>
579
+ <button id="spacing-column-tab-btn-object" role="tab" class="syntax-tab"
580
+ onclick="switchSpacingColumnTab('object')">Object DOM</button>
581
+ </div>
582
+
583
+ <!-- Tagged Syntax -->
584
+ <div id="spacing-column-syntax-tagged">
585
+ <pre><script>
586
+ examplify(document.currentScript.nextElementSibling, {
587
+ at: document.currentScript.parentElement,
588
+ scripts: ['/lightview.js', '/lightview-x.js'],
589
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
590
+ type: 'module',
591
+ minHeight: 200,
592
+ autoRun: true
593
+ });
594
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
595
+ const { tags, $ } = Lightview;
596
+ const { Chart, div } = tags;
597
+
598
+ const charts = div({ style: 'display: flex; gap: 2rem; flex-wrap: wrap;' },
599
+ div({ style: 'flex: 1; min-width: 250px;' },
600
+ div({ style: 'font-weight: bold; margin-bottom: 0.5rem;' }, 'spacing: 2'),
601
+ Chart({ type: 'column', labels: true, spacing: 2, style: 'height: 180px;' },
602
+ Chart.Body({},
603
+ Chart.Row({}, Chart.Label({}, 'A'), Chart.Data({ value: 0.6 })),
604
+ Chart.Row({}, Chart.Label({}, 'B'), Chart.Data({ value: 0.8 })),
605
+ Chart.Row({}, Chart.Label({}, 'C'), Chart.Data({ value: 0.5 })),
606
+ Chart.Row({}, Chart.Label({}, 'D'), Chart.Data({ value: 0.9 }))
607
+ )
608
+ )
609
+ ),
610
+ div({ style: 'flex: 1; min-width: 250px;' },
611
+ div({ style: 'font-weight: bold; margin-bottom: 0.5rem;' }, 'spacing: 15'),
612
+ Chart({ type: 'column', labels: true, spacing: 15, style: 'height: 180px;' },
613
+ Chart.Body({},
614
+ Chart.Row({}, Chart.Label({}, 'A'), Chart.Data({ value: 0.6 })),
615
+ Chart.Row({}, Chart.Label({}, 'B'), Chart.Data({ value: 0.8 })),
616
+ Chart.Row({}, Chart.Label({}, 'C'), Chart.Data({ value: 0.5 })),
617
+ Chart.Row({}, Chart.Label({}, 'D'), Chart.Data({ value: 0.9 }))
618
+ )
619
+ )
620
+ )
621
+ );
622
+
623
+ $('#example').content(charts);</code></pre>
624
+ </div>
625
+
626
+ <!-- vDOM Syntax -->
627
+ <div id="spacing-column-syntax-vdom" style="display: none;">
628
+ <pre><script>
629
+ examplify(document.currentScript.nextElementSibling, {
630
+ at: document.currentScript.parentElement,
631
+ scripts: ['/lightview.js', '/lightview-x.js'],
632
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
633
+ type: 'module',
634
+ minHeight: 200
635
+ });
636
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
637
+ const { tags, $ } = Lightview;
638
+ const { Chart, div } = tags;
639
+
640
+ const data = [
641
+ { label: 'A', value: 0.6 },
642
+ { label: 'B', value: 0.8 },
643
+ { label: 'C', value: 0.5 },
644
+ { label: 'D', value: 0.9 }
645
+ ];
646
+
647
+ const createChart = (spacing) => ({
648
+ tag: div,
649
+ attributes: { style: 'flex: 1; min-width: 250px;' },
650
+ children: [
651
+ { tag: div, attributes: { style: 'font-weight: bold; margin-bottom: 0.5rem;' }, children: [`spacing: ${spacing}`] },
652
+ {
653
+ tag: Chart,
654
+ attributes: { type: 'column', labels: true, spacing, style: 'height: 180px;' },
655
+ children: [
656
+ {
657
+ tag: Chart.Body,
658
+ children: data.map(d => ({
659
+ tag: Chart.Row,
660
+ children: [
661
+ { tag: Chart.Label, children: [d.label] },
662
+ { tag: Chart.Data, attributes: { value: d.value } }
663
+ ]
664
+ }))
665
+ }
666
+ ]
667
+ }
668
+ ]
669
+ });
670
+
671
+ const charts = {
672
+ tag: div,
673
+ attributes: { style: 'display: flex; gap: 2rem; flex-wrap: wrap;' },
674
+ children: [createChart(2), createChart(15)]
675
+ };
676
+
677
+ $('#example').content(charts);</code></pre>
678
+ </div>
679
+
680
+ <!-- Object DOM Syntax -->
681
+ <div id="spacing-column-syntax-object" style="display: none;">
682
+ <pre><script>
683
+ examplify(document.currentScript.nextElementSibling, {
684
+ at: document.currentScript.parentElement,
685
+ scripts: ['/lightview.js', '/lightview-x.js'],
686
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
687
+ type: 'module',
688
+ minHeight: 200
689
+ });
690
+ </script><code contenteditable="true">await import('/components/data-display/chart.js');
691
+ const { $ } = Lightview;
692
+
693
+ const chartData = [
694
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['A'] } }, { 'Chart.Data': { value: 0.6 } }] } },
695
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['B'] } }, { 'Chart.Data': { value: 0.8 } }] } },
696
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['C'] } }, { 'Chart.Data': { value: 0.5 } }] } },
697
+ { 'Chart.Row': { children: [{ 'Chart.Label': { children: ['D'] } }, { 'Chart.Data': { value: 0.9 } }] } }
698
+ ];
699
+
700
+ const charts = {
701
+ div: {
702
+ style: 'display: flex; gap: 2rem; flex-wrap: wrap;',
703
+ children: [
704
+ {
705
+ div: {
706
+ style: 'flex: 1; min-width: 250px;',
707
+ children: [
708
+ { div: { style: 'font-weight: bold; margin-bottom: 0.5rem;', children: ['spacing: 2'] } },
709
+ { Chart: { type: 'column', labels: true, spacing: 2, style: 'height: 180px;', children: [{ 'Chart.Body': { children: chartData } }] } }
710
+ ]
711
+ }
712
+ },
713
+ {
714
+ div: {
715
+ style: 'flex: 1; min-width: 250px;',
716
+ children: [
717
+ { div: { style: 'font-weight: bold; margin-bottom: 0.5rem;', children: ['spacing: 15'] } },
718
+ { Chart: { type: 'column', labels: true, spacing: 15, style: 'height: 180px;', children: [{ 'Chart.Body': { children: chartData } }] } }
719
+ ]
720
+ }
721
+ }
722
+ ]
723
+ }
724
+ };
725
+
726
+ $('#example').content(charts);</code></pre>
727
+ </div>
728
+ </div>
729
+ </div>
730
+
731
+ </div>
732
+ </div>
733
+ </div>
734
+ </div>
735
+ </div>