mysticals 0.9.0 → 0.10.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 (2) hide show
  1. package/dist/cli.js +75 -7
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -5,7 +5,7 @@ import { createElement } from "react";
5
5
  import { render } from "ink";
6
6
 
7
7
  // package.json
8
- var version = "0.9.0";
8
+ var version = "0.10.0";
9
9
 
10
10
  // src/client.ts
11
11
  import { spawn } from "child_process";
@@ -330,6 +330,17 @@ var en = {
330
330
  "toast.movedAll": "Moved \u201C{title}\u201D (all events)",
331
331
  "toast.movedFollowing": "Moved \u201C{title}\u201D and following",
332
332
  "toast.moveFailed": "Couldn't move \u201C{title}\u201D: {error}",
333
+ "menu.eventActions": "Event actions",
334
+ "menu.duplicate": "Duplicate",
335
+ "menu.pasteEvent": "Paste \u201C{title}\u201D",
336
+ "toast.duplicated": "Duplicated \u201C{title}\u201D",
337
+ "toast.copied": "Copied \u201C{title}\u201D \xB7 right-click a time or day to paste",
338
+ "toast.pasted": "Pasted \u201C{title}\u201D",
339
+ "toast.deleted": "Deleted \u201C{title}\u201D",
340
+ "toast.deletedAll": "Deleted \u201C{title}\u201D (all events)",
341
+ "toast.deletedFollowing": "Deleted \u201C{title}\u201D and following",
342
+ "toast.deleteFailed": "Couldn't delete \u201C{title}\u201D: {error}",
343
+ "toast.createFailed": "Couldn't create \u201C{title}\u201D: {error}",
333
344
  "scope.move": "Move recurring event",
334
345
  "toolbar.weekNo": "W{n}",
335
346
  "toolbar.previous": "Previous",
@@ -348,10 +359,28 @@ var en = {
348
359
  "settings.tab.sync": "Sync",
349
360
  "settings.tab.privacy": "Privacy",
350
361
  "settings.tab.notifications": "Notifications",
362
+ "settings.tab.events": "Events",
363
+ "settings.events.long": "Long events",
364
+ "settings.events.note": "Timed events that fill most of a day, like a teammate blocking 09:00\u201320:00 as busy. Choose how the Day, 3 Days and Week views show them.",
365
+ "settings.events.mode": "Show long events as",
366
+ "settings.events.rails": "Rails",
367
+ "settings.events.railsHint": "A thin bar at the left of the day. Other events get the full width.",
368
+ "settings.events.allday": "Move to all-day",
369
+ "settings.events.alldayHint": "A chip in the all-day row with its hours. The grid shows the busy time.",
370
+ "settings.events.cascade": "Cascade",
371
+ "settings.events.cascadeHint": "Blocks overlap, each later one shifted right and drawn on top.",
372
+ "settings.events.expand": "Expand to fill",
373
+ "settings.events.expandHint": "Ordinary blocks, side by side, widening into free space.",
374
+ "settings.events.longer": "Long means longer than",
375
+ "settings.events.hours": "{n} h",
376
+ "settings.events.noThreshold": "Every event is a block in this mode, whatever its length.",
351
377
  "settings.reminders.label": "Remind me before events",
352
378
  "settings.reminders.off": "Off",
353
379
  "settings.reminders.min": "{n} min before",
354
380
  "settings.reminders.note": "A notification pops up before each event while Mysticals is open, with a button to join the call when the event has a link. Declined, all-day and hidden-calendar events stay silent.",
381
+ "settings.reminders.accounts": "Notify for these accounts",
382
+ "settings.reminders.accountsNote": "A switched-off account gets no reminders and no invite or change notifications.",
383
+ "settings.reminders.accountFor": "Notifications for {name}",
355
384
  "settings.noAccounts": "No accounts yet.",
356
385
  "settings.addAccount": "Add account\u2026",
357
386
  "settings.theme": "Theme",
@@ -541,6 +570,7 @@ var en = {
541
570
  "agenda.joinShort": "Join",
542
571
  "agenda.noCalls": "No calls today. Enjoy the quiet.",
543
572
  "agenda.fact.calendar": "calendar",
573
+ "agenda.fact.organizer": "organizer",
544
574
  "agenda.fact.where": "where",
545
575
  "agenda.fact.people": "people",
546
576
  "agenda.fact.link": "link",
@@ -673,6 +703,17 @@ var uk = {
673
703
  "toast.movedAll": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043E \xAB{title}\xBB (\u0443\u0441\u0456 \u043F\u043E\u0434\u0456\u0457)",
674
704
  "toast.movedFollowing": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043E \xAB{title}\xBB \u0456 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0456",
675
705
  "toast.moveFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \xAB{title}\xBB: {error}",
706
+ "menu.eventActions": "\u0414\u0456\u0457 \u0437 \u043F\u043E\u0434\u0456\u0454\u044E",
707
+ "menu.duplicate": "\u0414\u0443\u0431\u043B\u044E\u0432\u0430\u0442\u0438",
708
+ "menu.pasteEvent": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \xAB{title}\xBB",
709
+ "toast.duplicated": "\u0414\u0443\u0431\u043B\u044C\u043E\u0432\u0430\u043D\u043E \xAB{title}\xBB",
710
+ "toast.copied": "\u0421\u043A\u043E\u043F\u0456\u0439\u043E\u0432\u0430\u043D\u043E \xAB{title}\xBB \xB7 \u043A\u043B\u0430\u0446\u043D\u0456\u0442\u044C \u043F\u0440\u0430\u0432\u043E\u044E \u043A\u043D\u043E\u043F\u043A\u043E\u044E \u043D\u0430 \u0447\u0430\u0441 \u0430\u0431\u043E \u0434\u0435\u043D\u044C, \u0449\u043E\u0431 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438",
711
+ "toast.pasted": "\u0412\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E \xAB{title}\xBB",
712
+ "toast.deleted": "\u0412\u0438\u0434\u0430\u043B\u0435\u043D\u043E \xAB{title}\xBB",
713
+ "toast.deletedAll": "\u0412\u0438\u0434\u0430\u043B\u0435\u043D\u043E \xAB{title}\xBB (\u0443\u0441\u0456 \u043F\u043E\u0434\u0456\u0457)",
714
+ "toast.deletedFollowing": "\u0412\u0438\u0434\u0430\u043B\u0435\u043D\u043E \xAB{title}\xBB \u0456 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0456",
715
+ "toast.deleteFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \xAB{title}\xBB: {error}",
716
+ "toast.createFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \xAB{title}\xBB: {error}",
676
717
  "scope.move": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u044E\u0432\u0430\u043D\u0443 \u043F\u043E\u0434\u0456\u044E",
677
718
  "toolbar.weekNo": "\u0422{n}",
678
719
  "toolbar.previous": "\u041D\u0430\u0437\u0430\u0434",
@@ -691,10 +732,28 @@ var uk = {
691
732
  "settings.tab.sync": "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F",
692
733
  "settings.tab.privacy": "\u041A\u043E\u043D\u0444\u0456\u0434\u0435\u043D\u0446\u0456\u0439\u043D\u0456\u0441\u0442\u044C",
693
734
  "settings.tab.notifications": "\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F",
735
+ "settings.tab.events": "\u041F\u043E\u0434\u0456\u0457",
736
+ "settings.events.long": "\u0414\u043E\u0432\u0433\u0456 \u043F\u043E\u0434\u0456\u0457",
737
+ "settings.events.note": "\u041F\u043E\u0434\u0456\u0457 \u0437 \u0447\u0430\u0441\u043E\u043C, \u0449\u043E \u0437\u0430\u0439\u043C\u0430\u044E\u0442\u044C \u0431\u0456\u043B\u044C\u0448\u0443 \u0447\u0430\u0441\u0442\u0438\u043D\u0443 \u0434\u043D\u044F, \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434 \u043A\u043E\u043B\u0435\u0433\u0430 \u043F\u043E\u0437\u043D\u0430\u0447\u0438\u0432 09:00\u201320:00 \u044F\u043A \u0437\u0430\u0439\u043D\u044F\u0442\u0438\u0439. \u041E\u0431\u0435\u0440\u0456\u0442\u044C, \u044F\u043A \u0457\u0445 \u043F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0443 \u0432\u0438\u0434\u0430\u0445 \u0414\u0435\u043D\u044C, 3 \u0434\u043D\u0456 \u0442\u0430 \u0422\u0438\u0436\u0434\u0435\u043D\u044C.",
738
+ "settings.events.mode": "\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0434\u043E\u0432\u0433\u0456 \u043F\u043E\u0434\u0456\u0457 \u044F\u043A",
739
+ "settings.events.rails": "\u0421\u043C\u0443\u0436\u043A\u0438",
740
+ "settings.events.railsHint": "\u0422\u043E\u043D\u043A\u0430 \u0441\u043C\u0443\u0436\u043A\u0430 \u0437\u043B\u0456\u0432\u0430 \u0432 \u0434\u043D\u0456. \u0406\u043D\u0448\u0456 \u043F\u043E\u0434\u0456\u0457 \u043E\u0442\u0440\u0438\u043C\u0443\u044E\u0442\u044C \u0443\u0441\u044E \u0448\u0438\u0440\u0438\u043D\u0443.",
741
+ "settings.events.allday": "\u0423 \u0440\u044F\u0434\u043E\u043A \xAB\u0432\u0435\u0441\u044C \u0434\u0435\u043D\u044C\xBB",
742
+ "settings.events.alldayHint": "\u041F\u043B\u0430\u0448\u043A\u0430 \u0432 \u0440\u044F\u0434\u043A\u0443 \xAB\u0432\u0435\u0441\u044C \u0434\u0435\u043D\u044C\xBB \u0437 \u0433\u043E\u0434\u0438\u043D\u0430\u043C\u0438. \u0423 \u0441\u0456\u0442\u0446\u0456 \u0432\u0438\u0434\u043D\u043E \u0437\u0430\u0439\u043D\u044F\u0442\u0438\u0439 \u0447\u0430\u0441.",
743
+ "settings.events.cascade": "\u041A\u0430\u0441\u043A\u0430\u0434",
744
+ "settings.events.cascadeHint": "\u0411\u043B\u043E\u043A\u0438 \u043D\u0430\u043A\u043B\u0430\u0434\u0430\u044E\u0442\u044C\u0441\u044F, \u043A\u043E\u0436\u0435\u043D \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0442\u0440\u043E\u0445\u0438 \u043F\u0440\u0430\u0432\u0456\u0448\u0435 \u0439 \u043F\u043E\u0432\u0435\u0440\u0445 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044C\u043E\u0433\u043E.",
745
+ "settings.events.expand": "\u0420\u043E\u0437\u0448\u0438\u0440\u044E\u0432\u0430\u0442\u0438",
746
+ "settings.events.expandHint": "\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0456 \u0431\u043B\u043E\u043A\u0438 \u043F\u043E\u0440\u0443\u0447, \u0449\u043E \u0440\u043E\u0437\u0448\u0438\u0440\u044E\u044E\u0442\u044C\u0441\u044F \u043D\u0430 \u0432\u0456\u043B\u044C\u043D\u0435 \u043C\u0456\u0441\u0446\u0435.",
747
+ "settings.events.longer": "\u0414\u043E\u0432\u0433\u0430 \u2014 \u0446\u0435 \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0456\u0436",
748
+ "settings.events.hours": "{n} \u0433\u043E\u0434",
749
+ "settings.events.noThreshold": "\u0423 \u0446\u044C\u043E\u043C\u0443 \u0440\u0435\u0436\u0438\u043C\u0456 \u043A\u043E\u0436\u043D\u0430 \u043F\u043E\u0434\u0456\u044F \u2014 \u0431\u043B\u043E\u043A, \u043D\u0435\u0437\u0430\u043B\u0435\u0436\u043D\u043E \u0432\u0456\u0434 \u0434\u043E\u0432\u0436\u0438\u043D\u0438.",
694
750
  "settings.reminders.label": "\u041D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u0442\u0438 \u043F\u0435\u0440\u0435\u0434 \u043F\u043E\u0434\u0456\u044F\u043C\u0438",
695
751
  "settings.reminders.off": "\u0412\u0438\u043C\u043A\u043D\u0435\u043D\u043E",
696
752
  "settings.reminders.min": "\u0437\u0430 {n} \u0445\u0432",
697
753
  "settings.reminders.note": "\u041F\u043E\u043A\u0438 Mysticals \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439, \u043F\u0435\u0440\u0435\u0434 \u043A\u043E\u0436\u043D\u043E\u044E \u043F\u043E\u0434\u0456\u0454\u044E \u0437\u2019\u044F\u0432\u043B\u044F\u0454\u0442\u044C\u0441\u044F \u0441\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u0437 \u043A\u043D\u043E\u043F\u043A\u043E\u044E, \u0449\u043E\u0431 \u043F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F \u0434\u043E \u0434\u0437\u0432\u0456\u043D\u043A\u0430, \u044F\u043A\u0449\u043E \u0432 \u043F\u043E\u0434\u0456\u0457 \u0454 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F. \u0412\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u0456, \u0446\u0456\u043B\u043E\u0434\u0435\u043D\u043D\u0456 \u043F\u043E\u0434\u0456\u0457 \u0442\u0430 \u043F\u043E\u0434\u0456\u0457 \u0437 \u043F\u0440\u0438\u0445\u043E\u0432\u0430\u043D\u0438\u0445 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456\u0432 \u0431\u0435\u0437 \u0441\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u044C.",
754
+ "settings.reminders.accounts": "\u0421\u043F\u043E\u0432\u0456\u0449\u0430\u0442\u0438 \u0434\u043B\u044F \u0446\u0438\u0445 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0437\u0430\u043F\u0438\u0441\u0456\u0432",
755
+ "settings.reminders.accountsNote": "\u0412\u0438\u043C\u043A\u043D\u0435\u043D\u0438\u0439 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0441 \u043D\u0435 \u043E\u0442\u0440\u0438\u043C\u0443\u0454 \u043D\u0456 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C, \u043D\u0456 \u0441\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u044C \u043F\u0440\u043E \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0442\u0430 \u0437\u043C\u0456\u043D\u0438.",
756
+ "settings.reminders.accountFor": "\u0421\u043F\u043E\u0432\u0456\u0449\u0435\u043D\u043D\u044F \u0434\u043B\u044F {name}",
698
757
  "settings.noAccounts": "\u041E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0445 \u0437\u0430\u043F\u0438\u0441\u0456\u0432 \u0449\u0435 \u043D\u0435\u043C\u0430\u0454.",
699
758
  "settings.addAccount": "\u0414\u043E\u0434\u0430\u0442\u0438 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0441\u2026",
700
759
  "settings.theme": "\u0422\u0435\u043C\u0430",
@@ -884,6 +943,7 @@ var uk = {
884
943
  "agenda.joinShort": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
885
944
  "agenda.noCalls": "\u0421\u044C\u043E\u0433\u043E\u0434\u043D\u0456 \u0434\u0437\u0432\u0456\u043D\u043A\u0456\u0432 \u043D\u0435\u043C\u0430\u0454. \u041D\u0430\u0441\u043E\u043B\u043E\u0434\u0436\u0443\u0439\u0442\u0435\u0441\u044F \u0442\u0438\u0448\u0435\u044E.",
886
945
  "agenda.fact.calendar": "\u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440",
946
+ "agenda.fact.organizer": "\u043E\u0440\u0433\u0430\u043D\u0456\u0437\u0430\u0442\u043E\u0440",
887
947
  "agenda.fact.where": "\u0434\u0435",
888
948
  "agenda.fact.people": "\u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0438",
889
949
  "agenda.fact.link": "\u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
@@ -2350,6 +2410,8 @@ function createMockApi(onChanged) {
2350
2410
  seed(personal, "p-main", { title: "Ukraine - Portugal", start: iso(5, 12, 30), end: iso(5, 13), conferenceUrl: "https://meet.google.com/zon-fdwf-hnk" });
2351
2411
  seed(personal, "p-main", { title: "Catch-up", start: iso(5, 16), end: iso(5, 16, 30), location: "https://meet.namechip.net/catch-up" });
2352
2412
  seed(personal, "p-main", { title: "Coffee", start: iso(5, 9), end: iso(5, 9, 30), location: "Podil https://maps.app.goo.gl/kyiv-coffee" });
2413
+ for (const title2 of ["Olena \u2014 busy", "Maksym \u2014 busy"]) seed(work, "work-main", { title: title2, start: iso(-2, 9), end: iso(-2, 20) });
2414
+ seed(work, "work-main", { title: "Design review", start: iso(-2, 14), end: iso(-2, 15) });
2353
2415
  seed(personal, "p-main", { title: "Dinner with friends", start: iso(2, 20), end: iso(2, 22), location: "Kyiv" });
2354
2416
  const day = (offset) => format5(addDays2(/* @__PURE__ */ new Date(), offset), "yyyy-MM-dd");
2355
2417
  seed(personal, "p-holidays", { title: "Holiday", start: day(0), end: day(1), allDay: true });
@@ -3419,7 +3481,11 @@ function packColumns(items, minDur = 0) {
3419
3481
  let colEnds = [];
3420
3482
  let clusterEnd = -Infinity;
3421
3483
  const flush = () => {
3422
- for (const p of cluster) p.cols = colEnds.length;
3484
+ for (const { p, end } of cluster) {
3485
+ p.cols = colEnds.length;
3486
+ const busy = (col) => cluster.some((q) => q.p.col === col && q.p.start < end && p.start < q.end);
3487
+ while (p.col + p.span < p.cols && !busy(p.col + p.span)) p.span++;
3488
+ }
3423
3489
  cluster = [];
3424
3490
  colEnds = [];
3425
3491
  };
@@ -3430,16 +3496,16 @@ function packColumns(items, minDur = 0) {
3430
3496
  if (col < 0) col = colEnds.push(end) - 1;
3431
3497
  else colEnds[col] = end;
3432
3498
  clusterEnd = Math.max(clusterEnd, end);
3433
- const p = { ...it, col, cols: 0 };
3434
- cluster.push(p);
3499
+ const p = { ...it, col, cols: 0, span: 1 };
3500
+ cluster.push({ p, end });
3435
3501
  out.push(p);
3436
3502
  }
3437
3503
  flush();
3438
3504
  return out;
3439
3505
  }
3440
3506
  var wallMinutes = (d) => d.getHours() * 60 + d.getMinutes();
3441
- function layoutDay(events, day, minDur = 0) {
3442
- const items = events.filter((e) => !e.allDay && overlapsDay(e, day)).map((e) => {
3507
+ function clipDay(events, day) {
3508
+ return events.filter((e) => !e.allDay && overlapsDay(e, day)).map((e) => {
3443
3509
  const { start, end } = eventBounds(e);
3444
3510
  return {
3445
3511
  item: e,
@@ -3447,7 +3513,9 @@ function layoutDay(events, day, minDur = 0) {
3447
3513
  end: isSameDay2(end, day) ? wallMinutes(end) : 1440
3448
3514
  };
3449
3515
  });
3450
- return packColumns(items, minDur);
3516
+ }
3517
+ function layoutDay(events, day, minDur = 0) {
3518
+ return packColumns(clipDay(events, day), minDur);
3451
3519
  }
3452
3520
  function monthGrid(date) {
3453
3521
  const first = startOfWeek2(startOfMonth(date), { weekStartsOn: WEEK_STARTS_ON });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mysticals",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "Isolated multi-account calendar for the terminal on macOS, Linux and Windows",
5
5
  "keywords": [
6
6
  "calendar",
@@ -47,7 +47,7 @@
47
47
  "tsup": "^8.5.1",
48
48
  "typescript": "^5.9.3",
49
49
  "vitest": "^3.2.7",
50
- "@mysticals/core": "0.9.0"
50
+ "@mysticals/core": "0.10.0"
51
51
  },
52
52
  "scripts": {
53
53
  "dev": "tsup --watch",