From 42f8b4901a969a5c988db43974ffa0766a175577 Mon Sep 17 00:00:00 2001 From: Jeroen Claassens Date: Sun, 18 Feb 2024 14:25:10 +0100 Subject: [PATCH] feat: add discord-ordered-list --- packages/core/demo/index.html | 29 +++---- packages/core/package.json | 2 + .../DiscordOrderedList.ts | 79 +++++++++++++++++++ packages/core/src/index.ts | 1 + packages/react/src/index.ts | 1 + 5 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 packages/core/src/components/discord-ordered-list/DiscordOrderedList.ts diff --git a/packages/core/demo/index.html b/packages/core/demo/index.html index e5326f245..14a7e54d7 100644 --- a/packages/core/demo/index.html +++ b/packages/core/demo/index.html @@ -113,19 +113,6 @@

@skyra/discord-components-core

-

List items

- - - - This is the top item - - This is the first nested item - This is the second nested item - - - - -

A normal conversation

Hey guys, I'm new here! Glad to be able to join you all! @@ -602,9 +589,23 @@

Headers

+

Ordered list items

+ + + + This is an ordered list item + + You can start your list item at a custom number + We will calculate the length internally + This whole level is considered to have a start number length of 3 + + + + +

Unordered list items

- + Discord diff --git a/packages/core/package.json b/packages/core/package.json index 20d1c006c..6d84d549d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -33,6 +33,7 @@ "./discord-mention.js": "./dist/components/discord-mention/DiscordMention.js", "./discord-message.js": "./dist/components/discord-message/DiscordMessage.js", "./discord-messages.js": "./dist/components/discord-messages/DiscordMessages.js", + "./discord-ordered-list.js": "./dist/components/discord-ordered-list/DiscordOrderedList.js", "./discord-pre.js": "./dist/components/discord-pre/DiscordPre.js", "./discord-quote.js": "./dist/components/discord-quote/DiscordQuote.js", "./discord-reaction.js": "./dist/components/discord-reaction/DiscordReaction.js", @@ -71,6 +72,7 @@ "./dist/components/discord-mention/DiscordMention.js", "./dist/components/discord-message/DiscordMessage.js", "./dist/components/discord-messages/DiscordMessages.js", + "./dist/components/discord-ordered-list/DiscordOrderedList.js", "./dist/components/discord-pre/DiscordPre.js", "./dist/components/discord-quote/DiscordQuote.js", "./dist/components/discord-reaction/DiscordReaction.js", diff --git a/packages/core/src/components/discord-ordered-list/DiscordOrderedList.ts b/packages/core/src/components/discord-ordered-list/DiscordOrderedList.ts new file mode 100644 index 000000000..5937eadc3 --- /dev/null +++ b/packages/core/src/components/discord-ordered-list/DiscordOrderedList.ts @@ -0,0 +1,79 @@ +import { css, html, LitElement } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; +import { DiscordComponentsError } from '../../util.js'; + +@customElement('discord-ordered-list') +export class DiscordOrderedList extends LitElement { + public static override styles = css` + :host > ol { + list-style-image: initial; + list-style-type: decimal; + list-style-position: outside; + margin-bottom: 0px; + margin-top: 4px; + margin-right: 0px; + margin-left: calc(0.4em + 0.6em * var(--totalCharacters)); + padding: 0px; + } + `; + + /** + * The starting number for the ordered list. + * + * You can set this to start the list at a specific number + * + * @default 1 + */ + @property({ type: Number, reflect: true }) + public accessor start = 1; + + @state() + private accessor startLength = 1; + + public checkChildren() { + const allChildrenAreListItems = Array.from(this.children).every((child) => { + const tagNameLowerCase = child.tagName.toLowerCase(); + return ( + tagNameLowerCase === 'discord-list-item' || + tagNameLowerCase === 'discord-unordered-list' || + tagNameLowerCase === 'discord-ordered-list' + ); + }); + + if (!allChildrenAreListItems) { + throw new DiscordComponentsError( + 'All direct children inside of a components must be one of , , or .' + ); + } + } + + /** + * Checks how many children of `` this component has and updates + * the {@link DiscordOrderedList.startLength startLength} state. + */ + protected override willUpdate(): void { + const amountOfListItems = Array.from(this.children).filter((child) => { + return child.tagName.toLowerCase() === 'discord-list-item'; + }).length; + + const totalCount = this.start + amountOfListItems; + + this.startLength = totalCount.toString().length; + } + + protected override render() { + this.checkChildren(); + + // We disable the eslint rule here because users should use the component inside of this component. + // eslint-disable-next-line lit-a11y/list + return html`
    + +
`; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'discord-ordered-list': DiscordOrderedList; + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d072ec104..d3c3351a7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -24,6 +24,7 @@ export { DiscordListItem } from './components/discord-list-item/DiscordListItem. export { DiscordMention } from './components/discord-mention/DiscordMention.js'; export { DiscordMessage } from './components/discord-message/DiscordMessage.js'; export { DiscordMessages } from './components/discord-messages/DiscordMessages.js'; +export { DiscordOrderedList } from './components/discord-ordered-list/DiscordOrderedList.js'; export { DiscordPre } from './components/discord-pre/DiscordPre.js'; export { DiscordQuote } from './components/discord-quote/DiscordQuote.js'; export { DiscordReaction } from './components/discord-reaction/DiscordReaction.js'; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index d72be9913..6409377f1 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -25,6 +25,7 @@ export const DiscordListItem = createReactComponent('discord-list-item', ReactCo export const DiscordMention = createReactComponent('discord-mention', ReactComponents.DiscordMention); export const DiscordMessage = createReactComponent('discord-message', ReactComponents.DiscordMessage); export const DiscordMessages = createReactComponent('discord-messages', ReactComponents.DiscordMessages); +export const DiscordOrderedList = createReactComponent('discord-ordered-list', ReactComponents.DiscordOrderedList); export const DiscordPre = createReactComponent('discord-pre', ReactComponents.DiscordPre); export const DiscordQuote = createReactComponent('discord-quote', ReactComponents.DiscordQuote); export const DiscordReaction = createReactComponent('discord-reaction', ReactComponents.DiscordReaction);