diff --git a/README.adoc b/README.adoc index 2230a2c..743bd4b 100644 --- a/README.adoc +++ b/README.adoc @@ -141,6 +141,13 @@ $ gradle run * alert * alert-success, alert-info, alert-warning, alert-danger +== Groups + + * btn-group-horizontal + * btn-group-vertical + +*NOTE:* all elements inside the vertical button group must have the same width. + === Miscellaneous * badge diff --git a/subprojects/bootstrapfx-core/src/sass/resources/bootstrap/_button-groups.scss b/subprojects/bootstrapfx-core/src/sass/resources/bootstrap/_button-groups.scss index 43d235c..aeddce2 100644 --- a/subprojects/bootstrapfx-core/src/sass/resources/bootstrap/_button-groups.scss +++ b/subprojects/bootstrapfx-core/src/sass/resources/bootstrap/_button-groups.scss @@ -1,244 +1,277 @@ // // Button groups // -------------------------------------------------- - -// Make the div behave like a button -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; // match .btn alignment given font-size hack above - > .btn { - position: relative; - float: left; - // Bring the "active" button to the front - &:hover, - &:focus, - &:active, - &.active { - z-index: 2; - } - } -} - -// Prevent double borders when buttons are next to each other -.btn-group { - .btn + .btn, - .btn + .btn-group, - .btn-group + .btn, - .btn-group + .btn-group { - margin-left: -1px; - } -} - -// Optional: Group multiple button groups together for a toolbar -.btn-toolbar { - margin-left: -5px; // Offset the first child's margin - @include clearfix; - - .btn, - .btn-group, - .input-group { - float: left; - } - > .btn, - > .btn-group, - > .input-group { - margin-left: 5px; - } -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match -.btn-group > .btn:first-child { - margin-left: 0; - &:not(:last-child):not(.dropdown-toggle) { - @include border-right-radius(0); - } -} -// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - @include border-left-radius(0); -} - -// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child:not(:last-child) { - > .btn:last-child, - > .dropdown-toggle { - @include border-right-radius(0); - } -} -.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { - @include border-left-radius(0); -} - -// On active and open, don't show outline -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - - -// Sizing // -// Remix the default button sizing classes into new ones for easier manipulation. - -.btn-group-xs > .btn { @extend .btn-xs; } -.btn-group-sm > .btn { @extend .btn-sm; } -.btn-group-lg > .btn { @extend .btn-lg; } - - -// Split button dropdowns -// ---------------------- - -// Give the line between buttons some depth -.btn-group > .btn + .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} - -// The clickable button for toggling the menu -// Remove the gradient and set the same inset shadow as the :active state -.btn-group.open .dropdown-toggle { - @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); - - // Show no shadow for `.btn-link` since it has no other button styles. - &.btn-link { - @include box-shadow(none); +.btn-group-horizontal { + > .first { + -fx-border-radius: 4 0 0 4; + -fx-background-radius: 4 0 0 4; } -} - - -// Reposition the caret -.btn .caret { - margin-left: 0; -} -// Carets in other button sizes -.btn-lg .caret { - border-width: $caret-width-large $caret-width-large 0; - border-bottom-width: 0; -} -// Upside down carets for .dropup -.dropup .btn-lg .caret { - border-width: 0 $caret-width-large $caret-width-large; -} - - -// Vertical button groups -// ---------------------- - -.btn-group-vertical { - > .btn, - > .btn-group, - > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; + > .middle { + -fx-border-radius: 0; + -fx-background-radius: 0; } - - // Clear floats so dropdown menus can be properly placed - > .btn-group { - @include clearfix; - > .btn { - float: none; - } + > .last { + -fx-border-radius: 0 4 4 0; + -fx-background-radius: 0 4 4 0; } - - > .btn + .btn, - > .btn + .btn-group, - > .btn-group + .btn, - > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; - } -} - -.btn-group-vertical > .btn { - &:not(:first-child):not(:last-child) { - border-radius: 0; - } - &:first-child:not(:last-child) { - border-top-right-radius: $btn-border-radius-base; - @include border-bottom-radius(0); - } - &:last-child:not(:first-child) { - border-bottom-left-radius: $btn-border-radius-base; - @include border-top-radius(0); - } -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) { - > .btn:last-child, - > .dropdown-toggle { - @include border-bottom-radius(0); - } -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - @include border-top-radius(0); } - -// Justified button groups -// ---------------------- - -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; - > .btn, - > .btn-group { - float: none; - display: table-cell; - width: 1%; +.btn-group-vertical { + -fx-alignment: center; + -fx-fill-width: true; + > .first { + -fx-border-radius: 4 4 0 0; + -fx-background-radius: 4 4 0 0; } - > .btn-group .btn { - width: 100%; + > .middle { + -fx-border-radius: 0; + -fx-background-radius: 0; } - - > .btn-group .dropdown-menu { - left: auto; + > .last { + -fx-border-radius: 0 0 4 4; + -fx-background-radius: 0 0 4 4; } } -// Checkbox and radio options +//// Make the div behave like a button +//.btn-group, +//.btn-group-vertical { +// position: relative; +// display: inline-block; +// vertical-align: middle; // match .btn alignment given font-size hack above +// > .btn { +// position: relative; +// float: left; +// // Bring the "active" button to the front +// &:hover, +// &:focus, +// &:active, +// &.active { +// z-index: 2; +// } +// } +//} // -// In order to support the browser's form validation feedback, powered by the -// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use -// `display: none;` or `visibility: hidden;` as that also hides the popover. -// Simply visually hiding the inputs via `opacity` would leave them clickable in -// certain cases which is prevented by using `clip` and `pointer-events`. -// This way, we ensure a DOM element is visible to position the popover from. +//// Prevent double borders when buttons are next to each other +//.btn-group { +// .btn + .btn, +// .btn + .btn-group, +// .btn-group + .btn, +// .btn-group + .btn-group { +// margin-left: -1px; +// } +//} // -// See https://github.com/twbs/bootstrap/pull/12794 and -// https://github.com/twbs/bootstrap/pull/14559 for more information. - -[data-toggle="buttons"] { - > .btn, - > .btn-group > .btn { - input[type="radio"], - input[type="checkbox"] { - position: absolute; - clip: rect(0,0,0,0); - pointer-events: none; - } - } -} +//// Optional: Group multiple button groups together for a toolbar +//.btn-toolbar { +// margin-left: -5px; // Offset the first child's margin +// @include clearfix; +// +// .btn, +// .btn-group, +// .input-group { +// float: left; +// } +// > .btn, +// > .btn-group, +// > .input-group { +// margin-left: 5px; +// } +//} +// +//.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { +// border-radius: 0; +//} +// +//// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +//.btn-group > .btn:first-child { +// margin-left: 0; +// &:not(:last-child):not(.dropdown-toggle) { +// @include border-right-radius(0); +// } +//} +//// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +//.btn-group > .btn:last-child:not(:first-child), +//.btn-group > .dropdown-toggle:not(:first-child) { +// @include border-left-radius(0); +//} +// +//// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +//.btn-group > .btn-group { +// float: left; +//} +//.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { +// border-radius: 0; +//} +//.btn-group > .btn-group:first-child:not(:last-child) { +// > .btn:last-child, +// > .dropdown-toggle { +// @include border-right-radius(0); +// } +//} +//.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { +// @include border-left-radius(0); +//} +// +//// On active and open, don't show outline +//.btn-group .dropdown-toggle:active, +//.btn-group.open .dropdown-toggle { +// outline: 0; +//} +// +// +//// Sizing +//// +//// Remix the default button sizing classes into new ones for easier manipulation. +// +//.btn-group-xs > .btn { @extend .btn-xs; } +//.btn-group-sm > .btn { @extend .btn-sm; } +//.btn-group-lg > .btn { @extend .btn-lg; } +// +// +//// Split button dropdowns +//// ---------------------- +// +//// Give the line between buttons some depth +//.btn-group > .btn + .dropdown-toggle { +// padding-left: 8px; +// padding-right: 8px; +//} +//.btn-group > .btn-lg + .dropdown-toggle { +// padding-left: 12px; +// padding-right: 12px; +//} +// +//// The clickable button for toggling the menu +//// Remove the gradient and set the same inset shadow as the :active state +//.btn-group.open .dropdown-toggle { +// @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); +// +// // Show no shadow for `.btn-link` since it has no other button styles. +// &.btn-link { +// @include box-shadow(none); +// } +//} +// +// +//// Reposition the caret +//.btn .caret { +// margin-left: 0; +//} +//// Carets in other button sizes +//.btn-lg .caret { +// border-width: $caret-width-large $caret-width-large 0; +// border-bottom-width: 0; +//} +//// Upside down carets for .dropup +//.dropup .btn-lg .caret { +// border-width: 0 $caret-width-large $caret-width-large; +//} +// +// +//// Vertical button groups +//// ---------------------- +// +//.btn-group-vertical { +// > .btn, +// > .btn-group, +// > .btn-group > .btn { +// display: block; +// float: none; +// width: 100%; +// max-width: 100%; +// } +// +// // Clear floats so dropdown menus can be properly placed +// > .btn-group { +// @include clearfix; +// > .btn { +// float: none; +// } +// } +// +// > .btn + .btn, +// > .btn + .btn-group, +// > .btn-group + .btn, +// > .btn-group + .btn-group { +// margin-top: -1px; +// margin-left: 0; +// } +//} +// +//.btn-group-vertical > .btn { +// &:not(:first-child):not(:last-child) { +// border-radius: 0; +// } +// &:first-child:not(:last-child) { +// border-top-right-radius: $btn-border-radius-base; +// @include border-bottom-radius(0); +// } +// &:last-child:not(:first-child) { +// border-bottom-left-radius: $btn-border-radius-base; +// @include border-top-radius(0); +// } +//} +//.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { +// border-radius: 0; +//} +//.btn-group-vertical > .btn-group:first-child:not(:last-child) { +// > .btn:last-child, +// > .dropdown-toggle { +// @include border-bottom-radius(0); +// } +//} +//.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { +// @include border-top-radius(0); +//} +// +// +//// Justified button groups +//// ---------------------- +// +//.btn-group-justified { +// display: table; +// width: 100%; +// table-layout: fixed; +// border-collapse: separate; +// > .btn, +// > .btn-group { +// float: none; +// display: table-cell; +// width: 1%; +// } +// > .btn-group .btn { +// width: 100%; +// } +// +// > .btn-group .dropdown-menu { +// left: auto; +// } +//} +// +// +//// Checkbox and radio options +//// +//// In order to support the browser's form validation feedback, powered by the +//// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +//// `display: none;` or `visibility: hidden;` as that also hides the popover. +//// Simply visually hiding the inputs via `opacity` would leave them clickable in +//// certain cases which is prevented by using `clip` and `pointer-events`. +//// This way, we ensure a DOM element is visible to position the popover from. +//// +//// See https://github.com/twbs/bootstrap/pull/12794 and +//// https://github.com/twbs/bootstrap/pull/14559 for more information. +// +//[data-toggle="buttons"] { +// > .btn, +// > .btn-group > .btn { +// input[type="radio"], +// input[type="checkbox"] { +// position: absolute; +// clip: rect(0,0,0,0); +// pointer-events: none; +// } +// } +//} diff --git a/subprojects/bootstrapfx-core/src/sass/resources/bootstrapfx.scss b/subprojects/bootstrapfx-core/src/sass/resources/bootstrapfx.scss index f7da35d..a9197e7 100644 --- a/subprojects/bootstrapfx-core/src/sass/resources/bootstrapfx.scss +++ b/subprojects/bootstrapfx-core/src/sass/resources/bootstrapfx.scss @@ -30,7 +30,7 @@ // Components //@import "bootstrap/component-animations"; //@import "bootstrap/dropdowns"; -//@import "bootstrap/button-groups"; +@import "bootstrap/button-groups"; //@import "bootstrap/input-groups"; //@import "bootstrap/navs"; //@import "bootstrap/navbar"; diff --git a/subprojects/sampler/src/main/java/org/kordamp/bootstrapfx/Sampler.java b/subprojects/sampler/src/main/java/org/kordamp/bootstrapfx/Sampler.java index 9ebbe23..e622656 100644 --- a/subprojects/sampler/src/main/java/org/kordamp/bootstrapfx/Sampler.java +++ b/subprojects/sampler/src/main/java/org/kordamp/bootstrapfx/Sampler.java @@ -50,6 +50,7 @@ public void start(Stage primaryStage) throws Exception { tabPane.getTabs().add(new DemoTab("Headings", "text.fxml")); tabPane.getTabs().add(new DemoTab("Text ", "text2.fxml")); tabPane.getTabs().add(new DemoTab("Paragraph ", "paragraph.fxml")); + tabPane.getTabs().add(new DemoTab("Button Groups ", "button_groups.fxml")); Scene scene = new Scene(tabPane); scene.getStylesheets().addAll( diff --git a/subprojects/sampler/src/main/resources/org/kordamp/bootstrapfx/button_groups.fxml b/subprojects/sampler/src/main/resources/org/kordamp/bootstrapfx/button_groups.fxml new file mode 100644 index 0000000..66a2551 --- /dev/null +++ b/subprojects/sampler/src/main/resources/org/kordamp/bootstrapfx/button_groups.fxml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + +