=0&&(i=d,s[d]=c(e,t),(r=o.plus(s))>t?(s[d]--,(e=o.plus(s))>t&&(r=e,s[d]--,e=o.plus(s))):e=r)}return[e,s,r,i]}(g,p,v))[0],l=s[1],u=s[2],d=s[3],c=p-o,0===(h=v.filter(function(e){return["hours","minutes","seconds","milliseconds"].indexOf(e)>=0})).length&&(u0?(a=ig.fromMillis(c,m)).shiftTo.apply(a,h).plus(f):f);return y?w.negate():w},n.diffNow=function(e,n){return void 0===e&&(e="milliseconds"),void 0===n&&(n={}),this.diff(t.now(),e,n)},n.until=function(e){return this.isValid?iw.fromDateTimes(this,e):this},n.hasSame=function(e,t,n){if(!this.isValid)return!1;var i=e.valueOf(),r=this.setZone(e.zone,{keepLocalTime:!0});return r.startOf(t,n)<=i&&i<=r.endOf(t,n)},n.equals=function(e){return this.isValid&&e.isValid&&this.valueOf()===e.valueOf()&&this.zone.equals(e.zone)&&this.loc.equals(e.loc)},n.toRelative=function(e){if(void 0===e&&(e={}),!this.isValid)return null;var n=e.base||t.fromObject({},{zone:this.zone}),i=e.padding?thisthis.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset)}},{key:"isInLeapYear",get:function(){return t9(this.year)}},{key:"daysInMonth",get:function(){return nt(this.year,this.month)}},{key:"daysInYear",get:function(){return this.isValid?ne(this.year):NaN}},{key:"weeksInWeekYear",get:function(){return this.isValid?nr(this.weekYear):NaN}},{key:"weeksInLocalWeekYear",get:function(){return this.isValid?nr(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}}],[{key:"DATE_SHORT",get:function(){return e$}},{key:"DATE_MED",get:function(){return eI}},{key:"DATE_MED_WITH_WEEKDAY",get:function(){return eL}},{key:"DATE_FULL",get:function(){return eV}},{key:"DATE_HUGE",get:function(){return eH}},{key:"TIME_SIMPLE",get:function(){return ez}},{key:"TIME_WITH_SECONDS",get:function(){return eP}},{key:"TIME_WITH_SHORT_OFFSET",get:function(){return eU}},{key:"TIME_WITH_LONG_OFFSET",get:function(){return eW}},{key:"TIME_24_SIMPLE",get:function(){return ej}},{key:"TIME_24_WITH_SECONDS",get:function(){return eR}},{key:"TIME_24_WITH_SHORT_OFFSET",get:function(){return eQ}},{key:"TIME_24_WITH_LONG_OFFSET",get:function(){return eZ}},{key:"DATETIME_SHORT",get:function(){return eY}},{key:"DATETIME_SHORT_WITH_SECONDS",get:function(){return eJ}},{key:"DATETIME_MED",get:function(){return eG}},{key:"DATETIME_MED_WITH_SECONDS",get:function(){return eq}},{key:"DATETIME_MED_WITH_WEEKDAY",get:function(){return eK}},{key:"DATETIME_FULL",get:function(){return eX}},{key:"DATETIME_FULL_WITH_SECONDS",get:function(){return e2}},{key:"DATETIME_HUGE",get:function(){return e0}},{key:"DATETIME_HUGE_WITH_SECONDS",get:function(){return e1}}]),t}(Symbol.for("nodejs.util.inspect.custom"));function i5(e){if(i8.isDateTime(e))return e;if(e&&e.valueOf&&tG(e.valueOf()))return i8.fromJSDate(e);if(e&&"object"==typeof e)return i8.fromObject(e);throw new ex("Unknown datetime argument: "+e+", of type "+typeof e)}eh.DateTime=i8,eh.Duration=ig,eh.FixedOffsetZone=tp,eh.IANAZone=e9,eh.Info=iA,eh.Interval=iw,eh.InvalidZone=tw,eh.Settings=tN,eh.SystemZone=e6,eh.VERSION="3.7.2",eh.Zone=e3;var i7=s`
+ ha-card {
+ --header-spacing: 15px;
+ --legend-spacing: 15px;
+ --legend-dot-size: 10px;
+ --navigation-spacing: 5px;
+ --navigation-month-font-size: 2em;
+ --days-columns: 7;
+ --days-spacing: 15px;
+ --day-date-number-font-size: 3.5em;
+ --day-date-number-line-height: 1.2em;
+ --day-date-text-font-size: 1.25em;
+ --events-margin-top: 10px;
+ --event-spacing: 5px;
+ --event-padding: 10px;
+ --event-border-width: 5px;
+ --event-border-radius: 5px;
+ --event-font-size: 1em;
+ --event-line-height: 1.2em;
+ --event-icon-size: 18px;
+ --weather-icon-size: 30px;
+ --weather-temperature-separator: ' / ';
+ --weather-temperature-font-size: 1em;
+ }
+
+ ha-card.nobackground {
+ border: none !important;
+ background-color: transparent !important;
+ box-shadow: none !important;
+ }
+
+ ha-card.compact {
+ --days-spacing: 5px;
+ --day-date-number-font-size: 1.5em;
+ --day-date-text-font-size: 1em;
+ --events-margin-top: 5px;
+ --event-spacing: 2px;
+ --event-padding: 2px 5px;
+ --event-border-width: 2px;
+ --event-font-size: .9em;
+ --event-line-height: 1.1em;
+ --weather-icon-size: 20px;
+ --weather-temperature-font-size: 0.8em;
+ }
+
+ /* --- Skylight theme --- */
+ ha-card.skylight {
+ --event-border-width: 0px;
+ --event-border-radius: 10px;
+ --event-spacing: 6px;
+ --event-padding: 10px 12px;
+ --events-margin-top: 8px;
+ --day-date-number-font-size: 1.1em;
+ --day-date-text-font-size: 1em;
+ }
+
+ ha-card.compact.skylight {
+ --event-border-radius: 8px;
+ --event-padding: 4px 8px;
+ }
+
+ ha-card.skylight .container .day .date {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ }
+
+ ha-card.skylight .container .day .date .skylight-day-header {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ width: 100%;
+ }
+
+ ha-card.skylight .container .day .date .day-label {
+ font-size: 1.1em;
+ font-weight: 700;
+ }
+
+ ha-card.skylight .container .day .date .add-event-text {
+ font-size: 0.85em;
+ color: var(--secondary-text-color, #888);
+ cursor: pointer;
+ opacity: 0.6;
+ transition: opacity 0.2s;
+ white-space: nowrap;
+ margin-left: auto;
+ }
+
+ ha-card.skylight .container .day .date .add-event-text:hover {
+ opacity: 1;
+ color: var(--primary-color, #03a9f4);
+ }
+
+ ha-card.skylight .container .day .add-event {
+ display: none;
+ }
+
+ ha-card.skylight .container .day .events .event {
+ border-left: none;
+ border-radius: var(--event-border-radius);
+ background-color: color-mix(in srgb, var(--event-bg-tint, #888) 15%, var(--card-background-color, white) 85%);
+ }
+
+ ha-card.skylight .container .day .events .event .additionalColor {
+ display: none;
+ }
+
+ ha-card.skylight .container .day .events .event .calendar-dot {
+ width: 10px;
+ height: 10px;
+ min-width: 10px;
+ border-radius: 50%;
+ background-color: var(--dot-color, var(--divider-color, #888));
+ align-self: center;
+ margin-right: 4px;
+ flex-shrink: 0;
+ }
+
+ ha-card.skylight .container .day .events .none,
+ ha-card.skylight .container .day .events .more {
+ border-radius: var(--event-border-radius);
+ background-color: transparent;
+ }
+
+ .card-header-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+ }
+
+ .card-header-row .card-title {
+ margin: 0;
+ }
+
+ .current-weather {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+ font-size: var(--weather-temperature-font-size);
+ }
+
+ .current-weather .icon {
+ display: inline-block;
+ vertical-align: middle;
+ background-size: cover;
+ width: var(--weather-icon-size);
+ height: var(--weather-icon-size);
+ }
+
+ .current-weather .icon img {
+ max-width: var(--weather-icon-size);
+ max-height: var(--weather-icon-size);
+ }
+
+ .errors {
+ white-space: pre-line;
+ }
+
+ .container {
+ container-name: weekplanner;
+ container-type: inline-size;
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--days-spacing);
+ }
+
+ .container.hasActions {
+ cursor: pointer;
+ }
+
+ .container .header {
+ width: 100%;
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--header-spacing);
+ }
+
+ .container .legend {
+ display: flex;
+ align-items: center;
+ }
+
+ .container .legend ul {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--legend-spacing);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .container .legend ul li {
+ display: block;
+ --mdc-icon-size: 16px;
+ }
+
+ .container .legend ul li.hasToggle {
+ cursor: pointer;
+ }
+
+ .container .legend ul li.hidden {
+ opacity: .5;
+ }
+
+ .container .legend ul li ha-icon {
+ color: var(--legend-calendar-color, var(--divider-color, #ffffff));
+ }
+
+ .container .legend ul li.hidden ha-icon {
+ color: var(--divider-color, #ffffff);
+ }
+
+ .container .legend ul li.noIcon:before {
+ content: '';
+ display: inline-block;
+ width: var(--legend-dot-size);
+ height: var(--legend-dot-size);
+ background-color: var(--legend-calendar-color, var(--divider-color, #ffffff));
+ border-radius: 50%;
+ margin: 0 5px 0 0;
+ vertical-align: middle;
+ }
+
+ .container .legend ul li.hidden.noIcon:before {
+ background-color: var(--divider-color, #ffffff);
+ }
+
+ .container .navigation {
+ display: flex;
+ gap: var(--navigation-spacing);
+ align-items: center;
+ }
+
+ .container .navigation .month {
+ font-size: var(--navigation-month-font-size);
+ }
+
+ .container .navigation ul {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--navigation-spacing);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ }
+
+ .container .navigation ul li {
+ display: block;
+ cursor: pointer;
+ }
+
+ .container .day {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ width: calc((100% - (var(--days-columns) - 1) * var(--days-spacing)) / var(--days-columns));
+ margin: 0 0 var(--days-spacing) 0;
+ }
+
+ .container .day .date {
+ position: relative;
+ z-index: 1;
+ }
+
+ .container .day .date .number {
+ font-size: var(--day-date-number-font-size);
+ line-height: var(--day-date-number-line-height);
+ }
+
+ .container .day .date .text {
+ font-size: var(--day-date-text-font-size);
+ }
+
+ .container .day.header .date .text {
+ font-size: var(--day-header-font-size, var(--day-date-text-font-size));
+ color: var(--day-header-color, var(--primary-text-color));
+ font-weight: bold;
+ text-transform: capitalize;
+ }
+
+ .container .day .add-event {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ cursor: pointer;
+ opacity: 0.3;
+ transition: opacity 0.2s;
+ color: var(--primary-text-color);
+ --mdc-icon-size: 18px;
+ margin-left: auto;
+ margin-top: auto;
+ padding-top: 4px;
+ }
+
+ .container .day .add-event:hover {
+ opacity: 0.8;
+ }
+
+ .container .day .weather {
+ position: absolute;
+ top: 0;
+ right: 0;
+ z-index: 2;
+ font-size: var(--weather-temperature-font-size);
+ cursor: pointer;
+ }
+
+ .container .day .weather .icon {
+ display: inline-block;
+ vertical-align: middle;
+ background-size: cover;
+ width: var(--weather-icon-size);
+ height: var(--weather-icon-size);
+ }
+
+ .container .day .weather .icon img {
+ max-width: var(--weather-icon-size);
+ max-height: var(--weather-icon-size);
+ }
+
+ .container .day .weather div.temperature {
+ display: inline-block;
+ margin: 0 5px 0 0;
+ vertical-align: middle;
+ }
+
+ .container .day .weather .temperature:has(.high) .low:before {
+ content: var(--weather-temperature-separator);
+ }
+
+ .container .day .events {
+ margin-top: var(--events-margin-top);
+ }
+
+ .container .day .events .none,
+ .container .day .events .more,
+ .container .day .events .event {
+ margin-bottom: var(--event-spacing);
+ background-color: var(--event-background-color);
+ border-radius: 0 var(--event-border-radius) var(--event-border-radius) 0;
+ font-size: var(--event-font-size);
+ line-height: var(--event-line-height);
+ }
+
+ .container .day .events .none,
+ .container .day .events .more {
+ padding: var(--event-padding);
+ border-radius: var(--event-border-radius);
+ }
+
+ .container .day .events .event {
+ display: flex;
+ border-left: var(--event-border-width) solid var(--border-color, var(--divider-color, #ffffff));
+ cursor: pointer;
+ }
+
+ .container .day .events .event .additionalColor {
+ width: var(--event-border-width);
+ background-color: var(--event-additional-color);
+ }
+
+ .container .day .events .event .icon {
+ padding: var(--event-padding);
+ }
+
+ .container .day .events .event .inner {
+ flex-grow: 1;
+ padding: var(--event-padding);
+ }
+
+ .container .day .events .event .time {
+ color: var(--secondary-text-color, #aaaaaa);
+ margin: 0 0 3px 0;
+ }
+
+ .container .day .events .event .location {
+ margin: 3px 0 0 0;
+ --mdc-icon-size: var(--event-icon-size);
+ }
+
+ .loader {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ width: 40px;
+ height: 40px;
+ }
+
+ .loader:after {
+ content: " ";
+ display: block;
+ width: 24px;
+ height: 24px;
+ margin: 4px;
+ border-radius: 50%;
+ border: 3px solid var(--primary-text-color);
+ border-color: var(--primary-text-color) transparent var(--primary-text-color) transparent;
+ animation: loader 1.2s linear infinite;
+ }
+
+ ha-dialog .calendar,
+ ha-dialog .datetime,
+ ha-dialog .location {
+ display: flex;
+ align-items: center;
+ margin-bottom: 8px;
+ }
+
+ ha-dialog .calendar ha-icon,
+ ha-dialog .datetime ha-icon,
+ ha-dialog .location ha-icon {
+ margin-right: 8px;
+ }
+
+ ha-dialog .location .info a {
+ color: var(--primary-text-color);
+ }
+
+ ha-dialog .description {
+ border-top: 1px solid var(--primary-text-color);
+ margin-top: 16px;
+ padding-top: 16px;
+ }
+
+ ha-dialog .event-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-top: 16px;
+ padding-top: 16px;
+ border-top: 1px solid var(--divider-color, #e0e0e0);
+ }
+
+ ha-dialog .event-actions .btn {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ padding: 8px 16px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ --mdc-icon-size: 16px;
+ }
+
+ ha-dialog .event-actions .btn-edit {
+ background-color: var(--primary-color, #03a9f4);
+ color: var(--text-primary-color, #fff);
+ }
+
+ ha-dialog .event-actions .btn-delete {
+ background-color: var(--error-color, #db4437);
+ color: #fff;
+ }
+
+ ha-dialog .event-actions .btn:hover {
+ opacity: 0.9;
+ }
+
+ .create-event-form {
+ padding: 8px 0;
+ }
+
+ .create-event-form .form-row {
+ margin-bottom: 12px;
+ }
+
+ .create-event-form .form-row label {
+ display: block;
+ margin-bottom: 4px;
+ font-size: 0.9em;
+ color: var(--secondary-text-color, #aaaaaa);
+ }
+
+ .create-event-form .form-input {
+ width: 100%;
+ padding: 8px;
+ border: 1px solid var(--divider-color, #e0e0e0);
+ border-radius: 4px;
+ background-color: var(--card-background-color, #fff);
+ color: var(--primary-text-color);
+ font-size: 1em;
+ box-sizing: border-box;
+ }
+
+ .create-event-form .form-input:focus {
+ outline: none;
+ border-color: var(--primary-color, #03a9f4);
+ }
+
+ .create-event-form .form-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-top: 16px;
+ }
+
+ .create-event-form .btn {
+ padding: 8px 16px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ }
+
+ .create-event-form .btn-delete {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background-color: var(--error-color, #db4437);
+ color: #fff;
+ margin-right: auto;
+ --mdc-icon-size: 16px;
+ }
+
+ .create-event-form .btn-delete:hover {
+ opacity: 0.9;
+ }
+
+ .create-event-form .btn-cancel {
+ background-color: transparent;
+ color: var(--primary-text-color);
+ }
+
+ .create-event-form .btn-submit {
+ background-color: var(--primary-color, #03a9f4);
+ color: var(--text-primary-color, #fff);
+ }
+
+ .create-event-form .btn-submit:hover {
+ opacity: 0.9;
+ }
+
+ @keyframes loader {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+ }
+
+ @container weekplanner (width <= 1920px) {
+ ha-card .container .day {
+ --days-columns: var(--days-columns-lg, 7);
+ }
+ ha-card.compact .container .day {
+ --days-columns: var(--days-columns-lg, 7);
+ }
+ }
+
+ @container weekplanner (width <= 1280px) {
+ ha-card .container .day {
+ --days-columns: var(--days-columns-md, 5);
+ }
+ ha-card.compact .container .day {
+ --days-columns: var(--days-columns-md, 7);
+ }
+ }
+
+ @container weekplanner (width <= 1024px) {
+ ha-card .container .header .legend,
+ ha-card .container .header .navigation {
+ width: 100%;
+ }
+ ha-card .container .day {
+ --days-columns: var(--days-columns-sm, 3);
+ }
+ ha-card.compact .container .day {
+ --days-columns: var(--days-columns-sm, 4);
+ }
+ }
+
+ @container weekplanner (width <= 640px) {
+ ha-card .container .day {
+ --days-columns: var(--days-columns-xs, 1);
+ }
+ ha-card.compact .container .day {
+ --days-columns: var(--days-columns-xs, 2);
+ }
+ }
+`,i9={};i9="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAHlBMVEUAAADL2%2FvK2%2FrH2fnI2vrG2PrJ2%2FvL3fzI3PzG2vz01DCXAAAAB3RSTlMAFzNfjrze%2FOgtNAAAAZBJREFUeNrt2UtuwzAMBFBR%2FN%2F%2Fwm2KFkSbOlJMz84PWQ8tUowDZNxut300WdQIFM7qXwSTbv4tx%2FWmemFQPOwApF4ABxD%2FLWhcicz%2F0HEl9icT0B7YiNWfCSAfdYfMSyHs83tg5lsUcD8hIyA%2FMDEDLoQZQAE0CFFAwQWmgwsYuMB0cAEFFyAHF2B%2FhTAjLhPcIWdwh1wwd6jY6PIF8Aj6U56%2BIP0ZY4cgDu6R%2BkIItEB8Qn5RxAOPjlzmh6EKxA%2BGtCiKjQaNw%2FQirQKf%2Fg8vndeOxA4dp3Fs6GzbjC0%2Bx0kUm2iclLHHqHGNthhoysWwQ8jTXbLYloTpUXEG9ago6B6VnKBlLkrII%2BTjIwQ8Qj6ETtQR8lsY09hGuZ9f3HhevAv5V7gJT7pqnfNAhLv1m5Qv0Vjg7MQnjyXp5Evv90WuaGsbckkb%2B5bZyF92KUsvv0gehDfnWzgj38LjTWT5BqPxPgY9fiHNLUrjrKm5pHN0TAXFF2LLA%2FUyayKWfKJM1%2F%2Fdq2amKsKTxu122%2FYBlItVl6a3MA0AAAAASUVORK5CYII%3D";var re={};re="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAHlBMVEUAAADr6%2Bvk5OTn5%2Bfo6Ojo6Ojq6urp6enm5ubf3991rVFGAAAABnRSTlMAIj93rtiU3SZWAAAB6UlEQVR42u2Y247CMBBDc5ux8%2F8%2FvFrQ0otpSdIi7UNOJNQnH5yJQkWYTCaTyWTy74m5GN0dtJJjuJlsvsNyuI1o%2FpYSvxrvgNsNiuJHAICXcI3kx%2BBJuvfrq8EvTNu8QQDYl%2FIdFw3mrQK3r%2BQ7Fsqt89V893z5fCrYGFLow%2FsEAO%2FYIBWMjiF6vwAxtGMjAru7gBBvLzA8BR8TeGgkj%2BUDrCT8F1rJ6foOqaCSeOHlwDGaDzwEayxdOkPaQAywODQC4NiAHVKi3CcgCCD3zxiHAq1AMbArXwWVmwa6SxgX4JH%2FMiyS2HVKcd6AJHcNYD0CnFDXhkVCpPYtAj41WAwEoRXYl6%2BCJ9sG6wrWE6%2BCxfBcepeXnnwV8MWmAVquCnziNYFVB70xYk%2B8CtYsDYj84RihhW0BctVgLbDmdB0BdywNyuEQ0AwrhbdvNRikUvkrsBEUCM0FFOhLTcQQq7hdB%2FlRsOEdgq6HdCeIvLGAXEaDUyCJExi2cECAF5SFshMk9uefksKOfCGfuiwI1ieQRykwbNBQyrLwDhvLJwTGcMnA3TP3K4UDMhvzTxswh0NS7d9%2BaZDDGYUQ%2BgqlcE60dgWlAS2Gj8RSOdaAlkIb2SqbC%2Fx91pJ6%2F1qurVjJOYXJZDKZTN7zA3Auaa9qRnCHAAAAAElFTkSuQmCC";var rt={};rt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAOVBMVEUAAADHx8fKysrJycnIyMjHx8fGxsbDw8PBwcG%2Fv7%2FCwsLCwsK%2Bvr67u7u4uLi3t7e4uLi5ubm4uLhyXqCUAAAAE3RSTlMAFkaMtND6%2F%2F%2F%2FCGT%2F%2F7BAhezMkbzxVAAAAi9JREFUeAHtloeS2zAMRF0JrA60yv9%2FbBQagS2YpOj05PiS6zvYURk8Hv5vOp1Op9M5ns6XawjXy%2Fl0bM80c7oGIr5D4XrKZ4ihgCzTwPARKMFsHR%2FDS4axxWdKHM%2BBFNZ%2FqeN83GTwFdZ%2FimWKDMfTJZDBilZcTsfhniFmgPEKp0yREHS6vwK7jLCivQDbv2eYqFjgxkNiFHAevQKJKyJ4RpoKcNMbMt5yHWm83MZ0Q9ZMfLNANo90EvYAiNMmE9sLeH59KWdfkMtISwFjGQ8ZxkXACqSUiVItmJfbNJYXwzjdlrmeGVLmoHS6D1gh%2BgU%2BMNn8Gh%2Bkmelf2QdeB%2B0%2BSOPcFbD3AfCdPiAd76%2FA1JkiNl4voN0HOl0%2FIa6g6AIGqw%2Bi4IGI1ApsfMUHOt77oKGADZkqPgBQ9kFLQdYHcDeo5APZLZA9HwA1H1QLWnZ9uw863QfExq%2FwATt%2BgQ88OR94uN0HRskHWUT2fcBFsEKkPsgiiZoPeIOe%2FfFYcYaJRmJCtEBpKpDb%2BM0Hog5g%2B6fEjQ%2FknYLMrvdXAJ9pL0DWB%2B4Ykcs0FVR2PYz4q30wdB98Gh8M4w%2F5AErFB7aEwO%2F6AHf0a9YHbsk1%2BcCf%2Fe0L4HxAMMRo9AFW%2FBWkTw8fMPx8BTs%2BsLO%2FvwLWDiKvA%2FGAyz6whfa07AUVzAdbagWMxObsn%2B9wPmgqKO96ZCj4IO4VFM%2F%2BG%2BS7fLC366FIOROrBaVd333Q6XQ6nc4Xua9QVFRZEEsAAAAASUVORK5CYII%3D";var rn={};rn="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAIaklEQVR42u2dW2wUVRjHjxpjfPDFENEnE33wwRhfvQBt99qWmyCJkSC%2BmCCJ%2BGQkBmI0GhMTwqXljkChpSDdmeVWKxEtl4hxW6E7bdnS0hvdbbcXLi30Qrvs53x0D9My7U7nnG07szMn%2BWWTdnfo%2FH%2FnO%2BfM2dmF2M1udrOb3exmN7vZbbpbd3f3ax0dHeuj0agoU9fe3g5dXV2P6ezsBPwZ%2Fk5GxOfia4jd2Fsi8DoMmAc8Bh6L2G1qPV0jdF4Zol0ZMx68MkwhtCpsEYmGvZIhUFYBT4oQiVVbOBzOYAmSX4Aa%2FFuIlZqq18%2ByBPydZSZqOtYbR4AC%2Fm0knRsN36gC0loCDd%2FoAuTnpZ8EGr4ZBCRInxUSnojZwpefnx4TM11qmk3AGAnmXqLiCZhVAEI3%2BYgZGw496SDAlPMB7rPgSaeLAMRUe0e46kk3AaZZmqZj7zdVFaRj7zfVXIAnnK4C5GMZe0WEFy7pGv7YZWlzczM%2BIlTMk6jeo8brCXv4SZ0AlQQd%2B0wiyrDE8KMRCCsqAayrKhRhr34YK4BfgiICs0u78Z8hDB4J3MfEarC3HmZGAH2%2B6nXYidNiAmYIlUUAjwS1EF4J8kEsEb5KgEoCUwXwD0fyCy0jAJkgfA0J%2BoTgxGy6JShXqPxD0Fg4KkBZHZlKANcWQ7gRblWfZqgABgmaQpRHHIpMMQTx9uj%2BwHboDezmrQANCXoqQKkCw0%2FC3FvMrTUAghPuVB7kFTAZrBWgrwrQlpmCR6LRDhgqXw9QMh9uVxawC9CWoBU0%2FxY4PtFM4SN3rpUBiG6sAFYBSvDaMFUAMuWtCDOF3xlpgYelKwH8OXoFaI39eiohddsUuG41RfAJ7gV2AAgugBOLAEQn3KpgFqAX7QpQHvVdHctPNnzwSE9LEMCfLYe%2FkEUAW%2B9X0FMB%2BgTgRGzU0B8TbYcHf6wDED0Y%2FiiiAwWwvCHDw1QqQN9EjKaMfhV7t8aPY74SPlaBmCULOMjwliQ3qb8lBl9gWMJNED%2B9AifeRPi5iB4BrOGzLFHZBGC5GFXAwD%2BbAEQXDV4lgLn388NzLaBeDRkx%2FJ7GAIAfx%2F0cVgF6guOpBP73CLBkDCWgIwLDZ9cA%2BN0YOKsA7P0agXE9IqyrIHUV0IMZgb6qYgDBgWFrCJi13j%2Fl%2FSDTzQVdbfUQP7UM1%2F2sAlQhMTA7n08wQhUM%2Fv2jauJVIcgCApoC9ITG%2B5ia%2B1GxdGZTwq36S8nD9yOKAP7wUw9myH2%2F0Kz88e1tECv7VD3x%2BikqAbzhp3pSTrr%2BN%2FyqqO%2FKIQxWFfrkAg6ow2QYdqaj95tOQvfNUCLcbI3wc0YRMqG78gh7oKmvgHG931wSolEYPL8R93u0wlcQXXDv4g9wJ1QGfTUC3K0Woa%2FWPzk1fuitPckhTFsivS3FdBJu151LhJ%2BjCjw5Hhkvbs6pUMkTPfDg1EoaVqorgGHoYZiYp2VlEWmFeOnHGBCGqoPsBN7xiBTPeEoyoCt0QR08f8%2BfuU%2Fno2W8tE%2BlgHsVuwB8WTpCT4LonRhfBtwv34hBqXovY4%2FnDp%2F7rupU9J5oQwVuMWN4GoEzBo8IbogLHog0h1K1CuIZdlL%2FpX3snzbpgIGytZOEn80bvgIOPZVHIRKhvZarAhADfYGgIkLUe5NrV5Uf4JQSNkPo2vgcMPTbZ9AeiXBfB9DgDf1FIPSLWzVltDVA7OQHOGnyhK6NLxOidZeS7dto%2FhzPBTuYoYPX%2BupiKoXSczkfQHRyhq0d%2Fp2%2Fvoempib672ox7iOqyLSHDgAzRnivl4T3ecmtgmxPXPTG6JJxWvB74KHP3dF06dA7wWv1pLa2hjKT52wsAcHNuaTlwLLn46cWXwHRM33h47GPz4fo71%2BvrWqsJVLD1bFYV0Co8HPSU7hkPZyYntAp2Pv7D2Vcrite%2B2zwUjGRzh8Yi3UFhAP73wTBMTAakncK6AleCT%2Fucw437fC%2Be3XrEiJt9j6JdQX0Cit%2FjhVnNsSOukJajBx1Ig1yyHFV4Mnwu%2BD%2BwffzbubPJy3bM0mrGusKGDyc9fRIkYMMF06N2DHnHPB7BjFYbdwAggOGxcU3b5Tnz6kv304ayvMnwroCBorc5JGApNDwXUQO%2FyUQUYBW8C4AUaYkAzqLlq%2B6WldJgvVXZP6bCFuAZvhHXUQOF5mrCFCHTqECeguc56T8pU9Je1cRae8nk2ELSB6%2Bk8gBJwS458oMqgNXEz%2BeMdS%2Bc8Hb1%2FKySd02dzJsAUnDF1xjmSszKAPJccLdko9%2BailaTdqOrNLCFjBR%2BCM0fL0CRBeMFM%2B7fu3qmReqWq4TqVHSwhag6vnFifAZBMR9Lojsca2oFr8lUtkWIpVu0sIWMK7nFzswaCYB2PvvH8o6IW1bTIJbckn1Zo%2BMNzlWvhCjAlThswgQ3RA%2FntXXuXvBGzd3ZpK2nVlTxRaAAmj4rAJws63r7Fcbair8pO7fY3qwtoBH4dMxn1WA6IIHh98LXj%2Fz3fNVoQAJVl%2FQg4UFFLppz2cWgOHHSxyx5p3ZOVX5y4m0XTfWFTB4xE1AcHIIQBwwUDCvqCkvizTku0lDnksv1hUQ99FgdQrwOWEUB8TERT2t%2Fi9fbfZ9QVoFJqwrQA5RL3NlFAHyxNstrF53pfUGCbaEWLEFMAkQHNBf6AiEdn%2F4nFSygUgl37BiC2ASIE%2B8nfuyFgS3LSU1W7wcWPhCjFmA4IT%2BIte%2B8B433lkh4%2BHBFqBLgOAYiR13dl6v%2BPWVGulPUhs8y4stQAcvy0DXL841wYuFJFhZSqTASV4sLKDEqQcU8PpQUWaplLfkmeDWhUTakkukrdxYV8Dtg259FLhf7N7vfKtpVy5p3LUwVczgORv7f06xm93sZrn2P%2BHsOlkQh9N3AAAAAElFTkSuQmCC";var ri={};ri="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAyVBMVEUAAADCyKx%2FxLnk1s3ut00P3%2Fni19Mc6P%2Fvs0jk2tYq6P8n6P8n6P%2Fk29j71Uvs4%2BH0o0Po4tgC2%2Fv92kXl4d8E4f3%2BslD1pEL92T%2Fn5eT920b6p0Pr6uj9sE8P5%2F8F5v%2Fp6Ojh4OD%2B2kIL4f3r6uoH5f%2F9qkXq6urp6enr6OHo6Ojn5%2Bfm5ubk5OTr49Pj4uLh4eHd3d3r28Da2trz1pbW1dT32Gn92j792Tv81jv60z33v3jiwZr8tl7%2Fsk%2F%2FsEr%2Fr0f%2FrUUA5f%2BMUhpmAAAAJ3RSTlMABREdHyg1PElPT05PX19mhpOTm6SkrK29vs3P0dHX3uPl7O7x%2BPprAiJZAAAD3klEQVR42u2WbXuiOBSGk%2Foyurvasdrd2nZn1KLYEKtYHbFuZez%2F%2F1GbgM4jQkwA%2BdDrmvs7z03OyeFAfvNpKTfb94PBXbtZJgVAm4PVHm81aFJyYWqDFfA8b1C77Ou3V8d4glU74yFK153HnmU9djuNEj3k369OBJL79AZabVn2MZ0qRT7wMhrqlh3DalDSXicLvDZJQ7VnJzHutd7e3tar9alAkqLTtGsnMx7bLz9giAoG1Li1PVslEDzDAEFA07Q8lq0WSBbSkCAYGObbtkZgRwweKBvVx9IKxkxWCYJUNaI9Wy%2BQfVivIUhzU7u2ViCZy9saE9zlaAAEaLQHgXGXe6aCZyEQBs9LJ6jr8sEiMAjW4C5HhyHAEYQiSjtPByDAEUBo017TVhqBHeH5Zb74oR00S5Ovwbau6fkhPhsNgRLGrPo5QUOZzgRjLUzSpWlbIB6cTzl3mJmAPV4pBV1F%2FvO7Kwyc6QWhgaYa4zFzFlvXdSfcYcxIwDpGlwj58%2B329fXV1VaJ%2FaKeSjDZCIFgZi6wqLZEyOeLbShwpzoBuNY2GQV6eQ8FrjubMMN81jO8puIpvhH5vhTMZlOuEYCS2aCJ%2FLnM95dSMJ1OuKmgcf5TgQJN30V8IJhJwRkDA8qbSq2EDvuhwA0EOING0NU0ASPgHwmEQXkGJtB3uRobAT8imEi4kUC%2FMsfyG%2BGfCJQGdkJXtfTHR4gRiAskjl7QUgho%2F%2BgZLgsEgWyBysBOaSjXPt7fmfsxAQwaQYmo6OyfkCMQFUiDokoMoMfni8QcvvBPBIozmFUIlKwwf76NCKRBKkJgSD4AJWeocimQIwC2YDOdzmCI5GsWDgwzkb%2FwT%2FkZ4C9%2FzbSjEnSIhlKfv2yT83f%2FBZthJgWcJed3KdFBO5tYfMj7qyAUcM5ZQv5Y5Ospx%2BND5svDCbiExfJ5hxID%2Fo3Eg80yEMge8ACHRXD6dWJCM5IOtkspwAEkDEz6DUpMuIqFHzq8DAj6cEK%2F22qUiCF%2F%2F0zmK7kMNT85f0TJRaCj5PxdjVyGryNwLPhH%2BUY5Tob43Uj12195eqrkFux2ygL9Mfz4GP6ZS7CTPJBkvnwEfMks2O0pK0ZmGAqGV9kEuwOqEfj2sedbPsGInikQipRVoO7wLQS3eQTKEfgOwffsAoxAjCEEw0wCFKjIEj0QJRUIKtkFZaLm5pB%2FQzKBEVBA94Ybmlmg2wKV26en2wrJCDpcEBiBgsAIFCWoafZXXh40%2Bys3sRH4C%2FurCLC%2FclPM%2FgIF7S9QxP4CRX2cQWH7C%2Bj31%2BcsUa79BYrZX6C4%2FQX0%2B%2Bs3n4v%2FAbjVlbDYgcSfAAAAAElFTkSuQmCC";var rr={};rr="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAllBMVEUAAAC5usK8y84R4PrU2OUi6P%2FX3Onqokjd3eL0o0TY3%2BwC2%2FsJ5v%2FW3%2B4A4v0C2fn3p0bj5ObN3%2F3l5ef6qkcK5v%2Fl5ebO3ffp6er9rEYL4f0H5f%2Fq6urp6eno6Ojn5%2Bfk5OTh4eHp3c7U3vLb29vJ3PzH2vvt0rDF2PnW1tbC1Pfxw4n7uWf%2Fsk%2F%2FsEr%2Fr0f%2FrEQA5f%2F%2FZTw0AAAAHHRSTlMABxcqL0RLTGGGjpOeo6aprLW%2BxtDb3%2Bjq6%2B75KExeYQAAA41JREFUeNrtmNtS2zAQhleOcVJTt4SAMcSWHIjJiZjk%2FV%2BuYkm8BlsHLHTRab9huGH4P7S%2FxA7AP00QxSH4I7yuqioAX7CkeoN5m85dhXjLX1deBeyuQpxHFE6SWSZEOosnH9pMKsStZBbGWd5CJGHjfW4EEQwlatKJ7BR3XTWGZGh8mvdRpBE2%2FCwNLiWwad5PUeQJg2jdMsRD7mCaqwSSNIi3aBhccyhynaDgd9u24frL%2BbmaAsmf2obnL%2FYcCL0AWaPhuRpgYGluIeBrFJyOUF0HYM00NwkQsW0MSMycCyAB8l4DUSVRYCNJbQX8LCBsnl1kl09HaDnWElPdLDMKiK1kjWzfPpDQ2IC9gD9tO8RgIDbnE5%2B%2FKJ7ujC2bJmQgzyZ6RaiNJoESzrMINEyU6VxSGOFvTJltBZTPV6UQgpsFSKo2zBT55ctyYWPgJkPaK%2BBit18uF6U0cKMAmYIC0Z%2F%2FuJcCizPwBlXTZa%2BgfJECNFgLMmYeER1gtT8JFiYBMbEomQYk2aCg5Pp8IrO8pgU2vN%2FXJ4EwCIjA4qHRgOqzQGvg3DijsJtfvsh4FCykQGfgH0igD1b2PIG6JSCDSTAzlEAN1yQoEaHON7ccdp5A3RGUwkEA2ccbtKo7AoWBE9rfFlHRohkQCchgEMQKAUuLBtlw3REoDPwzE1AQ0s%2BPA%2BodERr0ggBUJOfvEE3DdE0Joc9PAdEMiYtmQCToTsl%2BQkSwwPxzwyQgyKDIz0BHKIoCB9RiT%2BxQ0TbwDhHoDQuZv6o%2F84rUjwsyKASJ%2BY9AGlArH9kt6dcS78%2BfgRGW7PrjDy%2BbpQQFuKP78hmYCXvikdWmWQ1v8E6%2BSMCGm%2F74w26zwQuFAuRTfBqBDeNuOrLftA7QNZTpBKxg3XQ6ALJswPPIz%2BmU%2FuNj5AqTu%2FyA72GsyL9n8C2w%2B9d%2BxvA9%2FDgQ7fwrUMAcTtZuWBUzengYOQiMA7qYH4%2FzC3fBjSr%2FiFy4Cg6KOx7Mj8g8cBMcVE%2Fg9nji1kEgb9M90wzIZUgyHVE1%2FJMEP2EIh3euQDsh5NZFwEDBnARzB8EYVPwiwa%2FhghtQMiLBaLggADWX5%2FxLGCzQb4FLl3wUmLbA6PfDw%2B8RDAQb9gk%2BAb8C5lkw1u4vd270%2B8udQLG%2FfEH7yxk%2F%2B4vwtL8IP%2FuL8LO%2FCE%2F7i%2FCzvwg%2F%2B4vwtL8Il%2F3lbvCbT%2FvrP38XfwAyJMdyHNNMWAAAAABJRU5ErkJggg%3D%3D";var ra={};ra="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAsVBMVEUAAAD5zEP0z2L81EPcxLb70z%2Fm29X93U%2F0wjH92kP2xjD93lLp4t%2F93Ej4yjPq5OL93Ev81D%2FkxIDt7Ov93Ef4zTPp49z%2B2Tv4yjL%2B3Uzs6%2Bv70jf72k7x8fHv7%2B%2Fu7u7x7uTx6c3m5eT15af44Yvo3L%2F43G393Ej920X920P920Lq05f92kH92j%2F92j392Tv92Tn92D7810L92Df71Dz70jX5zzTvyWD4yzP2xjPyvzPo8pfJAAAAHXRSTlMACRckL0dJVVdwdXmGl5yjo7zHy9PT2%2BLj5ejy%2Bq6%2BcVQAAAPvSURBVHja7ZnbdqpIEEALlOAlcmQO3hlo4gWNGo0KAf%2F%2Fw4bujmmHUho6PrrXinnb26oirqwEnjx5UhrdbHdtZ%2BRmjBy72zZ1eBya2XHCcLlavb%2B%2Fb75ZhU7H1OARGF03XHFEYEtZuV0DfonWHoXLDFEQAdYYNbVf6wsClFFbOWEyPQft6MLHx3Zkggo1O6R%2BaSBjY9cU3r4bhqwg2dEHw606hNYJwyqB3bZT6RK6E4oARxLYfTp6hfU7YZUAL%2BycWmn%2FKFQJ7Aa10n6FACpI9l%2F1Bpwyd9CEv8pTdCloIKMTKgY4HZBg5vxoQ5LAzpQc2JUFNsWB%2FaT40DbySzaEAnu7woKUAkVL0kbILz0BCuwHGtyjvVwiPRpAGtg37w%2BwRJTckAgUjdC8594csi%2FulwaKRhADhLNpQIjnkSCYztxDBhfLN8QYwE2MJcedBcS7JmCNjWArCewNuEWX6cMp8RBkyhPyDXG6N0%2FsUv%2BM6TFkdlkU9uPARAOMSbcTeHcJFrRwkG2IYwKmszwsiFcAWZzYFFvJhigdwDirme8VMzvRhGRDDAcQ%2BnJGHfLC56dkQ5SjjgLGwvfkLE6nz6yA%2FChgoECbeCUgvCALHI9NFOh7pQhOJ5qQDXBEV64Lh%2FQMfIaPwoANOf6WDRCXFSQDHJ2c%2F8UrzZQGOMKPAoNcYFw%2BQA6XAh5ABCYqFxBXYAmmpd%2FRABT4H69eFf6lEBJMF3SY%2FR4NQFHcEP4YZ4ncAGhFuqeMPz2xRH6AAXqGlAncKEschZ%2FhoBOoQ7JCxAsiYMM1f34V8IkbR1Em5X6OhX6MlfF9P0hY4TrQRA%2BRKj5lnUTRic1w%2FMZ4VMBnkEnCl3S8oD9oRf430zMtCHrwmCP7F8g5ja8DHXjIY%2BoLvrLCUSQa6MNa1S92lCbCn%2F%2FFS1f1C%2BZpmoiCBTnGin5BkAVEwYAcr4p%2BAUmzQhzzwgDy1BX8KJBkAV5oAaKv4McrinlhoAHiRUGPj0z9USQGUB3Bv8FaBIYa3KDuq%2BgFX%2FTGLBA34CavCnrB288JIhvu8FdRLzaUxFEc3f9jiD5W1vvkTAO5BSHqb0p6PsAlYEEB9bGCnTL%2FGaCnQRF6v4QdE5zZANSvQzHaHx%2FLpf6vi39YAyn1vo%2FM0v3wBXG%2FnJe%2BX4G39Y%2B%2FJ%2FwS6q%2Fjknaqp34aQPsvbvyznr8VM5%2Bvv4Q%2BsTSoRuMsIWXyNGH%2BSUPlXyznFJMg6Nu3a6BCY%2Fjt5C%2FJLTll2ABFtNYwvbYlMSKKhy22ffVEcmVjL1cgvQqGlSZMHuWJJ5YBj0BrWD32USAq2WF7VkODx6EbLcvuDSdJMhn2bKtl6PDkyZOy%2FAdXbwfjjFzP2wAAAABJRU5ErkJggg%3D%3D";var rs={};rs="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAS1BMVEUAAADO1fHO1ejZ4fLR2ezd5vbB0vXDzufS4vzP4PzN3vvV3fDk5%2B%2FAyerc5vfu7u7v7%2B%2Ft7e7k5eavwOrT2OO4y%2FDAzOi2ye%2B%2F0vYf7YBFAAAAGHRSTlMAByNNhqbMO%2F%2F%2F%2F2bRFP%2F%2F%2F%2Bv%2F%2F%2F%2F%2F9qxLSnpnAAACKklEQVR4Ae3U2YKzKgzA8QRBXECgdTnv%2F6RH%2B2V2LWLgzl%2Fn%2Bh8NOHDe7XZDUUlVY6G4Vk276voi9cps9U2HkJ1QW51UpfKkg8ws5Uu9QP%2BZL3IC1rS%2FKMhJN%2B1vAjKS1C91xKr5O0BCNqianQE65%2FPvDcC8%2FabcEcjmpdglrf72s37Gdk1TvcxXYNoDFrLo2yOYa0FHIAvVlh0g%2FmS7f3INqFuyMyPnC3R7cp0A5YfB%2BY1zw9C9ILAhxVuKf3JDngFV220TBr9j6CywmW43T3rgst3K%2BUMKgUd3XePfCQJY1PF6iNPAEe2vOBOw8XGOsSXt%2FAkB4SrjT1FwkfYnVSVfgLGkyvuyrxD8aQEuED6BhnTSJwtG9YK%2FoYjQ8zcUEap8d4jxb1x6DhOfoDyDc%2FEJhjfAKYgIrP6qKjfAvQQstSJH%2BkKH7D6EMtfUfbElPjRH4juyzH78pgZu35nsh%2BDIuVMWvH58ABhWP74i0Ix85JCJ4fVdDxHaMfIrATGSk%2FePZy0rYRHhEJpLeTI%2BN9NqPpxhw6U8vcDnAAuHxCM9T%2BaP%2FKThDREu1GlBNEHCW9ak1cnjcz8LRKB0iXHqr2J9oo07Wybjn%2BePj0jwmFOen2gZ0vLTpocUQo7j471xpPr6o%2FuZBJdnFMVXtYV0ejqtgktwmU5ZEK6yy%2FTfron%2B1t8igGQdQabFAhfq%2Bihfa4QsUMvp77NTPRe0ul%2BWep7rRfbaJsRvt9v%2Fh4jJKdZPEXkAAAAASUVORK5CYII%3D";var ro={};ro="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAATlBMVEUAAADj4%2BPp6enn5%2Bfp6enp6enp6enq6urm5ubm5ubg4ODg4ODm5ubo6Ojc3Nww6v8Y6P8T5%2F8m6P8H5v8A5f8L5v8N4PoF4f0C4P0D2%2FuDNJb%2FAAAAGnRSTlMAE2SS0e7%2F%2F7smT%2F%2F%2F%2F%2F0a6ehI%2F%2F%2FbMaX0k6g43vIAAAKLSURBVHgB7JjpmuQgCEVjiBdTgu%2F%2FtrMPX5uuoLSzT5%2F6f09xyb6984eTdjoymBm57OmHpxO4A%2BVHOs6DXwHOjx%2F17ws%2FA%2BD8Q6Ygfg4%2BwWU9%2F2BHAOTVejL7AvC5tF2%2BBz%2FAkNgBxtsNeU7AaXG%2FjmBp08SzAqYfvgDLXyipjAVLJZ0cEeCMbzgmyD94A4wrtYooM%2BdC%2B8w4FBXIF4PiM6w0dOSogJsJPsOUflBDRm0iYgJV7J7gERdIq51AlX7AWdwLai%2FQsngZ6tH2ydALnBlyXIBPAjPoN273oMF8E0gvQLoRhPNNIJ1AKS7AQCCdQM9oRRgKxPKdEXI8X7%2Fni7wUSOwwxT3SqhlURx1ROB9i8b1hn79UwKW%2BFMhoCQnBeMDyL4YytWUM0YvADPm5gBAItxtOhy9ICFJNYLgVbQeM6ACGe7FIigBcvwf2Bu%2BCWhDA4lRE7SfSn2g9STCN2u1Yr%2BTtFtLQADcC2u45fkC%2BpM0hBwpSyx8NEF%2BDky9pczklkv9aII9tQGqT%2FYQLMg55e37ZZqDq1uP0Q9MfQ8T5%2Fzrfv6M4quKCheJpvlAKfpDK1VvGJb1ZfMTxoNJaHdEmX6He%2BdheXR04DAQxGO7ANFrqv9DD1eyBSWH6Hv9wDLpB%2FTD0m2UcWWSTfZi2CsCimuzLtF4AgEXTW9WvFXxhkQSrwp8CtIKKRRDNxZ8Fn1hALIJkLrWCbywgFkEwF1hALCAWQTaXa4GbL0f%2FRXDz5eiDDDdfRMW%2BoXhBNV9kBcbXesFmUcSUc4pqebkfXCuxCLhWWhHMrNWEL%2FNF1tZKKYK2VkIRRLi4vwgSXNpfBAEu7C%2BCDJf3lNv7i85%2BkH2tzrloeC3ayx7vgDWcARqOBsEAAAAASUVORK5CYII%3D";var rl={};rl="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAARVBMVEUAAACy6fHl5eXq6uro6Ojm5ubp6enq6urm5ubi4uLj4%2BPf39%2Fo6Ojh4eES3%2FkP5%2F8k6f8M5%2F8G5v8A5f8G4f0C4P0E2%2FuRTESCAAAAF3RSTlMAEFuV5P%2F%2F%2F8EbLv%2F%2FjCngQ%2Fz%2F%2F6X0kyzJZw0AAAJ0SURBVHgB7NYHlqQ6DIVhOejKLsv7X27ndj0KrELAm%2FzNSZPuTz5Nv7h%2FQkyZISLIJQa6WE2QBZR65XyWFUi%2B0TVCkS2A5EoXSLINAKTQaVmMAMCBTqksdgByoxNuMocLClUMGCodxfsCEs7fXzMAPv982gEkOiDs34dU8iuOAPL5J8gO4EZe2RfIl5%2FAo9aYVURySX3P6SRvgD8KineiqdIT7A3ICHyQFMgSXPvjGvEIqCKSIfoD3NoioJpOvsXrQFsGtBx9y7BFVwHrHPhYYBT0S6QJde8D7R0vAwi07cA%2Bf%2BwzLwKa%2FAHMfAV4EdDqvUSY4XYv6F068sPK%2FCn6BL1j32MK7DgDZv2Pm%2BdFgx3gQe%2Fi%2Fk8FTK2tCsZNCHDOA2P%2BoVB2vcp4StukkGlTx2rcxo0f2IEKH2lfBeXBvERU4LKaf2d%2BLKrCQcfgqhDpilMYc8qs49fHH1WaCOw7AcU7fcQ01RV78TzQaa5csM%2BVDNlxgXS1bz5Drttg7HMg0409%2B%2BsAR3oitP3XB%2Bq5w0Ph4%2FuF9uhWgY197rRPKGwcv%2Fqv%2F1otrJv777C5zz2QR%2BiNGXMP661Xcguxl9yeyqXH%2BtpeXWQxDMNAAG0OYBL4%2Fjct%2BikrOS%2BacvvXEzDO4SP95VIynvHVRtTqVoa51fj7t75Qic8o9IWl0VVbZhm%2BsswehYYyyfBQAhNEproZNvsnSciIm2EjgRkyZTJD8TlSMupm2Oj7TVEmk90MGzfj6zT0SYaHkYl8gfs0Y%2B%2BPyKIqGc%2F8fV%2FHIay%2FYEB%2FAaD%2BWoH9BYD6ywNczsAM4XOE99d7ThHWXyu4vwDWX4Av7K%2B%2FE4vvci3LGOUMAAAAAElFTkSuQmCC";var ru={};ru="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAPFBMVEUAAADZ2dnl5eXn5%2Bfo6Ojm5ubp6enq6urg4ODm5ubQ0NDBwcHo6OjExMS9vb2%2Fv7%2FAwMC8vLy9vb23t7ftsDFCAAAAFHRSTlMAEVuR2P%2F%2F%2F%2F67J0z%2F%2F%2F%2Bq%2B4HR%2BIsFiaoAAAJsSURBVHgB7ZWHYusgDEUlY4lhsv%2F%2FXx%2BNGtrEhliJ3vbpXvdUAwwbfzg4uJHYe88hDmie7tjfwdHSkUa%2FQJjABox%2BCWY%2FmlTh%2FDJc8BHeZvRtQYHeLAKz7wvYp7em69uwgQF9B668bqB1Ao%2Bm850LmGz3cy5gZzyAKnhr0HFdvjDabmgVvLNJo04Q9BPQCTgEouy9D9G5NeU4ZT7T1ZBl5vm5I2sF%2FiYQvEODHZ31iKqgqAboMOgF0qMqKDiDU3wvCPeCHPVL2hHkmaBXA2nzRVAN%2BZPhpSXiZcIHdC9gbAheyKdrPlEVdJukz5cKKIghV5K2Rcz9CgqS3y8hKPPrkK%2BK7wLSrSm3oWu8kIVOj5w6Xw4azQ3D%2BquCu9zyhWdDQFbFi4AWDXHVUeanZKlgZmg9rh3z2nCBJH5uaAiQldwalKnSbRGMrOIhXuheFolYQa6BM8MADSIrIApEWQT59iKGBA2QdAVk%2BewRgiYuKwpoChy0GQ3yCaFDUDQoS76mgNVj6OQTQpdEmvy5gAZ4Aob1%2FVE3SBjp9fwIa3A9A%2FX642AdGKnz%2F2d9%2F%2BfgSJnnSCgv5pND0IAuEHGbh%2FQg8TpwcjE8Z4xuSLCx8YewK8DPZF%2FYBL9DgGlJkBCsOBwP%2BCjA8k0wIpXU3elecDqWzxLYcN5%2FcJy%2BBFOJL5zBiJMYzkkE6Sz5J8MpH0Rx%2FXCQeBmLGUn6VCnVWDNdpIp94TKBPTKK2vy%2FTlBXs66s8LcMGQ%2Bfmy%2FvZGXRsPkS%2F3XQRGE2Csm7fL8qLqZXRaqbI4K6UWZzOOyXruv94U984Pz5z%2BRNcCnAxsYv5gcBJmV5WFk6DwAAAABJRU5ErkJggg%3D%3D";var rd={};rd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAYFBMVEUAAADT3t%2Fh4eHq6urp6enn5%2Bfp6enq6urm5ubG0NLLy8uds7bo6Ojj4%2BPn5%2Bfh4eHe3t4U5%2F8Y5P0B5f%2FExMS%2Bvr4K5v8D3vy%2Bvr4A3%2F28vLy9vb29vb29vb3BwcG4uLjMVSTuAAAAH3RSTlMAD1uV0e7%2F%2F7ohOgX%2F%2F%2F%2BM%2F%2Bg6%2F%2F3%2F252t9H3R8%2F%2BTcABA0AAAAzBJREFUeAHsmAe6rCAMhUWGBO8kwf1v9jbsSonM6%2B9fwPm%2Fk1jpfnP%2BY3r7cICI4HxvXp0%2BWMAd4IdXxj%2FwBKB7e9VsPF4BgO4lLSxeA5%2Bgb45%2FPjAjAHDPxvEQ5gWATWN6wzQwGxp2bbAgiNzu8HR1AjQ3BQ%2BsE4Brvz7zArCtC0jnN1xKvihoG9KAGgG86TesE7gfXACAmYUQ0XkbaupYrUDGLwPFnZMtbl20AlwEEWtarlGEM%2BPIIouACPqcoNcLeGTeCD6xrXfxcQnjQUC%2B%2BTG0hcZPw1aQ7eBuCmYDTST3QOp8gPHbsBeASQhu5Mt3PssiyA5JnR8b8GSglUF7nwFkG0QDUamCU%2BcDzfksW4HoLlOAXIMpn4WKM7LaeACO%2BZGNoK9%2FVECVIDpKSzCgio8X0VyAZTslX7VlKELzBqJjNbhrQYDq8AgvG5gleYEBJXP%2BxpEdUfcAFbLJXzaRfVgMoi0QA2VL9oHqlQViHMnRMKQERlGBlrclHeEuSSBFAYkCOhFiWNueRZIFZMj%2BgCgGlChguxyG6wqk89kUfgK5LV%2F6roBxUIBivn7Dy4%2B4lOefyvddDYGz148k8yVUH4Zwej5CqXzuNcc5TJf5X8BlPgfTaTDBsUCaQ%2FoYhjtHasG7sYjz4aO9OtlyEASiMHwrO6xNBolYiL7%2FWzYcbKtP5tBmzpdxVb8zC4Ovh2HGTZnVyuB2eL2J1vinOsJBcf4cBRvhENqM6EaB7W9ge5vAejNZ3yTQaKDB9cgcChjaOULlx8jVjnYD5KzDpNVAi6tVcWot%2FDfAUsd%2F1UyHyNukqzRQdTbxM51klpDnmRwwuRiED5zlBiXI5USfv5LgCAo8FhpGGeNjQgVvsGPdtG2zRiE97no%2BZsdiR8K4Be7tqL9JYFHrGagXmFvlp%2BmJ9QfOAhFKkcuz%2BxD1OeF2xxFzYYFlujRDlC7ZZOdcSxcJSuR56dLMgXTJhsRD9TZHUcCEEAZhaAAsQ%2FxnMJE4v7zgBkeABhJywWFCXRh1VL7gaGB3wSHWABOKaWAHQwPgGwTAGmDcIgAJI8FtApBZ5mOIoEputHKc3jfFjOf29QPQe5BuJum%2B4AAAAABJRU5ErkJggg%3D%3D";var rc={},rh={};rh="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2219%22%20height%3D%2220%22%20viewBox%3D%220%200%2019%2020%22%3E%3Cpath%20fill%3D%22%23d8d8d8%22%20d%3D%22M1%208a1%201%200%200%201%200-2h8a2%202%200%201%200-1.414-3.414%201%201%200%200%201-1.414-1.414A4%204%200%201%201%209%208Zm15%202a1%201%200%201%200-.707-1.707%201%201%200%200%201-1.414-1.414A3%203%200%201%201%2016%2012H2a1%201%200%200%201%200-2Zm-1%206H1a1%201%200%200%201%200-2h14a3%203%200%201%201-2.121%205.121%201%201%200%201%201%201.414-1.414A1%201%200%201%200%2015%2016%22%2F%3E%3C%2Fsvg%3E";let rf={"clear-day":e(rc="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAAAKlBMVEUAAAD4yz%2F81kP71UL71kD81kD81z%2F91z793Eb920L92kD92j792Tv92TexM71sAAAACHRSTlMACx9Qc5vL5%2BHfWOMAAAKCSURBVHja7ZkxFuMwCAUlSwIki%2Ftfdzcvu6YQzjdxSk%2F6GQN5KeL08PBwma3URsQswkzUatnS78ilkYj0f4y%2F9C7USk6%2FoDRzW2GMfe%2FSSrpJriwvvMCLzjXf1Z8G3owbicJysAbGfiS%2BW9RGYrgjHAzaUpgiAgNGeIjcJBSYo%2BXgehY%2BB%2BZO200%2FCMx5vbCxfBOYvMX9RhcUsALeT3yCN5QTJJs%2FMsH1QhMjNMGblgAF%2BFFgFnAAuRXAhybfvpxgCRgEFhQewAJ4SZl9u3QJBDinM6rvD06gNTbAsX9wAgucjlBP7LEBpp6OwOLTQydQVb7%2BFerrBAMHtCSPdn4BCW1Itbkndt3edxQH9uxt6C0Ukx%2BNaMDfUTuMR6h%2F6fd3RN3M5nYXhAPk%2FY72l%2B5wW8MbAAV0W0%2FwNkg%2FvDf83hFq77J8DPNfC9T1xv8nkG52Cfot0JwbL0g%2F8eMBlPyAzbDogR8H2J7aZYQGUD4L3PCDANBf9BuRwHD88QADfcAPboD0vh8HaIyx2n0%2FHkDJCXxmB34YaL%2Fz%2Bz8VFet9vx%2BoS6AAfcDv%2F1xvwB7z65YWaAf2iJ%2FSStuvM1GgpZVy1%2B%2BfwMgjoAf%2BmZNDu%2BPHG8I7wn5%2FQwbH9b6fk0%2BFete%2FJmryyRzWT3XgnOAIWG%2FPP%2FEAeITpo2CAhTKRHT%2B%2FlvQBwnJDXQj822VqgPrPj%2F71KhNi6%2FEoCdCu%2Bn1aQmS6qHcblNMPCmbHfv%2FQge2jA8cLb9UEflQgsHwXMj8kE7CD%2FWNyC%2Bq15RSj8DQU2JVLCrORTpObHqw%2FNoSCRwePD8mVsf72mzSsv0lpfGpv5WcvS3Uh8LI08rpX9Xjd%2B%2FDwcJU%2FkH3TfyEXazkAAAAASUVORK5CYII%3D"),"clear-night":e(i9),cloudy:e(re),overcast:e(re),fog:e(rt),hail:e(rd),lightning:e(rn),"lightning-rainy":e(ri),"partly-cloudy-day":e(ra),"partly-cloudy-night":e(rs),partlycloudy:e(ra),pouring:e(ro),rain:e(rl),rainy:e(rl),sleet:e(rd),snow:e(ru),snowy:e(ru),"snowy-rainy":e(rd),sunny:e(rc),wind:e(rh),windy:e(rh),"windy-variant":e(rh)};({...rf,sunny:e(i9),partlycloudy:e(rs),"lightning-rainy":e(rr)});var rm=s`
+ ha-textfield,
+ ha-select,
+ ha-formfield,
+ ha-expansion-panel,
+ ha-button,
+ ha-entity-picker,
+ ha-icon-picker {
+ margin: 8px 0;
+ }
+`,rv={};rv=JSON.parse('{"name":"week-planner-card","version":"1.0.12","description":"Custom Home Assistant card to display events for a number of days from one or several calendars.","source":"src/index.js","module":"dist/week-planner-card.js","targets":{"module":{"includeNodeModules":true,"optimize":true}},"scripts":{"watch":"parcel watch","build":"parcel build"},"repository":{"type":"git","url":"git+https://github.com/FamousWolf/week-planner-card.git"},"keywords":["lovelace"],"author":"Rudy Gnodde","licence":"MIT","bugs":{"url":"https://github.com/FamousWolf/week-planner-card/issues"},"homepage":"https://github.com/FamousWolf/week-planner-card","devDependencies":{"@parcel/optimizer-data-url":"^2.12.0","@parcel/transformer-inline-string":"^2.11.0","parcel":"^2.16.3","svgo":"^3.3.2"},"dependencies":{"lit":"^3.1.2","luxon":"^3.4.4"}}'),customElements.define("week-planner-card",class extends es{static styles=i7;_initialized=!1;_loading=0;_events={};_calendarEvents={};_calendars;_numberOfDays;_numberOfDaysIsMonth;_updateInterval;_noCardBackground;_eventBackground;_compact;_language;_weather;_dateFormat;_timeFormat;_multiDayTimeFormat;_multiDayMode;_locationLink;_startDate;_hideWeekend;_startingDay;_startingDayOffset;_weatherForecast=null;_showLocation;_hidePastEvents;_hideAllDayEvents;_hideDaysWithoutEvents;_hideTodayWithoutEvents;_filter;_filterText;_replaceTitleText;_combineSimilarEvents;_showLegend;_legendToggle;_actions;_columns;_loader;_showNavigation;_navigationOffset=0;_updateEventsTimeouts=[];_calendarErrors=[];static getConfigElement(){return document.createElement("week-planner-card-editor")}static getStubConfig(){return{calendars:[],days:7,startingDay:"today",startingDayOffset:0,showWeekDayText:!0,hideWeekend:!1,noCardBackground:!1,compact:!1,weather:{showCondition:!0,showTemperature:!1,showLowTemperature:!1,roundTemperature:!1,useTwiceDaily:!1},locale:"en",showLocation:!1,hidePastEvents:!1,hideDaysWithoutEvents:!1,hideTodayWithoutEvents:!1,combineSimilarEvents:!1,showLegend:!1}}static get properties(){return{_days:{type:Array},_config:{type:Object},_error:{type:String},_currentEventDetails:{type:Object},_hideCalendars:{type:Array},_showCreateEventDialog:{type:Object},_showEditEventDialog:{type:Object},_editFormData:{type:Object}}}setConfig(e){if(this._config=e,!e.calendars)throw Error("No calendars are configured");this._numberOfDaysIsMonth=this._isNumberOfDaysMonth(e.days??7),this._title=e.title??null,this._calendars=e.calendars,this._defaultCalendar=e.defaultCalendar??null,this._weather=this._getWeatherConfig(e.weather),this._numberOfDays=this._getNumberOfDays(e.days??7),this._hideWeekend=e.hideWeekend??!1,this._showNavigation=e.showNavigation??!1,this._startingDay=e.startingDay??"today",this._startingDayOffset=e.startingDayOffset??0,this._showWeekDayText=e.showWeekDayText??!0,this._startDate=this._getStartDate(),this._updateInterval=e.updateInterval??60,this._noCardBackground=e.noCardBackground??!1,this._eventBackground=e.eventBackground??"var(--card-background-color, inherit)",this._compact=e.compact??!1,this._theme=e.theme??"default",this._dayFormat=e.dayFormat??null,this._dateFormat=e.dateFormat??"cccc d LLLL yyyy",this._timeFormat=e.timeFormat??"HH:mm",this._multiDayTimeFormat=e._multiDayTimeFormat??"d LLL HH:mm",this._multiDayMode=e.multiDayMode??"default",this._locationLink=e.locationLink??"https://www.google.com/maps/search/?api=1&query=",this._showTitle=e.showTitle??!0,this._showDescription=e.showDescription??!1,this._showLocation=e.showLocation??!1,this._showTime=e.showTime??!1,this._showDayName=e.showDayName??!1,this._showDate=e.showDate??!1,this._showCalendarName=e.showCalendarName??!1,this._showWeather=e.showWeather??!0,this._showCurrentWeather=e.showCurrentWeather??!1,this._hidePastEvents=e.hidePastEvents??!1,this._hideAllDayEvents=e.hideAllDayEvents??!1,this._hideDaysWithoutEvents=e.hideDaysWithoutEvents??!1,this._hideTodayWithoutEvents=e.hideTodayWithoutEvents??!1,this._filter=e.filter??!1,this._filterText=e.filterText??!1,this._replaceTitleText=e.replaceTitleText??!1,this._combineSimilarEvents=e.combineSimilarEvents??!1,this._showLegend=e.showLegend??!1,this._legendToggle=e.legendToggle??!1,this._actions=e.actions??!1,this._columns=e.columns??{},this._dayHeaderFontSize=e.dayHeaderFontSize??null,this._dayHeaderColor=e.dayHeaderColor??null,this._maxEvents=e.maxEvents??!1,this._maxDayEvents=e.maxDayEvents??!1,this._hideCalendars=(e.calendars||[]).reduce((e,t)=>(t.initiallyHidden&&t.entity&&e.push(t.entity),e),[]),e.locale&&(eh.Settings.defaultLocale=e.locale),this._language=Object.assign({},{fullDay:"Entire day",noEvents:"No events",moreEvents:"More events",today:"Today",tomorrow:"Tomorrow",yesterday:"Yesterday",sunday:eh.Info.weekdays("long")[6],monday:eh.Info.weekdays("long")[0],tuesday:eh.Info.weekdays("long")[1],wednesday:eh.Info.weekdays("long")[2],thursday:eh.Info.weekdays("long")[3],friday:eh.Info.weekdays("long")[4],saturday:eh.Info.weekdays("long")[5]},e.texts??{})}_isNumberOfDaysMonth(e){return"month"===String(e).toLowerCase().trim()}_getWeatherConfig(e){if(!e||"string"!=typeof e&&"object"!=typeof e)return null;let t={entity:null,showCondition:!0,showTemperature:!1,showLowTemperature:!1,roundTemperature:!1};return("string"==typeof e?t.entity=e:Object.assign(t,e),t.hasOwnProperty("entity")&&null!==t.entity)?t:null}render(){this._loader||(this._loader=this._getLoader()),this._initialized||(this._initialized=!0,this._waitForHassAndConfig());let e=[];this._noCardBackground&&e.push("nobackground"),this._compact&&e.push("compact"),this._theme&&"default"!==this._theme&&e.push(this._theme);let t=["--event-background-color: "+this._eventBackground+";"];return this._columns.extraLarge&&t.push("--days-columns: "+this._columns.extraLarge+";"),this._columns.large&&t.push("--days-columns-lg: "+this._columns.large+";"),this._columns.medium&&t.push("--days-columns-md: "+this._columns.medium+";"),this._columns.small&&t.push("--days-columns-sm: "+this._columns.small+";"),this._columns.extraSmall&&t.push("--days-columns-xs: "+this._columns.extraSmall+";"),this._dayHeaderFontSize&&t.push("--day-header-font-size: "+this._dayHeaderFontSize+";"),this._dayHeaderColor&&t.push("--day-header-color: "+this._dayHeaderColor+";"),W`
+
+
+ ${this._error?W`
${this._error}
`:""}
+ ${this._title&&this._showTitle||this._showCurrentWeather?W``:""}
+
+ ${this._renderHeader()}
+ ${this._renderWeekDays()}
+ ${this._renderDays()}
+
+ ${this._renderEventDetailsDialog()}
+ ${this._renderCreateEventDialog()}
+ ${this._renderEditEventDialog()}
+ ${this._loader}
+
+
+ `}_renderHeader(){return this._showLegend||this._showNavigation?W`
+
+ `:W``}_renderLegend(){return this._showLegend?W`
+
+
+ ${this._calendars.map(e=>{if(!e.hideInLegend)return W`
+ - {this._handleLegendClick(e)}}">
+ ${e.icon?W``:""}
+ ${e.name??e.entity}
+
+ `})}
+
+
+ `:W``}_renderNavigation(){return this._showNavigation?W`
+
+
+
${this._startDate.toFormat("MMMM yyyy")}
+
+ `:W``}_renderWeekDays(){if(this._showWeekDayText||!this._days||!this._numberOfDaysIsMonth&&this._numberOfDays<7)return W``;let e=this._days.slice(0,7),t=[this._language.sunday,this._language.monday,this._language.tuesday,this._language.wednesday,this._language.thursday,this._language.friday,this._language.saturday,this._language.sunday];return W`
+ ${e.map(e=>W`
+
+ `)}
+ `}_renderDays(){return this._days?W`
+ ${this._days.map(e=>e.isOutsideMonth?W``:this._hideDaysWithoutEvents&&0===e.events.length&&(this._hideTodayWithoutEvents||!this._isToday(e.date))?W``:W`
+
+
+ ${"skylight"===this._theme?W`
+
+ `:this._dayFormat?ed(e.date.toFormat(this._dayFormat)):W`
+ ${e.date.day}
+ ${this._showDayName||this._showWeekDayText&&!this._numberOfDaysIsMonth&&this._numberOfDays<7?W`${this._getWeekDayText(e.date)}`:""}
+ `}
+
+ ${this._showWeather&&e.weather?W`
+
+ ${this._weather?.showTemperature||this._weather?.showLowTemperature?W`
+
+ ${this._weather?.showTemperature?W`
+ ${e.weather.temperature}
+ `:""}
+ ${this._weather?.showLowTemperature?W`
+ ${e.weather.templow}
+ `:""}
+
+ `:""}
+ ${this._weather?.showCondition?this._getWeatherIcon(e.weather.state,e.weather.condition):""}
+
+ `:""}
+
+ ${this._renderEvents(e)}
+
+
this._handleAddEventClick(t,e)}">
+
+
+
+ `)}
+ `:W``}_renderEvents(e){let t=[];if(e.events.map(e=>{if(!this._calendarEvents[e])return;let n=Object.assign({},this._calendarEvents[e]),i=[...n.calendars],r=[...n.colors],a=0;for(;a-1?(i.splice(a,1),r.splice(a,1)):a++;0!==i.length&&(n.calendars=i,n.colors=r,t.push(n))}),0===t.length)return this._renderNoEvents();let n=!1;return this._maxDayEvents>0&&t.length>this._maxDayEvents&&(t.splice(this._maxDayEvents),n=!0),W`
+ ${t.map(e=>{let t=[e.colors[0]];return W`
+ {this._handleEventClick(e)}}"
+ >
+ ${e.colors.map(e=>t.indexOf(e)>-1?"":(t.push(e),W`
+
+ `))}
+
+ ${"skylight"===this._theme?W`
+
${e.summary}
+ ${this._showTime?W`
${this._renderEventTime(e)}
`:""}
+ `:W`
+ ${this._showTime?W`
${this._renderEventTime(e)}
`:""}
+
${e.summary}
+ `}
+ ${this._showDescription?W`
+
+ ${ed(e.description)}
+
+ `:""}
+ ${this._showLocation&&e.location?W`
+
+
+ ${e.location}
+
+ `:""}
+
+ ${e.icon?W`
+
+
+
+ `:""}
+ ${"skylight"===this._theme?W`
`:""}
+
+ `})}
+ ${n?W`
+
+ ${this._language.moreEvents}
+
+ `:""}
+ `}_renderEventTime(e){return e.multiDay&&"default"!==this._multiDayMode?W`
+ ${e.originalStart.toFormat(this._multiDayTimeFormat)}
+ ${" - "+e.originalEnd.toFormat(this._multiDayTimeFormat)}
+ `:e.fullDay?W`${this._language.fullDay}`:W`
+ ${e.start.toFormat(this._timeFormat)}
+ ${e.end?" - "+e.end.toFormat(this._timeFormat):""}
+ `}_renderNoEvents(){return W`
+
+ ${this._language.noEvents}
+
+ `}_renderCurrentWeather(){if(!this._showCurrentWeather||!this._weather)return W``;let e=this.hass?.states[this._weather.entity];if(!e)return W``;let t=e.state,n=this._weather.roundTemperature?Math.round(e.attributes.temperature):e.attributes.temperature,i=this.hass.formatEntityAttributeValue(e,"temperature",n);return W`
+
+ ${this._getWeatherIcon(t,this.hass.formatEntityState(e))}
+ ${i}
+
+ `}_renderEventDetailsDialog(){return this._currentEventDetails?W`
+
+
+ ${this._showCalendarName?W`
+
+
+ ${this._currentEventDetails.calendarNames.join(", ")}
+
+
`:""}
+ ${this._showDate?W`
+
+
+ ${this._renderEventDetailsDate()}
+
+
`:""}
+ ${this._currentEventDetails.location?W`
+
+ `:""}
+ ${this._currentEventDetails.description?W`
+
+ ${ed(this._currentEventDetails.description)}
+
+ `:""}
+ ${this._currentEventDetails.uid?W`
+
+
+
+
+ `:""}
+
+
+ `:W``}_renderEventDetailsDialogHeading(){return W`
+
+ `}_renderEventDetailsDate(){let e=this._currentEventDetails.originalStart,t=this._currentEventDetails.originalEnd??null;if(null===t)return W`
+ ${e.toFormat(this._dateFormat+" "+this._timeFormat)}
+ `;if(this._isFullDay(e,t,!0))if(24>=Math.abs(e.diff(t,"hours").toObject().hours))return W`
+ ${e.toFormat(this._dateFormat)}
+ `;else{let n=t.minus({seconds:1});return W`
+ ${e.toFormat(this._dateFormat)} - ${n.toFormat(this._dateFormat)}
+ `}return this._isSameDay(e,t)?W`
+ ${e.toFormat(this._dateFormat+" "+this._timeFormat)+" - "+t.toFormat(this._timeFormat)}
+ `:W`
+ ${e.toFormat(this._dateFormat+" "+this._timeFormat)} - ${t.toFormat(this._dateFormat+" "+this._timeFormat)}
+ `}_renderCreateEventDialog(){if(!this._showCreateEventDialog)return W``;let e=this._showCreateEventDialog.date,t=eh.DateTime.now(),n=e.set({hour:t.hour+1,minute:0,second:0,millisecond:0}),i=n.plus({hours:1}),r=n.toFormat("yyyy-MM-dd'T'HH:mm"),a=i.toFormat("yyyy-MM-dd'T'HH:mm");return W`
+
+
+
+ `}_renderCreateEventDialogHeading(){return W`
+
+ `}_renderEditEventDialog(){if(!this._showEditEventDialog||!this._editFormData)return W``;this._showEditEventDialog;let e=this._editFormData;return W`
+
+
+
+ `}_renderEditEventDialogHeading(){return W`
+
+ `}_getLoader(){let e=document.createElement("div");return e.className="loader",e.style.display="none",e}_updateLoader(){this._loading>0?this._loader.style.display="inherit":this._loader.style.display="none"}_getWeatherIcon(e,t){if(!e)return null;let n=getComputedStyle(this).getPropertyValue("--weather-icon-"+e).trim();return null!==n&&-1===["","none","inherit"].indexOf(n)?W``:W`
+
+

+
+ `}_waitForHassAndConfig(){this.hass&&this._calendars?this._updateEvents():window.setTimeout(()=>{this._waitForHassAndConfig()},50)}_subscribeToWeatherForecast(){this._loading++,this._updateLoader();let e=!0;this.hass.connection.subscribeMessage(t=>{this._weatherForecast=t.forecast??[],e&&(this._loading--,e=!1)},{type:"weather/subscribe_forecast",forecast_type:this._weather.useTwiceDaily?"twice_daily":"daily",entity_id:this._weather.entity})}_updateEvents(){if(this._loading>0)return;this._loading++,this._updateLoader(),this._clearUpdateEventsTimeouts(),this._events={},this._calendarEvents={},this._startDate=this._getStartDate(),this._numberOfDaysIsMonth&&(this._numberOfDays=this._startDate.daysInMonth);let e=this._startDate,t=this._startDate.plus({days:this._numberOfDays}),n=eh.DateTime.now(),i=this._startDate.toISO();this._weather&&null===this._weatherForecast&&this._subscribeToWeatherForecast();let r=0;this._calendars.forEach(a=>{if(!a.entity||!this.hass.states[a.entity])return;a.name||(a={...a,name:this.hass.formatEntityAttributeValue(this.hass.states[a.entity],"friendly_name")}),a.sorting||(a={...a,sorting:r});let s=r;this._loading++,this.hass.callApi("get","calendars/"+a.entity+"?start="+encodeURIComponent(e.toISO())+"&end="+encodeURIComponent(t.toISO())).then(e=>{this._startDate.toISO()!==i||(this._calendarErrors[s]="",e.forEach(e=>{if(this._isFilterEvent(e,a.filter??""))return;let t=this._convertApiDate(e.start),i=this._convertApiDate(e.end);if(this._hidePastEvents&&i{this._calendarErrors[s]='Error while fetching calendar "'+a.entity+'": '+(e.error??"Unknown error"),this._loading--}),r++});let a=window.setInterval(()=>{0===this._loading&&(clearInterval(a),this._updateCard(),this._updateLoader(),this._updateEventsTimeouts.push(window.setTimeout(()=>{this._updateEvents()},1e3*this._updateInterval)))},50);this._loading--}_clearUpdateEventsTimeouts(){this._updateEventsTimeouts.forEach(e=>{clearTimeout(e)})}_isFilterEvent(e,t){return this._filter&&e.summary.match(this._filter)||t&&e.summary.match(t)}_addEvent(e,t,n,i,r,a){if(a=a??!1,this._hideWeekend&&t.weekday>=6||i&&this._hideAllDayEvents)return;let s=t.toISODate();this._events.hasOwnProperty(s)||(this._events[s]=[]);let o=this._filterEventSummary(e,r),l=t.toISO()+"-"+n.toISO()+"-"+o;this._combineSimilarEvents||(l=t.toISO()+"-"+n.toISO()+"-"+o+"-"+r.entity),this._calendarEvents.hasOwnProperty(l)?(this._calendarEvents[l].calendars.push(r.entity),this._calendarEvents[l].colors.push(r.color??"inherit"),r.name&&-1===this._calendarEvents[l].calendarNames.indexOf(r.name)&&this._calendarEvents[l].calendarNames.push(r.name),r.sortinga?r.push("ongoing"):r.push("future"),r.join(" ")}_getDayClass(e){let t=[];return this._isToday(e)?t.push("today"):this._isTomorrow(e)?(t.push("tomorrow"),t.push("future")):this._isYesterday(e)?(t.push("yesterday"),t.push("past")):e>eh.DateTime.now()?t.push("future"):t.push("past"),t.push(["sunday","monday","tuesday","wednesday","thursday","friday","saturday","sunday"][e.weekday]),t.join(" ")}_handleMultiDayEvent(e,t,n,i){for(;t=this._startDate)break}}_updateCard(){this._error=this._calendarErrors.join("\n").trim();let e=[],t=this._weather?this.hass.states[this._weather.entity]:null,n={};this._weatherForecast?.forEach(e=>{if(e.hasOwnProperty("is_daytime")&&!1===e.is_daytime)return;let i=eh.DateTime.fromISO(e.datetime).toISODate(),r=this._weather.roundTemperature?Math.round(e.temperature):e.temperature,a=this._weather.roundTemperature?Math.round(e.templow):e.templow;n[i]={state:e.condition,condition:this.hass.formatEntityState(t,e.condition),temperature:this.hass.formatEntityAttributeValue(t,"temperature",r),templow:this.hass.formatEntityAttributeValue(t,"templow",a)}});let i=this._startDate,r=this._startDate.plus({days:this._numberOfDays}),a=null,s=String(this._startingDay).toLowerCase().trim();if(this._numberOfDaysIsMonth&&["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].includes(s)){a=i.plus({days:7}).month;let e=["monday","tuesday","wednesday","thursday","friday","saturday","sunday"].indexOf(s)+1;i=this._getWeekDayDate(i,e);let t=this._startDate.endOf("month");for(r=i;r<=t;)r=r.plus({days:7})}let o=0;for(;ithis._calendarEvents[e].start.toISO()===this._calendarEvents[t].start.toISO()?this._calendarEvents[e].calendarSortingthis._calendarEvents[t].calendarSorting?-1:0:this._calendarEvents[e].start>this._calendarEvents[t].start?1:-1)).length,this._maxEvents>0&&o>this._maxEvents&&t.splice(this._maxEvents-o)),e.push({date:i,events:t,weather:r?null:n[s]??null,class:this._getDayClass(i)+(r?" outside-month":""),isOutsideMonth:r}),this._maxEvents>0&&o>=this._maxEvents)break}i=i.plus({days:1})}this._days=e}_getWeekDayText(e){return this._language.today&&this._isToday(e)?this._language.today:this._language.tomorrow&&this._isTomorrow(e)?this._language.tomorrow:this._language.yesterday&&this._isYesterday(e)?this._language.yesterday:[this._language.sunday,this._language.monday,this._language.tuesday,this._language.wednesday,this._language.thursday,this._language.friday,this._language.saturday,this._language.sunday][e.weekday]}_handleContainerClick(e){if(!this._actions)return;let t=new Event("hass-action",{bubbles:!0,composed:!0});t.detail={config:this._actions,action:"tap"},this.dispatchEvent(t),e.stopImmediatePropagation()}_handleEventClick(e){this._actions||(e.uid?(this._editFormData={title:e.summary||"",calendar:e.calendars[0]||"",start:e.originalStart?e.originalStart.toFormat("yyyy-MM-dd'T'HH:mm"):"",end:e.originalEnd?e.originalEnd.toFormat("yyyy-MM-dd'T'HH:mm"):""},this._showEditEventDialog=e):this._currentEventDetails=e)}_closeDialog(){this._currentEventDetails=null}_handleAddEventClick(e,t){e.stopImmediatePropagation(),this._showCreateEventDialog={date:t.date}}_closeCreateEventDialog(){this._showCreateEventDialog=null}async _handleCreateEvent(){let e=this.shadowRoot.querySelector("#event-title")?.value?.trim(),t=this.shadowRoot.querySelector("#event-calendar")?.value,n=this.shadowRoot.querySelector("#event-start")?.value,i=this.shadowRoot.querySelector("#event-end")?.value;if(!e||!n)return;let r=eh.DateTime.fromISO(n),a=i?eh.DateTime.fromISO(i):r.plus({hours:1});try{await this.hass.callService("calendar","create_event",{entity_id:t,summary:e,start_date_time:r.toFormat("yyyy-MM-dd HH:mm:ss"),end_date_time:a.toFormat("yyyy-MM-dd HH:mm:ss")}),this._showCreateEventDialog=null,this._updateEvents()}catch(e){console.error("Failed to create event:",e)}}async _handleDeleteEvent(){let e=this._currentEventDetails;if(e&&e.uid)try{let t={type:"calendar/event/delete",entity_id:e.calendars[0],uid:e.uid};e.recurrence_id&&(t.recurrence_id=e.recurrence_id,t.recurrence_range="THISANDFUTURE"),await this.hass.callWS(t),this._currentEventDetails=null,this._updateEvents()}catch(e){console.error("Failed to delete event:",e)}}_handleEditEventClick(){let e=this._currentEventDetails;this._currentEventDetails=null,this._editFormData={title:e.summary||"",calendar:e.calendars[0]||"",start:e.originalStart?e.originalStart.toFormat("yyyy-MM-dd'T'HH:mm"):"",end:e.originalEnd?e.originalEnd.toFormat("yyyy-MM-dd'T'HH:mm"):""},this._showEditEventDialog=e}_closeEditEventDialog(){this._showEditEventDialog=null,this._editFormData=null}async _handleDeleteEventFromEdit(){let e=this._showEditEventDialog;if(e&&e.uid)try{let t={type:"calendar/event/delete",entity_id:e.calendars[0],uid:e.uid};e.recurrence_id&&(t.recurrence_id=e.recurrence_id,t.recurrence_range="THISANDFUTURE"),await this.hass.callWS(t),this._showEditEventDialog=null,this._editFormData=null,this._updateEvents()}catch(e){console.error("Week Planner: Failed to delete event:",e)}}async _handleUpdateEvent(){let e=this._showEditEventDialog,t=this._editFormData;if(!e||!t)return void console.error("Week Planner: No event or form data for update");let n=t.title?.trim(),i=t.calendar,r=t.start,a=t.end;if(!n||!r)return void console.error("Week Planner: Missing required fields",{title:n,startInput:r});let s=eh.DateTime.fromISO(r),o=a?eh.DateTime.fromISO(a):s.plus({hours:1}),l=i||e.calendars[0];try{if(e.uid){let t={type:"calendar/event/update",entity_id:l,uid:e.uid,event:{summary:n,dtstart:s.toFormat("yyyy-MM-dd'T'HH:mm:ss"),dtend:o.toFormat("yyyy-MM-dd'T'HH:mm:ss")}};e.recurrence_id&&(t.recurrence_id=e.recurrence_id,t.recurrence_range="THISANDFUTURE"),await this.hass.callWS(t)}this._showEditEventDialog=null,this._editFormData=null,this._updateEvents()}catch(t){if("not_supported"===t.code&&e.uid)try{let t={type:"calendar/event/delete",entity_id:l,uid:e.uid};e.recurrence_id&&(t.recurrence_id=e.recurrence_id,t.recurrence_range="THISANDFUTURE"),await this.hass.callWS(t),await this.hass.callService("calendar","create_event",{entity_id:l,summary:n,start_date_time:s.toFormat("yyyy-MM-dd HH:mm:ss"),end_date_time:o.toFormat("yyyy-MM-dd HH:mm:ss")}),this._showEditEventDialog=null,this._editFormData=null,this._updateEvents()}catch(e){console.error("Week Planner: Failed to update event (fallback):",e)}else console.error("Week Planner: Failed to update event:",t)}}_handleLegendClick(e){if(!this._legendToggle)return;let t=this._hideCalendars.indexOf(e.entity),n=[...this._hideCalendars];t>-1?n.splice(t,1):n.push(e.entity),this._hideCalendars=n}_handleNavigationOriginalClick(){this._navigationOffset=0,this._updateEvents()}_handleNavigationNextClick(e){this._navigationOffset++,this._updateEvents()}_handleNavigationPreviousClick(e){this._navigationOffset--,this._updateEvents()}_handleWeatherClick(e){let t=new Event("hass-more-info",{bubbles:!0,composed:!0});t.detail={entityId:this._weather.entity},this.dispatchEvent(t),e.stopImmediatePropagation()}_getNumberOfDays(e){return this._numberOfDaysIsMonth&&(e=eh.DateTime.now().daysInMonth),e}_getStartDate(e){let t=eh.DateTime.now();0!==this._navigationOffset&&(t=this._numberOfDaysIsMonth?t.plus({months:this._navigationOffset}):t.plus({days:this._numberOfDays*this._navigationOffset}));let n=String(e??this._startingDay).toLowerCase().trim(),i=this._numberOfDaysIsMonth&&["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].includes(n);switch(i&&(t=t.startOf("month")),n){case"yesterday":t=t.minus({days:1});break;case"tomorrow":t=t.plus({days:1});break;case"sunday":i||(t=this._getWeekDayDate(t,7));break;case"monday":i||(t=this._getWeekDayDate(t,1));break;case"tuesday":i||(t=this._getWeekDayDate(t,2));break;case"wednesday":i||(t=this._getWeekDayDate(t,3));break;case"thursday":i||(t=this._getWeekDayDate(t,4));break;case"friday":i||(t=this._getWeekDayDate(t,5));break;case"saturday":i||(t=this._getWeekDayDate(t,6));break;case"month":t=t.startOf("month")}return 0===this._startingDayOffset||i||(t=t.plus({days:this._startingDayOffset})),this._hideWeekend&&t.weekday>=6&&(t=this._getStartDate("monday")),t.startOf("day")}_getWeekDayDate(e,t){let n=e.weekday;return n>t?e.minus({days:n-t}):n0)&&!(e.minute>0)&&!(e.second>0)&&!(t.hour>0)&&!(t.minute>0)&&!(t.second>0)&&(n||1===Math.abs(e.diff(t,"days").toObject().days))}_isSameDay(e,t){return null===e&&null===t||null!==e&&null!==t&&e.day===t.day&&e.month===t.month&&e.year===t.year}_isToday(e){let t=eh.DateTime.now().startOf("day");return this._isSameDay(e,t)}_isTomorrow(e){let t=eh.DateTime.now().startOf("day").plus({days:1});return this._isSameDay(e,t)}_isYesterday(e){let t=eh.DateTime.now().startOf("day").minus({days:1});return this._isSameDay(e,t)}}),window.customCards=window.customCards||[],window.customCards.push({type:"week-planner-card",name:"Week Planner Card",description:"Card to display events for a number of days from one or several calendars."}),customElements.define("week-planner-card-editor",class extends es{static styles=rm;connectedCallback(){super.connectedCallback(),this.loadCustomElements()}async loadCustomElements(){customElements.get("ha-entity-picker")||await customElements.get("hui-entities-card").getConfigElement()}static get properties(){return{hass:{},_config:{}}}setConfig(e){this._config=e}render(){return this.hass&&this._config?W`
+
+ ${this.addTextField("title","Title")}
+ ${this.addExpansionPanel("Calendars",W`
+ ${this.getConfigValue("calendars").map((e,t)=>W`
+ ${this.addExpansionPanel(`Calendar: ${e.name??e.entity}`,W`
+ ${this.addEntityPickerField("calendars."+t+".entity","Entity",["calendar"])}
+ ${this.addTextField("calendars."+t+".name","Name")}
+ ${this.addTextField("calendars."+t+".color","Color")}
+ ${this.addIconPickerField("calendars."+t+".icon","Icon")}
+ ${this.addTextField("calendars."+t+".eventTitleField","Event title field","text","summary")}
+ ${this.addTextField("calendars."+t+".filter","Filter events (regex)")}
+ ${this.addTextField("calendars."+t+".filterText","Filter event text (regex)")}
+ ${this.addBooleanField("calendars."+t+".hideInLegend","Hide in legend")}
+ ${this.addBooleanField("calendars."+t+".initiallyHidden","Initially hide calendar events")}
+ ${this.addButton("Remove calendar","mdi:trash-can",()=>{let e=JSON.parse(JSON.stringify(this._config));1===e.calendars.length?e.calendars=[]:(delete e.calendars[t],e.calendars=e.calendars.filter(Boolean)),this._config=e,this.dispatchConfigChangedEvent()})}
+ `)}
+ `)}
+ ${this.addButton("Add calendar","mdi:plus",()=>{let e=this.getConfigValue("calendars").length;this.setConfigValue("calendars."+e,{})})}
+ `)}
+ ${this.addExpansionPanel("Days",W`
+ ${this.addTextField("days","Days")}
+ ${this.addSelectField("startingDay","Starting day",[{value:"today",label:"Today"},{value:"tomorrow",label:"Tomorrow"},{value:"yesterday",label:"Yesterday"},{value:"sunday",label:"Sunday"},{value:"monday",label:"Monday"},{value:"tuesday",label:"Tuesday"},{value:"wednesday",label:"Wednesday"},{value:"thursday",label:"Thursday"},{value:"friday",label:"Friday"},{value:"saturday",label:"Saturday"},{value:"month",label:"Month"}],!0)}
+ ${this.addTextField("startingDayOffset","Starting day offset","number")}
+ ${this.addBooleanField("showWeekDayText","Show week day text",!0)}
+ ${this.addBooleanField("hideWeekend","Hide weekend")}
+ ${this.addBooleanField("hideDaysWithoutEvents","Hide days without events except for today")}
+ ${this.addBooleanField("hideTodayWithoutEvents","Also hide today without events")}
+ ${this.addTextField("maxDayEvents","Maximum number of events per day (0 is no maximum)","number",0)}
+ ${this.addBooleanField("showNavigation","Show navigation")}
+ `)}
+ ${this.addExpansionPanel("Events",W`
+ ${this.addTextField("maxEvents","Maximum number of events (0 is no maximum)","number",0)}
+ ${this.addBooleanField("hidePastEvents","Hide past events")}
+ ${this.addBooleanField("hideAllDayEvents","Hide all day events")}
+ ${this.addSelectField("multiDayMode","Multi day mode",[{value:"default",label:"Default"},{value:"multiple",label:"Multiple"},{value:"single",label:"Single"}],!0)}
+ ${this.addTextField("filter","Filter events (regex)")}
+ ${this.addTextField("filterText","Filter event text (regex)")}
+ ${this.addBooleanField("combineSimilarEvents","Combine similar events")}
+ ${this.addBooleanField("showDayName","Show day name")}
+ ${this.addBooleanField("showDate","Show date in event details")}
+ ${this.addBooleanField("showTime","Show time")}
+ ${this.addBooleanField("showCalendarName","Show calendar name in event details")}
+ ${this.addBooleanField("showTitle","Show title in overview",!0)}
+ ${this.addBooleanField("showDescription","Show description in overview")}
+ ${this.addBooleanField("showLocation","Show location in overview")}
+ ${this.addTextField("locationLink","Override location link base URL")}
+ `)}
+ ${this.addExpansionPanel("Date/time formats",W`
+
These formats use Luxon format tokens
+ ${this.addTextField("locale","Locale")}
+ ${this.addTextField("dateFormat","Date format")}
+ ${this.addTextField("timeFormat","Time format")}
+ ${this.addTextField("multiDayTimeFormat","Multi day time format")}
+ ${this.addTextField("dayFormat","Override day number")}
+ `)}
+ ${this.addExpansionPanel("Weather",W`
+ ${this.addEntityPickerField("weather.entity","Weather entity",["weather"])}
+ ${this.addBooleanField("showCurrentWeather","Show current weather in header")}
+ ${this.addBooleanField("showWeather","Show weather in calendar",!0)}
+ ${this.addBooleanField("weather.showCondition","Show condition icon")}
+ ${this.addBooleanField("weather.showTemperature","Show temperature")}
+ ${this.addBooleanField("weather.showLowTemperature","Show low temperature")}
+ ${this.addBooleanField("weather.roundTemperature","Round temperatures to nearest integer")}
+ ${this.addBooleanField("weather.useTwiceDaily","Use twice daily if entity does not support daily")}
+ `)}
+ ${this.addExpansionPanel("Override columns",W`
+
The number of columns is based on the size of the card.
+ ${this.addTextField("columns.extraLarge","Extra large (>= 1920px)","number")}
+ ${this.addTextField("columns.large","Large (>= 1280px)","number")}
+ ${this.addTextField("columns.medium","Medium (>= 1024px)","number")}
+ ${this.addTextField("columns.small","Small (>= 640px)","number")}
+ ${this.addTextField("columns.extraSmall","Extra small (< 640px)","number")}
+ `)}
+ ${this.addExpansionPanel("Appearance",W`
+ ${this.addSelectField("theme","Theme",[{value:"default",label:"Default"},{value:"skylight",label:"Skylight"}],!0)}
+ ${this.addBooleanField("noCardBackground","No card background")}
+ ${this.addTextField("eventBackground","Override events background color")}
+ ${this.addBooleanField("compact","Compact mode")}
+ `)}
+ ${this.addExpansionPanel("Legend",W`
+ ${this.addBooleanField("showLegend","Show legend")}
+ ${this.addBooleanField("legendToggle","Toggle calendars by clicking on the legend")}
+ `)}
+ ${this.addExpansionPanel("Texts",W`
+ ${this.addTextField("texts.fullDay","Entire day")}
+ ${this.addTextField("texts.noEvents","No events")}
+ ${this.addTextField("texts.moreEvents","More events")}
+ ${this.addTextField("texts.today","Today")}
+ ${this.addTextField("texts.tomorrow","Tomorrow")}
+ ${this.addTextField("texts.yesterday","Yesterday")}
+ ${this.addTextField("texts.sunday","Sunday")}
+ ${this.addTextField("texts.monday","Monday")}
+ ${this.addTextField("texts.tuesday","Tuesday")}
+ ${this.addTextField("texts.wednesday","Wednesday")}
+ ${this.addTextField("texts.thursday","Thursday")}
+ ${this.addTextField("texts.friday","Friday")}
+ ${this.addTextField("texts.saturday","Saturday")}
+ `)}
+ ${this.addExpansionPanel("Miscellaneous",W`
+ ${this.addTextField("updateInterval","Override update interval","number")}
+ `)}
+
+ `:W``}addTextField(e,t,n,i){return W`
+
+ `}addEntityPickerField(e,t,n,i){return W`
+
+ `}addIconPickerField(e,t,n){return W`
+
+ `}addSelectField(e,t,n,i,r){return W`
+ {e.stopPropagation()}}"
+ >
+ ${n.map(e=>W`
+ ${e.label??e.value}
+ `)}
+
+ `}addBooleanField(e,t,n){return W`
+
+
+
+ `}addExpansionPanel(e,t,n){return W`
+
+
+ ${t}
+
+
+ `}addButton(e,t,n){return W`
+
+
+ ${e}
+
+ `}_valueChanged(e){let t=e.target,n=e.detail?e.detail.value??t.value??"":t.value??"";"HA-SWITCH"===t.tagName&&(n=t.checked),this.setConfigValue(t.attributes.name.value,n)}getConfigValue(e,t){return this._config?(t=t??"",e.split(".").reduce((e,n)=>e[n]??t,this._config)??t):""}setConfigValue(e,t){let n=JSON.parse(JSON.stringify(this._config)),i=e.split("."),r=i.pop(),a=i.reduce((e,t)=>(e[t]||(e[t]={}),e[t]),n);""===t?delete a[r]:a[r]=t,this._config=n,this.dispatchConfigChangedEvent()}dispatchConfigChangedEvent(){let e=new CustomEvent("config-changed",{detail:{config:this._config},bubbles:!0,composed:!0});this.dispatchEvent(e)}}),console.info(`%c WEEK-PLANNER-CARD %c v${rv.version} `,"color: white; background: black; font-weight: 700;","color: black; background: white; font-weight: 700;");
+//# sourceMappingURL=week-planner-card.js.map
diff --git a/examples/card.png b/examples/card.png
index 881eb1b..93815ef 100644
Binary files a/examples/card.png and b/examples/card.png differ
diff --git a/examples/card_old.png b/examples/card_old.png
new file mode 100644
index 0000000..d3f5a12
--- /dev/null
+++ b/examples/card_old.png
@@ -0,0 +1 @@
+
diff --git a/examples/m9oxaahYZi.png b/examples/m9oxaahYZi.png
new file mode 100644
index 0000000..f43469b
Binary files /dev/null and b/examples/m9oxaahYZi.png differ
diff --git a/package.json b/package.json
index c0f2c56..82f9a2e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "week-planner-card",
- "version": "1.14.1",
+ "version": "1.0.12",
"description": "Custom Home Assistant card to display events for a number of days from one or several calendars.",
"source": "src/index.js",
"module": "dist/week-planner-card.js",
diff --git a/src/card.js b/src/card.js
index a0912bf..aae0e2d 100644
--- a/src/card.js
+++ b/src/card.js
@@ -147,7 +147,10 @@ export class WeekPlannerCard extends LitElement {
_config: { type: Object },
_error: { type: String },
_currentEventDetails: { type: Object },
- _hideCalendars: { type: Array }
+ _hideCalendars: { type: Array },
+ _showCreateEventDialog: { type: Object },
+ _showEditEventDialog: { type: Object },
+ _editFormData: { type: Object }
}
}
@@ -166,6 +169,7 @@ export class WeekPlannerCard extends LitElement {
this._numberOfDaysIsMonth = this._isNumberOfDaysMonth(config.days ?? 7);
this._title = config.title ?? null;
this._calendars = config.calendars;
+ this._defaultCalendar = config.defaultCalendar ?? null;
this._weather = this._getWeatherConfig(config.weather);
this._numberOfDays = this._getNumberOfDays(config.days ?? 7);
this._hideWeekend = config.hideWeekend ?? false;
@@ -178,6 +182,7 @@ export class WeekPlannerCard extends LitElement {
this._noCardBackground = config.noCardBackground ?? false;
this._eventBackground = config.eventBackground ?? 'var(--card-background-color, inherit)';
this._compact = config.compact ?? false;
+ this._theme = config.theme ?? 'default';
this._dayFormat = config.dayFormat ?? null;
this._dateFormat = config.dateFormat ?? 'cccc d LLLL yyyy';
this._timeFormat = config.timeFormat ?? 'HH:mm';
@@ -187,6 +192,12 @@ export class WeekPlannerCard extends LitElement {
this._showTitle = config.showTitle ?? true;
this._showDescription = config.showDescription ?? false;
this._showLocation = config.showLocation ?? false;
+ this._showTime = config.showTime ?? false;
+ this._showDayName = config.showDayName ?? false;
+ this._showDate = config.showDate ?? false;
+ this._showCalendarName = config.showCalendarName ?? false;
+ this._showWeather = config.showWeather ?? true;
+ this._showCurrentWeather = config.showCurrentWeather ?? false;
this._hidePastEvents = config.hidePastEvents ?? false;
this._hideAllDayEvents = config.hideAllDayEvents ?? false;
this._hideDaysWithoutEvents = config.hideDaysWithoutEvents ?? false;
@@ -199,6 +210,8 @@ export class WeekPlannerCard extends LitElement {
this._legendToggle = config.legendToggle ?? false;
this._actions = config.actions ?? false;
this._columns = config.columns ?? {};
+ this._dayHeaderFontSize = config.dayHeaderFontSize ?? null;
+ this._dayHeaderColor = config.dayHeaderColor ?? null;
this._maxEvents = config.maxEvents ?? false;
this._maxDayEvents = config.maxDayEvents ?? false;
this._hideCalendars = (config.calendars || []).reduce((acc, calendar) => {
@@ -286,6 +299,9 @@ export class WeekPlannerCard extends LitElement {
if (this._compact) {
cardClasses.push('compact');
}
+ if (this._theme && this._theme !== 'default') {
+ cardClasses.push(this._theme);
+ }
const cardStyles = [
'--event-background-color: ' + this._eventBackground + ';'
@@ -305,6 +321,12 @@ export class WeekPlannerCard extends LitElement {
if (this._columns.extraSmall) {
cardStyles.push('--days-columns-xs: ' + this._columns.extraSmall + ';');
}
+ if (this._dayHeaderFontSize) {
+ cardStyles.push('--day-header-font-size: ' + this._dayHeaderFontSize + ';');
+ }
+ if (this._dayHeaderColor) {
+ cardStyles.push('--day-header-color: ' + this._dayHeaderColor + ';');
+ }
return html`
@@ -313,8 +335,11 @@ export class WeekPlannerCard extends LitElement {
html`${this._error}
` :
''
}
- ${this._title ?
- html`${this._title}
` :
+ ${(this._title && this._showTitle) || this._showCurrentWeather ?
+ html`` :
''
}
@@ -323,6 +348,8 @@ export class WeekPlannerCard extends LitElement {
${this._renderDays()}
${this._renderEventDetailsDialog()}
+ ${this._renderCreateEventDialog()}
+ ${this._renderEditEventDialog()}
${this._loader}
@@ -382,7 +409,7 @@ export class WeekPlannerCard extends LitElement {
- ${this._startDate.toFormat('MMMM')}
+ ${this._startDate.toFormat('MMMM yyyy')}
`;
}
@@ -438,18 +465,26 @@ export class WeekPlannerCard extends LitElement {
return html`
- ${this._dayFormat ?
- unsafeHTML(day.date.toFormat(this._dayFormat)) :
+ ${this._theme === 'skylight' ?
html`
- ${day.date.day}
- ${this._showWeekDayText || (!this._numberOfDaysIsMonth && this._numberOfDays < 7) ?
- html`${this._getWeekDayText(day.date)}` :
- ''
- }
- `
+
+ ` :
+ (this._dayFormat ?
+ unsafeHTML(day.date.toFormat(this._dayFormat)) :
+ html`
+ ${day.date.day}
+ ${this._showDayName || (this._showWeekDayText && !this._numberOfDaysIsMonth && this._numberOfDays < 7) ?
+ html`${this._getWeekDayText(day.date)}` :
+ ''
+ }
+ `
+ )
}
- ${day.weather ?
+ ${this._showWeather && day.weather ?
html`
${this._weather?.showTemperature || this._weather?.showLowTemperature ?
@@ -482,6 +517,9 @@ export class WeekPlannerCard extends LitElement {
${this._renderEvents(day)}
+
this._handleAddEventClick(e, day)}">
+
+
`
})}
@@ -544,7 +582,7 @@ export class WeekPlannerCard extends LitElement {
data-start-minute="${event.start.toFormat('mm')}"
data-end-hour="${event.end.toFormat('H')}"
data-end-minute="${event.end.toFormat('mm')}"
- style="--border-color: ${event.colors[0]}"
+ style="--border-color: ${event.colors[0]}; --event-bg-tint: ${event.colors[0]}; --dot-color: ${event.colors[0]}"
@click="${() => {
this._handleEventClick(event)
}}"
@@ -562,16 +600,21 @@ export class WeekPlannerCard extends LitElement {
`
})}
-
- ${this._renderEventTime(event)}
-
- ${this._showTitle ?
- html`
-
- ${event.summary}
-
- ` :
- ''
+ ${this._theme === 'skylight' ?
+ html`
+
${event.summary}
+ ${this._showTime ?
+ html`
${this._renderEventTime(event)}
` :
+ ''
+ }
+ ` :
+ html`
+ ${this._showTime ?
+ html`
${this._renderEventTime(event)}
` :
+ ''
+ }
+
${event.summary}
+ `
}
${this._showDescription ?
html`
@@ -599,6 +642,10 @@ export class WeekPlannerCard extends LitElement {
` :
''
}
+ ${this._theme === 'skylight' ?
+ html`
` :
+ ''
+ }
`
})}
@@ -637,6 +684,30 @@ export class WeekPlannerCard extends LitElement {
`;
}
+ _renderCurrentWeather() {
+ if (!this._showCurrentWeather || !this._weather) {
+ return html``;
+ }
+
+ const weatherState = this.hass?.states[this._weather.entity];
+ if (!weatherState) {
+ return html``;
+ }
+
+ const condition = weatherState.state;
+ const temperature = this._weather.roundTemperature
+ ? Math.round(weatherState.attributes.temperature)
+ : weatherState.attributes.temperature;
+ const formattedTemp = this.hass.formatEntityAttributeValue(weatherState, 'temperature', temperature);
+
+ return html`
+
+ ${this._getWeatherIcon(condition, this.hass.formatEntityState(weatherState))}
+ ${formattedTemp}
+
+ `;
+ }
+
_renderEventDetailsDialog() {
if (!this._currentEventDetails) {
return html``;
@@ -649,18 +720,24 @@ export class WeekPlannerCard extends LitElement {
.heading="${this._renderEventDetailsDialogHeading()}"
>
-
-
-
- ${this._currentEventDetails.calendarNames.join(', ')}
-
-
-
-
-
- ${this._renderEventDetailsDate()}
-
-
+ ${this._showCalendarName ?
+ html`
+
+
+ ${this._currentEventDetails.calendarNames.join(', ')}
+
+
` :
+ ''
+ }
+ ${this._showDate ?
+ html`
+
+
+ ${this._renderEventDetailsDate()}
+
+
` :
+ ''
+ }
${this._currentEventDetails.location ?
html`
@@ -680,6 +757,19 @@ export class WeekPlannerCard extends LitElement {
` :
''
}
+ ${this._currentEventDetails.uid ?
+ html`
+
+
+
+
+ ` :
+ ''
+ }
`;
@@ -729,6 +819,139 @@ export class WeekPlannerCard extends LitElement {
`;
}
+ _renderCreateEventDialog() {
+ if (!this._showCreateEventDialog) {
+ return html``;
+ }
+
+ const dayDate = this._showCreateEventDialog.date;
+ const now = DateTime.now();
+ const defaultStart = dayDate.set({
+ hour: now.hour + 1,
+ minute: 0,
+ second: 0,
+ millisecond: 0,
+ });
+ const defaultEnd = defaultStart.plus({ hours: 1 });
+ const startValue = defaultStart.toFormat("yyyy-MM-dd'T'HH:mm");
+ const endValue = defaultEnd.toFormat("yyyy-MM-dd'T'HH:mm");
+
+ return html`
+
+
+
+ `;
+ }
+
+ _renderCreateEventDialogHeading() {
+ return html`
+
+ `;
+ }
+
+ _renderEditEventDialog() {
+ if (!this._showEditEventDialog || !this._editFormData) {
+ return html``;
+ }
+
+ const event = this._showEditEventDialog;
+ const form = this._editFormData;
+
+ return html`
+
+
+
+ `;
+ }
+
+ _renderEditEventDialogHeading() {
+ return html`
+
+ `;
+ }
+
_getLoader() {
const loader = document.createElement('div');
loader.className = 'loader';
@@ -948,7 +1171,9 @@ export class WeekPlannerCard extends LitElement {
calendars: [calendar.entity],
calendarSorting: calendar.sorting,
calendarNames: [calendar.name],
- class: this._getEventClass(startDate, endDate, fullDay, multiDay)
+ class: this._getEventClass(startDate, endDate, fullDay, multiDay),
+ uid: event.uid ?? null,
+ recurrence_id: event.recurrence_id ?? null,
}
this._events[dateKey].push(eventKey);
}
@@ -1184,13 +1409,213 @@ export class WeekPlannerCard extends LitElement {
if (this._actions) {
return;
}
- this._currentEventDetails = event;
+ if (event.uid) {
+ this._editFormData = {
+ title: event.summary || '',
+ calendar: event.calendars[0] || '',
+ start: event.originalStart ? event.originalStart.toFormat("yyyy-MM-dd'T'HH:mm") : '',
+ end: event.originalEnd ? event.originalEnd.toFormat("yyyy-MM-dd'T'HH:mm") : '',
+ };
+ this._showEditEventDialog = event;
+ } else {
+ this._currentEventDetails = event;
+ }
}
_closeDialog() {
this._currentEventDetails = null;
}
+ _handleAddEventClick(e, day) {
+ e.stopImmediatePropagation();
+ this._showCreateEventDialog = { date: day.date };
+ }
+
+ _closeCreateEventDialog() {
+ this._showCreateEventDialog = null;
+ }
+
+ async _handleCreateEvent() {
+ const title = this.shadowRoot.querySelector('#event-title')?.value?.trim();
+ const calendar = this.shadowRoot.querySelector('#event-calendar')?.value;
+ const startInput = this.shadowRoot.querySelector('#event-start')?.value;
+ const endInput = this.shadowRoot.querySelector('#event-end')?.value;
+
+ if (!title) {
+ return;
+ }
+
+ if (!startInput) {
+ return;
+ }
+
+ const start = DateTime.fromISO(startInput);
+ const end = endInput ? DateTime.fromISO(endInput) : start.plus({ hours: 1 });
+
+ try {
+ await this.hass.callService('calendar', 'create_event', {
+ entity_id: calendar,
+ summary: title,
+ start_date_time: start.toFormat('yyyy-MM-dd HH:mm:ss'),
+ end_date_time: end.toFormat('yyyy-MM-dd HH:mm:ss'),
+ });
+
+ this._showCreateEventDialog = null;
+ this._updateEvents();
+ } catch (e) {
+ console.error('Failed to create event:', e);
+ }
+ }
+
+ async _handleDeleteEvent() {
+ const event = this._currentEventDetails;
+ if (!event || !event.uid) {
+ return;
+ }
+
+ try {
+ const wsData = {
+ type: 'calendar/event/delete',
+ entity_id: event.calendars[0],
+ uid: event.uid,
+ };
+ if (event.recurrence_id) {
+ wsData.recurrence_id = event.recurrence_id;
+ wsData.recurrence_range = 'THISANDFUTURE';
+ }
+
+ await this.hass.callWS(wsData);
+ this._currentEventDetails = null;
+ this._updateEvents();
+ } catch (e) {
+ console.error('Failed to delete event:', e);
+ }
+ }
+
+ _handleEditEventClick() {
+ const event = this._currentEventDetails;
+ this._currentEventDetails = null;
+ this._editFormData = {
+ title: event.summary || '',
+ calendar: event.calendars[0] || '',
+ start: event.originalStart ? event.originalStart.toFormat("yyyy-MM-dd'T'HH:mm") : '',
+ end: event.originalEnd ? event.originalEnd.toFormat("yyyy-MM-dd'T'HH:mm") : '',
+ };
+ this._showEditEventDialog = event;
+ }
+
+ _closeEditEventDialog() {
+ this._showEditEventDialog = null;
+ this._editFormData = null;
+ }
+
+ async _handleDeleteEventFromEdit() {
+ const event = this._showEditEventDialog;
+ if (!event || !event.uid) {
+ return;
+ }
+
+ try {
+ const wsData = {
+ type: 'calendar/event/delete',
+ entity_id: event.calendars[0],
+ uid: event.uid,
+ };
+ if (event.recurrence_id) {
+ wsData.recurrence_id = event.recurrence_id;
+ wsData.recurrence_range = 'THISANDFUTURE';
+ }
+
+ await this.hass.callWS(wsData);
+ this._showEditEventDialog = null;
+ this._editFormData = null;
+ this._updateEvents();
+ } catch (e) {
+ console.error('Week Planner: Failed to delete event:', e);
+ }
+ }
+
+ async _handleUpdateEvent() {
+ const event = this._showEditEventDialog;
+ const form = this._editFormData;
+
+ if (!event || !form) {
+ console.error('Week Planner: No event or form data for update');
+ return;
+ }
+
+ const title = form.title?.trim();
+ const calendar = form.calendar;
+ const startInput = form.start;
+ const endInput = form.end;
+
+ if (!title || !startInput) {
+ console.error('Week Planner: Missing required fields', { title, startInput });
+ return;
+ }
+
+ const start = DateTime.fromISO(startInput);
+ const end = endInput ? DateTime.fromISO(endInput) : start.plus({ hours: 1 });
+
+ const entityId = calendar || event.calendars[0];
+
+ try {
+ // Try native update first
+ if (event.uid) {
+ const wsData = {
+ type: 'calendar/event/update',
+ entity_id: entityId,
+ uid: event.uid,
+ event: {
+ summary: title,
+ dtstart: start.toFormat("yyyy-MM-dd'T'HH:mm:ss"),
+ dtend: end.toFormat("yyyy-MM-dd'T'HH:mm:ss"),
+ },
+ };
+ if (event.recurrence_id) {
+ wsData.recurrence_id = event.recurrence_id;
+ wsData.recurrence_range = 'THISANDFUTURE';
+ }
+ await this.hass.callWS(wsData);
+ }
+
+ this._showEditEventDialog = null;
+ this._editFormData = null;
+ this._updateEvents();
+ } catch (e) {
+ // Fallback: delete + recreate if update not supported
+ if (e.code === 'not_supported' && event.uid) {
+ try {
+ const deleteData = {
+ type: 'calendar/event/delete',
+ entity_id: entityId,
+ uid: event.uid,
+ };
+ if (event.recurrence_id) {
+ deleteData.recurrence_id = event.recurrence_id;
+ deleteData.recurrence_range = 'THISANDFUTURE';
+ }
+ await this.hass.callWS(deleteData);
+
+ await this.hass.callService('calendar', 'create_event', {
+ entity_id: entityId,
+ summary: title,
+ start_date_time: start.toFormat('yyyy-MM-dd HH:mm:ss'),
+ end_date_time: end.toFormat('yyyy-MM-dd HH:mm:ss'),
+ });
+
+ this._showEditEventDialog = null;
+ this._editFormData = null;
+ this._updateEvents();
+ } catch (fallbackError) {
+ console.error('Week Planner: Failed to update event (fallback):', fallbackError);
+ }
+ } else {
+ console.error('Week Planner: Failed to update event:', e);
+ }
+ }
+ }
+
_handleLegendClick(calendar) {
if (!this._legendToggle) {
return;
diff --git a/src/card.styles.js b/src/card.styles.js
index ba605ca..84be2cb 100644
--- a/src/card.styles.js
+++ b/src/card.styles.js
@@ -44,7 +44,119 @@ export default css`
--weather-icon-size: 20px;
--weather-temperature-font-size: 0.8em;
}
-
+
+ /* --- Skylight theme --- */
+ ha-card.skylight {
+ --event-border-width: 0px;
+ --event-border-radius: 10px;
+ --event-spacing: 6px;
+ --event-padding: 10px 12px;
+ --events-margin-top: 8px;
+ --day-date-number-font-size: 1.1em;
+ --day-date-text-font-size: 1em;
+ }
+
+ ha-card.compact.skylight {
+ --event-border-radius: 8px;
+ --event-padding: 4px 8px;
+ }
+
+ ha-card.skylight .container .day .date {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ }
+
+ ha-card.skylight .container .day .date .skylight-day-header {
+ display: flex;
+ align-items: baseline;
+ gap: 8px;
+ width: 100%;
+ }
+
+ ha-card.skylight .container .day .date .day-label {
+ font-size: 1.1em;
+ font-weight: 700;
+ }
+
+ ha-card.skylight .container .day .date .add-event-text {
+ font-size: 0.85em;
+ color: var(--secondary-text-color, #888);
+ cursor: pointer;
+ opacity: 0.6;
+ transition: opacity 0.2s;
+ white-space: nowrap;
+ margin-left: auto;
+ }
+
+ ha-card.skylight .container .day .date .add-event-text:hover {
+ opacity: 1;
+ color: var(--primary-color, #03a9f4);
+ }
+
+ ha-card.skylight .container .day .add-event {
+ display: none;
+ }
+
+ ha-card.skylight .container .day .events .event {
+ border-left: none;
+ border-radius: var(--event-border-radius);
+ background-color: color-mix(in srgb, var(--event-bg-tint, #888) 15%, var(--card-background-color, white) 85%);
+ }
+
+ ha-card.skylight .container .day .events .event .additionalColor {
+ display: none;
+ }
+
+ ha-card.skylight .container .day .events .event .calendar-dot {
+ width: 10px;
+ height: 10px;
+ min-width: 10px;
+ border-radius: 50%;
+ background-color: var(--dot-color, var(--divider-color, #888));
+ align-self: center;
+ margin-right: 4px;
+ flex-shrink: 0;
+ }
+
+ ha-card.skylight .container .day .events .none,
+ ha-card.skylight .container .day .events .more {
+ border-radius: var(--event-border-radius);
+ background-color: transparent;
+ }
+
+ .card-header-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+ }
+
+ .card-header-row .card-title {
+ margin: 0;
+ }
+
+ .current-weather {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ cursor: pointer;
+ font-size: var(--weather-temperature-font-size);
+ }
+
+ .current-weather .icon {
+ display: inline-block;
+ vertical-align: middle;
+ background-size: cover;
+ width: var(--weather-icon-size);
+ height: var(--weather-icon-size);
+ }
+
+ .current-weather .icon img {
+ max-width: var(--weather-icon-size);
+ max-height: var(--weather-icon-size);
+ }
+
.errors {
white-space: pre-line;
}
@@ -144,6 +256,8 @@ export default css`
.container .day {
position: relative;
+ display: flex;
+ flex-direction: column;
width: calc((100% - (var(--days-columns) - 1) * var(--days-spacing)) / var(--days-columns));
margin: 0 0 var(--days-spacing) 0;
}
@@ -162,6 +276,34 @@ export default css`
font-size: var(--day-date-text-font-size);
}
+ .container .day.header .date .text {
+ font-size: var(--day-header-font-size, var(--day-date-text-font-size));
+ color: var(--day-header-color, var(--primary-text-color));
+ font-weight: bold;
+ text-transform: capitalize;
+ }
+
+ .container .day .add-event {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ cursor: pointer;
+ opacity: 0.3;
+ transition: opacity 0.2s;
+ color: var(--primary-text-color);
+ --mdc-icon-size: 18px;
+ margin-left: auto;
+ margin-top: auto;
+ padding-top: 4px;
+ }
+
+ .container .day .add-event:hover {
+ opacity: 0.8;
+ }
+
.container .day .weather {
position: absolute;
top: 0;
@@ -288,6 +430,115 @@ export default css`
padding-top: 16px;
}
+ ha-dialog .event-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-top: 16px;
+ padding-top: 16px;
+ border-top: 1px solid var(--divider-color, #e0e0e0);
+ }
+
+ ha-dialog .event-actions .btn {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ padding: 8px 16px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ --mdc-icon-size: 16px;
+ }
+
+ ha-dialog .event-actions .btn-edit {
+ background-color: var(--primary-color, #03a9f4);
+ color: var(--text-primary-color, #fff);
+ }
+
+ ha-dialog .event-actions .btn-delete {
+ background-color: var(--error-color, #db4437);
+ color: #fff;
+ }
+
+ ha-dialog .event-actions .btn:hover {
+ opacity: 0.9;
+ }
+
+ .create-event-form {
+ padding: 8px 0;
+ }
+
+ .create-event-form .form-row {
+ margin-bottom: 12px;
+ }
+
+ .create-event-form .form-row label {
+ display: block;
+ margin-bottom: 4px;
+ font-size: 0.9em;
+ color: var(--secondary-text-color, #aaaaaa);
+ }
+
+ .create-event-form .form-input {
+ width: 100%;
+ padding: 8px;
+ border: 1px solid var(--divider-color, #e0e0e0);
+ border-radius: 4px;
+ background-color: var(--card-background-color, #fff);
+ color: var(--primary-text-color);
+ font-size: 1em;
+ box-sizing: border-box;
+ }
+
+ .create-event-form .form-input:focus {
+ outline: none;
+ border-color: var(--primary-color, #03a9f4);
+ }
+
+ .create-event-form .form-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 8px;
+ margin-top: 16px;
+ }
+
+ .create-event-form .btn {
+ padding: 8px 16px;
+ border: none;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 0.9em;
+ }
+
+ .create-event-form .btn-delete {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ background-color: var(--error-color, #db4437);
+ color: #fff;
+ margin-right: auto;
+ --mdc-icon-size: 16px;
+ }
+
+ .create-event-form .btn-delete:hover {
+ opacity: 0.9;
+ }
+
+ .create-event-form .btn-cancel {
+ background-color: transparent;
+ color: var(--primary-text-color);
+ }
+
+ .create-event-form .btn-submit {
+ background-color: var(--primary-color, #03a9f4);
+ color: var(--text-primary-color, #fff);
+ }
+
+ .create-event-form .btn-submit:hover {
+ opacity: 0.9;
+ }
+
@keyframes loader {
0% {
transform: rotate(0deg);
diff --git a/src/editor.js b/src/editor.js
index 5d812ee..8de6061 100644
--- a/src/editor.js
+++ b/src/editor.js
@@ -142,6 +142,10 @@ export class WeekPlannerCardEditor extends LitElement {
${this.addTextField('filter', 'Filter events (regex)')}
${this.addTextField('filterText', 'Filter event text (regex)')}
${this.addBooleanField('combineSimilarEvents', 'Combine similar events')}
+ ${this.addBooleanField('showDayName', 'Show day name')}
+ ${this.addBooleanField('showDate', 'Show date in event details')}
+ ${this.addBooleanField('showTime', 'Show time')}
+ ${this.addBooleanField('showCalendarName', 'Show calendar name in event details')}
${this.addBooleanField('showTitle', 'Show title in overview', true)}
${this.addBooleanField('showDescription', 'Show description in overview')}
${this.addBooleanField('showLocation', 'Show location in overview')}
@@ -163,6 +167,8 @@ export class WeekPlannerCardEditor extends LitElement {
'Weather',
html`
${this.addEntityPickerField('weather.entity', 'Weather entity', ['weather'])}
+ ${this.addBooleanField('showCurrentWeather', 'Show current weather in header')}
+ ${this.addBooleanField('showWeather', 'Show weather in calendar', true)}
${this.addBooleanField('weather.showCondition', 'Show condition icon')}
${this.addBooleanField('weather.showTemperature', 'Show temperature')}
${this.addBooleanField('weather.showLowTemperature', 'Show low temperature')}
@@ -184,6 +190,15 @@ export class WeekPlannerCardEditor extends LitElement {
${this.addExpansionPanel(
'Appearance',
html`
+ ${this.addSelectField('theme', 'Theme', [
+ {
+ value: 'default',
+ label: 'Default',
+ }, {
+ value: 'skylight',
+ label: 'Skylight',
+ }
+ ], true)}
${this.addBooleanField('noCardBackground', 'No card background')}
${this.addTextField('eventBackground', 'Override events background color')}
${this.addBooleanField('compact', 'Compact mode')}