MartinT commited on
Commit
7fb4051
1 Parent(s): 281e6e5

feat: Make autocomplete work.

Browse files
examples/__pycache__/tour.cpython-39.pyc CHANGED
Binary files a/examples/__pycache__/tour.cpython-39.pyc and b/examples/__pycache__/tour.cpython-39.pyc differ
 
examples/base-snippets.json ADDED
@@ -0,0 +1,910 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Base Wave app": {
3
+ "prefix": "w_app_base",
4
+ "body": [
5
+ "from h2o_wave import main, app, Q, ui",
6
+ "",
7
+ "",
8
+ "@app('/$1')",
9
+ "async def serve(q: Q):",
10
+ " $0",
11
+ " await q.page.save()",
12
+ ""
13
+ ],
14
+ "description": "Basic scaffolding for a wave app."
15
+ },
16
+ "Wave client initialization": {
17
+ "prefix": "w_init_client",
18
+ "body": [
19
+ "if not q.client.initialized:",
20
+ " $0",
21
+ " q.client.initialized = True"
22
+ ],
23
+ "description": "Client level initialization logic."
24
+ },
25
+ "Wave app initialization": {
26
+ "prefix": "w_init_app",
27
+ "body": [
28
+ "if not q.app.initialized:",
29
+ " $0",
30
+ " q.app.initialized = True"
31
+ ],
32
+ "description": "App-level initialization logic."
33
+ },
34
+ "Wave user initialization": {
35
+ "prefix": "w_init_user",
36
+ "body": [
37
+ "if not q.user.initialized:",
38
+ " $0",
39
+ " q.user.initialized = True"
40
+ ],
41
+ "description": "User level initialization logic."
42
+ },
43
+ "Base Wave script": {
44
+ "prefix": "w_script_base",
45
+ "body": [
46
+ "from h2o_wave import site, ui",
47
+ "",
48
+ "page = site['/$1']",
49
+ "$0",
50
+ "page.save()"
51
+ ],
52
+ "description": "Basic scaffolding for a wave script."
53
+ },
54
+ "Wave page": {
55
+ "prefix": "w_page",
56
+ "body": [
57
+ "q.page['$1'] = $0"
58
+ ],
59
+ "description": "Creates a new page for a card."
60
+ },
61
+ "Drop Wave page": {
62
+ "prefix": "w_page_drop",
63
+ "body": [
64
+ "q.page.drop()$0"
65
+ ],
66
+ "description": "Deletes all Wave cards."
67
+ },
68
+ "Wave site upload": {
69
+ "prefix": "w_site_upload",
70
+ "body": [
71
+ "q.app.file1,$0 = await q.site.upload([${1}])"
72
+ ],
73
+ "description": "Uploads static files to Wave server"
74
+ },
75
+ "Wave meta page": {
76
+ "prefix": "w_meta",
77
+ "body": [
78
+ "q.page['meta']$0"
79
+ ],
80
+ "description": "Shorthand for accessing meta card."
81
+ },
82
+ "Wave on handler": {
83
+ "prefix": "w_on",
84
+ "body": [
85
+ "@on()",
86
+ "async def $1(q: Q):",
87
+ " $0"
88
+ ],
89
+ "description": "Wave interactivity handler."
90
+ },
91
+ "Wave on route handler": {
92
+ "prefix": "w_on_route",
93
+ "body": [
94
+ "@on(arg='#$1')",
95
+ "async def handle_$1(q: Q):",
96
+ " $0",
97
+ " await q.page.save()",
98
+ ""
99
+ ],
100
+ "description": "Wave route handler."
101
+ },
102
+ "Wave on route param handler": {
103
+ "prefix": "w_on_route_param",
104
+ "body": [
105
+ "@on(arg='#$1/{$2}')",
106
+ "async def handle_$1(q: Q, $2: str):",
107
+ " $0",
108
+ " await q.page.save()",
109
+ ""
110
+ ],
111
+ "description": "Wave route handler with URL param."
112
+ },
113
+ "Wave page delete": {
114
+ "prefix": "w_page_delete",
115
+ "body": [
116
+ "del q.page['$1']$0"
117
+ ],
118
+ "description": "Delete a specific Wave card."
119
+ },
120
+ "Wave app template with a header": {
121
+ "prefix": "w_app_header",
122
+ "body": [
123
+ "from h2o_wave import main, app, Q, ui, on, handle_on",
124
+ "",
125
+ "",
126
+ "@app('/')",
127
+ "async def serve(q: Q):",
128
+ " # First time a browser comes to the app",
129
+ " if not q.client.initialized:",
130
+ " await init(q)",
131
+ " q.client.initialized = True",
132
+ "",
133
+ " # Other browser interactions",
134
+ " await handle_on(q)",
135
+ " await q.page.save()",
136
+ "",
137
+ "",
138
+ "async def init(q: Q) -> None:",
139
+ " q.client.cards = set()",
140
+ " q.client.dark_mode = False",
141
+ "",
142
+ " q.page['meta'] = ui.meta_card(",
143
+ " box='',",
144
+ " title='My Wave App',",
145
+ " theme='light',",
146
+ " layouts=[",
147
+ " ui.layout(",
148
+ " breakpoint='xs',",
149
+ " min_height='100vh',",
150
+ " max_width='1200px',",
151
+ " zones=[",
152
+ " ui.zone('header'),",
153
+ " ui.zone('content', size='1', zones=[",
154
+ " ui.zone('horizontal', direction=ui.ZoneDirection.ROW),",
155
+ " ui.zone('vertical', size='1', ),",
156
+ " ui.zone('grid', direction=ui.ZoneDirection.ROW, wrap='stretch', justify='center')",
157
+ " ]),",
158
+ " ui.zone(name='footer'),",
159
+ " ]",
160
+ " )",
161
+ " ]",
162
+ " )",
163
+ " q.page['header'] = ui.header_card(",
164
+ " box='header',",
165
+ " title='My Wave App',",
166
+ " subtitle=\"Example to get us started\",",
167
+ " image='https://wave.h2o.ai/img/h2o-logo.svg',",
168
+ " items=[ui.menu(icon='', items=[ui.command(name='change_theme', icon='ClearNight', label='Dark Mode')])]",
169
+ " )",
170
+ " q.page['footer'] = ui.footer_card(",
171
+ " box='footer',",
172
+ " caption='Made with 💛 using [H2O Wave](https://wave.h2o.ai).'",
173
+ " )",
174
+ "",
175
+ " await home(q)",
176
+ "",
177
+ "",
178
+ "@on()",
179
+ "async def home(q: Q):",
180
+ " clear_cards(q)",
181
+ " add_card(q, 'form', ui.form_card(box='vertical', items=[ui.text('This is my app!')]))",
182
+ "",
183
+ "",
184
+ "@on()",
185
+ "async def change_theme(q: Q):",
186
+ " \"\"\"Change the app from light to dark mode\"\"\"",
187
+ " if q.client.dark_mode:",
188
+ " q.page[\"header\"].items = [ui.menu([ui.command(name='change_theme', icon='ClearNight', label='Dark mode')])]",
189
+ " q.page[\"meta\"].theme = \"light\"",
190
+ " q.client.dark_mode = False",
191
+ " else:",
192
+ " q.page[\"header\"].items = [ui.menu([ui.command(name='change_theme', icon='Sunny', label='Light mode')])]",
193
+ " q.page[\"meta\"].theme = \"h2o-dark\"",
194
+ " q.client.dark_mode = True",
195
+ "",
196
+ "",
197
+ "# Use for cards that should be deleted on calling `clear_cards`. Useful for routing and page updates.",
198
+ "def add_card(q, name, card) -> None:",
199
+ " q.client.cards.add(name)",
200
+ " q.page[name] = card",
201
+ "",
202
+ "",
203
+ "def clear_cards(q, ignore=[]) -> None:",
204
+ " for name in q.client.cards.copy():",
205
+ " if name not in ignore:",
206
+ " del q.page[name]",
207
+ " q.client.cards.remove(name)",
208
+ ""
209
+ ],
210
+ "description": "A simple app with a header and a body."
211
+ },
212
+ "Wave app template with sidebar": {
213
+ "prefix": "w_app_sidebar_nav",
214
+ "body": [
215
+ "from h2o_wave import main, app, Q, ui, on, handle_on, data",
216
+ "from typing import Optional, List",
217
+ "",
218
+ "",
219
+ "# Use for page cards that should be removed when navigating away.",
220
+ "# For pages that should be always present on screen use q.page[key] = ...",
221
+ "def add_card(q, name, card) -> None:",
222
+ " q.client.cards.add(name)",
223
+ " q.page[name] = card",
224
+ "",
225
+ "",
226
+ "# Remove all the cards related to navigation.",
227
+ "def clear_cards(q, ignore: Optional[List[str]] = []) -> None:",
228
+ " if not q.client.cards:",
229
+ " return",
230
+ "",
231
+ " for name in q.client.cards.copy():",
232
+ " if name not in ignore:",
233
+ " del q.page[name]",
234
+ " q.client.cards.remove(name)",
235
+ "",
236
+ "",
237
+ "@on('#page1')",
238
+ "async def page1(q: Q):",
239
+ " q.page['sidebar'].value = '#page1'",
240
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
241
+ "",
242
+ " for i in range(3):",
243
+ " add_card(q, f'info{i}', ui.tall_info_card(box='horizontal', name='', title='Speed',",
244
+ " caption='The models are performant thanks to...', icon='SpeedHigh'))",
245
+ " add_card(q, 'article', ui.tall_article_preview_card(",
246
+ " box=ui.box('vertical', height='600px'), title='How does magic work',",
247
+ " image='https://images.pexels.com/photos/624015/pexels-photo-624015.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1',",
248
+ " content='''",
249
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac sodales felis. Duis orci enim, iaculis at augue vel, mattis imperdiet ligula. Sed a placerat lacus, vitae viverra ante. Duis laoreet purus sit amet orci lacinia, non facilisis ipsum venenatis. Duis bibendum malesuada urna. Praesent vehicula tempor volutpat. In sem augue, blandit a tempus sit amet, tristique vehicula nisl. Duis molestie vel nisl a blandit. Nunc mollis ullamcorper elementum.",
250
+ "Donec in erat augue. Nullam mollis ligula nec massa semper, laoreet pellentesque nulla ullamcorper. In ante ex, tristique et mollis id, facilisis non metus. Aliquam neque eros, semper id finibus eu, pellentesque ac magna. Aliquam convallis eros ut erat mollis, sit amet scelerisque ex pretium. Nulla sodales lacus a tellus molestie blandit. Praesent molestie elit viverra, congue purus vel, cursus sem. Donec malesuada libero ut nulla bibendum, in condimentum massa pretium. Aliquam erat volutpat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer vel tincidunt purus, congue suscipit neque. Fusce eget lacus nibh. Sed vestibulum neque id erat accumsan, a faucibus leo malesuada. Curabitur varius ligula a velit aliquet tincidunt. Donec vehicula ligula sit amet nunc tempus, non fermentum odio rhoncus.",
251
+ "Vestibulum condimentum consectetur aliquet. Phasellus mollis at nulla vel blandit. Praesent at ligula nulla. Curabitur enim tellus, congue id tempor at, malesuada sed augue. Nulla in justo in libero condimentum euismod. Integer aliquet, velit id convallis maximus, nisl dui porta velit, et pellentesque ligula lorem non nunc. Sed tincidunt purus non elit ultrices egestas quis eu mauris. Sed molestie vulputate enim, a vehicula nibh pulvinar sit amet. Nullam auctor sapien est, et aliquet dui congue ornare. Donec pulvinar scelerisque justo, nec scelerisque velit maximus eget. Ut ac lectus velit. Pellentesque bibendum ex sit amet cursus commodo. Fusce congue metus at elementum ultricies. Suspendisse non rhoncus risus. In hac habitasse platea dictumst.",
252
+ " '''",
253
+ " ))",
254
+ "",
255
+ "",
256
+ "@on('#page2')",
257
+ "async def page2(q: Q):",
258
+ " q.page['sidebar'].value = '#page2'",
259
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
260
+ " add_card(q, 'chart1', ui.plot_card(",
261
+ " box='horizontal',",
262
+ " title='Chart 1',",
263
+ " data=data('category country product price', 10, rows=[",
264
+ " ('G1', 'USA', 'P1', 124),",
265
+ " ('G1', 'China', 'P2', 580),",
266
+ " ('G1', 'USA', 'P3', 528),",
267
+ " ('G1', 'China', 'P1', 361),",
268
+ " ('G1', 'USA', 'P2', 228),",
269
+ " ('G2', 'China', 'P3', 418),",
270
+ " ('G2', 'USA', 'P1', 824),",
271
+ " ('G2', 'China', 'P2', 539),",
272
+ " ('G2', 'USA', 'P3', 712),",
273
+ " ('G2', 'USA', 'P1', 213),",
274
+ " ]),",
275
+ " plot=ui.plot([ui.mark(type='interval', x='=product', y='=price', color='=country', stack='auto',",
276
+ " dodge='=category', y_min=0)])",
277
+ " ))",
278
+ " add_card(q, 'chart2', ui.plot_card(",
279
+ " box='horizontal',",
280
+ " title='Chart 2',",
281
+ " data=data('date price', 10, rows=[",
282
+ " ('2020-03-20', 124),",
283
+ " ('2020-05-18', 580),",
284
+ " ('2020-08-24', 528),",
285
+ " ('2020-02-12', 361),",
286
+ " ('2020-03-11', 228),",
287
+ " ('2020-09-26', 418),",
288
+ " ('2020-11-12', 824),",
289
+ " ('2020-12-21', 539),",
290
+ " ('2020-03-18', 712),",
291
+ " ('2020-07-11', 213),",
292
+ " ]),",
293
+ " plot=ui.plot([ui.mark(type='line', x_scale='time', x='=date', y='=price', y_min=0)])",
294
+ " ))",
295
+ " add_card(q, 'table', ui.form_card(box='vertical', items=[ui.table(",
296
+ " name='table',",
297
+ " downloadable=True,",
298
+ " resettable=True,",
299
+ " groupable=True,",
300
+ " columns=[",
301
+ " ui.table_column(name='text', label='Process', searchable=True),",
302
+ " ui.table_column(name='tag', label='Status', filterable=True, cell_type=ui.tag_table_cell_type(",
303
+ " name='tags',",
304
+ " tags=[",
305
+ " ui.tag(label='FAIL', color='\\$red'),",
306
+ " ui.tag(label='DONE', color='#D2E3F8', label_color='#053975'),",
307
+ " ui.tag(label='SUCCESS', color='\\$mint'),",
308
+ " ]",
309
+ " ))",
310
+ " ],",
311
+ " rows=[",
312
+ " ui.table_row(name='row1', cells=['Process 1', 'FAIL']),",
313
+ " ui.table_row(name='row2', cells=['Process 2', 'SUCCESS,DONE']),",
314
+ " ui.table_row(name='row3', cells=['Process 3', 'DONE']),",
315
+ " ui.table_row(name='row4', cells=['Process 4', 'FAIL']),",
316
+ " ui.table_row(name='row5', cells=['Process 5', 'SUCCESS,DONE']),",
317
+ " ui.table_row(name='row6', cells=['Process 6', 'DONE']),",
318
+ " ])",
319
+ " ]))",
320
+ "",
321
+ "",
322
+ "@on('#page3')",
323
+ "async def page3(q: Q):",
324
+ " q.page['sidebar'].value = '#page3'",
325
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
326
+ "",
327
+ " for i in range(12):",
328
+ " add_card(q, f'item{i}', ui.wide_info_card(box=ui.box('grid', width='400px'), name='', title='Tile',",
329
+ " caption='Lorem ipsum dolor sit amet'))",
330
+ "",
331
+ "",
332
+ "@on('#page4')",
333
+ "async def handle_page4(q: Q):",
334
+ " q.page['sidebar'].value = '#page4'",
335
+ " # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
336
+ " # Since this page is interactive, we want to update its card instead of recreating it every time, so ignore 'form' card on drop.",
337
+ " clear_cards(q, ['form'])",
338
+ "",
339
+ " if q.args.step1:",
340
+ " # Just update the existing card, do not recreate.",
341
+ " q.page['form'].items = [",
342
+ " ui.stepper(name='stepper', items=[",
343
+ " ui.step(label='Step 1'),",
344
+ " ui.step(label='Step 2'),",
345
+ " ui.step(label='Step 3'),",
346
+ " ]),",
347
+ " ui.textbox(name='textbox2', label='Textbox 1'),",
348
+ " ui.buttons(justify='end', items=[",
349
+ " ui.button(name='step2', label='Next', primary=True),",
350
+ " ])",
351
+ " ]",
352
+ " elif q.args.step2:",
353
+ " # Just update the existing card, do not recreate.",
354
+ " q.page['form'].items = [",
355
+ " ui.stepper(name='stepper', items=[",
356
+ " ui.step(label='Step 1', done=True),",
357
+ " ui.step(label='Step 2'),",
358
+ " ui.step(label='Step 3'),",
359
+ " ]),",
360
+ " ui.textbox(name='textbox2', label='Textbox 2'),",
361
+ " ui.buttons(justify='end', items=[",
362
+ " ui.button(name='step1', label='Cancel'),",
363
+ " ui.button(name='step3', label='Next', primary=True),",
364
+ " ])",
365
+ " ]",
366
+ " elif q.args.step3:",
367
+ " # Just update the existing card, do not recreate.",
368
+ " q.page['form'].items = [",
369
+ " ui.stepper(name='stepper', items=[",
370
+ " ui.step(label='Step 1', done=True),",
371
+ " ui.step(label='Step 2', done=True),",
372
+ " ui.step(label='Step 3'),",
373
+ " ]),",
374
+ " ui.textbox(name='textbox3', label='Textbox 3'),",
375
+ " ui.buttons(justify='end', items=[",
376
+ " ui.button(name='step2', label='Cancel'),",
377
+ " ui.button(name='submit', label='Next', primary=True),",
378
+ " ])",
379
+ " ]",
380
+ " else:",
381
+ " # If first time on this page, create the card.",
382
+ " add_card(q, 'form', ui.form_card(box='vertical', items=[",
383
+ " ui.stepper(name='stepper', items=[",
384
+ " ui.step(label='Step 1'),",
385
+ " ui.step(label='Step 2'),",
386
+ " ui.step(label='Step 3'),",
387
+ " ]),",
388
+ " ui.textbox(name='textbox1', label='Textbox 1'),",
389
+ " ui.buttons(justify='end', items=[",
390
+ " ui.button(name='step2', label='Next', primary=True),",
391
+ " ]),",
392
+ " ]))",
393
+ "",
394
+ "",
395
+ "async def init(q: Q) -> None:",
396
+ " q.page['meta'] = ui.meta_card(box='', layouts=[ui.layout(breakpoint='xs', min_height='100vh', zones=[",
397
+ " ui.zone('main', size='1', direction=ui.ZoneDirection.ROW, zones=[",
398
+ " ui.zone('sidebar', size='250px'),",
399
+ " ui.zone('body', zones=[",
400
+ " ui.zone('content', zones=[",
401
+ " # Specify various zones and use the one that is currently needed. Empty zones are ignored.",
402
+ " ui.zone('horizontal', direction=ui.ZoneDirection.ROW),",
403
+ " ui.zone('vertical'),",
404
+ " ui.zone('grid', direction=ui.ZoneDirection.ROW, wrap='stretch', justify='center')",
405
+ " ]),",
406
+ " ]),",
407
+ " ])",
408
+ " ])])",
409
+ " q.page['sidebar'] = ui.nav_card(",
410
+ " box='sidebar', color='primary', title='My App', subtitle=\"Let's conquer the world!\",",
411
+ " value=f'#{q.args[\"#\"]}' if q.args['#'] else '#page1',",
412
+ " image='https://wave.h2o.ai/img/h2o-logo.svg', items=[",
413
+ " ui.nav_group('Menu', items=[",
414
+ " ui.nav_item(name='#page1', label='Home'),",
415
+ " ui.nav_item(name='#page2', label='Charts'),",
416
+ " ui.nav_item(name='#page3', label='Grid'),",
417
+ " ui.nav_item(name='#page4', label='Form'),",
418
+ " ]),",
419
+ " ],",
420
+ " secondary_items=[",
421
+ " ui.persona(title='John Doe', subtitle='Developer', size='s',",
422
+ " image='https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&h=750&w=1260'),",
423
+ " ]",
424
+ " )",
425
+ "",
426
+ " # If no active hash present, render page1.",
427
+ " if q.args['#'] is None:",
428
+ " await page1(q)",
429
+ "",
430
+ "",
431
+ "@app('/')",
432
+ "async def serve(q: Q):",
433
+ " # Run only once per client connection.",
434
+ " if not q.client.initialized:",
435
+ " q.client.cards = set()",
436
+ " await init(q)",
437
+ " q.client.initialized = True",
438
+ "",
439
+ " # Handle routing.",
440
+ " await handle_on(q)",
441
+ " await q.page.save()",
442
+ ""
443
+ ],
444
+ "description": "An app template with both sidebar and navigation."
445
+ },
446
+ "Wave app template with a header navigation": {
447
+ "prefix": "w_app_header_nav",
448
+ "body": [
449
+ "from h2o_wave import main, app, Q, ui, on, handle_on, data",
450
+ "from typing import Optional, List",
451
+ "",
452
+ "",
453
+ "# Use for page cards that should be removed when navigating away.",
454
+ "# For pages that should be always present on screen use q.page[key] = ...",
455
+ "def add_card(q, name, card) -> None:",
456
+ " q.client.cards.add(name)",
457
+ " q.page[name] = card",
458
+ "",
459
+ "",
460
+ "# Remove all the cards related to navigation.",
461
+ "def clear_cards(q, ignore: Optional[List[str]] = []) -> None:",
462
+ " if not q.client.cards:",
463
+ " return",
464
+ " for name in q.client.cards.copy():",
465
+ " if name not in ignore:",
466
+ " del q.page[name]",
467
+ " q.client.cards.remove(name)",
468
+ "",
469
+ "",
470
+ "@on('#page1')",
471
+ "async def page1(q: Q):",
472
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
473
+ "",
474
+ " for i in range(3):",
475
+ " add_card(q, f'info{i}', ui.tall_info_card(box='horizontal', name='', title='Speed',",
476
+ " caption='The models are performant thanks to...', icon='SpeedHigh'))",
477
+ " add_card(q, 'article', ui.tall_article_preview_card(",
478
+ " box=ui.box('vertical', height='600px'), title='How does magic work',",
479
+ " image='https://images.pexels.com/photos/624015/pexels-photo-624015.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1',",
480
+ " content='''",
481
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac sodales felis. Duis orci enim, iaculis at augue vel, mattis imperdiet ligula. Sed a placerat lacus, vitae viverra ante. Duis laoreet purus sit amet orci lacinia, non facilisis ipsum venenatis. Duis bibendum malesuada urna. Praesent vehicula tempor volutpat. In sem augue, blandit a tempus sit amet, tristique vehicula nisl. Duis molestie vel nisl a blandit. Nunc mollis ullamcorper elementum.",
482
+ "Donec in erat augue. Nullam mollis ligula nec massa semper, laoreet pellentesque nulla ullamcorper. In ante ex, tristique et mollis id, facilisis non metus. Aliquam neque eros, semper id finibus eu, pellentesque ac magna. Aliquam convallis eros ut erat mollis, sit amet scelerisque ex pretium. Nulla sodales lacus a tellus molestie blandit. Praesent molestie elit viverra, congue purus vel, cursus sem. Donec malesuada libero ut nulla bibendum, in condimentum massa pretium. Aliquam erat volutpat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer vel tincidunt purus, congue suscipit neque. Fusce eget lacus nibh. Sed vestibulum neque id erat accumsan, a faucibus leo malesuada. Curabitur varius ligula a velit aliquet tincidunt. Donec vehicula ligula sit amet nunc tempus, non fermentum odio rhoncus.",
483
+ "Vestibulum condimentum consectetur aliquet. Phasellus mollis at nulla vel blandit. Praesent at ligula nulla. Curabitur enim tellus, congue id tempor at, malesuada sed augue. Nulla in justo in libero condimentum euismod. Integer aliquet, velit id convallis maximus, nisl dui porta velit, et pellentesque ligula lorem non nunc. Sed tincidunt purus non elit ultrices egestas quis eu mauris. Sed molestie vulputate enim, a vehicula nibh pulvinar sit amet. Nullam auctor sapien est, et aliquet dui congue ornare. Donec pulvinar scelerisque justo, nec scelerisque velit maximus eget. Ut ac lectus velit. Pellentesque bibendum ex sit amet cursus commodo. Fusce congue metus at elementum ultricies. Suspendisse non rhoncus risus. In hac habitasse platea dictumst.",
484
+ " '''",
485
+ " ))",
486
+ "",
487
+ "",
488
+ "@on('#page2')",
489
+ "async def page2(q: Q):",
490
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
491
+ " add_card(q, 'chart1', ui.plot_card(",
492
+ " box='horizontal',",
493
+ " title='Chart 1',",
494
+ " data=data('category country product price', 10, rows=[",
495
+ " ('G1', 'USA', 'P1', 124),",
496
+ " ('G1', 'China', 'P2', 580),",
497
+ " ('G1', 'USA', 'P3', 528),",
498
+ " ('G1', 'China', 'P1', 361),",
499
+ " ('G1', 'USA', 'P2', 228),",
500
+ " ('G2', 'China', 'P3', 418),",
501
+ " ('G2', 'USA', 'P1', 824),",
502
+ " ('G2', 'China', 'P2', 539),",
503
+ " ('G2', 'USA', 'P3', 712),",
504
+ " ('G2', 'USA', 'P1', 213),",
505
+ " ]),",
506
+ " plot=ui.plot([ui.mark(type='interval', x='=product', y='=price', color='=country', stack='auto',",
507
+ " dodge='=category', y_min=0)])",
508
+ " ))",
509
+ " add_card(q, 'chart2', ui.plot_card(",
510
+ " box='horizontal',",
511
+ " title='Chart 2',",
512
+ " data=data('date price', 10, rows=[",
513
+ " ('2020-03-20', 124),",
514
+ " ('2020-05-18', 580),",
515
+ " ('2020-08-24', 528),",
516
+ " ('2020-02-12', 361),",
517
+ " ('2020-03-11', 228),",
518
+ " ('2020-09-26', 418),",
519
+ " ('2020-11-12', 824),",
520
+ " ('2020-12-21', 539),",
521
+ " ('2020-03-18', 712),",
522
+ " ('2020-07-11', 213),",
523
+ " ]),",
524
+ " plot=ui.plot([ui.mark(type='line', x_scale='time', x='=date', y='=price', y_min=0)])",
525
+ " ))",
526
+ " add_card(q, 'table', ui.form_card(box='vertical', items=[ui.table(",
527
+ " name='table',",
528
+ " downloadable=True,",
529
+ " resettable=True,",
530
+ " groupable=True,",
531
+ " columns=[",
532
+ " ui.table_column(name='text', label='Process', searchable=True),",
533
+ " ui.table_column(name='tag', label='Status', filterable=True, cell_type=ui.tag_table_cell_type(",
534
+ " name='tags',",
535
+ " tags=[",
536
+ " ui.tag(label='FAIL', color='\\$red'),",
537
+ " ui.tag(label='DONE', color='#D2E3F8', label_color='#053975'),",
538
+ " ui.tag(label='SUCCESS', color='\\$mint'),",
539
+ " ]",
540
+ " ))",
541
+ " ],",
542
+ " rows=[",
543
+ " ui.table_row(name='row1', cells=['Process 1', 'FAIL']),",
544
+ " ui.table_row(name='row2', cells=['Process 2', 'SUCCESS,DONE']),",
545
+ " ui.table_row(name='row3', cells=['Process 3', 'DONE']),",
546
+ " ui.table_row(name='row4', cells=['Process 4', 'FAIL']),",
547
+ " ui.table_row(name='row5', cells=['Process 5', 'SUCCESS,DONE']),",
548
+ " ui.table_row(name='row6', cells=['Process 6', 'DONE']),",
549
+ " ])",
550
+ " ]))",
551
+ "",
552
+ "",
553
+ "@on('#page3')",
554
+ "async def page3(q: Q):",
555
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
556
+ "",
557
+ " for i in range(12):",
558
+ " add_card(q, f'item{i}', ui.wide_info_card(box=ui.box('grid', width='400px'), name='', title='Tile',",
559
+ " caption='Lorem ipsum dolor sit amet'))",
560
+ "",
561
+ "",
562
+ "@on('#page4')",
563
+ "async def handle_page4(q: Q):",
564
+ " # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
565
+ " # Since this page is interactive, we want to update its card instead of recreating it every time, so ignore 'form' card on drop.",
566
+ " clear_cards(q, ['form'])",
567
+ "",
568
+ " if q.args.step1:",
569
+ " # Just update the existing card, do not recreate.",
570
+ " q.page['form'].items = [",
571
+ " ui.stepper(name='stepper', items=[",
572
+ " ui.step(label='Step 1'),",
573
+ " ui.step(label='Step 2'),",
574
+ " ui.step(label='Step 3'),",
575
+ " ]),",
576
+ " ui.textbox(name='textbox2', label='Textbox 1'),",
577
+ " ui.buttons(justify='end', items=[",
578
+ " ui.button(name='step2', label='Next', primary=True),",
579
+ " ])",
580
+ " ]",
581
+ " elif q.args.step2:",
582
+ " # Just update the existing card, do not recreate.",
583
+ " q.page['form'].items = [",
584
+ " ui.stepper(name='stepper', items=[",
585
+ " ui.step(label='Step 1', done=True),",
586
+ " ui.step(label='Step 2'),",
587
+ " ui.step(label='Step 3'),",
588
+ " ]),",
589
+ " ui.textbox(name='textbox2', label='Textbox 2'),",
590
+ " ui.buttons(justify='end', items=[",
591
+ " ui.button(name='step1', label='Cancel'),",
592
+ " ui.button(name='step3', label='Next', primary=True),",
593
+ " ])",
594
+ " ]",
595
+ " elif q.args.step3:",
596
+ " # Just update the existing card, do not recreate.",
597
+ " q.page['form'].items = [",
598
+ " ui.stepper(name='stepper', items=[",
599
+ " ui.step(label='Step 1', done=True),",
600
+ " ui.step(label='Step 2', done=True),",
601
+ " ui.step(label='Step 3'),",
602
+ " ]),",
603
+ " ui.textbox(name='textbox3', label='Textbox 3'),",
604
+ " ui.buttons(justify='end', items=[",
605
+ " ui.button(name='step2', label='Cancel'),",
606
+ " ui.button(name='submit', label='Next', primary=True),",
607
+ " ])",
608
+ " ]",
609
+ " else:",
610
+ " # If first time on this page, create the card.",
611
+ " add_card(q, 'form', ui.form_card(box='vertical', items=[",
612
+ " ui.stepper(name='stepper', items=[",
613
+ " ui.step(label='Step 1'),",
614
+ " ui.step(label='Step 2'),",
615
+ " ui.step(label='Step 3'),",
616
+ " ]),",
617
+ " ui.textbox(name='textbox1', label='Textbox 1'),",
618
+ " ui.buttons(justify='end', items=[",
619
+ " ui.button(name='step2', label='Next', primary=True),",
620
+ " ]),",
621
+ " ]))",
622
+ "",
623
+ "",
624
+ "async def init(q: Q) -> None:",
625
+ " q.page['meta'] = ui.meta_card(box='', layouts=[ui.layout(breakpoint='xs', min_height='100vh', zones=[",
626
+ " ui.zone('header'),",
627
+ " ui.zone('content', zones=[",
628
+ " # Specify various zones and use the one that is currently needed. Empty zones are ignored.",
629
+ " ui.zone('horizontal', direction=ui.ZoneDirection.ROW),",
630
+ " ui.zone('vertical'),",
631
+ " ui.zone('grid', direction=ui.ZoneDirection.ROW, wrap='stretch', justify='center')",
632
+ " ]),",
633
+ " ])])",
634
+ " q.page['header'] = ui.header_card(",
635
+ " box='header', title='My app', subtitle=\"Let's conquer the world\",",
636
+ " image='https://wave.h2o.ai/img/h2o-logo.svg',",
637
+ " secondary_items=[",
638
+ " ui.tabs(name='tabs', value=f'#{q.args[\"#\"]}' if q.args['#'] else '#page1', link=True, items=[",
639
+ " ui.tab(name='#page1', label='Home'),",
640
+ " ui.tab(name='#page2', label='Charts'),",
641
+ " ui.tab(name='#page3', label='Grid'),",
642
+ " ui.tab(name='#page4', label='Form'),",
643
+ " ]),",
644
+ " ],",
645
+ " items=[",
646
+ " ui.persona(title='John Doe', subtitle='Developer', size='xs',",
647
+ " image='https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&h=750&w=1260'),",
648
+ " ]",
649
+ " )",
650
+ " # If no active hash present, render page1.",
651
+ " if q.args['#'] is None:",
652
+ " await page1(q)",
653
+ "",
654
+ "",
655
+ "@app('/')",
656
+ "async def serve(q: Q):",
657
+ " # Run only once per client connection.",
658
+ " if not q.client.initialized:",
659
+ " q.client.cards = set()",
660
+ " await init(q)",
661
+ " q.client.initialized = True",
662
+ "",
663
+ " # Handle routing.",
664
+ " await handle_on(q)",
665
+ " await q.page.save()",
666
+ "",
667
+ ""
668
+ ],
669
+ "description": "An app template with a header and navigation."
670
+ },
671
+ "Wave app template with a header and sidebar navigation": {
672
+ "prefix": "w_app_header_sidebar_nav",
673
+ "body": [
674
+ "",
675
+ "from h2o_wave import main, app, Q, ui, on, handle_on, data",
676
+ "from typing import Optional, List",
677
+ "",
678
+ "",
679
+ "# Use for page cards that should be removed when navigating away.",
680
+ "# For pages that should be always present on screen use q.page[key] = ...",
681
+ "def add_card(q, name, card) -> None:",
682
+ " q.client.cards.add(name)",
683
+ " q.page[name] = card",
684
+ "",
685
+ "",
686
+ "# Remove all the cards related to navigation.",
687
+ "def clear_cards(q, ignore: Optional[List[str]] = []) -> None:",
688
+ " if not q.client.cards:",
689
+ " return",
690
+ "",
691
+ " for name in q.client.cards.copy():",
692
+ " if name not in ignore:",
693
+ " del q.page[name]",
694
+ " q.client.cards.remove(name)",
695
+ "",
696
+ "",
697
+ "@on('#page1')",
698
+ "async def page1(q: Q):",
699
+ " q.page['sidebar'].value = '#page1'",
700
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
701
+ "",
702
+ " for i in range(3):",
703
+ " add_card(q, f'info{i}', ui.tall_info_card(box='horizontal', name='', title='Speed',",
704
+ " caption='The models are performant thanks to...', icon='SpeedHigh'))",
705
+ " add_card(q, 'article', ui.tall_article_preview_card(",
706
+ " box=ui.box('vertical', height='600px'), title='How does magic work',",
707
+ " image='https://images.pexels.com/photos/624015/pexels-photo-624015.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1',",
708
+ " content='''",
709
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ac sodales felis. Duis orci enim, iaculis at augue vel, mattis imperdiet ligula. Sed a placerat lacus, vitae viverra ante. Duis laoreet purus sit amet orci lacinia, non facilisis ipsum venenatis. Duis bibendum malesuada urna. Praesent vehicula tempor volutpat. In sem augue, blandit a tempus sit amet, tristique vehicula nisl. Duis molestie vel nisl a blandit. Nunc mollis ullamcorper elementum.",
710
+ "Donec in erat augue. Nullam mollis ligula nec massa semper, laoreet pellentesque nulla ullamcorper. In ante ex, tristique et mollis id, facilisis non metus. Aliquam neque eros, semper id finibus eu, pellentesque ac magna. Aliquam convallis eros ut erat mollis, sit amet scelerisque ex pretium. Nulla sodales lacus a tellus molestie blandit. Praesent molestie elit viverra, congue purus vel, cursus sem. Donec malesuada libero ut nulla bibendum, in condimentum massa pretium. Aliquam erat volutpat. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer vel tincidunt purus, congue suscipit neque. Fusce eget lacus nibh. Sed vestibulum neque id erat accumsan, a faucibus leo malesuada. Curabitur varius ligula a velit aliquet tincidunt. Donec vehicula ligula sit amet nunc tempus, non fermentum odio rhoncus.",
711
+ "Vestibulum condimentum consectetur aliquet. Phasellus mollis at nulla vel blandit. Praesent at ligula nulla. Curabitur enim tellus, congue id tempor at, malesuada sed augue. Nulla in justo in libero condimentum euismod. Integer aliquet, velit id convallis maximus, nisl dui porta velit, et pellentesque ligula lorem non nunc. Sed tincidunt purus non elit ultrices egestas quis eu mauris. Sed molestie vulputate enim, a vehicula nibh pulvinar sit amet. Nullam auctor sapien est, et aliquet dui congue ornare. Donec pulvinar scelerisque justo, nec scelerisque velit maximus eget. Ut ac lectus velit. Pellentesque bibendum ex sit amet cursus commodo. Fusce congue metus at elementum ultricies. Suspendisse non rhoncus risus. In hac habitasse platea dictumst.",
712
+ " '''",
713
+ " ))",
714
+ "",
715
+ "",
716
+ "@on('#page2')",
717
+ "async def page2(q: Q):",
718
+ " q.page['sidebar'].value = '#page2'",
719
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
720
+ " add_card(q, 'chart1', ui.plot_card(",
721
+ " box='horizontal',",
722
+ " title='Chart 1',",
723
+ " data=data('category country product price', 10, rows=[",
724
+ " ('G1', 'USA', 'P1', 124),",
725
+ " ('G1', 'China', 'P2', 580),",
726
+ " ('G1', 'USA', 'P3', 528),",
727
+ " ('G1', 'China', 'P1', 361),",
728
+ " ('G1', 'USA', 'P2', 228),",
729
+ " ('G2', 'China', 'P3', 418),",
730
+ " ('G2', 'USA', 'P1', 824),",
731
+ " ('G2', 'China', 'P2', 539),",
732
+ " ('G2', 'USA', 'P3', 712),",
733
+ " ('G2', 'USA', 'P1', 213),",
734
+ " ]),",
735
+ " plot=ui.plot([ui.mark(type='interval', x='=product', y='=price', color='=country', stack='auto',",
736
+ " dodge='=category', y_min=0)])",
737
+ " ))",
738
+ " add_card(q, 'chart2', ui.plot_card(",
739
+ " box='horizontal',",
740
+ " title='Chart 2',",
741
+ " data=data('date price', 10, rows=[",
742
+ " ('2020-03-20', 124),",
743
+ " ('2020-05-18', 580),",
744
+ " ('2020-08-24', 528),",
745
+ " ('2020-02-12', 361),",
746
+ " ('2020-03-11', 228),",
747
+ " ('2020-09-26', 418),",
748
+ " ('2020-11-12', 824),",
749
+ " ('2020-12-21', 539),",
750
+ " ('2020-03-18', 712),",
751
+ " ('2020-07-11', 213),",
752
+ " ]),",
753
+ " plot=ui.plot([ui.mark(type='line', x_scale='time', x='=date', y='=price', y_min=0)])",
754
+ " ))",
755
+ " add_card(q, 'table', ui.form_card(box='vertical', items=[ui.table(",
756
+ " name='table',",
757
+ " downloadable=True,",
758
+ " resettable=True,",
759
+ " groupable=True,",
760
+ " columns=[",
761
+ " ui.table_column(name='text', label='Process', searchable=True),",
762
+ " ui.table_column(name='tag', label='Status', filterable=True, cell_type=ui.tag_table_cell_type(",
763
+ " name='tags',",
764
+ " tags=[",
765
+ " ui.tag(label='FAIL', color='\\$red'),",
766
+ " ui.tag(label='DONE', color='#D2E3F8', label_color='#053975'),",
767
+ " ui.tag(label='SUCCESS', color='\\$mint'),",
768
+ " ]",
769
+ " ))",
770
+ " ],",
771
+ " rows=[",
772
+ " ui.table_row(name='row1', cells=['Process 1', 'FAIL']),",
773
+ " ui.table_row(name='row2', cells=['Process 2', 'SUCCESS,DONE']),",
774
+ " ui.table_row(name='row3', cells=['Process 3', 'DONE']),",
775
+ " ui.table_row(name='row4', cells=['Process 4', 'FAIL']),",
776
+ " ui.table_row(name='row5', cells=['Process 5', 'SUCCESS,DONE']),",
777
+ " ui.table_row(name='row6', cells=['Process 6', 'DONE']),",
778
+ " ])",
779
+ " ]))",
780
+ "",
781
+ "",
782
+ "@on('#page3')",
783
+ "async def page3(q: Q):",
784
+ " q.page['sidebar'].value = '#page3'",
785
+ " clear_cards(q) # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
786
+ "",
787
+ " for i in range(12):",
788
+ " add_card(q, f'item{i}', ui.wide_info_card(box=ui.box('grid', width='400px'), name='', title='Tile',",
789
+ " caption='Lorem ipsum dolor sit amet'))",
790
+ "",
791
+ "",
792
+ "@on('#page4')",
793
+ "async def handle_page4(q: Q):",
794
+ " q.page['sidebar'].value = '#page4'",
795
+ " # When routing, drop all the cards except of the main ones (header, sidebar, meta).",
796
+ " # Since this page is interactive, we want to update its card instead of recreating it every time, so ignore 'form' card on drop.",
797
+ " clear_cards(q, ['form'])",
798
+ "",
799
+ " if q.args.step1:",
800
+ " # Just update the existing card, do not recreate.",
801
+ " q.page['form'].items = [",
802
+ " ui.stepper(name='stepper', items=[",
803
+ " ui.step(label='Step 1'),",
804
+ " ui.step(label='Step 2'),",
805
+ " ui.step(label='Step 3'),",
806
+ " ]),",
807
+ " ui.textbox(name='textbox2', label='Textbox 1'),",
808
+ " ui.buttons(justify='end', items=[",
809
+ " ui.button(name='step2', label='Next', primary=True),",
810
+ " ])",
811
+ " ]",
812
+ " elif q.args.step2:",
813
+ " # Just update the existing card, do not recreate.",
814
+ " q.page['form'].items = [",
815
+ " ui.stepper(name='stepper', items=[",
816
+ " ui.step(label='Step 1', done=True),",
817
+ " ui.step(label='Step 2'),",
818
+ " ui.step(label='Step 3'),",
819
+ " ]),",
820
+ " ui.textbox(name='textbox2', label='Textbox 2'),",
821
+ " ui.buttons(justify='end', items=[",
822
+ " ui.button(name='step1', label='Cancel'),",
823
+ " ui.button(name='step3', label='Next', primary=True),",
824
+ " ])",
825
+ " ]",
826
+ " elif q.args.step3:",
827
+ " # Just update the existing card, do not recreate.",
828
+ " q.page['form'].items = [",
829
+ " ui.stepper(name='stepper', items=[",
830
+ " ui.step(label='Step 1', done=True),",
831
+ " ui.step(label='Step 2', done=True),",
832
+ " ui.step(label='Step 3'),",
833
+ " ]),",
834
+ " ui.textbox(name='textbox3', label='Textbox 3'),",
835
+ " ui.buttons(justify='end', items=[",
836
+ " ui.button(name='step2', label='Cancel'),",
837
+ " ui.button(name='submit', label='Next', primary=True),",
838
+ " ])",
839
+ " ]",
840
+ " else:",
841
+ " # If first time on this page, create the card.",
842
+ " add_card(q, 'form', ui.form_card(box='vertical', items=[",
843
+ " ui.stepper(name='stepper', items=[",
844
+ " ui.step(label='Step 1'),",
845
+ " ui.step(label='Step 2'),",
846
+ " ui.step(label='Step 3'),",
847
+ " ]),",
848
+ " ui.textbox(name='textbox1', label='Textbox 1'),",
849
+ " ui.buttons(justify='end', items=[",
850
+ " ui.button(name='step2', label='Next', primary=True),",
851
+ " ]),",
852
+ " ]))",
853
+ "",
854
+ "",
855
+ "async def init(q: Q) -> None:",
856
+ " q.page['meta'] = ui.meta_card(box='', layouts=[ui.layout(breakpoint='xs', min_height='100vh', zones=[",
857
+ " ui.zone('main', size='1', direction=ui.ZoneDirection.ROW, zones=[",
858
+ " ui.zone('sidebar', size='250px'),",
859
+ " ui.zone('body', zones=[",
860
+ " ui.zone('header'),",
861
+ " ui.zone('content', zones=[",
862
+ " # Specify various zones and use the one that is currently needed. Empty zones are ignored.",
863
+ " ui.zone('horizontal', direction=ui.ZoneDirection.ROW),",
864
+ " ui.zone('vertical'),",
865
+ " ui.zone('grid', direction=ui.ZoneDirection.ROW, wrap='stretch', justify='center')",
866
+ " ]),",
867
+ " ]),",
868
+ " ])",
869
+ " ])])",
870
+ " q.page['sidebar'] = ui.nav_card(",
871
+ " box='sidebar', color='primary', title='My App', subtitle=\"Let's conquer the world!\",",
872
+ " value=f'#{q.args[\"#\"]}' if q.args['#'] else '#page1',",
873
+ " image='https://wave.h2o.ai/img/h2o-logo.svg', items=[",
874
+ " ui.nav_group('Menu', items=[",
875
+ " ui.nav_item(name='#page1', label='Home'),",
876
+ " ui.nav_item(name='#page2', label='Charts'),",
877
+ " ui.nav_item(name='#page3', label='Grid'),",
878
+ " ui.nav_item(name='#page4', label='Form'),",
879
+ " ]),",
880
+ " ])",
881
+ " q.page['header'] = ui.header_card(",
882
+ " box='header', title='', subtitle='',",
883
+ " secondary_items=[ui.textbox(name='search', icon='Search', width='400px', placeholder='Search...')],",
884
+ " items=[",
885
+ " ui.persona(title='John Doe', subtitle='Developer', size='xs',",
886
+ " image='https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&h=750&w=1260'),",
887
+ " ]",
888
+ " )",
889
+ " # If no active hash present, render page1.",
890
+ " if q.args['#'] is None:",
891
+ " await page1(q)",
892
+ "",
893
+ "",
894
+ "@app('/')",
895
+ "async def serve(q: Q):",
896
+ " # Run only once per client connection.",
897
+ " if not q.client.initialized:",
898
+ " q.client.cards = set()",
899
+ " await init(q)",
900
+ " q.client.initialized = True",
901
+ "",
902
+ " # Handle routing.",
903
+ " await handle_on(q)",
904
+ " await q.page.save()",
905
+ "",
906
+ ""
907
+ ],
908
+ "description": "An app template with both sidebar, header and navigation."
909
+ }
910
+ }
examples/component-snippets.json ADDED
@@ -0,0 +1,1962 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Wave ArticleCard": {
3
+ "prefix": "w_article_card",
4
+ "body": [
5
+ "ui.article_card(box='$1', title='$2')$0"
6
+ ],
7
+ "description": "Create a minimal Wave ArticleCard."
8
+ },
9
+ "Wave Breadcrumb": {
10
+ "prefix": "w_breadcrumb",
11
+ "body": [
12
+ "ui.breadcrumb(name='$1', label='$2'),$0"
13
+ ],
14
+ "description": "Create a minimal Wave Breadcrumb."
15
+ },
16
+ "Wave BreadcrumbsCard": {
17
+ "prefix": "w_breadcrumbs_card",
18
+ "body": [
19
+ "ui.breadcrumbs_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
20
+ ],
21
+ "description": "Create a minimal Wave BreadcrumbsCard."
22
+ },
23
+ "Wave Button": {
24
+ "prefix": "w_button",
25
+ "body": [
26
+ "ui.button(name='$1'),$0"
27
+ ],
28
+ "description": "Create a minimal Wave Button."
29
+ },
30
+ "Wave Buttons": {
31
+ "prefix": "w_buttons",
32
+ "body": [
33
+ "ui.buttons(items=[\n\t\t$1\t\t\n]),$0"
34
+ ],
35
+ "description": "Create a minimal Wave Buttons."
36
+ },
37
+ "Wave MiniButtons": {
38
+ "prefix": "w_mini_buttons",
39
+ "body": [
40
+ "ui.mini_buttons(items=[\n\t\t$1\t\t\n]),$0"
41
+ ],
42
+ "description": "Create a minimal Wave MiniButtons."
43
+ },
44
+ "Wave MiniButton": {
45
+ "prefix": "w_mini_button",
46
+ "body": [
47
+ "ui.mini_button(name='$1', label='$2'),$0"
48
+ ],
49
+ "description": "Create a minimal Wave MiniButton."
50
+ },
51
+ "Wave CanvasCard": {
52
+ "prefix": "w_canvas_card",
53
+ "body": [
54
+ "ui.canvas_card(box='$1', title='$2', width=$3, height=$4, data=$5)$0"
55
+ ],
56
+ "description": "Create a minimal Wave CanvasCard."
57
+ },
58
+ "Wave ChatCard": {
59
+ "prefix": "w_chat_card",
60
+ "body": [
61
+ "ui.chat_card(box='$1', title='$2', data=$3)$0"
62
+ ],
63
+ "description": "Create a minimal Wave ChatCard."
64
+ },
65
+ "Wave Chatbot": {
66
+ "prefix": "w_chatbot",
67
+ "body": [
68
+ "ui.chatbot(name='$1', data=[\n\t\t$2\t\t\n]),$0"
69
+ ],
70
+ "description": "Create a minimal Wave Chatbot."
71
+ },
72
+ "Wave ChatbotCard": {
73
+ "prefix": "w_chatbot_card",
74
+ "body": [
75
+ "ui.chatbot_card(box='$1', name='$2', data=$3)$0"
76
+ ],
77
+ "description": "Create a minimal Wave ChatbotCard."
78
+ },
79
+ "Wave Checkbox": {
80
+ "prefix": "w_checkbox",
81
+ "body": [
82
+ "ui.checkbox(name='$1'),$0"
83
+ ],
84
+ "description": "Create a minimal Wave Checkbox."
85
+ },
86
+ "Wave Checklist": {
87
+ "prefix": "w_checklist",
88
+ "body": [
89
+ "ui.checklist(name='$1'),$0"
90
+ ],
91
+ "description": "Create a minimal Wave Checklist."
92
+ },
93
+ "Wave Choice": {
94
+ "prefix": "w_choice",
95
+ "body": [
96
+ "ui.choice(name='$1'),$0"
97
+ ],
98
+ "description": "Create a minimal Wave Choice."
99
+ },
100
+ "Wave ChoiceGroup": {
101
+ "prefix": "w_choice_group",
102
+ "body": [
103
+ "ui.choice_group(name='$1'),$0"
104
+ ],
105
+ "description": "Create a minimal Wave ChoiceGroup."
106
+ },
107
+ "Wave ColorPicker": {
108
+ "prefix": "w_color_picker",
109
+ "body": [
110
+ "ui.color_picker(name='$1'),$0"
111
+ ],
112
+ "description": "Create a minimal Wave ColorPicker."
113
+ },
114
+ "Wave Combobox": {
115
+ "prefix": "w_combobox",
116
+ "body": [
117
+ "ui.combobox(name='$1'),$0"
118
+ ],
119
+ "description": "Create a minimal Wave Combobox."
120
+ },
121
+ "Wave CopyableText": {
122
+ "prefix": "w_copyable_text",
123
+ "body": [
124
+ "ui.copyable_text(value='$1', label='$2'),$0"
125
+ ],
126
+ "description": "Create a minimal Wave CopyableText."
127
+ },
128
+ "Wave DatePicker": {
129
+ "prefix": "w_date_picker",
130
+ "body": [
131
+ "ui.date_picker(name='$1'),$0"
132
+ ],
133
+ "description": "Create a minimal Wave DatePicker."
134
+ },
135
+ "Wave Dialog": {
136
+ "prefix": "w_dialog",
137
+ "body": [
138
+ "ui.dialog(title='$1', items=[\n\t\t$2\t\t\n]),$0"
139
+ ],
140
+ "description": "Create a minimal Wave Dialog."
141
+ },
142
+ "Wave Dropdown": {
143
+ "prefix": "w_dropdown",
144
+ "body": [
145
+ "ui.dropdown(name='$1'),$0"
146
+ ],
147
+ "description": "Create a minimal Wave Dropdown."
148
+ },
149
+ "Wave EditorCard": {
150
+ "prefix": "w_editor_card",
151
+ "body": [
152
+ "ui.editor_card(box='$1', mode='${2:public}')$0"
153
+ ],
154
+ "description": "Create a minimal Wave EditorCard."
155
+ },
156
+ "Wave Expander": {
157
+ "prefix": "w_expander",
158
+ "body": [
159
+ "ui.expander(name='$1'),$0"
160
+ ],
161
+ "description": "Create a minimal Wave Expander."
162
+ },
163
+ "Wave Facepile": {
164
+ "prefix": "w_facepile",
165
+ "body": [
166
+ "ui.facepile(items=[\n\t\t$1\t\t\n]),$0"
167
+ ],
168
+ "description": "Create a minimal Wave Facepile."
169
+ },
170
+ "Wave FileUpload": {
171
+ "prefix": "w_file_upload",
172
+ "body": [
173
+ "ui.file_upload(name='$1'),$0"
174
+ ],
175
+ "description": "Create a minimal Wave FileUpload."
176
+ },
177
+ "Wave FlexCard": {
178
+ "prefix": "w_flex_card",
179
+ "body": [
180
+ "ui.flex_card(box='$1', item_view='$2', item_props=$3, data=$4)$0"
181
+ ],
182
+ "description": "Create a minimal Wave FlexCard."
183
+ },
184
+ "Wave FooterCard": {
185
+ "prefix": "w_footer_card",
186
+ "body": [
187
+ "ui.footer_card(box='$1', caption='$2')$0"
188
+ ],
189
+ "description": "Create a minimal Wave FooterCard."
190
+ },
191
+ "Wave Inline": {
192
+ "prefix": "w_inline",
193
+ "body": [
194
+ "ui.inline(items=[\n\t\t$1\t\t\n]),$0"
195
+ ],
196
+ "description": "Create a minimal Wave Inline."
197
+ },
198
+ "Wave FormCard": {
199
+ "prefix": "w_form_card",
200
+ "body": [
201
+ "ui.form_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
202
+ ],
203
+ "description": "Create a minimal Wave FormCard."
204
+ },
205
+ "Wave FrameCard": {
206
+ "prefix": "w_frame_card",
207
+ "body": [
208
+ "ui.frame_card(box='$1', title='$2')$0"
209
+ ],
210
+ "description": "Create a minimal Wave FrameCard."
211
+ },
212
+ "Wave GraphicsCard": {
213
+ "prefix": "w_graphics_card",
214
+ "body": [
215
+ "ui.graphics_card(box='$1', view_box='$2')$0"
216
+ ],
217
+ "description": "Create a minimal Wave GraphicsCard."
218
+ },
219
+ "Wave GridCard": {
220
+ "prefix": "w_grid_card",
221
+ "body": [
222
+ "ui.grid_card(box='$1', title='$2', cells=$3, data=$4)$0"
223
+ ],
224
+ "description": "Create a minimal Wave GridCard."
225
+ },
226
+ "Wave HeaderCard": {
227
+ "prefix": "w_header_card",
228
+ "body": [
229
+ "ui.header_card(box='$1', title='$2', subtitle='$3')$0"
230
+ ],
231
+ "description": "Create a minimal Wave HeaderCard."
232
+ },
233
+ "Wave ImageCard": {
234
+ "prefix": "w_image_card",
235
+ "body": [
236
+ "ui.image_card(box='$1', title='$2')$0"
237
+ ],
238
+ "description": "Create a minimal Wave ImageCard."
239
+ },
240
+ "Wave Image": {
241
+ "prefix": "w_image",
242
+ "body": [
243
+ "ui.image(title='$1'),$0"
244
+ ],
245
+ "description": "Create a minimal Wave Image."
246
+ },
247
+ "Wave ImageAnnotatorPoint": {
248
+ "prefix": "w_image_annotator_point",
249
+ "body": [
250
+ "ui.image_annotator_point(x=$1, y=$2),$0"
251
+ ],
252
+ "description": "Create a minimal Wave ImageAnnotatorPoint."
253
+ },
254
+ "Wave ImageAnnotatorPolygon": {
255
+ "prefix": "w_image_annotator_polygon",
256
+ "body": [
257
+ "ui.image_annotator_polygon(vertices=[\n\t\t$1\t\t\n]),$0"
258
+ ],
259
+ "description": "Create a minimal Wave ImageAnnotatorPolygon."
260
+ },
261
+ "Wave ImageAnnotatorRect": {
262
+ "prefix": "w_image_annotator_rect",
263
+ "body": [
264
+ "ui.image_annotator_rect(x1=$1, y1=$2, x2=$3, y2=$4),$0"
265
+ ],
266
+ "description": "Create a minimal Wave ImageAnnotatorRect."
267
+ },
268
+ "Wave ImageAnnotatorTag": {
269
+ "prefix": "w_image_annotator_tag",
270
+ "body": [
271
+ "ui.image_annotator_tag(name='$1', label='$2', color='$3'),$0"
272
+ ],
273
+ "description": "Create a minimal Wave ImageAnnotatorTag."
274
+ },
275
+ "Wave ImageAnnotatorItem": {
276
+ "prefix": "w_image_annotator_item",
277
+ "body": [
278
+ "ui.image_annotator_item(shape=$1, tag='$2'),$0"
279
+ ],
280
+ "description": "Create a minimal Wave ImageAnnotatorItem."
281
+ },
282
+ "Wave ImageAnnotator": {
283
+ "prefix": "w_image_annotator",
284
+ "body": [
285
+ "ui.image_annotator(name='$1', image='$2', title='$3', tags=[\n\t\t$4\t\t\n]),$0"
286
+ ],
287
+ "description": "Create a minimal Wave ImageAnnotator."
288
+ },
289
+ "Wave Label": {
290
+ "prefix": "w_label",
291
+ "body": [
292
+ "ui.label(label='$1'),$0"
293
+ ],
294
+ "description": "Create a minimal Wave Label."
295
+ },
296
+ "Wave LargeBarStatCard": {
297
+ "prefix": "w_large_bar_stat_card",
298
+ "body": [
299
+ "ui.large_bar_stat_card(box='$1', title='$2', caption='$3', value='$4', aux_value='$5', value_caption='$6', aux_value_caption='$7', progress=$8)$0"
300
+ ],
301
+ "description": "Create a minimal Wave LargeBarStatCard."
302
+ },
303
+ "Wave LargeStatCard": {
304
+ "prefix": "w_large_stat_card",
305
+ "body": [
306
+ "ui.large_stat_card(box='$1', title='$2', value='$3', aux_value='$4', caption='$5')$0"
307
+ ],
308
+ "description": "Create a minimal Wave LargeStatCard."
309
+ },
310
+ "Wave Links": {
311
+ "prefix": "w_links",
312
+ "body": [
313
+ "ui.links(items=[\n\t\t$1\t\t\n]),$0"
314
+ ],
315
+ "description": "Create a minimal Wave Links."
316
+ },
317
+ "Wave ListCard": {
318
+ "prefix": "w_list_card",
319
+ "body": [
320
+ "ui.list_card(box='$1', title='$2', item_view='$3', item_props=$4, data=$5)$0"
321
+ ],
322
+ "description": "Create a minimal Wave ListCard."
323
+ },
324
+ "Wave ListItem1Card": {
325
+ "prefix": "w_list_item1_card",
326
+ "body": [
327
+ "ui.list_item1_card(box='$1', title='$2', caption='$3', value='$4', aux_value='$5', data=$6)$0"
328
+ ],
329
+ "description": "Create a minimal Wave ListItem1Card."
330
+ },
331
+ "Wave MarkdownCard": {
332
+ "prefix": "w_markdown_card",
333
+ "body": [
334
+ "ui.markdown_card(box='$1', title='$2', content='$3')$0"
335
+ ],
336
+ "description": "Create a minimal Wave MarkdownCard."
337
+ },
338
+ "Wave Markup": {
339
+ "prefix": "w_markup",
340
+ "body": [
341
+ "ui.markup(content='$1'),$0"
342
+ ],
343
+ "description": "Create a minimal Wave Markup."
344
+ },
345
+ "Wave MarkupCard": {
346
+ "prefix": "w_markup_card",
347
+ "body": [
348
+ "ui.markup_card(box='$1', title='$2', content='$3')$0"
349
+ ],
350
+ "description": "Create a minimal Wave MarkupCard."
351
+ },
352
+ "Wave Menu": {
353
+ "prefix": "w_menu",
354
+ "body": [
355
+ "ui.menu(items=[\n\t\t$1\t\t\n]),$0"
356
+ ],
357
+ "description": "Create a minimal Wave Menu."
358
+ },
359
+ "Wave MenuTableCellType": {
360
+ "prefix": "w_menu_table_cell_type",
361
+ "body": [
362
+ "ui.menu_table_cell_type(commands=[\n\t\t$1\t\t\n]),$0"
363
+ ],
364
+ "description": "Create a minimal Wave MenuTableCellType."
365
+ },
366
+ "Wave InlineStylesheet": {
367
+ "prefix": "w_inline_stylesheet",
368
+ "body": [
369
+ "ui.inline_stylesheet(content='$1'),$0"
370
+ ],
371
+ "description": "Create a minimal Wave InlineStylesheet."
372
+ },
373
+ "Wave Stylesheet": {
374
+ "prefix": "w_stylesheet",
375
+ "body": [
376
+ "ui.stylesheet(path='$1'),$0"
377
+ ],
378
+ "description": "Create a minimal Wave Stylesheet."
379
+ },
380
+ "Wave Layout": {
381
+ "prefix": "w_layout",
382
+ "body": [
383
+ "ui.layout(breakpoint='$1', zones=[\n\t\t$2\t\t\n]),$0"
384
+ ],
385
+ "description": "Create a minimal Wave Layout."
386
+ },
387
+ "Wave Zone": {
388
+ "prefix": "w_zone",
389
+ "body": [
390
+ "ui.zone(name='$1'),$0"
391
+ ],
392
+ "description": "Create a minimal Wave Zone."
393
+ },
394
+ "Wave Theme": {
395
+ "prefix": "w_theme",
396
+ "body": [
397
+ "ui.theme(name='$1', text='$2', card='$3', page='$4', primary='$5'),$0"
398
+ ],
399
+ "description": "Create a minimal Wave Theme."
400
+ },
401
+ "Wave MetaCard": {
402
+ "prefix": "w_meta_card",
403
+ "body": [
404
+ "ui.meta_card(box='$1')$0"
405
+ ],
406
+ "description": "Create a minimal Wave MetaCard."
407
+ },
408
+ "Wave NavItem": {
409
+ "prefix": "w_nav_item",
410
+ "body": [
411
+ "ui.nav_item(name='$1', label='$2'),$0"
412
+ ],
413
+ "description": "Create a minimal Wave NavItem."
414
+ },
415
+ "Wave NavGroup": {
416
+ "prefix": "w_nav_group",
417
+ "body": [
418
+ "ui.nav_group(label='$1', items=[\n\t\t$2\t\t\n]),$0"
419
+ ],
420
+ "description": "Create a minimal Wave NavGroup."
421
+ },
422
+ "Wave NavCard": {
423
+ "prefix": "w_nav_card",
424
+ "body": [
425
+ "ui.nav_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
426
+ ],
427
+ "description": "Create a minimal Wave NavCard."
428
+ },
429
+ "Wave NotificationBar": {
430
+ "prefix": "w_notification_bar",
431
+ "body": [
432
+ "ui.notification_bar(text='$1'),$0"
433
+ ],
434
+ "description": "Create a minimal Wave NotificationBar."
435
+ },
436
+ "Wave Persona": {
437
+ "prefix": "w_persona",
438
+ "body": [
439
+ "ui.persona(title='$1'),$0"
440
+ ],
441
+ "description": "Create a minimal Wave Persona."
442
+ },
443
+ "Wave Picker": {
444
+ "prefix": "w_picker",
445
+ "body": [
446
+ "ui.picker(name='$1', choices=[\n\t\t$2\t\t\n]),$0"
447
+ ],
448
+ "description": "Create a minimal Wave Picker."
449
+ },
450
+ "Wave PixelArtCard": {
451
+ "prefix": "w_pixel_art_card",
452
+ "body": [
453
+ "ui.pixel_art_card(box='$1', title='$2', data=$3)$0"
454
+ ],
455
+ "description": "Create a minimal Wave PixelArtCard."
456
+ },
457
+ "Wave Pixel": {
458
+ "prefix": "w_pixel",
459
+ "body": [
460
+ "ui.pixel(color='$1'),$0"
461
+ ],
462
+ "description": "Create a minimal Wave Pixel."
463
+ },
464
+ "Wave Plot": {
465
+ "prefix": "w_plot",
466
+ "body": [
467
+ "ui.plot(marks=[\n\t\t$1\t\t\n]),$0"
468
+ ],
469
+ "description": "Create a minimal Wave Plot."
470
+ },
471
+ "Wave Visualization": {
472
+ "prefix": "w_visualization",
473
+ "body": [
474
+ "ui.visualization(plot=$1, data=$2),$0"
475
+ ],
476
+ "description": "Create a minimal Wave Visualization."
477
+ },
478
+ "Wave PlotCard": {
479
+ "prefix": "w_plot_card",
480
+ "body": [
481
+ "ui.plot_card(box='$1', title='$2', data=$3, plot=$4)$0"
482
+ ],
483
+ "description": "Create a minimal Wave PlotCard."
484
+ },
485
+ "Wave PostCard": {
486
+ "prefix": "w_post_card",
487
+ "body": [
488
+ "ui.post_card(box='$1', persona=$2, image='$3')$0"
489
+ ],
490
+ "description": "Create a minimal Wave PostCard."
491
+ },
492
+ "Wave PreviewCard": {
493
+ "prefix": "w_preview_card",
494
+ "body": [
495
+ "ui.preview_card(box='$1', name='$2', image='$3')$0"
496
+ ],
497
+ "description": "Create a minimal Wave PreviewCard."
498
+ },
499
+ "Wave ProfileCard": {
500
+ "prefix": "w_profile_card",
501
+ "body": [
502
+ "ui.profile_card(box='$1', persona=$2, image='$3')$0"
503
+ ],
504
+ "description": "Create a minimal Wave ProfileCard."
505
+ },
506
+ "Wave Progress": {
507
+ "prefix": "w_progress",
508
+ "body": [
509
+ "ui.progress(label='$1'),$0"
510
+ ],
511
+ "description": "Create a minimal Wave Progress."
512
+ },
513
+ "Wave RangeSlider": {
514
+ "prefix": "w_range_slider",
515
+ "body": [
516
+ "ui.range_slider(name='$1'),$0"
517
+ ],
518
+ "description": "Create a minimal Wave RangeSlider."
519
+ },
520
+ "Wave RepeatCard": {
521
+ "prefix": "w_repeat_card",
522
+ "body": [
523
+ "ui.repeat_card(box='$1', item_view='$2', item_props=$3, data=$4)$0"
524
+ ],
525
+ "description": "Create a minimal Wave RepeatCard."
526
+ },
527
+ "Wave Script": {
528
+ "prefix": "w_script",
529
+ "body": [
530
+ "ui.script(path='$1'),$0"
531
+ ],
532
+ "description": "Create a minimal Wave Script."
533
+ },
534
+ "Wave InlineScript": {
535
+ "prefix": "w_inline_script",
536
+ "body": [
537
+ "ui.inline_script(content='$1'),$0"
538
+ ],
539
+ "description": "Create a minimal Wave InlineScript."
540
+ },
541
+ "Wave SectionCard": {
542
+ "prefix": "w_section_card",
543
+ "body": [
544
+ "ui.section_card(box='$1', title='$2', subtitle='$3')$0"
545
+ ],
546
+ "description": "Create a minimal Wave SectionCard."
547
+ },
548
+ "Wave SidePanel": {
549
+ "prefix": "w_side_panel",
550
+ "body": [
551
+ "ui.side_panel(title='$1', items=[\n\t\t$2\t\t\n]),$0"
552
+ ],
553
+ "description": "Create a minimal Wave SidePanel."
554
+ },
555
+ "Wave Slider": {
556
+ "prefix": "w_slider",
557
+ "body": [
558
+ "ui.slider(name='$1'),$0"
559
+ ],
560
+ "description": "Create a minimal Wave Slider."
561
+ },
562
+ "Wave SmallSeriesStatCard": {
563
+ "prefix": "w_small_series_stat_card",
564
+ "body": [
565
+ "ui.small_series_stat_card(box='$1', title='$2', value='$3', plot_data=$4, plot_value='$5')$0"
566
+ ],
567
+ "description": "Create a minimal Wave SmallSeriesStatCard."
568
+ },
569
+ "Wave SmallStatCard": {
570
+ "prefix": "w_small_stat_card",
571
+ "body": [
572
+ "ui.small_stat_card(box='$1', title='$2', value='$3')$0"
573
+ ],
574
+ "description": "Create a minimal Wave SmallStatCard."
575
+ },
576
+ "Wave Spinbox": {
577
+ "prefix": "w_spinbox",
578
+ "body": [
579
+ "ui.spinbox(name='$1'),$0"
580
+ ],
581
+ "description": "Create a minimal Wave Spinbox."
582
+ },
583
+ "Wave StatListCard": {
584
+ "prefix": "w_stat_list_card",
585
+ "body": [
586
+ "ui.stat_list_card(box='$1', title='$2', items=[\n\t\t$3\t\t\n])$0"
587
+ ],
588
+ "description": "Create a minimal Wave StatListCard."
589
+ },
590
+ "Wave StatListItem": {
591
+ "prefix": "w_stat_list_item",
592
+ "body": [
593
+ "ui.stat_list_item(label='$1'),$0"
594
+ ],
595
+ "description": "Create a minimal Wave StatListItem."
596
+ },
597
+ "Wave StatTableCard": {
598
+ "prefix": "w_stat_table_card",
599
+ "body": [
600
+ "ui.stat_table_card(box='$1', title='$2', columns=[\n\t\t$3\t\t\n], items=[\n\t\t$4\t\t\n])$0"
601
+ ],
602
+ "description": "Create a minimal Wave StatTableCard."
603
+ },
604
+ "Wave StatTableItem": {
605
+ "prefix": "w_stat_table_item",
606
+ "body": [
607
+ "ui.stat_table_item(label='$1', values=[\n\t\t$2\t\t\n]),$0"
608
+ ],
609
+ "description": "Create a minimal Wave StatTableItem."
610
+ },
611
+ "Wave Stats": {
612
+ "prefix": "w_stats",
613
+ "body": [
614
+ "ui.stats(items=[\n\t\t$1\t\t\n]),$0"
615
+ ],
616
+ "description": "Create a minimal Wave Stats."
617
+ },
618
+ "Wave Stat": {
619
+ "prefix": "w_stat",
620
+ "body": [
621
+ "ui.stat(label='$1'),$0"
622
+ ],
623
+ "description": "Create a minimal Wave Stat."
624
+ },
625
+ "Wave Step": {
626
+ "prefix": "w_step",
627
+ "body": [
628
+ "ui.step(label='$1'),$0"
629
+ ],
630
+ "description": "Create a minimal Wave Step."
631
+ },
632
+ "Wave Stepper": {
633
+ "prefix": "w_stepper",
634
+ "body": [
635
+ "ui.stepper(name='$1', items=[\n\t\t$2\t\t\n]),$0"
636
+ ],
637
+ "description": "Create a minimal Wave Stepper."
638
+ },
639
+ "Wave TabCard": {
640
+ "prefix": "w_tab_card",
641
+ "body": [
642
+ "ui.tab_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
643
+ ],
644
+ "description": "Create a minimal Wave TabCard."
645
+ },
646
+ "Wave TablePagination": {
647
+ "prefix": "w_table_pagination",
648
+ "body": [
649
+ "ui.table_pagination(total_rows=$1, rows_per_page=$2),$0"
650
+ ],
651
+ "description": "Create a minimal Wave TablePagination."
652
+ },
653
+ "Wave TableColumn": {
654
+ "prefix": "w_table_column",
655
+ "body": [
656
+ "ui.table_column(name='$1', label='$2'),$0"
657
+ ],
658
+ "description": "Create a minimal Wave TableColumn."
659
+ },
660
+ "Wave TableRow": {
661
+ "prefix": "w_table_row",
662
+ "body": [
663
+ "ui.table_row(name='$1', cells=[\n\t\t$2\t\t\n]),$0"
664
+ ],
665
+ "description": "Create a minimal Wave TableRow."
666
+ },
667
+ "Wave TableGroup": {
668
+ "prefix": "w_table_group",
669
+ "body": [
670
+ "ui.table_group(label='$1', rows=[\n\t\t$2\t\t\n]),$0"
671
+ ],
672
+ "description": "Create a minimal Wave TableGroup."
673
+ },
674
+ "Wave Table": {
675
+ "prefix": "w_table",
676
+ "body": [
677
+ "ui.table(name='$1', columns=[\n\t\t$2\t\t\n]),$0"
678
+ ],
679
+ "description": "Create a minimal Wave Table."
680
+ },
681
+ "Wave Tab": {
682
+ "prefix": "w_tab",
683
+ "body": [
684
+ "ui.tab(name='$1'),$0"
685
+ ],
686
+ "description": "Create a minimal Wave Tab."
687
+ },
688
+ "Wave Tabs": {
689
+ "prefix": "w_tabs",
690
+ "body": [
691
+ "ui.tabs(name='$1'),$0"
692
+ ],
693
+ "description": "Create a minimal Wave Tabs."
694
+ },
695
+ "Wave TagTableCellType": {
696
+ "prefix": "w_tag_table_cell_type",
697
+ "body": [
698
+ "ui.tag_table_cell_type(name='$1'),$0"
699
+ ],
700
+ "description": "Create a minimal Wave TagTableCellType."
701
+ },
702
+ "Wave Tag": {
703
+ "prefix": "w_tag",
704
+ "body": [
705
+ "ui.tag(label='$1', color='$2'),$0"
706
+ ],
707
+ "description": "Create a minimal Wave Tag."
708
+ },
709
+ "Wave Tags": {
710
+ "prefix": "w_tags",
711
+ "body": [
712
+ "ui.tags(items=[\n\t\t$1\t\t\n]),$0"
713
+ ],
714
+ "description": "Create a minimal Wave Tags."
715
+ },
716
+ "Wave TallArticlePreviewCard": {
717
+ "prefix": "w_tall_article_preview_card",
718
+ "body": [
719
+ "ui.tall_article_preview_card(box='$1', title='$2', image='$3')$0"
720
+ ],
721
+ "description": "Create a minimal Wave TallArticlePreviewCard."
722
+ },
723
+ "Wave TallGaugeStatCard": {
724
+ "prefix": "w_tall_gauge_stat_card",
725
+ "body": [
726
+ "ui.tall_gauge_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5)$0"
727
+ ],
728
+ "description": "Create a minimal Wave TallGaugeStatCard."
729
+ },
730
+ "Wave TallInfoCard": {
731
+ "prefix": "w_tall_info_card",
732
+ "body": [
733
+ "ui.tall_info_card(box='$1', name='$2', title='$3', caption='$4')$0"
734
+ ],
735
+ "description": "Create a minimal Wave TallInfoCard."
736
+ },
737
+ "Wave TallSeriesStatCard": {
738
+ "prefix": "w_tall_series_stat_card",
739
+ "body": [
740
+ "ui.tall_series_stat_card(box='$1', title='$2', value='$3', aux_value='$4', plot_data=$5, plot_value='$6')$0"
741
+ ],
742
+ "description": "Create a minimal Wave TallSeriesStatCard."
743
+ },
744
+ "Wave TallStatsCard": {
745
+ "prefix": "w_tall_stats_card",
746
+ "body": [
747
+ "ui.tall_stats_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
748
+ ],
749
+ "description": "Create a minimal Wave TallStatsCard."
750
+ },
751
+ "Wave Template": {
752
+ "prefix": "w_template",
753
+ "body": [
754
+ "ui.template(content='$1'),$0"
755
+ ],
756
+ "description": "Create a minimal Wave Template."
757
+ },
758
+ "Wave TemplateCard": {
759
+ "prefix": "w_template_card",
760
+ "body": [
761
+ "ui.template_card(box='$1', title='$2', content='$3')$0"
762
+ ],
763
+ "description": "Create a minimal Wave TemplateCard."
764
+ },
765
+ "Wave Text": {
766
+ "prefix": "w_text",
767
+ "body": [
768
+ "ui.text(content='$1'),$0"
769
+ ],
770
+ "description": "Create a minimal Wave Text."
771
+ },
772
+ "Wave TextXl": {
773
+ "prefix": "w_text_xl",
774
+ "body": [
775
+ "ui.text_xl(content='$1'),$0"
776
+ ],
777
+ "description": "Create a minimal Wave TextXl."
778
+ },
779
+ "Wave TextL": {
780
+ "prefix": "w_text_l",
781
+ "body": [
782
+ "ui.text_l(content='$1'),$0"
783
+ ],
784
+ "description": "Create a minimal Wave TextL."
785
+ },
786
+ "Wave TextM": {
787
+ "prefix": "w_text_m",
788
+ "body": [
789
+ "ui.text_m(content='$1'),$0"
790
+ ],
791
+ "description": "Create a minimal Wave TextM."
792
+ },
793
+ "Wave TextS": {
794
+ "prefix": "w_text_s",
795
+ "body": [
796
+ "ui.text_s(content='$1'),$0"
797
+ ],
798
+ "description": "Create a minimal Wave TextS."
799
+ },
800
+ "Wave TextXs": {
801
+ "prefix": "w_text_xs",
802
+ "body": [
803
+ "ui.text_xs(content='$1'),$0"
804
+ ],
805
+ "description": "Create a minimal Wave TextXs."
806
+ },
807
+ "Wave TextAnnotatorTag": {
808
+ "prefix": "w_text_annotator_tag",
809
+ "body": [
810
+ "ui.text_annotator_tag(name='$1', label='$2', color='$3'),$0"
811
+ ],
812
+ "description": "Create a minimal Wave TextAnnotatorTag."
813
+ },
814
+ "Wave TextAnnotatorItem": {
815
+ "prefix": "w_text_annotator_item",
816
+ "body": [
817
+ "ui.text_annotator_item(text='$1'),$0"
818
+ ],
819
+ "description": "Create a minimal Wave TextAnnotatorItem."
820
+ },
821
+ "Wave TextAnnotator": {
822
+ "prefix": "w_text_annotator",
823
+ "body": [
824
+ "ui.text_annotator(name='$1', title='$2', tags=[\n\t\t$3\t\t\n], items=[\n\t\t$4\t\t\n]),$0"
825
+ ],
826
+ "description": "Create a minimal Wave TextAnnotator."
827
+ },
828
+ "Wave Textbox": {
829
+ "prefix": "w_textbox",
830
+ "body": [
831
+ "ui.textbox(name='$1'),$0"
832
+ ],
833
+ "description": "Create a minimal Wave Textbox."
834
+ },
835
+ "Wave TimePicker": {
836
+ "prefix": "w_time_picker",
837
+ "body": [
838
+ "ui.time_picker(name='$1'),$0"
839
+ ],
840
+ "description": "Create a minimal Wave TimePicker."
841
+ },
842
+ "Wave Toggle": {
843
+ "prefix": "w_toggle",
844
+ "body": [
845
+ "ui.toggle(name='$1'),$0"
846
+ ],
847
+ "description": "Create a minimal Wave Toggle."
848
+ },
849
+ "Wave Command": {
850
+ "prefix": "w_command",
851
+ "body": [
852
+ "ui.command(name='$1'),$0"
853
+ ],
854
+ "description": "Create a minimal Wave Command."
855
+ },
856
+ "Wave ToolbarCard": {
857
+ "prefix": "w_toolbar_card",
858
+ "body": [
859
+ "ui.toolbar_card(box='$1', items=[\n\t\t$2\t\t\n])$0"
860
+ ],
861
+ "description": "Create a minimal Wave ToolbarCard."
862
+ },
863
+ "Wave Tracker": {
864
+ "prefix": "w_tracker",
865
+ "body": [
866
+ "ui.tracker(type='$1', id='$2'),$0"
867
+ ],
868
+ "description": "Create a minimal Wave Tracker."
869
+ },
870
+ "Wave VegaVisualization": {
871
+ "prefix": "w_vega_visualization",
872
+ "body": [
873
+ "ui.vega_visualization(specification='$1'),$0"
874
+ ],
875
+ "description": "Create a minimal Wave VegaVisualization."
876
+ },
877
+ "Wave VegaCard": {
878
+ "prefix": "w_vega_card",
879
+ "body": [
880
+ "ui.vega_card(box='$1', title='$2', specification='$3')$0"
881
+ ],
882
+ "description": "Create a minimal Wave VegaCard."
883
+ },
884
+ "Wave WideArticlePreviewCard": {
885
+ "prefix": "w_wide_article_preview_card",
886
+ "body": [
887
+ "ui.wide_article_preview_card(box='$1', persona=$2, image='$3', title='$4')$0"
888
+ ],
889
+ "description": "Create a minimal Wave WideArticlePreviewCard."
890
+ },
891
+ "Wave WideBarStatCard": {
892
+ "prefix": "w_wide_bar_stat_card",
893
+ "body": [
894
+ "ui.wide_bar_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5)$0"
895
+ ],
896
+ "description": "Create a minimal Wave WideBarStatCard."
897
+ },
898
+ "Wave WideGaugeStatCard": {
899
+ "prefix": "w_wide_gauge_stat_card",
900
+ "body": [
901
+ "ui.wide_gauge_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5)$0"
902
+ ],
903
+ "description": "Create a minimal Wave WideGaugeStatCard."
904
+ },
905
+ "Wave WideInfoCard": {
906
+ "prefix": "w_wide_info_card",
907
+ "body": [
908
+ "ui.wide_info_card(box='$1', name='$2', title='$3', caption='$4')$0"
909
+ ],
910
+ "description": "Create a minimal Wave WideInfoCard."
911
+ },
912
+ "Wave Pie": {
913
+ "prefix": "w_pie",
914
+ "body": [
915
+ "ui.pie(label='$1', value='$2', fraction=$3, color='$4'),$0"
916
+ ],
917
+ "description": "Create a minimal Wave Pie."
918
+ },
919
+ "Wave WidePieStatCard": {
920
+ "prefix": "w_wide_pie_stat_card",
921
+ "body": [
922
+ "ui.wide_pie_stat_card(box='$1', title='$2', pies=[\n\t\t$3\t\t\n])$0"
923
+ ],
924
+ "description": "Create a minimal Wave WidePieStatCard."
925
+ },
926
+ "Wave WidePlotCard": {
927
+ "prefix": "w_wide_plot_card",
928
+ "body": [
929
+ "ui.wide_plot_card(box='$1', title='$2', caption='$3', plot=$4, data=$5)$0"
930
+ ],
931
+ "description": "Create a minimal Wave WidePlotCard."
932
+ },
933
+ "Wave WideSeriesStatCard": {
934
+ "prefix": "w_wide_series_stat_card",
935
+ "body": [
936
+ "ui.wide_series_stat_card(box='$1', title='$2', value='$3', aux_value='$4', plot_data=$5, plot_value='$6')$0"
937
+ ],
938
+ "description": "Create a minimal Wave WideSeriesStatCard."
939
+ },
940
+ "Wave Full ArticleCard": {
941
+ "prefix": "w_full_article_card",
942
+ "body": [
943
+ "ui.article_card(box='$1', title='$2', content='$3', items=[\n\t\t$4\t\t\n], commands=[\n\t\t$5\t\t\n])$0"
944
+ ],
945
+ "description": "Create a full Wave ArticleCard."
946
+ },
947
+ "Wave Full Breadcrumb": {
948
+ "prefix": "w_full_breadcrumb",
949
+ "body": [
950
+ "ui.breadcrumb(name='$1', label='$2'),$0"
951
+ ],
952
+ "description": "Create a full Wave Breadcrumb."
953
+ },
954
+ "Wave Full BreadcrumbsCard": {
955
+ "prefix": "w_full_breadcrumbs_card",
956
+ "body": [
957
+ "ui.breadcrumbs_card(box='$1', items=[\n\t\t$2\t\t\n], commands=[\n\t\t$3\t\t\n])$0"
958
+ ],
959
+ "description": "Create a full Wave BreadcrumbsCard."
960
+ },
961
+ "Wave Full Button": {
962
+ "prefix": "w_full_button",
963
+ "body": [
964
+ "ui.button(name='$1', label='$2', caption='$3', value='$4', primary=${5:False}, disabled=${6:False}, link=${7:False}, icon='$8', width='$9', visible=${10:True}, tooltip='$11', path='$12', commands=[\n\t\t$13\t\t\n]),$0"
965
+ ],
966
+ "description": "Create a full Wave Button."
967
+ },
968
+ "Wave Full Buttons": {
969
+ "prefix": "w_full_buttons",
970
+ "body": [
971
+ "ui.buttons(justify='$1', name='$2', width='$3', visible=${4:True}, items=[\n\t\t$5\t\t\n]),$0"
972
+ ],
973
+ "description": "Create a full Wave Buttons."
974
+ },
975
+ "Wave Full MiniButtons": {
976
+ "prefix": "w_full_mini_buttons",
977
+ "body": [
978
+ "ui.mini_buttons(visible=${1:True}, items=[\n\t\t$2\t\t\n]),$0"
979
+ ],
980
+ "description": "Create a full Wave MiniButtons."
981
+ },
982
+ "Wave Full MiniButton": {
983
+ "prefix": "w_full_mini_button",
984
+ "body": [
985
+ "ui.mini_button(name='$1', label='$2', icon='$3'),$0"
986
+ ],
987
+ "description": "Create a full Wave MiniButton."
988
+ },
989
+ "Wave Full CanvasCard": {
990
+ "prefix": "w_full_canvas_card",
991
+ "body": [
992
+ "ui.canvas_card(box='$1', title='$2', width=$3, height=$4, data=$5, commands=[\n\t\t$6\t\t\n])$0"
993
+ ],
994
+ "description": "Create a full Wave CanvasCard."
995
+ },
996
+ "Wave Full ChatCard": {
997
+ "prefix": "w_full_chat_card",
998
+ "body": [
999
+ "ui.chat_card(box='$1', title='$2', data=$3, capacity=${4:50}, commands=[\n\t\t$5\t\t\n])$0"
1000
+ ],
1001
+ "description": "Create a full Wave ChatCard."
1002
+ },
1003
+ "Wave Full Chatbot": {
1004
+ "prefix": "w_full_chatbot",
1005
+ "body": [
1006
+ "ui.chatbot(name='$1', placeholder='$2', data=[\n\t\t$3\t\t\n]),$0"
1007
+ ],
1008
+ "description": "Create a full Wave Chatbot."
1009
+ },
1010
+ "Wave Full ChatbotCard": {
1011
+ "prefix": "w_full_chatbot_card",
1012
+ "body": [
1013
+ "ui.chatbot_card(box='$1', name='$2', data=$3, placeholder='$4', commands=[\n\t\t$5\t\t\n])$0"
1014
+ ],
1015
+ "description": "Create a full Wave ChatbotCard."
1016
+ },
1017
+ "Wave Full Checkbox": {
1018
+ "prefix": "w_full_checkbox",
1019
+ "body": [
1020
+ "ui.checkbox(name='$1', label='$2', value=${3:False}, indeterminate=${4:False}, disabled=${5:False}, trigger=${6:False}, width='$7', visible=${8:True}, tooltip='$9'),$0"
1021
+ ],
1022
+ "description": "Create a full Wave Checkbox."
1023
+ },
1024
+ "Wave Full Checklist": {
1025
+ "prefix": "w_full_checklist",
1026
+ "body": [
1027
+ "ui.checklist(name='$1', label='$2', trigger=${3:False}, inline=${4:False}, width='$5', visible=${6:True}, tooltip='$7', values=[\n\t\t$8\t\t\n], choices=[\n\t\t$9\t\t\n]),$0"
1028
+ ],
1029
+ "description": "Create a full Wave Checklist."
1030
+ },
1031
+ "Wave Full Choice": {
1032
+ "prefix": "w_full_choice",
1033
+ "body": [
1034
+ "ui.choice(name='$1', label='$2', disabled=${3:False}),$0"
1035
+ ],
1036
+ "description": "Create a full Wave Choice."
1037
+ },
1038
+ "Wave Full ChoiceGroup": {
1039
+ "prefix": "w_full_choice_group",
1040
+ "body": [
1041
+ "ui.choice_group(name='$1', label='$2', value='$3', required=${4:False}, trigger=${5:False}, inline=${6:False}, width='$7', visible=${8:True}, tooltip='$9', choices=[\n\t\t$10\t\t\n]),$0"
1042
+ ],
1043
+ "description": "Create a full Wave ChoiceGroup."
1044
+ },
1045
+ "Wave Full ColorPicker": {
1046
+ "prefix": "w_full_color_picker",
1047
+ "body": [
1048
+ "ui.color_picker(name='$1', label='$2', value='$3', width='${4:300px}', alpha=${5:True}, inline=${6:False}, visible=${7:True}, trigger=${8:False}, tooltip='$9', choices=[\n\t\t$10\t\t\n]),$0"
1049
+ ],
1050
+ "description": "Create a full Wave ColorPicker."
1051
+ },
1052
+ "Wave Full Combobox": {
1053
+ "prefix": "w_full_combobox",
1054
+ "body": [
1055
+ "ui.combobox(name='$1', label='$2', placeholder='$3', value='$4', error='$5', disabled=${6:False}, width='${7:100%}', visible=${8:True}, tooltip='$9', trigger=${10:False}, required=${11:False}, values=[\n\t\t$12\t\t\n], choices=[\n\t\t$13\t\t\n]),$0"
1056
+ ],
1057
+ "description": "Create a full Wave Combobox."
1058
+ },
1059
+ "Wave Full CopyableText": {
1060
+ "prefix": "w_full_copyable_text",
1061
+ "body": [
1062
+ "ui.copyable_text(value='$1', label='$2', name='$3', multiline=${4:False}, height='$5'),$0"
1063
+ ],
1064
+ "description": "Create a full Wave CopyableText."
1065
+ },
1066
+ "Wave Full DatePicker": {
1067
+ "prefix": "w_full_date_picker",
1068
+ "body": [
1069
+ "ui.date_picker(name='$1', label='$2', placeholder='$3', value='$4', disabled=${5:False}, trigger=${6:False}, width='${7:100%}', visible=${8:True}, tooltip='$9', min='$10', max='$11'),$0"
1070
+ ],
1071
+ "description": "Create a full Wave DatePicker."
1072
+ },
1073
+ "Wave Full Dialog": {
1074
+ "prefix": "w_full_dialog",
1075
+ "body": [
1076
+ "ui.dialog(title='$1', width='${2:600px}', closable=${3:False}, blocking=${4:False}, primary=${5:False}, name='$6', items=[\n\t\t$7\t\t\n], events=[\n\t\t$8\t\t\n]),$0"
1077
+ ],
1078
+ "description": "Create a full Wave Dialog."
1079
+ },
1080
+ "Wave Full Dropdown": {
1081
+ "prefix": "w_full_dropdown",
1082
+ "body": [
1083
+ "ui.dropdown(name='$1', label='$2', placeholder='$3', value='$4', required=${5:False}, disabled=${6:False}, trigger=${7:False}, width='${8:100%}', visible=${9:True}, tooltip='$10', popup='${11:auto}', values=[\n\t\t$12\t\t\n], choices=[\n\t\t$13\t\t\n]),$0"
1084
+ ],
1085
+ "description": "Create a full Wave Dropdown."
1086
+ },
1087
+ "Wave Full EditorCard": {
1088
+ "prefix": "w_full_editor_card",
1089
+ "body": [
1090
+ "ui.editor_card(box='$1', mode='${2:public}', commands=[\n\t\t$3\t\t\n])$0"
1091
+ ],
1092
+ "description": "Create a full Wave EditorCard."
1093
+ },
1094
+ "Wave Full Expander": {
1095
+ "prefix": "w_full_expander",
1096
+ "body": [
1097
+ "ui.expander(name='$1', label='$2', expanded=${3:False}, width='${4:100%}', visible=${5:True}, items=[\n\t\t$6\t\t\n]),$0"
1098
+ ],
1099
+ "description": "Create a full Wave Expander."
1100
+ },
1101
+ "Wave Full Facepile": {
1102
+ "prefix": "w_full_facepile",
1103
+ "body": [
1104
+ "ui.facepile(name='$1', max=${2:None}, value='$3', items=[\n\t\t$4\t\t\n]),$0"
1105
+ ],
1106
+ "description": "Create a full Wave Facepile."
1107
+ },
1108
+ "Wave Full FileUpload": {
1109
+ "prefix": "w_full_file_upload",
1110
+ "body": [
1111
+ "ui.file_upload(name='$1', label='${2:Upload}', multiple=${3:False}, max_file_size=${4:None}, max_size=${5:None}, height='${6:300px}', width='${7:100%}', compact=${8:False}, visible=${9:True}, tooltip='$10', required=${11:False}, file_extensions=[\n\t\t$12\t\t\n]),$0"
1112
+ ],
1113
+ "description": "Create a full Wave FileUpload."
1114
+ },
1115
+ "Wave Full FlexCard": {
1116
+ "prefix": "w_full_flex_card",
1117
+ "body": [
1118
+ "ui.flex_card(box='$1', item_view='$2', item_props=$3, data=$4, direction='$5', justify='$6', align='$7', wrap='$8', commands=[\n\t\t$9\t\t\n])$0"
1119
+ ],
1120
+ "description": "Create a full Wave FlexCard."
1121
+ },
1122
+ "Wave Full FooterCard": {
1123
+ "prefix": "w_full_footer_card",
1124
+ "body": [
1125
+ "ui.footer_card(box='$1', caption='$2', items=[\n\t\t$3\t\t\n], commands=[\n\t\t$4\t\t\n])$0"
1126
+ ],
1127
+ "description": "Create a full Wave FooterCard."
1128
+ },
1129
+ "Wave Full Component": {
1130
+ "prefix": "w_full_component",
1131
+ "body": [
1132
+ "ui.component(text=${1:None}, text_xl=${2:None}, text_l=${3:None}, text_m=${4:None}, text_s=${5:None}, text_xs=${6:None}, label=${7:None}, separator=${8:None}, progress=${9:None}, message_bar=${10:None}, textbox=${11:None}, checkbox=${12:None}, toggle=${13:None}, choice_group=${14:None}, checklist=${15:None}, dropdown=${16:None}, combobox=${17:None}, slider=${18:None}, spinbox=${19:None}, date_picker=${20:None}, color_picker=${21:None}, button=${22:None}, buttons=${23:None}, mini_button=${24:None}, mini_buttons=${25:None}, file_upload=${26:None}, table=${27:None}, link=${28:None}, links=${29:None}, tabs=${30:None}, expander=${31:None}, frame=${32:None}, markup=${33:None}, template=${34:None}, picker=${35:None}, range_slider=${36:None}, stepper=${37:None}, visualization=${38:None}, vega_visualization=${39:None}, stats=${40:None}, inline=${41:None}, image=${42:None}, persona=${43:None}, text_annotator=${44:None}, image_annotator=${45:None}, facepile=${46:None}, copyable_text=${47:None}, menu=${48:None}, tags=${49:None}, time_picker=${50:None}, chatbot=${51:None}),$0"
1133
+ ],
1134
+ "description": "Create a full Wave Component."
1135
+ },
1136
+ "Wave Full Inline": {
1137
+ "prefix": "w_full_inline",
1138
+ "body": [
1139
+ "ui.inline(justify='${1:start}', align='${2:center}', inset=${3:False}, height='$4', direction='${5:row}', items=[\n\t\t$6\t\t\n]),$0"
1140
+ ],
1141
+ "description": "Create a full Wave Inline."
1142
+ },
1143
+ "Wave Full FormCard": {
1144
+ "prefix": "w_full_form_card",
1145
+ "body": [
1146
+ "ui.form_card(box='$1', title='$2', items=[\n\t\t$3\t\t\n], commands=[\n\t\t$4\t\t\n])$0"
1147
+ ],
1148
+ "description": "Create a full Wave FormCard."
1149
+ },
1150
+ "Wave Full Frame": {
1151
+ "prefix": "w_full_frame",
1152
+ "body": [
1153
+ "ui.frame(path='$1', content='$2', width='${3:100%}', height='${4:150px}', name='$5', visible=${6:True}),$0"
1154
+ ],
1155
+ "description": "Create a full Wave Frame."
1156
+ },
1157
+ "Wave Full FrameCard": {
1158
+ "prefix": "w_full_frame_card",
1159
+ "body": [
1160
+ "ui.frame_card(box='$1', title='$2', path='$3', content='$4', compact=${5:False}, commands=[\n\t\t$6\t\t\n])$0"
1161
+ ],
1162
+ "description": "Create a full Wave FrameCard."
1163
+ },
1164
+ "Wave Full GraphicsCard": {
1165
+ "prefix": "w_full_graphics_card",
1166
+ "body": [
1167
+ "ui.graphics_card(box='$1', view_box='$2', stage=${3:None}, scene=${4:None}, width='$5', height='$6', commands=[\n\t\t$7\t\t\n])$0"
1168
+ ],
1169
+ "description": "Create a full Wave GraphicsCard."
1170
+ },
1171
+ "Wave Full GridCard": {
1172
+ "prefix": "w_full_grid_card",
1173
+ "body": [
1174
+ "ui.grid_card(box='$1', title='$2', cells=$3, data=$4, commands=[\n\t\t$5\t\t\n])$0"
1175
+ ],
1176
+ "description": "Create a full Wave GridCard."
1177
+ },
1178
+ "Wave Full HeaderCard": {
1179
+ "prefix": "w_full_header_card",
1180
+ "body": [
1181
+ "ui.header_card(box='$1', title='$2', subtitle='$3', icon='$4', icon_color='$5', image='$6', color='${7:primary}', nav=[\n\t\t$8\t\t\n], items=[\n\t\t$9\t\t\n], secondary_items=[\n\t\t$10\t\t\n], commands=[\n\t\t$11\t\t\n])$0"
1182
+ ],
1183
+ "description": "Create a full Wave HeaderCard."
1184
+ },
1185
+ "Wave Full IconTableCellType": {
1186
+ "prefix": "w_full_icon_table_cell_type",
1187
+ "body": [
1188
+ "ui.icon_table_cell_type(color='$1', name='$2'),$0"
1189
+ ],
1190
+ "description": "Create a full Wave IconTableCellType."
1191
+ },
1192
+ "Wave Full ImageCard": {
1193
+ "prefix": "w_full_image_card",
1194
+ "body": [
1195
+ "ui.image_card(box='$1', title='$2', type='$3', image='$4', data=${5:None}, path='$6', path_popup='$7', commands=[\n\t\t$8\t\t\n])$0"
1196
+ ],
1197
+ "description": "Create a full Wave ImageCard."
1198
+ },
1199
+ "Wave Full Image": {
1200
+ "prefix": "w_full_image",
1201
+ "body": [
1202
+ "ui.image(title='$1', type='$2', image='$3', path='$4', width='$5', visible=${6:True}, path_popup='$7'),$0"
1203
+ ],
1204
+ "description": "Create a full Wave Image."
1205
+ },
1206
+ "Wave Full ImageAnnotatorPoint": {
1207
+ "prefix": "w_full_image_annotator_point",
1208
+ "body": [
1209
+ "ui.image_annotator_point(x=$1, y=$2),$0"
1210
+ ],
1211
+ "description": "Create a full Wave ImageAnnotatorPoint."
1212
+ },
1213
+ "Wave Full ImageAnnotatorPolygon": {
1214
+ "prefix": "w_full_image_annotator_polygon",
1215
+ "body": [
1216
+ "ui.image_annotator_polygon(vertices=[\n\t\t$1\t\t\n]),$0"
1217
+ ],
1218
+ "description": "Create a full Wave ImageAnnotatorPolygon."
1219
+ },
1220
+ "Wave Full ImageAnnotatorRect": {
1221
+ "prefix": "w_full_image_annotator_rect",
1222
+ "body": [
1223
+ "ui.image_annotator_rect(x1=$1, y1=$2, x2=$3, y2=$4),$0"
1224
+ ],
1225
+ "description": "Create a full Wave ImageAnnotatorRect."
1226
+ },
1227
+ "Wave Full ImageAnnotatorShape": {
1228
+ "prefix": "w_full_image_annotator_shape",
1229
+ "body": [
1230
+ "ui.image_annotator_shape(rect=${1:None}, polygon=${2:None}),$0"
1231
+ ],
1232
+ "description": "Create a full Wave ImageAnnotatorShape."
1233
+ },
1234
+ "Wave Full ImageAnnotatorTag": {
1235
+ "prefix": "w_full_image_annotator_tag",
1236
+ "body": [
1237
+ "ui.image_annotator_tag(name='$1', label='$2', color='$3'),$0"
1238
+ ],
1239
+ "description": "Create a full Wave ImageAnnotatorTag."
1240
+ },
1241
+ "Wave Full ImageAnnotatorItem": {
1242
+ "prefix": "w_full_image_annotator_item",
1243
+ "body": [
1244
+ "ui.image_annotator_item(shape=$1, tag='$2'),$0"
1245
+ ],
1246
+ "description": "Create a full Wave ImageAnnotatorItem."
1247
+ },
1248
+ "Wave Full ImageAnnotator": {
1249
+ "prefix": "w_full_image_annotator",
1250
+ "body": [
1251
+ "ui.image_annotator(name='$1', image='$2', title='$3', trigger=${4:False}, image_height='$5', tags=[\n\t\t$6\t\t\n], items=[\n\t\t$7\t\t\n], allowed_shapes=[\n\t\t$8\t\t\n]),$0"
1252
+ ],
1253
+ "description": "Create a full Wave ImageAnnotator."
1254
+ },
1255
+ "Wave Full Label": {
1256
+ "prefix": "w_full_label",
1257
+ "body": [
1258
+ "ui.label(label='$1', required=${2:False}, disabled=${3:False}, width='$4', visible=${5:True}, tooltip='$6', name='$7'),$0"
1259
+ ],
1260
+ "description": "Create a full Wave Label."
1261
+ },
1262
+ "Wave Full LargeBarStatCard": {
1263
+ "prefix": "w_full_large_bar_stat_card",
1264
+ "body": [
1265
+ "ui.large_bar_stat_card(box='$1', title='$2', caption='$3', value='$4', aux_value='$5', value_caption='$6', aux_value_caption='$7', progress=$8, plot_color='$9', data=${10:None}, commands=[\n\t\t$11\t\t\n])$0"
1266
+ ],
1267
+ "description": "Create a full Wave LargeBarStatCard."
1268
+ },
1269
+ "Wave Full LargeStatCard": {
1270
+ "prefix": "w_full_large_stat_card",
1271
+ "body": [
1272
+ "ui.large_stat_card(box='$1', title='$2', value='$3', aux_value='$4', caption='$5', data=${6:None}, commands=[\n\t\t$7\t\t\n])$0"
1273
+ ],
1274
+ "description": "Create a full Wave LargeStatCard."
1275
+ },
1276
+ "Wave Full Link": {
1277
+ "prefix": "w_full_link",
1278
+ "body": [
1279
+ "ui.link(label='$1', path='$2', disabled=${3:False}, download=${4:False}, button=${5:False}, width='$6', visible=${7:True}, target='$8', tooltip='$9', name='$10'),$0"
1280
+ ],
1281
+ "description": "Create a full Wave Link."
1282
+ },
1283
+ "Wave Full Links": {
1284
+ "prefix": "w_full_links",
1285
+ "body": [
1286
+ "ui.links(label='$1', inline=${2:False}, width='$3', items=[\n\t\t$4\t\t\n]),$0"
1287
+ ],
1288
+ "description": "Create a full Wave Links."
1289
+ },
1290
+ "Wave Full ListCard": {
1291
+ "prefix": "w_full_list_card",
1292
+ "body": [
1293
+ "ui.list_card(box='$1', title='$2', item_view='$3', item_props=$4, data=$5, commands=[\n\t\t$6\t\t\n])$0"
1294
+ ],
1295
+ "description": "Create a full Wave ListCard."
1296
+ },
1297
+ "Wave Full ListItem1Card": {
1298
+ "prefix": "w_full_list_item1_card",
1299
+ "body": [
1300
+ "ui.list_item1_card(box='$1', title='$2', caption='$3', value='$4', aux_value='$5', data=$6, commands=[\n\t\t$7\t\t\n])$0"
1301
+ ],
1302
+ "description": "Create a full Wave ListItem1Card."
1303
+ },
1304
+ "Wave Full MarkdownCard": {
1305
+ "prefix": "w_full_markdown_card",
1306
+ "body": [
1307
+ "ui.markdown_card(box='$1', title='$2', content='$3', data=${4:None}, commands=[\n\t\t$5\t\t\n])$0"
1308
+ ],
1309
+ "description": "Create a full Wave MarkdownCard."
1310
+ },
1311
+ "Wave Full MarkdownTableCellType": {
1312
+ "prefix": "w_full_markdown_table_cell_type",
1313
+ "body": [
1314
+ "ui.markdown_table_cell_type(name='$1', target='$2'),$0"
1315
+ ],
1316
+ "description": "Create a full Wave MarkdownTableCellType."
1317
+ },
1318
+ "Wave Full Markup": {
1319
+ "prefix": "w_full_markup",
1320
+ "body": [
1321
+ "ui.markup(content='$1', name='$2', width='$3', visible=${4:True}),$0"
1322
+ ],
1323
+ "description": "Create a full Wave Markup."
1324
+ },
1325
+ "Wave Full MarkupCard": {
1326
+ "prefix": "w_full_markup_card",
1327
+ "body": [
1328
+ "ui.markup_card(box='$1', title='$2', content='$3', compact=${4:False}, commands=[\n\t\t$5\t\t\n])$0"
1329
+ ],
1330
+ "description": "Create a full Wave MarkupCard."
1331
+ },
1332
+ "Wave Full Menu": {
1333
+ "prefix": "w_full_menu",
1334
+ "body": [
1335
+ "ui.menu(icon='$1', image='$2', name='$3', label='$4', items=[\n\t\t$5\t\t\n]),$0"
1336
+ ],
1337
+ "description": "Create a full Wave Menu."
1338
+ },
1339
+ "Wave Full MenuTableCellType": {
1340
+ "prefix": "w_full_menu_table_cell_type",
1341
+ "body": [
1342
+ "ui.menu_table_cell_type(name='$1', commands=[\n\t\t$2\t\t\n]),$0"
1343
+ ],
1344
+ "description": "Create a full Wave MenuTableCellType."
1345
+ },
1346
+ "Wave Full MessageBar": {
1347
+ "prefix": "w_full_message_bar",
1348
+ "body": [
1349
+ "ui.message_bar(type='$1', text='$2', name='$3', width='${4:100%}', visible=${5:True}, buttons=[\n\t\t$6\t\t\n]),$0"
1350
+ ],
1351
+ "description": "Create a full Wave MessageBar."
1352
+ },
1353
+ "Wave Full InlineStylesheet": {
1354
+ "prefix": "w_full_inline_stylesheet",
1355
+ "body": [
1356
+ "ui.inline_stylesheet(content='$1', media='$2'),$0"
1357
+ ],
1358
+ "description": "Create a full Wave InlineStylesheet."
1359
+ },
1360
+ "Wave Full Stylesheet": {
1361
+ "prefix": "w_full_stylesheet",
1362
+ "body": [
1363
+ "ui.stylesheet(path='$1', media='$2', cross_origin='$3'),$0"
1364
+ ],
1365
+ "description": "Create a full Wave Stylesheet."
1366
+ },
1367
+ "Wave Full Layout": {
1368
+ "prefix": "w_full_layout",
1369
+ "body": [
1370
+ "ui.layout(breakpoint='$1', width='${2:100%}', min_width='$3', max_width='$4', height='${5:auto}', min_height='$6', max_height='$7', name='$8', zones=[\n\t\t$9\t\t\n]),$0"
1371
+ ],
1372
+ "description": "Create a full Wave Layout."
1373
+ },
1374
+ "Wave Full Zone": {
1375
+ "prefix": "w_full_zone",
1376
+ "body": [
1377
+ "ui.zone(name='$1', size='$2', direction='$3', justify='$4', align='$5', wrap='$6', zones=[\n\t\t$7\t\t\n]),$0"
1378
+ ],
1379
+ "description": "Create a full Wave Zone."
1380
+ },
1381
+ "Wave Full Theme": {
1382
+ "prefix": "w_full_theme",
1383
+ "body": [
1384
+ "ui.theme(name='$1', text='$2', card='$3', page='$4', primary='$5'),$0"
1385
+ ],
1386
+ "description": "Create a full Wave Theme."
1387
+ },
1388
+ "Wave Full MetaCard": {
1389
+ "prefix": "w_full_meta_card",
1390
+ "body": [
1391
+ "ui.meta_card(box='$1', title='$2', refresh=${3:None}, notification='$4', notification_bar=${5:None}, redirect='$6', icon='$7', dialog=${8:None}, side_panel=${9:None}, theme='$10', tracker=${11:None}, script=${12:None}, stylesheet=${13:None}, layouts=[\n\t\t$14\t\t\n], themes=[\n\t\t$15\t\t\n], scripts=[\n\t\t$16\t\t\n], stylesheets=[\n\t\t$17\t\t\n], commands=[\n\t\t$18\t\t\n])$0"
1392
+ ],
1393
+ "description": "Create a full Wave MetaCard."
1394
+ },
1395
+ "Wave Full NavItem": {
1396
+ "prefix": "w_full_nav_item",
1397
+ "body": [
1398
+ "ui.nav_item(name='$1', label='$2', icon='$3', disabled=${4:False}, tooltip='$5', path='$6'),$0"
1399
+ ],
1400
+ "description": "Create a full Wave NavItem."
1401
+ },
1402
+ "Wave Full NavGroup": {
1403
+ "prefix": "w_full_nav_group",
1404
+ "body": [
1405
+ "ui.nav_group(label='$1', collapsed=${2:False}, items=[\n\t\t$3\t\t\n]),$0"
1406
+ ],
1407
+ "description": "Create a full Wave NavGroup."
1408
+ },
1409
+ "Wave Full NavCard": {
1410
+ "prefix": "w_full_nav_card",
1411
+ "body": [
1412
+ "ui.nav_card(box='$1', value='$2', title='$3', subtitle='$4', icon='$5', icon_color='$6', image='$7', persona=${8:None}, color='${9:card}', items=[\n\t\t$10\t\t\n], secondary_items=[\n\t\t$11\t\t\n], commands=[\n\t\t$12\t\t\n])$0"
1413
+ ],
1414
+ "description": "Create a full Wave NavCard."
1415
+ },
1416
+ "Wave Full NotificationBar": {
1417
+ "prefix": "w_full_notification_bar",
1418
+ "body": [
1419
+ "ui.notification_bar(text='$1', type='${2:info}', timeout=${3:5}, position='${4:top-right}', name='$5', buttons=[\n\t\t$6\t\t\n], events=[\n\t\t$7\t\t\n]),$0"
1420
+ ],
1421
+ "description": "Create a full Wave NotificationBar."
1422
+ },
1423
+ "Wave Full Persona": {
1424
+ "prefix": "w_full_persona",
1425
+ "body": [
1426
+ "ui.persona(title='$1', subtitle='$2', caption='$3', size='${4:m}', image='$5', initials='$6', initials_color='$7', name='$8'),$0"
1427
+ ],
1428
+ "description": "Create a full Wave Persona."
1429
+ },
1430
+ "Wave Full Picker": {
1431
+ "prefix": "w_full_picker",
1432
+ "body": [
1433
+ "ui.picker(name='$1', label='$2', max_choices=${3:None}, required=${4:False}, disabled=${5:False}, width='${6:100%}', visible=${7:True}, trigger=${8:False}, tooltip='$9', choices=[\n\t\t$10\t\t\n], values=[\n\t\t$11\t\t\n]),$0"
1434
+ ],
1435
+ "description": "Create a full Wave Picker."
1436
+ },
1437
+ "Wave Full PixelArtCard": {
1438
+ "prefix": "w_full_pixel_art_card",
1439
+ "body": [
1440
+ "ui.pixel_art_card(box='$1', title='$2', data=$3, commands=[\n\t\t$4\t\t\n])$0"
1441
+ ],
1442
+ "description": "Create a full Wave PixelArtCard."
1443
+ },
1444
+ "Wave Full Pixel": {
1445
+ "prefix": "w_full_pixel",
1446
+ "body": [
1447
+ "ui.pixel(color='$1'),$0"
1448
+ ],
1449
+ "description": "Create a full Wave Pixel."
1450
+ },
1451
+ "Wave Full Mark": {
1452
+ "prefix": "w_full_mark",
1453
+ "body": [
1454
+ "ui.mark(coord='$1', type='$2', x=${3:None}, x0=${4:None}, x1=${5:None}, x2=${6:None}, x_q1=${7:None}, x_q2=${8:None}, x_q3=${9:None}, x_min=${10:None}, x_max=${11:None}, x_nice=${12:False}, x_scale='$13', x_title='$14', y=${15:None}, y0=${16:None}, y1=${17:None}, y2=${18:None}, y_q1=${19:None}, y_q2=${20:None}, y_q3=${21:None}, y_min=${22:None}, y_max=${23:None}, y_nice=${24:False}, y_scale='$25', y_title='$26', color='$27', color_range='$28', shape='$29', shape_range='$30', size=${31:None}, size_range='$32', stack='$33', dodge='$34', curve='$35', fill_color='$36', fill_opacity=${37:None}, stroke_color='$38', stroke_opacity=${39:None}, stroke_size=${40:None}, stroke_dash='$41', label='$42', label_offset=${43:None}, label_offset_x=${44:None}, label_offset_y=${45:None}, label_rotation='$46', label_position='$47', label_overlap='$48', label_fill_color='$49', label_fill_opacity=${50:None}, label_stroke_color='$51', label_stroke_opacity=${52:None}, label_stroke_size=${53:None}, label_font_size=${54:None}, label_font_weight='$55', label_line_height=${56:None}, label_align='$57', ref_stroke_color='$58', ref_stroke_opacity=${59:None}, ref_stroke_size=${60:None}, ref_stroke_dash='$61', interactive=${62:True}, color_domain=[\n\t\t$63\t\t\n]),$0"
1455
+ ],
1456
+ "description": "Create a full Wave Mark."
1457
+ },
1458
+ "Wave Full MarkExt": {
1459
+ "prefix": "w_full_mark_ext",
1460
+ "body": [
1461
+ "ui.mark_ext(x_field='$1', x_format=${2:None}, x0_field='$3', x0_format=${4:None}, x1_field='$5', x1_format=${6:None}, x2_field='$7', x2_format=${8:None}, x_q1_field='$9', x_q1_format=${10:None}, x_q2_field='$11', x_q2_format=${12:None}, x_q3_field='$13', x_q3__format=${14:None}, y_field='$15', y_format=${16:None}, y0_field='$17', y0_format=${18:None}, y1_field='$19', y1_format=${20:None}, y2_field='$21', y2_format=${22:None}, y_q1_field='$23', y_q1_format=${24:None}, y_q2_field='$25', y_q2_format=${26:None}, y_q3_field='$27', y_q3__format=${28:None}, color_field='$29', color_format=${30:None}, shape_field='$31', shape_format=${32:None}, size_format=${33:None}, size_field='$34', dodge_field='$35', label_field='$36', label_format=${37:None}),$0"
1462
+ ],
1463
+ "description": "Create a full Wave MarkExt."
1464
+ },
1465
+ "Wave Full Plot": {
1466
+ "prefix": "w_full_plot",
1467
+ "body": [
1468
+ "ui.plot(marks=[\n\t\t$1\t\t\n]),$0"
1469
+ ],
1470
+ "description": "Create a full Wave Plot."
1471
+ },
1472
+ "Wave Full Visualization": {
1473
+ "prefix": "w_full_visualization",
1474
+ "body": [
1475
+ "ui.visualization(plot=$1, data=$2, width='${3:100%}', height='${4:300px}', name='$5', visible=${6:True}, events=[\n\t\t$7\t\t\n], interactions=[\n\t\t$8\t\t\n]),$0"
1476
+ ],
1477
+ "description": "Create a full Wave Visualization."
1478
+ },
1479
+ "Wave Full PlotCard": {
1480
+ "prefix": "w_full_plot_card",
1481
+ "body": [
1482
+ "ui.plot_card(box='$1', title='$2', data=$3, plot=$4, events=[\n\t\t$5\t\t\n], interactions=[\n\t\t$6\t\t\n], commands=[\n\t\t$7\t\t\n])$0"
1483
+ ],
1484
+ "description": "Create a full Wave PlotCard."
1485
+ },
1486
+ "Wave Full PostCard": {
1487
+ "prefix": "w_full_post_card",
1488
+ "body": [
1489
+ "ui.post_card(box='$1', persona=$2, image='$3', aux_value='$4', caption='$5', items=[\n\t\t$6\t\t\n], commands=[\n\t\t$7\t\t\n])$0"
1490
+ ],
1491
+ "description": "Create a full Wave PostCard."
1492
+ },
1493
+ "Wave Full PreviewCard": {
1494
+ "prefix": "w_full_preview_card",
1495
+ "body": [
1496
+ "ui.preview_card(box='$1', name='$2', image='$3', title='$4', caption='$5', label='$6', items=[\n\t\t$7\t\t\n], commands=[\n\t\t$8\t\t\n])$0"
1497
+ ],
1498
+ "description": "Create a full Wave PreviewCard."
1499
+ },
1500
+ "Wave Full ProfileCard": {
1501
+ "prefix": "w_full_profile_card",
1502
+ "body": [
1503
+ "ui.profile_card(box='$1', persona=$2, image='$3', height='$4', items=[\n\t\t$5\t\t\n], commands=[\n\t\t$6\t\t\n])$0"
1504
+ ],
1505
+ "description": "Create a full Wave ProfileCard."
1506
+ },
1507
+ "Wave Full Progress": {
1508
+ "prefix": "w_full_progress",
1509
+ "body": [
1510
+ "ui.progress(label='$1', caption='$2', value=${3:None}, width='${4:100%}', visible=${5:True}, tooltip='$6', name='$7', type='${8:bar}'),$0"
1511
+ ],
1512
+ "description": "Create a full Wave Progress."
1513
+ },
1514
+ "Wave Full ProgressTableCellType": {
1515
+ "prefix": "w_full_progress_table_cell_type",
1516
+ "body": [
1517
+ "ui.progress_table_cell_type(color='$1', name='$2'),$0"
1518
+ ],
1519
+ "description": "Create a full Wave ProgressTableCellType."
1520
+ },
1521
+ "Wave Full RangeSlider": {
1522
+ "prefix": "w_full_range_slider",
1523
+ "body": [
1524
+ "ui.range_slider(name='$1', label='$2', min=${3:0}, max=${4:100}, step=${5:None}, min_value=${6:None}, max_value=${7:None}, disabled=${8:False}, width='${9:100%}', trigger=${10:False}, visible=${11:True}, tooltip='$12'),$0"
1525
+ ],
1526
+ "description": "Create a full Wave RangeSlider."
1527
+ },
1528
+ "Wave Full RepeatCard": {
1529
+ "prefix": "w_full_repeat_card",
1530
+ "body": [
1531
+ "ui.repeat_card(box='$1', item_view='$2', item_props=$3, data=$4, commands=[\n\t\t$5\t\t\n])$0"
1532
+ ],
1533
+ "description": "Create a full Wave RepeatCard."
1534
+ },
1535
+ "Wave Full Script": {
1536
+ "prefix": "w_full_script",
1537
+ "body": [
1538
+ "ui.script(path='$1', asynchronous=${2:False}, cross_origin='$3', referrer_policy='$4', integrity='$5'),$0"
1539
+ ],
1540
+ "description": "Create a full Wave Script."
1541
+ },
1542
+ "Wave Full InlineScript": {
1543
+ "prefix": "w_full_inline_script",
1544
+ "body": [
1545
+ "ui.inline_script(content='$1', requires=[\n\t\t$2\t\t\n], targets=[\n\t\t$3\t\t\n]),$0"
1546
+ ],
1547
+ "description": "Create a full Wave InlineScript."
1548
+ },
1549
+ "Wave Full SectionCard": {
1550
+ "prefix": "w_full_section_card",
1551
+ "body": [
1552
+ "ui.section_card(box='$1', title='$2', subtitle='$3', items=[\n\t\t$4\t\t\n], commands=[\n\t\t$5\t\t\n])$0"
1553
+ ],
1554
+ "description": "Create a full Wave SectionCard."
1555
+ },
1556
+ "Wave Full Separator": {
1557
+ "prefix": "w_full_separator",
1558
+ "body": [
1559
+ "ui.separator(label='$1', name='$2', width='${3:100%}', visible=${4:True}),$0"
1560
+ ],
1561
+ "description": "Create a full Wave Separator."
1562
+ },
1563
+ "Wave Full SidePanel": {
1564
+ "prefix": "w_full_side_panel",
1565
+ "body": [
1566
+ "ui.side_panel(title='$1', width='${2:600px}', name='$3', blocking=${4:False}, closable=${5:False}, items=[\n\t\t$6\t\t\n], events=[\n\t\t$7\t\t\n]),$0"
1567
+ ],
1568
+ "description": "Create a full Wave SidePanel."
1569
+ },
1570
+ "Wave Full Slider": {
1571
+ "prefix": "w_full_slider",
1572
+ "body": [
1573
+ "ui.slider(name='$1', label='$2', min=${3:None}, max=${4:None}, step=${5:None}, value=${6:None}, disabled=${7:False}, trigger=${8:False}, width='${9:100%}', visible=${10:True}, tooltip='$11'),$0"
1574
+ ],
1575
+ "description": "Create a full Wave Slider."
1576
+ },
1577
+ "Wave Full SmallSeriesStatCard": {
1578
+ "prefix": "w_full_small_series_stat_card",
1579
+ "body": [
1580
+ "ui.small_series_stat_card(box='$1', title='$2', value='$3', plot_data=$4, plot_value='$5', plot_zero_value=${6:None}, plot_category='${7:x}', plot_type='${8:area}', plot_curve='${9:linear}', plot_color='$10', data=${11:None}, commands=[\n\t\t$12\t\t\n])$0"
1581
+ ],
1582
+ "description": "Create a full Wave SmallSeriesStatCard."
1583
+ },
1584
+ "Wave Full SmallStatCard": {
1585
+ "prefix": "w_full_small_stat_card",
1586
+ "body": [
1587
+ "ui.small_stat_card(box='$1', title='$2', value='$3', data=${4:None}, commands=[\n\t\t$5\t\t\n])$0"
1588
+ ],
1589
+ "description": "Create a full Wave SmallStatCard."
1590
+ },
1591
+ "Wave Full Spinbox": {
1592
+ "prefix": "w_full_spinbox",
1593
+ "body": [
1594
+ "ui.spinbox(name='$1', label='$2', min=${3:0}, max=${4:100}, step=${5:1}, value=${6:0}, disabled=${7:False}, width='${8:100%}', visible=${9:True}, trigger=${10:False}, tooltip='$11'),$0"
1595
+ ],
1596
+ "description": "Create a full Wave Spinbox."
1597
+ },
1598
+ "Wave Full StatListCard": {
1599
+ "prefix": "w_full_stat_list_card",
1600
+ "body": [
1601
+ "ui.stat_list_card(box='$1', title='$2', name='$3', subtitle='$4', items=[\n\t\t$5\t\t\n], commands=[\n\t\t$6\t\t\n])$0"
1602
+ ],
1603
+ "description": "Create a full Wave StatListCard."
1604
+ },
1605
+ "Wave Full StatListItem": {
1606
+ "prefix": "w_full_stat_list_item",
1607
+ "body": [
1608
+ "ui.stat_list_item(label='$1', name='$2', caption='$3', value='$4', value_color='$5', aux_value='$6', icon='$7', icon_color='$8'),$0"
1609
+ ],
1610
+ "description": "Create a full Wave StatListItem."
1611
+ },
1612
+ "Wave Full StatTableCard": {
1613
+ "prefix": "w_full_stat_table_card",
1614
+ "body": [
1615
+ "ui.stat_table_card(box='$1', title='$2', name='$3', subtitle='$4', columns=[\n\t\t$5\t\t\n], items=[\n\t\t$6\t\t\n], commands=[\n\t\t$7\t\t\n])$0"
1616
+ ],
1617
+ "description": "Create a full Wave StatTableCard."
1618
+ },
1619
+ "Wave Full StatTableItem": {
1620
+ "prefix": "w_full_stat_table_item",
1621
+ "body": [
1622
+ "ui.stat_table_item(label='$1', name='$2', caption='$3', icon='$4', icon_color='$5', values=[\n\t\t$6\t\t\n], colors=[\n\t\t$7\t\t\n]),$0"
1623
+ ],
1624
+ "description": "Create a full Wave StatTableItem."
1625
+ },
1626
+ "Wave Full Stats": {
1627
+ "prefix": "w_full_stats",
1628
+ "body": [
1629
+ "ui.stats(justify='${1:start}', inset=${2:False}, width='$3', visible=${4:True}, items=[\n\t\t$5\t\t\n]),$0"
1630
+ ],
1631
+ "description": "Create a full Wave Stats."
1632
+ },
1633
+ "Wave Full Stat": {
1634
+ "prefix": "w_full_stat",
1635
+ "body": [
1636
+ "ui.stat(label='$1', value='$2', caption='$3', icon='$4', icon_color='$5'),$0"
1637
+ ],
1638
+ "description": "Create a full Wave Stat."
1639
+ },
1640
+ "Wave Full Step": {
1641
+ "prefix": "w_full_step",
1642
+ "body": [
1643
+ "ui.step(label='$1', icon='$2', done=${3:False}),$0"
1644
+ ],
1645
+ "description": "Create a full Wave Step."
1646
+ },
1647
+ "Wave Full Stepper": {
1648
+ "prefix": "w_full_stepper",
1649
+ "body": [
1650
+ "ui.stepper(name='$1', width='${2:100%}', visible=${3:True}, tooltip='$4', items=[\n\t\t$5\t\t\n]),$0"
1651
+ ],
1652
+ "description": "Create a full Wave Stepper."
1653
+ },
1654
+ "Wave Full TabCard": {
1655
+ "prefix": "w_full_tab_card",
1656
+ "body": [
1657
+ "ui.tab_card(box='$1', value='$2', link=${3:False}, name='$4', items=[\n\t\t$5\t\t\n], commands=[\n\t\t$6\t\t\n])$0"
1658
+ ],
1659
+ "description": "Create a full Wave TabCard."
1660
+ },
1661
+ "Wave Full TablePagination": {
1662
+ "prefix": "w_full_table_pagination",
1663
+ "body": [
1664
+ "ui.table_pagination(total_rows=$1, rows_per_page=$2),$0"
1665
+ ],
1666
+ "description": "Create a full Wave TablePagination."
1667
+ },
1668
+ "Wave Full TableCellType": {
1669
+ "prefix": "w_full_table_cell_type",
1670
+ "body": [
1671
+ "ui.table_cell_type(progress=${1:None}, icon=${2:None}, tag=${3:None}, menu=${4:None}, markdown=${5:None}),$0"
1672
+ ],
1673
+ "description": "Create a full Wave TableCellType."
1674
+ },
1675
+ "Wave Full TableColumn": {
1676
+ "prefix": "w_full_table_column",
1677
+ "body": [
1678
+ "ui.table_column(name='$1', label='$2', min_width='$3', max_width='$4', sortable=${5:False}, searchable=${6:False}, filterable=${7:False}, link=${8:False}, data_type='${9:string}', cell_type=${10:None}, cell_overflow='$11', align='$12', filters=[\n\t\t$13\t\t\n]),$0"
1679
+ ],
1680
+ "description": "Create a full Wave TableColumn."
1681
+ },
1682
+ "Wave Full TableRow": {
1683
+ "prefix": "w_full_table_row",
1684
+ "body": [
1685
+ "ui.table_row(name='$1', cells=[\n\t\t$2\t\t\n]),$0"
1686
+ ],
1687
+ "description": "Create a full Wave TableRow."
1688
+ },
1689
+ "Wave Full TableGroup": {
1690
+ "prefix": "w_full_table_group",
1691
+ "body": [
1692
+ "ui.table_group(label='$1', collapsed=${2:True}, rows=[\n\t\t$3\t\t\n]),$0"
1693
+ ],
1694
+ "description": "Create a full Wave TableGroup."
1695
+ },
1696
+ "Wave Full Table": {
1697
+ "prefix": "w_full_table",
1698
+ "body": [
1699
+ "ui.table(name='$1', multiple=${2:False}, groupable=${3:False}, downloadable=${4:False}, resettable=${5:False}, height='$6', width='${7:100%}', checkbox_visibility='${8:on-hover}', visible=${9:True}, tooltip='$10', pagination=${11:None}, single=${12:False}, value='$13', columns=[\n\t\t$14\t\t\n], rows=[\n\t\t$15\t\t\n], values=[\n\t\t$16\t\t\n], groups=[\n\t\t$17\t\t\n], events=[\n\t\t$18\t\t\n]),$0"
1700
+ ],
1701
+ "description": "Create a full Wave Table."
1702
+ },
1703
+ "Wave Full Tab": {
1704
+ "prefix": "w_full_tab",
1705
+ "body": [
1706
+ "ui.tab(name='$1', label='$2', icon='$3'),$0"
1707
+ ],
1708
+ "description": "Create a full Wave Tab."
1709
+ },
1710
+ "Wave Full Tabs": {
1711
+ "prefix": "w_full_tabs",
1712
+ "body": [
1713
+ "ui.tabs(name='$1', value='$2', width='$3', visible=${4:True}, link=${5:False}, items=[\n\t\t$6\t\t\n]),$0"
1714
+ ],
1715
+ "description": "Create a full Wave Tabs."
1716
+ },
1717
+ "Wave Full TagTableCellType": {
1718
+ "prefix": "w_full_tag_table_cell_type",
1719
+ "body": [
1720
+ "ui.tag_table_cell_type(name='$1', tags=[\n\t\t$2\t\t\n]),$0"
1721
+ ],
1722
+ "description": "Create a full Wave TagTableCellType."
1723
+ },
1724
+ "Wave Full Tag": {
1725
+ "prefix": "w_full_tag",
1726
+ "body": [
1727
+ "ui.tag(label='$1', color='$2', label_color='$3'),$0"
1728
+ ],
1729
+ "description": "Create a full Wave Tag."
1730
+ },
1731
+ "Wave Full Tags": {
1732
+ "prefix": "w_full_tags",
1733
+ "body": [
1734
+ "ui.tags(items=[\n\t\t$1\t\t\n]),$0"
1735
+ ],
1736
+ "description": "Create a full Wave Tags."
1737
+ },
1738
+ "Wave Full TallArticlePreviewCard": {
1739
+ "prefix": "w_full_tall_article_preview_card",
1740
+ "body": [
1741
+ "ui.tall_article_preview_card(box='$1', title='$2', image='$3', subtitle='$4', value='$5', content='$6', name='$7', items=[\n\t\t$8\t\t\n], commands=[\n\t\t$9\t\t\n])$0"
1742
+ ],
1743
+ "description": "Create a full Wave TallArticlePreviewCard."
1744
+ },
1745
+ "Wave Full TallGaugeStatCard": {
1746
+ "prefix": "w_full_tall_gauge_stat_card",
1747
+ "body": [
1748
+ "ui.tall_gauge_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5, plot_color='$6', data=${7:None}, commands=[\n\t\t$8\t\t\n])$0"
1749
+ ],
1750
+ "description": "Create a full Wave TallGaugeStatCard."
1751
+ },
1752
+ "Wave Full TallInfoCard": {
1753
+ "prefix": "w_full_tall_info_card",
1754
+ "body": [
1755
+ "ui.tall_info_card(box='$1', name='$2', title='$3', caption='$4', label='$5', icon='$6', image='$7', image_height='${8:150px}', category='$9', commands=[\n\t\t$10\t\t\n])$0"
1756
+ ],
1757
+ "description": "Create a full Wave TallInfoCard."
1758
+ },
1759
+ "Wave Full TallSeriesStatCard": {
1760
+ "prefix": "w_full_tall_series_stat_card",
1761
+ "body": [
1762
+ "ui.tall_series_stat_card(box='$1', title='$2', value='$3', aux_value='$4', plot_data=$5, plot_value='$6', plot_zero_value=${7:None}, plot_category='${8:x}', plot_type='${9:area}', plot_curve='${10:linear}', plot_color='$11', data=${12:None}, commands=[\n\t\t$13\t\t\n])$0"
1763
+ ],
1764
+ "description": "Create a full Wave TallSeriesStatCard."
1765
+ },
1766
+ "Wave Full TallStatsCard": {
1767
+ "prefix": "w_full_tall_stats_card",
1768
+ "body": [
1769
+ "ui.tall_stats_card(box='$1', items=[\n\t\t$2\t\t\n], commands=[\n\t\t$3\t\t\n])$0"
1770
+ ],
1771
+ "description": "Create a full Wave TallStatsCard."
1772
+ },
1773
+ "Wave Full Template": {
1774
+ "prefix": "w_full_template",
1775
+ "body": [
1776
+ "ui.template(content='$1', data=${2:None}, name='$3', width='$4', visible=${5:True}),$0"
1777
+ ],
1778
+ "description": "Create a full Wave Template."
1779
+ },
1780
+ "Wave Full TemplateCard": {
1781
+ "prefix": "w_full_template_card",
1782
+ "body": [
1783
+ "ui.template_card(box='$1', title='$2', content='$3', data=${4:None}, commands=[\n\t\t$5\t\t\n])$0"
1784
+ ],
1785
+ "description": "Create a full Wave TemplateCard."
1786
+ },
1787
+ "Wave Full Text": {
1788
+ "prefix": "w_full_text",
1789
+ "body": [
1790
+ "ui.text(content='$1', size='$2', width='$3', visible=${4:True}, tooltip='$5', name='$6'),$0"
1791
+ ],
1792
+ "description": "Create a full Wave Text."
1793
+ },
1794
+ "Wave Full TextXl": {
1795
+ "prefix": "w_full_text_xl",
1796
+ "body": [
1797
+ "ui.text_xl(content='$1', width='$2', visible=${3:True}, tooltip='$4', name='$5', commands=[\n\t\t$6\t\t\n]),$0"
1798
+ ],
1799
+ "description": "Create a full Wave TextXl."
1800
+ },
1801
+ "Wave Full TextL": {
1802
+ "prefix": "w_full_text_l",
1803
+ "body": [
1804
+ "ui.text_l(content='$1', width='$2', visible=${3:True}, tooltip='$4', name='$5', commands=[\n\t\t$6\t\t\n]),$0"
1805
+ ],
1806
+ "description": "Create a full Wave TextL."
1807
+ },
1808
+ "Wave Full TextM": {
1809
+ "prefix": "w_full_text_m",
1810
+ "body": [
1811
+ "ui.text_m(content='$1', width='$2', visible=${3:True}, tooltip='$4', name='$5'),$0"
1812
+ ],
1813
+ "description": "Create a full Wave TextM."
1814
+ },
1815
+ "Wave Full TextS": {
1816
+ "prefix": "w_full_text_s",
1817
+ "body": [
1818
+ "ui.text_s(content='$1', width='$2', visible=${3:True}, tooltip='$4', name='$5'),$0"
1819
+ ],
1820
+ "description": "Create a full Wave TextS."
1821
+ },
1822
+ "Wave Full TextXs": {
1823
+ "prefix": "w_full_text_xs",
1824
+ "body": [
1825
+ "ui.text_xs(content='$1', width='$2', visible=${3:True}, tooltip='$4', name='$5'),$0"
1826
+ ],
1827
+ "description": "Create a full Wave TextXs."
1828
+ },
1829
+ "Wave Full TextAnnotatorTag": {
1830
+ "prefix": "w_full_text_annotator_tag",
1831
+ "body": [
1832
+ "ui.text_annotator_tag(name='$1', label='$2', color='$3'),$0"
1833
+ ],
1834
+ "description": "Create a full Wave TextAnnotatorTag."
1835
+ },
1836
+ "Wave Full TextAnnotatorItem": {
1837
+ "prefix": "w_full_text_annotator_item",
1838
+ "body": [
1839
+ "ui.text_annotator_item(text='$1', tag='$2'),$0"
1840
+ ],
1841
+ "description": "Create a full Wave TextAnnotatorItem."
1842
+ },
1843
+ "Wave Full TextAnnotator": {
1844
+ "prefix": "w_full_text_annotator",
1845
+ "body": [
1846
+ "ui.text_annotator(name='$1', title='$2', trigger=${3:False}, readonly=${4:False}, tags=[\n\t\t$5\t\t\n], items=[\n\t\t$6\t\t\n]),$0"
1847
+ ],
1848
+ "description": "Create a full Wave TextAnnotator."
1849
+ },
1850
+ "Wave Full Textbox": {
1851
+ "prefix": "w_full_textbox",
1852
+ "body": [
1853
+ "ui.textbox(name='$1', label='$2', placeholder='$3', value='$4', mask='$5', icon='$6', prefix='$7', suffix='$8', error='$9', required=${10:False}, disabled=${11:False}, readonly=${12:False}, multiline=${13:False}, password=${14:False}, trigger=${15:False}, height='$16', width='${17:100%}', visible=${18:True}, tooltip='$19', spellcheck=${20:True}),$0"
1854
+ ],
1855
+ "description": "Create a full Wave Textbox."
1856
+ },
1857
+ "Wave Full TimePicker": {
1858
+ "prefix": "w_full_time_picker",
1859
+ "body": [
1860
+ "ui.time_picker(name='$1', label='$2', placeholder='$3', value='$4', disabled=${5:False}, width='${6:100%}', visible=${7:True}, trigger=${8:False}, required=${9:False}, hour_format='${10:12}', min='$11', max='$12', minutes_step=${13:1}),$0"
1861
+ ],
1862
+ "description": "Create a full Wave TimePicker."
1863
+ },
1864
+ "Wave Full Toggle": {
1865
+ "prefix": "w_full_toggle",
1866
+ "body": [
1867
+ "ui.toggle(name='$1', label='$2', value=${3:False}, disabled=${4:False}, trigger=${5:False}, width='$6', visible=${7:True}, tooltip='$8'),$0"
1868
+ ],
1869
+ "description": "Create a full Wave Toggle."
1870
+ },
1871
+ "Wave Full Command": {
1872
+ "prefix": "w_full_command",
1873
+ "body": [
1874
+ "ui.command(name='$1', label='$2', caption='$3', icon='$4', value='$5', data='$6', items=[\n\t\t$7\t\t\n]),$0"
1875
+ ],
1876
+ "description": "Create a full Wave Command."
1877
+ },
1878
+ "Wave Full ToolbarCard": {
1879
+ "prefix": "w_full_toolbar_card",
1880
+ "body": [
1881
+ "ui.toolbar_card(box='$1', items=[\n\t\t$2\t\t\n], secondary_items=[\n\t\t$3\t\t\n], overflow_items=[\n\t\t$4\t\t\n], commands=[\n\t\t$5\t\t\n])$0"
1882
+ ],
1883
+ "description": "Create a full Wave ToolbarCard."
1884
+ },
1885
+ "Wave Full Tracker": {
1886
+ "prefix": "w_full_tracker",
1887
+ "body": [
1888
+ "ui.tracker(type='$1', id='$2'),$0"
1889
+ ],
1890
+ "description": "Create a full Wave Tracker."
1891
+ },
1892
+ "Wave Full VegaVisualization": {
1893
+ "prefix": "w_full_vega_visualization",
1894
+ "body": [
1895
+ "ui.vega_visualization(specification='$1', data=${2:None}, width='${3:100%}', height='${4:300px}', name='$5', visible=${6:True}, grammar='${7:vega-lite}'),$0"
1896
+ ],
1897
+ "description": "Create a full Wave VegaVisualization."
1898
+ },
1899
+ "Wave Full VegaCard": {
1900
+ "prefix": "w_full_vega_card",
1901
+ "body": [
1902
+ "ui.vega_card(box='$1', title='$2', specification='$3', data=${4:None}, grammar='${5:vega-lite}', commands=[\n\t\t$6\t\t\n])$0"
1903
+ ],
1904
+ "description": "Create a full Wave VegaCard."
1905
+ },
1906
+ "Wave Full WideArticlePreviewCard": {
1907
+ "prefix": "w_full_wide_article_preview_card",
1908
+ "body": [
1909
+ "ui.wide_article_preview_card(box='$1', persona=$2, image='$3', title='$4', name='$5', aux_value='$6', caption='$7', content='$8', items=[\n\t\t$9\t\t\n], commands=[\n\t\t$10\t\t\n])$0"
1910
+ ],
1911
+ "description": "Create a full Wave WideArticlePreviewCard."
1912
+ },
1913
+ "Wave Full WideBarStatCard": {
1914
+ "prefix": "w_full_wide_bar_stat_card",
1915
+ "body": [
1916
+ "ui.wide_bar_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5, plot_color='$6', data=${7:None}, commands=[\n\t\t$8\t\t\n])$0"
1917
+ ],
1918
+ "description": "Create a full Wave WideBarStatCard."
1919
+ },
1920
+ "Wave Full WideGaugeStatCard": {
1921
+ "prefix": "w_full_wide_gauge_stat_card",
1922
+ "body": [
1923
+ "ui.wide_gauge_stat_card(box='$1', title='$2', value='$3', aux_value='$4', progress=$5, plot_color='$6', data=${7:None}, commands=[\n\t\t$8\t\t\n])$0"
1924
+ ],
1925
+ "description": "Create a full Wave WideGaugeStatCard."
1926
+ },
1927
+ "Wave Full WideInfoCard": {
1928
+ "prefix": "w_full_wide_info_card",
1929
+ "body": [
1930
+ "ui.wide_info_card(box='$1', name='$2', title='$3', caption='$4', label='$5', subtitle='$6', align='${7:left}', icon='$8', image='$9', category='$10', commands=[\n\t\t$11\t\t\n])$0"
1931
+ ],
1932
+ "description": "Create a full Wave WideInfoCard."
1933
+ },
1934
+ "Wave Full Pie": {
1935
+ "prefix": "w_full_pie",
1936
+ "body": [
1937
+ "ui.pie(label='$1', value='$2', fraction=$3, color='$4', aux_value='$5'),$0"
1938
+ ],
1939
+ "description": "Create a full Wave Pie."
1940
+ },
1941
+ "Wave Full WidePieStatCard": {
1942
+ "prefix": "w_full_wide_pie_stat_card",
1943
+ "body": [
1944
+ "ui.wide_pie_stat_card(box='$1', title='$2', pies=[\n\t\t$3\t\t\n], commands=[\n\t\t$4\t\t\n])$0"
1945
+ ],
1946
+ "description": "Create a full Wave WidePieStatCard."
1947
+ },
1948
+ "Wave Full WidePlotCard": {
1949
+ "prefix": "w_full_wide_plot_card",
1950
+ "body": [
1951
+ "ui.wide_plot_card(box='$1', title='$2', caption='$3', plot=$4, data=$5, commands=[\n\t\t$6\t\t\n])$0"
1952
+ ],
1953
+ "description": "Create a full Wave WidePlotCard."
1954
+ },
1955
+ "Wave Full WideSeriesStatCard": {
1956
+ "prefix": "w_full_wide_series_stat_card",
1957
+ "body": [
1958
+ "ui.wide_series_stat_card(box='$1', title='$2', value='$3', aux_value='$4', plot_data=$5, plot_value='$6', plot_zero_value=${7:None}, plot_category='${8:x}', plot_type='${9:area}', plot_curve='${10:linear}', plot_color='$11', data=${12:None}, commands=[\n\t\t$13\t\t\n])$0"
1959
+ ],
1960
+ "description": "Create a full Wave WideSeriesStatCard."
1961
+ }
1962
+ }
examples/tour.js CHANGED
@@ -24,6 +24,7 @@ const snippetToCompletionItem = item => ({
24
  insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
25
  })
26
  require(['vs/editor/editor.main', 'pyodide'], async () => {
 
27
  monaco.languages.registerCompletionItemProvider('python', {
28
  triggerCharacters: ['.', "'", '"'],
29
  provideCompletionItems: async (model, position) => {
 
24
  insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
25
  })
26
  require(['vs/editor/editor.main', 'pyodide'], async () => {
27
+ console.log('loaded monaco')
28
  monaco.languages.registerCompletionItemProvider('python', {
29
  triggerCharacters: ['.', "'", '"'],
30
  provideCompletionItems: async (model, position) => {
examples/tour.py CHANGED
@@ -183,18 +183,12 @@ async def setup_page(q: Q):
183
  py_content = ''
184
  parser_path = os.path.join(example_dir, 'tour_autocomplete_parser.py')
185
  utils_path = os.path.join(example_dir, 'tour_autocomplete_utils.py')
186
- # In prod.
187
  if os.path.exists(parser_path) and os.path.exists(utils_path):
188
  with open(parser_path, 'r') as f:
189
  py_content = f.read()
190
  with open(utils_path, 'r') as f:
191
  py_content += f.read()
192
- # When run in development from Wave repo.
193
- elif os.path.exists(vsc_extension_path):
194
- with open(os.path.join(vsc_extension_path, 'server', 'parser.py'), 'r') as f:
195
- py_content = f.read()
196
- with open(os.path.join(vsc_extension_path, 'server', 'utils.py'), 'r') as f:
197
- py_content += f.read()
198
 
199
  if py_content:
200
  py_content += '''
@@ -218,6 +212,8 @@ def get_wave_completions(line, character, file_content):
218
  js_code = ''
219
  with open(os.path.join(example_dir, 'tour.js'), 'r') as f:
220
  js_code = f.read()
 
 
221
  template = Template(js_code).substitute(
222
  tour_assets=q.app.tour_assets,
223
  base_url=_base_url,
@@ -383,15 +379,8 @@ async def serve(q: Q):
383
  q.app.tour_assets, = await q.site.upload_dir(os.path.join(example_dir, 'tour-assets'))
384
  base_snippets_path = os.path.join(example_dir, 'base-snippets.json')
385
  component_snippets_path = os.path.join(example_dir, 'component-snippets.json')
386
- # Prod.
387
  if os.path.exists(base_snippets_path) and os.path.exists(component_snippets_path):
388
  q.app.snippets1, q.app.snippets2, = await q.site.upload([base_snippets_path, component_snippets_path])
389
- # When run in development from Wave repo.
390
- elif os.path.exists(vsc_extension_path):
391
- q.app.snippets1, q.app.snippets2, = await q.site.upload([
392
- os.path.join(vsc_extension_path, 'base-snippets.json'),
393
- os.path.join(vsc_extension_path, 'component-snippets.json')
394
- ])
395
  q.app.initialized = True
396
  if not q.client.initialized:
397
  q.client.initialized = True
@@ -412,5 +401,5 @@ catalog = load_examples(example_filenames)
412
  print('----------------------------------------')
413
  print(' Welcome to the H2O Wave Interactive Tour!')
414
  print('')
415
- print(' Go to http://localhost:10101/tour')
416
  print('----------------------------------------')
 
183
  py_content = ''
184
  parser_path = os.path.join(example_dir, 'tour_autocomplete_parser.py')
185
  utils_path = os.path.join(example_dir, 'tour_autocomplete_utils.py')
186
+
187
  if os.path.exists(parser_path) and os.path.exists(utils_path):
188
  with open(parser_path, 'r') as f:
189
  py_content = f.read()
190
  with open(utils_path, 'r') as f:
191
  py_content += f.read()
 
 
 
 
 
 
192
 
193
  if py_content:
194
  py_content += '''
 
212
  js_code = ''
213
  with open(os.path.join(example_dir, 'tour.js'), 'r') as f:
214
  js_code = f.read()
215
+ print(q.app.snippets1)
216
+ print(q.app.snippets2)
217
  template = Template(js_code).substitute(
218
  tour_assets=q.app.tour_assets,
219
  base_url=_base_url,
 
379
  q.app.tour_assets, = await q.site.upload_dir(os.path.join(example_dir, 'tour-assets'))
380
  base_snippets_path = os.path.join(example_dir, 'base-snippets.json')
381
  component_snippets_path = os.path.join(example_dir, 'component-snippets.json')
 
382
  if os.path.exists(base_snippets_path) and os.path.exists(component_snippets_path):
383
  q.app.snippets1, q.app.snippets2, = await q.site.upload([base_snippets_path, component_snippets_path])
 
 
 
 
 
 
384
  q.app.initialized = True
385
  if not q.client.initialized:
386
  q.client.initialized = True
 
401
  print('----------------------------------------')
402
  print(' Welcome to the H2O Wave Interactive Tour!')
403
  print('')
404
+ print(' Go to http://localhost:10101')
405
  print('----------------------------------------')
examples/tour_autocomplete_parser.py ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import parso
2
+ import os
3
+ import itertools
4
+ from typing import Dict, List, Any, Optional, Set
5
+
6
+
7
+ def strip_quotes(val: str) -> str:
8
+ return val.strip('"').strip("'")
9
+
10
+
11
+ class FileMetadata():
12
+ files_to_parse: Dict[str, str] = {}
13
+
14
+ def __init__(self) -> None:
15
+ # TODO: Consider using Set instead of List.
16
+ self.args: List[str] = []
17
+ self.events: Dict[str, List[str]] = {}
18
+ self.zones: List[str] = []
19
+ self.client: List[str] = []
20
+ self.app: List[str] = []
21
+ self.user: List[str] = []
22
+ self.deps: Set[str] = set()
23
+
24
+ def add_completion(self, node: Any, completion_type: str) -> None:
25
+ if (node.type == 'string' or node.type == 'name'):
26
+ val = strip_quotes(node.value)
27
+ if val and (completion_type != 'args' or not val.startswith('#')):
28
+ getattr(self, completion_type).append(val)
29
+
30
+ def __get_event_names(self, nodes: List[Any]) -> List[str]:
31
+ return [strip_quotes(node.value) for node in nodes if node.type == 'string']
32
+
33
+ def add_event_completion(self, name_arg: Any, events_arg: Any):
34
+ if name_arg.type == 'string':
35
+ # Seems like args in events=['event'] and events=['event', 'event2'] are different AST-wise.
36
+ if events_arg.children[-1].children[1].type == 'testlist_comp':
37
+ event_nodes = events_arg.children[-1].children[1].children
38
+ else:
39
+ event_nodes = events_arg.children[-1].children
40
+ event_element_name = strip_quotes(name_arg.value)
41
+ self.events[event_element_name] = self.__get_event_names(event_nodes)
42
+
43
+ @staticmethod
44
+ def set_files_to_parse(files: List[str]) -> None:
45
+ for f in files:
46
+ FileMetadata.files_to_parse[os.path.basename(f)[:-3]] = f
47
+
48
+ def add_dep(self, dep_name: str) -> None:
49
+ dep_file = FileMetadata.files_to_parse.get(dep_name)
50
+ if dep_file:
51
+ self.deps.add(dep_file)
52
+
53
+
54
+ def read_file(file: str) -> str:
55
+ with open(file, 'r') as f:
56
+ return f.read()
57
+
58
+
59
+ def has_events_arg(node: Any) -> bool:
60
+ for arg in node.parent.children:
61
+ if arg.type == 'argument' and arg.children[0].type == 'name' and arg.children[0].value == 'events':
62
+ return True
63
+ return False
64
+
65
+
66
+ # TODO: Refactor to pure function instead of one with side effects.
67
+ def fill_metadata(node: Any, file_metadata: FileMetadata) -> None:
68
+ completion_found = False
69
+ if node.type == 'argument':
70
+ arg_name = node.get_first_leaf().value
71
+ if arg_name == 'name' and is_in_ui_obj(node) and node.children[-1].type != 'arith_expr':
72
+ completion_found = True
73
+ completion_type = None
74
+ if not has_events_arg(node):
75
+ completion_type = 'args'
76
+ if node.parent.parent.children[1].get_last_leaf().value == 'zone':
77
+ completion_type = 'zones'
78
+ if completion_type:
79
+ file_metadata.add_completion(node.get_last_leaf(), completion_type)
80
+ elif arg_name == 'events' and is_in_ui_obj(node):
81
+ completion_found = True
82
+ name_arg = next((arg for arg in node.parent.children if arg.type == 'argument' and arg.children[0].value == 'name'), None)
83
+ if name_arg:
84
+ file_metadata.add_event_completion(name_arg.children[-1], node)
85
+ elif node.type == 'atom_expr':
86
+ str_expr = node.get_code(False)
87
+ if str_expr.startswith('ui.zone'):
88
+ if node.children[-1].children[1].type == 'arglist' and node.children[-1].children[1].children[0].type == 'string':
89
+ file_metadata.add_completion(node.children[-1].children[1].children[0], 'zones')
90
+ elif node.children[-1].children[1].type == 'string':
91
+ file_metadata.add_completion(node.children[-1].children[1], 'zones')
92
+ # Must have 3 children -> q.state.name
93
+ elif len(node.children) == 3:
94
+ if str_expr.startswith('q.client'):
95
+ file_metadata.add_completion(node.children[-1].children[1], 'client')
96
+ completion_found = True
97
+ elif str_expr.startswith('q.user'):
98
+ file_metadata.add_completion(node.children[-1].children[1], 'user')
99
+ completion_found = True
100
+ elif str_expr.startswith('q.app'):
101
+ file_metadata.add_completion(node.children[-1].children[1], 'app')
102
+ completion_found = True
103
+ if not completion_found and hasattr(node, 'children'):
104
+ for child in node.children:
105
+ fill_metadata(child, file_metadata)
106
+
107
+
108
+ def get_files_to_parse(root: str, py_files: List[str]) -> List[str]:
109
+ for f in sorted(os.scandir(root), key=lambda x: (x.is_dir(), x.name)):
110
+ # Ignore all .dirs and python venvs.
111
+ if f.is_dir() and not f.name.startswith('.') and f.name != 'node_modules' and 'pyvenv.cfg' not in os.listdir(f.path):
112
+ get_files_to_parse(f.path, py_files)
113
+ elif f.is_file() and f.name.endswith('.py'):
114
+ py_files.append(f.path)
115
+ return py_files
116
+
117
+
118
+ def is_in_ui_obj(node: Any) -> bool:
119
+ try:
120
+ return parso.tree.search_ancestor(node, 'atom_expr').children[0].value == 'ui'
121
+ except Exception:
122
+ return False
123
+
124
+
125
+ def fill_deps(tree: Any, file_metadata: FileMetadata) -> None:
126
+ for imp in list(tree.iter_imports()):
127
+ if imp.type == 'import_from':
128
+ file_metadata.add_dep(imp.children[1].get_last_leaf().value)
129
+ elif imp.type == 'import_name':
130
+ for path in list(itertools.chain.from_iterable(imp.get_paths())):
131
+ file_metadata.add_dep(path.value)
132
+
133
+
134
+ def fill_completion(file_content: str, should_fill_deps=True, metadata: Optional[FileMetadata]=None) -> FileMetadata:
135
+ tree = parso.parse(file_content)
136
+ file_metadata = metadata or FileMetadata()
137
+ fill_metadata(tree, file_metadata)
138
+ if should_fill_deps:
139
+ fill_deps(tree, file_metadata)
140
+ return file_metadata
141
+
142
+
143
+ def get_initial_completions(root: str) -> Dict[str, FileMetadata]:
144
+ store: Dict[str, FileMetadata] = {}
145
+ files_to_parse = get_files_to_parse(root, [])
146
+ FileMetadata.set_files_to_parse(files_to_parse)
147
+ for file in files_to_parse:
148
+ completion = fill_completion(read_file(file), metadata=store.get(file))
149
+ store[file] = completion
150
+ for dep in completion.deps:
151
+ if dep in store:
152
+ store[dep].deps.add(file)
153
+ else:
154
+ new_metadata = FileMetadata()
155
+ new_metadata.deps.add(file)
156
+ store[dep] = new_metadata
157
+ return store
158
+
159
+
160
+ def get_completion_type(row: int, col: int, file_content: str) -> Optional[str]:
161
+ try:
162
+ leaf = parso.parse(file_content).get_leaf_for_position((row + 1, col - 1))
163
+ # Expr statements (q.client, q.events).
164
+ expr_leaf = leaf.parent.get_previous_sibling()
165
+ if expr_leaf and expr_leaf.type == 'name' and expr_leaf.value == 'q':
166
+ return leaf.parent.children[1].value, None
167
+
168
+ grand_parent = leaf.parent.parent
169
+ # Bracket notation for expr statements (q.client[''], q.events['']).
170
+ expr_leaf = grand_parent.children[0]
171
+ if len(grand_parent.children) <= 3 and expr_leaf.type == 'name' and expr_leaf.value == 'q':
172
+ return leaf.parent.get_previous_sibling().children[1].value, None
173
+
174
+ # Particular event bracket notation (q.events.['widget_name']['']).
175
+ if len(grand_parent.children) == 4 and grand_parent.get_code(False).startswith('q.events['):
176
+ event_name = grand_parent.children[2].children[1]
177
+ return 'events', strip_quotes(event_name.value) if event_name.type == 'string' else None
178
+
179
+ # Particular event (q.events.widget_name.*).
180
+ children = [child for child in grand_parent.children if child.type in ['name', 'trailer', 'operator']]
181
+ if len(children) == 4:
182
+ child1 = children[0]
183
+ child2 = children[1]
184
+ if child1.type == 'name' and child1.value == 'q' and child2.children[1].value == 'events':
185
+ return 'events', leaf.value if leaf.type == 'name' else None
186
+
187
+ # Zones.
188
+ expr_leaf = parso.tree.search_ancestor(leaf, 'atom_expr')
189
+ code = expr_leaf.get_code(False)
190
+ if code.startswith('ui.boxes') and leaf.type in ['string', 'operator']:
191
+ return 'zones', None
192
+ is_zone_arg = (leaf.parent.type != 'argument' and leaf.get_previous_sibling().value == '(') or leaf.parent.children[0].value == 'zone'
193
+ if code.startswith('ui.box') and leaf.type in ['string', 'operator'] and is_zone_arg:
194
+ return 'zones', None
195
+
196
+ if leaf.parent and leaf.parent.get_last_leaf().type == 'string' and is_in_ui_obj(leaf):
197
+ arg_name = leaf.parent.get_first_leaf().value
198
+ if arg_name in ['box', 'zone']:
199
+ return 'zones', None
200
+ elif arg_name == 'icon':
201
+ return 'icons', None
202
+ elif arg_name == 'theme':
203
+ return 'themes', None
204
+ except:
205
+ pass
206
+ return None, None
examples/tour_autocomplete_utils.py ADDED
@@ -0,0 +1,1754 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ themes = [
2
+ 'benext',
3
+ 'default',
4
+ 'ember',
5
+ 'fuchasia',
6
+ 'h2o-dark',
7
+ 'kiwi',
8
+ 'lighting',
9
+ 'monokai',
10
+ 'nature',
11
+ 'neon',
12
+ 'nord',
13
+ 'oceanic',
14
+ 'one-dark-pro',
15
+ 'solarized',
16
+ 'winter-is-coming',
17
+ ]
18
+ fluent_icons = [
19
+ "Accept",
20
+ "AcceptMedium",
21
+ "AccessLogo",
22
+ "AccessibiltyChecker",
23
+ "AccountActivity",
24
+ "AccountBrowser",
25
+ "AccountManagement",
26
+ "Accounts",
27
+ "ActionCenter",
28
+ "ActivateOrders",
29
+ "ActivityFeed",
30
+ "Add",
31
+ "AddBookmark",
32
+ "AddEvent",
33
+ "AddFavorite",
34
+ "AddFavoriteFill",
35
+ "AddFriend",
36
+ "AddGroup",
37
+ "AddHome",
38
+ "AddIn",
39
+ "AddLink",
40
+ "AddNotes",
41
+ "AddOnlineMeeting",
42
+ "AddPhone",
43
+ "AddReaction",
44
+ "AddSpaceAfter",
45
+ "AddSpaceBefore",
46
+ "AddTo",
47
+ "AddToShoppingList",
48
+ "AddWork",
49
+ "AirTickets",
50
+ "Airplane",
51
+ "AirplaneSolid",
52
+ "AlarmClock",
53
+ "Album",
54
+ "AlbumRemove",
55
+ "AlertSettings",
56
+ "AlertSolid",
57
+ "AlignCenter",
58
+ "AlignHorizontalCenter",
59
+ "AlignHorizontalLeft",
60
+ "AlignHorizontalRight",
61
+ "AlignJustify",
62
+ "AlignLeft",
63
+ "AlignRight",
64
+ "AlignVerticalBottom",
65
+ "AlignVerticalCenter",
66
+ "AlignVerticalTop",
67
+ "AllApps",
68
+ "AllAppsMirrored",
69
+ "AllCurrency",
70
+ "AltText",
71
+ "AmazonWebServicesLogo",
72
+ "AnalyticsQuery",
73
+ "AnalyticsReport",
74
+ "AnalyticsView",
75
+ "AnchorLock",
76
+ "AndroidLogo",
77
+ "Annotation",
78
+ "ApacheIvyLogo32",
79
+ "ApacheMavenLogo",
80
+ "Archive",
81
+ "ArchiveUndo",
82
+ "AreaChart",
83
+ "ArrangeBringForward",
84
+ "ArrangeBringToFront",
85
+ "ArrangeByFrom",
86
+ "ArrangeSendBackward",
87
+ "ArrangeSendToBack",
88
+ "Arrivals",
89
+ "ArrowDownRight8",
90
+ "ArrowDownRightMirrored8",
91
+ "ArrowTallDownLeft",
92
+ "ArrowTallDownRight",
93
+ "ArrowTallUpLeft",
94
+ "ArrowTallUpRight",
95
+ "ArrowUpRight",
96
+ "ArrowUpRight8",
97
+ "ArrowUpRightMirrored8",
98
+ "Articles",
99
+ "Ascending",
100
+ "AspectRatio",
101
+ "AssessmentGroup",
102
+ "AssessmentGroupTemplate",
103
+ "AssetLibrary",
104
+ "Assign",
105
+ "AssignPolicy",
106
+ "Asterisk",
107
+ "AsteriskSolid",
108
+ "Attach",
109
+ "AustralianRules",
110
+ "AutoDeploySettings",
111
+ "AutoEnhanceOff",
112
+ "AutoEnhanceOn",
113
+ "AutoFillTemplate",
114
+ "AutoFitContents",
115
+ "AutoFitWindow",
116
+ "AutoHeight",
117
+ "AutoRacing",
118
+ "AutomateFlow",
119
+ "AwayStatus",
120
+ "BIDashboard",
121
+ "Back",
122
+ "BackToWindow",
123
+ "BackgroundColor",
124
+ "Backlog",
125
+ "BacklogBoard",
126
+ "BacklogList",
127
+ "Badge",
128
+ "Balloons",
129
+ "Bank",
130
+ "BankSolid",
131
+ "BarChart4",
132
+ "BarChartHorizontal",
133
+ "BarChartVertical",
134
+ "BarChartVerticalEdit",
135
+ "BarChartVerticalFill",
136
+ "BarChartVerticalFilter",
137
+ "BarChartVerticalFilterSolid",
138
+ "Baseball",
139
+ "BeerMug",
140
+ "BidiLtr",
141
+ "BidiRtl",
142
+ "BirthdayCake",
143
+ "BitbucketLogo32",
144
+ "BlobStorage",
145
+ "BlockContact",
146
+ "Blocked",
147
+ "Blocked12",
148
+ "Blocked2",
149
+ "Blocked2Solid",
150
+ "BlockedSite",
151
+ "BlockedSiteSolid12",
152
+ "BlockedSolid",
153
+ "Blog",
154
+ "BlowingSnow",
155
+ "Blur",
156
+ "Boards",
157
+ "Bold",
158
+ "BookAnswers",
159
+ "BookmarkReport",
160
+ "Bookmarks",
161
+ "BookmarksMirrored",
162
+ "BorderDash",
163
+ "BorderDot",
164
+ "BoxAdditionSolid",
165
+ "BoxCheckmarkSolid",
166
+ "BoxLogo",
167
+ "BoxMultiplySolid",
168
+ "BoxPlaySolid",
169
+ "BoxSubtractSolid",
170
+ "BranchCommit",
171
+ "BranchCompare",
172
+ "BranchFork",
173
+ "BranchFork2",
174
+ "BranchLocked",
175
+ "BranchMerge",
176
+ "BranchPullRequest",
177
+ "BranchSearch",
178
+ "BranchShelveset",
179
+ "Breadcrumb",
180
+ "Breakfast",
181
+ "Brightness",
182
+ "Broom",
183
+ "BrowserScreenShot",
184
+ "BrowserTab",
185
+ "BrowserTabScreenshot",
186
+ "Brunch",
187
+ "Brush",
188
+ "BucketColor",
189
+ "BucketColorFill",
190
+ "BufferTimeAfter",
191
+ "BufferTimeBefore",
192
+ "BufferTimeBoth",
193
+ "Bug",
194
+ "BugBlock",
195
+ "BugSolid",
196
+ "BugSync",
197
+ "Build",
198
+ "BuildDefinition",
199
+ "BuildIssue",
200
+ "BuildQueue",
201
+ "BuildQueueNew",
202
+ "BulkUpload",
203
+ "BulletedList",
204
+ "BulletedList2",
205
+ "BulletedList2Mirrored",
206
+ "BulletedListBullet",
207
+ "BulletedListBulletMirrored",
208
+ "BulletedListMirrored",
209
+ "BulletedListText",
210
+ "BulletedListTextMirrored",
211
+ "BulletedTreeList",
212
+ "Bullseye",
213
+ "BullseyeTarget",
214
+ "BullseyeTargetEdit",
215
+ "Bus",
216
+ "BusSolid",
217
+ "BusinessHoursSign",
218
+ "ButtonControl",
219
+ "CPlusPlus",
220
+ "CPlusPlusLanguage",
221
+ "CRMProcesses",
222
+ "CRMReport",
223
+ "CRMServices",
224
+ "CSS",
225
+ "Cafe",
226
+ "Cake",
227
+ "Calculator",
228
+ "CalculatorAddition",
229
+ "CalculatorDelta",
230
+ "CalculatorEqualTo",
231
+ "CalculatorGroup",
232
+ "CalculatorMultiply",
233
+ "CalculatorNotEqualTo",
234
+ "CalculatorPercentage",
235
+ "CalculatorSubtract",
236
+ "Calendar",
237
+ "CalendarAgenda",
238
+ "CalendarDay",
239
+ "CalendarMirrored",
240
+ "CalendarReply",
241
+ "CalendarSettings",
242
+ "CalendarSettingsMirrored",
243
+ "CalendarWeek",
244
+ "CalendarWorkWeek",
245
+ "CalendarYear",
246
+ "Calories",
247
+ "CaloriesAdd",
248
+ "Camera",
249
+ "CampaignTemplate",
250
+ "Cancel",
251
+ "CannedChat",
252
+ "Car",
253
+ "CaretBottomLeftCenter8",
254
+ "CaretBottomLeftSolid8",
255
+ "CaretBottomRightCenter8",
256
+ "CaretBottomRightSolid8",
257
+ "CaretDown8",
258
+ "CaretDownSolid8",
259
+ "CaretHollow",
260
+ "CaretHollowMirrored",
261
+ "CaretLeft8",
262
+ "CaretLeftSolid8",
263
+ "CaretRight",
264
+ "CaretRight8",
265
+ "CaretRightSolid8",
266
+ "CaretSolid",
267
+ "CaretSolid16",
268
+ "CaretSolidDown",
269
+ "CaretSolidLeft",
270
+ "CaretSolidMirrored",
271
+ "CaretSolidRight",
272
+ "CaretSolidUp",
273
+ "CaretTopLeftCenter8",
274
+ "CaretTopLeftSolid8",
275
+ "CaretTopRightCenter8",
276
+ "CaretTopRightSolid8",
277
+ "CaretUp8",
278
+ "CaretUpSolid8",
279
+ "Cat",
280
+ "CellPhone",
281
+ "Certificate",
282
+ "CertifiedDatabase",
283
+ "ChangeEntitlements",
284
+ "Chart",
285
+ "ChartSeries",
286
+ "ChartTemplate",
287
+ "ChartXAngle",
288
+ "ChartYAngle",
289
+ "Chat",
290
+ "ChatBot",
291
+ "ChatInviteFriend",
292
+ "ChatSolid",
293
+ "CheckList",
294
+ "CheckListCheck",
295
+ "CheckListCheckMirrored",
296
+ "CheckListText",
297
+ "CheckListTextMirrored",
298
+ "CheckMark",
299
+ "Checkbox",
300
+ "CheckboxComposite",
301
+ "CheckboxCompositeReversed",
302
+ "CheckboxFill",
303
+ "CheckboxIndeterminate",
304
+ "CheckedOutByOther12",
305
+ "CheckedOutByYou12",
306
+ "ChevronDown",
307
+ "ChevronDownEnd6",
308
+ "ChevronDownMed",
309
+ "ChevronDownSmall",
310
+ "ChevronFold10",
311
+ "ChevronLeft",
312
+ "ChevronLeftEnd6",
313
+ "ChevronLeftMed",
314
+ "ChevronLeftSmall",
315
+ "ChevronRight",
316
+ "ChevronRightEnd6",
317
+ "ChevronRightMed",
318
+ "ChevronRightSmall",
319
+ "ChevronUnfold10",
320
+ "ChevronUp",
321
+ "ChevronUpEnd6",
322
+ "ChevronUpMed",
323
+ "ChevronUpSmall",
324
+ "Childof",
325
+ "Chopsticks",
326
+ "ChromeBack",
327
+ "ChromeBackMirrored",
328
+ "ChromeClose",
329
+ "ChromeFullScreen",
330
+ "ChromeMinimize",
331
+ "ChromeRestore",
332
+ "ChronosLogo",
333
+ "CircleAddition",
334
+ "CircleAdditionSolid",
335
+ "CircleFill",
336
+ "CircleHalfFull",
337
+ "CirclePause",
338
+ "CirclePauseSolid",
339
+ "CirclePlus",
340
+ "CircleRing",
341
+ "CircleShape",
342
+ "CircleShapeSolid",
343
+ "CircleStop",
344
+ "CircleStopSolid",
345
+ "CityNext",
346
+ "CityNext2",
347
+ "Clear",
348
+ "ClearFilter",
349
+ "ClearFormatting",
350
+ "ClearFormattingA",
351
+ "ClearFormattingEraser",
352
+ "ClearNight",
353
+ "ClearSelection",
354
+ "ClearSelectionMirrored",
355
+ "ClipboardList",
356
+ "ClipboardListMirrored",
357
+ "ClipboardSolid",
358
+ "Clock",
359
+ "CloneToDesktop",
360
+ "ClosePane",
361
+ "ClosePaneMirrored",
362
+ "ClosedCaption",
363
+ "CloudWeather",
364
+ "Cloudy",
365
+ "Cocktails",
366
+ "Code",
367
+ "CodeEdit",
368
+ "Coffee",
369
+ "CoffeeScript",
370
+ "CollapseContent",
371
+ "CollapseContentSingle",
372
+ "CollapseMenu",
373
+ "CollegeFootball",
374
+ "CollegeHoops",
375
+ "Color",
376
+ "ColorSolid",
377
+ "Column",
378
+ "ColumnLeftTwoThirds",
379
+ "ColumnLeftTwoThirdsEdit",
380
+ "ColumnOptions",
381
+ "ColumnRightTwoThirds",
382
+ "ColumnRightTwoThirdsEdit",
383
+ "ColumnVerticalSection",
384
+ "ColumnVerticalSectionEdit",
385
+ "Combine",
386
+ "Combobox",
387
+ "CommandPrompt",
388
+ "Comment",
389
+ "CommentActive",
390
+ "CommentAdd",
391
+ "CommentNext",
392
+ "CommentPrevious",
393
+ "CommentSolid",
394
+ "CommentUrgent",
395
+ "Commitments",
396
+ "CommonDataServiceCDS",
397
+ "Communications",
398
+ "CompanyDirectory",
399
+ "CompanyDirectoryMirrored",
400
+ "Compare",
401
+ "CompareUneven",
402
+ "CompassNW",
403
+ "Completed",
404
+ "CompletedSolid",
405
+ "ComplianceAudit",
406
+ "ConfigurationSolid",
407
+ "ConnectContacts",
408
+ "ConnectVirtualMachine",
409
+ "ConstructionCone",
410
+ "ConstructionConeSolid",
411
+ "Contact",
412
+ "ContactCard",
413
+ "ContactCardSettings",
414
+ "ContactCardSettingsMirrored",
415
+ "ContactHeart",
416
+ "ContactInfo",
417
+ "ContactLink",
418
+ "ContactList",
419
+ "ContactLock",
420
+ "ContentFeed",
421
+ "ContentSettings",
422
+ "ContextMenu",
423
+ "Contrast",
424
+ "Copy",
425
+ "CopyEdit",
426
+ "Cotton",
427
+ "Coupon",
428
+ "CreateMailRule",
429
+ "Cricket",
430
+ "Crop",
431
+ "Crown",
432
+ "CrownSolid",
433
+ "CubeShape",
434
+ "CubeShapeSolid",
435
+ "Currency",
436
+ "CustomList",
437
+ "CustomListMirrored",
438
+ "CustomizeToolbar",
439
+ "Cut",
440
+ "Cycling",
441
+ "DOM",
442
+ "DRM",
443
+ "DashboardAdd",
444
+ "DataConnectionLibrary",
445
+ "DataManagementSettings",
446
+ "Database",
447
+ "DatabaseSync",
448
+ "DatabaseView",
449
+ "Dataflows",
450
+ "DataflowsLink",
451
+ "DateTime",
452
+ "DateTime12",
453
+ "DateTime2",
454
+ "DateTimeMirrored",
455
+ "DeactivateOrders",
456
+ "Decimals",
457
+ "DecisionSolid",
458
+ "DeclineCall",
459
+ "DecreaseIndent",
460
+ "DecreaseIndentArrow",
461
+ "DecreaseIndentArrowMirrored",
462
+ "DecreaseIndentLegacy",
463
+ "DecreaseIndentMirrored",
464
+ "DecreaseIndentText",
465
+ "DecreaseIndentTextMirrored",
466
+ "DefaultRatio",
467
+ "DefectSolid",
468
+ "Delete",
469
+ "DeleteColumns",
470
+ "DeleteRows",
471
+ "DeleteRowsMirrored",
472
+ "DeleteTable",
473
+ "DeliveryTruck",
474
+ "DependencyAdd",
475
+ "DependencyRemove",
476
+ "Deploy",
477
+ "Descending",
478
+ "Design",
479
+ "DesktopScreenshot",
480
+ "DeveloperTools",
481
+ "DeviceBug",
482
+ "DeviceOff",
483
+ "DeviceRun",
484
+ "Devices2",
485
+ "Devices3",
486
+ "Devices4",
487
+ "Diagnostic",
488
+ "DiagnosticDataBarTooltip",
489
+ "Dialpad",
490
+ "Diamond",
491
+ "DiamondSolid",
492
+ "Dictionary",
493
+ "DictionaryRemove",
494
+ "DietPlanNotebook",
495
+ "DiffInline",
496
+ "DiffSideBySide",
497
+ "DisableUpdates",
498
+ "DisconnectVirtualMachine",
499
+ "Dislike",
500
+ "DislikeSolid",
501
+ "DistributeDown",
502
+ "DocLibrary",
503
+ "DockLeft",
504
+ "DockLeftMirrored",
505
+ "DockRight",
506
+ "DockerLogo",
507
+ "Document",
508
+ "DocumentApproval",
509
+ "DocumentManagement",
510
+ "DocumentReply",
511
+ "DocumentSearch",
512
+ "DocumentSet",
513
+ "Documentation",
514
+ "DonutChart",
515
+ "Door",
516
+ "DoubleBookmark",
517
+ "DoubleChevronDown",
518
+ "DoubleChevronDown12",
519
+ "DoubleChevronDown8",
520
+ "DoubleChevronLeft",
521
+ "DoubleChevronLeft12",
522
+ "DoubleChevronLeft8",
523
+ "DoubleChevronLeftMed",
524
+ "DoubleChevronLeftMedMirrored",
525
+ "DoubleChevronRight",
526
+ "DoubleChevronRight12",
527
+ "DoubleChevronRight8",
528
+ "DoubleChevronUp",
529
+ "DoubleChevronUp12",
530
+ "DoubleChevronUp8",
531
+ "DoubleColumn",
532
+ "DoubleColumnEdit",
533
+ "DoubleDownArrow",
534
+ "Down",
535
+ "Download",
536
+ "DownloadDocument",
537
+ "DragObject",
538
+ "DrillDown",
539
+ "DrillDownSolid",
540
+ "DrillExpand",
541
+ "DrillShow",
542
+ "DrillThrough",
543
+ "DriverOff",
544
+ "Drop",
545
+ "DropShape",
546
+ "DropShapeSolid",
547
+ "DropboxLogo",
548
+ "Dropdown",
549
+ "DuplicateRow",
550
+ "Duststorm",
551
+ "EMI",
552
+ "EatDrink",
553
+ "Edit",
554
+ "EditContact",
555
+ "EditCreate",
556
+ "EditMail",
557
+ "EditMirrored",
558
+ "EditNote",
559
+ "EditPhoto",
560
+ "EditSolid12",
561
+ "EditSolidMirrored12",
562
+ "EditStyle",
563
+ "Education",
564
+ "EgnyteLogo",
565
+ "Ellipse",
566
+ "Embed",
567
+ "Emoji",
568
+ "Emoji2",
569
+ "EmojiDisappointed",
570
+ "EmojiNeutral",
571
+ "EmojiTabSymbols",
572
+ "EmptyRecycleBin",
573
+ "Encryption",
574
+ "EndPointSolid",
575
+ "EngineeringGroup",
576
+ "EntitlementPolicy",
577
+ "EntitlementRedemption",
578
+ "EntryDecline",
579
+ "EntryView",
580
+ "Equalizer",
581
+ "EraseTool",
582
+ "Error",
583
+ "ErrorBadge",
584
+ "Event",
585
+ "Event12",
586
+ "EventAccepted",
587
+ "EventDate",
588
+ "EventDateMissed12",
589
+ "EventDeclined",
590
+ "EventInfo",
591
+ "EventTentative",
592
+ "EventTentativeMirrored",
593
+ "EventToDoLogo",
594
+ "ExerciseTracker",
595
+ "ExpandMenu",
596
+ "ExploreContent",
597
+ "ExploreContentSingle",
598
+ "ExploreData",
599
+ "Export",
600
+ "ExportMirrored",
601
+ "ExternalBuild",
602
+ "ExternalGit",
603
+ "ExternalTFVC",
604
+ "ExternalXAML",
605
+ "EyeShadow",
606
+ "Eyedropper",
607
+ "F12DevTools",
608
+ "FacebookLogo",
609
+ "Family",
610
+ "FangBody",
611
+ "FastForward",
612
+ "FastForwardEightX",
613
+ "FastForwardFourX",
614
+ "FastForwardOneFiveX",
615
+ "FastForwardOneX",
616
+ "FastForwardPointFiveX",
617
+ "FastForwardTwoX",
618
+ "FastMode",
619
+ "Favicon",
620
+ "FavoriteList",
621
+ "FavoriteStar",
622
+ "FavoriteStarFill",
623
+ "Fax",
624
+ "Feedback",
625
+ "FeedbackRequestMirroredSolid",
626
+ "FeedbackRequestSolid",
627
+ "FeedbackResponseSolid",
628
+ "Ferry",
629
+ "FerrySolid",
630
+ "FieldChanged",
631
+ "FieldEmpty",
632
+ "FieldFilled",
633
+ "FieldNotChanged",
634
+ "FieldReadOnly",
635
+ "FieldRequired",
636
+ "FileASPX",
637
+ "FileBug",
638
+ "FileCSS",
639
+ "FileCode",
640
+ "FileComment",
641
+ "FileHTML",
642
+ "FileImage",
643
+ "FileJAVA",
644
+ "FileLess",
645
+ "FileOff",
646
+ "FilePDB",
647
+ "FileRequest",
648
+ "FileSQL",
649
+ "FileSass",
650
+ "FileSymlink",
651
+ "FileSystem",
652
+ "FileTemplate",
653
+ "FileYML",
654
+ "Filter",
655
+ "FilterAscending",
656
+ "FilterDescending",
657
+ "FilterSettings",
658
+ "FilterSolid",
659
+ "Filters",
660
+ "FiltersSolid",
661
+ "Financial",
662
+ "FinancialMirroredSolid",
663
+ "FinancialSolid",
664
+ "Fingerprint",
665
+ "FitPage",
666
+ "FitWidth",
667
+ "FiveTileGrid",
668
+ "FixedAssetManagement",
669
+ "FixedColumnWidth",
670
+ "Flag",
671
+ "FlameSolid",
672
+ "FlashAuto",
673
+ "FlashOff",
674
+ "Flashlight",
675
+ "FlickDown",
676
+ "FlickLeft",
677
+ "FlickRight",
678
+ "FlickUp",
679
+ "Flow",
680
+ "FlowChart",
681
+ "Flower",
682
+ "FocalPoint",
683
+ "Focus",
684
+ "FocusView",
685
+ "Fog",
686
+ "Folder",
687
+ "FolderFill",
688
+ "FolderHorizontal",
689
+ "FolderList",
690
+ "FolderListMirrored",
691
+ "FolderOpen",
692
+ "FolderQuery",
693
+ "FolderSearch",
694
+ "FollowUser",
695
+ "Font",
696
+ "FontColor",
697
+ "FontColorA",
698
+ "FontColorSwatch",
699
+ "FontDecrease",
700
+ "FontIncrease",
701
+ "FontSize",
702
+ "FontSize2",
703
+ "Footer",
704
+ "FormLibrary",
705
+ "FormLibraryMirrored",
706
+ "FormatPainter",
707
+ "Forum",
708
+ "Forward",
709
+ "ForwardEvent",
710
+ "Freezing",
711
+ "Frigid",
712
+ "FrontCamera",
713
+ "FullCircleMask",
714
+ "FullHistory",
715
+ "FullScreen",
716
+ "FullView",
717
+ "FullWidth",
718
+ "FullWidthEdit",
719
+ "FunctionalManagerDashboard",
720
+ "FunnelChart",
721
+ "GIF",
722
+ "GUID",
723
+ "Game",
724
+ "Gather",
725
+ "Generate",
726
+ "GenericScan",
727
+ "GenericScanFilled",
728
+ "GiftBoxSolid",
729
+ "GiftCard",
730
+ "Giftbox",
731
+ "GiftboxOpen",
732
+ "GitFork",
733
+ "GitGraph",
734
+ "GitHubLogo",
735
+ "GitLogo",
736
+ "Glasses",
737
+ "Glimmer",
738
+ "GlobalNavButton",
739
+ "GlobalNavButtonActive",
740
+ "Globe",
741
+ "Globe2",
742
+ "GlobeFavorite",
743
+ "Go",
744
+ "GoMirrored",
745
+ "GoToDashboard",
746
+ "Golf",
747
+ "GoogleDriveLogo",
748
+ "GoogleDriveLogoBottomBlue",
749
+ "GoogleDriveLogoLeftGreen",
750
+ "GoogleDriveLogoRightYellow",
751
+ "GotoToday",
752
+ "GradleLogo32",
753
+ "GreetingCard",
754
+ "GridViewLarge",
755
+ "GridViewMedium",
756
+ "GridViewSmall",
757
+ "GripperBarHorizontal",
758
+ "GripperBarVertical",
759
+ "GripperDotsVertical",
760
+ "GripperTool",
761
+ "Group",
762
+ "GroupList",
763
+ "GroupObject",
764
+ "GroupedAscending",
765
+ "GroupedDescending",
766
+ "GroupedList",
767
+ "Guitar",
768
+ "HailDay",
769
+ "HailNight",
770
+ "HalfAlpha",
771
+ "HalfCircle",
772
+ "HandsFree",
773
+ "Handwriting",
774
+ "HardDrive",
775
+ "HardDriveGroup",
776
+ "HardDriveLock",
777
+ "HardDriveUnlock",
778
+ "Header",
779
+ "Header1",
780
+ "Header2",
781
+ "Header3",
782
+ "Header4",
783
+ "Headset",
784
+ "HeadsetSolid",
785
+ "Health",
786
+ "HealthRefresh",
787
+ "HealthSolid",
788
+ "Heart",
789
+ "HeartBroken",
790
+ "HeartFill",
791
+ "Help",
792
+ "HelpMirrored",
793
+ "HexaditeInvestigation",
794
+ "HexaditeInvestigationCancel",
795
+ "HexaditeInvestigationSemiAuto",
796
+ "Hexagon",
797
+ "Hide",
798
+ "Hide2",
799
+ "Hide3",
800
+ "Highlight",
801
+ "HighlightMappedShapes",
802
+ "HintText",
803
+ "HistoricalWeather",
804
+ "History",
805
+ "Home",
806
+ "HomeDropdown",
807
+ "HomeGroup",
808
+ "HomeSolid",
809
+ "HomeVerify",
810
+ "HorizontalDistributeCenter",
811
+ "HorizontalTabKey",
812
+ "Hospital",
813
+ "Hotel",
814
+ "HourGlass",
815
+ "IDBadge",
816
+ "IOT",
817
+ "IRMForward",
818
+ "IRMForwardMirrored",
819
+ "IRMReply",
820
+ "IRMReplyMirrored",
821
+ "IconSetsFlag",
822
+ "IgnoreConversation",
823
+ "ImageCrosshair",
824
+ "ImageDiff",
825
+ "ImageInAR",
826
+ "ImagePixel",
827
+ "ImageSearch",
828
+ "Import",
829
+ "ImportAllMirrored",
830
+ "ImportMirrored",
831
+ "Important",
832
+ "Inbox",
833
+ "InboxCheck",
834
+ "IncidentTriangle",
835
+ "IncomingCall",
836
+ "IncreaseIndent",
837
+ "IncreaseIndentArrow",
838
+ "IncreaseIndentArrowMirrored",
839
+ "IncreaseIndentHanging",
840
+ "IncreaseIndentHangingMirrored",
841
+ "IncreaseIndentLegacy",
842
+ "IncreaseIndentMirrored",
843
+ "IncreaseIndentText",
844
+ "IncreaseIndentTextMirrored",
845
+ "IndentFirstLine",
846
+ "Info",
847
+ "Info2",
848
+ "InfoSolid",
849
+ "InformationBarriers",
850
+ "InkingTool",
851
+ "InputAddress",
852
+ "Insert",
853
+ "InsertColumnsLeft",
854
+ "InsertColumnsRight",
855
+ "InsertRowsAbove",
856
+ "InsertRowsBelow",
857
+ "InsertSignatureLine",
858
+ "InsertTextBox",
859
+ "Insights",
860
+ "InstallToDrive",
861
+ "Installation",
862
+ "InternalInvestigation",
863
+ "InternetSharing",
864
+ "IssueSolid",
865
+ "IssueTracking",
866
+ "IssueTrackingMirrored",
867
+ "Italic",
868
+ "JS",
869
+ "JavaLogo",
870
+ "JavaScriptLanguage",
871
+ "JenkinsLogo",
872
+ "JoinOnlineMeeting",
873
+ "KeubernetesLogo",
874
+ "KeyPhraseExtraction",
875
+ "KeyboardClassic",
876
+ "KnowledgeArticle",
877
+ "Label",
878
+ "LadybugSolid",
879
+ "Lamp",
880
+ "LandscapeOrientation",
881
+ "LaptopSecure",
882
+ "LaptopSelected",
883
+ "LargeGrid",
884
+ "LearningTools",
885
+ "Leave",
886
+ "LeaveUser",
887
+ "Library",
888
+ "Lifesaver",
889
+ "LifesaverLock",
890
+ "Light",
891
+ "LightWeight",
892
+ "Lightbulb",
893
+ "LightningBolt",
894
+ "LightningBoltSolid",
895
+ "Like",
896
+ "LikeSolid",
897
+ "Line",
898
+ "LineChart",
899
+ "LineSpacing",
900
+ "LineStyle",
901
+ "LineThickness",
902
+ "Link",
903
+ "Link12",
904
+ "LinkedDatabase",
905
+ "LinuxLogo32",
906
+ "List",
907
+ "ListMirrored",
908
+ "LiveSite",
909
+ "LocaleLanguage",
910
+ "Location",
911
+ "LocationCircle",
912
+ "LocationDot",
913
+ "LocationFill",
914
+ "LocationOutline",
915
+ "Lock",
916
+ "Lock12",
917
+ "LockShare",
918
+ "LockSolid",
919
+ "LogRemove",
920
+ "LookupEntities",
921
+ "LowerBrightness",
922
+ "MachineLearning",
923
+ "Mail",
924
+ "MailAlert",
925
+ "MailAttached",
926
+ "MailCheck",
927
+ "MailFill",
928
+ "MailForward",
929
+ "MailForwardMirrored",
930
+ "MailLowImportance",
931
+ "MailOptions",
932
+ "MailPause",
933
+ "MailReminder",
934
+ "MailRepeat",
935
+ "MailReply",
936
+ "MailReplyAll",
937
+ "MailReplyAllMirrored",
938
+ "MailReplyMirrored",
939
+ "MailSchedule",
940
+ "MailSolid",
941
+ "MailTentative",
942
+ "MailTentativeMirrored",
943
+ "MailUndelivered",
944
+ "ManagerSelfService",
945
+ "Manufacturing",
946
+ "MapDirections",
947
+ "MapLayers",
948
+ "MapPin",
949
+ "MapPin12",
950
+ "MapPinSolid",
951
+ "MarkAsProtected",
952
+ "MarkDownLanguage",
953
+ "Market",
954
+ "MarketDown",
955
+ "MasterDatabase",
956
+ "MaximumValue",
957
+ "Medal",
958
+ "MedalSolid",
959
+ "Media",
960
+ "MediaAdd",
961
+ "Medical",
962
+ "Megaphone",
963
+ "MegaphoneSolid",
964
+ "Memo",
965
+ "Merge",
966
+ "MergeDuplicate",
967
+ "Message",
968
+ "MessageFill",
969
+ "MessageFriendRequest",
970
+ "MicOff",
971
+ "MicOff2",
972
+ "Microphone",
973
+ "MiniContract",
974
+ "MiniContractMirrored",
975
+ "MiniExpand",
976
+ "MiniExpandMirrored",
977
+ "MiniLink",
978
+ "MinimumValue",
979
+ "MiracastLogoLarge",
980
+ "MobileAngled",
981
+ "MobileReport",
982
+ "MobileSelected",
983
+ "ModelingView",
984
+ "Money",
985
+ "More",
986
+ "MoreSports",
987
+ "MoreVertical",
988
+ "MountainClimbing",
989
+ "Move",
990
+ "MoveToFolder",
991
+ "Movers",
992
+ "MultiSelect",
993
+ "MultiSelectMirrored",
994
+ "MusicInCollection",
995
+ "MusicInCollectionFill",
996
+ "MusicNote",
997
+ "MuteChat",
998
+ "MyMoviesTV",
999
+ "MyNetwork",
1000
+ "NPMLogo",
1001
+ "Nav2DMapView",
1002
+ "NavigateBack",
1003
+ "NavigateBackMirrored",
1004
+ "NavigateExternalInline",
1005
+ "NavigateForward",
1006
+ "NavigateForwardMirrored",
1007
+ "NavigationFlipper",
1008
+ "NetworkTower",
1009
+ "NewAnalyticsQuery",
1010
+ "NewFolder",
1011
+ "NewMail",
1012
+ "NewTeamProject",
1013
+ "News",
1014
+ "NewsSearch",
1015
+ "Next",
1016
+ "NonprofitLogo32",
1017
+ "NormalWeight",
1018
+ "NotExecuted",
1019
+ "NotImpactedSolid",
1020
+ "NoteForward",
1021
+ "NotePinned",
1022
+ "NoteReply",
1023
+ "Number",
1024
+ "NumberField",
1025
+ "NumberSequence",
1026
+ "NumberSymbol",
1027
+ "NumberedList",
1028
+ "NumberedListMirrored",
1029
+ "NumberedListNumber",
1030
+ "NumberedListNumberMirrored",
1031
+ "NumberedListText",
1032
+ "NumberedListTextMirrored",
1033
+ "OEM",
1034
+ "Octagon",
1035
+ "OfficeChat",
1036
+ "OfficeChatSolid",
1037
+ "OfflineStorage",
1038
+ "OfflineStorageSolid",
1039
+ "Onboarding",
1040
+ "OpenEnrollment",
1041
+ "OpenFile",
1042
+ "OpenFolderHorizontal",
1043
+ "OpenInNewTab",
1044
+ "OpenInNewWindow",
1045
+ "OpenPane",
1046
+ "OpenPaneMirrored",
1047
+ "OpenSource",
1048
+ "OpenWith",
1049
+ "OpenWithMirrored",
1050
+ "Org",
1051
+ "Orientation",
1052
+ "Orientation2",
1053
+ "OutOfOffice",
1054
+ "PC1",
1055
+ "PDF",
1056
+ "POI",
1057
+ "POISolid",
1058
+ "PY",
1059
+ "Package",
1060
+ "Packages",
1061
+ "Padding",
1062
+ "PaddingBottom",
1063
+ "PaddingLeft",
1064
+ "PaddingRight",
1065
+ "PaddingTop",
1066
+ "Page",
1067
+ "PageAdd",
1068
+ "PageArrowRight",
1069
+ "PageCheckedOut",
1070
+ "PageCheckedin",
1071
+ "PageData",
1072
+ "PageEdit",
1073
+ "PageHeader",
1074
+ "PageHeaderEdit",
1075
+ "PageLeft",
1076
+ "PageLink",
1077
+ "PageList",
1078
+ "PageListFilter",
1079
+ "PageListMirroredSolid",
1080
+ "PageListSolid",
1081
+ "PageLock",
1082
+ "PageRemove",
1083
+ "PageRight",
1084
+ "PageShared",
1085
+ "PageSolid",
1086
+ "PanoIndicator",
1087
+ "Parachute",
1088
+ "ParachuteSolid",
1089
+ "Parameter",
1090
+ "ParatureLogo",
1091
+ "ParkingLocation",
1092
+ "ParkingLocationMirrored",
1093
+ "ParkingMirroredSolid",
1094
+ "ParkingSolid",
1095
+ "PartlyCloudyDay",
1096
+ "PartlyCloudyNight",
1097
+ "PartyLeader",
1098
+ "PassiveAuthentication",
1099
+ "PasswordField",
1100
+ "Paste",
1101
+ "PasteAsCode",
1102
+ "PasteAsText",
1103
+ "Pause",
1104
+ "PaymentCard",
1105
+ "PenWorkspace",
1106
+ "PencilReply",
1107
+ "Pentagon",
1108
+ "People",
1109
+ "PeopleAdd",
1110
+ "PeopleAlert",
1111
+ "PeopleBlock",
1112
+ "PeoplePause",
1113
+ "PeopleRepeat",
1114
+ "Permissions",
1115
+ "PermissionsSolid",
1116
+ "Personalize",
1117
+ "Phishing",
1118
+ "Phone",
1119
+ "Photo",
1120
+ "Photo2",
1121
+ "Photo2Add",
1122
+ "Photo2Fill",
1123
+ "Photo2Remove",
1124
+ "PhotoCollection",
1125
+ "PhotoError",
1126
+ "PhotoVideoMedia",
1127
+ "Picture",
1128
+ "PictureCenter",
1129
+ "PictureFill",
1130
+ "PictureLibrary",
1131
+ "PicturePosition",
1132
+ "PictureStretch",
1133
+ "PictureTile",
1134
+ "PieDouble",
1135
+ "PieSingle",
1136
+ "PieSingleSolid",
1137
+ "Pill",
1138
+ "Pin",
1139
+ "PinSolid12",
1140
+ "PinSolidOff12",
1141
+ "Pinned",
1142
+ "PinnedFill",
1143
+ "PinnedSolid",
1144
+ "PivotChart",
1145
+ "PlainText",
1146
+ "PlanView",
1147
+ "Play",
1148
+ "PlayResume",
1149
+ "PlayReverse",
1150
+ "PlayReverseResume",
1151
+ "PlaySolid",
1152
+ "PlaybackRate1x",
1153
+ "PlayerSettings",
1154
+ "Plug",
1155
+ "PlugConnected",
1156
+ "PlugDisconnected",
1157
+ "PlugSolid",
1158
+ "PollResults",
1159
+ "PostUpdate",
1160
+ "PowerButton",
1161
+ "Precipitation",
1162
+ "PresenceChickletVideo",
1163
+ "Presentation",
1164
+ "Presentation12",
1165
+ "Preview",
1166
+ "PreviewLink",
1167
+ "Previous",
1168
+ "PrimaryCalendar",
1169
+ "Print",
1170
+ "PrintfaxPrinterFile",
1171
+ "ProFootball",
1172
+ "ProHockey",
1173
+ "ProcessMetaTask",
1174
+ "Processing",
1175
+ "ProcessingCancel",
1176
+ "ProcessingPause",
1177
+ "ProcessingRun",
1178
+ "Product",
1179
+ "ProductCatalog",
1180
+ "ProductList",
1181
+ "ProductRelease",
1182
+ "ProductVariant",
1183
+ "ProductionFloorManagement",
1184
+ "ProfileSearch",
1185
+ "ProgressLoopInner",
1186
+ "ProgressLoopOuter",
1187
+ "ProgressRingDots",
1188
+ "PromotedDatabase",
1189
+ "ProtectRestrict",
1190
+ "ProtectedDocument",
1191
+ "ProvisioningPackage",
1192
+ "PublicCalendar",
1193
+ "PublicContactCard",
1194
+ "PublicContactCardMirrored",
1195
+ "PublicEmail",
1196
+ "PublicFolder",
1197
+ "PublishContent",
1198
+ "PublishCourse",
1199
+ "Puzzle",
1200
+ "PythonLanguage",
1201
+ "PythonLogoBlue",
1202
+ "PythonLogoYellow",
1203
+ "QRCode",
1204
+ "QandA",
1205
+ "QandAMirror",
1206
+ "QuadColumn",
1207
+ "Quantity",
1208
+ "QuarterCircle",
1209
+ "QueryList",
1210
+ "Questionnaire",
1211
+ "QuestionnaireMirrored",
1212
+ "QuickNote",
1213
+ "QuickNoteSolid",
1214
+ "R",
1215
+ "RadioBtnOff",
1216
+ "RadioBtnOn",
1217
+ "RadioBullet",
1218
+ "Rain",
1219
+ "RainShowersDay",
1220
+ "RainShowersNight",
1221
+ "RainSnow",
1222
+ "RawSource",
1223
+ "ReactLogo",
1224
+ "Read",
1225
+ "ReadOutLoud",
1226
+ "ReadingMode",
1227
+ "ReadingModeSolid",
1228
+ "RealEstate",
1229
+ "ReceiptCheck",
1230
+ "ReceiptForward",
1231
+ "ReceiptReply",
1232
+ "ReceiptTentative",
1233
+ "ReceiptTentativeMirrored",
1234
+ "ReceiptUndelivered",
1235
+ "Recent",
1236
+ "Record2",
1237
+ "RecruitmentManagement",
1238
+ "RectangleShape",
1239
+ "RectangleShapeSolid",
1240
+ "RectangularClipping",
1241
+ "RecurringEvent",
1242
+ "RecurringTask",
1243
+ "RedEye",
1244
+ "RedEye12",
1245
+ "Redeploy",
1246
+ "Redo",
1247
+ "Refresh",
1248
+ "RegistryEditor",
1249
+ "Relationship",
1250
+ "ReleaseDefinition",
1251
+ "ReleaseGate",
1252
+ "ReleaseGateCheck",
1253
+ "ReleaseGateError",
1254
+ "ReminderGroup",
1255
+ "ReminderPerson",
1256
+ "ReminderTime",
1257
+ "Remote",
1258
+ "Remove",
1259
+ "RemoveContent",
1260
+ "RemoveEvent",
1261
+ "RemoveFilter",
1262
+ "RemoveFromShoppingList",
1263
+ "RemoveFromTrash",
1264
+ "RemoveLink",
1265
+ "RemoveLinkChain",
1266
+ "RemoveLinkX",
1267
+ "RemoveOccurrence",
1268
+ "Rename",
1269
+ "RenewalCurrent",
1270
+ "RenewalFuture",
1271
+ "ReopenPages",
1272
+ "Repair",
1273
+ "RepeatAll",
1274
+ "RepeatHeaderRows",
1275
+ "RepeatOne",
1276
+ "Reply",
1277
+ "ReplyAll",
1278
+ "ReplyAllAlt",
1279
+ "ReplyAllMirrored",
1280
+ "ReplyAlt",
1281
+ "ReplyMirrored",
1282
+ "Repo",
1283
+ "RepoSolid",
1284
+ "ReportAdd",
1285
+ "ReportDocument",
1286
+ "ReportHacked",
1287
+ "ReportLibrary",
1288
+ "ReportLibraryMirrored",
1289
+ "ReportLock",
1290
+ "ReportWarning",
1291
+ "Rerun",
1292
+ "ReservationOrders",
1293
+ "Reset",
1294
+ "ResetDevice",
1295
+ "ResponsesMenu",
1296
+ "ReturnKey",
1297
+ "ReturnToSession",
1298
+ "RevToggleKey",
1299
+ "ReviewRequestMirroredSolid",
1300
+ "ReviewRequestSolid",
1301
+ "ReviewResponseSolid",
1302
+ "ReviewSolid",
1303
+ "Rewind",
1304
+ "RewindEightX",
1305
+ "RewindFourX",
1306
+ "RewindOneFiveX",
1307
+ "RewindOneX",
1308
+ "RewindPointFiveX",
1309
+ "RewindTwoX",
1310
+ "Ribbon",
1311
+ "RibbonSolid",
1312
+ "RightDoubleQuote",
1313
+ "RightTriangle",
1314
+ "Ringer",
1315
+ "RingerOff",
1316
+ "RingerRemove",
1317
+ "RingerSolid",
1318
+ "Robot",
1319
+ "Rocket",
1320
+ "Room",
1321
+ "Rotate",
1322
+ "Rotate90Clockwise",
1323
+ "Rotate90CounterClockwise",
1324
+ "RowsChild",
1325
+ "RowsGroup",
1326
+ "RubyGemsLogo",
1327
+ "Rugby",
1328
+ "Running",
1329
+ "RustLanguageLogo",
1330
+ "SDCard",
1331
+ "SIPMove",
1332
+ "SQLAnalyticsPool",
1333
+ "SVNLogo",
1334
+ "Sad",
1335
+ "SadSolid",
1336
+ "Save",
1337
+ "SaveAll",
1338
+ "SaveAndClose",
1339
+ "SaveAs",
1340
+ "SaveTemplate",
1341
+ "SaveToMobile",
1342
+ "Savings",
1343
+ "ScaleUp",
1344
+ "ScaleVolume",
1345
+ "ScatterChart",
1346
+ "ScheduleEventAction",
1347
+ "ScopeTemplate",
1348
+ "ScreenCast",
1349
+ "ScreenTime",
1350
+ "Script",
1351
+ "ScrollUpDown",
1352
+ "Search",
1353
+ "SearchAndApps",
1354
+ "SearchBookmark",
1355
+ "SearchCalendar",
1356
+ "SearchData",
1357
+ "SearchIssue",
1358
+ "SearchIssueMirrored",
1359
+ "SearchNearby",
1360
+ "SecondaryNav",
1361
+ "Section",
1362
+ "Sections",
1363
+ "SecurityGroup",
1364
+ "SeeDo",
1365
+ "SelectAll",
1366
+ "Sell",
1367
+ "SemiboldWeight",
1368
+ "Send",
1369
+ "SendMirrored",
1370
+ "SentimentAnalysis",
1371
+ "Separator",
1372
+ "Server",
1373
+ "ServerEnviroment",
1374
+ "ServerProcesses",
1375
+ "ServiceOff",
1376
+ "SetAction",
1377
+ "Settings",
1378
+ "ShakeDevice",
1379
+ "ShapeSolid",
1380
+ "Shapes",
1381
+ "Share",
1382
+ "SharedDatabase",
1383
+ "ShareiOS",
1384
+ "Shirt",
1385
+ "Shop",
1386
+ "ShopServer",
1387
+ "ShoppingCart",
1388
+ "ShoppingCartSolid",
1389
+ "ShowGrid",
1390
+ "ShowResults",
1391
+ "ShowResultsMirrored",
1392
+ "ShowTimeAs",
1393
+ "SidePanel",
1394
+ "SidePanelMirrored",
1395
+ "SignOut",
1396
+ "Signin",
1397
+ "SingleBookmark",
1398
+ "SingleBookmarkSolid",
1399
+ "SingleColumn",
1400
+ "SingleColumnEdit",
1401
+ "SiteScan",
1402
+ "SixPointStar",
1403
+ "SizeLegacy",
1404
+ "SkiResorts",
1405
+ "SkipBack10",
1406
+ "SkipForward30",
1407
+ "SkypeArrow",
1408
+ "SkypeCheck",
1409
+ "SkypeClock",
1410
+ "SkypeMinus",
1411
+ "Slider",
1412
+ "SliderHandleSize",
1413
+ "SliderThumb",
1414
+ "Slideshow",
1415
+ "SmartGlassRemote",
1416
+ "SnapToGrid",
1417
+ "Snooze",
1418
+ "Snow",
1419
+ "SnowShowerDay",
1420
+ "SnowShowerNight",
1421
+ "Snowflake",
1422
+ "Soccer",
1423
+ "Sort",
1424
+ "SortDown",
1425
+ "SortLines",
1426
+ "SortLinesAscending",
1427
+ "SortUp",
1428
+ "Source",
1429
+ "Spacer",
1430
+ "Speakers",
1431
+ "SpecialEvent",
1432
+ "SpeedHigh",
1433
+ "Spelling",
1434
+ "Split",
1435
+ "SplitObject",
1436
+ "Sprint",
1437
+ "Squalls",
1438
+ "SquareShape",
1439
+ "SquareShapeSolid",
1440
+ "Stack",
1441
+ "StackColumnChart",
1442
+ "StackIndicator",
1443
+ "StackedBarChart",
1444
+ "StackedColumnChart2",
1445
+ "StackedColumnChart2Fill",
1446
+ "StackedLineChart",
1447
+ "Starburst",
1448
+ "StarburstSolid",
1449
+ "StatusCircleBlock",
1450
+ "StatusCircleBlock2",
1451
+ "StatusCircleCheckmark",
1452
+ "StatusCircleErrorX",
1453
+ "StatusCircleExclamation",
1454
+ "StatusCircleInfo",
1455
+ "StatusCircleInner",
1456
+ "StatusCircleOuter",
1457
+ "StatusCircleQuestionMark",
1458
+ "StatusCircleRing",
1459
+ "StatusCircleSync",
1460
+ "StatusErrorFull",
1461
+ "StatusTriangle",
1462
+ "StatusTriangleExclamation",
1463
+ "StatusTriangleInner",
1464
+ "StatusTriangleOuter",
1465
+ "Step",
1466
+ "StepInsert",
1467
+ "StepShared",
1468
+ "StepSharedAdd",
1469
+ "StepSharedInsert",
1470
+ "StockDown",
1471
+ "StockUp",
1472
+ "Stop",
1473
+ "StopSolid",
1474
+ "Stopwatch",
1475
+ "StorageAcount",
1476
+ "StorageOptical",
1477
+ "Storyboard",
1478
+ "Streaming",
1479
+ "StreamingOff",
1480
+ "Street",
1481
+ "StreetsideSplitMinimize",
1482
+ "Strikethrough",
1483
+ "Subscribe",
1484
+ "Subscript",
1485
+ "SubstitutionsIn",
1486
+ "Suitcase",
1487
+ "SunAdd",
1488
+ "SunQuestionMark",
1489
+ "Sunny",
1490
+ "Superscript",
1491
+ "SurveyQuestions",
1492
+ "SwiftLogo",
1493
+ "Switch",
1494
+ "SwitchUser",
1495
+ "SwitcherStartEnd",
1496
+ "Sync",
1497
+ "SyncFolder",
1498
+ "SyncOccurence",
1499
+ "SyncStatus",
1500
+ "SyncStatusSolid",
1501
+ "SyncToPC",
1502
+ "System",
1503
+ "TVMonitor",
1504
+ "TVMonitorSelected",
1505
+ "Tab",
1506
+ "TabCenter",
1507
+ "TabOneColumn",
1508
+ "TabThreeColumn",
1509
+ "TabTwoColumn",
1510
+ "Table",
1511
+ "TableBrandedColumn",
1512
+ "TableBrandedRow",
1513
+ "TableComputed",
1514
+ "TableFirstColumn",
1515
+ "TableGroup",
1516
+ "TableHeaderRow",
1517
+ "TableLastColumn",
1518
+ "TableLink",
1519
+ "TableTotalRow",
1520
+ "Tablet",
1521
+ "TabletMode",
1522
+ "TabletSelected",
1523
+ "Tag",
1524
+ "TagGroup",
1525
+ "TagSolid",
1526
+ "TagUnknown",
1527
+ "TagUnknown12",
1528
+ "TagUnknown12Mirror",
1529
+ "TagUnknownMirror",
1530
+ "TaskGroup",
1531
+ "TaskGroupMirrored",
1532
+ "TaskList",
1533
+ "TaskManager",
1534
+ "TaskManagerMirrored",
1535
+ "TaskSolid",
1536
+ "Taskboard",
1537
+ "Taxi",
1538
+ "TeamFavorite",
1539
+ "Teamwork",
1540
+ "Teeth",
1541
+ "Telemarketer",
1542
+ "TemporaryUser",
1543
+ "Tennis",
1544
+ "TestAutoSolid",
1545
+ "TestBeaker",
1546
+ "TestBeakerSolid",
1547
+ "TestCase",
1548
+ "TestExploreSolid",
1549
+ "TestImpactSolid",
1550
+ "TestParameter",
1551
+ "TestPlan",
1552
+ "TestStep",
1553
+ "TestSuite",
1554
+ "TestUserSolid",
1555
+ "TextAlignBottom",
1556
+ "TextAlignMiddle",
1557
+ "TextAlignTop",
1558
+ "TextBox",
1559
+ "TextCallout",
1560
+ "TextDocument",
1561
+ "TextDocumentEdit",
1562
+ "TextDocumentSettings",
1563
+ "TextDocumentShared",
1564
+ "TextField",
1565
+ "TextOverflow",
1566
+ "TextParagraphOption",
1567
+ "TextRecognition",
1568
+ "TextRotate270Degrees",
1569
+ "TextRotate90Degrees",
1570
+ "TextRotateHorizontal",
1571
+ "TextRotation",
1572
+ "ThisPC",
1573
+ "ThreeQuarterCircle",
1574
+ "ThumbnailView",
1575
+ "ThumbnailViewMirrored",
1576
+ "Thunderstorms",
1577
+ "Ticket",
1578
+ "Tiles",
1579
+ "Tiles2",
1580
+ "TimeEntry",
1581
+ "TimePicker",
1582
+ "TimeSheet",
1583
+ "Timeline",
1584
+ "TimelineDelivery",
1585
+ "TimelineMatrixView",
1586
+ "TimelineProgress",
1587
+ "Timer",
1588
+ "ToggleBorder",
1589
+ "ToggleFilled",
1590
+ "ToggleLeft",
1591
+ "ToggleRight",
1592
+ "ToggleThumb",
1593
+ "Toll",
1594
+ "Toolbox",
1595
+ "Total",
1596
+ "Touch",
1597
+ "TouchPointer",
1598
+ "Trackers",
1599
+ "TrackersMirrored",
1600
+ "Train",
1601
+ "TrainSolid",
1602
+ "TransferCall",
1603
+ "Transition",
1604
+ "TransitionEffect",
1605
+ "TransitionPop",
1606
+ "TransitionPush",
1607
+ "Translate",
1608
+ "Trending12",
1609
+ "TriangleDown12",
1610
+ "TriangleLeft12",
1611
+ "TriangleRight12",
1612
+ "TriangleShape",
1613
+ "TriangleShapeSolid",
1614
+ "TriangleSolid",
1615
+ "TriangleSolidDown12",
1616
+ "TriangleSolidLeft12",
1617
+ "TriangleSolidRight12",
1618
+ "TriangleSolidUp12",
1619
+ "TriangleUp12",
1620
+ "TriggerApproval",
1621
+ "TriggerAuto",
1622
+ "TriggerUser",
1623
+ "Trim",
1624
+ "TrimEnd",
1625
+ "TrimStart",
1626
+ "TripleColumn",
1627
+ "TripleColumnEdit",
1628
+ "TripleColumnWide",
1629
+ "Trophy",
1630
+ "Trophy2",
1631
+ "Trophy2Solid",
1632
+ "TurnRight",
1633
+ "TwelvePointStar",
1634
+ "TwitterLogo",
1635
+ "URLBlock",
1636
+ "USB",
1637
+ "Umbrella",
1638
+ "UnSetColor",
1639
+ "Underline",
1640
+ "Undo",
1641
+ "Uneditable",
1642
+ "Uneditable2",
1643
+ "Uneditable2Mirrored",
1644
+ "UneditableMirrored",
1645
+ "UneditableSolid12",
1646
+ "UneditableSolidMirrored12",
1647
+ "Unfavorite",
1648
+ "UngroupObject",
1649
+ "Unknown",
1650
+ "UnknownCall",
1651
+ "UnknownMirrored",
1652
+ "UnknownMirroredSolid",
1653
+ "UnknownSolid",
1654
+ "Unlock",
1655
+ "UnlockSolid",
1656
+ "Unpin",
1657
+ "UnpublishContent",
1658
+ "UnstackSelected",
1659
+ "Unsubscribe",
1660
+ "UnsyncFolder",
1661
+ "UnsyncOccurence",
1662
+ "Untag",
1663
+ "Up",
1664
+ "UpdateRestore",
1665
+ "UpgradeAnalysis",
1666
+ "Upload",
1667
+ "UserEvent",
1668
+ "UserFollowed",
1669
+ "UserGauge",
1670
+ "UserOptional",
1671
+ "UserPause",
1672
+ "UserRemove",
1673
+ "UserSync",
1674
+ "UserWarning",
1675
+ "VB",
1676
+ "Vacation",
1677
+ "Vaccination",
1678
+ "Variable",
1679
+ "Variable2",
1680
+ "VariableGroup",
1681
+ "VennDiagram",
1682
+ "VerifiedBrand",
1683
+ "VerifiedBrandSolid",
1684
+ "VersionControlPush",
1685
+ "VerticalDistributeCenter",
1686
+ "Video",
1687
+ "Video360Generic",
1688
+ "VideoLightOff",
1689
+ "VideoOff",
1690
+ "VideoOff2",
1691
+ "VideoSearch",
1692
+ "VideoSolid",
1693
+ "View",
1694
+ "ViewAll",
1695
+ "ViewAll2",
1696
+ "ViewDashboard",
1697
+ "ViewInAR",
1698
+ "ViewList",
1699
+ "ViewListGroup",
1700
+ "ViewListTree",
1701
+ "ViewOriginal",
1702
+ "VisuallyImpaired",
1703
+ "VisualsFolder",
1704
+ "VisualsStore",
1705
+ "VoicemailForward",
1706
+ "VoicemailIRM",
1707
+ "VoicemailReply",
1708
+ "Volume0",
1709
+ "Volume1",
1710
+ "Volume2",
1711
+ "Volume3",
1712
+ "VolumeDisabled",
1713
+ "Waffle",
1714
+ "WaitlistConfirm",
1715
+ "WaitlistConfirmMirrored",
1716
+ "Warning",
1717
+ "Warning12",
1718
+ "WarningSolid",
1719
+ "WavingHand",
1720
+ "WebComponents",
1721
+ "WebEnvironment",
1722
+ "WebPublish",
1723
+ "WebTemplate",
1724
+ "Webcam2",
1725
+ "Webcam2Off",
1726
+ "Website",
1727
+ "Weights",
1728
+ "Wheelchair",
1729
+ "WifiEthernet",
1730
+ "WifiWarning4",
1731
+ "WindDirection",
1732
+ "WindowEdit",
1733
+ "Wines",
1734
+ "WipePhone",
1735
+ "Work",
1736
+ "WorkFlow",
1737
+ "WorkItem",
1738
+ "WorkItemAlert",
1739
+ "WorkItemBar",
1740
+ "WorkItemBarSolid",
1741
+ "WorkItemBug",
1742
+ "WorkforceManagement",
1743
+ "World",
1744
+ "WorldClock",
1745
+ "XamarinLogo",
1746
+ "XboxController",
1747
+ "ZipFolder",
1748
+ "Zoom",
1749
+ "ZoomIn",
1750
+ "ZoomOut",
1751
+ "ZoomToFit",
1752
+ "eDiscovery",
1753
+ "iOSAppStoreLogo",
1754
+ ]
tour.conf DELETED
@@ -1,263 +0,0 @@
1
- hello_world.py
2
- todo.py
3
- wizard.py
4
- issue_tracker.py
5
- dashboard.py
6
- tall_info.py
7
- article.py
8
- wide_info.py
9
- wide_plot.py
10
- post.py
11
- preview.py
12
- stat_wide_pie.py
13
- tall_article_preview.py
14
- wide_article_preview.py
15
- profile.py
16
- stat_small.py
17
- stat_large.py
18
- stat_wide_gauge.py
19
- stat_tall_gauge.py
20
- stat_wide_bar.py
21
- stat_wide_pie.py
22
- stat_large_bar.py
23
- stat_small_series_area.py
24
- stat_small_series_interval.py
25
- stat_wide_series_area.py
26
- stat_wide_series_interval.py
27
- stat_tall_series_area.py
28
- stat_tall_series_interval.py
29
- stat_table.py
30
- tall_stats.py
31
- layout.py
32
- layout_size.py
33
- layout_responsive.py
34
- chatbot.py
35
- form.py
36
- form_visibility.py
37
- text.py
38
- copyable_text.py
39
- text_sizes.py
40
- text_annotator.py
41
- label.py
42
- link.py
43
- links.py
44
- progress.py
45
- progress_update.py
46
- message_bar.py
47
- textbox.py
48
- textbox_trigger.py
49
- button.py
50
- buttons.py
51
- checkbox.py
52
- checklist.py
53
- checklist_inline.py
54
- picker.py
55
- picker_selection.py
56
- dropdown.py
57
- choice_group.py
58
- combobox.py
59
- toggle.py
60
- spinbox.py
61
- spinbox_trigger.py
62
- slider.py
63
- range_slider.py
64
- date_picker.py
65
- date_picker_trigger.py
66
- time_picker.py
67
- color_picker.py
68
- swatch_picker.py
69
- persona.py
70
- facepile.py
71
- tabs.py
72
- separator.py
73
- file_upload.py
74
- file_upload_compact.py
75
- form_frame.py
76
- form_frame_path.py
77
- form_template.py
78
- form_markup.py
79
- stepper.py
80
- table_markdown_pandas.py
81
- table.py
82
- table_sort.py
83
- table_search.py
84
- table_filter.py
85
- table_filter_backend.py
86
- table_download.py
87
- table_groupby.py
88
- table_groups.py
89
- table_select_single.py
90
- table_select_multiple.py
91
- table_events_select.py
92
- table_tags.py
93
- table_pagination.py
94
- table_pagination_pandas.py
95
- table_pagination_h2o3.py
96
- table_pagination_minimal.py
97
- table_pagination_sort.py
98
- table_pagination_filter.py
99
- table_pagination_search.py
100
- table_pagination_download.py
101
- table_pagination_groups.py
102
- table_menu.py
103
- table_markdown.py
104
- table_markdown_overflow.py
105
- tags.py
106
- image.py
107
- image_popup.py
108
- image_annotator.py
109
- inline.py
110
- file_stream.py
111
- frame.py
112
- frame_path.py
113
- template.py
114
- template_data.py
115
- markdown.py
116
- markdown_table.py
117
- markdown_data.py
118
- markdown_submit_text.py
119
- markup.py
120
- nav.py
121
- toolbar.py
122
- tab.py
123
- tab_delete.py
124
- breadcrumbs.py
125
- header.py
126
- footer.py
127
- routing.py
128
- routing_predicates.py
129
- hash_routing.py
130
- hash_routing_parameters.py
131
- toolbar_routing.py
132
- card_menu.py
133
- menu.py
134
- plot_theme.py
135
- plot_point.py
136
- plot_point_shapes.py
137
- plot_point_sizes.py
138
- plot_point_map.py
139
- plot_point_groups.py
140
- plot_point_annotation.py
141
- plot_point_custom.py
142
- plot_interval.py
143
- plot_interval_transpose.py
144
- plot_interval_groups.py
145
- plot_interval_groups_transpose.py
146
- plot_interval_labels.py
147
- plot_interval_range.py
148
- plot_interval_range_transpose.py
149
- plot_interval_stacked.py
150
- plot_interval_stacked_transpose.py
151
- plot_interval_stacked_grouped.py
152
- plot_interval_stacked_grouped_transpose.py
153
- plot_interval_polar.py
154
- plot_interval_polar_stacked.py
155
- plot_interval_theta.py
156
- plot_interval_theta_stacked.py
157
- plot_interval_helix.py
158
- plot_interval_annotation.py
159
- plot_interval_annotation_transpose.py
160
- plot_line.py
161
- plot_line_groups.py
162
- plot_line_smooth.py
163
- plot_step.py
164
- plot_step_after.py
165
- plot_step_before.py
166
- plot_line_labels.py
167
- plot_line_labels_custom.py
168
- plot_line_labels_stroked.py
169
- plot_line_labels_no_overlap.py
170
- plot_line_annotation.py
171
- plot_path.py
172
- plot_path_point.py
173
- plot_path_smooth.py
174
- plot_area.py
175
- plot_area_groups.py
176
- plot_area_negative.py
177
- plot_area_range.py
178
- plot_area_smooth.py
179
- plot_area_stacked.py
180
- plot_area_line.py
181
- plot_area_line_smooth.py
182
- plot_area_line_groups.py
183
- plot_polygon.py
184
- plot_histogram.py
185
- plot_schema.py
186
- plot_schema_transpose.py
187
- plot_interaction_zoom.py
188
- plot_interaction_brush.py
189
- plot_interaction_drag_move.py
190
- plot_axis_title.py
191
- plot_form.py
192
- plot_app.py
193
- plot_events.py
194
- plot_events_disabled.py
195
- plot_events_routing.py
196
- plot_pandas.py
197
- plot_vega.py
198
- plot_vegalite.py
199
- plot_vegalite_update.py
200
- plot_vegalite_form.py
201
- plot_vegalite_flex.py
202
- plot_altair.py
203
- plot_bokeh.py
204
- plot_bokeh_script.py
205
- plot_bokeh_callbacks.py
206
- plot_matplotlib.py
207
- plot_plotly.py
208
- plot_d3.py
209
- pixel_art.py
210
- upload.py
211
- upload_async.py
212
- upload_ui.py
213
- upload_download.py
214
- upload_frame.py
215
- meta_inline_script.py
216
- meta_inline_script_callback.py
217
- meta_script.py
218
- meta_script_callback.py
219
- meta_stylesheet.py
220
- meta_inline_stylesheet.py
221
- meta_dialog.py
222
- meta_dialog_closable.py
223
- meta_side_panel.py
224
- meta_side_panel_closable.py
225
- meta_title.py
226
- meta_icon.py
227
- meta_notification.py
228
- meta_notification_bar.py
229
- meta_notification_bar_closable.py
230
- meta_refresh.py
231
- meta_redirect.py
232
- meta_theme.py
233
- theme_generator.py
234
- meta_tracking.py
235
- counter_global.py
236
- counter_broadcast.py
237
- counter_multicast.py
238
- counter_unicast.py
239
- background.py
240
- background_executor.py
241
- background_progress.py
242
- site_async.py
243
- http_client.py
244
- checkpoint.py
245
- graphics_primitives.py
246
- graphics_spline.py
247
- graphics_clock.py
248
- graphics_path.py
249
- graphics_turtle.py
250
- graphics_hilbert.py
251
- glider_gun.py
252
- ml_h2o.py
253
- ml_h2o_save.py
254
- ml_h2o_categorical.py
255
- ml_h2o_parameters.py
256
- ml_h2o_algo.py
257
- ml_h2o_shap.py
258
- ml_dai.py
259
- ml_dai_save.py
260
- ml_dai_categorical.py
261
- ml_dai_parameters.py
262
- ml_dai_autodoc.py
263
- ml_dai_instances.py
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tour.js DELETED
@@ -1,64 +0,0 @@
1
- require.config({
2
- paths: {
3
- 'vs': '$tour_assets' + '/monaco',
4
- 'pyodide': '$tour_assets' + '/pyodide/pyodide.js'
5
- }
6
- })
7
- window.MonacoEnvironment = {
8
- getWorkerUrl: function (workerId, label) {
9
- const { origin } = window.location
10
- return `$${origin}$${'$base_url'}assets/monaco/base/worker/workerMain.js`
11
- }
12
- }
13
- const completionToCompletionItem = item => ({
14
- label: item.get('label'),
15
- kind: item.get('kind'),
16
- insertText: item.get('label'),
17
- sortText: item.get('sort_text'),
18
- })
19
- const snippetToCompletionItem = item => ({
20
- label: item.prefix,
21
- kind: monaco.languages.CompletionItemKind.Snippet,
22
- documentation: item.description,
23
- insertText: item.body.join('\n'),
24
- insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,
25
- })
26
- require(['vs/editor/editor.main', 'pyodide'], async () => {
27
- monaco.languages.registerCompletionItemProvider('python', {
28
- triggerCharacters: ['.', "'", '"'],
29
- provideCompletionItems: async (model, position) => {
30
- const pyRes = await window.pyodide.runPython(`get_wave_completions($${position.lineNumber - 1}, $${position.column - 1}, \'\'\'$${model.getValue()}\'\'\')`)
31
- const completions = pyRes ? pyRes.toJs().map(completionToCompletionItem) : []
32
- // HACK: Fetch on every keystroke due to weird bug in monaco - showing snippets only for first example.
33
- let [snippets1, snippets2] = await Promise.all([
34
- fetch('$snippets1').then(r => r.json()),
35
- fetch('$snippets2').then(r => r.json()),
36
- ])
37
- snippets1 = Object.values(snippets1).map(snippetToCompletionItem)
38
- snippets2 = Object.values(snippets2).map(snippetToCompletionItem)
39
- return { suggestions: [...completions, ...snippets1, ...snippets2] }
40
- }
41
- })
42
- const editor = monaco.editor.create(document.getElementById('monaco-editor'), {
43
- value: '',
44
- language: 'python',
45
- minimap: { enabled: false },
46
- overviewRulerLanes: 0,
47
- hideCursorInOverviewRuler: true,
48
- scrollbar: { vertical: 'hidden' },
49
- overviewRulerBorder: false,
50
- lineDecorationsWidth: 0,
51
- lineNumbersMinChars: 3,
52
- automaticLayout: true,
53
- })
54
- editor.onDidChangeModelContent(e => {
55
- if (e.isFlush) return
56
- emit_debounced('editor', 'change', editor.getValue())
57
- })
58
- window.editor = editor
59
- window.emit_debounced = window.wave.debounce(2000, window.wave.emit)
60
- window.pyodide = await window.loadPyodide()
61
- await window.pyodide.loadPackage('parso')
62
- await window.pyodide.loadPackage('jedi')
63
- await window.pyodide.runPythonAsync(`$py_content`)
64
- })