primer_view_components 0.0.36 → 0.0.41

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 (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +220 -24
  3. data/app/assets/javascripts/primer_view_components.js +1 -1
  4. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  5. data/app/components/primer/auto_complete.rb +3 -1
  6. data/app/components/primer/auto_complete/item.rb +1 -1
  7. data/app/components/primer/avatar_component.rb +22 -3
  8. data/app/components/primer/avatar_stack_component.rb +8 -5
  9. data/app/components/primer/base_button.rb +47 -0
  10. data/app/components/primer/base_component.rb +14 -10
  11. data/app/components/primer/blankslate_component.rb +10 -7
  12. data/app/components/primer/border_box_component.rb +1 -1
  13. data/app/components/primer/box_component.rb +1 -1
  14. data/app/components/primer/breadcrumb_component.rb +1 -1
  15. data/app/components/primer/button_component.html.erb +9 -0
  16. data/app/components/primer/button_component.rb +39 -21
  17. data/app/components/primer/{button_group_component.html.erb → button_group.html.erb} +0 -0
  18. data/app/components/primer/button_group.rb +61 -0
  19. data/app/components/primer/button_marketing_component.rb +4 -9
  20. data/app/components/primer/clipboard_copy.html.erb +8 -0
  21. data/app/components/primer/clipboard_copy.rb +26 -0
  22. data/app/components/primer/clipboard_copy_component.d.ts +1 -0
  23. data/app/components/primer/clipboard_copy_component.js +34 -0
  24. data/app/components/primer/clipboard_copy_component.ts +39 -0
  25. data/app/components/primer/close_button.rb +11 -2
  26. data/app/components/primer/component.rb +21 -2
  27. data/app/components/primer/counter_component.rb +6 -1
  28. data/app/components/primer/details_component.rb +1 -1
  29. data/app/components/primer/dropdown/menu_component.rb +1 -1
  30. data/app/components/primer/dropdown_component.rb +1 -1
  31. data/app/components/primer/flash_component.rb +3 -3
  32. data/app/components/primer/flex_component.rb +28 -1
  33. data/app/components/primer/flex_item_component.rb +20 -1
  34. data/app/components/primer/heading_component.rb +25 -4
  35. data/app/components/primer/hidden_text_expander.rb +2 -4
  36. data/app/components/primer/icon_button.rb +65 -0
  37. data/app/components/primer/image.rb +46 -0
  38. data/app/components/primer/image_crop.d.ts +1 -0
  39. data/app/components/primer/image_crop.html.erb +12 -0
  40. data/app/components/primer/image_crop.js +1 -0
  41. data/app/components/primer/image_crop.rb +36 -0
  42. data/app/components/primer/image_crop.ts +1 -0
  43. data/app/components/primer/label_component.rb +7 -3
  44. data/app/components/primer/layout_component.rb +1 -1
  45. data/app/components/primer/link_component.rb +1 -1
  46. data/app/components/primer/local_time.d.ts +1 -0
  47. data/app/components/primer/local_time.js +1 -0
  48. data/app/components/primer/local_time.rb +59 -0
  49. data/app/components/primer/local_time.ts +1 -0
  50. data/app/components/primer/{markdown_component.rb → markdown.rb} +6 -5
  51. data/app/components/primer/menu_component.rb +1 -1
  52. data/app/components/primer/navigation/tab_component.rb +8 -1
  53. data/app/components/primer/octicon_component.html.erb +7 -0
  54. data/app/components/primer/octicon_component.rb +53 -19
  55. data/app/components/primer/octicon_symbols_component.html.erb +3 -0
  56. data/app/components/primer/octicon_symbols_component.rb +61 -0
  57. data/app/components/primer/popover_component.rb +1 -1
  58. data/app/components/primer/primer.d.ts +3 -0
  59. data/app/components/primer/primer.js +3 -0
  60. data/app/components/primer/primer.ts +3 -0
  61. data/app/components/primer/progress_bar_component.rb +1 -1
  62. data/app/components/primer/spinner_component.rb +3 -3
  63. data/app/components/primer/state_component.rb +2 -2
  64. data/app/components/primer/subhead_component.rb +34 -4
  65. data/app/components/primer/tab_container_component.rb +1 -1
  66. data/app/components/primer/tab_nav_component.html.erb +2 -0
  67. data/app/components/primer/tab_nav_component.rb +23 -10
  68. data/app/components/primer/text_component.rb +6 -3
  69. data/app/components/primer/time_ago_component.rb +1 -1
  70. data/app/components/primer/timeline_item_component.rb +1 -1
  71. data/app/components/primer/{tooltip_component.rb → tooltip.rb} +11 -9
  72. data/app/components/primer/truncate.rb +1 -1
  73. data/app/components/primer/underline_nav_component.rb +1 -1
  74. data/app/lib/primer/classify.rb +11 -36
  75. data/app/lib/primer/classify/cache.rb +20 -15
  76. data/app/lib/primer/classify/flex.rb +111 -0
  77. data/app/lib/primer/classify/functional_border_colors.rb +1 -2
  78. data/app/lib/primer/fetch_or_fallback_helper.rb +2 -2
  79. data/app/lib/primer/octicon/cache.rb +42 -0
  80. data/app/lib/primer/view_helper.rb +2 -1
  81. data/lib/primer/view_components.rb +1 -1
  82. data/lib/primer/view_components/version.rb +1 -1
  83. data/lib/tasks/coverage.rake +14 -0
  84. data/lib/tasks/docs.rake +315 -0
  85. data/lib/tasks/statuses.rake +12 -0
  86. data/lib/yard/docs_helper.rb +57 -0
  87. data/static/statuses.json +54 -1
  88. metadata +50 -11
  89. data/app/components/primer/button_group_component.rb +0 -35
  90. data/app/components/primer/foo_bar.d.ts +0 -1
  91. data/app/components/primer/foo_bar.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccc56525f479af9da0ee1dea8985e5a54aad6567e9ec932eef93707b896b91d3
4
- data.tar.gz: c718f55ccc5e7fc6d76640410c4c2f3df140f45ab4765eeef3d3e3355893ed07
3
+ metadata.gz: 7688c3b98d5f6ccb72ff70e62ed06b97b0b5278249fb4aae39501b6b6fa8d009
4
+ data.tar.gz: b7cbebb4f08c8d380e164b62b9a15fc9fde7d03c1c7ca633f057e50daecbe6a4
5
5
  SHA512:
6
- metadata.gz: c3859007d82a2ae6653a215894021f6f49318c21cd608d333cfbb0beef659b17d66e71bc913933ab758846c07dc35c72a791ddd12d05e40795e17798c5fffe53
7
- data.tar.gz: 26898a446277ee8df6be61241af11506220e29bcf94a180cdf334b54b19df932486f42737320f61b87c3c4cdc867f0b5980c99cc4623d8760d85cf92e0510ade
6
+ metadata.gz: 70a4c3486366d38a89aed292a00a1b196b40031c3f0e53e13dd6bd330805bf0e74c4d631ece19d727c9dd358bfa14075cdd8ae099e2ef9dc715046151f700085
7
+ data.tar.gz: 94bbad0f1b3b7cb267e566f76deddbacd7ca18b9f8965988c67aff403f4fc297ca926aa55e8881d242a249a4bf61b4b428f4a42e2131a8b0f981ddea4b2c9154
data/CHANGELOG.md CHANGED
@@ -2,6 +2,202 @@
2
2
 
3
3
  ## main
4
4
 
5
+ ## 0.0.41
6
+
7
+ ### New
8
+
9
+ * Create `LocalTime` component.
10
+
11
+ *Kristján Oddsson*
12
+
13
+ * Create `Image` component.
14
+
15
+ *Manuel Puyol*
16
+
17
+ * Add `extra` slot to `TabNav`.
18
+
19
+ *Manuel Puyol*
20
+
21
+ * Do not raise error if Primer CSS class name is passed to component if `PRIMER_WARNINGS_DISABLED` is set.
22
+
23
+ *Joel Hawksley*
24
+
25
+ ### Accessibility
26
+
27
+ * Accept `aria-current="true"` in tabbed components.
28
+
29
+ *Manuel Puyol*
30
+
31
+ ### Changes
32
+
33
+ * Promote `Tooltip` component to beta.
34
+
35
+ *Manuel Puyol*
36
+
37
+ ### Bug fixes
38
+
39
+ * Ensure that `ClipboardCopy` behaviors only target ViewComponents.
40
+
41
+ *Manuel Puyol*
42
+
43
+ * Ensure that the `rounded` attribute for `<image-crop>` is represented as a boolean attribute.
44
+
45
+ *Kristján Oddsson*
46
+
47
+ ### Breaking changes
48
+
49
+ * Don't allow `OcticonComponent` height/width values under 16px
50
+
51
+ *Jon Rohan*
52
+
53
+ * Remove `:large` size option from `OcticonComponent` and change `:medium` to 24px
54
+
55
+ *Jon Rohan*
56
+
57
+ * Restrict `Label` tag to `span`, `div`, `a`, `summary`.
58
+
59
+ *Kate Higa*
60
+
61
+ ### Misc
62
+
63
+ * Add a CI check for changes to the CHANGELOG file.
64
+
65
+ *Kristján Oddsson*
66
+
67
+ ## 0.0.40
68
+
69
+ ### New
70
+
71
+ * Create `ImageCrop` component.
72
+
73
+ *Kristján Oddsson*
74
+
75
+ ### Changes
76
+
77
+ * Promote `IconButton` to beta.
78
+
79
+ *Manuel Puyol*
80
+
81
+ * Add `box` argument to `IconButton`.
82
+
83
+ *Manuel Puyol*
84
+
85
+ * Promote `Markdown` to beta.
86
+
87
+ *Manuel Puyol*
88
+
89
+ ### Bug fixes
90
+
91
+ * Fix `IconButton` raising when `aria-label` was provided using an object.
92
+
93
+ *Manuel Puyol*
94
+
95
+ * Fix disabling of default styles for `SpinnerComponent` via `nil` style parameter.
96
+
97
+ *Chris Wilson*
98
+
99
+ ### Deprecations
100
+
101
+ * Deprecate `Flex` in favor of `BoxComponent`.
102
+
103
+ *Manuel Puyol*
104
+
105
+ ### Breaking Changes
106
+
107
+ * Restrict `ButtonGroup` tag to `:div` and update docs for `Text` tag.
108
+
109
+ *Kate Higa*
110
+
111
+ * Remove non-functional `width` and `height` `:fill` option.
112
+
113
+ *Jon Rohan*, *Joel Hawksley*
114
+
115
+ * Restrict `Subhead` `heading` slot tag to `div` and `h1`-`h6`.
116
+
117
+ *Kate Higa*
118
+
119
+ * Restrict `Blankslate` tag to `div`.
120
+
121
+ *Kate Higa*
122
+
123
+ * Explicitly limit tag for `AvatarStack` to `:div` and `:span`.
124
+
125
+ *Kate Higa*
126
+
127
+ * Rename `MarkdownComponent` to `Markdown`.
128
+
129
+ *Manuel Puyol*
130
+
131
+ ## 0.0.39
132
+
133
+ * Promote `CloseButton` to beta.
134
+
135
+ *Manuel Puyol*
136
+
137
+ * Update `ClipboardCopy` to not toggle icons unless they both exist.
138
+
139
+ *Kristján Oddsson*
140
+
141
+ * Add `icon` and `counter` slots to `ButtonComponent`.
142
+
143
+ *Manuel Puyol*
144
+
145
+ * Create `IconButton` component.
146
+
147
+ *Manuel Puyol*
148
+
149
+ * Removing trailing whitespace from output of `class=""` Classify generation.
150
+
151
+ *Jon Rohan*
152
+
153
+ * Deprecate `FlexItem` in favor of `BoxComponent`.
154
+
155
+ *Manuel Puyol*
156
+
157
+ * Dropping requirement of `octicons_helper` and updating `OcticonComponent` to use `octicon` gem directly.
158
+
159
+ *Jon Rohan*
160
+
161
+ * **Breaking change:** Remove `:overlay` option from `border_color`.
162
+
163
+ *Simon Luthi*
164
+
165
+ ## 0.0.38
166
+
167
+ * Extract `BaseButton` component.
168
+
169
+ *Manuel Puyol*
170
+
171
+ * Add default `aria-label` of "Close" to `CloseButton` component.
172
+
173
+ *Kate Higa*
174
+
175
+ * Set button variants in the `ButtonGroup` parent.
176
+
177
+ *Manuel Puyol*
178
+
179
+ * Create `ClipboardCopy` component.
180
+
181
+ *Kristján Oddsson*
182
+
183
+ * **Breaking change:** Rename `ButtonGroupComponent` to `ButtonGroup` and promote it to beta.
184
+
185
+ *Manuel Puyol*
186
+
187
+ * **Breaking change:** Do not provide default for `Heading` and improve documentation.
188
+
189
+ *Kate Higa*
190
+
191
+ * **Breaking change:** Don't allow `StateComponent` to be a link.
192
+
193
+ *Kate Higa*
194
+
195
+ ## 0.0.37
196
+
197
+ * Update NPM package to include subdirectory JS files.
198
+
199
+ *Manuel Puyol*
200
+
5
201
  ## 0.0.36
6
202
 
7
203
  * Add `block` flag to `ButtonComponent`.
@@ -16,11 +212,11 @@
16
212
 
17
213
  *Manuel Puyol*
18
214
 
19
- * **Breaking change**: Rename `AutoCompleteComponent` to `AutoComplete` and `AutoCompleteItemComponent` to `AutoComplete::Item`.
215
+ * **Breaking change:** Rename `AutoCompleteComponent` to `AutoComplete` and `AutoCompleteItemComponent` to `AutoComplete::Item`.
20
216
 
21
217
  *Manuel Puyol*
22
218
 
23
- * **Breaking change**: Rename `TruncateComponent` to `Truncate` and promote it to beta.
219
+ * **Breaking change:** Rename `TruncateComponent` to `Truncate` and promote it to beta.
24
220
 
25
221
  *Manuel Puyol*
26
222
 
@@ -38,7 +234,7 @@
38
234
 
39
235
  *Manuel Puyol*
40
236
 
41
- * **Breaking change**: Make `label` required for `UnderlineNav` and `TabNav`.
237
+ * **Breaking change:** Make `label` required for `UnderlineNav` and `TabNav`.
42
238
 
43
239
  *Manuel Puyol*
44
240
 
@@ -52,23 +248,23 @@
52
248
 
53
249
  *Manuel Puyol*
54
250
 
55
- * **Breaking change**: Rename `FlashComponent` `variant` argument to `scheme`.
251
+ * **Breaking change:** Rename `FlashComponent` `variant` argument to `scheme`.
56
252
 
57
253
  *Manuel Puyol*
58
254
 
59
- * **Breaking change**: Rename `LinkComponent` `variant` argument to `scheme`.
255
+ * **Breaking change:** Rename `LinkComponent` `variant` argument to `scheme`.
60
256
 
61
257
  *Manuel Puyol*
62
258
 
63
- * **Breaking change**: Rename `ButtonComponent` `button_type` argument to `scheme`.
259
+ * **Breaking change:** Rename `ButtonComponent` `button_type` argument to `scheme`.
64
260
 
65
261
  *Manuel Puyol*
66
262
 
67
- * **Breaking change**: Rename `ButtonMarketingComponent` `button_type` argument to `scheme`.
263
+ * **Breaking change:** Rename `ButtonMarketingComponent` `button_type` argument to `scheme`.
68
264
 
69
265
  *Manuel Puyol*
70
266
 
71
- * **Breaking change**: Rename `StateComponent` `color` argument to `scheme`.
267
+ * **Breaking change:** Rename `StateComponent` `color` argument to `scheme`.
72
268
 
73
269
  *Manuel Puyol*
74
270
 
@@ -88,11 +284,11 @@
88
284
 
89
285
  *Manuel Puyol*
90
286
 
91
- * **Breaking change**: Update `TabNav#tab` API to accept the tab content as a block and panel content as a slot.
287
+ * **Breaking change:** Update `TabNav#tab` API to accept the tab content as a block and panel content as a slot.
92
288
 
93
289
  *Manuel Puyol*
94
290
 
95
- * **Breaking change**: Update `UnderlineNavComponent` API be more strict and support `TabContainer`.
291
+ * **Breaking change:** Update `UnderlineNavComponent` API be more strict and support `TabContainer`.
96
292
 
97
293
  *Manuel Puyol*
98
294
 
@@ -156,7 +352,7 @@
156
352
 
157
353
  *Steve Richert*
158
354
 
159
- * **Breaking change**: Updates `PopoverComponent` to use Slots V2.
355
+ * **Breaking change:** Updates `PopoverComponent` to use Slots V2.
160
356
 
161
357
  *Manuel Puyol*
162
358
 
@@ -174,11 +370,11 @@
174
370
 
175
371
  *Keith Cirkel*
176
372
 
177
- * **Breaking change**: Updates `UnderlineNavComponent` to use Slots V2.
373
+ * **Breaking change:** Updates `UnderlineNavComponent` to use Slots V2.
178
374
 
179
375
  *Simon Taranto*
180
376
 
181
- * **Breaking change**: Upgrade `LayoutComponent` to use Slots V2.
377
+ * **Breaking change:** Upgrade `LayoutComponent` to use Slots V2.
182
378
 
183
379
  *Simon Taranto*
184
380
 
@@ -208,11 +404,11 @@
208
404
 
209
405
  *Manuel Puyol*
210
406
 
211
- * **Breaking change**: Upgrade `ProgressBarComponent` to use Slots V2.
407
+ * **Breaking change:** Upgrade `ProgressBarComponent` to use Slots V2.
212
408
 
213
409
  *Simon Taranto*
214
410
 
215
- * **Breaking change**: Upgrade `BreadcrumbComponent` to use Slots V2.
411
+ * **Breaking change:** Upgrade `BreadcrumbComponent` to use Slots V2.
216
412
 
217
413
  *Manuel Puyol*
218
414
 
@@ -222,11 +418,11 @@
222
418
 
223
419
  *Manuel Puyol*
224
420
 
225
- * **Breaking change**: Upgrade `SubheadComponent` to use Slots V2.
421
+ * **Breaking change:** Upgrade `SubheadComponent` to use Slots V2.
226
422
 
227
423
  *Simon Taranto*
228
424
 
229
- * **Breaking change**: Update `LabelComponent` to use only functional color
425
+ * **Breaking change:** Update `LabelComponent` to use only functional color
230
426
  supportive scheme keys. The component no longer accepts colors (`:gray`, for
231
427
  example) but only functional schemes (`primary`, for example).
232
428
  `LabelComponent` is promoted to beta status.
@@ -247,29 +443,29 @@
247
443
 
248
444
  *Simon Taranto*
249
445
 
250
- * **Breaking change**: Upgrade `BorderBoxComponent` to use Slots V2.
446
+ * **Breaking change:** Upgrade `BorderBoxComponent` to use Slots V2.
251
447
 
252
448
  *Manuel Puyol*
253
449
 
254
- * **Breaking change**: Upgrade `StateComponent` to support functional colors. This change requires using [@primer/css-next](https://www.npmjs.com/package/@primer/css-next). The required changes will be upstreamed to @primer/css at a later date.
450
+ * **Breaking change:** Upgrade `StateComponent` to support functional colors. This change requires using [@primer/css-next](https://www.npmjs.com/package/@primer/css-next). The required changes will be upstreamed to @primer/css at a later date.
255
451
 
256
452
  *Simon Taranto*
257
453
 
258
- * **Breaking change**: Upgrade `DetailsComponent` to use Slots V2.
454
+ * **Breaking change:** Upgrade `DetailsComponent` to use Slots V2.
259
455
 
260
456
  *Simon Taranto*
261
457
 
262
458
  ## 0.0.21
263
459
 
264
- * **Breaking change**: Upgrade `FlashComponent` to use Slots V2.
460
+ * **Breaking change:** Upgrade `FlashComponent` to use Slots V2.
265
461
 
266
462
  *Joel Hawksley, Simon Taranto*
267
463
 
268
- * **Breaking change**: Upgrade `BlankslateComponent` to use Slots V2.
464
+ * **Breaking change:** Upgrade `BlankslateComponent` to use Slots V2.
269
465
 
270
466
  *Manuel Puyol*
271
467
 
272
- * **Breaking change**: Upgrade `TimelineItemComponent` to use Slots V2.
468
+ * **Breaking change:** Upgrade `TimelineItemComponent` to use Slots V2.
273
469
 
274
470
  *Manuel Puyol*
275
471
 
@@ -313,7 +509,7 @@
313
509
 
314
510
  *Simon Taranto*
315
511
 
316
- * **Breaking change**: Drop support for Ruby 2.4.
512
+ * **Breaking change:** Drop support for Ruby 2.4.
317
513
 
318
514
  *Simon Taranto*
319
515
 
@@ -1,2 +1,2 @@
1
- const t=!!navigator.userAgent.match(/Macintosh/);class e{constructor(e,n){this.input=e,this.list=n,this.isComposing=!1,n.id||(n.id=`combobox-${Math.random().toString().slice(2,6)}`),this.keyboardEventHandler=e=>function(e,n){if(e.shiftKey||e.metaKey||e.altKey)return;if(!t&&e.ctrlKey)return;if(n.isComposing)return;switch(e.key){case"Enter":case"Tab":(function(t,e){const n=e.querySelector('[aria-selected="true"]');return!!n&&("true"===n.getAttribute("aria-disabled")||n.click(),!0)})(n.input,n.list)&&e.preventDefault();break;case"Escape":n.clearSelection();break;case"ArrowDown":n.navigate(1),e.preventDefault();break;case"ArrowUp":n.navigate(-1),e.preventDefault();break;case"n":t&&e.ctrlKey&&(n.navigate(1),e.preventDefault());break;case"p":t&&e.ctrlKey&&(n.navigate(-1),e.preventDefault());break;default:if(e.ctrlKey)break;n.clearSelection()}}(e,this),this.compositionEventHandler=t=>function(t,e){e.isComposing="compositionstart"===t.type;if(!document.getElementById(e.input.getAttribute("aria-controls")||""))return;e.clearSelection()}(t,this),this.inputHandler=this.clearSelection.bind(this),e.setAttribute("role","combobox"),e.setAttribute("aria-controls",n.id),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-autocomplete","list"),e.setAttribute("aria-haspopup","listbox")}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute("role"),this.input.removeAttribute("aria-controls"),this.input.removeAttribute("aria-expanded"),this.input.removeAttribute("aria-autocomplete"),this.input.removeAttribute("aria-haspopup")}start(){this.input.setAttribute("aria-expanded","true"),this.input.addEventListener("compositionstart",this.compositionEventHandler),this.input.addEventListener("compositionend",this.compositionEventHandler),this.input.addEventListener("input",this.inputHandler),this.input.addEventListener("keydown",this.keyboardEventHandler),this.list.addEventListener("click",n)}stop(){this.clearSelection(),this.input.setAttribute("aria-expanded","false"),this.input.removeEventListener("compositionstart",this.compositionEventHandler),this.input.removeEventListener("compositionend",this.compositionEventHandler),this.input.removeEventListener("input",this.inputHandler),this.input.removeEventListener("keydown",this.keyboardEventHandler),this.list.removeEventListener("click",n)}navigate(t=1){const e=Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(i)[0],n=Array.from(this.list.querySelectorAll('[role="option"]')).filter(i),s=n.indexOf(e);if(s===n.length-1&&1===t||0===s&&-1===t)return this.clearSelection(),void this.input.focus();let o=1===t?0:n.length-1;if(e&&s>=0){const e=s+t;e>=0&&e<n.length&&(o=e)}const a=n[o];if(a)for(const t of n)a===t?(this.input.setAttribute("aria-activedescendant",a.id),a.setAttribute("aria-selected","true"),r(this.list,a)):t.setAttribute("aria-selected","false")}clearSelection(){this.input.removeAttribute("aria-activedescendant");for(const t of this.list.querySelectorAll('[aria-selected="true"]'))t.setAttribute("aria-selected","false")}}function n(t){if(!(t.target instanceof Element))return;const e=t.target.closest('[role="option"]');e&&"true"!==e.getAttribute("aria-disabled")&&function(t){t.dispatchEvent(new CustomEvent("combobox-commit",{bubbles:!0}))}(e)}function i(t){return!t.hidden&&!(t instanceof HTMLInputElement&&"hidden"===t.type)&&(t.offsetWidth>0||t.offsetHeight>0)}function r(t,e){(function(t,e){const n=t.scrollTop,i=n+t.clientHeight,r=e.offsetTop,s=r+e.clientHeight;return r>=n&&s<=i})(t,e)||(t.scrollTop=e.offsetTop)}class s extends CustomEvent{constructor(t,e){super(t,e),this.relatedTarget=e.relatedTarget}}const o=new WeakMap;function a(t,e){const n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","text/fragment+html"),function(t,e){const n=o.get(t);n&&n.abort();o.set(t,e);const i=()=>o.delete(t),r=function(t){return new Promise(((e,n)=>{t.onload=function(){t.status>=200&&t.status<300?e(t.responseText):n(new Error(t.responseText))},t.onerror=n,t.send()}))}(e);return r.then(i,i),r}(t,n)}class c{constructor(t,n,i){this.container=t,this.input=n,this.results=i,this.combobox=new e(n,i),this.results.hidden=!0,this.input.setAttribute("autocomplete","off"),this.input.setAttribute("spellcheck","false"),this.interactingWithList=!1,this.onInputChange=function(t,e=0){let n;return function(...i){clearTimeout(n),n=window.setTimeout((()=>{clearTimeout(n),t(...i)}),e)}}(this.onInputChange.bind(this),300),this.onResultsMouseDown=this.onResultsMouseDown.bind(this),this.onInputBlur=this.onInputBlur.bind(this),this.onInputFocus=this.onInputFocus.bind(this),this.onKeydown=this.onKeydown.bind(this),this.onCommit=this.onCommit.bind(this),this.input.addEventListener("keydown",this.onKeydown),this.input.addEventListener("focus",this.onInputFocus),this.input.addEventListener("blur",this.onInputBlur),this.input.addEventListener("input",this.onInputChange),this.results.addEventListener("mousedown",this.onResultsMouseDown),this.results.addEventListener("combobox-commit",this.onCommit)}destroy(){this.input.removeEventListener("keydown",this.onKeydown),this.input.removeEventListener("focus",this.onInputFocus),this.input.removeEventListener("blur",this.onInputBlur),this.input.removeEventListener("input",this.onInputChange),this.results.removeEventListener("mousedown",this.onResultsMouseDown),this.results.removeEventListener("combobox-commit",this.onCommit)}onKeydown(t){if("Escape"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowUp"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowDown"===t.key&&!this.container.open){if(!this.input.value.trim())return;this.container.open=!0,t.stopPropagation(),t.preventDefault()}}onInputFocus(){this.fetchResults()}onInputBlur(){this.interactingWithList?this.interactingWithList=!1:this.container.open=!1}onCommit({target:t}){const e=t;if(!(e instanceof HTMLElement))return;if(this.container.open=!1,e instanceof HTMLAnchorElement)return;const n=e.getAttribute("data-autocomplete-value")||e.textContent;this.container.value=n}onResultsMouseDown(){this.interactingWithList=!0}onInputChange(){this.container.removeAttribute("value"),this.fetchResults()}identifyOptions(){let t=0;for(const e of this.results.querySelectorAll('[role="option"]:not([id])'))e.id=`${this.results.id}-option-${t++}`}fetchResults(){const t=this.input.value.trim();if(!t)return void(this.container.open=!1);const e=this.container.src;if(!e)return;const n=new URL(e,window.location.href),i=new URLSearchParams(n.search.slice(1));i.append("q",t),n.search=i.toString(),this.container.dispatchEvent(new CustomEvent("loadstart")),a(this.input,n.toString()).then((t=>{this.results.innerHTML=t,this.identifyOptions();const e=!!this.results.querySelector('[role="option"]');this.container.open=e,this.container.dispatchEvent(new CustomEvent("load")),this.container.dispatchEvent(new CustomEvent("loadend"))})).catch((()=>{this.container.dispatchEvent(new CustomEvent("error")),this.container.dispatchEvent(new CustomEvent("loadend"))}))}open(){this.results.hidden&&(this.combobox.start(),this.results.hidden=!1)}close(){this.results.hidden||(this.combobox.stop(),this.results.hidden=!0)}}const u=new WeakMap;class l extends HTMLElement{constructor(){super()}connectedCallback(){const t=this.getAttribute("for");if(!t)return;const e=this.querySelector("input"),n=document.getElementById(t);e instanceof HTMLInputElement&&n&&(u.set(this,new c(this,e,n)),n.setAttribute("role","listbox"))}disconnectedCallback(){const t=u.get(this);t&&(t.destroy(),u.delete(this))}get src(){return this.getAttribute("src")||""}set src(t){this.setAttribute("src",t)}get value(){return this.getAttribute("value")||""}set value(t){this.setAttribute("value",t)}get open(){return this.hasAttribute("open")}set open(t){t?this.setAttribute("open",""):this.removeAttribute("open")}static get observedAttributes(){return["open","value"]}attributeChangedCallback(t,e,n){if(e===n)return;const i=u.get(this);if(i)switch(t){case"open":null===n?i.close():i.open();break;case"value":null!==n&&(i.input.value=n),this.dispatchEvent(new s("auto-complete-change",{bubbles:!0,relatedTarget:i.input}))}}}window.customElements.get("auto-complete")||(window.AutocompleteElement=l,window.customElements.define("auto-complete",l));class h extends HTMLElement{constructor(){super(),this.addEventListener("keydown",(t=>{const e=t.target;if(!(e instanceof HTMLElement))return;if("tab"!==e.getAttribute("role")&&!e.closest('[role="tablist"]'))return;const n=Array.from(this.querySelectorAll('[role="tablist"] [role="tab"]')),i=n.indexOf(n.find((t=>t.matches('[aria-selected="true"]'))));if("ArrowRight"===t.code){let t=i+1;t>=n.length&&(t=0),d(this,t)}else if("ArrowLeft"===t.code){let t=i-1;t<0&&(t=n.length-1),d(this,t)}else"Home"===t.code?(d(this,0),t.preventDefault()):"End"===t.code&&(d(this,n.length-1),t.preventDefault())})),this.addEventListener("click",(t=>{const e=Array.from(this.querySelectorAll('[role="tablist"] [role="tab"]'));if(!(t.target instanceof Element))return;const n=t.target.closest('[role="tab"]');if(!n||!n.closest('[role="tablist"]'))return;d(this,e.indexOf(n))}))}connectedCallback(){for(const t of this.querySelectorAll('[role="tablist"] [role="tab"]'))t.hasAttribute("aria-selected")||t.setAttribute("aria-selected","false"),t.hasAttribute("tabindex")||("true"===t.getAttribute("aria-selected")?t.setAttribute("tabindex","0"):t.setAttribute("tabindex","-1"))}}function d(t,e){const n=t.querySelectorAll('[role="tablist"] [role="tab"]'),i=t.querySelectorAll('[role="tabpanel"]'),r=n[e],s=i[e];if(!!t.dispatchEvent(new CustomEvent("tab-container-change",{bubbles:!0,cancelable:!0,detail:{relatedTarget:s}}))){for(const t of n)t.setAttribute("aria-selected","false"),t.setAttribute("tabindex","-1");for(const t of i)t.hidden=!0,t.hasAttribute("tabindex")||t.hasAttribute("data-tab-container-no-tabstop")||t.setAttribute("tabindex","0");r.setAttribute("aria-selected","true"),r.setAttribute("tabindex","0"),r.focus(),s.hidden=!1,t.dispatchEvent(new CustomEvent("tab-container-changed",{bubbles:!0,detail:{relatedTarget:s}}))}}window.customElements.get("tab-container")||(window.TabContainerElement=h,window.customElements.define("tab-container",h));const m=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],p=["January","February","March","April","May","June","July","August","September","October","November","December"];function f(t){return"0".concat(t).slice(-2)}function b(t,e){const n=t.getDay(),i=t.getDate(),r=t.getMonth(),s=t.getFullYear(),o=t.getHours(),a=t.getMinutes(),c=t.getSeconds();return e.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g,(function(e){let u;switch(e[1]){case"%":return"%";case"a":return m[n].slice(0,3);case"A":return m[n];case"b":return p[r].slice(0,3);case"B":return p[r];case"c":return t.toString();case"d":return f(i);case"e":return String(i);case"H":return f(o);case"I":return f(b(t,"%l"));case"l":return String(0===o||12===o?12:(o+12)%12);case"m":return f(r+1);case"M":return f(a);case"p":return o>11?"PM":"AM";case"P":return o>11?"pm":"am";case"S":return f(c);case"w":return String(n);case"y":return f(s%100);case"Y":return String(s);case"Z":return u=t.toString().match(/\((\w+)\)$/),u?u[1]:"";case"z":return u=t.toString().match(/\w([+-]\d\d\d\d) /),u?u[1]:""}return""}))}function g(t){let e;return function(){if(e)return e;if("Intl"in window)try{return e=new Intl.DateTimeFormat(void 0,t),e}catch(t){if(!(t instanceof RangeError))throw t}}}let w=null;const v=g({day:"numeric",month:"short"});function y(){if(null!==w)return w;const t=v();if(t){const e=t.format(new Date(0));return w=!!e.match(/^\d/),w}return!1}let A=null;const E=g({day:"numeric",month:"short",year:"numeric"});function M(t){const e=t.closest("[lang]");return e instanceof HTMLElement&&e.lang?e.lang:"default"}const T=new WeakMap;class k extends HTMLElement{static get observedAttributes(){return["datetime","day","format","lang","hour","minute","month","second","title","weekday","year"]}connectedCallback(){const t=this.getFormattedTitle();t&&!this.hasAttribute("title")&&this.setAttribute("title",t);const e=this.getFormattedDate();e&&(this.textContent=e)}attributeChangedCallback(t,e,n){const i=this.getFormattedTitle();if("datetime"===t){const t=Date.parse(n);isNaN(t)?T.delete(this):T.set(this,new Date(t))}const r=this.getFormattedTitle(),s=this.getAttribute("title");"title"===t||!r||s&&s!==i||this.setAttribute("title",r);const o=this.getFormattedDate();o&&(this.textContent=o)}get date(){return T.get(this)}getFormattedTitle(){const t=this.date;if(!t)return;const e=C();if(e)return e.format(t);try{return t.toLocaleString()}catch(e){if(e instanceof RangeError)return t.toString();throw e}}getFormattedDate(){}}const C=g({day:"numeric",month:"short",year:"numeric",hour:"numeric",minute:"2-digit",timeZoneName:"short"}),L=new WeakMap;class D extends k{attributeChangedCallback(t,e,n){"hour"!==t&&"minute"!==t&&"second"!==t&&"time-zone-name"!==t||L.delete(this),super.attributeChangedCallback(t,e,n)}getFormattedDate(){const t=this.date;if(!t)return;const e=function(t,e){const n={weekday:{short:"%a",long:"%A"},day:{numeric:"%e","2-digit":"%d"},month:{short:"%b",long:"%B"},year:{numeric:"%Y","2-digit":"%y"}};let i=y()?"weekday day month year":"weekday month day, year";for(const e in n){const r=n[e][t.getAttribute(e)];i=i.replace(e,r||"")}return i=i.replace(/(\s,)|(,\s$)/,""),b(e,i).replace(/\s+/," ").trim()}(this,t)||"",n=function(t,e){const n={},i=t.getAttribute("hour");"numeric"!==i&&"2-digit"!==i||(n.hour=i);const r=t.getAttribute("minute");"numeric"!==r&&"2-digit"!==r||(n.minute=r);const s=t.getAttribute("second");"numeric"!==s&&"2-digit"!==s||(n.second=s);const o=t.getAttribute("time-zone-name");"short"!==o&&"long"!==o||(n.timeZoneName=o);if(0===Object.keys(n).length)return;let a=L.get(t);a||(a=g(n),L.set(t,a));const c=a();if(c)return c.format(e);return b(e,n.second?"%H:%M:%S":"%H:%M")}(this,t)||"";return"".concat(e," ").concat(n).trim()}}window.customElements.get("local-time")||(window.LocalTimeElement=D,window.customElements.define("local-time",D));class S{constructor(t,e){this.date=t,this.locale=e}toString(){const t=this.timeElapsed();if(t)return t;{const t=this.timeAhead();return t||"on ".concat(this.formatDate())}}timeElapsed(){const t=(new Date).getTime()-this.date.getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24);return t>=0&&r<30?this.timeAgoFromMs(t):null}timeAhead(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24);return t>=0&&r<30?this.timeUntil():null}timeAgo(){const t=(new Date).getTime()-this.date.getTime();return this.timeAgoFromMs(t)}timeAgoFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24),s=Math.round(r/30),o=Math.round(s/12);return t<0||e<10?x(this.locale,0,"second"):e<45?x(this.locale,-e,"second"):e<90||n<45?x(this.locale,-n,"minute"):n<90||i<24?x(this.locale,-i,"hour"):i<36||r<30?x(this.locale,-r,"day"):s<18?x(this.locale,-s,"month"):x(this.locale,-o,"year")}microTimeAgo(){const t=(new Date).getTime()-this.date.getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24),s=Math.round(r/30),o=Math.round(s/12);return n<1?"1m":n<60?"".concat(n,"m"):i<24?"".concat(i,"h"):r<365?"".concat(r,"d"):"".concat(o,"y")}timeUntil(){const t=this.date.getTime()-(new Date).getTime();return this.timeUntilFromMs(t)}timeUntilFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24),s=Math.round(r/30),o=Math.round(s/12);return s>=18||s>=12?x(this.locale,o,"year"):r>=45||r>=30?x(this.locale,s,"month"):i>=36||i>=24?x(this.locale,r,"day"):n>=90||n>=45?x(this.locale,i,"hour"):e>=90||e>=45?x(this.locale,n,"minute"):x(this.locale,e>=10?e:0,"second")}microTimeUntil(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),r=Math.round(i/24),s=Math.round(r/30),o=Math.round(s/12);return r>=365?"".concat(o,"y"):i>=24?"".concat(r,"d"):n>=60?"".concat(i,"h"):n>1?"".concat(n,"m"):"1m"}formatDate(){let t=y()?"%e %b":"%b %e";var e;return e=this.date,(new Date).getUTCFullYear()!==e.getUTCFullYear()&&(t+=function(){if(null!==A)return A;const t=E();if(t){const e=t.format(new Date(0));return A=!!e.match(/\d,/),A}return!0}()?", %Y":" %Y"),b(this.date,t)}formatTime(){const t=H();return t?t.format(this.date):b(this.date,"%l:%M%P")}}function x(t,e,n){const i=function(t,e){if("Intl"in window&&"RelativeTimeFormat"in window.Intl)try{return new Intl.RelativeTimeFormat(t,e)}catch(t){if(!(t instanceof RangeError))throw t}}(t,{numeric:"auto"});return i?i.format(e,n):function(t,e){if(0===t)switch(e){case"year":case"quarter":case"month":case"week":return"this ".concat(e);case"day":return"today";case"hour":case"minute":return"in 0 ".concat(e,"s");case"second":return"now"}else if(1===t)switch(e){case"year":case"quarter":case"month":case"week":return"next ".concat(e);case"day":return"tomorrow";case"hour":case"minute":case"second":return"in 1 ".concat(e)}else if(-1===t)switch(e){case"year":case"quarter":case"month":case"week":return"last ".concat(e);case"day":return"yesterday";case"hour":case"minute":case"second":return"1 ".concat(e," ago")}else if(t>1)switch(e){case"year":case"quarter":case"month":case"week":case"day":case"hour":case"minute":case"second":return"in ".concat(t," ").concat(e,"s")}else if(t<-1)switch(e){case"year":case"quarter":case"month":case"week":case"day":case"hour":case"minute":case"second":return"".concat(-t," ").concat(e,"s ago")}throw new RangeError("Invalid unit argument for format() '".concat(e,"'"))}(e,n)}const H=g({hour:"numeric",minute:"2-digit"});class F extends k{getFormattedDate(){const t=this.date;if(t)return new S(t,M(this)).toString()}connectedCallback(){I.push(this),q||(R(),q=setInterval(R,6e4)),super.connectedCallback()}disconnectedCallback(){const t=I.indexOf(this);-1!==t&&I.splice(t,1),I.length||q&&(clearInterval(q),q=null)}}const I=[];let q;function R(){let t,e,n;for(e=0,n=I.length;e<n;e++)t=I[e],t.textContent=t.getFormattedDate()||""}window.customElements.get("relative-time")||(window.RelativeTimeElement=F,window.customElements.define("relative-time",F));class K extends F{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new S(e,M(this)).microTimeAgo():new S(e,M(this)).timeAgo()}}window.customElements.get("time-ago")||(window.TimeAgoElement=K,window.customElements.define("time-ago",K));class U extends F{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new S(e,M(this)).microTimeUntil():new S(e,M(this)).timeUntil()}}window.customElements.get("time-until")||(window.TimeUntilElement=U,window.customElements.define("time-until",U));
1
+ const t=!!navigator.userAgent.match(/Macintosh/);class e{constructor(e,n){this.input=e,this.list=n,this.isComposing=!1,n.id||(n.id=`combobox-${Math.random().toString().slice(2,6)}`),this.keyboardEventHandler=e=>function(e,n){if(e.shiftKey||e.metaKey||e.altKey)return;if(!t&&e.ctrlKey)return;if(n.isComposing)return;switch(e.key){case"Enter":case"Tab":(function(t,e){const n=e.querySelector('[aria-selected="true"]');return!!n&&("true"===n.getAttribute("aria-disabled")||n.click(),!0)})(n.input,n.list)&&e.preventDefault();break;case"Escape":n.clearSelection();break;case"ArrowDown":n.navigate(1),e.preventDefault();break;case"ArrowUp":n.navigate(-1),e.preventDefault();break;case"n":t&&e.ctrlKey&&(n.navigate(1),e.preventDefault());break;case"p":t&&e.ctrlKey&&(n.navigate(-1),e.preventDefault());break;default:if(e.ctrlKey)break;n.clearSelection()}}(e,this),this.compositionEventHandler=t=>function(t,e){e.isComposing="compositionstart"===t.type;if(!document.getElementById(e.input.getAttribute("aria-controls")||""))return;e.clearSelection()}(t,this),this.inputHandler=this.clearSelection.bind(this),e.setAttribute("role","combobox"),e.setAttribute("aria-controls",n.id),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-autocomplete","list"),e.setAttribute("aria-haspopup","listbox")}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute("role"),this.input.removeAttribute("aria-controls"),this.input.removeAttribute("aria-expanded"),this.input.removeAttribute("aria-autocomplete"),this.input.removeAttribute("aria-haspopup")}start(){this.input.setAttribute("aria-expanded","true"),this.input.addEventListener("compositionstart",this.compositionEventHandler),this.input.addEventListener("compositionend",this.compositionEventHandler),this.input.addEventListener("input",this.inputHandler),this.input.addEventListener("keydown",this.keyboardEventHandler),this.list.addEventListener("click",n)}stop(){this.clearSelection(),this.input.setAttribute("aria-expanded","false"),this.input.removeEventListener("compositionstart",this.compositionEventHandler),this.input.removeEventListener("compositionend",this.compositionEventHandler),this.input.removeEventListener("input",this.inputHandler),this.input.removeEventListener("keydown",this.keyboardEventHandler),this.list.removeEventListener("click",n)}navigate(t=1){const e=Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(i)[0],n=Array.from(this.list.querySelectorAll('[role="option"]')).filter(i),o=n.indexOf(e);if(o===n.length-1&&1===t||0===o&&-1===t)return this.clearSelection(),void this.input.focus();let r=1===t?0:n.length-1;if(e&&o>=0){const e=o+t;e>=0&&e<n.length&&(r=e)}const a=n[r];if(a)for(const t of n)a===t?(this.input.setAttribute("aria-activedescendant",a.id),a.setAttribute("aria-selected","true"),s(this.list,a)):t.setAttribute("aria-selected","false")}clearSelection(){this.input.removeAttribute("aria-activedescendant");for(const t of this.list.querySelectorAll('[aria-selected="true"]'))t.setAttribute("aria-selected","false")}}function n(t){if(!(t.target instanceof Element))return;const e=t.target.closest('[role="option"]');e&&"true"!==e.getAttribute("aria-disabled")&&function(t){t.dispatchEvent(new CustomEvent("combobox-commit",{bubbles:!0}))}(e)}function i(t){return!t.hidden&&!(t instanceof HTMLInputElement&&"hidden"===t.type)&&(t.offsetWidth>0||t.offsetHeight>0)}function s(t,e){(function(t,e){const n=t.scrollTop,i=n+t.clientHeight,s=e.offsetTop,o=s+e.clientHeight;return s>=n&&o<=i})(t,e)||(t.scrollTop=e.offsetTop)}class o extends CustomEvent{constructor(t,e){super(t,e),this.relatedTarget=e.relatedTarget}}const r=new WeakMap;function a(t,e){const n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","text/fragment+html"),function(t,e){const n=r.get(t);n&&n.abort();r.set(t,e);const i=()=>r.delete(t),s=function(t){return new Promise(((e,n)=>{t.onload=function(){t.status>=200&&t.status<300?e(t.responseText):n(new Error(t.responseText))},t.onerror=n,t.send()}))}(e);return s.then(i,i),s}(t,n)}class c{constructor(t,n,i){this.container=t,this.input=n,this.results=i,this.combobox=new e(n,i),this.results.hidden=!0,this.input.setAttribute("autocomplete","off"),this.input.setAttribute("spellcheck","false"),this.interactingWithList=!1,this.onInputChange=function(t,e=0){let n;return function(...i){clearTimeout(n),n=window.setTimeout((()=>{clearTimeout(n),t(...i)}),e)}}(this.onInputChange.bind(this),300),this.onResultsMouseDown=this.onResultsMouseDown.bind(this),this.onInputBlur=this.onInputBlur.bind(this),this.onInputFocus=this.onInputFocus.bind(this),this.onKeydown=this.onKeydown.bind(this),this.onCommit=this.onCommit.bind(this),this.input.addEventListener("keydown",this.onKeydown),this.input.addEventListener("focus",this.onInputFocus),this.input.addEventListener("blur",this.onInputBlur),this.input.addEventListener("input",this.onInputChange),this.results.addEventListener("mousedown",this.onResultsMouseDown),this.results.addEventListener("combobox-commit",this.onCommit)}destroy(){this.input.removeEventListener("keydown",this.onKeydown),this.input.removeEventListener("focus",this.onInputFocus),this.input.removeEventListener("blur",this.onInputBlur),this.input.removeEventListener("input",this.onInputChange),this.results.removeEventListener("mousedown",this.onResultsMouseDown),this.results.removeEventListener("combobox-commit",this.onCommit)}onKeydown(t){if("Escape"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowUp"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowDown"===t.key&&!this.container.open){if(!this.input.value.trim())return;this.container.open=!0,t.stopPropagation(),t.preventDefault()}}onInputFocus(){this.fetchResults()}onInputBlur(){this.interactingWithList?this.interactingWithList=!1:this.container.open=!1}onCommit({target:t}){const e=t;if(!(e instanceof HTMLElement))return;if(this.container.open=!1,e instanceof HTMLAnchorElement)return;const n=e.getAttribute("data-autocomplete-value")||e.textContent;this.container.value=n}onResultsMouseDown(){this.interactingWithList=!0}onInputChange(){this.container.removeAttribute("value"),this.fetchResults()}identifyOptions(){let t=0;for(const e of this.results.querySelectorAll('[role="option"]:not([id])'))e.id=`${this.results.id}-option-${t++}`}fetchResults(){const t=this.input.value.trim();if(!t)return void(this.container.open=!1);const e=this.container.src;if(!e)return;const n=new URL(e,window.location.href),i=new URLSearchParams(n.search.slice(1));i.append("q",t),n.search=i.toString(),this.container.dispatchEvent(new CustomEvent("loadstart")),a(this.input,n.toString()).then((t=>{this.results.innerHTML=t,this.identifyOptions();const e=!!this.results.querySelector('[role="option"]');this.container.open=e,this.container.dispatchEvent(new CustomEvent("load")),this.container.dispatchEvent(new CustomEvent("loadend"))})).catch((()=>{this.container.dispatchEvent(new CustomEvent("error")),this.container.dispatchEvent(new CustomEvent("loadend"))}))}open(){this.results.hidden&&(this.combobox.start(),this.results.hidden=!1)}close(){this.results.hidden||(this.combobox.stop(),this.results.hidden=!0)}}const u=new WeakMap;class l extends HTMLElement{constructor(){super()}connectedCallback(){const t=this.getAttribute("for");if(!t)return;const e=this.querySelector("input"),n=document.getElementById(t);e instanceof HTMLInputElement&&n&&(u.set(this,new c(this,e,n)),n.setAttribute("role","listbox"))}disconnectedCallback(){const t=u.get(this);t&&(t.destroy(),u.delete(this))}get src(){return this.getAttribute("src")||""}set src(t){this.setAttribute("src",t)}get value(){return this.getAttribute("value")||""}set value(t){this.setAttribute("value",t)}get open(){return this.hasAttribute("open")}set open(t){t?this.setAttribute("open",""):this.removeAttribute("open")}static get observedAttributes(){return["open","value"]}attributeChangedCallback(t,e,n){if(e===n)return;const i=u.get(this);if(i)switch(t){case"open":null===n?i.close():i.open();break;case"value":null!==n&&(i.input.value=n),this.dispatchEvent(new o("auto-complete-change",{bubbles:!0,relatedTarget:i.input}))}}}function d(t){if("clipboard"in navigator)return navigator.clipboard.writeText(t.textContent);const e=getSelection();if(null==e)return Promise.reject(new Error);e.removeAllRanges();const n=document.createRange();return n.selectNodeContents(t),e.addRange(n),document.execCommand("copy"),e.removeAllRanges(),Promise.resolve()}function h(t){if("clipboard"in navigator)return navigator.clipboard.writeText(t);const e=document.body;if(!e)return Promise.reject(new Error);const n=function(t){const e=document.createElement("pre");return e.style.width="1px",e.style.height="1px",e.style.position="fixed",e.style.top="5px",e.textContent=t,e}(t);return e.appendChild(n),d(n),e.removeChild(n),Promise.resolve()}function m(t){const e=t.getAttribute("for"),n=t.getAttribute("value");function i(){t.dispatchEvent(new CustomEvent("clipboard-copy",{bubbles:!0}))}if(n)h(n).then(i);else if(e){const n="getRootNode"in Element.prototype?t.getRootNode():t.ownerDocument;if(!(n instanceof Document||"ShadowRoot"in window&&n instanceof ShadowRoot))return;const o=n.getElementById(e);o&&(s=o,s instanceof HTMLInputElement||s instanceof HTMLTextAreaElement?h(s.value):s instanceof HTMLAnchorElement&&s.hasAttribute("href")?h(s.href):d(s)).then(i)}var s}function f(t){const e=t.currentTarget;e instanceof HTMLElement&&m(e)}function p(t){if(" "===t.key||"Enter"===t.key){const e=t.currentTarget;e instanceof HTMLElement&&(t.preventDefault(),m(e))}}function g(t){t.currentTarget.addEventListener("keydown",p)}function b(t){t.currentTarget.removeEventListener("keydown",p)}window.customElements.get("auto-complete")||(window.AutocompleteElement=l,window.customElements.define("auto-complete",l));class w extends HTMLElement{constructor(){super(),this.addEventListener("click",f),this.addEventListener("focus",g),this.addEventListener("blur",b)}connectedCallback(){this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),this.hasAttribute("role")||this.setAttribute("role","button")}get value(){return this.getAttribute("value")||""}set value(t){this.setAttribute("value",t)}}window.customElements.get("clipboard-copy")||(window.ClipboardCopyElement=w,window.customElements.define("clipboard-copy",w));function v(t){""===t.style.display||"block"===t.style.display?t.style.display="none":t.style.display="block"}function y(t){const[e,n]=t.querySelectorAll(".octicon");e&&n&&(v(e),v(n))}const E=new WeakMap;document.addEventListener("clipboard-copy",(function({target:t}){if(!(t instanceof HTMLElement))return;if(!t.hasAttribute("data-view-component"))return;const e=E.get(t);e?(clearTimeout(e),E.delete(t)):y(t),E.set(t,setTimeout(y,2e3,t))}));class A extends HTMLElement{constructor(){super(),this.addEventListener("keydown",(t=>{const e=t.target;if(!(e instanceof HTMLElement))return;if("tab"!==e.getAttribute("role")&&!e.closest('[role="tablist"]'))return;const n=Array.from(this.querySelectorAll('[role="tablist"] [role="tab"]')),i=n.indexOf(n.find((t=>t.matches('[aria-selected="true"]'))));if("ArrowRight"===t.code){let t=i+1;t>=n.length&&(t=0),M(this,t)}else if("ArrowLeft"===t.code){let t=i-1;t<0&&(t=n.length-1),M(this,t)}else"Home"===t.code?(M(this,0),t.preventDefault()):"End"===t.code&&(M(this,n.length-1),t.preventDefault())})),this.addEventListener("click",(t=>{const e=Array.from(this.querySelectorAll('[role="tablist"] [role="tab"]'));if(!(t.target instanceof Element))return;const n=t.target.closest('[role="tab"]');if(!n||!n.closest('[role="tablist"]'))return;M(this,e.indexOf(n))}))}connectedCallback(){for(const t of this.querySelectorAll('[role="tablist"] [role="tab"]'))t.hasAttribute("aria-selected")||t.setAttribute("aria-selected","false"),t.hasAttribute("tabindex")||("true"===t.getAttribute("aria-selected")?t.setAttribute("tabindex","0"):t.setAttribute("tabindex","-1"))}}function M(t,e){const n=t.querySelectorAll('[role="tablist"] [role="tab"]'),i=t.querySelectorAll('[role="tabpanel"]'),s=n[e],o=i[e];if(!!t.dispatchEvent(new CustomEvent("tab-container-change",{bubbles:!0,cancelable:!0,detail:{relatedTarget:o}}))){for(const t of n)t.setAttribute("aria-selected","false"),t.setAttribute("tabindex","-1");for(const t of i)t.hidden=!0,t.hasAttribute("tabindex")||t.hasAttribute("data-tab-container-no-tabstop")||t.setAttribute("tabindex","0");s.setAttribute("aria-selected","true"),s.setAttribute("tabindex","0"),s.focus(),o.hidden=!1,t.dispatchEvent(new CustomEvent("tab-container-changed",{bubbles:!0,detail:{relatedTarget:o}}))}}window.customElements.get("tab-container")||(window.TabContainerElement=A,window.customElements.define("tab-container",A));const T=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],x=["January","February","March","April","May","June","July","August","September","October","November","December"];function L(t){return`0${t}`.slice(-2)}function k(t,e){const n=t.getDay(),i=t.getDate(),s=t.getMonth(),o=t.getFullYear(),r=t.getHours(),a=t.getMinutes(),c=t.getSeconds();return e.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g,(function(e){let u;switch(e[1]){case"%":return"%";case"a":return T[n].slice(0,3);case"A":return T[n];case"b":return x[s].slice(0,3);case"B":return x[s];case"c":return t.toString();case"d":return L(i);case"e":return String(i);case"H":return L(r);case"I":return L(k(t,"%l"));case"l":return String(0===r||12===r?12:(r+12)%12);case"m":return L(s+1);case"M":return L(a);case"p":return r>11?"PM":"AM";case"P":return r>11?"pm":"am";case"S":return L(c);case"w":return String(n);case"y":return L(o%100);case"Y":return String(o);case"Z":return u=t.toString().match(/\((\w+)\)$/),u?u[1]:"";case"z":return u=t.toString().match(/\w([+-]\d\d\d\d) /),u?u[1]:""}return""}))}function C(t){let e;return function(){if(e)return e;if("Intl"in window)try{return e=new Intl.DateTimeFormat(void 0,t),e}catch(t){if(!(t instanceof RangeError))throw t}}}let S=null;const H=C({day:"numeric",month:"short"});function D(){if(null!==S)return S;const t=H();if(t){const e=t.format(new Date(0));return S=!!e.match(/^\d/),S}return!1}let $=null;const I=C({day:"numeric",month:"short",year:"numeric"});function R(t){const e=t.closest("[lang]");return e instanceof HTMLElement&&e.lang?e.lang:"default"}const F=new WeakMap;class Y extends HTMLElement{static get observedAttributes(){return["datetime","day","format","lang","hour","minute","month","second","title","weekday","year","time-zone-name"]}connectedCallback(){const t=this.getFormattedTitle();t&&!this.hasAttribute("title")&&this.setAttribute("title",t);const e=this.getFormattedDate();e&&(this.textContent=e)}attributeChangedCallback(t,e,n){const i=this.getFormattedTitle();if("datetime"===t){const t=Date.parse(n);isNaN(t)?F.delete(this):F.set(this,new Date(t))}const s=this.getFormattedTitle(),o=this.getAttribute("title");"title"===t||!s||o&&o!==i||this.setAttribute("title",s);const r=this.getFormattedDate();r&&(this.textContent=r)}get date(){return F.get(this)}getFormattedTitle(){const t=this.date;if(!t)return;const e=q();if(e)return e.format(t);try{return t.toLocaleString()}catch(e){if(e instanceof RangeError)return t.toString();throw e}}getFormattedDate(){}}const q=C({day:"numeric",month:"short",year:"numeric",hour:"numeric",minute:"2-digit",timeZoneName:"short"}),W=new WeakMap;class X extends Y{attributeChangedCallback(t,e,n){"hour"!==t&&"minute"!==t&&"second"!==t&&"time-zone-name"!==t||W.delete(this),super.attributeChangedCallback(t,e,n)}getFormattedDate(){const t=this.date;if(!t)return;return`${function(t,e){const n={weekday:{short:"%a",long:"%A"},day:{numeric:"%e","2-digit":"%d"},month:{short:"%b",long:"%B"},year:{numeric:"%Y","2-digit":"%y"}};let i=D()?"weekday day month year":"weekday month day, year";for(const e in n){const s=n[e][t.getAttribute(e)||""];i=i.replace(e,s||"")}return i=i.replace(/(\s,)|(,\s$)/,""),k(e,i).replace(/\s+/," ").trim()}(this,t)||""} ${function(t,e){const n={},i=t.getAttribute("hour");"numeric"!==i&&"2-digit"!==i||(n.hour=i);const s=t.getAttribute("minute");"numeric"!==s&&"2-digit"!==s||(n.minute=s);const o=t.getAttribute("second");"numeric"!==o&&"2-digit"!==o||(n.second=o);const r=t.getAttribute("time-zone-name");"short"!==r&&"long"!==r||(n.timeZoneName=r);if(0===Object.keys(n).length)return;let a=W.get(t);a||(a=C(n),W.set(t,a));const c=a();if(c)return c.format(e);return k(e,n.second?"%H:%M:%S":"%H:%M")}(this,t)||""}`.trim()}}window.customElements.get("local-time")||(window.LocalTimeElement=X,window.customElements.define("local-time",X));class K{constructor(t,e){this.date=t,this.locale=e}toString(){const t=this.timeElapsed();if(t)return t;{const t=this.timeAhead();return t||`on ${this.formatDate()}`}}timeElapsed(){const t=(new Date).getTime()-this.date.getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24);return t>=0&&s<30?this.timeAgoFromMs(t):null}timeAhead(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24);return t>=0&&s<30?this.timeUntil():null}timeAgo(){const t=(new Date).getTime()-this.date.getTime();return this.timeAgoFromMs(t)}timeAgoFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return t<0||e<10?O(this.locale,0,"second"):e<45?O(this.locale,-e,"second"):e<90||n<45?O(this.locale,-n,"minute"):n<90||i<24?O(this.locale,-i,"hour"):i<36||s<30?O(this.locale,-s,"day"):o<18?O(this.locale,-o,"month"):O(this.locale,-r,"year")}microTimeAgo(){const t=(new Date).getTime()-this.date.getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return n<1?"1m":n<60?`${n}m`:i<24?`${i}h`:s<365?`${s}d`:`${r}y`}timeUntil(){const t=this.date.getTime()-(new Date).getTime();return this.timeUntilFromMs(t)}timeUntilFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return o>=18||o>=12?O(this.locale,r,"year"):s>=45||s>=30?O(this.locale,o,"month"):i>=36||i>=24?O(this.locale,s,"day"):n>=90||n>=45?O(this.locale,i,"hour"):e>=90||e>=45?O(this.locale,n,"minute"):O(this.locale,e>=10?e:0,"second")}microTimeUntil(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return s>=365?`${r}y`:i>=24?`${s}d`:n>=60?`${i}h`:n>1?`${n}m`:"1m"}formatDate(){let t=D()?"%e %b":"%b %e";var e;return e=this.date,(new Date).getUTCFullYear()!==e.getUTCFullYear()&&(t+=function(){if(null!==$)return $;const t=I();if(t){const e=t.format(new Date(0));return $=!!e.match(/\d,/),$}return!0}()?", %Y":" %Y"),k(this.date,t)}formatTime(){const t=z();return t?t.format(this.date):k(this.date,"%l:%M%P")}}function O(t,e,n){const i=function(t,e){if("Intl"in window&&"RelativeTimeFormat"in window.Intl)try{return new Intl.RelativeTimeFormat(t,e)}catch(t){if(!(t instanceof RangeError))throw t}}(t,{numeric:"auto"});return i?i.format(e,n):function(t,e){if(0===t)switch(e){case"year":case"quarter":case"month":case"week":return`this ${e}`;case"day":return"today";case"hour":case"minute":return`in 0 ${e}s`;case"second":return"now"}else if(1===t)switch(e){case"year":case"quarter":case"month":case"week":return`next ${e}`;case"day":return"tomorrow";case"hour":case"minute":case"second":return`in 1 ${e}`}else if(-1===t)switch(e){case"year":case"quarter":case"month":case"week":return`last ${e}`;case"day":return"yesterday";case"hour":case"minute":case"second":return`1 ${e} ago`}else if(t>1)switch(e){case"year":case"quarter":case"month":case"week":case"day":case"hour":case"minute":case"second":return`in ${t} ${e}s`}else if(t<-1)switch(e){case"year":case"quarter":case"month":case"week":case"day":case"hour":case"minute":case"second":return`${-t} ${e}s ago`}throw new RangeError(`Invalid unit argument for format() '${e}'`)}(e,n)}const z=C({hour:"numeric",minute:"2-digit"});class U extends Y{getFormattedDate(){const t=this.date;if(t)return new K(t,R(this)).toString()}connectedCallback(){P.push(this),B||(N(),B=window.setInterval(N,6e4)),super.connectedCallback()}disconnectedCallback(){const t=P.indexOf(this);-1!==t&&P.splice(t,1),P.length||B&&(clearInterval(B),B=null)}}const P=[];let B;function N(){let t,e,n;for(e=0,n=P.length;e<n;e++)t=P[e],t.textContent=t.getFormattedDate()||""}window.customElements.get("relative-time")||(window.RelativeTimeElement=U,window.customElements.define("relative-time",U));class Z extends U{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new K(e,R(this)).microTimeAgo():new K(e,R(this)).timeAgo()}}window.customElements.get("time-ago")||(window.TimeAgoElement=Z,window.customElements.define("time-ago",Z));class j extends U{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new K(e,R(this)).microTimeUntil():new K(e,R(this)).timeUntil()}}window.customElements.get("time-until")||(window.TimeUntilElement=j,window.customElements.define("time-until",j));const J=new WeakMap,G=new WeakMap,Q=new WeakMap;function V(t){const e=t.currentTarget;if(!(e instanceof rt))return;const{box:n,image:i}=Q.get(e)||{};if(!n||!i)return;let s=0,o=0;if(t instanceof KeyboardEvent)"ArrowUp"===t.key?o=-1:"ArrowDown"===t.key?o=1:"ArrowLeft"===t.key?s=-1:"ArrowRight"===t.key&&(s=1);else if(G.has(e)&&t instanceof MouseEvent){const n=G.get(e);s=t.pageX-n.dragStartX,o=t.pageY-n.dragStartY}else if(G.has(e)&&t instanceof TouchEvent){const{pageX:n,pageY:i}=t.changedTouches[0],{dragStartX:r,dragStartY:a}=G.get(e);s=n-r,o=i-a}if(0!==s||0!==o){const t=Math.min(Math.max(0,n.offsetLeft+s),i.width-n.offsetWidth),r=Math.min(Math.max(0,n.offsetTop+o),i.height-n.offsetHeight);n.style.left=`${t}px`,n.style.top=`${r}px`,ot(e,{x:t,y:r,width:n.offsetWidth,height:n.offsetHeight})}if(t instanceof MouseEvent)G.set(e,{dragStartX:t.pageX,dragStartY:t.pageY});else if(t instanceof TouchEvent){const{pageX:n,pageY:i}=t.changedTouches[0];G.set(e,{dragStartX:n,dragStartY:i})}}function _(t){const e=t.target;if(!(e instanceof HTMLElement))return;const n=tt(e);if(!(n instanceof rt))return;const{box:i}=Q.get(n)||{};if(!i)return;const s=n.getBoundingClientRect();let o,r,a;if(t instanceof KeyboardEvent){if("Escape"===t.key)return it(n);if("-"===t.key&&(a=-10),"="===t.key&&(a=10),!a)return;o=i.offsetWidth+a,r=i.offsetHeight+a,J.set(n,{startX:i.offsetLeft,startY:i.offsetTop})}else if(t instanceof MouseEvent){const e=J.get(n);if(!e)return;o=t.pageX-e.startX-s.left-window.pageXOffset,r=t.pageY-e.startY-s.top-window.pageYOffset}else if(t instanceof TouchEvent){const e=J.get(n);if(!e)return;o=t.changedTouches[0].pageX-e.startX-s.left-window.pageXOffset,r=t.changedTouches[0].pageY-e.startY-s.top-window.pageYOffset}o&&r&&nt(n,o,r,!(t instanceof KeyboardEvent))}function tt(t){const e=t.getRootNode();return e instanceof ShadowRoot?e.host:t}function et(t){const e=t.currentTarget;if(!(e instanceof HTMLElement))return;const n=tt(e);if(!(n instanceof rt))return;const{box:i}=Q.get(n)||{};if(!i)return;const s=t.target;if(s instanceof HTMLElement)if(s.hasAttribute("data-direction")){const e=s.getAttribute("data-direction")||"";n.addEventListener("mousemove",_),n.addEventListener("touchmove",_,{passive:!0}),["nw","se"].indexOf(e)>=0&&n.classList.add("nwse"),["ne","sw"].indexOf(e)>=0&&n.classList.add("nesw"),J.set(n,{startX:i.offsetLeft+(["se","ne"].indexOf(e)>=0?0:i.offsetWidth),startY:i.offsetTop+(["se","sw"].indexOf(e)>=0?0:i.offsetHeight)}),_(t)}else n.addEventListener("mousemove",V),n.addEventListener("touchmove",V,{passive:!0})}function nt(t,e,n,i=!0){let s=Math.max(Math.abs(e),Math.abs(n),10);const o=J.get(t);if(!o)return;const{box:r,image:a}=Q.get(t)||{};if(!r||!a)return;s=Math.min(s,n>0?a.height-o.startY:o.startY,e>0?a.width-o.startX:o.startX);const c=i?Math.round(Math.max(0,e>0?o.startX:o.startX-s)):r.offsetLeft,u=i?Math.round(Math.max(0,n>0?o.startY:o.startY-s)):r.offsetTop;r.style.left=`${c}px`,r.style.top=`${u}px`,r.style.width=`${s}px`,r.style.height=`${s}px`,ot(t,{x:c,y:u,width:s,height:s})}function it(t){const{image:e}=Q.get(t)||{};if(!e)return;const n=Math.round(e.clientWidth>e.clientHeight?e.clientHeight:e.clientWidth);J.set(t,{startX:(e.clientWidth-n)/2,startY:(e.clientHeight-n)/2}),nt(t,n,n)}function st(t){const e=t.currentTarget;e instanceof rt&&(G.delete(e),e.classList.remove("nwse","nesw"),e.removeEventListener("mousemove",_),e.removeEventListener("mousemove",V),e.removeEventListener("touchmove",_),e.removeEventListener("touchmove",V))}function ot(t,e){const{image:n}=Q.get(t)||{};if(!n)return;const i=n.naturalWidth/n.width;for(const n in e){const s=Math.round(e[n]*i);e[n]=s;const o=t.querySelector(`[data-image-crop-input='${n}']`);o instanceof HTMLInputElement&&(o.value=s.toString())}t.dispatchEvent(new CustomEvent("image-crop-change",{bubbles:!0,detail:e}))}class rt extends HTMLElement{connectedCallback(){if(Q.has(this))return;const t=this.attachShadow({mode:"open"});t.innerHTML='\n<style>\n :host { touch-action: none; display: block; }\n :host(.nesw) { cursor: nesw-resize; }\n :host(.nwse) { cursor: nwse-resize; }\n :host(.nesw) .crop-box, :host(.nwse) .crop-box { cursor: inherit; }\n :host([loaded]) .crop-image { display: block; }\n :host([loaded]) ::slotted([data-loading-slot]), .crop-image { display: none; }\n\n .crop-wrapper {\n position: relative;\n font-size: 0;\n }\n .crop-container {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n overflow: hidden;\n z-index: 1;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n :host([rounded]) .crop-box {\n border-radius: 50%;\n box-shadow: 0 0 0 4000px rgba(0, 0, 0, 0.3);\n }\n .crop-box {\n position: absolute;\n border: 1px dashed #fff;\n box-sizing: border-box;\n cursor: move;\n }\n\n :host([rounded]) .crop-outline {\n outline: none;\n }\n .crop-outline {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n outline: 4000px solid rgba(0, 0, 0, .3);\n }\n\n .handle { position: absolute; }\n :host([rounded]) .handle::before { border-radius: 50%; }\n .handle:before {\n position: absolute;\n display: block;\n padding: 4px;\n transform: translate(-50%, -50%);\n content: \' \';\n background: #fff;\n border: 1px solid #767676;\n }\n .ne { top: 0; right: 0; cursor: nesw-resize; }\n .nw { top: 0; left: 0; cursor: nwse-resize; }\n .se { bottom: 0; right: 0; cursor: nwse-resize; }\n .sw { bottom: 0; left: 0; cursor: nesw-resize; }\n</style>\n<slot></slot>\n<div class="crop-wrapper">\n <img width="100%" class="crop-image" alt="">\n <div class="crop-container">\n <div data-crop-box class="crop-box">\n <div class="crop-outline"></div>\n <div data-direction="nw" class="handle nw"></div>\n <div data-direction="ne" class="handle ne"></div>\n <div data-direction="sw" class="handle sw"></div>\n <div data-direction="se" class="handle se"></div>\n </div>\n </div>\n</div>\n';const e=t.querySelector("[data-crop-box]");if(!(e instanceof HTMLElement))return;const n=t.querySelector("img");n instanceof HTMLImageElement&&(Q.set(this,{box:e,image:n}),n.addEventListener("load",(()=>{this.loaded=!0,it(this)})),this.addEventListener("mouseleave",st),this.addEventListener("touchend",st),this.addEventListener("mouseup",st),e.addEventListener("mousedown",et),e.addEventListener("touchstart",et,{passive:!0}),this.addEventListener("keydown",V),this.addEventListener("keydown",_),this.src&&(n.src=this.src))}static get observedAttributes(){return["src"]}get src(){return this.getAttribute("src")}set src(t){t?this.setAttribute("src",t):this.removeAttribute("src")}get loaded(){return this.hasAttribute("loaded")}set loaded(t){t?this.setAttribute("loaded",""):this.removeAttribute("loaded")}attributeChangedCallback(t,e,n){const{image:i}=Q.get(this)||{};"src"===t&&(this.loaded=!1,i&&(i.src=n))}}window.customElements.get("image-crop")||(window.ImageCropElement=rt,window.customElements.define("image-crop",rt));
2
2
  //# sourceMappingURL=primer_view_components.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"primer_view_components.js","sources":["../../../node_modules/@github/combobox-nav/dist/index.js","../../../node_modules/@github/auto-complete-element/dist/index.js","../../../node_modules/@github/tab-container-element/dist/index.js","../../../node_modules/@github/time-elements/dist/time-elements.js"],"sourcesContent":["const ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\nexport default class Combobox {\n constructor(input, list) {\n this.input = input;\n this.list = list;\n this.isComposing = false;\n if (!list.id) {\n list.id = `combobox-${Math.random()\n .toString()\n .slice(2, 6)}`;\n }\n this.keyboardEventHandler = event => keyboardBindings(event, this);\n this.compositionEventHandler = event => trackComposition(event, this);\n this.inputHandler = this.clearSelection.bind(this);\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-controls', list.id);\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-haspopup', 'listbox');\n }\n destroy() {\n this.clearSelection();\n this.stop();\n this.input.removeAttribute('role');\n this.input.removeAttribute('aria-controls');\n this.input.removeAttribute('aria-expanded');\n this.input.removeAttribute('aria-autocomplete');\n this.input.removeAttribute('aria-haspopup');\n }\n start() {\n this.input.setAttribute('aria-expanded', 'true');\n this.input.addEventListener('compositionstart', this.compositionEventHandler);\n this.input.addEventListener('compositionend', this.compositionEventHandler);\n this.input.addEventListener('input', this.inputHandler);\n this.input.addEventListener('keydown', this.keyboardEventHandler);\n this.list.addEventListener('click', commitWithElement);\n }\n stop() {\n this.clearSelection();\n this.input.setAttribute('aria-expanded', 'false');\n this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n this.input.removeEventListener('compositionend', this.compositionEventHandler);\n this.input.removeEventListener('input', this.inputHandler);\n this.input.removeEventListener('keydown', this.keyboardEventHandler);\n this.list.removeEventListener('click', commitWithElement);\n }\n navigate(indexDiff = 1) {\n const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n const focusIndex = els.indexOf(focusEl);\n if ((focusIndex === els.length - 1 && indexDiff === 1) || (focusIndex === 0 && indexDiff === -1)) {\n this.clearSelection();\n this.input.focus();\n return;\n }\n let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n if (focusEl && focusIndex >= 0) {\n const newIndex = focusIndex + indexDiff;\n if (newIndex >= 0 && newIndex < els.length)\n indexOfItem = newIndex;\n }\n const target = els[indexOfItem];\n if (!target)\n return;\n for (const el of els) {\n if (target === el) {\n this.input.setAttribute('aria-activedescendant', target.id);\n target.setAttribute('aria-selected', 'true');\n scrollTo(this.list, target);\n }\n else {\n el.setAttribute('aria-selected', 'false');\n }\n }\n }\n clearSelection() {\n this.input.removeAttribute('aria-activedescendant');\n for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n el.setAttribute('aria-selected', 'false');\n }\n }\n}\nfunction keyboardBindings(event, combobox) {\n if (event.shiftKey || event.metaKey || event.altKey)\n return;\n if (!ctrlBindings && event.ctrlKey)\n return;\n if (combobox.isComposing)\n return;\n switch (event.key) {\n case 'Enter':\n case 'Tab':\n if (commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Escape':\n combobox.clearSelection();\n break;\n case 'ArrowDown':\n combobox.navigate(1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n combobox.navigate(-1);\n event.preventDefault();\n break;\n case 'n':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(1);\n event.preventDefault();\n }\n break;\n case 'p':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(-1);\n event.preventDefault();\n }\n break;\n default:\n if (event.ctrlKey)\n break;\n combobox.clearSelection();\n }\n}\nfunction commitWithElement(event) {\n if (!(event.target instanceof Element))\n return;\n const target = event.target.closest('[role=\"option\"]');\n if (!target)\n return;\n if (target.getAttribute('aria-disabled') === 'true')\n return;\n fireCommitEvent(target);\n}\nfunction commit(input, list) {\n const target = list.querySelector('[aria-selected=\"true\"]');\n if (!target)\n return false;\n if (target.getAttribute('aria-disabled') === 'true')\n return true;\n target.click();\n return true;\n}\nfunction fireCommitEvent(target) {\n target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true }));\n}\nfunction visible(el) {\n return (!el.hidden &&\n !(el instanceof HTMLInputElement && el.type === 'hidden') &&\n (el.offsetWidth > 0 || el.offsetHeight > 0));\n}\nfunction trackComposition(event, combobox) {\n combobox.isComposing = event.type === 'compositionstart';\n const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n if (!list)\n return;\n combobox.clearSelection();\n}\nfunction scrollTo(container, target) {\n if (!inViewport(container, target)) {\n container.scrollTop = target.offsetTop;\n }\n}\nfunction inViewport(container, element) {\n const scrollTop = container.scrollTop;\n const containerBottom = scrollTop + container.clientHeight;\n const top = element.offsetTop;\n const bottom = top + element.clientHeight;\n return top >= scrollTop && bottom <= containerBottom;\n}\n","import Combobox from '@github/combobox-nav';\n\nclass AutocompleteEvent extends CustomEvent {\n constructor(type, init) {\n super(type, init);\n this.relatedTarget = init.relatedTarget;\n }\n}\n\nfunction debounce(callback, wait = 0) {\n let timeout;\n return function (...Rest) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n clearTimeout(timeout);\n callback(...Rest);\n }, wait);\n };\n}\n\nconst requests = new WeakMap();\nfunction fragment(el, url) {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.setRequestHeader('Accept', 'text/fragment+html');\n return request(el, xhr);\n}\nfunction request(el, xhr) {\n const pending = requests.get(el);\n if (pending)\n pending.abort();\n requests.set(el, xhr);\n const clear = () => requests.delete(el);\n const result = send(xhr);\n result.then(clear, clear);\n return result;\n}\nfunction send(xhr) {\n return new Promise((resolve, reject) => {\n xhr.onload = function () {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n }\n else {\n reject(new Error(xhr.responseText));\n }\n };\n xhr.onerror = reject;\n xhr.send();\n });\n}\n\nclass Autocomplete {\n constructor(container, input, results) {\n this.container = container;\n this.input = input;\n this.results = results;\n this.combobox = new Combobox(input, results);\n this.results.hidden = true;\n this.input.setAttribute('autocomplete', 'off');\n this.input.setAttribute('spellcheck', 'false');\n this.interactingWithList = false;\n this.onInputChange = debounce(this.onInputChange.bind(this), 300);\n this.onResultsMouseDown = this.onResultsMouseDown.bind(this);\n this.onInputBlur = this.onInputBlur.bind(this);\n this.onInputFocus = this.onInputFocus.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n this.onCommit = this.onCommit.bind(this);\n this.input.addEventListener('keydown', this.onKeydown);\n this.input.addEventListener('focus', this.onInputFocus);\n this.input.addEventListener('blur', this.onInputBlur);\n this.input.addEventListener('input', this.onInputChange);\n this.results.addEventListener('mousedown', this.onResultsMouseDown);\n this.results.addEventListener('combobox-commit', this.onCommit);\n }\n destroy() {\n this.input.removeEventListener('keydown', this.onKeydown);\n this.input.removeEventListener('focus', this.onInputFocus);\n this.input.removeEventListener('blur', this.onInputBlur);\n this.input.removeEventListener('input', this.onInputChange);\n this.results.removeEventListener('mousedown', this.onResultsMouseDown);\n this.results.removeEventListener('combobox-commit', this.onCommit);\n }\n onKeydown(event) {\n if (event.key === 'Escape' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowUp' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowDown' && !this.container.open) {\n if (!this.input.value.trim())\n return;\n this.container.open = true;\n event.stopPropagation();\n event.preventDefault();\n }\n }\n onInputFocus() {\n this.fetchResults();\n }\n onInputBlur() {\n if (this.interactingWithList) {\n this.interactingWithList = false;\n return;\n }\n this.container.open = false;\n }\n onCommit({ target }) {\n const selected = target;\n if (!(selected instanceof HTMLElement))\n return;\n this.container.open = false;\n if (selected instanceof HTMLAnchorElement)\n return;\n const value = selected.getAttribute('data-autocomplete-value') || selected.textContent;\n this.container.value = value;\n }\n onResultsMouseDown() {\n this.interactingWithList = true;\n }\n onInputChange() {\n this.container.removeAttribute('value');\n this.fetchResults();\n }\n identifyOptions() {\n let id = 0;\n for (const el of this.results.querySelectorAll('[role=\"option\"]:not([id])')) {\n el.id = `${this.results.id}-option-${id++}`;\n }\n }\n fetchResults() {\n const query = this.input.value.trim();\n if (!query) {\n this.container.open = false;\n return;\n }\n const src = this.container.src;\n if (!src)\n return;\n const url = new URL(src, window.location.href);\n const params = new URLSearchParams(url.search.slice(1));\n params.append('q', query);\n url.search = params.toString();\n this.container.dispatchEvent(new CustomEvent('loadstart'));\n fragment(this.input, url.toString())\n .then(html => {\n this.results.innerHTML = html;\n this.identifyOptions();\n const hasResults = !!this.results.querySelector('[role=\"option\"]');\n this.container.open = hasResults;\n this.container.dispatchEvent(new CustomEvent('load'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n })\n .catch(() => {\n this.container.dispatchEvent(new CustomEvent('error'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n });\n }\n open() {\n if (!this.results.hidden)\n return;\n this.combobox.start();\n this.results.hidden = false;\n }\n close() {\n if (this.results.hidden)\n return;\n this.combobox.stop();\n this.results.hidden = true;\n }\n}\n\nconst state = new WeakMap();\nclass AutocompleteElement extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n const listId = this.getAttribute('for');\n if (!listId)\n return;\n const input = this.querySelector('input');\n const results = document.getElementById(listId);\n if (!(input instanceof HTMLInputElement) || !results)\n return;\n state.set(this, new Autocomplete(this, input, results));\n results.setAttribute('role', 'listbox');\n }\n disconnectedCallback() {\n const autocomplete = state.get(this);\n if (autocomplete) {\n autocomplete.destroy();\n state.delete(this);\n }\n }\n get src() {\n return this.getAttribute('src') || '';\n }\n set src(url) {\n this.setAttribute('src', url);\n }\n get value() {\n return this.getAttribute('value') || '';\n }\n set value(value) {\n this.setAttribute('value', value);\n }\n get open() {\n return this.hasAttribute('open');\n }\n set open(value) {\n if (value) {\n this.setAttribute('open', '');\n }\n else {\n this.removeAttribute('open');\n }\n }\n static get observedAttributes() {\n return ['open', 'value'];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue)\n return;\n const autocomplete = state.get(this);\n if (!autocomplete)\n return;\n switch (name) {\n case 'open':\n newValue === null ? autocomplete.close() : autocomplete.open();\n break;\n case 'value':\n if (newValue !== null) {\n autocomplete.input.value = newValue;\n }\n this.dispatchEvent(new AutocompleteEvent('auto-complete-change', {\n bubbles: true,\n relatedTarget: autocomplete.input\n }));\n break;\n }\n }\n}\n\nif (!window.customElements.get('auto-complete')) {\n window.AutocompleteElement = AutocompleteElement;\n window.customElements.define('auto-complete', AutocompleteElement);\n}\n\nexport default AutocompleteElement;\nexport { AutocompleteEvent };\n","export default class TabContainerElement extends HTMLElement {\n constructor() {\n super();\n this.addEventListener('keydown', (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n if (target.getAttribute('role') !== 'tab' && !target.closest('[role=\"tablist\"]'))\n return;\n const tabs = Array.from(this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]'));\n const currentIndex = tabs.indexOf(tabs.find(tab => tab.matches('[aria-selected=\"true\"]')));\n if (event.code === 'ArrowRight') {\n let index = currentIndex + 1;\n if (index >= tabs.length)\n index = 0;\n selectTab(this, index);\n }\n else if (event.code === 'ArrowLeft') {\n let index = currentIndex - 1;\n if (index < 0)\n index = tabs.length - 1;\n selectTab(this, index);\n }\n else if (event.code === 'Home') {\n selectTab(this, 0);\n event.preventDefault();\n }\n else if (event.code === 'End') {\n selectTab(this, tabs.length - 1);\n event.preventDefault();\n }\n });\n this.addEventListener('click', (event) => {\n const tabs = Array.from(this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]'));\n if (!(event.target instanceof Element))\n return;\n const tab = event.target.closest('[role=\"tab\"]');\n if (!tab || !tab.closest('[role=\"tablist\"]'))\n return;\n const index = tabs.indexOf(tab);\n selectTab(this, index);\n });\n }\n connectedCallback() {\n for (const tab of this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]')) {\n if (!tab.hasAttribute('aria-selected')) {\n tab.setAttribute('aria-selected', 'false');\n }\n if (!tab.hasAttribute('tabindex')) {\n if (tab.getAttribute('aria-selected') === 'true') {\n tab.setAttribute('tabindex', '0');\n }\n else {\n tab.setAttribute('tabindex', '-1');\n }\n }\n }\n }\n}\nfunction selectTab(tabContainer, index) {\n const tabs = tabContainer.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]');\n const panels = tabContainer.querySelectorAll('[role=\"tabpanel\"]');\n const selectedTab = tabs[index];\n const selectedPanel = panels[index];\n const cancelled = !tabContainer.dispatchEvent(new CustomEvent('tab-container-change', {\n bubbles: true,\n cancelable: true,\n detail: { relatedTarget: selectedPanel }\n }));\n if (cancelled)\n return;\n for (const tab of tabs) {\n tab.setAttribute('aria-selected', 'false');\n tab.setAttribute('tabindex', '-1');\n }\n for (const panel of panels) {\n panel.hidden = true;\n if (!panel.hasAttribute('tabindex') && !panel.hasAttribute('data-tab-container-no-tabstop')) {\n panel.setAttribute('tabindex', '0');\n }\n }\n selectedTab.setAttribute('aria-selected', 'true');\n selectedTab.setAttribute('tabindex', '0');\n selectedTab.focus();\n selectedPanel.hidden = false;\n tabContainer.dispatchEvent(new CustomEvent('tab-container-changed', {\n bubbles: true,\n detail: { relatedTarget: selectedPanel }\n }));\n}\nif (!window.customElements.get('tab-container')) {\n window.TabContainerElement = TabContainerElement;\n window.customElements.define('tab-container', TabContainerElement);\n}\n//# sourceMappingURL=index.js.map","const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n\nfunction pad(num) {\n return \"0\".concat(num).slice(-2);\n}\n\nfunction strftime(time, formatString) {\n const day = time.getDay();\n const date = time.getDate();\n const month = time.getMonth();\n const year = time.getFullYear();\n const hour = time.getHours();\n const minute = time.getMinutes();\n const second = time.getSeconds();\n return formatString.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g, function (_arg) {\n let match;\n const modifier = _arg[1];\n\n switch (modifier) {\n case '%':\n return '%';\n\n case 'a':\n return weekdays[day].slice(0, 3);\n\n case 'A':\n return weekdays[day];\n\n case 'b':\n return months[month].slice(0, 3);\n\n case 'B':\n return months[month];\n\n case 'c':\n return time.toString();\n\n case 'd':\n return pad(date);\n\n case 'e':\n return String(date);\n\n case 'H':\n return pad(hour);\n\n case 'I':\n return pad(strftime(time, '%l'));\n\n case 'l':\n if (hour === 0 || hour === 12) {\n return String(12);\n } else {\n return String((hour + 12) % 12);\n }\n\n case 'm':\n return pad(month + 1);\n\n case 'M':\n return pad(minute);\n\n case 'p':\n if (hour > 11) {\n return 'PM';\n } else {\n return 'AM';\n }\n\n case 'P':\n if (hour > 11) {\n return 'pm';\n } else {\n return 'am';\n }\n\n case 'S':\n return pad(second);\n\n case 'w':\n return String(day);\n\n case 'y':\n return pad(year % 100);\n\n case 'Y':\n return String(year);\n\n case 'Z':\n match = time.toString().match(/\\((\\w+)\\)$/);\n return match ? match[1] : '';\n\n case 'z':\n match = time.toString().match(/\\w([+-]\\d\\d\\d\\d) /);\n return match ? match[1] : '';\n }\n\n return '';\n });\n}\nfunction makeFormatter(options) {\n let format;\n return function () {\n if (format) return format;\n\n if ('Intl' in window) {\n try {\n format = new Intl.DateTimeFormat(undefined, options);\n return format;\n } catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n };\n}\nlet dayFirst = null;\nconst dayFirstFormatter = makeFormatter({\n day: 'numeric',\n month: 'short'\n}); // Private: Determine if the day should be formatted before the month name in\n// the user's current locale. For example, `9 Jun` for en-GB and `Jun 9`\n// for en-US.\n//\n// Returns true if the day appears before the month.\n\nfunction isDayFirst() {\n if (dayFirst !== null) {\n return dayFirst;\n }\n\n const formatter = dayFirstFormatter();\n\n if (formatter) {\n const output = formatter.format(new Date(0));\n dayFirst = !!output.match(/^\\d/);\n return dayFirst;\n } else {\n return false;\n }\n}\nlet yearSeparator = null;\nconst yearFormatter = makeFormatter({\n day: 'numeric',\n month: 'short',\n year: 'numeric'\n}); // Private: Determine if the year should be separated from the month and day\n// with a comma. For example, `9 Jun 2014` in en-GB and `Jun 9, 2014` in en-US.\n//\n// Returns true if the date needs a separator.\n\nfunction isYearSeparator() {\n if (yearSeparator !== null) {\n return yearSeparator;\n }\n\n const formatter = yearFormatter();\n\n if (formatter) {\n const output = formatter.format(new Date(0));\n yearSeparator = !!output.match(/\\d,/);\n return yearSeparator;\n } else {\n return true;\n }\n} // Private: Determine if the date occurs in the same year as today's date.\n//\n// date - The Date to test.\n//\n// Returns true if it's this year.\n\nfunction isThisYear(date) {\n const now = new Date();\n return now.getUTCFullYear() === date.getUTCFullYear();\n}\nfunction makeRelativeFormat(locale, options) {\n if ('Intl' in window && 'RelativeTimeFormat' in window.Intl) {\n try {\n // eslint-disable-next-line flowtype/no-flow-fix-me-comments\n // $FlowFixMe: missing RelativeTimeFormat type\n return new Intl.RelativeTimeFormat(locale, options);\n } catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n} // Private: Get preferred Intl locale for a target element.\n//\n// Traverses parents until it finds an explicit `lang` other returns \"default\".\n\nfunction localeFromElement(el) {\n const container = el.closest('[lang]');\n\n if (container instanceof HTMLElement && container.lang) {\n return container.lang;\n }\n\n return 'default';\n}\n\nconst datetimes = new WeakMap();\nclass ExtendedTimeElement extends HTMLElement {\n static get observedAttributes() {\n return ['datetime', 'day', 'format', 'lang', 'hour', 'minute', 'month', 'second', 'title', 'weekday', 'year'];\n }\n\n connectedCallback() {\n const title = this.getFormattedTitle();\n\n if (title && !this.hasAttribute('title')) {\n this.setAttribute('title', title);\n }\n\n const text = this.getFormattedDate();\n\n if (text) {\n this.textContent = text;\n }\n } // Internal: Refresh the time element's formatted date when an attribute changes.\n\n\n attributeChangedCallback(attrName, oldValue, newValue) {\n const oldTitle = this.getFormattedTitle();\n\n if (attrName === 'datetime') {\n const millis = Date.parse(newValue);\n\n if (isNaN(millis)) {\n datetimes.delete(this);\n } else {\n datetimes.set(this, new Date(millis));\n }\n }\n\n const title = this.getFormattedTitle();\n const currentTitle = this.getAttribute('title');\n\n if (attrName !== 'title' && title && (!currentTitle || currentTitle === oldTitle)) {\n this.setAttribute('title', title);\n }\n\n const text = this.getFormattedDate();\n\n if (text) {\n this.textContent = text;\n }\n }\n\n get date() {\n return datetimes.get(this);\n } // Internal: Format the ISO 8601 timestamp according to the user agent's\n // locale-aware formatting rules. The element's existing `title` attribute\n // value takes precedence over this custom format.\n //\n // Returns a formatted time String.\n\n\n getFormattedTitle() {\n const date = this.date;\n if (!date) return;\n const formatter = titleFormatter();\n\n if (formatter) {\n return formatter.format(date);\n } else {\n try {\n return date.toLocaleString();\n } catch (e) {\n if (e instanceof RangeError) {\n return date.toString();\n } else {\n throw e;\n }\n }\n }\n }\n\n getFormattedDate() {}\n\n}\nconst titleFormatter = makeFormatter({\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short'\n});\n\nconst formatters = new WeakMap();\nclass LocalTimeElement extends ExtendedTimeElement {\n attributeChangedCallback(attrName, oldValue, newValue) {\n if (attrName === 'hour' || attrName === 'minute' || attrName === 'second' || attrName === 'time-zone-name') {\n formatters.delete(this);\n }\n\n super.attributeChangedCallback(attrName, oldValue, newValue);\n } // Formats the element's date, in the user's current locale, according to\n // the formatting attribute values. Values are not passed straight through to\n // an Intl.DateTimeFormat instance so that weekday and month names are always\n // displayed in English, for now.\n //\n // Supported attributes are:\n //\n // weekday - \"short\", \"long\"\n // year - \"numeric\", \"2-digit\"\n // month - \"short\", \"long\"\n // day - \"numeric\", \"2-digit\"\n // hour - \"numeric\", \"2-digit\"\n // minute - \"numeric\", \"2-digit\"\n // second - \"numeric\", \"2-digit\"\n //\n // Returns a formatted time String.\n\n\n getFormattedDate() {\n const d = this.date;\n if (!d) return;\n const date = formatDate(this, d) || '';\n const time = formatTime(this, d) || '';\n return \"\".concat(date, \" \").concat(time).trim();\n }\n\n} // Private: Format a date according to the `weekday`, `day`, `month`,\n// and `year` attribute values.\n//\n// This doesn't use Intl.DateTimeFormat to avoid creating text in the user's\n// language when the majority of the surrounding text is in English. There's\n// currently no way to separate the language from the format in Intl.\n//\n// el - The local-time element to format.\n//\n// Returns a date String or null if no date formats are provided.\n\nfunction formatDate(el, date) {\n // map attribute values to strftime\n const props = {\n weekday: {\n short: '%a',\n long: '%A'\n },\n day: {\n numeric: '%e',\n '2-digit': '%d'\n },\n month: {\n short: '%b',\n long: '%B'\n },\n year: {\n numeric: '%Y',\n '2-digit': '%y'\n }\n }; // build a strftime format string\n\n let format = isDayFirst() ? 'weekday day month year' : 'weekday month day, year';\n\n for (const prop in props) {\n const value = props[prop][el.getAttribute(prop)];\n format = format.replace(prop, value || '');\n } // clean up year separator comma\n\n\n format = format.replace(/(\\s,)|(,\\s$)/, ''); // squeeze spaces from final string\n\n return strftime(date, format).replace(/\\s+/, ' ').trim();\n} // Private: Format a time according to the `hour`, `minute`, and `second`\n// attribute values.\n//\n// el - The local-time element to format.\n//\n// Returns a time String or null if no time formats are provided.\n\n\nfunction formatTime(el, date) {\n const options = {}; // retrieve format settings from attributes\n\n const hour = el.getAttribute('hour');\n if (hour === 'numeric' || hour === '2-digit') options.hour = hour;\n const minute = el.getAttribute('minute');\n if (minute === 'numeric' || minute === '2-digit') options.minute = minute;\n const second = el.getAttribute('second');\n if (second === 'numeric' || second === '2-digit') options.second = second;\n const tz = el.getAttribute('time-zone-name');\n if (tz === 'short' || tz === 'long') options.timeZoneName = tz; // No time format attributes provided.\n\n if (Object.keys(options).length === 0) {\n return;\n }\n\n let factory = formatters.get(el);\n\n if (!factory) {\n factory = makeFormatter(options);\n formatters.set(el, factory);\n }\n\n const formatter = factory();\n\n if (formatter) {\n // locale-aware formatting of 24 or 12 hour times\n return formatter.format(date);\n } else {\n // fall back to strftime for non-Intl browsers\n const timef = options.second ? '%H:%M:%S' : '%H:%M';\n return strftime(date, timef);\n }\n} // Public: LocalTimeElement constructor.\n//\n// var time = new LocalTimeElement()\n// # => <local-time></local-time>\n//\n\n\nif (!window.customElements.get('local-time')) {\n window.LocalTimeElement = LocalTimeElement;\n window.customElements.define('local-time', LocalTimeElement);\n}\n\nclass RelativeTime {\n constructor(date, locale) {\n this.date = date;\n this.locale = locale;\n }\n\n toString() {\n const ago = this.timeElapsed();\n\n if (ago) {\n return ago;\n } else {\n const ahead = this.timeAhead();\n\n if (ahead) {\n return ahead;\n } else {\n return \"on \".concat(this.formatDate());\n }\n }\n }\n\n timeElapsed() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n\n if (ms >= 0 && day < 30) {\n return this.timeAgoFromMs(ms);\n } else {\n return null;\n }\n }\n\n timeAhead() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n\n if (ms >= 0 && day < 30) {\n return this.timeUntil();\n } else {\n return null;\n }\n }\n\n timeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n return this.timeAgoFromMs(ms);\n }\n\n timeAgoFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n\n if (ms < 0) {\n return formatRelativeTime(this.locale, 0, 'second');\n } else if (sec < 10) {\n return formatRelativeTime(this.locale, 0, 'second');\n } else if (sec < 45) {\n return formatRelativeTime(this.locale, -sec, 'second');\n } else if (sec < 90) {\n return formatRelativeTime(this.locale, -min, 'minute');\n } else if (min < 45) {\n return formatRelativeTime(this.locale, -min, 'minute');\n } else if (min < 90) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n } else if (hr < 24) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n } else if (hr < 36) {\n return formatRelativeTime(this.locale, -day, 'day');\n } else if (day < 30) {\n return formatRelativeTime(this.locale, -day, 'day');\n } else if (month < 18) {\n return formatRelativeTime(this.locale, -month, 'month');\n } else {\n return formatRelativeTime(this.locale, -year, 'year');\n }\n }\n\n microTimeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n\n if (min < 1) {\n return '1m';\n } else if (min < 60) {\n return \"\".concat(min, \"m\");\n } else if (hr < 24) {\n return \"\".concat(hr, \"h\");\n } else if (day < 365) {\n return \"\".concat(day, \"d\");\n } else {\n return \"\".concat(year, \"y\");\n }\n }\n\n timeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n return this.timeUntilFromMs(ms);\n }\n\n timeUntilFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n\n if (month >= 18) {\n return formatRelativeTime(this.locale, year, 'year');\n } else if (month >= 12) {\n return formatRelativeTime(this.locale, year, 'year');\n } else if (day >= 45) {\n return formatRelativeTime(this.locale, month, 'month');\n } else if (day >= 30) {\n return formatRelativeTime(this.locale, month, 'month');\n } else if (hr >= 36) {\n return formatRelativeTime(this.locale, day, 'day');\n } else if (hr >= 24) {\n return formatRelativeTime(this.locale, day, 'day');\n } else if (min >= 90) {\n return formatRelativeTime(this.locale, hr, 'hour');\n } else if (min >= 45) {\n return formatRelativeTime(this.locale, hr, 'hour');\n } else if (sec >= 90) {\n return formatRelativeTime(this.locale, min, 'minute');\n } else if (sec >= 45) {\n return formatRelativeTime(this.locale, min, 'minute');\n } else if (sec >= 10) {\n return formatRelativeTime(this.locale, sec, 'second');\n } else {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n }\n\n microTimeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n\n if (day >= 365) {\n return \"\".concat(year, \"y\");\n } else if (hr >= 24) {\n return \"\".concat(day, \"d\");\n } else if (min >= 60) {\n return \"\".concat(hr, \"h\");\n } else if (min > 1) {\n return \"\".concat(min, \"m\");\n } else {\n return '1m';\n }\n }\n\n formatDate() {\n let format = isDayFirst() ? '%e %b' : '%b %e';\n\n if (!isThisYear(this.date)) {\n format += isYearSeparator() ? ', %Y' : ' %Y';\n }\n\n return strftime(this.date, format);\n }\n\n formatTime() {\n const formatter = timeFormatter();\n\n if (formatter) {\n return formatter.format(this.date);\n } else {\n return strftime(this.date, '%l:%M%P');\n }\n }\n\n}\n\nfunction formatRelativeTime(locale, value, unit) {\n const formatter = makeRelativeFormat(locale, {\n numeric: 'auto'\n });\n\n if (formatter) {\n return formatter.format(value, unit);\n } else {\n return formatEnRelativeTime(value, unit);\n }\n} // Simplified \"en\" RelativeTimeFormat.format function\n//\n// Values should roughly match\n// new Intl.RelativeTimeFormat('en', {numeric: 'auto'}).format(value, unit)\n//\n\n\nfunction formatEnRelativeTime(value, unit) {\n if (value === 0) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return \"this \".concat(unit);\n\n case 'day':\n return 'today';\n\n case 'hour':\n case 'minute':\n return \"in 0 \".concat(unit, \"s\");\n\n case 'second':\n return 'now';\n }\n } else if (value === 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return \"next \".concat(unit);\n\n case 'day':\n return 'tomorrow';\n\n case 'hour':\n case 'minute':\n case 'second':\n return \"in 1 \".concat(unit);\n }\n } else if (value === -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return \"last \".concat(unit);\n\n case 'day':\n return 'yesterday';\n\n case 'hour':\n case 'minute':\n case 'second':\n return \"1 \".concat(unit, \" ago\");\n }\n } else if (value > 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return \"in \".concat(value, \" \").concat(unit, \"s\");\n }\n } else if (value < -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return \"\".concat(-value, \" \").concat(unit, \"s ago\");\n }\n }\n\n throw new RangeError(\"Invalid unit argument for format() '\".concat(unit, \"'\"));\n}\n\nconst timeFormatter = makeFormatter({\n hour: 'numeric',\n minute: '2-digit'\n});\n\nclass RelativeTimeElement extends ExtendedTimeElement {\n getFormattedDate() {\n const date = this.date;\n\n if (date) {\n return new RelativeTime(date, localeFromElement(this)).toString();\n }\n }\n\n connectedCallback() {\n nowElements.push(this);\n\n if (!updateNowElementsId) {\n updateNowElements();\n updateNowElementsId = setInterval(updateNowElements, 60 * 1000);\n }\n\n super.connectedCallback();\n }\n\n disconnectedCallback() {\n const ix = nowElements.indexOf(this);\n\n if (ix !== -1) {\n nowElements.splice(ix, 1);\n }\n\n if (!nowElements.length) {\n if (updateNowElementsId) {\n clearInterval(updateNowElementsId);\n updateNowElementsId = null;\n }\n }\n }\n\n} // Internal: Array tracking all elements attached to the document that need\n// to be updated every minute.\n\nconst nowElements = []; // Internal: Timer ID for `updateNowElements` interval.\n\nlet updateNowElementsId; // Internal: Install a timer to refresh all attached relative-time elements every\n// minute.\n\nfunction updateNowElements() {\n let time, i, len;\n\n for (i = 0, len = nowElements.length; i < len; i++) {\n time = nowElements[i];\n time.textContent = time.getFormattedDate() || '';\n }\n} // Public: RelativeTimeElement constructor.\n//\n// var time = new RelativeTimeElement()\n// # => <relative-time></relative-time>\n//\n\n\nif (!window.customElements.get('relative-time')) {\n window.RelativeTimeElement = RelativeTimeElement;\n window.customElements.define('relative-time', RelativeTimeElement);\n}\n\nclass TimeAgoElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date) return;\n\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeAgo();\n } else {\n return new RelativeTime(date, localeFromElement(this)).timeAgo();\n }\n }\n\n}\n\nif (!window.customElements.get('time-ago')) {\n window.TimeAgoElement = TimeAgoElement;\n window.customElements.define('time-ago', TimeAgoElement);\n}\n\nclass TimeUntilElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date) return;\n\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeUntil();\n } else {\n return new RelativeTime(date, localeFromElement(this)).timeUntil();\n }\n }\n\n}\n\nif (!window.customElements.get('time-until')) {\n window.TimeUntilElement = TimeUntilElement;\n window.customElements.define('time-until', TimeUntilElement);\n}\n\nexport { LocalTimeElement, RelativeTimeElement, TimeAgoElement, TimeUntilElement };\n"],"names":["ctrlBindings","navigator","userAgent","match","Combobox","[object Object]","input","list","this","isComposing","id","Math","random","toString","slice","keyboardEventHandler","event","combobox","shiftKey","metaKey","altKey","ctrlKey","key","target","querySelector","getAttribute","click","commit","preventDefault","clearSelection","navigate","keyboardBindings","compositionEventHandler","type","document","getElementById","trackComposition","inputHandler","bind","setAttribute","stop","removeAttribute","addEventListener","commitWithElement","removeEventListener","indexDiff","focusEl","Array","from","querySelectorAll","filter","visible","els","focusIndex","indexOf","length","focus","indexOfItem","newIndex","el","scrollTo","Element","closest","dispatchEvent","CustomEvent","bubbles","fireCommitEvent","hidden","HTMLInputElement","offsetWidth","offsetHeight","container","element","scrollTop","containerBottom","clientHeight","top","offsetTop","bottom","inViewport","AutocompleteEvent","init","super","relatedTarget","requests","WeakMap","fragment","url","xhr","XMLHttpRequest","open","setRequestHeader","pending","get","abort","set","clear","delete","result","Promise","resolve","reject","onload","status","responseText","Error","onerror","send","then","request","Autocomplete","results","interactingWithList","onInputChange","callback","wait","timeout","Rest","clearTimeout","window","setTimeout","debounce","onResultsMouseDown","onInputBlur","onInputFocus","onKeydown","onCommit","stopPropagation","value","trim","fetchResults","selected","HTMLElement","HTMLAnchorElement","textContent","query","src","URL","location","href","params","URLSearchParams","search","append","html","innerHTML","identifyOptions","hasResults","catch","start","state","AutocompleteElement","listId","autocomplete","destroy","hasAttribute","observedAttributes","name","oldValue","newValue","close","customElements","define","TabContainerElement","tabs","currentIndex","find","tab","matches","code","index","selectTab","tabContainer","panels","selectedTab","selectedPanel","cancelable","detail","panel","weekdays","months","pad","num","concat","strftime","time","formatString","day","getDay","date","getDate","month","getMonth","year","getFullYear","hour","getHours","minute","getMinutes","second","getSeconds","replace","_arg","String","makeFormatter","options","format","Intl","DateTimeFormat","undefined","e","RangeError","dayFirst","dayFirstFormatter","isDayFirst","formatter","output","Date","yearSeparator","yearFormatter","localeFromElement","lang","datetimes","ExtendedTimeElement","title","getFormattedTitle","text","getFormattedDate","attrName","oldTitle","millis","parse","isNaN","currentTitle","titleFormatter","toLocaleString","timeZoneName","formatters","LocalTimeElement","attributeChangedCallback","d","props","weekday","short","long","numeric","2-digit","prop","formatDate","tz","Object","keys","factory","formatTime","RelativeTime","locale","ago","timeElapsed","ahead","timeAhead","ms","getTime","sec","round","min","hr","timeAgoFromMs","timeUntil","formatRelativeTime","timeUntilFromMs","getUTCFullYear","isYearSeparator","timeFormatter","unit","RelativeTimeFormat","makeRelativeFormat","formatEnRelativeTime","RelativeTimeElement","nowElements","push","updateNowElementsId","updateNowElements","setInterval","connectedCallback","ix","splice","clearInterval","i","len","TimeAgoElement","microTimeAgo","timeAgo","TimeUntilElement","microTimeUntil"],"mappings":"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"}
1
+ {"version":3,"file":"primer_view_components.js","sources":["../../../node_modules/@github/combobox-nav/dist/index.js","../../../node_modules/@github/auto-complete-element/dist/index.js","../../../node_modules/@github/clipboard-copy-element/dist/index.esm.js","../../components/primer/clipboard_copy_component.js","../../../node_modules/@github/tab-container-element/dist/index.js","../../../node_modules/@github/time-elements/dist/index.js","../../../node_modules/@github/image-crop-element/dist/index.js"],"sourcesContent":["const ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\nexport default class Combobox {\n constructor(input, list) {\n this.input = input;\n this.list = list;\n this.isComposing = false;\n if (!list.id) {\n list.id = `combobox-${Math.random()\n .toString()\n .slice(2, 6)}`;\n }\n this.keyboardEventHandler = event => keyboardBindings(event, this);\n this.compositionEventHandler = event => trackComposition(event, this);\n this.inputHandler = this.clearSelection.bind(this);\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-controls', list.id);\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-haspopup', 'listbox');\n }\n destroy() {\n this.clearSelection();\n this.stop();\n this.input.removeAttribute('role');\n this.input.removeAttribute('aria-controls');\n this.input.removeAttribute('aria-expanded');\n this.input.removeAttribute('aria-autocomplete');\n this.input.removeAttribute('aria-haspopup');\n }\n start() {\n this.input.setAttribute('aria-expanded', 'true');\n this.input.addEventListener('compositionstart', this.compositionEventHandler);\n this.input.addEventListener('compositionend', this.compositionEventHandler);\n this.input.addEventListener('input', this.inputHandler);\n this.input.addEventListener('keydown', this.keyboardEventHandler);\n this.list.addEventListener('click', commitWithElement);\n }\n stop() {\n this.clearSelection();\n this.input.setAttribute('aria-expanded', 'false');\n this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n this.input.removeEventListener('compositionend', this.compositionEventHandler);\n this.input.removeEventListener('input', this.inputHandler);\n this.input.removeEventListener('keydown', this.keyboardEventHandler);\n this.list.removeEventListener('click', commitWithElement);\n }\n navigate(indexDiff = 1) {\n const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n const focusIndex = els.indexOf(focusEl);\n if ((focusIndex === els.length - 1 && indexDiff === 1) || (focusIndex === 0 && indexDiff === -1)) {\n this.clearSelection();\n this.input.focus();\n return;\n }\n let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n if (focusEl && focusIndex >= 0) {\n const newIndex = focusIndex + indexDiff;\n if (newIndex >= 0 && newIndex < els.length)\n indexOfItem = newIndex;\n }\n const target = els[indexOfItem];\n if (!target)\n return;\n for (const el of els) {\n if (target === el) {\n this.input.setAttribute('aria-activedescendant', target.id);\n target.setAttribute('aria-selected', 'true');\n scrollTo(this.list, target);\n }\n else {\n el.setAttribute('aria-selected', 'false');\n }\n }\n }\n clearSelection() {\n this.input.removeAttribute('aria-activedescendant');\n for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n el.setAttribute('aria-selected', 'false');\n }\n }\n}\nfunction keyboardBindings(event, combobox) {\n if (event.shiftKey || event.metaKey || event.altKey)\n return;\n if (!ctrlBindings && event.ctrlKey)\n return;\n if (combobox.isComposing)\n return;\n switch (event.key) {\n case 'Enter':\n case 'Tab':\n if (commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Escape':\n combobox.clearSelection();\n break;\n case 'ArrowDown':\n combobox.navigate(1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n combobox.navigate(-1);\n event.preventDefault();\n break;\n case 'n':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(1);\n event.preventDefault();\n }\n break;\n case 'p':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(-1);\n event.preventDefault();\n }\n break;\n default:\n if (event.ctrlKey)\n break;\n combobox.clearSelection();\n }\n}\nfunction commitWithElement(event) {\n if (!(event.target instanceof Element))\n return;\n const target = event.target.closest('[role=\"option\"]');\n if (!target)\n return;\n if (target.getAttribute('aria-disabled') === 'true')\n return;\n fireCommitEvent(target);\n}\nfunction commit(input, list) {\n const target = list.querySelector('[aria-selected=\"true\"]');\n if (!target)\n return false;\n if (target.getAttribute('aria-disabled') === 'true')\n return true;\n target.click();\n return true;\n}\nfunction fireCommitEvent(target) {\n target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true }));\n}\nfunction visible(el) {\n return (!el.hidden &&\n !(el instanceof HTMLInputElement && el.type === 'hidden') &&\n (el.offsetWidth > 0 || el.offsetHeight > 0));\n}\nfunction trackComposition(event, combobox) {\n combobox.isComposing = event.type === 'compositionstart';\n const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n if (!list)\n return;\n combobox.clearSelection();\n}\nfunction scrollTo(container, target) {\n if (!inViewport(container, target)) {\n container.scrollTop = target.offsetTop;\n }\n}\nfunction inViewport(container, element) {\n const scrollTop = container.scrollTop;\n const containerBottom = scrollTop + container.clientHeight;\n const top = element.offsetTop;\n const bottom = top + element.clientHeight;\n return top >= scrollTop && bottom <= containerBottom;\n}\n","import Combobox from '@github/combobox-nav';\n\nclass AutocompleteEvent extends CustomEvent {\n constructor(type, init) {\n super(type, init);\n this.relatedTarget = init.relatedTarget;\n }\n}\n\nfunction debounce(callback, wait = 0) {\n let timeout;\n return function (...Rest) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n clearTimeout(timeout);\n callback(...Rest);\n }, wait);\n };\n}\n\nconst requests = new WeakMap();\nfunction fragment(el, url) {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.setRequestHeader('Accept', 'text/fragment+html');\n return request(el, xhr);\n}\nfunction request(el, xhr) {\n const pending = requests.get(el);\n if (pending)\n pending.abort();\n requests.set(el, xhr);\n const clear = () => requests.delete(el);\n const result = send(xhr);\n result.then(clear, clear);\n return result;\n}\nfunction send(xhr) {\n return new Promise((resolve, reject) => {\n xhr.onload = function () {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n }\n else {\n reject(new Error(xhr.responseText));\n }\n };\n xhr.onerror = reject;\n xhr.send();\n });\n}\n\nclass Autocomplete {\n constructor(container, input, results) {\n this.container = container;\n this.input = input;\n this.results = results;\n this.combobox = new Combobox(input, results);\n this.results.hidden = true;\n this.input.setAttribute('autocomplete', 'off');\n this.input.setAttribute('spellcheck', 'false');\n this.interactingWithList = false;\n this.onInputChange = debounce(this.onInputChange.bind(this), 300);\n this.onResultsMouseDown = this.onResultsMouseDown.bind(this);\n this.onInputBlur = this.onInputBlur.bind(this);\n this.onInputFocus = this.onInputFocus.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n this.onCommit = this.onCommit.bind(this);\n this.input.addEventListener('keydown', this.onKeydown);\n this.input.addEventListener('focus', this.onInputFocus);\n this.input.addEventListener('blur', this.onInputBlur);\n this.input.addEventListener('input', this.onInputChange);\n this.results.addEventListener('mousedown', this.onResultsMouseDown);\n this.results.addEventListener('combobox-commit', this.onCommit);\n }\n destroy() {\n this.input.removeEventListener('keydown', this.onKeydown);\n this.input.removeEventListener('focus', this.onInputFocus);\n this.input.removeEventListener('blur', this.onInputBlur);\n this.input.removeEventListener('input', this.onInputChange);\n this.results.removeEventListener('mousedown', this.onResultsMouseDown);\n this.results.removeEventListener('combobox-commit', this.onCommit);\n }\n onKeydown(event) {\n if (event.key === 'Escape' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowUp' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowDown' && !this.container.open) {\n if (!this.input.value.trim())\n return;\n this.container.open = true;\n event.stopPropagation();\n event.preventDefault();\n }\n }\n onInputFocus() {\n this.fetchResults();\n }\n onInputBlur() {\n if (this.interactingWithList) {\n this.interactingWithList = false;\n return;\n }\n this.container.open = false;\n }\n onCommit({ target }) {\n const selected = target;\n if (!(selected instanceof HTMLElement))\n return;\n this.container.open = false;\n if (selected instanceof HTMLAnchorElement)\n return;\n const value = selected.getAttribute('data-autocomplete-value') || selected.textContent;\n this.container.value = value;\n }\n onResultsMouseDown() {\n this.interactingWithList = true;\n }\n onInputChange() {\n this.container.removeAttribute('value');\n this.fetchResults();\n }\n identifyOptions() {\n let id = 0;\n for (const el of this.results.querySelectorAll('[role=\"option\"]:not([id])')) {\n el.id = `${this.results.id}-option-${id++}`;\n }\n }\n fetchResults() {\n const query = this.input.value.trim();\n if (!query) {\n this.container.open = false;\n return;\n }\n const src = this.container.src;\n if (!src)\n return;\n const url = new URL(src, window.location.href);\n const params = new URLSearchParams(url.search.slice(1));\n params.append('q', query);\n url.search = params.toString();\n this.container.dispatchEvent(new CustomEvent('loadstart'));\n fragment(this.input, url.toString())\n .then(html => {\n this.results.innerHTML = html;\n this.identifyOptions();\n const hasResults = !!this.results.querySelector('[role=\"option\"]');\n this.container.open = hasResults;\n this.container.dispatchEvent(new CustomEvent('load'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n })\n .catch(() => {\n this.container.dispatchEvent(new CustomEvent('error'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n });\n }\n open() {\n if (!this.results.hidden)\n return;\n this.combobox.start();\n this.results.hidden = false;\n }\n close() {\n if (this.results.hidden)\n return;\n this.combobox.stop();\n this.results.hidden = true;\n }\n}\n\nconst state = new WeakMap();\nclass AutocompleteElement extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n const listId = this.getAttribute('for');\n if (!listId)\n return;\n const input = this.querySelector('input');\n const results = document.getElementById(listId);\n if (!(input instanceof HTMLInputElement) || !results)\n return;\n state.set(this, new Autocomplete(this, input, results));\n results.setAttribute('role', 'listbox');\n }\n disconnectedCallback() {\n const autocomplete = state.get(this);\n if (autocomplete) {\n autocomplete.destroy();\n state.delete(this);\n }\n }\n get src() {\n return this.getAttribute('src') || '';\n }\n set src(url) {\n this.setAttribute('src', url);\n }\n get value() {\n return this.getAttribute('value') || '';\n }\n set value(value) {\n this.setAttribute('value', value);\n }\n get open() {\n return this.hasAttribute('open');\n }\n set open(value) {\n if (value) {\n this.setAttribute('open', '');\n }\n else {\n this.removeAttribute('open');\n }\n }\n static get observedAttributes() {\n return ['open', 'value'];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue)\n return;\n const autocomplete = state.get(this);\n if (!autocomplete)\n return;\n switch (name) {\n case 'open':\n newValue === null ? autocomplete.close() : autocomplete.open();\n break;\n case 'value':\n if (newValue !== null) {\n autocomplete.input.value = newValue;\n }\n this.dispatchEvent(new AutocompleteEvent('auto-complete-change', {\n bubbles: true,\n relatedTarget: autocomplete.input\n }));\n break;\n }\n }\n}\n\nif (!window.customElements.get('auto-complete')) {\n window.AutocompleteElement = AutocompleteElement;\n window.customElements.define('auto-complete', AutocompleteElement);\n}\n\nexport default AutocompleteElement;\nexport { AutocompleteEvent };\n","function createNode(text) {\n const node = document.createElement('pre');\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.position = 'fixed';\n node.style.top = '5px';\n node.textContent = text;\n return node;\n}\n\nfunction copyNode(node) {\n if ('clipboard' in navigator) {\n // eslint-disable-next-line flowtype/no-flow-fix-me-comments\n // $FlowFixMe Clipboard is not defined in Flow yet.\n return navigator.clipboard.writeText(node.textContent);\n }\n\n const selection = getSelection();\n\n if (selection == null) {\n return Promise.reject(new Error());\n }\n\n selection.removeAllRanges();\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.addRange(range);\n document.execCommand('copy');\n selection.removeAllRanges();\n return Promise.resolve();\n}\nfunction copyText(text) {\n if ('clipboard' in navigator) {\n // eslint-disable-next-line flowtype/no-flow-fix-me-comments\n // $FlowFixMe Clipboard is not defined in Flow yet.\n return navigator.clipboard.writeText(text);\n }\n\n const body = document.body;\n\n if (!body) {\n return Promise.reject(new Error());\n }\n\n const node = createNode(text);\n body.appendChild(node);\n copyNode(node);\n body.removeChild(node);\n return Promise.resolve();\n}\n\nfunction copy(button) {\n const id = button.getAttribute('for');\n const text = button.getAttribute('value');\n\n function trigger() {\n button.dispatchEvent(new CustomEvent('clipboard-copy', {\n bubbles: true\n }));\n }\n\n if (text) {\n copyText(text).then(trigger);\n } else if (id) {\n const root = 'getRootNode' in Element.prototype ? button.getRootNode() : button.ownerDocument;\n if (!(root instanceof Document || 'ShadowRoot' in window && root instanceof ShadowRoot)) return;\n const node = root.getElementById(id);\n if (node) copyTarget(node).then(trigger);\n }\n}\n\nfunction copyTarget(content) {\n if (content instanceof HTMLInputElement || content instanceof HTMLTextAreaElement) {\n return copyText(content.value);\n } else if (content instanceof HTMLAnchorElement && content.hasAttribute('href')) {\n return copyText(content.href);\n } else {\n return copyNode(content);\n }\n}\n\nfunction clicked(event) {\n const button = event.currentTarget;\n\n if (button instanceof HTMLElement) {\n copy(button);\n }\n}\n\nfunction keydown(event) {\n if (event.key === ' ' || event.key === 'Enter') {\n const button = event.currentTarget;\n\n if (button instanceof HTMLElement) {\n event.preventDefault();\n copy(button);\n }\n }\n}\n\nfunction focused(event) {\n event.currentTarget.addEventListener('keydown', keydown);\n}\n\nfunction blurred(event) {\n event.currentTarget.removeEventListener('keydown', keydown);\n}\n\nclass ClipboardCopyElement extends HTMLElement {\n constructor() {\n super();\n this.addEventListener('click', clicked);\n this.addEventListener('focus', focused);\n this.addEventListener('blur', blurred);\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'button');\n }\n }\n\n get value() {\n return this.getAttribute('value') || '';\n }\n\n set value(text) {\n this.setAttribute('value', text);\n }\n\n}\n\nif (!window.customElements.get('clipboard-copy')) {\n window.ClipboardCopyElement = ClipboardCopyElement;\n window.customElements.define('clipboard-copy', ClipboardCopyElement);\n}\n\nexport default ClipboardCopyElement;\n","import '@github/clipboard-copy-element';\nconst CLIPBOARD_COPY_TIMER_DURATION = 2000;\nfunction toggleSVG(svg) {\n if (svg.style.display === '' || svg.style.display === 'block') {\n svg.style.display = 'none';\n }\n else {\n svg.style.display = 'block';\n }\n}\n// Toggle a copy button.\nfunction toggleCopyButton(button) {\n const [clippyIcon, checkIcon] = button.querySelectorAll('.octicon');\n if (!clippyIcon || !checkIcon)\n return;\n toggleSVG(clippyIcon);\n toggleSVG(checkIcon);\n}\nconst clipboardCopyElementTimers = new WeakMap();\ndocument.addEventListener('clipboard-copy', function ({ target }) {\n if (!(target instanceof HTMLElement))\n return;\n if (!target.hasAttribute('data-view-component'))\n return;\n const currentTimeout = clipboardCopyElementTimers.get(target);\n if (currentTimeout) {\n clearTimeout(currentTimeout);\n clipboardCopyElementTimers.delete(target);\n }\n else {\n toggleCopyButton(target);\n }\n clipboardCopyElementTimers.set(target, setTimeout(toggleCopyButton, CLIPBOARD_COPY_TIMER_DURATION, target));\n});\n","export default class TabContainerElement extends HTMLElement {\n constructor() {\n super();\n this.addEventListener('keydown', (event) => {\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n if (target.getAttribute('role') !== 'tab' && !target.closest('[role=\"tablist\"]'))\n return;\n const tabs = Array.from(this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]'));\n const currentIndex = tabs.indexOf(tabs.find(tab => tab.matches('[aria-selected=\"true\"]')));\n if (event.code === 'ArrowRight') {\n let index = currentIndex + 1;\n if (index >= tabs.length)\n index = 0;\n selectTab(this, index);\n }\n else if (event.code === 'ArrowLeft') {\n let index = currentIndex - 1;\n if (index < 0)\n index = tabs.length - 1;\n selectTab(this, index);\n }\n else if (event.code === 'Home') {\n selectTab(this, 0);\n event.preventDefault();\n }\n else if (event.code === 'End') {\n selectTab(this, tabs.length - 1);\n event.preventDefault();\n }\n });\n this.addEventListener('click', (event) => {\n const tabs = Array.from(this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]'));\n if (!(event.target instanceof Element))\n return;\n const tab = event.target.closest('[role=\"tab\"]');\n if (!tab || !tab.closest('[role=\"tablist\"]'))\n return;\n const index = tabs.indexOf(tab);\n selectTab(this, index);\n });\n }\n connectedCallback() {\n for (const tab of this.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]')) {\n if (!tab.hasAttribute('aria-selected')) {\n tab.setAttribute('aria-selected', 'false');\n }\n if (!tab.hasAttribute('tabindex')) {\n if (tab.getAttribute('aria-selected') === 'true') {\n tab.setAttribute('tabindex', '0');\n }\n else {\n tab.setAttribute('tabindex', '-1');\n }\n }\n }\n }\n}\nfunction selectTab(tabContainer, index) {\n const tabs = tabContainer.querySelectorAll('[role=\"tablist\"] [role=\"tab\"]');\n const panels = tabContainer.querySelectorAll('[role=\"tabpanel\"]');\n const selectedTab = tabs[index];\n const selectedPanel = panels[index];\n const cancelled = !tabContainer.dispatchEvent(new CustomEvent('tab-container-change', {\n bubbles: true,\n cancelable: true,\n detail: { relatedTarget: selectedPanel }\n }));\n if (cancelled)\n return;\n for (const tab of tabs) {\n tab.setAttribute('aria-selected', 'false');\n tab.setAttribute('tabindex', '-1');\n }\n for (const panel of panels) {\n panel.hidden = true;\n if (!panel.hasAttribute('tabindex') && !panel.hasAttribute('data-tab-container-no-tabstop')) {\n panel.setAttribute('tabindex', '0');\n }\n }\n selectedTab.setAttribute('aria-selected', 'true');\n selectedTab.setAttribute('tabindex', '0');\n selectedTab.focus();\n selectedPanel.hidden = false;\n tabContainer.dispatchEvent(new CustomEvent('tab-container-changed', {\n bubbles: true,\n detail: { relatedTarget: selectedPanel }\n }));\n}\nif (!window.customElements.get('tab-container')) {\n window.TabContainerElement = TabContainerElement;\n window.customElements.define('tab-container', TabContainerElement);\n}\n//# sourceMappingURL=index.js.map","const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst months = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December'\n];\nfunction pad(num) {\n return `0${num}`.slice(-2);\n}\nfunction strftime(time, formatString) {\n const day = time.getDay();\n const date = time.getDate();\n const month = time.getMonth();\n const year = time.getFullYear();\n const hour = time.getHours();\n const minute = time.getMinutes();\n const second = time.getSeconds();\n return formatString.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g, function (_arg) {\n let match;\n const modifier = _arg[1];\n switch (modifier) {\n case '%':\n return '%';\n case 'a':\n return weekdays[day].slice(0, 3);\n case 'A':\n return weekdays[day];\n case 'b':\n return months[month].slice(0, 3);\n case 'B':\n return months[month];\n case 'c':\n return time.toString();\n case 'd':\n return pad(date);\n case 'e':\n return String(date);\n case 'H':\n return pad(hour);\n case 'I':\n return pad(strftime(time, '%l'));\n case 'l':\n if (hour === 0 || hour === 12) {\n return String(12);\n }\n else {\n return String((hour + 12) % 12);\n }\n case 'm':\n return pad(month + 1);\n case 'M':\n return pad(minute);\n case 'p':\n if (hour > 11) {\n return 'PM';\n }\n else {\n return 'AM';\n }\n case 'P':\n if (hour > 11) {\n return 'pm';\n }\n else {\n return 'am';\n }\n case 'S':\n return pad(second);\n case 'w':\n return String(day);\n case 'y':\n return pad(year % 100);\n case 'Y':\n return String(year);\n case 'Z':\n match = time.toString().match(/\\((\\w+)\\)$/);\n return match ? match[1] : '';\n case 'z':\n match = time.toString().match(/\\w([+-]\\d\\d\\d\\d) /);\n return match ? match[1] : '';\n }\n return '';\n });\n}\nfunction makeFormatter(options) {\n let format;\n return function () {\n if (format)\n return format;\n if ('Intl' in window) {\n try {\n format = new Intl.DateTimeFormat(undefined, options);\n return format;\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n };\n}\nlet dayFirst = null;\nconst dayFirstFormatter = makeFormatter({ day: 'numeric', month: 'short' });\nfunction isDayFirst() {\n if (dayFirst !== null) {\n return dayFirst;\n }\n const formatter = dayFirstFormatter();\n if (formatter) {\n const output = formatter.format(new Date(0));\n dayFirst = !!output.match(/^\\d/);\n return dayFirst;\n }\n else {\n return false;\n }\n}\nlet yearSeparator = null;\nconst yearFormatter = makeFormatter({ day: 'numeric', month: 'short', year: 'numeric' });\nfunction isYearSeparator() {\n if (yearSeparator !== null) {\n return yearSeparator;\n }\n const formatter = yearFormatter();\n if (formatter) {\n const output = formatter.format(new Date(0));\n yearSeparator = !!output.match(/\\d,/);\n return yearSeparator;\n }\n else {\n return true;\n }\n}\nfunction isThisYear(date) {\n const now = new Date();\n return now.getUTCFullYear() === date.getUTCFullYear();\n}\nfunction makeRelativeFormat(locale, options) {\n if ('Intl' in window && 'RelativeTimeFormat' in window.Intl) {\n try {\n return new Intl.RelativeTimeFormat(locale, options);\n }\n catch (e) {\n if (!(e instanceof RangeError)) {\n throw e;\n }\n }\n }\n}\nfunction localeFromElement(el) {\n const container = el.closest('[lang]');\n if (container instanceof HTMLElement && container.lang) {\n return container.lang;\n }\n return 'default';\n}\n\nconst datetimes = new WeakMap();\nclass ExtendedTimeElement extends HTMLElement {\n static get observedAttributes() {\n return [\n 'datetime',\n 'day',\n 'format',\n 'lang',\n 'hour',\n 'minute',\n 'month',\n 'second',\n 'title',\n 'weekday',\n 'year',\n 'time-zone-name'\n ];\n }\n connectedCallback() {\n const title = this.getFormattedTitle();\n if (title && !this.hasAttribute('title')) {\n this.setAttribute('title', title);\n }\n const text = this.getFormattedDate();\n if (text) {\n this.textContent = text;\n }\n }\n attributeChangedCallback(attrName, oldValue, newValue) {\n const oldTitle = this.getFormattedTitle();\n if (attrName === 'datetime') {\n const millis = Date.parse(newValue);\n if (isNaN(millis)) {\n datetimes.delete(this);\n }\n else {\n datetimes.set(this, new Date(millis));\n }\n }\n const title = this.getFormattedTitle();\n const currentTitle = this.getAttribute('title');\n if (attrName !== 'title' && title && (!currentTitle || currentTitle === oldTitle)) {\n this.setAttribute('title', title);\n }\n const text = this.getFormattedDate();\n if (text) {\n this.textContent = text;\n }\n }\n get date() {\n return datetimes.get(this);\n }\n getFormattedTitle() {\n const date = this.date;\n if (!date)\n return;\n const formatter = titleFormatter();\n if (formatter) {\n return formatter.format(date);\n }\n else {\n try {\n return date.toLocaleString();\n }\n catch (e) {\n if (e instanceof RangeError) {\n return date.toString();\n }\n else {\n throw e;\n }\n }\n }\n }\n getFormattedDate() {\n return;\n }\n}\nconst titleFormatter = makeFormatter({\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n hour: 'numeric',\n minute: '2-digit',\n timeZoneName: 'short'\n});\n\nconst formatters = new WeakMap();\nclass LocalTimeElement extends ExtendedTimeElement {\n attributeChangedCallback(attrName, oldValue, newValue) {\n if (attrName === 'hour' || attrName === 'minute' || attrName === 'second' || attrName === 'time-zone-name') {\n formatters.delete(this);\n }\n super.attributeChangedCallback(attrName, oldValue, newValue);\n }\n getFormattedDate() {\n const d = this.date;\n if (!d)\n return;\n const date = formatDate(this, d) || '';\n const time = formatTime(this, d) || '';\n return `${date} ${time}`.trim();\n }\n}\nfunction formatDate(el, date) {\n const props = {\n weekday: {\n short: '%a',\n long: '%A'\n },\n day: {\n numeric: '%e',\n '2-digit': '%d'\n },\n month: {\n short: '%b',\n long: '%B'\n },\n year: {\n numeric: '%Y',\n '2-digit': '%y'\n }\n };\n let format = isDayFirst() ? 'weekday day month year' : 'weekday month day, year';\n for (const prop in props) {\n const value = props[prop][el.getAttribute(prop) || ''];\n format = format.replace(prop, value || '');\n }\n format = format.replace(/(\\s,)|(,\\s$)/, '');\n return strftime(date, format).replace(/\\s+/, ' ').trim();\n}\nfunction formatTime(el, date) {\n const options = {};\n const hour = el.getAttribute('hour');\n if (hour === 'numeric' || hour === '2-digit')\n options.hour = hour;\n const minute = el.getAttribute('minute');\n if (minute === 'numeric' || minute === '2-digit')\n options.minute = minute;\n const second = el.getAttribute('second');\n if (second === 'numeric' || second === '2-digit')\n options.second = second;\n const tz = el.getAttribute('time-zone-name');\n if (tz === 'short' || tz === 'long')\n options.timeZoneName = tz;\n if (Object.keys(options).length === 0) {\n return;\n }\n let factory = formatters.get(el);\n if (!factory) {\n factory = makeFormatter(options);\n formatters.set(el, factory);\n }\n const formatter = factory();\n if (formatter) {\n return formatter.format(date);\n }\n else {\n const timef = options.second ? '%H:%M:%S' : '%H:%M';\n return strftime(date, timef);\n }\n}\nif (!window.customElements.get('local-time')) {\n window.LocalTimeElement = LocalTimeElement;\n window.customElements.define('local-time', LocalTimeElement);\n}\n\nclass RelativeTime {\n constructor(date, locale) {\n this.date = date;\n this.locale = locale;\n }\n toString() {\n const ago = this.timeElapsed();\n if (ago) {\n return ago;\n }\n else {\n const ahead = this.timeAhead();\n if (ahead) {\n return ahead;\n }\n else {\n return `on ${this.formatDate()}`;\n }\n }\n }\n timeElapsed() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n if (ms >= 0 && day < 30) {\n return this.timeAgoFromMs(ms);\n }\n else {\n return null;\n }\n }\n timeAhead() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n if (ms >= 0 && day < 30) {\n return this.timeUntil();\n }\n else {\n return null;\n }\n }\n timeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n return this.timeAgoFromMs(ms);\n }\n timeAgoFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (ms < 0) {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n else if (sec < 10) {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n else if (sec < 45) {\n return formatRelativeTime(this.locale, -sec, 'second');\n }\n else if (sec < 90) {\n return formatRelativeTime(this.locale, -min, 'minute');\n }\n else if (min < 45) {\n return formatRelativeTime(this.locale, -min, 'minute');\n }\n else if (min < 90) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n }\n else if (hr < 24) {\n return formatRelativeTime(this.locale, -hr, 'hour');\n }\n else if (hr < 36) {\n return formatRelativeTime(this.locale, -day, 'day');\n }\n else if (day < 30) {\n return formatRelativeTime(this.locale, -day, 'day');\n }\n else if (month < 18) {\n return formatRelativeTime(this.locale, -month, 'month');\n }\n else {\n return formatRelativeTime(this.locale, -year, 'year');\n }\n }\n microTimeAgo() {\n const ms = new Date().getTime() - this.date.getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (min < 1) {\n return '1m';\n }\n else if (min < 60) {\n return `${min}m`;\n }\n else if (hr < 24) {\n return `${hr}h`;\n }\n else if (day < 365) {\n return `${day}d`;\n }\n else {\n return `${year}y`;\n }\n }\n timeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n return this.timeUntilFromMs(ms);\n }\n timeUntilFromMs(ms) {\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (month >= 18) {\n return formatRelativeTime(this.locale, year, 'year');\n }\n else if (month >= 12) {\n return formatRelativeTime(this.locale, year, 'year');\n }\n else if (day >= 45) {\n return formatRelativeTime(this.locale, month, 'month');\n }\n else if (day >= 30) {\n return formatRelativeTime(this.locale, month, 'month');\n }\n else if (hr >= 36) {\n return formatRelativeTime(this.locale, day, 'day');\n }\n else if (hr >= 24) {\n return formatRelativeTime(this.locale, day, 'day');\n }\n else if (min >= 90) {\n return formatRelativeTime(this.locale, hr, 'hour');\n }\n else if (min >= 45) {\n return formatRelativeTime(this.locale, hr, 'hour');\n }\n else if (sec >= 90) {\n return formatRelativeTime(this.locale, min, 'minute');\n }\n else if (sec >= 45) {\n return formatRelativeTime(this.locale, min, 'minute');\n }\n else if (sec >= 10) {\n return formatRelativeTime(this.locale, sec, 'second');\n }\n else {\n return formatRelativeTime(this.locale, 0, 'second');\n }\n }\n microTimeUntil() {\n const ms = this.date.getTime() - new Date().getTime();\n const sec = Math.round(ms / 1000);\n const min = Math.round(sec / 60);\n const hr = Math.round(min / 60);\n const day = Math.round(hr / 24);\n const month = Math.round(day / 30);\n const year = Math.round(month / 12);\n if (day >= 365) {\n return `${year}y`;\n }\n else if (hr >= 24) {\n return `${day}d`;\n }\n else if (min >= 60) {\n return `${hr}h`;\n }\n else if (min > 1) {\n return `${min}m`;\n }\n else {\n return '1m';\n }\n }\n formatDate() {\n let format = isDayFirst() ? '%e %b' : '%b %e';\n if (!isThisYear(this.date)) {\n format += isYearSeparator() ? ', %Y' : ' %Y';\n }\n return strftime(this.date, format);\n }\n formatTime() {\n const formatter = timeFormatter();\n if (formatter) {\n return formatter.format(this.date);\n }\n else {\n return strftime(this.date, '%l:%M%P');\n }\n }\n}\nfunction formatRelativeTime(locale, value, unit) {\n const formatter = makeRelativeFormat(locale, { numeric: 'auto' });\n if (formatter) {\n return formatter.format(value, unit);\n }\n else {\n return formatEnRelativeTime(value, unit);\n }\n}\nfunction formatEnRelativeTime(value, unit) {\n if (value === 0) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `this ${unit}`;\n case 'day':\n return 'today';\n case 'hour':\n case 'minute':\n return `in 0 ${unit}s`;\n case 'second':\n return 'now';\n }\n }\n else if (value === 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `next ${unit}`;\n case 'day':\n return 'tomorrow';\n case 'hour':\n case 'minute':\n case 'second':\n return `in 1 ${unit}`;\n }\n }\n else if (value === -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n return `last ${unit}`;\n case 'day':\n return 'yesterday';\n case 'hour':\n case 'minute':\n case 'second':\n return `1 ${unit} ago`;\n }\n }\n else if (value > 1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return `in ${value} ${unit}s`;\n }\n }\n else if (value < -1) {\n switch (unit) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'week':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return `${-value} ${unit}s ago`;\n }\n }\n throw new RangeError(`Invalid unit argument for format() '${unit}'`);\n}\nconst timeFormatter = makeFormatter({ hour: 'numeric', minute: '2-digit' });\n\nclass RelativeTimeElement extends ExtendedTimeElement {\n getFormattedDate() {\n const date = this.date;\n if (!date)\n return;\n return new RelativeTime(date, localeFromElement(this)).toString();\n }\n connectedCallback() {\n nowElements.push(this);\n if (!updateNowElementsId) {\n updateNowElements();\n updateNowElementsId = window.setInterval(updateNowElements, 60 * 1000);\n }\n super.connectedCallback();\n }\n disconnectedCallback() {\n const ix = nowElements.indexOf(this);\n if (ix !== -1) {\n nowElements.splice(ix, 1);\n }\n if (!nowElements.length) {\n if (updateNowElementsId) {\n clearInterval(updateNowElementsId);\n updateNowElementsId = null;\n }\n }\n }\n}\nconst nowElements = [];\nlet updateNowElementsId;\nfunction updateNowElements() {\n let time, i, len;\n for (i = 0, len = nowElements.length; i < len; i++) {\n time = nowElements[i];\n time.textContent = time.getFormattedDate() || '';\n }\n}\nif (!window.customElements.get('relative-time')) {\n window.RelativeTimeElement = RelativeTimeElement;\n window.customElements.define('relative-time', RelativeTimeElement);\n}\n\nclass TimeAgoElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date)\n return;\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeAgo();\n }\n else {\n return new RelativeTime(date, localeFromElement(this)).timeAgo();\n }\n }\n}\nif (!window.customElements.get('time-ago')) {\n window.TimeAgoElement = TimeAgoElement;\n window.customElements.define('time-ago', TimeAgoElement);\n}\n\nclass TimeUntilElement extends RelativeTimeElement {\n getFormattedDate() {\n const format = this.getAttribute('format');\n const date = this.date;\n if (!date)\n return;\n if (format === 'micro') {\n return new RelativeTime(date, localeFromElement(this)).microTimeUntil();\n }\n else {\n return new RelativeTime(date, localeFromElement(this)).timeUntil();\n }\n }\n}\nif (!window.customElements.get('time-until')) {\n window.TimeUntilElement = TimeUntilElement;\n window.customElements.define('time-until', TimeUntilElement);\n}\n\nexport { LocalTimeElement, RelativeTimeElement, TimeAgoElement, TimeUntilElement };\n","const startPositions = new WeakMap();\nconst dragStartPositions = new WeakMap();\nconst constructedElements = new WeakMap();\nfunction moveCropArea(event) {\n const el = event.currentTarget;\n if (!(el instanceof ImageCropElement))\n return;\n const { box, image } = constructedElements.get(el) || {};\n if (!box || !image)\n return;\n let deltaX = 0;\n let deltaY = 0;\n if (event instanceof KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n deltaY = -1;\n }\n else if (event.key === 'ArrowDown') {\n deltaY = 1;\n }\n else if (event.key === 'ArrowLeft') {\n deltaX = -1;\n }\n else if (event.key === 'ArrowRight') {\n deltaX = 1;\n }\n }\n else if (dragStartPositions.has(el) && event instanceof MouseEvent) {\n const pos = dragStartPositions.get(el);\n deltaX = event.pageX - pos.dragStartX;\n deltaY = event.pageY - pos.dragStartY;\n }\n else if (dragStartPositions.has(el) && event instanceof TouchEvent) {\n const { pageX, pageY } = event.changedTouches[0];\n const { dragStartX, dragStartY } = dragStartPositions.get(el);\n deltaX = pageX - dragStartX;\n deltaY = pageY - dragStartY;\n }\n if (deltaX !== 0 || deltaY !== 0) {\n const x = Math.min(Math.max(0, box.offsetLeft + deltaX), image.width - box.offsetWidth);\n const y = Math.min(Math.max(0, box.offsetTop + deltaY), image.height - box.offsetHeight);\n box.style.left = `${x}px`;\n box.style.top = `${y}px`;\n fireChangeEvent(el, { x, y, width: box.offsetWidth, height: box.offsetHeight });\n }\n if (event instanceof MouseEvent) {\n dragStartPositions.set(el, {\n dragStartX: event.pageX,\n dragStartY: event.pageY\n });\n }\n else if (event instanceof TouchEvent) {\n const { pageX, pageY } = event.changedTouches[0];\n dragStartPositions.set(el, {\n dragStartX: pageX,\n dragStartY: pageY\n });\n }\n}\nfunction updateCropArea(event) {\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n const el = getShadowHost(target);\n if (!(el instanceof ImageCropElement))\n return;\n const { box } = constructedElements.get(el) || {};\n if (!box)\n return;\n const rect = el.getBoundingClientRect();\n let deltaX, deltaY, delta;\n if (event instanceof KeyboardEvent) {\n if (event.key === 'Escape')\n return setInitialPosition(el);\n if (event.key === '-')\n delta = -10;\n if (event.key === '=')\n delta = +10;\n if (!delta)\n return;\n deltaX = box.offsetWidth + delta;\n deltaY = box.offsetHeight + delta;\n startPositions.set(el, { startX: box.offsetLeft, startY: box.offsetTop });\n }\n else if (event instanceof MouseEvent) {\n const pos = startPositions.get(el);\n if (!pos)\n return;\n deltaX = event.pageX - pos.startX - rect.left - window.pageXOffset;\n deltaY = event.pageY - pos.startY - rect.top - window.pageYOffset;\n }\n else if (event instanceof TouchEvent) {\n const pos = startPositions.get(el);\n if (!pos)\n return;\n deltaX = event.changedTouches[0].pageX - pos.startX - rect.left - window.pageXOffset;\n deltaY = event.changedTouches[0].pageY - pos.startY - rect.top - window.pageYOffset;\n }\n if (deltaX && deltaY)\n updateDimensions(el, deltaX, deltaY, !(event instanceof KeyboardEvent));\n}\nfunction getShadowHost(el) {\n const rootNode = el.getRootNode();\n if (!(rootNode instanceof ShadowRoot))\n return el;\n return rootNode.host;\n}\nfunction startUpdate(event) {\n const currentTarget = event.currentTarget;\n if (!(currentTarget instanceof HTMLElement))\n return;\n const el = getShadowHost(currentTarget);\n if (!(el instanceof ImageCropElement))\n return;\n const { box } = constructedElements.get(el) || {};\n if (!box)\n return;\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n if (target.hasAttribute('data-direction')) {\n const direction = target.getAttribute('data-direction') || '';\n el.addEventListener('mousemove', updateCropArea);\n el.addEventListener('touchmove', updateCropArea, { passive: true });\n if (['nw', 'se'].indexOf(direction) >= 0)\n el.classList.add('nwse');\n if (['ne', 'sw'].indexOf(direction) >= 0)\n el.classList.add('nesw');\n startPositions.set(el, {\n startX: box.offsetLeft + (['se', 'ne'].indexOf(direction) >= 0 ? 0 : box.offsetWidth),\n startY: box.offsetTop + (['se', 'sw'].indexOf(direction) >= 0 ? 0 : box.offsetHeight)\n });\n updateCropArea(event);\n }\n else {\n el.addEventListener('mousemove', moveCropArea);\n el.addEventListener('touchmove', moveCropArea, { passive: true });\n }\n}\nfunction updateDimensions(target, deltaX, deltaY, reposition = true) {\n let newSide = Math.max(Math.abs(deltaX), Math.abs(deltaY), 10);\n const pos = startPositions.get(target);\n if (!pos)\n return;\n const { box, image } = constructedElements.get(target) || {};\n if (!box || !image)\n return;\n newSide = Math.min(newSide, deltaY > 0 ? image.height - pos.startY : pos.startY, deltaX > 0 ? image.width - pos.startX : pos.startX);\n const x = reposition ? Math.round(Math.max(0, deltaX > 0 ? pos.startX : pos.startX - newSide)) : box.offsetLeft;\n const y = reposition ? Math.round(Math.max(0, deltaY > 0 ? pos.startY : pos.startY - newSide)) : box.offsetTop;\n box.style.left = `${x}px`;\n box.style.top = `${y}px`;\n box.style.width = `${newSide}px`;\n box.style.height = `${newSide}px`;\n fireChangeEvent(target, { x, y, width: newSide, height: newSide });\n}\nfunction setInitialPosition(el) {\n const { image } = constructedElements.get(el) || {};\n if (!image)\n return;\n const side = Math.round(image.clientWidth > image.clientHeight ? image.clientHeight : image.clientWidth);\n startPositions.set(el, {\n startX: (image.clientWidth - side) / 2,\n startY: (image.clientHeight - side) / 2\n });\n updateDimensions(el, side, side);\n}\nfunction stopUpdate(event) {\n const el = event.currentTarget;\n if (!(el instanceof ImageCropElement))\n return;\n dragStartPositions.delete(el);\n el.classList.remove('nwse', 'nesw');\n el.removeEventListener('mousemove', updateCropArea);\n el.removeEventListener('mousemove', moveCropArea);\n el.removeEventListener('touchmove', updateCropArea);\n el.removeEventListener('touchmove', moveCropArea);\n}\nfunction fireChangeEvent(target, result) {\n const { image } = constructedElements.get(target) || {};\n if (!image)\n return;\n const ratio = image.naturalWidth / image.width;\n for (const key in result) {\n const value = Math.round(result[key] * ratio);\n result[key] = value;\n const slottedInput = target.querySelector(`[data-image-crop-input='${key}']`);\n if (slottedInput instanceof HTMLInputElement)\n slottedInput.value = value.toString();\n }\n target.dispatchEvent(new CustomEvent('image-crop-change', { bubbles: true, detail: result }));\n}\nclass ImageCropElement extends HTMLElement {\n connectedCallback() {\n if (constructedElements.has(this))\n return;\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.innerHTML = `\n<style>\n :host { touch-action: none; display: block; }\n :host(.nesw) { cursor: nesw-resize; }\n :host(.nwse) { cursor: nwse-resize; }\n :host(.nesw) .crop-box, :host(.nwse) .crop-box { cursor: inherit; }\n :host([loaded]) .crop-image { display: block; }\n :host([loaded]) ::slotted([data-loading-slot]), .crop-image { display: none; }\n\n .crop-wrapper {\n position: relative;\n font-size: 0;\n }\n .crop-container {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n overflow: hidden;\n z-index: 1;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n :host([rounded]) .crop-box {\n border-radius: 50%;\n box-shadow: 0 0 0 4000px rgba(0, 0, 0, 0.3);\n }\n .crop-box {\n position: absolute;\n border: 1px dashed #fff;\n box-sizing: border-box;\n cursor: move;\n }\n\n :host([rounded]) .crop-outline {\n outline: none;\n }\n .crop-outline {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n outline: 4000px solid rgba(0, 0, 0, .3);\n }\n\n .handle { position: absolute; }\n :host([rounded]) .handle::before { border-radius: 50%; }\n .handle:before {\n position: absolute;\n display: block;\n padding: 4px;\n transform: translate(-50%, -50%);\n content: ' ';\n background: #fff;\n border: 1px solid #767676;\n }\n .ne { top: 0; right: 0; cursor: nesw-resize; }\n .nw { top: 0; left: 0; cursor: nwse-resize; }\n .se { bottom: 0; right: 0; cursor: nwse-resize; }\n .sw { bottom: 0; left: 0; cursor: nesw-resize; }\n</style>\n<slot></slot>\n<div class=\"crop-wrapper\">\n <img width=\"100%\" class=\"crop-image\" alt=\"\">\n <div class=\"crop-container\">\n <div data-crop-box class=\"crop-box\">\n <div class=\"crop-outline\"></div>\n <div data-direction=\"nw\" class=\"handle nw\"></div>\n <div data-direction=\"ne\" class=\"handle ne\"></div>\n <div data-direction=\"sw\" class=\"handle sw\"></div>\n <div data-direction=\"se\" class=\"handle se\"></div>\n </div>\n </div>\n</div>\n`;\n const box = shadowRoot.querySelector('[data-crop-box]');\n if (!(box instanceof HTMLElement))\n return;\n const image = shadowRoot.querySelector('img');\n if (!(image instanceof HTMLImageElement))\n return;\n constructedElements.set(this, { box, image });\n image.addEventListener('load', () => {\n this.loaded = true;\n setInitialPosition(this);\n });\n this.addEventListener('mouseleave', stopUpdate);\n this.addEventListener('touchend', stopUpdate);\n this.addEventListener('mouseup', stopUpdate);\n box.addEventListener('mousedown', startUpdate);\n box.addEventListener('touchstart', startUpdate, { passive: true });\n this.addEventListener('keydown', moveCropArea);\n this.addEventListener('keydown', updateCropArea);\n if (this.src)\n image.src = this.src;\n }\n static get observedAttributes() {\n return ['src'];\n }\n get src() {\n return this.getAttribute('src');\n }\n set src(val) {\n if (val) {\n this.setAttribute('src', val);\n }\n else {\n this.removeAttribute('src');\n }\n }\n get loaded() {\n return this.hasAttribute('loaded');\n }\n set loaded(val) {\n if (val) {\n this.setAttribute('loaded', '');\n }\n else {\n this.removeAttribute('loaded');\n }\n }\n attributeChangedCallback(attribute, oldValue, newValue) {\n const { image } = constructedElements.get(this) || {};\n if (attribute === 'src') {\n this.loaded = false;\n if (image)\n image.src = newValue;\n }\n }\n}\nexport default ImageCropElement;\nif (!window.customElements.get('image-crop')) {\n window.ImageCropElement = ImageCropElement;\n window.customElements.define('image-crop', ImageCropElement);\n}\n"],"names":["ctrlBindings","navigator","userAgent","match","Combobox","[object Object]","input","list","this","isComposing","id","Math","random","toString","slice","keyboardEventHandler","event","combobox","shiftKey","metaKey","altKey","ctrlKey","key","target","querySelector","getAttribute","click","commit","preventDefault","clearSelection","navigate","keyboardBindings","compositionEventHandler","type","document","getElementById","trackComposition","inputHandler","bind","setAttribute","stop","removeAttribute","addEventListener","commitWithElement","removeEventListener","indexDiff","focusEl","Array","from","querySelectorAll","filter","visible","els","focusIndex","indexOf","length","focus","indexOfItem","newIndex","el","scrollTo","Element","closest","dispatchEvent","CustomEvent","bubbles","fireCommitEvent","hidden","HTMLInputElement","offsetWidth","offsetHeight","container","element","scrollTop","containerBottom","clientHeight","top","offsetTop","bottom","inViewport","AutocompleteEvent","init","super","relatedTarget","requests","WeakMap","fragment","url","xhr","XMLHttpRequest","open","setRequestHeader","pending","get","abort","set","clear","delete","result","Promise","resolve","reject","onload","status","responseText","Error","onerror","send","then","request","Autocomplete","results","interactingWithList","onInputChange","callback","wait","timeout","Rest","clearTimeout","window","setTimeout","debounce","onResultsMouseDown","onInputBlur","onInputFocus","onKeydown","onCommit","stopPropagation","value","trim","fetchResults","selected","HTMLElement","HTMLAnchorElement","textContent","query","src","URL","location","href","params","URLSearchParams","search","append","html","innerHTML","identifyOptions","hasResults","catch","start","state","AutocompleteElement","listId","autocomplete","destroy","hasAttribute","observedAttributes","name","oldValue","newValue","close","copyNode","node","clipboard","writeText","selection","getSelection","removeAllRanges","range","createRange","selectNodeContents","addRange","execCommand","copyText","text","body","createElement","style","width","height","position","createNode","appendChild","removeChild","copy","button","trigger","root","prototype","getRootNode","ownerDocument","Document","ShadowRoot","content","HTMLTextAreaElement","clicked","currentTarget","keydown","focused","blurred","customElements","define","ClipboardCopyElement","toggleSVG","svg","display","toggleCopyButton","clippyIcon","checkIcon","clipboardCopyElementTimers","currentTimeout","TabContainerElement","tabs","currentIndex","find","tab","matches","code","index","selectTab","tabContainer","panels","selectedTab","selectedPanel","cancelable","detail","panel","weekdays","months","pad","num","strftime","time","formatString","day","getDay","date","getDate","month","getMonth","year","getFullYear","hour","getHours","minute","getMinutes","second","getSeconds","replace","_arg","String","makeFormatter","options","format","Intl","DateTimeFormat","undefined","e","RangeError","dayFirst","dayFirstFormatter","isDayFirst","formatter","output","Date","yearSeparator","yearFormatter","localeFromElement","lang","datetimes","ExtendedTimeElement","title","getFormattedTitle","getFormattedDate","attrName","oldTitle","millis","parse","isNaN","currentTitle","titleFormatter","toLocaleString","timeZoneName","formatters","LocalTimeElement","attributeChangedCallback","d","props","weekday","short","long","numeric","2-digit","prop","formatDate","tz","Object","keys","factory","formatTime","RelativeTime","locale","ago","timeElapsed","ahead","timeAhead","ms","getTime","sec","round","min","hr","timeAgoFromMs","timeUntil","formatRelativeTime","timeUntilFromMs","getUTCFullYear","isYearSeparator","timeFormatter","unit","RelativeTimeFormat","makeRelativeFormat","formatEnRelativeTime","RelativeTimeElement","nowElements","push","updateNowElementsId","updateNowElements","setInterval","connectedCallback","ix","splice","clearInterval","i","len","TimeAgoElement","microTimeAgo","timeAgo","TimeUntilElement","microTimeUntil","startPositions","dragStartPositions","constructedElements","moveCropArea","ImageCropElement","box","image","deltaX","deltaY","KeyboardEvent","has","MouseEvent","pos","pageX","dragStartX","pageY","dragStartY","TouchEvent","changedTouches","x","max","offsetLeft","y","left","fireChangeEvent","updateCropArea","getShadowHost","rect","getBoundingClientRect","delta","setInitialPosition","startX","startY","pageXOffset","pageYOffset","updateDimensions","rootNode","host","startUpdate","direction","passive","classList","add","reposition","newSide","abs","side","clientWidth","stopUpdate","remove","ratio","naturalWidth","slottedInput","shadowRoot","attachShadow","mode","HTMLImageElement","loaded","val","attribute"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- # Use AutoComplete to populate input values from server search results.
4
+ # Use `AutoComplete` to populate input values from server search results.
5
+ # @accessibility
6
+ # Always provide a label for the `Autocomplete` component.
5
7
  class AutoComplete < Primer::Component
6
8
  status :beta
7
9
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Primer
4
4
  class AutoComplete
5
- # Use AutoCompleteItem to list results of an auto-completed search.
5
+ # Use `AutoCompleteItem` to list results of an auto-completed search.
6
6
  class Item < Primer::Component
7
7
  status :beta
8
8
 
@@ -1,9 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- # Avatars are images used to represent users and organizations on GitHub.
5
- # Use the default round avatar for users, and the `square` argument
4
+ # `Avatar` can be used to represent users and organizations on GitHub.
5
+ #
6
+ # - Use the default round avatar for users, and the `square` argument
6
7
  # for organizations or any other non-human avatars.
8
+ # - By default, `Avatar` will render a static `<img>`. To have `Avatar` function as a link, set the `href` which will wrap the `<img>` in a `<a>`.
9
+ # - Set `size` to update the height and width of the `Avatar` in pixels.
10
+ # - To stack multiple avatars together, use <%= link_to_component(Primer::AvatarStackComponent) %>.
11
+ #
12
+ # @accessibility
13
+ # Images should have text alternatives that describe the information or function represented.
14
+ # If the avatar functions as a link, provide alt text that helps convey the function. For instance,
15
+ # if `Avatar` is a link to a user profile, the alt attribute should be `@kittenuser profile`
16
+ # rather than `@kittenuser`.
17
+ # [Learn more about best image practices (WAI Images)](https://www.w3.org/WAI/tutorials/images/)
7
18
  class AvatarComponent < Primer::Component
8
19
  status :beta
9
20
 
@@ -16,7 +27,15 @@ module Primer
16
27
  # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", square: true)) %>
17
28
  #
18
29
  # @example Link
19
- # <%= render(Primer::AvatarComponent.new(href: "#", src: "http://placekitten.com/200/200", alt: "@kittenuser")) %>
30
+ # <%= render(Primer::AvatarComponent.new(href: "#", src: "http://placekitten.com/200/200", alt: "@kittenuser profile")) %>
31
+ #
32
+ # @example With size
33
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 16)) %>
34
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 20)) %>
35
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 24)) %>
36
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 28)) %>
37
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 32)) %>
38
+ # <%= render(Primer::AvatarComponent.new(src: "http://placekitten.com/200/200", alt: "@kittenuser", size: 36)) %>
20
39
  #
21
40
  # @param src [String] The source url of the avatar image.
22
41
  # @param alt [String] Passed through to alt on img tag.
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- # Use AvatarStack to stack multiple avatars together.
4
+ # Use `AvatarStack` to stack multiple avatars together.
5
5
  class AvatarStackComponent < Primer::Component
6
6
  status :beta
7
7
 
8
8
  ALIGN_DEFAULT = :left
9
9
  ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
10
10
 
11
+ DEFAULT_TAG = :div
12
+ TAG_OPTIONS = [DEFAULT_TAG, :span].freeze
11
13
  # Required list of stacked avatars.
12
14
  #
13
15
  # @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::AvatarComponent) %>.
@@ -34,11 +36,12 @@ module Primer
34
36
  # <%= c.avatar(src: "http://placekitten.com/200/200", alt: "@kittenuser") %>
35
37
  # <% end %>
36
38
  #
39
+ # @param tag [Symbol] <%= one_of(Primer::AvatarStackComponent::TAG_OPTIONS) %>
37
40
  # @param align [Symbol] <%= one_of(Primer::AvatarStackComponent::ALIGN_OPTIONS) %>
38
41
  # @param tooltipped [Boolean] Whether to add a tooltip to the stack or not.
39
- # @param body_arguments [Hash] Parameters to add to the Body. If `tooltipped` is set, has the same arguments as <%= link_to_component(Primer::TooltipComponent) %>.
42
+ # @param body_arguments [Hash] Parameters to add to the Body. If `tooltipped` is set, has the same arguments as <%= link_to_component(Primer::Tooltip) %>.
40
43
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
41
- def initialize(align: ALIGN_DEFAULT, tooltipped: false, body_arguments: {}, **system_arguments)
44
+ def initialize(tag: DEFAULT_TAG, align: ALIGN_DEFAULT, tooltipped: false, body_arguments: {}, **system_arguments)
42
45
  @align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
43
46
  @system_arguments = system_arguments
44
47
  @tooltipped = tooltipped
@@ -50,7 +53,7 @@ module Primer
50
53
  @body_arguments[:classes]
51
54
  )
52
55
 
53
- @system_arguments[:tag] ||= :div
56
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
54
57
  @system_arguments[:classes] = class_names(
55
58
  "AvatarStack",
56
59
  system_arguments[:classes],
@@ -60,7 +63,7 @@ module Primer
60
63
 
61
64
  def body_component
62
65
  if @tooltipped
63
- Primer::TooltipComponent.new(**@body_arguments)
66
+ Primer::Tooltip.new(**@body_arguments)
64
67
  else
65
68
  Primer::BaseComponent.new(**@body_arguments)
66
69
  end