kempo-ui 0.4.7 → 0.4.9

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.
package/AGENTS.md CHANGED
@@ -96,6 +96,30 @@ Do not prefix identifiers with underscores.
96
96
  - Use clear, descriptive names without prefixes.
97
97
  - When true privacy is needed inside classes, prefer native JavaScript private fields (e.g., `#myField`) instead of simulated privacy via underscores.
98
98
 
99
+ ## Template and File Structure Rules
100
+
101
+ ### Follow Templates Exactly
102
+ When using templates (task templates, component scaffolds, etc.), follow them **exactly as written**. Do not:
103
+ - Add placeholder text or instructions to sections marked "leave blank"
104
+ - Deviate from the template structure
105
+ - Make creative changes or improvements to the template format
106
+ - Add commentary or helper text beyond what is explicitly requested
107
+
108
+ ### Task Validation Result Sections - Critical Rules
109
+ Task files have two validation sections that follow specific timing rules:
110
+
111
+ **LLM Validation Results** (fill during step 6: task-validate)
112
+ - **Leave blank** during task-create and task-prepare skills
113
+ - **Fill in completely** during task-validate skill with:
114
+ - Subheading for each acceptance criterion tested
115
+ - Subheading for each testing plan item
116
+ - Pass/fail status with supporting evidence/screenshots
117
+ - At least one screenshot for visual changes
118
+
119
+ **User Validation Results** (optionally filled by user during step 7)
120
+ - **Always leave completely blank** — the user may optionally add notes here if they have additional information beyond what was documented in LLM Validation Results
121
+ - Never add placeholder text, never auto-fill this section
122
+
99
123
  ## Development Workflow
100
124
 
101
125
  ### Local Development Server
package/CHANGELOG.md ADDED
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.4.9] - 2026-05-01
10
+ ### Changed
11
+ - **Timestamp component**: Enhanced documentation with comprehensive list of supported date/time input formats
12
+ - Supports EPOCH milliseconds, ISO 8601 (full, date-only, with/without timezone), RFC 2822, JavaScript date strings, US date format, and named month formats
13
+ - Added interactive examples and important notes about browser compatibility and timezone handling
14
+ - Updated llms.txt component reference with full format information
15
+
16
+ ## [0.4.3] - 2026-04-30
17
+ ### Added
18
+ - Initial CHANGELOG entry. All prior work is condensed into this log entry.
19
+
20
+ [0.4.3]: https://github.com/dustinpoissant/kempo-ui/releases/tag/v0.4.3
@@ -1 +1 @@
1
- import{html as t}from"../lit-all.min.js";import e from"./ShadowComponent.js";import s from"../utils/formatTimestamp.js";export default class m extends e{static properties={timestamp:{type:Number,reflect:!0},format:{type:String,reflect:!0},locale:{type:String,reflect:!0}};constructor(){super(),this.timestamp=0,this.format="",this.locale=""}render(){const e=this.timestamp?s(this.timestamp,this.format,this.locale||navigator.language):"";return t`<span>${e}</span>`}}window.customElements.define("k-timestamp",m);
1
+ import{html as t}from"../lit-all.min.js";import e from"./ShadowComponent.js";import s from"../utils/formatTimestamp.js";export default class i extends e{static properties={timestamp:{type:String,reflect:!0},format:{type:String,reflect:!0},locale:{type:String,reflect:!0}};constructor(){super(),this.timestamp="",this.format="",this.locale=""}render(){const e=this.timestamp?s(this.timestamp,this.format,this.locale||navigator.language):"";return t`<span>${e}</span>`}}window.customElements.define("k-timestamp",i);
@@ -1 +1 @@
1
- export default(e,i,t)=>{const s=new Date(parseInt(e));if(i){const e=(e,i)=>("000"+e).slice(-1*i),t={YYYY:s.getFullYear(),YY:String(s.getFullYear()).slice(-2),MM:e(s.getMonth()+1,2),M:s.getMonth()+1,DD:e(s.getDate(),2),D:s.getDate(),hh:e(s.getHours(),2),h:s.getHours(),mm:e(s.getMinutes(),2),m:s.getMinutes(),ss:e(s.getSeconds(),2),s:s.getSeconds(),iiii:e(s.getMilliseconds(),3),iii:e(s.getMilliseconds(),3),ii:e(s.getMilliseconds(),2),i:s.getMilliseconds()};return i.replace(/YYYY|YY|MM|M|DD|D|hh|h|mm|m|ss|s|iiii|iii|ii|i/g,e=>t[e])}return s.toLocaleString(t||Intl.DateTimeFormat().resolvedOptions().locale)};
1
+ export default(e,i,t)=>{const s=isNaN(e)?Date.parse(e):parseInt(e),l=new Date(s);if(i){const e=(e,i)=>("000"+e).slice(-1*i),t={YYYY:l.getFullYear(),YY:String(l.getFullYear()).slice(-2),MM:e(l.getMonth()+1,2),M:l.getMonth()+1,DD:e(l.getDate(),2),D:l.getDate(),hh:e(l.getHours(),2),h:l.getHours(),mm:e(l.getMinutes(),2),m:l.getMinutes(),ss:e(l.getSeconds(),2),s:l.getSeconds(),iiii:e(l.getMilliseconds(),3),iii:e(l.getMilliseconds(),3),ii:e(l.getMilliseconds(),2),i:l.getMilliseconds()};return i.replace(/YYYY|YY|MM|M|DD|D|hh|h|mm|m|ss|s|iiii|iii|ii|i/g,e=>t[e])}return l.toLocaleString(t||Intl.DateTimeFormat().resolvedOptions().locale)};
@@ -495,6 +495,7 @@
495
495
  <ul>
496
496
  <li><a href="#timeFormat">Time Format</a></li>
497
497
  </ul>
498
+ <a href="#supportedFormats">Supported Input Formats</a><br />
498
499
 
499
500
  <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
500
501
  <a href="#constructor">Constructor</a><br />
@@ -562,6 +563,98 @@
562
563
 
563
564
 
564
565
 
566
+ <h3 id="supportedFormats"><a href="#supportedFormats" class="no-link">Supported Input Formats</a></h3>
567
+ <p>The <code>Timestamp</code> component accepts various date/time input formats. The component uses JavaScript's <code>Date.parse()</code> for parsing, which supports multiple standard formats:</p>
568
+
569
+ <div class="table-wrapper mb">
570
+ <table>
571
+ <thead>
572
+ <tr>
573
+ <th>Format Type</th>
574
+ <th>Example</th>
575
+ <th>Notes</th>
576
+ </tr>
577
+ </thead>
578
+ <tbody>
579
+ <tr>
580
+ <td>EPOCH Milliseconds</td>
581
+ <td><code>1633024800000</code></td>
582
+ <td>Number value representing milliseconds since January 1, 1970</td>
583
+ </tr>
584
+ <tr>
585
+ <td>ISO 8601 (Full)</td>
586
+ <td><code>2021-10-01T00:00:00Z</code></td>
587
+ <td>Includes date, time, and UTC timezone indicator</td>
588
+ </tr>
589
+ <tr>
590
+ <td>ISO 8601 (Date Only)</td>
591
+ <td><code>2021-10-01</code></td>
592
+ <td>Date portion only; time assumed to be midnight in UTC</td>
593
+ </tr>
594
+ <tr>
595
+ <td>ISO 8601 (With Timezone)</td>
596
+ <td><code>2021-10-01T00:00:00+00:00</code></td>
597
+ <td>Includes timezone offset; can use +/- with hours and minutes</td>
598
+ </tr>
599
+ <tr>
600
+ <td>ISO 8601 (No Timezone)</td>
601
+ <td><code>2021-10-01T00:00:00</code></td>
602
+ <td>Interpreted as local time</td>
603
+ </tr>
604
+ <tr>
605
+ <td>RFC 2822</td>
606
+ <td><code>Fri, 01 Oct 2021 00:00:00 GMT</code></td>
607
+ <td>Email date format with day of week and timezone</td>
608
+ </tr>
609
+ <tr>
610
+ <td>JavaScript Date String</td>
611
+ <td><code>Fri Oct 01 2021 00:00:00 GMT+0000</code></td>
612
+ <td>Output format from JavaScript's <code>Date.toString()</code></td>
613
+ </tr>
614
+ <tr>
615
+ <td>US Date Format</td>
616
+ <td><code>10/01/2021</code></td>
617
+ <td>MM/DD/YYYY format; ambiguous with international formats</td>
618
+ </tr>
619
+ <tr>
620
+ <td>ISO Date String</td>
621
+ <td><code>2021-10-01 00:00:00</code></td>
622
+ <td>YYYY-MM-DD HH:MM:SS format</td>
623
+ </tr>
624
+ <tr>
625
+ <td>Named Month Format</td>
626
+ <td><code>October 1, 2021</code></td>
627
+ <td>Month name followed by day and year</td>
628
+ </tr>
629
+ </tbody>
630
+ </table>
631
+ </div>
632
+
633
+ <h5>Format Examples</h5>
634
+ <div class="row -mx mb">
635
+ <div class="col d-span-6 m-span-12 px">
636
+ <k-card label="ISO 8601">
637
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-timestamp</span> <span class="hljs-attr">timestamp</span>=<span class="hljs-string">"2021-10-01T00:00:00Z"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-timestamp</span>&gt;</span></code></pre>
638
+ <p class="mt">Result:</p>
639
+ <k-timestamp timestamp="2021-10-01T00:00:00Z"></k-timestamp>
640
+ </k-card>
641
+ </div>
642
+ <div class="col d-span-6 m-span-12 px">
643
+ <k-card label="Named Month Format">
644
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-timestamp</span> <span class="hljs-attr">timestamp</span>=<span class="hljs-string">"October 1, 2021"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-timestamp</span>&gt;</span></code></pre>
645
+ <p class="mt">Result:</p>
646
+ <k-timestamp timestamp="October 1, 2021"></k-timestamp>
647
+ </k-card>
648
+ </div>
649
+ </div>
650
+
651
+ <h5>Important Notes</h5>
652
+ <ul>
653
+ <li><strong>Browser Compatibility:</strong> Some formats may be parsed differently across browsers. ISO 8601 formats are the most reliable.</li>
654
+ <li><strong>Timezone Handling:</strong> Formats without explicit timezone information are interpreted as local time. ISO 8601 with <code>Z</code> or timezone offset are interpreted as absolute times.</li>
655
+ <li><strong>Format String Ambiguity:</strong> Ambiguous formats like <code>10/01/2021</code> may be interpreted differently depending on browser locale settings.</li>
656
+ </ul>
657
+
565
658
  <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
566
659
 
567
660
  <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
@@ -574,8 +667,8 @@
574
667
  </ul>
575
668
 
576
669
  <h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
577
- <h5><code>timestamp<i>: number</i></code></h5>
578
- <p>The timestamp to be formatted and displayed. Syncs to <code>timestamp</code> attribute.</p>
670
+ <h5><code>timestamp<i>: string | number</i></code></h5>
671
+ <p>The timestamp to be formatted and displayed. Accepts EPOCH milliseconds (number), ISO 8601 formats, RFC 2822 formats, or other JavaScript-parseable date strings. See <a href="#supportedFormats">Supported Input Formats</a> for details. Syncs to <code>timestamp</code> attribute.</p>
579
672
  <h5><code>format<i>: string</i></code></h5>
580
673
  <p>The format to be used for formatting the timestamp using tokens like YYYY, MM, DD, hh, mm, ss. If not provided,
581
674
  uses the default format. Syncs to <code>format</code> attribute.</p>
@@ -1 +1 @@
1
- import{html as t}from"../lit-all.min.js";import e from"./ShadowComponent.js";import s from"../utils/formatTimestamp.js";export default class m extends e{static properties={timestamp:{type:Number,reflect:!0},format:{type:String,reflect:!0},locale:{type:String,reflect:!0}};constructor(){super(),this.timestamp=0,this.format="",this.locale=""}render(){const e=this.timestamp?s(this.timestamp,this.format,this.locale||navigator.language):"";return t`<span>${e}</span>`}}window.customElements.define("k-timestamp",m);
1
+ import{html as t}from"../lit-all.min.js";import e from"./ShadowComponent.js";import s from"../utils/formatTimestamp.js";export default class i extends e{static properties={timestamp:{type:String,reflect:!0},format:{type:String,reflect:!0},locale:{type:String,reflect:!0}};constructor(){super(),this.timestamp="",this.format="",this.locale=""}render(){const e=this.timestamp?s(this.timestamp,this.format,this.locale||navigator.language):"";return t`<span>${e}</span>`}}window.customElements.define("k-timestamp",i);
@@ -1 +1 @@
1
- export default(e,i,t)=>{const s=new Date(parseInt(e));if(i){const e=(e,i)=>("000"+e).slice(-1*i),t={YYYY:s.getFullYear(),YY:String(s.getFullYear()).slice(-2),MM:e(s.getMonth()+1,2),M:s.getMonth()+1,DD:e(s.getDate(),2),D:s.getDate(),hh:e(s.getHours(),2),h:s.getHours(),mm:e(s.getMinutes(),2),m:s.getMinutes(),ss:e(s.getSeconds(),2),s:s.getSeconds(),iiii:e(s.getMilliseconds(),3),iii:e(s.getMilliseconds(),3),ii:e(s.getMilliseconds(),2),i:s.getMilliseconds()};return i.replace(/YYYY|YY|MM|M|DD|D|hh|h|mm|m|ss|s|iiii|iii|ii|i/g,e=>t[e])}return s.toLocaleString(t||Intl.DateTimeFormat().resolvedOptions().locale)};
1
+ export default(e,i,t)=>{const s=isNaN(e)?Date.parse(e):parseInt(e),l=new Date(s);if(i){const e=(e,i)=>("000"+e).slice(-1*i),t={YYYY:l.getFullYear(),YY:String(l.getFullYear()).slice(-2),MM:e(l.getMonth()+1,2),M:l.getMonth()+1,DD:e(l.getDate(),2),D:l.getDate(),hh:e(l.getHours(),2),h:l.getHours(),mm:e(l.getMinutes(),2),m:l.getMinutes(),ss:e(l.getSeconds(),2),s:l.getSeconds(),iiii:e(l.getMilliseconds(),3),iii:e(l.getMilliseconds(),3),ii:e(l.getMilliseconds(),2),i:l.getMilliseconds()};return i.replace(/YYYY|YY|MM|M|DD|D|hh|h|mm|m|ss|s|iiii|iii|ii|i/g,e=>t[e])}return l.toLocaleString(t||Intl.DateTimeFormat().resolvedOptions().locale)};
@@ -10,6 +10,7 @@
10
10
  <ul>
11
11
  <li><a href="#timeFormat">Time Format</a></li>
12
12
  </ul>
13
+ <a href="#supportedFormats">Supported Input Formats</a><br />
13
14
 
14
15
  <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
15
16
  <a href="#constructor">Constructor</a><br />
@@ -77,6 +78,98 @@
77
78
 
78
79
 
79
80
 
81
+ <h3 id="supportedFormats"><a href="#supportedFormats" class="no-link">Supported Input Formats</a></h3>
82
+ <p>The <code>Timestamp</code> component accepts various date/time input formats. The component uses JavaScript's <code>Date.parse()</code> for parsing, which supports multiple standard formats:</p>
83
+
84
+ <div class="table-wrapper mb">
85
+ <table>
86
+ <thead>
87
+ <tr>
88
+ <th>Format Type</th>
89
+ <th>Example</th>
90
+ <th>Notes</th>
91
+ </tr>
92
+ </thead>
93
+ <tbody>
94
+ <tr>
95
+ <td>EPOCH Milliseconds</td>
96
+ <td><code>1633024800000</code></td>
97
+ <td>Number value representing milliseconds since January 1, 1970</td>
98
+ </tr>
99
+ <tr>
100
+ <td>ISO 8601 (Full)</td>
101
+ <td><code>2021-10-01T00:00:00Z</code></td>
102
+ <td>Includes date, time, and UTC timezone indicator</td>
103
+ </tr>
104
+ <tr>
105
+ <td>ISO 8601 (Date Only)</td>
106
+ <td><code>2021-10-01</code></td>
107
+ <td>Date portion only; time assumed to be midnight in UTC</td>
108
+ </tr>
109
+ <tr>
110
+ <td>ISO 8601 (With Timezone)</td>
111
+ <td><code>2021-10-01T00:00:00+00:00</code></td>
112
+ <td>Includes timezone offset; can use +/- with hours and minutes</td>
113
+ </tr>
114
+ <tr>
115
+ <td>ISO 8601 (No Timezone)</td>
116
+ <td><code>2021-10-01T00:00:00</code></td>
117
+ <td>Interpreted as local time</td>
118
+ </tr>
119
+ <tr>
120
+ <td>RFC 2822</td>
121
+ <td><code>Fri, 01 Oct 2021 00:00:00 GMT</code></td>
122
+ <td>Email date format with day of week and timezone</td>
123
+ </tr>
124
+ <tr>
125
+ <td>JavaScript Date String</td>
126
+ <td><code>Fri Oct 01 2021 00:00:00 GMT+0000</code></td>
127
+ <td>Output format from JavaScript's <code>Date.toString()</code></td>
128
+ </tr>
129
+ <tr>
130
+ <td>US Date Format</td>
131
+ <td><code>10/01/2021</code></td>
132
+ <td>MM/DD/YYYY format; ambiguous with international formats</td>
133
+ </tr>
134
+ <tr>
135
+ <td>ISO Date String</td>
136
+ <td><code>2021-10-01 00:00:00</code></td>
137
+ <td>YYYY-MM-DD HH:MM:SS format</td>
138
+ </tr>
139
+ <tr>
140
+ <td>Named Month Format</td>
141
+ <td><code>October 1, 2021</code></td>
142
+ <td>Month name followed by day and year</td>
143
+ </tr>
144
+ </tbody>
145
+ </table>
146
+ </div>
147
+
148
+ <h5>Format Examples</h5>
149
+ <div class="row -mx mb">
150
+ <div class="col d-span-6 m-span-12 px">
151
+ <k-card label="ISO 8601">
152
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-timestamp</span> <span class="hljs-attr">timestamp</span>=<span class="hljs-string">"2021-10-01T00:00:00Z"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-timestamp</span>&gt;</span></code></pre>
153
+ <p class="mt">Result:</p>
154
+ <k-timestamp timestamp="2021-10-01T00:00:00Z"></k-timestamp>
155
+ </k-card>
156
+ </div>
157
+ <div class="col d-span-6 m-span-12 px">
158
+ <k-card label="Named Month Format">
159
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-timestamp</span> <span class="hljs-attr">timestamp</span>=<span class="hljs-string">"October 1, 2021"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-timestamp</span>&gt;</span></code></pre>
160
+ <p class="mt">Result:</p>
161
+ <k-timestamp timestamp="October 1, 2021"></k-timestamp>
162
+ </k-card>
163
+ </div>
164
+ </div>
165
+
166
+ <h5>Important Notes</h5>
167
+ <ul>
168
+ <li><strong>Browser Compatibility:</strong> Some formats may be parsed differently across browsers. ISO 8601 formats are the most reliable.</li>
169
+ <li><strong>Timezone Handling:</strong> Formats without explicit timezone information are interpreted as local time. ISO 8601 with <code>Z</code> or timezone offset are interpreted as absolute times.</li>
170
+ <li><strong>Format String Ambiguity:</strong> Ambiguous formats like <code>10/01/2021</code> may be interpreted differently depending on browser locale settings.</li>
171
+ </ul>
172
+
80
173
  <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
81
174
 
82
175
  <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
@@ -89,8 +182,8 @@
89
182
  </ul>
90
183
 
91
184
  <h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
92
- <h5><code>timestamp<i>: number</i></code></h5>
93
- <p>The timestamp to be formatted and displayed. Syncs to <code>timestamp</code> attribute.</p>
185
+ <h5><code>timestamp<i>: string | number</i></code></h5>
186
+ <p>The timestamp to be formatted and displayed. Accepts EPOCH milliseconds (number), ISO 8601 formats, RFC 2822 formats, or other JavaScript-parseable date strings. See <a href="#supportedFormats">Supported Input Formats</a> for details. Syncs to <code>timestamp</code> attribute.</p>
94
187
  <h5><code>format<i>: string</i></code></h5>
95
188
  <p>The format to be used for formatting the timestamp using tokens like YYYY, MM, DD, hh, mm, ss. If not provided,
96
189
  uses the default format. Syncs to <code>format</code> attribute.</p>
package/llms.txt CHANGED
@@ -89,7 +89,7 @@ import { html, css, LitElement } from 'kempo-ui/src/lit-all.min.js';
89
89
  | `<k-theme-select>` | `ThemeSelect.js` | Dropdown to pick a theme | [theme-select.html](https://dustinpoissant.github.io/kempo-ui/components/theme-select.html) |
90
90
  | `<k-theme-switcher>` | `ThemeSwitcher.js` | Theme switcher with segmented and toggle display modes | [theme-switcher.html](https://dustinpoissant.github.io/kempo-ui/components/theme-switcher.html) |
91
91
  | `<k-time>` | `Time.js` | Wraps native `<input type="time">` with segmented hour/minute/AM-PM editing; `value` is 24-hour `HH:MM`; `increment` attr sets minute step (arrow-key granularity); `military` attr forces 24-hour display via `lang="en-GB"`; form-associated; fires `change` | [time.html](https://dustinpoissant.github.io/kempo-ui/components/time.html) |
92
- | `<k-timestamp>` | `Timestamp.js` | Displays a `value` timestamp as human-readable relative time | [timestamp.html](https://dustinpoissant.github.io/kempo-ui/components/timestamp.html) |
92
+ | `<k-timestamp>` | `Timestamp.js` | Displays a formatted timestamp; accepts EPOCH milliseconds, ISO 8601, RFC 2822, and other JavaScript-parseable date formats; `value`/`format`/`locale` attributes | [timestamp.html](https://dustinpoissant.github.io/kempo-ui/components/timestamp.html) |
93
93
  | `<k-toast>` `<k-toast-container>` | `Toast.js` | Toast notifications; use `<k-toast-container>` once in page, call `.addToast(options)` | [toast.html](https://dustinpoissant.github.io/kempo-ui/components/toast.html) |
94
94
  | `<k-toggle>` | `Toggle.js` | On/off toggle; `value` (Boolean, reflects); methods: `on()`, `off()`, `toggle()`; fires `change`, `on`, `off` | [toggle.html](https://dustinpoissant.github.io/kempo-ui/components/toggle.html) |
95
95
  | `<k-tree>` `<k-tree-node>` | `Tree.js` | Expandable tree; nodes have `label`, `icon`, `href`, `expanded` | [tree.html](https://dustinpoissant.github.io/kempo-ui/components/tree.html) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kempo-ui",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "type": "module",
5
5
  "description": "A Lit based web-component library",
6
6
  "main": "index.js",
@@ -4,14 +4,14 @@ import formatTimestamp from '../utils/formatTimestamp.js';
4
4
 
5
5
  export default class Timestamp extends ShadowComponent {
6
6
  static properties = {
7
- timestamp: { type: Number, reflect: true },
7
+ timestamp: { type: String, reflect: true },
8
8
  format: { type: String, reflect: true },
9
9
  locale: { type: String, reflect: true }
10
10
  };
11
11
 
12
12
  constructor() {
13
13
  super();
14
- this.timestamp = 0;
14
+ this.timestamp = '';
15
15
  this.format = '';
16
16
  this.locale = '';
17
17
  }
@@ -20,7 +20,7 @@ export default class Timestamp extends ShadowComponent {
20
20
  Rendering Logic
21
21
  */
22
22
  render() {
23
- const formattedTime = this.timestamp
23
+ const formattedTime = this.timestamp
24
24
  ? formatTimestamp(this.timestamp, this.format, this.locale || navigator.language)
25
25
  : '';
26
26
 
@@ -1,5 +1,6 @@
1
1
  export default (timestamp, format, forceLocale) => {
2
- const date = new Date(parseInt(timestamp));
2
+ const ms = isNaN(timestamp) ? Date.parse(timestamp) : parseInt(timestamp);
3
+ const date = new Date(ms);
3
4
  if (format) {
4
5
  const pad = (num, size) => ('000' + num).slice(size * -1);
5
6
  const tokens = {
@@ -0,0 +1,39 @@
1
+ # {Task Number} - {Task Description }
2
+
3
+ ## Status: {Planning | Ready | Blocked | In Progress | Testing | Complete | Released}
4
+
5
+ ## Dependency
6
+ {What other task needs to be completed first before this task can be started, prefer markdown links}
7
+
8
+ ## References
9
+ {What other tasks or resources should the developer/LLM be aware of before starting this task, prefer markdown links}
10
+
11
+ ## Current State
12
+ {How does this feature currently work}
13
+
14
+ ## Aceptance Criteria
15
+ {How does it need to work to consider this task a success}
16
+
17
+ ### In-Scope
18
+ {What are some examples of repos/files/ect that can be changed to do this task}
19
+
20
+ ### Out of Scope
21
+ {What are some examples of repos/files/ect that should not be changed to do this task, if we find a need to, create a new task (in this repo, or that repo)}
22
+
23
+ ## Task Details
24
+ {What steps need to happen to complete this task}
25
+
26
+ ## Testing / Validation Plan
27
+ {How should this task be tested/validated, make sure all of the acceptance criteria is covered by the test plan}
28
+
29
+ ### Testing / Validation Results
30
+
31
+ #### LLM Validation Results
32
+ **IMPORTANT: DO NOT fill this in during task-create or task-prepare.** This section is filled in during the "task-validate" skill (which is linked from the "task-complete" skill step 6). Include:
33
+ - Subheadings for each acceptance criterion that was validated
34
+ - Subheadings for each item in the testing plan
35
+ - Pass/fail status and details for each item
36
+ - Screenshots or evidence showing validation passed
37
+
38
+ #### User Validation Results
39
+ **IMPORTANT: Always leave this section completely blank.** The user may optionally add notes here during the "task-complete" skill step 7 of task-complete if they have additional validation information beyond what the LLM documented in the LLM Validation Results section.