@helpwave/hightide 0.1.14 → 0.1.16

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 (151) hide show
  1. package/dist/components/dialogs/ConfirmDialog.js +10 -0
  2. package/dist/components/dialogs/ConfirmDialog.js.map +1 -1
  3. package/dist/components/dialogs/ConfirmDialog.mjs +10 -0
  4. package/dist/components/dialogs/ConfirmDialog.mjs.map +1 -1
  5. package/dist/components/layout-and-navigation/Overlay.js +10 -0
  6. package/dist/components/layout-and-navigation/Overlay.js.map +1 -1
  7. package/dist/components/layout-and-navigation/Overlay.mjs +10 -0
  8. package/dist/components/layout-and-navigation/Overlay.mjs.map +1 -1
  9. package/dist/components/layout-and-navigation/Pagination.js +18 -4
  10. package/dist/components/layout-and-navigation/Pagination.js.map +1 -1
  11. package/dist/components/layout-and-navigation/Pagination.mjs +18 -4
  12. package/dist/components/layout-and-navigation/Pagination.mjs.map +1 -1
  13. package/dist/components/layout-and-navigation/SearchableList.js +18 -4
  14. package/dist/components/layout-and-navigation/SearchableList.js.map +1 -1
  15. package/dist/components/layout-and-navigation/SearchableList.mjs +18 -4
  16. package/dist/components/layout-and-navigation/SearchableList.mjs.map +1 -1
  17. package/dist/components/layout-and-navigation/StepperBar.js +10 -0
  18. package/dist/components/layout-and-navigation/StepperBar.js.map +1 -1
  19. package/dist/components/layout-and-navigation/StepperBar.mjs +10 -0
  20. package/dist/components/layout-and-navigation/StepperBar.mjs.map +1 -1
  21. package/dist/components/layout-and-navigation/TextImage.js +10 -0
  22. package/dist/components/layout-and-navigation/TextImage.js.map +1 -1
  23. package/dist/components/layout-and-navigation/TextImage.mjs +10 -0
  24. package/dist/components/layout-and-navigation/TextImage.mjs.map +1 -1
  25. package/dist/components/loading-states/LoadingAndErrorComponent.js +10 -0
  26. package/dist/components/loading-states/LoadingAndErrorComponent.js.map +1 -1
  27. package/dist/components/loading-states/LoadingAndErrorComponent.mjs +10 -0
  28. package/dist/components/loading-states/LoadingAndErrorComponent.mjs.map +1 -1
  29. package/dist/components/loading-states/LoadingAnimation.js +10 -0
  30. package/dist/components/loading-states/LoadingAnimation.js.map +1 -1
  31. package/dist/components/loading-states/LoadingAnimation.mjs +10 -0
  32. package/dist/components/loading-states/LoadingAnimation.mjs.map +1 -1
  33. package/dist/components/modals/ConfirmModal.js +10 -0
  34. package/dist/components/modals/ConfirmModal.js.map +1 -1
  35. package/dist/components/modals/ConfirmModal.mjs +10 -0
  36. package/dist/components/modals/ConfirmModal.mjs.map +1 -1
  37. package/dist/components/modals/DiscardChangesModal.js +10 -0
  38. package/dist/components/modals/DiscardChangesModal.js.map +1 -1
  39. package/dist/components/modals/DiscardChangesModal.mjs +10 -0
  40. package/dist/components/modals/DiscardChangesModal.mjs.map +1 -1
  41. package/dist/components/modals/InputModal.js +18 -4
  42. package/dist/components/modals/InputModal.js.map +1 -1
  43. package/dist/components/modals/InputModal.mjs +18 -4
  44. package/dist/components/modals/InputModal.mjs.map +1 -1
  45. package/dist/components/modals/LanguageModal.js +18 -4
  46. package/dist/components/modals/LanguageModal.js.map +1 -1
  47. package/dist/components/modals/LanguageModal.mjs +18 -4
  48. package/dist/components/modals/LanguageModal.mjs.map +1 -1
  49. package/dist/components/modals/ThemeModal.js +18 -4
  50. package/dist/components/modals/ThemeModal.js.map +1 -1
  51. package/dist/components/modals/ThemeModal.mjs +18 -4
  52. package/dist/components/modals/ThemeModal.mjs.map +1 -1
  53. package/dist/components/properties/CheckboxProperty.js +10 -0
  54. package/dist/components/properties/CheckboxProperty.js.map +1 -1
  55. package/dist/components/properties/CheckboxProperty.mjs +10 -0
  56. package/dist/components/properties/CheckboxProperty.mjs.map +1 -1
  57. package/dist/components/properties/DateProperty.js +18 -4
  58. package/dist/components/properties/DateProperty.js.map +1 -1
  59. package/dist/components/properties/DateProperty.mjs +18 -4
  60. package/dist/components/properties/DateProperty.mjs.map +1 -1
  61. package/dist/components/properties/MultiSelectProperty.js +18 -4
  62. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  63. package/dist/components/properties/MultiSelectProperty.mjs +18 -4
  64. package/dist/components/properties/MultiSelectProperty.mjs.map +1 -1
  65. package/dist/components/properties/NumberProperty.js +18 -4
  66. package/dist/components/properties/NumberProperty.js.map +1 -1
  67. package/dist/components/properties/NumberProperty.mjs +18 -4
  68. package/dist/components/properties/NumberProperty.mjs.map +1 -1
  69. package/dist/components/properties/PropertyBase.js +10 -0
  70. package/dist/components/properties/PropertyBase.js.map +1 -1
  71. package/dist/components/properties/PropertyBase.mjs +10 -0
  72. package/dist/components/properties/PropertyBase.mjs.map +1 -1
  73. package/dist/components/properties/SelectProperty.js +18 -4
  74. package/dist/components/properties/SelectProperty.js.map +1 -1
  75. package/dist/components/properties/SelectProperty.mjs +18 -4
  76. package/dist/components/properties/SelectProperty.mjs.map +1 -1
  77. package/dist/components/properties/TextProperty.js +18 -4
  78. package/dist/components/properties/TextProperty.js.map +1 -1
  79. package/dist/components/properties/TextProperty.mjs +18 -4
  80. package/dist/components/properties/TextProperty.mjs.map +1 -1
  81. package/dist/components/table/Table.d.mts +4 -6
  82. package/dist/components/table/Table.d.ts +4 -6
  83. package/dist/components/table/Table.js +27 -7
  84. package/dist/components/table/Table.js.map +1 -1
  85. package/dist/components/table/Table.mjs +27 -7
  86. package/dist/components/table/Table.mjs.map +1 -1
  87. package/dist/components/table/TableFilterButton.js +18 -4
  88. package/dist/components/table/TableFilterButton.js.map +1 -1
  89. package/dist/components/table/TableFilterButton.mjs +18 -4
  90. package/dist/components/table/TableFilterButton.mjs.map +1 -1
  91. package/dist/components/user-action/CopyToClipboardWrapper.d.mts +30 -0
  92. package/dist/components/user-action/CopyToClipboardWrapper.d.ts +30 -0
  93. package/dist/components/user-action/CopyToClipboardWrapper.js +324 -0
  94. package/dist/components/user-action/CopyToClipboardWrapper.js.map +1 -0
  95. package/dist/components/user-action/CopyToClipboardWrapper.mjs +300 -0
  96. package/dist/components/user-action/CopyToClipboardWrapper.mjs.map +1 -0
  97. package/dist/components/user-action/DateAndTimePicker.js +10 -0
  98. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  99. package/dist/components/user-action/DateAndTimePicker.mjs +10 -0
  100. package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -1
  101. package/dist/components/user-action/Input.js +8 -4
  102. package/dist/components/user-action/Input.js.map +1 -1
  103. package/dist/components/user-action/Input.mjs +8 -4
  104. package/dist/components/user-action/Input.mjs.map +1 -1
  105. package/dist/components/user-action/MultiSelect.js +18 -4
  106. package/dist/components/user-action/MultiSelect.js.map +1 -1
  107. package/dist/components/user-action/MultiSelect.mjs +18 -4
  108. package/dist/components/user-action/MultiSelect.mjs.map +1 -1
  109. package/dist/components/user-action/Select.js +18 -4
  110. package/dist/components/user-action/Select.js.map +1 -1
  111. package/dist/components/user-action/Select.mjs +18 -4
  112. package/dist/components/user-action/Select.mjs.map +1 -1
  113. package/dist/components/user-action/Textarea.js +8 -4
  114. package/dist/components/user-action/Textarea.js.map +1 -1
  115. package/dist/components/user-action/Textarea.mjs +8 -4
  116. package/dist/components/user-action/Textarea.mjs.map +1 -1
  117. package/dist/components/user-action/ToggleableInput.js +8 -4
  118. package/dist/components/user-action/ToggleableInput.js.map +1 -1
  119. package/dist/components/user-action/ToggleableInput.mjs +8 -4
  120. package/dist/components/user-action/ToggleableInput.mjs.map +1 -1
  121. package/dist/components/user-action/Tooltip.d.mts +1 -1
  122. package/dist/components/user-action/Tooltip.d.ts +1 -1
  123. package/dist/components/user-action/Tooltip.js.map +1 -1
  124. package/dist/components/user-action/Tooltip.mjs.map +1 -1
  125. package/dist/css/globals.css +18 -21
  126. package/dist/css/uncompiled/utitlity/animation.css +4 -28
  127. package/dist/hooks/useDelay.d.mts +1 -0
  128. package/dist/hooks/useDelay.d.ts +1 -0
  129. package/dist/hooks/useDelay.js +8 -4
  130. package/dist/hooks/useDelay.js.map +1 -1
  131. package/dist/hooks/useDelay.mjs +8 -4
  132. package/dist/hooks/useDelay.mjs.map +1 -1
  133. package/dist/index.d.mts +2 -1
  134. package/dist/index.d.ts +2 -1
  135. package/dist/index.js +176 -54
  136. package/dist/index.js.map +1 -1
  137. package/dist/index.mjs +163 -43
  138. package/dist/index.mjs.map +1 -1
  139. package/dist/localization/defaults/form.d.mts +5 -0
  140. package/dist/localization/defaults/form.d.ts +5 -0
  141. package/dist/localization/defaults/form.js +10 -0
  142. package/dist/localization/defaults/form.js.map +1 -1
  143. package/dist/localization/defaults/form.mjs +10 -0
  144. package/dist/localization/defaults/form.mjs.map +1 -1
  145. package/dist/util/writeToClipboard.d.mts +3 -0
  146. package/dist/util/writeToClipboard.d.ts +3 -0
  147. package/dist/util/writeToClipboard.js +32 -0
  148. package/dist/util/writeToClipboard.js.map +1 -0
  149. package/dist/util/writeToClipboard.mjs +8 -0
  150. package/dist/util/writeToClipboard.mjs.map +1 -0
  151. package/package.json +1 -1
@@ -0,0 +1,324 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // src/components/user-action/CopyToClipboardWrapper.tsx
20
+ var CopyToClipboardWrapper_exports = {};
21
+ __export(CopyToClipboardWrapper_exports, {
22
+ CopyToClipboardWrapper: () => CopyToClipboardWrapper
23
+ });
24
+ module.exports = __toCommonJS(CopyToClipboardWrapper_exports);
25
+ var import_react3 = require("react");
26
+ var import_clsx = require("clsx");
27
+
28
+ // src/localization/defaults/form.ts
29
+ var formTranslation = {
30
+ en: {
31
+ all: "All",
32
+ apply: "Apply",
33
+ back: "Back",
34
+ cancel: "Cancel",
35
+ change: "Change",
36
+ clear: "Clear",
37
+ click: "Click",
38
+ clickToCopy: "Click to Copy",
39
+ close: "Close",
40
+ confirm: "Confirm",
41
+ copy: "Copy",
42
+ copied: "Copied",
43
+ decline: "Decline",
44
+ delete: "Delete",
45
+ discard: "Discard",
46
+ discardChanges: "Discard Changes",
47
+ done: "Done",
48
+ edit: "Edit",
49
+ enterText: "Enter text here",
50
+ error: "Error",
51
+ exit: "Exit",
52
+ fieldRequiredError: "This field is required.",
53
+ invalidEmailError: "Please enter a valid email address.",
54
+ less: "Less",
55
+ loading: "Loading",
56
+ maxLengthError: "Maximum length exceeded.",
57
+ minLengthError: "Minimum length not met.",
58
+ more: "More",
59
+ next: "Next",
60
+ no: "No",
61
+ none: "None",
62
+ of: "of",
63
+ optional: "Optional",
64
+ pleaseWait: "Please wait...",
65
+ previous: "Previous",
66
+ remove: "Remove",
67
+ required: "Required",
68
+ reset: "Reset",
69
+ save: "Save",
70
+ saved: "Saved",
71
+ search: "Search",
72
+ select: "Select",
73
+ selectOption: "Select an option",
74
+ show: "Show",
75
+ showMore: "Show more",
76
+ showLess: "Show less",
77
+ submit: "Submit",
78
+ success: "Success",
79
+ update: "Update",
80
+ unsavedChanges: "Unsaved Changes",
81
+ unsavedChangesSaveQuestion: "Do you want to save your changes?",
82
+ yes: "Yes"
83
+ },
84
+ de: {
85
+ all: "Alle",
86
+ apply: "Anwenden",
87
+ back: "Zur\xFCck",
88
+ cancel: "Abbrechen",
89
+ change: "\xC4ndern",
90
+ clear: "L\xF6schen",
91
+ click: "Klicken",
92
+ clickToCopy: "Zum kopieren klicken",
93
+ close: "Schlie\xDFen",
94
+ confirm: "Best\xE4tigen",
95
+ copy: "Kopieren",
96
+ copied: "Kopiert",
97
+ decline: "Ablehnen",
98
+ delete: "L\xF6schen",
99
+ discard: "Verwerfen",
100
+ discardChanges: "\xC4nderungen Verwerfen",
101
+ done: "Fertig",
102
+ edit: "Bearbeiten",
103
+ enterText: "Text hier eingeben",
104
+ error: "Fehler",
105
+ exit: "Beenden",
106
+ fieldRequiredError: "Dieses Feld ist erforderlich.",
107
+ invalidEmailError: "Bitte geben Sie eine g\xFCltige E-Mail-Adresse ein.",
108
+ less: "Weniger",
109
+ loading: "L\xE4dt",
110
+ maxLengthError: "Maximale L\xE4nge \xFCberschritten.",
111
+ minLengthError: "Mindestl\xE4nge nicht erreicht.",
112
+ more: "Mehr",
113
+ next: "Weiter",
114
+ no: "Nein",
115
+ none: "Nichts",
116
+ of: "von",
117
+ optional: "Optional",
118
+ pleaseWait: "Bitte warten...",
119
+ previous: "Vorherige",
120
+ remove: "Entfernen",
121
+ required: "Erforderlich",
122
+ reset: "Zur\xFCcksetzen",
123
+ save: "Speichern",
124
+ saved: "Gespeichert",
125
+ search: "Suche",
126
+ select: "Select",
127
+ selectOption: "Option ausw\xE4hlen",
128
+ show: "Anzeigen",
129
+ showMore: "Mehr anzeigen",
130
+ showLess: "Weniger anzeigen",
131
+ submit: "Abschicken",
132
+ success: "Erfolg",
133
+ update: "Update",
134
+ unsavedChanges: "Ungespeicherte \xC4nderungen",
135
+ unsavedChangesSaveQuestion: "M\xF6chtest du die \xC4nderungen speichern?",
136
+ yes: "Ja"
137
+ }
138
+ };
139
+
140
+ // src/localization/LanguageProvider.tsx
141
+ var import_react2 = require("react");
142
+
143
+ // src/hooks/useLocalStorage.ts
144
+ var import_react = require("react");
145
+
146
+ // src/localization/util.ts
147
+ var languages = ["en", "de"];
148
+ var languagesLocalNames = {
149
+ en: "English",
150
+ de: "Deutsch"
151
+ };
152
+ var DEFAULT_LANGUAGE = "en";
153
+ var LanguageUtil = {
154
+ languages,
155
+ DEFAULT_LANGUAGE,
156
+ languagesLocalNames
157
+ };
158
+
159
+ // src/localization/LanguageProvider.tsx
160
+ var import_jsx_runtime = require("react/jsx-runtime");
161
+ var LanguageContext = (0, import_react2.createContext)({
162
+ language: LanguageUtil.DEFAULT_LANGUAGE,
163
+ setLanguage: (v) => v
164
+ });
165
+ var useLanguage = () => (0, import_react2.useContext)(LanguageContext);
166
+
167
+ // src/localization/useTranslation.ts
168
+ var TranslationPluralCount = {
169
+ zero: 0,
170
+ one: 1,
171
+ two: 2,
172
+ few: 3,
173
+ many: 11,
174
+ other: -1
175
+ };
176
+ var useTranslation = (translations, overwriteTranslation = {}) => {
177
+ const { language: languageProp, translation: overwrite } = overwriteTranslation;
178
+ const { language: inferredLanguage } = useLanguage();
179
+ const usedLanguage = languageProp ?? inferredLanguage;
180
+ const usedTranslations = [...translations];
181
+ if (overwrite) {
182
+ usedTranslations.push(overwrite);
183
+ }
184
+ return (key, options) => {
185
+ const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options };
186
+ try {
187
+ for (let i = translations.length - 1; i >= 0; i--) {
188
+ const translation = translations[i];
189
+ const localizedTranslation = translation[usedLanguage];
190
+ if (!localizedTranslation) {
191
+ continue;
192
+ }
193
+ const value = localizedTranslation[key];
194
+ if (!value) {
195
+ continue;
196
+ }
197
+ let forProcessing;
198
+ if (typeof value !== "string") {
199
+ if (count === TranslationPluralCount.zero && value?.zero) {
200
+ forProcessing = value.zero;
201
+ } else if (count === TranslationPluralCount.one && value?.one) {
202
+ forProcessing = value.one;
203
+ } else if (count === TranslationPluralCount.two && value?.two) {
204
+ forProcessing = value.two;
205
+ } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {
206
+ forProcessing = value.few;
207
+ } else if (count > TranslationPluralCount.many && value?.many) {
208
+ forProcessing = value.many;
209
+ } else {
210
+ forProcessing = value.other;
211
+ }
212
+ } else {
213
+ forProcessing = value;
214
+ }
215
+ forProcessing = forProcessing.replace(/\{\{(\w+)}}/g, (_, placeholder) => {
216
+ return replacements[placeholder] ?? `{{key:${placeholder}}}`;
217
+ });
218
+ return forProcessing;
219
+ }
220
+ } catch (e) {
221
+ console.error(e);
222
+ }
223
+ return `{{${usedLanguage}:${key}}}`;
224
+ };
225
+ };
226
+
227
+ // src/util/writeToClipboard.ts
228
+ var writeToClipboard = (text) => {
229
+ return navigator.clipboard.writeText(text);
230
+ };
231
+
232
+ // src/components/user-action/CopyToClipboardWrapper.tsx
233
+ var import_lucide_react = require("lucide-react");
234
+ var import_jsx_runtime2 = require("react/jsx-runtime");
235
+ var CopyToClipboardWrapper = ({
236
+ children,
237
+ textToCopy,
238
+ tooltipClassName = "",
239
+ containerClassName = "",
240
+ position = "bottom",
241
+ zIndex = 10
242
+ }) => {
243
+ const translation = useTranslation([formTranslation]);
244
+ const [isShowingIndication, setIsShowingIndication] = (0, import_react3.useState)(false);
245
+ const [isShowingConfirmation, setIsShowingConfirmation] = (0, import_react3.useState)(false);
246
+ const positionClasses = {
247
+ top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,
248
+ bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,
249
+ left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,
250
+ right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`
251
+ };
252
+ const triangleSize = 6;
253
+ const triangleClasses = {
254
+ top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,
255
+ bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,
256
+ left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,
257
+ right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`
258
+ };
259
+ const triangleStyle = {
260
+ top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },
261
+ bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },
262
+ left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },
263
+ right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }
264
+ };
265
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
266
+ "div",
267
+ {
268
+ className: (0, import_clsx.clsx)("relative inline-block cursor-copy", containerClassName),
269
+ onMouseEnter: () => {
270
+ setIsShowingIndication(true);
271
+ },
272
+ onMouseLeave: () => {
273
+ setIsShowingIndication(false);
274
+ setIsShowingConfirmation(false);
275
+ },
276
+ onClick: () => {
277
+ writeToClipboard(textToCopy).catch(console.error);
278
+ setIsShowingIndication(false);
279
+ setIsShowingConfirmation(true);
280
+ },
281
+ children: [
282
+ children,
283
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
284
+ "div",
285
+ {
286
+ className: (0, import_clsx.clsx)(
287
+ `absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap
288
+ shadow-around-md bg-tooltip-background cursor-default pointer-events-none`,
289
+ "transition-opacity duration-200",
290
+ positionClasses[position],
291
+ tooltipClassName
292
+ ),
293
+ style: {
294
+ zIndex,
295
+ opacity: isShowingIndication || isShowingConfirmation ? 1 : 0
296
+ },
297
+ children: [
298
+ isShowingConfirmation && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "row gap-x-1", children: [
299
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.CheckIcon, { size: 16, className: "text-positive" }),
300
+ translation("copied")
301
+ ] }),
302
+ isShowingIndication && /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "row gap-x-1 text-description", children: [
303
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react.Copy, { size: 16 }),
304
+ translation("clickToCopy")
305
+ ] }),
306
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
307
+ "div",
308
+ {
309
+ className: (0, import_clsx.clsx)(`absolute w-0 h-0`, triangleClasses[position]),
310
+ style: { ...triangleStyle[position], zIndex: zIndex + 1 }
311
+ }
312
+ )
313
+ ]
314
+ }
315
+ )
316
+ ]
317
+ }
318
+ );
319
+ };
320
+ // Annotate the CommonJS export names for ESM import in node:
321
+ 0 && (module.exports = {
322
+ CopyToClipboardWrapper
323
+ });
324
+ //# sourceMappingURL=CopyToClipboardWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/user-action/CopyToClipboardWrapper.tsx","../../../src/localization/defaults/form.ts","../../../src/localization/LanguageProvider.tsx","../../../src/hooks/useLocalStorage.ts","../../../src/localization/util.ts","../../../src/localization/useTranslation.ts","../../../src/util/writeToClipboard.ts"],"sourcesContent":["import type { CSSProperties, PropsWithChildren } from 'react'\nimport { useState } from 'react'\nimport { clsx } from 'clsx'\nimport type { FormTranslationType } from '../../localization/defaults/form'\nimport { formTranslation } from '../../localization/defaults/form'\nimport { useTranslation } from '../../localization/useTranslation'\nimport { writeToClipboard } from '../../util/writeToClipboard'\nimport { CheckIcon, Copy } from 'lucide-react'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\ntype CopyToClipboardWrapperTranslationType = FormTranslationType\n\nexport type CopyToClipboardWrapperProps = PropsWithChildren<{\n textToCopy: string,\n /**\n * Class names of additional styling properties for the tooltip\n */\n tooltipClassName?: string,\n /**\n * Class names of additional styling properties for the container from which the tooltip will be created\n */\n containerClassName?: string,\n position?: Position,\n zIndex?: number,\n}>\n\n/**\n * A Component for showing a tooltip when hovering over Content\n * @param tooltip The tooltip to show can be a text or any ReactNode\n * @param children The Content for which the tooltip should be created\n * @param tooltipClassName Additional ClassNames for the Container of the tooltip\n * @param containerClassName Additional ClassNames for the Container holding the content\n * @param position The direction of the tooltip relative to the Container\n * @param zIndex The z Index of the tooltip (you may require this when stacking modal)\n * @constructor\n */\nexport const CopyToClipboardWrapper = ({\n children,\n textToCopy,\n tooltipClassName = '',\n containerClassName = '',\n position = 'bottom',\n zIndex = 10,\n }: CopyToClipboardWrapperProps) => {\n const translation = useTranslation<CopyToClipboardWrapperTranslationType>([formTranslation])\n const [isShowingIndication, setIsShowingIndication] = useState(false)\n const [isShowingConfirmation, setIsShowingConfirmation] = useState(false)\n\n const positionClasses = {\n top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,\n bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,\n left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,\n right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`\n }\n\n const triangleSize = 6\n const triangleClasses = {\n top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,\n bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,\n left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,\n right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`\n }\n\n const triangleStyle: Record<Position, CSSProperties> = {\n top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },\n bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },\n left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },\n right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }\n }\n\n return (\n <div\n className={clsx('relative inline-block cursor-copy', containerClassName)}\n onMouseEnter={() => {\n setIsShowingIndication(true)\n }}\n onMouseLeave={() => {\n setIsShowingIndication(false)\n setIsShowingConfirmation(false)\n }}\n onClick={() => {\n writeToClipboard(textToCopy).catch(console.error)\n setIsShowingIndication(false)\n setIsShowingConfirmation(true)\n }}\n >\n {children}\n <div\n className={clsx(\n `absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap\n shadow-around-md bg-tooltip-background cursor-default pointer-events-none`,\n 'transition-opacity duration-200',\n positionClasses[position],\n tooltipClassName\n )}\n style={{\n zIndex,\n opacity: (isShowingIndication || isShowingConfirmation) ? 1 : 0,\n }}\n >\n {isShowingConfirmation && (\n <div className=\"row gap-x-1\">\n <CheckIcon size={16} className=\"text-positive\"/>\n {translation('copied')}\n </div>\n )}\n {isShowingIndication && (\n <div className=\"row gap-x-1 text-description\">\n <Copy size={16}/>\n {translation('clickToCopy')}\n </div>\n )}\n <div\n className={clsx(`absolute w-0 h-0`, triangleClasses[position])}\n style={{ ...triangleStyle[position], zIndex: zIndex + 1 }}\n />\n </div>\n </div>\n )\n}\n","import type { Translation } from '../useTranslation'\n\nexport type FormTranslationType = {\n all: string,\n apply: string,\n back: string,\n cancel: string,\n change: string,\n clear: string,\n click: string,\n clickToCopy: string,\n close: string,\n confirm: string,\n copy: string,\n copied: string,\n decline: string,\n delete: string,\n discard: string,\n discardChanges: string,\n done: string,\n edit: string,\n enterText: string,\n error: string,\n exit: string,\n fieldRequiredError: string,\n invalidEmailError: string,\n less: string,\n loading: string,\n maxLengthError: string,\n minLengthError: string,\n more: string,\n next: string,\n no: string,\n none: string,\n of: string,\n optional: string,\n pleaseWait: string,\n previous: string,\n remove: string,\n required: string,\n reset: string,\n save: string,\n saved: string,\n search: string,\n select: string,\n selectOption: string,\n show: string,\n showMore: string,\n showLess: string,\n submit: string,\n success: string,\n unsavedChanges: string,\n unsavedChangesSaveQuestion: string,\n update: string,\n yes: string,\n}\n\nexport const formTranslation: Translation<FormTranslationType> = {\n en: {\n all: 'All',\n apply: 'Apply',\n back: 'Back',\n cancel: 'Cancel',\n change: 'Change',\n clear: 'Clear',\n click: 'Click',\n clickToCopy: 'Click to Copy',\n close: 'Close',\n confirm: 'Confirm',\n copy: 'Copy',\n copied: 'Copied',\n decline: 'Decline',\n delete: 'Delete',\n discard: 'Discard',\n discardChanges: 'Discard Changes',\n done: 'Done',\n edit: 'Edit',\n enterText: 'Enter text here',\n error: 'Error',\n exit: 'Exit',\n fieldRequiredError: 'This field is required.',\n invalidEmailError: 'Please enter a valid email address.',\n less: 'Less',\n loading: 'Loading',\n maxLengthError: 'Maximum length exceeded.',\n minLengthError: 'Minimum length not met.',\n more: 'More',\n next: 'Next',\n no: 'No',\n none: 'None',\n of: 'of',\n optional: 'Optional',\n pleaseWait: 'Please wait...',\n previous: 'Previous',\n remove: 'Remove',\n required: 'Required',\n reset: 'Reset',\n save: 'Save',\n saved: 'Saved',\n search: 'Search',\n select: 'Select',\n selectOption: 'Select an option',\n show: 'Show',\n showMore: 'Show more',\n showLess: 'Show less',\n submit: 'Submit',\n success: 'Success',\n update: 'Update',\n unsavedChanges: 'Unsaved Changes',\n unsavedChangesSaveQuestion: 'Do you want to save your changes?',\n yes: 'Yes',\n },\n de: {\n all: 'Alle',\n apply: 'Anwenden',\n back: 'Zurück',\n cancel: 'Abbrechen',\n change: 'Ändern',\n clear: 'Löschen',\n click: 'Klicken',\n clickToCopy: 'Zum kopieren klicken',\n close: 'Schließen',\n confirm: 'Bestätigen',\n copy: 'Kopieren',\n copied: 'Kopiert',\n decline: 'Ablehnen',\n delete: 'Löschen',\n discard: 'Verwerfen',\n discardChanges: 'Änderungen Verwerfen',\n done: 'Fertig',\n edit: 'Bearbeiten',\n enterText: 'Text hier eingeben',\n error: 'Fehler',\n exit: 'Beenden',\n fieldRequiredError: 'Dieses Feld ist erforderlich.',\n invalidEmailError: 'Bitte geben Sie eine gültige E-Mail-Adresse ein.',\n less: 'Weniger',\n loading: 'Lädt',\n maxLengthError: 'Maximale Länge überschritten.',\n minLengthError: 'Mindestlänge nicht erreicht.',\n more: 'Mehr',\n next: 'Weiter',\n no: 'Nein',\n none: 'Nichts',\n of: 'von',\n optional: 'Optional',\n pleaseWait: 'Bitte warten...',\n previous: 'Vorherige',\n remove: 'Entfernen',\n required: 'Erforderlich',\n reset: 'Zurücksetzen',\n save: 'Speichern',\n saved: 'Gespeichert',\n search: 'Suche',\n select: 'Select',\n selectOption: 'Option auswählen',\n show: 'Anzeigen',\n showMore: 'Mehr anzeigen',\n showLess: 'Weniger anzeigen',\n submit: 'Abschicken',\n success: 'Erfolg',\n update: 'Update',\n unsavedChanges: 'Ungespeicherte Änderungen',\n unsavedChangesSaveQuestion: 'Möchtest du die Änderungen speichern?',\n yes: 'Ja',\n }\n}\n","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n // TODO set locale of html tag here as well\n setStoredLanguage(language)\n }, [language, setStoredLanguage])\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","import type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { LocalStorageService } from '../util/storage'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(value => {\n const newValue = value instanceof Function ? value(storedValue) : value\n const storageService = new LocalStorageService()\n storageService.set(key, value)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n useEffect(() => {\n setStoredValue(get())\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\n/**\n * A type describing the pluralization of a word\n */\nexport type TranslationPlural = {\n zero?: string,\n one?: string,\n two?: string,\n few?: string,\n many?: string,\n other: string,\n}\n\n/**\n * The type describing all values of a translation\n */\nexport type TranslationType = Record<string, string | TranslationPlural>\n\n/**\n * The type of translations\n */\nexport type Translation<T extends TranslationType> = Record<Language, T>\n\ntype OverwriteTranslationType<T extends TranslationType> = {\n language?: Language,\n translation?: Translation<Partial<T>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends TranslationType,\n Props = unknown\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n}\n\ntype StringKeys<T> = Extract<keyof T, string>;\n\ntype TranslationFunctionOptions = {\n replacements?: Record<string, string>,\n count?: number,\n}\ntype TranslationFunction<T extends TranslationType> = (key: StringKeys<T>, options?: TranslationFunctionOptions) => string\n\nexport const TranslationPluralCount = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 11,\n other: -1,\n}\n\n\nexport const useTranslation = <T extends TranslationType>(\n translations: Translation<Partial<TranslationType>>[],\n overwriteTranslation: OverwriteTranslationType<T> = {}\n): TranslationFunction<T> => {\n const { language: languageProp, translation: overwrite } = overwriteTranslation\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n const usedTranslations = [...translations]\n if (overwrite) {\n usedTranslations.push(overwrite)\n }\n\n return (key: StringKeys<T>, options?: TranslationFunctionOptions): string => {\n const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options }\n\n try {\n for (let i = translations.length - 1; i >= 0; i--) {\n const translation = translations[i]\n const localizedTranslation = translation[usedLanguage]\n if (!localizedTranslation) {\n continue\n }\n const value = localizedTranslation[key]\n if(!value) {\n continue\n }\n\n let forProcessing: string\n if (typeof value !== 'string') {\n if (count === TranslationPluralCount.zero && value?.zero) {\n forProcessing = value.zero\n } else if (count === TranslationPluralCount.one && value?.one) {\n forProcessing = value.one\n } else if (count === TranslationPluralCount.two && value?.two) {\n forProcessing = value.two\n } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {\n forProcessing = value.few\n } else if (count > TranslationPluralCount.many && value?.many) {\n forProcessing = value.many\n } else {\n forProcessing = value.other\n }\n } else {\n forProcessing = value\n }\n forProcessing = forProcessing.replace(/\\{\\{(\\w+)}}/g, (_, placeholder) => {\n return replacements[placeholder] ?? `{{key:${placeholder}}}` // fallback if key is missing\n })\n return forProcessing\n }\n } catch (e) {\n console.error(e)\n }\n return `{{${usedLanguage}:${key}}}`\n }\n}","export const writeToClipboard = (text: string) => {\n return navigator.clipboard.writeText(text)\n}"],"mappings":"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","names":["import_react","import_react","import_jsx_runtime"]}
@@ -0,0 +1,300 @@
1
+ // src/components/user-action/CopyToClipboardWrapper.tsx
2
+ import { useState as useState3 } from "react";
3
+ import { clsx } from "clsx";
4
+
5
+ // src/localization/defaults/form.ts
6
+ var formTranslation = {
7
+ en: {
8
+ all: "All",
9
+ apply: "Apply",
10
+ back: "Back",
11
+ cancel: "Cancel",
12
+ change: "Change",
13
+ clear: "Clear",
14
+ click: "Click",
15
+ clickToCopy: "Click to Copy",
16
+ close: "Close",
17
+ confirm: "Confirm",
18
+ copy: "Copy",
19
+ copied: "Copied",
20
+ decline: "Decline",
21
+ delete: "Delete",
22
+ discard: "Discard",
23
+ discardChanges: "Discard Changes",
24
+ done: "Done",
25
+ edit: "Edit",
26
+ enterText: "Enter text here",
27
+ error: "Error",
28
+ exit: "Exit",
29
+ fieldRequiredError: "This field is required.",
30
+ invalidEmailError: "Please enter a valid email address.",
31
+ less: "Less",
32
+ loading: "Loading",
33
+ maxLengthError: "Maximum length exceeded.",
34
+ minLengthError: "Minimum length not met.",
35
+ more: "More",
36
+ next: "Next",
37
+ no: "No",
38
+ none: "None",
39
+ of: "of",
40
+ optional: "Optional",
41
+ pleaseWait: "Please wait...",
42
+ previous: "Previous",
43
+ remove: "Remove",
44
+ required: "Required",
45
+ reset: "Reset",
46
+ save: "Save",
47
+ saved: "Saved",
48
+ search: "Search",
49
+ select: "Select",
50
+ selectOption: "Select an option",
51
+ show: "Show",
52
+ showMore: "Show more",
53
+ showLess: "Show less",
54
+ submit: "Submit",
55
+ success: "Success",
56
+ update: "Update",
57
+ unsavedChanges: "Unsaved Changes",
58
+ unsavedChangesSaveQuestion: "Do you want to save your changes?",
59
+ yes: "Yes"
60
+ },
61
+ de: {
62
+ all: "Alle",
63
+ apply: "Anwenden",
64
+ back: "Zur\xFCck",
65
+ cancel: "Abbrechen",
66
+ change: "\xC4ndern",
67
+ clear: "L\xF6schen",
68
+ click: "Klicken",
69
+ clickToCopy: "Zum kopieren klicken",
70
+ close: "Schlie\xDFen",
71
+ confirm: "Best\xE4tigen",
72
+ copy: "Kopieren",
73
+ copied: "Kopiert",
74
+ decline: "Ablehnen",
75
+ delete: "L\xF6schen",
76
+ discard: "Verwerfen",
77
+ discardChanges: "\xC4nderungen Verwerfen",
78
+ done: "Fertig",
79
+ edit: "Bearbeiten",
80
+ enterText: "Text hier eingeben",
81
+ error: "Fehler",
82
+ exit: "Beenden",
83
+ fieldRequiredError: "Dieses Feld ist erforderlich.",
84
+ invalidEmailError: "Bitte geben Sie eine g\xFCltige E-Mail-Adresse ein.",
85
+ less: "Weniger",
86
+ loading: "L\xE4dt",
87
+ maxLengthError: "Maximale L\xE4nge \xFCberschritten.",
88
+ minLengthError: "Mindestl\xE4nge nicht erreicht.",
89
+ more: "Mehr",
90
+ next: "Weiter",
91
+ no: "Nein",
92
+ none: "Nichts",
93
+ of: "von",
94
+ optional: "Optional",
95
+ pleaseWait: "Bitte warten...",
96
+ previous: "Vorherige",
97
+ remove: "Entfernen",
98
+ required: "Erforderlich",
99
+ reset: "Zur\xFCcksetzen",
100
+ save: "Speichern",
101
+ saved: "Gespeichert",
102
+ search: "Suche",
103
+ select: "Select",
104
+ selectOption: "Option ausw\xE4hlen",
105
+ show: "Anzeigen",
106
+ showMore: "Mehr anzeigen",
107
+ showLess: "Weniger anzeigen",
108
+ submit: "Abschicken",
109
+ success: "Erfolg",
110
+ update: "Update",
111
+ unsavedChanges: "Ungespeicherte \xC4nderungen",
112
+ unsavedChangesSaveQuestion: "M\xF6chtest du die \xC4nderungen speichern?",
113
+ yes: "Ja"
114
+ }
115
+ };
116
+
117
+ // src/localization/LanguageProvider.tsx
118
+ import { createContext, useContext, useEffect as useEffect2, useState as useState2 } from "react";
119
+
120
+ // src/hooks/useLocalStorage.ts
121
+ import { useCallback, useEffect, useState } from "react";
122
+
123
+ // src/localization/util.ts
124
+ var languages = ["en", "de"];
125
+ var languagesLocalNames = {
126
+ en: "English",
127
+ de: "Deutsch"
128
+ };
129
+ var DEFAULT_LANGUAGE = "en";
130
+ var LanguageUtil = {
131
+ languages,
132
+ DEFAULT_LANGUAGE,
133
+ languagesLocalNames
134
+ };
135
+
136
+ // src/localization/LanguageProvider.tsx
137
+ import { jsx } from "react/jsx-runtime";
138
+ var LanguageContext = createContext({
139
+ language: LanguageUtil.DEFAULT_LANGUAGE,
140
+ setLanguage: (v) => v
141
+ });
142
+ var useLanguage = () => useContext(LanguageContext);
143
+
144
+ // src/localization/useTranslation.ts
145
+ var TranslationPluralCount = {
146
+ zero: 0,
147
+ one: 1,
148
+ two: 2,
149
+ few: 3,
150
+ many: 11,
151
+ other: -1
152
+ };
153
+ var useTranslation = (translations, overwriteTranslation = {}) => {
154
+ const { language: languageProp, translation: overwrite } = overwriteTranslation;
155
+ const { language: inferredLanguage } = useLanguage();
156
+ const usedLanguage = languageProp ?? inferredLanguage;
157
+ const usedTranslations = [...translations];
158
+ if (overwrite) {
159
+ usedTranslations.push(overwrite);
160
+ }
161
+ return (key, options) => {
162
+ const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options };
163
+ try {
164
+ for (let i = translations.length - 1; i >= 0; i--) {
165
+ const translation = translations[i];
166
+ const localizedTranslation = translation[usedLanguage];
167
+ if (!localizedTranslation) {
168
+ continue;
169
+ }
170
+ const value = localizedTranslation[key];
171
+ if (!value) {
172
+ continue;
173
+ }
174
+ let forProcessing;
175
+ if (typeof value !== "string") {
176
+ if (count === TranslationPluralCount.zero && value?.zero) {
177
+ forProcessing = value.zero;
178
+ } else if (count === TranslationPluralCount.one && value?.one) {
179
+ forProcessing = value.one;
180
+ } else if (count === TranslationPluralCount.two && value?.two) {
181
+ forProcessing = value.two;
182
+ } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {
183
+ forProcessing = value.few;
184
+ } else if (count > TranslationPluralCount.many && value?.many) {
185
+ forProcessing = value.many;
186
+ } else {
187
+ forProcessing = value.other;
188
+ }
189
+ } else {
190
+ forProcessing = value;
191
+ }
192
+ forProcessing = forProcessing.replace(/\{\{(\w+)}}/g, (_, placeholder) => {
193
+ return replacements[placeholder] ?? `{{key:${placeholder}}}`;
194
+ });
195
+ return forProcessing;
196
+ }
197
+ } catch (e) {
198
+ console.error(e);
199
+ }
200
+ return `{{${usedLanguage}:${key}}}`;
201
+ };
202
+ };
203
+
204
+ // src/util/writeToClipboard.ts
205
+ var writeToClipboard = (text) => {
206
+ return navigator.clipboard.writeText(text);
207
+ };
208
+
209
+ // src/components/user-action/CopyToClipboardWrapper.tsx
210
+ import { CheckIcon, Copy } from "lucide-react";
211
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
212
+ var CopyToClipboardWrapper = ({
213
+ children,
214
+ textToCopy,
215
+ tooltipClassName = "",
216
+ containerClassName = "",
217
+ position = "bottom",
218
+ zIndex = 10
219
+ }) => {
220
+ const translation = useTranslation([formTranslation]);
221
+ const [isShowingIndication, setIsShowingIndication] = useState3(false);
222
+ const [isShowingConfirmation, setIsShowingConfirmation] = useState3(false);
223
+ const positionClasses = {
224
+ top: `bottom-full left-1/2 -translate-x-1/2 mb-[6px]`,
225
+ bottom: `top-full left-1/2 -translate-x-1/2 mt-[6px]`,
226
+ left: `right-full top-1/2 -translate-y-1/2 mr-[6px]`,
227
+ right: `left-full top-1/2 -translate-y-1/2 ml-[6px]`
228
+ };
229
+ const triangleSize = 6;
230
+ const triangleClasses = {
231
+ top: `top-full left-1/2 -translate-x-1/2 border-t-tooltip-background border-l-transparent border-r-transparent`,
232
+ bottom: `bottom-full left-1/2 -translate-x-1/2 border-b-tooltip-background border-l-transparent border-r-transparent`,
233
+ left: `left-full top-1/2 -translate-y-1/2 border-l-tooltip-background border-t-transparent border-b-transparent`,
234
+ right: `right-full top-1/2 -translate-y-1/2 border-r-tooltip-background border-t-transparent border-b-transparent`
235
+ };
236
+ const triangleStyle = {
237
+ top: { borderWidth: `${triangleSize}px ${triangleSize}px 0 ${triangleSize}px` },
238
+ bottom: { borderWidth: `0 ${triangleSize}px ${triangleSize}px ${triangleSize}px` },
239
+ left: { borderWidth: `${triangleSize}px 0 ${triangleSize}px ${triangleSize}px` },
240
+ right: { borderWidth: `${triangleSize}px ${triangleSize}px ${triangleSize}px 0` }
241
+ };
242
+ return /* @__PURE__ */ jsxs(
243
+ "div",
244
+ {
245
+ className: clsx("relative inline-block cursor-copy", containerClassName),
246
+ onMouseEnter: () => {
247
+ setIsShowingIndication(true);
248
+ },
249
+ onMouseLeave: () => {
250
+ setIsShowingIndication(false);
251
+ setIsShowingConfirmation(false);
252
+ },
253
+ onClick: () => {
254
+ writeToClipboard(textToCopy).catch(console.error);
255
+ setIsShowingIndication(false);
256
+ setIsShowingConfirmation(true);
257
+ },
258
+ children: [
259
+ children,
260
+ /* @__PURE__ */ jsxs(
261
+ "div",
262
+ {
263
+ className: clsx(
264
+ `absolute text-xs font-semibold text-tooltip-text px-2 py-1 rounded whitespace-nowrap
265
+ shadow-around-md bg-tooltip-background cursor-default pointer-events-none`,
266
+ "transition-opacity duration-200",
267
+ positionClasses[position],
268
+ tooltipClassName
269
+ ),
270
+ style: {
271
+ zIndex,
272
+ opacity: isShowingIndication || isShowingConfirmation ? 1 : 0
273
+ },
274
+ children: [
275
+ isShowingConfirmation && /* @__PURE__ */ jsxs("div", { className: "row gap-x-1", children: [
276
+ /* @__PURE__ */ jsx2(CheckIcon, { size: 16, className: "text-positive" }),
277
+ translation("copied")
278
+ ] }),
279
+ isShowingIndication && /* @__PURE__ */ jsxs("div", { className: "row gap-x-1 text-description", children: [
280
+ /* @__PURE__ */ jsx2(Copy, { size: 16 }),
281
+ translation("clickToCopy")
282
+ ] }),
283
+ /* @__PURE__ */ jsx2(
284
+ "div",
285
+ {
286
+ className: clsx(`absolute w-0 h-0`, triangleClasses[position]),
287
+ style: { ...triangleStyle[position], zIndex: zIndex + 1 }
288
+ }
289
+ )
290
+ ]
291
+ }
292
+ )
293
+ ]
294
+ }
295
+ );
296
+ };
297
+ export {
298
+ CopyToClipboardWrapper
299
+ };
300
+ //# sourceMappingURL=CopyToClipboardWrapper.mjs.map