├── .dockerignore ├── public └── robots.txt ├── .npmrc ├── media ├── ui.png ├── appicon.icns ├── appicon.ico ├── appicon.png ├── screenshot.png └── docs │ ├── plugins │ ├── loader.png │ ├── directory.png │ └── manage-plugins.png │ └── architecture │ ├── client-server.png │ └── methodology.png ├── plugins ├── caspar │ ├── app │ │ ├── components │ │ │ ├── Select │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── Monaco │ │ │ │ └── style.css │ │ │ ├── LibraryList │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── ServerSelector │ │ │ │ └── style.css │ │ │ ├── EasingPreview │ │ │ │ └── style.css │ │ │ ├── ServerStatus │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── TemplateDataHeader │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── ThumbnailImage │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── ServerStatusBadge │ │ │ │ └── style.css │ │ │ ├── LiveSwitchControl │ │ │ │ ├── index.jsx │ │ │ │ └── style.css │ │ │ ├── LibraryHeader │ │ │ │ └── style.css │ │ │ ├── LibraryListItem │ │ │ │ └── style.css │ │ │ └── ServerInput │ │ │ │ └── style.css │ │ ├── index.jsx │ │ ├── assets │ │ │ └── icons │ │ │ │ ├── disconnected.svg │ │ │ │ ├── connected.svg │ │ │ │ └── error.svg │ │ ├── views │ │ │ ├── Status.jsx │ │ │ ├── LiveSwitch.jsx │ │ │ └── Settings.jsx │ │ └── style.css │ ├── lib │ │ ├── paths.js │ │ ├── error │ │ │ ├── CasparError.js │ │ │ ├── CommandError.js │ │ │ └── TcpSocketError.js │ │ └── CasparManager.js │ ├── webpack.config.js │ └── package.json ├── rundown │ ├── app │ │ ├── config.js │ │ ├── components │ │ │ ├── Layout │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── Icon │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── RundownItemTimeSection │ │ │ │ └── style.css │ │ │ ├── RundownItemIndicatorsSection │ │ │ │ └── style.css │ │ │ ├── RundownList │ │ │ │ └── style.css │ │ │ ├── RundownItemProgress │ │ │ │ └── style.css │ │ │ ├── RundownDividerItem │ │ │ │ ├── index.jsx │ │ │ │ └── style.css │ │ │ ├── RundownVariableItem │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ └── Header │ │ │ │ └── style.css │ │ ├── index.jsx │ │ ├── index.css │ │ ├── hooks │ │ │ └── useAsyncValue.js │ │ ├── assets │ │ │ └── icons │ │ │ │ ├── index.js │ │ │ │ ├── arrow-down.svg │ │ │ │ ├── arrow-down-secondary.svg │ │ │ │ ├── warning.svg │ │ │ │ └── arrow-down-play.svg │ │ ├── utils │ │ │ └── keyboard.js │ │ └── App.jsx │ ├── package-lock.json │ └── lib │ │ └── commands.js ├── types │ ├── app │ │ ├── components │ │ │ └── ReferenceButton │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ ├── style.css │ │ ├── index.jsx │ │ ├── App.jsx │ │ └── views │ │ │ └── InspectorReferenceButton.jsx │ ├── package-lock.json │ └── lib │ │ └── utils.js ├── inspector │ ├── app │ │ ├── components │ │ │ ├── BooleanInput │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── SelectInput │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── Icon │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── VariableHint │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── NoSelection │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── TextInput │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── VariableStringInput │ │ │ │ └── style.css │ │ │ ├── Accordion │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ └── StringInput │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ ├── storeContext.js │ │ ├── index.jsx │ │ ├── assets │ │ │ └── icons │ │ │ │ ├── index.js │ │ │ │ └── arrow-down.svg │ │ ├── sharedContext.js │ │ └── index.css │ ├── README.md │ ├── package-lock.json │ └── package.json ├── clock │ ├── app │ │ ├── components │ │ │ └── CurrentTime │ │ │ │ └── style.css │ │ ├── index.jsx │ │ └── style.css │ ├── package-lock.json │ └── package.json ├── button │ ├── app │ │ ├── style.css │ │ ├── index.jsx │ │ └── components │ │ │ ├── ItemButton │ │ │ ├── index.jsx │ │ │ └── style.css │ │ │ ├── ItemDropArea │ │ │ └── style.css │ │ │ └── QueryPath │ │ │ └── index.jsx │ ├── package-lock.json │ └── package.json ├── osc │ ├── app │ │ ├── components │ │ │ ├── TargetSelector │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── LogHeader │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ ├── LogItem │ │ │ │ ├── style.css │ │ │ │ └── index.jsx │ │ │ └── TargetInput │ │ │ │ └── style.css │ │ ├── index.jsx │ │ ├── style.css │ │ ├── App.jsx │ │ └── views │ │ │ └── Settings.jsx │ └── lib │ │ ├── paths.js │ │ ├── Transport.js │ │ ├── UDPClient.js │ │ ├── UDPTransport.js │ │ └── Server.js ├── state │ ├── README.md │ ├── app │ │ ├── index.jsx │ │ ├── components │ │ │ └── TreeView │ │ │ │ └── style.css │ │ ├── index.css │ │ └── App.jsx │ ├── package.json │ └── package-lock.json ├── README.md ├── http │ ├── package-lock.json │ ├── README.md │ ├── package.json │ └── lib │ │ └── random.js ├── scheduler │ ├── package-lock.json │ └── package.json ├── shortcuts │ └── package-lock.json └── variables │ ├── package-lock.json │ ├── index.js │ └── package.json ├── .husky ├── pre-commit └── commit-msg ├── .env.example ├── app ├── fonts.css ├── components │ ├── PreferencesFrameInput │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesBooleanInput │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesClearStateInput │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesSelectInput │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesSegmentedInput │ │ ├── style.css │ │ └── index.jsx │ ├── AppMenu │ │ ├── style.css │ │ ├── AppMenuRootItem.css │ │ └── AppMenuRootItem.jsx │ ├── MessageContainer │ │ └── style.css │ ├── ContextMenuDivider │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesVersionInput │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesStringInput │ │ ├── style.css │ │ └── index.jsx │ ├── Popup │ │ ├── confirm.css │ │ ├── index.jsx │ │ ├── confirm.jsx │ │ ├── shortcut.css │ │ └── style.css │ ├── Frame │ │ └── style.css │ ├── Preferences │ │ ├── sections │ │ │ ├── shortcuts.json │ │ │ ├── state.json │ │ │ ├── sharing.json │ │ │ ├── appearance.json │ │ │ └── general.json │ │ ├── preference.css │ │ └── style.css │ ├── ContextSearchItem │ │ └── style.css │ ├── EmptyComponent │ │ ├── style.css │ │ └── index.jsx │ ├── MissingComponent │ │ ├── style.css │ │ └── index.jsx │ ├── Role │ │ └── style.css │ ├── GridEmptyContent │ │ ├── style.css │ │ └── index.jsx │ ├── Icon │ │ ├── style.css │ │ └── index.jsx │ ├── Palette │ │ └── integrations │ │ │ └── index.js │ ├── Layout │ │ ├── index.jsx │ │ └── style.css │ ├── Sharing │ │ └── style.css │ ├── Grid │ │ ├── background.css │ │ ├── background.jsx │ │ └── style.css │ ├── Onboarding │ │ ├── style.css │ │ └── onboarding.json │ ├── Popover │ │ └── style.css │ ├── SegmentedControl │ │ ├── style.css │ │ └── index.jsx │ ├── PreferencesThemeInput │ │ ├── style.css │ │ └── index.jsx │ ├── ContextMenu │ │ └── style.css │ ├── Router │ │ ├── router.js │ │ └── router.unit.test.js │ ├── GridItem │ │ ├── style.css │ │ └── index.jsx │ ├── VerticalNavigation │ │ └── style.css │ ├── PreferencesNumberInput │ │ ├── style.css │ │ └── index.jsx │ ├── Transparency │ │ └── index.jsx │ ├── ContextMenuItem │ │ └── style.css │ └── PreferencesShortcutsInput │ │ └── style.css ├── assets │ ├── fonts │ │ ├── InterVariable.woff2 │ │ ├── bridge-glyphs.woff │ │ ├── InterVariable-Italic.woff2 │ │ └── bridge-glyphs.css │ └── icons │ │ ├── add.svg │ │ ├── window-maximize.svg │ │ ├── window-minimize.svg │ │ ├── placeholder.svg │ │ ├── spinner.svg │ │ ├── edit.svg │ │ ├── window-restore.svg │ │ ├── arrow-down.svg │ │ ├── window-close.svg │ │ ├── selector.svg │ │ ├── selector-white.svg │ │ ├── close.svg │ │ ├── color-success.svg │ │ ├── person.svg │ │ ├── edit-detail.svg │ │ ├── arrow-right.svg │ │ ├── warning.svg │ │ ├── reload.svg │ │ ├── preferences.svg │ │ ├── inspector.svg │ │ ├── search.svg │ │ ├── widget.svg │ │ └── float.svg ├── utils │ ├── console.js │ ├── random.js │ ├── fetch.js │ ├── clipboard.js │ ├── LazyValue.js │ └── browser.js ├── views │ └── Start.jsx ├── index.jsx ├── sharedContext.js ├── localContext.js ├── socketContext.js ├── hooks │ └── useJson.js ├── api.js ├── auth.js └── index.css ├── api ├── README.md ├── error │ ├── ApiError.js │ ├── InvalidArgumentError.js │ ├── MissingArgumentError.js │ ├── NoLocalHandlerError.js │ └── MissingIdentityError.js ├── dummy │ └── transport.js ├── ui.js ├── client.js ├── node │ ├── ui.js │ └── transport.js ├── browser │ └── ui │ │ └── index.js ├── transport.js ├── classes │ └── Cache.unit.test.js ├── system.unit.test.js ├── widgets.js ├── settings.js ├── events.unit.test.js └── random.js ├── .env.test ├── .gitignore ├── lib ├── config.js ├── security │ ├── EC.unit.test.js │ ├── JWT.unit.test.js │ ├── random.js │ ├── PolicyAgent.js │ ├── EC.js │ └── JWT.js ├── error │ ├── WorkerError.js │ ├── ApiError.js │ ├── PolicyError.js │ ├── InvalidArgumentError.js │ ├── HttpError.js │ ├── MissingTypeError.js │ ├── ContextError.js │ ├── ValidationError.js │ └── PluginMissingMainScriptError.js ├── api │ ├── rules │ │ ├── deny.js │ │ └── scope.js │ ├── CommandHandler.js │ └── SSystem.js ├── UserDefaults.js ├── utils.js ├── platform.js ├── network.js ├── routes │ └── index.js ├── plugin │ ├── PluginManifest.js │ └── PluginLoader.unit.test.js ├── workspace │ └── WorkspaceCrypto.js ├── StaticFileRegistry.unit.test.js └── init-electron.js ├── shared ├── DIControllerError.js ├── index.js ├── DIBase.js ├── DIController.unit.test.js └── LazyValue.unit.test.js ├── scripts ├── clean-build-folder.js └── sign-macos.js ├── examples ├── plugin-custom-types │ ├── README.md │ ├── package.json │ └── index.js └── plugin-hello-world │ ├── package.json │ └── README.md ├── index.js ├── docker-compose.yml ├── .fleet └── run.json ├── Dockerfile ├── .eslintrc.json ├── webpack.dev.js ├── .github └── workflows │ └── test.yml ├── docs ├── plugins │ └── installation.md ├── types.md ├── build.md └── structure.md ├── extra.plist ├── .vscode └── launch.json ├── LICENSE.md └── LICENSES └── MIT.txt /.dockerignore: -------------------------------------------------------------------------------- 1 | .git -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org 2 | proxy=null -------------------------------------------------------------------------------- /media/ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/ui.png -------------------------------------------------------------------------------- /media/appicon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/appicon.icns -------------------------------------------------------------------------------- /media/appicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/appicon.ico -------------------------------------------------------------------------------- /media/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/appicon.png -------------------------------------------------------------------------------- /plugins/caspar/app/components/Select/style.css: -------------------------------------------------------------------------------- 1 | .Select { 2 | width: 100%; 3 | } -------------------------------------------------------------------------------- /plugins/rundown/app/config.js: -------------------------------------------------------------------------------- 1 | export const DEFAULT_RUNDOWN_ID = 'RUNDOWN_ROOT' 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npm test 5 | -------------------------------------------------------------------------------- /media/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/screenshot.png -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | PORT= 2 | NODE_ENV= 3 | LOG_LEVEL=debug|info|warn|error 4 | APP_DATA_BASE_PATH= -------------------------------------------------------------------------------- /app/fonts.css: -------------------------------------------------------------------------------- 1 | @import "./assets/fonts/inter.css"; 2 | @import "./assets/fonts/bridge-glyphs.css"; -------------------------------------------------------------------------------- /app/components/PreferencesFrameInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesFrameInput { 2 | padding: 15px 0; 3 | } -------------------------------------------------------------------------------- /plugins/caspar/app/components/Monaco/style.css: -------------------------------------------------------------------------------- 1 | .Monaco { 2 | width: 100%; 3 | height: 350px; 4 | } -------------------------------------------------------------------------------- /media/docs/plugins/loader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/docs/plugins/loader.png -------------------------------------------------------------------------------- /plugins/types/app/components/ReferenceButton/style.css: -------------------------------------------------------------------------------- 1 | .ReferenceButton-button { 2 | width: 100%; 3 | } -------------------------------------------------------------------------------- /app/components/PreferencesBooleanInput/style.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .PreferencesBooleanInput { 4 | margin: 5px 0; 5 | } -------------------------------------------------------------------------------- /app/components/PreferencesClearStateInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesClearStateInput { 2 | margin: 10px 0 0; 3 | } -------------------------------------------------------------------------------- /app/components/PreferencesSelectInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesSelectInput select { 2 | margin-top: 10px; 3 | } -------------------------------------------------------------------------------- /media/docs/plugins/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/docs/plugins/directory.png -------------------------------------------------------------------------------- /api/README.md: -------------------------------------------------------------------------------- 1 | # API 2 | The extension api available for plugins 3 | 4 | [Full api documentation](/docs/api/README.md) -------------------------------------------------------------------------------- /app/assets/fonts/InterVariable.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/app/assets/fonts/InterVariable.woff2 -------------------------------------------------------------------------------- /app/assets/fonts/bridge-glyphs.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/app/assets/fonts/bridge-glyphs.woff -------------------------------------------------------------------------------- /app/components/PreferencesSegmentedInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesSegmentedInput-controlWrapper { 2 | margin-top: 10px; 3 | } -------------------------------------------------------------------------------- /media/docs/plugins/manage-plugins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/docs/plugins/manage-plugins.png -------------------------------------------------------------------------------- /media/docs/architecture/client-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/docs/architecture/client-server.png -------------------------------------------------------------------------------- /media/docs/architecture/methodology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/media/docs/architecture/methodology.png -------------------------------------------------------------------------------- /app/assets/fonts/InterVariable-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svt/bridge/HEAD/app/assets/fonts/InterVariable-Italic.woff2 -------------------------------------------------------------------------------- /app/components/AppMenu/style.css: -------------------------------------------------------------------------------- 1 | .AppMenu { 2 | display: flex; 3 | font-size: 0.9em; 4 | 5 | -webkit-app-region: no-drag; 6 | } -------------------------------------------------------------------------------- /app/assets/fonts/bridge-glyphs.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: bridge-glyphs; 3 | src: url("./bridge-glyphs.woff") format("woff"); 4 | } -------------------------------------------------------------------------------- /app/components/MessageContainer/style.css: -------------------------------------------------------------------------------- 1 | .MessageContainer { 2 | position: fixed; 3 | bottom: 10px; 4 | right: 10px; 5 | z-index: 1; 6 | } -------------------------------------------------------------------------------- /plugins/rundown/app/components/Layout/style.css: -------------------------------------------------------------------------------- 1 | .Layout--spread { 2 | display: flex; 3 | width: 100%; 4 | justify-content: space-between; 5 | } 6 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | # Environment variables 2 | # used for testing 3 | LOG_LEVEL=info 4 | NODE_OPTIONS="$NODE_OPTIONS --experimental-vm-modules" 5 | APP_DATA_BASE_PATH=- -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # macos 2 | *.DS_Store 3 | 4 | # npm 5 | node_modules 6 | 7 | # build 8 | assets.json 9 | dist 10 | bin 11 | 12 | # temporary files 13 | data -------------------------------------------------------------------------------- /app/components/ContextMenuDivider/style.css: -------------------------------------------------------------------------------- 1 | .ContextMenuDivider { 2 | width: 100%; 3 | height: 1px; 4 | 5 | background: black; 6 | opacity: 0.1; 7 | } 8 | -------------------------------------------------------------------------------- /plugins/inspector/app/components/BooleanInput/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2022 Sveriges Television AB 3 | * 4 | * SPDX-License-Identifier: MIT 5 | */ -------------------------------------------------------------------------------- /lib/config.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Sveriges Television AB 2 | // 3 | // SPDX-License-Identifier: MIT 4 | 5 | exports.defaults = { 6 | HTTP_PORT: 5544 7 | } 8 | -------------------------------------------------------------------------------- /app/components/PreferencesVersionInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesVersionInput { 2 | padding: 1em; 3 | 4 | background: var(--base-color--shade1); 5 | border-radius: 6px; 6 | } -------------------------------------------------------------------------------- /app/components/PreferencesStringInput/style.css: -------------------------------------------------------------------------------- 1 | .PreferencesStringInput { 2 | margin-top: 10px; 3 | } 4 | 5 | .PreferencesStringInput-input { 6 | display: block; 7 | margin-top: 5px; 8 | } -------------------------------------------------------------------------------- /plugins/clock/app/components/CurrentTime/style.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .CurrentTime-char { 4 | display: inline-block; 5 | width: 0.6em; 6 | } 7 | 8 | .CurrentTime-faded { 9 | opacity: 0.4; 10 | } -------------------------------------------------------------------------------- /app/components/Popup/confirm.css: -------------------------------------------------------------------------------- 1 | .PopupConfirm-actions { 2 | display: flex; 3 | margin-top: 20px; 4 | justify-content: space-around; 5 | } 6 | 7 | .PopupConfirm-confirmAction { 8 | font-weight: 500; 9 | } -------------------------------------------------------------------------------- /plugins/button/app/style.css: -------------------------------------------------------------------------------- 1 | html, body, #root { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | 6 | padding: 0; 7 | margin: 0; 8 | 9 | font-size: min(10vw, 30vh); 10 | } 11 | -------------------------------------------------------------------------------- /shared/DIControllerError.js: -------------------------------------------------------------------------------- 1 | class DIControllerError extends Error { 2 | constructor (msg) { 3 | super(msg) 4 | this.name = DIControllerError 5 | } 6 | } 7 | 8 | module.exports = DIControllerError 9 | -------------------------------------------------------------------------------- /plugins/inspector/README.md: -------------------------------------------------------------------------------- 1 | # Inspector plugin 2 | Bridge's default inspector plugin 3 | 4 | ## Description 5 | A widget allowing item data to be edited 6 | 7 | ## Table of contents 8 | - [Description](#description) -------------------------------------------------------------------------------- /plugins/inspector/app/components/SelectInput/style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * SPDX-FileCopyrightText: 2022 Sveriges Television AB 3 | * 4 | * SPDX-License-Identifier: MIT 5 | */ 6 | 7 | .SelectInput { 8 | width: 100%; 9 | } -------------------------------------------------------------------------------- /plugins/inspector/app/components/Icon/style.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .Icon svg [stroke]:not([stroke='none']) { 4 | stroke: var(--Icon-color); 5 | } 6 | 7 | .Icon svg [fill]:not([fill='none']) { 8 | fill: var(--Icon-color); 9 | } -------------------------------------------------------------------------------- /plugins/osc/app/components/TargetSelector/style.css: -------------------------------------------------------------------------------- 1 | .TargetSelector { 2 | width: 100%; 3 | padding: 0 5px 5px; 4 | box-sizing: border-box; 5 | } 6 | 7 | .TargetSelector select { 8 | width: 100%; 9 | } 10 | -------------------------------------------------------------------------------- /plugins/rundown/app/components/Icon/style.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .Icon svg [stroke]:not([stroke='none']) { 4 | stroke: var(--base-color); 5 | } 6 | 7 | .Icon svg [fill]:not([fill='none']) { 8 | fill: var(--base-color); 9 | } -------------------------------------------------------------------------------- /app/components/ContextMenuDivider/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import './style.css' 3 | 4 | export const ContextMenuDivider = () => { 5 | return ( 6 |
7 | ) 8 | } 9 | -------------------------------------------------------------------------------- /app/components/AppMenu/AppMenuRootItem.css: -------------------------------------------------------------------------------- 1 | .AppMenuRootItem { 2 | padding: 0.3em 0.8em; 3 | border-radius: 7px; 4 | } 5 | 6 | .AppMenuRootItem:hover, 7 | .AppMenuRootItem:focus { 8 | background: var(--base-color--shade); 9 | } -------------------------------------------------------------------------------- /app/utils/console.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Init the development console 3 | * with a welcome message 4 | */ 5 | export function init () { 6 | console.log('%c[APP] Bridge development console', 'font-weight: 600; color: #E543FF') 7 | } 8 | -------------------------------------------------------------------------------- /app/components/Frame/style.css: -------------------------------------------------------------------------------- 1 | .Frame { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | .Frame-frame { 8 | position: relative; 9 | width: 100%; 10 | height: 0; 11 | border: none; 12 | } 13 | -------------------------------------------------------------------------------- /plugins/caspar/lib/paths.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Sveriges Television AB 2 | // 3 | // SPDX-License-Identifier: MIT 4 | 5 | const manifest = require('../package.json') 6 | 7 | exports.STATE_SETTINGS_PATH = `plugins.${manifest.name}` 8 | -------------------------------------------------------------------------------- /plugins/osc/lib/paths.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2024 Sveriges Television AB 2 | // 3 | // SPDX-License-Identifier: MIT 4 | 5 | const manifest = require('../package.json') 6 | 7 | exports.STATE_SETTINGS_PATH = `plugins.${manifest.name}` 8 | -------------------------------------------------------------------------------- /plugins/types/app/style.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | 6 | padding: 0; 7 | margin: 0; 8 | 9 | overflow: hidden; 10 | } 11 | 12 | #root { 13 | display: contents; 14 | } 15 | -------------------------------------------------------------------------------- /plugins/caspar/app/components/LibraryList/style.css: -------------------------------------------------------------------------------- 1 | .LibraryList { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | padding: 0; 6 | margin: 0; 7 | 8 | list-style: none; 9 | overflow-y: scroll; 10 | overflow-x: hidden; 11 | } -------------------------------------------------------------------------------- /plugins/state/README.md: -------------------------------------------------------------------------------- 1 | # State plugin 2 | Browse the state as a widget 3 | 4 | ## Description 5 | This plugin allows the state to be viewed directly in a workspace, primarily for debugging purposes 6 | 7 | ## Table of contents 8 | - [Description](#description) -------------------------------------------------------------------------------- /app/components/Preferences/sections/shortcuts.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "Shortcuts", 4 | "description": "Customize registered keyboard shortcuts", 5 | "inputs": [ 6 | { 7 | "type": "shortcuts" 8 | } 9 | ] 10 | } 11 | ] -------------------------------------------------------------------------------- /lib/security/EC.unit.test.js: -------------------------------------------------------------------------------- 1 | const EC = require('./EC') 2 | 3 | test('generate key pair', async () => { 4 | const pair = await EC.generateKeyPair() 5 | expect(typeof pair.publicKey).toBe('string') 6 | expect(typeof pair.privateKey).toBe('string') 7 | }) 8 | -------------------------------------------------------------------------------- /plugins/inspector/app/components/VariableHint/style.css: -------------------------------------------------------------------------------- 1 | .VariableHint { 2 | margin-bottom: 2px; 3 | padding: 2px 5px; 4 | 5 | border-radius: 7px; 6 | background: var(--base-color--shade); 7 | font-size: 0.8em; 8 | 9 | box-sizing: border-box; 10 | } -------------------------------------------------------------------------------- /api/error/ApiError.js: -------------------------------------------------------------------------------- 1 | // SPDX-FileCopyrightText: 2022 Sveriges Television AB 2 | // 3 | // SPDX-License-Identifier: MIT 4 | 5 | class ApiError extends Error { 6 | constructor (msg = 'Api error') { 7 | super(msg) 8 | } 9 | } 10 | module.exports = ApiError 11 | -------------------------------------------------------------------------------- /app/components/ContextSearchItem/style.css: -------------------------------------------------------------------------------- 1 | .ContextMenuSearchItem { 2 | padding: 0; 3 | } 4 | 5 | .ContextMenuSearchItem input.ContextMenuSearchItem-input{ 6 | width: 100%; 7 | 8 | background: none; 9 | 10 | border-radius: 0; 11 | box-shadow: none; 12 | } -------------------------------------------------------------------------------- /plugins/rundown/app/components/Layout/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | import './style.css' 4 | 5 | export function Spread ({ children }) { 6 | return ( 7 |