typescript-overlay-essentials 1.2.0 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/ConfirmationBox.d.ts +23 -0
  2. package/dist/ConfirmationBox.js +90 -0
  3. package/dist/Dropdown.d.ts +21 -0
  4. package/dist/Dropdown.js +141 -0
  5. package/dist/InfoOverlay.d.ts +17 -0
  6. package/dist/InfoOverlay.js +57 -0
  7. package/dist/InfoOverlayWithInput.d.ts +22 -0
  8. package/dist/InfoOverlayWithInput.js +84 -0
  9. package/dist/InputFilter.d.ts +1 -0
  10. package/{InputFilter.tsx → dist/InputFilter.js} +12 -12
  11. package/dist/LoadingOverlay.d.ts +13 -0
  12. package/dist/LoadingOverlay.js +36 -0
  13. package/dist/MultipleChoiceOverlay.d.ts +22 -0
  14. package/dist/MultipleChoiceOverlay.js +94 -0
  15. package/dist/MultipleRadioOverlay.d.ts +22 -0
  16. package/dist/MultipleRadioOverlay.js +84 -0
  17. package/dist/Toast.d.ts +6 -0
  18. package/{Toast.tsx → dist/Toast.js} +7 -15
  19. package/dist/ToggleSwitch.d.ts +11 -0
  20. package/dist/ToggleSwitch.js +27 -0
  21. package/{index.ts → dist/index.d.ts} +10 -10
  22. package/dist/index.js +10 -0
  23. package/package.json +19 -3
  24. package/.github/workflows/npm-publish.yml +0 -32
  25. package/ConfirmationBox.css +0 -69
  26. package/ConfirmationBox.tsx +0 -148
  27. package/Dropdown.css +0 -31
  28. package/Dropdown.tsx +0 -211
  29. package/InfoOverlay.css +0 -65
  30. package/InfoOverlay.tsx +0 -101
  31. package/InfoOverlayWithInput.css +0 -88
  32. package/InfoOverlayWithInput.tsx +0 -157
  33. package/LoadingOverlay.css +0 -110
  34. package/LoadingOverlay.tsx +0 -57
  35. package/MultipleChoiceOverlay.css +0 -170
  36. package/MultipleChoiceOverlay.tsx +0 -170
  37. package/MultipleRadioOverlay.css +0 -170
  38. package/MultipleRadioOverlay.tsx +0 -158
  39. package/Toast.css +0 -13
  40. package/ToggleSwitch.tsx +0 -56
  41. package/Toggleswitch.css +0 -49
@@ -1,158 +0,0 @@
1
- import { useEffect, useState, CSSProperties } from 'react';
2
- import './MultipleRadioOverlay.css';
3
-
4
-
5
- // Um das MultipleRadioOverlay zu nutzen, muss der State die folgende Struktur haben:
6
- export interface MultipleRadioOverlayState {
7
- headline?: string | undefined;
8
- message?: string | undefined;
9
- choices: string[] | [];
10
- preInput?: string | undefined;
11
- cancelButtonText?: string | undefined;
12
- proceedButtonText?: string | undefined;
13
- handlerOk?: ((userInput: string, args?: unknown) => void) | undefined;
14
- handlerCancel?: ((args?: unknown) => void) | undefined;
15
- handlerArgs?: unknown;
16
- addCloseButton?: boolean | undefined;
17
- proceedButtonStyle?: CSSProperties | undefined;
18
- cancelButtonStyle?: CSSProperties | undefined;
19
- }
20
-
21
- // Um das MultipleRadioOverlay zu nutzen, muss der State die folgende Struktur haben:
22
- export const defaultMultipleRadioState: MultipleRadioOverlayState = {
23
- headline: undefined,
24
- message: undefined,
25
- choices: [],
26
- preInput: undefined,
27
- cancelButtonText: undefined,
28
- proceedButtonText: undefined,
29
- handlerOk: undefined,
30
- handlerCancel: undefined,
31
- handlerArgs: undefined,
32
- addCloseButton: false,
33
- proceedButtonStyle: undefined,
34
- cancelButtonStyle: undefined,
35
- };
36
- // Wobei alle Attribute grundsätzlich optional sind:
37
- // - headline: ist die Überschrift und wird fett hinterlegt
38
- // - message: ist die angezeigte Nachricht
39
- // - choices: Ein String-Array mit den Optionen die ausgewählt werden können (ohne Angabe gibt es keine Auswahl)
40
- // - preInput: Ein String: Dieser Eintrag ist stadardmäßig ausgewählt
41
- // - cancelButtonText: ist der Text der auf dem Cancel Button stehen soll (ohne Angabe wird "Abbrechen" verwendet)
42
- // - proceedButtonText: ist der Text der auf dem Proceed Button stehen soll (ohne Angabe wird "OK" verwendet)
43
- // - handlerOk: ist die Funktion die bei Bestätigung des Inputs ausgeführt wird (Struktur: handlerOk(userInput, handlerArgs)
44
- // - handlerCancel: ist die Funktion die bei Ablehnung des Inputs ausgeführt wird (Struktur: handlerCancel(handlerArgs)
45
- // - handlerArgs: kann im handler als Argumente genutzt werden
46
- // - addCloseButton: boolscher Wert, der angibt, ob ein x oben rechts als close-Button verfügbar sein soll (bricht die Aktion ohne handler ab, standardmäßig false)
47
- // - proceedButtonStyle: ist der Style des Bestätigungsbuttons (Standardmäßig unverändert)
48
- // - cancelButtonStyle: ist der Style des Abbrechenbuttons (Standardmäßig unverändert)
49
-
50
- // Output: Der Input vom User wird am Ende an den handlerOk übergeben (oder bei handlerCancel ignoriert)!
51
- // Somit wird der handler so aufgerufen: handlerOk(UserInput, handlerArgs) oder handlerCancel(handlerArgs)
52
- export function MultipleRadioOverlay({ state, setState }: { state: MultipleRadioOverlayState, setState: (state: MultipleRadioOverlayState) => void }): React.ReactElement {
53
-
54
- // Wird verwendet um das Infoverlay ein- und auszublenden
55
- const [showOverlay, setShowOverlay] = useState<boolean>(false);
56
-
57
- // Wird verwendet um die ausgewählte Wahl aktuell zu halten
58
- const [input, setInput] = useState<string>("");
59
-
60
- // Sobald der State von außen aktualisiert wird triggert diese Funktion
61
- // Die setzt showOverlay auf true
62
- useEffect(() => {
63
- if (state?.message != null || state?.headline != null) {
64
- setInput(state?.preInput != null ? state.preInput : "");
65
- setShowOverlay(true);
66
- setTimeout(() => { document.getElementById("confirmButton")?.focus(); }, 1);
67
- }
68
- }, [state]);
69
-
70
- const handleAction = (
71
- handler: ((args?: unknown) => void) | ((userInput: string, args?: unknown) => void) | undefined,
72
- useInput: boolean
73
- ): void => {
74
- setShowOverlay(false);
75
- var tempState = {
76
- handler: handler,
77
- handlerArgs: state.handlerArgs
78
- };
79
- setState(defaultMultipleRadioState);
80
- if (typeof tempState.handler === 'function' && useInput)
81
- (tempState.handler as ((userInput: string, args?: unknown) => void))(input, tempState.handlerArgs);
82
- else if (typeof tempState.handler === 'function')
83
- (tempState.handler as ((args?: unknown) => void))(tempState.handlerArgs);
84
- }
85
-
86
- return showOverlay ?
87
- <div className="multipleradio-overlay">
88
- <div className="multipleradio-box">
89
- {state.addCloseButton?
90
- <span className="closeButton">
91
- <svg xmlns="http://www.w3.org/2000/svg"
92
- tabIndex={0}
93
- className="close-icon"
94
- onClick={() => handleAction(undefined, false)}
95
- onKeyDown={(e) => {
96
- if (e.key === 'Enter' || e.key === ' ') {
97
- e.preventDefault(); // Verhindert Scroll bei Space
98
- handleAction(undefined, false);
99
- }
100
- }}
101
- role="button" aria-label="Dialog schließen"
102
- width="24" height="24" viewBox="0 0 24 24" fill="none"
103
- stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
104
- <line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line>
105
- </svg>
106
- </span> :
107
- <></>}
108
- <p className="headline" id = "theHeadline" tabIndex={0} style={{ whiteSpace: "pre-line", wordBreak: "break-word" }}><strong>{state?.headline != null ? state.headline : ""}</strong></p>
109
- <p tabIndex={0} style={{ whiteSpace: "pre-line", wordBreak: "break-word" }}>{state?.message != null ? state.message : ""}</p>
110
- <div className="radios-input">
111
- <div className="radios-container">
112
- {state?.choices.map(choice => (
113
- <label className="radio-label" key={choice}>
114
- <input
115
- type="radio"
116
- checked={input === choice}
117
- onChange={() => setInput(choice)}
118
- tabIndex={0}
119
- onKeyDown={(e) => {
120
- if (e.key === 'Enter' || e.key === ' ') {
121
- e.preventDefault(); // Verhindert Scroll bei Space
122
- setInput(choice);
123
- }
124
- }}
125
- />
126
- {choice}
127
- </label>
128
- ))}
129
- </div>
130
- </div>
131
- <div className="information-buttons">
132
- <button onClick={() => handleAction(state.handlerCancel, false)}
133
- onKeyDown={(event) => {
134
- if (event.key === "Enter" || event.key === ' ') {
135
- event.preventDefault(); // Verhindert Scroll bei Space
136
- handleAction(state.handlerCancel, false);
137
- }
138
- }}
139
- className="px-4 py-2 bg-gray-300 rounded"
140
- style={state?.cancelButtonStyle != null ? state.cancelButtonStyle : {}}>
141
- {state?.cancelButtonText != null ? state.cancelButtonText : "Abbrechen"}
142
- </button>
143
- <button onClick={() => handleAction(state.handlerOk, true)}
144
- id="confirmButton"
145
- onKeyDown={(event) => {
146
- if (event.key === "Enter" || event.key === ' ') {
147
- event.preventDefault(); // Verhindert Scroll bei Space
148
- handleAction(state.handlerOk, true);
149
- }
150
- }}
151
- className="px-4 py-2 bg-blue-600 text-white rounded"
152
- style={state?.proceedButtonStyle != null ? state.proceedButtonStyle : {}}>
153
- {state?.proceedButtonText != null ? state.proceedButtonText : "OK"}
154
- </button>
155
- </div>
156
- </div>
157
- </div> : <></>;
158
- }
package/Toast.css DELETED
@@ -1,13 +0,0 @@
1
- .toast-notification {
2
- font-size: 80%;
3
- position: fixed;
4
- top: 14rem;
5
- right: 1rem;
6
- background-color: var(--DunkleresGruen, #1a7f37);
7
- color: white;
8
- box-shadow: 0 4px 8px rgba(0,0,0,0.2);
9
- padding: 0.8rem 1.2rem 0.65rem 1.2rem;
10
- border-radius: 8px;
11
- animation: fadeInOut 2.5s ease-in-out;
12
- z-index: 1000;
13
- }
package/ToggleSwitch.tsx DELETED
@@ -1,56 +0,0 @@
1
- import React, { useRef, useEffect, useState } from "react";
2
- import "./ToggleSwitch.css";
3
-
4
- export interface ToggleSwitchOption<T> {
5
- value: T;
6
- label: string;
7
- }
8
-
9
- // Attribute vom ToggleSwitch:
10
- // - optionLeft: {value: valueLeft, label: labelLeft} Beschreibt die linke Option. valueLeft ist der Wert, der in "value" eingetragen wird und labelLeft, was als Option angezeigt wird.
11
- // - optionRight: {value: valueLeft, label: labelRight} Beschreibt die rechte Option. valueRight ist der Wert, der in "value" eingetragen wird und labelRight, was als Option angezeigt wird.
12
- // - value: Der Wert, der ausgewählt angezeigt werden soll (useState)
13
- // - onChange: Die Funktion die bei Änderung ausgeführt werden soll.
14
- // Standardmäßig könnte z.B. {(value) => {value === valueLeft ? setValue(valueLeft) : setValue(valueRight)}} genutzt werden
15
-
16
- export function ToggleSwitch<T>({ optionLeft, optionRight, value, onChange } : { optionLeft: ToggleSwitchOption<T>, optionRight: ToggleSwitchOption<T>, value: T, onChange: (value: T) => void }) {
17
- const containerRef = useRef<HTMLDivElement>(null);
18
- const optionLeftRef = useRef<HTMLDivElement>(null);
19
- const optionRightRef = useRef<HTMLDivElement>(null);
20
- const [sliderStyle, setSliderStyle] = useState({});
21
-
22
- useEffect(() => {
23
- const el = value === optionLeft.value ? optionLeftRef.current : optionRightRef.current;
24
- const container = containerRef.current;
25
-
26
- if (!el || !container) return;
27
-
28
- const { offsetLeft, offsetWidth } = el;
29
-
30
- setSliderStyle({
31
- transform: `translateX(calc(${offsetLeft}px - 1rem))`,
32
- width: `calc(${offsetWidth}px + 2rem)`
33
- });
34
- }, [value, optionLeft, optionRight]);
35
-
36
- return (
37
- <div className="toggleWrapper" ref={containerRef}>
38
- <div
39
- className={`toggleOption ${value === optionLeft.value ? "active" : ""}`}
40
- ref={el => {optionLeftRef.current = el}}
41
- onClick={() => onChange(optionLeft.value)}
42
- >
43
- {optionLeft.label}
44
- </div>
45
- <div
46
- className={`toggleOption ${value === optionRight.value ? "active" : ""}`}
47
- ref={el => {optionRightRef.current = el}}
48
- onClick={() => onChange(optionRight.value)}
49
- >
50
- {optionRight.label}
51
- </div>
52
-
53
- <div className={`toggleSlider ${value === optionLeft.value ? "left" : "right"}`} style={sliderStyle}/>
54
- </div>
55
- );
56
- }
package/Toggleswitch.css DELETED
@@ -1,49 +0,0 @@
1
- .toggleWrapper {
2
- position: relative;
3
- display: flex;
4
- width: fit-content;
5
- height: 40px;
6
- border-radius: 20px;
7
- background-color: #f9eeee;;
8
- overflow: hidden;
9
- cursor: pointer;
10
- user-select: none;
11
- font-family: sans-serif;
12
- font-weight: 500;
13
- float: right;
14
- }
15
-
16
- .toggleOption {
17
- flex: 1;
18
- display: flex;
19
- justify-content: center;
20
- align-items: center;
21
- z-index: 2;
22
- color: var(--FastSchwarz, black);
23
- transition: color 0.2s;
24
- margin: 1rem;
25
- white-space: nowrap;
26
- }
27
-
28
- .toggleOption.active {
29
- color: black;
30
- }
31
-
32
- .toggleSlider {
33
- position: absolute;
34
- top: 0;
35
- bottom: 0;
36
- width: 50%;
37
- border-radius: 20px;
38
- background-color: var(--HellAkzent, red);
39
- transition: transform 0.25s ease;
40
- z-index: 1;
41
- }
42
-
43
- .toggleSlider.left {
44
- transform: translateX(0%);
45
- }
46
-
47
- .toggleSlider.right {
48
- transform: translateX(100%);
49
- }