kempo-ui 0.1.6 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/.github/skills/highlight-code/SKILL.md +22 -6
  2. package/.github/skills/new-component/SKILL.md +68 -4
  3. package/AGENTS.md +11 -0
  4. package/bin/highlight_code.js +7 -15
  5. package/dist/components/Aside.js +326 -0
  6. package/dist/components/Dialog.js +1 -1
  7. package/dist/components/Dropdown.js +1 -1
  8. package/dist/components/Main.js +2 -2
  9. package/dist/components/Nav.js +27 -0
  10. package/dist/components/PhotoViewer.js +1 -1
  11. package/dist/components/ShadowComponent.js +1 -1
  12. package/dist/components/ThemeSwitcher.js +1 -0
  13. package/dist/components/Toast.js +1 -1
  14. package/docs/components/accordion.html +4 -3
  15. package/docs/components/aside-items.html +43 -0
  16. package/docs/components/aside-menu.html +43 -0
  17. package/docs/components/aside-push.html +26 -0
  18. package/docs/components/aside.html +567 -0
  19. package/docs/components/card.html +4 -3
  20. package/docs/components/color-picker.html +4 -3
  21. package/docs/components/content-slider.html +4 -3
  22. package/docs/components/dialog.html +4 -3
  23. package/docs/components/dropdown.html +4 -3
  24. package/docs/components/filter-list.html +4 -3
  25. package/docs/components/focus-capture.html +6 -5
  26. package/docs/components/html-editor.html +5 -4
  27. package/docs/components/hybrid-component.html +5 -4
  28. package/docs/components/icon.html +4 -3
  29. package/docs/components/import.html +5 -4
  30. package/docs/components/light-component.html +4 -3
  31. package/docs/components/nav.html +117 -0
  32. package/docs/components/photo-viewer.html +5 -4
  33. package/docs/components/resize.html +5 -4
  34. package/docs/components/shadow-component.html +4 -3
  35. package/docs/components/show-more.html +5 -4
  36. package/docs/components/sortable.html +4 -3
  37. package/docs/components/spinner.html +4 -3
  38. package/docs/components/split.html +5 -4
  39. package/docs/components/table.html +4 -3
  40. package/docs/components/tableControls.html +4 -3
  41. package/docs/components/tableCustomFields.html +4 -3
  42. package/docs/components/tableFetchRecords.html +5 -4
  43. package/docs/components/tableFieldSortHide.html +5 -4
  44. package/docs/components/tablePagination.html +4 -3
  45. package/docs/components/tableRecordEditing.html +4 -3
  46. package/docs/components/tableRecordFiltering.html +5 -4
  47. package/docs/components/tableRecordHiding.html +4 -3
  48. package/docs/components/tableRecordSearching.html +5 -4
  49. package/docs/components/tableRecordSelection.html +4 -3
  50. package/docs/components/tableRowControls.html +4 -3
  51. package/docs/components/tableServerSync.html +5 -4
  52. package/docs/components/tableSorting.html +5 -4
  53. package/docs/components/tabs.html +4 -3
  54. package/docs/components/tags.html +4 -3
  55. package/docs/components/theme-select.html +4 -3
  56. package/docs/components/theme-switcher.html +5 -4
  57. package/docs/components/timestamp.html +4 -3
  58. package/docs/components/toast.html +4 -3
  59. package/docs/components/toggle.html +5 -4
  60. package/docs/components/tree.html +5 -4
  61. package/docs/index.html +22 -21
  62. package/docs/nav-1.inc.html +18 -12
  63. package/docs/nav.inc.html +20 -13
  64. package/docs/nav.inc.js +1 -1
  65. package/docs/src/components/Aside.js +326 -0
  66. package/docs/src/components/Dialog.js +1 -1
  67. package/docs/src/components/Dropdown.js +1 -1
  68. package/docs/src/components/Main.js +2 -2
  69. package/docs/src/components/Nav.js +27 -0
  70. package/docs/src/components/PhotoViewer.js +1 -1
  71. package/docs/src/components/ShadowComponent.js +1 -1
  72. package/docs/src/components/ThemeSwitcher.js +1 -0
  73. package/docs/src/components/Toast.js +1 -1
  74. package/docs/utils/context.html +4 -3
  75. package/docs/utils/cookie.html +4 -3
  76. package/docs/utils/debounce.html +4 -3
  77. package/docs/utils/drag.html +4 -3
  78. package/docs/utils/elevation.html +156 -0
  79. package/docs/utils/formatTimestamp.html +4 -3
  80. package/docs/utils/object.html +4 -3
  81. package/docs/utils/propConverters.html +4 -3
  82. package/docs/utils/string.html +4 -3
  83. package/docs/utils/theme.html +4 -3
  84. package/docs/utils/toTitleCase.html +4 -3
  85. package/docs/utils/type.html +4 -3
  86. package/docs/utils/wait.html +4 -3
  87. package/llm.txt +247 -0
  88. package/package.json +3 -4
  89. package/src/components/Aside.js +726 -0
  90. package/src/components/Dialog.js +1 -1
  91. package/src/components/Dropdown.js +1 -1
  92. package/src/components/Main.js +34 -30
  93. package/src/components/Nav.js +53 -0
  94. package/src/components/PhotoViewer.js +1 -1
  95. package/src/components/ShadowComponent.js +1 -1
  96. package/src/components/ThemeSwitcher.js +1 -0
  97. package/src/components/Toast.js +1 -1
  98. package/tests/bin/get_icon.node-test.js +26 -0
  99. package/tests/bin/highlight_code.node-test.js +108 -0
  100. package/tests/bin/list_icons.node-test.js +26 -0
  101. package/tests/components/Aside.browser-test.js +778 -0
  102. package/tests/components/Main.browser-test.js +115 -283
  103. package/dist/components/SideMenu.js +0 -97
  104. package/dist/components/SidePanel.js +0 -236
  105. package/docs/components/side-menu.html +0 -189
  106. package/docs/components/side-panel-basic.html +0 -44
  107. package/docs/components/side-panel-dual.html +0 -70
  108. package/docs/components/side-panel-menu.html +0 -50
  109. package/docs/components/side-panel-persistent.html +0 -90
  110. package/docs/components/side-panel-scroll.html +0 -176
  111. package/docs/components/side-panel.html +0 -245
  112. package/docs/src/components/SideMenu.js +0 -97
  113. package/docs/src/components/SidePanel.js +0 -236
  114. package/scripts/update-kempo-css.js +0 -53
  115. package/src/components/SideMenu.js +0 -178
  116. package/src/components/SidePanel.js +0 -513
  117. package/tests/components/SideMenu.browser-test.js +0 -667
  118. package/tests/components/SidePanel.browser-test.js +0 -520
  119. package/tools/highlight.js +0 -51
@@ -1,520 +0,0 @@
1
- import '../../src/components/SidePanel.js';
2
-
3
- const createPanel = async (options = {}) => {
4
- const panel = document.createElement('k-side-panel');
5
- if(options.collapsed !== undefined) panel.collapsed = options.collapsed;
6
- if(options.side) panel.side = options.side;
7
- document.body.appendChild(panel);
8
- await panel.updateComplete;
9
- return panel;
10
- };
11
-
12
- const createPanelWithItem = async () => {
13
- const panel = document.createElement('k-side-panel');
14
- const item = document.createElement('k-side-panel-item');
15
- item.icon = 'home';
16
- item.label = 'Home';
17
- item.href = '/home';
18
- panel.appendChild(item);
19
- document.body.appendChild(panel);
20
- await panel.updateComplete;
21
- await item.updateComplete;
22
- return { panel, item };
23
- };
24
-
25
- const createPanelWithLabel = async () => {
26
- const panel = document.createElement('k-side-panel');
27
- const label = document.createElement('k-side-panel-label');
28
- label.textContent = 'Section';
29
- panel.appendChild(label);
30
- document.body.appendChild(panel);
31
- await panel.updateComplete;
32
- await label.updateComplete;
33
- return { panel, label };
34
- };
35
-
36
- const createPanelWithMenu = async () => {
37
- const panel = document.createElement('k-side-panel');
38
- const menu = document.createElement('k-side-panel-menu');
39
- menu.icon = 'folder';
40
- menu.label = 'Files';
41
- const item1 = document.createElement('k-side-panel-item');
42
- item1.label = 'File 1';
43
- const item2 = document.createElement('k-side-panel-item');
44
- item2.label = 'File 2';
45
- menu.appendChild(item1);
46
- menu.appendChild(item2);
47
- panel.appendChild(menu);
48
- document.body.appendChild(panel);
49
- await panel.updateComplete;
50
- await menu.updateComplete;
51
- return { panel, menu, item1, item2 };
52
- };
53
-
54
- const cleanup = (el) => {
55
- if(el && el.parentNode) {
56
- el.parentNode.removeChild(el);
57
- }
58
- };
59
-
60
- export default {
61
- /*
62
- SidePanel - Properties
63
- */
64
- 'should have default collapsed property as false': async ({pass, fail}) => {
65
- const panel = await createPanel();
66
- if(panel.collapsed !== false) {
67
- cleanup(panel);
68
- return fail(`Expected collapsed to be false, got ${panel.collapsed}`);
69
- }
70
- cleanup(panel);
71
- pass('Default collapsed property is false');
72
- },
73
-
74
- 'should have default side property as left': async ({pass, fail}) => {
75
- const panel = await createPanel();
76
- if(panel.side !== 'left') {
77
- cleanup(panel);
78
- return fail(`Expected side to be "left", got "${panel.side}"`);
79
- }
80
- cleanup(panel);
81
- pass('Default side property is left');
82
- },
83
-
84
- 'should reflect collapsed property to attribute': async ({pass, fail}) => {
85
- const panel = await createPanel({ collapsed: true });
86
- if(!panel.hasAttribute('collapsed')) {
87
- cleanup(panel);
88
- return fail('collapsed attribute should be set');
89
- }
90
- cleanup(panel);
91
- pass('Collapsed property reflects to attribute');
92
- },
93
-
94
- 'should reflect side property to attribute': async ({pass, fail}) => {
95
- const panel = await createPanel({ side: 'right' });
96
- if(panel.getAttribute('side') !== 'right') {
97
- cleanup(panel);
98
- return fail(`Expected side attribute "right", got "${panel.getAttribute('side')}"`);
99
- }
100
- cleanup(panel);
101
- pass('Side property reflects to attribute');
102
- },
103
-
104
- /*
105
- SidePanel - Methods
106
- */
107
- 'should expand panel': async ({pass, fail}) => {
108
- const panel = await createPanel({ collapsed: true });
109
- panel.expand();
110
- await panel.updateComplete;
111
- if(panel.collapsed !== false) {
112
- cleanup(panel);
113
- return fail('Panel should be expanded');
114
- }
115
- cleanup(panel);
116
- pass('Panel expands correctly');
117
- },
118
-
119
- 'should collapse panel': async ({pass, fail}) => {
120
- const panel = await createPanel({ collapsed: false });
121
- panel.collapse();
122
- await panel.updateComplete;
123
- if(panel.collapsed !== true) {
124
- cleanup(panel);
125
- return fail('Panel should be collapsed');
126
- }
127
- cleanup(panel);
128
- pass('Panel collapses correctly');
129
- },
130
-
131
- 'should toggle panel from collapsed to expanded': async ({pass, fail}) => {
132
- const panel = await createPanel({ collapsed: true });
133
- panel.toggle();
134
- await panel.updateComplete;
135
- if(panel.collapsed !== false) {
136
- cleanup(panel);
137
- return fail('Panel should toggle to expanded');
138
- }
139
- cleanup(panel);
140
- pass('Panel toggles from collapsed to expanded');
141
- },
142
-
143
- 'should toggle panel from expanded to collapsed': async ({pass, fail}) => {
144
- const panel = await createPanel({ collapsed: false });
145
- panel.toggle();
146
- await panel.updateComplete;
147
- if(panel.collapsed !== true) {
148
- cleanup(panel);
149
- return fail('Panel should toggle to collapsed');
150
- }
151
- cleanup(panel);
152
- pass('Panel toggles from expanded to collapsed');
153
- },
154
-
155
- /*
156
- SidePanel - Events
157
- */
158
- 'should dispatch collapse event when collapsed': async ({pass, fail}) => {
159
- const panel = await createPanel();
160
- let eventFired = false;
161
- panel.addEventListener('collapse', () => {
162
- eventFired = true;
163
- });
164
- panel.collapse();
165
- await panel.updateComplete;
166
- if(!eventFired) {
167
- cleanup(panel);
168
- return fail('collapse event should be dispatched');
169
- }
170
- cleanup(panel);
171
- pass('Collapse event dispatched');
172
- },
173
-
174
- 'should dispatch expand event when expanded': async ({pass, fail}) => {
175
- const panel = await createPanel({ collapsed: true });
176
- let eventFired = false;
177
- panel.addEventListener('expand', () => {
178
- eventFired = true;
179
- });
180
- panel.expand();
181
- await panel.updateComplete;
182
- if(!eventFired) {
183
- cleanup(panel);
184
- return fail('expand event should be dispatched');
185
- }
186
- cleanup(panel);
187
- pass('Expand event dispatched');
188
- },
189
-
190
- 'should dispatch change event with detail on collapse': async ({pass, fail}) => {
191
- const panel = await createPanel();
192
- let changeDetail = null;
193
- panel.addEventListener('change', (e) => {
194
- changeDetail = e.detail;
195
- });
196
- panel.collapse();
197
- await panel.updateComplete;
198
- if(changeDetail !== 'collapse') {
199
- cleanup(panel);
200
- return fail(`Expected change detail "collapse", got "${changeDetail}"`);
201
- }
202
- cleanup(panel);
203
- pass('Change event dispatched with collapse detail');
204
- },
205
-
206
- 'should dispatch window side-panel-change event on collapse': async ({pass, fail}) => {
207
- const panel = await createPanel();
208
- let eventDetail = null;
209
- const handler = (e) => {
210
- eventDetail = e.detail;
211
- };
212
- window.addEventListener('side-panel-change', handler);
213
- panel.collapse();
214
- await panel.updateComplete;
215
- window.removeEventListener('side-panel-change', handler);
216
- if(!eventDetail || eventDetail.collapsed !== true || eventDetail.width !== '3.5rem' || eventDetail.side !== 'left') {
217
- cleanup(panel);
218
- return fail('Window event should have correct detail on collapse');
219
- }
220
- cleanup(panel);
221
- pass('Window side-panel-change event dispatched on collapse');
222
- },
223
-
224
- /*
225
- SidePanel - Toggle Button
226
- */
227
- 'should toggle panel when toggle button clicked': async ({pass, fail}) => {
228
- const panel = await createPanel();
229
- const toggleButton = panel.shadowRoot.querySelector('#toggle');
230
- const initialState = panel.collapsed;
231
- toggleButton.click();
232
- await panel.updateComplete;
233
- if(panel.collapsed === initialState) {
234
- cleanup(panel);
235
- return fail('Panel should toggle when button clicked');
236
- }
237
- cleanup(panel);
238
- pass('Toggle button works correctly');
239
- },
240
-
241
- 'should show right arrow icon when collapsed on left side': async ({pass, fail}) => {
242
- const panel = await createPanel({ collapsed: true, side: 'left' });
243
- const icon = panel.shadowRoot.querySelector('#toggle k-icon');
244
- if(icon.getAttribute('direction') !== 'right') {
245
- cleanup(panel);
246
- return fail(`Expected direction "right", got "${icon.getAttribute('direction')}"`);
247
- }
248
- cleanup(panel);
249
- pass('Right arrow shown when collapsed on left side');
250
- },
251
-
252
- 'should show left arrow icon when expanded on left side': async ({pass, fail}) => {
253
- const panel = await createPanel({ collapsed: false, side: 'left' });
254
- const icon = panel.shadowRoot.querySelector('#toggle k-icon');
255
- if(icon.getAttribute('direction') !== 'left') {
256
- cleanup(panel);
257
- return fail(`Expected direction "left", got "${icon.getAttribute('direction')}"`);
258
- }
259
- cleanup(panel);
260
- pass('Left arrow shown when expanded on left side');
261
- },
262
-
263
- 'should show left arrow icon when collapsed on right side': async ({pass, fail}) => {
264
- const panel = await createPanel({ collapsed: true, side: 'right' });
265
- const icon = panel.shadowRoot.querySelector('#toggle k-icon');
266
- if(icon.getAttribute('direction') !== 'left') {
267
- cleanup(panel);
268
- return fail(`Expected direction "left", got "${icon.getAttribute('direction')}"`);
269
- }
270
- cleanup(panel);
271
- pass('Left arrow shown when collapsed on right side');
272
- },
273
-
274
- 'should show right arrow icon when expanded on right side': async ({pass, fail}) => {
275
- const panel = await createPanel({ collapsed: false, side: 'right' });
276
- const icon = panel.shadowRoot.querySelector('#toggle k-icon');
277
- if(icon.getAttribute('direction') !== 'right') {
278
- cleanup(panel);
279
- return fail(`Expected direction "right", got "${icon.getAttribute('direction')}"`);
280
- }
281
- cleanup(panel);
282
- pass('Right arrow shown when expanded on right side');
283
- },
284
-
285
- /*
286
- SidePanel - Right Side Positioning
287
- */
288
- 'should position on right side when side is right': async ({pass, fail}) => {
289
- const panel = await createPanel({ side: 'right' });
290
- const styles = window.getComputedStyle(panel);
291
- if(styles.right !== '0px') {
292
- cleanup(panel);
293
- return fail('Panel should be positioned on right side');
294
- }
295
- cleanup(panel);
296
- pass('Panel positioned on right side');
297
- },
298
-
299
- 'should dispatch window event with correct side': async ({pass, fail}) => {
300
- const panel = await createPanel({ side: 'right' });
301
- let eventDetail = null;
302
- const handler = (e) => {
303
- eventDetail = e.detail;
304
- };
305
- window.addEventListener('side-panel-change', handler);
306
- panel.collapse();
307
- await panel.updateComplete;
308
- window.removeEventListener('side-panel-change', handler);
309
- if(eventDetail.side !== 'right') {
310
- cleanup(panel);
311
- return fail(`Expected side "right", got "${eventDetail.side}"`);
312
- }
313
- cleanup(panel);
314
- pass('Window event includes correct side');
315
- },
316
-
317
- /*
318
- SidePanelItem - Properties
319
- */
320
- 'should have icon property on item': async ({pass, fail}) => {
321
- const { panel, item } = await createPanelWithItem();
322
- if(item.icon !== 'home') {
323
- cleanup(panel);
324
- return fail(`Expected icon "home", got "${item.icon}"`);
325
- }
326
- cleanup(panel);
327
- pass('Item has icon property');
328
- },
329
-
330
- 'should have label property on item': async ({pass, fail}) => {
331
- const { panel, item } = await createPanelWithItem();
332
- if(item.label !== 'Home') {
333
- cleanup(panel);
334
- return fail(`Expected label "Home", got "${item.label}"`);
335
- }
336
- cleanup(panel);
337
- pass('Item has label property');
338
- },
339
-
340
- 'should have default active property as false on item': async ({pass, fail}) => {
341
- const { panel, item } = await createPanelWithItem();
342
- if(item.active !== false) {
343
- cleanup(panel);
344
- return fail(`Expected active to be false, got ${item.active}`);
345
- }
346
- cleanup(panel);
347
- pass('Item default active property is false');
348
- },
349
-
350
- /*
351
- SidePanelItem - Panel Collapse/Expand
352
- */
353
- 'should update item when panel collapses': async ({pass, fail}) => {
354
- const { panel, item } = await createPanelWithItem();
355
- panel.collapse();
356
- await panel.updateComplete;
357
- await item.updateComplete;
358
- if(item.collapsed !== true) {
359
- cleanup(panel);
360
- return fail('Item should update when panel collapses');
361
- }
362
- cleanup(panel);
363
- pass('Item updates when panel collapses');
364
- },
365
-
366
- 'should hide item label when panel collapsed': async ({pass, fail}) => {
367
- const { panel, item } = await createPanelWithItem();
368
- panel.collapse();
369
- await panel.updateComplete;
370
- await item.updateComplete;
371
- const label = item.shadowRoot.querySelector('.label');
372
- if(label !== null) {
373
- cleanup(panel);
374
- return fail('Item label should not be rendered when panel collapsed');
375
- }
376
- cleanup(panel);
377
- pass('Item label hidden when panel collapsed');
378
- },
379
-
380
- /*
381
- SidePanelLabel - Panel Collapse/Expand
382
- */
383
- 'should update label when panel collapses': async ({pass, fail}) => {
384
- const { panel, label } = await createPanelWithLabel();
385
- panel.collapse();
386
- await panel.updateComplete;
387
- await label.updateComplete;
388
- if(label.collapsed !== true) {
389
- cleanup(panel);
390
- return fail('Label should update when panel collapses');
391
- }
392
- cleanup(panel);
393
- pass('Label updates when panel collapses');
394
- },
395
-
396
- 'should render horizontal rule when label collapsed': async ({pass, fail}) => {
397
- const { panel, label } = await createPanelWithLabel();
398
- panel.collapse();
399
- await panel.updateComplete;
400
- await label.updateComplete;
401
- const hr = label.shadowRoot.querySelector('hr');
402
- if(!hr) {
403
- cleanup(panel);
404
- return fail('Should render horizontal rule when collapsed');
405
- }
406
- cleanup(panel);
407
- pass('Horizontal rule rendered when collapsed');
408
- },
409
-
410
- /*
411
- SidePanelMenu - Properties
412
- */
413
- 'should have icon property on menu': async ({pass, fail}) => {
414
- const { panel, menu } = await createPanelWithMenu();
415
- if(menu.icon !== 'folder') {
416
- cleanup(panel);
417
- return fail(`Expected icon "folder", got "${menu.icon}"`);
418
- }
419
- cleanup(panel);
420
- pass('Menu has icon property');
421
- },
422
-
423
- 'should have default open property as false on menu': async ({pass, fail}) => {
424
- const { panel, menu } = await createPanelWithMenu();
425
- if(menu.open !== false) {
426
- cleanup(panel);
427
- return fail(`Expected open to be false, got ${menu.open}`);
428
- }
429
- cleanup(panel);
430
- pass('Menu default open property is false');
431
- },
432
-
433
- /*
434
- SidePanelMenu - Toggle
435
- */
436
- 'should toggle menu from closed to open': async ({pass, fail}) => {
437
- const { panel, menu } = await createPanelWithMenu();
438
- menu.toggleMenu();
439
- await menu.updateComplete;
440
- if(menu.open !== true) {
441
- cleanup(panel);
442
- return fail('Menu should toggle to open');
443
- }
444
- cleanup(panel);
445
- pass('Menu toggles to open');
446
- },
447
-
448
- 'should toggle menu when header clicked': async ({pass, fail}) => {
449
- const { panel, menu } = await createPanelWithMenu();
450
- const header = menu.shadowRoot.querySelector('.menu-header');
451
- header.click();
452
- await menu.updateComplete;
453
- if(menu.open !== true) {
454
- cleanup(panel);
455
- return fail('Menu should toggle when header clicked');
456
- }
457
- cleanup(panel);
458
- pass('Menu toggles on header click');
459
- },
460
-
461
- 'should not toggle menu when panel is collapsed': async ({pass, fail}) => {
462
- const { panel, menu } = await createPanelWithMenu();
463
- panel.collapse();
464
- await panel.updateComplete;
465
- await menu.updateComplete;
466
- menu.toggleMenu();
467
- await menu.updateComplete;
468
- if(menu.open !== false) {
469
- cleanup(panel);
470
- return fail('Menu should not toggle when panel collapsed');
471
- }
472
- cleanup(panel);
473
- pass('Menu does not toggle when panel collapsed');
474
- },
475
-
476
- /*
477
- SidePanelMenu - Chevron Icon
478
- */
479
- 'should show right-pointing chevron when menu closed': async ({pass, fail}) => {
480
- const { panel, menu } = await createPanelWithMenu();
481
- const chevron = menu.shadowRoot.querySelector('.chevron');
482
- if(chevron.getAttribute('direction') !== 'right') {
483
- cleanup(panel);
484
- return fail(`Expected direction "right", got "${chevron.getAttribute('direction')}"`);
485
- }
486
- cleanup(panel);
487
- pass('Right-pointing chevron when closed');
488
- },
489
-
490
- 'should show down-pointing chevron when menu open': async ({pass, fail}) => {
491
- const { panel, menu } = await createPanelWithMenu();
492
- menu.open = true;
493
- await menu.updateComplete;
494
- const chevron = menu.shadowRoot.querySelector('.chevron');
495
- if(chevron.getAttribute('direction') !== 'down') {
496
- cleanup(panel);
497
- return fail(`Expected direction "down", got "${chevron.getAttribute('direction')}"`);
498
- }
499
- cleanup(panel);
500
- pass('Down-pointing chevron when open');
501
- },
502
-
503
- /*
504
- SidePanelSpacer
505
- */
506
- 'should render spacer': async ({pass, fail}) => {
507
- const panel = document.createElement('k-side-panel');
508
- const spacer = document.createElement('k-side-panel-spacer');
509
- panel.appendChild(spacer);
510
- document.body.appendChild(panel);
511
- await spacer.updateComplete;
512
- const spacerDiv = spacer.shadowRoot.querySelector('.spacer');
513
- if(!spacerDiv) {
514
- cleanup(panel);
515
- return fail('Spacer should render');
516
- }
517
- cleanup(panel);
518
- pass('Spacer renders correctly');
519
- }
520
- };
@@ -1,51 +0,0 @@
1
- /**
2
- * Highlight Tool
3
- * Highlights code using Highlight.js and returns a <pre><code> HTML block.
4
- *
5
- * CLI Usage:
6
- * echo '<div>hello</div>' | node tools/highlight.js --lang html
7
- * node tools/highlight.js --lang javascript --file path/to/code.js
8
- *
9
- * Options:
10
- * --lang <language> Language for syntax highlighting (required for CLI)
11
- * --file <path> Read code from a file instead of stdin
12
- *
13
- * Module Usage:
14
- * import { highlight } from './tools/highlight.js';
15
- * const html = highlight(code, 'javascript');
16
- */
17
-
18
- import hljs from 'highlight.js';
19
- import { readFileSync } from 'fs';
20
- import { fileURLToPath } from 'url';
21
- import path from 'path';
22
-
23
- export const highlight = (code, lang) => {
24
- const result = hljs.highlight(code, { language: lang });
25
- return `<pre><code class="hljs ${lang}">${result.value}</code></pre>`;
26
- };
27
-
28
- const isMain = path.resolve(process.argv[1]) === path.resolve(fileURLToPath(import.meta.url));
29
-
30
- if(isMain){
31
- const args = process.argv.slice(2);
32
- const getArg = name => {
33
- const idx = args.indexOf(name);
34
- return idx !== -1 ? args[idx + 1] : null;
35
- };
36
-
37
- const lang = getArg('--lang');
38
- const filePath = getArg('--file');
39
-
40
- if(!lang){
41
- console.error('Error: --lang <language> is required');
42
- console.error('Example: echo "const x = 1;" | node tools/highlight.js --lang javascript');
43
- process.exit(1);
44
- }
45
-
46
- const code = filePath
47
- ? readFileSync(filePath, 'utf8')
48
- : readFileSync(0, 'utf8');
49
-
50
- process.stdout.write(highlight(code, lang) + '\n');
51
- }