@telepath-computer/television 0.1.176 → 0.1.178

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,307 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __typeError = (msg) => {
3
+ throw TypeError(msg);
4
+ };
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
11
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
12
+ var _root, _input, _syncing, _TaskCheckboxElement_instances, sync_fn, deriveAccessibleName_fn, _root2, _label, _TaskMetaDueElement_instances, render_fn;
13
+ const RESERVED_EVENT_KEYS = /* @__PURE__ */ new Set([
14
+ "target",
15
+ "currentTarget",
16
+ "eventPhase",
17
+ "defaultPrevented",
18
+ "isTrusted",
19
+ "timeStamp",
20
+ "srcElement",
21
+ "returnValue",
22
+ "cancelBubble",
23
+ "NONE",
24
+ "CAPTURING_PHASE",
25
+ "AT_TARGET",
26
+ "BUBBLING_PHASE",
27
+ "composedPath",
28
+ "stopPropagation",
29
+ "stopImmediatePropagation",
30
+ "preventDefault",
31
+ "initEvent"
32
+ ]);
33
+ function assertNoReservedPayloadKeys(props) {
34
+ for (const key of Object.keys(props)) {
35
+ if (RESERVED_EVENT_KEYS.has(key)) {
36
+ throw new Error(`Event payload key "${key}" is reserved; choose a different property name`);
37
+ }
38
+ }
39
+ }
40
+ function assignPayload(target, props) {
41
+ assertNoReservedPayloadKeys(props);
42
+ for (const key of Object.keys(props)) {
43
+ Object.defineProperty(target, key, {
44
+ value: props[key],
45
+ writable: true,
46
+ enumerable: true,
47
+ configurable: true
48
+ });
49
+ }
50
+ }
51
+ function defineEvent() {
52
+ class DefinedEvent extends Event {
53
+ constructor(type, init) {
54
+ const { type: initType, bubbles, cancelable, composed, ...payload } = init ?? {};
55
+ if (initType !== void 0) {
56
+ throw new Error(`Do not pass "type" in init; use the constructor argument instead`);
57
+ }
58
+ super(type, { bubbles, cancelable, composed });
59
+ assignPayload(this, payload);
60
+ }
61
+ }
62
+ return DefinedEvent;
63
+ }
64
+ const MONTHS = [
65
+ "Jan",
66
+ "Feb",
67
+ "Mar",
68
+ "Apr",
69
+ "May",
70
+ "Jun",
71
+ "Jul",
72
+ "Aug",
73
+ "Sep",
74
+ "Oct",
75
+ "Nov",
76
+ "Dec"
77
+ ];
78
+ function parseLocalDate(dateISO) {
79
+ const [year, month, day] = dateISO.split("-").map(Number);
80
+ return new Date(year, month - 1, day);
81
+ }
82
+ function isValidDueDate(dateISO) {
83
+ return !Number.isNaN(parseLocalDate(dateISO).getTime());
84
+ }
85
+ function startOfLocalDay(now) {
86
+ return new Date(now.getFullYear(), now.getMonth(), now.getDate());
87
+ }
88
+ const HOURS_PER_DAY = 24;
89
+ const MINUTES_PER_HOUR = 60;
90
+ const SECONDS_PER_MINUTE = 60;
91
+ const MS_PER_SECOND = 1e3;
92
+ const MS_PER_DAY = HOURS_PER_DAY * MINUTES_PER_HOUR * SECONDS_PER_MINUTE * MS_PER_SECOND;
93
+ function dayDelta(dateISO, now) {
94
+ const due = parseLocalDate(dateISO);
95
+ const today = startOfLocalDay(now);
96
+ return Math.round((due.getTime() - today.getTime()) / MS_PER_DAY);
97
+ }
98
+ function dueState(dateISO, now) {
99
+ const delta = dayDelta(dateISO, now);
100
+ if (delta === 0) return "today";
101
+ if (delta < 0) return "overdue";
102
+ return "upcoming";
103
+ }
104
+ function formatDue(dateISO, now) {
105
+ const delta = dayDelta(dateISO, now);
106
+ if (delta === 0) return "Today";
107
+ if (delta === 1) return "Tomorrow";
108
+ if (delta === -1) return "Yesterday";
109
+ const due = parseLocalDate(dateISO);
110
+ const label = `${MONTHS[due.getMonth()]} ${due.getDate()}`;
111
+ return due.getFullYear() === now.getFullYear() ? label : `${label}, ${due.getFullYear()}`;
112
+ }
113
+ const ToggleEvent = defineEvent();
114
+ const CHECKBOX_STYLES = `
115
+ :host {
116
+ display: inline-block;
117
+ position: relative;
118
+ width: 16px;
119
+ height: 16px;
120
+ cursor: pointer;
121
+ }
122
+ :host([disabled]) { cursor: default; }
123
+
124
+ input {
125
+ position: absolute;
126
+ inset: 0;
127
+ width: 100%;
128
+ height: 100%;
129
+ margin: 0;
130
+ opacity: 0;
131
+ cursor: inherit;
132
+ }
133
+
134
+ .mark {
135
+ position: absolute;
136
+ inset: 0;
137
+ display: grid;
138
+ place-content: center;
139
+ overflow: hidden;
140
+ border: 1.5px solid var(--color-border);
141
+ border-radius: 9999px;
142
+ pointer-events: none;
143
+ transition:
144
+ border-color 90ms ease-out,
145
+ transform 120ms cubic-bezier(0.2, 1.6, 0.35, 1);
146
+ }
147
+ .mark::before {
148
+ content: "";
149
+ position: absolute;
150
+ inset: -1.5px;
151
+ border-radius: inherit;
152
+ background: var(--color-primary);
153
+ transform: scale(0);
154
+ transition: transform 140ms cubic-bezier(0.22, 1, 0.36, 1);
155
+ }
156
+ .mark::after {
157
+ content: "";
158
+ width: 4px;
159
+ height: 7px;
160
+ border: solid white;
161
+ border-width: 0 1.5px 1.5px 0;
162
+ opacity: 0;
163
+ transform: translateY(-0.5px) rotate(45deg) scale(0.75);
164
+ transition:
165
+ opacity 70ms ease-out 55ms,
166
+ transform 100ms cubic-bezier(0.2, 1.6, 0.35, 1) 55ms;
167
+ z-index: 1;
168
+ }
169
+
170
+ input:checked ~ .mark {
171
+ border-color: var(--color-primary);
172
+ animation: pop 180ms cubic-bezier(0.2, 1.7, 0.35, 1);
173
+ }
174
+ input:checked ~ .mark::before { transform: scale(1); }
175
+ input:checked ~ .mark::after {
176
+ opacity: 1;
177
+ transform: translateY(-0.5px) rotate(45deg) scale(1);
178
+ }
179
+ input:active ~ .mark { transform: scale(0.9); }
180
+ input:focus-visible ~ .mark {
181
+ outline: 2px solid var(--color-focus-ring);
182
+ outline-offset: 2px;
183
+ }
184
+
185
+ @keyframes pop {
186
+ 0% { transform: scale(0.9); }
187
+ 55% { transform: scale(1.12); }
188
+ 100% { transform: scale(1); }
189
+ }
190
+ `;
191
+ class TaskCheckboxElement extends HTMLElement {
192
+ constructor() {
193
+ super();
194
+ __privateAdd(this, _TaskCheckboxElement_instances);
195
+ __privateAdd(this, _root);
196
+ __privateAdd(this, _input);
197
+ __privateAdd(this, _syncing, false);
198
+ __privateSet(this, _root, this.attachShadow({ mode: "open" }));
199
+ __privateGet(this, _root).innerHTML = `<style>${CHECKBOX_STYLES}</style><input type="checkbox" /><span class="mark" aria-hidden="true"></span>`;
200
+ __privateSet(this, _input, __privateGet(this, _root).querySelector("input"));
201
+ __privateGet(this, _input).addEventListener("change", () => {
202
+ if (__privateGet(this, _syncing)) return;
203
+ __privateSet(this, _syncing, true);
204
+ this.toggleAttribute("checked", __privateGet(this, _input).checked);
205
+ __privateSet(this, _syncing, false);
206
+ this.dispatchEvent(
207
+ new ToggleEvent("toggle", { checked: __privateGet(this, _input).checked, bubbles: true })
208
+ );
209
+ });
210
+ }
211
+ // Programmatic state. Reading reflects the host attribute; writing toggles it,
212
+ // which drives #sync() through attributeChangedCallback. The #syncing guard
213
+ // means this never emits a `toggle` event — only user interaction does.
214
+ get checked() {
215
+ return this.hasAttribute("checked");
216
+ }
217
+ set checked(v) {
218
+ this.toggleAttribute("checked", Boolean(v));
219
+ }
220
+ connectedCallback() {
221
+ if (Object.prototype.hasOwnProperty.call(this, "checked")) {
222
+ const value = this.checked;
223
+ delete this.checked;
224
+ this.checked = Boolean(value);
225
+ }
226
+ __privateMethod(this, _TaskCheckboxElement_instances, sync_fn).call(this);
227
+ __privateMethod(this, _TaskCheckboxElement_instances, deriveAccessibleName_fn).call(this);
228
+ }
229
+ attributeChangedCallback() {
230
+ __privateMethod(this, _TaskCheckboxElement_instances, sync_fn).call(this);
231
+ }
232
+ }
233
+ _root = new WeakMap();
234
+ _input = new WeakMap();
235
+ _syncing = new WeakMap();
236
+ _TaskCheckboxElement_instances = new WeakSet();
237
+ // Host attributes → inner input.
238
+ sync_fn = function() {
239
+ if (__privateGet(this, _syncing)) return;
240
+ __privateSet(this, _syncing, true);
241
+ __privateGet(this, _input).checked = this.hasAttribute("checked");
242
+ __privateGet(this, _input).disabled = this.hasAttribute("disabled");
243
+ __privateSet(this, _syncing, false);
244
+ };
245
+ // Accessible name comes from the row's title, not a `label` attribute, so the
246
+ // author never repeats the title text.
247
+ deriveAccessibleName_fn = function() {
248
+ var _a, _b, _c;
249
+ const title = (_c = (_b = (_a = this.closest("tv-task")) == null ? void 0 : _a.querySelector("tv-task-title")) == null ? void 0 : _b.textContent) == null ? void 0 : _c.trim();
250
+ __privateGet(this, _input).setAttribute("aria-label", title ?? "");
251
+ };
252
+ __publicField(TaskCheckboxElement, "observedAttributes", ["checked", "disabled"]);
253
+ if (!customElements.get("tv-task-checkbox")) {
254
+ customElements.define("tv-task-checkbox", TaskCheckboxElement);
255
+ }
256
+ const CALENDAR_ICON = `<tv-icon name="calendar-blank" size="16" aria-hidden="true"></tv-icon>`;
257
+ const DUE_STYLES = `
258
+ :host {
259
+ display: inline-flex;
260
+ align-items: center;
261
+ gap: 4px;
262
+ color: currentColor;
263
+ }
264
+ tv-icon {
265
+ flex: none;
266
+ }
267
+ `;
268
+ class TaskMetaDueElement extends HTMLElement {
269
+ constructor() {
270
+ super();
271
+ __privateAdd(this, _TaskMetaDueElement_instances);
272
+ __privateAdd(this, _root2);
273
+ __privateAdd(this, _label);
274
+ __privateSet(this, _root2, this.attachShadow({ mode: "open" }));
275
+ __privateGet(this, _root2).innerHTML = `<style>${DUE_STYLES}</style>${CALENDAR_ICON}<span class="label"></span>`;
276
+ __privateSet(this, _label, __privateGet(this, _root2).querySelector(".label"));
277
+ }
278
+ connectedCallback() {
279
+ __privateMethod(this, _TaskMetaDueElement_instances, render_fn).call(this);
280
+ }
281
+ attributeChangedCallback() {
282
+ __privateMethod(this, _TaskMetaDueElement_instances, render_fn).call(this);
283
+ }
284
+ }
285
+ _root2 = new WeakMap();
286
+ _label = new WeakMap();
287
+ _TaskMetaDueElement_instances = new WeakSet();
288
+ render_fn = function() {
289
+ const date = this.getAttribute("date");
290
+ if (!date || !isValidDueDate(date)) {
291
+ this.removeAttribute("state");
292
+ __privateGet(this, _label).textContent = date ? "Invalid date" : "";
293
+ return;
294
+ }
295
+ const now = /* @__PURE__ */ new Date();
296
+ this.setAttribute("state", dueState(date, now));
297
+ __privateGet(this, _label).textContent = formatDue(date, now);
298
+ };
299
+ __publicField(TaskMetaDueElement, "observedAttributes", ["date"]);
300
+ if (!customElements.get("tv-task-meta-due")) {
301
+ customElements.define("tv-task-meta-due", TaskMetaDueElement);
302
+ }
303
+ export {
304
+ TaskCheckboxElement,
305
+ TaskMetaDueElement,
306
+ ToggleEvent
307
+ };