iobroker.eusec 0.8.2

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.
@@ -0,0 +1,93 @@
1
+ declare let systemDictionary: Record<string, Record<string, string>>;
2
+
3
+ declare let load: (settings: Record<string, unknown>, onChange: (hasChanges: boolean) => void) => void;
4
+ declare let save: (callback: (settings: Record<string, unknown>) => void) => void;
5
+
6
+ // make load and save exist on the window object
7
+ interface Window {
8
+ load: typeof load;
9
+ save: typeof save;
10
+ }
11
+
12
+ declare const instance: number;
13
+ declare const adapter: string;
14
+ /** Translates text */
15
+ declare function _(text: string): string;
16
+ declare const socket: ioBrokerSocket;
17
+ declare function sendTo(
18
+ instance: any | null,
19
+ command: string,
20
+ message: any,
21
+ callback: (result: SendToResult) => void | Promise<void>,
22
+ ): void;
23
+
24
+ interface SendToResult {
25
+ error?: string | Error;
26
+ result?: any;
27
+ }
28
+
29
+ // tslint:disable-next-line:class-name
30
+ interface ioBrokerSocket {
31
+ emit(
32
+ command: "subscribeObjects",
33
+ pattern: string,
34
+ callback?: (err?: string) => void | Promise<void>,
35
+ ): void;
36
+ emit(
37
+ command: "subscribeStates",
38
+ pattern: string,
39
+ callback?: (err?: string) => void | Promise<void>,
40
+ ): void;
41
+ emit(
42
+ command: "unsubscribeObjects",
43
+ pattern: string,
44
+ callback?: (err?: string) => void | Promise<void>,
45
+ ): void;
46
+ emit(
47
+ command: "unsubscribeStates",
48
+ pattern: string,
49
+ callback?: (err?: string) => void | Promise<void>,
50
+ ): void;
51
+
52
+ emit(
53
+ event: "getObjectView",
54
+ view: "system",
55
+ type: "device",
56
+ options: ioBroker.GetObjectViewParams,
57
+ callback: (
58
+ err: string | undefined,
59
+ result?: any,
60
+ ) => void | Promise<void>,
61
+ ): void;
62
+ emit(
63
+ event: "getStates",
64
+ callback: (
65
+ err: string | undefined,
66
+ result?: Record<string, any>,
67
+ ) => void,
68
+ ): void;
69
+ emit(
70
+ event: "getState",
71
+ id: string,
72
+ callback: (err: string | undefined, result?: ioBroker.State) => void,
73
+ ): void;
74
+ emit(
75
+ event: "setState",
76
+ id: string,
77
+ state: unknown,
78
+ callback: (err: string | undefined, result?: any) => void,
79
+ ): void;
80
+
81
+ on(event: "objectChange", handler: ioBroker.ObjectChangeHandler): void;
82
+ on(event: "stateChange", handler: ioBroker.StateChangeHandler): void;
83
+ removeEventHandler(
84
+ event: "objectChange",
85
+ handler: ioBroker.ObjectChangeHandler,
86
+ ): void;
87
+ removeEventHandler(
88
+ event: "stateChange",
89
+ handler: ioBroker.StateChangeHandler,
90
+ ): void;
91
+
92
+ // TODO: other events
93
+ }
Binary file
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Haupteinstellungen",
3
+ "Authentication settings": "Authentifizierungseinstellungen",
4
+ "Username": "Benutzername",
5
+ "Password": "Passwort",
6
+ "Other settings": "Andere Einstellungen",
7
+ "Polling interval (min)": "Abfrageintervall (min)",
8
+ "Time in seconds before event reset": "Zeit in Sekunden vor dem Zurücksetzen des Ereignisses",
9
+ "P2P connection type": "P2P-Verbindungstyp",
10
+ "Prefer local connection": "Lokale Verbindung bevorzugen",
11
+ "Only local connection": "Nur lokale Verbindung",
12
+ "Quickest connection": "Schnellste Verbindung",
13
+ "Accept incoming invitations": "Eingehende Einladungen annehmen",
14
+ "Alarm sound duration (sec)": "Dauer des Alarmtons (Sek.)",
15
+ "Livestream settings": "Livestream-Einstellungen",
16
+ "Max camera livestream duration (sec)": "Maximale Livestream-Dauer der Kamera (Sek.)",
17
+ "Automatically download video": "Automatisches Herunterladen von Videos"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Main settings",
3
+ "Authentication settings": "Authentication settings",
4
+ "Username": "Username",
5
+ "Password": "Password",
6
+ "Other settings": "Other settings",
7
+ "Polling interval (min)": "Polling interval (min)",
8
+ "Time in seconds before event reset": "Time in seconds before event reset",
9
+ "P2P connection type": "P2P connection type",
10
+ "Prefer local connection": "Prefer local connection",
11
+ "Only local connection": "Only local connection",
12
+ "Quickest connection": "Quickest connection",
13
+ "Accept incoming invitations": "Accept incoming invitations",
14
+ "Alarm sound duration (sec)": "Alarm sound duration (sec)",
15
+ "Livestream settings": "Livestream settings",
16
+ "Max camera livestream duration (sec)": "Max camera livestream duration (sec)",
17
+ "Automatically download video": "Automatically download video"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Ajustes principales",
3
+ "Authentication settings": "Configuración de autenticación",
4
+ "Username": "Nombre de usuario",
5
+ "Password": "Contraseña",
6
+ "Other settings": "Otros ajustes",
7
+ "Polling interval (min)": "Intervalo de sondeo (min)",
8
+ "Time in seconds before event reset": "Tiempo en segundos antes del reinicio del evento",
9
+ "P2P connection type": "Tipo de conexión P2P",
10
+ "Prefer local connection": "Prefiero la conexión local",
11
+ "Only local connection": "Solo conexión local",
12
+ "Quickest connection": "Conexión más rápida",
13
+ "Accept incoming invitations": "Aceptar invitaciones entrantes",
14
+ "Alarm sound duration (sec)": "Duración del sonido de la alarma (s)",
15
+ "Livestream settings": "Configuración de transmisión en vivo",
16
+ "Max camera livestream duration (sec)": "Duración máxima de la transmisión en vivo de la cámara (segundos)",
17
+ "Automatically download video": "Descarga automática de vídeo"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Réglages principaux",
3
+ "Authentication settings": "Paramètres d'authentification",
4
+ "Username": "Nom d'utilisateur",
5
+ "Password": "Mot de passe",
6
+ "Other settings": "Autres réglages",
7
+ "Polling interval (min)": "Intervalle d'interrogation (min)",
8
+ "Time in seconds before event reset": "Temps en secondes avant la réinitialisation de l'événement",
9
+ "P2P connection type": "Type de connexion P2P",
10
+ "Prefer local connection": "Préférer une connexion locale",
11
+ "Only local connection": "Uniquement connexion locale",
12
+ "Quickest connection": "Connexion la plus rapide",
13
+ "Accept incoming invitations": "Accepter les invitations entrantes",
14
+ "Alarm sound duration (sec)": "Durée du son de l'alarme (sec)",
15
+ "Livestream settings": "Paramètres de diffusion en direct",
16
+ "Max camera livestream duration (sec)": "Durée maximale de la diffusion en direct de la caméra (s)",
17
+ "Automatically download video": "Téléchargement automatique de la vidéo"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Impostazioni principali",
3
+ "Authentication settings": "Impostazioni di autenticazione",
4
+ "Username": "Nome utente",
5
+ "Password": "Password",
6
+ "Other settings": "Altre impostazioni",
7
+ "Polling interval (min)": "Intervallo di polling (min)",
8
+ "Time in seconds before event reset": "Tempo in secondi prima del ripristino dell'evento",
9
+ "P2P connection type": "Tipo di connessione P2P",
10
+ "Prefer local connection": "Preferire la connessione locale",
11
+ "Only local connection": "Solo connessione locale",
12
+ "Quickest connection": "Connessione più veloce",
13
+ "Accept incoming invitations": "Accetta inviti in arrivo",
14
+ "Alarm sound duration (sec)": "Durata del suono dell'allarme (sec)",
15
+ "Livestream settings": "Impostazioni live streaming",
16
+ "Max camera livestream duration (sec)": "Durata massima del live streaming della videocamera (sec)",
17
+ "Automatically download video": "Scarica automaticamente il video"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Belangrijkste instellingen",
3
+ "Authentication settings": "Authenticatie-instellingen",
4
+ "Username": "Gebruikersnaam",
5
+ "Password": "Wachtwoord",
6
+ "Other settings": "Andere instellingen",
7
+ "Polling interval (min)": "Polling-interval (min)",
8
+ "Time in seconds before event reset": "Tijd in seconden voordat de gebeurtenis wordt gereset",
9
+ "P2P connection type": "P2P-verbindingstype",
10
+ "Prefer local connection": "Voorkeur voor lokale verbinding",
11
+ "Only local connection": "Alleen lokale verbinding",
12
+ "Quickest connection": "Snelste verbinding",
13
+ "Accept incoming invitations": "Accepteer inkomende uitnodigingen",
14
+ "Alarm sound duration (sec)": "Duur alarmgeluid (sec)",
15
+ "Livestream settings": "Livestream-instellingen",
16
+ "Max camera livestream duration (sec)": "Max. Duur livestream camera (sec)",
17
+ "Automatically download video": "Video automatisch downloaden"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Ustawienia główne",
3
+ "Authentication settings": "Ustawienia uwierzytelniania",
4
+ "Username": "Nazwa użytkownika",
5
+ "Password": "Hasło",
6
+ "Other settings": "Inne ustawienia",
7
+ "Polling interval (min)": "Okres odpytywania (min)",
8
+ "Time in seconds before event reset": "Czas w sekundach do zresetowania zdarzenia",
9
+ "P2P connection type": "Typ połączenia P2P",
10
+ "Prefer local connection": "Preferowane połączenie lokalne",
11
+ "Only local connection": "Tylko połączenie lokalne",
12
+ "Quickest connection": "Najszybsze połączenie",
13
+ "Accept incoming invitations": "Przyjmowanie zaproszeń przychodzących",
14
+ "Alarm sound duration (sec)": "Czas trwania dźwięku alarmu (sek.)",
15
+ "Livestream settings": "Ustawienia transmisji na żywo",
16
+ "Max camera livestream duration (sec)": "Maksymalny czas trwania transmisji na żywo z kamery (s)",
17
+ "Automatically download video": "Automatycznie pobieraj wideo"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Configurações principais",
3
+ "Authentication settings": "Configurações de autenticação",
4
+ "Username": "Nome de usuário",
5
+ "Password": "Senha",
6
+ "Other settings": "Outros ajustes",
7
+ "Polling interval (min)": "Intervalo de sondagem (min)",
8
+ "Time in seconds before event reset": "Tempo em segundos antes da redefinição do evento",
9
+ "P2P connection type": "Tipo de conexão P2P",
10
+ "Prefer local connection": "Preferir conexão local",
11
+ "Only local connection": "Apenas conexão local",
12
+ "Quickest connection": "Conexão mais rápida",
13
+ "Accept incoming invitations": "Aceitar os convites recebidos",
14
+ "Alarm sound duration (sec)": "Duração do som do alarme (seg)",
15
+ "Livestream settings": "Configurações de transmissão ao vivo",
16
+ "Max camera livestream duration (sec)": "Duração máxima da transmissão ao vivo da câmera (segundos)",
17
+ "Automatically download video": "Descarregar vídeo automaticamente"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "Основные параметры",
3
+ "Authentication settings": "Настройки аутентификации",
4
+ "Username": "Имя пользователя",
5
+ "Password": "Пароль",
6
+ "Other settings": "Другие настройки",
7
+ "Polling interval (min)": "Интервал опроса (мин)",
8
+ "Time in seconds before event reset": "Время в секундах до сброса события",
9
+ "P2P connection type": "Тип подключения P2P",
10
+ "Prefer local connection": "Предпочитает местное подключение",
11
+ "Only local connection": "Только локальное подключение",
12
+ "Quickest connection": "Самое быстрое соединение",
13
+ "Accept incoming invitations": "Принимать входящие приглашения",
14
+ "Alarm sound duration (sec)": "Длительность звукового сигнала тревоги (сек)",
15
+ "Livestream settings": "Настройки прямой трансляции",
16
+ "Max camera livestream duration (sec)": "Максимальная продолжительность прямой трансляции с камеры (сек)",
17
+ "Automatically download video": "Автоматическая загрузка видео"
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "Main settings": "主要设定",
3
+ "Authentication settings": "验证设定",
4
+ "Username": "帳號",
5
+ "Password": "密码",
6
+ "Other settings": "其他设定",
7
+ "Polling interval (min)": "轮询间隔(分钟)",
8
+ "Time in seconds before event reset": "事件重置之前的时间(以秒为单位)",
9
+ "P2P connection type": "P2P连接类型",
10
+ "Prefer local connection": "倾向于本地连接",
11
+ "Only local connection": "仅本地连接",
12
+ "Quickest connection": "最快的连接",
13
+ "Accept incoming invitations": "接受收到的邀请",
14
+ "Alarm sound duration (sec)": "警报声持续时间(秒",
15
+ "Livestream settings": "直播设置",
16
+ "Max camera livestream duration (sec)": "相机直播的最大持续时间(秒)",
17
+ "Automatically download video": "自动下载视频"
18
+ }
@@ -0,0 +1,156 @@
1
+ <html>
2
+
3
+ <head>
4
+
5
+ <!-- Load ioBroker scripts and styles-->
6
+ <link rel="stylesheet" type="text/css" href="../../css/adapter.css" />
7
+ <link rel="stylesheet" type="text/css" href="../../lib/css/materialize.css">
8
+
9
+ <script type="text/javascript" src="../../lib/js/jquery-3.2.1.min.js"></script>
10
+ <script type="text/javascript" src="../../socket.io/socket.io.js"></script>
11
+
12
+ <script type="text/javascript" src="../../js/translate.js"></script>
13
+ <script type="text/javascript" src="../../lib/js/materialize.js"></script>
14
+ <script type="text/javascript" src="../../js/adapter-settings.js"></script>
15
+
16
+ <!-- Load our own files -->
17
+ <link rel="stylesheet" type="text/css" href="style.css" />
18
+ <script type="text/javascript" src="words.js"></script>
19
+
20
+ <script type="text/javascript">
21
+ // This will be called by the admin adapter when the settings page loads
22
+ function load(settings, onChange) {
23
+ // example: select elements with id=key and class=value and insert value
24
+ if (!settings) return;
25
+ $('.value').each(function () {
26
+ var $key = $(this);
27
+ var id = $key.attr('id');
28
+ if ($key.attr('type') === 'checkbox') {
29
+ // do not call onChange direct, because onChange could expect some arguments
30
+ $key.prop('checked', settings[id])
31
+ .on('change', () => onChange())
32
+ ;
33
+ } else {
34
+ // do not call onChange direct, because onChange could expect some arguments
35
+ $key.val(settings[id])
36
+ .on('change', () => onChange())
37
+ .on('keyup', () => onChange())
38
+ ;
39
+ }
40
+ });
41
+ onChange(false);
42
+ // reinitialize all the Materialize labels on the page if you are dynamically adding inputs:
43
+ if (M) M.updateTextFields();
44
+ }
45
+
46
+ // This will be called by the admin adapter when the user presses the save button
47
+ function save(callback) {
48
+ // example: select elements with class=value and build settings object
49
+ var obj = {};
50
+ $('.value').each(function () {
51
+ var $this = $(this);
52
+ if ($this.attr('type') === 'checkbox') {
53
+ obj[$this.attr('id')] = $this.prop('checked');
54
+ } else if ($this.attr('type') === 'number') {
55
+ obj[$this.attr('id')] = parseFloat($this.val());
56
+ } else {
57
+ obj[$this.attr('id')] = $this.val();
58
+ }
59
+ });
60
+ callback(obj);
61
+ }
62
+ </script>
63
+ <style>
64
+ .sub-title {
65
+ margin-top: 2rem!important;
66
+ padding: 0.5rem;
67
+ background: #64b5f6;
68
+ color: white;
69
+ }
70
+ </style>
71
+
72
+ </head>
73
+
74
+ <body>
75
+
76
+ <div class="m adapter-container">
77
+
78
+ <div class="row">
79
+ <div class="col s12">
80
+ <ul class="tabs">
81
+ <li class="tab col s2"><a href="#tab-main" class="translate active">Main settings</a></li>
82
+ <li class="tab col s2 live-settings"><a href="#tab-live" class="translate">Livestream settings</a></li>
83
+ </ul>
84
+ </div>
85
+ </div>
86
+
87
+ <div id="tab-main" class="col s12 page">
88
+
89
+ <div class="row">
90
+ <div class="col s12 m4 l2">
91
+ <img src="eufy-security.png" class="logo">
92
+ </div>
93
+ </div>
94
+
95
+ <h6 class="translate sub-title">Authentication settings</h6>
96
+ <div class="row">
97
+ <div class="col s6 l3 input-field">
98
+ <input type="text" class="value" id="username" />
99
+ <label for="username" class="translate">Username</label>
100
+ </div>
101
+
102
+ <div class="col s6 l3 input-field">
103
+ <input type="password" class="value" id="password" />
104
+ <label for="password" class="translate">Password</label>
105
+ </div>
106
+ </div>
107
+ <h6 class="translate sub-title">Other settings</h6>
108
+ <div class="row">
109
+ <div class="col s6 l2 input-field">
110
+ <input class="value" min="1" type="number" id="pollingInterval" />
111
+ <label for="pollingInterval" class="translate">Polling interval (min)</label>
112
+ </div>
113
+ <div class="col s6 l2 input-field">
114
+ <input class="value" min="1" max="120" type="number" id="eventDuration" />
115
+ <label for="eventDuration" class="translate">Time in seconds before event reset</label>
116
+ </div>
117
+ </div>
118
+ <div class="row">
119
+ <div class="input-field col s6 m2">
120
+ <select class="value" id="p2pConnectionType">
121
+ <option value="prefer_local" class="translate">Prefer local connection</option>
122
+ <option value="only_local" class="translate">Only local connection</option>
123
+ <option value="quickest" class="translate">Quickest connection</option>
124
+ </select>
125
+ <label for="p2pConnectionType" class="translate">P2P connection type</label>
126
+ </div>
127
+ <div class="input-field col m4 l3">
128
+ <input class="value" id="acceptInvitations" type="checkbox" />
129
+ <label for="acceptInvitations" class="translate">Accept incoming invitations</label>
130
+ </div>
131
+ <div class="input-field col m4 l3">
132
+ <input class="value" id="autoDownloadVideo" type="checkbox" />
133
+ <label for="autoDownloadVideo" class="translate">Automatically download video</label>
134
+ </div>
135
+ </div>
136
+ <div class="row">
137
+ <div class="col s6 l2 input-field">
138
+ <input class="value" min="1" type="number" id="alarmSoundDuration" />
139
+ <label for="alarmSoundDuration" class="translate">Alarm sound duration (sec)</label>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ <div id="tab-live" class="col s12 page">
144
+ <h6 class="translate sub-title">Settings</h6>
145
+ <div class="row">
146
+ <div class="input-field col s12 m6 l2">
147
+ <input class="value" min="15" max="300" type="number" id="maxLivestreamDuration" />
148
+ <label for="maxLivestreamDuration" class="translate">Max camera livestream duration (sec)</label>
149
+ </div>
150
+ </div>
151
+ </div>
152
+ </div>
153
+
154
+ </body>
155
+
156
+ </html>
@@ -0,0 +1,134 @@
1
+ {
2
+ "type": "tabs",
3
+ "i18n": true,
4
+ "items": {
5
+ "mainTab": {
6
+ "type": "panel",
7
+ "label": "Main settings",
8
+ "items": {
9
+ "authHeader": {
10
+ "type": "header",
11
+ "text": "Authentication settings",
12
+ "size": 1,
13
+ "xs": 12,
14
+ "sm": 12,
15
+ "md": 12,
16
+ "lg": 12
17
+ },
18
+ "username": {
19
+ "newLine": true,
20
+ "type": "text",
21
+ "label": "Username",
22
+ "xs": 12,
23
+ "sm": 12,
24
+ "md": 6,
25
+ "lg": 3
26
+ },
27
+ "password": {
28
+ "type": "password",
29
+ "label": "Password",
30
+ "repeat": true,
31
+ "visible": true,
32
+ "xs": 12,
33
+ "sm": 12,
34
+ "md": 8,
35
+ "lg": 6
36
+ },
37
+ "otherHeader": {
38
+ "newLine": true,
39
+ "type": "header",
40
+ "text": "Other settings",
41
+ "size": 1,
42
+ "xs": 12,
43
+ "sm": 12,
44
+ "md": 12,
45
+ "lg": 12
46
+ },
47
+ "pollingInterval": {
48
+ "newLine": true,
49
+ "type": "number",
50
+ "min": 1,
51
+ "label": "Polling interval (min)",
52
+ "xs": 12,
53
+ "sm": 12,
54
+ "md": 4,
55
+ "lg": 3
56
+ },
57
+ "eventDuration": {
58
+ "type": "number",
59
+ "min": 1,
60
+ "max": 120,
61
+ "label": "Time in seconds before event reset",
62
+ "xs": 12,
63
+ "sm": 12,
64
+ "md": 4,
65
+ "lg": 3
66
+ },
67
+ "alarmSoundDuration": {
68
+ "type": "number",
69
+ "min": 1,
70
+ "label": "Alarm sound duration (sec)",
71
+ "xs": 12,
72
+ "sm": 12,
73
+ "md": 4,
74
+ "lg": 3
75
+ },
76
+ "p2pConnectionType": {
77
+ "newLine": true,
78
+ "type": "select",
79
+ "label": "P2P connection type",
80
+ "options": [
81
+ {
82
+ "label": "Prefer local connection",
83
+ "value": "prefer_local"
84
+ },
85
+ {
86
+ "label": "Only local connection",
87
+ "value": "only_local"
88
+ },
89
+ {
90
+ "label": "Quickest connection",
91
+ "value": "quickest"
92
+ }
93
+ ],
94
+ "xs": 12,
95
+ "sm": 12,
96
+ "md": 4,
97
+ "lg": 3
98
+ },
99
+ "acceptInvitations": {
100
+ "newLine": true,
101
+ "type": "checkbox",
102
+ "label": "Accept incoming invitations",
103
+ "xs": 12,
104
+ "sm": 12,
105
+ "md": 6,
106
+ "lg": 3
107
+ },
108
+ "autoDownloadVideo": {
109
+ "newLine": true,
110
+ "type": "checkbox",
111
+ "label": "Automatically download video",
112
+ "xs": 12,
113
+ "sm": 12,
114
+ "md": 6,
115
+ "lg": 3
116
+ }
117
+ }
118
+ },
119
+ "liveTab": {
120
+ "type": "panel",
121
+ "label": "Livestream settings",
122
+ "items": {
123
+ "maxLivestreamDuration": {
124
+ "type": "number",
125
+ "label": "Max camera livestream duration (sec)",
126
+ "xs": 12,
127
+ "sm": 12,
128
+ "md": 4,
129
+ "lg": 3
130
+ }
131
+ }
132
+ }
133
+ }
134
+ }
@@ -0,0 +1,31 @@
1
+ /* You can delete those if you want. I just found them very helpful */
2
+ * {
3
+ box-sizing: border-box
4
+ }
5
+ .m {
6
+ /* Don't cut off dropdowns! */
7
+ overflow: initial;
8
+ }
9
+ .m.adapter-container {
10
+ /* Fix layout/scrolling issues with tabs */
11
+ height: 100%;
12
+ width: 100%;
13
+ position: relative;
14
+ }
15
+ .m .select-wrapper + label {
16
+ /* The positioning for dropdown labels is messed up */
17
+ transform: none !important;
18
+ }
19
+
20
+ label > i[title] {
21
+ /* Display the help cursor for the tooltip icons and fix their positioning */
22
+ cursor: help;
23
+ margin-left: 0.25em;
24
+ }
25
+
26
+ .dropdown-content {
27
+ /* Don't wrap text in dropdowns */
28
+ white-space: nowrap;
29
+ }
30
+
31
+ /* Add your styles here */