mysticals 0.8.1 → 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 +118 -9
  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.8.1";
8
+ var version = "0.10.0";
9
9
 
10
10
  // src/client.ts
11
11
  import { spawn } from "child_process";
@@ -277,6 +277,8 @@ var en = {
277
277
  "notify.changed": "Event changed",
278
278
  "notify.cancelled": "Event cancelled",
279
279
  "notify.many": { one: "{n} calendar update", other: "{n} calendar updates" },
280
+ "reminder.in": "in {n} min",
281
+ "reminder.now": "starting now",
280
282
  // ---- desktop: menus, dialogs, update ----
281
283
  "menu.file": "File",
282
284
  "menu.newEvent": "New Event",
@@ -328,6 +330,17 @@ var en = {
328
330
  "toast.movedAll": "Moved \u201C{title}\u201D (all events)",
329
331
  "toast.movedFollowing": "Moved \u201C{title}\u201D and following",
330
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}",
331
344
  "scope.move": "Move recurring event",
332
345
  "toolbar.weekNo": "W{n}",
333
346
  "toolbar.previous": "Previous",
@@ -345,12 +358,37 @@ var en = {
345
358
  "settings.tab.language": "Language",
346
359
  "settings.tab.sync": "Sync",
347
360
  "settings.tab.privacy": "Privacy",
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.",
377
+ "settings.reminders.label": "Remind me before events",
378
+ "settings.reminders.off": "Off",
379
+ "settings.reminders.min": "{n} min before",
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}",
348
384
  "settings.noAccounts": "No accounts yet.",
349
385
  "settings.addAccount": "Add account\u2026",
350
386
  "settings.theme": "Theme",
351
387
  "theme.amber": "Phosphor amber",
352
388
  "theme.mono": "Black & White",
353
389
  "theme.toon": "Cartoon",
390
+ "theme.cloud": "Cloud",
391
+ "theme.light": "Light",
354
392
  "settings.language.auto": "Automatic",
355
393
  "settings.language.system": "system: {name}",
356
394
  "settings.sync.note": "Accounts sync automatically every 2 minutes and when the app regains focus.",
@@ -365,6 +403,7 @@ var en = {
365
403
  "settings.privacy.note": "Mysticals sends two anonymous events: when the app is first installed and when an account is added (provider only). Never emails, server addresses, calendars or events.",
366
404
  "settings.privacy.policy": "Privacy policy",
367
405
  "settings.privacy.share": "Share anonymous usage stats",
406
+ "settings.donate": "Support on Ko-fi",
368
407
  "settings.account.labelFor": "Label for {email}",
369
408
  "settings.account.colourFor": "Colour for {email}",
370
409
  "settings.account.remove": "Remove",
@@ -531,6 +570,7 @@ var en = {
531
570
  "agenda.joinShort": "Join",
532
571
  "agenda.noCalls": "No calls today. Enjoy the quiet.",
533
572
  "agenda.fact.calendar": "calendar",
573
+ "agenda.fact.organizer": "organizer",
534
574
  "agenda.fact.where": "where",
535
575
  "agenda.fact.people": "people",
536
576
  "agenda.fact.link": "link",
@@ -610,6 +650,8 @@ var uk = {
610
650
  "notify.changed": "\u041F\u043E\u0434\u0456\u044E \u0437\u043C\u0456\u043D\u0435\u043D\u043E",
611
651
  "notify.cancelled": "\u041F\u043E\u0434\u0456\u044E \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E",
612
652
  "notify.many": { one: "{n} \u0437\u043C\u0456\u043D\u0430 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456", few: "{n} \u0437\u043C\u0456\u043D\u0438 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456", many: "{n} \u0437\u043C\u0456\u043D \u0443 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456", other: "{n} \u0437\u043C\u0456\u043D\u0438 \u0432 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456" },
653
+ "reminder.in": "\u0447\u0435\u0440\u0435\u0437 {n} \u0445\u0432",
654
+ "reminder.now": "\u043F\u043E\u0447\u0438\u043D\u0430\u0454\u0442\u044C\u0441\u044F \u0437\u0430\u0440\u0430\u0437",
613
655
  // ---- desktop: menus, dialogs, update ----
614
656
  "menu.file": "\u0424\u0430\u0439\u043B",
615
657
  "menu.newEvent": "\u041D\u043E\u0432\u0430 \u043F\u043E\u0434\u0456\u044F",
@@ -661,6 +703,17 @@ var uk = {
661
703
  "toast.movedAll": "\u041F\u0435\u0440\u0435\u043D\u0435\u0441\u0435\u043D\u043E \xAB{title}\xBB (\u0443\u0441\u0456 \u043F\u043E\u0434\u0456\u0457)",
662
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",
663
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}",
664
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",
665
718
  "toolbar.weekNo": "\u0422{n}",
666
719
  "toolbar.previous": "\u041D\u0430\u0437\u0430\u0434",
@@ -678,12 +731,37 @@ var uk = {
678
731
  "settings.tab.language": "\u041C\u043E\u0432\u0430",
679
732
  "settings.tab.sync": "\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0430\u0446\u0456\u044F",
680
733
  "settings.tab.privacy": "\u041A\u043E\u043D\u0444\u0456\u0434\u0435\u043D\u0446\u0456\u0439\u043D\u0456\u0441\u0442\u044C",
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.",
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",
751
+ "settings.reminders.off": "\u0412\u0438\u043C\u043A\u043D\u0435\u043D\u043E",
752
+ "settings.reminders.min": "\u0437\u0430 {n} \u0445\u0432",
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}",
681
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.",
682
758
  "settings.addAccount": "\u0414\u043E\u0434\u0430\u0442\u0438 \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0441\u2026",
683
759
  "settings.theme": "\u0422\u0435\u043C\u0430",
684
760
  "theme.amber": "\u0411\u0443\u0440\u0448\u0442\u0438\u043D\u043E\u0432\u0438\u0439 \u043B\u044E\u043C\u0456\u043D\u043E\u0444\u043E\u0440",
685
761
  "theme.mono": "\u0427\u043E\u0440\u043D\u043E-\u0431\u0456\u043B\u0430",
686
762
  "theme.toon": "\u041C\u0443\u043B\u044C\u0442\u044F\u0448\u043D\u0430",
763
+ "theme.cloud": "\u0425\u043C\u0430\u0440\u0438\u043D\u043A\u0430",
764
+ "theme.light": "\u0421\u0432\u0456\u0442\u043B\u0430",
687
765
  "settings.language.auto": "\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E",
688
766
  "settings.language.system": "\u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0430: {name}",
689
767
  "settings.sync.note": "\u041E\u0431\u043B\u0456\u043A\u043E\u0432\u0456 \u0437\u0430\u043F\u0438\u0441\u0438 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0456\u0437\u0443\u044E\u0442\u044C\u0441\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u043A\u043E\u0436\u043D\u0456 2 \u0445\u0432\u0438\u043B\u0438\u043D\u0438 \u0442\u0430 \u043A\u043E\u043B\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0437\u043D\u043E\u0432\u0443 \u0441\u0442\u0430\u0454 \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u043C.",
@@ -698,6 +776,7 @@ var uk = {
698
776
  "settings.privacy.note": "Mysticals \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0454 \u0434\u0432\u0456 \u0430\u043D\u043E\u043D\u0456\u043C\u043D\u0456 \u043F\u043E\u0434\u0456\u0457: \u043A\u043E\u043B\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u043D\u043E\u043A \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0432\u043F\u0435\u0440\u0448\u0435 \u0456 \u043A\u043E\u043B\u0438 \u0434\u043E\u0434\u0430\u043D\u043E \u043E\u0431\u043B\u0456\u043A\u043E\u0432\u0438\u0439 \u0437\u0430\u043F\u0438\u0441 (\u043B\u0438\u0448\u0435 \u0442\u0438\u043F \u0441\u0435\u0440\u0432\u0456\u0441\u0443). \u041D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0454 \u0430\u0434\u0440\u0435\u0441\u0438 \u043F\u043E\u0448\u0442\u0438 \u0447\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432, \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0456 \u0430\u0431\u043E \u043F\u043E\u0434\u0456\u0457.",
699
777
  "settings.privacy.policy": "\u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430 \u043A\u043E\u043D\u0444\u0456\u0434\u0435\u043D\u0446\u0456\u0439\u043D\u043E\u0441\u0442\u0456",
700
778
  "settings.privacy.share": "\u041D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u0430\u043D\u043E\u043D\u0456\u043C\u043D\u0443 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0443 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F",
779
+ "settings.donate": "\u041F\u0456\u0434\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u043D\u0430 Ko-fi",
701
780
  "settings.account.labelFor": "\u041D\u0430\u0437\u0432\u0430 \u0434\u043B\u044F {email}",
702
781
  "settings.account.colourFor": "\u041A\u043E\u043B\u0456\u0440 \u0434\u043B\u044F {email}",
703
782
  "settings.account.remove": "\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438",
@@ -864,6 +943,7 @@ var uk = {
864
943
  "agenda.joinShort": "\u041F\u0440\u0438\u0454\u0434\u043D\u0430\u0442\u0438\u0441\u044F",
865
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.",
866
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",
867
947
  "agenda.fact.where": "\u0434\u0435",
868
948
  "agenda.fact.people": "\u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0438",
869
949
  "agenda.fact.link": "\u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F",
@@ -2330,6 +2410,8 @@ function createMockApi(onChanged) {
2330
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" });
2331
2411
  seed(personal, "p-main", { title: "Catch-up", start: iso(5, 16), end: iso(5, 16, 30), location: "https://meet.namechip.net/catch-up" });
2332
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) });
2333
2415
  seed(personal, "p-main", { title: "Dinner with friends", start: iso(2, 20), end: iso(2, 22), location: "Kyiv" });
2334
2416
  const day = (offset) => format5(addDays2(/* @__PURE__ */ new Date(), offset), "yyyy-MM-dd");
2335
2417
  seed(personal, "p-holidays", { title: "Holiday", start: day(0), end: day(1), allDay: true });
@@ -2489,6 +2571,10 @@ function mapPeople(vevent, email) {
2489
2571
  });
2490
2572
  return { organizer, attendees, myStatus: attendees.find((a) => a.self)?.status };
2491
2573
  }
2574
+ function conferenceOf(vevent) {
2575
+ const urls = [...vevent.getAllProperties("conference"), ...vevent.getAllProperties("x-google-conference")].map((p) => String(p.getFirstValue() ?? "").trim());
2576
+ return urls.find((u) => /^https?:\/\//i.test(u));
2577
+ }
2492
2578
  function parseEvents(ics, href, etag, ctx, range) {
2493
2579
  const root = parse(ics);
2494
2580
  const vevents = root.getAllSubcomponents("vevent");
@@ -2502,6 +2588,7 @@ function parseEvents(ics, href, etag, ctx, range) {
2502
2588
  const build = (item, start, end, recurrenceId) => {
2503
2589
  const rid = recurrenceId?.toString();
2504
2590
  const raw = { href, ics, ...rid ? { recurrenceId: rid } : {} };
2591
+ const conference = conferenceOf(item.component);
2505
2592
  return {
2506
2593
  id: rid ? `${href}#${rid}` : href,
2507
2594
  accountId: ctx.accountId,
@@ -2512,6 +2599,7 @@ function parseEvents(ics, href, etag, ctx, range) {
2512
2599
  allDay: start.isDate,
2513
2600
  location: item.location || void 0,
2514
2601
  description: item.description || void 0,
2602
+ ...conference ? { conferenceUrl: conference } : {},
2515
2603
  ...mapPeople(item.component, ctx.email),
2516
2604
  etag,
2517
2605
  raw,
@@ -3393,7 +3481,11 @@ function packColumns(items, minDur = 0) {
3393
3481
  let colEnds = [];
3394
3482
  let clusterEnd = -Infinity;
3395
3483
  const flush = () => {
3396
- 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
+ }
3397
3489
  cluster = [];
3398
3490
  colEnds = [];
3399
3491
  };
@@ -3404,16 +3496,16 @@ function packColumns(items, minDur = 0) {
3404
3496
  if (col < 0) col = colEnds.push(end) - 1;
3405
3497
  else colEnds[col] = end;
3406
3498
  clusterEnd = Math.max(clusterEnd, end);
3407
- const p = { ...it, col, cols: 0 };
3408
- cluster.push(p);
3499
+ const p = { ...it, col, cols: 0, span: 1 };
3500
+ cluster.push({ p, end });
3409
3501
  out.push(p);
3410
3502
  }
3411
3503
  flush();
3412
3504
  return out;
3413
3505
  }
3414
3506
  var wallMinutes = (d) => d.getHours() * 60 + d.getMinutes();
3415
- function layoutDay(events, day, minDur = 0) {
3416
- 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) => {
3417
3509
  const { start, end } = eventBounds(e);
3418
3510
  return {
3419
3511
  item: e,
@@ -3421,7 +3513,9 @@ function layoutDay(events, day, minDur = 0) {
3421
3513
  end: isSameDay2(end, day) ? wallMinutes(end) : 1440
3422
3514
  };
3423
3515
  });
3424
- return packColumns(items, minDur);
3516
+ }
3517
+ function layoutDay(events, day, minDur = 0) {
3518
+ return packColumns(clipDay(events, day), minDur);
3425
3519
  }
3426
3520
  function monthGrid(date) {
3427
3521
  const first = startOfWeek2(startOfMonth(date), { weekStartsOn: WEEK_STARTS_ON });
@@ -3847,8 +3941,15 @@ function htmlToText(html) {
3847
3941
  function meetingUrl(location) {
3848
3942
  return location?.match(/https?:\/\/[^\s<>"]+/i)?.[0].replace(/[.,;:!?)\]}'>]+$/, "");
3849
3943
  }
3944
+ var CALL_KINDS = ["meet", "zoom", "teams", "video"];
3945
+ function descriptionCallUrl(description) {
3946
+ if (!description) return void 0;
3947
+ const hrefs = [...description.matchAll(/href\s*=\s*["']([^"']+)["']/gi)].map((m) => m[1].replace(/&amp;/g, "&"));
3948
+ const urls = [...hrefs, ...linkify(description.replace(/<[^>]*>/g, " ")).flatMap((p) => p.href ? [p.href] : [])];
3949
+ return urls.find((u) => /^https?:\/\//i.test(u) && CALL_KINDS.includes(linkKind(u)));
3950
+ }
3850
3951
  function eventMeetingUrl(e) {
3851
- return e.conferenceUrl ?? meetingUrl(e.location);
3952
+ return e.conferenceUrl ?? meetingUrl(e.location) ?? descriptionCallUrl(e.description);
3852
3953
  }
3853
3954
  function locationText(location = "") {
3854
3955
  return location.replace(/https?:\/\/[^\s<>"]+/gi, "").replace(/^[\s/|,·-]+|[\s/|,·-]+$/g, "");
@@ -5163,6 +5264,7 @@ function AddCaldav({ onBack, onDone }) {
5163
5264
 
5164
5265
  // src/ui/screens/Accounts.tsx
5165
5266
  import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
5267
+ var DONATE_URL = "https://ko-fi.com/a1exalexander";
5166
5268
  function Accounts({ onClose }) {
5167
5269
  const api = useApi();
5168
5270
  const { accounts, calendars, loaded, error: loadError } = useDirectory();
@@ -5406,7 +5508,14 @@ function Accounts({ onClose }) {
5406
5508
  button("a", "add CalDAV"),
5407
5509
  /* @__PURE__ */ jsx12(Button, { k: "esc", label: "close", onPress: onClose })
5408
5510
  ] }),
5409
- mode.kind === "list" && /* @__PURE__ */ jsx12(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx12(Text10, { color: C.muted, children: "Made in Ukraine" }) })
5511
+ mode.kind === "list" && /* @__PURE__ */ jsxs10(Box10, { marginTop: 1, children: [
5512
+ /* @__PURE__ */ jsx12(Text10, { color: C.muted, children: "Made in Ukraine \xB7 " }),
5513
+ /* @__PURE__ */ jsxs10(Clickable, { onClick: () => void openUrl(DONATE_URL).catch(() => {
5514
+ }), children: [
5515
+ /* @__PURE__ */ jsx12(Text10, { color: C.muted, children: "Support on Ko-fi: " }),
5516
+ /* @__PURE__ */ jsx12(Text10, { color: C.cyan, underline: true, children: DONATE_URL })
5517
+ ] })
5518
+ ] })
5410
5519
  ] });
5411
5520
  }
5412
5521
  var loopbackPort = (authUrl) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mysticals",
3
- "version": "0.8.1",
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.8.1"
50
+ "@mysticals/core": "0.10.0"
51
51
  },
52
52
  "scripts": {
53
53
  "dev": "tsup --watch",