Hotel Raxa - Advanced Booking System Implementation

🏨 Hotel Booking Enhancements:
- Implemented Eagle Booking Advanced Pricing add-on
- Added Booking.com-style rate management system
- Created professional calendar interface for pricing
- Integrated deals and discounts functionality

💰 Advanced Pricing Features:
- Dynamic pricing models (per room, per person, per adult)
- Base rates, adult rates, and child rates management
- Length of stay discounts and early bird deals
- Mobile rates and secret deals implementation
- Seasonal promotions and flash sales

📅 Availability Management:
- Real-time availability tracking
- Stop sell and restriction controls
- Closed to arrival/departure functionality
- Minimum/maximum stay requirements
- Automatic sold-out management

💳 Payment Integration:
- Maintained Redsys payment gateway integration
- Seamless integration with existing Eagle Booking
- No modifications to core Eagle Booking plugin

🛠️ Technical Implementation:
- Custom database tables for advanced pricing
- WordPress hooks and filters integration
- AJAX-powered admin interface
- Data migration from existing Eagle Booking
- Professional calendar view for revenue management

📊 Admin Interface:
- Booking.com-style management dashboard
- Visual rate and availability calendar
- Bulk operations for date ranges
- Statistics and analytics dashboard
- Modal dialogs for quick editing

🔧 Code Quality:
- WordPress coding standards compliance
- Secure database operations with prepared statements
- Proper input validation and sanitization
- Error handling and logging
- Responsive admin interface

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Hotel Raxa Dev
2025-07-11 07:43:22 +02:00
commit 5b1e2453c7
9816 changed files with 2784509 additions and 0 deletions

View File

@@ -0,0 +1,216 @@
<?php
/**
* Spinner Field
*
* @package Redux Framework/Fields
* @author Dovy Paukstys & Kevin Provance (kprovance)
* @version 4.0.0
*/
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( 'Redux_Spinner', false ) ) {
/**
* Class Redux_Spinner
*/
class Redux_Spinner extends Redux_Field {
/**
* Set field and value defaults.
*/
public function set_defaults() {
$params = array(
'min' => 0,
'max' => 1,
'step' => 1,
'default' => '',
'edit' => true,
'plus' => '+',
'minus' => '-',
'format' => '',
'prefix' => '',
'suffix' => '',
'point' => '.',
'places' => null,
);
$this->field = wp_parse_args( $this->field, $params );
}
/**
* Field Render Function.
* Takes the vars and outputs the HTML for the field in the settings
*
* @since ReduxFramework 3.0.0
*/
public function render() {
$data_string = '';
foreach ( $this->field as $key => $val ) {
if ( in_array( $key, array( 'min', 'max', 'step', 'default', 'plus', 'minus', 'prefix', 'suffix', 'point', 'places' ), true ) ) {
$data_string .= ' data-' . esc_attr( $key ) . '="' . esc_attr( $val ) . '" ';
}
}
$data_string .= ' data-val=' . $this->value;
// Don't allow input edit if there's a step.
$readonly = '';
if ( isset( $this->field['edit'] ) && false === $this->field['edit'] ) {
$readonly = ' readonly="readonly"';
}
echo '<div id="' . esc_attr( $this->field['id'] ) . '-spinner" class="redux_spinner" rel="' . esc_attr( $this->field['id'] ) . '">';
echo '<input type="text" ' . $data_string . ' name="' . esc_attr( $this->field['name'] . $this->field['name_suffix'] ) . '" id="' . esc_attr( $this->field['id'] ) . '" value="' . esc_attr( $this->value ) . '" class="mini spinner-input ' . esc_attr( $this->field['class'] ) . '"' . $readonly . '/>'; // phpcs:ignore WordPress.Security.EscapeOutput
echo '</div>';
}
/**
* Clean the field data to the fields defaults given the parameters.
*
* @since Redux_Framework 3.1.1
*/
private function clean() {
if ( empty( $this->field['min'] ) ) {
$this->field['min'] = 0;
} else {
$this->field['min'] = intval( $this->field['min'] );
}
if ( empty( $this->field['max'] ) ) {
$this->field['max'] = $this->field['min'] + 1;
} else {
$this->field['max'] = intval( $this->field['max'] );
}
if ( empty( $this->field['step'] ) || $this->field['step'] > $this->field['max'] ) {
$this->field['step'] = 1;
} else {
$this->field['step'] = intval( $this->field['step'] );
}
if ( empty( $this->value ) && ! empty( $this->field['default'] ) && $this->field['min'] >= 1 ) {
$this->value = intval( $this->field['default'] );
}
if ( empty( $this->value ) && $this->field['min'] >= 1 ) {
$this->value = $this->field['min'];
}
if ( empty( $this->value ) ) {
$this->value = 0;
}
// Extra Validation.
if ( $this->value < $this->field['min'] ) {
$this->value = $this->field['min'];
} elseif ( $this->value > $this->field['max'] ) {
$this->value = $this->field['max'];
}
}
/**
* Enqueue Function.
* If this field requires any scripts, or css define this function and register/enqueue the scripts/css
*
* @since ReduxFramework 3.0.0
*/
public function enqueue() {
wp_enqueue_script(
'redux-field-spinner-custom',
Redux_Core::$url . 'inc/fields/spinner/vendor/jquery.ui.spinner' . Redux_Functions::is_min() . '.js',
array( 'jquery', 'redux-js' ),
$this->timestamp,
true
);
wp_enqueue_script(
'redux-field-spinner',
Redux_Core::$url . 'inc/fields/spinner/redux-spinner' . Redux_Functions::is_min() . '.js',
array( 'jquery', 'redux-field-spinner-custom', 'jquery-ui-core', 'jquery-ui-dialog', 'redux-js' ),
$this->timestamp,
true
);
if ( $this->parent->args['dev_mode'] ) {
wp_enqueue_style(
'redux-field-spinner',
Redux_Core::$url . 'inc/fields/spinner/redux-spinner.css',
array(),
$this->timestamp
);
}
}
/**
* CSS/compiler output.
*
* @param string|null|array $style CSS styles.
*/
public function output( $style = '' ) {
if ( ! empty( $this->value ) ) {
if ( ! empty( $this->field['output'] ) && is_array( $this->field['output'] ) ) {
$css = $this->parse_css( $this->value, $this->field['output'] );
$this->parent->outputCSS .= esc_attr( $css );
}
if ( ! empty( $this->field['compiler'] ) && is_array( $this->field['compiler'] ) ) {
$css = $this->parse_css( $this->value, $this->field['compiler'] );
$this->parent->compilerCSS .= esc_attr( $css );
}
}
}
/**
* Compile CSS data for output.
*
* @param mixed $value Value.
* @param mixed $output .
*
* @return string
*/
private function parse_css( $value, $output ): string {
// No notices.
$css = '';
$unit = $this->field['output_unit'] ?? 'px';
// Must be an array.
if ( is_array( $output ) ) {
foreach ( $output as $selector => $mode ) {
if ( '' !== $mode && '' !== $selector ) {
$css .= $selector . '{' . $mode . ':' . $value . $unit . ';}';
}
}
}
return $css;
}
/**
* Generate CSS style (unused, but needed).
*
* @param string $data Field data.
*
* @return string
*/
public function css_style( $data ): string {
return '';
}
/**
* Enable output_variables to be generated.
*
* @since 4.0.3
* @return void
*/
public function output_variables() {
// No code needed, just defining the method is enough.
}
}
}
class_alias( 'Redux_Spinner', 'ReduxFramework_Spinner' );

View File

@@ -0,0 +1,8 @@
<?php
/**
* Silence is golden.
*
* @package Redux Framework
*/
_deprecated_file( 'field_spinner.php', '4.3', 'class-redux-spinner.php', 'This file has been renamed and is no longer used in Redux 4. Please change any references to it as it will be removed in future versions of Redux.' );

View File

@@ -0,0 +1,8 @@
<?php
/**
* Silence is golden.
*
* @package Redux Framework
*/
echo null;

View File

@@ -0,0 +1,37 @@
.redux-container-spinner .spinner-wrpr { position: relative; display: block; height: 30px; overflow: hidden; }
.redux-container-spinner .spinner-wrpr .spinner-input { position: relative !important; z-index: 1; width: 75px !important; height: 30px !important; background: #eee !important; border: 1px solid #bfbfbf !important; border-right: 0 !important; border-left: 0 !important; border-radius: 0 !important; }
.redux-container-spinner .ui-spinner { position: static; display: inline; }
.redux-container-spinner .ui-spinner-buttons { position: absolute; padding: 0; }
.redux-container-spinner .ui-widget .ui-spinner-button { color: #fff; position: absolute; top: 0; padding: 0 0 30px; overflow: hidden; cursor: pointer; background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3)); background: -webkit-linear-gradient(#fff, #f3f3f3); background: linear-gradient(#fff, #f3f3f3); background-color: #fff; border: none; -webkit-box-shadow: none; box-shadow: none; }
.redux-container-spinner .ui-spinner-button:hover, .redux-container-spinner .ui-state-hover { background: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#fff)); background: -webkit-linear-gradient(#f3f3f3, #fff); background: linear-gradient(#f3f3f3, #fff); background-color: #f3f3f3; }
.redux-container-spinner .ui-corner-tr, .redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-n { border-radius: 0 3px 3px 0; }
.redux-container-spinner .ui-corner-br, .redux-container-spinner .ui-spinner-button .ui-icon-triangle-1-s { border-radius: 3px 0 0 3px; }
.redux-container-spinner .ui-spinner-button .ui-icon { top: 0; display: block; width: 28px; height: 28px; margin: 0; border: 1px solid #b7b7b7; background-image: initial; text-indent: 0; text-align: center; font-size: 18px; line-height: 26px; }
.dp-numberPicker, .dp-numberPicker-add, .dp-numberPicker-sub, .dp-numberPicker-input { display: inline-block; -webkit-box-sizing: border-box; box-sizing: border-box; text-align: center; vertical-align: top; height: 30px; }
.dp-numberPicker { border-radius: 3px; }
.redux-container .redux-container-spinner .dp-numberPicker-add, .redux-container .redux-container-spinner .dp-numberPicker-sub { width: 30px; font-size: 21px; cursor: pointer; -moz-user-select: none; -webkit-user-select: none; background-color: #33b5e5; color: #fff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); height: 29px !important; }
.redux-container .redux-container-spinner .dp-numberPicker-add.disabled, .redux-container .redux-container-spinner .dp-numberPicker-sub.disabled { background-color: #2c6a81; }
.dp-numberPicker-add { border-top-right-radius: 3px; border-bottom-right-radius: 3px; }
.dp-numberPicker-sub { border-top-left-radius: 3px; border-bottom-left-radius: 3px; }
.dp-numberPicker-input { width: 70px; background-color: #eee; border: 0; margin: 0 !important; -webkit-box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.5), inset 0 -1px 1px rgba(0, 0, 0, 0.5); box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.5), inset 0 -1px 1px rgba(0, 0, 0, 0.5); }
.dp-numberPicker-input:disabled { background-color: #eee; }
/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdXgtc3Bpbm5lci5jc3MiLCJzb3VyY2VzIjpbInJlZHV4LXNwaW5uZXIuc2NzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxBQUNJLHdCQURvQixDQUNwQixhQUFhLENBQUMsRUFDVixRQUFRLEVBQUUsUUFBUSxFQUNsQixPQUFPLEVBQUUsS0FBSyxFQUNkLE1BQU0sRUFBRSxJQUFJLEVBQ1osUUFBUSxFQUFFLE1BQU0sR0FlbkI7O0FBcEJMLEFBT1Esd0JBUGdCLENBQ3BCLGFBQWEsQ0FNVCxjQUFjLENBQUMsRUFDWCxRQUFRLEVBQUUsbUJBQW1CLEVBQzdCLE9BQU8sRUFBRSxDQUFDLEVBQ1YsS0FBSyxFQUFFLGVBQWUsRUFDdEIsTUFBTSxFQUFFLGVBQWUsRUFDdkIsVUFBVSxFQUFFLGVBQWUsRUFDM0IsTUFBTSxFQUFFLDRCQUE0QixFQUNwQyxZQUFZLEVBQUUsWUFBWSxFQUMxQixXQUFXLEVBQUUsWUFBWSxFQUN6QixxQkFBcUIsRUFBRSxZQUFZLEVBQ25DLGtCQUFrQixFQUFFLFlBQVksRUFDaEMsYUFBYSxFQUFFLFlBQVksR0FDOUI7O0FBbkJULEFBc0JJLHdCQXRCb0IsQ0FzQnBCLFdBQVcsQ0FBQyxFQUNSLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE9BQU8sRUFBRSxNQUFNLEdBQ2xCOztBQXpCTCxBQTRCSSx3QkE1Qm9CLENBNEJwQixtQkFBbUIsQ0FBQyxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNsQixPQUFPLEVBQUUsQ0FBQyxHQUNiOztBQS9CTCxBQWlDSSx3QkFqQ29CLENBaUNwQixVQUFVLENBQUMsa0JBQWtCLENBQUMsRUFDMUIsS0FBSyxFQUFFLElBQUksRUFDWCxRQUFRLEVBQUUsUUFBUSxFQUNsQixHQUFHLEVBQUUsQ0FBQyxFQUNOLE9BQU8sRUFBRSxRQUFRLEVBQ2pCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE1BQU0sRUFBRSxPQUFPLEVBQ2YsVUFBVSxFQUFFLG1DQUFtQyxFQUMvQyxVQUFVLEVBQUUsaUNBQWlDLEVBQzdDLFVBQVUsRUFBRSx3RUFBd0UsRUFDcEYsVUFBVSxFQUFFLDhCQUE4QixFQUMxQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQ3RCLE1BQU0sRUFBRSxJQUFJLEVBQ1osa0JBQWtCLEVBQUUsSUFBSSxFQUN4QixlQUFlLEVBQUUsSUFBSSxFQUNyQixVQUFVLEVBQUUsSUFBSSxHQUNuQjs7QUFqREwsQUFtREksd0JBbkRvQixDQW1EcEIsa0JBQWtCLEFBQUEsTUFBTSxFQW5ENUIsd0JBQXdCLENBb0RwQixlQUFlLENBQUMsRUFDWixVQUFVLEVBQUUsbUNBQW1DLEVBQy9DLFVBQVUsRUFBRSxpQ0FBaUMsRUFDN0MsVUFBVSxFQUFFLHdFQUF3RSxFQUNwRixVQUFVLEVBQUUsOEJBQThCLEVBQzFDLGdCQUFnQixFQUFFLE9BQU8sR0FDNUI7O0FBMURMLEFBNERJLHdCQTVEb0IsQ0E0RHBCLGFBQWEsRUE1RGpCLHdCQUF3QixDQTZEcEIsa0JBQWtCLENBQUMscUJBQXFCLENBQUMsRUFDckMscUJBQXFCLEVBQUUsV0FBVyxFQUNsQyxrQkFBa0IsRUFBRSxXQUFXLEVBQy9CLGFBQWEsRUFBRSxXQUFXLEdBQzdCOztBQWpFTCxBQW1FSSx3QkFuRW9CLENBbUVwQixhQUFhLEVBbkVqQix3QkFBd0IsQ0FvRXBCLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLEVBQ3JDLHFCQUFxQixFQUFFLFdBQVcsRUFDbEMsa0JBQWtCLEVBQUUsV0FBVyxFQUMvQixhQUFhLEVBQUUsV0FBVyxHQUM3Qjs7QUF4RUwsQUEyRVEsd0JBM0VnQixDQTBFcEIsa0JBQWtCLENBQ2QsUUFBUSxDQUFDLEVBQ0wsR0FBRyxFQUFFLENBQUMsRUFDTixPQUFPLEVBQUUsS0FBSyxFQUNkLEtBQUssRUFBRSxJQUFJLEVBQ1gsTUFBTSxFQUFFLElBQUksRUFDWixNQUFNLEVBQUUsQ0FBQyxFQUNULE1BQU0sRUFBRSxpQkFBaUIsRUFDekIsZ0JBQWdCLEVBQUUsT0FBTyxFQUN6QixXQUFXLEVBQUUsQ0FBQyxFQUNkLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLFNBQVMsRUFBRSxJQUFJLEVBQ2YsV0FBVyxFQUFFLElBQUksR0FDcEI7O0FBSVQsQUFBQSxnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixzQkFBc0IsQ0FBQyxFQUNuQixPQUFPLEVBQUUsWUFBWSxFQUNyQixVQUFVLEVBQUUsVUFBVSxFQUN0QixVQUFVLEVBQUUsTUFBTSxFQUNsQixjQUFjLEVBQUUsR0FBRyxFQUNuQixNQUFNLEVBQUUsSUFBSSxHQUNmOztBQUVELEFBQUEsZ0JBQWdCLENBQUMsRUFDYixhQUFhLEVBQUUsR0FBRyxHQUNyQjs7QUFFRCxBQUFBLGdCQUFnQixDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixFQUM5RCxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxvQkFBb0IsQ0FBQyxFQUMzRCxLQUFLLEVBQUUsSUFBSSxFQUNYLFNBQVMsRUFBRSxJQUFJLEVBQ2YsTUFBTSxFQUFFLE9BQU8sRUFDZixnQkFBZ0IsRUFBRSxJQUFJLEVBQ3RCLG1CQUFtQixFQUFFLElBQUksRUFDekIsZ0JBQWdCLEVBQUUsT0FBTyxFQUN6QixLQUFLLEVBQUUsSUFBSSxFQUNYLFdBQVcsRUFBRSxDQUFDLENBQUUsSUFBRyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsRUFDekMsTUFBTSxFQUFFLGVBQWUsR0FLMUI7O0FBZkQsQUFZSSxnQkFaWSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixBQVl6RCxTQUFTLEVBWGQsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsb0JBQW9CLEFBV3pELFNBQVMsQ0FBQyxFQUNQLGdCQUFnQixFQUFFLE9BQU8sR0FDNUI7O0FBR0wsQUFBQSxvQkFBb0IsQ0FBQyxFQUNqQix1QkFBdUIsRUFBRSxHQUFHLEVBQzVCLDBCQUEwQixFQUFFLEdBQUcsR0FDbEM7O0FBRUQsQUFBQSxvQkFBb0IsQ0FBQyxFQUNqQixzQkFBc0IsRUFBRSxHQUFHLEVBQzNCLHlCQUF5QixFQUFFLEdBQUcsR0FDakM7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQyxFQUNuQixLQUFLLEVBQUUsSUFBSSxFQUNYLGdCQUFnQixFQUFFLElBQUksRUFDdEIsTUFBTSxFQUFFLENBQUMsRUFDVCxNQUFNLEVBQUUsWUFBWSxFQUNwQixVQUFVLEVBQ04sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUN4QyxLQUFLLENBQUMsQ0FBQyxDQUFFLElBQUcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBSzFDOztBQVpELEFBU0ksc0JBVGtCLEFBU2pCLFNBQVMsQ0FBQyxFQUNQLGdCQUFnQixFQUFFLElBQUksR0FDekIifQ== */
/*# sourceMappingURL=redux-spinner.css.map */

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,58 @@
/* global redux */
(function( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.spinner = redux.field_objects.spinner || {};
redux.field_objects.spinner.init = function( selector ) {
selector = $.redux.getSelector( selector, 'spinner' );
$( selector ).each(
function() {
var el = $( this );
var parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
el.find( '.redux_spinner' ).each(
function() {
// Slider init.
var spinner = $( this ).find( '.spinner-input' ).data();
spinner.id = $( this ).find( '.spinner-input' ).attr( 'id' );
el.find( '#' + spinner.id ).spinner(
{
value: parseFloat( spinner.val, null ),
min: parseFloat( spinner.min, null ),
max: parseFloat( spinner.max, null ),
step: parseFloat( spinner.step, null ),
addText: spinner.plus,
subText: spinner.minus,
prefix: spinner.prefix,
suffix: spinner.suffix,
places: spinner.places,
point: spinner.point
}
);
}
);
}
);
};
})( jQuery );

View File

@@ -0,0 +1 @@
!function(n){"use strict";redux.field_objects=redux.field_objects||{},redux.field_objects.spinner=redux.field_objects.spinner||{},redux.field_objects.spinner.init=function(e){e=n.redux.getSelector(e,"spinner"),n(e).each(function(){var i=n(this),e=i;(e=i.hasClass("redux-field-container")?e:i.parents(".redux-field-container:first")).is(":hidden")||e.hasClass("redux-field-init")&&(e.removeClass("redux-field-init"),i.find(".redux_spinner").each(function(){var e=n(this).find(".spinner-input").data();e.id=n(this).find(".spinner-input").attr("id"),i.find("#"+e.id).spinner({value:parseFloat(e.val,null),min:parseFloat(e.min,null),max:parseFloat(e.max,null),step:parseFloat(e.step,null),addText:e.plus,subText:e.minus,prefix:e.prefix,suffix:e.suffix,places:e.places,point:e.point})}))})}}(jQuery);

View File

@@ -0,0 +1,146 @@
.redux-container-spinner {
.spinner-wrpr {
position: relative;
display: block;
height: 30px;
overflow: hidden;
.spinner-input {
position: relative !important;
z-index: 1;
width: 75px !important;
height: 30px !important;
background: #eee !important;
border: 1px solid #bfbfbf !important;
border-right: 0 !important;
border-left: 0 !important;
-webkit-border-radius: 0 !important;
-moz-border-radius: 0 !important;
border-radius: 0 !important;
}
}
.ui-spinner {
position: static;
display: inline;
}
.ui-spinner-buttons {
position: absolute;
padding: 0;
}
.ui-widget .ui-spinner-button {
color: #fff;
position: absolute;
top: 0;
padding: 0 0 30px;
overflow: hidden;
cursor: pointer;
background: -moz-linear-gradient(#fff, #f3f3f3);
background: -o-linear-gradient(#fff, #f3f3f3);
background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3));
background: linear-gradient(#fff, #f3f3f3);
background-color: #fff;
border: none;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.ui-spinner-button:hover,
.ui-state-hover {
background: -moz-linear-gradient(#f3f3f3, #fff);
background: -o-linear-gradient(#f3f3f3, #fff);
background: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#fff));
background: linear-gradient(#f3f3f3, #fff);
background-color: #f3f3f3;
}
.ui-corner-tr,
.ui-spinner-button .ui-icon-triangle-1-n {
-webkit-border-radius: 0 5px 5px 0;
-moz-border-radius: 0 3px 3px 0;
border-radius: 0 3px 3px 0;
}
.ui-corner-br,
.ui-spinner-button .ui-icon-triangle-1-s {
-webkit-border-radius: 5px 0 0 5px;
-moz-border-radius: 3px 0 0 3px;
border-radius: 3px 0 0 3px;
}
.ui-spinner-button {
.ui-icon {
top: 0;
display: block;
width: 28px;
height: 28px;
margin: 0;
border: 1px solid #b7b7b7;
background-image: initial;
text-indent: 0;
text-align: center;
font-size: 18px;
line-height: 26px;
}
}
}
.dp-numberPicker,
.dp-numberPicker-add,
.dp-numberPicker-sub,
.dp-numberPicker-input {
display: inline-block;
box-sizing: border-box;
text-align: center;
vertical-align: top;
height: 30px;
}
.dp-numberPicker {
border-radius: 3px;
}
.redux-container .redux-container-spinner .dp-numberPicker-add,
.redux-container .redux-container-spinner .dp-numberPicker-sub {
width: 30px;
font-size: 21px;
cursor: pointer;
-moz-user-select: none;
-webkit-user-select: none;
background-color: #33b5e5;
color: #fff;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
height: 29px !important;
&.disabled {
background-color: #2c6a81;
}
}
.dp-numberPicker-add {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.dp-numberPicker-sub {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.dp-numberPicker-input {
width: 70px;
background-color: #eee;
border: 0;
margin: 0 !important;
box-shadow:
inset 0 1px 1px rgba(255, 255, 255, 0.5),
inset 0 -1px 1px rgba(0, 0, 0, 0.5);
&:disabled {
background-color: #eee;
}
}