@aquera/nile-elements 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +11 -0
  2. package/demo/nxtgen-dark.css +2 -2
  3. package/dist/{index-ccff99d6.esm.js → index-0fe57384.esm.js} +1 -1
  4. package/dist/index-f6944844.cjs.js +2 -0
  5. package/dist/{index-e43755f5.cjs.js.map → index-f6944844.cjs.js.map} +1 -1
  6. package/dist/index.cjs.js +1 -1
  7. package/dist/index.esm.js +1 -1
  8. package/dist/index.js +1127 -741
  9. package/dist/nile-code-editor/extensionSetup.cjs.js +1 -1
  10. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  11. package/dist/nile-code-editor/index.cjs.js +1 -1
  12. package/dist/nile-code-editor/index.esm.js +1 -1
  13. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  14. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  15. package/dist/nile-code-editor/nile-code-editor.css.cjs.js +1 -1
  16. package/dist/nile-code-editor/nile-code-editor.css.cjs.js.map +1 -1
  17. package/dist/nile-code-editor/nile-code-editor.css.esm.js +2 -2
  18. package/dist/nile-code-editor/nile-code-editor.esm.js +4 -4
  19. package/dist/nile-code-editor/theme.cjs.js +1 -1
  20. package/dist/nile-code-editor/theme.cjs.js.map +1 -1
  21. package/dist/nile-code-editor/theme.esm.js +1 -1
  22. package/dist/nile-combobox/nile-combobox.css.cjs.js +1 -1
  23. package/dist/nile-combobox/nile-combobox.css.cjs.js.map +1 -1
  24. package/dist/nile-combobox/nile-combobox.css.esm.js +1 -1
  25. package/dist/nile-detail/nile-detail.css.cjs.js +1 -1
  26. package/dist/nile-detail/nile-detail.css.cjs.js.map +1 -1
  27. package/dist/nile-detail/nile-detail.css.esm.js +1 -1
  28. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.cjs.js +1 -1
  29. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.cjs.js.map +1 -1
  30. package/dist/nile-side-bar-footer/nile-side-bar-footer.css.esm.js +3 -3
  31. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.cjs.js +1 -1
  32. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.cjs.js.map +1 -1
  33. package/dist/nile-side-bar-footer-item/nile-side-bar-footer-item.css.esm.js +13 -7
  34. package/dist/nile-timestamp-builder/index.cjs.js +2 -0
  35. package/dist/nile-timestamp-builder/index.cjs.js.map +1 -0
  36. package/dist/nile-timestamp-builder/index.esm.js +1 -0
  37. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.cjs.js +2 -0
  38. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.cjs.js.map +1 -0
  39. package/dist/nile-timestamp-builder/nile-timestamp-builder-utils.esm.js +1 -0
  40. package/dist/nile-timestamp-builder/nile-timestamp-builder.cjs.js +2 -0
  41. package/dist/nile-timestamp-builder/nile-timestamp-builder.cjs.js.map +1 -0
  42. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.cjs.js +2 -0
  43. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.cjs.js.map +1 -0
  44. package/dist/nile-timestamp-builder/nile-timestamp-builder.css.esm.js +195 -0
  45. package/dist/nile-timestamp-builder/nile-timestamp-builder.esm.js +154 -0
  46. package/dist/nile-timestamp-builder/timezones.cjs.js +2 -0
  47. package/dist/nile-timestamp-builder/timezones.cjs.js.map +1 -0
  48. package/dist/nile-timestamp-builder/timezones.esm.js +1 -0
  49. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js +1 -1
  50. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.cjs.js.map +1 -1
  51. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js +1 -1
  52. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.cjs.js.map +1 -1
  53. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.css.esm.js +91 -58
  54. package/dist/nile-wysiwyg-editor/nile-wysiwyg-editor.esm.js +1 -1
  55. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js +1 -1
  56. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.cjs.js.map +1 -1
  57. package/dist/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.esm.js +19 -19
  58. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js +1 -1
  59. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.cjs.js.map +1 -1
  60. package/dist/nile-wysiwyg-editor/ui/bookmark-panel.esm.js +14 -14
  61. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js +1 -1
  62. package/dist/nile-wysiwyg-editor/ui/bubble-menu.cjs.js.map +1 -1
  63. package/dist/nile-wysiwyg-editor/ui/bubble-menu.esm.js +13 -13
  64. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js +1 -1
  65. package/dist/nile-wysiwyg-editor/ui/code-block-menu.cjs.js.map +1 -1
  66. package/dist/nile-wysiwyg-editor/ui/code-block-menu.esm.js +12 -12
  67. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js +1 -1
  68. package/dist/nile-wysiwyg-editor/ui/embed-menu.cjs.js.map +1 -1
  69. package/dist/nile-wysiwyg-editor/ui/embed-menu.esm.js +10 -10
  70. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js +1 -1
  71. package/dist/nile-wysiwyg-editor/ui/embed-panel.cjs.js.map +1 -1
  72. package/dist/nile-wysiwyg-editor/ui/embed-panel.esm.js +4 -4
  73. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js +1 -1
  74. package/dist/nile-wysiwyg-editor/ui/emoji-picker.cjs.js.map +1 -1
  75. package/dist/nile-wysiwyg-editor/ui/emoji-picker.esm.js +11 -11
  76. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js +1 -1
  77. package/dist/nile-wysiwyg-editor/ui/find-replace.cjs.js.map +1 -1
  78. package/dist/nile-wysiwyg-editor/ui/find-replace.esm.js +9 -9
  79. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js +1 -1
  80. package/dist/nile-wysiwyg-editor/ui/image-menu.cjs.js.map +1 -1
  81. package/dist/nile-wysiwyg-editor/ui/image-menu.esm.js +11 -11
  82. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js +1 -1
  83. package/dist/nile-wysiwyg-editor/ui/image-panel.cjs.js.map +1 -1
  84. package/dist/nile-wysiwyg-editor/ui/image-panel.esm.js +6 -6
  85. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js +1 -1
  86. package/dist/nile-wysiwyg-editor/ui/insert-menu.cjs.js.map +1 -1
  87. package/dist/nile-wysiwyg-editor/ui/insert-menu.esm.js +14 -14
  88. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js +1 -1
  89. package/dist/nile-wysiwyg-editor/ui/link-editor.cjs.js.map +1 -1
  90. package/dist/nile-wysiwyg-editor/ui/link-editor.esm.js +16 -16
  91. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js +1 -1
  92. package/dist/nile-wysiwyg-editor/ui/markdown-panel.cjs.js.map +1 -1
  93. package/dist/nile-wysiwyg-editor/ui/markdown-panel.esm.js +8 -8
  94. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js +1 -1
  95. package/dist/nile-wysiwyg-editor/ui/math-panel.cjs.js.map +1 -1
  96. package/dist/nile-wysiwyg-editor/ui/math-panel.esm.js +4 -4
  97. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js +1 -1
  98. package/dist/nile-wysiwyg-editor/ui/shortcut-help.cjs.js.map +1 -1
  99. package/dist/nile-wysiwyg-editor/ui/shortcut-help.esm.js +16 -16
  100. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js +1 -1
  101. package/dist/nile-wysiwyg-editor/ui/source-view.cjs.js.map +1 -1
  102. package/dist/nile-wysiwyg-editor/ui/source-view.esm.js +29 -29
  103. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js +1 -1
  104. package/dist/nile-wysiwyg-editor/ui/special-chars.cjs.js.map +1 -1
  105. package/dist/nile-wysiwyg-editor/ui/special-chars.esm.js +8 -8
  106. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js +1 -1
  107. package/dist/nile-wysiwyg-editor/ui/suggest-list.cjs.js.map +1 -1
  108. package/dist/nile-wysiwyg-editor/ui/suggest-list.esm.js +9 -9
  109. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js +1 -1
  110. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.cjs.js.map +1 -1
  111. package/dist/nile-wysiwyg-editor/ui/table-grid-picker.esm.js +23 -23
  112. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js +1 -1
  113. package/dist/nile-wysiwyg-editor/ui/table-menu.cjs.js.map +1 -1
  114. package/dist/nile-wysiwyg-editor/ui/table-menu.esm.js +7 -7
  115. package/dist/src/index.d.ts +1 -0
  116. package/dist/src/index.js +1 -0
  117. package/dist/src/index.js.map +1 -1
  118. package/dist/src/nile-code-editor/nile-code-editor.css.js +2 -2
  119. package/dist/src/nile-code-editor/nile-code-editor.css.js.map +1 -1
  120. package/dist/src/nile-code-editor/nile-code-editor.d.ts +15 -0
  121. package/dist/src/nile-code-editor/nile-code-editor.js +65 -6
  122. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  123. package/dist/src/nile-code-editor/theme.d.ts +6 -117
  124. package/dist/src/nile-code-editor/theme.js +100 -147
  125. package/dist/src/nile-code-editor/theme.js.map +1 -1
  126. package/dist/src/nile-combobox/nile-combobox.css.js +1 -1
  127. package/dist/src/nile-combobox/nile-combobox.css.js.map +1 -1
  128. package/dist/src/nile-detail/nile-detail.css.js +1 -1
  129. package/dist/src/nile-detail/nile-detail.css.js.map +1 -1
  130. package/dist/src/nile-side-bar-footer/nile-side-bar-footer.css.js +3 -3
  131. package/dist/src/nile-side-bar-footer/nile-side-bar-footer.css.js.map +1 -1
  132. package/dist/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.js +11 -5
  133. package/dist/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.js.map +1 -1
  134. package/dist/src/nile-timestamp-builder/index.d.ts +1 -0
  135. package/dist/src/nile-timestamp-builder/index.js +2 -0
  136. package/dist/src/nile-timestamp-builder/index.js.map +1 -0
  137. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.d.ts +54 -0
  138. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.js +254 -0
  139. package/dist/src/nile-timestamp-builder/nile-timestamp-builder-utils.js.map +1 -0
  140. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.d.ts +7 -0
  141. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.js +203 -0
  142. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.css.js.map +1 -0
  143. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.d.ts +94 -0
  144. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.js +578 -0
  145. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.js.map +1 -0
  146. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.d.ts +1 -0
  147. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.js +890 -0
  148. package/dist/src/nile-timestamp-builder/nile-timestamp-builder.test.js.map +1 -0
  149. package/dist/src/nile-timestamp-builder/timezones.d.ts +8 -0
  150. package/dist/src/nile-timestamp-builder/timezones.js +357 -0
  151. package/dist/src/nile-timestamp-builder/timezones.js.map +1 -0
  152. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js +91 -58
  153. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.js.map +1 -1
  154. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.d.ts +2 -1
  155. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js +23 -1
  156. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-editor.js.map +1 -1
  157. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js +19 -19
  158. package/dist/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.js.map +1 -1
  159. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js +10 -10
  160. package/dist/src/nile-wysiwyg-editor/ui/bookmark-panel.js.map +1 -1
  161. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js +7 -7
  162. package/dist/src/nile-wysiwyg-editor/ui/bubble-menu.js.map +1 -1
  163. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js +5 -5
  164. package/dist/src/nile-wysiwyg-editor/ui/code-block-menu.js.map +1 -1
  165. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js +6 -6
  166. package/dist/src/nile-wysiwyg-editor/ui/embed-menu.js.map +1 -1
  167. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js +4 -4
  168. package/dist/src/nile-wysiwyg-editor/ui/embed-panel.js.map +1 -1
  169. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js +6 -6
  170. package/dist/src/nile-wysiwyg-editor/ui/emoji-picker.js.map +1 -1
  171. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js +7 -7
  172. package/dist/src/nile-wysiwyg-editor/ui/find-replace.js.map +1 -1
  173. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js +6 -6
  174. package/dist/src/nile-wysiwyg-editor/ui/image-menu.js.map +1 -1
  175. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js +6 -6
  176. package/dist/src/nile-wysiwyg-editor/ui/image-panel.js.map +1 -1
  177. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js +7 -7
  178. package/dist/src/nile-wysiwyg-editor/ui/insert-menu.js.map +1 -1
  179. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js +9 -9
  180. package/dist/src/nile-wysiwyg-editor/ui/link-editor.js.map +1 -1
  181. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js +8 -8
  182. package/dist/src/nile-wysiwyg-editor/ui/markdown-panel.js.map +1 -1
  183. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js +4 -4
  184. package/dist/src/nile-wysiwyg-editor/ui/math-panel.js.map +1 -1
  185. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js +9 -9
  186. package/dist/src/nile-wysiwyg-editor/ui/shortcut-help.js.map +1 -1
  187. package/dist/src/nile-wysiwyg-editor/ui/source-view.js +24 -24
  188. package/dist/src/nile-wysiwyg-editor/ui/source-view.js.map +1 -1
  189. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js +4 -4
  190. package/dist/src/nile-wysiwyg-editor/ui/special-chars.js.map +1 -1
  191. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js +7 -7
  192. package/dist/src/nile-wysiwyg-editor/ui/suggest-list.js.map +1 -1
  193. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js +16 -16
  194. package/dist/src/nile-wysiwyg-editor/ui/table-grid-picker.js.map +1 -1
  195. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js +4 -4
  196. package/dist/src/nile-wysiwyg-editor/ui/table-menu.js.map +1 -1
  197. package/dist/src/version.js +2 -2
  198. package/dist/src/version.js.map +1 -1
  199. package/dist/tsconfig.tsbuildinfo +1 -1
  200. package/package.json +1 -1
  201. package/src/index.ts +1 -0
  202. package/src/nile-code-editor/nile-code-editor.css.ts +2 -2
  203. package/src/nile-code-editor/nile-code-editor.ts +68 -5
  204. package/src/nile-code-editor/theme.ts +129 -162
  205. package/src/nile-combobox/nile-combobox.css.ts +1 -1
  206. package/src/nile-detail/nile-detail.css.ts +1 -1
  207. package/src/nile-side-bar-footer/nile-side-bar-footer.css.ts +3 -3
  208. package/src/nile-side-bar-footer-item/nile-side-bar-footer-item.css.ts +11 -5
  209. package/src/nile-timestamp-builder/index.ts +1 -0
  210. package/src/nile-timestamp-builder/nile-timestamp-builder-utils.ts +321 -0
  211. package/src/nile-timestamp-builder/nile-timestamp-builder.css.ts +204 -0
  212. package/src/nile-timestamp-builder/nile-timestamp-builder.test.ts +1089 -0
  213. package/src/nile-timestamp-builder/nile-timestamp-builder.ts +625 -0
  214. package/src/nile-timestamp-builder/timezones.ts +356 -0
  215. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.css.ts +91 -58
  216. package/src/nile-wysiwyg-editor/nile-wysiwyg-editor.ts +21 -1
  217. package/src/nile-wysiwyg-editor/nile-wysiwyg-toolbar/nile-wysiwyg-toolbar.css.ts +19 -19
  218. package/src/nile-wysiwyg-editor/ui/bookmark-panel.ts +10 -10
  219. package/src/nile-wysiwyg-editor/ui/bubble-menu.ts +7 -7
  220. package/src/nile-wysiwyg-editor/ui/code-block-menu.ts +5 -5
  221. package/src/nile-wysiwyg-editor/ui/embed-menu.ts +6 -6
  222. package/src/nile-wysiwyg-editor/ui/embed-panel.ts +4 -4
  223. package/src/nile-wysiwyg-editor/ui/emoji-picker.ts +6 -6
  224. package/src/nile-wysiwyg-editor/ui/find-replace.ts +7 -7
  225. package/src/nile-wysiwyg-editor/ui/image-menu.ts +6 -6
  226. package/src/nile-wysiwyg-editor/ui/image-panel.ts +6 -6
  227. package/src/nile-wysiwyg-editor/ui/insert-menu.ts +7 -7
  228. package/src/nile-wysiwyg-editor/ui/link-editor.ts +9 -9
  229. package/src/nile-wysiwyg-editor/ui/markdown-panel.ts +8 -8
  230. package/src/nile-wysiwyg-editor/ui/math-panel.ts +4 -4
  231. package/src/nile-wysiwyg-editor/ui/shortcut-help.ts +9 -9
  232. package/src/nile-wysiwyg-editor/ui/source-view.ts +24 -24
  233. package/src/nile-wysiwyg-editor/ui/special-chars.ts +4 -4
  234. package/src/nile-wysiwyg-editor/ui/suggest-list.ts +7 -7
  235. package/src/nile-wysiwyg-editor/ui/table-grid-picker.ts +16 -16
  236. package/src/nile-wysiwyg-editor/ui/table-menu.ts +4 -4
  237. package/vscode-html-custom-data.json +94 -2
  238. package/dist/index-e43755f5.cjs.js +0 -2
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Copyright Aquera Inc 2026
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+ var NileTimestampBuilder_1;
8
+ import { __decorate } from "tslib";
9
+ import { html, nothing } from 'lit';
10
+ import { customElement, property, query, state } from 'lit/decorators.js';
11
+ import { classMap } from 'lit/directives/class-map.js';
12
+ import { styles } from './nile-timestamp-builder.css';
13
+ import NileElement from '../internal/nile-element';
14
+ import { FormControlController } from '../internal/form';
15
+ import { defaultValue } from '../internal/default-value';
16
+ import { EPOCH_WALLCLOCK, TimestampField, clampWallClock, daysInMonth, epochToFields, fieldsToEpoch, formatWallClock, formatZonedValue, getLocalTimeZone, getTimezoneList, isValidTimeZone, normalizeValueInput, parseZonedValue, } from './nile-timestamp-builder-utils';
17
+ /**
18
+ * @event nile-init - Emitted when the component is added to the DOM.
19
+ * @event nile-destroy - Emitted when the component is removed from the DOM.
20
+ * @event nile-change - Emitted when the value is committed.
21
+ * @event nile-input - Emitted as fields change, before the value is committed.
22
+ * @event nile-expand - Emitted when the editor opens.
23
+ * @event nile-collapse - Emitted when the editor closes.
24
+ * @event nile-copy - Emitted after the value is written to the clipboard.
25
+ * @event nile-copy-error - Emitted when the clipboard write is refused.
26
+ */
27
+ let NileTimestampBuilder = NileTimestampBuilder_1 = class NileTimestampBuilder extends NileElement {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.formControlController = null;
31
+ this.internalValueUpdate = false;
32
+ this.internalTimezoneUpdate = false;
33
+ this._value = null;
34
+ this.defaultValue = null;
35
+ this.timezone = getLocalTimeZone();
36
+ this.name = '';
37
+ this.disabled = false;
38
+ this.required = false;
39
+ this.readonly = false;
40
+ this.copyable = false;
41
+ this.form = '';
42
+ this.open = false;
43
+ this.label = '';
44
+ this.minYear = 1;
45
+ this.maxYear = 9999;
46
+ this.wallClock = EPOCH_WALLCLOCK;
47
+ this.timezoneList = [];
48
+ this.hasValue = false;
49
+ this.justCopied = false;
50
+ this.handleSetNow = () => {
51
+ if (this.disabled || this.readonly)
52
+ return;
53
+ const now = Date.now();
54
+ this.wallClock = epochToFields(now, this.timezone);
55
+ this.commit();
56
+ };
57
+ /** Copies the canonical zoned value */
58
+ this.handleCopy = async () => {
59
+ if (this.disabled || !this.hasValue)
60
+ return;
61
+ const text = formatZonedValue(this.wallClock, this.timezone);
62
+ try {
63
+ await navigator.clipboard.writeText(text);
64
+ }
65
+ catch {
66
+ this.emit('nile-copy-error', { value: text });
67
+ return;
68
+ }
69
+ this.justCopied = true;
70
+ window.clearTimeout(this.copiedTimer);
71
+ this.copiedTimer = window.setTimeout(() => {
72
+ this.justCopied = false;
73
+ }, NileTimestampBuilder_1.COPIED_FEEDBACK_MS);
74
+ this.emit('nile-copy', { value: text });
75
+ };
76
+ this.handleStageNow = () => {
77
+ if (this.disabled || this.readonly)
78
+ return;
79
+ const now = Date.now();
80
+ this.wallClock = epochToFields(now, this.timezone);
81
+ this.emit('nile-input', this.liveDetail());
82
+ };
83
+ this.handleUseLocalTz = () => {
84
+ if (this.disabled || this.readonly)
85
+ return;
86
+ this.internalTimezoneUpdate = true;
87
+ this.timezone = getLocalTimeZone();
88
+ this.emit('nile-input', this.liveDetail());
89
+ };
90
+ this.handleUseUtc = () => {
91
+ if (this.disabled || this.readonly)
92
+ return;
93
+ this.internalTimezoneUpdate = true;
94
+ this.timezone = 'UTC';
95
+ this.emit('nile-input', this.liveDetail());
96
+ };
97
+ this.lastTapAt = 0;
98
+ this.copiedTimer = 0;
99
+ this.handleDisplayDoubleClick = () => {
100
+ this.handleEdit();
101
+ };
102
+ this.handleDisplayPointerUp = (event) => {
103
+ if (event.pointerType === 'mouse')
104
+ return;
105
+ const now = Date.now();
106
+ if (now - this.lastTapAt <= NileTimestampBuilder_1.DOUBLE_TAP_MS) {
107
+ this.lastTapAt = 0;
108
+ this.handleEdit();
109
+ return;
110
+ }
111
+ this.lastTapAt = now;
112
+ };
113
+ /** Keyboard equivalent of the double-click/double-tap edit affordance. */
114
+ this.handleDisplayKeyDown = (event) => {
115
+ if (event.key !== 'Enter' && event.key !== ' ')
116
+ return;
117
+ event.preventDefault();
118
+ this.handleEdit();
119
+ };
120
+ this.handleEdit = () => {
121
+ if (this.disabled || this.readonly || this.open)
122
+ return;
123
+ if (this.value === null) {
124
+ this.wallClock = epochToFields(Date.now(), this.timezone);
125
+ }
126
+ this.open = true;
127
+ this.emit('nile-expand', { open: true });
128
+ };
129
+ this.handleDone = () => {
130
+ this.open = false;
131
+ this.commit();
132
+ this.emit('nile-collapse', { open: false });
133
+ };
134
+ }
135
+ static get styles() {
136
+ return [styles];
137
+ }
138
+ get value() {
139
+ return this._value;
140
+ }
141
+ set value(input) {
142
+ if (typeof input === 'string') {
143
+ const zoned = parseZonedValue(input);
144
+ if (zoned && isValidTimeZone(zoned.timezone)) {
145
+ this.timezone = zoned.timezone;
146
+ }
147
+ }
148
+ const oldValue = this._value;
149
+ const next = normalizeValueInput(input);
150
+ if (next?.getTime() === oldValue?.getTime()) {
151
+ this.internalValueUpdate = false;
152
+ return;
153
+ }
154
+ this._value = next;
155
+ this.requestUpdate('value', oldValue);
156
+ }
157
+ get validity() {
158
+ return this.valueInput?.validity;
159
+ }
160
+ get validationMessage() {
161
+ return this.valueInput?.validationMessage ?? '';
162
+ }
163
+ connectedCallback() {
164
+ super.connectedCallback();
165
+ this.timezoneList = getTimezoneList();
166
+ if (!isValidTimeZone(this.timezone)) {
167
+ this.timezone = getLocalTimeZone();
168
+ }
169
+ if (this.value !== null) {
170
+ this.wallClock = epochToFields(this.value.getTime(), this.timezone);
171
+ this.hasValue = true;
172
+ }
173
+ else {
174
+ this.wallClock = epochToFields(Date.now(), this.timezone);
175
+ this.hasValue = false;
176
+ }
177
+ this.formControlController = new FormControlController(this, {
178
+ assumeInteractionOn: ['nile-change'],
179
+ value: input => {
180
+ const el = input;
181
+ return el.value === null ? undefined : (el.valueString() ?? undefined);
182
+ },
183
+ defaultValue: input => input.defaultValue,
184
+ setValue: (input, val) => {
185
+ input.value = val;
186
+ },
187
+ });
188
+ this.emit('nile-init');
189
+ }
190
+ disconnectedCallback() {
191
+ super.disconnectedCallback();
192
+ window.clearTimeout(this.copiedTimer);
193
+ this.emit('nile-destroy');
194
+ }
195
+ willUpdate(changedProperties) {
196
+ if (changedProperties.has('value')) {
197
+ if (this.internalValueUpdate) {
198
+ this.internalValueUpdate = false;
199
+ }
200
+ else {
201
+ if (this.value === null) {
202
+ this.hasValue = false;
203
+ }
204
+ else {
205
+ this.wallClock = epochToFields(this.value.getTime(), this.timezone);
206
+ this.hasValue = true;
207
+ }
208
+ }
209
+ }
210
+ else if (this.isTimezoneReassigned(changedProperties) && !this.open) {
211
+ this.syncValueToTimezone();
212
+ }
213
+ }
214
+ updated(changedProperties) {
215
+ if (this.isTimezoneReassigned(changedProperties)) {
216
+ if (this.internalTimezoneUpdate) {
217
+ this.internalTimezoneUpdate = false;
218
+ }
219
+ else {
220
+ this.emit('nile-input', this.liveDetail());
221
+ }
222
+ }
223
+ }
224
+ isTimezoneReassigned(changedProperties) {
225
+ return (changedProperties.has('timezone') &&
226
+ changedProperties.get('timezone') !== undefined);
227
+ }
228
+ syncValueToTimezone() {
229
+ if (!this.hasValue || this.value === null)
230
+ return;
231
+ const epoch = fieldsToEpoch(this.wallClock, this.timezone);
232
+ if (Number.isNaN(epoch) || epoch === this.value.getTime())
233
+ return;
234
+ this.internalValueUpdate = true;
235
+ this.value = new Date(epoch);
236
+ this.syncHiddenInput();
237
+ }
238
+ valueString() {
239
+ return this.value === null ? null : this.value.toISOString();
240
+ }
241
+ syncHiddenInput() {
242
+ if (this.valueInput) {
243
+ this.valueInput.value = this.valueString() ?? '';
244
+ }
245
+ this.formControlController?.updateValidity();
246
+ }
247
+ changeDetail() {
248
+ if (this.value === null) {
249
+ return {
250
+ value: null,
251
+ localTimezoneValue: null,
252
+ unix: null,
253
+ timezone: this.timezone,
254
+ };
255
+ }
256
+ const epoch = this.value.getTime();
257
+ return {
258
+ value: formatZonedValue(this.wallClock, this.timezone),
259
+ localTimezoneValue: new Date(epoch),
260
+ // Unix time (epoch milliseconds, matching Date.getTime()).
261
+ unix: epoch,
262
+ timezone: this.timezone,
263
+ };
264
+ }
265
+ liveDetail() {
266
+ const epoch = fieldsToEpoch(this.wallClock, this.timezone);
267
+ if (Number.isNaN(epoch)) {
268
+ return {
269
+ value: null,
270
+ localTimezoneValue: null,
271
+ unix: null,
272
+ timezone: this.timezone,
273
+ };
274
+ }
275
+ return {
276
+ value: formatZonedValue(this.wallClock, this.timezone),
277
+ localTimezoneValue: new Date(epoch),
278
+ // Unix time (epoch milliseconds, matching Date.getTime()).
279
+ unix: epoch,
280
+ timezone: this.timezone,
281
+ };
282
+ }
283
+ commit() {
284
+ const epoch = fieldsToEpoch(this.wallClock, this.timezone);
285
+ this.internalValueUpdate = true;
286
+ this.value = new Date(epoch);
287
+ this.hasValue = true;
288
+ this.syncHiddenInput();
289
+ this.emit('nile-change', this.changeDetail());
290
+ }
291
+ onFieldChange(field) {
292
+ return (event) => {
293
+ event.stopPropagation();
294
+ const raw = Number(event.detail?.value);
295
+ const next = clampWallClock({ ...this.wallClock, [field]: raw }, this.minYear, this.maxYear);
296
+ this.wallClock = next;
297
+ this.emit('nile-input', this.liveDetail());
298
+ };
299
+ }
300
+ onTimezoneChange(event) {
301
+ event.stopPropagation();
302
+ const next = event.detail?.value;
303
+ if (typeof next === 'string' && isValidTimeZone(next)) {
304
+ this.internalTimezoneUpdate = true;
305
+ this.timezone = next;
306
+ this.emit('nile-input', this.liveDetail());
307
+ }
308
+ }
309
+ checkValidity() {
310
+ return this.valueInput?.checkValidity() ?? true;
311
+ }
312
+ reportValidity() {
313
+ return this.valueInput?.reportValidity() ?? true;
314
+ }
315
+ setCustomValidity(message) {
316
+ this.valueInput?.setCustomValidity(message);
317
+ this.formControlController?.updateValidity();
318
+ }
319
+ getForm() {
320
+ return this.formControlController?.getForm() ?? null;
321
+ }
322
+ renderField(field, fieldLabel, val, min, max) {
323
+ return html `
324
+ <div class="tsb__field" part="field">
325
+ <nile-input
326
+ type="number"
327
+ exportparts="base:field__base, input:field__input"
328
+ size="medium"
329
+ label=${fieldLabel}
330
+ ?disabled=${this.disabled}
331
+ ?readonly=${this.readonly}
332
+ min=${min}
333
+ max=${max}
334
+ step="1"
335
+ .value=${String(val)}
336
+ @nile-change=${this.onFieldChange(field)}
337
+ ></nile-input>
338
+ </div>
339
+ `;
340
+ }
341
+ renderCollapsed() {
342
+ const wc = this.wallClock;
343
+ const editable = !this.disabled && !this.readonly;
344
+ return html `
345
+ <div class="tsb__collapsed" part="display">
346
+ <div
347
+ class=${classMap({
348
+ tsb__display: true,
349
+ 'tsb__display--editable': editable,
350
+ })}
351
+ part="display-content"
352
+ role=${editable ? 'button' : nothing}
353
+ tabindex=${this.disabled ? nothing : '0'}
354
+ aria-labelledby=${this.label ? 'tsb-label tsb-display-value' : nothing}
355
+ aria-readonly=${this.readonly ? 'true' : nothing}
356
+ @dblclick=${this.handleDisplayDoubleClick}
357
+ @pointerup=${this.handleDisplayPointerUp}
358
+ @keydown=${this.handleDisplayKeyDown}
359
+ >
360
+ <span
361
+ id="tsb-display-value"
362
+ class=${classMap({
363
+ tsb__value: true,
364
+ 'tsb__value--empty': !this.hasValue,
365
+ })}
366
+ part="value"
367
+ >
368
+ ${this.hasValue ? formatWallClock(wc) : 'No timestamp set'}
369
+ </span>
370
+ <span class="tsb__tz" part="timezone-label">${this.timezone}</span>
371
+ </div>
372
+ ${editable ? this.renderEditActions() : nothing}
373
+ ${this.copyable && this.readonly && !this.disabled
374
+ ? this.renderCopyAction()
375
+ : nothing}
376
+ </div>
377
+ `;
378
+ }
379
+ renderEditActions() {
380
+ return html `
381
+ <div class="tsb__actions" part="actions">
382
+ <nile-button
383
+ variant="secondary-grey"
384
+ ?disabled=${this.disabled}
385
+ @click=${this.handleSetNow}
386
+ >Now</nile-button
387
+ >
388
+ <nile-button
389
+ variant="primary"
390
+ title="Edit"
391
+ ?disabled=${this.disabled}
392
+ @click=${this.handleEdit}
393
+ ><nile-glyph
394
+ name="ng-pencil"
395
+ size="16"
396
+ method="stroke"
397
+ color="currentColor"
398
+ ></nile-glyph
399
+ ></nile-button
400
+ >
401
+ </div>
402
+ `;
403
+ }
404
+ renderCopyAction() {
405
+ return html `
406
+ <div class="tsb__actions" part="actions">
407
+ <nile-button
408
+ variant="ghost"
409
+ title=${this.justCopied ? 'Copied' : 'Copy timestamp'}
410
+ aria-label=${this.justCopied ? 'Copied' : 'Copy timestamp'}
411
+ ?disabled=${!this.hasValue}
412
+ @click=${this.handleCopy}
413
+ ><nile-glyph
414
+ name=${this.justCopied ? 'ng-copy-check' : 'ng-copy'}
415
+ size="16"
416
+ method="stroke"
417
+ color="currentColor"
418
+ ></nile-glyph
419
+ ></nile-button>
420
+ </div>
421
+ `;
422
+ }
423
+ renderExpanded() {
424
+ const wc = this.wallClock;
425
+ const maxDay = daysInMonth(wc.year, wc.month);
426
+ return html `
427
+ <div class="tsb__expanded" part="editor">
428
+ <div class="tsb__fields" part="fields">
429
+ ${this.renderField(TimestampField.Year, 'Year', wc.year, this.minYear, this.maxYear)}
430
+ ${this.renderField(TimestampField.Month, 'Month', wc.month, 1, 12)}
431
+ ${this.renderField(TimestampField.Day, 'Day', wc.day, 1, maxDay)}
432
+ ${this.renderField(TimestampField.Hour, 'Hour', wc.hour, 0, 23)}
433
+ ${this.renderField(TimestampField.Minute, 'Minute', wc.minute, 0, 59)}
434
+ ${this.renderField(TimestampField.Second, 'Second', wc.second, 0, 59)}
435
+ ${this.renderField(TimestampField.Millisecond, 'Milliseconds', wc.millisecond, 0, 999)}
436
+ </div>
437
+
438
+ <div class="tsb__timezone" part="timezone-select">
439
+ <nile-select
440
+ searchEnabled
441
+ label="Timezone"
442
+ size="medium"
443
+ ?disabled=${this.disabled}
444
+ .value=${this.timezone}
445
+ @nile-change=${this.onTimezoneChange}
446
+ >
447
+ ${this.timezoneList.map(tz => html `<nile-option value=${tz}>${tz}</nile-option>`)}
448
+ </nile-select>
449
+ </div>
450
+
451
+ <div class="tsb__actions" part="editor-actions">
452
+ <nile-button
453
+ variant="secondary-grey"
454
+ ?disabled=${this.disabled}
455
+ @click=${this.handleStageNow}
456
+ >Set to Now</nile-button
457
+ >
458
+ <nile-button
459
+ variant="secondary-grey"
460
+ ?disabled=${this.disabled}
461
+ @click=${this.handleUseLocalTz}
462
+ >Use Local Timezone</nile-button
463
+ >
464
+ <nile-button
465
+ variant="secondary-grey"
466
+ ?disabled=${this.disabled}
467
+ @click=${this.handleUseUtc}
468
+ >Use UTC</nile-button
469
+ >
470
+ <nile-button
471
+ variant="primary"
472
+ ?disabled=${this.disabled}
473
+ @click=${this.handleDone}
474
+ >Done</nile-button
475
+ >
476
+ </div>
477
+ </div>
478
+ `;
479
+ }
480
+ render() {
481
+ return html `
482
+ <div
483
+ class="tsb"
484
+ part="base"
485
+ role="group"
486
+ aria-labelledby=${this.label ? 'tsb-label' : nothing}
487
+ >
488
+ ${this.label
489
+ ? html `<label id="tsb-label" class="tsb__label" part="label"
490
+ >${this.label}</label
491
+ >`
492
+ : ''}
493
+ ${this.open && !this.readonly
494
+ ? this.renderExpanded()
495
+ : this.renderCollapsed()}
496
+
497
+ <input
498
+ class="value-input"
499
+ type="text"
500
+ ?required=${this.required}
501
+ ?disabled=${this.disabled}
502
+ .value=${this.valueString() ?? ''}
503
+ tabindex="-1"
504
+ aria-hidden="true"
505
+ />
506
+ </div>
507
+ `;
508
+ }
509
+ };
510
+ /** Touch input has no reliable `dblclick`, so double-taps are timed by hand. */
511
+ NileTimestampBuilder.DOUBLE_TAP_MS = 300;
512
+ NileTimestampBuilder.COPIED_FEEDBACK_MS = 1600;
513
+ __decorate([
514
+ query('.value-input')
515
+ ], NileTimestampBuilder.prototype, "valueInput", void 0);
516
+ __decorate([
517
+ property({
518
+ attribute: 'value',
519
+ converter: {
520
+ fromAttribute: (value) => value,
521
+ toAttribute: (value) => value === null ? null : value.toISOString(),
522
+ },
523
+ })
524
+ ], NileTimestampBuilder.prototype, "value", null);
525
+ __decorate([
526
+ defaultValue()
527
+ ], NileTimestampBuilder.prototype, "defaultValue", void 0);
528
+ __decorate([
529
+ property({ type: String, reflect: true })
530
+ ], NileTimestampBuilder.prototype, "timezone", void 0);
531
+ __decorate([
532
+ property({ type: String, reflect: true })
533
+ ], NileTimestampBuilder.prototype, "name", void 0);
534
+ __decorate([
535
+ property({ type: Boolean, reflect: true })
536
+ ], NileTimestampBuilder.prototype, "disabled", void 0);
537
+ __decorate([
538
+ property({ type: Boolean, reflect: true })
539
+ ], NileTimestampBuilder.prototype, "required", void 0);
540
+ __decorate([
541
+ property({ type: Boolean, reflect: true })
542
+ ], NileTimestampBuilder.prototype, "readonly", void 0);
543
+ __decorate([
544
+ property({ type: Boolean, reflect: true })
545
+ ], NileTimestampBuilder.prototype, "copyable", void 0);
546
+ __decorate([
547
+ property({ type: String, reflect: true })
548
+ ], NileTimestampBuilder.prototype, "form", void 0);
549
+ __decorate([
550
+ property({ type: Boolean, reflect: true })
551
+ ], NileTimestampBuilder.prototype, "open", void 0);
552
+ __decorate([
553
+ property({ type: String, reflect: true })
554
+ ], NileTimestampBuilder.prototype, "label", void 0);
555
+ __decorate([
556
+ property({ attribute: true, type: Number, reflect: true })
557
+ ], NileTimestampBuilder.prototype, "minYear", void 0);
558
+ __decorate([
559
+ property({ attribute: true, type: Number, reflect: true })
560
+ ], NileTimestampBuilder.prototype, "maxYear", void 0);
561
+ __decorate([
562
+ state()
563
+ ], NileTimestampBuilder.prototype, "wallClock", void 0);
564
+ __decorate([
565
+ state()
566
+ ], NileTimestampBuilder.prototype, "timezoneList", void 0);
567
+ __decorate([
568
+ state()
569
+ ], NileTimestampBuilder.prototype, "hasValue", void 0);
570
+ __decorate([
571
+ state()
572
+ ], NileTimestampBuilder.prototype, "justCopied", void 0);
573
+ NileTimestampBuilder = NileTimestampBuilder_1 = __decorate([
574
+ customElement('nile-timestamp-builder')
575
+ ], NileTimestampBuilder);
576
+ export { NileTimestampBuilder };
577
+ export default NileTimestampBuilder;
578
+ //# sourceMappingURL=nile-timestamp-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nile-timestamp-builder.js","sourceRoot":"","sources":["../../../src/nile-timestamp-builder/nile-timestamp-builder.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2026\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styles } from './nile-timestamp-builder.css';\nimport NileElement from '../internal/nile-element';\nimport type { CSSResultGroup, PropertyValues } from 'lit';\nimport type { NileFormControl } from '../internal/nile-element';\nimport { FormControlController } from '../internal/form';\nimport { defaultValue } from '../internal/default-value';\nimport {\n EPOCH_WALLCLOCK,\n TimestampField,\n WallClock,\n clampWallClock,\n daysInMonth,\n epochToFields,\n fieldsToEpoch,\n formatWallClock,\n formatZonedValue,\n getLocalTimeZone,\n getTimezoneList,\n isValidTimeZone,\n normalizeValueInput,\n parseZonedValue,\n} from './nile-timestamp-builder-utils';\n\n/**\n * @event nile-init - Emitted when the component is added to the DOM.\n * @event nile-destroy - Emitted when the component is removed from the DOM.\n * @event nile-change - Emitted when the value is committed.\n * @event nile-input - Emitted as fields change, before the value is committed.\n * @event nile-expand - Emitted when the editor opens.\n * @event nile-collapse - Emitted when the editor closes.\n * @event nile-copy - Emitted after the value is written to the clipboard.\n * @event nile-copy-error - Emitted when the clipboard write is refused.\n */\n@customElement('nile-timestamp-builder')\nexport class NileTimestampBuilder\n extends NileElement\n implements NileFormControl\n {\n static get styles(): CSSResultGroup {\n return [styles];\n }\n\n private formControlController: FormControlController | null = null;\n private internalValueUpdate = false;\n private internalTimezoneUpdate = false;\n @query('.value-input') valueInput!: HTMLInputElement;private _value: Date | null = null;\n @property({\n attribute: 'value',\n converter: {\n fromAttribute: (value: string | null) => value,\n toAttribute: (value: Date | null) =>\n value === null ? null : value.toISOString(),\n },\n })\n get value(): Date | null {\n return this._value;\n }\n\n set value(input: Date | number | string | null) {\n if (typeof input === 'string') {\n const zoned = parseZonedValue(input);\n if (zoned && isValidTimeZone(zoned.timezone)) {\n this.timezone = zoned.timezone;\n }\n }\n const oldValue = this._value;\n const next = normalizeValueInput(input);\n if (next?.getTime() === oldValue?.getTime()) {\n this.internalValueUpdate = false;\n return;\n }\n this._value = next;\n this.requestUpdate('value', oldValue);\n }\n\n @defaultValue() defaultValue: Date | null = null;\n @property({ type: String, reflect: true }) timezone: string =\n getLocalTimeZone();\n @property({ type: String, reflect: true }) name = '';\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) required = false;\n @property({ type: Boolean, reflect: true }) readonly = false;\n @property({ type: Boolean, reflect: true }) copyable = false;\n @property({ type: String, reflect: true }) form = '';\n @property({ type: Boolean, reflect: true }) open = false;\n @property({ type: String, reflect: true }) label = '';\n @property({ attribute: true, type: Number, reflect: true }) minYear = 1;\n @property({ attribute: true, type: Number, reflect: true }) maxYear = 9999;\n @state() wallClock: WallClock = EPOCH_WALLCLOCK;\n @state() timezoneList: string[] = [];\n @state() hasValue = false;\n @state() justCopied = false;\n\n get validity(): ValidityState {\n return this.valueInput?.validity;\n }\n\n get validationMessage(): string {\n return this.valueInput?.validationMessage ?? '';\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.timezoneList = getTimezoneList();\n\n if (!isValidTimeZone(this.timezone)) {\n this.timezone = getLocalTimeZone();\n }\n\n if (this.value !== null) {\n this.wallClock = epochToFields(this.value.getTime(), this.timezone);\n this.hasValue = true;\n } else {\n this.wallClock = epochToFields(Date.now(), this.timezone);\n this.hasValue = false;\n }\n\n this.formControlController = new FormControlController(this, {\n assumeInteractionOn: ['nile-change'],\n value: input => {\n const el = input as NileTimestampBuilder;\n return el.value === null ? undefined : (el.valueString() ?? undefined);\n },\n defaultValue: input => (input as NileTimestampBuilder).defaultValue,\n setValue: (input, val) => {\n (input as NileTimestampBuilder).value = val as string | null;\n },\n });\n\n this.emit('nile-init');\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.clearTimeout(this.copiedTimer);\n this.emit('nile-destroy');\n }\n\n protected willUpdate(changedProperties: PropertyValues): void {\n if (changedProperties.has('value')) {\n if (this.internalValueUpdate) {\n this.internalValueUpdate = false;\n } else {\n if (this.value === null) {\n this.hasValue = false;\n } else {\n this.wallClock = epochToFields(this.value.getTime(), this.timezone);\n this.hasValue = true;\n }\n }\n } else if (this.isTimezoneReassigned(changedProperties) && !this.open) {\n this.syncValueToTimezone();\n }\n }\n\n protected updated(changedProperties: PropertyValues): void {\n if (this.isTimezoneReassigned(changedProperties)) {\n if (this.internalTimezoneUpdate) {\n this.internalTimezoneUpdate = false;\n } else {\n this.emit('nile-input', this.liveDetail());\n }\n }\n }\n\n private isTimezoneReassigned(changedProperties: PropertyValues): boolean {\n return (\n changedProperties.has('timezone') &&\n changedProperties.get('timezone') !== undefined\n );\n }\n\n private syncValueToTimezone(): void {\n if (!this.hasValue || this.value === null) return;\n const epoch = fieldsToEpoch(this.wallClock, this.timezone);\n if (Number.isNaN(epoch) || epoch === this.value.getTime()) return;\n this.internalValueUpdate = true;\n this.value = new Date(epoch);\n this.syncHiddenInput();\n }\n\n private valueString(): string | null {\n return this.value === null ? null : this.value.toISOString();\n }\n\n private syncHiddenInput(): void {\n if (this.valueInput) {\n this.valueInput.value = this.valueString() ?? '';\n }\n this.formControlController?.updateValidity();\n }\n\n private changeDetail(): {\n value: string | null;\n localTimezoneValue: Date | null;\n unix: number | null;\n timezone: string;\n } {\n if (this.value === null) {\n return {\n value: null,\n localTimezoneValue: null,\n unix: null,\n timezone: this.timezone,\n };\n }\n const epoch = this.value.getTime();\n return {\n value: formatZonedValue(this.wallClock, this.timezone),\n localTimezoneValue: new Date(epoch),\n // Unix time (epoch milliseconds, matching Date.getTime()).\n unix: epoch,\n timezone: this.timezone,\n };\n }\n\n\n private liveDetail(): {\n value: string | null;\n localTimezoneValue: Date | null;\n unix: number | null;\n timezone: string;\n } {\n const epoch = fieldsToEpoch(this.wallClock, this.timezone);\n if (Number.isNaN(epoch)) {\n return {\n value: null,\n localTimezoneValue: null,\n unix: null,\n timezone: this.timezone,\n };\n }\n return {\n value: formatZonedValue(this.wallClock, this.timezone),\n localTimezoneValue: new Date(epoch),\n // Unix time (epoch milliseconds, matching Date.getTime()).\n unix: epoch,\n timezone: this.timezone,\n };\n }\n\n private commit(): void {\n const epoch = fieldsToEpoch(this.wallClock, this.timezone);\n this.internalValueUpdate = true;\n this.value = new Date(epoch);\n this.hasValue = true;\n this.syncHiddenInput();\n this.emit('nile-change', this.changeDetail());\n }\n\n\n private onFieldChange(field: TimestampField) {\n return (event: CustomEvent) => {\n event.stopPropagation();\n const raw = Number(event.detail?.value);\n const next = clampWallClock(\n { ...this.wallClock, [field]: raw },\n this.minYear,\n this.maxYear\n );\n this.wallClock = next;\n this.emit('nile-input', this.liveDetail());\n };\n }\n\n private onTimezoneChange(event: CustomEvent) {\n event.stopPropagation();\n const next = event.detail?.value;\n if (typeof next === 'string' && isValidTimeZone(next)) {\n this.internalTimezoneUpdate = true;\n this.timezone = next;\n this.emit('nile-input', this.liveDetail());\n }\n }\n\n private handleSetNow = () => {\n if (this.disabled || this.readonly) return;\n const now = Date.now();\n this.wallClock = epochToFields(now, this.timezone);\n this.commit();\n };\n\n /** Copies the canonical zoned value */\n private handleCopy = async () => {\n if (this.disabled || !this.hasValue) return;\n const text = formatZonedValue(this.wallClock, this.timezone);\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n this.emit('nile-copy-error', { value: text });\n return;\n }\n this.justCopied = true;\n window.clearTimeout(this.copiedTimer);\n this.copiedTimer = window.setTimeout(() => {\n this.justCopied = false;\n }, NileTimestampBuilder.COPIED_FEEDBACK_MS);\n this.emit('nile-copy', { value: text });\n };\n\n private handleStageNow = () => {\n if (this.disabled || this.readonly) return;\n const now = Date.now();\n this.wallClock = epochToFields(now, this.timezone);\n this.emit('nile-input', this.liveDetail());\n };\n\n private handleUseLocalTz = () => {\n if (this.disabled || this.readonly) return;\n this.internalTimezoneUpdate = true;\n this.timezone = getLocalTimeZone();\n this.emit('nile-input', this.liveDetail());\n };\n\n private handleUseUtc = () => {\n if (this.disabled || this.readonly) return;\n this.internalTimezoneUpdate = true;\n this.timezone = 'UTC';\n this.emit('nile-input', this.liveDetail());\n };\n\n /** Touch input has no reliable `dblclick`, so double-taps are timed by hand. */\n private static readonly DOUBLE_TAP_MS = 300;\n private static readonly COPIED_FEEDBACK_MS = 1600;\n private lastTapAt = 0;\n private copiedTimer = 0;\n\n private handleDisplayDoubleClick = () => {\n this.handleEdit();\n };\n\n private handleDisplayPointerUp = (event: PointerEvent) => {\n if (event.pointerType === 'mouse') return;\n const now = Date.now();\n if (now - this.lastTapAt <= NileTimestampBuilder.DOUBLE_TAP_MS) {\n this.lastTapAt = 0;\n this.handleEdit();\n return;\n }\n this.lastTapAt = now;\n };\n\n /** Keyboard equivalent of the double-click/double-tap edit affordance. */\n private handleDisplayKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n this.handleEdit();\n };\n\n private handleEdit = () => {\n if (this.disabled || this.readonly || this.open) return;\n if (this.value === null) {\n this.wallClock = epochToFields(Date.now(), this.timezone);\n }\n this.open = true;\n this.emit('nile-expand', { open: true });\n };\n\n private handleDone = () => {\n this.open = false;\n this.commit();\n this.emit('nile-collapse', { open: false });\n };\n\n checkValidity(): boolean {\n return this.valueInput?.checkValidity() ?? true;\n }\n\n reportValidity(): boolean {\n return this.valueInput?.reportValidity() ?? true;\n }\n\n setCustomValidity(message: string): void {\n this.valueInput?.setCustomValidity(message);\n this.formControlController?.updateValidity();\n }\n\n getForm(): HTMLFormElement | null {\n return this.formControlController?.getForm() ?? null;\n }\n\n private renderField(\n field: TimestampField,\n fieldLabel: string,\n val: number,\n min: number,\n max: number\n ) {\n return html`\n <div class=\"tsb__field\" part=\"field\">\n <nile-input\n type=\"number\"\n exportparts=\"base:field__base, input:field__input\"\n size=\"medium\"\n label=${fieldLabel}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n min=${min}\n max=${max}\n step=\"1\"\n .value=${String(val)}\n @nile-change=${this.onFieldChange(field)}\n ></nile-input>\n </div>\n `;\n }\n\n private renderCollapsed() {\n const wc = this.wallClock;\n const editable = !this.disabled && !this.readonly;\n return html`\n <div class=\"tsb__collapsed\" part=\"display\">\n <div\n class=${classMap({\n tsb__display: true,\n 'tsb__display--editable': editable,\n })}\n part=\"display-content\"\n role=${editable ? 'button' : nothing}\n tabindex=${this.disabled ? nothing : '0'}\n aria-labelledby=${this.label ? 'tsb-label tsb-display-value' : nothing}\n aria-readonly=${this.readonly ? 'true' : nothing}\n @dblclick=${this.handleDisplayDoubleClick}\n @pointerup=${this.handleDisplayPointerUp}\n @keydown=${this.handleDisplayKeyDown}\n >\n <span\n id=\"tsb-display-value\"\n class=${classMap({\n tsb__value: true,\n 'tsb__value--empty': !this.hasValue,\n })}\n part=\"value\"\n >\n ${this.hasValue ? formatWallClock(wc) : 'No timestamp set'}\n </span>\n <span class=\"tsb__tz\" part=\"timezone-label\">${this.timezone}</span>\n </div>\n ${editable ? this.renderEditActions() : nothing}\n ${this.copyable && this.readonly && !this.disabled\n ? this.renderCopyAction()\n : nothing}\n </div>\n `;\n }\n\n private renderEditActions() {\n return html`\n <div class=\"tsb__actions\" part=\"actions\">\n <nile-button\n variant=\"secondary-grey\"\n ?disabled=${this.disabled}\n @click=${this.handleSetNow}\n >Now</nile-button\n >\n <nile-button\n variant=\"primary\"\n title=\"Edit\"\n ?disabled=${this.disabled}\n @click=${this.handleEdit}\n ><nile-glyph\n name=\"ng-pencil\"\n size=\"16\"\n method=\"stroke\"\n color=\"currentColor\"\n ></nile-glyph\n ></nile-button\n >\n </div>\n `;\n }\n\n private renderCopyAction() {\n return html`\n <div class=\"tsb__actions\" part=\"actions\">\n <nile-button\n variant=\"ghost\"\n title=${this.justCopied ? 'Copied' : 'Copy timestamp'}\n aria-label=${this.justCopied ? 'Copied' : 'Copy timestamp'}\n ?disabled=${!this.hasValue}\n @click=${this.handleCopy}\n ><nile-glyph\n name=${this.justCopied ? 'ng-copy-check' : 'ng-copy'}\n size=\"16\"\n method=\"stroke\"\n color=\"currentColor\"\n ></nile-glyph\n ></nile-button>\n </div>\n `;\n }\n\n private renderExpanded() {\n const wc = this.wallClock;\n const maxDay = daysInMonth(wc.year, wc.month);\n return html`\n <div class=\"tsb__expanded\" part=\"editor\">\n <div class=\"tsb__fields\" part=\"fields\">\n ${this.renderField(\n TimestampField.Year,\n 'Year',\n wc.year,\n this.minYear,\n this.maxYear\n )}\n ${this.renderField(TimestampField.Month, 'Month', wc.month, 1, 12)}\n ${this.renderField(TimestampField.Day, 'Day', wc.day, 1, maxDay)}\n ${this.renderField(TimestampField.Hour, 'Hour', wc.hour, 0, 23)}\n ${this.renderField(\n TimestampField.Minute,\n 'Minute',\n wc.minute,\n 0,\n 59\n )}\n ${this.renderField(\n TimestampField.Second,\n 'Second',\n wc.second,\n 0,\n 59\n )}\n ${this.renderField(\n TimestampField.Millisecond,\n 'Milliseconds',\n wc.millisecond,\n 0,\n 999\n )}\n </div>\n\n <div class=\"tsb__timezone\" part=\"timezone-select\">\n <nile-select\n searchEnabled\n label=\"Timezone\"\n size=\"medium\"\n ?disabled=${this.disabled}\n .value=${this.timezone}\n @nile-change=${this.onTimezoneChange}\n >\n ${this.timezoneList.map(\n tz => html`<nile-option value=${tz}>${tz}</nile-option>`\n )}\n </nile-select>\n </div>\n\n <div class=\"tsb__actions\" part=\"editor-actions\">\n <nile-button\n variant=\"secondary-grey\"\n ?disabled=${this.disabled}\n @click=${this.handleStageNow}\n >Set to Now</nile-button\n >\n <nile-button\n variant=\"secondary-grey\"\n ?disabled=${this.disabled}\n @click=${this.handleUseLocalTz}\n >Use Local Timezone</nile-button\n >\n <nile-button\n variant=\"secondary-grey\"\n ?disabled=${this.disabled}\n @click=${this.handleUseUtc}\n >Use UTC</nile-button\n >\n <nile-button\n variant=\"primary\"\n ?disabled=${this.disabled}\n @click=${this.handleDone}\n >Done</nile-button\n >\n </div>\n </div>\n `;\n }\n\n render() {\n return html`\n <div\n class=\"tsb\"\n part=\"base\"\n role=\"group\"\n aria-labelledby=${this.label ? 'tsb-label' : nothing}\n >\n ${this.label\n ? html`<label id=\"tsb-label\" class=\"tsb__label\" part=\"label\"\n >${this.label}</label\n >`\n : ''}\n ${this.open && !this.readonly\n ? this.renderExpanded()\n : this.renderCollapsed()}\n\n <input\n class=\"value-input\"\n type=\"text\"\n ?required=${this.required}\n ?disabled=${this.disabled}\n .value=${this.valueString() ?? ''}\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n </div>\n `;\n }\n}\n\nexport default NileTimestampBuilder;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-timestamp-builder': NileTimestampBuilder;\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ import './nile-timestamp-builder';