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