Skip to content

Commit 5552c6a

Browse files
committedFeb 10, 2024
feat: add discord-header component
1 parent a2d6506 commit 5552c6a

File tree

5 files changed

+91
-0
lines changed

5 files changed

+91
-0
lines changed
 

‎packages/core/UPGRADING-TO-V4.md

+18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# Upgrading to v4
22

3+
- [Upgrading to v4](#upgrading-to-v4)
4+
- [Breaking changes](#breaking-changes)
5+
- [Support for NextJS](#support-for-nextjs)
6+
- [Default font](#default-font)
7+
- [Whitney font](#whitney-font)
8+
- [Frameworkless usage](#frameworkless-usage)
9+
- [Component changes](#component-changes)
10+
- [`discord-inline-code`](#discord-inline-code)
11+
- [`discord-code`](#discord-code)
12+
- [`discord-header`](#discord-header)
13+
314
In version 4.x of @skyra/discord-components-core, the library has been rewritten
415
from from [StencilJS](https://stenciljs.com) to [Lit]. This means that this
516
library now offers proper
@@ -121,4 +132,11 @@ default to inline.
121132
As mentioned above, `discord-code` will default to inline. To get multiline code
122133
blocks set `multiline="true"` as property.
123134

135+
#### `discord-header`
136+
137+
A new component called `discord-header` has been added. This is the component
138+
that represents Discord markdown headers (lines starting with one of `#`, `##`,
139+
or `###`). The maximum level is 3, just like it is for Discord. An error is
140+
thrown if a level lower than 1 or higher than 3 is used.
141+
124142
[Lit]: https://lit.dev

‎packages/core/package.json

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
"./discord-embed-field.js": "./dist/components/discord-embed-field/DiscordEmbedField.js",
2626
"./discord-embed-fields.js": "./dist/components/discord-embed-fields/DiscordEmbedFields.js",
2727
"./discord-embed-footer.js": "./dist/components/discord-embed-footer/DiscordEmbedFooter.js",
28+
"./discord-header.js": "./dist/components/discord-header/DiscordHeader.js",
2829
"./discord-invite.js": "./dist/components/discord-invite/DiscordInvite.js",
2930
"./discord-italic.js": "./dist/components/discord-italic/DiscordItalic.js",
3031
"./discord-link.js": "./dist/components/discord-link/DiscordLink.js",
@@ -60,6 +61,7 @@
6061
"./dist/components/discord-embed-field/DiscordEmbedField.js",
6162
"./dist/components/discord-embed-fields/DiscordEmbedFields.js",
6263
"./dist/components/discord-embed-footer/DiscordEmbedFooter.js",
64+
"./dist/components/discord-header/DiscordHeader.js",
6365
"./dist/components/discord-invite/DiscordInvite.js",
6466
"./dist/components/discord-italic/DiscordItalic.js",
6567
"./dist/components/discord-link/DiscordLink.js",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { css, html, LitElement } from 'lit';
2+
import { customElement, property } from 'lit/decorators.js';
3+
4+
@customElement('discord-header')
5+
export class DiscordHeader extends LitElement {
6+
public static override styles = css`
7+
:host {
8+
margin: 16px 0 8px;
9+
font-weight: 700;
10+
line-height: 1.375em;
11+
}
12+
13+
:host([level='1']) {
14+
font-size: 1.5rem;
15+
}
16+
17+
:host([level='2']) {
18+
font-size: 1.25rem;
19+
}
20+
21+
:host([level='3']) {
22+
font-size: 1rem;
23+
}
24+
25+
:host([level='1']):first-child(),
26+
:host([level='2']):first-child() {
27+
margin-top: 8px;
28+
}
29+
30+
:host([level='3']):first-child() {
31+
margin-top: 4px;
32+
}
33+
`;
34+
35+
/**
36+
* The header level, this should be a number between 1 and 3 (inclusive).
37+
* If a number outside of this range is provided, an error is thrown.
38+
*/
39+
@property({ type: Number, reflect: true })
40+
public accessor level: 1 | 2 | 3 = 1;
41+
42+
public checkLevel() {
43+
if (this.level < 1 || this.level > 3) {
44+
throw new RangeError('The level property must be a number between 1 and 3 (inclusive)');
45+
}
46+
}
47+
48+
protected override render() {
49+
this.checkLevel();
50+
51+
switch (this.level) {
52+
case 1: {
53+
return html`<h1><slot></slot></h1>`;
54+
}
55+
case 2: {
56+
return html`<h2><slot></slot></h2>`;
57+
}
58+
case 3: {
59+
return html`<h3><slot></slot></h3>`;
60+
}
61+
}
62+
}
63+
}
64+
65+
declare global {
66+
interface HTMLElementTagNameMap {
67+
'discord-header': DiscordHeader;
68+
}
69+
}

‎packages/core/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export { DiscordEmbedDescription } from './components/discord-embed-description/
1616
export { DiscordEmbedField } from './components/discord-embed-field/DiscordEmbedField.js';
1717
export { DiscordEmbedFields } from './components/discord-embed-fields/DiscordEmbedFields.js';
1818
export { DiscordEmbedFooter } from './components/discord-embed-footer/DiscordEmbedFooter.js';
19+
export { DiscordHeader } from './components/discord-header/DiscordHeader.js';
1920
export { DiscordInvite } from './components/discord-invite/DiscordInvite.js';
2021
export { DiscordItalic } from './components/discord-italic/DiscordItalic.js';
2122
export { DiscordLink } from './components/discord-link/DiscordLink.js';

‎packages/react/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const DiscordEmbedDescription = createReactComponent('discord-embed-descr
1717
export const DiscordEmbedField = createReactComponent('discord-embed-field', ReactComponents.DiscordEmbedField);
1818
export const DiscordEmbedFields = createReactComponent('discord-embed-fields', ReactComponents.DiscordEmbedFields);
1919
export const DiscordEmbedFooter = createReactComponent('discord-embed-footer', ReactComponents.DiscordEmbedFooter);
20+
export const DiscordHeader = createReactComponent('discord-header', ReactComponents.DiscordHeader);
2021
export const DiscordInvite = createReactComponent('discord-invite', ReactComponents.DiscordInvite);
2122
export const DiscordItalic = createReactComponent('discord-italic', ReactComponents.DiscordItalic);
2223
export const DiscordLink = createReactComponent('discord-link', ReactComponents.DiscordLink);

0 commit comments

Comments
 (0)