back from mallorca

main
iOS 2 years ago
parent 31c6f7a587
commit fc1006f024

@ -30,11 +30,9 @@
"quickadd",
"obsidian-reminder-plugin",
"obsidian-sortable",
"obsidian-stopwatch-plugin",
"taskbone-ocr-plugin",
"obsidian-tracker",
"txt-as-md-obsidian",
"obsidian-wikipedia",
"obsidian-read-it-later",
"obsidian-book-search-plugin",
"obsidian-media-db-plugin",
@ -52,19 +50,15 @@
"plugins-galore",
"obsidian-rich-links",
"auto-card-link",
"simple-time-tracker",
"obsidian-dialogue-plugin",
"obsidian-scroll-to-top-plugin",
"obsidian-account-linker",
"cmdr",
"obsidian-snippet-downloader",
"obsidian-tasks-plugin",
"obsidian-lineup-builder",
"email-block-plugin",
"better-word-count",
"obsidian-open-weather",
"obsidian-bulk-rename-plugin",
"recent-files-obsidian",
"msg-handler",
"obsidian-timelines"
]

File diff suppressed because one or more lines are too long

@ -1,9 +0,0 @@
{
"id": "better-word-count",
"name": "Better Word Count",
"version": "0.9.4",
"description": "Counts the words of selected text in the editor.",
"author": "Luke Leppan",
"authorUrl": "https://lukeleppan.com",
"isDesktopOnly": false
}

@ -1,21 +0,0 @@
details.bwc-sb-item-setting {
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
padding: 10px 5px 20px 10px;
margin-top: 5px;
margin-bottom: 10px;
}
.bwc-sb-item-setting summary::marker {
font-size: 10px;
}
/* .bwc-sb-item-setting summary { */
/* margin-bottom: 5px; */
/* } */
.bwc-sb-item-setting summary span.bwc-sb-buttons {
float: right;
}
.bwc-status-bar-settings-title {
margin-bottom: 0px;
}

@ -4,9 +4,10 @@
"historyPriority": true,
"historyLimit": 100,
"history": [
":racehorse:",
":book:",
":tv:",
":plate_with_cutlery:",
":book:",
":fork_and_knife:",
":broken_heart:",
":warning:",

File diff suppressed because one or more lines are too long

@ -1,10 +1,10 @@
{
"id": "find-unlinked-files",
"name": "Find orphaned files and broken links",
"version": "1.8.1",
"version": "1.9.0",
"description": "Find files that are not linked anywhere and would otherwise be lost in your vault. In other words: files with no backlinks.",
"author": "Vinzent",
"fundingUrl": "https://ko-fi.com/vinzent",
"authorUrl": "https://github.com/Vinzent03",
"isDesktopOnly": false
}
}

File diff suppressed because one or more lines are too long

@ -1,10 +1,10 @@
{
"id": "meld-encrypt",
"name": "Meld Encrypt",
"version": "2.0.4",
"minAppVersion": "0.12.15",
"description": "Hide secrets in your valut",
"author": "meld-cp",
"authorUrl": "https://github.com/meld-cp/obsidian-encrypt",
"isDesktopOnly": false
}
{
"id": "meld-encrypt",
"name": "Meld Encrypt",
"version": "2.0.5",
"minAppVersion": "1.0.3",
"description": "Hide secrets in your vault",
"author": "meld-cp",
"authorUrl": "https://github.com/meld-cp/obsidian-encrypt",
"isDesktopOnly": false
}

@ -12,8 +12,8 @@
"checkpointList": [
{
"path": "/",
"date": "2023-03-26",
"size": 14150024
"date": "2023-04-03",
"size": 14281676
}
],
"activityHistory": [
@ -1782,7 +1782,39 @@
},
{
"date": "2023-03-26",
"value": 1412
"value": 1673
},
{
"date": "2023-03-27",
"value": 1346
},
{
"date": "2023-03-28",
"value": 109049
},
{
"date": "2023-03-29",
"value": 14231
},
{
"date": "2023-03-30",
"value": 1624
},
{
"date": "2023-03-31",
"value": 1403
},
{
"date": "2023-04-01",
"value": 1285
},
{
"date": "2023-04-02",
"value": 1292
},
{
"date": "2023-04-03",
"value": 1289
}
]
}

File diff suppressed because one or more lines are too long

@ -5,7 +5,7 @@
"isDesktopOnly": false,
"js": "main.js",
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "1.33.3",
"version": "1.34.0",
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03"
}

@ -1439,11 +1439,6 @@
"tags": 4,
"links": 1
},
"00.02 Inbox/The Fran Lebowitz Reader.md": {
"size": 1325,
"tags": 3,
"links": 2
},
"03.01 Reading list/@Reading master.md": {
"size": 3154,
"tags": 2,
@ -4595,7 +4590,7 @@
"links": 2
},
"03.02 Travels/Mallorca.md": {
"size": 2279,
"size": 2572,
"tags": 3,
"links": 1
},
@ -8894,11 +8889,6 @@
"tags": 1,
"links": 1
},
"00.02 Inbox/Au Revoir Là-Haut.md": {
"size": 975,
"tags": 1,
"links": 1
},
"00.03 News/Is Fox News Really Doomed.md": {
"size": 23014,
"tags": 3,
@ -8987,7 +8977,7 @@
"00.03 News/Adam Sandler doesnt need your respect. But hes getting it anyway..md": {
"size": 26315,
"tags": 4,
"links": 1
"links": 2
},
"00.01 Admin/Calendars/2023-03-22.md": {
"size": 1412,
@ -9037,7 +9027,7 @@
"00.03 News/The Limits and Wonders of John Wicks Last Fight.md": {
"size": 12024,
"tags": 3,
"links": 1
"links": 2
},
"00.03 News/Last Stand of the Hot Dog King.md": {
"size": 8583,
@ -9060,6 +9050,76 @@
"links": 2
},
"00.01 Admin/Calendars/2023-03-26.md": {
"size": 1412,
"tags": 0,
"links": 7
},
"00.01 Admin/Calendars/2023-03-27.md": {
"size": 1280,
"tags": 0,
"links": 5
},
"00.01 Admin/Calendars/2023-03-28.md": {
"size": 1278,
"tags": 0,
"links": 6
},
"00.03 News/Jaylen Brown Is Trying to Find a Balance.md": {
"size": 36224,
"tags": 4,
"links": 1
},
"00.03 News/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md": {
"size": 30666,
"tags": 2,
"links": 1
},
"00.03 News/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md": {
"size": 41483,
"tags": 4,
"links": 1
},
"00.03 News/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md": {
"size": 12951,
"tags": 4,
"links": 1
},
"00.01 Admin/Calendars/2023-03-29.md": {
"size": 1412,
"tags": 0,
"links": 6
},
"03.01 Reading list/Au Revoir Là-Haut.md": {
"size": 975,
"tags": 1,
"links": 2
},
"03.01 Reading list/The Fran Lebowitz Reader.md": {
"size": 1325,
"tags": 3,
"links": 3
},
"00.01 Admin/Calendars/2023-03-30.md": {
"size": 1412,
"tags": 0,
"links": 4
},
"00.01 Admin/Calendars/2023-03-31.md": {
"size": 1412,
"tags": 0,
"links": 4
},
"00.01 Admin/Calendars/2023-04-01.md": {
"size": 1412,
"tags": 0,
"links": 4
},
"00.01 Admin/Calendars/2023-04-02.md": {
"size": 1412,
"tags": 0,
"links": 4
},
"00.01 Admin/Calendars/2023-04-03.md": {
"size": 1412,
"tags": 0,
"links": 4
@ -9067,10 +9127,10 @@
},
"commitTypes": {
"/": {
"Refactor": 2760,
"Create": 1617,
"Link": 3919,
"Expand": 1585
"Refactor": 2767,
"Create": 1630,
"Link": 3944,
"Expand": 1586
}
},
"dailyCommits": {
@ -9082,18 +9142,18 @@
"4": 17,
"5": 13,
"6": 64,
"7": 616,
"8": 797,
"9": 690,
"10": 517,
"11": 401,
"12": 370,
"7": 617,
"8": 824,
"9": 693,
"10": 519,
"11": 403,
"12": 379,
"13": 420,
"14": 414,
"15": 417,
"16": 531,
"16": 532,
"17": 565,
"18": 759,
"18": 760,
"19": 482,
"20": 445,
"21": 449,
@ -9103,18 +9163,19 @@
},
"weeklyCommits": {
"/": {
"Mon": 2259,
"Tue": 1253,
"Wed": 1261,
"Thu": 850,
"Fri": 928,
"Mon": 2263,
"Tue": 1268,
"Wed": 1277,
"Thu": 853,
"Fri": 930,
"Sat": 0,
"Sun": 3330
"Sun": 3336
}
},
"recentCommits": {
"/": {
"Expanded": [
"<a class=\"internal-link\" href=\"03.02 Travels/Mallorca.md\"> Mallorca </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/@@Travels.md\"> @@Travels </a>",
"<a class=\"internal-link\" href=\"05.02 Networks/Server Alias.md\"> Server Alias </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2023-03-26 Mallorca.md\"> 2023-03-26 Mallorca </a>",
@ -9164,10 +9225,22 @@
"<a class=\"internal-link\" href=\"00.02 Inbox/Checkup.md\"> Checkup </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Health.md\"> Health </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Dr Awad Abuawad.md\"> Dr Awad Abuawad </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Power And The Glory.md\"> The Power And The Glory </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2023-03-06 Médecin.md\"> 2023-03-06 Médecin </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/The Power And The Glory.md\"> The Power And The Glory </a>"
],
"Created": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-03.md\"> 2023-04-03 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-02.md\"> 2023-04-02 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-01.md\"> 2023-04-01 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-31.md\"> 2023-03-31 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-30.md\"> 2023-03-30 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-29.md\"> 2023-03-29 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md\"> Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love” </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md\"> I Went on a Package Trip for Millennials Who Travel Alone. Help Me. </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Jaylen Brown Is Trying to Find a Balance.md\"> Jaylen Brown Is Trying to Find a Balance </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-28.md\"> 2023-03-28 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-27.md\"> 2023-03-27 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-26.md\"> 2023-03-26 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-25.md\"> 2023-03-25 </a>",
@ -9205,22 +9278,15 @@
"<a class=\"internal-link\" href=\"00.02 Inbox/The Camp of the Saints - 2017.md\"> The Camp of the Saints - 2017 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-17.md\"> 2023-03-17 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-16.md\"> 2023-03-16 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Korean Barbecue-Style Meatballs Recipe.md\"> Korean Barbecue-Style Meatballs Recipe </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Read Your Way Through Miami.md\"> Read Your Way Through Miami </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-15.md\"> 2023-03-15 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/John Wick - Chapter 3 - Parabellum (2019).md\"> John Wick - Chapter 3 - Parabellum (2019) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-14.md\"> 2023-03-14 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/John Wick - Chapter 2 (2017).md\"> John Wick - Chapter 2 (2017) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Bull elephants their importance as individuals in elephant societies - Africa Geographic.md\"> Bull elephants their importance as individuals in elephant societies - Africa Geographic </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Silicon Valley Bank Contagion Is Just Beginning.md\"> The Silicon Valley Bank Contagion Is Just Beginning </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/aglaedevilleneuve@yahoo.fr.md\"> aglaedevilleneuve@yahoo.fr </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-13.md\"> 2023-03-13 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/John Wick (2014).md\"> John Wick (2014) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/An Icelandic Town Goes All Out to Save Baby Puffins.md\"> An Icelandic Town Goes All Out to Save Baby Puffins </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Untold Story Of Notorious Influencer Andrew Tate.md\"> The Untold Story Of Notorious Influencer Andrew Tate </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How a civil war erupted at Fox News after the 2020 election.md\"> How a civil war erupted at Fox News after the 2020 election </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/Korean Barbecue-Style Meatballs Recipe.md\"> Korean Barbecue-Style Meatballs Recipe </a>"
],
"Renamed": [
"<a class=\"internal-link\" href=\"03.01 Reading list/The Fran Lebowitz Reader.md\"> The Fran Lebowitz Reader </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Au Revoir Là-Haut.md\"> Au Revoir Là-Haut </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.03 News/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md\"> Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love” </a>",
"<a class=\"internal-link\" href=\"00.03 News/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md\"> I Went on a Package Trip for Millennials Who Travel Alone. Help Me. </a>",
"<a class=\"internal-link\" href=\"00.03 News/Jaylen Brown Is Trying to Find a Balance.md\"> Jaylen Brown Is Trying to Find a Balance </a>",
"<a class=\"internal-link\" href=\"02.02 Paris/Narro.md\"> Narro </a>",
"<a class=\"internal-link\" href=\"00.03 News/How an FBI agent stained an NCAA basketball corruption probe.md\"> How an FBI agent stained an NCAA basketball corruption probe </a>",
"<a class=\"internal-link\" href=\"00.03 News/Last Stand of the Hot Dog King.md\"> Last Stand of the Hot Dog King </a>",
@ -9265,15 +9331,13 @@
"<a class=\"internal-link\" href=\"00.03 News/How a civil war erupted at Fox News after the 2020 election.md\"> How a civil war erupted at Fox News after the 2020 election </a>",
"<a class=\"internal-link\" href=\"00.03 News/Mel Brooks Isnt Done Punching Up the History of the World.md\"> Mel Brooks Isnt Done Punching Up the History of the World </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/William's Butcherstable.md\"> William's Butcherstable </a>",
"<a class=\"internal-link\" href=\"00.03 News/The One Big Question Bernie Sanders Wont Answer.md\"> The One Big Question Bernie Sanders Wont Answer </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Red Army (2014).md\"> Red Army (2014) </a>",
"<a class=\"internal-link\" href=\"00.03 News/On the Trail of the Fentanyl King.md\"> On the Trail of the Fentanyl King </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Emails/@Email template.md\"> @Email template </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Emails/@Email generation.md\"> @Email generation </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Emails/Email template.md\"> Email template </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Emails/Email generation.md\"> Email generation </a>"
"<a class=\"internal-link\" href=\"00.03 News/The One Big Question Bernie Sanders Wont Answer.md\"> The One Big Question Bernie Sanders Wont Answer </a>"
],
"Tagged": [
"<a class=\"internal-link\" href=\"00.03 News/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md\"> Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love” </a>",
"<a class=\"internal-link\" href=\"00.03 News/Jaylen Brown Is Trying to Find a Balance.md\"> Jaylen Brown Is Trying to Find a Balance </a>",
"<a class=\"internal-link\" href=\"00.03 News/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md\"> I Went on a Package Trip for Millennials Who Travel Alone. Help Me. </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Arles.md\"> Arles </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Narro.md\"> Narro </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Limits and Wonders of John Wicks Last Fight.md\"> The Limits and Wonders of John Wicks Last Fight </a>",
@ -9320,11 +9384,7 @@
"<a class=\"internal-link\" href=\"00.02 Inbox/2023-02-24 Kidney inflammation.md\"> 2023-02-24 Kidney inflammation </a>",
"<a class=\"internal-link\" href=\"01.06 Health/2023-01-23 Checkup.md\"> 2023-01-23 Checkup </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Checkup.md\"> Checkup </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Templates/Template Timeline.md\"> Template Timeline </a>",
"<a class=\"internal-link\" href=\"01.06 Health/Checkup.md\"> Checkup </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Health.md\"> Health </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Entertainment.md\"> Entertainment </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Sport.md\"> Sport </a>"
"<a class=\"internal-link\" href=\"00.01 Admin/Templates/Template Timeline.md\"> Template Timeline </a>"
],
"Refactored": [
"<a class=\"internal-link\" href=\"00.02 Inbox/Korean Barbecue-Style Meatballs Recipe.md\"> Korean Barbecue-Style Meatballs Recipe </a>",
@ -9380,6 +9440,7 @@
"<a class=\"internal-link\" href=\"01.02 Home/Zürich - Practical info.md\"> Zürich - Practical info </a>"
],
"Deleted": [
"<a class=\"internal-link\" href=\"00.02 Inbox/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Les Combrailles, à la découverte de lAuvergne secrète.md\"> Les Combrailles, à la découverte de lAuvergne secrète </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Untitled.md\"> Untitled </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/aglaedevilleneuve@yahoo.fr.md\"> aglaedevilleneuve@yahoo.fr </a>",
@ -9429,10 +9490,30 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2022-11-10 Dinner @ Swiss Re.md\"> 2022-11-10 Dinner @ Swiss Re </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/2022-11-06.md\"> 2022-11-06 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Lemon Chicken Recipe (with Lemon Butter Sauce) - NatashasKitchen.com.md\"> Lemon Chicken Recipe (with Lemon Butter Sauce) - NatashasKitchen.com </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/aglaedevilleneuve@yahoo.fr.md\"> aglaedevilleneuve@yahoo.fr </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Mail Import.md\"> Mail Import </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/aglaedevilleneuve@yahoo.fr.md\"> aglaedevilleneuve@yahoo.fr </a>"
],
"Linked": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-03.md\"> 2023-04-03 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-02.md\"> 2023-04-02 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-04-01.md\"> 2023-04-01 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-31.md\"> 2023-03-31 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-30.md\"> 2023-03-30 </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/The Fran Lebowitz Reader.md\"> The Fran Lebowitz Reader </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-28.md\"> 2023-03-28 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-29.md\"> 2023-03-29 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-26.md\"> 2023-03-26 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-27.md\"> 2023-03-27 </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Au Revoir Là-Haut.md\"> Au Revoir Là-Haut </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-29.md\"> 2023-03-29 </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md\"> How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution </a>",
"<a class=\"internal-link\" href=\"00.03 News/Adam Sandler doesnt need your respect. But hes getting it anyway..md\"> Adam Sandler doesnt need your respect. But hes getting it anyway. </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-28.md\"> 2023-03-28 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md\"> Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love” </a>",
"<a class=\"internal-link\" href=\"00.03 News/Jaylen Brown Is Trying to Find a Balance.md\"> Jaylen Brown Is Trying to Find a Balance </a>",
"<a class=\"internal-link\" href=\"00.03 News/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md\"> I Went on a Package Trip for Millennials Who Travel Alone. Help Me. </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-27.md\"> 2023-03-27 </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Limits and Wonders of John Wicks Last Fight.md\"> The Limits and Wonders of John Wicks Last Fight </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-26.md\"> 2023-03-26 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-26.md\"> 2023-03-26 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Narro.md\"> Narro </a>",
"<a class=\"internal-link\" href=\"00.03 News/Mel Brooks Isnt Done Punching Up the History of the World.md\"> Mel Brooks Isnt Done Punching Up the History of the World </a>",
@ -9462,28 +9543,7 @@
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Forever (1995).md\"> Batman Forever (1995) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-22.md\"> 2023-03-22 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Dark Knight Rises (2012).md\"> The Dark Knight Rises (2012) </a>",
"<a class=\"internal-link\" href=\"00.03 News/Are Helicopter Parents Actually Lazy.md\"> Are Helicopter Parents Actually Lazy </a>",
"<a class=\"internal-link\" href=\"00.03 News/Leopards Are Living among People. And That Could Save the Species.md\"> Leopards Are Living among People. And That Could Save the Species </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-22.md\"> 2023-03-22 </a>",
"<a class=\"internal-link\" href=\"00.03 News/Adam Sandler doesnt need your respect. But hes getting it anyway..md\"> Adam Sandler doesnt need your respect. But hes getting it anyway. </a>",
"<a class=\"internal-link\" href=\"00.03 News/How an FBI agent stained an NCAA basketball corruption probe - Los Angeles Times.md\"> How an FBI agent stained an NCAA basketball corruption probe - Los Angeles Times </a>",
"<a class=\"internal-link\" href=\"00.03 News/Leopards Are Living among People. And That Could Save the Species.md\"> Leopards Are Living among People. And That Could Save the Species </a>",
"<a class=\"internal-link\" href=\"00.03 News/Why Joe Bidens Honeymoon With Progressives Is Coming to an End.md\"> Why Joe Bidens Honeymoon With Progressives Is Coming to an End </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Brilliant Inventor Who Made Two of Historys Biggest Mistakes.md\"> The Brilliant Inventor Who Made Two of Historys Biggest Mistakes </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Are Helicopter Parents Actually Lazy.md\"> Are Helicopter Parents Actually Lazy </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Purposeful Presence of Lance Reddick.md\"> The Purposeful Presence of Lance Reddick </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-21.md\"> 2023-03-21 </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Begins (2005).md\"> Batman Begins (2005) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Robin (1997).md\"> Batman Robin (1997) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Forever (1995).md\"> Batman Forever (1995) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman (1989).md\"> Batman (1989) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Returns (1992).md\"> Batman Returns (1992) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/The Dark Knight (2008).md\"> The Dark Knight (2008) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-21.md\"> 2023-03-21 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-03-20.md\"> 2023-03-20 </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman (1989).md\"> Batman (1989) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Robin (1997).md\"> Batman Robin (1997) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Batman Returns (1992).md\"> Batman Returns (1992) </a>"
"<a class=\"internal-link\" href=\"00.03 News/Are Helicopter Parents Actually Lazy.md\"> Are Helicopter Parents Actually Lazy </a>"
],
"Removed Tags from": [
"<a class=\"internal-link\" href=\"00.03 News/Incredibly intelligent, highly elusive US faces new threat from Canadian super pig.md\"> Incredibly intelligent, highly elusive US faces new threat from Canadian super pig </a>",

@ -41357,7 +41357,7 @@ var require_moment = __commonJS({
__export(exports, {
default: () => FullCalendarPlugin
});
var import_obsidian13 = __toModule(require("obsidian"));
var import_obsidian12 = __toModule(require("obsidian"));
// src/ui/view.ts
var import_obsidian7 = __toModule(require("obsidian"));
@ -58342,6 +58342,7 @@ function renderCalendar(containerEl, eventSources, settings) {
initialView: ((_a = settings == null ? void 0 : settings.initialView) == null ? void 0 : _a[isNarrow ? "mobile" : "desktop"]) || (isNarrow ? "timeGrid3Days" : "timeGridWeek"),
nowIndicator: true,
scrollTimeReset: false,
dayMaxEvents: true,
headerToolbar: !isNarrow ? {
left: "prev,next today",
center: "title",
@ -62459,7 +62460,7 @@ function friendlyDateTime(dateTimeish) {
}
}
// src/interop.ts
// src/ui/interop.ts
var parseTime = (time) => {
let parsed = DateTime2.fromFormat(time, "h:mm a");
if (parsed.invalidReason) {
@ -63066,11 +63067,11 @@ var ReactModal = class extends import_obsidian2.Modal {
}
};
// src/parsing/caldav/import.ts
// src/calendars/parsing/caldav/import.ts
var import_color = __toModule(require_color());
var import_dav2 = __toModule(require_dav());
// src/parsing/caldav/transport.ts
// src/calendars/parsing/caldav/transport.ts
var import_co = __toModule(require_co());
var import_dav = __toModule(require_dav());
var import_obsidian3 = __toModule(require("obsidian"));
@ -63128,7 +63129,7 @@ var Basic = class extends import_dav.transport.Transport {
}
};
// src/parsing/caldav/import.ts
// src/calendars/parsing/caldav/import.ts
function importCalendars(auth, url) {
return __async(this, null, function* () {
try {
@ -63677,7 +63678,7 @@ function launchEditModal(plugin, eventId) {
})).open();
}
// src/tasks/index.ts
// src/ui/tasks/index.ts
var isTask = (e3) => e3.type === "single" && e3.completed !== void 0 && e3.completed !== null;
var unmakeTask = (event) => {
if (event.type !== "single") {
@ -63889,8 +63890,8 @@ var CalendarView = class extends import_obsidian7.ItemView {
this.callback = null;
}
this.callback = this.plugin.cache.on("update", (payload) => {
var _a;
if (payload.resync) {
var _a, _b, _c, _d;
if (payload.type === "resync") {
(_a = this.fullCalendarView) == null ? void 0 : _a.removeAllEventSources();
const sources2 = this.translateSources();
sources2.forEach((source) => {
@ -63898,34 +63899,46 @@ var CalendarView = class extends import_obsidian7.ItemView {
return (_a2 = this.fullCalendarView) == null ? void 0 : _a2.addEventSource(source);
});
return;
}
const { toRemove, toAdd } = payload;
console.debug("updating view from cache...", {
toRemove,
toAdd
});
toRemove.forEach((id) => {
var _a2;
const event = (_a2 = this.fullCalendarView) == null ? void 0 : _a2.getEventById(id);
if (event) {
console.debug("removing event", event.toPlainObject());
event.remove();
} else {
console.warn(`Event with id=${id} was slated to be removed but does not exist in the calendar.`);
}
});
toAdd.forEach(({ id, event, calendarId }) => {
var _a2;
const eventInput = toEventInput(id, event);
console.debug("adding event", {
id,
event,
eventInput,
calendarId
} else if (payload.type === "events") {
const { toRemove, toAdd } = payload;
console.debug("updating view from cache...", {
toRemove,
toAdd
});
const addedEvent = (_a2 = this.fullCalendarView) == null ? void 0 : _a2.addEvent(eventInput, calendarId);
console.debug("event that was added", addedEvent);
});
toRemove.forEach((id) => {
var _a2;
const event = (_a2 = this.fullCalendarView) == null ? void 0 : _a2.getEventById(id);
if (event) {
console.debug("removing event", event.toPlainObject());
event.remove();
} else {
console.warn(`Event with id=${id} was slated to be removed but does not exist in the calendar.`);
}
});
toAdd.forEach(({ id, event, calendarId }) => {
var _a2;
const eventInput = toEventInput(id, event);
console.debug("adding event", {
id,
event,
eventInput,
calendarId
});
const addedEvent = (_a2 = this.fullCalendarView) == null ? void 0 : _a2.addEvent(eventInput, calendarId);
console.debug("event that was added", addedEvent);
});
} else if (payload.type == "calendar") {
const {
calendar: { id, events, editable, color }
} = payload;
console.debug("replacing calendar with id", payload.calendar);
(_c = (_b = this.fullCalendarView) == null ? void 0 : _b.getEventSourceById(id)) == null ? void 0 : _c.remove();
(_d = this.fullCalendarView) == null ? void 0 : _d.addEventSource(__spreadValues({
id,
events: events.flatMap(({ id: id2, event }) => toEventInput(id2, event) || []),
editable
}, getCalendarColors(color)));
}
});
});
}
@ -63949,7 +63962,7 @@ var CalendarView = class extends import_obsidian7.ItemView {
};
// src/core/EventCache.ts
var import_obsidian10 = __toModule(require("obsidian"));
var import_obsidian9 = __toModule(require("obsidian"));
var import_deep_equal = __toModule(require_deep_equal());
// src/core/EventStore.ts
@ -64148,10 +64161,19 @@ var RemoteCalendar = class extends Calendar2 {
};
// src/calendars/FullNoteCalendar.ts
var import_obsidian9 = __toModule(require("obsidian"));
// src/serialization/frontmatter.ts
var import_obsidian8 = __toModule(require("obsidian"));
var basenameFromEvent = (event) => {
switch (event.type) {
case void 0:
case "single":
return `${event.date} ${event.title}`;
case "recurring":
return `(Every ${event.daysOfWeek.join(",")}) ${event.title}`;
case "rrule":
return `(${rrulestr(event.rrule).toText()}) ${event.title}`;
}
};
var filenameForEvent = (event) => `${basenameFromEvent(event)}.md`;
var FRONTMATTER_SEPARATOR = "---";
function hasFrontmatter(page) {
return page.indexOf(FRONTMATTER_SEPARATOR) === 0 && page.slice(3).indexOf(FRONTMATTER_SEPARATOR) !== -1;
@ -64222,20 +64244,6 @@ function modifyFrontmatterString(page, modifications) {
}
return replaceFrontmatter(page, newFrontmatter2.join("\n") + "\n");
}
// src/calendars/FullNoteCalendar.ts
var basenameFromEvent = (event) => {
switch (event.type) {
case void 0:
case "single":
return `${event.date} ${event.title}`;
case "recurring":
return `(Every ${event.daysOfWeek.join(",")}) ${event.title}`;
case "rrule":
return `(${rrulestr(event.rrule).toText()}) ${event.title}`;
}
};
var filenameForEvent = (event) => `${basenameFromEvent(event)}.md`;
var FullNoteCalendar = class extends EditableCalendar {
constructor(app, color, directory) {
super(color);
@ -64270,9 +64278,9 @@ var FullNoteCalendar = class extends EditableCalendar {
getEventsInFolderRecursive(folder) {
return __async(this, null, function* () {
const events = yield Promise.all(folder.children.map((file) => __async(this, null, function* () {
if (file instanceof import_obsidian9.TFile) {
if (file instanceof import_obsidian8.TFile) {
return yield this.getEventsInFile(file);
} else if (file instanceof import_obsidian9.TFolder) {
} else if (file instanceof import_obsidian8.TFolder) {
return yield this.getEventsInFolderRecursive(file);
} else {
return [];
@ -64287,12 +64295,12 @@ var FullNoteCalendar = class extends EditableCalendar {
if (!eventFolder) {
throw new Error(`Cannot get folder ${this.directory}`);
}
if (!(eventFolder instanceof import_obsidian9.TFolder)) {
if (!(eventFolder instanceof import_obsidian8.TFolder)) {
throw new Error(`${eventFolder} is not a directory.`);
}
const events = [];
for (const file of eventFolder.children) {
if (file instanceof import_obsidian9.TFile) {
if (file instanceof import_obsidian8.TFile) {
const results = yield this.getEventsInFile(file);
events.push(...results);
}
@ -64411,8 +64419,9 @@ var EventCache = class {
this.initialized = false;
this.calendarInfos = infos;
this.pkCounter = 0;
this.updateViews(this.store.clear(), []);
this.calendars.clear();
this.store.clear();
this.resync();
this.init();
}
init() {
@ -64441,7 +64450,7 @@ var EventCache = class {
}
resync() {
for (const callback of this.updateViewCallbacks) {
callback({ resync: true });
callback({ type: "resync" });
}
}
getAllEvents() {
@ -64512,7 +64521,12 @@ var EventCache = class {
toAdd
};
for (const callback of this.updateViewCallbacks) {
callback(__spreadValues({ resync: false }, payload));
callback(__spreadValues({ type: "events" }, payload));
}
}
updateCalendar(calendar) {
for (const callback of this.updateViewCallbacks) {
callback({ type: "calendar", calendar });
}
}
addEvent(calendarId, event) {
@ -64682,16 +64696,21 @@ var EventCache = class {
event
});
});
this.updateViews(deletedEvents, newEvents);
this.updateCalendar({
id: calendar.id,
editable: false,
color: calendar.color,
events: newEvents
});
});
});
Promise.allSettled(promises).then((results) => {
this.revalidating = false;
this.lastRevalidation = Date.now();
new import_obsidian10.Notice("All remote calendars have been fetched.");
new import_obsidian9.Notice("All remote calendars have been fetched.");
const errors = results.flatMap((result) => result.status === "rejected" ? result.reason : []);
if (errors.length > 0) {
new import_obsidian10.Notice("A remote calendar failed to load. Check the console for more details.");
new import_obsidian9.Notice("A remote calendar failed to load. Check the console for more details.");
errors.forEach((reason) => {
console.error(`Revalidation failed with reason: ${reason}`);
});
@ -64704,7 +64723,7 @@ var EventCache = class {
};
// src/ObsidianAdapter.ts
var import_obsidian11 = __toModule(require("obsidian"));
var import_obsidian10 = __toModule(require("obsidian"));
var ObsidianIO = class {
constructor(app, systemTrash = true) {
this.vault = app.vault;
@ -64745,7 +64764,7 @@ var ObsidianIO = class {
if (!f3) {
return null;
}
if (!(f3 instanceof import_obsidian11.TFile)) {
if (!(f3 instanceof import_obsidian10.TFile)) {
return null;
}
return f3;
@ -64789,8 +64808,7 @@ var ObsidianIO = class {
// src/calendars/DailyNoteCalendar.ts
var import_moment = __toModule(require_moment());
var import_obsidian_daily_notes_interface2 = __toModule(require_main());
// src/serialization/inline.ts
var DATE_FORMAT = "YYYY-MM-DD";
var parseBool = (s4) => s4 === "true" ? true : s4 === "false" ? false : s4;
var fieldRegex = /\[([^\]]+):: ?([^\]]+)\]/g;
function getInlineAttributes(s4) {
@ -64909,9 +64927,6 @@ var addToHeading = (page, { heading, item, headingText }) => {
return { page: lines.join("\n"), lineNumber: lines.length - 1 };
}
};
// src/calendars/DailyNoteCalendar.ts
var DATE_FORMAT = "YYYY-MM-DD";
var DailyNoteCalendar = class extends EditableCalendar {
constructor(app, color, heading) {
super(color);
@ -65075,9 +65090,9 @@ var DailyNoteCalendar = class extends EditableCalendar {
};
// src/calendars/ICSCalendar.ts
var import_obsidian12 = __toModule(require("obsidian"));
var import_obsidian11 = __toModule(require("obsidian"));
// src/parsing/ics.ts
// src/calendars/parsing/ics.ts
var import_ical = __toModule(require_ical());
function getDate2(t3) {
return DateTime2.fromSeconds(t3.toUnixTime(), { zone: "UTC" }).toISODate();
@ -65107,7 +65122,7 @@ function icsToOFC(input) {
return __spreadValues({
type: "rrule",
title: input.summary,
id: `ics::${input.uid}::${DateTime2.fromJSDate(rrule.options.dtstart).toISODate()}::recurring`,
id: `ics::${input.uid}::${getDate2(input.startDate)}::recurring`,
rrule: rrule.toString(),
skipDates: exdates,
startDate: getDate2(input.startDate.convertToZone(import_ical.default.Timezone.utcTimezone))
@ -65186,7 +65201,7 @@ var ICSCalendar = class extends RemoteCalendar {
revalidate() {
return __async(this, null, function* () {
console.debug("revalidating ICS calendar " + this.name);
this.response = yield (0, import_obsidian12.request)({
this.response = yield (0, import_obsidian11.request)({
url: this.url,
method: "GET"
});
@ -65248,7 +65263,7 @@ var CalDAVCalendar = class extends RemoteCalendar {
};
// src/main.ts
var FullCalendarPlugin = class extends import_obsidian13.Plugin {
var FullCalendarPlugin = class extends import_obsidian12.Plugin {
constructor() {
super(...arguments);
this.settings = DEFAULT_SETTINGS;
@ -65290,13 +65305,13 @@ var FullCalendarPlugin = class extends import_obsidian13.Plugin {
this.cache.fileUpdated(file);
}));
this.registerEvent(this.app.vault.on("rename", (file, oldPath) => {
if (file instanceof import_obsidian13.TFile) {
if (file instanceof import_obsidian12.TFile) {
console.debug("FILE RENAMED", file.path);
this.cache.deleteEventsAtPath(oldPath);
}
}));
this.registerEvent(this.app.vault.on("delete", (file) => {
if (file instanceof import_obsidian13.TFile) {
if (file instanceof import_obsidian12.TFile) {
console.debug("FILE DELETED", file.path);
this.cache.deleteEventsAtPath(file.path);
}
@ -65322,7 +65337,7 @@ var FullCalendarPlugin = class extends import_obsidian13.Plugin {
this.cache.reset(this.settings.calendarSources);
this.app.workspace.detachLeavesOfType(FULL_CALENDAR_VIEW_TYPE);
this.app.workspace.detachLeavesOfType(FULL_CALENDAR_SIDEBAR_VIEW_TYPE);
new import_obsidian13.Notice("Full Calendar has been reset.");
new import_obsidian12.Notice("Full Calendar has been reset.");
}
});
this.addCommand({
@ -65368,7 +65383,7 @@ var FullCalendarPlugin = class extends import_obsidian13.Plugin {
}
saveSettings() {
return __async(this, null, function* () {
new import_obsidian13.Notice("Resetting the event cache with new settings...");
new import_obsidian12.Notice("Resetting the event cache with new settings...");
yield this.saveData(this.settings);
this.cache.reset(this.settings.calendarSources);
yield this.cache.populate();

@ -1,7 +1,7 @@
{
"id": "obsidian-full-calendar",
"name": "Full Calendar",
"version": "0.10.5",
"version": "0.10.6",
"minAppVersion": "0.16.3",
"description": "Obsidian integration with Full Calendar (fullcalendar.io)",
"author": "Davis Haupt",

@ -281,7 +281,7 @@
"01.03 Family/Louis Bédier.md": [
{
"title": ":birthday: **[[Louis Bédier|Louis]]** %%done_del%%",
"time": "2023-03-31",
"time": "2024-03-31",
"rowNumber": 106
}
],
@ -357,39 +357,39 @@
],
"01.02 Home/Household.md": [
{
"title": ":couch_and_lamp: [[Household]]: Replace the sofa",
"time": "2023-06-30",
"rowNumber": 59
"title": ":bed: [[Household]] Change bedsheets %%done_del%%",
"time": "2023-04-01",
"rowNumber": 106
},
{
"title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%",
"time": "2023-03-28",
"rowNumber": 75
"title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%",
"time": "2023-04-03",
"rowNumber": 97
},
{
"title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%",
"time": "2023-04-04",
"rowNumber": 80
"rowNumber": 81
},
{
"title": "🛎️ :house: [[Household]]: Pay rent %%done_del%%",
"time": "2023-04-30",
"rowNumber": 90
"title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%",
"time": "2023-04-11",
"rowNumber": 75
},
{
"title": "🛎 🛍 REMINDER [[Household]]: Monthly shop in France %%done_del%%",
"time": "2023-04-29",
"rowNumber": 93
"rowNumber": 94
},
{
"title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%",
"time": "2023-04-03",
"rowNumber": 96
"title": "🛎 :house: [[Household]]: Pay rent %%done_del%%",
"time": "2023-04-30",
"rowNumber": 91
},
{
"title": ":bed: [[Household]] Change bedsheets %%done_del%%",
"time": "2023-04-01",
"rowNumber": 105
"title": ":couch_and_lamp: [[Household]]: Replace the sofa",
"time": "2023-06-30",
"rowNumber": 59
}
],
"01.03 Family/Pia Bousquié.md": [
@ -632,11 +632,6 @@
"time": "2023-06-30",
"rowNumber": 91
},
{
"title": "11:27 :coat: [[2023-01-03|Memo]], [[@Lifestyle|Lifestyle]]: Find a winter coat (sporty)",
"time": "2023-04-30",
"rowNumber": 93
},
{
"title": "13:08 🛞 [[2023-01-03|Memo]], [[@Life Admin|Admin]]: Buy summer tires",
"time": "2023-04-10",
@ -672,7 +667,7 @@
"01.02 Home/Real Estate.md": [
{
"title": "🏡 [[Real Estate|RE Project]]: Get an appointment with [[@@MRCK|Meggi-mo]] with UBS on mortgages",
"time": "2023-03-31",
"time": "2023-04-30",
"rowNumber": 63
}
],
@ -703,7 +698,7 @@
"00.01 Admin/Calendars/2023-02-01.md": [
{
"title": "12:29 :moneybag: [[2023-02-01|Memo]], [[@Finances|Finances]]: Tax declaration 2022",
"time": "2023-03-15",
"time": "2023-04-10",
"rowNumber": 103
}
],
@ -734,7 +729,7 @@
"00.01 Admin/Calendars/2023-03-03.md": [
{
"title": "16:32 :cat2: [[2023-03-03|Memo]], [[Pet note|Pet]]: Tell Wincasa about the arrival of the kitten in June",
"time": "2023-03-31",
"time": "2023-04-30",
"rowNumber": 106
}
],
@ -790,13 +785,6 @@
"rowNumber": 68
}
],
"00.01 Admin/Calendars/2023-03-05.md": [
{
"title": "18:11 💻 [[2023-03-05|Memo]], [[Server Tools]]: organise utilities (Postfix & others)",
"time": "2023-04-05",
"rowNumber": 108
}
],
"01.06 Health/2023-02-24 Kidney inflammation.md": [
{
"title": "🩺 [[2023-02-24 Kidney inflammation]]: organise a follow up to check **polype** in the gallbladder",

@ -1,23 +0,0 @@
{
"snippetList": [
{
"repo": "https://github.com/efemkay/obsidian-modular-css-layout",
"snippetsContents": [
{
"name": "MCL Gallery Cards.css",
"lastUpdate": "2022-11-28T02:12:53Z"
},
{
"name": "MCL Multi Column.css",
"lastUpdate": "2022-11-28T02:12:53Z"
},
{
"name": "MCL Wide Views.css",
"lastUpdate": "2022-11-18T15:21:49Z"
}
]
}
],
"excludedSnippet": "",
"errorSnippet": ""
}

File diff suppressed because it is too large Load Diff

@ -1,10 +0,0 @@
{
"id": "obsidian-snippet-downloader",
"name": "Snippet Downloader",
"version": "2.0.1",
"minAppVersion": "0.12.0",
"description": "A obsidian's plugin to help to manage css snippets (download / update) from repository ",
"author": "Mara-Li",
"authorUrl": "www.mara-li.fr",
"isDesktopOnly": false
}

@ -1,18 +0,0 @@
.setting-item.snippets-downloader-settings {
border: none;
padding: 0.5em 1em;
}
summary.snippets-downloader-summary {
height: 2em;
margin-bottom: 1em;
}
.setting-item.snippets-downloader-options {
top:-2em;
position: relative;
}
button.snippets-downloader-button {
background: transparent !important;
border: none !important;
box-shadow: none !important;
}

File diff suppressed because one or more lines are too long

@ -1,10 +0,0 @@
{
"id": "obsidian-stopwatch-plugin",
"name": "Stopwatch Plugin",
"version": "0.0.8",
"minAppVersion": "0.9.12",
"description": "Display stopwatch on Obsidian!",
"author": "Tokuhiro Matsuno",
"authorUrl": "https://64p.org",
"isDesktopOnly": false
}

@ -1,8 +0,0 @@
.stopwatch-time {
font-size: 180%;
margin-bottom: 10px;
}
.settings-interval-alert {
color: red;
}

File diff suppressed because one or more lines are too long

@ -1,10 +1,11 @@
{
"id": "obsidian-tasks-plugin",
"name": "Tasks",
"version": "2.0.0",
"version": "2.0.1",
"minAppVersion": "0.14.6",
"description": "Task management for Obsidian",
"author": "Martin Schenck and Clare Macrae",
"authorUrl": "https://github.com/obsidian-tasks-group",
"fundingUrl": "https://github.com/sponsors/claremacrae",
"isDesktopOnly": false
}

@ -1,7 +0,0 @@
{
"template": "{{text}}\n> [Wikipedia]({{url}})",
"shouldUseParagraphTemplate": true,
"shouldBoldSearchTerm": true,
"paragraphTemplate": "> {{paragraphText}}\n>\n",
"language": "en"
}

File diff suppressed because one or more lines are too long

@ -1,10 +0,0 @@
{
"id": "obsidian-wikipedia",
"name": "Wikipedia",
"version": "1.0.3",
"minAppVersion": "0.9.12",
"description": "Grabs information from Wikipedia for a topic and brings it into Obsidian notes",
"author": "Jonathan Miller",
"authorUrl": "https://jmill.dev",
"isDesktopOnly": false
}

@ -48,7 +48,7 @@
"devMode": false,
"templateFolderPath": "00.01 Admin/Templates",
"announceUpdates": true,
"version": "0.16.0",
"version": "0.17.1",
"migrations": {
"migrateToMacroIDFromEmbeddedMacro": true,
"useQuickAddTemplateFolder": true,

@ -4952,6 +4952,7 @@ var CaptureChoice = class extends Choice {
enabled: false,
after: "",
insertAtEnd: false,
considerSubsections: false,
createIfNotFound: false,
createIfNotFoundLocation: "top"
};
@ -6744,7 +6745,7 @@ var TextInputSuggest = class {
return;
}
state.styles.popper.width = targetWidth;
instance18.update();
void instance18.update();
},
phase: "beforeWrite",
requires: ["computeStyles"]
@ -8814,7 +8815,7 @@ var FolderList = class extends SvelteComponent {
};
var FolderList_default = FolderList;
// src/utility.ts
// src/utilityObsidian.ts
var import_obsidian8 = require("obsidian");
function getTemplater(app2) {
return app2.plugins.plugins["templater-obsidian"];
@ -8878,23 +8879,6 @@ function getUserScriptMemberAccess(fullMemberPath) {
memberAccess: fullMemberArray.slice(1)
};
}
function waitFor(ms) {
return new Promise((res) => setTimeout(res, ms));
}
function getLinesInString(input) {
const lines = [];
let tempString = input;
while (tempString.contains("\n")) {
const lineEndIndex = tempString.indexOf("\n");
lines.push(tempString.slice(0, lineEndIndex));
tempString = tempString.slice(lineEndIndex + 1);
}
lines.push(tempString);
return lines;
}
function escapeRegExp(text2) {
return text2.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
async function openFile(app2, file, optional) {
let leaf;
if (optional.openInNewTab && optional.direction) {
@ -8908,7 +8892,7 @@ async function openFile(app2, file, optional) {
}
if (optional?.mode) {
const leafViewState = leaf.getViewState();
leaf.setViewState({
await leaf.setViewState({
...leafViewState,
state: {
...leafViewState.state,
@ -9131,9 +9115,7 @@ var Formatter = class {
const nld = this.getNaturalLanguageDates();
if (!nld || !nld.parseDate || typeof nld.parseDate !== "function")
continue;
const parseAttempt = nld.parseDate(
this.variables.get(variableName)
);
const parseAttempt = nld.parseDate(this.variables.get(variableName));
if (parseAttempt)
this.variables.set(
variableName,
@ -9442,7 +9424,7 @@ var TemplateChoiceBuilder = class extends ChoiceBuilder {
});
const formatDisplay = this.contentEl.createEl("span");
const displayFormatter = new FileNameDisplayFormatter(this.app);
(async () => formatDisplay.textContent = await displayFormatter.format(
void (async () => formatDisplay.textContent = await displayFormatter.format(
this.choice.fileNameFormat.format
))();
const formatInput = new import_obsidian9.TextComponent(this.contentEl);
@ -9663,8 +9645,8 @@ var QuickAddEngine = class {
async fileExists(filePath) {
return await this.app.vault.adapter.exists(filePath);
}
async getFileByPath(filePath) {
const file = await this.app.vault.getAbstractFileByPath(filePath);
getFileByPath(filePath) {
const file = this.app.vault.getAbstractFileByPath(filePath);
if (!file) {
log.logError(`${filePath} not found`);
throw new Error(`${filePath} not found`);
@ -9682,12 +9664,11 @@ var QuickAddEngine = class {
let dirName = "";
if (dirMatch)
dirName = dirMatch[1];
if (await this.app.vault.adapter.exists(dirName)) {
return await this.app.vault.create(filePath, fileContent);
} else {
const dir = app.vault.getAbstractFileByPath(dirName);
if (!dir || !(dir instanceof import_obsidian10.TFolder)) {
await this.createFolder(dirName);
return await this.app.vault.create(filePath, fileContent);
}
return await this.app.vault.create(filePath, fileContent);
}
};
@ -9763,12 +9744,14 @@ var GenericInfoDialog = class extends import_obsidian12.Modal {
if (String.isString(this.text))
this.contentEl.createEl("p", { text: this.text });
else if (Array.isArray(this.text))
this.text.forEach((line) => this.contentEl.createEl("p", { text: line }));
this.text.forEach(
(line) => this.contentEl.createEl("p", { text: line })
);
const buttonsDiv = this.contentEl.createDiv();
const noButton = new import_obsidian12.ButtonComponent(buttonsDiv).setButtonText("OK").onClick(() => this.close());
Object.assign(buttonsDiv.style, {
"display": "flex",
"justifyContent": "flex-end"
display: "flex",
justifyContent: "flex-end"
});
noButton.buttonEl.focus();
}
@ -10211,7 +10194,7 @@ var SelectLinkOnActiveLineCommand = class extends EditorCommand {
constructor() {
super("Select link on active line" /* SelectLinkOnActiveLine */);
}
static async run(app2) {
static run(app2) {
const activeView = EditorCommand.getActiveMarkdownView(app2);
const { line: lineNumber } = activeView.editor.getCursor();
const line = activeView.editor.getLine(lineNumber);
@ -10229,6 +10212,25 @@ var SelectLinkOnActiveLineCommand = class extends EditorCommand {
}
};
// src/utility.ts
function waitFor(ms) {
return new Promise((res) => setTimeout(res, ms));
}
function getLinesInString(input) {
const lines = [];
let tempString = input;
while (tempString.includes("\n")) {
const lineEndIndex = tempString.indexOf("\n");
lines.push(tempString.slice(0, lineEndIndex));
tempString = tempString.slice(lineEndIndex + 1);
}
lines.push(tempString);
return lines;
}
function escapeRegExp(text2) {
return text2.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
// src/engine/MacroChoiceEngine.ts
var MacroChoiceEngine = class extends QuickAddChoiceEngine {
constructor(app2, plugin, choice, macros, choiceExecutor, variables) {
@ -10261,7 +10263,7 @@ var MacroChoiceEngine = class extends QuickAddChoiceEngine {
async executeCommands(commands2) {
for (const command of commands2) {
if (command?.type === "Obsidian" /* Obsidian */)
await this.executeObsidianCommand(command);
this.executeObsidianCommand(command);
if (command?.type === "UserScript" /* UserScript */)
await this.executeUserScript(command);
if (command?.type === "Choice" /* Choice */)
@ -10293,13 +10295,24 @@ var MacroChoiceEngine = class extends QuickAddChoiceEngine {
if (userScript.settings) {
this.userScriptCommand = command;
}
await this.userScriptDelegator(userScript);
try {
await this.userScriptDelegator(userScript);
} catch (error) {
log.logError(
`failed to run user script ${command.name}. Error:
${error.message}`
);
}
if (this.userScriptCommand)
this.userScriptCommand = null;
}
async runScriptWithSettings(userScript, command) {
if (typeof userScript !== "function" && userScript.entry && typeof userScript.entry === "function") {
return await this.onExportIsFunction(userScript.entry, command.settings);
return await this.onExportIsFunction(
userScript.entry,
command.settings
);
}
if (typeof userScript === "function") {
return await this.onExportIsFunction(userScript, command.settings);
@ -10336,8 +10349,16 @@ var MacroChoiceEngine = class extends QuickAddChoiceEngine {
this.output = await userScript(this.params, settings || {});
}
async onExportIsObject(obj) {
if (Object.keys(obj).length === 0) {
throw new Error(
`user script in macro for '${this.choice.name}' is an empty object`
);
}
if (this.userScriptCommand && obj.entry !== null) {
await this.runScriptWithSettings(obj, this.userScriptCommand);
await this.runScriptWithSettings(
obj,
this.userScriptCommand
);
return;
}
try {
@ -10385,10 +10406,10 @@ var MacroChoiceEngine = class extends QuickAddChoiceEngine {
await PasteCommand.run(this.app);
break;
case "Select active line" /* SelectActiveLine */:
await SelectActiveLineCommand.run(this.app);
SelectActiveLineCommand.run(this.app);
break;
case "Select link on active line" /* SelectLinkOnActiveLine */:
await SelectLinkOnActiveLineCommand.run(this.app);
SelectLinkOnActiveLineCommand.run(this.app);
break;
}
}
@ -11881,7 +11902,7 @@ var CaptureChoiceBuilder = class extends ChoiceBuilder {
const captureToFileContainer = captureToContainer.createDiv("captureToFileContainer");
const formatDisplay = captureToFileContainer.createEl("span");
const displayFormatter = new FileNameDisplayFormatter(this.app);
(async () => formatDisplay.textContent = await displayFormatter.format(
void (async () => formatDisplay.textContent = await displayFormatter.format(
this.choice.captureTo
))();
const formatInput = new import_obsidian22.TextComponent(captureToFileContainer);
@ -11955,7 +11976,7 @@ var CaptureChoiceBuilder = class extends ChoiceBuilder {
});
const insertAfterFormatDisplay = this.contentEl.createEl("span");
const displayFormatter = new FormatDisplayFormatter(this.app, this.plugin);
(async () => insertAfterFormatDisplay.innerText = await displayFormatter.format(
void (async () => insertAfterFormatDisplay.innerText = await displayFormatter.format(
this.choice.insertAfter.after
))();
insertAfterInput = new import_obsidian22.TextComponent(this.contentEl);
@ -11980,6 +12001,29 @@ var CaptureChoiceBuilder = class extends ChoiceBuilder {
(value) => this.choice.insertAfter.insertAtEnd = value
)
);
const considerSubsectionsSetting = new import_obsidian22.Setting(
this.contentEl
);
considerSubsectionsSetting.setName("Consider subsections").setDesc(
"Enabling this will insert the text at the end of the section & its subsections, rather than just at the end of the target section.A section is defined by a heading, and its subsections are all the headings inside that section."
).addToggle(
(toggle) => toggle.setValue(this.choice.insertAfter?.considerSubsections).onChange(
(value) => {
if (!value) {
this.choice.insertAfter.considerSubsections = false;
return;
}
const targetIsHeading = this.choice.insertAfter.after.startsWith("#");
if (targetIsHeading) {
this.choice.insertAfter.considerSubsections = value;
} else {
this.choice.insertAfter.considerSubsections = false;
log.logError("'Consider subsections' can only be enabled if the insert after line starts with a # (heading).");
this.display();
}
}
)
);
const createLineIfNotFound = new import_obsidian22.Setting(this.contentEl);
createLineIfNotFound.setName("Create line if not found").setDesc("Creates the 'insert after' line if it is not found.").addToggle((toggle) => {
if (!this.choice.insertAfter?.createIfNotFound)
@ -12020,7 +12064,7 @@ var CaptureChoiceBuilder = class extends ChoiceBuilder {
new FormatSyntaxSuggester(this.app, textField.inputEl, this.plugin);
const formatDisplay = this.contentEl.createEl("span");
const displayFormatter = new FormatDisplayFormatter(this.app, this.plugin);
(async () => formatDisplay.innerText = await displayFormatter.format(
void (async () => formatDisplay.innerText = await displayFormatter.format(
this.choice.format.format
))();
}
@ -12850,7 +12894,7 @@ var UserScriptSettingsModal = class extends import_obsidian23.Modal {
}
addDropdown(name, options, value) {
new import_obsidian23.Setting(this.contentEl).setName(name).addDropdown((dropdown) => {
options.forEach((item) => dropdown.addOption(item, item));
options.forEach((item) => void dropdown.addOption(item, item));
dropdown.setValue(value);
dropdown.onChange((value2) => this.command.settings[name] = value2);
});
@ -12871,7 +12915,7 @@ var UserScriptSettingsModal = class extends import_obsidian23.Modal {
input.inputEl.style.width = "100%";
input.inputEl.style.height = "100px";
input.inputEl.style.marginBottom = "1em";
(async () => formatDisplay.innerText = await displayFormatter.format(value))();
void (async () => formatDisplay.innerText = await displayFormatter.format(value))();
}
};
@ -13620,9 +13664,7 @@ var MacroBuilder = class extends import_obsidian25.Modal {
let input;
const addObsidianCommandFromInput = () => {
const value = input.getValue();
const obsidianCommand = this.commands.find(
(v) => v.name === value
);
const obsidianCommand = this.commands.find((v) => v.name === value);
if (!obsidianCommand) {
log.logError(
`Could not find Obsidian command with name "${value}"`
@ -13961,7 +14003,7 @@ var MacroChoiceBuilder = class extends ChoiceBuilder {
const createMacroButton = new import_obsidian26.ButtonComponent(
createMacroButtonContainer
);
createMacroButton.setIcon("plus").setCta().setTooltip("Create Macro").onClick(async () => {
createMacroButton.setIcon("plus").setCta().setTooltip("Create Macro").onClick(() => {
try {
const macro = settingsStore.createMacro(this.choice.name);
this.choice.macroId = macro.id;
@ -14534,10 +14576,12 @@ var QuickAddSettingsTab = class extends import_obsidian30.PluginSettingTab {
addAnnounceUpdatesSetting() {
const setting = new import_obsidian30.Setting(this.containerEl);
setting.setName("Announce Updates");
setting.setDesc("Display release notes when a new version is installed. This includes new features, demo videos, and bug fixes.");
setting.setDesc(
"Display release notes when a new version is installed. This includes new features, demo videos, and bug fixes."
);
setting.addToggle((toggle) => {
toggle.setValue(settingsStore.getState().announceUpdates);
toggle.onChange(async (value) => {
toggle.onChange((value) => {
settingsStore.setState({ announceUpdates: value });
});
});
@ -14556,11 +14600,11 @@ var QuickAddSettingsTab = class extends import_obsidian30.PluginSettingTab {
app: this.app,
plugin: this.plugin,
choices: settingsStore.getState().choices,
saveChoices: async (choices) => {
saveChoices: (choices) => {
settingsStore.setState({ choices });
},
macros: settingsStore.getState().macros,
saveMacros: async (macros) => {
saveMacros: (macros) => {
settingsStore.setState({ macros });
}
}
@ -14590,7 +14634,7 @@ var QuickAddSettingsTab = class extends import_obsidian30.PluginSettingTab {
"Path to the folder where templates are stored. Used to suggest template files when configuring QuickAdd."
);
setting.addText((text2) => {
text2.setPlaceholder("templates/").setValue(settingsStore.getState().templateFolderPath).onChange(async (value) => {
text2.setPlaceholder("templates/").setValue(settingsStore.getState().templateFolderPath).onChange((value) => {
settingsStore.setState({ templateFolderPath: value });
});
new GenericTextSuggester(
@ -14665,7 +14709,7 @@ var StartupMacroEngine = class extends MacroChoiceEngine {
async run() {
this.macros.forEach((macro) => {
if (macro.runOnStartup) {
this.executeCommands(macro.commands);
void this.executeCommands(macro.commands);
}
});
}
@ -14837,6 +14881,136 @@ var TemplateChoiceEngine = class extends TemplateEngine {
}
};
// src/formatters/helpers/getEndOfSection.ts
function isSameHeading(heading1, heading2) {
return heading1.line === heading2.line;
}
function getMarkdownHeadings(bodyLines) {
const headers = [];
bodyLines.forEach((line, index) => {
const match = line.match(/^(#+)[\s]?(.*)$/);
if (!match)
return;
headers.push({
level: match[1].length,
text: match[2],
line: index
});
});
return headers;
}
function getEndOfSection(lines, targetLine, shouldConsiderSubsections = false) {
const headings = getMarkdownHeadings(lines);
const targetHeading = headings.find(
(heading) => heading.line === targetLine
);
const targetIsHeading = !!targetHeading;
if (!targetIsHeading && shouldConsiderSubsections) {
throw new Error(
`Target line ${targetLine} is not a heading, but we are trying to find the end of its section.`
);
}
if (!targetIsHeading && !shouldConsiderSubsections) {
const nextEmptyStringIdx = findNextIdx(
lines,
targetLine,
(str) => str.trim() === ""
);
if (nextEmptyStringIdx !== null && nextEmptyStringIdx > targetLine) {
return nextEmptyStringIdx - 1;
}
return targetLine;
}
const lastLineInBodyIdx = lines.length - 1;
const endOfSectionLineIdx = getEndOfSectionLineByHeadings(
targetHeading,
headings,
lines,
shouldConsiderSubsections
);
const lastNonEmptyLineInSectionIdx = findPriorIdx(
lines,
endOfSectionLineIdx,
(str) => str.trim() !== ""
);
if (lastNonEmptyLineInSectionIdx !== null) {
if (lastNonEmptyLineInSectionIdx + 1 === lastLineInBodyIdx) {
return endOfSectionLineIdx;
}
if (lastNonEmptyLineInSectionIdx === 0) {
return lastNonEmptyLineInSectionIdx + 1;
}
return lastNonEmptyLineInSectionIdx;
}
return endOfSectionLineIdx;
}
function getEndOfSectionLineByHeadings(targetHeading, headings, lines, shouldConsiderSubsections) {
const targetHeadingIdx = headings.findIndex(
(heading) => isSameHeading(heading, targetHeading)
);
const targetHeadingIsLastHeading = targetHeadingIdx === headings.length - 1;
const lastLineInBodyIdx = lines.length - 1;
if (targetHeadingIsLastHeading) {
return lastLineInBodyIdx;
}
const [nextHigherOrSameLevelHeadingIndex, foundHigherOrSameLevelHeading] = findNextHigherOrSameLevelHeading(targetHeading, headings);
const higherLevelSectionIsLastHeading = foundHigherOrSameLevelHeading && nextHigherOrSameLevelHeadingIndex === headings.length;
if (higherLevelSectionIsLastHeading) {
return lastLineInBodyIdx;
}
if (foundHigherOrSameLevelHeading && shouldConsiderSubsections) {
const nextHigherLevelHeadingLineIdx = headings[nextHigherOrSameLevelHeadingIndex].line;
return nextHigherLevelHeadingLineIdx - 1;
}
if (foundHigherOrSameLevelHeading && !shouldConsiderSubsections) {
return headings[targetHeadingIdx + 1].line;
}
if (!shouldConsiderSubsections && !foundHigherOrSameLevelHeading) {
const nextHeading = findNextHeading(targetHeading.line, headings);
if (nextHeading === null) {
return lastLineInBodyIdx;
}
return nextHeading;
}
return lastLineInBodyIdx;
}
function findNextHigherOrSameLevelHeading(targetHeading, headings) {
const targetHeadingIdx = headings.findIndex(
(heading) => isSameHeading(heading, targetHeading)
);
const nextSameOrHigherLevelHeadingIdx = findNextIdx(
headings,
targetHeadingIdx,
(heading) => heading.level <= targetHeading.level
);
if (nextSameOrHigherLevelHeadingIdx === null) {
return [-1, false];
}
return [nextSameOrHigherLevelHeadingIdx, true];
}
function findNextHeading(fromIdxInBody, headings) {
const nextheading = headings.findIndex(
(heading) => heading.line > fromIdxInBody
);
return nextheading === -1 ? null : nextheading;
}
function findPriorIdx(items, fromIdx, condition) {
for (let i = fromIdx - 1; i >= 0; i--) {
if (condition(items[i])) {
return i;
}
}
return null;
}
function findNextIdx(items, fromIdx, condition) {
for (let i = fromIdx + 1; i < items.length; i++) {
if (condition(items[i])) {
return i;
}
}
return null;
}
// src/formatters/captureChoiceFormatter.ts
var CaptureChoiceFormatter = class extends CompleteFormatter {
constructor(app2, plugin, choiceExecutor) {
@ -14856,7 +15030,7 @@ var CaptureChoiceFormatter = class extends CompleteFormatter {
formatted,
this.file
);
if (!templaterFormatted)
if (!await templaterFormatted)
return formatted;
return templaterFormatted;
}
@ -14879,7 +15053,7 @@ var CaptureChoiceFormatter = class extends CompleteFormatter {
if (this.choice.insertAfter.enabled) {
return await this.insertAfterHandler(formatted);
}
const frontmatterEndPosition = this.file ? await this.getFrontmatterEndPosition(this.file) : null;
const frontmatterEndPosition = this.file ? this.getFrontmatterEndPosition(this.file) : null;
if (!frontmatterEndPosition)
return `${formatted}${this.fileContent}`;
return this.insertTextAfterPositionInBody(
@ -14904,7 +15078,7 @@ var CaptureChoiceFormatter = class extends CompleteFormatter {
`\\s*${escapeRegExp(targetString.replace("\\n", ""))}\\s*`
);
const fileContentLines = getLinesInString(this.fileContent);
const targetPosition = fileContentLines.findIndex(
let targetPosition = fileContentLines.findIndex(
(line) => targetRegex.test(line)
);
const targetNotFound = targetPosition === -1;
@ -14915,33 +15089,14 @@ var CaptureChoiceFormatter = class extends CompleteFormatter {
log.logError("unable to find insert after line in file.");
}
if (this.choice.insertAfter?.insertAtEnd) {
const nextHeaderPositionAfterTargetPosition = fileContentLines.slice(targetPosition + 1).findIndex((line) => /^#+ |---/.test(line));
const foundNextHeader = nextHeaderPositionAfterTargetPosition !== -1;
let endOfSectionIndex = null;
if (foundNextHeader) {
for (let i = nextHeaderPositionAfterTargetPosition + targetPosition; i > targetPosition; i--) {
const lineIsNewline = /^[\s\n ]*$/.test(
fileContentLines[i]
);
if (!lineIsNewline) {
endOfSectionIndex = i;
break;
}
}
if (!endOfSectionIndex)
endOfSectionIndex = targetPosition;
return this.insertTextAfterPositionInBody(
formatted,
this.fileContent,
endOfSectionIndex
);
} else {
return this.insertTextAfterPositionInBody(
formatted,
this.fileContent,
fileContentLines.length - 1
);
}
if (!this.file)
throw new Error("Tried to get sections without file.");
const endOfSectionIndex = getEndOfSection(
fileContentLines,
targetPosition,
!!this.choice.insertAfter.considerSubsections
);
targetPosition = endOfSectionIndex ?? fileContentLines.length - 1;
}
return this.insertTextAfterPositionInBody(
formatted,
@ -14956,7 +15111,7 @@ var CaptureChoiceFormatter = class extends CompleteFormatter {
const insertAfterLineAndFormatted = `${insertAfterLine}
${formatted}`;
if (this.choice.insertAfter?.createIfNotFoundLocation === CREATE_IF_NOT_FOUND_TOP) {
const frontmatterEndPosition = this.file ? await this.getFrontmatterEndPosition(this.file) : -1;
const frontmatterEndPosition = this.file ? this.getFrontmatterEndPosition(this.file) : -1;
return this.insertTextAfterPositionInBody(
insertAfterLineAndFormatted,
this.fileContent,
@ -14968,8 +15123,8 @@ ${formatted}`;
${insertAfterLineAndFormatted}`;
}
}
async getFrontmatterEndPosition(file) {
const fileCache = await this.app.metadataCache.getFileCache(file);
getFrontmatterEndPosition(file) {
const fileCache = this.app.metadataCache.getFileCache(file);
if (!fileCache || !fileCache.frontmatter) {
log.logMessage("could not get frontmatter. Maybe there isn't any.");
return -1;
@ -15652,19 +15807,23 @@ var CaptureChoiceEngine = class extends QuickAddChoiceEngine {
return `Invalid capture to for ${this.choice.name}. ${captureTo.length === 0 ? "Capture path is empty." : `Capture path is not valid: ${captureTo}`}`;
});
const filePath = await this.formatFilePath(captureTo);
const content = await this.getCaptureContent();
const content = this.getCaptureContent();
let getFileAndAddContentFn;
if (await this.fileExists(filePath)) {
getFileAndAddContentFn = this.onFileExists;
getFileAndAddContentFn = this.onFileExists.bind(
this
);
} else if (this.choice?.createFileIfItDoesntExist?.enabled) {
getFileAndAddContentFn = this.onCreateFileIfItDoesntExist;
getFileAndAddContentFn = this.onCreateFileIfItDoesntExist.bind(
this
);
} else {
log.logWarning(
`The file ${filePath} does not exist and "Create file if it doesn't exist" is disabled.`
);
return;
}
const { file, content: newFileContent } = await getFileAndAddContentFn.bind(this)(filePath, content);
const { file, content: newFileContent } = await getFileAndAddContentFn(filePath, content);
await this.app.vault.modify(file, newFileContent);
if (this.choice.appendLink) {
const markdownLink = this.app.fileManager.generateMarkdownLink(
@ -15685,7 +15844,7 @@ var CaptureChoiceEngine = class extends QuickAddChoiceEngine {
log.logError(e);
}
}
async getCaptureContent() {
getCaptureContent() {
let content;
if (!this.choice.format.enabled)
content = VALUE_SYNTAX;
@ -15697,7 +15856,7 @@ var CaptureChoiceEngine = class extends QuickAddChoiceEngine {
return content;
}
async onFileExists(filePath, content) {
const file = await this.getFileByPath(filePath);
const file = this.getFileByPath(filePath);
if (!file)
throw new Error("File not found");
const formatted = await this.formatter.formatContentOnly(content);
@ -15766,7 +15925,7 @@ This is in order to prevent data loss.`
log.logError("Cannot capture to active file - no active file.");
return;
}
let content = await this.getCaptureContent();
let content = this.getCaptureContent();
content = await this.formatter.formatContent(content, this.choice);
if (this.choice.format.enabled) {
content = await templaterParseTemplate(
@ -15808,7 +15967,7 @@ var ChoiceSuggester = class extends import_obsidian33.FuzzySuggestModal {
}
renderSuggestion(item, el) {
el.empty();
import_obsidian33.MarkdownRenderer.renderMarkdown(item.item.name, el, "", this.plugin);
void import_obsidian33.MarkdownRenderer.renderMarkdown(item.item.name, el, "", this.plugin);
el.classList.add("quickadd-choice-suggestion");
}
getItemText(item) {
@ -15857,7 +16016,7 @@ var ChoiceExecutor = class {
}
case "Multi" /* Multi */: {
const multiChoice = choice;
await this.onChooseMultiType(multiChoice);
this.onChooseMultiType(multiChoice);
break;
}
default:
@ -15881,7 +16040,7 @@ var ChoiceExecutor = class {
).run();
}
async onChooseMacroType(macroChoice) {
const macroEngine = await new MacroChoiceEngine(
const macroEngine = new MacroChoiceEngine(
this.app,
this.plugin,
macroChoice,
@ -15894,7 +16053,7 @@ var ChoiceExecutor = class {
this.variables.set(key, value);
});
}
async onChooseMultiType(multiChoice) {
onChooseMultiType(multiChoice) {
ChoiceSuggester.Open(this.plugin, multiChoice.choices, this);
}
};
@ -16119,7 +16278,7 @@ QuickAdd will now revert to backup.`
plugin.settings = backup;
}
}
plugin.saveSettings();
void plugin.saveSettings();
}
var migrate_default = migrate;
@ -16207,7 +16366,7 @@ ${andNow}
${addExtraHashToHeadings(
releaseNotes
)}`;
import_obsidian34.MarkdownRenderer.renderMarkdown(
void import_obsidian34.MarkdownRenderer.renderMarkdown(
markdownStr,
contentDiv,
app.vault.getRoot().path,
@ -16228,7 +16387,7 @@ var QuickAdd = class extends import_obsidian35.Plugin {
settingsStore.setState(this.settings);
this.unsubscribeSettingsStore = settingsStore.subscribe((settings) => {
this.settings = settings;
this.saveSettings();
void this.saveSettings();
});
this.addCommand({
id: "runQuickAdd",
@ -16245,7 +16404,7 @@ var QuickAdd = class extends import_obsidian35.Plugin {
return this.settings.devMode;
}
const id = this.manifest.id, plugins = this.app.plugins;
plugins.disablePlugin(id).then(() => plugins.enablePlugin(id));
void plugins.disablePlugin(id).then(() => plugins.enablePlugin(id));
}
});
this.addCommand({
@ -16256,10 +16415,10 @@ var QuickAdd = class extends import_obsidian35.Plugin {
return this.settings.devMode;
}
console.log(`Test QuickAdd (dev)`);
const fn2 = async () => {
const fn2 = () => {
new UpdateModal("0.12.0").open();
};
fn2();
void fn2();
}
});
log.register(new ConsoleErrorLogger()).register(new GuiLogger(this));
@ -16355,7 +16514,7 @@ var QuickAdd = class extends import_obsidian35.Plugin {
if (currentVersion === knownVersion)
return;
this.settings.version = currentVersion;
this.saveSettings();
void this.saveSettings();
if (this.settings.announceUpdates === false)
return;
const updateModal = new UpdateModal(knownVersion);

@ -1,7 +1,7 @@
{
"id": "quickadd",
"name": "QuickAdd",
"version": "0.16.0",
"version": "0.17.1",
"minAppVersion": "0.13.19",
"description": "Quickly add new pages or content to your vault.",
"author": "Christian B. B. Houmann",

@ -1,207 +0,0 @@
{
"recentFiles": [
{
"basename": "@Main Dashboard",
"path": "01.02 Home/@Main Dashboard.md"
},
{
"basename": "2023-03-25",
"path": "00.01 Admin/Calendars/2023-03-25.md"
},
{
"basename": "2023-03-26",
"path": "00.01 Admin/Calendars/2023-03-26.md"
},
{
"basename": "@@Travels",
"path": "03.02 Travels/@@Travels.md"
},
{
"basename": "Arles",
"path": "03.02 Travels/Arles.md"
},
{
"basename": "Avignon",
"path": "03.02 Travels/Avignon.md"
},
{
"basename": "Geneva",
"path": "03.02 Travels/Geneva.md"
},
{
"basename": "Florence",
"path": "03.02 Travels/Florence.md"
},
{
"basename": "Milan",
"path": "03.02 Travels/Milan.md"
},
{
"basename": "Palermo",
"path": "03.02 Travels/Palermo.md"
},
{
"basename": "2023-02-03",
"path": "00.01 Admin/Calendars/2023-02-03.md"
},
{
"basename": "2023-02-03 Paris",
"path": "00.01 Admin/Calendars/Events/2023-02-03 Paris.md"
},
{
"basename": "2023-03-26 Mallorca",
"path": "00.01 Admin/Calendars/Events/2023-03-26 Mallorca.md"
},
{
"basename": "Narro",
"path": "02.02 Paris/Narro.md"
},
{
"basename": "Mel Brooks Isnt Done Punching Up the History of the World",
"path": "00.03 News/Mel Brooks Isnt Done Punching Up the History of the World.md"
},
{
"basename": "2023-03-24",
"path": "00.01 Admin/Calendars/2023-03-24.md"
},
{
"basename": "2023-03-23",
"path": "00.01 Admin/Calendars/2023-03-23.md"
},
{
"basename": "An Icelandic Town Goes All Out to Save Baby Puffins",
"path": "00.03 News/An Icelandic Town Goes All Out to Save Baby Puffins.md"
},
{
"basename": "How an FBI agent stained an NCAA basketball corruption probe",
"path": "00.03 News/How an FBI agent stained an NCAA basketball corruption probe.md"
},
{
"basename": "Last Stand of the Hot Dog King",
"path": "00.03 News/Last Stand of the Hot Dog King.md"
},
{
"basename": "The Limits and Wonders of John Wicks Last Fight",
"path": "00.03 News/The Limits and Wonders of John Wicks Last Fight.md"
},
{
"basename": "2023-12-27 Miami",
"path": "00.01 Admin/Calendars/Events/2023-12-27 Miami.md"
},
{
"basename": "Brown Butter Farro with Mushrooms & Burrata",
"path": "03.03 Food & Wine/Brown Butter Farro with Mushrooms & Burrata.md"
},
{
"basename": "The Silicon Valley Bank Contagion Is Just Beginning",
"path": "00.03 News/The Silicon Valley Bank Contagion Is Just Beginning.md"
},
{
"basename": "Zaalouk",
"path": "03.03 Food & Wine/Zaalouk.md"
},
{
"basename": "@Side dishes",
"path": "03.03 Food & Wine/@Side dishes.md"
},
{
"basename": "Taktouka",
"path": "03.03 Food & Wine/Taktouka.md"
},
{
"basename": "Beet n Goat Cheese Salad",
"path": "03.03 Food & Wine/Beet n Goat Cheese Salad.md"
},
{
"basename": "Indiana Jones and the Temple of Doom (1984)",
"path": "03.04 Cinematheque/Indiana Jones and the Temple of Doom (1984).md"
},
{
"basename": "Laurence Bédier",
"path": "01.03 Family/Laurence Bédier.md"
},
{
"basename": "2023-03-22",
"path": "00.01 Admin/Calendars/2023-03-22.md"
},
{
"basename": "Esterno notte (2022)",
"path": "03.04 Cinematheque/Esterno notte (2022).md"
},
{
"basename": "Law Roach on Why He Retired From Celebrity Fashion Styling",
"path": "00.03 News/Law Roach on Why He Retired From Celebrity Fashion Styling.md"
},
{
"basename": "Why Joe Bidens Honeymoon With Progressives Is Coming to an End",
"path": "00.03 News/Why Joe Bidens Honeymoon With Progressives Is Coming to an End.md"
},
{
"basename": "The Purposeful Presence of Lance Reddick",
"path": "00.03 News/The Purposeful Presence of Lance Reddick.md"
},
{
"basename": "2023-03-20",
"path": "00.01 Admin/Calendars/2023-03-20.md"
},
{
"basename": "2023-03-21",
"path": "00.01 Admin/Calendars/2023-03-21.md"
},
{
"basename": "The Dark Knight Rises (2012)",
"path": "03.04 Cinematheque/The Dark Knight Rises (2012).md"
},
{
"basename": "The Dark Knight (2008)",
"path": "03.04 Cinematheque/The Dark Knight (2008).md"
},
{
"basename": "Batman Begins (2005)",
"path": "03.04 Cinematheque/Batman Begins (2005).md"
},
{
"basename": "Batman Robin (1997)",
"path": "03.04 Cinematheque/Batman Robin (1997).md"
},
{
"basename": "Batman Forever (1995)",
"path": "03.04 Cinematheque/Batman Forever (1995).md"
},
{
"basename": "Batman Returns (1992)",
"path": "03.04 Cinematheque/Batman Returns (1992).md"
},
{
"basename": "Batman (1989)",
"path": "03.04 Cinematheque/Batman (1989).md"
},
{
"basename": "@Cinematheque",
"path": "03.04 Cinematheque/@Cinematheque.md"
},
{
"basename": "Au Revoir Là-Haut",
"path": "00.02 Inbox/Au Revoir Là-Haut.md"
},
{
"basename": "Are Helicopter Parents Actually Lazy",
"path": "00.03 News/Are Helicopter Parents Actually Lazy.md"
},
{
"basename": "Leopards Are Living among People. And That Could Save the Species",
"path": "00.03 News/Leopards Are Living among People. And That Could Save the Species.md"
},
{
"basename": "Adam Sandler doesnt need your respect. But hes getting it anyway.",
"path": "00.03 News/Adam Sandler doesnt need your respect. But hes getting it anyway..md"
},
{
"basename": "The Brilliant Inventor Who Made Two of Historys Biggest Mistakes",
"path": "00.03 News/The Brilliant Inventor Who Made Two of Historys Biggest Mistakes.md"
}
],
"omittedPaths": [],
"maxLength": null,
"openType": "tab"
}

File diff suppressed because one or more lines are too long

@ -1,10 +0,0 @@
{
"id": "recent-files-obsidian",
"name": "Recent Files",
"version": "1.3.5",
"minAppVersion": "0.16.3",
"description": "List files by most recently opened",
"author": "Tony Grosinger",
"authorUrl": "https://grosinger.net",
"isDesktopOnly": false
}

@ -1,33 +0,0 @@
.recent-files-title {
display: flex;
justify-content: space-between;
}
.recent-files-title-content {
flex-grow: 1;
}
.recent-files-file-delete {
display: none;
color: var(--nav-item-color);
height: 17px;
}
.recent-files-title:hover .recent-files-file-delete {
display: block;
cursor: pointer;
}
.recent-files-file-delete:hover {
color: var(--nav-item-color-hover);
}
.recent-files-donation {
width: 70%;
margin: 0 auto;
text-align: center;
}
.recent-files-donate-button {
margin: 10px;
}

@ -1,387 +0,0 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/main.ts
__export(exports, {
default: () => SimpleTimeTrackerPlugin
});
var import_obsidian3 = __toModule(require("obsidian"));
// src/settings.ts
var defaultSettings = {
timestampFormat: "YY-MM-DD hh:mm:ss",
csvDelimiter: ","
};
// src/settings-tab.ts
var import_obsidian = __toModule(require("obsidian"));
var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
this.containerEl.empty();
this.containerEl.createEl("h2", { text: "Super Simple Time Tracker Settings" });
new import_obsidian.Setting(this.containerEl).setName("Timestamp Display Format").setDesc(createFragment((f) => {
f.createSpan({ text: "The way that timestamps in time tracker tables should be displayed. Uses " });
f.createEl("a", { text: "moment.js", href: "https://momentjs.com/docs/#/parsing/string-format/" });
f.createSpan({ text: " syntax." });
})).addText((t) => {
t.setValue(String(this.plugin.settings.timestampFormat));
t.onChange((v) => __async(this, null, function* () {
this.plugin.settings.timestampFormat = v.length ? v : defaultSettings.timestampFormat;
yield this.plugin.saveSettings();
}));
});
new import_obsidian.Setting(this.containerEl).setName("CSV Delimiter").setDesc("The delimiter character that should be used when copying a tracker table as CSV. For example, some languages use a semicolon instead of a comma.").addText((t) => {
t.setValue(String(this.plugin.settings.csvDelimiter));
t.onChange((v) => __async(this, null, function* () {
this.plugin.settings.csvDelimiter = v.length ? v : defaultSettings.csvDelimiter;
yield this.plugin.saveSettings();
}));
});
this.containerEl.createEl("hr");
this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" });
this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", { attr: { src: "https://ellpeck.de/res/generalsupport.png" }, cls: "simple-time-tracker-support" });
}
};
// src/tracker.ts
var import_obsidian2 = __toModule(require("obsidian"));
function saveTracker(tracker, app, section) {
return __async(this, null, function* () {
let file = app.workspace.getActiveFile();
if (!file)
return;
let content = yield app.vault.read(file);
let lines = content.split("\n");
let prev = lines.filter((_, i) => i <= section.lineStart).join("\n");
let next = lines.filter((_, i) => i >= section.lineEnd).join("\n");
content = `${prev}
${JSON.stringify(tracker)}
${next}`;
yield app.vault.modify(file, content);
});
}
function loadTracker(json) {
if (json) {
try {
return JSON.parse(json);
} catch (e) {
console.log(`Failed to parse Tracker from ${json}`);
}
}
return { entries: [] };
}
function displayTracker(tracker, element, getSectionInfo, settings) {
let running = isRunning(tracker);
let btn = new import_obsidian2.ButtonComponent(element).setClass("clickable-icon").setIcon(`lucide-${running ? "stop" : "play"}-circle`).setTooltip(running ? "End" : "Start").onClick(() => __async(this, null, function* () {
if (running) {
endRunningEntry(tracker);
} else {
startNewEntry(tracker, newSegmentNameBox.getValue());
}
yield saveTracker(tracker, this.app, getSectionInfo());
}));
btn.buttonEl.addClass("simple-time-tracker-btn");
let newSegmentNameBox = new import_obsidian2.TextComponent(element).setPlaceholder("Segment name").setDisabled(running);
newSegmentNameBox.inputEl.addClass("simple-time-tracker-txt");
let timer = element.createDiv({ cls: "simple-time-tracker-timers" });
let currentDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" });
let current = currentDiv.createEl("span", { cls: "simple-time-tracker-timer-time" });
currentDiv.createEl("span", { text: "Current" });
let totalDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" });
let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "0s" });
totalDiv.createEl("span", { text: "Total" });
if (tracker.entries.length > 0) {
let table = element.createEl("table", { cls: "simple-time-tracker-table" });
table.createEl("tr").append(createEl("th", { text: "Segment" }), createEl("th", { text: "Start time" }), createEl("th", { text: "End time" }), createEl("th", { text: "Duration" }), createEl("th"));
for (let entry of tracker.entries)
addEditableTableRow(tracker, entry, table, newSegmentNameBox, running, getSectionInfo, settings, 0);
let buttons = element.createEl("div", { cls: "simple-time-tracker-bottom" });
new import_obsidian2.ButtonComponent(buttons).setButtonText("Copy as table").onClick(() => navigator.clipboard.writeText(createMarkdownTable(tracker, settings)));
new import_obsidian2.ButtonComponent(buttons).setButtonText("Copy as CSV").onClick(() => navigator.clipboard.writeText(createCsv(tracker, settings)));
}
setCountdownValues(tracker, current, total, currentDiv);
let intervalId = window.setInterval(() => {
if (!element.isConnected) {
window.clearInterval(intervalId);
return;
}
setCountdownValues(tracker, current, total, currentDiv);
}, 1e3);
}
function startSubEntry(entry, name) {
if (!entry.subEntries) {
entry.subEntries = [__spreadProps(__spreadValues({}, entry), { name: `Part 1` })];
entry.startTime = null;
entry.endTime = null;
}
if (!name)
name = `Part ${entry.subEntries.length + 1}`;
entry.subEntries.push({ name, startTime: (0, import_obsidian2.moment)().unix(), endTime: null, subEntries: null });
}
function startNewEntry(tracker, name) {
if (!name)
name = `Segment ${tracker.entries.length + 1}`;
let entry = { name, startTime: (0, import_obsidian2.moment)().unix(), endTime: null, subEntries: null };
tracker.entries.push(entry);
}
function endRunningEntry(tracker) {
let entry = getRunningEntry(tracker.entries);
entry.endTime = (0, import_obsidian2.moment)().unix();
}
function removeEntry(entries, toRemove) {
if (entries.contains(toRemove)) {
entries.remove(toRemove);
return true;
} else {
for (let entry of entries) {
if (entry.subEntries && removeEntry(entry.subEntries, toRemove)) {
if (entry.subEntries.length == 1) {
let single = entry.subEntries[0];
entry.startTime = single.startTime;
entry.endTime = single.endTime;
entry.subEntries = null;
}
return true;
}
}
}
return false;
}
function isRunning(tracker) {
return !!getRunningEntry(tracker.entries);
}
function getRunningEntry(entries) {
for (let entry of entries) {
if (entry.subEntries) {
let running = getRunningEntry(entry.subEntries);
if (running)
return running;
} else {
if (!entry.endTime)
return entry;
}
}
return null;
}
function getDuration(entry) {
if (entry.subEntries) {
return getTotalDuration(entry.subEntries);
} else {
let endTime = entry.endTime ? import_obsidian2.moment.unix(entry.endTime) : (0, import_obsidian2.moment)();
return endTime.diff(import_obsidian2.moment.unix(entry.startTime));
}
}
function getTotalDuration(entries) {
let ret = 0;
for (let entry of entries)
ret += getDuration(entry);
return ret;
}
function setCountdownValues(tracker, current, total, currentDiv) {
let running = getRunningEntry(tracker.entries);
if (running && !running.endTime) {
current.setText(formatDuration(getDuration(running)));
currentDiv.hidden = false;
} else {
currentDiv.hidden = true;
}
total.setText(formatDuration(getTotalDuration(tracker.entries)));
}
function formatTimestamp(timestamp, settings) {
return import_obsidian2.moment.unix(timestamp).format(settings.timestampFormat);
}
function formatDuration(totalTime) {
let duration = import_obsidian2.moment.duration(totalTime);
let ret = "";
if (duration.years() > 0)
ret += duration.years() + "y ";
if (duration.months() > 0)
ret += duration.months() + "m ";
if (duration.days() > 0)
ret += duration.days() + "d ";
if (duration.hours() > 0)
ret += duration.hours() + "h ";
if (duration.minutes() > 0)
ret += duration.minutes() + "m ";
ret += duration.seconds() + "s";
return ret;
}
function createMarkdownTable(tracker, settings) {
let table = [["Segment", "Start time", "End time", "Duration"]];
for (let entry of tracker.entries)
table.push(...createTableSection(entry, settings));
table.push(["**Total**", "", "", `**${formatDuration(getTotalDuration(tracker.entries))}**`]);
let ret = "";
let widths = Array.from(Array(4).keys()).map((i) => Math.max(...table.map((a) => a[i].length)));
for (let r = 0; r < table.length; r++) {
if (r == 1)
ret += Array.from(Array(4).keys()).map((i) => "-".repeat(widths[i])).join(" | ") + "\n";
let row = [];
for (let i = 0; i < 4; i++)
row.push(table[r][i].padEnd(widths[i], " "));
ret += row.join(" | ") + "\n";
}
return ret;
}
function createCsv(tracker, settings) {
let ret = "";
for (let entry of tracker.entries) {
for (let row of createTableSection(entry, settings))
ret += row.join(settings.csvDelimiter) + "\n";
}
return ret;
}
function createTableSection(entry, settings) {
let ret = [[
entry.name,
entry.startTime ? formatTimestamp(entry.startTime, settings) : "",
entry.endTime ? formatTimestamp(entry.endTime, settings) : "",
entry.endTime || entry.subEntries ? formatDuration(getDuration(entry)) : ""
]];
if (entry.subEntries) {
for (let sub of entry.subEntries)
ret.push(...createTableSection(sub, settings));
}
return ret;
}
function addEditableTableRow(tracker, entry, table, newSegmentNameBox, running, getSectionInfo, settings, indent) {
let row = table.createEl("tr");
let name = row.createEl("td");
let namePar = name.createEl("span", { text: entry.name });
namePar.style.marginLeft = `${indent}em`;
let nameBox = new import_obsidian2.TextComponent(name).setValue(entry.name);
nameBox.inputEl.hidden = true;
row.createEl("td", { text: entry.startTime ? formatTimestamp(entry.startTime, settings) : "" });
row.createEl("td", { text: entry.endTime ? formatTimestamp(entry.endTime, settings) : "" });
row.createEl("td", { text: entry.endTime || entry.subEntries ? formatDuration(getDuration(entry)) : "" });
let entryButtons = row.createEl("td");
if (!running) {
new import_obsidian2.ButtonComponent(entryButtons).setClass("clickable-icon").setIcon(`lucide-play`).setTooltip("Continue").onClick(() => __async(this, null, function* () {
startSubEntry(entry, newSegmentNameBox.getValue());
yield saveTracker(tracker, this.app, getSectionInfo());
}));
}
let editButton = new import_obsidian2.ButtonComponent(entryButtons).setClass("clickable-icon").setTooltip("Edit").setIcon("lucide-pencil").onClick(() => __async(this, null, function* () {
if (namePar.hidden) {
namePar.hidden = false;
nameBox.inputEl.hidden = true;
editButton.setIcon("lucide-pencil");
if (nameBox.getValue()) {
entry.name = nameBox.getValue();
namePar.setText(entry.name);
yield saveTracker(tracker, this.app, getSectionInfo());
}
} else {
namePar.hidden = true;
nameBox.inputEl.hidden = false;
nameBox.setValue(entry.name);
editButton.setIcon("lucide-check");
}
}));
new import_obsidian2.ButtonComponent(entryButtons).setClass("clickable-icon").setTooltip("Remove").setIcon("lucide-trash").onClick(() => __async(this, null, function* () {
removeEntry(tracker.entries, entry);
yield saveTracker(tracker, this.app, getSectionInfo());
}));
if (entry.subEntries) {
for (let sub of entry.subEntries)
addEditableTableRow(tracker, sub, table, newSegmentNameBox, running, getSectionInfo, settings, indent + 1);
}
}
// src/main.ts
var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin {
onload() {
return __async(this, null, function* () {
yield this.loadSettings();
this.addSettingTab(new SimpleTimeTrackerSettingsTab(this.app, this));
this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => {
let tracker = loadTracker(s);
e.empty();
displayTracker(tracker, e, () => i.getSectionInfo(e), this.settings);
});
this.addCommand({
id: `insert`,
name: `Insert Time Tracker`,
editorCallback: (e, _) => {
e.replaceSelection("```simple-time-tracker\n```\n");
}
});
});
}
loadSettings() {
return __async(this, null, function* () {
this.settings = Object.assign({}, defaultSettings, yield this.loadData());
});
}
saveSettings() {
return __async(this, null, function* () {
yield this.saveData(this.settings);
});
}
};

@ -1,10 +0,0 @@
{
"id": "simple-time-tracker",
"name": "Super Simple Time Tracker",
"version": "0.1.6",
"minAppVersion": "0.15.0",
"description": "Multi-purpose time trackers for your notes!",
"author": "Ellpeck",
"authorUrl": "https://ellpeck.de",
"isDesktopOnly": false
}

@ -1,64 +0,0 @@
.simple-time-tracker-support {
max-width: 50%;
width: 400px;
height: auto;
}
.simple-time-tracker-btn,
.simple-time-tracker-txt {
display: block;
margin-left: auto;
margin-right: auto;
}
.simple-time-tracker-txt {
text-align: center;
}
.simple-time-tracker-btn {
margin-top: 10px;
margin-bottom: 10px;
}
.simple-time-tracker-btn svg {
width: 32px;
height: 32px;
}
.simple-time-tracker-bottom button {
margin: 10px 5px 10px 5px;
}
.simple-time-tracker-timers,
.simple-time-tracker-bottom {
display: flex;
justify-content: center;
text-align: center;
}
.simple-time-tracker-timers span {
display: block;
}
.simple-time-tracker-timer {
margin: 20px;
}
.simple-time-tracker-timer-time {
font-size: xx-large;
font-weight: bolder;
}
.simple-time-tracker-table {
width: 100%;
margin-top: 20px;
}
.simple-time-tracker-table td,
.simple-time-tracker-table th {
border: none;
}
.simple-time-tracker-table .clickable-icon {
display: inline;
}

@ -64,7 +64,7 @@
}
},
{
"id": "77c7d6201fbd4f8f",
"id": "a51da5ef0d807c2e",
"type": "leaf",
"state": {
"type": "markdown",
@ -173,14 +173,6 @@
}
}
},
{
"id": "a64402126e020fab",
"type": "leaf",
"state": {
"type": "online.tokuhirom.obsidian-stopwatch-plugin",
"state": {}
}
},
{
"id": "c8e3e73aa58f1fd8",
"type": "leaf",
@ -219,7 +211,6 @@
"hiddenItems": {
"ledger-obsidian:Add to Ledger": false,
"obsidian-map-view:Open map view": false,
"meld-encrypt:Create new encrypted note": false,
"obsidian-metatable:Metatable": false,
"obsidian42-brat:BRAT": false,
"table-editor-obsidian:Advanced Tables Toolbar": false,
@ -240,37 +231,38 @@
"obsidian-media-db-plugin:Add new Media DB entry": false,
"msg-handler:MSG Handler": false,
"obsidian-read-it-later:ReadItLater: Save clipboard": false,
"meld-encrypt:Create new encrypted note": false,
"obsidian-memos:Memos": false
}
},
"active": "77c7d6201fbd4f8f",
"active": "a51da5ef0d807c2e",
"lastOpenFiles": [
"00.01 Admin/Calendars/2023-03-25.md",
"00.01 Admin/Calendars/2023-03-26.md",
"00.01 Admin/Calendars/2023-04-02.md",
"00.01 Admin/Calendars/2023-04-03.md",
"01.02 Home/@Main Dashboard.md",
"03.02 Travels/@@Travels.md",
"03.02 Travels/Arles.md",
"03.02 Travels/Avignon.md",
"03.02 Travels/Geneva.md",
"03.02 Travels/Florence.md",
"03.02 Travels/Milan.md",
"03.02 Travels/Palermo.md",
"00.01 Admin/Calendars/2023-02-03.md",
"00.01 Admin/Calendars/Events/2023-02-03 Paris.md",
"01.02 Home/@Shopping list.md",
"00.01 Admin/Calendars/2023-04-01.md",
"00.01 Admin/Calendars/2023-03-31.md",
"01.01 Life Orga/@Personal projects.md",
"00.01 Admin/Calendars/2023-03-30.md",
"05.02 Networks/Server Alias.md",
"03.02 Travels/Mallorca.md",
"00.01 Admin/Calendars/2023-03-29.md",
"03.01 Reading list/The Fran Lebowitz Reader.md",
"00.02 Inbox/Le Temps gagné.md",
"03.01 Reading list/@Reading master.md",
"03.01 Reading list/Au Revoir Là-Haut.md",
"00.01 Admin/Calendars/2023-03-26.md",
"00.01 Admin/Calendars/2023-03-27.md",
"00.01 Admin/Calendars/2023-03-28.md",
"00.03 News/How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution.md",
"00.03 News/Adam Sandler doesnt need your respect. But hes getting it anyway..md",
"00.03 News/Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”.md",
"00.03 News/I Went on a Package Trip for Millennials Who Travel Alone. Help Me..md",
"00.03 News/Jaylen Brown Is Trying to Find a Balance.md",
"03.04 Cinematheque/@Cinematheque.md",
"00.01 Admin/Calendars/Events/2023-03-26 Mallorca.md",
"02.02 Paris/Narro.md",
"00.03 News/Mel Brooks Isnt Done Punching Up the History of the World.md",
"00.01 Admin/Calendars/2023-03-24.md",
"00.01 Admin/Calendars/2023-03-23.md",
"00.03 News/An Icelandic Town Goes All Out to Save Baby Puffins.md",
"00.03 News/How an FBI agent stained an NCAA basketball corruption probe.md",
"00.03 News/Last Stand of the Hot Dog King.md",
"00.03 News/The Limits and Wonders of John Wicks Last Fight.md",
"00.01 Admin/Calendars/Events/2023-12-27 Miami.md",
"03.03 Food & Wine/Brown Butter Farro with Mushrooms & Burrata.md",
"00.03 News/The Silicon Valley Bank Contagion Is Just Beginning.md",
"03.03 Food & Wine/Zaalouk.md",
"03.03 Food & Wine/@Side dishes.md",
"Pasted image 20230317114612.png",
"Pasted image 20230317114609.png",
"Pasted image 20230309141356.png",

@ -91,7 +91,7 @@ This section does serve for quick memos.
- [x] 10:43 :tornado: [[2023-01-03|Memo]], [[@Life Admin|Admin]]: Sort out 🌬 📅 2023-03-31 ✅ 2023-03-07 ^8c4usc
- [ ] 11:03 🍽 [[2023-01-03|Memo]], [[@Life Admin|Admin]], [[@@MRCK|Meggi]]: Find a dining table 📅2023-06-30 ^e1e9l9
- [x] 11:10 🧚🏼 [[2023-01-03|Memo]], [[@Life Admin|Admin]]: Organise [[@@MRCK|Meggi]]'s birthday in [[Milan|Milano]] 📅 2023-02-15 ✅ 2023-01-04 ^djdepf
- [ ] 11:27 :coat: [[2023-01-03|Memo]], [[@Lifestyle|Lifestyle]]: Find a winter coat (sporty) 📅2023-04-30
- [x] 11:27 :coat: [[2023-01-03|Memo]], [[@Lifestyle|Lifestyle]]: Find a winter coat (sporty) 📅 2023-04-30 ✅ 2023-03-26
- [x] 11:53 :wine_glass: [[2023-01-03|Memo]], [[@Lifestyle|Lifestyle]], [[!!Wine|Wine]]: Order a couple of boxes of [[Nadine Saxer - Blanc de Noir]] 📅 2023-01-31 ✅ 2023-01-04
- [x] 11:57 🐛 [[2023-01-03|Memo]], [[@Life Admin|Admin]]: Eradicate flies & such in the kitchen 📅 2023-01-15 ✅ 2023-01-04
- [x] 12:24 :hospital: [[2023-01-03|Memo]], [[@Lifestyle|Lifestyle]]: Find a charity shop in [[@@Zürich|ZH]] to give away clothes 📅 2023-01-10 ✅ 2023-01-04

@ -101,7 +101,7 @@ hide task count
This section does serve for quick memos.
&emsp;
- [ ] 12:29 :moneybag: [[2023-02-01|Memo]], [[@Finances|Finances]]: Tax declaration 2022 📅 2023-03-15
- [ ] 12:29 :moneybag: [[2023-02-01|Memo]], [[@Finances|Finances]]: Tax declaration 2022 📅 2023-04-10
%% --- %%

@ -104,7 +104,7 @@ hide task count
This section does serve for quick memos.
&emsp;
- [ ] 16:32 :cat2: [[2023-03-03|Memo]], [[Pet note|Pet]]: Tell Wincasa about the arrival of the kitten in June 📅2023-03-31
- [ ] 16:32 :cat2: [[2023-03-03|Memo]], [[Pet note|Pet]]: Tell Wincasa about the arrival of the kitten in June 📅 2023-04-30
%% --- %%

@ -106,7 +106,7 @@ This section does serve for quick memos.
&emsp;
- [x] 18:10 💻 [[2023-03-05|Memo]], [[Server Tools]]: harden server security (monit, fail2ban, logwatch) 📅 2023-04-05 ✅ 2023-03-07
- [ ] 18:11 💻 [[2023-03-05|Memo]], [[Server Tools]]: organise utilities (Postfix & others) 📅2023-04-05
- [x] 18:11 💻 [[2023-03-05|Memo]], [[Server Tools]]: organise utilities (Postfix & others) 📅 2023-04-05 ✅ 2023-03-26
%% --- %%

@ -16,9 +16,9 @@ Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 0.45
Coffee: 1
Steps:
Water: 3.917
Coffee: 2
Steps: 12657
Weight:
Ski:
IceSkating:
@ -114,7 +114,9 @@ This section does serve for quick memos.
&emsp;
Loret ipsum
📖: [[Au Revoir Là-Haut]]
🛫: [[@@Zürich|Zürich]] to [[Mallorca]]
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-03-27
Date: 2023-03-27
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8.5
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 3.54
Coffee: 2
Steps: 10331
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-26|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-03-28|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-03-27Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-03-27NSave
&emsp;
# 2023-03-27
&emsp;
> [!summary]+
> Daily note for 2023-03-27
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-03-27
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Au Revoir Là-Haut]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-03-27]]
```
&emsp;
&emsp;

@ -0,0 +1,135 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-03-28
Date: 2023-03-28
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 5.45
Coffee: 0
Steps: 4493
Weight:
Ski:
IceSkating:
Riding: 2
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-27|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-03-29|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-03-28Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-03-28NSave
&emsp;
# 2023-03-28
&emsp;
> [!summary]+
> Daily note for 2023-03-28
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-03-28
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Au Revoir Là-Haut]]
🐎: [[Son Ginard Polo Club]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-03-28]]
```
&emsp;
&emsp;

@ -0,0 +1,136 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-03-29
Date: 2023-03-29
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 9
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 4.5
Coffee: 0
Steps: 6236
Weight:
Ski:
IceSkating:
Riding: 2
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-28|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-03-30|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-03-29Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-03-29NSave
&emsp;
# 2023-03-29
&emsp;
> [!summary]+
> Daily note for 2023-03-29
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-03-29
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Au Revoir Là-Haut]]
🐎: [[Son Ginard Polo Club]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-03-29]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-03-30
Date: 2023-03-30
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 9
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 3.3
Coffee: 2
Steps: 12091
Weight:
Ski:
IceSkating:
Riding: 1
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-29|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-03-31|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-03-30Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-03-30NSave
&emsp;
# 2023-03-30
&emsp;
> [!summary]+
> Daily note for 2023-03-30
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-03-30
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-03-30]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-03-31
Date: 2023-03-31
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7.5
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 4.237
Coffee: 0
Steps: 7088
Weight:
Ski:
IceSkating:
Riding: 1
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-30|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-04-01|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-03-31Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-03-31NSave
&emsp;
# 2023-03-31
&emsp;
> [!summary]+
> Daily note for 2023-03-31
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-03-31
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-03-31]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-04-01
Date: 2023-04-01
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 9
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 3
Coffee: 0
Steps: 4543
Weight:
Ski:
IceSkating:
Riding: 1
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-03-31|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-04-02|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-04-01Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-04-01NSave
&emsp;
# 2023-04-01
&emsp;
> [!summary]+
> Daily note for 2023-04-01
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-04-01
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-04-01]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-04-02
Date: 2023-04-02
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7.5
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 3.33
Coffee: 0
Steps: 7696
Weight:
Ski:
IceSkating:
Riding: 1
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-04-01|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-04-03|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-04-02Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-04-02NSave
&emsp;
# 2023-04-02
&emsp;
> [!summary]+
> Daily note for 2023-04-02
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-04-02
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-04-02]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2023-04-03
Date: 2023-04-03
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8
Happiness: 80
Gratefulness: 80
Stress: 27.5
FrontHeadBar: 5
EarHeadBar: 35
BackHeadBar: 20
Water: 0.5
Coffee: 0
Steps:
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2023-04-02|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2023-04-04|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2023-04-03Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2023-04-03NSave
&emsp;
# 2023-04-03
&emsp;
> [!summary]+
> Daily note for 2023-04-03
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2023-04-03
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2023-04-03]]
```
&emsp;
&emsp;

@ -19,7 +19,7 @@ CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟥
ReadingState:: 🟧
---

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
Read:: [[2023-03-28]]
---

@ -0,0 +1,234 @@
---
Tag: ["🎭", "👗", "👤", "🇧🇷"]
Date: 2023-03-28
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2023-03-28
Link: https://www.vanityfair.com/style/2023/03/gisele-bundchen-cover-story
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-GiseleBundchenonTomBradyFTXNSave
&emsp;
# Gisele Bündchen on Tom Brady, FTX Blind Side, and Being a “Witch of Love”
**If Gisele Bündchen** is a witch, shes a good witch. 
The supermodel is conjuring her mystical, much-TikTokked-about powers at 7:30 on a recent Friday morning in her “bedroom”—a minimalist casita in the shadow of her towering main house, perched high among the dense palm treetops of Costa Ricas Nicoya Peninsula—where she is cupping a wounded bird. 
Bündchen has just discovered the unmoving robin nestled on a white couch on her terrace, a serendipitous landing place with a panoramic vista of the beach below. Looking bereft, she scoops the bird up with the ease of a Disney princess, taking care with its mangled claw. 
“Are you *okay*?” Bündchen coos to the bird, her throaty voice softening to a whisper. She is stroking its tiny head with an elegant unpolished index finger—performing “a little Reiki,” as she says, referring to the holistic practice of transferring healing energy through touch. She does the same to her kids, Benjamin Rein, 13, and Vivian Lake, 10, all the time. 
“He has a little poo-poo,” Bündchen notes in her distinctive accent. The robin has soiled one of Bündchens pristine cushions, but she is unbothered, consumed by its fate. (She later spot-cleans the birds poo-poo herself.) She calls her homes caretaker, Victor, hoping hell rush it to a local animal sanctuary, and drips water into its beak from an incense holder turned makeshift bird feeder. “Im afraid that hes going to die if he stays like this,” she says.
Just then, the bird flinches. “Maybe hes going to fly,” Bündchen whispers. 
Bodysuit by **Versace.**Photograph by Lachlan Bailey; styled by George Cortina.
Bündchen explains that she regularly communes with birds, squirrels, and butterflies. She is surrounded by what she calls Costa Ricas “symphony of nature”: chirping insects, squawking parrots, and the lionlike roars of locally renowned howler monkeys, brought closer by a fully retractable fourth wall of her hideaway. She begins to describe the splendor: “I found this hummingbird by the ocean one day when I was walking with the dogs—”
Suddenly, the robin claps its wings and banks from Bündchens hands, soaring out over the hilltop. We are astounded. Either its rumpled foot miraculously healed or Bündchen really is a witch—“a witch of love,” she offers. 
“Its an omen!” she declares, her eyes wide. We analyze the birds swift recovery, melodramatically searching for meaning, right down to its droppings. “He needed to release!” Bündchen laughs. But a broken bird flying free, at this particular moment in Bündchens life, cant help but be its own metaphor. 
“I dont want to be limited,” Bündchen told me in one of our many intimate conversations over two days at her compound. “I want to spread my wings and fly.” 
Bodysuit by **Alaïa.**Photograph by Lachlan Bailey; styled by George Cortina.
**Lets get it** over with: Off duty, 42-year-old Bündchen is giving mythic goddess. The godmother of the beach waves hair flows in its natural state. Her makeup-free skin is a preternatural Nars Laguna bronze. She wears a chestnut brown bandeau bikini top and high-waisted jean cutoffs—she dons only crop tops or bikinis while Im there, because shirts and surnames are superfluous when youre Gisele. Her stature might be intimidating if she didnt also possess a boundless golden retrieverlike energy. 
As most sentient beings know, Bündchen is [emerging from a long and productive union to once-again former NFL quarterback Tom Brady](https://archive.vanityfair.com/article/2009/5/and-god-created-gisele)—god or pariah, you pick. The supercouple finalized their divorce last October after a slow burn of headlines that intermixed the fate of their marriage with that of his career: There was Bradys long-anticipated retirement in February 2022, of which Bündchen had seemed in favor; his *un*\-retirement 40 days later; his 11-day absence from Tampa Bay Buccaneers training camp to address “personal” things; the hiring of attorneys; and, after a garish but brief divorce watch, the dropping of the other shoe: nearly identical statements vowing to be amicable co-parents and professing gratitude for their time together. By the time Brady re-retired in February, the pair had consciously uncoupled.
Their glittering union seemed prom-perfect: swanning through the Met Gala 11 times (once, famously, in coordinating Versace); embracing amid the hoopla of Bradys Super Bowl wins; kissing at sunset in this very house, where they held their second wedding in 2009, following a Catholic ceremony in Santa Monica, after which Brady grilled steaks for dinner. And so theirs was a split of Jolie-Pittian, and Pitt-Anistonian, proportions. The feeding frenzy was part parasocial projection, part gender discourse: If “Gisele and Tom” cant make it, what about the rest of us? Can two alphas at the apex of their careers coexist in a marriage? Must the female partner in a cishet partnership—no matter how successful she is—always assume the lions share of childcare? Or maybe it was schadenfreude. 
Around two and a half months have passed since the announcement by the time she picks me up at my hotel in Costa Rica on an ATV in a taupe sports bra, matching short-shorts, and Rainbow flip-flops. A blue-and-white linen scarf is looped around her head and face not for privacy—she is treated as a local by the locals, if not the tourists—but to combat the clouds of dust kicked up on unpaved roads. She offers me a matching scarf, and we rev uphill. 
Only two and a half months, after 13 years, and Bündchens emotions are still palpably raw. “Its like a death and a rebirth,” she tells me. She is sitting cross-legged in the living room of the main house, an open-air temple in the sky that could be the lobby at Amanyara. The gated compound—complete with a pickleball court, a yoga palapa, and a chicken habitat, where the family gets its eggs and recycles its scraps—overlooks a sleek pool and, beyond that, endless ocean. 
Losing a partner to divorce is often likened to a death. Bündchen is mourning “the death of my dream,” she says. “Its tough because you imagine your life was going to be a certain way, and you did everything you could, you know?” At this, her voice breaks. She apologizes, pressing her fingertips into her eyes, which rim pink and watery. After several yogic inhale-exhales, Bündchen resumes. “I believed in fairy tales when I was a kid. I think its beautiful to believe in that. I mean, Im so grateful I did.” 
“You give everything you got to achieve your dream,” she adds. “You give a hundred percent of yourself, and its heartbreaking when it doesnt end up the way you hoped for, and worked for, but you can only do your part.” 
Bündchens marital contributions have been well documented: For most of her partnership with Brady, the woman who was long the highest-paid model in the world scaled back her career in favor of his. She stopped walking the runway in 2015, and a few years later, moved from her longtime home of Boston to Florida. “When we moved to Tampa, I actually had never been there before,” Bündchen tells me. “I just arrived and that was my life.”
The initial decision to focus her considerable energy on wifedom and motherhood was entirely Bündchens. “When I met Tom, I was 26 years old, and I wanted a family. I felt so ready,” she says. Shed been working relentlessly, up to 350 days a year, since she was discovered at a São Paolo mall at age 13. In December 2006—a year after she broke up with Leonardo DiCaprio—Bündchen and Brady were set up on a “blind date” by their mutual friend Ed Razek, the former CMO of Victorias Secrets parent company and much-criticized mastermind of its Angels. The minute Bündchen laid eyes on Brady at West Village wine bar Turks & Frogs, “I knew right away,” [she told this magazine in 2009](https://archive.vanityfair.com/article/2009/5/and-god-created-gisele). 
Smack in the middle of the couples honeymoon phase and one day before the news broke publicly, Brady informed Bündchen that his ex-girlfriend, actor Bridget Moynahan, was pregnant. Some (many?) women might have bolted. Bündchen, indeed, considered bowing out. Looking back, it was “a challenging situation for all of us,” she says. Instead, when Brady and Moynahans son, Jack, was born in 2007, Bündchen embraced him as her “bonus child.” 
Dress by **Saint Laurent by Anthony Vaccarello;** belt by **Artemas Quibble.**Photograph by Lachlan Bailey; styled by George Cortina.
Jack, now 15, accelerated Bündchen and Bradys plan for a family. “Jack came into our lives and I felt so blessed and it kind of awakened in me this desire of being a mom,” Bündchen says. “Ive always dreamed of being a mom, but I think that happened a little faster than I thought, because now I have this beautiful little angel that I get to care for and love.” Benjamin and Vivian were born via water birth at home in Boston (which Brady initially opposed but Bündchen insisted on) in 2009 and 2012, respectively. “My world was them,” Bündchen says. “Do you know how grateful I am that I got that time for myself? I breastfed my kids until they were almost two years old. I was taking them to school every day. I was making them breakfast, lunch… I was *there.*” 
But Bündchen was never your typical WAG. Even after going to “the Valley,” her apt name for the mom-dominant phase of her career, her modeling millions—thanks to contracts with Pantene, Dior, Chanel, and others—reportedly surpassed Bradys NFL salary for most of their marriage. (His new Fox Sports broadcast contract is rumored to be worth up to $375 million.) In pursuit of extracurricular business ventures, Brady and, to a lesser extent, Bündchen shot advertisements for—and invested millions in—Sam Bankman-Frieds recently collapsed cryptocurrency exchange, FTX, where Bündchen assumed the title of environmental and social initiatives head. “I was blindsided,” Bündchen tells me. “Im no different than everyone else that trusted the hype.” She says she is legally unable to discuss specifics, but says she had believed FTX to be “a sound and great thing based on what my financial advisers told me.”
“Its just...terrible,” Bündchen adds. “Im so sorry for all of us that this happened, and I just pray that justice gets made.”
Despite her earning power, Bündchen reasoned that her job was more flexible than Bradys. Like so many women and mothers, she surrendered a bit of herself: “I wanted to build the best possible relationship with Tom, Jack and our children,” she wrote in her 2018 memoir *Lessons: My Path to a Meaningful Life.* “Im also a peacemaker who likes making everything better, easier, and more harmonious for the people I love.”
For a long time, that was Bündchens MO, she tells me now, two freshly plucked baby coconuts speared with metal straws, hers largely untouched, sitting on the table before us. As their children got older, her aspirations bubbled. “Vivi, my baby, is 10, and shes very independent,” Bündchen says. “I have dreams,” she clarifies. “I have my own dreams.” She wants her children to see her pursue them: “You want to show them that, in life, you have to find real fulfillment, not living something that youre not.” 
Brady continued collecting championship rings, even as he became practically geriatric in pro football. Particularly after Brady leapt to Tampa in 2020, the issue seemed to snowball. “My wife has held down the house for a long time now, and I think theres things that she wants to accomplish,” Brady shared on his *Lets Go!* podcast in October 2021. Around the same time, in a YouTube video answering fan questions, including if Brady could play until age 50, he yukked it up with teammate Rob Gronkowski, who added: “Will *Gisele* let Tom play til 50?” 
When their marriage officially ruptured last year, the media and the public assumed the timeline and its causation: that the marriage ended after Brady U-turned out of retirement. But marriages arent built, or broken, overnight, Bündchen says now. “That takes years to happen.”
Headlines cast Bündchen as a sidelined shrew, with the prevailing explanation centering on a supposed ultimatum: If his career continued, their marriage would not. The only problem is that, according to Bündchen, no such thing ever happened. She calls those characterizations “very hurtful” and “the craziest thing Ive ever heard.” 
“Listen, I have always cheered for him, and I would continue forever,” Bündchen insists, her voice thick with emotion. “If theres one person I want to be the happiest in the world, its him, believe me. I want him to achieve and to conquer. I want all his dreams to come true. Thats what I want, really, from the bottom of my heart.” 
With Jack, Benjamin, and Vivian, Bündchen had been omnipresent at Bradys games. Yet the tabloids “made me somebody who is against football,” she said of the headlines. “Are you kidding me? I learned about it! I used to joke that I was going to be able to be the ref because Ive watched so many games. And I loved it.” The winking conspiracy about Bündchens magical powers escalated when Brady divulged in 2019 that Bündchen built him pregame altars and gifted him special “healing stones.” She confirms that she drew homeopathic floral baths for Brady—“whenever he was going through difficult times, you know, he has a lot of intensity, to help him calm his nerves”—and gave him onyx, “a stone of protection,” and a statue of the Hindu deity Ganesha, the remover of obstacles.
Hot pants by **Ferragamo;** hat by **Jacquemus.**Photograph by Lachlan Bailey; styled by George Cortina.
When I ask Bündchen if there were stories written about their split that simply werent true, she flatly replies, “Everything.” 
“Like, I would give up my dream because of…” Bündchen trails off.
“One more season?” I attempt to fill in. 
“Wow, people really made it about that,” she says. “Whats been said is one piece of a much bigger puzzle,” Bündchen tells me later. “Its not so black and white.” Bündchen also dismisses digital murmurs that politics—namely, the MAGA hat spotted in Bradys locker in 2015—drove a wedge. “Never,” she tells me.
I dont believe that she or anyone else can summarize the unraveling of a 13-year marriage to a relative stranger in a couple of hours over fresh coconut water. What Bündchen does indicate is a gradual drift between her and Brady—one that predates the retirement saga of the past year. “Sometimes you grow together; sometimes you grow apart,” she says. “When I was 26 years old and he was 29 years old, we met, we wanted a family, we wanted things together. As time goes by, we realize that we just wanted different things, and now we have a choice to make. That doesnt mean you dont love the person. It just means that in order for you to be authentic and truly live the life that you want to live, you have to have somebody who can meet you in the middle, right? Its a dance. Its a balance.”
“When you love someone, you dont put them in a jail and say, You have to live this life. You set them free to be who they are, and if you want to fly the same direction, then thats amazing.”
**The life Bündchen** wants to lead—*la pura vida,* or the simple life—would, ideally, be based full-time in Costa Rica. “My dream was to raise my kids here,” Bündchen tells me. “I didnt get to be here as much as Id like, but now Im bringing them more often.” (Both are partially homeschooled.) Bündchen has a “village” of local friends and neighbors. On Friday nights, they make gluten-free pizzas in her outdoor oven, then circle the firepit holding sticks and sharing stories. A recent nights topic: courage. Bündchen plays pickleball with Benjamin (“Benny”) and, every other day, rides horses with names like Pinta and Alcancía (“Piggybank”) through the countryside with Vivi. I join them on their afternoon ride to the beach, clumsily plodding through muddy streams, ducking under dangling palm fronds, and chasing the setting sun so Vivi can gallop along the shore. “If I never went to another city again,” Bündchen says, “Id be perfectly happy.”
Bündchen is building a tiny solar-powered house in the mountains—the casita is practice—where she hopes to grow all of her own food. Shes considering opening a wellness center nearby, not a far cry from the way shes long introduced loved ones to juicing or silent retreats. “I want to do things that I believe are an extension of me,” Bündchen says. “Being a model is not really an extension of me... Its being an actress in a silent movie.” At this point in her life, “I dont want to be a character in anybody elses movie. And when I do that, it doesnt feel as comfortable for me anymore.” 
Miami will be the modern familys “main location” going forward. Bündchen has found a waterfront home in Surfside (shes meditating through endless construction), where the kids can be close to Bradys $17 million mansion in the exclusive village of Indian Creek, where neighbors include Ivanka Trump and Jared Kushner (she has yet to run into either). “Miami works for me because its literally a direct flight to Brazil,” Bündchen says, where her parents and five sisters, including her twin, Patricia, still live. “Im going to go more to Brazil.” Bündchen often speaks Portuguese to Benny and Vivi, striving to keep them close to their heritage.
Fifteen years of co-parenting Jack with Moynahan is helping inform how Bündchen navigates custody with Brady and sibling time for all three kids. “I say to Bridget—you know, I have a great relationship with her...” Bündchen pauses, then declares, “Everything in life comes with work. You have to go through the roller coaster. You have moments where you get to the sticky points and youve gotta overcome it.” 
Did Bündchen always have a great relationship with Moynahan? I ask, somewhat rhetorically. “No!” Bündchen blurts. The two women didnt meet for more than a year after Jack was born, but they eventually reached the point where Bündchen, Brady, and Moynahan mingled at the park in New York, where Moynahan is based, and the women hugged in the streets of Boston. “Love conquers all,” Bündchen says of her experience with Jack and his mom. “My life became so much richer because I got to learn so much from *that.*” The primary lesson: “Nothing is worth fighting \[over\].”
With Moynahan, “my goal was always, how can I be the most helpful? How can I make it the easiest I possibly can?” Bündchen reflects. “I put myself in her shoes and I was like, How can I support her? Because in the end of the day, we are team players in How are we going to do this so \[Jack\] can have the best life?’ ” 
And so she strives to maintain an amicable relationship with her ex, even when tabloid leaks shake her poise. “Were not playing against each other,” Bündchen insists. “We *are* a team,” she says, “and thats beautiful. I look back and I have no regrets. I loved every bit of it.” 
Bündchen and her son and daughter were, in fact, still cheering for Brady right up until what turned out to be his last game ever (if his second retirement sticks) in the wild card round of the NFC playoffs a few days before we met. The Dallas Cowboys trounced the Bucs in one of the worst postseason performances of Bradys career, but Bündchen declined to add to the pile-on. “It was tough, but you know what? Lets just be honest. Its a team sport and you cant play alone,” she says. “I think he did great under the circumstances that he had. I mean, he had no offensive line.”
Jacket by **Alexandre Vauthier;** swimsuit by **Norma Kamali;** shoes by **Saint Laurent by Anthony Vaccarello.**Photograph by Lachlan Bailey; styled by George Cortina.
The whole brood is thriving, and Jack remains her bonus child. “I love him so much,” Bündchen says of Jack, who is “quarterbacking”—very much a verb in this household—with aspirations of going to his fathers alma mater, the University of Michigan. Benny, who is alternately lounging with friends and studying for a math test, prefers drawing on his iPad and non-ball sports like surfing and skiing (the athletic pressure of being Bradys son led to bullying in Boston after one particular baseball game). Vivi is a tie-dye-clad aspiring horse jumper whose likeness to Bündchen is so uncanny that she can unlock her mothers Face ID. 
Together, Bündchen, Benny, and Vivi have thrown themselves into jujitsu—“Jack loves it too, but he doesnt do it as much because hes not with us as much”—practicing the martial art under the tutelage of Miami-based Brazilian brothers Pedro, Gui, and Joaquim Valente. The family is so devoted, theres a room dedicated to it, and teachers travel with them in four- or five-day stints.
“Theyre all like senseis,” Bündchen says of the “amazing” trios mind-body-spirit ethos. With Jack and Benny now in their teens, Bündchen questioned, “how can I help them to have a person that has that level of integrity and can teach them values?” For seven years in Boston, Bündchen—a Bruce Lee devotee nicknamed “Giselee” by Brady—had practiced kung fu, with sword and stick fighting, even doing so into her ninth month of pregnancy.
Bündchen and the kids found community at the Valente brothers academy. “Theyre awesome people,” she says. “They have created this safe space.” Pedro, the eldest, is “the philosopher,” while Gui is “composed and calm.” Then theres the youngest, Joaquim, who teaches Bündchen and her children. He has been photographed grabbing dinner with them at nearby Kojis, jogging—and splitting a set of AirPods—with Bündchen, and riding horses with her and a group of kids. In an Instagram Reel she shared last year that has since been viewed more than 9 million times, Bündchen, in a white gi, is seen body-slamming, headlocking, and generally owning a Valente brother in the name of jujitsu.
Bündchen blithely elides the rumors that she and Joaquim are dating: “I think, at this point, unfortunately, because Im divorced, Im sure that theyre going to try to attach me to anything,” she says of tabloid reports, before going on to emphatically praise Joaquim, along with his brothers. “Im so grateful to know all of them, because not only have they helped me and helped my kids, but they have become great friends, and Joaquim especially,” she says. “Hes our teacher and, most importantly, hes a person that I admire and that I trust. Its so good to have that kind of energy, to have my kids around that type of energy.”
Weeks after Ive left Costa Rica, the *Daily Mail* pivots to a new “exclusive” narrative: linking Bündchen to real estate developer Jeffrey Soffer, a friend of Brady and Indian Creek resident (and the ex-husband of Elle Macpherson). When I reach Bündchen by phone as the story ricochets around the internet, she is devastated. Shed spent the previous day in the mountains without cell reception, then returned to what she called the “absurd” report. “I have zero relationship with him in any way,” Bündchen says of Soffer, adding that she has not so much as laid eyes on him in over six months. “Hes Toms friend, not my friend.” I tell Bündchen that Id questioned myself whether shed date someone so close to Brady. “I wouldnt be with his friend. I wouldnt be with this *guy,*” she says. I can almost hear her grimace. “I mean, *puh-leeze.*” She especially resented the implication that shed strategically date Soffer, a 55-year-old billionaire: “They were saying Im with this guy, hes old, because hes got money—its ridiculous.”
Bündchen and one of her sisters (whod first flagged the offending story) suspect the rumor was planted. “Who benefits from this?” Bündchen wonders. “Why would somebody plant something like this? Theres only one reason. They want to make me look like something Im not.” 
What really breaks up Bündchen—bringing her again to the brink of tears—is not only her suspicion that “people have been creating false stories about me from the beginning of the divorce,” but “the hate” behind that alleged campaign. “Seeing lies being created all the time about yourself is not easy.” She vacillates between publicly saying more, and deciding to “take the high road” for the sake of their children. “Im a simple girl who wants to be in nature—leave me alone. I just want to go do my job and raise my children in peace.”
And that is what she has otherwise been doing in her private refuge. In their wall-less living room, Bündchen and Vivi indulge my request for a mini self-defense lesson. If an attacker were to approach me head-on, “you lift your foot up and you kick with your heel,” Vivi advises with utmost gravity—aiming, ideally, at the perps knee.
“Bang!” Bündchen demonstrates in slow motion.
“A girl took this big guy by kicking him three times,” Vivi adds. “Joaquim told me.”
The mother-daughter duo quickly gets fired up. “What are you going to do, Vivi, if I come and grab you?” Bündchen shouts, role-playing a brute grabbing the girl from behind. “You would go like *this,*” Vivi says as she lunges forward and grabs her mother by the ankles—they are a tangle of lithe limbs, with the same long-toed feet—miming how shed knock her mother off-balance and throw her backward to the floor. Im left with total confidence that Vivi could destabilize a grown man.
Bündchen informs me that you can break a nose with the heel of your palm, but the goal is to never have to. “What does Joaquim say?” Bündchen asks Vivi before answering her own question: “Dont go in conflict.”
I tell Bündchen that jujitsu seems like a very empowering thing for women to learn.
“You have no idea.” 
Bodysuit by **Alexander McQueen.**Photograph by Lachlan Bailey; styled by George Cortina.
**At 5:30 the** next morning, Bündchen—and Alfie and Onyx, two of her six rescue dogs—are walking toward me on the beach below her house. Theres an ethereal pinkish glow on the horizon, and the completely empty shore stretches before us like a sheet of mirrored glass. It looks a little like the movie version of the afterlife. “We are either living in heaven or hell,” Bündchen says, shaking her head knowingly. “Thats very much a choice.” 
This is Bündchens daily ritual, where she comes to fill her proverbial cup before the children wake. Shes been up since 4:30, when she rises to her “Zen” flutelike phone alarm, meditates, then plays a 21-minute Devi prayer while moving through some yogic asanas. “I actually like to greet the sun and I like to say goodbye to the sun every day,” she says. 
There are so many things she wants to do in her next act. “Ill give you a funny one,” Bündchen tells me. “One of my dreams is I want to play a superhero.”
Id prepared to ask Bündchen if she wanted to act in this 2.0 phase, citing her memorable cameo in *The Devil Wears Prada.* “I mean, imagine…I showed up for, like, two hours and who am I in the scene with?” she says. “Meryl Streep, Emily Blunt, and, um…Anne Hathaway!” 
But no, Bündchen clarifies, she doesnt want to *act*\-act. “I just want to play a superhero,” she laughs her hoarse laugh—perhaps She-Ra, Princess of Power, the almighty sword-wielding, unicorn-riding superheroine seared into the hearts of 80s kids everywhere. She felt inspired when she took her son and daughter to see *Wonder Woman.* “Can I prove to myself that we, as women, can be that strong? Why not?” she says. “In fashion, people used to joke with me that I was Sporty Spice because I was always the one hanging from things, doing jumping pictures.” Theres an ulterior motive too: “I really want my daughter to think Im cool, to be honest.” 
Her children are still largely oblivious to her legacy. In her native Brazil, when “everyone stops me in the street, theyre like, Mom, why are they doing that?’ ” She doesnt bother showing them old magazine covers. In the latest development, Bündchen stars—topless and in jeans—in the new campaign for Louis Vuittons capsule collection with contemporary artist Yayoi Kusama, shot by her frequent collaborator Steven Meisel. Her costars are a mélange of the new and old guards, among them Christy Turlington, Liya Kebede, Devon Aoki, Bella Hadid, and Karlie Kloss. Bündchen says she doesnt really know the It girl catwalkers of today—your Kendalls and Haileys. “I was living in Boston for 13 years,” she points out.
Bodysuit by **Alaïa;** cap by **Courrèges.**Photograph by Lachlan Bailey; styled by George Cortina.
Recharging Bündchens modeling means more “really big fashion moments” to come, her longtime agent Anne Nelson teases. “The world is her oyster.” She says Bündchen has considered an activewear line that reflects her minimalist aesthetic. And Nelson has fielded “a million requests for her to walk shows in Paris.” “They still ask, just in case she changed her mind.” (According to Bündchen, “I never say never, because the only thing in life I am certain of is change.”) 
Bündchens status has endured, even across the time she purposely slowed down. Recently, a seamstress informed the model that her measurements were identical to a mannequins. Compared to eras past, “theres much more age inclusivity,” Nelson says, pointing to Kristen McMenamy, 58, Naomi Campbell, 52, and Kate Moss, 49, all still working. “People look at these iconic models as being the ultimate muses,” Nelson adds. “Age doesnt even count.”
Bündchen has spent most of her life in fashion, but her early memories of the industry now seem twinged with trauma. The daughter of Vânia, a bank teller, and Valdir, who worked in real estate and later became a sociologist, Bündchen was raised in a hardworking middle-class family in the southern Brazilian town of Horizontina. If Bündchen wanted a doll, she had to wait until her birthday to get it. “All the girls were going over to grandmas house, walking with bare feet on the dirt road and hanging out with the chickens,” Nelson tells me—the same sort of childhood the supermodel is now trying to re-create for her children in Costa Rica.
In typical sibling scuffles, Bündchen was scrappy: “She had the power to end the fight,” her twin sister, Patricia, told me via email. Still, “it was difficult for Gise to grow up so thin and tall in a small city,” Patricia says. “She felt out of place. But when the opportunity to be a model came, it felt just right.” 
Instead of high school, 14-year-old Bündchen—already five foot nine—went to Tokyo for catalog work. With five other daughters at home, Vânia couldnt join her. “She was unbelievably fearless,” Patricia says of her sister, “leaving home at 14, by herself, not speaking English.” Now, as the mom of a 13-year-old, Bündchen feels that she was catapulted into premature adulthood. “I was playing with Barbies at 13 and at 14, Im in Japan, emancipated,” Bündchen rues. Logistically, she survived (shed helped her family cook and clean since age seven) but felt “alone in the world.” 
In her teens, she was living in notorious “models apartments” in New York, surrounded by cocaine and heroin use. “I saw things that were like, what doesnt kill you makes you stronger,” she says. “I always say my guardian angels are very powerful.” As is enshrined in fashion lore, Bündchens breakthrough came in 1998, when she was 18, [strutting down Alexander McQueens spring-summer runway](https://archive.vanityfair.com/article/2004/10/beautiful-dreamer), in the faux falling rain, ostensibly topless in a painted-on white crop top. Her body—*The* Body—single-handedly ended the waifish heroin-chic ideal and ushered in a comparatively more curvaceous era, but she has also said that the watershed show was one of the most traumatizing moments of her life. McQueen had intended her to walk completely topless (sans paint) and, scarcely speaking English, Bündchen was unable to advocate for herself. 
She alludes to the underbelly of the industry: “The things Ive seen and the situations Ive escaped from just because I have faith…” she trails off. Bündchen recalls dehumanizing treatment at the hands of fashions inflated egos (although she doesnt name names); unspeakable things said to her face; being treated “like you are an object…like you have no feelings,” she remembers. “You have to survive that—” her voice wavers, and her eyes again blink back tears. “Its just emotional. I feel everything so deeply, and when I remember it, I feel like Im living it again.” When I ask her what shes remembering that makes her cry, she simply says: “How tough it was.” She might have quit, but “I didnt want to go back home empty-handed,” Bündchen says. “My parents trusted me. I wanted to show them that I could do it. I didnt want to fail.” 
When she began to suffer panic attacks in her early 20s, she turned to yoga, meditation, and traveling more often to Costa Rica. “My natural instinct was, Im not going to be a victim of this. Im not going to sit here and be like, Why are they treating me like this? Why are they leaving me standing here naked for, like, eight hours without offering me water or food? Why are they being so mean?’ ” Bündchen says. “I could have been sitting there thinking, Am I even worthy of anything?” 
According to her twin, Bündchen held fast to her family values and the simplicity of her upbringing. “She was never dazzled,” Patricia says. 
Instead, Bündchen dug in her stilettos. “I could have chosen to do drugs. I could have chosen to party. I could have chosen to allow…the vampires that are out there to suck life out of me and use me,” she says, “but I came out of it. I wasnt broken.”
The sun is rising on the beach, which means its time for Bündchens daily gazing. She closes her eyes, tilts her chin up to the sky, and inhales deeply, letting its warmth beam down on her famous face. 
**“Question: Are you** having problems going to the bathroom, or no?” 
Bündchen is, surreally to me, inquiring as to the state of my digestive system because it determines what ingredients shell add to the round of morning smoothies shes making for the house—another daily post-beach-walk, post-sun-salutation ritual. “Bananas are more binding and papaya is more releasing,” she explains, ping-ponging between a Vitamix and a Champion juicer in her kitchen before gesturing to the howling outside. “You hear the monkeys?”
Fruits and vegetables harvested from her hillside garden legitimately excite Bündchen. She plans to share her earthy recipes in a forthcoming cookbook. “My goal is to make it really simple,” she says. The bounty, much of it spilling across her countertop, includes “little bananas,” “skinny bananas,” and cuadrados, a short, fat, local banana; two types of kale (soft and crispy); yucca (“We make yucca chips”); green peppers (“We just did these peppers last night with olive oil and salt”); and pitanga. “Have you ever had pitanga?” Bündchen proffers a cherrylike berry. 
[![](https://media.vanityfair.com/photos/64147c712154b552c7c10180/1:1/w_200%2Cc_limit/undefined)](https://archive.vanityfair.com/article/2009/5/and-god-created-gisele)
The kitchen is all bustle: Bündchen pours smoothies for her kids, Jordan (one of the childrens teachers), Jordans “lady,” “las chicas” (two women preparing food in the kitchen), and me. She built this main house to accommodate group hangs, mainly with her big Brazilian family. The casita, though, is her “sanctuary,” she says as she leads me there via short stone pathway. 
Hers is a magnificent she shed, all clean, blond-wood lines of her own design, flanked by banana and papaya trees, a cold-plunge pool and a hot tub for one carved into the ground outside. Her 900-square-foot “little house”cum-bedroom is “100 percent off the grid,” Bündchen says proudly, pointing to the lone light bulb dangling above a kitchen island lined in books. Titles range from the spiritual to pseudoscientific: neo-shamanistic author don Miguel Ruiz (no relation); *Sextrology: The Astrology of Sex and the Sexes* (Bündchen is a family-oriented, homemaking Cancer); *The Miracle of Water* by Masaru Emoto, which argues that positive words spoken to water (“hope,” “adoration”) have the power to form snowflake-like crystals in H2O, while negative speech (“ugly,” “hopeless”) creates murky ones. Its instructive for the way people speak to themselves and others, Bündchen posits, as “we are mostly water.”
Tank top by **Dior;** bikini bottom by **Norma Kamali;** cuff by **Saint Laurent by Anthony Vaccarello.** Throughout: makeup products by **Chanel;** nail enamel by **Chanel Le Vernis**Photograph by Lachlan Bailey; styled by George Cortina.
Crystals stud inside and out, including a hunk of purple amethyst and a milky selenite angel, which Bündchen says “clears energy” (presumably not the positive kind), sitting on her nightstand. Her bed is made in crisp white linens with an Hermès scarf featuring elegant leopards folded at the edge (Vivi has been sleeping with her lately). Above her bed hangs an oversized black-and-white aerial photo of a surfboard-wielding Bündchen dwarfed by the enormity of the ocean. From a deep drawer at her bedside, Bündchen reaches for the Kuan Yin Oracle, a collection of feminine-focused, tarot-like cards centered on Buddhisms goddess of mercy and compassion. Two days before, Bündchen pulled the card for “dynasty of the divine mother,” which urged her to “look to what is happening in your life,” she reads as incense burns on the cedar table before us, “and trust that you are progressing with perfection.” 
“This is why they called me a witch, I guess,” Bündchen laughs, considering the cards before us, but she is less peeved by WitchToks speculations than prepared to agree with them. “If you want to call me a witch because I love astrology, I love crystals, I pray, I believe in the power of nature, then go ahead.” A lapsed Catholic, Bündchens mystical proclivities are her gospel now, one that has been a salve and a source of strength when shes needed it most. 
She used to believe in fairy tales, but not anymore. “No one is going to come save you,” Bündchen says. “Never give your power away to *nobody.* This is your life. This is your movie. You are the director on it.”
After our interview, Bündchen, Vivi, and Benny jetted back to Miami, but she was still thinking about the wounded bird she helped set free in Costa Rica. A few days later, Bündchen googled its potential meaning and sent me a screenshot. “Seeing a robin encourages us to let go of the negative affecting our lives,” she had circled in yellow, “and embrace a new and happier phase.”
“The robin,” shed underlined, “symbolizes new beginnings.”
*HAIR, SHAY ASHUAL; MAKEUP, DIANE KENDAL; MANICURE, KRISTINA KONARSKI; SET DESIGN, BELINDA SCOTT. PRODUCED ON LOCATION BY SELECT PRODUCTIONS. FOR DETAILS, GO TO VF.COM/CREDITS.*
- Paris Hilton Remembers the [“Bimbo Summit”](https://www.vanityfair.com/culture/2023/03/paris-hilton-memoir-excerpt?itm_content=footer-recirc&itm_campaign=more-great-stories-032223) in Her New Memoir
- [What Is Cinema?](https://www.vanityfair.com/hollywood/what-is-cinema?itm_content=footer-recirc&itm_campaign=more-great-stories-032223) Rian Johnson, Halle Berry, and More Share Their Inspiration
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,77 @@
---
Tag: ["🚔", "🧑🏻‍⚖️", "🇺🇸", "🐘"]
Date: 2023-03-29
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2023-03-29
Link: https://nymag.com/intelligencer/2023/03/is-michael-cohens-big-mouth-derailing-trumps-prosecution.html
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-HowCohensBigMouthCouldDerailProsecutionNSave
&emsp;
# How Michael Cohens Big Mouth Could Be Derailing the Trump Prosecution
![](https://pyxis.nymag.com/v1/imgs/6ac/abc/2d76274a9022256763baf7d7366a9f31de-michael-cohen.rsquare.w700.jpg)
Shhh. Photo: MEGA/GC Images
As we continue [week two](https://nymag.com/intelligencer/2023/03/manhattan-grand-jury-wont-discuss-trump-in-thursday-meeting.html) of the Donald Trumpindictment watch, questions abound. Is it really [going to happen](https://nymag.com/intelligencer/2023/03/the-first-criminal-case-against-trump-is-this.html)? Did last weeks testimony from lawyer [Robert Costello](https://nymag.com/intelligencer/2023/03/team-trump-launches-a-preemptive-strike-on-michael-cohen.html) in defense of Trump successfully throw a wrench in the process? Does [the testimony](https://www.nytimes.com/2023/03/27/nyregion/trump-grand-jury-witness-indictment.html) on Monday from David Pecker — the former publisher of the *National Enquirer* who helped arrange the hush-money payment to Stormy Daniels that appears to be at the center of the prospective prosecution — mean that the case is back on track for an indictment? And what, exactly, is the holdup?
The answers to these questions are as elusive at the moment as they are tantalizing, but one thing has become clear: Key witness Michael Cohen and his pathological need for media attention have not been making things easier for the Manhattan district attorneys office in recent weeks.
The former Trump lawyer has always been a curious figure in this saga. He [pleaded guilty](https://www.justice.gov/usao-sdny/pr/michael-cohen-pleads-guilty-manhattan-federal-court-eight-counts-including-criminal-tax) to a slew of criminal charges during the Trump administration, including [lying to Congress](https://www.politico.com/story/2018/11/29/michael-cohen-making-surprise-court-appearance-in-new-york-1026107), lying to a bank, tax evasion, and campaign-finance violations based in substantial part on his role paying off Daniels in the final weeks of the 2016 campaign. Cooperating witnesses in criminal prosecutions often have baggage, but the way prosecutors generally try to deal with this is by forcing them to admit responsibility for their own criminal offenses and corroborating as much of their testimony as possible through independent sources of evidence, including other witnesses and documents.
Cohen, however, presents additional challenges. He clearly thinks very highly of himself and seems to have little awareness of his limitations — a toxic combination in both life and the law. He appears constitutionally incapable of telling the same story twice in the same way, though whether that is a function of malice, dishonesty, or some other factor is never entirely clear. He is also obsessed with taking down his former boss Trump, and he has managed to make a second career out of it — both through [his podcast](https://podcasts.apple.com/us/podcast/mea-culpa/id1530639447) and his countless appearances on cable news, which have been crucial to maintaining his public prominence.
The voluminous record of Cohens public statements has always been a problem for prosecutors because it creates a risk that he could be confronted with inconsistent or problematic past statements at trial to undermine his credibility. That risk was on full display in what was supposed to be the final stretch leading, at long last, to charges against Cohens arch nemesis. Indeed, Cohen has said at least two things in recent interviews that would ordinarily raise red flags for prosecutors working with an important cooperating witness — first, that the cooperator is unwilling to fully accept responsibility for his prior criminal conduct and, second, that even now he is unwilling or unable to be forthright about unhelpful facts.
Take, for example, [an interview](https://www.youtube.com/watch?v=W295sdkklic) with Cohen conducted by CNNs Don Lemon. This was styled as Cohens first television appearance following the conclusion of his grand-jury testimony, which, by itself, almost certainly drove prosecutors in the Manhattan DAs office crazy. Ideally, a key cooperator in a high-profile criminal case would not be talking to the press at all at this point, if ever.
That, however, was not the end of it. At one point in the discussion, Cohen touched on his criminal convictions but suggested that he had in fact been unfairly prosecuted. “One of the things that I think will come out of this investigation,” Cohen told Lemon, “other than the potential indictment of Donald Trump, is a lot of information about how the Southern District of New York dealt with me in my specific case.” Referring to his current lawyer, Lanny Davis, Cohen added, “He has so much information about the weaponization of the Justice Department against me that — theres nobody else that knows the story better.”
Lemon did not seem to register what Cohen was saying in the moment and moved on, but this was by far the most interesting and potentially consequential thing Cohen said during the sit-down. What exactly did he mean? Davis, for his part, seemed to back Cohen up late last week in an [interview with Politico](https://www.politico.com/newsletters/playbook/2023/03/24/cohens-lawyer-dishes-on-the-n-y-trump-investigation-00088701), recalling that at one point in the history of his dealings with his client “Michael was angry because he had been, I think, mistreated by law enforcement in the Southern District, and prosecuted.”
One interpretation of these comments is that Cohen does not actually believe he should have been criminally prosecuted and does not believe he should have had to plead guilty to the litany of federal offenses that now make up his criminal history. If that is the case, it would be difficult to understate how large a problem this would be for his credibility — and for prosecutors. Either he committed the offenses at issue and has accepted responsibility for them, a fundamental prerequisite for a crucial cooperating witness, or he was unfairly railroaded and forced to plead guilty despite being innocent of some or all charges. He cannot have it both ways, and there is no way that [Trumps lawyers](https://nymag.com/intelligencer/2023/03/joe-tacopina-donald-trumps-lawyer-vs-e-jean-carroll.html), in a trial setting, will let this slide.
Cohens slipperiness was on display elsewhere during the discussion. He described his willingness to cooperate with the Manhattan DAs office as reflecting his newfound commitment to democracy and the rule of law, and he said he had told the federal judge who sentenced him that he would work to help the government. Cohen told Lemon that he did not ask for a cooperation agreement (potentially protecting his legal interests in the future) when he was dealing with the Department of Justice in his own criminal case — in his telling, a signal of his own good faith and public-mindedness.
He left out an important fact, though: The reason he did not have a cooperation agreement with federal prosecutors is that they did not actually believe Cohen had fully cooperated with their investigation. The sticking point was that Cohen would not agree to disclose to them any criminal conduct they had not already uncovered — a prerequisite for cooperation with the Southern District of New York (though not all prosecutors offices).
As the New York *Times* [reported at the time](https://www.nytimes.com/2018/12/09/nyregion/michael-cohen-sentencing.html), “prosecutors made clear” to the presiding judge “that Mr. Cohen was less useful to their investigation because he would not fully cooperate, therefore he would not reap benefits, such as a government letter on his behalf” advocating for a reduction in sentence. “Had Cohen actually cooperated,” prosecutors told the sentencing judge, “it could have been fruitful,” but because he did not, the government was unable to “fully vet his criminal history” and assess “his utility as a witness.” This is important not only because it undermines Cohens claim that he is deeply committed to cooperating with the government — and not only because it is almost certain to come up if Cohen is ever cross-examined — but also because his unwillingness to be completely forthright with Lemon about what happened seemed to reflect a deeper, more problematic relationship with the truth.
In [another](https://www.msnbc.com/the-beat-with-ari/watch/trump-clown-show-see-key-witness-scorch-trump-ally-s-testimony-165838917597) [appearance](https://www.msnbc.com/the-beat-with-ari/watch/-panic-trump-melting-down-over-imminent-arrest-says-star-witness-cohen-165838405569) on Ari Melbers MSNBC show, Cohen offered Trumps lawyers more future ammunition. At one point in the discussion, Melber played a clip of Trump lawyer Joe Tacopina attempting to discredit Cohen at length by referring offhand to Cohens misconduct “with the medallions and all that stuff.” Cohen began his response to Melber by saying, “Shame on Joe Tacopina. First and foremost, there was no fraud in the medallions. I dont know even what hes talking about.”
Here is a good guess: Tacopina was probably referring to the fact that Cohen [pleaded guilty](https://www.justice.gov/usao-sdny/pr/michael-cohen-pleads-guilty-manhattan-federal-court-eight-counts-including-criminal-tax) to tax evasion in connection with millions of dollars in revenue that he received through [taxi medallions](https://www.cnbc.com/2018/08/23/taxi-commission-warns-michael-cohen-they-may-revoke-his-medallions.html) he had acquired. The conduct formed the basis for five of the federal charges against him, which makes it very difficult to believe he did not know what Tacopina was talking about. (Again, if Cohen is actually maintaining his innocence on those counts, that would be very bad for the case against Trump.)
Cohen also took aim at Costello, who evidently briefly served as [a legal adviser](https://www.politico.com/news/2023/03/20/former-attorney-to-michael-cohen-tries-to-discredit-him-in-grand-jury-testimony-00087982) to Cohen. The two now seem to dispute the extent of their relationship, but Costello had been allowed to testify before the grand jury about his dealings with Cohen as the result of an agreement that Cohen executed to waive any attorney-client privilege between the two men. Cohen told Melber that he did not recall such an agreement. “If in fact I waived attorney-client privilege, Id like to know when, how, where. I dont recall waiving anything.” Later that night, Costello presented a copy of the agreement with Cohens signature in [an interview](https://www.foxnews.com/video/6322993205112) with Fox Newss Tucker Carlson.
The odds that the waiver was a fabrication of some sort, even before Costello presented the document on live television, were very low, whatever one might think of Costello himself. The reason is that prosecutors in the Manhattan DAs office would have been treading on ethically problematic ground if they had allowed a lawyer to breach his privilege with a former client in the absence of evidence that their dealings had furthered a [crime or fraud](https://www.nytimes.com/2023/03/22/us/politics/trump-lawyer-classified-documents-investigation.html), which has not been alleged here.
It is not clear whether or to what extent Cohens comments — or questions about his credibility more generally — might be playing any role in the apparent delay in the Trump proceedings. Prosecutors may already have reconciled themselves to the notion that Cohen is both central to their prospective case and that he will continue to be a nuisance until the proceeding ends, one way or another, years from now. There is, however, no question that it would be better for the case if Cohen could bring himself to stop talking for the foreseeable future, even if he appears incapable — financially, temperamentally, and psychologically — of exercising some much needed self-restraint.
How Cohens Big Mouth Could Be Delaying Trumps Prosecution
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,157 @@
---
Tag: ["🤵🏻", "🏖️"]
Date: 2023-03-28
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2023-03-28
Link: https://www.nytimes.com/2023/03/20/magazine/women-friendships-travel-morocco.html
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-IWentonaPackageTripforMillennialsNSave
&emsp;
# I Went on a Package Trip for Millennials Who Travel Alone. Help Me.
![](https://static01.nyt.com/images/2023/03/26/magazine/26mag-morocco/26mag-morocco-articleLarge.jpg?quality=75&auto=webp&disable=upscale)
Credit...Rosie Marks for The New York Times
The Great ReadThe Voyages Issue
On visiting Morocco with a group-travel company that promised to build “meaningful friendships” among its youngish clientele.
Credit...Rosie Marks for The New York Times
- Published March 20, 2023Updated March 24, 2023
### Listen to This Article
Imagine walking into a party where you know almost no one (pathetic) — a party at which I, a stranger to you (probably), have arrived well before you (sorry). Should this occur in real life, it is inevitable that shortly after your entrance, as you are tentatively probing the scene in search of safe ingress into social traffic, I will yank you, abruptly, into the middle of a conversation. I will turn to you and start talking as if youd been involved in the discussion for an hour. I will lob questions at you that are tailored so that any answer you give can be right. Soon, you will forget I dragged you into this interaction; your easy popularity will seem, in retrospect, inevitable. You will most likely feel at least vaguely friendly toward me, because I so clearly want to be your friend. And the whole time I am doing this — because, despite your rewritten recollections, I am the one doing all of this — I will be thinking: Oh, my God, Im doing it again. I hate this. I hate this. Why cant I stop doing this to people?
Of all my bad habits, it is the ruthless desire to befriend that exerts the strongest pull on my behavior. Not that I want more friends — God, no. If anything, Id love to drop about 80 percent of the ones I have, so I could stop remembering their birthdays. But because I cant quit — because constantly pulling strangers into my orbit is what stabilizes my bearing in the universe — I have determined to double down. And so, in January, I booked a package vacation to Morocco through a company whose stated aim — beyond offering package vacations — is to help people in their 30s and 40s make new friends.
That millennials are the largest human adult cohort alive; in or about to enter their peak-earning years; less likely than earlier generations, at the same age, to live with a spouse and/or offspring; and highly susceptible to YOLO — a brain condition that makes a nine-day vacation to Croatia sound like a fun and affordable alternative to homeownership, which seems impossible anyway — would seemingly be enough to justify the existence of a travel company dedicated to serving them. Indeed, there is a nascent industry devoted to creating millennial-oriented travel package experiences of the type generally set aside for people much younger (e.g., [Birthright Israel](https://www.nytimes.com/2019/06/11/us/israel-birthright-jews-protests.html)) or older (e.g., [Rhine river cruises](https://www.nytimes.com/2022/08/29/travel/river-cruises-drought-europe.html)). In promotional copy, these companies sleek websites deploy the verb “curate” to describe the work of travel agents. Flash Pack, which aims to lure vacationers who would otherwise be traveling solo and marshal them into traveling bands of up to 14, is one such business.
What makes Flash Pack unusual is its “mission” — “to create one million meaningful friendships” — and a method of execution that it telegraphs with evangelistic zeal: “We obsess over the group dynamics,” its website explains on one page. “We absolutely obsess over the group dynamic,” it states on another. “Were completely obsessed with it” (“it” being the group dynamic), Flash Packs 42-year-old chief executive, Radha Vyas, is quoted as saying on an F.A.Q. page intended to calm nervous vacationers. Another page, titled “How It Works,” opens with the promise that the company “obsesses over the group dynamic, doing everything in our power to ensure youre comfortable and building friendships within the first 24 hours.”
With this intention, the agency stands in stark, even proud violation of a sociological paradox: to have many friends is a desirable condition; to plainly seek to make friends is unseemly and pitiful. Millennials broad acceptance of the taboo around extending oneself in friendship — perhaps an aversion to participation inherited from their direct predecessors, Generation X — is particularly irrational, given that millennials report feeling lonely “often” or “always” at much higher rates than members of previous generations.
Who, I wondered as I scrolled through the inviting images on the companys home page, are the millennial adults drawn to a pricey international vacation for the purpose of befriending strangers? If I plunged into a trip chosen at random, would I surface to find myself flailing among social incompetents — phone-addled young people who yearn for real-life connections but are unable to forge them under normal conditions? Or would I be surrounded by the sociopathic winners of this great game — the Jeff Bezoses of friend-making? Obviously, my fellow vacationers would be natural freaks of some kind — but would they be so because they had overcome the intrinsic shame of seeking friends or because they were naturally immune to it?
Image
![The group learning to surf in Essaouira, Morocco.](https://static01.nyt.com/images/2023/03/26/magazine/26mag-morocco-02/26mag-morocco-02-articleLarge.jpg?quality=75&auto=webp&disable=upscale)
Credit...Rosie Marks for The New York Times
The mystery started to resolve itself two weeks out from our trip, when every participant of the “Morocco Highlights” tour was added to a WhatsApp group and encouraged to introduce themselves — a suggestion we responded to with so much zeal you would think it were an assignment that constituted 60 percent of our grade; and we were determined to maintain our perfect grade-point average; and we had actually been secretly hired as “plants” by the school administration to sit in on this class, in the hope that we would contagiously motivate the real students to strive for comparable excellence, creating a domino effect that would boost the schools rankings; and we would love to take advantage of extra-credit assignments (if they were available); and, actually, we had gone ahead and conceived and executed what we felt might be some edifying extra-credit assignments, in case none were available.
We sent portraits of our pets, announced which items on the itinerary we anticipated most eagerly and provided photos of what we loved most about the places where we lived (the mountains of North Carolina; sunlight gleaming off the Charles River; the solitary beauty of a Baltic beach, which, it was hoped even before meeting, some of us would “come visit one day!”). I wondered publicly in the chat if anyone in the group might be “superorganized” and willing to share a packing list. Within 60 seconds, I received in reply an image consisting of a tabular representation of our itinerary, each column head designating a day, underneath which was a cell listing the major activities of that day (extracted and paraphrased from the official itinerary), underneath which was a full-length photograph of the sender, wearing the exact outfit, including shoes and coat, she intended to wear on that day, for those activities.
When I asked Radha Vyas, who founded Flash Pack with her husband, Lee Thompson, to give me the profile of a typical patron, she described her clients as “decision makers or leaders” in their regular lives who “want somebody else to take control” of their vacations. “Lots of our customers are lawyers, doctors, and theyve done really, really well in their careers,” she said over video chat from London — so well that they have developed “decision fatigue” from the litany of correct decisions they have been forced to make while scaling new professional heights. “They just want to turn up,” Vyas said. “Somebody tells you where to be, what time, what to do, what to wear, and you can just let go.”
**My groups official** welcome meeting was scheduled for 6 p.m. the Sunday of our arrival, by which point nearly all pack members had taken it upon themselves to welcome one another in various permutations as they arrived at our Marrakesh hotel from Denver, London and beyond. I was still asleep, flying over the Atlantic Ocean, while the unofficial pre-welcome welcoming logistics began to be codified, and then continuously revised and expanded in the WhatsApp group. Before I got off the plane, most of the other travelers were already linking up, grabbing lunch, or coffee, or rooftop drinks at a restaurant near the hotel.
I had been distressed that my late-afternoon arrival (well within the companys recommended arrival window) precluded my participation in the unsanctioned, prefatory socializing. But then, while I was waiting in line at the hotels check-in desk, I was approached by a brisk British stranger who gave an instant, slightly terrifying yet invigorating impression of uncanny competence, who asked, “Are you Flash Pack?” She had spotted the small brown bag containing a tiny hamsa-shaped welcome soap I had been given by a company representative at my airport pickup, and recognized it as the twin of the small brown bag containing a tiny hamsa-shaped welcome soap she had received, she explained — and so I was able to be unofficially pre-welcomed anyway.
There were 13 of us total. Each day of the trip, I would spend a little time privately trying to map the biblical significance of this number neatly onto our group, frustrated that no clear stand-in for Christ ever emerged. (If it was anyone, it was the vivacious and bubbly woman from a village called Burnham, which she described as “near Slough,” who was legitimately nice to everyone, and whose job investigating international commercial real estate disputes gave her experience performing little miracles in the Middle East.) Ultimately, the best I could come up with was that if Jesus had surrounded himself with 12 such team-oriented, schedule-conscious youngish (kind of) women, he might still be alive today.
Image
Credit...Rosie Marks for The New York Times
It is a matter of historical record that Flash Pack has some male customers. However, there were none on the mid-February Morocco tour. What were the women like? Slightly more likely to be white than not, to be single than not and to not have come from the British Isles ... than to have not *not* done that; but only just barely, in every category. Our average number of offspring was 0.15 per person, because only one of us had children. There were two doctors (American) and one pharmacist (not). There was a project manager; an account executive; a head of; and a director (not that kind). There was the “quantity surveyor” from near Slough, and a person whose job title was five words long, two of which were “learning” and “partner.” There was a health care data analyst and a person who coordinates tour logistics for adventure-travel companies, who insisted she was, in fact, on vacation. There was a woman who was Irish, which was not her job, but, my God, she was good at it; she owns a pug who apparently is a successful working actor, which was also not her job. We ranged in age from 31 to 45.
“Morocco Highlights” is an expensive way to make friends: The price of the eight-day trip (the first and last days of which are devoted to arrival and departure) starts at $2,395. This includes shared accommodation in twin rooms with another traveler, most meals and all group activities. The additional expense of round-trip economy flights brought my cost to around $4,165 — within $30 of the median monthly income for an American woman at the end of 2022. The price and premise all but ensure that bookers will spend their trip surrounded by people who share not only their approximate income level (high, though not so high that they could fly a bunch of their actual friends to Morocco) but also their principles about what makes a vacation successful (an efficient use of time; a wide variety of commitments; transforming strangers into acquaintances).
At 6 p.m. sharp, by the cold hotel pool, we officially met and were welcomed by Ismail, our guide. Ismails command of English — his fifth language, he told us, by way of apology — was so strong he was able to be genuinely funny in it. (“Call me Ishmael!” he said — and many people did, the whole time.) His opening remarks included polite yet firm advice regarding group punctuality: If you were going to be “five minutes late” for any activity, at any point, please send a quick note via WhatsApp informing everyone else. I thought of this counsel when Vyas told me later that as Flash Pack trains its guides, it makes a point of teaching them to instill confidence in their administrative abilities at the very first meeting. “Because if they dont,” Vyas said, “our customers will try and take control — because they are natural leaders.”
Over the course of approximately 30 distinct group activities — several of which required rising before dawn — there were two or three occasions when people dutifully gave warning that they could be very slightly late. Otherwise, all 13 of us were ruthlessly on time, except when we were early, which was often. It was the most exhausting vacation of my life.
**Picture a normal** vacation. Now, picture an activity that would be the primary event of one vacation day — possibly of the entire trip. Now, picture scheduling it to happen first thing in the morning. And then, immediately after that, another diversion of equal heft, and sometimes another, and possibly a fourth. Interspersed within the tent-pole itinerary items are more options for spontaneous activities. Thats what every day of this trip was like.
We started our first morning barreling through the thousand-year-old alleyways of Marrakeshs serpentine medina in stylish retro motorbike sidecars; then headed straight into a self-guided tour of the Jardin Majorelle, the electric blue cactus paradise restored by the fashion designer Yves Saint Laurent; then took another tour of a secret garden (quite crowded, perhaps because it is well advertised as Le Jardin Secret); then had the option to embark on a supplementary souk shopping excursion before dinner, which itself consisted of an hourslong walking tour of medina food stalls and ended with one or two more spontaneous opportunities for shopping.
The dinner tour was led by a young man named Abdul, who, like all the men who led any of the tours, was young, handsome and dressed as if he could, at a moments notice, be called to ride a motorcycle to the offices of a mens fashion magazine for an emergency photo shoot. Abdul ushered us past corridors of pierced metal lamps that glowed with the diffuse light of distant galaxies, brightly dyed babouches perched in rows like colorful parrots and jeans for babies, stopping every few minutes when, all of a sudden, we would be handed things to eat: olives plucked from glistening heaps; shards of fried puff pastry; orange soup; a sheeps eye; nuts. In fact, this is how most of our meals occurred, even in restaurants (where, invariably, we would be seated together at one long table): Food would simply be placed before us without anyone having ordered.
Image
Credit...Rosie Marks for The New York Times
The first time the food magically appeared, at our welcome dinner on a terrace overlooking the medina, we were served warm glasses of mint tea and tagines, which — not realizing these were but the first of 900 glasses of mint tea and 10,000 tagines we would be invited to consume over the next week — we ate heartily. The announcement of the final course inspired me to declare, in case anyone was listening, that I am “a dessert person.” Ismail was listening. Exhibiting the preternatural ability to get out ahead of potential threats to mood that the company strives to inculcate in its guides, Ismail informed me, as gently as possible, that “dessert in Morocco can be just fruit.” I began musing excitedly about the various fat and sweetness enhancements to which fruit can be subjected, transforming it into dessert. Ismail held my gaze. With the delicate assertiveness of one determined to form a connection with a jumper poised on the side of a bridge, he clarified: “Just fruit.” (As darkly foretold, the final course proved to be just orange slices.)
We travelers were almost never asked to produce money for any service, experience or tagine. Those few times we were — purchasing souvenirs, for instance — the transaction was typically conducted on our behalf, in Arabic, Berber or French, by Ismail, who then told us in English how much colorful Moroccan currency to hand over. These encounters suffused our tour with an intoxicating ease. Each day was crammed with activities, but we were shepherded through them in a state of such perpetual mollycoddling that, increasingly, our travels around Morocco felt like trekking through a gentle dream world.
We were driven into the foothills of the Atlas Mountains and introduced to a young Berber woman named Saida, who taught us how to make a meal (tagine) on her expansive living-room terrace, then gave us a tour of her apricot-colored stone-and-clay house. We were led virtually nude (not by Ismail), in trios and pairs, into a polished stone steam chamber where we were scrubbed, slathered, oiled and boiled until we resembled hot dogs fresh from the package. We were escorted across two lanes of traffic to an argan tree whose branches served as scaffolding for goats, and invited to hug the goats sweet, warm, soft babies to our chests. We were deposited before a squadron of ATVs and trusted to operate these roaring vehicles over a route of rocky desert terrain — pausing midtrip so that we could be guided, via graceful pantomime, through a sequence of photo poses — until, an hour later, we had driven ourselves to the sumptuously appointed canvas tents that would be our sleeping quarters in the Agafay Desert.
Image
Credit...Rosie Marks for The New York Times
It is Flash Packs good fortune to attract the kind of control freaks for whom the delicious little thrill derived from living through an incident of well-executed planning is entirely distinct from, and in addition to, their enjoyment of the activity itself. “I like the way its being incorporated into the schedule,” the angel of near-Slough confided in me, reflecting with satisfaction on the way the ATVs did double duty as transportation and excursion. I was terrified every single second my ATV was in motion at the uncontrollable speed of 19 miles per hour — but I had to admit that I liked it, too.
**The companys terms** and conditions grant it “the right to decline any booking at our absolute discretion.” In separate interviews, the founders described a postbooking process whereby a customer-service representative can internally “red flag” an individual who they suspect could pose a risk to the cohesion of the group.
“Normally, if there was a flag against the individual,” Thompson said, “we speak to them to make sure were managing their expectations and make sure theyre booked on the right trip.”
“One really cantankerous person can disrupt the group quite quickly,” Vyas said. The failure of a group to click, according to Vyas, can usually be laid at the feet of “one person whose expectations are completely out of sync with what we can offer.” A tip-off is when someone gives the impression of being “extremely demanding” about their personal preferences for the trip. While Flash Pack does not loudly advertise that customers are at theoretical risk of pre-emptive ejection from a trip (with refund) if the company suspects them of being the kind of person who will try to ram too many solo-vacation elements through the intricate itineraries on offer, its quite possible this threat would only make the offerings more appealing to the plan-loving, rule-following, fine-print-studying, steadfast competitors who form its client base.
About half the women on our trip had come to Morocco because they had always (or near enough) wanted to come to Morocco; the other half of the group had come because they wanted to take a trip of about one weeks duration sometime in mid-February, and the “Moroccan Highlights” tour satisfied this brief. If anything, those who ended up in the country by chance seemed especially delighted with how much they were enjoying a place that had never particularly occurred to them. Two members of the group — one British, one American — met on a previous Flash Pack excursion to Vietnam, during which they (as advertised) became good friends, such good friends that they decided years later to check out Morocco together.
An I.T. consultant on the trip who was a veteran of multiple Flash Pack tours, and of the U.S. Army, observed to me that on every vacation she has taken with the company, across four continents, every single participant she has met has had “a Type A personality.”
The notion of “A” as a “type” was theorized in the late 1950s by Dr. Meyer Friedman and Dr. Ray H. Rosenman, two American cardiologists who believed that most heart attacks suffered by people under 70 were directly attributable to an abundance of emotional stress. Such high stress levels, they proposed, were found in individuals who tended to exhibit a cluster of personality traits: “excessive competitive drive,” “aggressiveness,” “a harrying sense of time urgency,” feeling “vaguely guilty” when relaxing, etc. These were meant to be habits, not traits — something a person could unlearn. Yet almost from the moment the concept was introduced to the public, “Type A personality” has been used as shorthand to describe an intractable manner of being.
Image
Credit...Rosie Marks for The New York Times
I had never thought of myself as Type A before my fellow vacationers observation. I had assumed the designation implied at least a moderate degree of neatness, which I have never exhibited. But the hallmarks she identified (per the American Psychological Association: “chronic competitiveness”; “high levels of achievement motivation”; “a distorted sense of time urgency”) all felt familiar. Later, when I learned that Friedman and Rosenman described individuals with Type A traits as “quite prone to exhibit a free-floating but extraordinarily well-rationalized hostility,” I became convinced. My tendency to mechanically entrap others into friendship seemed suddenly explicated: I do it because I have no tolerance for those who unintentionally imperil fun party moods by fostering atmospheres of social awkwardness.
I do not mean to suggest that all the women on the trip approached friend-making similarly. The lack of time for indecisive dithering was what made the trip soothing for me. For someone else, it may have been the ability to wonder, one afternoon, if it might be possible to get a tattoo while in Morocco — and then, by dinnertime, to have a brand-new tattoo, seamlessly facilitated by Ismail. But I contend that every member of our group, to some degree — to a very high degree — exhibited many of the traits designated Type A. I believe this because a vacation experience like the one Flash Pack offers — which promises a detailed itinerary, strict schedule, mandatory fun, controlled explosions of joy and defined periods of prearranged “free time” — is unlikely to attract a person who does not exhibit these tendencies, and also because by the end of the trip we had all memorized one anothers food allergies and were pre-emptively checking with waitstaff about them on one anothers behalf. (Vyas said that “stereotyping our customers as Type A” would be “a gross overgeneralization.”)
> ## The less said about Wine Day the better.
**We awoke on** the fifth day to a world of paradisiacal beauty. The clouds over the Agafay Desert were shot through with beams of gold at dawn. As the morning unspooled, these gave way to a creamy wash of slate blue and pearl gray, revealing our camp to be afloat on an ocean of gently swelling rocky dunes that stretched to the distant purple Atlas Mountains, whose peaks were luminous beneath fresh snow. The numbing cold of the previous day prevented us from using the pool that had, improbably, been built into the desert ground — and already it was time to depart. We were too committed to successfully executing the tours mission to be outright grumpy as we piled shoulder to shoulder into the van, staring down a three-hour drive to our vineyard visit. But it was clear to all, on the unusually quiet ride, that we would have to take proactive steps to turn the day around. And that well-intentioned resolve, I suspect, is what threatened to send the meticulously calibrated nuclear reactor of our group dynamic into meltdown.
From this point, the less said about Wine Day the better. Was there wine? Yes. Was there more wine? Yes! Was there anything else to do during the two and a half hours we were scheduled to be at the isolated winery — a period we were forced to spend indoors because of a cold drizzle — but guzzle wine? Yes! — I mean no! A little more wine before leaving? Wine! Did Wine Day bleed into Mixed Drink Dusk? For some. Was it followed by Shots Night? Absolutely. Was there a reason the 13 of us all dined together that evening, which was the only night of the trip we were not obligated by the itinerary to have dinner as one huge group? Friendship!(?) Did half our group end up at a club? Yes. Did two members of that half vanish when Ismail was not looking and sneak off to the ocean for a late-night skinny dip? Allegedly. Did this sort of behavior appear anywhere on the itinerary, an incorruptible document listing all legitimate activities? No, it did not. Had Ismail already formed an emergency recovery plan for the fugitives involving our hotels night manager by the time they sheepishly returned, wet from the sea? Of course. Did the unscheduled actions of these successful professional women threaten to cast a pall over Hammam Experience Day? Yes, but only because they detected (and confessed to us that they detected) the next day, through imperceptible indications, that Ismail was disappointed in them — a fate that would have been unendurable for any of us, who live to not disappoint others at any cost.
Image
Credit...Rosie Marks for The New York Times
Of course, the controversial acts of Wine Day were arguably a direct result of what the company set out to do. Because the tour had outlined its goals — for everyone on the tour to relax and become friends — very clearly on its website, it had attracted, as participants, a horde of demented overachievers whose determination to relax and become friends far exceeded that of the average person; who would stop at nothing to complete these objectives; who had paid thousands of dollars to pursue these aims among like-minded maniacs. These two women, while violating the tenet that Flash Pack vacations are not only vacations but also group projects, in which individual whims must be subordinated to the needs and desires of the commonwealth, had, nonetheless, passed the larger test: They had found time, outside the packed schedule, to do the sort of spontaneous thing a pair of real adult friends might, in theory, do on vacation. Had their behavior in any way impinged on the remaining officially sanctioned good times scheduled to fill out the final two days of our itinerary, its possible the remainder of the group would have devoted a portion of its collective acumen and pragmatism to ruining these womens lives.
But the next day we took a surprise excursion to a fish market, where Ismail arranged for a banquets worth of fresh seafood to be placed before us, and personally squirted soap into our hands so we could wash them, and then we did yoga on the beach, and then Ismail agreed to take us out for ice cream before bed, and everyone participated and was on time, and we still had one full day left after that. So everything was, in other words, back to normal.
Upon my return from Morocco, I awoke after dawn for the first time in over a week. Rather than dashing out of bed to learn to surf (and then, still in my wet suit, ride a camel), I luxuriated under my blankets. The obligations of my real life (work, chores) were a breeze compared with the responsibility of converting 12 strangers into new friends while participating in a full daily docket of group activities. In the WhatsApp group, my aggressive campaign to persuade everyone to stay friends forever was already underway. The vacation was over. I could relax.
---
**Caity Weaver** is a staff writer for the magazine. She last wrote [a feature about spending time in a room engineered to be soundless](https://www.nytimes.com/2022/11/23/magazine/quiet-chamber-minneapolis.html). **Rosie Marks** is a photographer based in London and Los Angeles whose work focuses on people engrossed in their own worlds. She has published two books of documentary photography, including “Pretty Hurts.”
Audio produced by Tally Abecassis.
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,217 @@
---
Tag: ["🥉", "🏀", "🇺🇸", "👤"]
Date: 2023-03-28
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2023-03-28
Link: https://www.theringer.com/nba/2023/3/21/23639331/jaylen-brown-nba-boston-celtics
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-JaylenBrownIsTryingtoFindaBalanceNSave
&emsp;
# Jaylen Brown Is Trying to Find a Balance
When Jaylen Brown was being recruited to the University of California, he met Derek Van Rheenen, a prominent cultural studies professor. They struck up a friendship months later, in a Cal summer program that Brown attended. Impressed by Browns intellect and persistence, Van Rheenen pushed for Brown to receive a special exemption to enroll in his graduate course the Theoretical Foundations of the Cultural Studies of Sport in Education.
One morning, Van Rheenen led a discussion about the ignorant belief that Black athletes are genetically more gifted than athletes of other races. “The corollary there is that maybe theyre not as intellectually or cognitively up for the task,” Van Rheenen tells me. “Like, yeah, youre really good at playing basketball, but we dont expect much more from you relative to your intellectual scholarship.”
The lecture lingered in Browns mind long after class. At basketball practice later that day, he lagged through drills and missed basic instructions. “There was this intense conversation; Im working through it,” coaches recalled him saying. “I cant just do the thing that youre asking me to do.”
Brown was Cals highest-ranked basketball recruit since Jason Kidd, but he committed to the school ahead of the 2015-16 season hoping to find an identity beyond sports and to play for the predominantly Black coaching staff led by Cuonzo Martin. But on the way to practice that fall day, Brown felt like he was just another athlete living out the stereotype hed discussed in class. Worse, he was the face of an institution making money off his talent.
“It make you not want to play at all,” Brown tells me. “Make you not want to even show up.”
When I saw Brown in Boston in January, he was going through a similar conflict. In the seven years since the Boston Celtics picked him third overall, Brown has blossomed from an inconsistent contributor into the face of one of the most successful franchises in sports. On the floor, he helped lead the Celtics to their first NBA Finals in a decade last season. Off the floor, the 26-year-old has used his voice and profile to enact social change. His foundation has partnered with colleges to create a bridge program for underrepresented youth aimed at closing the educational gap between races. And in the wake of George Floyds murder, he led protests, became an advocate for social change, and inspired the Celtics front office to revamp its approach to community outreach.
But his quest to find worth beyond the game resulted in a number of public missteps in the past year. Last spring, he signed with Donda Sports, an agency founded by Ye, the rapper formerly known as Kanye West; five months later, the agency went dormant, and the school associated with it shut down because of the musicians offensive behavior and comments. A couple of weeks later, Brown publicly defended Kyrie Irvings right to free speech after his former teammate tweeted a link to a movie that spewed antisemitic tropes.
His basketball life has also been complicated. Hes still reconciling the departure of Ime Udoka, the former Celtics head coach whom Brown advocated to hire but was later suspended before this season for an improper relationship with a subordinate. Brown also spent the summer in trade rumors, heightening his feelings about being a commodity for an institution rather than a partner in the quest for the Celtics 18th banner.
As this season grinds to a close, Browns Celtics, riding a breakthrough season from Jayson Tatum and following the lead of new head coach Joe Mazzulla, have struggled, but remain [among the favorites](https://nbarankings.theringer.com/odds-machine) to make it back to the Finals. But Brown is also striving to strike a balance between playing the game and being known beyond it.
“Obviously, our goal is to win the championship. Thats, I think, what everybody is focused on,” Brown tells me. “Me, I feel like I still have so many more limits to tap individually. To be better, to be a better leader, to be a better player, et cetera. As for now, Im just playing my role on the team to help us get back to do what we got to do. So, nothing wrong with being a part of a team and doing your job. Thats how I look at it.”
![Brooklyn Nets v Boston Celtics](https://cdn.vox-cdn.com/thumbor/6hIrZGrPVGg5H2JOzK_lRAkpjF0=/0x0:4962x3308/1200x0/filters:focal(0x0:4962x3308):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/24524449/1239059338.jpg)Photo by Nathaniel S. Butler/NBAE via Getty Images
The beginning of Browns NBA career was marred by inconsistency. As a rookie, he impressed with his defense on LeBron James in the 2017 postseason, and he excelled in a pivotal role the following season for a Celtics team that again reached the Eastern Conference finals. But his urge to live up to his draft position often overrode his desire to reach team goals.
“I wanted to win; I wanted to also prove that I was the third pick of the draft,” Brown says. “At the time, when youre young, you see all your counterparts out there doing all types of stuff. Ben Simmons in Philly, Brandon Ingram in L.A., they are in the same draft, and so you want to keep showing people that you are not a bust. You are of equal talent. So during that time, thats all it was for me, just trying to make sure people knew that Jaylen could play.”
When Brown played selfishly, shooting a contested jumper early in the shot clock or dribbling into a double-team, his teammates would grumble.
“He always used to get in trouble,” Marcus Smart, Browns best friend on the team, tells me. “Because he would go one-on-five a lot when he was young, and everybody would just be like, Slow down, man.
“So I asked him, Im like, J.B., what be going through your head when we be yelling at you, “Slow down”?
“Hes like, All right, listen. So, right, yall screaming slow down—the defender hears that. So Im thinking hes going to think Im slowing down, so Im going to speed up.
“And Im like, No, man. Im like, Nah, nah, nah, you got to change that. Thats not how you got to think.’”
Role changes also proved difficult. After starting during the 2017-18 campaign and helping to push LeBron and the Cavs to a Game 7 without new additions Gordon Hayward and Kyrie Irving, Brown was relegated to the bench for most of the following season. He began to wonder if hed ever get a prominent role in Boston.
“The pain came from being ready to do more,” Brown says. “And not being allowed to. From a basketball standpoint, I always felt like … throw me out there no matter if Im in Boston or in Japan \[playing for Team USA\]. Im going to figure it out. Im more athletic, Ive got more skill than the majority of people in this league. And Im a wing, which is of extreme value. I got long arms. Im athletic. I can get to where Im going. I can see the game. I got a feel for it. I had to learn more about how to play the game. And that came with experience.”
But the Celtics veteran core—which, in addition to Irving and Hayward, included the likes of Al Horford and Marcus Morris Sr.—didnt have time to wait. When Brown, Tatum, or Terry Rozier would make mistakes, Irving would lash out, and Brown, the most outspoken of the young players, would push back.
“Me and Kyrie didnt really see eye to eye when we was here,” Brown tells me. “Really at all.”
Irving, already with a championship under his belt, felt it was his responsibility to help facilitate Browns ambitious goals and to guide the young Celtics into contention for years to come. But Irving now admits he missed the mark.
“Sometimes—and I could say this for myself—sometimes our individual goals are before the team goals, and he had to adjust,” Irving says. “You think about our team. I want you to really look back at our team that we had and see how talented we were. And we had a lockup in every position. It was two, three guys in every position. So it was not only competitive with me and J.B., but it was competitive amongst all of us. And that wasnt the best recipe for team success if youre competing with your brothers every day.”
Prior to the 2018-19 season, Irving, who was in the last year of his contract, publicly committed to the Celtics at a season-ticket holder event. But Irving says his personal life began to interfere with his organizational promises.
“I mean, for me, I lost my grandfather my second year in Boston, so it was my first time really losing someone close like that to me, other than my mom and my grandmother when I was young,” Irving says. “So me being in Boston, not being home, not having that emotional support, I really felt alone, even though I wasnt alone. So I didnt really connect with everybody as much as I should, and I didnt open up as much as I should.
“The week before my grandfather passed, I was committed to the Boston Celtics, and I wanted to stay here. And then my grandfather passed a week later, and then my whole world shifts after that point, and I dont think anyone understood it. Not the Celtic fan base, not the NBA fans, not anybody from afar.”
As the season wore on, Irving says his plans changed. In the summer, he opted to move to New Jersey, where he grew up, and play for the Brooklyn Nets alongside Kevin Durant. Brown, meanwhile, began to blossom, earning an All-Star bid in 2020-21 and developing into one of the best two-way wings in basketball. In 2019, at the age of 22, he was named a vice president of the players union, quenching his desire for a leadership role. Brown didnt hear much from Irving until the pandemic shut down the NBA in March 2020.
“He reached out to me, kind of let me know what his experience was when he was in Boston, what he was feeling,” Brown says. “And I understood what he was going through personally. So, life is a journey. We all got ups and downs. And most of all, we dont always handle everything in the perfect media-appropriate demeanor. Kyrie, one thing about him, he going to be who he is. I appreciate that.”
A month into the 2022-23 season, Irving tweeted a link to an antisemitic film, garnering widespread criticism. After failing to apologize for promoting the link, he was suspended by the Nets and given six requirements to fulfill in order to be reinstated, including sensitivity training and a $500,000 donation to anti-hate groups. Prominent players spoke out against the ruling, including Irvings former teammate James, who tweeted that the suspension was “excessive.” “I dont believe in sharing hurtful information. And Ill continue to be that way but Kyrie apologized and he should be able to play,” James [tweeted](https://twitter.com/KingJames/status/1590781218790211584). “Thats what I think. Its that simple. Help him learn—but he should be playing.”
Brown had a similar critique of the suspension. When members of Israel United in Christ, a religious sect designated as a hate group by the Southern Poverty Law Center, protested Irvings punishment in front of Barclays Center, Brown quote-tweeted a video of the group with the caption “Energy.” Brown later clarified that he mistakenly believed the group to be a member of the Black fraternity Omega Psi Psi.
Brown tells me that he still believes that Irvings punishment was unjust, not because he agrees with the content of the film, but because the suspension violated the collective bargaining agreement.
“Thats my job as vice president of the union,” Brown says. “The union is supposed to be an entity to protect the players, especially their rights and their freedom of speech. I feel like what the Brooklyn Nets did—I still feel the same way—it was inappropriate. I think it was like a public ransom note almost, in a sense, where he had a list of demands he had to do to return to the game. It was a violation of our CBA. Its a violation of our agreement and kind of got looked over like it was nothing.”
Privately, Brown reassured Irving that the controversy would pass. “He was one of the main ones that really stood beside me,” Irving says. “And was 10 toes with me and just telling me like, You know, its going to be all right. Theres peace of mind at the end of this road, but I want to let you know that youre not alone in this.’”
Irving now describes Brown as a “brother.” During Februarys All-Star Game, Brown tweeted in support of Irvings custom shoes that covered up the Nike swoosh, in protest of the brand that dropped Irving following the controversy in the fall. In the same exhibition, Brown covered up the Nike logo of his own Kobe 3 sneakers with the word “liberation.” Brown has been a sneaker free agent since leaving Adidas in 2021. In recent years, hes criticized sneaker brands that have courted him for not wanting to [support his off-court initiatives](https://www.bostonglobe.com/2022/03/21/sports/jaylen-brown-celtics-sneakers/).
Irving has caused much public consternation over the past few years, including for his decision to sit out in protest of COVID vaccination requirements and his toxic relationship with the Nets, which recently led to his trade to the Dallas Mavericks. But Brown sees a different side of Irving.
“Kyrie is one of those people who isnt afraid of being wrong,” Brown says. “He isnt afraid of being embarrassed. Hes not afraid of big moments either, doing great things. Hes one of those people thats special. We see him at the top of the world, and we see him make some mistakes as well. But I appreciate the fact that the fear factor for him, even though he might have been afraid, didnt stop him from doing or saying what he felt was right, for what he felt he needed to do. And that doesnt exist in 99 percent of people. So, people can say what they want about Kyrie Irving, but hes definitely my friend.”
![Phoenix Suns v Boston Celtics](https://cdn.vox-cdn.com/thumbor/esvNwzK43DItr2zNiEA1mpYrnAI=/0x0:3879x2586/1200x0/filters:focal(0x0:3879x2586):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/24524452/1462356122.jpg)Photo by Maddie Meyer/Getty Images
A day before Bostons 125-121 win over the Lakers in January, authorities released a 30-minute video of five Memphis policemen beating Tyre Nichols, a 29-year-old Black man, causing injuries from which hed later die. It marked another public instance of a private citizen dying from police violence, sparking outrage over Americas police practices. At the end of Browns postgame press conference, he was asked about the fatal encounter.
“Id just be remiss if we didnt ask you for comment about the situation in Memphis,” a reporter said.
Brown has come to expect these kinds of questions. He welcomes them. His interest in activism comes from his mother, Mechalle Brown, who instilled in Jaylen that being an athlete wasnt enough. “I always stressed to Jaylen that no matter how tall you are, and how well you play the game, basketball is what you do, it is not who you are,” Mechalle tells me by email. “Who you are is measured by the mark you leave on the world. And to truly leave a mark on the world, you have to do the right things, and speak out against the wrong things. But in order to do that, you have to use your voice. After you use your voice you have to back it up with actions.”
That credo has motivated a lot of Browns decisions. At Cal, he participated in student-led protests on campus and frequently consulted with the schools faculty on how to be an organizer. During his second season in Boston, he led a lecture at Harvard about the importance of athletes having a voice on social issues. Three years ago, in the wake of George Floyds murder, Brown drove 15 hours from Boston to Atlanta, his hometown, to lead a protest against police brutality. And in 2021, Browns 7uice Foundation partnered with MIT to create the Bridge Program, a 12-week summer course for kids from underrepresented communities to learn [artificial intelligence, biology, and civics](https://www.bridgefuture.org/curriculum).
“Ive been doing this since I came from Berkeley,” Brown tells me. “Its not like I started talking when the lights are on. Ive done lectures. Ive been able to speak on certain things since I was 18 years old: break them down, give my perspective.”
Because of this work, Brown has become a go-to voice when tragedies like the Nichols killing occur. After Floyds murder, members of the Celtics front office sought his advice about how to respond as an organization. Brad Stevens says roundtable discussions during the pandemic-induced bubble of 2020 featuring Brown, his fellow Black teammates, and Stevens gave the then coach a better understanding of his players feelings.
But Browns desire to speak out in support of the Black community also led to the largest error of his career. Last summer, he signed on as a client of Yes Donda Sports, the agency that also signed NFL wide receiver Antonio Brown and Los Angeles Rams defensive lineman Aaron Donald. Members of Browns inner circle warned Brown of Yes growing erratic behavior. In 2018, he referred to slavery as a “choice.” And in months before Brown signed, the rapper harassed his ex-wifes boyfriend and referred to former TV host Trevor Noah as a “koon” on social media.
However, Brown grew up as a fan of Yes music. In Ye, Brown saw a Black man building a self-sustaining community for his people, which is what Brown was hoping to achieve with his foundations. Yes father was involved with the Black Panther Party, a political organization Brown studied religiously in college. And the rapper promised an opportunity to teach students in person at the Donda Academy, Yes private Christian school, and mentor student-athletes from the Donda Doves, the schools basketball team. “A lot of time goes into creating an entity or organization,” Brown told *The* [*Boston Globe*](https://www.bostonglobe.com/2022/10/24/sports/jaylen-brown-condemns-kanye-wests-statements-will-stay-with-his-agency/) last fall. “The reason why I signed with Donda Sports, it represented education, it represented activism, disruption, it represented single-parent households.”
But Yes grand plan of educating the next generation was undercut by prejudiced and often incoherent outbursts against Jewish people. In October, he posted on Twitter that he would go “death con 3 On JEWISH PEOPLE,” a tweet that got him banned him from the platform. Despite Yes troubling behavior, Brown told the *Globe* in late October that he would stay with Donda Sports, figuring Yes words were separate from Browns initiatives at the school. “I dont condone any hurt, harm, or danger toward any group of people or individuals whatsoever,” Brown told the *Globe*. “Ive been a member of my community, trying to uplift my community, and Im going to continue to do that.”
But a day later, Brown reversed course and left the agency.
“What would have happened if I stayed?” Brown [told reporters](https://www.boston.com/sports/boston-celtics/2022/10/29/jaylen-brown-donda-sports-academy-kanye-west-quote-why-he-left-support/). “I work hard to be able to have the platform that I have and use it to be a voice for the voiceless. So to potentially, maybe, have to sacrifice that platform, I dont think that would be the right decision. So I had to do what we have to do.”
In his comments to the media and on Twitter after his departure from Donda, Brown lamented the closure of Donda Academy. “Education resources and opportunity is key,” Brown [tweeted](https://twitter.com/FCHWPO/status/1585719021969854466) on October 27. “Donda Academy supplied that for these student athletes in hopes to get exposure and potentially change there families lives generationally that opportunity was taken away from them today to prove a point? Why make them apart of this?
“Anti-Semitism should be handled with sensitivity and respect, Inequalities /lack of opportunity in our education system should be handled with sensitivity and respect,” Brown continued, as part of a tweet thread. “A school with resources/ opportunity academically and athletically have been taken away abruptly without notice.”
When I broach the topic of Ye to Brown in Boston, the guard quickly declines to comment. “I dont want to answer that question,” he says. “I dont want to answer that.” When I followed up weeks later, I was directed toward the [official statement](https://twitter.com/FCHWPO/status/1585036696667951107) he tweeted in the fall.
People close to Brown say that the young NBA star was naive, that despite their warnings about Ye before signing with Donda, Browns passion for uplifting the Black community, and maybe even his connection to Yes music growing up, masked the troubling behavior brewing in Yes personal life. But even the best intentions are undermined by the mere association with someone like Ye, who since the disbanding of Donda Sports has continued to make hurtful and bizarre comments.
“The longer you stay with people with really, really compromised values, people believe that theyre also yours,” says DeRay Mckesson, a prominent civil rights activist. “Whether you say the things or not. I dont think that people can pull up quotes where he was antisemitic, or a host of things, but he stayed too long.”
But Mckesson also thinks theres a chance for Brown to bounce back from his mistakes.
“People love a comeback. People love a redemption arc, and the best thing for Jaylen would be to learn and reflect and grow from it,” Mckesson says. “In organizing, we talk about the idea that we dont throw people away, that people will do things imperfectly, and as long as they grow from it, theres always a place in community.”
Despite the recent fallout, Brown still wants to be a voice on social issues. He isnt exactly sure why people turn to him for guidance, but he welcomes the burden.
“I dont know how it came about,” Brown tells me. “But I guess people feel comfortable hearing me talk about certain things. That might be part of the problem. But I definitely plan on doing it more. Sometimes getting people out of their comfort zone is where change can happen.”
So when he was asked about Nichols soon after scoring a team-high 37 points, including a layup plus and-1 to send the game into overtime, in an eventual win over the Lakers, Brown took a deep breath and spoke.
“I break it down as like, theres certain people that want the world to change and continue to move forward, and theres certain people thats OK with where the world is at,” Brown said. “Im going to continue to challenge those people, because it doesnt matter if it benefits your pockets or benefits your financial opportunities.”
“We have to push our society forward, and weve got to do better in a lot of regards. As weve said many times, and were going to continue to say, our society has to do better.”
![Dallas Mavericks v Boston Celtics](https://cdn.vox-cdn.com/thumbor/AJ9Cr-jgUjHNj_aJnUdTiNk80kc=/0x0:4878x3252/1200x0/filters:focal(0x0:4878x3252):no_upscale()/cdn.vox-cdn.com/uploads/chorus_asset/file/24524454/1239171017.jpg)Photo by Brian Babineau/NBAE via Getty Images
Last month, Brown participated in his second All-Star Game, playing against his teammate Jayson Tatum. LeBron used his second pick among reserves in the All-Star draft on Brown, while Giannis Antetokounmpo picked Tatum as his first starter. Little defense was played throughout the matchup in Utah, but Brown and Tatum playfully guarded each other on several occasions.
Brown and Tatum have become simultaneously the most successful and dissected duo in the league. Since the turn of the century, Brown has the 10th-most postseason wins over a players first six seasons; Tatum, who came into the league a year after Brown, is already 23rd on that [list](https://stathead.com/basketball/player-game-finder.cgi?request=1&match=player_game_count_career&order_by_asc=0&order_by=name_display_csk&year_min=2000&comp_type=post&comp_id=NBA&team_game_min=1&team_game_max=84&player_game_min=1&player_game_max=9999&season_start=1&season_end=6&game_result=W). Tatum is the star of the group, a potential MVP candidate; Brown has become an All-Star himself but is often painted as the more defensive-minded costar. How they approach fame differs as well: During the All-Star festivities, Tatum was never far from his son, Deuce, while Brown, forced to play in a mask after a recent facial fracture, keeps much of his life and family away from public view, and seemed to soak in the scene by himself.
“I prefer to be alone at times,” Brown says. “Im not saying that because it sounds cool or its the healthiest thing. I think its how Im designed. Im OK with being alone. I like space. Quarantine was fine for me. There was nothing wrong with quarantine. So, thats just how I am. I go through times where you like human interaction. But a lot of the time, Im fine with all of you humans leaving me alone.”
But Brown says hes been able to coexist with Tatum where it matters most: “Basketball. Thats where we find common ground: on the court. Basketball is the greatest teacher and the greatest equalizer as well,” he says. “A lot of people, fans, are fascinated with our relationship and how that has developed and grown over time. Hes got fans within the Celtics fan base. I got fans within the Celtics fan base. And I think our fans have more of a hard time coexisting than me and him do. We never had an argument. I dont think weve ever had a real argument, fight. Nothing crazy like that.”
Smart says Brown and Tatum are “probably better friends than most in this league—that people dont really understand. You might not see them talk to each other a lot in person, but that dont mean they aint talking. You know what Im saying? Because not everythings supposed to be for everybody.”
But the collaboration between Brown and Tatum nearly ended last July, when Kevin Durant requested a trade from the Nets. The Celtics were among the teams to express interest, reportedly offering a package that included Brown, Derrick White, and future draft picks.
“\[KD\] and JT are friends. They was working out together and whatnot,” Brown says. “So, I wasnt sure what the energy was. I wasnt sure what the direction of the organization was.”
Puzzled, Brown placed a three-way call to Stevens and Tatum. During that discussion, Stevens says he assured Brown that the guard wasnt going anywhere. “You just have to have a direct conversation,” Stevens tells me of the meeting. “And you just have to be able to say, This is whats real. This is where we are. Obviously, you and Jayson are the two guys that weve built the whole roster around. And our every expectation is for us to come and compete together and try to be two games better than we were last year.’”
Brown says, “Once we all got together and kind of talked it through, we all left on the same page. But the actions that was taking place during that time, it just didnt seem like that was the direction that the organization was going in. I dont know. It was hard to tell, at least.”
For as long as Brown has been with the Celtics, hes been involved in trade rumors. Last month, when Durant again requested a trade, Celtics owner Wyc Grousbeck called Brown to squelch any worry Brown mightve had. The nearly endless cycle has left some scars. Brown generally doesnt trust easily, and that now extends to his relationship with the Celtics.
“Its hard coming into teams and organizations and being warm. They operate on different principles, I think. This is an organization. They look at it as a business, where theyll tell you one thing, and then behind closed doors, theyll say another, and theyll trade you off,” he says. “Tell you, We love you, and theyll be having like, Were going to trade him next week. I think thats just how business is run.
“Like, where Im from in the South, if you dont come through the front door, its considered disrespectful. I feel like a lot of times, when you deal in these corporate spaces, everybody wants to come through the back door or come through an angle.”
As if the trade rumors werent enough, the Celtics bid to return to the Finals only became more complicated when Udoka was suspended for the season just days before training camp. Brown had advocated for Udokas hiring in 2021, after working with him on Team USA at the 2019 World Cup. Brown also credits Udokas leadership for giving the Celtics the edge they needed to make it to the 2022 Finals.
“I didnt know how to feel. I was a little bit shocked, to be honest,” Brown says. “It was not the vibe, you know what I mean? Thats the way I always describe it. It was not good vibes.”
The Celtics have provided little information about what reports have described as Udokas improper relationship with a subordinate, attributing his season-long suspension merely to multiple violations of team policies. Udoka has been a candidate for recent head-coaching openings in Brooklyn and Atlanta, and Brown hopes his former coach lands on his feet.
“I hope Ime is doing well,” Brown says. “I havent talked to him, but I hope he gets another chance coaching again. There were some conflictions on the information that was kind of going around and stuff like that … that has put some dirt on his name. Its a lot. Its very nuanced. So, whether you stood on this side or this side, they was going to find wrong from a coach that I advocated to bring here to Boston. I wanted to see him back on his feet here, no matter what it was. I dont think thats the wrong thing to feel.”
But any lingering feelings of resentment over Udokas dismissal subsided just a few days into the tenure of Joe Mazzulla, who took over as interim head coach after just three years as an NBA assistant. “He helped the most by trusting me right off the bat,” Mazzulla tells me. “He didnt have to do that. … And so his open-mindedness to say, Hey, I trust you. Well see what we can do here, allowed me to be myself and allowed me to coach him, so Im grateful for that.”
Mazzulla, 34, is taking a different approach with the Celtics. While Udoka roamed the sidelines with a scowl, barking defensive orders to his players, Mazzulla is more reserved, often standing stoic near the scorers table as the game unfolds and letting his players feel out the game on their own. Though the Celtics have faltered lately, falling to third place in the East, Mazzullas lighter touch has had success: Boston has the third-best record in the NBA, and the second-best title odds in [*The Ringer*s Odds Machine](https://nbarankings.theringer.com/odds-machine).
Brown and Tatum have flourished individually too. Both are putting up career statistics virtually across the board. Tatum was named All-Star MVP after putting up a record 55 points, and a [recent ESPN poll](https://www.espn.com/nba/story/_/id/35658669/nba-mvp-straw-poll-20-nikola-jokic-chasing-history-here-why-capture-it) had him in fourth for the regular-season honor. Together, they are on pace to become one of only four duos in NBA history to both average over 27 points per game or more, according to [*The Ringer*s Zach Kram](https://www.theringer.com/nba/2023/2/1/23580604/jayson-tatum-jaylen-brown-boston-celtics-scoring-duo).
“Its been a long time coming,” Tatum said in early February. “I talk about it pretty often, and weve had our good times and not-so-good times. But I think those are just growing pains. We were just both 19-year-old kids that came into the league hungry and trying to get better and help our team win. And through that, weve had to learn how to play in this league, learn how to play with each other, learn how to lead a team, and I feel like we still have a long way from ultimately where, exactly, we want to be, but weve made amazing strides from the beginning.”
Even though theyre widely regarded as one of the best tandems in the league, Tatum and Brown are still missing one key component to be lauded among the best locally.
“I dont see them anywhere right now—until they win a championship. At the end of the day here, youre judged by bringing another banner. So to me, they are unfinished,” says Cedric Maxwell, a Celtics radio color commentator who won two titles with Boston in the 1980s. “These guys are going to be pillars for a long time. ... Barring injury, I could see both of those numbers being retired.”
Tatum has two more years left on his current contract after this one but will likely be eligible for a supermax extension before that. Brown has just one more year left, and given the expected spike in revenue coming to the NBA from new national television deals, [most analysts dont expect him to sign an extension](https://theathletic.com/3448724/2022/07/26/jaylen-brown-r-j-barrett-nba-salary-cap/). When asked whether he wants to stay in Boston long term, Brown is noncommittal.
“I dont know. As long as Im needed. Its not up to me,” he says. “Well see how they feel about me over time and I feel about them over time. Hopefully, whatever it is, it makes sense. But I will stay where Im wanted. I will stay where Im needed and treated correct.”
When asked how long he wants to play with Tatum, Brown keeps his focus on the immediate future.
“I just enjoy the time that you have now,” he says. “If its your whole career, its your whole career. If its not, its not. Some of the greatest players of all time havent finished with their organization. Michael Jordan retired a Wizard. As much as we like it here and enjoy being here, you see where life takes you. You see how the process goes. All you do is really focus on whats in front of you right now, to be honest. But I dont really know or want to answer that question because that type of stuff makes Celtics fans speculate and go crazy. Especially right now, Ill just say well get there when we get there.”
But Brown is searching for more than just on-court success. Yes, he wants to win a championship. And yes, he still wants to succeed individually, much like he did when he first entered the league. But he wants every other pursuit in his life to matter, too, no matter how complicated thats been lately.
“Ive grown up a lot,” he tells me. “Ive learned a lot. Ive experienced a lot. Ive been able to travel the world, study different cultures, meet different people, which has made me, I feel like, a more experienced human being. I still kind of feel like that same kid on the inside. But for now, Im definitely moving along in the journey. Shit, Im the leader of this team. Im one of the faces of this franchise, trying to be a global representation or an ambassador for our league and trying to bring people together.”
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -12,7 +12,7 @@ CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
Read:: [[2023-03-26]]
---

@ -156,7 +156,7 @@ style: number
- [x] 🧂 Cumin ✅ 2022-03-14
- [x] 🧂 Garam masala ✅ 2022-03-14
- [x] 🌰 Nutmeg ✅ 2022-03-14
- [x] 🌿 Ginger ✅ 2022-03-14
- [x] 🫚 Ginger ✅ 2022-03-14
- [x] 🧂 Curcuma ✅ 2022-03-14
- [x] 🧂 Cinamon sticks ✅ 2022-11-15
- [x] 🧂Ground cinamon ✅ 2023-03-11
@ -211,14 +211,14 @@ style: number
&emsp;
- [x] 🚿 shower gel ✅ 2023-01-10
- [x] 🧴shampoo ✅ 2022-12-21
- [x] 🚿 shower gel ✅ 2023-03-26
- [x] 🧴shampoo ✅ 2023-03-26
- [x] 🪥 toothbrush ✅ 2022-02-06
- [x] 🦷 toothpaste ✅ 2022-12-22
- [x] 🦷 toothpaste ✅ 2023-03-26
- [x] 👂earbuds ✅ 2022-02-06
- [x] 🪒 razor blades (mach3) ✅ 2022-02-06
- [x] 🍦 shaving cream ✅ 2022-02-06
- [x] 🧻 loo rolls ✅ 2022-12-19
- [x] 🧻 loo rolls ✅ 2023-03-26
- [x] 🦨 deo ✅ 2022-02-06
&emsp;

@ -73,7 +73,8 @@ style: number
#### 🚮 Garbage collection
- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-03-28
- [ ] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-04-11
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-03-28 ✅ 2023-03-26
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-03-14 ✅ 2023-03-13
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-02-28 ✅ 2023-02-27
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2023-02-14 ✅ 2023-02-13

@ -61,7 +61,7 @@ Projects & realisation to buy with [[@@MRCK|Meggi-mo]].
1. [[@@Zürich|Zürich]]
- [ ] 🏡 [[Real Estate|RE Project]]: Get an appointment with [[@@MRCK|Meggi-mo]] with UBS on mortgages 📅 2023-03-31
- [ ] 🏡 [[Real Estate|RE Project]]: Get an appointment with [[@@MRCK|Meggi-mo]] with UBS on mortgages 📅 2023-04-30
[[@@London|London]] or [[@@Paris|Paris]]?

@ -104,7 +104,8 @@ style: number
&emsp;
- [w] :birthday: **[[Louis Bédier|Louis]]** %%done_del%% 🔁 every year 📅 2023-03-31
- [ ] :birthday: **[[Louis Bédier|Louis]]** %%done_del%% 🔁 every year 📅 2024-03-31
- [x] :birthday: **[[Louis Bédier|Louis]]** %%done_del%% 🔁 every year 📅 2023-03-31 ✅ 2023-03-31
- [x] :birthday: **[[Louis Bédier|Louis]]** 🔁 every year 📅 2022-03-31 ✅ 2022-03-31
&emsp;

@ -12,14 +12,14 @@ Source:
Language: FR
Published: 2013-01-01
Link: "https://fr.wikipedia.org/wiki/Au_revoir_l%C3%A0-haut"
Read:
Read: "2023-03-29"
Cover: https://img.over-blog-kiwi.com/1/41/71/56/20180216/ob_35957d_au-revoir-la-haut-de-pierre-lemaitre-p.jpg
CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟧
ReadingState:: [[2023-03-29]]
---

@ -12,14 +12,14 @@ Source:
Author: Fran Lebowitz
Published: 1994
Link: https://www.goodreads.com/work/best_book/53955-the-fran-lebowitz-reader
Read:
Read: "2023-03-23"
Cover: https://typeset-beta.imgix.net/2017/1/7/e6d147c8-6bc3-4339-a915-f9bc792befa5.jpg?w=740&h=1082&fit=crop&crop=faces&auto=format&q=70
CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟧
ReadingState:: [[2023-03-23]]
---

@ -121,10 +121,32 @@ host: www.sabotiga-santanyi.com
&emsp;
### Shopping
### Palma
&emsp;
#### Restaurants
```cardlink
url: https://www.santina-palma.com/
title: "Home - Santina Home"
host: www.santina-palma.com
favicon: /favicon-16x16.png
```
&emsp;
[Fetching Data#129d](https://www.bunkerspalma.com/)
&emsp;
#### A visiter
- cathedral
- Palace
- Santa Catalina
- Carrer de Sant Feliu
- Bellver castle
- Miros studio
&emsp;

@ -696,4 +696,52 @@ alias f=expenses:Food
2023/03/25 Migros
expenses:Food:CHF CHF6.30
assets:Cash:CHF
assets:Cash:CHF
2023/03/26 Uber Eats
expenses:Food:CHF CHF35.08
liability:CreditCard:CHF
2023/03/26 SBB
expenses:Travels:CHF CHF7.90
liability:CreditCard:CHF
2023/03/26 Lunch Santanyi
expenses:Food:EUR €44.40
assets:Cash:CHF
2023/03/26 Lidl
expenses:Food:EUR €19.23
assets:Cash:CHF
2023/03/26 Soap & house products
expenses:Travels:EUR €8.03
assets:Cash:CHF
2023/03/27 Sunscreen
expenses:Travels:EUR €14.99
assets:Cash:CHF
2023/03/27 Current expenses
expenses:Current expenses:EUR €203.00
assets:Cash:CHF
2023/03/26 SBB
expenses:Travels:CHF CHF6.80
assets:Cash:CHF
2023/03/30 Palma: Parking
expenses:Travels:EUR €6.05
assets:Cash:CHF
2023/03/30 Fondacio Pilar i Joan Miro
expenses:Famille:EUR €43.50
assets:Cash:CHF
2023/04/01 Es Figueral dinner
expenses:Food:EUR €65.00
liability:CreditCard:CHF
2023/04/02 Petrol
expenses:Travels:EUR €52.45
liability:CreditCard:CHF
Loading…
Cancel
Save