From 500698a83cfbb8d6b5aed561072ff08614e79b10 Mon Sep 17 00:00:00 2001 From: matthilo96 Date: Fri, 24 Oct 2025 17:42:22 +0200 Subject: [PATCH 1/8] Add new component MucSpinner --- src/components/Spinner/MucSpinner.stories.ts | 28 +++ src/components/Spinner/MucSpinner.vue | 214 +++++++++++++++++++ src/components/Spinner/index.ts | 3 + src/components/index.ts | 2 + 4 files changed, 247 insertions(+) create mode 100644 src/components/Spinner/MucSpinner.stories.ts create mode 100644 src/components/Spinner/MucSpinner.vue create mode 100644 src/components/Spinner/index.ts diff --git a/src/components/Spinner/MucSpinner.stories.ts b/src/components/Spinner/MucSpinner.stories.ts new file mode 100644 index 00000000..d7259082 --- /dev/null +++ b/src/components/Spinner/MucSpinner.stories.ts @@ -0,0 +1,28 @@ +import MucSpinner from "./MucSpinner.vue"; + +export default { + component: MucSpinner, + title: "MucSpinner", + tags: ["autodocs"], + parameters: { + docs: { + description: { + component: `The \`muc-spinner\` is a spinner represents a loading progress. +`, + }, + }, + }, +}; + +export const Relative = { + args: { + size: "40%", + text: "Hier könnte ihr Text stehen", + }, +}; + +export const Default = { + args: { + size: "300", + }, +}; diff --git a/src/components/Spinner/MucSpinner.vue b/src/components/Spinner/MucSpinner.vue new file mode 100644 index 00000000..62eb6801 --- /dev/null +++ b/src/components/Spinner/MucSpinner.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/components/Spinner/index.ts b/src/components/Spinner/index.ts new file mode 100644 index 00000000..8ad8330e --- /dev/null +++ b/src/components/Spinner/index.ts @@ -0,0 +1,3 @@ +import MucSpinner from "./MucSpinner.vue"; + +export { MucSpinner }; diff --git a/src/components/index.ts b/src/components/index.ts index 7a46fe24..3fe021d5 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -23,6 +23,7 @@ import { MucLink } from "./Link"; import { MucModal } from "./Modal"; import { MucPercentageSpinner } from "./PercentageSpinner"; import { MucSlider, MucSliderItem } from "./Slider"; +import { MucSpinner } from "./Spinner"; import { MucStepper } from "./Stepper"; export { @@ -49,6 +50,7 @@ export { MucFileDropzone, MucCounter, MucPercentageSpinner, + MucSpinner, MucStepper, MucCalendar, MucSlider, From b5bdb051ff67817af7a4f274add7330ce2c15115 Mon Sep 17 00:00:00 2001 From: matthilo96 Date: Fri, 24 Oct 2025 17:44:15 +0200 Subject: [PATCH 2/8] code matting --- src/components/Spinner/MucSpinner.vue | 35 +++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/components/Spinner/MucSpinner.vue b/src/components/Spinner/MucSpinner.vue index 62eb6801..2c3073bb 100644 --- a/src/components/Spinner/MucSpinner.vue +++ b/src/components/Spinner/MucSpinner.vue @@ -75,7 +75,11 @@ v-for="(line, i) in lines" :key="i" x="100" - :dy="i === 0 ? `-${((lines.length - 1) / 2) * lineHeightEm}em` : `${lineHeightEm}em`" + :dy=" + i === 0 + ? `-${((lines.length - 1) / 2) * lineHeightEm}em` + : `${lineHeightEm}em` + " > {{ line }} @@ -85,7 +89,14 @@ - - From b0ba0a5f50b0d9b46ccfda85be2dad8018e9bede Mon Sep 17 00:00:00 2001 From: matthilo96 Date: Mon, 10 Nov 2025 11:52:58 +0100 Subject: [PATCH 6/8] merge Spinner and PercentageSpinner --- .../MucPercentageSpinner.stories.ts | 28 ------ .../MucPercentageSpinner.vue | 98 ------------------- src/components/PercentageSpinner/index.ts | 4 +- src/components/Spinner/MucSpinner.stories.ts | 33 +++++-- src/components/Spinner/MucSpinner.vue | 60 +++++++++++- 5 files changed, 85 insertions(+), 138 deletions(-) delete mode 100644 src/components/PercentageSpinner/MucPercentageSpinner.stories.ts delete mode 100644 src/components/PercentageSpinner/MucPercentageSpinner.vue diff --git a/src/components/PercentageSpinner/MucPercentageSpinner.stories.ts b/src/components/PercentageSpinner/MucPercentageSpinner.stories.ts deleted file mode 100644 index 78f49383..00000000 --- a/src/components/PercentageSpinner/MucPercentageSpinner.stories.ts +++ /dev/null @@ -1,28 +0,0 @@ -import MucPercentageSpinner from "./MucPercentageSpinner.vue"; - -export default { - component: MucPercentageSpinner, - title: "MucPercentageSpinner", - tags: ["autodocs"], - parameters: { - docs: { - description: { - component: `The \`muc-percentage-spinner\` is a spinner represents a loading progress. -`, - }, - }, - }, -}; - -export const Relative = { - args: { - size: "40%", - percentage: 42, - }, -}; - -export const Default = { - args: { - size: "300", - }, -}; diff --git a/src/components/PercentageSpinner/MucPercentageSpinner.vue b/src/components/PercentageSpinner/MucPercentageSpinner.vue deleted file mode 100644 index 877c1b62..00000000 --- a/src/components/PercentageSpinner/MucPercentageSpinner.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - diff --git a/src/components/PercentageSpinner/index.ts b/src/components/PercentageSpinner/index.ts index 02afd450..01886421 100644 --- a/src/components/PercentageSpinner/index.ts +++ b/src/components/PercentageSpinner/index.ts @@ -1,3 +1 @@ -import MucPercentageSpinner from "./MucPercentageSpinner.vue"; - -export { MucPercentageSpinner }; +export { MucSpinner as MucPercentageSpinner } from "../Spinner"; diff --git a/src/components/Spinner/MucSpinner.stories.ts b/src/components/Spinner/MucSpinner.stories.ts index aa29c24d..f52b6ae3 100644 --- a/src/components/Spinner/MucSpinner.stories.ts +++ b/src/components/Spinner/MucSpinner.stories.ts @@ -8,21 +8,40 @@ export default { docs: { description: { component: `The \`muc-spinner\` is a spinner represents a loading progress. -`, + `, }, }, }, }; -export const Relative = { +export const Default = { args: { size: "40%", + percentage: 42, text: "Hier könnte Ihr Text stehen ...", }, -}; + render: (args: any) => ({ + components: { MucSpinner }, + setup() { + return { args }; + }, + template: ` +
+
+

Percentage

+ +
-export const Default = { - args: { - size: "300", - }, +
+

Text

+ +
+ +
+

Default

+ +
+
+ `, + }), }; diff --git a/src/components/Spinner/MucSpinner.vue b/src/components/Spinner/MucSpinner.vue index 37b2317a..43429225 100644 --- a/src/components/Spinner/MucSpinner.vue +++ b/src/components/Spinner/MucSpinner.vue @@ -54,6 +54,19 @@ /> + {{ validPercentage }} + + + import { computed, ComputedRef } from "vue"; -const { size = "300", text } = defineProps<{ +const { + size = "300", + percentage, + text, +} = defineProps<{ /** * Size of the spinner relative or absolute. * Typical units for styling size are allowed. */ size: string; + /** + * Number that represents the progress. + * Numbers lower than 0 result in '0%'. + * Numbers greater than 100 result in '100%'. + * An empty value results in an empty string. + */ + percentage?: number; /** * Any text in the center of the spinner. * An empty value results in an empty string. @@ -94,13 +118,45 @@ const { size = "300", text } = defineProps<{ text?: string; }>(); +const hasText = typeof text === "string" && text.trim().length > 0; +const hasPercentage = percentage || percentage === 0; + +/** Runtime protection against simultaneous use */ +if (hasText && hasPercentage) { + const msg = + "MucSpinner: Die Props 'text' und 'percentage' dürfen nicht gleichzeitig verwendet werden."; + if ( + typeof import.meta !== "undefined" && + import.meta.env && + import.meta.env.MODE !== "production" + ) { + throw new Error(msg); + } else { + // eslint-disable-next-line no-console + console.error(msg); + } +} + +/** + * Ensures that the progress indication is within the reasonable range between 0 and 100 percent. + * An empty property 'percentage' results in an empty string. + */ +const validPercentage: ComputedRef = computed(() => { + if (percentage || percentage === 0) { + if (percentage < 0) return 0 + "%"; + if (percentage > 100) return 100 + "%"; + return Math.round(percentage) + "%"; + } + return ""; +}); + const MAX_TOTAL = 80; const MAX_PER_LINE = 14; const lineHeightEm = 1.2; /** Reduction to 80 characters */ const displayText: ComputedRef = computed(() => { - const raw = text ? String(text) : ""; + const raw = hasText ? String(text) : ""; if (raw.length <= MAX_TOTAL) return raw; return raw.slice(0, MAX_TOTAL - 1) + "…"; }); From 587cd16a2da95d721bce9d9c1cb13f509dbfd3de Mon Sep 17 00:00:00 2001 From: matthilo96 Date: Mon, 10 Nov 2025 14:14:29 +0100 Subject: [PATCH 7/8] fix lint error --- src/components/Spinner/MucSpinner.stories.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/components/Spinner/MucSpinner.stories.ts b/src/components/Spinner/MucSpinner.stories.ts index f52b6ae3..1f3ef50e 100644 --- a/src/components/Spinner/MucSpinner.stories.ts +++ b/src/components/Spinner/MucSpinner.stories.ts @@ -1,5 +1,11 @@ import MucSpinner from "./MucSpinner.vue"; +type SpinnerArgs = { + size?: string; + text?: string; + percentage?: number; +}; + export default { component: MucSpinner, title: "MucSpinner", @@ -7,8 +13,7 @@ export default { parameters: { docs: { description: { - component: `The \`muc-spinner\` is a spinner represents a loading progress. - `, + component: `The \`muc-spinner\` is a spinner represents a loading progress.`, }, }, }, @@ -20,7 +25,7 @@ export const Default = { percentage: 42, text: "Hier könnte Ihr Text stehen ...", }, - render: (args: any) => ({ + render: (args: SpinnerArgs) => ({ components: { MucSpinner }, setup() { return { args }; From 9984a60b93d66d37d0fe596a638f0d54c90f2b3f Mon Sep 17 00:00:00 2001 From: matthilo96 Date: Mon, 10 Nov 2025 14:25:04 +0100 Subject: [PATCH 8/8] change type zo interface --- src/components/Spinner/MucSpinner.stories.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/Spinner/MucSpinner.stories.ts b/src/components/Spinner/MucSpinner.stories.ts index 1f3ef50e..6a8de068 100644 --- a/src/components/Spinner/MucSpinner.stories.ts +++ b/src/components/Spinner/MucSpinner.stories.ts @@ -1,10 +1,10 @@ import MucSpinner from "./MucSpinner.vue"; -type SpinnerArgs = { +interface SpinnerArgs { size?: string; text?: string; percentage?: number; -}; +} export default { component: MucSpinner,