With hundreds of different betting sites, finding the best can be confusing. I'll guide you through and find the most suitable bookie for you.
What Are The Current STAR SPORTS Welcome Offer Details?
Welcome to our guide on the Star Sports sign-up offer. Find comprehensive details on the current promo for new customers. Further insights into what they offer beyond the new customer deal are found in our complete Star Sports betting site review or explore all our free bets.
Star Sports increased the size of their welcome offer to Bet £20 Get £40, but it's important to state that the odds for the qualifying bet are 5.0.
Star Sports Bonus Code
To claim the Star Sports offer at OLBG, you do not need a promo code. Click the links on this page, register, and follow the steps below.
18+ New customers only. Bet £40+ get 2x£10 free bets. Evens or greater to qualify. 1x£10 free bet paid if all terms met. £10 free bets for us on singles and upwards. 1x£10 free bet paid 24h after payment of initial free bet. Free bets must be used at min. odds 4/1. Full T&Cs apply.
#ad. 18+, gambleaware.org, T&Cs Apply
Banking Options
Check Welcome Offer Payment Methods
Please check the terms and conditions on the day of registration to ensure you use the correct deposit method to qualify for any offer.
These are all the payment methods available for Star Sports. Be aware that in some cases, qualification for the welcome offer will depend on the payment method used. While we try to keep this information up to date in the full offer details below, make sure you check the full terms and conditions on the registration day.
| Method | Min | Processing Time | Fee |
|---|---|---|---|
| £10 | Instant | ||
| £10 | Instant | ||
| £10 | Instant |
| Method | Min | Processing Time | Fee |
|---|---|---|---|
| £10 | 1-3 Days | ||
| £10 | 1-3 Days | ||
| £10 | 1-3 Days |
Star Sports Key Features
- Best Odds Guaranteed: 9:00AM
- Live Stream: horse racing, greyhounds
- Asian handicap
- Bet Builder
- Acca Insurance
- Early pay out
- Welcome / sign-up offer
- Odds Boosts
- In-play
- Cash Out
- Partial Cash Out
- Free Bet Club (or similar)
- Exchange betting
- Spread betting
- In-game statistics
- Pre-match form/statistics
- Request a bet (or similar)
- Virtual sports
- App
Star Sports Customer Service
- Phone
- Web chat
- Social media
Star Sports Markets
- How many sports: 26
18+ New customers only. Bet £40+ get 2x£10 free bets. Evens or greater to qualify. 1x£10 free bet paid if all terms met. £10 free bets for us on singles and upwards. 1x£10 free bet paid 24h after payment of initial free bet. Free bets must be used at min. odds 4/1. Full T&Cs apply.
#ad. 18+, gambleaware.org, T&Cs Apply
One thing that should always be considered is that the Welcome offer for any betting site lasts for just a moment when you join. Your main consideration should be whether that betting site is right for you and what your betting needs are in the long term.
There are plenty of promotions going on across the majority of sportsbooks and betting sites in the UK. Full a fun rundown on all the different ones available through OLBG, you can see the best betting sign up offers.
Alternative Welcome Offers to Compare with Star Sports
You might consider these if you are looking for the best welcome offers. But we suggest reading the full reviews to see if the site suits you.
| Bookmaker | Best Offer | Total Value | Expiry | Min Deposit |
|---|---|---|---|---|
| Unibet | Bet £10 get £40 in Bonuses | £40 | 7 Days | £5 |
| TalkSPORT | Get Up to £40 in Football Bets | £40 | 7 days | £10 |
| Fafabet | Get up to £50 Free Bet + £20 Casino Bonus | £70 | £10 | |
| BetVictor | Bet £10 on Football, Get £45 in free bets | £45 | 7 Days | £5 |
| Betano | Get £40 in Free Bets when you bet £10 | £40 | 5 Days | £10 |
Bet £40 Get £20 in Free Bets
18+ New customers only. Bet £40+ get 2x£10 free bets. Evens or greater to qualify. 1x£10 free bet paid if all terms met. £10 free bets for us on singles and upwards. 1x£10 free bet paid 24h after payment of initial free bet. Free bets must be used at min. odds 4/1. Full T&Cs apply.
#ad. 18+, gambleaware.org, T&Cs Apply
More Star Sports Promotions
Once you have registered and claimed the welcome offer, you will find a host of promotions for existing customers to use. These range from football, horse racing and other sports promotions.
| Section | Offer |
|---|---|
⚽️ Sports | Bet Builder |
⚽️ Sports | Football Rewards: Free Bets when you stake on multiples |
⚽️🏀🏈🎾 Sports | Price Boosts |
| 🎾 Sports | Second Serve Acca Refund: Money back if 1 leg of your tennis acca lets you down |
⚽️ Sports | Premier League Added back: Money Back as free bets for selected markets |
| 🏀 Sports | Acca Rebound: Money back if 1 leg of your NBA acca lets you down |
🏇 Sports | Extra Places |
⚽️🏀🏈🎾 Sports | Boosted Odds |
⚽️ Sports | Cash Out |
Cheltenham Free Bets and Offers 2027
With the Cheltenham Festival the biggest week in racing, expect to see most bookies worth their salt running specific Cheltenham free bets and offers. There were some great ones last time around, and we'll keep you posted as and when they come through.
18+ New customers only. Bet £40+ get 2x£10 free bets. Evens or greater to qualify. 1x£10 free bet paid if all terms met. £10 free bets for us on singles and upwards. 1x£10 free bet paid 24h after payment of initial free bet. Free bets must be used at min. odds 4/1. Full T&Cs apply.
#ad. 18+, gambleaware.org, T&Cs Apply
Star Sports Login and Registration Guide
You will first need to register an account before being able to claim the Star Sports welcome offer.
Register an Account
🖋️ How do you register at Star Sports?
Just follow this step-by-step guide to get started:
🔻From the Home page, click on Sign Up in the top-right corner of the page
🔻Enter your Email and Password. Then, click Create Account
🔻Enter your Address, Mobile Number and Marketing preferences. Then, click Continue
🔻Set your Deposit Limits. Make sure to read the disclaimer thoroughly, then tick the checkbox and click Continue
🔻From here, you can either make your first Deposit, or click on the X if you’re not ready to Deposit yet.
Star Sports Sign Up Offer History
THESE OFFERS ARE EXPIRED AND NO LONGER AVAILABLE
The offers below are no longer available, we document for historical reason and for information
In this section, we record previous welcome offers available from Star Sports so we can see how they have changed and potentially predict what might happen in the future
Offer history
| Expired at | Offer |
|---|---|
| 28.02.2025 | Wager £20, Get 50 Free Spins on Big Bass Splash Expired18+. New UK/IE customers only. Sign up via a recognised affiliate partner using promo code 'STARSPINS'. Deposit and wager a minimum of £20 on slots to receive 50 free spins on Big Bass Splash, credited by 12pm GMT the following day. 10 x wagering before winnings can be withdrawn. |
| 28.11.2024 | Up to £25 Free Bet + 25 Free Spins! ExpiredNew UK/IE customers only. Sign up and place your first sports bet at odds of Evens (2.0) or greater and if it loses, get a free bet equivalent to 50% of your first bet stake (min £10), to a maximum value of £25, plus 25 free spins on Gold Horsey Winner. Full T&Cs apply. 18+ | GambleAware.org |
January 2026
At the beginning of the year, Star Sports changed their welcome offer to Bet £10 Get £20 in free bets.
May 2026
Title
Content
Normal Paragraph FormatNormalHeading 1Heading 2Heading 3Heading 4CodeParagraph StyleGrayBorderedSpacedUppercaseQuoteIncreaseDecreaseBoldItalicAlignAlign LeftAlign CenterAlign RightAlign JustifyOrdered ListDefaultLower AlphaLower GreekLower RomanUpper AlphaUpper RomanUnordered ListDefaultCircleDiscSquareInsert TableInsert SnippetInsert LinkInsert ImageInsert VideoFullscreenCode ViewOLBG ImageInsert image from olbgimages.co.uk
<div
class="modal fade component-backend-modal"
role="dialog"
aria-modal="true"
v-if="visible"
v-bind:aria-labelledby="ariaLabeledBy"
:style="containerStyle"
:class="containerCssClass"
@click="onOverlayClick"
>
<div
ref="document"
role="document"
class="modal-dialog"
:class="cssClass"
>
<div
ref="content"
class="modal-content"
:class="contentCssClassName"
:style="modalStyle"
@mousedown="onMouseDown"
@transitionend="onTransitionEnd"
>
<slot name="content"></slot>
<template v-if="resizable">
<div v-if="resizable === true || resizable === 'vertical'" class="resize-handle" data-side="bt"></div>
<div v-if="resizable === true || resizable === 'vertical'" class="resize-handle" data-side="tp"></div>
<div v-if="resizable === true || resizable === 'horizontal'" class="resize-handle" data-side="lf"></div>
<div v-if="resizable === true || resizable === 'horizontal'" class="resize-handle" data-side="rt"></div>
<div v-if="resizable === true" class="resize-handle" data-side="bt-rt"></div>
<div v-if="resizable === true" class="resize-handle" data-side="bt-lf"></div>
<div v-if="resizable === true" class="resize-handle" data-side="tp-rt"></div>
<div v-if="resizable === true" class="resize-handle" data-side="tp-lf"></div>
</template>
</div>
</div>
</div>
<div
data-default-button-text="OK"
>
<backend-component-modal
ref="modal"
:aria-labeled-by="modalTitleId"
:unique-key="uniqueKey"
:size="size"
:storePosition="false"
@hidden="onHidden"
>
<template v-slot:content>
<div class="modal-header">
<h4 class="modal-title" v-bind:id="modalTitleId" v-text="title"></h4>
<button
@click.prevent="$refs.modal.hide()"
type="button"
class="btn-close"
aria-label="Close"
tabindex="0"
></button>
</div>
<div class="modal-body">
<p v-text="text"></p>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-primary btn-default-action"
data-default-focus
@click="$refs.modal.hide()"
v-text="primaryButtonText"
></button>
</div>
</template>
</backend-component-modal>
</div>
<div
data-default-button-text="OK"
>
<backend-component-modal
ref="modal"
:aria-labeled-by="modalTitleId"
:unique-key="uniqueKey"
:size="size"
:storePosition="false"
@hidden="onHidden"
>
<template v-slot:content>
<div class="modal-header">
<h4 class="modal-title" v-bind:id="modalTitleId" v-text="title"></h4>
<button
@click.prevent="$refs.modal.hide()"
type="button"
class="btn-close"
aria-label="Close"
tabindex="0"
></button>
</div>
<div class="modal-body">
<p v-text="text"></p>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-primary btn-default-action"
:class="{'btn-primary': !isDanger, 'btn-danger': isDanger}"
v-bind:data-default-focus="!isDanger"
@click="onButtonClick"
v-text="primaryButtonText"
></button>
<span class="button-separator">or</span>
<button
class="btn btn-link text-muted"
@click.prevent="$refs.modal.hide()"
v-bind:data-default-focus="isDanger"
>Cancel</button>
</div>
</template>
</backend-component-modal>
</div>
<div>
<backend-component-modal
ref="modal"
:aria-labeled-by="modalTitleId"
:unique-key="uniqueKey"
:size="size"
:storePosition="false"
@hidden="onHidden"
>
<template v-slot:content>
<div class="modal-header">
<h4 class="modal-title" v-bind:id="modalTitleId" v-text="title"></h4>
<button
@click.prevent="$refs.modal.hide()"
type="button"
class="btn-close"
aria-label="Close"
tabindex="0"
></button>
</div>
<div v-html="text" @click="onClick"></div>
</template>
</backend-component-modal>
</div>
<div
class="component-backend-richeditor-document-connector flex-layout-column layout-absolute"
:class="cssClass"
data-configuration="{"lang":{"command_upload_from_computer":"Upload From Computer","browse":"Browse Media Library","by_url":"By URL","url_required":"The URL is required","url_validation":"URL must start with http:\/\/ or https:\/\/","add_image_title":"Insert Image","add_video_title":"Insert Video","add_audio_title":"Insert Audio","add_file_title":"Insert File","embedding_code":"Embedding Code","embedding_code_required":"The embedding code is required","invalid_embedding_code_title":"Invalid code","invalid_embedding_code_message":"Please enter valid HTML embedding code"},"vendorPath":"https:\/\/www.olbg.com\/modules\/backend\/vuecomponents\/richeditordocumentconnector\/assets\/vendor"}"
>
<div v-if="allowResizing && !codeEditingMode" class="top-ruler flex-layout-item fix">
<div class="width-indicator" :style="rulerStyle">
<span v-for="tick in majorTicks" :style="tick.style" class="width-tick tick-major"></span>
<span v-for="tick in minorTicks" :style="tick.style" class="width-tick tick-minor"></span>
<div class="width-drag-handle" @mousedown.stop="onResizingHandleMouseDown" ref="handle"></div>
</div>
</div>
<div class="flex-layout-item stretch richeditor-container">
<slot></slot>
</div>
<div class="flex-layout-item stretch relative codeeditor-container">
<backend-component-monacoeditor
v-if="codeEditingMode"
ref="codeEditor"
container-css-class="fill-container"
:model-definitions="codeEditorModelDefinitions"
>
</backend-component-monacoeditor>
</div>
</div>
<backend-component-document
container-css-class="fill-container"
:built-in-mode="true"
:full-screen="fullScreen"
ref="document"
>
<template v-slot:toolbar v-if="!hasExternalToolbar">
<backend-component-document-toolbar
:elements="toolbarElements"
:disabled="readOnly"
@command="onToolbarCommand"
ref="toolbar"
></backend-component-document-toolbar>
</template>
<template v-slot:content>
<div class="flex-layout-column fill-container" ref="contentContainer">
<div class="flex-layout-item stretch editor-panel relative">
<backend-component-richeditor-document-connector
:allow-resizing="showMargins"
:toolbar-container="toolbarExtensionPointProxy"
:external-toolbar-app-state="externalToolbarAppState"
:use-media-manager="useMediaManager"
:built-in-mode="true"
unique-key="html-editor-form-widget"
container-css-class="fill-container"
>
<backend-component-richeditor
v-model="value"
:read-only="options.readOnly"
:use-line-breaks="options.useLineBreaks"
:full-page="fullPage"
:editor-options="editorOptions"
:toolbar-buttons="toolbarButtons"
ref="richeditor"
@blur="onBlur"
@focus="onFocus"
>
</backend-component-richeditor>
</backend-component-richeditor-document-connector>
</div>
</div>
</template>
</backend-component-document>
<div
class="component-backend-document flex-layout-column"
:class="cssClass"
>
<transition name="document-fade-in">
<template v-if="!loading && !errorLoadingDocument">
<transition name="document-header-fade">
<div class="document-header-container flex-layout-item fix" v-show="!headerCollapsed">
<slot name="header"></slot>
</div>
</transition>
</template>
</transition>
<transition name="document-fade-in">
<div v-if="!loading && !errorLoadingDocument" class="document-toolbar-container flex-layout-item fix">
<slot name="toolbar"></slot>
</div>
</transition>
<div v-if="!loading && !errorLoadingDocument" class="flex-layout-item fix">
<slot name="drawer"></slot>
</div>
<transition name="document-fade-in">
<div v-if="!loading && !errorLoadingDocument" class="document-content-container flex-layout-item stretch relative">
<slot name="content"></slot>
<transition name="processing-fade-in">
<backend-component-loading-indicator
v-if="processing"
indicator-style="stripe"
css-class="document-progress-indicator"
></backend-component-loading-indicator>
</transition>
</div>
</transition>
<div v-if="loading" class="flex-layout-item justify-center">
<backend-component-loading-indicator
size="small"
></backend-component-loading-indicator>
</div>
<transition name="processing-fade-in">
<div v-if="errorLoadingDocument" class="flex-layout-item justify-center">
<div class="document-loading-error backend-icon-background-pseudo">
<h3 v-text="errorLoadingDocumentHeader"></h3>
<p v-text="errorLoadingDocument"></p>
</div>
</div>
</transition>
</div>
<div class="flex-layout-row document-toolbar-scroll-container" ref="toolbarContainer">
<div class="document-toolbar-scrollable flex-layout-item stretch" ref="scrollable">
<template v-for="element in scrollableElements" v-if="!element.hidden">
<div
class="document-toolbar-element"
:class="['element-type-'+element.type, {'button-group': !!element.buttonGroup, 'button-icon-only': element.type == 'button' && !element.label}]">
<backend-component-document-toolbar-button
v-if="element.type == 'button' || element.type == 'dropdown'"
:settings=element
:toolbar-disabled="disabled"
@dropdowncontentshown="onDropdownContentShown"
@dropdowncontenthidden="onDropdownContentHidden"
@command="onElementCommand"
></backend-component-document-toolbar-button>
</div> </template>
</div>
<div class="flex-layout-item fix fixed-right">
<template v-for="element in fixedRightElements" v-if="!element.hidden">
<div
class="document-toolbar-element"
:class="['element-type-'+element.type, {'button-group': !!element.buttonGroup, 'button-icon-only': element.type == 'button' && !element.label}]">
<backend-component-document-toolbar-button
v-if="element.type == 'button' || element.type == 'dropdown'"
:settings=element
:toolbar-disabled="disabled"
@dropdowncontentshown="onDropdownContentShown"
@dropdowncontenthidden="onDropdownContentHidden"
@command="onElementCommand"
></backend-component-document-toolbar-button>
</div> </template>
</div>
</div>
<div v-oc-hotkey:[settings.hotkey]="onHotkey" v-if="!settings.hidden">
<a
role="button"
v-if="settings.href"
v-bind:href="settings.href"
v-bind:target="settings.target ? settings.target : '_self'"
v-bind:disabled="settings.disabled || toolbarDisabled"
v-bind:tabindex="settings.disabled || toolbarDisabled ? -1 : 0"
v-bind:aria-controls="ariaControlsId"
v-bind:aria-haspopup="settings.type == 'dropdown'"
v-bind:id="buttonId"
v-bind:data-cmd="command"
v-bind:data-tooltip-text="tooltip"
v-bind:data-tooltip-hotkey="tooltipHotkey"
class="backend-toolbar-button"
:class="cssClass"
@click="onClick"
ref="button"
>
<i v-if="icon" :class="icon"></i>
<span v-if="label" v-text="label"></span>
</a>
<button
type="button"
v-else
v-bind:disabled="settings.disabled || toolbarDisabled"
v-bind:tabindex="settings.disabled || toolbarDisabled ? -1 : 0"
v-bind:aria-controls="ariaControlsId"
v-bind:aria-haspopup="settings.type == 'dropdown'"
v-bind:id="buttonId"
v-bind:data-cmd="command"
v-bind:data-tooltip-text="tooltip"
v-bind:data-tooltip-hotkey="tooltipHotkey"
class="backend-toolbar-button"
:class="cssClass"
@click="onClick"
ref="button"
>
<i v-if="icon" :class="icon"></i>
<span class="button-label" v-if="label" v-text="label" :style="titleStyle"></span>
</button
><button
type="button"
v-if="settings.type != 'dropdown' && settings.menuitems"
class="backend-toolbar-button menu-trigger"
:class="menuTriggerCssClass"
aria-haspopup="true"
v-bind:disabled="settings.disabled || toolbarDisabled"
v-bind:tabindex="settings.disabled || toolbarDisabled ? -1 : 0"
v-bind:id="menuButtonId"
v-bind:aria-controls="menuId"
@click="onClick($event, false, true)"
ref="menuButton"
>
<span v-if="settings.showBadge" class="badge"></span>
</button>
<backend-component-dropdownmenu
v-if="settings.menuitems"
:items=settings.menuitems
:menu-id="menuId"
:labeled-by-id="buttonId"
ref="menu"
@closedwithesc="onMenuClosedWithEsc"
@command="onMenuItemCommand"
@shown="onMenuShown"
@hidden="onMenuHidden"
@aligntotrigger="onAlignToTrigger"
></backend-component-dropdownmenu>
</div>
<div class="document-header" :class="{'has-document-icon': documentIcon, 'has-close-icon': showCloseIcon}">
<span
v-if="documentIcon"
class="document-icon"
v-bind:style="documentIconStyle"
>
<i :class="documentIcon.cssClass"></i>
</span>
<input type="text" ref="titleInput" class="header-title" v-model="data[titleProperty]" v-bind:disabled="disabled || disableTitleEditor" @input="onTitleInput"></input>
<div class="flex-layout-row" v-if="subtitleProperty" v-show="!hideSubtitleEditor">
<div class="flex-layout-item fix subtitle-label center" v-text="subtitleLabel + ':'"></div>
<input
type="text"
class="header-subtitle flex-layout-item stretch"
v-model="data[subtitleProperty]"
v-bind:disabled="disabled"
@input="onSubtitleInput"
></input>
</div>
<button
v-if="showCloseIcon"
class="close close-icon backend-icon-background-pseudo"
@click="$emit('documentcloseclick')"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div>
<transition name="backend-dropdown-overlay-touch-screen">
<div v-if="visible" class="backend-dropdownmenu-overlay" @click.prevent="onOverlayClick" @contextmenu.prevent="onOverlayContextMenu"></div>
</transition>
<backend-component-dropdownmenu-sheet
ref="sheet"
:items="items"
:labeled-by-id="labeledById"
:menu-id="menuId"
:preferable-position="preferablePosition"
@aligntotrigger="$emit('aligntotrigger', $event)"
@command="$emit('command', $event)"
@hidden="onSheetHidden"
@closemenu="hideMenu"
></backend-component-dropdownmenu-sheet>
</div>
<div class="dropdown-menu backend-dropdownmenu" data-menu-position-container>
<div class="dropdown-container">
<transition name="backend-dropdown-menu-touch-screen" v-on:after-leave="onAfterLeave">
<ul
role="menu"
:class="menuClassName"
ref="menu"
v-if="visible"
v-bind:id="menuId"
v-bind:aria-labelledby="labeledById"
>
<li class="submenu-header clearfix" v-if="isSubmenu">
<button
class="go-back-link backend-icon-background-pseudo"
@click.stop.prevent="onGoBackClick"
>Go Back</button>
<button
class="close-link backend-icon-background-pseudo"
@click.stop.prevent="onCloseClick"
>Close Menu</button>
</li>
<backend-component-dropdownmenu-menuitem
v-for="(item, index) in items"
:type="item.type"
:disabled="item.disabled"
:href="item.href"
:target="item.target"
:checked="item.checked"
:items="item.items"
:icon="item.icon"
:label="item.label"
:command="item.command"
:itemStyle="item.style"
:key="index"
:is-first="index == 0"
@command="onCommand($event)"
@hide="onHide"
@itemmouseenter="onItemMouseEnter"
@submenushown="onItemSubmenuShown"
@submenuhidden="onItemSubmenuHidden"
@closemenu="$emit('closemenu', $event)"
></backend-component-dropdownmenu-menuitem>
</ul>
</transition>
</div>
</div>
<li
class="item"
:class="{
separator: type == 'separator',
first: isFirst,
'submenu-expanded': isSubmenuExpanded
}"
v-bind:role="type == 'separator' ? 'separator' : 'presentation'"
v-bind:disabled="disabled"
>
<button v-if="!href && type != 'separator'"
ref="itemElement"
v-bind:tabindex="disabled ? -1 : 0"
v-bind:disabled="disabled"
v-bind:aria-disabled="disabled"
v-bind:role="itemRole"
v-bind:aria-checked="itemIsChecked ? 'true' : 'false'"
v-bind:id="menuItemId"
v-bind:aria-haspopup="hasSubmenu"
v-bind:aria-expanded="isSubmenuExpanded"
:class="{'has-submenu': hasSubmenu}"
:style="itemStyle"
@click="onClick($event)"
@mouseenter="onMouseEnter"
data-menuitem
>
<i :class="icon" v-if="icon"></i>
<i
class="backend-icon-background-pseudo"
v-if="type == 'checkbox' || type == 'radiobutton'"
></i>
<i
class="backend-icon-background-pseudo submenu-indicator"
v-if="hasSubmenu"
></i>
<span v-text="label"></span>
</button>
<a
ref="itemElement"
v-if="href && type != 'separator'"
v-bind:href="href"
v-bind:target="target ? target : '_self'"
v-bind:tabindex="disabled ? -1 : 0"
v-bind:disabled="disabled"
v-bind:aria-disabled="disabled"
v-bind:aria-checked="itemIsChecked ? 'true' : 'false'"
v-bind:role="itemRole"
:style="itemStyle"
@click="onClick($event)"
@mouseenter="onMouseEnter"
data-menuitem
>
<i :class="icon" v-if="icon"></i>
<i
class="backend-icon-background-pseudo"
v-if="type == 'checkbox' || type == 'radiobutton'"
></i>
<span v-text="label"></span>
</a>
<backend-component-dropdownmenu-sheet
v-if="hasSubmenu"
ref="submenu"
:items="items"
:labeled-by-id="menuItemId"
:menu-id="submenuId"
:is-submenu="true"
@command="$emit('command', $event)"
@hidden="onSubmenuHidden"
@closemenu="$emit('closemenu', $event)"
></backend-component-dropdownmenu-sheet>
</li>
<div class="component-backend-loading-indicator" :class="className">
<div class="spinner" v-if="indicatorStyle == 'circles'">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
<div v-if="indicatorStyle == 'stripe'">
<div class="stripe-indicator">
<div></div>
</div>
</div>
<div v-if="indicatorStyle == 'bar'" class="bar-indicator">
<div class="stripe-indicator">
<div :style="barIndicatorStyle" :class="{'progress-done': this.progress == 100}"></div>
</div>
</div>
</div>
<div
class="component-backend-richeditor flex-layout-column"
:class="cssClass"
data-configuration="{"editorLang":null,"useMediaManager":true,"iframeStylesFile":"https:\/\/www.olbg.com\/modules\/backend\/vuecomponents\/richeditor\/assets\/css\/iframestyles.css","globalToolbarButtons":["paragraphFormat","paragraphStyle","quote","bold","italic","align","formatOL","formatUL","insertTable","insertSnippet","insertPageLink","insertImage","insertVideo","fullscreen","html","olbgImages"],"allowEmptyTags":null,"allowTags":null,"allowAttrs":null,"noWrapTags":null,"removeTags":null,"lineBreakerTags":null,"imageStyles":null,"linkStyles":null,"paragraphFormat":null,"paragraphStyles":null,"inlineStyles":null,"tableStyles":{"branded":"Add OLBG Branding","no-branding":"Remove OLBG Branding"},"tableCellStyles":null}"
>
<div class="flex-layout-item field-richeditor stretch relative" data-richeditor-vue>
<textarea ref="textarea" v-bind:id="editorId" class="editor-element"></textarea>
</div>
</div>
<div
class="component-backend-uploader"
v-show="!hidden"
:class="{'uploader-collapsed': collapsed}"
data-lang-uploading="Uploading Files"
data-lang-complete="Upload Complete"
>
<div class="uploader-header">
<h3 v-text="titleText"></h3>
<backend-component-loading-indicator
indicator-style="bar"
:progress="totalProgress"
></backend-component-loading-indicator>
<button
@click.prevent="onHeaderButtonClick"
type="button"
class="close backend-icon-background-pseudo"
:class="{'collapse': !collapsed && hasFilesInProgress, 'expand': collapsed && hasFilesInProgress}"
tabindex="0"
><span aria-hidden="true">×</span>
</button>
</div>
<div class="uploader-body-container">
<div class="uploader-body">
<backend-component-scrollable-panel
:relative-layout="true"
:relative-layout-max-height="200"
>
<div>
<ul>
<backend-component-uploader-item
v-for="(file, index) in files"
:key="file.key"
:fileName="file.name"
:status="file.status"
:progress="file.progress"
:errorMessage="file.errorMessage"
@removeclick="onRemoveClick(index)"
></backend-component-uploader-item>
</ul>
</div>
</backend-component-scrollable-panel>
</div>
</div>
</div>
<li :class="cssClass">
<span class="item-name" v-text="fileName"></span>
<span class="item-error" v-if="errorMessage" v-text="errorMessage"></span>
<i
class="backend-icon-background"
v-if="status == 'completed'"
></i>
<template
v-if="status == 'uploading'"
>
<backend-component-loading-indicator
indicator-style="bar"
:progress="progress"
></backend-component-loading-indicator>
<button
@click.prevent="$emit('removeclick')"
type="button"
class="close backend-icon-background-pseudo"
tabindex="0"
><span aria-hidden="true">×</span>
</button>
</template>
</li>
<div
class="component-backend-scrollablepanel"
:class="{'scrollablepanel-relative': relativeLayout}"
>
<div class="scrollable-panel-container" ref="container">
<div
class="scrollable"
ref="scrollable"
v-on:scroll.passive="onScroll"
:style="containerStyle"
>
<slot></slot>
</div>
</div>
</div>
<backend-component-inspector-panel
ref="panel"
:controls="dataSchema"
:obj="liveObject"
:parent-obj="parentObject"
:inspector-unique-id="uniqueId"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
>
</backend-component-inspector-panel>
<div
class="component-backend-inspector-panel"
data-validation-alert-title="Error"
>
<backend-component-inspector-grouphost
:controls="untabbedControls"
:obj="obj"
:parent-obj="parentObj"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="0"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
></backend-component-inspector-grouphost>
<backend-component-tabs
v-show="tabs.length > 0"
ref="tabs"
:tabs="tabs"
:closeable="false"
:use-slots="true"
tabs-style="inspector"
@tabselected="onTabSelected"
>
<template v-for="tabInfo in tabs" v-slot:[tabInfo.key]>
<backend-component-inspector-grouphost
:controls="tabbedControls[tabInfo.key]"
:obj="obj"
:parent-obj="parentObj"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="0"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
></backend-component-inspector-grouphost>
</template>
</backend-component-tabs>
</div>
<div class="component-backend-inspector-group">
<div
class="group-name inspector-padding-control-left inspector-padding-control-right"
:class="{expanded: expanded, collapsed: !expanded, loading: loading, 'has-errors': hasErrors, 'hide-bottom-border-collapsed': hideBottomBorder}"
@click.stop="onToggleGroup"
>
<div :style="nameStyle">
<span
v-text="nameAndValue"
class="backend-icon-background-pseudo"
></span>
<backend-component-loading-indicator v-if="loading"
size="tiny"
></backend-component-loading-indicator>
</div>
</div>
<transition name="group-fade-in">
<backend-component-inspector-controlhost
v-show="expanded"
:controls="controls"
:obj="obj"
:parent-obj="parentObj"
:splitter-data="splitterData"
:depth="depth + 1"
:panel-update-data="panelUpdateData"
:inspector-preferences="inspectorPreferences"
:inspector-unique-id="inspectorUniqueId"
@inspectorcommand="$emit('inspectorcommand', $event)"
>
</backend-component-inspector-controlhost>
</transition>
</div>
<div class="component-backend-inspector-grouphost">
<backend-component-inspector-controlhost
:controls="groupedControls.ungrouped"
:obj="obj"
:parent-obj="parentObj"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
>
</backend-component-inspector-controlhost>
<backend-component-inspector-group
v-for="(controls, groupName) in groupedControls"
v-if="groupName != 'ungrouped'"
:key="groupName"
:group-name="groupName"
:obj="obj"
:parent-obj="parentObj"
:controls="controls"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
>
</backend-component-inspector-group>
</div>
<table class="component-backend-inspector-controlhost" @mousedown.stop="onHandleMouseDown">
<backend-component-inspector-controlhost-row
v-for="control in controls"
:obj="obj"
:parent-obj="parentObj"
:key="control.property"
:control-host-unique-id="uniqueId"
:control="control"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
:inspector-unique-id="inspectorUniqueId"
:is-full-width="isFullWidthControl(control)"
@inspectorcommand="$emit('inspectorcommand', $event)"
>
</backend-component-inspector-controlhost-row>
</table>
<tr class="inspector-control-row" :class="{'has-errors': hasErrors, 'hide-bottom-border': bottomBorderHidden}" v-show="rowVisible">
<th v-if="!isFullWidth && !controlLabelHidden" :style="titlePanelStyle">
<div class="inspector-label-container" :class="{'has-description': control.description}">
<label
class="inspector-padding-control-left"
v-text="control.title"
v-bind:for="controlEditorId"
:style="labelStyle"
@click.stop="onLabelClick"
></label>
<span
v-if="control.description"
class="property-description backend-icon-background-pseudo"
v-bind:data-tooltip-text="control.description"
></span>
</div>
</th>
<td v-bind:colspan="controlColspan">
<div class="full-width-control-label" v-if="isFullWidth && (control.title || control.description) && ! controlLabelHidden">
<label
class="inspector-padding-control-left"
v-text="control.title"
v-bind:for="controlEditorId"
:style="labelStyle"
@click.stop="onLabelClick"
></label>
<div
v-if="control.description"
class="inspector-padding-control-left full-width-property-description"
v-text="control.description"
:style="labelStyle"
></div>
</div>
<div :class="{'inspector-control-container': !isFullWidth, 'no-property-title': !control.title && !control.description}">
<div v-if="!isFullWidth" class="inspector-drag-handle"></div>
<backend-component-inspector-control-text
v-if="control.type == 'string' || control.type == 'text'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:splitter-data="splitterData"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="onEditorFocus"
@blur="onEditorBlur"
@invalid="onEditorInvalid"
@valid="onEditorValid"
></backend-component-inspector-control-text>
<backend-component-inspector-control-dropdown
v-if="control.type == 'dropdown'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="onEditorFocus"
@blur="onEditorBlur"
@invalid="onEditorInvalid"
@valid="onEditorValid"
></backend-component-inspector-control-dropdown>
<backend-component-inspector-control-autocomplete
v-if="control.type == 'autocomplete'"
:obj="obj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="onEditorFocus"
@blur="onEditorBlur"
@invalid="onEditorInvalid"
@valid="onEditorValid"
></backend-component-inspector-control-autocomplete>
<backend-component-inspector-control-checkbox
v-if="control.type == 'checkbox'"
:obj="obj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="onEditorFocus"
@blur="onEditorBlur"
@invalid="onEditorInvalid"
@valid="onEditorValid"
></backend-component-inspector-control-checkbox>
<backend-component-inspector-control-table
v-if="control.type == 'table'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
ref="editor"
@hidebottomborder="bottomBorderHidden = true"
@hidefullwidthlabel="controlLabelHidden = true"
></backend-component-inspector-control-table>
<backend-component-inspector-control-object
v-if="control.type == 'object'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
ref="editor"
@hidefullwidthlabel="controlLabelHidden = true"
@hidebottomborder="bottomBorderHidden = true"
></backend-component-inspector-control-object>
<backend-component-inspector-control-set
v-if="control.type == 'set'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
ref="editor"
@hidefullwidthlabel="controlLabelHidden = true"
@hidebottomborder="bottomBorderHidden = true"
></backend-component-inspector-control-set>
<backend-component-inspector-control-objectlist
v-if="control.type == 'objectList'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
ref="editor"
@hidefullwidthlabel="controlLabelHidden = true"
@hidebottomborder="bottomBorderHidden = true"
></backend-component-inspector-control-objectlist>
<backend-component-inspector-control-objectlist-records
v-if="control.type == 'objectListRecords'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
ref="editor"
@hidefullwidthlabel="controlLabelHidden = true"
@hidebottomborder="bottomBorderHidden = true"
@inspectorcommand="$emit('inspectorcommand', $event)"
></backend-component-inspector-control-objectlist-records>
<backend-component-inspector-control-dictionary
v-if="control.type == 'dictionary'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:inspector-preferences="inspectorPreferences"
:splitter-data="splitterData"
:inspector-unique-id="inspectorUniqueId"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
ref="editor"
@hidefullwidthlabel="controlLabelHidden = true"
@hidebottomborder="bottomBorderHidden = true"
></backend-component-inspector-control-dictionary>
<backend-component-inspector-control-mediafinder
v-if="control.type == 'mediafinder'"
:obj="obj"
:parent-obj="parentObj"
:control="control"
:control-id="controlEditorId"
:splitter-data="splitterData"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="onEditorFocus"
@blur="onEditorBlur"
@invalid="onEditorInvalid"
@valid="onEditorValid"
></backend-component-inspector-control-mediafinder> </div>
</td>
</tr>
<div>
<input
v-if="control.type == 'string'"
class="inspector-control"
type="text"
ref="input"
v-bind:value="valueWithPreset"
v-bind:id="controlId"
v-bind:placeholder="control.placeholder"
v-bind:readonly="inspectorPreferences.readOnly"
@input="updateValue"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
/>
<textarea
v-if="control.type == 'text'"
class="component-backend-inspector-textinput inspector-control"
:class="cssClass"
ref="input"
v-bind:value="valueWithPreset"
v-bind:id="controlId"
v-bind:placeholder="control.placeholder"
v-bind:readonly="inspectorPreferences.readOnly"
@keydown.enter.stop
@input="updateValue"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
></textarea>
<div
v-if="control.type == 'text'"
class="inspector-textarea-shadow inspector-control component-backend-inspector-textinput"
ref="textareaShadow"
v-text="valueWithPreset"
></div>
</div>
<div v-bind:tabindex="containerTabIndex" @focus="onContainerFocus">
<backend-component-loading-indicator v-if="loadingDynamicOptions"
size="tiny"
></backend-component-loading-indicator>
<backend-component-dropdown
v-if="!loadingDynamicOptions"
:options="options"
:id="controlId"
:placeholder="control.placeholder"
:tabindex="0"
:disabled="inspectorPreferences.readOnly"
:allow-empty="true"
track-by="code"
label="label"
ref="input"
v-model="selectedValue"
select-label=""
selected-label=""
deselect-label=""
@input="updateValue"
@open="onFocus"
@close="onBlur"
@hook:mounted="onDropdownMounted"
>
<span slot="noResult">No options found</span>
<template v-if="useValuesAsIcons || useValuesAsColors" slot="option" slot-scope="props">
<div class="option-with-icon" v-if="useValuesAsIcons">
<div class="option-icon" :class="props.option.code"></div>
<span>{{ props.option.label }}</span>
</div>
<div class="option-with-color" v-if="useValuesAsColors">
<div class="option-color" :style="{'background-color': props.option.code}"></div>
<span>{{ props.option.label }}</span>
</div>
</template>
</backend-component-dropdown>
</div>
<div class="inspector-control">
<div
class="component-backend-inspector-checkbox"
>
<label
tabindex="0"
@keydown="onLabelKeydown"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
>
<input
type="checkbox"
ref="input"
value="1"
v-bind:checked="isChecked"
v-bind:id="controlId"
v-bind:readonly="inspectorPreferences.readOnly"
v-bind:disabled="inspectorPreferences.readOnly"
@input="updateValue"
/><span class="backend-icon-background-pseudo"></span>
</label>
</div>
</div>
<div
class="component-backend-inspector-table"
data-lang-add-item="Add item"
>
<table>
<backend-component-inspector-control-table-head
:columns="columns"
>
</backend-component-inspector-control-table-head>
<tbody>
<backend-component-inspector-control-table-row
v-for="(row, index) in value"
:row="row"
:key="index"
:columns="columns"
:row-index="index"
:inspector-preferences="inspectorPreferences"
:table-configuration="tableConfiguration"
@removerow="onRemoveRowClick"
>
</backend-component-inspector-control-table-row>
</tbody>
</table>
<div v-if="tableConfiguration.adding" class="inspector-padding-control-left table-control-links">
<a
href="#"
class="add-item-link"
:class="{disabled: inspectorPreferences.readOnly}"
@click.stop.prevent="onAddItemClick"
v-text="control.btnAddRowLabel === undefined ? lang.addItem : control.btnAddRowLabel"
></a>
</div>
</div>
<thead @mousedown.stop="onHandleMouseDown">
<tr>
<backend-component-inspector-control-table-headcell
v-for="(column, index) in columns"
:key="index"
:column="column"
:column-index="index"
:column-width="columnWidth"
>
</backend-component-inspector-control-table-headcell>
</tr>
</thead>
<th v-bind:style="cellStyle">
<div class="header-cell-container">
<div v-if="columnIndex != 0" class="cell-resize-handle"></div>
<span v-text="column.title"></span>
</div>
</th>
<tr :class="{focused: focused, 'has-errors': hasErrors}">
<backend-component-inspector-control-table-cell
v-for="(column, index) in columns"
:key="index"
:column="column"
:row="row"
:cell-index="index"
:inspector-preferences="inspectorPreferences"
:table-configuration="tableConfiguration"
:is-last-cell="index == columns.length-1"
@focus="onCellFocus"
@blur="onCellBlur"
@valid="onValid"
@invalid="onInvalid"
@removerow="$emit('removerow', rowIndex)"
>
</backend-component-inspector-control-table-cell>
</tr>
<td>
<div class="table-cell-container">
<backend-component-inspector-control-table-text
v-if="column.type == 'string'"
:row="row"
:column="column"
:cell-index="cellIndex"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
@valid="$emit('valid', $event)"
@invalid="$emit('invalid', $event)"
>
</backend-component-inspector-control-table-text>
<backend-component-inspector-control-table-dropdown
v-if="column.type == 'dropdown'"
:row="row"
:column="column"
:cell-index="cellIndex"
:inspector-preferences="inspectorPreferences"
ref="editor"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
@valid="$emit('valid', $event)"
@invalid="$emit('invalid', $event)"
>
</backend-component-inspector-control-table-dropdown>
<button v-if="isLastCell && tableConfiguration.deleting && !inspectorPreferences.readOnly" @click.stop="$emit('removerow')" class="remove-row-btn"></button>
</div>
</td>
<input
type="text"
class="inspector-table-control-text"
v-model="row[column.column]"
ref="input"
v-bind:readonly="inspectorPreferences.readOnly"
@focus="$emit('focus', $event)"
@blur="$emit('blur', $event)"
/>
<div
v-bind:tabindex="containerTabIndex"
@focus="onContainerFocus"
class="inspector-table-dropdown-container"
>
<backend-component-dropdown
:options="options"
:placeholder="column.placeholder"
:tabindex="0"
:disabled="inspectorPreferences.readOnly"
:allow-empty="true"
track-by="code"
label="label"
ref="editor"
v-model="selectedValue"
select-label=""
selected-label=""
deselect-label=""
@input="updateValue"
@open="onFocus"
@close="onBlur"
>
<span slot="noResult">No options found</span>
</backend-component-dropdown>
<div class="dropdown-placeholder" v-if="!hasValue" v-text="column.placeholder"></div>
</div>
<div>
<backend-component-inspector-group
:group-name="control.title"
:obj="editedObject"
:controls="control.properties"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
ref="group"
>
</backend-component-inspector-group>
</div>
<div>
<backend-component-inspector-group
:group-name="control.title"
:obj="editedObject"
:controls="nestedControlProperties"
:splitter-data="splitterData"
:depth="depth"
:group-value="groupValue"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
:loading="loadingDynamicOptions"
ref="group"
>
</backend-component-inspector-group>
</div>
<div
data-lang-key-required="The Key field is required"
data-lang-value-required="The Value field is required"
>
<backend-component-inspector-group
:group-name="control.title"
:obj="editedObject"
:controls="nestedControlProperties"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:group-value="groupValue"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
:hide-bottom-border="true"
ref="group"
>
</backend-component-inspector-group>
</div>
<div
data-lang-error="Error"
data-lang-prop-cant-be-empty="Property :property cannot be empty"
data-lang-key-value-exists="Value is already defined: :property_value"
>
<backend-component-inspector-group
:group-name="control.title"
:obj="editedObject"
:parent-obj="obj"
:controls="nestedControlProperties"
:splitter-data="splitterData"
:depth="depth"
:panel-update-data="panelUpdateData"
:layout-update-data="layoutUpdateData"
:inspector-unique-id="inspectorUniqueId"
:inspector-preferences="inspectorPreferences"
ref="group"
@inspectorcommand="onInspectorCommand"
>
</backend-component-inspector-group>
</div>
<div
class="component-backend-inspector-table"
data-lang-add-item="Add item"
>
<table v-if="hasValues">
<tbody>
<tr v-for="(record, key) in obj">
<td class="no-sub-controls" :class="{clickable: !inspectorPreferences.readOnly}" @click.stop="onItemClick(key)">
<div class="clickable-data-container">
<backend-component-inspector-control-objectlist-record-title
:control="control"
:record="record"
:parent-obj="parentObj"
:obj="obj"
></backend-component-inspector-control-objectlist-record-title>
<button v-if="!inspectorPreferences.readOnly" @click.stop.prevent="onRemoveItemClick(key)" class="remove-row-btn"></button>
</div>
</td>
</tr>
</tbody>
</table>
<div class="inspector-padding-control-left table-control-links">
<a
href="#"
class="add-item-link"
:class="{disabled: inspectorPreferences.readOnly || !displayAddItem}"
:disabled="inspectorPreferences.readOnly || !displayAddItem"
@click.stop.prevent="onAddItemClick"
v-text="lang.addItem"
></a>
</div>
</div>
<div class="title-container">
<backend-component-loading-indicator v-if="loadingDynamicTitle"
size="tiny"
></backend-component-loading-indicator>
<template v-else>
<span class="record-color" v-if="recordColor" :style="{'background-color': recordColor}"></span>
<span v-text="recordTitle"></span>
</template>
</div>
<div>
<backend-component-loading-indicator v-if="loadingDynamicOptions"
size="tiny"
></backend-component-loading-indicator>
<backend-component-autocomplete
v-if="!loadingDynamicOptions"
ref="autocomplete"
:search="onSearch"
:getResultValue="getResultValue"
:placeholder="placeholder"
:defaultValue="initialValue"
:readonly="inspectorPreferences.readOnly"
v-bind:id="controlId"
@input="onInput"
@change="onChange"
@update="onUpdate"
@focus="onFocus"
@blur="onBlur"
>
<template #result="{ result, props }">
<li v-bind="props" class="autocomplete-result">
{{ result.value }}
</li>
</template>
</backend-component-autocomplete>
</div>
<div
data-lang-error-not-image="The selected file is not an image"
data-lang-placeholder="Click to select a file"
class="inspector-control-clearable"
>
<div
class="inspector-control clickable act-as-text-input"
:class="cssClass"
:tabindex="0"
@focus="onFocus"
@blur="onBlur"
ref="input"
v-text:value="displayedText"
v-bind:readonly="inspectorPreferences.readOnly"
@click.stop="onClick"
@keydown.stop="onKeyDown"
></div>
<button v-if="this.value && !inspectorPreferences.readOnly" @click.stop="onClearClick" class="clear-value"></button>
</div>
<div
data-default-button-text="OK"
>
<backend-component-modal
ref="modal"
:aria-labeled-by="modalTitleId"
:unique-key="uniqueId"
:size="size"
:store-position="true"
:resizable="resizableWidth ? 'horizontal' : false"
:resize-default-width="600"
:close-by-esc="!readOnly"
:modal-temporary-hidden="layoutUpdateData.modalTemporaryHidden"
@hidden="onHidden"
@resized="onResized"
@shown="onShown"
@enterkey="onEnterKey"
>
<template v-slot:content>
<div class="modal-header">
<h4 class="modal-title" v-bind:id="modalTitleId" v-text="title"></h4>
<button
@click.prevent="onCloseClick"
type="button"
class="btn-close"
v-bind:disabled="readOnly"
aria-label="Close"
tabindex="0"
></button>
</div>
<div class="modal-body inspector-modal-host">
<backend-component-inspector
:data-schema="dataSchema"
:data="data"
:live-mode="liveMode"
:unique-id="uniqueId"
:layout-update-data="layoutUpdateData"
:read-only="readOnly"
ref="inspector"
>
</backend-component-inspector>
</div>
<div class="modal-footer">
<button
type="button"
class="btn btn-primary btn-default-action"
data-default-focus
@click="onApplyClick"
v-text="primaryButtonText"
v-bind:disabled="readOnly"
></button>
<span class="button-separator">or</span>
<button
class="btn btn-link text-muted"
:class="{disabled: readOnly}"
@click.prevent="onCancelClick"
>Cancel</button>
</div>
</template>
</backend-component-modal>
</div>
<div
class="component-backend-splitter" :class="cssClass"
>
<div class="flex-layout-item fix splitter-first-panel" :style="firstPanelStyle" ref="firstPanel">
<slot name="first">
Left panel
</slot>
</div>
<div
class="flex-layout-item fix splitter-handle"
:class="{dragging: dragging}"
ref="handle"
@mousedown.stop="onHandleMouseDown"
></div>
<div class="flex-layout-item stretch relative">
<slot name="second">
Right panel
</slot>
</div>
</div>
<div
class="component-backend-tabs flex-layout-column"
:class="cssClass"
data-lang-close="Close Tab"
data-lang-close-all="Close All"
data-lang-close-others="Close Others"
data-lang-close-saved="Close Saved"
>
<div class="tablist-container flex-layout-item fix" v-show="!hideTabPanel">
<div class="flex-layout-row tablist-scrollable-container" :class="{'has-fixed-panel': supportsFullScreen && hasTabs}" ref="scrollableTabsContainer">
<div class="tabs-scrollable flex-layout-item stretch" ref="scrollable">
<div
class="tablist flex-layout-row"
role="tablist"
ref="tabList"
v-bind:aria-label="ariaLabel"
@keydown="onKeyDown"
>
<button
v-for="tab in tabs"
role="tab"
data-component-backend-tab
class="flex-layout-item"
:class="{
active: currentTabKey == tab.key,
stretch: tabsStyle == 'document',
fix: tabsStyle == 'form',
'has-icon': tab.icon || tab.fatalError,
'has-close-button': closeable
}"
v-bind:id="getTabId(tab, 'tab')"
v-bind:aria-controls="getTabId(tab, 'panel')"
v-bind:aria-selected="currentTabKey == tab.key ? 'true' : 'false'"
v-bind:tabindex="currentTabKey == tab.key ? 0 : -1"
v-bind:data-tooltip-text="getTooltipText(tab)"
@click.ignore="onClick(tab)"
@mouseup.middle="onMiddleClick(tab)"
@contextmenu.stop="onContextMenu($event, tab)"
>
<span
class="tab-icon"
:class="{'tab-error': tab.fatalError}"
v-if="tab.icon"
aria-hidden="true"
>
<span
class="tab-icon-background"
v-bind:style="getTabIconStyle(tab)"
>
<i
:class="tab.icon.cssClass"
></i>
</span>
<i class="backend-icon-background tab-error"></i>
</span>
<span v-text="tab.label" role="text"></span>
<span
class="backend-icon-background-pseudo close-tab"
:class="{'has-changes': tab.hasChanges}"
v-bind:tabindex="currentTabKey == tab.key ? 0 : -1"
v-if="closeable"
role="button"
aria-hidden="true"
aria-label="Close Tab"
v-bind:title="closeTooltip ? '' : 'Close Tab'"
v-bind:data-tooltip-text="closeTooltip"
v-bind:data-tooltip-hotkey="closeTooltipHotkey"
@click.stop.prevent="onCloseClick(tab)"
>✕</span>
</button>
</div>
</div>
<div class="flex-layout-item fix fixed-right tabs-toolbar" v-if="supportsFullScreen && hasTabs">
<div class="toolbar-container">
<button
class="backend-toolbar-button icon-only"
data-tooltip-text="Toggle Full Screen"
@click.stop.prevent="onToggleFullscreen"
>
<i :class="{'icon-fullscreen': !isFullScreen, 'icon-fullscreen-collapse': isFullScreen}"></i>
</button>
</div>
</div>
</div>
</div>
<template v-if="!noPanes">
<div
v-for="tab in tabs"
role="tabpanel"
tabindex="0"
:key="getTabUniqueKey(tab)"
v-show="currentTabKey == tab.key"
v-bind:id="getTabId(tab, 'panel')"
v-bind:aria-labelledby="getTabId(tab, 'tab')"
class="tabpanel flex-layout-item stretch relative"
:class="tabPanelCssClass"
>
<component
v-if="!useSlots"
:ref="getTabComponentRefName(tab)"
v-bind:is="tab.component"
:component-data="tab.componentData"
@tabfatalerror="onTabFatalError(tab)"
@tabkeychanged="onTabkeyChanged"
@tabclose="onHostedComponentTabClose(tab)"
></component>
<slot v-else :name="tab.key"></slot>
</div>
</template>
<slot v-if="!tabs.length" name="noTabsView"></slot>
<backend-component-dropdownmenu
:items="contextMenuItems"
:menu-id="contextMenuId"
:labeled-by-id="contextMenuLabeledById"
ref="contextmenu"
@command="onMenuItemCommand"
></backend-component-dropdownmenu>
</div>
<div
class="flex-layout-column component-backend-monaco-editor"
:class="cssClass"
data-configuration="{"vendorPath":"https:\/\/www.olbg.com\/modules\/backend\/vuecomponents\/monacoeditor\/assets\/vendor\/monaco","fontSize":"12px","tabSize":4,"useEmmet":true,"yamlSchemas":[{"uri":"https:\/\/www.olbg.com\/modules\/tailor\/assets\/js\/blueprint-yaml-schema.json","fileMatch":["*-blueprint.yaml"]}],"renderLineHighlight":"all","useTabStops":false,"renderIndentGuides":false,"renderWhitespace":"all","autoClosingBrackets":"languageDefined","autoClosingQuotes":"languageDefined","hover":{"delay":750},"wordWrap":"off","theme":"vs-dark"}"
>
<div class="flex-layout-item fix" v-if="showTabs">
<backend-component-tabs
:tabs="editorTabs"
:closeable="false"
:no-panes="true"
:container-css-class="tabsContainerCssClass"
:tooltips-enabled="false"
tabs-style="monaco-editor"
@tabselected="onTabSelected"
></backend-component-tabs>
</div>
<div class="flex-layout-item stretch position-relative h-100" style="overflow: hidden">
<div
class="flex-layout-column fill-container"
:class="editorContainerCssClass"
ref="editorContainer"
@dragover.capture="onDragOver"
@drop.capture="onDragDrop"
></div>
</div>
</div>
Star Sports changed their welcome offer from Bet £10 Get £20, to Bet £20 Get £40.
June 2025
In June Star Sports changed to their current welcome offer from the offer: Get 50% back as a free bet up to £25 if your first bet loses.
March 2025
In March, Star Sports changed their welcome offer from a matched free bet up to £20 with 50 free spins, to Bet £40 Get £25 in free bets.
FAQ
Bookie Review FAQs - Star Sports
-
Who are Star Sports?
Star Sports is the UK's Leading Independent Bookmaker. It has a sportsbook and casino and is legally authorised to operate in the UK under the name Star Racing Ltd.
-
When did Star Sports launch?
Star Racing Ltd launched its online sportsbook – Star Sports – in 1999.
-
What are withdrawal times at Star Sports?
Withdrawal times depend on the payment method used, but typically Star Sports will pay out its customers in 1-3 business days.