diff --git a/storybook/.storybook/main.js b/storybook/.storybook/main.js new file mode 100644 index 0000000..45cfaeb --- /dev/null +++ b/storybook/.storybook/main.js @@ -0,0 +1,6 @@ +module.exports = { + stories: [ + '../stories/**/*.stories.js', + '../src/components/**/*.js', + ], +} diff --git a/storybook/TODO b/storybook/TODO new file mode 100644 index 0000000..27cce4e --- /dev/null +++ b/storybook/TODO @@ -0,0 +1,2 @@ +npm install +yarn storybook diff --git a/storybook/package.json b/storybook/package.json new file mode 100644 index 0000000..05ff154 --- /dev/null +++ b/storybook/package.json @@ -0,0 +1,20 @@ +{ + "name": "WebComponent", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "storybook": "start-storybook -p 6006", + "build-storybook": "build-storybook -c .storybook -o .out", + "start-storybook": "start-storybook -s ./public -p 9001" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@babel/core": "^7.8.6", + "@storybook/html": "^5.3.14", + "babel-loader": "^8.0.6" + } +} diff --git a/storybook/src/components/ratings/ratings.js b/storybook/src/components/ratings/ratings.js new file mode 100644 index 0000000..624685e --- /dev/null +++ b/storybook/src/components/ratings/ratings.js @@ -0,0 +1,96 @@ + +const styleRules = ` .rating {font-size: 50px; color: orange; cursor: pointer }` + +class MyRating extends HTMLElement { + + constructor() { + super() + this._maxValue = 5 + this._value = 4 + this.attachShadow({mode: "open"}) + } + + connectedCallback() { + this.createComponent() + } + + get maxValue() { + return this._maxValue + } + + set maxValue(val) { + this._maxValue = val + this.setAttribute("max-value", val) + } + + get value() { + return this._value + } + + set value(val) { + this._value = val + this.setAttribute("value", val) + } + + static get observedAttributes() { + return ["max-value", "value"] + } + + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue !== newValue) { + switch (name) { + case "max-value": + this._maxValue = newValue + break + case "value": + this._value = newValue + break + default: + } + this.replaceStarList() + } + } + + replaceStarList() { + let starNode = this.shadowRoot.children[1]; + if (starNode) { + let starList = this.createStarList(); + starNode.remove(); + this.shadowRoot.appendChild(starList); + } + } + + createComponent() { + this.createStyle() + let starList = this.createStarList() + this.shadowRoot.appendChild(starList) + } + + createStyle() { + let style = document.createElement("style") + style.appendChild(document.createTextNode(styleRules)) + this.shadowRoot.appendChild(style) + } + + createStarList() { + let div = document.createElement("div") + for (let i = 1; i <= this.maxValue; i++) { + let star = i <= this.value ? this.createStar("★", i) : this.createStar("☆", i) + div.appendChild(star) + } + return div + } + + createStar(starCode, i) { + let span = document.createElement("span") + span.setAttribute("class", "rating") + span.innerHTML = starCode + span.addEventListener("click", () => { + this.value = i + }, false) + return span + } +} + +customElements.define("my-rating", MyRating) + diff --git a/storybook/stories/index.stories.js b/storybook/stories/index.stories.js new file mode 100644 index 0000000..c6152de --- /dev/null +++ b/storybook/stories/index.stories.js @@ -0,0 +1,33 @@ + +export default { + title: 'Demo', +} + +export const Heading = () => '