primer_view_components 0.0.39 → 0.0.40
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -2
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/components/primer/avatar_stack_component.rb +5 -2
- data/app/components/primer/base_component.rb +2 -2
- data/app/components/primer/blankslate_component.rb +3 -3
- data/app/components/primer/button_group.rb +1 -1
- data/app/components/primer/component.rb +5 -0
- data/app/components/primer/counter_component.rb +6 -1
- data/app/components/primer/flex_component.rb +27 -0
- data/app/components/primer/flex_item_component.rb +1 -1
- data/app/components/primer/heading_component.rb +11 -18
- data/app/components/primer/hidden_text_expander.rb +1 -1
- data/app/components/primer/icon_button.rb +20 -3
- data/app/components/primer/image_crop.d.ts +1 -0
- data/app/components/primer/image_crop.html.erb +12 -0
- data/app/components/primer/image_crop.js +1 -0
- data/app/components/primer/image_crop.rb +36 -0
- data/app/components/primer/image_crop.ts +1 -0
- data/app/components/primer/{markdown_component.rb → markdown.rb} +5 -4
- data/app/components/primer/octicon_component.html.erb +7 -0
- data/app/components/primer/octicon_component.rb +15 -8
- data/app/components/primer/octicon_symbols_component.html.erb +3 -0
- data/app/components/primer/octicon_symbols_component.rb +61 -0
- data/app/components/primer/primer.d.ts +1 -0
- data/app/components/primer/primer.js +1 -0
- data/app/components/primer/primer.ts +1 -0
- data/app/components/primer/spinner_component.rb +2 -2
- data/app/components/primer/subhead_component.rb +34 -4
- data/app/components/primer/text_component.rb +5 -2
- data/app/lib/primer/classify.rb +1 -1
- data/app/lib/primer/classify/cache.rb +1 -1
- data/app/lib/primer/octicon/cache.rb +4 -0
- data/lib/primer/view_components.rb +1 -1
- data/lib/primer/view_components/version.rb +1 -1
- data/lib/tasks/coverage.rake +14 -0
- data/lib/tasks/docs.rake +312 -0
- data/lib/tasks/statuses.rake +12 -0
- data/lib/yard/docs_helper.rb +57 -0
- data/static/statuses.json +52 -1
- metadata +15 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7172f41b4d5dff9f0786f75adba69f724dcf40197b39bbd99da75f83b6e351a8
|
4
|
+
data.tar.gz: 05ed20da017eb0a5c5e44322e643ef17728a6624d1eb4fba8463285dbd4c75d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03714d032f7030c3566d7b8ac18d7d662f5e7e7368af8c83400fa1e86972cf4a38fbc8a2c78524a8060e767738b6a606fb84d0824fa43e1ee0a1d6101f519274
|
7
|
+
data.tar.gz: 71dc078f7d7bcfadc5148fd3d7e443c82e7a805e09a159b0e837a894d19b70dc4df0aada3b0618273700e6c9661c31ad56f8d1e5e40c67d3f271025f5a8288e1
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,70 @@
|
|
2
2
|
|
3
3
|
## main
|
4
4
|
|
5
|
+
## 0.0.40
|
6
|
+
|
7
|
+
### New
|
8
|
+
|
9
|
+
* Create `ImageCrop` component.
|
10
|
+
|
11
|
+
*Kristján Oddsson*
|
12
|
+
|
13
|
+
### Changes
|
14
|
+
|
15
|
+
* Promote `IconButton` to beta.
|
16
|
+
|
17
|
+
*Manuel Puyol*
|
18
|
+
|
19
|
+
* Add `box` argument to `IconButton`.
|
20
|
+
|
21
|
+
*Manuel Puyol*
|
22
|
+
|
23
|
+
* Promote `Markdown` to beta.
|
24
|
+
|
25
|
+
*Manuel Puyol*
|
26
|
+
|
27
|
+
### Bug fixes
|
28
|
+
|
29
|
+
* Fix `IconButton` raising when `aria-label` was provided using an object.
|
30
|
+
|
31
|
+
*Manuel Puyol*
|
32
|
+
|
33
|
+
* Fix disabling of default styles for `SpinnerComponent` via `nil` style parameter.
|
34
|
+
|
35
|
+
*Chris Wilson*
|
36
|
+
|
37
|
+
### Deprecations
|
38
|
+
|
39
|
+
* Deprecate `Flex` in favor of `BoxComponent`.
|
40
|
+
|
41
|
+
*Manuel Puyol*
|
42
|
+
|
43
|
+
### Breaking Changes
|
44
|
+
|
45
|
+
* Restrict `ButtonGroup` tag to `:div` and update docs for `Text` tag.
|
46
|
+
|
47
|
+
*Kate Higa*
|
48
|
+
|
49
|
+
* Remove non-functional `width` and `height` `:fill` option.
|
50
|
+
|
51
|
+
*Jon Rohan*, *Joel Hawksley*
|
52
|
+
|
53
|
+
* Restrict `Subhead` `heading` slot tag to `div` and `h1`-`h6`.
|
54
|
+
|
55
|
+
*Kate Higa*
|
56
|
+
|
57
|
+
* Restrict `Blankslate` tag to `div`.
|
58
|
+
|
59
|
+
*Kate Higa*
|
60
|
+
|
61
|
+
* Explicitly limit tag for `AvatarStack` to `:div` and `:span`.
|
62
|
+
|
63
|
+
*Kate Higa*
|
64
|
+
|
65
|
+
* Rename `MarkdownComponent` to `Markdown`.
|
66
|
+
|
67
|
+
*Manuel Puyol*
|
68
|
+
|
5
69
|
## 0.0.39
|
6
70
|
|
7
71
|
* Promote `CloseButton` to beta.
|
@@ -10,7 +74,7 @@
|
|
10
74
|
|
11
75
|
* Update `ClipboardCopy` to not toggle icons unless they both exist.
|
12
76
|
|
13
|
-
*
|
77
|
+
*Kristján Oddsson*
|
14
78
|
|
15
79
|
* Add `icon` and `counter` slots to `ButtonComponent`.
|
16
80
|
|
@@ -52,7 +116,7 @@
|
|
52
116
|
|
53
117
|
* Create `ClipboardCopy` component.
|
54
118
|
|
55
|
-
*
|
119
|
+
*Kristján Oddsson*
|
56
120
|
|
57
121
|
* **Breaking change:** Rename `ButtonGroupComponent` to `ButtonGroup` and promote it to beta.
|
58
122
|
|
@@ -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),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&&n&&(v(e),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));
|
1
|
+
const t=!!navigator.userAgent.match(/Macintosh/);class e{constructor(e,n){this.input=e,this.list=n,this.isComposing=!1,n.id||(n.id=`combobox-${Math.random().toString().slice(2,6)}`),this.keyboardEventHandler=e=>function(e,n){if(e.shiftKey||e.metaKey||e.altKey)return;if(!t&&e.ctrlKey)return;if(n.isComposing)return;switch(e.key){case"Enter":case"Tab":(function(t,e){const n=e.querySelector('[aria-selected="true"]');return!!n&&("true"===n.getAttribute("aria-disabled")||n.click(),!0)})(n.input,n.list)&&e.preventDefault();break;case"Escape":n.clearSelection();break;case"ArrowDown":n.navigate(1),e.preventDefault();break;case"ArrowUp":n.navigate(-1),e.preventDefault();break;case"n":t&&e.ctrlKey&&(n.navigate(1),e.preventDefault());break;case"p":t&&e.ctrlKey&&(n.navigate(-1),e.preventDefault());break;default:if(e.ctrlKey)break;n.clearSelection()}}(e,this),this.compositionEventHandler=t=>function(t,e){e.isComposing="compositionstart"===t.type;if(!document.getElementById(e.input.getAttribute("aria-controls")||""))return;e.clearSelection()}(t,this),this.inputHandler=this.clearSelection.bind(this),e.setAttribute("role","combobox"),e.setAttribute("aria-controls",n.id),e.setAttribute("aria-expanded","false"),e.setAttribute("aria-autocomplete","list"),e.setAttribute("aria-haspopup","listbox")}destroy(){this.clearSelection(),this.stop(),this.input.removeAttribute("role"),this.input.removeAttribute("aria-controls"),this.input.removeAttribute("aria-expanded"),this.input.removeAttribute("aria-autocomplete"),this.input.removeAttribute("aria-haspopup")}start(){this.input.setAttribute("aria-expanded","true"),this.input.addEventListener("compositionstart",this.compositionEventHandler),this.input.addEventListener("compositionend",this.compositionEventHandler),this.input.addEventListener("input",this.inputHandler),this.input.addEventListener("keydown",this.keyboardEventHandler),this.list.addEventListener("click",n)}stop(){this.clearSelection(),this.input.setAttribute("aria-expanded","false"),this.input.removeEventListener("compositionstart",this.compositionEventHandler),this.input.removeEventListener("compositionend",this.compositionEventHandler),this.input.removeEventListener("input",this.inputHandler),this.input.removeEventListener("keydown",this.keyboardEventHandler),this.list.removeEventListener("click",n)}navigate(t=1){const e=Array.from(this.list.querySelectorAll('[aria-selected="true"]')).filter(i)[0],n=Array.from(this.list.querySelectorAll('[role="option"]')).filter(i),o=n.indexOf(e);if(o===n.length-1&&1===t||0===o&&-1===t)return this.clearSelection(),void this.input.focus();let r=1===t?0:n.length-1;if(e&&o>=0){const e=o+t;e>=0&&e<n.length&&(r=e)}const a=n[r];if(a)for(const t of n)a===t?(this.input.setAttribute("aria-activedescendant",a.id),a.setAttribute("aria-selected","true"),s(this.list,a)):t.setAttribute("aria-selected","false")}clearSelection(){this.input.removeAttribute("aria-activedescendant");for(const t of this.list.querySelectorAll('[aria-selected="true"]'))t.setAttribute("aria-selected","false")}}function n(t){if(!(t.target instanceof Element))return;const e=t.target.closest('[role="option"]');e&&"true"!==e.getAttribute("aria-disabled")&&function(t){t.dispatchEvent(new CustomEvent("combobox-commit",{bubbles:!0}))}(e)}function i(t){return!t.hidden&&!(t instanceof HTMLInputElement&&"hidden"===t.type)&&(t.offsetWidth>0||t.offsetHeight>0)}function s(t,e){(function(t,e){const n=t.scrollTop,i=n+t.clientHeight,s=e.offsetTop,o=s+e.clientHeight;return s>=n&&o<=i})(t,e)||(t.scrollTop=e.offsetTop)}class o extends CustomEvent{constructor(t,e){super(t,e),this.relatedTarget=e.relatedTarget}}const r=new WeakMap;function a(t,e){const n=new XMLHttpRequest;return n.open("GET",e,!0),n.setRequestHeader("Accept","text/fragment+html"),function(t,e){const n=r.get(t);n&&n.abort();r.set(t,e);const i=()=>r.delete(t),s=function(t){return new Promise(((e,n)=>{t.onload=function(){t.status>=200&&t.status<300?e(t.responseText):n(new Error(t.responseText))},t.onerror=n,t.send()}))}(e);return s.then(i,i),s}(t,n)}class c{constructor(t,n,i){this.container=t,this.input=n,this.results=i,this.combobox=new e(n,i),this.results.hidden=!0,this.input.setAttribute("autocomplete","off"),this.input.setAttribute("spellcheck","false"),this.interactingWithList=!1,this.onInputChange=function(t,e=0){let n;return function(...i){clearTimeout(n),n=window.setTimeout((()=>{clearTimeout(n),t(...i)}),e)}}(this.onInputChange.bind(this),300),this.onResultsMouseDown=this.onResultsMouseDown.bind(this),this.onInputBlur=this.onInputBlur.bind(this),this.onInputFocus=this.onInputFocus.bind(this),this.onKeydown=this.onKeydown.bind(this),this.onCommit=this.onCommit.bind(this),this.input.addEventListener("keydown",this.onKeydown),this.input.addEventListener("focus",this.onInputFocus),this.input.addEventListener("blur",this.onInputBlur),this.input.addEventListener("input",this.onInputChange),this.results.addEventListener("mousedown",this.onResultsMouseDown),this.results.addEventListener("combobox-commit",this.onCommit)}destroy(){this.input.removeEventListener("keydown",this.onKeydown),this.input.removeEventListener("focus",this.onInputFocus),this.input.removeEventListener("blur",this.onInputBlur),this.input.removeEventListener("input",this.onInputChange),this.results.removeEventListener("mousedown",this.onResultsMouseDown),this.results.removeEventListener("combobox-commit",this.onCommit)}onKeydown(t){if("Escape"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowUp"===t.key&&this.container.open)this.container.open=!1,t.stopPropagation(),t.preventDefault();else if(t.altKey&&"ArrowDown"===t.key&&!this.container.open){if(!this.input.value.trim())return;this.container.open=!0,t.stopPropagation(),t.preventDefault()}}onInputFocus(){this.fetchResults()}onInputBlur(){this.interactingWithList?this.interactingWithList=!1:this.container.open=!1}onCommit({target:t}){const e=t;if(!(e instanceof HTMLElement))return;if(this.container.open=!1,e instanceof HTMLAnchorElement)return;const n=e.getAttribute("data-autocomplete-value")||e.textContent;this.container.value=n}onResultsMouseDown(){this.interactingWithList=!0}onInputChange(){this.container.removeAttribute("value"),this.fetchResults()}identifyOptions(){let t=0;for(const e of this.results.querySelectorAll('[role="option"]:not([id])'))e.id=`${this.results.id}-option-${t++}`}fetchResults(){const t=this.input.value.trim();if(!t)return void(this.container.open=!1);const e=this.container.src;if(!e)return;const n=new URL(e,window.location.href),i=new URLSearchParams(n.search.slice(1));i.append("q",t),n.search=i.toString(),this.container.dispatchEvent(new CustomEvent("loadstart")),a(this.input,n.toString()).then((t=>{this.results.innerHTML=t,this.identifyOptions();const e=!!this.results.querySelector('[role="option"]');this.container.open=e,this.container.dispatchEvent(new CustomEvent("load")),this.container.dispatchEvent(new CustomEvent("loadend"))})).catch((()=>{this.container.dispatchEvent(new CustomEvent("error")),this.container.dispatchEvent(new CustomEvent("loadend"))}))}open(){this.results.hidden&&(this.combobox.start(),this.results.hidden=!1)}close(){this.results.hidden||(this.combobox.stop(),this.results.hidden=!0)}}const u=new WeakMap;class l extends HTMLElement{constructor(){super()}connectedCallback(){const t=this.getAttribute("for");if(!t)return;const e=this.querySelector("input"),n=document.getElementById(t);e instanceof HTMLInputElement&&n&&(u.set(this,new c(this,e,n)),n.setAttribute("role","listbox"))}disconnectedCallback(){const t=u.get(this);t&&(t.destroy(),u.delete(this))}get src(){return this.getAttribute("src")||""}set src(t){this.setAttribute("src",t)}get value(){return this.getAttribute("value")||""}set value(t){this.setAttribute("value",t)}get open(){return this.hasAttribute("open")}set open(t){t?this.setAttribute("open",""):this.removeAttribute("open")}static get observedAttributes(){return["open","value"]}attributeChangedCallback(t,e,n){if(e===n)return;const i=u.get(this);if(i)switch(t){case"open":null===n?i.close():i.open();break;case"value":null!==n&&(i.input.value=n),this.dispatchEvent(new o("auto-complete-change",{bubbles:!0,relatedTarget:i.input}))}}}function d(t){if("clipboard"in navigator)return navigator.clipboard.writeText(t.textContent);const e=getSelection();if(null==e)return Promise.reject(new Error);e.removeAllRanges();const n=document.createRange();return n.selectNodeContents(t),e.addRange(n),document.execCommand("copy"),e.removeAllRanges(),Promise.resolve()}function h(t){if("clipboard"in navigator)return navigator.clipboard.writeText(t);const e=document.body;if(!e)return Promise.reject(new Error);const n=function(t){const e=document.createElement("pre");return e.style.width="1px",e.style.height="1px",e.style.position="fixed",e.style.top="5px",e.textContent=t,e}(t);return e.appendChild(n),d(n),e.removeChild(n),Promise.resolve()}function m(t){const e=t.getAttribute("for"),n=t.getAttribute("value");function i(){t.dispatchEvent(new CustomEvent("clipboard-copy",{bubbles:!0}))}if(n)h(n).then(i);else if(e){const n="getRootNode"in Element.prototype?t.getRootNode():t.ownerDocument;if(!(n instanceof Document||"ShadowRoot"in window&&n instanceof ShadowRoot))return;const o=n.getElementById(e);o&&(s=o,s instanceof HTMLInputElement||s instanceof HTMLTextAreaElement?h(s.value):s instanceof HTMLAnchorElement&&s.hasAttribute("href")?h(s.href):d(s)).then(i)}var s}function f(t){const e=t.currentTarget;e instanceof HTMLElement&&m(e)}function p(t){if(" "===t.key||"Enter"===t.key){const e=t.currentTarget;e instanceof HTMLElement&&(t.preventDefault(),m(e))}}function g(t){t.currentTarget.addEventListener("keydown",p)}function b(t){t.currentTarget.removeEventListener("keydown",p)}window.customElements.get("auto-complete")||(window.AutocompleteElement=l,window.customElements.define("auto-complete",l));class w extends HTMLElement{constructor(){super(),this.addEventListener("click",f),this.addEventListener("focus",g),this.addEventListener("blur",b)}connectedCallback(){this.hasAttribute("tabindex")||this.setAttribute("tabindex","0"),this.hasAttribute("role")||this.setAttribute("role","button")}get value(){return this.getAttribute("value")||""}set value(t){this.setAttribute("value",t)}}function v(t){""===t.style.display||"block"===t.style.display?t.style.display="none":t.style.display="block"}function y(t){const[e,n]=t.querySelectorAll(".octicon");e&&n&&(v(e),v(n))}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"]'),s=n[e],o=i[e];if(!!t.dispatchEvent(new CustomEvent("tab-container-change",{bubbles:!0,cancelable:!0,detail:{relatedTarget:o}}))){for(const t of n)t.setAttribute("aria-selected","false"),t.setAttribute("tabindex","-1");for(const t of i)t.hidden=!0,t.hasAttribute("tabindex")||t.hasAttribute("data-tab-container-no-tabstop")||t.setAttribute("tabindex","0");s.setAttribute("aria-selected","true"),s.setAttribute("tabindex","0"),s.focus(),o.hidden=!1,t.dispatchEvent(new CustomEvent("tab-container-changed",{bubbles:!0,detail:{relatedTarget:o}}))}}window.customElements.get("tab-container")||(window.TabContainerElement=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 x(t){return"0".concat(t).slice(-2)}function L(t,e){const n=t.getDay(),i=t.getDate(),s=t.getMonth(),o=t.getFullYear(),r=t.getHours(),a=t.getMinutes(),c=t.getSeconds();return e.replace(/%([%aAbBcdeHIlmMpPSwyYZz])/g,(function(e){let u;switch(e[1]){case"%":return"%";case"a":return M[n].slice(0,3);case"A":return M[n];case"b":return T[s].slice(0,3);case"B":return T[s];case"c":return t.toString();case"d":return x(i);case"e":return String(i);case"H":return x(r);case"I":return x(L(t,"%l"));case"l":return String(0===r||12===r?12:(r+12)%12);case"m":return x(s+1);case"M":return x(a);case"p":return r>11?"PM":"AM";case"P":return r>11?"pm":"am";case"S":return x(c);case"w":return String(n);case"y":return x(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 k(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=k({day:"numeric",month:"short"});function H(){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 D=null;const I=k({day:"numeric",month:"short",year:"numeric"});function R(t){const e=t.closest("[lang]");return e instanceof HTMLElement&&e.lang?e.lang:"default"}const F=new WeakMap;class Y extends HTMLElement{static get observedAttributes(){return["datetime","day","format","lang","hour","minute","month","second","title","weekday","year"]}connectedCallback(){const t=this.getFormattedTitle();t&&!this.hasAttribute("title")&&this.setAttribute("title",t);const e=this.getFormattedDate();e&&(this.textContent=e)}attributeChangedCallback(t,e,n){const i=this.getFormattedTitle();if("datetime"===t){const t=Date.parse(n);isNaN(t)?F.delete(this):F.set(this,new Date(t))}const s=this.getFormattedTitle(),o=this.getAttribute("title");"title"===t||!s||o&&o!==i||this.setAttribute("title",s);const r=this.getFormattedDate();r&&(this.textContent=r)}get date(){return F.get(this)}getFormattedTitle(){const t=this.date;if(!t)return;const e=q();if(e)return e.format(t);try{return t.toLocaleString()}catch(e){if(e instanceof RangeError)return t.toString();throw e}}getFormattedDate(){}}const q=k({day:"numeric",month:"short",year:"numeric",hour:"numeric",minute:"2-digit",timeZoneName:"short"}),X=new WeakMap;class W extends Y{attributeChangedCallback(t,e,n){"hour"!==t&&"minute"!==t&&"second"!==t&&"time-zone-name"!==t||X.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=H()?"weekday day month year":"weekday month day, year";for(const e in n){const s=n[e][t.getAttribute(e)];i=i.replace(e,s||"")}return i=i.replace(/(\s,)|(,\s$)/,""),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 s=t.getAttribute("minute");"numeric"!==s&&"2-digit"!==s||(n.minute=s);const o=t.getAttribute("second");"numeric"!==o&&"2-digit"!==o||(n.second=o);const r=t.getAttribute("time-zone-name");"short"!==r&&"long"!==r||(n.timeZoneName=r);if(0===Object.keys(n).length)return;let a=X.get(t);a||(a=k(n),X.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=W,window.customElements.define("local-time",W));class K{constructor(t,e){this.date=t,this.locale=e}toString(){const t=this.timeElapsed();if(t)return t;{const t=this.timeAhead();return t||"on ".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),s=Math.round(i/24);return t>=0&&s<30?this.timeAgoFromMs(t):null}timeAhead(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24);return t>=0&&s<30?this.timeUntil():null}timeAgo(){const t=(new Date).getTime()-this.date.getTime();return this.timeAgoFromMs(t)}timeAgoFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return t<0||e<10?O(this.locale,0,"second"):e<45?O(this.locale,-e,"second"):e<90||n<45?O(this.locale,-n,"minute"):n<90||i<24?O(this.locale,-i,"hour"):i<36||s<30?O(this.locale,-s,"day"):o<18?O(this.locale,-o,"month"):O(this.locale,-r,"year")}microTimeAgo(){const t=(new Date).getTime()-this.date.getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return n<1?"1m":n<60?"".concat(n,"m"):i<24?"".concat(i,"h"):s<365?"".concat(s,"d"):"".concat(r,"y")}timeUntil(){const t=this.date.getTime()-(new Date).getTime();return this.timeUntilFromMs(t)}timeUntilFromMs(t){const e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return o>=18||o>=12?O(this.locale,r,"year"):s>=45||s>=30?O(this.locale,o,"month"):i>=36||i>=24?O(this.locale,s,"day"):n>=90||n>=45?O(this.locale,i,"hour"):e>=90||e>=45?O(this.locale,n,"minute"):O(this.locale,e>=10?e:0,"second")}microTimeUntil(){const t=this.date.getTime()-(new Date).getTime(),e=Math.round(t/1e3),n=Math.round(e/60),i=Math.round(n/60),s=Math.round(i/24),o=Math.round(s/30),r=Math.round(o/12);return s>=365?"".concat(r,"y"):i>=24?"".concat(s,"d"):n>=60?"".concat(i,"h"):n>1?"".concat(n,"m"):"1m"}formatDate(){let t=H()?"%e %b":"%b %e";var e;return e=this.date,(new Date).getUTCFullYear()!==e.getUTCFullYear()&&(t+=function(){if(null!==D)return D;const t=I();if(t){const e=t.format(new Date(0));return D=!!e.match(/\d,/),D}return!0}()?", %Y":" %Y"),L(this.date,t)}formatTime(){const t=U();return t?t.format(this.date):L(this.date,"%l:%M%P")}}function O(t,e,n){const i=function(t,e){if("Intl"in window&&"RelativeTimeFormat"in window.Intl)try{return new Intl.RelativeTimeFormat(t,e)}catch(t){if(!(t instanceof RangeError))throw t}}(t,{numeric:"auto"});return i?i.format(e,n):function(t,e){if(0===t)switch(e){case"year":case"quarter":case"month":case"week":return"this ".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 U=k({hour:"numeric",minute:"2-digit"});class z extends Y{getFormattedDate(){const t=this.date;if(t)return new K(t,R(this)).toString()}connectedCallback(){P.push(this),B||($(),B=setInterval($,6e4)),super.connectedCallback()}disconnectedCallback(){const t=P.indexOf(this);-1!==t&&P.splice(t,1),P.length||B&&(clearInterval(B),B=null)}}const P=[];let B;function $(){let t,e,n;for(e=0,n=P.length;e<n;e++)t=P[e],t.textContent=t.getFormattedDate()||""}window.customElements.get("relative-time")||(window.RelativeTimeElement=z,window.customElements.define("relative-time",z));class N extends z{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new K(e,R(this)).microTimeAgo():new K(e,R(this)).timeAgo()}}window.customElements.get("time-ago")||(window.TimeAgoElement=N,window.customElements.define("time-ago",N));class Z extends z{getFormattedDate(){const t=this.getAttribute("format"),e=this.date;if(e)return"micro"===t?new K(e,R(this)).microTimeUntil():new K(e,R(this)).timeUntil()}}window.customElements.get("time-until")||(window.TimeUntilElement=Z,window.customElements.define("time-until",Z));const j=new WeakMap,J=new WeakMap,G=new WeakMap;function Q(t){const e=t.currentTarget;if(!(e instanceof ot))return;const{box:n,image:i}=G.get(e)||{};if(!n||!i)return;let s=0,o=0;if(t instanceof KeyboardEvent)"ArrowUp"===t.key?o=-1:"ArrowDown"===t.key?o=1:"ArrowLeft"===t.key?s=-1:"ArrowRight"===t.key&&(s=1);else if(J.has(e)&&t instanceof MouseEvent){const n=J.get(e);s=t.pageX-n.dragStartX,o=t.pageY-n.dragStartY}else if(J.has(e)&&t instanceof TouchEvent){const{pageX:n,pageY:i}=t.changedTouches[0],{dragStartX:r,dragStartY:a}=J.get(e);s=n-r,o=i-a}if(0!==s||0!==o){const t=Math.min(Math.max(0,n.offsetLeft+s),i.width-n.offsetWidth),r=Math.min(Math.max(0,n.offsetTop+o),i.height-n.offsetHeight);n.style.left=`${t}px`,n.style.top=`${r}px`,st(e,{x:t,y:r,width:n.offsetWidth,height:n.offsetHeight})}if(t instanceof MouseEvent)J.set(e,{dragStartX:t.pageX,dragStartY:t.pageY});else if(t instanceof TouchEvent){const{pageX:n,pageY:i}=t.changedTouches[0];J.set(e,{dragStartX:n,dragStartY:i})}}function V(t){const e=t.target;if(!(e instanceof HTMLElement))return;const n=_(e);if(!(n instanceof ot))return;const{box:i}=G.get(n)||{};if(!i)return;const s=n.getBoundingClientRect();let o,r,a;if(t instanceof KeyboardEvent){if("Escape"===t.key)return nt(n);if("-"===t.key&&(a=-10),"="===t.key&&(a=10),!a)return;o=i.offsetWidth+a,r=i.offsetHeight+a,j.set(n,{startX:i.offsetLeft,startY:i.offsetTop})}else if(t instanceof MouseEvent){const e=j.get(n);if(!e)return;o=t.pageX-e.startX-s.left-window.pageXOffset,r=t.pageY-e.startY-s.top-window.pageYOffset}else if(t instanceof TouchEvent){const e=j.get(n);if(!e)return;o=t.changedTouches[0].pageX-e.startX-s.left-window.pageXOffset,r=t.changedTouches[0].pageY-e.startY-s.top-window.pageYOffset}o&&r&&et(n,o,r,!(t instanceof KeyboardEvent))}function _(t){const e=t.getRootNode();return e instanceof ShadowRoot?e.host:t}function tt(t){const e=t.currentTarget;if(!(e instanceof HTMLElement))return;const n=_(e);if(!(n instanceof ot))return;const{box:i}=G.get(n)||{};if(!i)return;const s=t.target;if(s instanceof HTMLElement)if(s.hasAttribute("data-direction")){const e=s.getAttribute("data-direction")||"";n.addEventListener("mousemove",V),n.addEventListener("touchmove",V,{passive:!0}),["nw","se"].indexOf(e)>=0&&n.classList.add("nwse"),["ne","sw"].indexOf(e)>=0&&n.classList.add("nesw"),j.set(n,{startX:i.offsetLeft+(["se","ne"].indexOf(e)>=0?0:i.offsetWidth),startY:i.offsetTop+(["se","sw"].indexOf(e)>=0?0:i.offsetHeight)}),V(t)}else n.addEventListener("mousemove",Q),n.addEventListener("touchmove",Q,{passive:!0})}function et(t,e,n,i=!0){let s=Math.max(Math.abs(e),Math.abs(n),10);const o=j.get(t);if(!o)return;const{box:r,image:a}=G.get(t)||{};if(!r||!a)return;s=Math.min(s,n>0?a.height-o.startY:o.startY,e>0?a.width-o.startX:o.startX);const c=i?Math.round(Math.max(0,e>0?o.startX:o.startX-s)):r.offsetLeft,u=i?Math.round(Math.max(0,n>0?o.startY:o.startY-s)):r.offsetTop;r.style.left=`${c}px`,r.style.top=`${u}px`,r.style.width=`${s}px`,r.style.height=`${s}px`,st(t,{x:c,y:u,width:s,height:s})}function nt(t){const{image:e}=G.get(t)||{};if(!e)return;const n=Math.round(e.clientWidth>e.clientHeight?e.clientHeight:e.clientWidth);j.set(t,{startX:(e.clientWidth-n)/2,startY:(e.clientHeight-n)/2}),et(t,n,n)}function it(t){const e=t.currentTarget;e instanceof ot&&(J.delete(e),e.classList.remove("nwse","nesw"),e.removeEventListener("mousemove",V),e.removeEventListener("mousemove",Q),e.removeEventListener("touchmove",V),e.removeEventListener("touchmove",Q))}function st(t,e){const{image:n}=G.get(t)||{};if(!n)return;const i=n.naturalWidth/n.width;for(const n in e){const s=Math.round(e[n]*i);e[n]=s;const o=t.querySelector(`[data-image-crop-input='${n}']`);o instanceof HTMLInputElement&&(o.value=s.toString())}t.dispatchEvent(new CustomEvent("image-crop-change",{bubbles:!0,detail:e}))}class ot extends HTMLElement{connectedCallback(){if(G.has(this))return;const t=this.attachShadow({mode:"open"});t.innerHTML='\n<style>\n :host { touch-action: none; display: block; }\n :host(.nesw) { cursor: nesw-resize; }\n :host(.nwse) { cursor: nwse-resize; }\n :host(.nesw) .crop-box, :host(.nwse) .crop-box { cursor: inherit; }\n :host([loaded]) .crop-image { display: block; }\n :host([loaded]) ::slotted([data-loading-slot]), .crop-image { display: none; }\n\n .crop-wrapper {\n position: relative;\n font-size: 0;\n }\n .crop-container {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n overflow: hidden;\n z-index: 1;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n :host([rounded]) .crop-box {\n border-radius: 50%;\n box-shadow: 0 0 0 4000px rgba(0, 0, 0, 0.3);\n }\n .crop-box {\n position: absolute;\n border: 1px dashed #fff;\n box-sizing: border-box;\n cursor: move;\n }\n\n :host([rounded]) .crop-outline {\n outline: none;\n }\n .crop-outline {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n outline: 4000px solid rgba(0, 0, 0, .3);\n }\n\n .handle { position: absolute; }\n :host([rounded]) .handle::before { border-radius: 50%; }\n .handle:before {\n position: absolute;\n display: block;\n padding: 4px;\n transform: translate(-50%, -50%);\n content: \' \';\n background: #fff;\n border: 1px solid #767676;\n }\n .ne { top: 0; right: 0; cursor: nesw-resize; }\n .nw { top: 0; left: 0; cursor: nwse-resize; }\n .se { bottom: 0; right: 0; cursor: nwse-resize; }\n .sw { bottom: 0; left: 0; cursor: nesw-resize; }\n</style>\n<slot></slot>\n<div class="crop-wrapper">\n <img width="100%" class="crop-image" alt="">\n <div class="crop-container">\n <div data-crop-box class="crop-box">\n <div class="crop-outline"></div>\n <div data-direction="nw" class="handle nw"></div>\n <div data-direction="ne" class="handle ne"></div>\n <div data-direction="sw" class="handle sw"></div>\n <div data-direction="se" class="handle se"></div>\n </div>\n </div>\n</div>\n';const e=t.querySelector("[data-crop-box]");if(!(e instanceof HTMLElement))return;const n=t.querySelector("img");n instanceof HTMLImageElement&&(G.set(this,{box:e,image:n}),n.addEventListener("load",(()=>{this.loaded=!0,nt(this)})),this.addEventListener("mouseleave",it),this.addEventListener("touchend",it),this.addEventListener("mouseup",it),e.addEventListener("mousedown",tt),e.addEventListener("touchstart",tt,{passive:!0}),this.addEventListener("keydown",Q),this.addEventListener("keydown",V),this.src&&(n.src=this.src))}static get observedAttributes(){return["src"]}get src(){return this.getAttribute("src")}set src(t){t?this.setAttribute("src",t):this.removeAttribute("src")}get loaded(){return this.hasAttribute("loaded")}set loaded(t){t?this.setAttribute("loaded",""):this.removeAttribute("loaded")}attributeChangedCallback(t,e,n){const{image:i}=G.get(this)||{};"src"===t&&(this.loaded=!1,i&&(i.src=n))}}window.customElements.get("image-crop")||(window.ImageCropElement=ot,window.customElements.define("image-crop",ot));
|
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/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 || !checkIcon)\n return;\n toggleSVG(clippyIcon);\n toggleSVG(checkIcon);\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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"}
|
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","../../../node_modules/@github/image-crop-element/dist/index.js"],"sourcesContent":["const ctrlBindings = !!navigator.userAgent.match(/Macintosh/);\nexport default class Combobox {\n constructor(input, list) {\n this.input = input;\n this.list = list;\n this.isComposing = false;\n if (!list.id) {\n list.id = `combobox-${Math.random()\n .toString()\n .slice(2, 6)}`;\n }\n this.keyboardEventHandler = event => keyboardBindings(event, this);\n this.compositionEventHandler = event => trackComposition(event, this);\n this.inputHandler = this.clearSelection.bind(this);\n input.setAttribute('role', 'combobox');\n input.setAttribute('aria-controls', list.id);\n input.setAttribute('aria-expanded', 'false');\n input.setAttribute('aria-autocomplete', 'list');\n input.setAttribute('aria-haspopup', 'listbox');\n }\n destroy() {\n this.clearSelection();\n this.stop();\n this.input.removeAttribute('role');\n this.input.removeAttribute('aria-controls');\n this.input.removeAttribute('aria-expanded');\n this.input.removeAttribute('aria-autocomplete');\n this.input.removeAttribute('aria-haspopup');\n }\n start() {\n this.input.setAttribute('aria-expanded', 'true');\n this.input.addEventListener('compositionstart', this.compositionEventHandler);\n this.input.addEventListener('compositionend', this.compositionEventHandler);\n this.input.addEventListener('input', this.inputHandler);\n this.input.addEventListener('keydown', this.keyboardEventHandler);\n this.list.addEventListener('click', commitWithElement);\n }\n stop() {\n this.clearSelection();\n this.input.setAttribute('aria-expanded', 'false');\n this.input.removeEventListener('compositionstart', this.compositionEventHandler);\n this.input.removeEventListener('compositionend', this.compositionEventHandler);\n this.input.removeEventListener('input', this.inputHandler);\n this.input.removeEventListener('keydown', this.keyboardEventHandler);\n this.list.removeEventListener('click', commitWithElement);\n }\n navigate(indexDiff = 1) {\n const focusEl = Array.from(this.list.querySelectorAll('[aria-selected=\"true\"]')).filter(visible)[0];\n const els = Array.from(this.list.querySelectorAll('[role=\"option\"]')).filter(visible);\n const focusIndex = els.indexOf(focusEl);\n if ((focusIndex === els.length - 1 && indexDiff === 1) || (focusIndex === 0 && indexDiff === -1)) {\n this.clearSelection();\n this.input.focus();\n return;\n }\n let indexOfItem = indexDiff === 1 ? 0 : els.length - 1;\n if (focusEl && focusIndex >= 0) {\n const newIndex = focusIndex + indexDiff;\n if (newIndex >= 0 && newIndex < els.length)\n indexOfItem = newIndex;\n }\n const target = els[indexOfItem];\n if (!target)\n return;\n for (const el of els) {\n if (target === el) {\n this.input.setAttribute('aria-activedescendant', target.id);\n target.setAttribute('aria-selected', 'true');\n scrollTo(this.list, target);\n }\n else {\n el.setAttribute('aria-selected', 'false');\n }\n }\n }\n clearSelection() {\n this.input.removeAttribute('aria-activedescendant');\n for (const el of this.list.querySelectorAll('[aria-selected=\"true\"]')) {\n el.setAttribute('aria-selected', 'false');\n }\n }\n}\nfunction keyboardBindings(event, combobox) {\n if (event.shiftKey || event.metaKey || event.altKey)\n return;\n if (!ctrlBindings && event.ctrlKey)\n return;\n if (combobox.isComposing)\n return;\n switch (event.key) {\n case 'Enter':\n case 'Tab':\n if (commit(combobox.input, combobox.list)) {\n event.preventDefault();\n }\n break;\n case 'Escape':\n combobox.clearSelection();\n break;\n case 'ArrowDown':\n combobox.navigate(1);\n event.preventDefault();\n break;\n case 'ArrowUp':\n combobox.navigate(-1);\n event.preventDefault();\n break;\n case 'n':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(1);\n event.preventDefault();\n }\n break;\n case 'p':\n if (ctrlBindings && event.ctrlKey) {\n combobox.navigate(-1);\n event.preventDefault();\n }\n break;\n default:\n if (event.ctrlKey)\n break;\n combobox.clearSelection();\n }\n}\nfunction commitWithElement(event) {\n if (!(event.target instanceof Element))\n return;\n const target = event.target.closest('[role=\"option\"]');\n if (!target)\n return;\n if (target.getAttribute('aria-disabled') === 'true')\n return;\n fireCommitEvent(target);\n}\nfunction commit(input, list) {\n const target = list.querySelector('[aria-selected=\"true\"]');\n if (!target)\n return false;\n if (target.getAttribute('aria-disabled') === 'true')\n return true;\n target.click();\n return true;\n}\nfunction fireCommitEvent(target) {\n target.dispatchEvent(new CustomEvent('combobox-commit', { bubbles: true }));\n}\nfunction visible(el) {\n return (!el.hidden &&\n !(el instanceof HTMLInputElement && el.type === 'hidden') &&\n (el.offsetWidth > 0 || el.offsetHeight > 0));\n}\nfunction trackComposition(event, combobox) {\n combobox.isComposing = event.type === 'compositionstart';\n const list = document.getElementById(combobox.input.getAttribute('aria-controls') || '');\n if (!list)\n return;\n combobox.clearSelection();\n}\nfunction scrollTo(container, target) {\n if (!inViewport(container, target)) {\n container.scrollTop = target.offsetTop;\n }\n}\nfunction inViewport(container, element) {\n const scrollTop = container.scrollTop;\n const containerBottom = scrollTop + container.clientHeight;\n const top = element.offsetTop;\n const bottom = top + element.clientHeight;\n return top >= scrollTop && bottom <= containerBottom;\n}\n","import Combobox from '@github/combobox-nav';\n\nclass AutocompleteEvent extends CustomEvent {\n constructor(type, init) {\n super(type, init);\n this.relatedTarget = init.relatedTarget;\n }\n}\n\nfunction debounce(callback, wait = 0) {\n let timeout;\n return function (...Rest) {\n clearTimeout(timeout);\n timeout = window.setTimeout(() => {\n clearTimeout(timeout);\n callback(...Rest);\n }, wait);\n };\n}\n\nconst requests = new WeakMap();\nfunction fragment(el, url) {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', url, true);\n xhr.setRequestHeader('Accept', 'text/fragment+html');\n return request(el, xhr);\n}\nfunction request(el, xhr) {\n const pending = requests.get(el);\n if (pending)\n pending.abort();\n requests.set(el, xhr);\n const clear = () => requests.delete(el);\n const result = send(xhr);\n result.then(clear, clear);\n return result;\n}\nfunction send(xhr) {\n return new Promise((resolve, reject) => {\n xhr.onload = function () {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText);\n }\n else {\n reject(new Error(xhr.responseText));\n }\n };\n xhr.onerror = reject;\n xhr.send();\n });\n}\n\nclass Autocomplete {\n constructor(container, input, results) {\n this.container = container;\n this.input = input;\n this.results = results;\n this.combobox = new Combobox(input, results);\n this.results.hidden = true;\n this.input.setAttribute('autocomplete', 'off');\n this.input.setAttribute('spellcheck', 'false');\n this.interactingWithList = false;\n this.onInputChange = debounce(this.onInputChange.bind(this), 300);\n this.onResultsMouseDown = this.onResultsMouseDown.bind(this);\n this.onInputBlur = this.onInputBlur.bind(this);\n this.onInputFocus = this.onInputFocus.bind(this);\n this.onKeydown = this.onKeydown.bind(this);\n this.onCommit = this.onCommit.bind(this);\n this.input.addEventListener('keydown', this.onKeydown);\n this.input.addEventListener('focus', this.onInputFocus);\n this.input.addEventListener('blur', this.onInputBlur);\n this.input.addEventListener('input', this.onInputChange);\n this.results.addEventListener('mousedown', this.onResultsMouseDown);\n this.results.addEventListener('combobox-commit', this.onCommit);\n }\n destroy() {\n this.input.removeEventListener('keydown', this.onKeydown);\n this.input.removeEventListener('focus', this.onInputFocus);\n this.input.removeEventListener('blur', this.onInputBlur);\n this.input.removeEventListener('input', this.onInputChange);\n this.results.removeEventListener('mousedown', this.onResultsMouseDown);\n this.results.removeEventListener('combobox-commit', this.onCommit);\n }\n onKeydown(event) {\n if (event.key === 'Escape' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowUp' && this.container.open) {\n this.container.open = false;\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.altKey && event.key === 'ArrowDown' && !this.container.open) {\n if (!this.input.value.trim())\n return;\n this.container.open = true;\n event.stopPropagation();\n event.preventDefault();\n }\n }\n onInputFocus() {\n this.fetchResults();\n }\n onInputBlur() {\n if (this.interactingWithList) {\n this.interactingWithList = false;\n return;\n }\n this.container.open = false;\n }\n onCommit({ target }) {\n const selected = target;\n if (!(selected instanceof HTMLElement))\n return;\n this.container.open = false;\n if (selected instanceof HTMLAnchorElement)\n return;\n const value = selected.getAttribute('data-autocomplete-value') || selected.textContent;\n this.container.value = value;\n }\n onResultsMouseDown() {\n this.interactingWithList = true;\n }\n onInputChange() {\n this.container.removeAttribute('value');\n this.fetchResults();\n }\n identifyOptions() {\n let id = 0;\n for (const el of this.results.querySelectorAll('[role=\"option\"]:not([id])')) {\n el.id = `${this.results.id}-option-${id++}`;\n }\n }\n fetchResults() {\n const query = this.input.value.trim();\n if (!query) {\n this.container.open = false;\n return;\n }\n const src = this.container.src;\n if (!src)\n return;\n const url = new URL(src, window.location.href);\n const params = new URLSearchParams(url.search.slice(1));\n params.append('q', query);\n url.search = params.toString();\n this.container.dispatchEvent(new CustomEvent('loadstart'));\n fragment(this.input, url.toString())\n .then(html => {\n this.results.innerHTML = html;\n this.identifyOptions();\n const hasResults = !!this.results.querySelector('[role=\"option\"]');\n this.container.open = hasResults;\n this.container.dispatchEvent(new CustomEvent('load'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n })\n .catch(() => {\n this.container.dispatchEvent(new CustomEvent('error'));\n this.container.dispatchEvent(new CustomEvent('loadend'));\n });\n }\n open() {\n if (!this.results.hidden)\n return;\n this.combobox.start();\n this.results.hidden = false;\n }\n close() {\n if (this.results.hidden)\n return;\n this.combobox.stop();\n this.results.hidden = true;\n }\n}\n\nconst state = new WeakMap();\nclass AutocompleteElement extends HTMLElement {\n constructor() {\n super();\n }\n connectedCallback() {\n const listId = this.getAttribute('for');\n if (!listId)\n return;\n const input = this.querySelector('input');\n const results = document.getElementById(listId);\n if (!(input instanceof HTMLInputElement) || !results)\n return;\n state.set(this, new Autocomplete(this, input, results));\n results.setAttribute('role', 'listbox');\n }\n disconnectedCallback() {\n const autocomplete = state.get(this);\n if (autocomplete) {\n autocomplete.destroy();\n state.delete(this);\n }\n }\n get src() {\n return this.getAttribute('src') || '';\n }\n set src(url) {\n this.setAttribute('src', url);\n }\n get value() {\n return this.getAttribute('value') || '';\n }\n set value(value) {\n this.setAttribute('value', value);\n }\n get open() {\n return this.hasAttribute('open');\n }\n set open(value) {\n if (value) {\n this.setAttribute('open', '');\n }\n else {\n this.removeAttribute('open');\n }\n }\n static get observedAttributes() {\n return ['open', 'value'];\n }\n attributeChangedCallback(name, oldValue, newValue) {\n if (oldValue === newValue)\n return;\n const autocomplete = state.get(this);\n if (!autocomplete)\n return;\n switch (name) {\n case 'open':\n newValue === null ? autocomplete.close() : autocomplete.open();\n break;\n case 'value':\n if (newValue !== null) {\n autocomplete.input.value = newValue;\n }\n this.dispatchEvent(new AutocompleteEvent('auto-complete-change', {\n bubbles: true,\n relatedTarget: autocomplete.input\n }));\n break;\n }\n }\n}\n\nif (!window.customElements.get('auto-complete')) {\n window.AutocompleteElement = AutocompleteElement;\n window.customElements.define('auto-complete', AutocompleteElement);\n}\n\nexport default AutocompleteElement;\nexport { AutocompleteEvent };\n","function createNode(text) {\n const node = document.createElement('pre');\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.position = 'fixed';\n node.style.top = '5px';\n node.textContent = text;\n return node;\n}\n\nfunction copyNode(node) {\n if ('clipboard' in navigator) {\n // eslint-disable-next-line flowtype/no-flow-fix-me-comments\n // $FlowFixMe Clipboard is not defined in Flow yet.\n return navigator.clipboard.writeText(node.textContent);\n }\n\n const selection = getSelection();\n\n if (selection == null) {\n return Promise.reject(new Error());\n }\n\n selection.removeAllRanges();\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.addRange(range);\n document.execCommand('copy');\n selection.removeAllRanges();\n return Promise.resolve();\n}\nfunction copyText(text) {\n if ('clipboard' in navigator) {\n // eslint-disable-next-line flowtype/no-flow-fix-me-comments\n // $FlowFixMe Clipboard is not defined in Flow yet.\n return navigator.clipboard.writeText(text);\n }\n\n const body = document.body;\n\n if (!body) {\n return Promise.reject(new Error());\n }\n\n const node = createNode(text);\n body.appendChild(node);\n copyNode(node);\n body.removeChild(node);\n return Promise.resolve();\n}\n\nfunction copy(button) {\n const id = button.getAttribute('for');\n const text = button.getAttribute('value');\n\n function trigger() {\n button.dispatchEvent(new CustomEvent('clipboard-copy', {\n bubbles: true\n }));\n }\n\n if (text) {\n copyText(text).then(trigger);\n } else if (id) {\n const root = 'getRootNode' in Element.prototype ? button.getRootNode() : button.ownerDocument;\n if (!(root instanceof Document || 'ShadowRoot' in window && root instanceof ShadowRoot)) return;\n const node = root.getElementById(id);\n if (node) copyTarget(node).then(trigger);\n }\n}\n\nfunction copyTarget(content) {\n if (content instanceof HTMLInputElement || content instanceof HTMLTextAreaElement) {\n return copyText(content.value);\n } else if (content instanceof HTMLAnchorElement && content.hasAttribute('href')) {\n return copyText(content.href);\n } else {\n return copyNode(content);\n }\n}\n\nfunction clicked(event) {\n const button = event.currentTarget;\n\n if (button instanceof HTMLElement) {\n copy(button);\n }\n}\n\nfunction keydown(event) {\n if (event.key === ' ' || event.key === 'Enter') {\n const button = event.currentTarget;\n\n if (button instanceof HTMLElement) {\n event.preventDefault();\n copy(button);\n }\n }\n}\n\nfunction focused(event) {\n event.currentTarget.addEventListener('keydown', keydown);\n}\n\nfunction blurred(event) {\n event.currentTarget.removeEventListener('keydown', keydown);\n}\n\nclass ClipboardCopyElement extends HTMLElement {\n constructor() {\n super();\n this.addEventListener('click', clicked);\n this.addEventListener('focus', focused);\n this.addEventListener('blur', blurred);\n }\n\n connectedCallback() {\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'button');\n }\n }\n\n get value() {\n return this.getAttribute('value') || '';\n }\n\n set value(text) {\n this.setAttribute('value', text);\n }\n\n}\n\nif (!window.customElements.get('clipboard-copy')) {\n window.ClipboardCopyElement = ClipboardCopyElement;\n window.customElements.define('clipboard-copy', ClipboardCopyElement);\n}\n\nexport default ClipboardCopyElement;\n","import '@github/clipboard-copy-element';\nfunction toggleSVG(svg) {\n if (svg.style.display === '' || svg.style.display === 'block') {\n svg.style.display = 'none';\n }\n else {\n svg.style.display = 'block';\n }\n}\n// Toggle a copy button.\nfunction toggleCopyButton(button) {\n const [clippyIcon, checkIcon] = button.querySelectorAll('.octicon');\n if (!clippyIcon || !checkIcon)\n return;\n toggleSVG(clippyIcon);\n toggleSVG(checkIcon);\n}\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","const startPositions = new WeakMap();\nconst dragStartPositions = new WeakMap();\nconst constructedElements = new WeakMap();\nfunction moveCropArea(event) {\n const el = event.currentTarget;\n if (!(el instanceof ImageCropElement))\n return;\n const { box, image } = constructedElements.get(el) || {};\n if (!box || !image)\n return;\n let deltaX = 0;\n let deltaY = 0;\n if (event instanceof KeyboardEvent) {\n if (event.key === 'ArrowUp') {\n deltaY = -1;\n }\n else if (event.key === 'ArrowDown') {\n deltaY = 1;\n }\n else if (event.key === 'ArrowLeft') {\n deltaX = -1;\n }\n else if (event.key === 'ArrowRight') {\n deltaX = 1;\n }\n }\n else if (dragStartPositions.has(el) && event instanceof MouseEvent) {\n const pos = dragStartPositions.get(el);\n deltaX = event.pageX - pos.dragStartX;\n deltaY = event.pageY - pos.dragStartY;\n }\n else if (dragStartPositions.has(el) && event instanceof TouchEvent) {\n const { pageX, pageY } = event.changedTouches[0];\n const { dragStartX, dragStartY } = dragStartPositions.get(el);\n deltaX = pageX - dragStartX;\n deltaY = pageY - dragStartY;\n }\n if (deltaX !== 0 || deltaY !== 0) {\n const x = Math.min(Math.max(0, box.offsetLeft + deltaX), image.width - box.offsetWidth);\n const y = Math.min(Math.max(0, box.offsetTop + deltaY), image.height - box.offsetHeight);\n box.style.left = `${x}px`;\n box.style.top = `${y}px`;\n fireChangeEvent(el, { x, y, width: box.offsetWidth, height: box.offsetHeight });\n }\n if (event instanceof MouseEvent) {\n dragStartPositions.set(el, {\n dragStartX: event.pageX,\n dragStartY: event.pageY\n });\n }\n else if (event instanceof TouchEvent) {\n const { pageX, pageY } = event.changedTouches[0];\n dragStartPositions.set(el, {\n dragStartX: pageX,\n dragStartY: pageY\n });\n }\n}\nfunction updateCropArea(event) {\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n const el = getShadowHost(target);\n if (!(el instanceof ImageCropElement))\n return;\n const { box } = constructedElements.get(el) || {};\n if (!box)\n return;\n const rect = el.getBoundingClientRect();\n let deltaX, deltaY, delta;\n if (event instanceof KeyboardEvent) {\n if (event.key === 'Escape')\n return setInitialPosition(el);\n if (event.key === '-')\n delta = -10;\n if (event.key === '=')\n delta = +10;\n if (!delta)\n return;\n deltaX = box.offsetWidth + delta;\n deltaY = box.offsetHeight + delta;\n startPositions.set(el, { startX: box.offsetLeft, startY: box.offsetTop });\n }\n else if (event instanceof MouseEvent) {\n const pos = startPositions.get(el);\n if (!pos)\n return;\n deltaX = event.pageX - pos.startX - rect.left - window.pageXOffset;\n deltaY = event.pageY - pos.startY - rect.top - window.pageYOffset;\n }\n else if (event instanceof TouchEvent) {\n const pos = startPositions.get(el);\n if (!pos)\n return;\n deltaX = event.changedTouches[0].pageX - pos.startX - rect.left - window.pageXOffset;\n deltaY = event.changedTouches[0].pageY - pos.startY - rect.top - window.pageYOffset;\n }\n if (deltaX && deltaY)\n updateDimensions(el, deltaX, deltaY, !(event instanceof KeyboardEvent));\n}\nfunction getShadowHost(el) {\n const rootNode = el.getRootNode();\n if (!(rootNode instanceof ShadowRoot))\n return el;\n return rootNode.host;\n}\nfunction startUpdate(event) {\n const currentTarget = event.currentTarget;\n if (!(currentTarget instanceof HTMLElement))\n return;\n const el = getShadowHost(currentTarget);\n if (!(el instanceof ImageCropElement))\n return;\n const { box } = constructedElements.get(el) || {};\n if (!box)\n return;\n const target = event.target;\n if (!(target instanceof HTMLElement))\n return;\n if (target.hasAttribute('data-direction')) {\n const direction = target.getAttribute('data-direction') || '';\n el.addEventListener('mousemove', updateCropArea);\n el.addEventListener('touchmove', updateCropArea, { passive: true });\n if (['nw', 'se'].indexOf(direction) >= 0)\n el.classList.add('nwse');\n if (['ne', 'sw'].indexOf(direction) >= 0)\n el.classList.add('nesw');\n startPositions.set(el, {\n startX: box.offsetLeft + (['se', 'ne'].indexOf(direction) >= 0 ? 0 : box.offsetWidth),\n startY: box.offsetTop + (['se', 'sw'].indexOf(direction) >= 0 ? 0 : box.offsetHeight)\n });\n updateCropArea(event);\n }\n else {\n el.addEventListener('mousemove', moveCropArea);\n el.addEventListener('touchmove', moveCropArea, { passive: true });\n }\n}\nfunction updateDimensions(target, deltaX, deltaY, reposition = true) {\n let newSide = Math.max(Math.abs(deltaX), Math.abs(deltaY), 10);\n const pos = startPositions.get(target);\n if (!pos)\n return;\n const { box, image } = constructedElements.get(target) || {};\n if (!box || !image)\n return;\n newSide = Math.min(newSide, deltaY > 0 ? image.height - pos.startY : pos.startY, deltaX > 0 ? image.width - pos.startX : pos.startX);\n const x = reposition ? Math.round(Math.max(0, deltaX > 0 ? pos.startX : pos.startX - newSide)) : box.offsetLeft;\n const y = reposition ? Math.round(Math.max(0, deltaY > 0 ? pos.startY : pos.startY - newSide)) : box.offsetTop;\n box.style.left = `${x}px`;\n box.style.top = `${y}px`;\n box.style.width = `${newSide}px`;\n box.style.height = `${newSide}px`;\n fireChangeEvent(target, { x, y, width: newSide, height: newSide });\n}\nfunction setInitialPosition(el) {\n const { image } = constructedElements.get(el) || {};\n if (!image)\n return;\n const side = Math.round(image.clientWidth > image.clientHeight ? image.clientHeight : image.clientWidth);\n startPositions.set(el, {\n startX: (image.clientWidth - side) / 2,\n startY: (image.clientHeight - side) / 2\n });\n updateDimensions(el, side, side);\n}\nfunction stopUpdate(event) {\n const el = event.currentTarget;\n if (!(el instanceof ImageCropElement))\n return;\n dragStartPositions.delete(el);\n el.classList.remove('nwse', 'nesw');\n el.removeEventListener('mousemove', updateCropArea);\n el.removeEventListener('mousemove', moveCropArea);\n el.removeEventListener('touchmove', updateCropArea);\n el.removeEventListener('touchmove', moveCropArea);\n}\nfunction fireChangeEvent(target, result) {\n const { image } = constructedElements.get(target) || {};\n if (!image)\n return;\n const ratio = image.naturalWidth / image.width;\n for (const key in result) {\n const value = Math.round(result[key] * ratio);\n result[key] = value;\n const slottedInput = target.querySelector(`[data-image-crop-input='${key}']`);\n if (slottedInput instanceof HTMLInputElement)\n slottedInput.value = value.toString();\n }\n target.dispatchEvent(new CustomEvent('image-crop-change', { bubbles: true, detail: result }));\n}\nclass ImageCropElement extends HTMLElement {\n connectedCallback() {\n if (constructedElements.has(this))\n return;\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.innerHTML = `\n<style>\n :host { touch-action: none; display: block; }\n :host(.nesw) { cursor: nesw-resize; }\n :host(.nwse) { cursor: nwse-resize; }\n :host(.nesw) .crop-box, :host(.nwse) .crop-box { cursor: inherit; }\n :host([loaded]) .crop-image { display: block; }\n :host([loaded]) ::slotted([data-loading-slot]), .crop-image { display: none; }\n\n .crop-wrapper {\n position: relative;\n font-size: 0;\n }\n .crop-container {\n user-select: none;\n -ms-user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n overflow: hidden;\n z-index: 1;\n top: 0;\n width: 100%;\n height: 100%;\n }\n\n :host([rounded]) .crop-box {\n border-radius: 50%;\n box-shadow: 0 0 0 4000px rgba(0, 0, 0, 0.3);\n }\n .crop-box {\n position: absolute;\n border: 1px dashed #fff;\n box-sizing: border-box;\n cursor: move;\n }\n\n :host([rounded]) .crop-outline {\n outline: none;\n }\n .crop-outline {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n outline: 4000px solid rgba(0, 0, 0, .3);\n }\n\n .handle { position: absolute; }\n :host([rounded]) .handle::before { border-radius: 50%; }\n .handle:before {\n position: absolute;\n display: block;\n padding: 4px;\n transform: translate(-50%, -50%);\n content: ' ';\n background: #fff;\n border: 1px solid #767676;\n }\n .ne { top: 0; right: 0; cursor: nesw-resize; }\n .nw { top: 0; left: 0; cursor: nwse-resize; }\n .se { bottom: 0; right: 0; cursor: nwse-resize; }\n .sw { bottom: 0; left: 0; cursor: nesw-resize; }\n</style>\n<slot></slot>\n<div class=\"crop-wrapper\">\n <img width=\"100%\" class=\"crop-image\" alt=\"\">\n <div class=\"crop-container\">\n <div data-crop-box class=\"crop-box\">\n <div class=\"crop-outline\"></div>\n <div data-direction=\"nw\" class=\"handle nw\"></div>\n <div data-direction=\"ne\" class=\"handle ne\"></div>\n <div data-direction=\"sw\" class=\"handle sw\"></div>\n <div data-direction=\"se\" class=\"handle se\"></div>\n </div>\n </div>\n</div>\n`;\n const box = shadowRoot.querySelector('[data-crop-box]');\n if (!(box instanceof HTMLElement))\n return;\n const image = shadowRoot.querySelector('img');\n if (!(image instanceof HTMLImageElement))\n return;\n constructedElements.set(this, { box, image });\n image.addEventListener('load', () => {\n this.loaded = true;\n setInitialPosition(this);\n });\n this.addEventListener('mouseleave', stopUpdate);\n this.addEventListener('touchend', stopUpdate);\n this.addEventListener('mouseup', stopUpdate);\n box.addEventListener('mousedown', startUpdate);\n box.addEventListener('touchstart', startUpdate, { passive: true });\n this.addEventListener('keydown', moveCropArea);\n this.addEventListener('keydown', updateCropArea);\n if (this.src)\n image.src = this.src;\n }\n static get observedAttributes() {\n return ['src'];\n }\n get src() {\n return this.getAttribute('src');\n }\n set src(val) {\n if (val) {\n this.setAttribute('src', val);\n }\n else {\n this.removeAttribute('src');\n }\n }\n get loaded() {\n return this.hasAttribute('loaded');\n }\n set loaded(val) {\n if (val) {\n this.setAttribute('loaded', '');\n }\n else {\n this.removeAttribute('loaded');\n }\n }\n attributeChangedCallback(attribute, oldValue, newValue) {\n const { image } = constructedElements.get(this) || {};\n if (attribute === 'src') {\n this.loaded = false;\n if (image)\n image.src = newValue;\n }\n }\n}\nexport default ImageCropElement;\nif (!window.customElements.get('image-crop')) {\n window.ImageCropElement = ImageCropElement;\n window.customElements.define('image-crop', ImageCropElement);\n}\n"],"names":["ctrlBindings","navigator","userAgent","match","Combobox","[object Object]","input","list","this","isComposing","id","Math","random","toString","slice","keyboardEventHandler","event","combobox","shiftKey","metaKey","altKey","ctrlKey","key","target","querySelector","getAttribute","click","commit","preventDefault","clearSelection","navigate","keyboardBindings","compositionEventHandler","type","document","getElementById","trackComposition","inputHandler","bind","setAttribute","stop","removeAttribute","addEventListener","commitWithElement","removeEventListener","indexDiff","focusEl","Array","from","querySelectorAll","filter","visible","els","focusIndex","indexOf","length","focus","indexOfItem","newIndex","el","scrollTo","Element","closest","dispatchEvent","CustomEvent","bubbles","fireCommitEvent","hidden","HTMLInputElement","offsetWidth","offsetHeight","container","element","scrollTop","containerBottom","clientHeight","top","offsetTop","bottom","inViewport","AutocompleteEvent","init","super","relatedTarget","requests","WeakMap","fragment","url","xhr","XMLHttpRequest","open","setRequestHeader","pending","get","abort","set","clear","delete","result","Promise","resolve","reject","onload","status","responseText","Error","onerror","send","then","request","Autocomplete","results","interactingWithList","onInputChange","callback","wait","timeout","Rest","clearTimeout","window","setTimeout","debounce","onResultsMouseDown","onInputBlur","onInputFocus","onKeydown","onCommit","stopPropagation","value","trim","fetchResults","selected","HTMLElement","HTMLAnchorElement","textContent","query","src","URL","location","href","params","URLSearchParams","search","append","html","innerHTML","identifyOptions","hasResults","catch","start","state","AutocompleteElement","listId","autocomplete","destroy","hasAttribute","observedAttributes","name","oldValue","newValue","close","copyNode","node","clipboard","writeText","selection","getSelection","removeAllRanges","range","createRange","selectNodeContents","addRange","execCommand","copyText","text","body","createElement","style","width","height","position","createNode","appendChild","removeChild","copy","button","trigger","root","prototype","getRootNode","ownerDocument","Document","ShadowRoot","content","HTMLTextAreaElement","clicked","currentTarget","keydown","focused","blurred","customElements","define","ClipboardCopyElement","toggleSVG","svg","display","toggleCopyButton","clippyIcon","checkIcon","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","startPositions","dragStartPositions","constructedElements","moveCropArea","ImageCropElement","box","image","deltaX","deltaY","KeyboardEvent","has","MouseEvent","pos","pageX","dragStartX","pageY","dragStartY","TouchEvent","changedTouches","x","max","offsetLeft","y","left","fireChangeEvent","updateCropArea","getShadowHost","rect","getBoundingClientRect","delta","setInitialPosition","startX","startY","pageXOffset","pageYOffset","updateDimensions","rootNode","host","startUpdate","direction","passive","classList","add","reposition","newSide","abs","side","clientWidth","stopUpdate","remove","ratio","naturalWidth","slottedInput","shadowRoot","attachShadow","mode","HTMLImageElement","loaded","val","attribute"],"mappings":"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"}
|
@@ -8,6 +8,8 @@ module Primer
|
|
8
8
|
ALIGN_DEFAULT = :left
|
9
9
|
ALIGN_OPTIONS = [ALIGN_DEFAULT, :right].freeze
|
10
10
|
|
11
|
+
DEFAULT_TAG = :div
|
12
|
+
TAG_OPTIONS = [DEFAULT_TAG, :span].freeze
|
11
13
|
# Required list of stacked avatars.
|
12
14
|
#
|
13
15
|
# @param kwargs [Hash] The same arguments as <%= link_to_component(Primer::AvatarComponent) %>.
|
@@ -34,11 +36,12 @@ module Primer
|
|
34
36
|
# <%= c.avatar(src: "http://placekitten.com/200/200", alt: "@kittenuser") %>
|
35
37
|
# <% end %>
|
36
38
|
#
|
39
|
+
# @param tag [Symbol] <%= one_of(Primer::AvatarStackComponent::TAG_OPTIONS) %>
|
37
40
|
# @param align [Symbol] <%= one_of(Primer::AvatarStackComponent::ALIGN_OPTIONS) %>
|
38
41
|
# @param tooltipped [Boolean] Whether to add a tooltip to the stack or not.
|
39
42
|
# @param body_arguments [Hash] Parameters to add to the Body. If `tooltipped` is set, has the same arguments as <%= link_to_component(Primer::TooltipComponent) %>.
|
40
43
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
41
|
-
def initialize(align: ALIGN_DEFAULT, tooltipped: false, body_arguments: {}, **system_arguments)
|
44
|
+
def initialize(tag: DEFAULT_TAG, align: ALIGN_DEFAULT, tooltipped: false, body_arguments: {}, **system_arguments)
|
42
45
|
@align = fetch_or_fallback(ALIGN_OPTIONS, align, ALIGN_DEFAULT)
|
43
46
|
@system_arguments = system_arguments
|
44
47
|
@tooltipped = tooltipped
|
@@ -50,7 +53,7 @@ module Primer
|
|
50
53
|
@body_arguments[:classes]
|
51
54
|
)
|
52
55
|
|
53
|
-
@system_arguments[:tag]
|
56
|
+
@system_arguments[:tag] = fetch_or_fallback(TAG_OPTIONS, tag, DEFAULT_TAG)
|
54
57
|
@system_arguments[:classes] = class_names(
|
55
58
|
"AvatarStack",
|
56
59
|
system_arguments[:classes],
|
@@ -77,7 +77,7 @@ module Primer
|
|
77
77
|
# | `flex_shrink` | Integer | To enable, set to `0`. |
|
78
78
|
# | `flex_wrap` | Symbol | <%= one_of(Primer::Classify::Flex::WRAP_MAPPINGS.keys) %> |
|
79
79
|
# | `justify_content` | Symbol | <%= one_of(Primer::Classify::Flex::JUSTIFY_CONTENT_VALUES) %> |
|
80
|
-
# | `width` | Symbol | <%= one_of([:fit
|
80
|
+
# | `width` | Symbol | <%= one_of([:fit]) %> |
|
81
81
|
#
|
82
82
|
# ## Grid
|
83
83
|
#
|
@@ -90,7 +90,7 @@ module Primer
|
|
90
90
|
# | Name | Type | Description |
|
91
91
|
# | :- | :- | :- |
|
92
92
|
# | `display` | Symbol | <%= one_of([:none, :block, :flex, :inline, :inline_block, :inline_flex, :table, :table_cell]) %> |
|
93
|
-
# | `height` | Symbol | <%= one_of([:fit
|
93
|
+
# | `height` | Symbol | <%= one_of([:fit]) %> |
|
94
94
|
# | `hide` | Symbol | Hide the element at a specific breakpoint. <%= one_of([:sm, :md, :lg, :xl]) %> |
|
95
95
|
# | `v` | Symbol | Visibility. <%= one_of([:hidden, :visible]) %> |
|
96
96
|
# | `vertical_align` | Symbol | <%= one_of([:baseline, :top, :middle, :bottom, :text_top, :text_bottom]) %> |
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module Primer
|
4
4
|
# Use `Blankslate` when there is a lack of content within a page or section. Use as placeholder to tell users why something isn't there.
|
5
5
|
# @accessibility
|
6
|
-
# `
|
7
|
-
#
|
6
|
+
# `Blankslate` renders an `<h3>` element for the title by default. Update the heading level based on what is appropriate for your page hierarchy by setting `title_tag`.
|
7
|
+
# <%= link_to_heading_practices %>
|
8
8
|
class BlankslateComponent < Primer::Component
|
9
9
|
status :beta
|
10
10
|
|
@@ -111,7 +111,7 @@ module Primer
|
|
111
111
|
**system_arguments
|
112
112
|
)
|
113
113
|
@system_arguments = system_arguments
|
114
|
-
@system_arguments[:tag]
|
114
|
+
@system_arguments[:tag] = :div
|
115
115
|
@system_arguments[:classes] = class_names(
|
116
116
|
@system_arguments[:classes],
|
117
117
|
"blankslate",
|
@@ -46,7 +46,7 @@ module Primer
|
|
46
46
|
def initialize(variant: Primer::ButtonComponent::DEFAULT_VARIANT, **system_arguments)
|
47
47
|
@variant = variant
|
48
48
|
@system_arguments = system_arguments
|
49
|
-
@system_arguments[:tag]
|
49
|
+
@system_arguments[:tag] = :div
|
50
50
|
|
51
51
|
@system_arguments[:classes] = class_names(
|
52
52
|
"BtnGroup",
|
@@ -25,6 +25,11 @@ module Primer
|
|
25
25
|
ActiveSupport::Deprecation.warn(message)
|
26
26
|
end
|
27
27
|
|
28
|
+
def validate_aria_label
|
29
|
+
aria_label = @system_arguments[:"aria-label"] || @system_arguments.dig(:aria, :label)
|
30
|
+
raise ArgumentError, "`aria-label` is required." if aria_label.nil? && !Rails.env.production?
|
31
|
+
end
|
32
|
+
|
28
33
|
def silence_deprecations?
|
29
34
|
Rails.application.config.primer_view_components.silence_deprecations
|
30
35
|
end
|
@@ -1,7 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Primer
|
4
|
-
# Use `
|
4
|
+
# Use `Counter` to add a count to navigational elements and buttons.
|
5
|
+
#
|
6
|
+
# @accessibility
|
7
|
+
# Always use `Counter` with adjacent text that provides supplementary information regarding what the count is for. For instance, `Counter`
|
8
|
+
# should be accompanied with text such as `issues` or `pull requests`.
|
9
|
+
#
|
5
10
|
class CounterComponent < Primer::Component
|
6
11
|
status :beta
|
7
12
|
|
@@ -5,7 +5,32 @@ module Primer
|
|
5
5
|
# Before using these utilities, you should be familiar with CSS3 Flexible Box
|
6
6
|
# spec. If you are not, check out MDN's guide [Using CSS Flexible
|
7
7
|
# Boxes](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox).
|
8
|
+
#
|
9
|
+
# @deprecated
|
10
|
+
# Use <%= link_to_component(Primer::BoxComponent) %> instead.
|
11
|
+
#
|
12
|
+
# **Before**:
|
13
|
+
#
|
14
|
+
# ```erb
|
15
|
+
# <%%= render Primer::FlexComponent.new(justify_content: :center) %>
|
16
|
+
# <%%= render Primer::FlexComponent.new(inline: true) %>
|
17
|
+
# <%%= render Primer::FlexComponent.new(flex_wrap: true) %>
|
18
|
+
# <%%= render Primer::FlexComponent.new(align_items: :start) %>
|
19
|
+
# <%%= render Primer::FlexComponent.new(direction: :column) %>
|
20
|
+
# ```
|
21
|
+
#
|
22
|
+
# **After**:
|
23
|
+
#
|
24
|
+
# ```erb
|
25
|
+
# <%%= render Primer::BoxComponent.new(display: :flex, justify_content: :center) %>
|
26
|
+
# <%%= render Primer::BoxComponent.new(display: :inline_flex) %>
|
27
|
+
# <%%= render Primer::BoxComponent.new(display: :flex, flex_wrap: :wrap) %>
|
28
|
+
# <%%= render Primer::BoxComponent.new(display: :flex, align_items: :start) %>
|
29
|
+
# <%%= render Primer::BoxComponent.new(display: :flex, direction: :column) %>
|
30
|
+
# ```
|
8
31
|
class FlexComponent < Primer::Component
|
32
|
+
status :deprecated
|
33
|
+
|
9
34
|
JUSTIFY_CONTENT_DEFAULT = nil
|
10
35
|
JUSTIFY_CONTENT_MAPPINGS = {
|
11
36
|
flex_start: "flex-justify-start",
|
@@ -77,6 +102,8 @@ module Primer
|
|
77
102
|
direction: nil,
|
78
103
|
**system_arguments
|
79
104
|
)
|
105
|
+
deprecated_component_warning(new_class: Primer::BoxComponent, version: "0.0.40")
|
106
|
+
|
80
107
|
@align_items = fetch_or_fallback(ALIGN_ITEMS_OPTIONS, align_items, ALIGN_ITEMS_DEFAULT)
|
81
108
|
@justify_content = fetch_or_fallback(JUSTIFY_CONTENT_OPTIONS, justify_content, JUSTIFY_CONTENT_DEFAULT)
|
82
109
|
@flex_wrap = fetch_or_fallback(FLEX_WRAP_OPTIONS, flex_wrap, FLEX_WRAP_DEFAULT)
|
@@ -38,7 +38,7 @@ module Primer
|
|
38
38
|
# @param flex_auto [Boolean] Fills available space and auto-sizes based on the content. Defaults to <%= Primer::FlexItemComponent::FLEX_AUTO_DEFAULT %>
|
39
39
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
40
40
|
def initialize(flex_auto: FLEX_AUTO_DEFAULT, **system_arguments)
|
41
|
-
deprecated_component_warning(new_class: Primer::BoxComponent, version: "0.0.
|
41
|
+
deprecated_component_warning(new_class: Primer::BoxComponent, version: "0.0.40")
|
42
42
|
|
43
43
|
@system_arguments = system_arguments
|
44
44
|
@system_arguments[:classes] =
|
@@ -1,20 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Primer
|
4
|
-
# `Heading`
|
4
|
+
# `Heading` should be used to communicate page organization and hierarchy.
|
5
5
|
#
|
6
|
-
# - Set tag to one of `:h1`, `:h2`, `:h3`, `:h4`, `:h5`, `:h6` based on what is
|
7
|
-
# appropriate for the page context.
|
6
|
+
# - Set tag to one of `:h1`, `:h2`, `:h3`, `:h4`, `:h5`, `:h6` based on what is appropriate for the page context.
|
8
7
|
# - Use `Heading` as the title of a section or sub section.
|
9
|
-
# - Do not use `Heading` for styling alone.
|
10
|
-
#
|
11
|
-
# - Do not jump heading levels. For instance, do not follow a `<h1>` with an `<h3>`. Heading levels should
|
12
|
-
# increase by one in ascending order.
|
8
|
+
# - Do not use `Heading` for styling alone. For simply styling text, consider using <%= link_to_component(Primer::TextComponent) %> with relevant <%= link_to_typography_docs %>
|
9
|
+
# such as `font_size` and `font_weight`.
|
10
|
+
# - Do not jump heading levels. For instance, do not follow a `<h1>` with an `<h3>`. Heading levels should increase by one in ascending order.
|
13
11
|
#
|
14
12
|
# @accessibility
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# [
|
13
|
+
# While sighted users rely on visual cues such as font size changes to determine what the heading is, assistive technology users rely on programatic cues that can be read out.
|
14
|
+
# When text on a page is visually implied to be a heading, ensure that it is coded as a heading. Additionally, visually implied heading level and coded heading level should be
|
15
|
+
# consistent. [See WCAG success criteria: 1.3.1: Info and Relationships](https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships.html)
|
16
|
+
#
|
17
|
+
# Headings allow assistive technology users to quickly navigate around a page. Navigation to text that is not meant to be a heading can be a confusing experience.
|
18
|
+
# <%= link_to_heading_practices %>
|
18
19
|
class HeadingComponent < Primer::Component
|
19
20
|
status :beta
|
20
21
|
|
@@ -29,14 +30,6 @@ module Primer
|
|
29
30
|
# <%= render(Primer::HeadingComponent.new(tag: :h5)) { "H5 Text" } %>
|
30
31
|
# <%= render(Primer::HeadingComponent.new(tag: :h6)) { "H6 Text" } %>
|
31
32
|
#
|
32
|
-
# @example With `font_size`
|
33
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h1, font_size: 6)) { "h1 tag, font_size 6" } %>
|
34
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h2, font_size: 3)) { "h2 tag, font_size 3" } %>
|
35
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h3, font_size: 2)) { "h3 tag, font_size 2" } %>
|
36
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h4, font_size: 0)) { "h4 tag, font_size 0" } %>
|
37
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h5, font_size: 1)) { "h5 tag, font_size 1" } %>
|
38
|
-
# <%= render(Primer::HeadingComponent.new(tag: :h6, font_size: 4)) { "h6 tag, font_size 4" } %>
|
39
|
-
#
|
40
33
|
# @param tag [String] <%= one_of(Primer::HeadingComponent::TAG_OPTIONS) %>
|
41
34
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
42
35
|
def initialize(tag:, **system_arguments)
|
@@ -34,7 +34,7 @@ module Primer
|
|
34
34
|
|
35
35
|
def call
|
36
36
|
render(Primer::BaseComponent.new(**@system_arguments)) do
|
37
|
-
render(Primer::BaseButton.new(**@button_arguments)) { "…" }
|
37
|
+
render(Primer::BaseButton.new(**@button_arguments)) { "…".html_safe }
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
@@ -5,7 +5,13 @@ module Primer
|
|
5
5
|
#
|
6
6
|
# @accessibility
|
7
7
|
# `IconButton` requires an `aria-label`, which will provide assistive technologies with an accessible label.
|
8
|
+
# The `aria-label` should describe the action to be invoked rather than the icon itself. For instance,
|
9
|
+
# if your `IconButton` renders a magnifying glass icon and invokves a search action, the `aria-label` should be
|
10
|
+
# `"Search"` instead of `"Magnifying glass"`.
|
11
|
+
# [Learn more about best functional image practices (WAI Images)](https://www.w3.org/WAI/tutorials/images/functional)
|
8
12
|
class IconButton < Primer::Component
|
13
|
+
status :beta
|
14
|
+
|
9
15
|
DEFAULT_SCHEME = :default
|
10
16
|
SCHEME_MAPPINGS = {
|
11
17
|
DEFAULT_SCHEME => "",
|
@@ -21,22 +27,33 @@ module Primer
|
|
21
27
|
# <%= render(Primer::IconButton.new(icon: :search, "aria-label": "Search")) %>
|
22
28
|
# <%= render(Primer::IconButton.new(icon: :trash, "aria-label": "Delete", scheme: :danger)) %>
|
23
29
|
#
|
30
|
+
# @example In a BorderBox
|
31
|
+
#
|
32
|
+
# <%= render(Primer::BorderBoxComponent.new) do |component| %>
|
33
|
+
# <% component.body do %>
|
34
|
+
# <%= render(Primer::TextComponent.new(pr: 2)) { "Body" } %>
|
35
|
+
# <%= render(Primer::IconButton.new(icon: :pencil, box: true, "aria-label": "Edit")) %>
|
36
|
+
# <% end %>
|
37
|
+
# <% end %>
|
38
|
+
#
|
24
39
|
# @param scheme [Symbol] <%= one_of(Primer::IconButton::SCHEME_OPTIONS) %>
|
25
40
|
# @param icon [String] Name of <%= link_to_octicons %> to use.
|
26
41
|
# @param tag [Symbol] <%= one_of(Primer::BaseButton::TAG_OPTIONS) %>
|
27
42
|
# @param type [Symbol] <%= one_of(Primer::BaseButton::TYPE_OPTIONS) %>
|
43
|
+
# @param box [Boolean] Whether the button is in a <%= link_to_component(Primer::BorderBoxComponent) %>. If `true`, the button will have the `Box-btn-octicon` class.
|
28
44
|
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
29
|
-
def initialize(scheme: DEFAULT_SCHEME, icon:, **system_arguments)
|
45
|
+
def initialize(scheme: DEFAULT_SCHEME, icon:, box: false, **system_arguments)
|
30
46
|
@icon = icon
|
31
47
|
|
32
48
|
@system_arguments = system_arguments
|
33
49
|
@system_arguments[:classes] = class_names(
|
34
50
|
"btn-octicon",
|
35
51
|
SCHEME_MAPPINGS[fetch_or_fallback(SCHEME_OPTIONS, scheme, DEFAULT_SCHEME)],
|
36
|
-
system_arguments[:classes]
|
52
|
+
system_arguments[:classes],
|
53
|
+
"Box-btn-octicon" => box
|
37
54
|
)
|
38
55
|
|
39
|
-
|
56
|
+
validate_aria_label
|
40
57
|
end
|
41
58
|
|
42
59
|
def call
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/image-crop-element';
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= render Primer::BaseComponent.new(**@system_arguments) do %>
|
2
|
+
<% if loading.present? %>
|
3
|
+
<%= loading %>
|
4
|
+
<% else %>
|
5
|
+
<%= render(Primer::SpinnerComponent.new(size: :large, flex: 1, "data-loading-slot": true)) %>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<input type="hidden" data-image-crop-input="x" name="cropped_x">
|
9
|
+
<input type="hidden" data-image-crop-input="y" name="cropped_y">
|
10
|
+
<input type="hidden" data-image-crop-input="width" name="cropped_width">
|
11
|
+
<input type="hidden" data-image-crop-input="height" name="cropped_height">
|
12
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/image-crop-element';
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Primer
|
4
|
+
# A client-side mechanism to crop images.
|
5
|
+
class ImageCrop < Primer::Component
|
6
|
+
# A loading indicator that is shown while the image is loading.
|
7
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
8
|
+
renders_one :loading, lambda { |**system_arguments|
|
9
|
+
system_arguments[:tag] ||= :div
|
10
|
+
system_arguments[:"data-loading-slot"] = true
|
11
|
+
|
12
|
+
Primer::BaseComponent.new(**system_arguments)
|
13
|
+
}
|
14
|
+
|
15
|
+
# @example Simple cropper
|
16
|
+
# <%= render(Primer::ImageCrop.new(src: "https://github.com/koddsson.png")) %>
|
17
|
+
#
|
18
|
+
# @example Square cropper
|
19
|
+
# <%= render(Primer::ImageCrop.new(src: "https://github.com/koddsson.png", rounded: false)) %>
|
20
|
+
#
|
21
|
+
# @example Cropper with a custom loader
|
22
|
+
# <%= render(Primer::ImageCrop.new(src: "https://github.com/koddsson.png", rounded: false)) do |cropper| %>
|
23
|
+
# <% cropper.loading(style: "width: 120px", tag: :img, src: "spinner.gif") %>
|
24
|
+
# <% end %>
|
25
|
+
#
|
26
|
+
# @param src [String] The path of the image to crop.
|
27
|
+
# @param rounded [Boolean] If the crop mask should be a circle. Defaults to true.
|
28
|
+
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
|
29
|
+
def initialize(src:, rounded: true, **system_arguments)
|
30
|
+
@system_arguments = system_arguments
|
31
|
+
@system_arguments[:tag] = "image-crop"
|
32
|
+
@system_arguments[:src] = src
|
33
|
+
@system_arguments[:rounded] = rounded
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
import '@github/image-crop-element'
|
@@ -2,9 +2,10 @@
|
|
2
2
|
|
3
3
|
module Primer
|
4
4
|
# Use `Markdown` to wrap markdown content
|
5
|
-
class
|
5
|
+
class Markdown < Primer::Component
|
6
|
+
status :beta
|
6
7
|
# @example Default
|
7
|
-
# <%= render(Primer::
|
8
|
+
# <%= render(Primer::Markdown.new) do %>
|
8
9
|
# <p>Text can be <b>bold</b>, <i>italic</i>, or <s>strikethrough</s>. <a href="https://github.com">Links </a> should be blue with no underlines (unless hovered over).</p>
|
9
10
|
#
|
10
11
|
# <p>There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs. There should be whitespace between paragraphs.</p>
|
@@ -235,11 +236,11 @@ module Primer
|
|
235
236
|
#
|
236
237
|
# <p>Code can also use syntax highlighting.</p>
|
237
238
|
#
|
238
|
-
# <pre><code
|
239
|
+
# <pre><code>var foo = "bar";</code></pre>
|
239
240
|
#
|
240
241
|
# <pre><code>Long, single-line code blocks should not wrap. They should horizontally scroll if they are too long. This line should be long enough to demonstrate this.</code></pre>
|
241
242
|
#
|
242
|
-
# <pre><code
|
243
|
+
# <pre><code>var foo = "The same thing is true for code with syntax highlighting. A single line of code should horizontally scroll if it is really long.";</code></pre>
|
243
244
|
#
|
244
245
|
# <p>Inline code inside table cells should still be distinguishable.</p>
|
245
246
|
#
|