diff --git a/shared/css/static/modal-newcomer.scss b/shared/css/static/modal-newcomer.scss index 03632a1b..b6da49eb 100644 --- a/shared/css/static/modal-newcomer.scss +++ b/shared/css/static/modal-newcomer.scss @@ -14,7 +14,7 @@ html:root { padding: 0!important; min-width: 20em; - width: 50em; + width: 60em; @include user-select(none); @@ -70,6 +70,8 @@ html:root { @include chat-scrollbar-horizontal(); @include chat-scrollbar-vertical(); + background-color: #19191b; + .body { display: flex; flex-direction: column; @@ -86,7 +88,7 @@ html:root { &.step-welcome, &.step-finish { display: flex; flex-direction: row; - justify-content: stretch; + justify-content: center; .text { align-self: center; @@ -119,7 +121,7 @@ html:root { } /* for step-identity or step-microphone */ - .container-settings-identity-profile, .container-settings-audio-microphone { + .container-settings-identity-profile { padding: .5em; .left .body { @@ -136,8 +138,6 @@ html:root { &.step-identity { } - &.step-microphone { } - &.hidden { display: none; } diff --git a/shared/html/templates/modal/newcomer.html b/shared/html/templates/modal/newcomer.html index 005cd09d..5ae1f1cf 100644 --- a/shared/html/templates/modal/newcomer.html +++ b/shared/html/templates/modal/newcomer.html @@ -37,9 +37,7 @@ {{tr "It is save to exit this guide at any point and directly jump ahead using the client." /}} -
- {{include tmpl="tmpl_settings-microphone" /}} -
+
{{include tmpl="tmpl_settings-profiles" /}}
diff --git a/shared/js/ui/modal/ModalNewcomer.ts b/shared/js/ui/modal/ModalNewcomer.tsx similarity index 64% rename from shared/js/ui/modal/ModalNewcomer.ts rename to shared/js/ui/modal/ModalNewcomer.tsx index cefea293..4da7189a 100644 --- a/shared/js/ui/modal/ModalNewcomer.ts +++ b/shared/js/ui/modal/ModalNewcomer.tsx @@ -5,6 +5,10 @@ import { modal as emodal } from "tc-shared/events"; import {modal_settings} from "tc-shared/ui/modal/ModalSettings"; import {profiles} from "tc-shared/profiles/ConnectionProfile"; import {spawnYesNo} from "tc-shared/ui/modal/ModalYesNo"; +import {initialize_audio_microphone_controller, MicrophoneSettingsEvents} from "tc-shared/ui/modal/settings/Microphone"; +import {MicrophoneSettings} from "tc-shared/ui/modal/settings/MicrophoneRenderer"; +import * as React from "react"; +import * as ReactDOM from "react-dom"; const next_step: {[key: string]:string} = { "welcome": "microphone", @@ -69,7 +73,7 @@ function initializeBasicFunctionality(tag: JQuery, event_registry: Registry { + button_last_step.on('click', () => { if(last_step[current_step]) event_registry.fire("show_step", { step: last_step[current_step] as any }); else @@ -100,8 +104,8 @@ function initializeBasicFunctionality(tag: JQuery, event_registry: Registry button_next_step.prop("disabled", true)); - event_registry.on("show_step", event => button_last_step.prop("disabled", true)); + event_registry.on("show_step", () => button_next_step.prop("disabled", true)); + event_registry.on("show_step", () => button_last_step.prop("disabled", true)); event_registry.on("step-status", event => button_next_step.prop("disabled", !event.next_button)); event_registry.on("step-status", event => button_last_step.prop("disabled", !event.previous_button)); @@ -292,145 +296,28 @@ function initializeStepIdentity(tag: JQuery, event_registry: Registry, modal: Modal) { - const microphone_events = new Registry(); - //microphone_events.enable_debug("settings-microphone"); - //modal_settings.initialize_audio_microphone_controller(microphone_events); - //modal_settings.initialize_audio_microphone_view(tag, microphone_events); - modal.close_listener.push(() => microphone_events.fire_async("deinitialize")); + let helpStep = 0; - let help_animation_done = false; - const update_step_status = () => event_registry.fire_async("step-status", { next_button: help_animation_done, previous_button: help_animation_done }); - event_registry.on("show_step", e => { - if(e.step !== "microphone") return; + const settingEvents = new Registry(); + settingEvents.on("query_help", () => settingEvents.fire_async("notify_highlight", { field: helpStep <= 2 ? ("hs-" + helpStep) as any : undefined })); + settingEvents.on("action_help_click", () => { + helpStep++; + settingEvents.fire("query_help"); - update_step_status(); + event_registry.fire_async("step-status", { next_button: helpStep > 2, previous_button: helpStep > 2 }) }); - /* the help sequence */ - { - const container = tag.find(".container-settings-audio-microphone"); - const container_help_text = tag.find(".container-help-text"); + initialize_audio_microphone_controller(settingEvents); + ReactDOM.render(, tag[0]); - const container_profile_list = tag.find(".highlight-microphone-list"); - const container_profile_settings = tag.find(".highlight-microphone-settings"); + modal.close_listener.push(() => { + settingEvents.fire("notify_destroy"); + ReactDOM.unmountComponentAtNode(tag[0]); + }); - let is_first_show = true; - event_registry.on("show_step", event => { - if(!is_first_show || event.step !== "microphone") return; - is_first_show = false; - container.addClass("help-shown"); - const text = tr( /* @tr-ignore */ - "Firstly we need to setup a microphone.\n" + - "Let me guide you thru the basic UI elements.\n" + - "\n" + - "To continue click anywhere on the screen." - ); - set_help_text(text); - $("body").one('mousedown', event => show_microphone_list_help()); - }); - - const set_help_text = text => { - container_help_text.empty(); - text.split("\n").forEach(e => container_help_text.append(e == "" ? $.spawn("br") : $.spawn("a").text(e))); - }; - - const show_microphone_list_help = () => { - container.find(".highlighted").removeClass("highlighted"); - container_profile_list.addClass("highlighted"); - - const update_position = () => { - const font_size = parseFloat(getComputedStyle(container_help_text[0]).fontSize); - - const offset = container_profile_list.offset(); - const abs = container.offset(); - - container_help_text.css({ - top: offset.top - abs.top, - left: ((offset.left - abs.left) + container_profile_list.outerWidth() + font_size) + "px", - right: "1em", - bottom: "1em" - }); - }; - update_position(); - container_help_text.off('resize').on('resize', update_position); - - const text = tr( /* @tr-ignore */ - "All your available microphones are listed within this box.\n" + - "\n" + - "The currently selected microphone\n" + - "is marked with a green checkmark. To change the selected microphone\n" + - "just click on the new one.\n" + - "\n" + - "To continue click anywhere on the screen." - ); - set_help_text(text); - $("body").one('mousedown', event => show_microphone_settings_help()); - }; - - const show_microphone_settings_help = () => { - container.find(".highlighted").removeClass("highlighted"); - container_profile_settings.addClass("highlighted"); - - const update_position = () => { - const font_size = parseFloat(getComputedStyle(container_help_text[0]).fontSize); - const container_settings_offset = container_profile_settings.offset(); - const right = container_profile_settings.outerWidth() + font_size * 2; - container_help_text.css({ - top: container_settings_offset.top - container.offset().top, - left: "1em", - right: right + "px", - bottom: "1em" - }); - }; - - container_help_text.empty(); - container_help_text.append($.spawn("div").addClass("help-microphone-settings").append( - $.spawn("a").text(tr("On the right side you'll find all microphone settings.")), - $.spawn("br"), - $.spawn("a").text("TeaSpeak has three voice activity detection types:"), - $.spawn("ol").append( - $.spawn("li").addClass("vad-type").append( - $.spawn("a").addClass("title").text(tr("Push to Talk")), - $.spawn("a").addClass("description").html(tr( /* @tr-ignore */ - "To transmit audio data you'll have to
" + - "press a key. The key could be selected " + - "via the button right to the radio button." - )) - ), - $.spawn("li").addClass("vad-type").append( - $.spawn("a").addClass("title").text(tr("Voice activity detection")), - $.spawn("a").addClass("description").html(tr( /* @tr-ignore */ - "In this mode, TeaSpeak will continuously analyze your microphone input. " + - "If the audio level is grater than a certain threshold, " + - "the audio will be transmitted. " + - "The threshold is changeable via the \"Sensitivity Settings\" slider." - )) - ), - $.spawn("li").addClass("vad-type").append( - $.spawn("a").addClass("title").html(tr("Always active")), - $.spawn("a").addClass("description").text(tr( /* @tr-ignore */ - "Continuously transmit any audio data.\n" - )) - ) - ), - $.spawn("br"), - $.spawn("a").text(tr("Now you're ready to configure your microphone. Just click anywhere on the screen.")) - )); - update_position(); - container_help_text.off('resize').on('resize', update_position); - - $("body").one('mousedown', event => hide_help()); - }; - - const hide_help = () => { - container.find(".highlighted").removeClass("highlighted"); - container.addClass("hide-help"); - setTimeout(() => container.removeClass("help-shown"), 1000); - container_help_text.off('resize'); - - help_animation_done = true; - update_step_status(); - }; - } + event_registry.on("show_step", event => { + if(event.step !== "microphone") return; + event_registry.fire_async("step-status", { next_button: helpStep > 2, previous_button: helpStep > 2 }); + }); } \ No newline at end of file diff --git a/shared/js/ui/modal/settings/Heighlight.scss b/shared/js/ui/modal/settings/Heighlight.scss new file mode 100644 index 00000000..9a3a0ef7 --- /dev/null +++ b/shared/js/ui/modal/settings/Heighlight.scss @@ -0,0 +1,115 @@ +@import "../../../../css/static/mixin.scss"; +@import "../../../../css/static/properties.scss"; + +.container { + $highlight-time: .5s; + $backdrop-color: rgba(0, 0, 0, .9); + + display: flex; + position: relative; + + padding: .5em; + + background-color: inherit; + + .background { + position: absolute; + + top: 0; + left: 0; + right: 0; + bottom: 0; + + display: none; + background-color: $backdrop-color; + border-radius: .15em; + + padding: .5em; + } + + /* + .highlightable { + display: flex; + } + */ + + .helpText { + opacity: 0; + z-index: 20; + + pointer-events: none; + + display: block; + + overflow: auto; + @include chat-scrollbar(); + @include transition($highlight-time ease-in-out); + + a { + display: block; + } + + ol { + margin-top: .5em; + margin-bottom: 0; + } + + li { + margin-bottom: .5em; + + .title { + font-weight: bold; + } + } + + &.shown { + opacity: 1; + pointer-events: initial; + + @include transition($highlight-time ease-in-out); + } + } + + &.shown { + .background { + display: flex; + z-index: 1; + + opacity: 1; + } + + .highlightable { + border-radius: .1em; + position: relative; + z-index: 10; + + background-color: inherit; + + @include transition($highlight-time ease-in-out); + + &::after { + content: ' '; + + z-index: 5; + position: absolute; + + top: 0; + left: 0; + right: 0; + bottom: 0; + + background-color: $backdrop-color; + + @include transition($highlight-time ease-in-out); + } + + &.highlighted { + padding: .5em; + + &::after { + background-color: #00000000; + } + } + } + } +} \ No newline at end of file diff --git a/shared/js/ui/modal/settings/Heighlight.tsx b/shared/js/ui/modal/settings/Heighlight.tsx new file mode 100644 index 00000000..3f7da0e2 --- /dev/null +++ b/shared/js/ui/modal/settings/Heighlight.tsx @@ -0,0 +1,38 @@ +import * as React from "react"; +import {useContext} from "react"; + +const cssStyle = require("./Heighlight.scss"); + +const HighlightContext = React.createContext(undefined); +export const HighlightContainer = (props: { children: React.ReactNode | React.ReactNode[], highlightedId?: string, onClick?: () => void }) => { + return ( + +
+ {props.children} +
+
+ + ); +}; + +export const HighlightRegion = (props: React.HTMLProps & { highlightId: string } ) => { + const wProps = Object.assign({}, props); + delete wProps["highlightId"]; + + const highlightedId = useContext(HighlightContext); + const highlighted = highlightedId === props.highlightId; + + wProps.className = (props.className || "") + " " + cssStyle.highlightable + " " + (highlighted ? cssStyle.highlighted : ""); + return React.createElement("div", wProps); +}; + +export const HighlightText = (props: { highlightId: string, className?: string, children?: React.ReactNode | React.ReactNode[] } ) => { + const highlightedId = useContext(HighlightContext); + const highlighted = highlightedId === props.highlightId; + + return ( +
+ {props.children} +
+ ) +}; \ No newline at end of file diff --git a/shared/js/ui/modal/settings/Microphone.scss b/shared/js/ui/modal/settings/Microphone.scss index d1b4446e..317a7343 100644 --- a/shared/js/ui/modal/settings/Microphone.scss +++ b/shared/js/ui/modal/settings/Microphone.scss @@ -11,6 +11,7 @@ min-width: 43em; min-height: 41em; + background-color: inherit; position: relative; .left, .right { @@ -588,6 +589,20 @@ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#70407e', endColorstr='#45407e',GradientType=1 ); /* IE6-9 */ } +/* The help overlays */ +.help { + position: absolute; + + top: 0; + left: 0; + right: 0; + bottom: 0; + + &.paddingTop { + padding-top: 3.6em; + } +} + @-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg); } } \ No newline at end of file diff --git a/shared/js/ui/modal/settings/Microphone.tsx b/shared/js/ui/modal/settings/Microphone.tsx index d6afcc79..bf98037d 100644 --- a/shared/js/ui/modal/settings/Microphone.tsx +++ b/shared/js/ui/modal/settings/Microphone.tsx @@ -24,11 +24,12 @@ export type MicrophoneDevice = { export interface MicrophoneSettingsEvents { "query_devices": { refresh_list: boolean }, - + "query_help": {}, "query_setting": { setting: MicrophoneSetting }, + "action_help_click": {}, "action_request_permissions": {}, "action_set_selected_device": { deviceId: string }, "action_set_selected_device_result": { @@ -70,6 +71,10 @@ export interface MicrophoneSettingsEvents { status: Exclude }, + notify_highlight: { + field: "hs-0" | "hs-1" | "hs-2" | undefined + } + notify_destroy: {} } @@ -310,7 +315,6 @@ export function initialize_audio_microphone_controller(events: Registry { @@ -341,5 +345,4 @@ loader.register_task(Stage.LOADED, { }); }, priority: -2 -}) -*/ \ No newline at end of file +}) \ No newline at end of file diff --git a/shared/js/ui/modal/settings/MicrophoneRenderer.tsx b/shared/js/ui/modal/settings/MicrophoneRenderer.tsx index 2ad2fb7c..ce7bd58a 100644 --- a/shared/js/ui/modal/settings/MicrophoneRenderer.tsx +++ b/shared/js/ui/modal/settings/MicrophoneRenderer.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import {Translatable} from "tc-shared/ui/react-elements/i18n"; import {Button} from "tc-shared/ui/react-elements/Button"; -import {modal, Registry} from "tc-shared/events"; +import {Registry} from "tc-shared/events"; import {MicrophoneDevice, MicrophoneSettingsEvents} from "tc-shared/ui/modal/settings/Microphone"; import {useEffect, useRef, useState} from "react"; import {ClientIconRenderer} from "tc-shared/ui/react-elements/Icons"; @@ -16,6 +16,7 @@ import {spawnKeySelect} from "tc-shared/ui/modal/ModalKeySelect"; import {Checkbox} from "tc-shared/ui/react-elements/Checkbox"; import {BoxedInputField} from "tc-shared/ui/react-elements/InputField"; import {IDevice} from "tc-shared/audio/recorder"; +import {HighlightContainer, HighlightRegion, HighlightText} from "./Heighlight"; const cssStyle = require("./Microphone.scss"); @@ -157,7 +158,6 @@ const MicrophoneList = (props: { events: Registry }) = }); const [ selectedDevice, setSelectedDevice ] = useState<{ deviceId: string, mode: "selected" | "selecting" }>(); const [ deviceList, setDeviceList ] = useState([]); - const [ error, setError ] = useState(undefined); props.events.reactUse("notify_devices", event => { setSelectedDevice(undefined); @@ -202,7 +202,7 @@ const MicrophoneList = (props: { events: Registry }) =
Please grant access to your microphone. @@ -506,37 +506,109 @@ const ThresholdSelector = (props: { events: Registry } ) }; -export const MicrophoneSettings = (props: { events: Registry }) => ( -
-
-
- Select your Microphone Device - +const HelpText0 = () => ( + + + Firstly we need to setup a microphone.
+ Let me guide you thru the basic UI elements.
+
+ To continue click anywhere on the screen. +
+
+); + +const HelpText1 = () => ( + + + All your available microphones are listed within this box.
+
+ The currently selected microphone
+ is marked with a green checkmark. To change the selected microphone
+ just click on the new one.
+
+ To continue click anywhere on the screen. +
+
+); + +const HelpText2 = () => ( + + + TeaSpeak has three voice activity detection types: + +
    +
  1. + + To transmit audio data you'll have to
    + press a key. The key could be selected via the button right to the radio button +
    +
  2. +
  3. + + In this mode, TeaSpeak will continuously analyze your microphone input. + If the audio level is grater than a certain threshold, + the audio will be transmitted. + The threshold is changeable via the "Sensitivity Settings" slider + +
  4. +
  5. + Continuously transmit any audio data. +
  6. +
+ + + Now you're ready to configure your microphone.
+ Just click anywhere on the screen. +
+
+
+); + +export const MicrophoneSettings = (props: { events: Registry }) => { + const [ highlighted, setHighlighted ] = useState(() => { + props.events.fire("query_help"); + return undefined; + }); + + props.events.reactUse("notify_highlight", event => setHighlighted(event.field)); + + return ( + props.events.fire("action_help_click")}> +
+ + + + + + + + + +
+ + +
+ +
+ +
+ +
+
+ +
+
+
- -
-
- -
- - -
- -
- -
- -
-
- -
-
-
-
-) \ No newline at end of file + + ); +} \ No newline at end of file diff --git a/shared/svg-sprites/client-icons.d.ts b/shared/svg-sprites/client-icons.d.ts index 78ef4593..d6d53744 100644 --- a/shared/svg-sprites/client-icons.d.ts +++ b/shared/svg-sprites/client-icons.d.ts @@ -3,9 +3,9 @@ * * This file has been auto generated by the svg-sprite generator. * Sprite source directory: D:\TeaSpeak\web\shared\img\client-icons - * Sprite count: 203 + * Sprite count: 202 */ -export type ClientIconClass = "client-about" | "client-activate_microphone" | "client-add" | "client-add_foe" | "client-add_folder" | "client-add_friend" | "client-addon-collection" | "client-addon" | "client-apply" | "client-arrow_down" | "client-arrow_left" | "client-arrow_right" | "client-arrow_up" | "client-away" | "client-ban_client" | "client-ban_list" | "client-bookmark_add" | "client-bookmark_add_folder" | "client-bookmark_duplicate" | "client-bookmark_manager" | "client-bookmark_remove" | "client-broken_image" | "client-browse-addon-online" | "client-capture-denied" | "client-capture" | "client-change_nickname" | "client-changelog" | "client-channel_chat" | "client-channel_collapse_all" | "client-channel_commander" | "client-channel_create" | "client-channel_create_sub" | "client-channel_default" | "client-channel_delete" | "client-channel_edit" | "client-channel_expand_all" | "client-channel_green" | "client-channel_green_subscribed" | "client-channel_green_subscribed2" | "client-channel_private" | "client-channel_red" | "client-channel_red_subscribed" | "client-channel_switch" | "client-channel_unsubscribed" | "client-channel_yellow" | "client-channel_yellow_subscribed" | "client-check_update" | "client-client_hide" | "client-client_show" | "client-close_button" | "client-complaint_list" | "client-conflict-icon" | "client-connect" | "client-contact" | "client-copy" | "client-copy_url" | "client-d_sound" | "client-d_sound_me" | "client-d_sound_user" | "client-default" | "client-default_for_all_bookmarks" | "client-delete" | "client-delete_avatar" | "client-disconnect" | "client-down" | "client-download" | "client-edit" | "client-edit_friend_foe_status" | "client-emoticon" | "client-error" | "client-file_home" | "client-file_refresh" | "client-filetransfer" | "client-find" | "client-folder" | "client-folder_up" | "client-group_100" | "client-group_200" | "client-group_300" | "client-group_500" | "client-group_600" | "client-guisetup" | "client-hardware_input_muted" | "client-hardware_output_muted" | "client-home" | "client-hoster_button" | "client-hotkeys" | "client-icon-pack" | "client-iconsview" | "client-iconviewer" | "client-identity_default" | "client-identity_export" | "client-identity_import" | "client-identity_manager" | "client-info" | "client-input_muted" | "client-input_muted_local" | "client-invite_buddy" | "client-is_talker" | "client-kick_channel" | "client-kick_server" | "client-listview" | "client-loading_image" | "client-message_incoming" | "client-message_info" | "client-message_outgoing" | "client-messages" | "client-microphone_broken" | "client-minimize_button" | "client-moderated" | "client-move_client_to_own_channel" | "client-music" | "client-new_chat" | "client-notifications" | "client-offline_messages" | "client-on_whisperlist" | "client-output_muted" | "client-permission_channel" | "client-permission_client" | "client-permission_overview" | "client-permission_server_groups" | "client-phoneticsnickname" | "client-ping_1" | "client-ping_2" | "client-ping_3" | "client-ping_4" | "client-ping_calculating" | "client-ping_disconnected" | "client-play" | "client-player_chat" | "client-player_commander_off" | "client-player_commander_on" | "client-player_off" | "client-player_on" | "client-player_whisper" | "client-plugins" | "client-poke" | "client-present" | "client-recording_start" | "client-recording_stop" | "client-refresh" | "client-register" | "client-reload" | "client-remove_foe" | "client-remove_friend" | "client-security" | "client-selectfolder" | "client-send_complaint" | "client-server_green" | "client-server_log" | "client-server_query" | "client-settings" | "client-sort_by_name" | "client-sound-pack" | "client-soundpack" | "client-stop" | "client-subscribe_mode" | "client-subscribe_to_all_channels" | "client-subscribe_to_channel" | "client-subscribe_to_channel_family" | "client-switch_advanced" | "client-switch_standard" | "client-sync-disable" | "client-sync-enable" | "client-sync-icon" | "client-tab_close_button" | "client-talk_power_grant" | "client-talk_power_grant_next" | "client-talk_power_request" | "client-talk_power_request_cancel" | "client-talk_power_revoke" | "client-talk_power_revoke_all_grant_next" | "client-temp_server_password" | "client-temp_server_password_add" | "client-textformat" | "client-textformat_bold" | "client-textformat_foreground" | "client-textformat_italic" | "client-textformat_underline" | "client-theme" | "client-toggle_server_query_clients" | "client-toggle_whisper" | "client-token" | "client-token_use" | "client-translation" | "client-unsubscribe_from_all_channels" | "client-unsubscribe_from_channel_family" | "client-unsubscribe_mode" | "client-up" | "client-upload" | "client-upload_avatar" | "client-urlcatcher" | "client-user-account" | "client-virtualserver_edit" | "client-volume" | "client-w2g" | "client-warning" | "client-warning_external_link" | "client-warning_info" | "client-warning_question" | "client-weblist" | "client-whisper" | "client-whisperlists"; +export type ClientIconClass = "client-about" | "client-activate_microphone" | "client-add" | "client-add_foe" | "client-add_folder" | "client-add_friend" | "client-addon-collection" | "client-addon" | "client-apply" | "client-arrow_down" | "client-arrow_left" | "client-arrow_right" | "client-arrow_up" | "client-away" | "client-ban_client" | "client-ban_list" | "client-bookmark_add" | "client-bookmark_add_folder" | "client-bookmark_duplicate" | "client-bookmark_manager" | "client-bookmark_remove" | "client-broken_image" | "client-browse-addon-online" | "client-capture" | "client-change_nickname" | "client-changelog" | "client-channel_chat" | "client-channel_collapse_all" | "client-channel_commander" | "client-channel_create" | "client-channel_create_sub" | "client-channel_default" | "client-channel_delete" | "client-channel_edit" | "client-channel_expand_all" | "client-channel_green" | "client-channel_green_subscribed" | "client-channel_green_subscribed2" | "client-channel_private" | "client-channel_red" | "client-channel_red_subscribed" | "client-channel_switch" | "client-channel_unsubscribed" | "client-channel_yellow" | "client-channel_yellow_subscribed" | "client-check_update" | "client-client_hide" | "client-client_show" | "client-close_button" | "client-complaint_list" | "client-conflict-icon" | "client-connect" | "client-contact" | "client-copy" | "client-copy_url" | "client-d_sound" | "client-d_sound_me" | "client-d_sound_user" | "client-default" | "client-default_for_all_bookmarks" | "client-delete" | "client-delete_avatar" | "client-disconnect" | "client-down" | "client-download" | "client-edit" | "client-edit_friend_foe_status" | "client-emoticon" | "client-error" | "client-file_home" | "client-file_refresh" | "client-filetransfer" | "client-find" | "client-folder" | "client-folder_up" | "client-group_100" | "client-group_200" | "client-group_300" | "client-group_500" | "client-group_600" | "client-guisetup" | "client-hardware_input_muted" | "client-hardware_output_muted" | "client-home" | "client-hoster_button" | "client-hotkeys" | "client-icon-pack" | "client-iconsview" | "client-iconviewer" | "client-identity_default" | "client-identity_export" | "client-identity_import" | "client-identity_manager" | "client-info" | "client-input_muted" | "client-input_muted_local" | "client-invite_buddy" | "client-is_talker" | "client-kick_channel" | "client-kick_server" | "client-listview" | "client-loading_image" | "client-message_incoming" | "client-message_info" | "client-message_outgoing" | "client-messages" | "client-microphone_broken" | "client-minimize_button" | "client-moderated" | "client-move_client_to_own_channel" | "client-music" | "client-new_chat" | "client-notifications" | "client-offline_messages" | "client-on_whisperlist" | "client-output_muted" | "client-permission_channel" | "client-permission_client" | "client-permission_overview" | "client-permission_server_groups" | "client-phoneticsnickname" | "client-ping_1" | "client-ping_2" | "client-ping_3" | "client-ping_4" | "client-ping_calculating" | "client-ping_disconnected" | "client-play" | "client-player_chat" | "client-player_commander_off" | "client-player_commander_on" | "client-player_off" | "client-player_on" | "client-player_whisper" | "client-plugins" | "client-poke" | "client-present" | "client-recording_start" | "client-recording_stop" | "client-refresh" | "client-register" | "client-reload" | "client-remove_foe" | "client-remove_friend" | "client-security" | "client-selectfolder" | "client-send_complaint" | "client-server_green" | "client-server_log" | "client-server_query" | "client-settings" | "client-sort_by_name" | "client-sound-pack" | "client-soundpack" | "client-stop" | "client-subscribe_mode" | "client-subscribe_to_all_channels" | "client-subscribe_to_channel" | "client-subscribe_to_channel_family" | "client-switch_advanced" | "client-switch_standard" | "client-sync-disable" | "client-sync-enable" | "client-sync-icon" | "client-tab_close_button" | "client-talk_power_grant" | "client-talk_power_grant_next" | "client-talk_power_request" | "client-talk_power_request_cancel" | "client-talk_power_revoke" | "client-talk_power_revoke_all_grant_next" | "client-temp_server_password" | "client-temp_server_password_add" | "client-textformat" | "client-textformat_bold" | "client-textformat_foreground" | "client-textformat_italic" | "client-textformat_underline" | "client-theme" | "client-toggle_server_query_clients" | "client-toggle_whisper" | "client-token" | "client-token_use" | "client-translation" | "client-unsubscribe_from_all_channels" | "client-unsubscribe_from_channel_family" | "client-unsubscribe_mode" | "client-up" | "client-upload" | "client-upload_avatar" | "client-urlcatcher" | "client-user-account" | "client-virtualserver_edit" | "client-volume" | "client-w2g" | "client-warning" | "client-warning_external_link" | "client-warning_info" | "client-warning_question" | "client-weblist" | "client-whisper" | "client-whisperlists"; export enum ClientIcon { About = "client-about", @@ -31,7 +31,6 @@ export enum ClientIcon { BookmarkRemove = "client-bookmark_remove", BrokenImage = "client-broken_image", BrowseAddonOnline = "client-browse-addon-online", - CaptureDenied = "client-capture-denied", Capture = "client-capture", ChangeNickname = "client-change_nickname", Changelog = "client-changelog",