@nomideusz/svelte-calendar 0.7.5 → 0.8.0

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 (36) hide show
  1. package/README.md +19 -4
  2. package/dist/calendar/Calendar.svelte +364 -497
  3. package/dist/calendar/Calendar.svelte.d.ts +6 -2
  4. package/dist/core/clock.svelte.js +12 -5
  5. package/dist/core/locale.d.ts +4 -0
  6. package/dist/core/locale.js +4 -0
  7. package/dist/engine/view-state.svelte.d.ts +2 -2
  8. package/dist/engine/view-state.svelte.js +20 -0
  9. package/dist/headless/create-calendar.svelte.js +18 -2
  10. package/dist/headless/types.d.ts +6 -6
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.js +3 -0
  13. package/dist/primitives/DayHeader.svelte +9 -25
  14. package/dist/primitives/EmptySlot.svelte +15 -31
  15. package/dist/primitives/EventBlock.svelte +33 -61
  16. package/dist/primitives/NowIndicator.svelte +16 -42
  17. package/dist/primitives/TimeGutter.svelte +9 -23
  18. package/dist/views/agenda/Agenda.svelte +3 -10
  19. package/dist/views/agenda/AgendaDay.svelte +195 -167
  20. package/dist/views/agenda/AgendaWeek.svelte +141 -195
  21. package/dist/views/mobile/Mobile.svelte +3 -10
  22. package/dist/views/mobile/MobileDay.svelte +422 -266
  23. package/dist/views/mobile/MobileWeek.svelte +131 -186
  24. package/dist/views/month/MonthGrid.svelte +334 -0
  25. package/dist/views/month/MonthGrid.svelte.d.ts +15 -0
  26. package/dist/views/planner/Planner.svelte +3 -10
  27. package/dist/views/planner/PlannerDay.svelte +636 -546
  28. package/dist/views/planner/PlannerWeek.svelte +299 -412
  29. package/dist/views/shared/EventContent.svelte +16 -0
  30. package/dist/views/shared/EventContent.svelte.d.ts +9 -0
  31. package/dist/views/shared/context.svelte.d.ts +1 -0
  32. package/dist/views/shared/context.svelte.js +1 -0
  33. package/dist/widget/CalendarWidget.svelte +79 -116
  34. package/package.json +3 -2
  35. package/widget/svelte-calendar.css +321 -10
  36. package/widget/widget.js +1944 -1031
@@ -278,6 +278,55 @@
278
278
  /* fast ease toward the snapped cursor position */
279
279
  transition: left 80ms ease-out, width 80ms ease-out;
280
280
  }
281
+ .fs-event--resizing.svelte-mrwdy7 {
282
+ cursor: ew-resize;
283
+ }
284
+
285
+ /* ─── Resize handles ─────────────────────────────── */
286
+ .fs-ev-handle.svelte-mrwdy7 {
287
+ position: absolute;
288
+ top: 0;
289
+ bottom: 0;
290
+ width: 6px;
291
+ z-index: 2;
292
+ cursor: ew-resize;
293
+ touch-action: none;
294
+ }
295
+ .fs-ev-handle--start.svelte-mrwdy7 { left: 0; }
296
+ .fs-ev-handle--end.svelte-mrwdy7 { right: 0; }
297
+ .fs-ev-handle.svelte-mrwdy7::after {
298
+ content: '';
299
+ position: absolute;
300
+ top: 20%;
301
+ bottom: 20%;
302
+ left: 2px;
303
+ width: 2px;
304
+ border-radius: 2px;
305
+ background: var(--ev-color);
306
+ opacity: 0;
307
+ transition: opacity 120ms;
308
+ }
309
+ .fs-event.svelte-mrwdy7:hover .fs-ev-handle:where(.svelte-mrwdy7)::after { opacity: 0.55; }
310
+
311
+ /* ─── Drag-to-create ghost ───────────────────────── */
312
+ .fs-create-ghost.svelte-mrwdy7 {
313
+ position: absolute;
314
+ z-index: 40;
315
+ border-radius: 6px;
316
+ background: color-mix(in srgb, var(--dt-accent, #2563eb) 14%, transparent);
317
+ border: 1px dashed color-mix(in srgb, var(--dt-accent, #2563eb) 60%, transparent);
318
+ display: flex;
319
+ align-items: flex-start;
320
+ justify-content: center;
321
+ overflow: hidden;
322
+ pointer-events: none;
323
+ }
324
+ .fs-create-ghost-time.svelte-mrwdy7 {
325
+ font: 600 10px/1 var(--dt-mono, ui-monospace, monospace);
326
+ color: var(--dt-accent, #2563eb);
327
+ padding: 6px 4px;
328
+ white-space: nowrap;
329
+ }
281
330
 
282
331
  @media (prefers-reduced-motion: reduce) {
283
332
  .fs-event.svelte-mrwdy7,
@@ -987,9 +1036,11 @@
987
1036
 
988
1037
  /* ── Queue card variant ── */
989
1038
  .ag-card--q.svelte-n8lbn1 {
990
- margin-bottom: 6px;
991
1039
  transition: border-color 150ms, transform 100ms;
992
1040
  }
1041
+ .ag-compact-row--queue.svelte-n8lbn1 {
1042
+ margin: 0;
1043
+ }
993
1044
 
994
1045
  .ag-card--q.svelte-n8lbn1 .ag-card-body:where(.svelte-n8lbn1) {
995
1046
  gap: 3px;
@@ -1141,10 +1192,31 @@
1141
1192
  .ag-q-status.svelte-n8lbn1::-webkit-scrollbar {
1142
1193
  display: none;
1143
1194
  }
1195
+ .ag-q-done-toggle.svelte-n8lbn1 {
1196
+ align-self: flex-start;
1197
+ margin-top: 2px;
1198
+ padding: 3px 8px;
1199
+ border: 1px solid var(--dt-border);
1200
+ border-radius: 999px;
1201
+ background: none;
1202
+ font-family: var(--dt-mono);
1203
+ font-size: 11px;
1204
+ color: var(--dt-text-3);
1205
+ cursor: pointer;
1206
+ }
1207
+ .ag-q-done-toggle.svelte-n8lbn1:hover {
1208
+ color: var(--dt-text);
1209
+ border-color: var(--dt-text-3);
1210
+ }
1211
+ .ag-q-now-sub.svelte-n8lbn1 {
1212
+ font-size: 12px;
1213
+ color: var(--dt-text-2);
1214
+ margin-top: 1px;
1215
+ }
1144
1216
  .ag-q-done-section.svelte-n8lbn1 {
1145
- margin-bottom: 10px;
1146
- padding-bottom: 8px;
1147
- border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
1217
+ margin-top: 12px;
1218
+ padding-top: 10px;
1219
+ border-top: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
1148
1220
  }
1149
1221
  .ag-q-clock.svelte-n8lbn1 {
1150
1222
  font-size: 10px;
@@ -1155,6 +1227,7 @@
1155
1227
  }
1156
1228
  .ag-q-now.svelte-n8lbn1 {
1157
1229
  padding: 8px 10px;
1230
+ margin-bottom: 8px;
1158
1231
  border-radius: 8px;
1159
1232
  background: color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, var(--dt-surface, var(--dt-bg, #ffffff)));
1160
1233
  border: 1px solid color-mix(in srgb, var(--ev-color, var(--dt-accent)) 15%, transparent);
@@ -1231,6 +1304,7 @@
1231
1304
  scrollbar-width: none;
1232
1305
  display: flex;
1233
1306
  flex-direction: column;
1307
+ gap: 8px;
1234
1308
  }
1235
1309
  .ag-q-queue.svelte-n8lbn1::-webkit-scrollbar {
1236
1310
  display: none;
@@ -1357,10 +1431,11 @@
1357
1431
  .ag-compact-list.svelte-n8lbn1::-webkit-scrollbar { display: none; }
1358
1432
  .ag-compact-row.svelte-n8lbn1 {
1359
1433
  display: flex;
1360
- align-items: center;
1434
+ align-items: baseline;
1361
1435
  gap: 8px;
1362
1436
  padding: 4px 0;
1363
1437
  cursor: pointer;
1438
+ min-width: 0;
1364
1439
  }
1365
1440
  .ag-compact-row--selected.svelte-n8lbn1 {
1366
1441
  background: color-mix(in srgb, var(--ev-color) 10%, transparent);
@@ -1379,6 +1454,7 @@
1379
1454
  border-radius: 50%;
1380
1455
  background: var(--ev-color, var(--dt-accent));
1381
1456
  flex-shrink: 0;
1457
+ align-self: center;
1382
1458
  }
1383
1459
  .ag-compact-row-time.svelte-n8lbn1 {
1384
1460
  font-size: 11px;
@@ -1386,6 +1462,7 @@
1386
1462
  color: var(--dt-text-2, rgba(0, 0, 0, 0.54));
1387
1463
  min-width: 64px;
1388
1464
  flex-shrink: 0;
1465
+ line-height: 1.4;
1389
1466
  }
1390
1467
  .ag-compact-row-title.svelte-n8lbn1 {
1391
1468
  font-size: 12px;
@@ -1396,17 +1473,24 @@
1396
1473
  overflow: hidden;
1397
1474
  text-overflow: ellipsis;
1398
1475
  transition: color 150ms;
1476
+ line-height: 1.4;
1399
1477
  }
1400
1478
  .ag-compact-row-dur.svelte-n8lbn1 {
1401
1479
  font-size: 10px;
1402
1480
  font-family: var(--dt-mono, monospace);
1403
1481
  color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1404
1482
  flex-shrink: 0;
1483
+ line-height: 1.4;
1405
1484
  }
1406
1485
  .ag-compact-row-sub.svelte-n8lbn1 {
1407
1486
  font-size: 10px;
1408
1487
  color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1409
- flex-shrink: 0;
1488
+ flex-shrink: 1;
1489
+ max-width: 45%;
1490
+ white-space: nowrap;
1491
+ overflow: hidden;
1492
+ text-overflow: ellipsis;
1493
+ line-height: 1.4;
1410
1494
  }
1411
1495
  .ag-compact-row-tag.svelte-n8lbn1 {
1412
1496
  font: 500 8px / 1 var(--dt-sans, system-ui, sans-serif);
@@ -1640,6 +1724,9 @@
1640
1724
  .ag-wday.svelte-uhwfyj {
1641
1725
  border-bottom: 1px solid var(--dt-border, rgba(0, 0, 0, 0.08));
1642
1726
  }
1727
+ .ag-wday.svelte-uhwfyj:last-child {
1728
+ border-bottom: none;
1729
+ }
1643
1730
  .ag-wday--today.svelte-uhwfyj {
1644
1731
  background: color-mix(in srgb, var(--dt-accent, #2563eb) 2%, transparent);
1645
1732
  }
@@ -1680,7 +1767,7 @@
1680
1767
  }
1681
1768
  .ag-wday-head-left.svelte-uhwfyj {
1682
1769
  display: flex;
1683
- align-items: center;
1770
+ align-items: baseline;
1684
1771
  gap: 8px;
1685
1772
  }
1686
1773
  .ag-wday-badge.svelte-uhwfyj {
@@ -1704,11 +1791,13 @@
1704
1791
  .ag-wday-name.svelte-uhwfyj {
1705
1792
  font-size: 13px;
1706
1793
  font-weight: 600;
1794
+ line-height: 1.2;
1707
1795
  }
1708
1796
  .ag-wday-date.svelte-uhwfyj {
1709
1797
  font-size: 11px;
1710
1798
  font-family: var(--dt-mono, monospace);
1711
1799
  color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1800
+ line-height: 1.2;
1712
1801
  }
1713
1802
 
1714
1803
  .ag-wday-empty.svelte-uhwfyj {
@@ -1757,16 +1846,15 @@
1757
1846
 
1758
1847
  /* Compact day events */
1759
1848
  .ag-wday-compact.svelte-uhwfyj {
1760
- padding: 0 20px 6px;
1849
+ padding: 0 20px 8px;
1761
1850
  }
1762
1851
  .ag-compact.svelte-uhwfyj {
1763
1852
  display: flex;
1764
- align-items: center;
1853
+ align-items: baseline;
1765
1854
  gap: 6px;
1766
1855
  padding: 3px 0;
1767
1856
  cursor: pointer;
1768
1857
  min-width: 0;
1769
- overflow: hidden;
1770
1858
  }
1771
1859
  .ag-compact--selected.svelte-uhwfyj {
1772
1860
  background: color-mix(in srgb, var(--ev-color) 10%, transparent);
@@ -1787,6 +1875,7 @@
1787
1875
  border-radius: 50%;
1788
1876
  background: var(--ev-color, var(--dt-accent));
1789
1877
  flex-shrink: 0;
1878
+ align-self: center;
1790
1879
  }
1791
1880
  .ag-compact-time.svelte-uhwfyj {
1792
1881
  font-size: 11px;
@@ -1795,6 +1884,7 @@
1795
1884
  min-width: 40px;
1796
1885
  flex-shrink: 0;
1797
1886
  white-space: nowrap;
1887
+ line-height: 1.4;
1798
1888
  }
1799
1889
  .ag-compact-title.svelte-uhwfyj {
1800
1890
  font-size: 12px;
@@ -1806,6 +1896,7 @@
1806
1896
  overflow: hidden;
1807
1897
  text-overflow: ellipsis;
1808
1898
  transition: color 150ms;
1899
+ line-height: 1.4;
1809
1900
  }
1810
1901
  .ag-compact-dur.svelte-uhwfyj {
1811
1902
  font-size: 10px;
@@ -1813,6 +1904,7 @@
1813
1904
  color: var(--dt-text-3, rgba(0, 0, 0, 0.38));
1814
1905
  flex-shrink: 0;
1815
1906
  white-space: nowrap;
1907
+ line-height: 1.4;
1816
1908
  }
1817
1909
  .ag-compact-sub.svelte-uhwfyj {
1818
1910
  font-size: 10px;
@@ -1822,6 +1914,7 @@
1822
1914
  overflow: hidden;
1823
1915
  text-overflow: ellipsis;
1824
1916
  max-width: 120px;
1917
+ line-height: 1.4;
1825
1918
  }
1826
1919
  .ag-compact-loc.svelte-uhwfyj {
1827
1920
  font-size: 9px;
@@ -2124,6 +2217,62 @@
2124
2217
  opacity: 0.65;
2125
2218
  border: 1px dashed color-mix(in srgb, var(--ev-color) 35%, transparent);
2126
2219
  }
2220
+ .mb-event--resizing.svelte-zbkzcp {
2221
+ z-index: 50;
2222
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.25);
2223
+ cursor: ns-resize;
2224
+ }
2225
+
2226
+ /* ─── Resize handles ─────────────────────────────── */
2227
+ .mb-ev-handle.svelte-zbkzcp {
2228
+ position: absolute;
2229
+ left: 0;
2230
+ right: 0;
2231
+ height: 10px;
2232
+ z-index: 2;
2233
+ cursor: ns-resize;
2234
+ touch-action: none;
2235
+ }
2236
+ .mb-ev-handle--start.svelte-zbkzcp { top: 0; }
2237
+ .mb-ev-handle--end.svelte-zbkzcp { bottom: 0; }
2238
+ .mb-ev-handle.svelte-zbkzcp::after {
2239
+ content: '';
2240
+ position: absolute;
2241
+ left: 50%;
2242
+ transform: translateX(-50%);
2243
+ width: 24px;
2244
+ height: 3px;
2245
+ border-radius: 2px;
2246
+ background: var(--ev-color);
2247
+ opacity: 0;
2248
+ transition: opacity 120ms;
2249
+ }
2250
+ .mb-ev-handle--start.svelte-zbkzcp::after { top: 2px; }
2251
+ .mb-ev-handle--end.svelte-zbkzcp::after { bottom: 2px; }
2252
+ .mb-event.svelte-zbkzcp:hover .mb-ev-handle:where(.svelte-zbkzcp)::after,
2253
+ .mb-event--resizing.svelte-zbkzcp .mb-ev-handle:where(.svelte-zbkzcp)::after,
2254
+ .mb-event--selected.svelte-zbkzcp .mb-ev-handle:where(.svelte-zbkzcp)::after { opacity: 0.55; }
2255
+
2256
+ /* ─── Drag-to-create ghost ───────────────────────── */
2257
+ .mb-create-ghost.svelte-zbkzcp {
2258
+ position: absolute;
2259
+ left: 40px;
2260
+ right: 4px;
2261
+ z-index: 40;
2262
+ border-radius: 8px;
2263
+ background: color-mix(in srgb, var(--dt-accent, #2563eb) 12%, transparent);
2264
+ border: 1px dashed color-mix(in srgb, var(--dt-accent, #2563eb) 55%, transparent);
2265
+ display: flex;
2266
+ align-items: flex-start;
2267
+ overflow: hidden;
2268
+ pointer-events: none;
2269
+ }
2270
+ .mb-create-ghost-time.svelte-zbkzcp {
2271
+ font: 600 10px/1 var(--dt-mono, ui-monospace, monospace);
2272
+ color: var(--dt-accent, #2563eb);
2273
+ padding: 4px 8px;
2274
+ white-space: nowrap;
2275
+ }
2127
2276
 
2128
2277
  .mb-ev-stripe.svelte-zbkzcp {
2129
2278
  width: 4px;
@@ -2454,6 +2603,168 @@
2454
2603
  outline-offset: 1px;
2455
2604
  }
2456
2605
 
2606
+ .mg.svelte-pvjuld {
2607
+ display: flex;
2608
+ flex-direction: column;
2609
+ background: var(--dt-bg);
2610
+ color: var(--dt-text);
2611
+ font-family: var(--dt-sans);
2612
+ overflow: hidden;
2613
+ }
2614
+ .mg--auto.svelte-pvjuld {
2615
+ height: auto;
2616
+ }
2617
+
2618
+ .mg-head.svelte-pvjuld {
2619
+ display: grid;
2620
+ grid-template-columns: repeat(7, 1fr);
2621
+ border-bottom: 1px solid var(--dt-border);
2622
+ flex: none;
2623
+ }
2624
+ .mg-head-cell.svelte-pvjuld {
2625
+ padding: 6px 8px;
2626
+ font-family: var(--dt-mono);
2627
+ font-size: 11px;
2628
+ font-weight: 600;
2629
+ text-transform: uppercase;
2630
+ letter-spacing: 0.06em;
2631
+ color: var(--dt-text-3);
2632
+ }
2633
+
2634
+ .mg-body.svelte-pvjuld {
2635
+ flex: 1;
2636
+ display: grid;
2637
+ grid-template-columns: repeat(7, 1fr);
2638
+ grid-template-rows: repeat(var(--mg-rows, 5), minmax(88px, 1fr));
2639
+ min-height: 0;
2640
+ }
2641
+ .mg--auto.svelte-pvjuld .mg-body:where(.svelte-pvjuld) {
2642
+ grid-template-rows: repeat(var(--mg-rows, 5), minmax(88px, auto));
2643
+ }
2644
+
2645
+ .mg-cell.svelte-pvjuld {
2646
+ display: flex;
2647
+ flex-direction: column;
2648
+ gap: 3px;
2649
+ padding: 6px;
2650
+ border-right: 1px solid var(--dt-border-day);
2651
+ border-bottom: 1px solid var(--dt-border-day);
2652
+ min-width: 0;
2653
+ overflow: hidden;
2654
+ text-align: left;
2655
+ }
2656
+ .mg-cell.svelte-pvjuld:nth-child(7n) {
2657
+ border-right: none;
2658
+ }
2659
+ .mg-cell--weekend.svelte-pvjuld {
2660
+ background: var(--dt-weekend-bg);
2661
+ }
2662
+ .mg-cell--out.svelte-pvjuld {
2663
+ opacity: 0.45;
2664
+ }
2665
+ .mg-cell--today.svelte-pvjuld {
2666
+ background: var(--dt-today-bg);
2667
+ }
2668
+ .mg-cell--disabled.svelte-pvjuld {
2669
+ opacity: 0.35;
2670
+ pointer-events: none;
2671
+ }
2672
+ .mg-cell--clickable.svelte-pvjuld {
2673
+ cursor: pointer;
2674
+ }
2675
+ .mg-cell--clickable.svelte-pvjuld:hover {
2676
+ background: var(--dt-hover);
2677
+ }
2678
+ .mg-cell--clickable.svelte-pvjuld:focus-visible {
2679
+ outline: 2px solid var(--dt-accent);
2680
+ outline-offset: -2px;
2681
+ }
2682
+
2683
+ .mg-daynum.svelte-pvjuld {
2684
+ flex: none;
2685
+ font-family: var(--dt-mono);
2686
+ font-size: 12px;
2687
+ font-weight: 600;
2688
+ color: var(--dt-text-2);
2689
+ width: 22px;
2690
+ height: 22px;
2691
+ display: inline-flex;
2692
+ align-items: center;
2693
+ justify-content: center;
2694
+ border-radius: 999px;
2695
+ }
2696
+ .mg-daynum--today.svelte-pvjuld {
2697
+ background: var(--dt-accent);
2698
+ color: var(--dt-btn-text);
2699
+ }
2700
+
2701
+ .mg-chips.svelte-pvjuld {
2702
+ display: flex;
2703
+ flex-direction: column;
2704
+ gap: 2px;
2705
+ min-height: 0;
2706
+ overflow: hidden;
2707
+ }
2708
+ .mg-chip.svelte-pvjuld {
2709
+ display: flex;
2710
+ align-items: center;
2711
+ gap: 5px;
2712
+ border: none;
2713
+ background: none;
2714
+ padding: 2px 4px;
2715
+ border-radius: 5px;
2716
+ font-family: var(--dt-sans);
2717
+ font-size: 12px;
2718
+ line-height: 1.3;
2719
+ color: var(--dt-text);
2720
+ cursor: pointer;
2721
+ min-width: 0;
2722
+ text-align: left;
2723
+ }
2724
+ .mg-chip.svelte-pvjuld:hover {
2725
+ background: var(--dt-hover);
2726
+ }
2727
+ .mg-chip--selected.svelte-pvjuld {
2728
+ background: var(--dt-accent-dim);
2729
+ }
2730
+ .mg-chip--cancelled.svelte-pvjuld {
2731
+ text-decoration: line-through;
2732
+ opacity: 0.55;
2733
+ }
2734
+ .mg-chip-dot.svelte-pvjuld {
2735
+ flex: none;
2736
+ width: 7px;
2737
+ height: 7px;
2738
+ border-radius: 999px;
2739
+ background: var(--mg-chip-color);
2740
+ }
2741
+ .mg-chip-time.svelte-pvjuld {
2742
+ flex: none;
2743
+ font-family: var(--dt-mono);
2744
+ font-size: 11px;
2745
+ color: var(--dt-text-2);
2746
+ }
2747
+ .mg-chip-title.svelte-pvjuld {
2748
+ overflow: hidden;
2749
+ text-overflow: ellipsis;
2750
+ white-space: nowrap;
2751
+ }
2752
+ .mg-more.svelte-pvjuld {
2753
+ padding: 1px 4px;
2754
+ font-family: var(--dt-mono);
2755
+ font-size: 11px;
2756
+ color: var(--dt-text-3);
2757
+ }
2758
+
2759
+ @media (max-width: 640px) {
2760
+ .mg-body.svelte-pvjuld {
2761
+ grid-template-rows: repeat(var(--mg-rows, 5), minmax(64px, 1fr));
2762
+ }
2763
+ .mg-chip-time.svelte-pvjuld {
2764
+ display: none;
2765
+ }
2766
+ }
2767
+
2457
2768
  .cal.svelte-1b53e7w {
2458
2769
  position: relative;
2459
2770
  width: 100%;