pinokiod 7.3.10 → 7.3.12

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 (51) hide show
  1. package/kernel/bin/brew.js +12 -2
  2. package/kernel/bin/caddy.js +24 -20
  3. package/kernel/bin/huggingface.js +2 -2
  4. package/kernel/bin/setup.js +2 -3
  5. package/kernel/bin/uv.js +13 -6
  6. package/kernel/connect/index.js +5 -1
  7. package/kernel/connect/providers/huggingface/index.js +213 -75
  8. package/kernel/environment.js +16 -1
  9. package/kernel/router/localhost_home_router.js +7 -0
  10. package/kernel/shell.js +1 -5
  11. package/kernel/util.js +1 -0
  12. package/package.json +1 -1
  13. package/server/index.js +75 -33
  14. package/server/public/common.js +45 -71
  15. package/server/public/install.js +20 -2
  16. package/server/public/layout.js +1 -1
  17. package/server/public/style.css +1432 -511
  18. package/server/public/tab-link-popover.css +162 -18
  19. package/server/public/tab-link-popover.js +230 -21
  20. package/server/public/task-launcher.css +121 -84
  21. package/server/public/terminal-settings.js +121 -45
  22. package/server/public/universal-launcher.css +42 -33
  23. package/server/public/urldropdown.css +284 -0
  24. package/server/views/app.ejs +1608 -321
  25. package/server/views/autolaunch.ejs +4 -5
  26. package/server/views/checkpoints.ejs +223 -50
  27. package/server/views/connect/huggingface.ejs +406 -325
  28. package/server/views/connect.ejs +0 -1
  29. package/server/views/github.ejs +277 -324
  30. package/server/views/index.ejs +53 -1
  31. package/server/views/install.ejs +119 -19
  32. package/server/views/logs.ejs +10 -9
  33. package/server/views/net.ejs +341 -64
  34. package/server/views/network.ejs +85 -63
  35. package/server/views/partials/main_sidebar.ejs +237 -12
  36. package/server/views/plugins.ejs +141 -3
  37. package/server/views/settings.ejs +103 -7
  38. package/server/views/setup.ejs +0 -5
  39. package/server/views/skills.ejs +0 -1
  40. package/server/views/task_list.ejs +0 -1
  41. package/server/views/terminal.ejs +142 -1
  42. package/server/views/terminals.ejs +346 -6
  43. package/server/views/tools.ejs +828 -1691
  44. package/test/caddy-install.test.js +53 -0
  45. package/test/connect-setup.test.js +16 -0
  46. package/test/github-connection.test.js +1 -1
  47. package/test/huggingface-bin.test.js +4 -4
  48. package/test/huggingface-connect.test.js +73 -0
  49. package/test/main-sidebar.test.js +31 -0
  50. package/test/shell-run-template.test.js +5 -1
  51. package/test/uv-bin.test.js +29 -0
@@ -105,15 +105,15 @@ body.dark.connect-page.task-launcher-page::before {
105
105
  body.plugin-detail-page .swal2-popup.pinokio-modern-modal {
106
106
  padding: 0 !important;
107
107
  border: 1px solid var(--task-border) !important;
108
- border-radius: 14px !important;
108
+ border-radius: 8px !important;
109
109
  background: var(--task-panel) !important;
110
- box-shadow: 0 26px 72px rgba(15, 23, 42, 0.22) !important;
110
+ box-shadow: 0 18px 50px rgba(15, 23, 42, 0.16) !important;
111
111
  color: var(--task-text) !important;
112
112
  overflow: hidden !important;
113
113
  }
114
114
 
115
115
  body.dark.plugin-detail-page .swal2-popup.pinokio-modern-modal {
116
- box-shadow: 0 30px 84px rgba(0, 0, 0, 0.46) !important;
116
+ box-shadow: 0 24px 72px rgba(0, 0, 0, 0.42) !important;
117
117
  }
118
118
 
119
119
  body.plugin-detail-page .swal2-popup.pinokio-modern-modal .swal2-html-container.pinokio-modern-html {
@@ -127,16 +127,16 @@ body.plugin-detail-page .swal2-popup.pinokio-modern-modal .swal2-html-container.
127
127
  }
128
128
 
129
129
  body.plugin-detail-page .pinokio-modern-close.swal2-close {
130
- top: 14px !important;
131
- right: 14px !important;
132
- width: 36px;
133
- height: 36px;
130
+ top: 12px !important;
131
+ right: 12px !important;
132
+ width: 28px;
133
+ height: 28px;
134
134
  margin: 0;
135
135
  border: 1px solid var(--task-border);
136
- border-radius: 10px;
137
- background: color-mix(in srgb, var(--task-panel) 94%, var(--task-soft));
136
+ border-radius: 6px;
137
+ background: transparent;
138
138
  color: var(--task-muted) !important;
139
- font-size: 30px;
139
+ font-size: 22px;
140
140
  line-height: 1;
141
141
  }
142
142
 
@@ -156,23 +156,23 @@ body.plugin-detail-page .pinokio-modal-surface {
156
156
  body.plugin-detail-page .pinokio-modal-header {
157
157
  display: flex;
158
158
  align-items: flex-start;
159
- gap: 12px;
160
- padding: 18px 20px 14px;
159
+ gap: 10px;
160
+ padding: 14px;
161
161
  border-bottom: 1px solid var(--task-border);
162
162
  }
163
163
 
164
164
  body.plugin-detail-page .pinokio-modal-icon {
165
- width: 38px;
166
- height: 38px;
165
+ width: 32px;
166
+ height: 32px;
167
167
  flex: 0 0 auto;
168
168
  display: inline-flex;
169
169
  align-items: center;
170
170
  justify-content: center;
171
171
  border: 1px solid var(--task-border);
172
- border-radius: 10px;
172
+ border-radius: 7px;
173
173
  background: color-mix(in srgb, var(--task-panel) 92%, var(--task-soft));
174
- color: var(--task-accent);
175
- font-size: 15px;
174
+ color: var(--task-muted);
175
+ font-size: 14px;
176
176
  }
177
177
 
178
178
  body.plugin-detail-page .pinokio-modal-heading {
@@ -183,9 +183,9 @@ body.plugin-detail-page .pinokio-modal-heading {
183
183
  }
184
184
 
185
185
  body.plugin-detail-page .pinokio-modal-title {
186
- font-size: 15px;
186
+ font-size: 16px;
187
187
  line-height: 1.25;
188
- font-weight: 700;
188
+ font-weight: 600;
189
189
  color: var(--task-text);
190
190
  }
191
191
 
@@ -197,7 +197,7 @@ body.plugin-detail-page .pinokio-modal-subtitle {
197
197
 
198
198
  body.plugin-detail-page .pinokio-modal-body,
199
199
  body.plugin-detail-page .pinokio-modal-body--iframe {
200
- padding: 16px 20px 20px;
200
+ padding: 12px 14px 14px;
201
201
  background: transparent;
202
202
  }
203
203
 
@@ -207,7 +207,7 @@ body.plugin-detail-page .pinokio-modal-body--iframe iframe {
207
207
  height: min(64vh, 540px);
208
208
  min-height: 360px;
209
209
  border: 1px solid var(--task-border);
210
- border-radius: 12px;
210
+ border-radius: 7px;
211
211
  background: color-mix(in srgb, var(--task-panel) 90%, var(--task-soft));
212
212
  }
213
213
 
@@ -235,28 +235,30 @@ body.plugin-detail-page .pinokio-modal-body--iframe iframe {
235
235
  }
236
236
 
237
237
  .task-library-page .task-shell-header {
238
- padding: 0 28px 12px;
238
+ padding: 12px 18px 14px;
239
239
  }
240
240
 
241
241
  .task-library-page .task-title {
242
- font-size: clamp(28px, 3.2vw, 38px);
242
+ font-size: 22px;
243
+ line-height: 1.12;
244
+ letter-spacing: 0;
243
245
  }
244
246
 
245
247
  .task-library-page .task-description {
246
- margin-top: 6px;
248
+ margin-top: 4px;
247
249
  font-size: 12px;
248
- line-height: 1.45;
250
+ line-height: 1.4;
249
251
  }
250
252
 
251
253
  .task-container {
252
254
  flex: 1;
253
255
  min-width: 0;
254
- padding: 20px 28px 32px;
256
+ padding: 0;
255
257
  box-sizing: border-box;
256
258
  }
257
259
 
258
260
  body.task-page .task-shell {
259
- width: min(980px, 100%);
261
+ width: 100%;
260
262
  margin: 0;
261
263
  background: transparent;
262
264
  border: 0;
@@ -314,27 +316,28 @@ body.task-page .task-shell {
314
316
  }
315
317
 
316
318
  body.plugin-page .task-shell {
317
- width: min(1140px, 100%);
319
+ width: 100%;
318
320
  }
319
321
 
320
322
  body.connect-page .task-shell {
321
- width: min(980px, 100%);
323
+ width: 100%;
322
324
  }
323
325
 
324
326
  .task-shell-header {
325
327
  position: static;
326
328
  top: auto;
327
329
  z-index: auto;
328
- padding: 4px 28px 18px;
330
+ padding: 12px 18px 14px;
329
331
  display: grid;
330
332
  grid-template-columns: minmax(0, 1fr) auto;
331
- gap: 20px 24px;
332
- align-items: flex-start;
333
+ gap: 16px 24px;
334
+ align-items: center;
333
335
  border-bottom: 1px solid var(--task-border);
334
336
  }
335
337
 
336
338
  .task-shell-header .task-title {
337
339
  display: block;
340
+ margin: 0;
338
341
  padding: 0;
339
342
  }
340
343
 
@@ -359,15 +362,15 @@ body.connect-page .task-shell {
359
362
  align-items: center;
360
363
  justify-content: flex-start;
361
364
  gap: 12px;
362
- margin-bottom: 6px;
365
+ margin-bottom: 4px;
363
366
  }
364
367
 
365
368
  .task-eyebrow {
366
369
  margin: 0;
367
370
  color: var(--task-accent);
368
- font-size: 11px;
371
+ font-size: 10px;
369
372
  font-weight: 700;
370
- letter-spacing: 0.12em;
373
+ letter-spacing: 0.08em;
371
374
  text-transform: uppercase;
372
375
  }
373
376
 
@@ -387,9 +390,10 @@ body.connect-page .task-shell {
387
390
 
388
391
  .task-title {
389
392
  margin: 0;
390
- font-size: clamp(26px, 3vw, 34px);
391
- line-height: 1.08;
392
- letter-spacing: -0.045em;
393
+ font-size: 22px;
394
+ line-height: 1.12;
395
+ letter-spacing: 0;
396
+ font-weight: 760;
393
397
  }
394
398
 
395
399
  .task-detail-page .task-title {
@@ -398,10 +402,14 @@ body.connect-page .task-shell {
398
402
  }
399
403
 
400
404
  .task-description {
401
- margin: 10px 0 0;
405
+ margin: 4px 0 0;
402
406
  color: var(--task-muted);
403
- font-size: 14px;
404
- line-height: 1.55;
407
+ font-size: 12px;
408
+ line-height: 1.4;
409
+ }
410
+
411
+ body.task-page .task-shell-header .task-description {
412
+ max-width: none;
405
413
  }
406
414
 
407
415
  .task-header-badges {
@@ -488,7 +496,7 @@ body.connect-page .task-shell {
488
496
  }
489
497
 
490
498
  .task-shell-body {
491
- padding: 12px 28px 12px;
499
+ padding: 28px 28px 32px;
492
500
  display: grid;
493
501
  gap: 0;
494
502
  }
@@ -1628,43 +1636,45 @@ body.dark .task-link-button.danger {
1628
1636
  }
1629
1637
 
1630
1638
  .setup-shell {
1631
- width: min(1080px, 100%);
1639
+ width: 100%;
1632
1640
  }
1633
1641
 
1634
1642
  body.setup-page .task-shell-header {
1635
- padding-bottom: 16px;
1643
+ padding-bottom: 14px;
1636
1644
  }
1637
1645
 
1638
1646
  body.setup-page .task-shell-header-main {
1639
1647
  max-width: 820px;
1640
1648
  }
1641
1649
 
1642
- body.setup-page .task-eyebrow {
1643
- color: var(--task-muted);
1644
- letter-spacing: 0;
1645
- }
1646
-
1647
1650
  body.setup-page .task-title {
1648
- font-size: clamp(24px, 2.4vw, 30px);
1649
- line-height: 1.1;
1651
+ font-size: 22px;
1652
+ line-height: 1.12;
1650
1653
  letter-spacing: 0;
1654
+ font-weight: 760;
1651
1655
  }
1652
1656
 
1653
1657
  body.setup-page .task-description {
1654
1658
  max-width: 76ch;
1655
- font-size: 13px;
1656
- line-height: 1.5;
1659
+ font-size: 12px;
1660
+ line-height: 1.4;
1657
1661
  }
1658
1662
 
1659
1663
  body.setup-page .task-badge {
1660
1664
  min-height: 22px;
1661
1665
  border-radius: 7px;
1666
+ background: transparent;
1662
1667
  }
1663
1668
 
1664
1669
  body.setup-page .task-badge-warning {
1665
- border-color: color-mix(in srgb, var(--task-accent) 20%, var(--task-border));
1666
- background: color-mix(in srgb, var(--task-accent) 7%, var(--task-panel));
1667
- color: color-mix(in srgb, var(--task-accent) 58%, var(--task-text));
1670
+ border-color: rgba(180, 83, 9, 0.26);
1671
+ background: transparent;
1672
+ color: #92400e;
1673
+ }
1674
+
1675
+ body.dark.setup-page .task-badge-warning {
1676
+ border-color: rgba(251, 191, 36, 0.28);
1677
+ color: #f5d69a;
1668
1678
  }
1669
1679
 
1670
1680
  .setup-layout {
@@ -1682,7 +1692,9 @@ body.setup-page .task-badge-warning {
1682
1692
 
1683
1693
  .setup-requirement-list {
1684
1694
  display: grid;
1685
- gap: 8px;
1695
+ gap: 0;
1696
+ border-top: 1px solid var(--task-border);
1697
+ border-bottom: 1px solid var(--task-border);
1686
1698
  }
1687
1699
 
1688
1700
  .setup-requirement-row {
@@ -1690,15 +1702,18 @@ body.setup-page .task-badge-warning {
1690
1702
  grid-template-columns: minmax(0, 1fr) auto;
1691
1703
  gap: 14px;
1692
1704
  align-items: center;
1693
- padding: 11px 12px;
1694
- border: 1px solid var(--task-border);
1695
- border-radius: 8px;
1696
- background: color-mix(in srgb, var(--task-panel) 97%, var(--task-soft));
1705
+ padding: 12px 0;
1706
+ border: 0;
1707
+ border-top: 1px solid var(--task-border);
1708
+ background: transparent;
1697
1709
  }
1698
1710
 
1699
1711
  .setup-requirement-row.needs-update {
1700
- border-color: var(--task-border-strong);
1701
- background: color-mix(in srgb, var(--task-panel) 95%, var(--task-soft));
1712
+ background: transparent;
1713
+ }
1714
+
1715
+ .setup-requirement-row:first-child {
1716
+ border-top: 0;
1702
1717
  }
1703
1718
 
1704
1719
  .setup-requirement-copy {
@@ -1726,9 +1741,9 @@ body.setup-page .task-badge-warning {
1726
1741
  justify-content: center;
1727
1742
  gap: 6px;
1728
1743
  min-height: 26px;
1729
- padding: 0 9px;
1730
- border: 1px solid var(--task-border);
1731
- border-radius: 7px;
1744
+ padding: 0;
1745
+ border: 0;
1746
+ border-radius: 0;
1732
1747
  background: transparent;
1733
1748
  color: var(--task-muted);
1734
1749
  font-size: 10px;
@@ -1742,14 +1757,15 @@ body.setup-page .task-badge-warning {
1742
1757
  }
1743
1758
 
1744
1759
  .setup-requirement-row.is-installed .setup-requirement-state {
1745
- border-color: color-mix(in srgb, var(--task-border) 72%, transparent);
1746
- color: var(--task-text);
1760
+ color: var(--task-muted);
1747
1761
  }
1748
1762
 
1749
1763
  .setup-requirement-row.needs-update .setup-requirement-state {
1750
- border-color: color-mix(in srgb, var(--task-accent) 22%, var(--task-border-strong));
1751
- background: color-mix(in srgb, var(--task-accent) 6%, var(--task-panel));
1752
- color: color-mix(in srgb, var(--task-accent) 56%, var(--task-text));
1764
+ color: #92400e;
1765
+ }
1766
+
1767
+ body.dark .setup-requirement-row.needs-update .setup-requirement-state {
1768
+ color: #f5d69a;
1753
1769
  }
1754
1770
 
1755
1771
  .setup-actions-column {
@@ -1767,12 +1783,31 @@ body.setup-page .task-badge-warning {
1767
1783
  }
1768
1784
 
1769
1785
  .setup-summary-grid {
1770
- margin-top: 4px;
1786
+ display: grid;
1787
+ grid-template-columns: 1fr;
1788
+ gap: 7px;
1789
+ margin-top: 6px;
1771
1790
  }
1772
1791
 
1773
1792
  .setup-summary-grid .task-meta-chip {
1774
- border-radius: 8px;
1775
- background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
1793
+ display: flex;
1794
+ align-items: baseline;
1795
+ justify-content: space-between;
1796
+ gap: 14px;
1797
+ padding: 0;
1798
+ border: 0;
1799
+ border-radius: 0;
1800
+ background: transparent;
1801
+ }
1802
+
1803
+ .setup-summary-grid .task-meta-chip-label {
1804
+ margin-bottom: 0;
1805
+ letter-spacing: 0.04em;
1806
+ }
1807
+
1808
+ .setup-summary-grid .task-meta-chip-value {
1809
+ font-size: 12px;
1810
+ color: var(--task-text);
1776
1811
  }
1777
1812
 
1778
1813
  .setup-primary-button {
@@ -1835,10 +1870,12 @@ body.setup-page .task-badge-warning {
1835
1870
  display: flex;
1836
1871
  align-items: center;
1837
1872
  gap: 14px;
1838
- padding: 16px;
1839
- border: 1px solid var(--task-border);
1840
- border-radius: 10px;
1841
- background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
1873
+ padding: 16px 0;
1874
+ border: 0;
1875
+ border-top: 1px solid var(--task-border);
1876
+ border-bottom: 1px solid var(--task-border);
1877
+ border-radius: 0;
1878
+ background: transparent;
1842
1879
  box-sizing: border-box;
1843
1880
  }
1844
1881
 
@@ -1851,8 +1888,8 @@ body.setup-page .task-badge-warning {
1851
1888
  justify-content: center;
1852
1889
  border: 1px solid var(--task-border);
1853
1890
  border-radius: 8px;
1854
- background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
1855
- color: var(--task-accent);
1891
+ background: transparent;
1892
+ color: var(--task-muted);
1856
1893
  font-size: 14px;
1857
1894
  }
1858
1895
 
@@ -2318,7 +2355,7 @@ body.plugin-page .plugin-card {
2318
2355
  padding: 15px;
2319
2356
  border-radius: 16px;
2320
2357
  border: 1px solid var(--task-border);
2321
- background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
2358
+ background: transparent;
2322
2359
  color: var(--task-text);
2323
2360
  text-decoration: none;
2324
2361
  transition: background 140ms ease, border-color 140ms ease, transform 140ms ease;
@@ -2326,7 +2363,7 @@ body.plugin-page .plugin-card {
2326
2363
 
2327
2364
  body.plugin-page .plugin-card:hover,
2328
2365
  body.plugin-page .plugin-card:focus-within {
2329
- background: color-mix(in srgb, var(--task-panel) 88%, var(--task-soft));
2366
+ background: color-mix(in srgb, var(--task-text) 5%, transparent);
2330
2367
  border-color: var(--task-border-strong);
2331
2368
  transform: translateY(-1px);
2332
2369
  }
@@ -2338,7 +2375,7 @@ body.plugin-page .plugin-card .plugin-icon {
2338
2375
  border-radius: 12px;
2339
2376
  object-fit: cover;
2340
2377
  flex-shrink: 0;
2341
- background: color-mix(in srgb, var(--task-panel) 90%, white);
2378
+ background: color-mix(in srgb, var(--task-text) 5%, transparent);
2342
2379
  border: 1px solid var(--task-border);
2343
2380
  }
2344
2381
 
@@ -2415,7 +2452,7 @@ body.plugin-page .plugin-empty {
2415
2452
  padding: 22px;
2416
2453
  border-radius: 16px;
2417
2454
  border: 1px dashed var(--task-border-strong);
2418
- background: color-mix(in srgb, var(--task-panel) 96%, var(--task-soft));
2455
+ background: transparent;
2419
2456
  }
2420
2457
 
2421
2458
  body.plugin-page .plugin-install-trigger {
@@ -132,26 +132,6 @@
132
132
  }
133
133
 
134
134
  shouldPreferModalInput() {
135
- if (typeof navigator !== 'undefined') {
136
- try {
137
- if (navigator.userAgentData && typeof navigator.userAgentData.mobile === 'boolean') {
138
- if (navigator.userAgentData.mobile) {
139
- return true;
140
- }
141
- }
142
- } catch (_) {}
143
- const ua = navigator.userAgent || '';
144
- if (/Mobi|Android|iPhone|iPad|Tablet/i.test(ua)) {
145
- return true;
146
- }
147
- const platform = navigator.platform || '';
148
- const maxTouchPoints = typeof navigator.maxTouchPoints === 'number'
149
- ? navigator.maxTouchPoints
150
- : 0;
151
- if (/Mac/i.test(platform) && maxTouchPoints > 1) {
152
- return true;
153
- }
154
- }
155
135
  return false;
156
136
  }
157
137
 
@@ -651,41 +631,134 @@
651
631
  return;
652
632
  }
653
633
  const tracker = {
654
- lastTime: 0,
655
- lastX: 0,
656
- lastY: 0,
657
- handler: null,
658
- eventName: this.supportsPointer ? 'pointerdown' : 'touchstart'
634
+ active: false,
635
+ startTime: 0,
636
+ startX: 0,
637
+ startY: 0,
638
+ startScroll: null,
639
+ moved: false,
640
+ handlers: []
659
641
  };
660
- const handlePointerDown = (event) => {
642
+ const getScrollSnapshot = () => {
643
+ const viewport = node.querySelector('.xterm-viewport');
644
+ const doc = typeof document !== 'undefined' ? document.documentElement : null;
645
+ const body = typeof document !== 'undefined' ? document.body : null;
646
+ return {
647
+ viewportTop: viewport ? viewport.scrollTop : 0,
648
+ viewportLeft: viewport ? viewport.scrollLeft : 0,
649
+ pageTop: typeof window !== 'undefined' ? (window.pageYOffset || doc && doc.scrollTop || body && body.scrollTop || 0) : 0,
650
+ pageLeft: typeof window !== 'undefined' ? (window.pageXOffset || doc && doc.scrollLeft || body && body.scrollLeft || 0) : 0
651
+ };
652
+ };
653
+ const didScrollChange = (start, end) => {
654
+ if (!start || !end) {
655
+ return false;
656
+ }
657
+ return Math.abs(end.viewportTop - start.viewportTop) > 1
658
+ || Math.abs(end.viewportLeft - start.viewportLeft) > 1
659
+ || Math.abs(end.pageTop - start.pageTop) > 1
660
+ || Math.abs(end.pageLeft - start.pageLeft) > 1;
661
+ };
662
+ const resetTracker = () => {
663
+ tracker.active = false;
664
+ tracker.startScroll = null;
665
+ };
666
+ const getTouchPoint = (event, phase) => {
661
667
  if (!event) {
662
- return;
668
+ return null;
669
+ }
670
+ if (event.touches || event.changedTouches) {
671
+ const list = phase === 'end' ? event.changedTouches : event.touches;
672
+ const touch = list && list[0];
673
+ return touch && typeof touch.clientX === 'number' && typeof touch.clientY === 'number'
674
+ ? { x: touch.clientX, y: touch.clientY }
675
+ : null;
676
+ }
677
+ return typeof event.clientX === 'number' && typeof event.clientY === 'number'
678
+ ? { x: event.clientX, y: event.clientY }
679
+ : null;
680
+ };
681
+ const isInteractiveTarget = (target) => {
682
+ return Boolean(target && target.closest && target.closest('a, button, input, textarea, select, label, [role="button"], [contenteditable="true"], .terminal-keyboard-modal, .terminal-keyboard-backdrop'));
683
+ };
684
+ const isTouchEvent = (event) => {
685
+ if (!event) {
686
+ return false;
663
687
  }
664
- if (this.supportsPointer) {
688
+ if (event.touches || event.changedTouches) {
689
+ const list = event.touches || event.changedTouches;
690
+ if (list && list.length > 1) {
691
+ return false;
692
+ }
693
+ } else if (this.supportsPointer) {
665
694
  const pointerType = event.pointerType;
666
695
  if (pointerType && pointerType !== 'touch' && pointerType !== 'pen') {
667
- return;
696
+ return false;
668
697
  }
669
- } else if (event.touches && event.touches.length !== 1) {
698
+ }
699
+ return true;
700
+ };
701
+ const handleStart = (event) => {
702
+ if (!isTouchEvent(event) || this.modalOpen || isInteractiveTarget(event.target)) {
703
+ resetTracker();
704
+ return;
705
+ }
706
+ const point = getTouchPoint(event, 'start');
707
+ if (!point) {
708
+ resetTracker();
709
+ return;
710
+ }
711
+ tracker.active = true;
712
+ tracker.moved = false;
713
+ tracker.startTime = Date.now();
714
+ tracker.startX = point.x;
715
+ tracker.startY = point.y;
716
+ tracker.startScroll = getScrollSnapshot();
717
+ };
718
+ const handleMove = (event) => {
719
+ if (!tracker.active) {
670
720
  return;
671
721
  }
672
- const pointSource = this.supportsPointer ? event : (event.touches && event.touches[0]);
673
- const pointX = pointSource && typeof pointSource.clientX === 'number' ? pointSource.clientX : 0;
674
- const pointY = pointSource && typeof pointSource.clientY === 'number' ? pointSource.clientY : 0;
675
- const now = Date.now();
676
- const delta = now - tracker.lastTime;
677
- const distance = Math.hypot(pointX - tracker.lastX, pointY - tracker.lastY);
678
- if (delta < 320 && distance < 40) {
722
+ const point = getTouchPoint(event, 'move');
723
+ if (!point) {
724
+ return;
725
+ }
726
+ const distance = Math.hypot(point.x - tracker.startX, point.y - tracker.startY);
727
+ if (distance > 12) {
728
+ tracker.moved = true;
729
+ }
730
+ };
731
+ const handleEnd = (event) => {
732
+ if (!tracker.active) {
733
+ return;
734
+ }
735
+ const point = getTouchPoint(event, 'end');
736
+ const duration = Date.now() - tracker.startTime;
737
+ const distance = point ? Math.hypot(point.x - tracker.startX, point.y - tracker.startY) : Infinity;
738
+ const scrolled = didScrollChange(tracker.startScroll, getScrollSnapshot());
739
+ resetTracker();
740
+ if (!tracker.moved && !scrolled && duration < 700 && distance <= 12 && !isInteractiveTarget(event.target)) {
679
741
  event.preventDefault();
680
742
  event.stopPropagation();
681
743
  this.openModalFromGesture();
682
744
  }
683
- tracker.lastTime = now;
684
- tracker.lastX = pointX;
685
- tracker.lastY = pointY;
686
745
  };
687
- node.addEventListener(tracker.eventName, handlePointerDown, { passive: false });
688
- tracker.handler = handlePointerDown;
746
+ const addTrackedListener = (eventName, handler, options) => {
747
+ node.addEventListener(eventName, handler, options);
748
+ tracker.handlers.push({ eventName, handler, options });
749
+ };
750
+ if (this.supportsPointer) {
751
+ addTrackedListener('pointerdown', handleStart, { passive: true });
752
+ addTrackedListener('pointermove', handleMove, { passive: true });
753
+ addTrackedListener('pointerup', handleEnd, { passive: false });
754
+ addTrackedListener('pointercancel', resetTracker, { passive: true });
755
+ }
756
+ if (typeof window !== 'undefined' && 'TouchEvent' in window) {
757
+ addTrackedListener('touchstart', handleStart, { passive: true });
758
+ addTrackedListener('touchmove', handleMove, { passive: true });
759
+ addTrackedListener('touchend', handleEnd, { passive: false });
760
+ addTrackedListener('touchcancel', resetTracker, { passive: true });
761
+ }
689
762
  tracker.node = node;
690
763
  this.tapTrackers.set(term, tracker);
691
764
  }
@@ -706,9 +779,10 @@
706
779
  if (!tracker) {
707
780
  return;
708
781
  }
709
- if (tracker.node && tracker.handler) {
710
- const eventName = tracker.eventName || (this.supportsPointer ? 'pointerdown' : 'touchstart');
711
- tracker.node.removeEventListener(eventName, tracker.handler, { passive: false });
782
+ if (tracker.node && Array.isArray(tracker.handlers)) {
783
+ tracker.handlers.forEach(({ eventName, handler, options }) => {
784
+ tracker.node.removeEventListener(eventName, handler, options);
785
+ });
712
786
  }
713
787
  this.tapTrackers.delete(term);
714
788
  }
@@ -1190,6 +1264,8 @@
1190
1264
  const nextTheme = Object.assign({}, theme);
1191
1265
  const applied = this.applyOption(term, 'theme', nextTheme);
1192
1266
 
1267
+ console.log("nextTheme", nextTheme)
1268
+
1193
1269
  const element = term.element;
1194
1270
  if (element && element.style) {
1195
1271
  if (nextTheme.background) {