primer_view_components 0.0.33 → 0.0.38

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +102 -0
  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_component.rb → auto_complete.rb} +13 -11
  6. data/app/components/primer/{auto_complete_component.d.ts → auto_complete/auto_complete.d.ts} +0 -0
  7. data/app/components/primer/{auto_complete_component.html.erb → auto_complete/auto_complete.html.erb} +0 -0
  8. data/app/components/primer/{auto_complete_component.js → auto_complete/auto_complete.js} +0 -0
  9. data/app/components/primer/{auto_complete_component.ts → auto_complete/auto_complete.ts} +0 -0
  10. data/app/components/primer/auto_complete/auto_component.d.ts +1 -0
  11. data/app/components/primer/auto_complete/auto_component.js +1 -0
  12. data/app/components/primer/auto_complete/item.rb +42 -0
  13. data/app/components/primer/avatar_stack_component.rb +2 -0
  14. data/app/components/primer/base_button.rb +47 -0
  15. data/app/components/primer/base_component.rb +115 -85
  16. data/app/components/primer/button_component.rb +37 -32
  17. data/app/components/primer/button_component.rb.orig +138 -0
  18. data/app/components/primer/{button_group_component.html.erb → button_group.html.erb} +0 -0
  19. data/app/components/primer/button_group.rb +61 -0
  20. data/app/components/primer/button_marketing_component.rb +15 -20
  21. data/app/components/primer/clipboard_copy.html.erb +8 -0
  22. data/app/components/primer/clipboard_copy.rb +26 -0
  23. data/app/components/primer/clipboard_copy_component.d.ts +1 -0
  24. data/app/components/primer/clipboard_copy_component.js +25 -0
  25. data/app/components/primer/clipboard_copy_component.ts +28 -0
  26. data/app/components/primer/close_button.rb +37 -0
  27. data/app/components/primer/component.rb +1 -0
  28. data/app/components/primer/dropdown_component.rb +1 -1
  29. data/app/components/primer/dropdown_menu_component.rb +1 -1
  30. data/app/components/primer/flash_component.rb +10 -10
  31. data/app/components/primer/foo_bar.d.ts +1 -0
  32. data/app/components/primer/foo_bar.js +1 -0
  33. data/app/components/primer/heading_component.rb +32 -4
  34. data/app/components/primer/hidden_text_expander.rb +41 -0
  35. data/app/components/primer/link_component.rb +9 -9
  36. data/app/components/primer/navigation/tab_component.html.erb +9 -7
  37. data/app/components/primer/navigation/tab_component.rb +27 -3
  38. data/app/components/primer/octicon_component.rb +0 -4
  39. data/app/components/primer/primer.d.ts +2 -1
  40. data/app/components/primer/primer.js +2 -1
  41. data/app/components/primer/primer.ts +2 -1
  42. data/app/components/primer/state_component.rb +14 -14
  43. data/app/components/primer/subhead_component.rb +1 -1
  44. data/app/components/primer/tab_nav_component.html.erb +2 -2
  45. data/app/components/primer/tab_nav_component.rb +22 -8
  46. data/app/components/primer/{truncate_component.rb → truncate.rb} +8 -6
  47. data/app/components/primer/underline_nav_component.rb +46 -14
  48. data/app/lib/primer/classify.rb +4 -13
  49. data/app/lib/primer/classify/cache.rb +14 -4
  50. data/app/lib/primer/classify/spacing.rb +63 -0
  51. data/app/lib/primer/tabbed_component_helper.rb +4 -0
  52. data/lib/primer/view_components/version.rb +1 -1
  53. data/static/statuses.json +1 -1
  54. metadata +116 -32
  55. data/app/assets/javascripts/primer_view_components.js.map.orig +0 -5
  56. data/app/assets/javascripts/primer_view_components.js.orig +0 -6
  57. data/app/components/primer/auto_complete_item_component.rb +0 -38
  58. data/app/components/primer/button_group_component.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc1d93aedd6cfbf47bbea33d144f7dfbad5fdd3297acc343952a4c5853a27423
4
- data.tar.gz: 952bfd2071bf837067f9970952d5348c372453e891cdcec911fc8e4480166974
3
+ metadata.gz: c4636a8eac9b455873244794904e41a01d1e9d71daf99c42ea368eda59c7dcbc
4
+ data.tar.gz: d0058736ab95a6584e7e6eac15bcd259172803dda98f35bcc4ced133cd070b2d
5
5
  SHA512:
6
- metadata.gz: 69d0b38e3b03833e5656b1e54defff8336e46e3e1d571815fb62db27c6759e8637ba9357d74706e3495f49d1a2b30073f2b9f8c35c0594f7d750904473b52611
7
- data.tar.gz: 2d18d853748fbfc3998077cb82dde8f42d84e0fb1e832461bf2197f9b2200972eb9811c12f28f874a7416896c1075815bb823a62a25a2c40f91b9766d0ce99a7
6
+ metadata.gz: 4109fac345bc7b757b51da488e7856bc9872b6b2d6208ac92b875e079b22691265c1ad7e98f39ebdb3e06872bc20f89ca5b2161932f3e815d7d2fea6ad762af5
7
+ data.tar.gz: 28eff5b61ba8f4799ec505a318417f967d79dd29608830c0325f3da27d8450b693819ceec171fa1db999d56527de9b5ad5e93943ad74d79c05e48c1527fd4350
data/CHANGELOG.md CHANGED
@@ -2,6 +2,108 @@
2
2
 
3
3
  ## main
4
4
 
5
+ ## 0.0.38
6
+
7
+ * Extract `BaseButton` component.
8
+
9
+ *Manuel Puyol*
10
+
11
+ * Add default `aria-label` of "Close" to `CloseButton` component.
12
+
13
+ *Kate Higa*
14
+
15
+ * Set button variants in the `ButtonGroup` parent.
16
+
17
+ *Manuel Puyol*
18
+
19
+ * **Breaking change**: Rename `ButtonGroupComponent` to `ButtonGroup` and promote it to beta.
20
+
21
+ *Manuel Puyol*
22
+
23
+ * **Breaking change**: Do not provide default for `Heading` and improve documentation.
24
+
25
+ *Kate Higa*
26
+
27
+ * **Breaking change**: Don't allow `StateComponent` to be a link.
28
+
29
+ *Kate Higa*
30
+
31
+ ## 0.0.37
32
+
33
+ * Update NPM package to include subdirectory JS files.
34
+
35
+ *Manuel Puyol*
36
+
37
+ ## 0.0.36
38
+
39
+ * Add `block` flag to `ButtonComponent`.
40
+
41
+ *Manuel Puyol*
42
+
43
+ * Add `link` and `invisible` schemes to `ButtonComponent`.
44
+
45
+ *Manuel Puyol*
46
+
47
+ * Create `CloseButton` and `HiddenTextExpander` component.
48
+
49
+ *Manuel Puyol*
50
+
51
+ * **Breaking change**: Rename `AutoCompleteComponent` to `AutoComplete` and `AutoCompleteItemComponent` to `AutoComplete::Item`.
52
+
53
+ *Manuel Puyol*
54
+
55
+ * **Breaking change**: Rename `TruncateComponent` to `Truncate` and promote it to beta.
56
+
57
+ *Manuel Puyol*
58
+
59
+ ## 0.0.35
60
+
61
+ * Promote `AutoCompleteComponent`, `AutoCompleteItemComponent`, `AvatarStackComponent` and `ButtonComponent` to beta.
62
+
63
+ *Manuel Puyol*
64
+
65
+ * Allow `UnderlineNav` tabs to be rendered as a `<ul><li>` list.
66
+
67
+ *Manuel Puyol*
68
+
69
+ * _Accessibility:_ Don't add tab roles when `UnderlineNav` or `TabNav` use link redirects.
70
+
71
+ *Manuel Puyol*
72
+
73
+ * **Breaking change**: Make `label` required for `UnderlineNav` and `TabNav`.
74
+
75
+ *Manuel Puyol*
76
+
77
+ ## 0.0.34
78
+
79
+ * Add `p: :responsive` and `m: :auto` system arguments.
80
+
81
+ *Manuel Puyol*
82
+
83
+ * Remove `my: :auto` and negative `m:` system arguments.
84
+
85
+ *Manuel Puyol*
86
+
87
+ * **Breaking change**: Rename `FlashComponent` `variant` argument to `scheme`.
88
+
89
+ *Manuel Puyol*
90
+
91
+ * **Breaking change**: Rename `LinkComponent` `variant` argument to `scheme`.
92
+
93
+ *Manuel Puyol*
94
+
95
+ * **Breaking change**: Rename `ButtonComponent` `button_type` argument to `scheme`.
96
+
97
+ *Manuel Puyol*
98
+
99
+ * **Breaking change**: Rename `ButtonMarketingComponent` `button_type` argument to `scheme`.
100
+
101
+ *Manuel Puyol*
102
+
103
+ * **Breaking change**: Rename `StateComponent` `color` argument to `scheme`.
104
+
105
+ *Manuel Puyol*
106
+
5
107
  ## 0.0.33
6
108
 
7
109
  * Remove `TabbedComponent` validation requiring a tab to be selected.
@@ -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 s=1===t?0:n.length-1;if(e&&o>=0){const e=o+t;e>=0&&e<n.length&&(s=e)}const a=n[s];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,o=r+e.clientHeight;return r>=n&&o<=i})(t,e)||(t.scrollTop=e.offsetTop)}class o extends CustomEvent{constructor(t,e){super(t,e),this.relatedTarget=e.relatedTarget}}const s=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=s.get(t);n&&n.abort();s.set(t,e);const i=()=>s.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 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&&(r=o,r instanceof HTMLInputElement||r instanceof HTMLTextAreaElement?h(r.value):r instanceof HTMLAnchorElement&&r.hasAttribute("href")?h(r.href):d(r)).then(i)}var r}function p(t){const e=t.currentTarget;e instanceof HTMLElement&&m(e)}function f(t){if(" "===t.key||"Enter"===t.key){const e=t.currentTarget;e instanceof HTMLElement&&(t.preventDefault(),m(e))}}function b(t){t.currentTarget.addEventListener("keydown",f)}function g(t){t.currentTarget.removeEventListener("keydown",f)}window.customElements.get("auto-complete")||(window.AutocompleteElement=l,window.customElements.define("auto-complete",l));class w extends HTMLElement{constructor(){super(),this.addEventListener("click",p),this.addEventListener("focus",b),this.addEventListener("blur",g)}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)}}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&&v(e),n&&v(n)}window.customElements.get("clipboard-copy")||(window.ClipboardCopyElement=w,window.customElements.define("clipboard-copy",w)),document.addEventListener("clipboard-copy",(function({target:t}){t instanceof HTMLElement&&(y(t),setTimeout(y,2e3,t))}));class E 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),A(this,t)}else if("ArrowLeft"===t.code){let t=i-1;t<0&&(t=n.length-1),A(this,t)}else"Home"===t.code?(A(this,0),t.preventDefault()):"End"===t.code&&(A(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;A(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 A(t,e){const n=t.querySelectorAll('[role="tablist"] [role="tab"]'),i=t.querySelectorAll('[role="tabpanel"]'),r=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");r.setAttribute("aria-selected","true"),r.setAttribute("tabindex","0"),r.focus(),o.hidden=!1,t.dispatchEvent(new CustomEvent("tab-container-changed",{bubbles:!0,detail:{relatedTarget:o}}))}}window.customElements.get("tab-container")||(window.TabContainerElement=E,window.customElements.define("tab-container",E));const M=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],T=["January","February","March","April","May","June","July","August","September","October","November","December"];function k(t){return"0".concat(t).slice(-2)}function L(t,e){const n=t.getDay(),i=t.getDate(),r=t.getMonth(),o=t.getFullYear(),s=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 T[r].slice(0,3);case"B":return T[r];case"c":return t.toString();case"d":return k(i);case"e":return String(i);case"H":return k(s);case"I":return k(L(t,"%l"));case"l":return String(0===s||12===s?12:(s+12)%12);case"m":return k(r+1);case"M":return k(a);case"p":return s>11?"PM":"AM";case"P":return s>11?"pm":"am";case"S":return k(c);case"w":return String(n);case"y":return k(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 x(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 C=null;const S=x({day:"numeric",month:"short"});function D(){if(null!==C)return C;const t=S();if(t){const e=t.format(new Date(0));return C=!!e.match(/^\d/),C}return!1}let H=null;const I=x({day:"numeric",month:"short",year:"numeric"});function F(t){const e=t.closest("[lang]");return e instanceof HTMLElement&&e.lang?e.lang:"default"}const R=new WeakMap;class q 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)?R.delete(this):R.set(this,new Date(t))}const r=this.getFormattedTitle(),o=this.getAttribute("title");"title"===t||!r||o&&o!==i||this.setAttribute("title",r);const s=this.getFormattedDate();s&&(this.textContent=s)}get date(){return R.get(this)}getFormattedTitle(){const t=this.date;if(!t)return;const e=K();if(e)return e.format(t);try{return t.toLocaleString()}catch(e){if(e instanceof RangeError)return t.toString();throw e}}getFormattedDate(){}}const K=x({day:"numeric",month:"short",year:"numeric",hour:"numeric",minute:"2-digit",timeZoneName:"short"}),U=new WeakMap;class P extends q{attributeChangedCallback(t,e,n){"hour"!==t&&"minute"!==t&&"second"!==t&&"time-zone-name"!==t||U.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=D()?"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$)/,""),L(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 o=t.getAttribute("second");"numeric"!==o&&"2-digit"!==o||(n.second=o);const s=t.getAttribute("time-zone-name");"short"!==s&&"long"!==s||(n.timeZoneName=s);if(0===Object.keys(n).length)return;let a=U.get(t);a||(a=x(n),U.set(t,a));const c=a();if(c)return c.format(e);return L(e,n.second?"%H:%M:%S":"%H:%M")}(this,t)||"";return"".concat(e," ").concat(n).trim()}}window.customElements.get("local-time")||(window.LocalTimeElement=P,window.customElements.define("local-time",P));class B{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),o=Math.round(r/30),s=Math.round(o/12);return t<0||e<10?W(this.locale,0,"second"):e<45?W(this.locale,-e,"second"):e<90||n<45?W(this.locale,-n,"minute"):n<90||i<24?W(this.locale,-i,"hour"):i<36||r<30?W(this.locale,-r,"day"):o<18?W(this.locale,-o,"month"):W(this.locale,-s,"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),o=Math.round(r/30),s=Math.round(o/12);return n<1?"1m":n<60?"".concat(n,"m"):i<24?"".concat(i,"h"):r<365?"".concat(r,"d"):"".concat(s,"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),o=Math.round(r/30),s=Math.round(o/12);return o>=18||o>=12?W(this.locale,s,"year"):r>=45||r>=30?W(this.locale,o,"month"):i>=36||i>=24?W(this.locale,r,"day"):n>=90||n>=45?W(this.locale,i,"hour"):e>=90||e>=45?W(this.locale,n,"minute"):W(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),o=Math.round(r/30),s=Math.round(o/12);return r>=365?"".concat(s,"y"):i>=24?"".concat(r,"d"):n>=60?"".concat(i,"h"):n>1?"".concat(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!==H)return H;const t=I();if(t){const e=t.format(new Date(0));return H=!!e.match(/\d,/),H}return!0}()?", %Y":" %Y"),L(this.date,t)}formatTime(){const t=N();return t?t.format(this.date):L(this.date,"%l:%M%P")}}function W(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 N=x({hour:"numeric",minute:"2-digit"});class O extends q{getFormattedDate(){const t=this.date;if(t)return new B(t,F(this)).toString()}connectedCallback(){Y.push(this),$||(z(),$=setInterval(z,6e4)),super.connectedCallback()}disconnectedCallback(){const t=Y.indexOf(this);-1!==t&&Y.splice(t,1),Y.length||$&&(clearInterval($),$=null)}}const Y=[];let $;function z(){let t,e,n;for(e=0,n=Y.length;e<n;e++)t=Y[e],t.textContent=t.getFormattedDate()||""}window.customElements.get("relative-time")||(window.RelativeTimeElement=O,window.customElements.define("relative-time",O));class Z extends O{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new B(e,F(this)).microTimeAgo():new B(e,F(this)).timeAgo()}}window.customElements.get("time-ago")||(window.TimeAgoElement=Z,window.customElements.define("time-ago",Z));class j extends O{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new B(e,F(this)).microTimeUntil():new B(e,F(this)).timeUntil()}}window.customElements.get("time-until")||(window.TimeUntilElement=j,window.customElements.define("time-until",j));
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/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","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';\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) {\n toggleSVG(clippyIcon);\n }\n if (checkIcon) {\n toggleSVG(checkIcon);\n }\n}\ndocument.addEventListener('clipboard-copy', function ({ target }) {\n if (!(target instanceof HTMLElement))\n return;\n toggleCopyButton(target);\n setTimeout(toggleCopyButton, 2000, 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 = ['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","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","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","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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"}
@@ -2,13 +2,15 @@
2
2
 
3
3
  module Primer
4
4
  # Use AutoComplete to populate input values from server search results.
5
- class AutoCompleteComponent < Primer::Component
5
+ class AutoComplete < Primer::Component
6
+ status :beta
7
+
6
8
  DEFAULT_INPUT_TYPE = :text
7
9
  INPUT_TYPE_OPTIONS = [DEFAULT_INPUT_TYPE, :search].freeze
8
10
 
9
11
  # Required input used to search for results
10
12
  #
11
- # @param type [Symbol] <%= one_of(Primer::AutoCompleteComponent::INPUT_TYPE_OPTIONS) %>
13
+ # @param type [Symbol] <%= one_of(Primer::AutoComplete::INPUT_TYPE_OPTIONS) %>
12
14
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
13
15
  renders_one :input, lambda { |type: DEFAULT_INPUT_TYPE, classes: "form-control", **system_arguments|
14
16
  system_arguments[:tag] = :input
@@ -35,40 +37,40 @@ module Primer
35
37
  }
36
38
 
37
39
  # @example Default
38
- # <%= render(Primer::AutoCompleteComponent.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
40
+ # <%= render(Primer::AutoComplete.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
39
41
  # <% c.input(type: :text, name: "input") %>
40
42
  # <% c.results do %>
41
- # <%= render(Primer::AutoCompleteItemComponent.new(selected: true, value: "value")) do |c| %>
43
+ # <%= render(Primer::AutoComplete::Item.new(selected: true, value: "value")) do |c| %>
42
44
  # Selected
43
45
  # <% end %>
44
- # <%= render(Primer::AutoCompleteItemComponent.new(value: "value")) do |c| %>
46
+ # <%= render(Primer::AutoComplete::Item.new(value: "value")) do |c| %>
45
47
  # Not selected
46
48
  # <% end %>
47
49
  # <% end %>
48
50
  # <% end %>
49
51
  #
50
52
  # @example With custom classes for the results
51
- # <%= render(Primer::AutoCompleteComponent.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
53
+ # <%= render(Primer::AutoComplete.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
52
54
  # <% c.input(type: :text, name: "input") %>
53
55
  # <% c.results(classes: "my-custom-class") do %>
54
- # <%= render(Primer::AutoCompleteItemComponent.new(selected: true, value: "value")) do |c| %>
56
+ # <%= render(Primer::AutoComplete::Item.new(selected: true, value: "value")) do |c| %>
55
57
  # Selected
56
58
  # <% end %>
57
- # <%= render(Primer::AutoCompleteItemComponent.new(value: "value")) do |c| %>
59
+ # <%= render(Primer::AutoComplete::Item.new(value: "value")) do |c| %>
58
60
  # Not selected
59
61
  # <% end %>
60
62
  # <% end %>
61
63
  # <% end %>
62
64
  #
63
65
  # @example With Icon
64
- # <%= render(Primer::AutoCompleteComponent.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
66
+ # <%= render(Primer::AutoComplete.new(src: "/users/search", id: "user-popup", position: :relative)) do |c| %>
65
67
  # <% c.input(type: :text, name: "input") %>
66
68
  # <% c.icon(icon: :search) %>
67
69
  # <% c.results do %>
68
- # <%= render(Primer::AutoCompleteItemComponent.new(selected: true, value: "value")) do |c| %>
70
+ # <%= render(Primer::AutoComplete::Item.new(selected: true, value: "value")) do |c| %>
69
71
  # Selected
70
72
  # <% end %>
71
- # <%= render(Primer::AutoCompleteItemComponent.new(value: "value")) do |c| %>
73
+ # <%= render(Primer::AutoComplete::Item.new(value: "value")) do |c| %>
72
74
  # Not selected
73
75
  # <% end %>
74
76
  # <% end %>
@@ -0,0 +1 @@
1
+ import '@github/auto-complete-element';
@@ -0,0 +1 @@
1
+ import '@github/auto-complete-element';
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ class AutoComplete
5
+ # Use AutoCompleteItem to list results of an auto-completed search.
6
+ class Item < Primer::Component
7
+ status :beta
8
+
9
+ # @example Default
10
+ # <%= render(Primer::AutoComplete::Item.new(selected: true, value: "value")) do |c| %>
11
+ # Selected
12
+ # <% end %>
13
+ # <%= render(Primer::AutoComplete::Item.new(value: "value")) do |c| %>
14
+ # Not selected
15
+ # <% end %>
16
+ #
17
+ # @param value [String] Value of the item.
18
+ # @param selected [Boolean] Whether the item is selected.
19
+ # @param disabled [Boolean] Whether the item is disabled.
20
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
21
+ def initialize(value:, selected: false, disabled: false, **system_arguments)
22
+ @system_arguments = system_arguments
23
+ @system_arguments[:tag] = :li
24
+ @system_arguments[:role] = :option
25
+ @system_arguments[:"data-autocomplete-value"] = value
26
+
27
+ @system_arguments[:"aria-selected"] = true if selected
28
+ @system_arguments[:"aria-disabled"] = true if disabled
29
+
30
+ @system_arguments[:classes] = class_names(
31
+ "autocomplete-item",
32
+ system_arguments[:classes],
33
+ "disabled" => disabled
34
+ )
35
+ end
36
+
37
+ def call
38
+ render(Primer::BaseComponent.new(**@system_arguments)) { content }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,6 +3,8 @@
3
3
  module Primer
4
4
  # Use AvatarStack to stack multiple avatars together.
5
5
  class AvatarStackComponent < Primer::Component
6
+ status :beta
7
+
6
8
  ALIGN_DEFAULT = :left
7
9
  ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
8
10
 
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ # Use BaseButton to render an unstyled `<button>` tag that can be customized.
5
+ class BaseButton < Primer::Component
6
+ status :beta
7
+
8
+ DEFAULT_TAG = :button
9
+ TAG_OPTIONS = [DEFAULT_TAG, :a, :summary].freeze
10
+
11
+ DEFAULT_TYPE = :button
12
+ TYPE_OPTIONS = [DEFAULT_TYPE, :reset, :submit].freeze
13
+
14
+ # @example Block
15
+ # <%= render(Primer::BaseButton.new(block: :true)) { "Block" } %>
16
+ # <%= render(Primer::BaseButton.new(block: :true, scheme: :primary)) { "Primary block" } %>
17
+ #
18
+ # @param tag [Symbol] <%= one_of(Primer::BaseButton::TAG_OPTIONS) %>
19
+ # @param type [Symbol] <%= one_of(Primer::BaseButton::TYPE_OPTIONS) %>
20
+ # @param block [Boolean] Whether button is full-width with `display: block`.
21
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
22
+ def initialize(
23
+ tag: DEFAULT_TAG,
24
+ type: DEFAULT_TYPE,
25
+ block: false,
26
+ **system_arguments
27
+ )
28
+ @system_arguments = system_arguments
29
+ @system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
30
+
31
+ if @system_arguments[:tag] == :button
32
+ @system_arguments[:type] = fetch_or_fallback(TYPE_OPTIONS, type, DEFAULT_TYPE)
33
+ else
34
+ @system_arguments[:role] = :button
35
+ end
36
+
37
+ @system_arguments[:classes] = class_names(
38
+ system_arguments[:classes],
39
+ "btn-block" => block
40
+ )
41
+ end
42
+
43
+ def call
44
+ render(Primer::BaseComponent.new(**@system_arguments)) { content }
45
+ end
46
+ end
47
+ end
@@ -22,94 +22,124 @@ module Primer
22
22
  # ```html
23
23
  # <h1 class="mt-0 mt-lg-4 mt-xl-2">Hello world</h1>
24
24
  # ```
25
- #
26
- # ## HTML attributes
27
- #
28
- # System arguments include most HTML attributes. For example:
29
- #
30
- # | Name | Type | Description |
31
- # | :- | :- | :- |
32
- # | `width` | `Integer` | Width. |
33
- # | `height` | `Integer` | Height. |
34
- # | `data` | `Hash` | Data attributes: `data: { foo: :bar }` renders `data-foo='bar'`. |
35
- # | `aria` | `Hash` | Aria attributes: `aria: { label: "foo" }` renders `aria-label='foo'`. |
36
- # | `title` | `String` | The `title` attribute. |
37
- # | `style` | `String` | Inline styles. |
38
- # | `hidden` | `Boolean` | Whether to assign the `hidden` attribute. |
39
25
  class BaseComponent < Primer::Component
40
26
  status :beta
41
27
 
42
- include TestSelectorHelper
43
-
44
- # @param test_selector [String] Adds `data-test-selector='given value'` in non-Production environments for testing purposes.
45
- #
46
- # @param m [Integer] Margin. <%= one_of((-6..6).to_a) %>
47
- # @param mt [Integer] Margin top. <%= one_of((-6..6).to_a) %>
48
- # @param mr [Integer] Margin right. <%= one_of((-6..6).to_a) %>
49
- # @param mb [Integer] Margin bottom. <%= one_of((-6..6).to_a) %>
50
- # @param ml [Integer] Margin left. <%= one_of((-6..6).to_a) %>
51
- # @param mx [Integer] Horizontal margins. <%= one_of((-6..6).to_a + [:auto]) %>
52
- # @param my [Integer] Vertical margins. <%= one_of((-6..6).to_a) %>
53
- # @param p [Integer] Padding. <%= one_of((0..6).to_a) %>
54
- # @param pt [Integer] Padding left. <%= one_of((0..6).to_a) %>
55
- # @param pr [Integer] Padding right. <%= one_of((0..6).to_a) %>
56
- # @param pb [Integer] Padding bottom. <%= one_of((0..6).to_a) %>
57
- # @param pl [Integer] Padding left. <%= one_of((0..6).to_a) %>
58
- # @param px [Integer] Horizontal padding. <%= one_of((0..6).to_a) %>
59
- # @param py [Integer] Vertical padding. <%= one_of((0..6).to_a) %>
60
- #
61
- # @param position [Symbol] <%= one_of([:relative, :absolute, :fixed]) %>
62
- #
63
- # @param top [Boolean] If `false`, sets `top: 0`.
64
- # @param right [Boolean] If `false`, sets `right: 0`.
65
- # @param bottom [Boolean] If `false`, sets `bottom: 0`.
66
- # @param left [Boolean] If `false`, sets `left: 0`.
67
- #
68
- # @param display [Symbol] <%= one_of([:none, :block, :flex, :inline, :inline_block, :table, :table_cell]) %>
69
- #
70
- # @param v [Symbol] Visibility. <%= one_of([:hidden, :visible]) %>
71
- #
72
- # @param hide [Symbol] Hide the element at a specific breakpoint. <%= one_of([:sm, :md, :lg, :xl]) %>
73
- #
74
- # @param vertical_align [Symbol] <%= one_of([:baseline, :top, :middle, :bottom, :text_top, :text_bottom]) %>
75
- #
76
- # @param float [Symbol] <%= one_of([:left, :right]) %>
77
- #
78
- # @param col [Integer] Number of columns.
79
- #
80
- # @param underline [Boolean] Whether text should be underlined.
81
- #
82
- # @param color [Symbol] Text color. <br /> <%= one_of(Primer::Classify::FunctionalTextColors::OPTIONS) %> <br /> Deprecated options: <%= one_of(Primer::Classify::FunctionalTextColors::DEPRECATED_OPTIONS) %>
83
- # @param bg [String, Symbol] Background color. Accepts either a hex value as a String or a color name as a Symbol.
84
- #
85
- # @param box_shadow [Boolean, Symbol] Box shadow. <%= one_of([true, :medium, :large, :extra_large, :none]) %>
86
- # @param border [Symbol] <%= one_of([:left, :top, :bottom, :right, :y, :x, true]) %>
87
- # @param border_color [Symbol] <%= one_of(Primer::Classify::FunctionalBorderColors::OPTIONS) %> <br /> Deprecated options: <%= one_of(Primer::Classify::FunctionalBorderColors::DEPRECATED_OPTIONS) %>
88
- # @param border_top [Integer] Set to `0` to remove the top border.
89
- # @param border_bottom [Integer] Set to `0` to remove the bottom border.
90
- # @param border_left [Integer] Set to `0` to remove the left border.
91
- # @param border_right [Integer] Set to `0` to remove the right border.
92
- # @param border_radius [Integer] <%= one_of([0, 1, 2, 3]) %>
93
- #
94
- # @param font_size [String, Integer] <%= one_of(["00", 0, 1, 2, 3, 4, 5, 6]) %>
95
- # @param text_align [Symbol] Text alignment. <%= one_of([:left, :right, :center]) %>
96
- # @param font_weight [Symbol] Font weight. <%= one_of([:light, :normal, :bold]) %>
97
- #
98
- # @param flex [Integer, Symbol] <%= one_of([1, :auto]) %>
99
- # @param flex_grow [Integer] To enable, set to `0`.
100
- # @param flex_shrink [Integer] To enable, set to `0`.
101
- # @param align_self [Symbol] <%= one_of([:auto, :start, :end, :center, :baseline, :stretch]) %>
102
- # @param justify_content [Symbol] <%= one_of([:flex_start, :flex_end, :center, :space_between, :space_around]) %>
103
- # @param align_items [Symbol] <%= one_of([:flex_start, :flex_end, :center, :baseline, :stretch]) %>
104
- # @param width [Symbol] <%= one_of([:fit, :fill]) %>
105
- # @param height [Symbol] <%= one_of([:fit, :fill]) %>
106
- #
107
- # @param word_break [Symbol] Whether to break words on line breaks. Can only be `:break_all`.
108
- #
109
- # @param animation [Symbol] <%= one_of([:fade_in, :fade_out, :fade_up, :fade_down, :scale_in, :pulse, :grow_x, :grow]) %>
110
- #
111
- # @param tag [Symbol] HTML tag name to be passed to `tag.send`.
112
- # @param classes [String] CSS class name value to be concatenated with generated Primer CSS classes.
28
+ # ## HTML attributes
29
+ #
30
+ # System arguments include most HTML attributes. For example:
31
+ #
32
+ # | Name | Type | Description |
33
+ # | :- | :- | :- |
34
+ # | `aria` | `Hash` | Aria attributes: `aria: { label: "foo" }` renders `aria-label='foo'`. |
35
+ # | `data` | `Hash` | Data attributes: `data: { foo: :bar }` renders `data-foo='bar'`. |
36
+ # | `height` | `Integer` | Height. |
37
+ # | `hidden` | `Boolean` | Whether to assign the `hidden` attribute. |
38
+ # | `style` | `String` | Inline styles. |
39
+ # | `title` | `String` | The `title` attribute. |
40
+ # | `width` | `Integer` | Width. |
41
+ #
42
+ # ## Animation
43
+ #
44
+ # | Name | Type | Description |
45
+ # | :- | :- | :- |
46
+ # | `animation` | Symbol | <%= one_of([:fade_in, :fade_out, :fade_up, :fade_down, :scale_in, :pulse, :grow_x, :grow]) %> |
47
+ #
48
+ # ## Border
49
+ #
50
+ # | Name | Type | Description |
51
+ # | :- | :- | :- |
52
+ # | `border_bottom` | Integer | Set to `0` to remove the bottom border. |
53
+ # | `border_left` | Integer | Set to `0` to remove the left border. |
54
+ # | `border_radius` | Integer | <%= one_of([0, 1, 2, 3]) %> |
55
+ # | `border_right` | Integer | Set to `0` to remove the right border. |
56
+ # | `border_top` | Integer | Set to `0` to remove the top border. |
57
+ # | `border` | Symbol | <%= one_of([:left, :top, :bottom, :right, :y, :x, true]) %> |
58
+ # | `box_shadow` | Boolean, Symbol | Box shadow. <%= one_of([true, :medium, :large, :extra_large, :none]) %> |
59
+ #
60
+ # ## Color
61
+ #
62
+ # | Name | Type | Description |
63
+ # | :- | :- | :- |
64
+ # | `bg` | String, Symbol | Background color. Accepts either a hex value as a String or <%= one_of(Primer::Classify::FunctionalBorderColors::OPTIONS, lower: true) %> |
65
+ # | `border_color` | Symbol | Border color. <%= one_of(Primer::Classify::FunctionalBorderColors::OPTIONS) %> |
66
+ # | `color` | Symbol | Text color. <%= one_of(Primer::Classify::FunctionalTextColors::OPTIONS) %> |
67
+ #
68
+ # ## Flex
69
+ #
70
+ # | Name | Type | Description |
71
+ # | :- | :- | :- |
72
+ # | `align_items` | Symbol | <%= one_of([:flex_start, :flex_end, :center, :baseline, :stretch]) %> |
73
+ # | `align_self` | Symbol | <%= one_of([:auto, :start, :end, :center, :baseline, :stretch]) %> |
74
+ # | `flex_grow` | Integer | To enable, set to `0`. |
75
+ # | `flex_shrink` | Integer | To enable, set to `0`. |
76
+ # | `flex` | Integer, Symbol | <%= one_of([1, :auto]) %> |
77
+ # | `justify_content` | Symbol | <%= one_of([:flex_start, :flex_end, :center, :space_between, :space_around]) %> |
78
+ # | `width` | Symbol | <%= one_of([:fit, :fill]) %> |
79
+ #
80
+ # ## Grid
81
+ #
82
+ # | Name | Type | Description |
83
+ # | :- | :- | :- |
84
+ # | `col` | Integer | Number of columns. |
85
+ #
86
+ # ## Layout
87
+ #
88
+ # | Name | Type | Description |
89
+ # | :- | :- | :- |
90
+ # | `display` | Symbol | <%= one_of([:none, :block, :flex, :inline, :inline_block, :table, :table_cell]) %> |
91
+ # | `height` | Symbol | <%= one_of([:fit, :fill]) %> |
92
+ # | `hide` | Symbol | Hide the element at a specific breakpoint. <%= one_of([:sm, :md, :lg, :xl]) %> |
93
+ # | `v` | Symbol | Visibility. <%= one_of([:hidden, :visible]) %> |
94
+ # | `vertical_align` | Symbol | <%= one_of([:baseline, :top, :middle, :bottom, :text_top, :text_bottom]) %> |
95
+ #
96
+ # ## Position
97
+ #
98
+ # | Name | Type | Description |
99
+ # | :- | :- | :- |
100
+ # | `bottom` | Boolean | If `false`, sets `bottom: 0`. |
101
+ # | `float` | Symbol | <%= one_of([:left, :right]) %> |
102
+ # | `left` | Boolean | If `false`, sets `left: 0`. |
103
+ # | `position` | Symbol | <%= one_of([:relative, :absolute, :fixed]) %> |
104
+ # | `right` | Boolean | If `false`, sets `right: 0`. |
105
+ # | `top` | Boolean | If `false`, sets `top: 0`. |
106
+ #
107
+ # ## Spacing
108
+ #
109
+ # | Name | Type | Description |
110
+ # | :- | :- | :- |
111
+ # | `m` | Integer | Margin. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:m]) %> |
112
+ # | `mb` | Integer | Margin bottom. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:mb]) %> |
113
+ # | `ml` | Integer | Margin left. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:ml]) %> |
114
+ # | `mr` | Integer | Margin right. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:mr]) %> |
115
+ # | `mt` | Integer | Margin top. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:mt]) %> |
116
+ # | `mx` | Integer | Horizontal margins. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:mx]) %> |
117
+ # | `my` | Integer | Vertical margins. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:my]) %> |
118
+ # | `p` | Integer | Padding. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:p]) %> |
119
+ # | `pb` | Integer | Padding bottom. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:pb]) %> |
120
+ # | `pl` | Integer | Padding left. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:pl]) %> |
121
+ # | `pr` | Integer | Padding right. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:pr]) %> |
122
+ # | `pt` | Integer | Padding left. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:pt]) %> |
123
+ # | `px` | Integer | Horizontal padding. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:px]) %> |
124
+ # | `py` | Integer | Vertical padding. <%= one_of(Primer::Classify::Spacing::MAPPINGS[:py]) %> |
125
+ #
126
+ # ## Typography
127
+ #
128
+ # | Name | Type | Description |
129
+ # | :- | :- | :- |
130
+ # | `font_size` | String, Integer | <%= one_of(["00", 0, 1, 2, 3, 4, 5, 6]) %> |
131
+ # | `font_weight` | Symbol | Font weight. <%= one_of([:light, :normal, :bold]) %> |
132
+ # | `text_align` | Symbol | Text alignment. <%= one_of([:left, :right, :center]) %> |
133
+ # | `underline` | Boolean | Whether text should be underlined. |
134
+ # | `word_break` | Symbol | Whether to break words on line breaks. Can only be `:break_all`. |
135
+ #
136
+ # ## Other
137
+ #
138
+ # | Name | Type | Description |
139
+ # | :- | :- | :- |
140
+ # | classes | String | CSS class name value to be concatenated with generated Primer CSS classes. |
141
+ # | tag | Symbol | HTML tag name to be passed to `content_tag`. |
142
+ # | test_selector | String | Adds `data-test-selector='given value'` in non-Production environments for testing purposes. |
113
143
  def initialize(tag:, classes: nil, **system_arguments)
114
144
  @tag = tag
115
145
  @result = Primer::Classify.call(**system_arguments.merge(classes: classes))