Add the PrivacyLink component.
This commit is contained in:
		
							parent
							
								
									f8d8502c0c
								
							
						
					
					
						commit
						c6ed3023e8
					
				| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					// Link Exports
 | 
				
			||||||
 | 
					export {PrivacyLink, PrivacyLinkProps} from './links/privacy-link.js';
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					import {html} from 'htm/preact';
 | 
				
			||||||
 | 
					import {Component, ComponentChildren, VNode} from 'preact';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Component properties for {@linkcode PrivacyLink}.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export type PrivacyLinkProps = {
 | 
				
			||||||
 | 
					  children: ComponentChildren;
 | 
				
			||||||
 | 
					  class: string;
 | 
				
			||||||
 | 
					  href: string;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A simple {@linkcode https://developer.mozilla.org/docs/Web/HTML/Element/a <a>}
 | 
				
			||||||
 | 
					 * element wrapper with `rel="noopener noreferrer"` and `target="_blank"`
 | 
				
			||||||
 | 
					 * already set.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export class PrivacyLink extends Component<PrivacyLinkProps> {
 | 
				
			||||||
 | 
					  render(): VNode {
 | 
				
			||||||
 | 
					    const props: Record<string, string> = {
 | 
				
			||||||
 | 
					      class: this.props.class,
 | 
				
			||||||
 | 
					      href: this.props.href,
 | 
				
			||||||
 | 
					      rel: 'noopener noreferrer',
 | 
				
			||||||
 | 
					      target: '_blank',
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return html`<a ...${props}>${this.props.children}</a>`;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					import test from 'ava';
 | 
				
			||||||
 | 
					import {html} from 'htm/preact';
 | 
				
			||||||
 | 
					import {render} from 'preact-render-to-string';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import {PrivacyLink} from '../../source/gram.js';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('PrivacyLink', (t) => {
 | 
				
			||||||
 | 
					  t.snapshot(render(html`<${PrivacyLink} />`), 'Empty');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  t.snapshot(
 | 
				
			||||||
 | 
					    render(html`<${PrivacyLink} href="https://example.org">Example<//>`),
 | 
				
			||||||
 | 
					    'Text children',
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  t.snapshot(
 | 
				
			||||||
 | 
					    render(
 | 
				
			||||||
 | 
					      html`
 | 
				
			||||||
 | 
					        <${PrivacyLink} href="https://example.org">
 | 
				
			||||||
 | 
					          Example <span class="bold">with children</span>
 | 
				
			||||||
 | 
					        <//>
 | 
				
			||||||
 | 
					      `,
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					    'HTML children',
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  t.snapshot(
 | 
				
			||||||
 | 
					    render(
 | 
				
			||||||
 | 
					      html`
 | 
				
			||||||
 | 
					        <${PrivacyLink} class="bold italic" href="https://example.org">
 | 
				
			||||||
 | 
					          Example
 | 
				
			||||||
 | 
					        <//>
 | 
				
			||||||
 | 
					      `,
 | 
				
			||||||
 | 
					    ),
 | 
				
			||||||
 | 
					    'CSS class',
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					# Snapshot report for `tests/links/privacy-link.test.ts`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The actual snapshot is saved in `privacy-link.test.ts.snap`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Generated by [AVA](https://avajs.dev).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## PrivacyLink
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> Empty
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '<a rel="noopener noreferrer" target="_blank"></a>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> Text children
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '<a href="https://example.org" rel="noopener noreferrer" target="_blank">Example</a>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> HTML children
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '<a href="https://example.org" rel="noopener noreferrer" target="_blank">Example <span class="bold">with children</span></a>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					> CSS class
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '<a class="bold italic" href="https://example.org" rel="noopener noreferrer" target="_blank">Example</a>'
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue