llms-py 3.0.7__py3-none-any.whl → 3.0.9__py3-none-any.whl

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.
llms/ui/App.mjs CHANGED
@@ -31,7 +31,7 @@ const LeftBar = {
31
31
  const LeftPanel = {
32
32
  template: `
33
33
  <div v-if="component" class="flex flex-col h-full border-r border-gray-200 dark:border-gray-700">
34
- <button type="button" class="absolute top-2 right-2 p-1 rounded-md text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700 lg:hidden z-20">
34
+ <button type="button" @click="$ctx.toggleLayout('left',false)" class="absolute top-2 right-2 p-1 rounded-md text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700 lg:hidden z-20">
35
35
  <svg class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
36
36
  </button>
37
37
  <component :is="component" />
llms/ui/ai.mjs CHANGED
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '3.0.7',
9
+ version: '3.0.9',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
llms/ui/app.css CHANGED
@@ -20,8 +20,10 @@
20
20
  --color-red-900: oklch(39.6% 0.141 25.723);
21
21
  --color-orange-100: oklch(95.4% 0.038 75.164);
22
22
  --color-orange-200: oklch(90.1% 0.076 70.697);
23
+ --color-orange-300: oklch(83.7% 0.128 66.29);
23
24
  --color-orange-400: oklch(75% 0.183 55.934);
24
25
  --color-orange-600: oklch(64.6% 0.222 41.116);
26
+ --color-orange-700: oklch(55.3% 0.195 38.402);
25
27
  --color-orange-800: oklch(47% 0.157 37.304);
26
28
  --color-orange-900: oklch(40.8% 0.123 38.172);
27
29
  --color-yellow-50: oklch(98.7% 0.026 102.212);
@@ -91,6 +93,7 @@
91
93
  --color-purple-700: oklch(49.6% 0.265 301.924);
92
94
  --color-purple-800: oklch(43.8% 0.218 303.724);
93
95
  --color-purple-900: oklch(38.1% 0.176 304.987);
96
+ --color-fuchsia-50: oklch(97.7% 0.017 320.058);
94
97
  --color-fuchsia-100: oklch(95.2% 0.037 318.852);
95
98
  --color-fuchsia-200: oklch(90.3% 0.076 319.62);
96
99
  --color-fuchsia-300: oklch(83.3% 0.145 321.434);
@@ -484,12 +487,6 @@
484
487
  .z-100 {
485
488
  z-index: 100;
486
489
  }
487
- .z-\[100\] {
488
- z-index: 100;
489
- }
490
- .z-\[101\] {
491
- z-index: 101;
492
- }
493
490
  .col-span-2 {
494
491
  grid-column: span 2 / span 2;
495
492
  }
@@ -538,6 +535,9 @@
538
535
  .mx-2 {
539
536
  margin-inline: calc(var(--spacing) * 2);
540
537
  }
538
+ .mx-4 {
539
+ margin-inline: calc(var(--spacing) * 4);
540
+ }
541
541
  .mx-auto {
542
542
  margin-inline: auto;
543
543
  }
@@ -616,6 +616,9 @@
616
616
  .mr-16 {
617
617
  margin-right: calc(var(--spacing) * 16);
618
618
  }
619
+ .-mb-4 {
620
+ margin-bottom: calc(var(--spacing) * -4);
621
+ }
619
622
  .-mb-px {
620
623
  margin-bottom: -1px;
621
624
  }
@@ -806,6 +809,9 @@
806
809
  .h-\[37px\] {
807
810
  height: 37px;
808
811
  }
812
+ .h-auto {
813
+ height: auto;
814
+ }
809
815
  .h-full {
810
816
  height: 100%;
811
817
  }
@@ -827,9 +833,15 @@
827
833
  .max-h-96 {
828
834
  max-height: calc(var(--spacing) * 96);
829
835
  }
836
+ .max-h-\[80vh\] {
837
+ max-height: 80vh;
838
+ }
830
839
  .max-h-\[90vh\] {
831
840
  max-height: 90vh;
832
841
  }
842
+ .max-h-\[200px\] {
843
+ max-height: 200px;
844
+ }
833
845
  .max-h-\[calc\(90vh-140px\)\] {
834
846
  max-height: calc(90vh - 140px);
835
847
  }
@@ -902,6 +914,9 @@
902
914
  .w-80 {
903
915
  width: calc(var(--spacing) * 80);
904
916
  }
917
+ .w-auto {
918
+ width: auto;
919
+ }
905
920
  .w-full {
906
921
  width: 100%;
907
922
  }
@@ -941,6 +956,9 @@
941
956
  .max-w-\[140px\] {
942
957
  max-width: 140px;
943
958
  }
959
+ .max-w-\[200px\] {
960
+ max-width: 200px;
961
+ }
944
962
  .max-w-\[400px\] {
945
963
  max-width: 400px;
946
964
  }
@@ -953,12 +971,18 @@
953
971
  .max-w-lg {
954
972
  max-width: var(--container-lg);
955
973
  }
974
+ .max-w-md {
975
+ max-width: var(--container-md);
976
+ }
956
977
  .max-w-none {
957
978
  max-width: none;
958
979
  }
959
980
  .max-w-sm {
960
981
  max-width: var(--container-sm);
961
982
  }
983
+ .max-w-xl {
984
+ max-width: var(--container-xl);
985
+ }
962
986
  .max-w-xs {
963
987
  max-width: var(--container-xs);
964
988
  }
@@ -1087,6 +1111,9 @@
1087
1111
  .-rotate-12 {
1088
1112
  rotate: calc(12deg * -1);
1089
1113
  }
1114
+ .-rotate-90 {
1115
+ rotate: calc(90deg * -1);
1116
+ }
1090
1117
  .rotate-12 {
1091
1118
  rotate: 12deg;
1092
1119
  }
@@ -1123,6 +1150,9 @@
1123
1150
  .cursor-text {
1124
1151
  cursor: text;
1125
1152
  }
1153
+ .cursor-zoom-in {
1154
+ cursor: zoom-in;
1155
+ }
1126
1156
  .resize {
1127
1157
  resize: both;
1128
1158
  }
@@ -1445,6 +1475,9 @@
1445
1475
  --tw-border-style: none;
1446
1476
  border-style: none;
1447
1477
  }
1478
+ .border-blue-100 {
1479
+ border-color: var(--color-blue-100);
1480
+ }
1448
1481
  .border-blue-200 {
1449
1482
  border-color: var(--color-blue-200);
1450
1483
  }
@@ -1484,6 +1517,9 @@
1484
1517
  .border-green-200 {
1485
1518
  border-color: var(--color-green-200);
1486
1519
  }
1520
+ .border-green-300 {
1521
+ border-color: var(--color-green-300);
1522
+ }
1487
1523
  .border-green-400 {
1488
1524
  border-color: var(--color-green-400);
1489
1525
  }
@@ -1604,6 +1640,9 @@
1604
1640
  .bg-cyan-600 {
1605
1641
  background-color: var(--color-cyan-600);
1606
1642
  }
1643
+ .bg-fuchsia-50 {
1644
+ background-color: var(--color-fuchsia-50);
1645
+ }
1607
1646
  .bg-fuchsia-100 {
1608
1647
  background-color: var(--color-fuchsia-100);
1609
1648
  }
@@ -1622,6 +1661,12 @@
1622
1661
  background-color: color-mix(in oklab, var(--color-gray-50) 30%, transparent);
1623
1662
  }
1624
1663
  }
1664
+ .bg-gray-50\/50 {
1665
+ background-color: color-mix(in srgb, oklch(98.5% 0.002 247.839) 50%, transparent);
1666
+ @supports (color: color-mix(in lab, red, red)) {
1667
+ background-color: color-mix(in oklab, var(--color-gray-50) 50%, transparent);
1668
+ }
1669
+ }
1625
1670
  .bg-gray-100 {
1626
1671
  background-color: var(--color-gray-100);
1627
1672
  }
@@ -1811,6 +1856,10 @@
1811
1856
  --tw-gradient-from: transparent;
1812
1857
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
1813
1858
  }
1859
+ .from-white {
1860
+ --tw-gradient-from: var(--color-white);
1861
+ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
1862
+ }
1814
1863
  .from-yellow-200 {
1815
1864
  --tw-gradient-from: var(--color-yellow-200);
1816
1865
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
@@ -2093,6 +2142,12 @@
2093
2142
  .pl-5 {
2094
2143
  padding-left: calc(var(--spacing) * 5);
2095
2144
  }
2145
+ .pl-6 {
2146
+ padding-left: calc(var(--spacing) * 6);
2147
+ }
2148
+ .pl-7 {
2149
+ padding-left: calc(var(--spacing) * 7);
2150
+ }
2096
2151
  .pl-9 {
2097
2152
  padding-left: calc(var(--spacing) * 9);
2098
2153
  }
@@ -2291,6 +2346,9 @@
2291
2346
  .text-cyan-600 {
2292
2347
  color: var(--color-cyan-600);
2293
2348
  }
2349
+ .text-fuchsia-700 {
2350
+ color: var(--color-fuchsia-700);
2351
+ }
2294
2352
  .text-fuchsia-800 {
2295
2353
  color: var(--color-fuchsia-800);
2296
2354
  }
@@ -2351,6 +2409,12 @@
2351
2409
  .text-indigo-700 {
2352
2410
  color: var(--color-indigo-700);
2353
2411
  }
2412
+ .text-orange-600 {
2413
+ color: var(--color-orange-600);
2414
+ }
2415
+ .text-orange-700 {
2416
+ color: var(--color-orange-700);
2417
+ }
2354
2418
  .text-orange-800 {
2355
2419
  color: var(--color-orange-800);
2356
2420
  }
@@ -2399,12 +2463,6 @@
2399
2463
  .text-white {
2400
2464
  color: var(--color-white);
2401
2465
  }
2402
- .text-white\/70 {
2403
- color: color-mix(in srgb, #fff 70%, transparent);
2404
- @supports (color: color-mix(in lab, red, red)) {
2405
- color: color-mix(in oklab, var(--color-white) 70%, transparent);
2406
- }
2407
- }
2408
2466
  .text-yellow-100 {
2409
2467
  color: var(--color-yellow-100);
2410
2468
  }
@@ -2868,6 +2926,13 @@
2868
2926
  }
2869
2927
  }
2870
2928
  }
2929
+ .group-hover\:text-gray-900 {
2930
+ &:is(:where(.group):hover *) {
2931
+ @media (hover: hover) {
2932
+ color: var(--color-gray-900);
2933
+ }
2934
+ }
2935
+ }
2871
2936
  .group-hover\:opacity-75 {
2872
2937
  &:is(:where(.group):hover *) {
2873
2938
  @media (hover: hover) {
@@ -3222,6 +3287,13 @@
3222
3287
  }
3223
3288
  }
3224
3289
  }
3290
+ .hover\:bg-fuchsia-100 {
3291
+ &:hover {
3292
+ @media (hover: hover) {
3293
+ background-color: var(--color-fuchsia-100);
3294
+ }
3295
+ }
3296
+ }
3225
3297
  .hover\:bg-fuchsia-600 {
3226
3298
  &:hover {
3227
3299
  @media (hover: hover) {
@@ -3558,17 +3630,17 @@
3558
3630
  }
3559
3631
  }
3560
3632
  }
3561
- .hover\:text-white {
3633
+ .hover\:underline {
3562
3634
  &:hover {
3563
3635
  @media (hover: hover) {
3564
- color: var(--color-white);
3636
+ text-decoration-line: underline;
3565
3637
  }
3566
3638
  }
3567
3639
  }
3568
- .hover\:underline {
3640
+ .hover\:opacity-90 {
3569
3641
  &:hover {
3570
3642
  @media (hover: hover) {
3571
- text-decoration-line: underline;
3643
+ opacity: 90%;
3572
3644
  }
3573
3645
  }
3574
3646
  }
@@ -4253,6 +4325,11 @@
4253
4325
  flex-direction: row;
4254
4326
  }
4255
4327
  }
4328
+ .md\:items-center {
4329
+ @media (width >= 48rem) {
4330
+ align-items: center;
4331
+ }
4332
+ }
4256
4333
  .md\:gap-10 {
4257
4334
  @media (width >= 48rem) {
4258
4335
  gap: calc(var(--spacing) * 10);
@@ -4730,6 +4807,14 @@
4730
4807
  background-color: var(--color-cyan-600);
4731
4808
  }
4732
4809
  }
4810
+ .dark\:bg-fuchsia-900\/20 {
4811
+ &:where(.dark, .dark *) {
4812
+ background-color: color-mix(in srgb, oklch(40.1% 0.17 325.612) 20%, transparent);
4813
+ @supports (color: color-mix(in lab, red, red)) {
4814
+ background-color: color-mix(in oklab, var(--color-fuchsia-900) 20%, transparent);
4815
+ }
4816
+ }
4817
+ }
4733
4818
  .dark\:bg-fuchsia-900\/40 {
4734
4819
  &:where(.dark, .dark *) {
4735
4820
  background-color: color-mix(in srgb, oklch(40.1% 0.17 325.612) 40%, transparent);
@@ -4831,6 +4916,14 @@
4831
4916
  background-color: var(--color-green-900);
4832
4917
  }
4833
4918
  }
4919
+ .dark\:bg-green-900\/20 {
4920
+ &:where(.dark, .dark *) {
4921
+ background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 20%, transparent);
4922
+ @supports (color: color-mix(in lab, red, red)) {
4923
+ background-color: color-mix(in oklab, var(--color-green-900) 20%, transparent);
4924
+ }
4925
+ }
4926
+ }
4834
4927
  .dark\:bg-green-900\/30 {
4835
4928
  &:where(.dark, .dark *) {
4836
4929
  background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 30%, transparent);
@@ -4880,6 +4973,14 @@
4880
4973
  background-color: var(--color-orange-900);
4881
4974
  }
4882
4975
  }
4976
+ .dark\:bg-orange-900\/50 {
4977
+ &:where(.dark, .dark *) {
4978
+ background-color: color-mix(in srgb, oklch(40.8% 0.123 38.172) 50%, transparent);
4979
+ @supports (color: color-mix(in lab, red, red)) {
4980
+ background-color: color-mix(in oklab, var(--color-orange-900) 50%, transparent);
4981
+ }
4982
+ }
4983
+ }
4883
4984
  .dark\:bg-purple-600 {
4884
4985
  &:where(.dark, .dark *) {
4885
4986
  background-color: var(--color-purple-600);
@@ -4979,6 +5080,12 @@
4979
5080
  --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
4980
5081
  }
4981
5082
  }
5083
+ .dark\:from-gray-800 {
5084
+ &:where(.dark, .dark *) {
5085
+ --tw-gradient-from: var(--color-gray-800);
5086
+ --tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
5087
+ }
5088
+ }
4982
5089
  .dark\:from-green-900\/20 {
4983
5090
  &:where(.dark, .dark *) {
4984
5091
  --tw-gradient-from: color-mix(in srgb, oklch(39.3% 0.095 152.535) 20%, transparent);
@@ -5175,6 +5282,16 @@
5175
5282
  color: var(--color-orange-200);
5176
5283
  }
5177
5284
  }
5285
+ .dark\:text-orange-300 {
5286
+ &:where(.dark, .dark *) {
5287
+ color: var(--color-orange-300);
5288
+ }
5289
+ }
5290
+ .dark\:text-orange-400 {
5291
+ &:where(.dark, .dark *) {
5292
+ color: var(--color-orange-400);
5293
+ }
5294
+ }
5178
5295
  .dark\:text-purple-100 {
5179
5296
  &:where(.dark, .dark *) {
5180
5297
  color: var(--color-purple-100);
@@ -5225,6 +5342,11 @@
5225
5342
  color: var(--color-white);
5226
5343
  }
5227
5344
  }
5345
+ .dark\:text-yellow-400 {
5346
+ &:where(.dark, .dark *) {
5347
+ color: var(--color-yellow-400);
5348
+ }
5349
+ }
5228
5350
  .dark\:placeholder-gray-400 {
5229
5351
  &:where(.dark, .dark *) {
5230
5352
  &::placeholder {
@@ -5285,6 +5407,15 @@
5285
5407
  }
5286
5408
  }
5287
5409
  }
5410
+ .dark\:group-hover\:text-gray-100 {
5411
+ &:where(.dark, .dark *) {
5412
+ &:is(:where(.group):hover *) {
5413
+ @media (hover: hover) {
5414
+ color: var(--color-gray-100);
5415
+ }
5416
+ }
5417
+ }
5418
+ }
5288
5419
  .dark\:group-hover\:text-gray-500 {
5289
5420
  &:where(.dark, .dark *) {
5290
5421
  &:is(:where(.group):hover *) {
@@ -5445,6 +5576,18 @@
5445
5576
  }
5446
5577
  }
5447
5578
  }
5579
+ .dark\:hover\:bg-fuchsia-900\/40 {
5580
+ &:where(.dark, .dark *) {
5581
+ &:hover {
5582
+ @media (hover: hover) {
5583
+ background-color: color-mix(in srgb, oklch(40.1% 0.17 325.612) 40%, transparent);
5584
+ @supports (color: color-mix(in lab, red, red)) {
5585
+ background-color: color-mix(in oklab, var(--color-fuchsia-900) 40%, transparent);
5586
+ }
5587
+ }
5588
+ }
5589
+ }
5590
+ }
5448
5591
  .dark\:hover\:bg-gray-200 {
5449
5592
  &:where(.dark, .dark *) {
5450
5593
  &:hover {
@@ -5532,6 +5675,18 @@
5532
5675
  }
5533
5676
  }
5534
5677
  }
5678
+ .dark\:hover\:bg-green-900\/40 {
5679
+ &:where(.dark, .dark *) {
5680
+ &:hover {
5681
+ @media (hover: hover) {
5682
+ background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 40%, transparent);
5683
+ @supports (color: color-mix(in lab, red, red)) {
5684
+ background-color: color-mix(in oklab, var(--color-green-900) 40%, transparent);
5685
+ }
5686
+ }
5687
+ }
5688
+ }
5689
+ }
5535
5690
  .dark\:hover\:bg-indigo-700 {
5536
5691
  &:where(.dark, .dark *) {
5537
5692
  &:hover {
@@ -6231,6 +6386,35 @@
6231
6386
  overflow-x: auto;
6232
6387
  padding: 1em;
6233
6388
  }
6389
+ .tool-description pre {
6390
+ background-color: #f8fafc !important;
6391
+ color: #1f2937 !important;
6392
+ border: 1px solid #e2e8f0;
6393
+ border-radius: 0.5rem;
6394
+ padding: 0.75rem 1rem;
6395
+ margin: 0.75rem 0;
6396
+ overflow-x: auto;
6397
+ }
6398
+ .tool-description code {
6399
+ color: inherit !important;
6400
+ }
6401
+ .tool-description code.hljs {
6402
+ background: transparent !important;
6403
+ padding: 0;
6404
+ font-size: 0.85em;
6405
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
6406
+ }
6407
+ .dark .tool-description pre {
6408
+ background-color: #1f2937 !important;
6409
+ border-color: #374151;
6410
+ color: #e5e7eb !important;
6411
+ }
6412
+ .dark .tool-description code {
6413
+ color: inherit !important;
6414
+ }
6415
+ .dark .tool-description code.hljs {
6416
+ color: #e5e7eb;
6417
+ }
6234
6418
  .message pre {
6235
6419
  max-width: 100%;
6236
6420
  min-width: auto;
@@ -6429,21 +6613,33 @@
6429
6613
  .message pre {
6430
6614
  max-width: 500px !important;
6431
6615
  }
6616
+ .has-iframes {
6617
+ min-width: 640px;
6618
+ }
6432
6619
  }
6433
6620
  @media (min-width: 768px) {
6434
6621
  .message pre {
6435
6622
  max-width: 600px !important;
6436
6623
  }
6624
+ .has-iframes {
6625
+ min-width: 640px;
6626
+ }
6437
6627
  }
6438
6628
  @media (min-width: 1024px) {
6439
6629
  .message pre, .message .prose pre {
6440
6630
  max-width: 700px !important;
6441
6631
  }
6632
+ .has-iframes {
6633
+ min-width: 740px;
6634
+ }
6442
6635
  }
6443
6636
  @media (min-width: 1280px) {
6444
6637
  .message pre, .message .prose pre {
6445
6638
  max-width: 800px !important;
6446
6639
  }
6640
+ .has-iframes {
6641
+ min-width: 840px;
6642
+ }
6447
6643
  }
6448
6644
  }
6449
6645
  @property --tw-border-spacing-x {
llms/ui/ctx.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  import { reactive, markRaw } from 'vue'
3
3
  import { EventBus, humanize, combinePaths } from "@servicestack/client"
4
- import { storageObject } from './utils.mjs'
4
+ import { storageObject, isHtml } from './utils.mjs'
5
5
 
6
6
  export class ExtensionScope {
7
7
  constructor(ctx, id) {
@@ -174,7 +174,8 @@ export class AppContext {
174
174
  async init() {
175
175
  Object.assign(this.state, await this.ai.init(this))
176
176
  Object.assign(this.fmt, {
177
- markdown: this.renderMarkdown.bind(this)
177
+ markdown: this.renderMarkdown.bind(this),
178
+ content: this.renderContent.bind(this),
178
179
  })
179
180
  }
180
181
  setGlobals(globals) {
@@ -334,6 +335,9 @@ export class AppContext {
334
335
  this.state.error = null
335
336
  }
336
337
 
338
+ resolveUrl(url) {
339
+ return this.ai.resolveUrl(url)
340
+ }
337
341
  async getJson(url, options) {
338
342
  return await this.ai.getJson(url, options)
339
343
  }
@@ -396,4 +400,13 @@ export class AppContext {
396
400
  // }
397
401
  return this.marked.parse(content || '')
398
402
  }
399
- }
403
+
404
+ renderContent(content) {
405
+ // Check for HTML tags to detect HTML content
406
+ if (isHtml(content)) {
407
+ // If this is HTML content, return it in an iframe so it doesn't break the page
408
+ return `<iframe src="data:text/html;charset=utf-8,${encodeURIComponent(content)}"></iframe>`
409
+ }
410
+ return this.renderMarkdown(content)
411
+ }
412
+ }
llms/ui/index.mjs CHANGED
@@ -9,7 +9,7 @@ import ChatModule from './modules/chat/index.mjs'
9
9
  import ModelSelectorModule from './modules/model-selector.mjs'
10
10
  import IconsModule from './modules/icons.mjs'
11
11
  import { utilsFunctions, utilsFormatters } from './utils.mjs'
12
- import { marked, markdownFormatters } from './markdown.mjs'
12
+ import { marked } from './markdown.mjs'
13
13
  import { AppContext } from './ctx.mjs'
14
14
 
15
15
  const Components = {