├── .gitignore ├── .project ├── LICENSE ├── README.md ├── clean.sh ├── download.sh ├── load.st ├── src ├── .keep ├── .properties ├── BaselineOfBootstrap │ ├── BaselineOfBootstrap.class.st │ └── package.st ├── Bootstrap-Core │ ├── TBSAlertTag.class.st │ ├── TBSAlerter.class.st │ ├── TBSBreadcrumbSectionTag.class.st │ ├── TBSButtonGroupTag.class.st │ ├── TBSButtonTag.class.st │ ├── TBSCarouselTag.class.st │ ├── TBSConfirmer.class.st │ ├── TBSDeploymentLibrary.class.st │ ├── TBSDeploymentLibraryRTL.class.st │ ├── TBSDevelopmentLibrary.class.st │ ├── TBSDevelopmentLibraryRTL.class.st │ ├── TBSDropdownMenuItem.class.st │ ├── TBSFileLibrary.class.st │ ├── TBSFormTag.class.st │ ├── TBSGenericTag.class.st │ ├── TBSGlyphTag.class.st │ ├── TBSImageTag.class.st │ ├── TBSInputGroupTag.class.st │ ├── TBSJumbotronTag.class.st │ ├── TBSLabelTag.class.st │ ├── TBSLayoutColumnTag.class.st │ ├── TBSLayoutRowTag.class.st │ ├── TBSLinkifyListGroupItem.class.st │ ├── TBSListGroupItem.class.st │ ├── TBSListItemTag.class.st │ ├── TBSModalTag.class.st │ ├── TBSNavItemTag.class.st │ ├── TBSNavTag.class.st │ ├── TBSNavbarTag.class.st │ ├── TBSNavbarToggleButton.class.st │ ├── TBSPageHeaderTag.class.st │ ├── TBSPaginationItemTag.class.st │ ├── TBSPanelTag.class.st │ ├── TBSProgressTag.class.st │ ├── TBSProgressbarTag.class.st │ ├── TBSTabPaneTag.class.st │ ├── TBSTableTag.class.st │ ├── TBSVerticalButtonGroupTag.class.st │ ├── TBSWellTag.class.st │ ├── WAComponent.extension.st │ ├── WAFormInputTag.extension.st │ ├── WAHtmlCanvas.extension.st │ ├── WAImageTag.extension.st │ ├── WATagBrush.extension.st │ └── package.st ├── Bootstrap-Examples │ ├── TBSAccordionExample.class.st │ ├── TBSAlertsExample.class.st │ ├── TBSBadgeExample.class.st │ ├── TBSBatchedListExample.class.st │ ├── TBSBootstrapExample.class.st │ ├── TBSBootstrapTableExample.class.st │ ├── TBSBootstrapTableExampleLibrary.class.st │ ├── TBSBreadcrumbExample.class.st │ ├── TBSButtonDropdownExample.class.st │ ├── TBSButtonExample.class.st │ ├── TBSButtonGroupExample.class.st │ ├── TBSCarouselExample.class.st │ ├── TBSCodeExample.class.st │ ├── TBSDropdownExample.class.st │ ├── TBSExampleBrowser.class.st │ ├── TBSExampleInformsConfirms.class.st │ ├── TBSExamplesHome.class.st │ ├── TBSExamplesLibrary.class.st │ ├── TBSFormsExample.class.st │ ├── TBSGlyphIconsExample.class.st │ ├── TBSGridSystemExample.class.st │ ├── TBSHelperClassesExample.class.st │ ├── TBSImageExample.class.st │ ├── TBSInputGroupExample.class.st │ ├── TBSJasnyButtonLabelsExample.class.st │ ├── TBSJasnyInputMaskExample.class.st │ ├── TBSJasnyNavmenuExample.class.st │ ├── TBSJumbotronExample.class.st │ ├── TBSLabelExample.class.st │ ├── TBSListGroupExample.class.st │ ├── TBSModalExample.class.st │ ├── TBSNavExample.class.st │ ├── TBSNavbarExample.class.st │ ├── TBSOfferExample.class.st │ ├── TBSPageHeaderExample.class.st │ ├── TBSPaginationExample.class.st │ ├── TBSPanelExample.class.st │ ├── TBSProgressBarExample.class.st │ ├── TBSTableExample.class.st │ ├── TBSTableJSONTableExample.class.st │ ├── TBSTableTransformTableExample.class.st │ ├── TBSThumbnailExample.class.st │ ├── TBSTypographyExample.class.st │ ├── TBSVerticalTabsExample.class.st │ ├── TBSWellExample.class.st │ └── package.st ├── Bootstrap-Jasny │ ├── TBSButtonTag.extension.st │ ├── TBSJasnyDeploymentLibrary.class.st │ ├── TBSJasnyDevelopmentLibrary.class.st │ ├── TBSJasnyFileLibrary.class.st │ ├── TBSNavTag.extension.st │ ├── TBSNavmenuTag.class.st │ ├── WAHtmlCanvas.extension.st │ └── package.st ├── Bootstrap-Tests-Core │ ├── TBSCanvasBrushTest.class.st │ ├── TBSDeploymentLibraryTest.class.st │ ├── TBSDevelopmentLibraryTest.class.st │ ├── TBSHolderJSTest.class.st │ └── package.st ├── Bootstrap-Tests-Jasny │ ├── TBSJasnyCanvasBrushTest.class.st │ ├── TBSJasnyDeploymentLibraryTest.class.st │ └── package.st ├── Bootstrap-Tests-Widgets │ ├── TBSAccordionItemTest.class.st │ ├── TBSTableFileLibraryTest.class.st │ ├── TBSVerticalTabsCanvasBrushTest.class.st │ ├── TBSVerticalTabsDeploymentLibraryTest.class.st │ ├── TBSVerticalTabsDevelopmentLibraryTest.class.st │ ├── TBSWidgetsCanvasBrushTest.class.st │ └── package.st ├── Bootstrap-Widgets │ ├── TBSAccordion.class.st │ ├── TBSAccordionItem.class.st │ ├── TBSBatchedList.class.st │ ├── TBSNavTag.extension.st │ ├── TBSOfferTag.class.st │ ├── TBSTableFileLibrary.class.st │ ├── TBSVerticalTabsDeploymentLibrary.class.st │ ├── TBSVerticalTabsDevelopmentLibrary.class.st │ ├── TBSVerticalTabsFileLibrary.class.st │ ├── WAHtmlCanvas.extension.st │ └── package.st └── ConfigurationOfBootstrap │ ├── ConfigurationOfBootstrap.class.st │ └── package.st └── start.sh /.gitignore: -------------------------------------------------------------------------------- 1 | run/ 2 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | { 2 | 'srcDirectory' : 'src' 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Astares 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Seaside-Bootstrap 2 | Bootstrap for Seaside wrapper for Pharo 3 | 4 | **Note:** this is outdated and we only provide it for compatibility. Be aware that there are newer packages available for newer Pharo, Bootstrap and Seaside versions, see: 5 | - https://github.com/astares/Seaside-Bootstrap4 6 | - https://github.com/astares/Seaside-Bootstrap5 7 | 8 | ## Prerequisites 9 | 10 | ### Pharo 6 11 | 12 | In Pharo 6 first run: 13 | 14 | ```Smalltalk 15 | Iceberg enableMetacelloIntegration: true. 16 | IceMetacelloPharoPlatform select. 17 | ``` 18 | 19 | then proceed with the load expressions given in "Installation" section. 20 | 21 | ### Pharo 7 and Pharo 8 22 | 23 | You can clone the project and run the download.sh script 24 | 25 | ``` 26 | git clone https://github.com/astares/Seaside-Bootstrap.git 27 | cd Seaside-Bootstrap 28 | ./download.sh 29 | ``` 30 | 31 | If you already have a Pharo 7 or later image just proceed with the load expressions given in "Installation" section. 32 | 33 | ## Installation 34 | 35 | ### Loading latest stable version using config 36 | 37 | ```Smalltalk 38 | Metacello new 39 | configuration:'Bootstrap'; 40 | repository: 'github://astares/Seaside-Bootstrap:master/src'; 41 | version: #stable; 42 | load 43 | ``` 44 | 45 | ### Loading latest *development* version using baseline 46 | 47 | ```Smalltalk 48 | Metacello new 49 | baseline:'Bootstrap'; 50 | repository: 'github://astares/Seaside-Bootstrap:master/src'; 51 | load 52 | ``` 53 | -------------------------------------------------------------------------------- /clean.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -rf run 4 | -------------------------------------------------------------------------------- /download.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | mkdir run 4 | cd run 5 | wget -O- get.pharo.org/64/70+vm | bash 6 | ./pharo-ui Pharo.image ../load.st 7 | -------------------------------------------------------------------------------- /load.st: -------------------------------------------------------------------------------- 1 | Metacello new 2 | baseline:'Bootstrap'; 3 | repository: 'github://astares/Seaside-Bootstrap:master/src'; 4 | load. 5 | 6 | ZnZincServerAdaptor startOn: 8080. 7 | WebBrowser openOn: 'http://localhost:8080/bootstrap/' 8 | -------------------------------------------------------------------------------- /src/.keep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/.properties: -------------------------------------------------------------------------------- 1 | { 2 | #format : #tonel 3 | } -------------------------------------------------------------------------------- /src/BaselineOfBootstrap/BaselineOfBootstrap.class.st: -------------------------------------------------------------------------------- 1 | " 2 | The BaselineOf for Seaside Bootstrap for Pharo [https://github.com/astares/Seaside-Bootstrap5](https://github.com/astares/Seaside-Bootstrap5) 3 | " 4 | Class { 5 | #name : #BaselineOfBootstrap, 6 | #superclass : #BaselineOf, 7 | #category : #BaselineOfBootstrap 8 | } 9 | 10 | { #category : #baselines } 11 | BaselineOfBootstrap >> baseline: spec [ 12 | 13 | 14 | spec for: #'pharo6.x' do: [ 15 | spec preLoadDoIt: #preLoad61. 16 | self 17 | seaside3: spec; 18 | bootstrap: spec ]. 19 | 20 | spec for: #'common' do: [ 21 | self 22 | seaside3: spec; 23 | bootstrap: spec ] 24 | ] 25 | 26 | { #category : #baselines } 27 | BaselineOfBootstrap >> bootstrap: spec [ 28 | 29 | spec 30 | package: 'Bootstrap-Core' with: [ 31 | spec requires: #('Seaside3' ). ]; 32 | package: 'Bootstrap-Widgets' with: [ 33 | spec requires: #('Bootstrap-Core' ). ]; 34 | package: 'Bootstrap-Tests-Core' with: [ 35 | spec requires: #('Bootstrap-Core' ). ]; 36 | package: 'Bootstrap-Tests-Widgets' with: [ 37 | spec requires: #('Bootstrap-Widgets' ). ]; 38 | package: 'Bootstrap-Jasny'; 39 | package: 'Bootstrap-Examples' with: [ 40 | spec requires: #('Bootstrap-Core' 'Bootstrap-Widgets' 'Bootstrap-Jasny' ). ]; 41 | package: 'Bootstrap-Tests-Jasny' with: [ 42 | spec requires: #('Bootstrap-Jasny' ). ]. 43 | spec 44 | group: 'Core' with: #('Bootstrap-Core' ); 45 | group: 'Widgets' with: #('Bootstrap-Widgets' ); 46 | group: 'Tests' with: #('Bootstrap-Tests-Core' 'Bootstrap-Tests-Widgets' 'Bootstrap-Tests-Jasny' ); 47 | group: 'Examples' with: #('Bootstrap-Examples' ); 48 | group: 'Jasny' with: #('Bootstrap-Jasny' ); 49 | group: 'default' with: #('Core' 'Widgets' 'Jasny' 'Tests' 'Examples' ) 50 | ] 51 | 52 | { #category : #baselines } 53 | BaselineOfBootstrap >> preLoad61 [ 54 | 55 | Iceberg enableMetacelloIntegration: true. 56 | IceMetacelloPharoPlatform select 57 | ] 58 | 59 | { #category : #'private - subspecs' } 60 | BaselineOfBootstrap >> seaside3: spec [ 61 | spec 62 | baseline: 'Seaside3' 63 | with: [ spec 64 | loads: #('default' 'REST'); 65 | repository: 'github://SeasideSt/Seaside:master/repository' ] 66 | ] 67 | -------------------------------------------------------------------------------- /src/BaselineOfBootstrap/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfBootstrap } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSAlertTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap alert 3 | " 4 | Class { 5 | #name : #TBSAlertTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSAlertTag >> beDanger [ 12 | 13 | self class: 'alert-danger' 14 | ] 15 | 16 | { #category : #options } 17 | TBSAlertTag >> beInfo [ 18 | 19 | self class: 'alert-info' 20 | ] 21 | 22 | { #category : #options } 23 | TBSAlertTag >> beSuccess [ 24 | 25 | self class: 'alert-success' 26 | ] 27 | 28 | { #category : #options } 29 | TBSAlertTag >> beWarning [ 30 | 31 | self class: 'alert-warning' 32 | ] 33 | 34 | { #category : #initialization } 35 | TBSAlertTag >> initialize [ 36 | super initialize. 37 | self class: 'alert' 38 | ] 39 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSAlerter.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An alerter component 3 | " 4 | Class { 5 | #name : #TBSAlerter, 6 | #superclass : #WAComponent, 7 | #instVars : [ 8 | 'text', 9 | 'state' 10 | ], 11 | #category : 'Bootstrap-Core-Component' 12 | } 13 | 14 | { #category : #'instance creation' } 15 | TBSAlerter class >> dangerOn: aText [ 16 | ^(self on: aText) 17 | beDanger; 18 | yourself 19 | ] 20 | 21 | { #category : #'instance creation' } 22 | TBSAlerter class >> on: aText [ 23 | ^self new 24 | text: aText; 25 | yourself 26 | ] 27 | 28 | { #category : #'instance creation' } 29 | TBSAlerter class >> successOn: aText [ 30 | ^(self on: aText) 31 | beSuccess; 32 | yourself 33 | ] 34 | 35 | { #category : #'instance creation' } 36 | TBSAlerter class >> warningOn: aText [ 37 | ^(self on: aText) 38 | beWarning; 39 | yourself 40 | ] 41 | 42 | { #category : #accessing } 43 | TBSAlerter >> beDanger [ 44 | self state: #danger 45 | ] 46 | 47 | { #category : #accessing } 48 | TBSAlerter >> beSuccess [ 49 | self state: #success 50 | ] 51 | 52 | { #category : #accessing } 53 | TBSAlerter >> beWarning [ 54 | self state: #warning 55 | ] 56 | 57 | { #category : #testing } 58 | TBSAlerter >> isDanger [ 59 | ^self state = #danger 60 | ] 61 | 62 | { #category : #testing } 63 | TBSAlerter >> isSuccess [ 64 | ^self state = #success 65 | ] 66 | 67 | { #category : #testing } 68 | TBSAlerter >> isWarning [ 69 | ^self state = #warning 70 | ] 71 | 72 | { #category : #actions } 73 | TBSAlerter >> ok [ 74 | self answer 75 | ] 76 | 77 | { #category : #rendering } 78 | TBSAlerter >> renderButtonsOn: canvas [ 79 | canvas tbsButton on: #ok of: self 80 | ] 81 | 82 | { #category : #rendering } 83 | TBSAlerter >> renderContentOn: canvas [ 84 | self renderMessageOn: canvas. 85 | canvas form: [ 86 | self renderButtonsOn: canvas ] 87 | ] 88 | 89 | { #category : #rendering } 90 | TBSAlerter >> renderMessageOn: canvas [ 91 | | tag | 92 | tag := canvas tbsAlert. 93 | self isSuccess ifTrue: [ tag beSuccess ]. 94 | self isWarning ifTrue: [ tag beWarning ]. 95 | self isDanger ifTrue: [ tag beDanger ]. 96 | tag with: self text 97 | ] 98 | 99 | { #category : #accessing } 100 | TBSAlerter >> state [ 101 | ^ state 102 | ] 103 | 104 | { #category : #accessing } 105 | TBSAlerter >> state: aSymbol [ 106 | state := aSymbol 107 | ] 108 | 109 | { #category : #accessing } 110 | TBSAlerter >> text [ 111 | ^ text 112 | ] 113 | 114 | { #category : #accessing } 115 | TBSAlerter >> text: anObject [ 116 | text := anObject 117 | ] 118 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSBreadcrumbSectionTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Bootstrap breadcrumb section 3 | " 4 | Class { 5 | #name : #TBSBreadcrumbSectionTag, 6 | #superclass : #TBSListItemTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSButtonGroupTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Bootstrap button group 3 | " 4 | Class { 5 | #name : #TBSButtonGroupTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #sizes } 11 | TBSButtonGroupTag >> beExtraSmall [ 12 | "Creates an extra small sized button group." 13 | 14 | self beExtraSmallIf: true 15 | ] 16 | 17 | { #category : #sizes } 18 | TBSButtonGroupTag >> beExtraSmallIf: aBlock [ 19 | "Creates an extra small sized button group if aBlock is true." 20 | 21 | self class: 'btn-group-xs' if: aBlock 22 | ] 23 | 24 | { #category : #sizes } 25 | TBSButtonGroupTag >> beJustified [ 26 | "Creates a justified button group." 27 | 28 | self beJustifiedIf: true 29 | ] 30 | 31 | { #category : #sizes } 32 | TBSButtonGroupTag >> beJustifiedIf: aBlock [ 33 | "Creates a justified button group if aBlock is true." 34 | 35 | self class: 'btn-group-justified' if: aBlock 36 | ] 37 | 38 | { #category : #sizes } 39 | TBSButtonGroupTag >> beLarge [ 40 | "Creates an large sized button group." 41 | 42 | self beLargeIf: true 43 | ] 44 | 45 | { #category : #sizes } 46 | TBSButtonGroupTag >> beLargeIf: aBlock [ 47 | "Creates an large sized button group if aBlock is true." 48 | 49 | self class: 'btn-group-lg' if: aBlock 50 | ] 51 | 52 | { #category : #sizes } 53 | TBSButtonGroupTag >> beSmall [ 54 | "Creates an small sized button group." 55 | 56 | self beSmallIf: true 57 | ] 58 | 59 | { #category : #sizes } 60 | TBSButtonGroupTag >> beSmallIf: aBlock [ 61 | "Creates a small sized button group if aBlock is true." 62 | 63 | self class: 'btn-group-sm' if: aBlock 64 | ] 65 | 66 | { #category : #accessing } 67 | TBSButtonGroupTag >> defaultStyleClass [ 68 | 69 | ^'btn-group' 70 | ] 71 | 72 | { #category : #initialization } 73 | TBSButtonGroupTag >> initialize [ 74 | super initialize. 75 | self class: self defaultStyleClass 76 | ] 77 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSButtonTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap button 3 | " 4 | Class { 5 | #name : #TBSButtonTag, 6 | #superclass : #WAButtonTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #sizes } 11 | TBSButtonTag >> beBlock [ 12 | "Creates an extra small sized button." 13 | self beBlockIf: true 14 | ] 15 | 16 | { #category : #sizes } 17 | TBSButtonTag >> beBlockIf: aBlock [ 18 | "Creates an block sized button if aBlock is true." 19 | self class: 'btn-block' if: aBlock 20 | ] 21 | 22 | { #category : #options } 23 | TBSButtonTag >> beDanger [ 24 | "Creates an Danger type button." 25 | self beDangerIf: true 26 | ] 27 | 28 | { #category : #options } 29 | TBSButtonTag >> beDangerIf: aBlock [ 30 | "Creates an Danger type button if aBlock is true." 31 | self class: 'btn-danger' if: aBlock 32 | ] 33 | 34 | { #category : #options } 35 | TBSButtonTag >> beDefault [ 36 | "Creates an Default type button." 37 | self beDefaultIf: true 38 | ] 39 | 40 | { #category : #options } 41 | TBSButtonTag >> beDefaultIf: aBlock [ 42 | "Creates an default type button if aBlock is true." 43 | self class: 'btn-default' if: aBlock 44 | ] 45 | 46 | { #category : #options } 47 | TBSButtonTag >> beDisabled [ 48 | "Creates an Default type button." 49 | self beDisabledIf: true 50 | ] 51 | 52 | { #category : #options } 53 | TBSButtonTag >> beDisabledIf: aBlock [ 54 | "Creates an default type button if aBlock is true." 55 | aBlock value ifTrue: [ self disabled: 'disabled' ] 56 | ] 57 | 58 | { #category : #sizes } 59 | TBSButtonTag >> beExtraSmall [ 60 | "Creates an extra small sized button." 61 | self beExtraSmallIf: true 62 | ] 63 | 64 | { #category : #sizes } 65 | TBSButtonTag >> beExtraSmallIf: aBlock [ 66 | "Creates an extra small sized button if aBlock is true." 67 | self class: 'btn-xs' if: aBlock 68 | ] 69 | 70 | { #category : #options } 71 | TBSButtonTag >> beInfo [ 72 | "Creates an Info type button." 73 | self beInfoIf: true 74 | ] 75 | 76 | { #category : #options } 77 | TBSButtonTag >> beInfoIf: aBlock [ 78 | "Creates an Info type button if aBlock is true." 79 | self class: 'btn-info' if: aBlock 80 | ] 81 | 82 | { #category : #options } 83 | TBSButtonTag >> beInverse [ 84 | "Creates an Inverse type button." 85 | self class: 'btn-inverse' 86 | ] 87 | 88 | { #category : #sizes } 89 | TBSButtonTag >> beLarge [ 90 | "Creates an large sized button." 91 | self beLargeIf: true 92 | ] 93 | 94 | { #category : #sizes } 95 | TBSButtonTag >> beLargeIf: aBlock [ 96 | "Creates an large sized button if aBlock is true." 97 | self class: 'btn-lg' if: aBlock 98 | ] 99 | 100 | { #category : #options } 101 | TBSButtonTag >> beLink [ 102 | "Creates an Link type button." 103 | self beLinkIf: true 104 | ] 105 | 106 | { #category : #options } 107 | TBSButtonTag >> beLinkIf: aBlock [ 108 | "Creates an Link type button if aBlock is true." 109 | self class: 'btn-link' if: aBlock 110 | ] 111 | 112 | { #category : #options } 113 | TBSButtonTag >> beNavbarButton [ 114 | 115 | self class: 'navbar-btn' 116 | ] 117 | 118 | { #category : #options } 119 | TBSButtonTag >> bePrimary [ 120 | "Creates an Primary type button." 121 | self bePrimaryIf: true 122 | ] 123 | 124 | { #category : #options } 125 | TBSButtonTag >> bePrimaryIf: aBlock [ 126 | "Creates an Primary type button if aBlock is true." 127 | self class: 'btn-primary' if: aBlock value 128 | ] 129 | 130 | { #category : #sizes } 131 | TBSButtonTag >> beSmall [ 132 | "Creates an small sized button." 133 | self beSmallIf: true 134 | ] 135 | 136 | { #category : #sizes } 137 | TBSButtonTag >> beSmallIf: aBlock [ 138 | "Creates a small sized button if aBlock is true." 139 | self class: 'btn-sm' if: aBlock 140 | ] 141 | 142 | { #category : #options } 143 | TBSButtonTag >> beSuccess [ 144 | "Creates an Success type button if aBlock is true." 145 | self beSuccessIf: true 146 | ] 147 | 148 | { #category : #options } 149 | TBSButtonTag >> beSuccessIf: aBlock [ 150 | "Creates an Success type button if aBlock is true." 151 | self class: 'btn-success' if: aBlock 152 | ] 153 | 154 | { #category : #options } 155 | TBSButtonTag >> beWarning [ 156 | "Creates an Warning type button." 157 | self beWarningIf: true 158 | ] 159 | 160 | { #category : #options } 161 | TBSButtonTag >> beWarningIf: aBlock [ 162 | "Creates an Warning type button if aBlock is true." 163 | self class: 'btn-warning' if: aBlock 164 | ] 165 | 166 | { #category : #callbacks } 167 | TBSButtonTag >> cancelCallback: aBlock [ 168 | self name: (self storeCallback: (WACancelActionCallback on: aBlock)) 169 | ] 170 | 171 | { #category : #options } 172 | TBSButtonTag >> dataDismiss: aString [ 173 | 174 | self attributes at: 'data-dismiss' put: aString 175 | ] 176 | 177 | { #category : #initialization } 178 | TBSButtonTag >> initialize [ 179 | super initialize. 180 | self resetType. 181 | self class: 'btn' 182 | ] 183 | 184 | { #category : #private } 185 | TBSButtonTag >> resetType [ 186 | type := nil 187 | 188 | ] 189 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSCarouselTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap carousel 3 | " 4 | Class { 5 | #name : #TBSCarouselTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #initialization } 11 | TBSCarouselTag >> initialize [ 12 | super initialize. 13 | self class: 'carousel' 14 | ] 15 | 16 | { #category : #options } 17 | TBSCarouselTag >> slide [ 18 | self class: 'slide' 19 | ] 20 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSConfirmer.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A confirmation component 3 | " 4 | Class { 5 | #name : #TBSConfirmer, 6 | #superclass : #TBSAlerter, 7 | #category : 'Bootstrap-Core-Component' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSConfirmer >> no [ 12 | self answer: false 13 | ] 14 | 15 | { #category : #rendering } 16 | TBSConfirmer >> renderButtonsOn: canvas [ 17 | canvas tbsButtonGroup: [ 18 | (canvas tbsButton on: #yes of: self) bePrimary. 19 | canvas tbsButton on: #no of: self ]. 20 | 21 | ] 22 | 23 | { #category : #accessing } 24 | TBSConfirmer >> yes [ 25 | self answer: true 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSDeploymentLibraryRTL.class.st: -------------------------------------------------------------------------------- 1 | " 2 | self recursivelyAddAllFilesIn: 'C:\bootstrap-3.1.1-dist\' 3 | " 4 | Class { 5 | #name : #TBSDeploymentLibraryRTL, 6 | #superclass : #TBSDeploymentLibrary, 7 | #category : 'Bootstrap-Core-Libraries' 8 | } 9 | 10 | { #category : #'uploaded metadata' } 11 | TBSDeploymentLibraryRTL >> bootstraprtlminCss [ 12 | ^ WAFileLibraryResource 13 | filepath: 'bootstrap-rtl.min.css' 14 | mimeType: (WAMimeType main: 'text' sub: 'css') 15 | cacheDuration: (Duration days: 0 hours: 0 minutes: 30 seconds: 0) 16 | contents: (GRDelayedSend receiver: self selector: #bootstraprtlminCssContent) 17 | ] 18 | 19 | { #category : #uploaded } 20 | TBSDeploymentLibraryRTL >> bootstraprtlminCssContent [ 21 | ^ '/******************************************************************************* 22 | * bootstrap-rtl (Version 3.2.0-rc5) 23 | * Author: Morteza Ansarinia (http://github.com/morteza) 24 | * Created on: September 08,2014 25 | * Project: bootstrap-rtl 26 | * Copyright: See the file "LICENSE.md" for the full license governing this code. 27 | *******************************************************************************/ 28 | 29 | html{direction:rtl}body{direction:rtl}.list-unstyled{padding-right:0;padding-left:initial}.list-inline{padding-right:0;padding-left:initial;margin-right:-5px;margin-left:0}dd{margin-right:0;margin-left:initial}@media (min-width:768px){.dl-horizontal dt{float:right;clear:right;text-align:left}.dl-horizontal dd{margin-right:180px;margin-left:0}}blockquote{border-right:5px solid #eee;border-left:0}.blockquote-reverse,blockquote.pull-left{padding-left:15px;padding-right:0;border-left:5px solid #eee;border-right:0;text-align:left}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:right}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{left:100%;right:auto}.col-xs-pull-11{left:91.66666667%;right:auto}.col-xs-pull-10{left:83.33333333%;right:auto}.col-xs-pull-9{left:75%;right:auto}.col-xs-pull-8{left:66.66666667%;right:auto}.col-xs-pull-7{left:58.33333333%;right:auto}.col-xs-pull-6{left:50%;right:auto}.col-xs-pull-5{left:41.66666667%;right:auto}.col-xs-pull-4{left:33.33333333%;right:auto}.col-xs-pull-3{left:25%;right:auto}.col-xs-pull-2{left:16.66666667%;right:auto}.col-xs-pull-1{left:8.33333333%;right:auto}.col-xs-pull-0{left:auto;right:auto}.col-xs-push-12{right:100%;left:0}.col-xs-push-11{right:91.66666667%;left:0}.col-xs-push-10{right:83.33333333%;left:0}.col-xs-push-9{right:75%;left:0}.col-xs-push-8{right:66.66666667%;left:0}.col-xs-push-7{right:58.33333333%;left:0}.col-xs-push-6{right:50%;left:0}.col-xs-push-5{right:41.66666667%;left:0}.col-xs-push-4{right:33.33333333%;left:0}.col-xs-push-3{right:25%;left:0}.col-xs-push-2{right:16.66666667%;left:0}.col-xs-push-1{right:8.33333333%;left:0}.col-xs-push-0{right:auto;left:0}.col-xs-offset-12{margin-right:100%;margin-left:0}.col-xs-offset-11{margin-right:91.66666667%;margin-left:0}.col-xs-offset-10{margin-right:83.33333333%;margin-left:0}.col-xs-offset-9{margin-right:75%;margin-left:0}.col-xs-offset-8{margin-right:66.66666667%;margin-left:0}.col-xs-offset-7{margin-right:58.33333333%;margin-left:0}.col-xs-offset-6{margin-right:50%;margin-left:0}.col-xs-offset-5{margin-right:41.66666667%;margin-left:0}.col-xs-offset-4{margin-right:33.33333333%;margin-left:0}.col-xs-offset-3{margin-right:25%;margin-left:0}.col-xs-offset-2{margin-right:16.66666667%;margin-left:0}.col-xs-offset-1{margin-right:8.33333333%;margin-left:0}.col-xs-offset-0{margin-right:0;margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:right}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{left:100%;right:auto}.col-sm-pull-11{left:91.66666667%;right:auto}.col-sm-pull-10{left:83.33333333%;right:auto}.col-sm-pull-9{left:75%;right:auto}.col-sm-pull-8{left:66.66666667%;right:auto}.col-sm-pull-7{left:58.33333333%;right:auto}.col-sm-pull-6{left:50%;right:auto}.col-sm-pull-5{left:41.66666667%;right:auto}.col-sm-pull-4{left:33.33333333%;right:auto}.col-sm-pull-3{left:25%;right:auto}.col-sm-pull-2{left:16.66666667%;right:auto}.col-sm-pull-1{left:8.33333333%;right:auto}.col-sm-pull-0{left:auto;right:auto}.col-sm-push-12{right:100%;left:0}.col-sm-push-11{right:91.66666667%;left:0}.col-sm-push-10{right:83.33333333%;left:0}.col-sm-push-9{right:75%;left:0}.col-sm-push-8{right:66.66666667%;left:0}.col-sm-push-7{right:58.33333333%;left:0}.col-sm-push-6{right:50%;left:0}.col-sm-push-5{right:41.66666667%;left:0}.col-sm-push-4{right:33.33333333%;left:0}.col-sm-push-3{right:25%;left:0}.col-sm-push-2{right:16.66666667%;left:0}.col-sm-push-1{right:8.33333333%;left:0}.col-sm-push-0{right:auto;left:0}.col-sm-offset-12{margin-right:100%;margin-left:0}.col-sm-offset-11{margin-right:91.66666667%;margin-left:0}.col-sm-offset-10{margin-right:83.33333333%;margin-left:0}.col-sm-offset-9{margin-right:75%;margin-left:0}.col-sm-offset-8{margin-right:66.66666667%;margin-left:0}.col-sm-offset-7{margin-right:58.33333333%;margin-left:0}.col-sm-offset-6{margin-right:50%;margin-left:0}.col-sm-offset-5{margin-right:41.66666667%;margin-left:0}.col-sm-offset-4{margin-right:33.33333333%;margin-left:0}.col-sm-offset-3{margin-right:25%;margin-left:0}.col-sm-offset-2{margin-right:16.66666667%;margin-left:0}.col-sm-offset-1{margin-right:8.33333333%;margin-left:0}.col-sm-offset-0{margin-right:0;margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:right}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{left:100%;right:auto}.col-md-pull-11{left:91.66666667%;right:auto}.col-md-pull-10{left:83.33333333%;right:auto}.col-md-pull-9{left:75%;right:auto}.col-md-pull-8{left:66.66666667%;right:auto}.col-md-pull-7{left:58.33333333%;right:auto}.col-md-pull-6{left:50%;right:auto}.col-md-pull-5{left:41.66666667%;right:auto}.col-md-pull-4{left:33.33333333%;right:auto}.col-md-pull-3{left:25%;right:auto}.col-md-pull-2{left:16.66666667%;right:auto}.col-md-pull-1{left:8.33333333%;right:auto}.col-md-pull-0{left:auto;right:auto}.col-md-push-12{right:100%;left:0}.col-md-push-11{right:91.66666667%;left:0}.col-md-push-10{right:83.33333333%;left:0}.col-md-push-9{right:75%;left:0}.col-md-push-8{right:66.66666667%;left:0}.col-md-push-7{right:58.33333333%;left:0}.col-md-push-6{right:50%;left:0}.col-md-push-5{right:41.66666667%;left:0}.col-md-push-4{right:33.33333333%;left:0}.col-md-push-3{right:25%;left:0}.col-md-push-2{right:16.66666667%;left:0}.col-md-push-1{right:8.33333333%;left:0}.col-md-push-0{right:auto;left:0}.col-md-offset-12{margin-right:100%;margin-left:0}.col-md-offset-11{margin-right:91.66666667%;margin-left:0}.col-md-offset-10{margin-right:83.33333333%;margin-left:0}.col-md-offset-9{margin-right:75%;margin-left:0}.col-md-offset-8{margin-right:66.66666667%;margin-left:0}.col-md-offset-7{margin-right:58.33333333%;margin-left:0}.col-md-offset-6{margin-right:50%;margin-left:0}.col-md-offset-5{margin-right:41.66666667%;margin-left:0}.col-md-offset-4{margin-right:33.33333333%;margin-left:0}.col-md-offset-3{margin-right:25%;margin-left:0}.col-md-offset-2{margin-right:16.66666667%;margin-left:0}.col-md-offset-1{margin-right:8.33333333%;margin-left:0}.col-md-offset-0{margin-right:0;margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:right}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{left:100%;right:auto}.col-lg-pull-11{left:91.66666667%;right:auto}.col-lg-pull-10{left:83.33333333%;right:auto}.col-lg-pull-9{left:75%;right:auto}.col-lg-pull-8{left:66.66666667%;right:auto}.col-lg-pull-7{left:58.33333333%;right:auto}.col-lg-pull-6{left:50%;right:auto}.col-lg-pull-5{left:41.66666667%;right:auto}.col-lg-pull-4{left:33.33333333%;right:auto}.col-lg-pull-3{left:25%;right:auto}.col-lg-pull-2{left:16.66666667%;right:auto}.col-lg-pull-1{left:8.33333333%;right:auto}.col-lg-pull-0{left:auto;right:auto}.col-lg-push-12{right:100%;left:0}.col-lg-push-11{right:91.66666667%;left:0}.col-lg-push-10{right:83.33333333%;left:0}.col-lg-push-9{right:75%;left:0}.col-lg-push-8{right:66.66666667%;left:0}.col-lg-push-7{right:58.33333333%;left:0}.col-lg-push-6{right:50%;left:0}.col-lg-push-5{right:41.66666667%;left:0}.col-lg-push-4{right:33.33333333%;left:0}.col-lg-push-3{right:25%;left:0}.col-lg-push-2{right:16.66666667%;left:0}.col-lg-push-1{right:8.33333333%;left:0}.col-lg-push-0{right:auto;left:0}.col-lg-offset-12{margin-right:100%;margin-left:0}.col-lg-offset-11{margin-right:91.66666667%;margin-left:0}.col-lg-offset-10{margin-right:83.33333333%;margin-left:0}.col-lg-offset-9{margin-right:75%;margin-left:0}.col-lg-offset-8{margin-right:66.66666667%;margin-left:0}.col-lg-offset-7{margin-right:58.33333333%;margin-left:0}.col-lg-offset-6{margin-right:50%;margin-left:0}.col-lg-offset-5{margin-right:41.66666667%;margin-left:0}.col-lg-offset-4{margin-right:33.33333333%;margin-left:0}.col-lg-offset-3{margin-right:25%;margin-left:0}.col-lg-offset-2{margin-right:16.66666667%;margin-left:0}.col-lg-offset-1{margin-right:8.33333333%;margin-left:0}.col-lg-offset-0{margin-right:0;margin-left:0}}th{text-align:right}@media screen and (max-width:767px){.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:initial}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-left:0;border-right:initial}}.radio label,.checkbox label{padding-right:20px;padding-left:initial}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{margin-right:-20px;margin-left:auto}.radio-inline,.checkbox-inline{padding-right:20px;padding-left:0}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-right:10px;margin-left:0}.has-feedback .form-control{padding-left:42.5px;padding-right:12px}.form-control-feedback{left:0;right:auto}@media (min-width:768px){.form-inline label{padding-right:0;padding-left:initial}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{margin-right:0;margin-left:auto}}@media (min-width:768px){.form-horizontal .control-label{text-align:left}}.form-horizontal .has-feedback .form-control-feedback{left:15px;right:auto}.caret{margin-right:2px;margin-left:0}.dropdown-menu{right:0;left:auto;float:left;text-align:right}.dropdown-menu.pull-right{left:0;right:auto;float:right}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group>.btn,.btn-group-vertical>.btn{float:right}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-right:-1px;margin-left:0}.btn-toolbar{margin-right:-5px;margin-left:0}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:right}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-right:5px;margin-left:0}.btn-group>.btn:first-child{margin-right:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group{float:right}.btn-group.btn-group-justified>.btn,.btn-group.btn-group-justified>.btn-group{float:none}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.btn .caret{margin-right:0}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-right:0}.input-group .form-control{float:right}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:first-child{border-right:1px solid #ccc;border-left:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:last-child{border-left:1px solid #ccc;border-right:0}.input-group-btn>.btn+.btn{margin-right:-1px;margin-left:auto}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-left:-1px;margin-right:auto}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-right:-1px;margin-left:auto}.nav{padding-right:0;padding-left:initial}.nav-tabs>li{float:right}.nav-tabs>li>a{margin-left:auto;margin-right:-2px;border-radius:4px 4px 0 0}.nav-pills>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-right:2px;margin-left:auto}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-right:0;margin-left:auto}.nav-justified>.dropdown .dropdown-menu{right:auto}.nav-tabs-justified>li>a{margin-left:0;margin-right:auto}@media (min-width:768px){.nav-tabs-justified>li>a{border-radius:4px 4px 0 0}}@media (min-width:768px){.navbar-header{float:right}}.navbar-collapse{padding-right:15px;padding-left:15px}.navbar-brand{float:right}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-right:-15px;margin-left:auto}}.navbar-toggle{float:left;margin-left:15px;margin-right:auto}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 25px 5px 15px}}@media (min-width:768px){.navbar-nav{float:right}.navbar-nav>li{float:right}.navbar-nav.navbar-right:last-child{margin-left:-15px;margin-right:auto}.navbar-nav.navbar-right.flip{float:left!important}.navbar-nav.navbar-right .dropdown-menu{left:0;right:auto}}@media (min-width:768px){.navbar-text{float:right}.navbar-text.navbar-right:last-child{margin-left:0;margin-right:auto}}.pagination{padding-right:0}.pagination>li>a,.pagination>li>span{float:right;margin-right:-1px;margin-left:0}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{margin-right:-1px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-top-right-radius:0}.pager{padding-right:0;padding-left:initial}.pager .next>a,.pager .next>span{float:left}.pager .previous>a,.pager .previous>span{float:right}.nav-pills>li>a>.badge{margin-left:0;margin-right:3px}.alert-dismissable,.alert-dismissible{padding-left:35px;padding-right:15px}.alert-dismissable .close,.alert-dismissible .close{right:0;left:21px}.progress-bar{float:right}.media>.pull-left{margin-right:10px}.media>.pull-left.flip{margin-right:0;margin-left:10px}.media>.pull-right{margin-left:10px}.media>.pull-right.flip{margin-left:0;margin-right:10px}.media-list{padding-right:0;padding-left:initial;list-style:none}.list-group{padding-right:0;padding-left:initial}.list-group-item>.badge{float:left}.list-group-item>.badge+.badge{margin-right:5px;margin-left:auto}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-right-radius:3px;border-top-left-radius:0}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px;border-top-right-radius:0}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px;border-top-left-radius:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-right:0;border-left:none}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:none;border-left:0}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{right:0;left:auto}.close{float:left}.modal-footer{text-align:left}.modal-footer .btn+.btn{margin-left:auto;margin-right:5px}.modal-footer .btn-group .btn+.btn{margin-right:-1px;margin-left:auto}.modal-footer .btn-block+.btn-block{margin-right:0;margin-left:auto}.popover{left:auto;text-align:right}.popover.top>.arrow{right:50%;left:auto;margin-right:-11px;margin-left:auto}.popover.top>.arrow:after{margin-right:-10px;margin-left:auto}.popover.bottom>.arrow{right:50%;left:auto;margin-right:-11px;margin-left:auto}.popover.bottom>.arrow:after{margin-right:-10px;margin-left:auto}.carousel-control{right:0;bottom:0}.carousel-control.left{right:auto;left:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5)0),color-stop(rgba(0,0,0,.0001)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-image:linear-gradient(to right,rgba(0,0,0,.5)0,rgba(0,0,0,.0001)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=''#80000000'', endColorstr=''#00000000'', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001)0),color-stop(rgba(0,0,0,.5)100%));background-image:-o-linear-gradient(left,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001)0,rgba(0,0,0,.5)100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=''#00000000'', endColorstr=''#80000000'', GradientType=1)}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;right:auto;margin-right:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;left:auto;margin-left:-10px}.carousel-indicators{right:50%;left:0;margin-right:-30%;margin-left:0;padding-left:0}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:0;margin-right:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-left:0;margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}}.pull-right.flip{float:left!important}.pull-left.flip{float:right!important}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}' 30 | ] 31 | 32 | { #category : #accessing } 33 | TBSDeploymentLibraryRTL >> selectorsToInclude [ 34 | ^ #(cssbootstrapminCss bootstraprtlminCss cssbootstrapthememinCss jsbootstrapminJs holderminJs) 35 | ] 36 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSDropdownMenuItem.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Boostrap menu item for dropdowns 3 | " 4 | Class { 5 | #name : #TBSDropdownMenuItem, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSDropdownMenuItem >> beDisabled [ 12 | 13 | self class: 'disabled' 14 | ] 15 | 16 | { #category : #accessing } 17 | TBSDropdownMenuItem >> tag [ 18 | 19 | ^'li' 20 | ] 21 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSFormTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A boostrap form 3 | " 4 | Class { 5 | #name : #TBSFormTag, 6 | #superclass : #WAFormTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSFormTag >> beHorizontal [ 12 | 13 | self class: 'form-horizontal' 14 | ] 15 | 16 | { #category : #options } 17 | TBSFormTag >> beInline [ 18 | 19 | self class: 'form-inline' 20 | ] 21 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSGenericTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A generic Bootstrap tag 3 | " 4 | Class { 5 | #name : #TBSGenericTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSGenericTag >> tag [ 12 | ^ 'div' 13 | ] 14 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSGlyphTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Boostraph glyph icon 3 | " 4 | Class { 5 | #name : #TBSGlyphTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #'default icons' } 11 | TBSGlyphTag >> iconAdjust [ 12 | 13 | ^self class: 'glyphicon-adjust' 14 | ] 15 | 16 | { #category : #'default icons text' } 17 | TBSGlyphTag >> iconAlignCenter [ 18 | 19 | ^self class: 'glyphicon-align-center' 20 | ] 21 | 22 | { #category : #'default icons text' } 23 | TBSGlyphTag >> iconAlignJustify [ 24 | 25 | ^self class: 'glyphicon-align-justify' 26 | ] 27 | 28 | { #category : #'default icons text' } 29 | TBSGlyphTag >> iconAlignLeft [ 30 | 31 | ^self class: 'glyphicon-align-left' 32 | ] 33 | 34 | { #category : #'default icons text' } 35 | TBSGlyphTag >> iconAlignRight [ 36 | 37 | ^self class: 'glyphicon-align-right' 38 | ] 39 | 40 | { #category : #'default icons arrows' } 41 | TBSGlyphTag >> iconArrowDown [ 42 | 43 | ^self class: 'glyphicon-arrow-down' 44 | ] 45 | 46 | { #category : #'default icons arrows' } 47 | TBSGlyphTag >> iconArrowLeft [ 48 | 49 | ^self class: 'glyphicon-arrow-left' 50 | ] 51 | 52 | { #category : #'default icons arrows' } 53 | TBSGlyphTag >> iconArrowRight [ 54 | 55 | ^self class: 'glyphicon-arrow-right' 56 | ] 57 | 58 | { #category : #'default icons arrows' } 59 | TBSGlyphTag >> iconArrowUp [ 60 | 61 | ^self class: 'glyphicon-arrow-up' 62 | ] 63 | 64 | { #category : #'default icons' } 65 | TBSGlyphTag >> iconAsterisk [ 66 | 67 | ^self class: 'glyphicon-asterisk' 68 | ] 69 | 70 | { #category : #'default icons media navigation' } 71 | TBSGlyphTag >> iconBackward [ 72 | 73 | ^self class: 'glyphicon-backward' 74 | ] 75 | 76 | { #category : #'default icons' } 77 | TBSGlyphTag >> iconBanCircle [ 78 | 79 | ^self class: 'glyphicon-ban-circle' 80 | ] 81 | 82 | { #category : #'default icons' } 83 | TBSGlyphTag >> iconBarcode [ 84 | 85 | ^self class: 'glyphicon-barcode' 86 | ] 87 | 88 | { #category : #'default icons' } 89 | TBSGlyphTag >> iconBell [ 90 | 91 | ^self class: 'glyphicon-bell' 92 | ] 93 | 94 | { #category : #'default icons text' } 95 | TBSGlyphTag >> iconBold [ 96 | 97 | ^self class: 'glyphicon-bold' 98 | ] 99 | 100 | { #category : #'default icons internet' } 101 | TBSGlyphTag >> iconBook [ 102 | 103 | ^self class: 'glyphicon-book' 104 | ] 105 | 106 | { #category : #'default icons internet' } 107 | TBSGlyphTag >> iconBookmark [ 108 | 109 | ^self class: 'glyphicon-bookmark' 110 | ] 111 | 112 | { #category : #'default icons money' } 113 | TBSGlyphTag >> iconBriefcase [ 114 | 115 | ^self class: 'glyphicon-briefcase' 116 | ] 117 | 118 | { #category : #'default icons' } 119 | TBSGlyphTag >> iconBullhorn [ 120 | 121 | ^self class: 'glyphicon-bullhorn' 122 | ] 123 | 124 | { #category : #'default icons common' } 125 | TBSGlyphTag >> iconCalendar [ 126 | 127 | ^self class: 'glyphicon-calendar' 128 | ] 129 | 130 | { #category : #'default icons media video' } 131 | TBSGlyphTag >> iconCamera [ 132 | 133 | ^self class: 'glyphicon-camera' 134 | ] 135 | 136 | { #category : #'default icons legal' } 137 | TBSGlyphTag >> iconCertificate [ 138 | 139 | ^self class: 'glyphicon-certificate' 140 | ] 141 | 142 | { #category : #'default icons' } 143 | TBSGlyphTag >> iconCheck [ 144 | 145 | ^self class: 'glyphicon-check' 146 | ] 147 | 148 | { #category : #'default icons arrows' } 149 | TBSGlyphTag >> iconChevronDown [ 150 | 151 | ^self class: 'glyphicon-chevron-down' 152 | ] 153 | 154 | { #category : #'default icons arrows' } 155 | TBSGlyphTag >> iconChevronLeft [ 156 | 157 | ^self class: 'glyphicon-chevron-left' 158 | ] 159 | 160 | { #category : #'default icons arrows' } 161 | TBSGlyphTag >> iconChevronRight [ 162 | 163 | ^self class: 'glyphicon-chevron-right' 164 | ] 165 | 166 | { #category : #'default icons arrows' } 167 | TBSGlyphTag >> iconChevronUp [ 168 | 169 | ^self class: 'glyphicon-chevron-up' 170 | ] 171 | 172 | { #category : #'default icons arrows' } 173 | TBSGlyphTag >> iconCircleArrowDown [ 174 | 175 | ^self class: 'glyphicon-circle-arrow-down' 176 | ] 177 | 178 | { #category : #'default icons arrows' } 179 | TBSGlyphTag >> iconCircleArrowLeft [ 180 | 181 | ^self class: 'glyphicon-circle-arrow-left' 182 | ] 183 | 184 | { #category : #'default icons arrows' } 185 | TBSGlyphTag >> iconCircleArrowRight [ 186 | 187 | ^self class: 'glyphicon-circle-arrow-right' 188 | ] 189 | 190 | { #category : #'default icons arrows' } 191 | TBSGlyphTag >> iconCircleArrowUp [ 192 | 193 | ^self class: 'glyphicon-circle-arrow-up' 194 | ] 195 | 196 | { #category : #'default icons internet' } 197 | TBSGlyphTag >> iconCloud [ 198 | 199 | ^self class: 'glyphicon-cloud' 200 | ] 201 | 202 | { #category : #'default icons internet' } 203 | TBSGlyphTag >> iconCloudDownload [ 204 | 205 | ^self class: 'glyphicon-cloud-download' 206 | ] 207 | 208 | { #category : #'default icons internet' } 209 | TBSGlyphTag >> iconCloudUpload [ 210 | 211 | ^self class: 'glyphicon-cloud-upload' 212 | ] 213 | 214 | { #category : #'default icons' } 215 | TBSGlyphTag >> iconCog [ 216 | 217 | ^self class: 'glyphicon-cog' 218 | ] 219 | 220 | { #category : #'default icons' } 221 | TBSGlyphTag >> iconCollapseDown [ 222 | 223 | ^self class: 'glyphicon-collapse-down' 224 | ] 225 | 226 | { #category : #'default icons' } 227 | TBSGlyphTag >> iconCollapseUp [ 228 | 229 | ^self class: 'glyphicon-collapse-up' 230 | ] 231 | 232 | { #category : #'default icons text' } 233 | TBSGlyphTag >> iconComment [ 234 | 235 | ^self class: 'glyphicon-comment' 236 | ] 237 | 238 | { #category : #'default icons internet' } 239 | TBSGlyphTag >> iconCompressed [ 240 | 241 | ^self class: 'glyphicon-compressed' 242 | ] 243 | 244 | { #category : #'default icons legal' } 245 | TBSGlyphTag >> iconCopyrightMark [ 246 | 247 | ^self class: 'glyphicon-copyright-mark' 248 | ] 249 | 250 | { #category : #'default icons money' } 251 | TBSGlyphTag >> iconCreditCard [ 252 | 253 | ^self class: 'glyphicon-credit-card' 254 | ] 255 | 256 | { #category : #'default icons' } 257 | TBSGlyphTag >> iconCutlery [ 258 | 259 | ^self class: 'glyphicon-cutlery' 260 | ] 261 | 262 | { #category : #'default icons common' } 263 | TBSGlyphTag >> iconDashbord [ 264 | 265 | ^self class: 'glyphicon-dashboard' 266 | ] 267 | 268 | { #category : #'default icons file handling' } 269 | TBSGlyphTag >> iconDownload [ 270 | 271 | ^self class: 'glyphicon-download' 272 | ] 273 | 274 | { #category : #'default icons file handling' } 275 | TBSGlyphTag >> iconDownloadAlt [ 276 | 277 | ^self class: 'glyphicon-download-alt' 278 | ] 279 | 280 | { #category : #'default icons' } 281 | TBSGlyphTag >> iconEarphone [ 282 | 283 | ^self class: 'glyphicon-earphone' 284 | ] 285 | 286 | { #category : #'default icons text' } 287 | TBSGlyphTag >> iconEdit [ 288 | 289 | ^self class: 'glyphicon-edit' 290 | ] 291 | 292 | { #category : #'default icons media navigation' } 293 | TBSGlyphTag >> iconEject [ 294 | 295 | ^self class: 'glyphicon-eject' 296 | ] 297 | 298 | { #category : #'default icons money' } 299 | TBSGlyphTag >> iconEnvelope [ 300 | 301 | ^self class: 'glyphicon-envelope' 302 | ] 303 | 304 | { #category : #'default icons money' } 305 | TBSGlyphTag >> iconEuro [ 306 | 307 | ^self class: 'glyphicon-euro' 308 | ] 309 | 310 | { #category : #'default icons' } 311 | TBSGlyphTag >> iconExclamationSign [ 312 | 313 | ^self class: 'glyphicon-exclamation-sign' 314 | ] 315 | 316 | { #category : #'default icons' } 317 | TBSGlyphTag >> iconExpand [ 318 | 319 | ^self class: 'glyphicon-expand' 320 | ] 321 | 322 | { #category : #'default icons' } 323 | TBSGlyphTag >> iconExport [ 324 | 325 | ^self class: 'glyphicon-export' 326 | ] 327 | 328 | { #category : #'default icons' } 329 | TBSGlyphTag >> iconEyeClose [ 330 | 331 | ^self class: 'glyphicon-eye-close' 332 | ] 333 | 334 | { #category : #'default icons' } 335 | TBSGlyphTag >> iconEyeOpen [ 336 | 337 | ^self class: 'glyphicon-eye-open' 338 | ] 339 | 340 | { #category : #'default icons media video' } 341 | TBSGlyphTag >> iconFacetimeVideo [ 342 | 343 | ^self class: 'glyphicon-facetime-video' 344 | ] 345 | 346 | { #category : #'default icons media navigation' } 347 | TBSGlyphTag >> iconFastBackward [ 348 | 349 | ^self class: 'glyphicon-fast-backward' 350 | ] 351 | 352 | { #category : #'default icons media navigation' } 353 | TBSGlyphTag >> iconFastForward [ 354 | 355 | ^self class: 'glyphicon-fast-forward' 356 | ] 357 | 358 | { #category : #'default icons file handling' } 359 | TBSGlyphTag >> iconFile [ 360 | 361 | ^self class: 'glyphicon-file' 362 | ] 363 | 364 | { #category : #'default icons media video' } 365 | TBSGlyphTag >> iconFilm [ 366 | 367 | ^self class: 'glyphicon-film' 368 | ] 369 | 370 | { #category : #'default icons' } 371 | TBSGlyphTag >> iconFilter [ 372 | 373 | ^self class: 'glyphicon-filter' 374 | ] 375 | 376 | { #category : #'default icons' } 377 | TBSGlyphTag >> iconFire [ 378 | 379 | ^self class: 'glyphicon-fire' 380 | ] 381 | 382 | { #category : #'default icons' } 383 | TBSGlyphTag >> iconFlag [ 384 | 385 | ^self class: 'glyphicon-flag' 386 | ] 387 | 388 | { #category : #'default icons' } 389 | TBSGlyphTag >> iconFlash [ 390 | 391 | ^self class: 'glyphicon-flash' 392 | ] 393 | 394 | { #category : #'default icons file handling' } 395 | TBSGlyphTag >> iconFloppyDisk [ 396 | 397 | ^self class: 'glyphicon-floppy-disk' 398 | ] 399 | 400 | { #category : #'default icons file handling' } 401 | TBSGlyphTag >> iconFloppyOpen [ 402 | 403 | ^self class: 'glyphicon-floppy-open' 404 | ] 405 | 406 | { #category : #'default icons file handling' } 407 | TBSGlyphTag >> iconFloppyRemove [ 408 | 409 | ^self class: 'glyphicon-floppy-remove' 410 | ] 411 | 412 | { #category : #'default icons file handling' } 413 | TBSGlyphTag >> iconFloppySave [ 414 | 415 | ^self class: 'glyphicon-floppy-save' 416 | ] 417 | 418 | { #category : #'default icons file handling' } 419 | TBSGlyphTag >> iconFloppySaved [ 420 | 421 | ^self class: 'glyphicon-floppy-saved' 422 | ] 423 | 424 | { #category : #'default icons file handling' } 425 | TBSGlyphTag >> iconFolderClose [ 426 | 427 | ^self class: 'glyphicon-folder-close' 428 | ] 429 | 430 | { #category : #'default icons file handling' } 431 | TBSGlyphTag >> iconFolderOpen [ 432 | 433 | ^self class: 'glyphicon-folder-open' 434 | ] 435 | 436 | { #category : #'default icons text' } 437 | TBSGlyphTag >> iconFont [ 438 | 439 | ^self class: 'glyphicon-font' 440 | ] 441 | 442 | { #category : #'default icons media navigation' } 443 | TBSGlyphTag >> iconForward [ 444 | 445 | ^self class: 'glyphicon-forward' 446 | ] 447 | 448 | { #category : #'default icons sizing' } 449 | TBSGlyphTag >> iconFullscreen [ 450 | 451 | ^self class: 'glyphicon-fullscreen' 452 | ] 453 | 454 | { #category : #'default icons money' } 455 | TBSGlyphTag >> iconGBP [ 456 | 457 | ^self class: 'glyphicon-gbp' 458 | ] 459 | 460 | { #category : #'default icons' } 461 | TBSGlyphTag >> iconGift [ 462 | 463 | ^self class: 'glyphicon-gift' 464 | ] 465 | 466 | { #category : #'default icons' } 467 | TBSGlyphTag >> iconGlass [ 468 | 469 | ^self class: 'glyphicon-glass' 470 | ] 471 | 472 | { #category : #'default icons internet' } 473 | TBSGlyphTag >> iconGlobe [ 474 | 475 | ^self class: 'glyphicon-globe' 476 | ] 477 | 478 | { #category : #'default icons media video' } 479 | TBSGlyphTag >> iconHDVideo [ 480 | 481 | ^self class: 'glyphicon-hd-video' 482 | ] 483 | 484 | { #category : #'default icons hands' } 485 | TBSGlyphTag >> iconHandDown [ 486 | 487 | ^self class: 'glyphicon-hand-down' 488 | ] 489 | 490 | { #category : #'default icons hands' } 491 | TBSGlyphTag >> iconHandLeft [ 492 | 493 | ^self class: 'glyphicon-hand-left' 494 | ] 495 | 496 | { #category : #'default icons hands' } 497 | TBSGlyphTag >> iconHandRight [ 498 | 499 | ^self class: 'glyphicon-hand-right' 500 | ] 501 | 502 | { #category : #'default icons hands' } 503 | TBSGlyphTag >> iconHandUp [ 504 | 505 | ^self class: 'glyphicon-hand-up' 506 | ] 507 | 508 | { #category : #'default icons file handling' } 509 | TBSGlyphTag >> iconHardDiskDrive [ 510 | 511 | ^self class: 'glyphicon-hdd' 512 | ] 513 | 514 | { #category : #'default icons text' } 515 | TBSGlyphTag >> iconHeader [ 516 | 517 | ^self class: 'glyphicon-header' 518 | ] 519 | 520 | { #category : #'default icons media audio' } 521 | TBSGlyphTag >> iconHeadphones [ 522 | 523 | ^self class: 'glyphicon-headphones' 524 | ] 525 | 526 | { #category : #'default icons' } 527 | TBSGlyphTag >> iconHeart [ 528 | 529 | ^self class: 'glyphicon-heart' 530 | ] 531 | 532 | { #category : #'default icons' } 533 | TBSGlyphTag >> iconHeartEmpty [ 534 | 535 | ^self class: 'glyphicon-heart-empty' 536 | ] 537 | 538 | { #category : #'default icons common' } 539 | TBSGlyphTag >> iconHome [ 540 | 541 | ^self class: 'glyphicon-home' 542 | ] 543 | 544 | { #category : #'default icons file handling' } 545 | TBSGlyphTag >> iconImport [ 546 | 547 | ^self class: 'glyphicon-import' 548 | ] 549 | 550 | { #category : #'default icons common' } 551 | TBSGlyphTag >> iconInbox [ 552 | 553 | ^self class: 'glyphicon-inbox' 554 | ] 555 | 556 | { #category : #'default icons text' } 557 | TBSGlyphTag >> iconIndentLeft [ 558 | 559 | ^self class: 'glyphicon-indent-left' 560 | ] 561 | 562 | { #category : #'default icons text' } 563 | TBSGlyphTag >> iconIndentRight [ 564 | 565 | ^self class: 'glyphicon-indent-right' 566 | ] 567 | 568 | { #category : #'default icons common' } 569 | TBSGlyphTag >> iconInfo [ 570 | 571 | ^self class: 'glyphicon-info-sign' 572 | ] 573 | 574 | { #category : #'default icons text' } 575 | TBSGlyphTag >> iconItalic [ 576 | 577 | ^self class: 'glyphicon-italic' 578 | ] 579 | 580 | { #category : #'default icons' } 581 | TBSGlyphTag >> iconLeaf [ 582 | 583 | ^self class: 'glyphicon-leaf' 584 | ] 585 | 586 | { #category : #'default icons internet' } 587 | TBSGlyphTag >> iconLink [ 588 | 589 | ^self class: 'glyphicon-link' 590 | ] 591 | 592 | { #category : #'default icons common' } 593 | TBSGlyphTag >> iconList [ 594 | 595 | ^self class: 'glyphicon-list' 596 | ] 597 | 598 | { #category : #'default icons common' } 599 | TBSGlyphTag >> iconListAlt [ 600 | 601 | ^self class: 'glyphicon-list-alt' 602 | ] 603 | 604 | { #category : #'default icons common' } 605 | TBSGlyphTag >> iconLock [ 606 | 607 | ^self class: 'glyphicon-lock' 608 | ] 609 | 610 | { #category : #'default icons common' } 611 | TBSGlyphTag >> iconLogin [ 612 | 613 | ^self class: 'glyphicon-log-in' 614 | ] 615 | 616 | { #category : #'default icons common' } 617 | TBSGlyphTag >> iconLogout [ 618 | 619 | ^self class: 'glyphicon-log-out' 620 | ] 621 | 622 | { #category : #'default icons' } 623 | TBSGlyphTag >> iconMagnet [ 624 | 625 | ^self class: 'glyphicon-magnet' 626 | ] 627 | 628 | { #category : #'default icons' } 629 | TBSGlyphTag >> iconMapMarker [ 630 | 631 | ^self class: 'glyphicon-map-marker' 632 | ] 633 | 634 | { #category : #'default icons' } 635 | TBSGlyphTag >> iconMinus [ 636 | 637 | ^self class: 'glyphicon-minus' 638 | ] 639 | 640 | { #category : #'default icons' } 641 | TBSGlyphTag >> iconMinusSign [ 642 | 643 | ^self class: 'glyphicon-minus-sign' 644 | ] 645 | 646 | { #category : #'default icons' } 647 | TBSGlyphTag >> iconMove [ 648 | 649 | ^self class: 'glyphicon-move' 650 | ] 651 | 652 | { #category : #'default icons media audio' } 653 | TBSGlyphTag >> iconMusic [ 654 | 655 | ^self class: 'glyphicon-music' 656 | ] 657 | 658 | { #category : #'default icons common' } 659 | TBSGlyphTag >> iconNewWindow [ 660 | 661 | ^self class: 'glyphicon-new-window' 662 | ] 663 | 664 | { #category : #'default icons common' } 665 | TBSGlyphTag >> iconOff [ 666 | 667 | ^self class: 'glyphicon-off' 668 | ] 669 | 670 | { #category : #'default icons common' } 671 | TBSGlyphTag >> iconOk [ 672 | 673 | ^self class: 'glyphicon-ok' 674 | ] 675 | 676 | { #category : #'default icons common' } 677 | TBSGlyphTag >> iconOkCircle [ 678 | 679 | ^self class: 'glyphicon-ok-circle' 680 | ] 681 | 682 | { #category : #'default icons common' } 683 | TBSGlyphTag >> iconOkSign [ 684 | 685 | ^self class: 'glyphicon-ok-sign' 686 | ] 687 | 688 | { #category : #'default icons' } 689 | TBSGlyphTag >> iconOpen [ 690 | 691 | ^self class: 'glyphicon-open' 692 | ] 693 | 694 | { #category : #'default icons' } 695 | TBSGlyphTag >> iconPaperclip [ 696 | 697 | ^self class: 'glyphicon-paperclip' 698 | ] 699 | 700 | { #category : #'default icons' } 701 | TBSGlyphTag >> iconPause [ 702 | 703 | ^self class: 'glyphicon-pause' 704 | ] 705 | 706 | { #category : #'default icons' } 707 | TBSGlyphTag >> iconPencil [ 708 | 709 | ^self class: 'glyphicon-pencil' 710 | ] 711 | 712 | { #category : #'default icons' } 713 | TBSGlyphTag >> iconPhone [ 714 | 715 | ^self class: 'glyphicon-phone' 716 | ] 717 | 718 | { #category : #'default icons' } 719 | TBSGlyphTag >> iconPhoneAlt [ 720 | 721 | ^self class: 'glyphicon-phone-alt' 722 | ] 723 | 724 | { #category : #'default icons common' } 725 | TBSGlyphTag >> iconPicture [ 726 | 727 | ^self class: 'glyphicon-picture' 728 | ] 729 | 730 | { #category : #'default icons' } 731 | TBSGlyphTag >> iconPlane [ 732 | 733 | ^self class: 'glyphicon-plane' 734 | ] 735 | 736 | { #category : #'default icons media navigation' } 737 | TBSGlyphTag >> iconPlay [ 738 | 739 | ^self class: 'glyphicon-play' 740 | ] 741 | 742 | { #category : #'default icons media navigation' } 743 | TBSGlyphTag >> iconPlayCircle [ 744 | 745 | ^self class: 'glyphicon-play-circle' 746 | ] 747 | 748 | { #category : #'default icons' } 749 | TBSGlyphTag >> iconPlus [ 750 | 751 | ^self class: 'glyphicon-plus' 752 | ] 753 | 754 | { #category : #'default icons' } 755 | TBSGlyphTag >> iconPlusSign [ 756 | 757 | ^self class: 'glyphicon-plus-sign' 758 | ] 759 | 760 | { #category : #'default icons' } 761 | TBSGlyphTag >> iconPrint [ 762 | 763 | ^self class: 'glyphicon-print' 764 | ] 765 | 766 | { #category : #'default icons' } 767 | TBSGlyphTag >> iconPushpin [ 768 | 769 | ^self class: 'glyphicon-pushpin' 770 | ] 771 | 772 | { #category : #'default icons' } 773 | TBSGlyphTag >> iconQRCode [ 774 | 775 | ^self class: 'glyphicon-qrcode' 776 | ] 777 | 778 | { #category : #'default icons' } 779 | TBSGlyphTag >> iconQuestionSign [ 780 | 781 | ^self class: 'glyphicon-question-sign' 782 | ] 783 | 784 | { #category : #'default icons' } 785 | TBSGlyphTag >> iconRandom [ 786 | 787 | ^self class: 'glyphicon-random' 788 | ] 789 | 790 | { #category : #'default icons media navigation' } 791 | TBSGlyphTag >> iconRecord [ 792 | 793 | ^self class: 'glyphicon-record' 794 | ] 795 | 796 | { #category : #'default icons common' } 797 | TBSGlyphTag >> iconRefresh [ 798 | 799 | ^self class: 'glyphicon-refresh' 800 | ] 801 | 802 | { #category : #'default icons legal' } 803 | TBSGlyphTag >> iconRegistrationMark [ 804 | 805 | ^self class: 'glyphicon-registration-mark' 806 | ] 807 | 808 | { #category : #'default icons common' } 809 | TBSGlyphTag >> iconRemove [ 810 | 811 | ^self class: 'glyphicon-remove' 812 | ] 813 | 814 | { #category : #'default icons common' } 815 | TBSGlyphTag >> iconRemoveCircle [ 816 | 817 | ^self class: 'glyphicon-remove-circle' 818 | ] 819 | 820 | { #category : #'default icons common' } 821 | TBSGlyphTag >> iconRemoveSign [ 822 | 823 | ^self class: 'glyphicon-remove-sign' 824 | ] 825 | 826 | { #category : #'default icons media navigation' } 827 | TBSGlyphTag >> iconRepeat [ 828 | 829 | ^self class: 'glyphicon-repeat' 830 | ] 831 | 832 | { #category : #'default icons sizing' } 833 | TBSGlyphTag >> iconResizeFull [ 834 | 835 | ^self class: 'glyphicon-resize-full' 836 | ] 837 | 838 | { #category : #'default icons sizing' } 839 | TBSGlyphTag >> iconResizeHorizontal [ 840 | 841 | ^self class: 'glyphicon-resize-horizontal' 842 | ] 843 | 844 | { #category : #'default icons sizing' } 845 | TBSGlyphTag >> iconResizeSmall [ 846 | 847 | ^self class: 'glyphicon-resize-small' 848 | ] 849 | 850 | { #category : #'default icons sizing' } 851 | TBSGlyphTag >> iconResizeVertical [ 852 | 853 | ^self class: 'glyphicon-resize-vertical' 854 | ] 855 | 856 | { #category : #'default icons sizing' } 857 | TBSGlyphTag >> iconRetweet [ 858 | 859 | ^self class: 'glyphicon-retweet' 860 | ] 861 | 862 | { #category : #'default icons' } 863 | TBSGlyphTag >> iconRoad [ 864 | 865 | ^self class: 'glyphicon-road' 866 | ] 867 | 868 | { #category : #'default icons media video' } 869 | TBSGlyphTag >> iconSDVideo [ 870 | 871 | ^self class: 'glyphicon-sd-video' 872 | ] 873 | 874 | { #category : #'default icons common' } 875 | TBSGlyphTag >> iconSave [ 876 | 877 | ^self class: 'glyphicon-save' 878 | ] 879 | 880 | { #category : #'default icons common' } 881 | TBSGlyphTag >> iconSaved [ 882 | 883 | ^self class: 'glyphicon-saved' 884 | ] 885 | 886 | { #category : #'default icons' } 887 | TBSGlyphTag >> iconScreenshot [ 888 | 889 | ^self class: 'glyphicon-screenshot' 890 | ] 891 | 892 | { #category : #'default icons common' } 893 | TBSGlyphTag >> iconSearch [ 894 | 895 | ^self class: 'glyphicon-search' 896 | ] 897 | 898 | { #category : #'default icons common' } 899 | TBSGlyphTag >> iconSend [ 900 | 901 | ^self class: 'glyphicon-send' 902 | ] 903 | 904 | { #category : #'default icons common' } 905 | TBSGlyphTag >> iconShare [ 906 | 907 | ^self class: 'glyphicon-share' 908 | ] 909 | 910 | { #category : #'default icons common' } 911 | TBSGlyphTag >> iconShareAlt [ 912 | 913 | ^self class: 'glyphicon-share-alt' 914 | ] 915 | 916 | { #category : #'default icons internet' } 917 | TBSGlyphTag >> iconShoppingCart [ 918 | 919 | ^self class: 'glyphicon-shopping-cart' 920 | ] 921 | 922 | { #category : #'default icons' } 923 | TBSGlyphTag >> iconSignal [ 924 | 925 | ^self class: 'glyphicon-signal' 926 | ] 927 | 928 | { #category : #'default icons' } 929 | TBSGlyphTag >> iconSort [ 930 | 931 | ^self class: 'glyphicon-sort' 932 | ] 933 | 934 | { #category : #'default icons' } 935 | TBSGlyphTag >> iconSortByAlphabet [ 936 | 937 | ^self class: 'glyphicon-sort-by-alphabet' 938 | ] 939 | 940 | { #category : #'default icons' } 941 | TBSGlyphTag >> iconSortByAlphabetAlt [ 942 | 943 | ^self class: 'glyphicon-sort-by-alphabet-alt' 944 | ] 945 | 946 | { #category : #'default icons' } 947 | TBSGlyphTag >> iconSortByAttributes [ 948 | 949 | ^self class: 'glyphicon-sort-by-attributes' 950 | ] 951 | 952 | { #category : #'default icons' } 953 | TBSGlyphTag >> iconSortByAttributesAlt [ 954 | 955 | ^self class: 'glyphicon-sort-by-attributes-alt' 956 | ] 957 | 958 | { #category : #'default icons' } 959 | TBSGlyphTag >> iconSortByOrder [ 960 | 961 | ^self class: 'glyphicon-sort-by-order' 962 | ] 963 | 964 | { #category : #'default icons' } 965 | TBSGlyphTag >> iconSortByOrderAlt [ 966 | 967 | ^self class: 'glyphicon-sort-by-order-alt' 968 | ] 969 | 970 | { #category : #'default icons media audio' } 971 | TBSGlyphTag >> iconSound51 [ 972 | 973 | ^self class: 'glyphicon-sound-5-1' 974 | ] 975 | 976 | { #category : #'default icons media audio' } 977 | TBSGlyphTag >> iconSound61 [ 978 | 979 | ^self class: 'glyphicon-sound-6-1' 980 | ] 981 | 982 | { #category : #'default icons media audio' } 983 | TBSGlyphTag >> iconSound71 [ 984 | 985 | ^self class: 'glyphicon-sound-7-1' 986 | ] 987 | 988 | { #category : #'default icons media audio' } 989 | TBSGlyphTag >> iconSoundDolby [ 990 | 991 | ^self class: 'glyphicon-sound-dolby' 992 | ] 993 | 994 | { #category : #'default icons media audio' } 995 | TBSGlyphTag >> iconSoundStereo [ 996 | 997 | ^self class: 'glyphicon-sound-stereo' 998 | ] 999 | 1000 | { #category : #'default icons common' } 1001 | TBSGlyphTag >> iconStar [ 1002 | 1003 | ^self class: 'glyphicon-star' 1004 | ] 1005 | 1006 | { #category : #'default icons common' } 1007 | TBSGlyphTag >> iconStarEmpty [ 1008 | 1009 | ^self class: 'glyphicon-star-empty' 1010 | ] 1011 | 1012 | { #category : #'default icons common' } 1013 | TBSGlyphTag >> iconStatistics [ 1014 | 1015 | ^self class: 'glyphicon-stats' 1016 | ] 1017 | 1018 | { #category : #'default icons media navigation' } 1019 | TBSGlyphTag >> iconStepBackward [ 1020 | 1021 | ^self class: 'glyphicon-step-backward' 1022 | ] 1023 | 1024 | { #category : #'default icons media navigation' } 1025 | TBSGlyphTag >> iconStepForward [ 1026 | 1027 | ^self class: 'glyphicon-step-forward' 1028 | ] 1029 | 1030 | { #category : #'default icons media navigation' } 1031 | TBSGlyphTag >> iconStop [ 1032 | 1033 | ^self class: 'glyphicon-stop' 1034 | ] 1035 | 1036 | { #category : #'default icons media navigation' } 1037 | TBSGlyphTag >> iconSubtitles [ 1038 | 1039 | ^self class: 'glyphicon-subtitles' 1040 | ] 1041 | 1042 | { #category : #'default icons internet' } 1043 | TBSGlyphTag >> iconTag [ 1044 | 1045 | ^self class: 'glyphicon-tag' 1046 | ] 1047 | 1048 | { #category : #'default icons internet' } 1049 | TBSGlyphTag >> iconTags [ 1050 | 1051 | ^self class: 'glyphicon-tags' 1052 | ] 1053 | 1054 | { #category : #'default icons' } 1055 | TBSGlyphTag >> iconTasks [ 1056 | 1057 | ^self class: 'glyphicon-tasks' 1058 | ] 1059 | 1060 | { #category : #'default icons text' } 1061 | TBSGlyphTag >> iconTextHeight [ 1062 | 1063 | ^self class: 'glyphicon-text-height' 1064 | ] 1065 | 1066 | { #category : #'default icons text' } 1067 | TBSGlyphTag >> iconTextHeightDefault [ 1068 | 1069 | ^self class: 'glyphicon-th' 1070 | ] 1071 | 1072 | { #category : #'default icons text' } 1073 | TBSGlyphTag >> iconTextHeightLarge [ 1074 | 1075 | ^self class: 'glyphicon-th-large' 1076 | ] 1077 | 1078 | { #category : #'default icons text' } 1079 | TBSGlyphTag >> iconTextHeightList [ 1080 | 1081 | ^self class: 'glyphicon-th-list' 1082 | ] 1083 | 1084 | { #category : #'default icons text' } 1085 | TBSGlyphTag >> iconTextWidth [ 1086 | 1087 | ^self class: 'glyphicon-text-width' 1088 | ] 1089 | 1090 | { #category : #'default icons hands' } 1091 | TBSGlyphTag >> iconThumbsDown [ 1092 | 1093 | ^self class: 'glyphicon-thumbs-down' 1094 | ] 1095 | 1096 | { #category : #'default icons hands' } 1097 | TBSGlyphTag >> iconThumbsUp [ 1098 | 1099 | ^self class: 'glyphicon-thumbs-up' 1100 | ] 1101 | 1102 | { #category : #'default icons common' } 1103 | TBSGlyphTag >> iconTime [ 1104 | 1105 | ^self class: 'glyphicon-time' 1106 | ] 1107 | 1108 | { #category : #'default icons text' } 1109 | TBSGlyphTag >> iconTint [ 1110 | 1111 | ^self class: 'glyphicon-tint' 1112 | ] 1113 | 1114 | { #category : #'default icons' } 1115 | TBSGlyphTag >> iconTower [ 1116 | 1117 | ^self class: 'glyphicon-tower' 1118 | ] 1119 | 1120 | { #category : #'default icons file handling' } 1121 | TBSGlyphTag >> iconTransfer [ 1122 | 1123 | ^self class: 'glyphicon-transfer' 1124 | ] 1125 | 1126 | { #category : #'default icons file handling' } 1127 | TBSGlyphTag >> iconTrash [ 1128 | 1129 | ^self class: 'glyphicon-trash' 1130 | ] 1131 | 1132 | { #category : #'default icons trees' } 1133 | TBSGlyphTag >> iconTreeConifer [ 1134 | 1135 | ^self class: 'glyphicon-tree-conifer' 1136 | ] 1137 | 1138 | { #category : #'default icons trees' } 1139 | TBSGlyphTag >> iconTreeDeciduous [ 1140 | 1141 | ^self class: 'glyphicon-tree-deciduous' 1142 | ] 1143 | 1144 | { #category : #'default icons money' } 1145 | TBSGlyphTag >> iconUSD [ 1146 | 1147 | ^self class: 'glyphicon-usd' 1148 | ] 1149 | 1150 | { #category : #'default icons common' } 1151 | TBSGlyphTag >> iconUnchecked [ 1152 | 1153 | ^self class: 'glyphicon-unchecked' 1154 | ] 1155 | 1156 | { #category : #'default icons file handling' } 1157 | TBSGlyphTag >> iconUpload [ 1158 | 1159 | ^self class: 'glyphicon-upload' 1160 | ] 1161 | 1162 | { #category : #'default icons common' } 1163 | TBSGlyphTag >> iconUser [ 1164 | 1165 | ^self class: 'glyphicon-user' 1166 | ] 1167 | 1168 | { #category : #'default icons media audio' } 1169 | TBSGlyphTag >> iconVolumeDown [ 1170 | 1171 | ^self class: 'glyphicon-volume-down' 1172 | ] 1173 | 1174 | { #category : #'default icons media audio' } 1175 | TBSGlyphTag >> iconVolumeOff [ 1176 | 1177 | ^self class: 'glyphicon-volume-off' 1178 | ] 1179 | 1180 | { #category : #'default icons media audio' } 1181 | TBSGlyphTag >> iconVolumeUp [ 1182 | 1183 | ^self class: 'glyphicon-volume-up' 1184 | ] 1185 | 1186 | { #category : #'default icons common' } 1187 | TBSGlyphTag >> iconWarningSign [ 1188 | 1189 | ^self class: 'glyphicon-warning-sign' 1190 | ] 1191 | 1192 | { #category : #'default icons common' } 1193 | TBSGlyphTag >> iconWrench [ 1194 | 1195 | ^self class: 'glyphicon-wrench' 1196 | ] 1197 | 1198 | { #category : #'default icons common' } 1199 | TBSGlyphTag >> iconZoomIn [ 1200 | 1201 | ^self class: 'glyphicon-zoom-in' 1202 | ] 1203 | 1204 | { #category : #'default icons common' } 1205 | TBSGlyphTag >> iconZoomOut [ 1206 | 1207 | ^self class: 'glyphicon-zoom-out' 1208 | ] 1209 | 1210 | { #category : #initialization } 1211 | TBSGlyphTag >> initialize [ 1212 | super initialize. 1213 | self class: 'glyphicon' 1214 | ] 1215 | 1216 | { #category : #accessing } 1217 | TBSGlyphTag >> tag [ 1218 | 1219 | ^'span' 1220 | ] 1221 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSImageTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | represents a twitter bootstrap image 3 | " 4 | Class { 5 | #name : #TBSImageTag, 6 | #superclass : #WAImageTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSImageTag >> beCircle [ 12 | "Creates an Circle border image." 13 | self class: 'img-circle' 14 | ] 15 | 16 | { #category : #options } 17 | TBSImageTag >> beResponsive [ 18 | "Creates an Rounded border image." 19 | self class: 'img-responsive' 20 | ] 21 | 22 | { #category : #options } 23 | TBSImageTag >> beRounded [ 24 | "Creates an Rounded border image." 25 | self class: 'img-rounded' 26 | ] 27 | 28 | { #category : #options } 29 | TBSImageTag >> beThumbnail [ 30 | "Creates an thumbnail border image." 31 | self class: 'img-thumbnail' 32 | ] 33 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSInputGroupTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap input group 3 | " 4 | Class { 5 | #name : #TBSInputGroupTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #sizing } 11 | TBSInputGroupTag >> beLarge [ 12 | 13 | self class: 'input-group-lg' 14 | ] 15 | 16 | { #category : #sizing } 17 | TBSInputGroupTag >> beSmall [ 18 | 19 | self class: 'input-group-sm' 20 | ] 21 | 22 | { #category : #initialization } 23 | TBSInputGroupTag >> initialize [ 24 | super initialize. 25 | self class: 'input-group' 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSJumbotronTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap jumbotron 3 | " 4 | Class { 5 | #name : #TBSJumbotronTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #initialization } 11 | TBSJumbotronTag >> initialize [ 12 | super initialize. 13 | self class: 'jumbotron' 14 | ] 15 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSLabelTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | The Bootstrap label 3 | " 4 | Class { 5 | #name : #TBSLabelTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSLabelTag >> beDanger [ 12 | 13 | ^self class: 'label-danger' 14 | ] 15 | 16 | { #category : #options } 17 | TBSLabelTag >> beDefault [ 18 | 19 | ^self class: 'label-default' 20 | ] 21 | 22 | { #category : #options } 23 | TBSLabelTag >> beInfo [ 24 | 25 | ^self class: 'label-info' 26 | ] 27 | 28 | { #category : #options } 29 | TBSLabelTag >> bePrimary [ 30 | 31 | ^self class: 'label-primary' 32 | ] 33 | 34 | { #category : #options } 35 | TBSLabelTag >> beSuccess [ 36 | 37 | ^self class: 'label-success' 38 | ] 39 | 40 | { #category : #options } 41 | TBSLabelTag >> beWarning [ 42 | 43 | ^self class: 'label-warning' 44 | ] 45 | 46 | { #category : #initialization } 47 | TBSLabelTag >> initialize [ 48 | super initialize. 49 | self class: 'label' 50 | ] 51 | 52 | { #category : #accessing } 53 | TBSLabelTag >> tag [ 54 | 55 | ^'span' 56 | ] 57 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSLayoutColumnTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A boostrap layout column 3 | " 4 | Class { 5 | #name : #TBSLayoutColumnTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #sizes } 11 | TBSLayoutColumnTag >> extraSmallSize: anInteger [ 12 | 13 | self class: 'col-xs-', anInteger greaseString 14 | 15 | 16 | ] 17 | 18 | { #category : #positioning } 19 | TBSLayoutColumnTag >> largeOffset: anInteger [ 20 | 21 | self class: 'col-lg-offset-', anInteger greaseString 22 | 23 | 24 | ] 25 | 26 | { #category : #positioning } 27 | TBSLayoutColumnTag >> largePull: anInteger [ 28 | 29 | self class: 'col-lg-pull-', anInteger greaseString 30 | 31 | 32 | ] 33 | 34 | { #category : #positioning } 35 | TBSLayoutColumnTag >> largePush: anInteger [ 36 | 37 | self class: 'col-lg-push-', anInteger greaseString 38 | 39 | 40 | ] 41 | 42 | { #category : #sizes } 43 | TBSLayoutColumnTag >> largeSize: anInteger [ 44 | 45 | self class: 'col-lg-', anInteger greaseString 46 | 47 | 48 | ] 49 | 50 | { #category : #positioning } 51 | TBSLayoutColumnTag >> mediumOffset: anInteger [ 52 | 53 | self class: 'col-md-offset-', anInteger greaseString 54 | 55 | 56 | ] 57 | 58 | { #category : #positioning } 59 | TBSLayoutColumnTag >> mediumPull: anInteger [ 60 | 61 | self class: 'col-md-pull-', anInteger greaseString 62 | 63 | 64 | ] 65 | 66 | { #category : #positioning } 67 | TBSLayoutColumnTag >> mediumPush: anInteger [ 68 | 69 | self class: 'col-md-push-', anInteger greaseString 70 | 71 | 72 | ] 73 | 74 | { #category : #sizes } 75 | TBSLayoutColumnTag >> mediumSize: anInteger [ 76 | 77 | self class: 'col-md-', anInteger greaseString 78 | 79 | 80 | ] 81 | 82 | { #category : #positioning } 83 | TBSLayoutColumnTag >> smallOffset: anInteger [ 84 | 85 | self class: 'col-sm-offset-', anInteger greaseString 86 | 87 | 88 | ] 89 | 90 | { #category : #sizes } 91 | TBSLayoutColumnTag >> smallSize: anInteger [ 92 | 93 | self class: 'col-sm-', anInteger greaseString 94 | 95 | 96 | ] 97 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSLayoutRowTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A boostrap layout row 3 | " 4 | Class { 5 | #name : #TBSLayoutRowTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #initialization } 11 | TBSLayoutRowTag >> initialize [ 12 | super initialize. 13 | self class: 'row' 14 | ] 15 | 16 | { #category : #options } 17 | TBSLayoutRowTag >> showGrid [ 18 | 19 | self class: 'show-grid' 20 | ] 21 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSLinkifyListGroupItem.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A bootstrap linkify list group item 3 | " 4 | Class { 5 | #name : #TBSLinkifyListGroupItem, 6 | #superclass : #WAAnchorTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSLinkifyListGroupItem >> beActive [ 12 | 13 | self class: 'active' 14 | ] 15 | 16 | { #category : #initialization } 17 | TBSLinkifyListGroupItem >> initialize [ 18 | super initialize. 19 | self class: 'list-group-item' 20 | ] 21 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSListGroupItem.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A list group icon 3 | " 4 | Class { 5 | #name : #TBSListGroupItem, 6 | #superclass : #TBSListItemTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #initialization } 11 | TBSListGroupItem >> initialize [ 12 | super initialize. 13 | self class: 'list-group-item' 14 | ] 15 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSListItemTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Common superclass for list item based Bootstrap tags 3 | " 4 | Class { 5 | #name : #TBSListItemTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSListItemTag >> beActive [ 12 | 13 | self class: 'active' 14 | ] 15 | 16 | { #category : #options } 17 | TBSListItemTag >> beActiveIf: aBoolean [ 18 | 19 | aBoolean value ifTrue: [ self beActive ] 20 | ] 21 | 22 | { #category : #options } 23 | TBSListItemTag >> beDisabled [ 24 | 25 | self class: 'disabled' 26 | ] 27 | 28 | { #category : #accessing } 29 | TBSListItemTag >> tag [ 30 | 31 | ^'li' 32 | ] 33 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSModalTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap modal 3 | " 4 | Class { 5 | #name : #TBSModalTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSModalTag >> beFade [ 12 | 13 | self class: 'fade' 14 | ] 15 | 16 | { #category : #initialization } 17 | TBSModalTag >> initialize [ 18 | super initialize. 19 | self class: 'modal' 20 | ] 21 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSNavItemTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Bootstrap nav item 3 | " 4 | Class { 5 | #name : #TBSNavItemTag, 6 | #superclass : #TBSListItemTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSNavTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap navigation 3 | " 4 | Class { 5 | #name : #TBSNavTag, 6 | #superclass : #WAUnorderedListTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSNavTag >> beNavbarNavigation [ 12 | "Creates a navigation specialized for a nav bar." 13 | 14 | self class: 'navbar-nav' 15 | ] 16 | 17 | { #category : #options } 18 | TBSNavTag >> bePills [ 19 | "Creates an Pills nav." 20 | self class: 'nav-pills' 21 | ] 22 | 23 | { #category : #options } 24 | TBSNavTag >> beStacked [ 25 | "Creates a stacked nav (for pills only)." 26 | 27 | self class: 'nav-stacked' 28 | ] 29 | 30 | { #category : #options } 31 | TBSNavTag >> beTabs [ 32 | "Creates an Tabs nav." 33 | self class: 'nav-tabs' 34 | ] 35 | 36 | { #category : #initialization } 37 | TBSNavTag >> initialize [ 38 | super initialize. 39 | self class: 'nav' 40 | ] 41 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSNavbarTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap navigation bar 3 | " 4 | Class { 5 | #name : #TBSNavbarTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSNavbarTag >> beDefault [ 12 | "Creates a default navbar." 13 | 14 | self class: 'navbar-default' 15 | ] 16 | 17 | { #category : #options } 18 | TBSNavbarTag >> beFixedBottom [ 19 | "Creates an Fixed Bottom navbar." 20 | 21 | self class: 'navbar-fixed-bottom' 22 | ] 23 | 24 | { #category : #options } 25 | TBSNavbarTag >> beFixedTop [ 26 | "Creates an Fixed Top navbar." 27 | 28 | self class: 'navbar-fixed-top' 29 | ] 30 | 31 | { #category : #options } 32 | TBSNavbarTag >> beInverse [ 33 | "Creates an Inverse navbar." 34 | 35 | self class: 'navbar-inverse' 36 | ] 37 | 38 | { #category : #options } 39 | TBSNavbarTag >> beStaticTop [ 40 | "Creates an Static Top navbar." 41 | 42 | self class: 'navbar-static-top' 43 | ] 44 | 45 | { #category : #initialization } 46 | TBSNavbarTag >> initialize [ 47 | super initialize. 48 | self 49 | class: 'nav'; 50 | class: 'navbar' 51 | ] 52 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSNavbarToggleButton.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A TBSNavbarToggleButton is a button that only shows, when the window is to small. It creates a callapsed ""navbar-toggle"". 3 | Note: to use this, you have to connect this to the part that needs to be connected with the target and toggle. 4 | 5 | " 6 | Class { 7 | #name : #TBSNavbarToggleButton, 8 | #superclass : #WAButtonTag, 9 | #category : 'Bootstrap-Core-Canvas' 10 | } 11 | 12 | { #category : #initialization } 13 | TBSNavbarToggleButton >> initialize [ 14 | super initialize. 15 | self type: 'button'; 16 | class: 'navbar-toggle'; 17 | class: 'collapsed'; 18 | toggle: 'collapse'; 19 | target: '.navbar-collapse' 20 | ] 21 | 22 | { #category : #accessing } 23 | TBSNavbarToggleButton >> target: aString [ 24 | self attributes at: 'data-target' put: aString 25 | ] 26 | 27 | { #category : #accessing } 28 | TBSNavbarToggleButton >> toggle: aString [ 29 | self attributes at: 'data-toggle' put: aString 30 | ] 31 | 32 | { #category : #public } 33 | TBSNavbarToggleButton >> with: aBlock [ 34 | super with: [ 35 | canvas span 36 | class: 'sr-only'; 37 | with: aBlock. 38 | 1 to: 3 do: [ :each | canvas span class: 'icon-bar' ] ] 39 | ] 40 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSPageHeaderTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap page header 3 | " 4 | Class { 5 | #name : #TBSPageHeaderTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #initialization } 11 | TBSPageHeaderTag >> initialize [ 12 | super initialize. 13 | self class: 'page-header' 14 | ] 15 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSPaginationItemTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Bootstrap pagination item 3 | " 4 | Class { 5 | #name : #TBSPaginationItemTag, 6 | #superclass : #TBSListItemTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSPanelTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap panel 3 | " 4 | Class { 5 | #name : #TBSPanelTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSPanelTag >> beDanger [ 12 | 13 | self class: 'panel-danger' 14 | ] 15 | 16 | { #category : #options } 17 | TBSPanelTag >> beDefault [ 18 | 19 | self class: 'panel-default' 20 | ] 21 | 22 | { #category : #options } 23 | TBSPanelTag >> beInfo [ 24 | 25 | self class: 'panel-info' 26 | ] 27 | 28 | { #category : #options } 29 | TBSPanelTag >> bePrimary [ 30 | 31 | self class: 'panel-primary' 32 | ] 33 | 34 | { #category : #options } 35 | TBSPanelTag >> beSuccess [ 36 | 37 | self class: 'panel-success' 38 | ] 39 | 40 | { #category : #options } 41 | TBSPanelTag >> beWarning [ 42 | 43 | self class: 'panel-warning' 44 | ] 45 | 46 | { #category : #initialization } 47 | TBSPanelTag >> initialize [ 48 | super initialize. 49 | self class: 'panel' 50 | ] 51 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSProgressTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap progress 3 | " 4 | Class { 5 | #name : #TBSProgressTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSProgressTag >> beAnimated [ 12 | 13 | self beStriped. 14 | self class: 'active' 15 | ] 16 | 17 | { #category : #options } 18 | TBSProgressTag >> beStriped [ 19 | 20 | self class: 'progress-striped' 21 | 22 | ] 23 | 24 | { #category : #initialization } 25 | TBSProgressTag >> initialize [ 26 | super initialize. 27 | self class: 'progress' 28 | ] 29 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSProgressbarTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap progress bar 3 | " 4 | Class { 5 | #name : #TBSProgressbarTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSProgressbarTag >> beDanger [ 12 | 13 | self class: 'progress-bar-danger' 14 | ] 15 | 16 | { #category : #options } 17 | TBSProgressbarTag >> beInfo [ 18 | 19 | self class: 'progress-bar-info' 20 | ] 21 | 22 | { #category : #options } 23 | TBSProgressbarTag >> beSuccess [ 24 | 25 | self class: 'progress-bar-success' 26 | ] 27 | 28 | { #category : #options } 29 | TBSProgressbarTag >> beWarning [ 30 | 31 | self class: 'progress-bar-warning' 32 | ] 33 | 34 | { #category : #initialization } 35 | TBSProgressbarTag >> initialize [ 36 | super initialize. 37 | self class: 'progress-bar' 38 | ] 39 | 40 | { #category : #accessing } 41 | TBSProgressbarTag >> valueNow: anInteger [ 42 | 43 | self attributeAt: 'style' put: ('width: ', anInteger greaseString, '%') 44 | ] 45 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSTabPaneTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A bootstrap tab pane 3 | " 4 | Class { 5 | #name : #TBSTabPaneTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSTabPaneTag >> beActive [ 12 | 13 | self class: 'active' 14 | ] 15 | 16 | { #category : #options } 17 | TBSTabPaneTag >> beActiveIf: aBooleanOrBlock [ 18 | 19 | aBooleanOrBlock value ifTrue: [ self beActive ] 20 | ] 21 | 22 | { #category : #initialization } 23 | TBSTabPaneTag >> initialize [ 24 | super initialize. 25 | self class: 'tab-pane' 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSTableTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A Boostrap styled table 3 | " 4 | Class { 5 | #name : #TBSTableTag, 6 | #superclass : #WATableTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSTableTag >> beBordered [ 12 | "For borders on all sides of the table and cells.." 13 | 14 | self class: 'table-bordered' 15 | ] 16 | 17 | { #category : #options } 18 | TBSTableTag >> beCondensed [ 19 | "Make tables more compact by cutting cell padding in half" 20 | 21 | self class: 'table-condensed' 22 | ] 23 | 24 | { #category : #options } 25 | TBSTableTag >> beHover [ 26 | "Enable a hover state on table rows within the body." 27 | 28 | self class: 'table-hover' 29 | ] 30 | 31 | { #category : #options } 32 | TBSTableTag >> beStriped [ 33 | "Add zebra-striping to any table row within the body." 34 | 35 | self class: 'table-striped' 36 | ] 37 | 38 | { #category : #initialization } 39 | TBSTableTag >> initialize [ 40 | super initialize. 41 | self class: 'table' 42 | ] 43 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSVerticalButtonGroupTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A vertical Bootstrap button group 3 | " 4 | Class { 5 | #name : #TBSVerticalButtonGroupTag, 6 | #superclass : #TBSButtonGroupTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSVerticalButtonGroupTag >> defaultStyleClass [ 12 | 13 | ^'btn-group-vertical' 14 | ] 15 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/TBSWellTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap well 3 | " 4 | Class { 5 | #name : #TBSWellTag, 6 | #superclass : #TBSGenericTag, 7 | #category : 'Bootstrap-Core-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSWellTag >> beLarge [ 12 | 13 | self class: 'well-lg' 14 | ] 15 | 16 | { #category : #options } 17 | TBSWellTag >> beSmall [ 18 | 19 | self class: 'well-sm' 20 | ] 21 | 22 | { #category : #initialization } 23 | TBSWellTag >> initialize [ 24 | super initialize. 25 | self class: 'well' 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/WAComponent.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WAComponent } 2 | 3 | { #category : #'*bootstrap-core' } 4 | WAComponent >> confirmError: anObject [ 5 | ^self call: (TBSConfirmer dangerOn: anObject) 6 | ] 7 | 8 | { #category : #'*bootstrap-core' } 9 | WAComponent >> confirmInfo: anObject [ 10 | ^self call: (TBSConfirmer on: anObject) 11 | ] 12 | 13 | { #category : #'*bootstrap-core' } 14 | WAComponent >> confirmSuccess: anObject [ 15 | ^self call: (TBSConfirmer successOn: anObject) 16 | ] 17 | 18 | { #category : #'*bootstrap-core' } 19 | WAComponent >> confirmWarning: anObject [ 20 | ^self call: (TBSConfirmer warningOn: anObject) 21 | ] 22 | 23 | { #category : #'*bootstrap-core' } 24 | WAComponent >> informError: anObject [ 25 | self call: (TBSAlerter dangerOn: anObject) 26 | ] 27 | 28 | { #category : #'*bootstrap-core' } 29 | WAComponent >> informInfo: anObject [ 30 | self call: (TBSAlerter on: anObject) 31 | ] 32 | 33 | { #category : #'*bootstrap-core' } 34 | WAComponent >> informSuccess: anObject [ 35 | self call: (TBSAlerter successOn: anObject) 36 | ] 37 | 38 | { #category : #'*bootstrap-core' } 39 | WAComponent >> informWarning: anObject [ 40 | self call: (TBSAlerter warningOn: anObject) 41 | ] 42 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/WAFormInputTag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WAFormInputTag } 2 | 3 | { #category : #'*bootstrap-core-canvas' } 4 | WAFormInputTag >> tbsFormControl [ 5 | 6 | self class: 'form-control' 7 | ] 8 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/WAImageTag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WAImageTag } 2 | 3 | { #category : #'*bootstrap-core-canvas' } 4 | WAImageTag >> placeHolder: aString [ 5 | "Support for holder.js 6 | 7 | Example: html image placeHolder: '80x180'. 8 | html image placeHolder: '100%x180'. 9 | " 10 | 11 | self attributeAt: 'data-src' put: 'holder.js/', aString 12 | ] 13 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/WATagBrush.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WATagBrush } 2 | 3 | { #category : #'*bootstrap-core-canvas' } 4 | WATagBrush >> role: aString [ 5 | self attributes at: 'role' put: aString 6 | ] 7 | 8 | { #category : #'*bootstrap-core-canvas' } 9 | WATagBrush >> tbsClearfix [ 10 | "Clear the float on any element." 11 | 12 | self class: 'clearfix' 13 | ] 14 | 15 | { #category : #'*bootstrap-core-canvas' } 16 | WATagBrush >> tbsDropdown [ 17 | "Creates a bootstrap dropdown." 18 | 19 | ^ self 20 | class: 'dropdown'; 21 | yourself 22 | ] 23 | 24 | { #category : #'*bootstrap-core-canvas' } 25 | WATagBrush >> tbsDropdown: aBlock [ 26 | "Create a bootstrap dropdown by wrapping its contents given by a block" 27 | 28 | ^ self tbsDropdown 29 | with: aBlock 30 | 31 | ] 32 | 33 | { #category : #'*bootstrap-core-canvas' } 34 | WATagBrush >> tbsHiddenForExtraSmallDevices [ 35 | 36 | self class: 'hidden-xs' 37 | ] 38 | 39 | { #category : #'*bootstrap-core-canvas' } 40 | WATagBrush >> tbsHiddenForLargeDevices [ 41 | 42 | self class: 'hidden-lg' 43 | ] 44 | 45 | { #category : #'*bootstrap-core-canvas' } 46 | WATagBrush >> tbsHiddenForMediumDevices [ 47 | 48 | self class: 'hidden-md' 49 | ] 50 | 51 | { #category : #'*bootstrap-core-canvas' } 52 | WATagBrush >> tbsHiddenForPrint [ 53 | 54 | self class: 'hidden-print' 55 | ] 56 | 57 | { #category : #'*bootstrap-core-canvas' } 58 | WATagBrush >> tbsHiddenForSmallDevices [ 59 | 60 | self class: 'hidden-sm' 61 | ] 62 | 63 | { #category : #'*bootstrap-core-canvas' } 64 | WATagBrush >> tbsPullLeft [ 65 | "Float an element left with a class" 66 | 67 | self class: 'pull-left' 68 | ] 69 | 70 | { #category : #'*bootstrap-core-canvas' } 71 | WATagBrush >> tbsPullRight [ 72 | "Float an element right with a class." 73 | 74 | self class: 'pull-right' 75 | ] 76 | 77 | { #category : #'*bootstrap-core-canvas' } 78 | WATagBrush >> tbsScreenReaderOnly [ 79 | 80 | self class: 'sr-only' 81 | ] 82 | 83 | { #category : #'*bootstrap-core-canvas' } 84 | WATagBrush >> tbsTooltip: aString [ 85 | self attributeAt: 'data-toggle' put: 'tooltip'. 86 | self title: aString 87 | ] 88 | 89 | { #category : #'*bootstrap-core-canvas' } 90 | WATagBrush >> tbsTooltip: aString direction: aDirectionSymbol [ 91 | "Provide any of the following directions: #left, #top, #bottom, #right" 92 | self tbsTooltip: aString. 93 | self attributes at: 'data-placement' put: aDirectionSymbol asString 94 | 95 | ] 96 | 97 | { #category : #'*bootstrap-core-canvas' } 98 | WATagBrush >> tbsVisibleForExtraSmallDevices [ 99 | 100 | self class: 'visible-xs' 101 | ] 102 | 103 | { #category : #'*bootstrap-core-canvas' } 104 | WATagBrush >> tbsVisibleForLargeDevices [ 105 | 106 | self class: 'visible-lg' 107 | ] 108 | 109 | { #category : #'*bootstrap-core-canvas' } 110 | WATagBrush >> tbsVisibleForMediumDevices [ 111 | 112 | self class: 'visible-md' 113 | ] 114 | 115 | { #category : #'*bootstrap-core-canvas' } 116 | WATagBrush >> tbsVisibleForPrint [ 117 | 118 | self class: 'visible-print' 119 | ] 120 | 121 | { #category : #'*bootstrap-core-canvas' } 122 | WATagBrush >> tbsVisibleForSmallDevices [ 123 | 124 | self class: 'visible-sm' 125 | ] 126 | -------------------------------------------------------------------------------- /src/Bootstrap-Core/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Core' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSAccordionExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An example for an Accordion 3 | " 4 | Class { 5 | #name : #TBSAccordionExample, 6 | #superclass : #TBSBootstrapExample, 7 | #instVars : [ 8 | 'batcher', 9 | 'accordion' 10 | ], 11 | #category : 'Bootstrap-Examples-Widgets-Components' 12 | } 13 | 14 | { #category : #accessing } 15 | TBSAccordionExample class >> exampleName [ 16 | 17 | ^'Accordion' 18 | ] 19 | 20 | { #category : #initialization } 21 | TBSAccordionExample >> initialize [ 22 | "Initializes the receiver" 23 | 24 | super initialize. 25 | accordion := TBSAccordion new. 26 | accordion 27 | add: [:html | html text: 'Some content' ] title: 'A block'; 28 | add: [:html | html text: 'Some more content' ] title: 'Item 2'; 29 | add: WACounter new title: 'A component'. 30 | 31 | ] 32 | 33 | { #category : #rendering } 34 | TBSAccordionExample >> renderExampleOn: html [ 35 | 36 | html render: accordion 37 | 38 | ] 39 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSAlertsExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap alerts 3 | " 4 | Class { 5 | #name : #TBSAlertsExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSAlertsExample class >> exampleName [ 12 | 13 | ^'Alerts' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSAlertsExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Examples'. 20 | 21 | html tbsAlert 22 | beSuccess; 23 | with: [ html strong: 'Well done!'. html text: ' You successfully read this important alert message.' ]. 24 | 25 | html tbsAlert 26 | beInfo; 27 | with: [ html strong: 'Heads up!'. html text: ' This alert needs your attention, but it''s not super important.' ]. 28 | 29 | html tbsAlert 30 | beWarning; 31 | with: [ html strong: 'Warning!'. html text: ' Best check yo self, you''re not looking too good.' ]. 32 | 33 | html tbsAlert 34 | beDanger; 35 | with: [ html strong: 'Oh snap!'. html text: ' Change a few things up and try submitting again.' ]. 36 | 37 | html heading level: 2; with: 'Links in Alerts'. 38 | html text: 'to be done'. 39 | ] 40 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBadgeExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap badges 3 | " 4 | Class { 5 | #name : #TBSBadgeExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSBadgeExample class >> exampleName [ 12 | 13 | ^'Badges' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSBadgeExample >> renderExampleOn: html [ 18 | 19 | html anchor with: [ html text: 'Inbox '. html tbsBadge: '42'. ]. 20 | 21 | html heading level: 4; with: 'Self collapsing'. 22 | html text: 'When there are no new or unread items, badges will simply collapse. '. 23 | 24 | html break. html anchor with: [ html text: 'Full Inbox '. html tbsBadge: '42'. ]. 25 | html break. html anchor with: [ html text: 'Empty Inbox '. html tbsBadge: ''. ]. 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBatchedListExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An example for the batched list 3 | " 4 | Class { 5 | #name : #TBSBatchedListExample, 6 | #superclass : #TBSBootstrapExample, 7 | #instVars : [ 8 | 'batcher' 9 | ], 10 | #category : 'Bootstrap-Examples-Widgets-Components' 11 | } 12 | 13 | { #category : #accessing } 14 | TBSBatchedListExample class >> exampleName [ 15 | ^ 'Batched List Widget' 16 | ] 17 | 18 | { #category : #accessing } 19 | TBSBatchedListExample >> children [ 20 | ^ Array with: batcher 21 | ] 22 | 23 | { #category : #initialization } 24 | TBSBatchedListExample >> initialize [ 25 | super initialize. 26 | batcher := TBSBatchedList new 27 | batchSize: 6; 28 | items: ($A to: $Z); 29 | yourself. 30 | ] 31 | 32 | { #category : #rendering } 33 | TBSBatchedListExample >> renderExampleOn: html [ 34 | "The batcher is implemented in #initialize as 35 | 36 | batcher := TBSBatchedList new 37 | batchSize: 6; 38 | items: ($A to: $Z); 39 | yourself." 40 | 41 | html tbsRow: [ 42 | html tbsColumn 43 | mediumSize: 4; 44 | with: [ 45 | self renderTableOn: html. 46 | html render: batcher ] ] 47 | ] 48 | 49 | { #category : #rendering } 50 | TBSBatchedListExample >> renderTableOn: html [ 51 | html tbsTable 52 | beCondensed; 53 | beStriped; 54 | with: [ 55 | html tableHead: [ 56 | html tableHeading: 'Character'. 57 | html tableHeading: 'ASCII Value' ]. 58 | html tableBody: [ 59 | (batcher batch) do: [ :char | 60 | html tableRow: [ 61 | html tableData: char. 62 | html tableData: (char asInteger) ] ] ] ] 63 | ] 64 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBootstrapExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A common superclass for the bootstrap examples 3 | " 4 | Class { 5 | #name : #TBSBootstrapExample, 6 | #superclass : #WAComponent, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSBootstrapExample class >> exampleName [ 12 | 13 | ^self name greaseString 14 | ] 15 | 16 | { #category : #testing } 17 | TBSBootstrapExample class >> isAbstract [ 18 | 19 | ^self name = #TBSBootstrapExample 20 | ] 21 | 22 | { #category : #rendering } 23 | TBSBootstrapExample >> renderContentOn: html [ 24 | 25 | html heading: self class exampleName; horizontalRule. 26 | self renderExampleOn: html 27 | ] 28 | 29 | { #category : #rendering } 30 | TBSBootstrapExample >> renderExampleOn: html [ 31 | 32 | 33 | ] 34 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBootstrapTableExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Common superclass for all examples from http://wenzhixin.net.cn/p/bootstrap-table 3 | " 4 | Class { 5 | #name : #TBSBootstrapTableExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Widgets-Table' 8 | } 9 | 10 | { #category : #testing } 11 | TBSBootstrapTableExample class >> isAbstract [ 12 | 13 | ^self name = #TBSBootstrapTableExample 14 | ] 15 | 16 | { #category : #updating } 17 | TBSBootstrapTableExample >> updateRoot: root [ 18 | 19 | super updateRoot: root. 20 | TBSTableFileLibrary default updateRoot: root 21 | ] 22 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBootstrapTableExampleLibrary.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Provide JSON example from json directory in https://github.com/wenzhixin/bootstrap-table-examples 3 | " 4 | Class { 5 | #name : #TBSBootstrapTableExampleLibrary, 6 | #superclass : #WAFileMetadataLibrary, 7 | #category : 'Bootstrap-Examples-Widgets-Table' 8 | } 9 | 10 | { #category : #'uploaded metadata' } 11 | TBSBootstrapTableExampleLibrary >> data1Json [ 12 | ^ WAFileLibraryResource 13 | filepath: 'data1.json' 14 | mimeType: (WAMimeType main: 'application' sub: 'octet-stream') 15 | cacheDuration: (Duration days: 0 hours: 0 minutes: 30 seconds: 0) 16 | contents: (GRDelayedSend receiver: self selector: #data1JsonContent) 17 | ] 18 | 19 | { #category : #uploaded } 20 | TBSBootstrapTableExampleLibrary >> data1JsonContent [ 21 | ^ #[91 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 48 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 48 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 48 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 50 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 50 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 50 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 51 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 51 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 51 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 52 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 52 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 52 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 53 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 53 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 53 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 54 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 54 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 54 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 55 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 55 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 55 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 56 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 56 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 56 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 57 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 57 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 57 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 48 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 48 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 48 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 49 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 49 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 49 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 50 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 50 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 50 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 51 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 51 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 51 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 52 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 52 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 52 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 53 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 53 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 53 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 54 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 54 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 54 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 55 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 55 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 55 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 56 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 56 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 56 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 49 57 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 49 57 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 49 57 34 13 10 32 32 32 32 125 44 13 10 32 32 32 32 123 13 10 32 32 32 32 32 32 32 32 34 105 100 34 58 32 50 48 44 13 10 32 32 32 32 32 32 32 32 34 110 97 109 101 34 58 32 34 73 116 101 109 32 50 48 34 44 13 10 32 32 32 32 32 32 32 32 34 112 114 105 99 101 34 58 32 34 36 50 48 34 13 10 32 32 32 32 125 13 10 93] 22 | ] 23 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSBreadcrumbExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap breadcrumb example 3 | " 4 | Class { 5 | #name : #TBSBreadcrumbExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSBreadcrumbExample class >> exampleName [ 12 | 13 | ^'Breadcrumbs' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSBreadcrumbExample >> renderExampleOn: html [ 18 | 19 | html tbsBreadcrumb: [ 20 | html tbsBreadcrumbSection beActive; with: 'Home' ]. 21 | 22 | html tbsBreadcrumb: [ 23 | html tbsBreadcrumbSection: [ html anchor: 'Home' ]. 24 | html tbsBreadcrumbSection beActive; with: 'Library']. 25 | 26 | html tbsBreadcrumb: [ 27 | html tbsBreadcrumbSection: [ html anchor: 'Home' ]. 28 | html tbsBreadcrumbSection: [ html anchor: 'Library' ]. 29 | html tbsBreadcrumbSection beActive; with: 'Data'] 30 | ] 31 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSButtonDropdownExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap button dropdown examples 3 | " 4 | Class { 5 | #name : #TBSButtonDropdownExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSButtonDropdownExample class >> exampleName [ 12 | 13 | ^'Button dropdowns' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSButtonDropdownExample >> renderExampleOn: html [ 18 | 19 | |menu| 20 | menu := [ html tbsDropdownMenuItem: [ html anchor: 'Action' ]. 21 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 22 | html tbsDropdownMenuItem: [ html anchor: 'Something else here' ]. 23 | html tbsDivider. 24 | html tbsDropdownMenuItem: [ html anchor: 'Separated link' ]]. 25 | 26 | html heading level: 2; with: 'Single button dropdowns'. 27 | html tbsButtonGroup: [ html tbsDropdownButton beDefault; with: [html text: 'Default '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 28 | html tbsButtonGroup: [ html tbsDropdownButton bePrimary; with: [html text: 'Primary '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 29 | html tbsButtonGroup: [ html tbsDropdownButton beSuccess; with: [html text: 'Success '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 30 | html tbsButtonGroup: [ html tbsDropdownButton beInfo; with: [html text: 'Info '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 31 | html tbsButtonGroup: [ html tbsDropdownButton beWarning; with: [html text: 'Warning '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 32 | html tbsButtonGroup: [ html tbsDropdownButton beDanger; with: [html text: 'Danger '; tbsCaret]. html tbsDropdownMenu: menu; space ]. 33 | 34 | ] 35 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSButtonExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap button examples 3 | " 4 | Class { 5 | #name : #TBSButtonExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSButtonExample class >> exampleName [ 12 | 13 | ^'Buttons' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSButtonExample >> renderButtonsDisabledStateOn: html [ 18 | 19 | html 20 | heading level: 2; with: 'Disabled state'. 21 | 22 | html paragraph: 'Make buttons look unclickable by fading them back 50%.'. 23 | 24 | html heading level: 2; with: 'Disabled state'. 25 | 26 | html tbsButton 27 | bePrimary; 28 | beDisabled; 29 | with: 'Disabled button'. 30 | html space. 31 | html tbsButton 32 | beDisabled; 33 | with: 'Disabled button'. 34 | 35 | 36 | ] 37 | 38 | { #category : #rendering } 39 | TBSButtonExample >> renderButtonsOptionsOn: html [ 40 | 41 | html 42 | heading level: 2; with: 'Options'. 43 | 44 | html tbsButton 45 | beDefault; 46 | with: 'Default'. 47 | 48 | html space. 49 | 50 | html tbsButton 51 | bePrimary; 52 | with: 'Primary'. 53 | 54 | html space. 55 | 56 | html tbsButton 57 | beSuccess; 58 | with: 'Success'. 59 | 60 | html space. 61 | 62 | html tbsButton 63 | beInfo; 64 | with: 'Info'. 65 | 66 | html space. 67 | 68 | html tbsButton 69 | beWarning; 70 | with: 'Warning'. 71 | 72 | html space. 73 | 74 | html tbsButton 75 | beDanger; 76 | with: 'Danger'. 77 | 78 | html space. 79 | 80 | html tbsButton 81 | beLink; 82 | with: 'Link'. 83 | 84 | ] 85 | 86 | { #category : #rendering } 87 | TBSButtonExample >> renderButtonsSizesOn: html [ 88 | 89 | html heading level: 2; with: 'Sizes'. 90 | 91 | html paragraph: 'Fancy larger or smaller buttons? Just add #beLarge, #beSmall, #beExtraSmall for additional sizes'. 92 | html tbsButton 93 | bePrimary; 94 | beLarge; 95 | with: 'Large button'. 96 | html space. 97 | html tbsButton 98 | beLarge; 99 | with: 'Large button'. 100 | 101 | html break; break. 102 | 103 | html tbsButton 104 | bePrimary; 105 | beDefault; 106 | with: 'Default button'. 107 | html space. 108 | html tbsButton 109 | with: 'Default button'. 110 | 111 | html break; break. 112 | 113 | html tbsButton 114 | bePrimary; 115 | beSmall; 116 | with: 'Small button'. 117 | html space. 118 | html tbsButton 119 | beSmall; 120 | with: 'Small button'. 121 | 122 | html break; break. 123 | 124 | html tbsButton 125 | bePrimary; 126 | beExtraSmall; 127 | with: 'Extra small button'. 128 | html space. 129 | html tbsButton 130 | beExtraSmall; 131 | with: 'Extra small button'. 132 | 133 | html break; break. 134 | 135 | html paragraph: 'Create block level buttons those that span the full width of a parent.'. 136 | 137 | html tbsButton 138 | bePrimary; 139 | beBlock; 140 | with: 'Block level button'. 141 | 142 | html tbsButton 143 | beBlock; 144 | with: 'Block level button'. 145 | 146 | 147 | 148 | 149 | ] 150 | 151 | { #category : #rendering } 152 | TBSButtonExample >> renderExampleOn: html [ 153 | 154 | self 155 | renderButtonsOptionsOn: html; 156 | renderButtonsSizesOn: html; 157 | renderButtonsDisabledStateOn: html 158 | ] 159 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSButtonGroupExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap button group examples 3 | " 4 | Class { 5 | #name : #TBSButtonGroupExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSButtonGroupExample class >> exampleName [ 12 | 13 | ^'Button groups' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSButtonGroupExample >> renderExampleOn: html [ 18 | 19 | html tbsButtonGroup: [ 20 | html tbsButton beDefault; with: 'Left'. 21 | html tbsButton beDefault; with: 'Middle'. 22 | html tbsButton beDefault; with: 'Right' ]. 23 | 24 | html heading level: 3; with: 'Button toolbar'. 25 | html tbsButtonToolbar: [ 26 | html tbsButtonGroup: [ 27 | html tbsButton beDefault; with: '1'. 28 | html tbsButton beDefault; with: '2'. 29 | html tbsButton beDefault; with: '3'. 30 | html tbsButton beDefault; with: '4']. 31 | html tbsButtonGroup: [ 32 | html tbsButton beDefault; with: '5'. 33 | html tbsButton beDefault; with: '6'. 34 | html tbsButton beDefault; with: '7']. 35 | html tbsButtonGroup: [ 36 | html tbsButton beDefault; with: '8']]. 37 | 38 | html heading level: 3; with: 'Button toolbar'. 39 | html tbsButtonGroup beLarge with: [ 40 | html tbsButton beDefault; with: 'Left'. 41 | html tbsButton beDefault; with: 'Middle'. 42 | html tbsButton beDefault; with: 'Right']. 43 | html break; break. 44 | html tbsButtonGroup: [ 45 | html tbsButton beDefault; with: 'Left'. 46 | html tbsButton beDefault; with: 'Middle'. 47 | html tbsButton beDefault; with: 'Right']. 48 | html break; break. 49 | html tbsButtonGroup beSmall with: [ 50 | html tbsButton beDefault; with: 'Left'. 51 | html tbsButton beDefault; with: 'Middle'. 52 | html tbsButton beDefault; with: 'Right']. 53 | html break; break. 54 | html tbsButtonGroup beExtraSmall with: [ 55 | html tbsButton beDefault; with: 'Left'. 56 | html tbsButton beDefault; with: 'Middle'. 57 | html tbsButton beDefault; with: 'Right']. 58 | html heading level: 3; with: 'Vertical button group'. 59 | html tbsButtonGroupVertical: [ 60 | html tbsButton beDefault; with: 'Left'. 61 | html tbsButton beDefault; with: 'Middle'. 62 | html tbsButton beDefault; with: 'Right']. 63 | ] 64 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSCodeExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap code formatting example 3 | " 4 | Class { 5 | #name : #TBSCodeExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSCodeExample class >> exampleName [ 12 | 13 | ^'Code' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSCodeExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Inline'. 20 | 21 | html text: 'For example, '. 22 | html code: '
'. 23 | html text: ' should be wrapped as inline.'. 24 | 25 | html heading level: 2; with: 'Basic block'. 26 | html preformatted: '

Sample text here...

' 27 | 28 | 29 | 30 | 31 | ] 32 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSDropdownExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap dropdown example 3 | " 4 | Class { 5 | #name : #TBSDropdownExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSDropdownExample class >> exampleName [ 12 | 13 | ^'Dropdowns' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSDropdownExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Example'. 20 | html div tbsDropdown: [ 21 | html tbsDropdownAnchor with: [html text: 'Dropdown '; tbsCaret]. 22 | html tbsDropdownMenu: [ 23 | html tbsDropdownMenuItem: [ html anchor: 'Action' ]. 24 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 25 | html tbsDropdownMenuItem: [ html anchor: 'Something else here' ]. 26 | html tbsDivider. 27 | html tbsDropdownMenuItem: [ html anchor: 'Separated link' ]. 28 | ]]. 29 | 30 | 31 | html heading level: 2; with: 'Headers'. 32 | html div tbsDropdown: [ 33 | html tbsDropdownAnchor with: [html text: 'Dropdown '; tbsCaret]. 34 | html tbsDropdownMenu: [ 35 | html tbsDropdownHeader: 'Dropdown header'. 36 | html tbsDropdownMenuItem: [ html anchor: 'Action' ]. 37 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 38 | html tbsDropdownMenuItem: [ html anchor: 'Something else here' ]. 39 | html tbsDivider. 40 | html tbsDropdownHeader: 'Dropdown header'. 41 | html tbsDropdownMenuItem: [ html anchor: 'Separated link' ]. 42 | ]]. 43 | 44 | html heading level: 2; with: 'Disabled menu items'. 45 | 46 | html div tbsDropdown: [ 47 | html tbsDropdownAnchor with: [html text: 'Dropdown '; tbsCaret]. 48 | html tbsDropdownMenu: [ 49 | html tbsDropdownMenuItem: [ html anchor: 'Regular Link' ]. 50 | html tbsDropdownMenuItem beDisabled; with: [ html anchor: 'Disabled Action' ]. 51 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 52 | ]. 53 | ]. 54 | 55 | 56 | 57 | ] 58 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSExampleBrowser.class.st: -------------------------------------------------------------------------------- 1 | " 2 | The examples browser 3 | " 4 | Class { 5 | #name : #TBSExampleBrowser, 6 | #superclass : #WAComponent, 7 | #instVars : [ 8 | 'currentExample' 9 | ], 10 | #category : 'Bootstrap-Examples-Browser' 11 | } 12 | 13 | { #category : #accessing } 14 | TBSExampleBrowser >> allExamples [ 15 | ^(TBSBootstrapExample allSubclasses 16 | select: [:ea| ea isAbstract not ]) 17 | sort: [:a :b | a name <= b name ] 18 | ] 19 | 20 | { #category : #accessing } 21 | TBSExampleBrowser >> children [ 22 | 23 | ^Array with: currentExample 24 | ] 25 | 26 | { #category : #hooks } 27 | TBSExampleBrowser >> initialRequest: request [ 28 | | exampleName | 29 | super initialRequest: request. 30 | exampleName := request url path last. 31 | currentExample := 32 | (self allExamples 33 | detect: [ :each | 34 | each exampleName = exampleName ] 35 | ifNone: [ self allExamples first ]) new 36 | ] 37 | 38 | { #category : #initialization } 39 | TBSExampleBrowser >> initialize [ 40 | super initialize. 41 | currentExample := self allExamples first new. 42 | ] 43 | 44 | { #category : #accessing } 45 | TBSExampleBrowser >> navigateToExample: example [ 46 | 47 | currentExample := example 48 | ] 49 | 50 | { #category : #rendering } 51 | TBSExampleBrowser >> renderContentOn: html [ 52 | 53 | html tbsRow 54 | "showGrid;" 55 | with: [ 56 | html tbsColumn: [ self renderNavigationOn: html ] mediumSize: 2. 57 | html tbsColumn: [ self renderExampleOn: html ] mediumSize: 10. 58 | ] 59 | ] 60 | 61 | { #category : #rendering } 62 | TBSExampleBrowser >> renderExampleOn: html [ 63 | 64 | currentExample ifNotNil: [ 65 | currentExample renderOn: html. 66 | html break;break. 67 | html heading: 'Smalltalk source code'; horizontalRule. 68 | html textArea style: 'width: 100%; height: 400px'; text: (currentExample class methodNamed: #renderExampleOn:) sourceCode. 69 | ]. 70 | 71 | ] 72 | 73 | { #category : #rendering } 74 | TBSExampleBrowser >> renderNavigationOn: html [ 75 | 76 | |examples item| 77 | examples := self allExamples. 78 | html form: [ 79 | html tbsListGroup: [ 80 | examples do: [:ex | 81 | item := html tbsLinkifyListGroupItem. 82 | currentExample class = ex ifTrue: [ item beActive ]. 83 | item callback: [ self navigateToExample: ex new ]; 84 | with: ex exampleName ]] ] 85 | ] 86 | 87 | { #category : #updating } 88 | TBSExampleBrowser >> updateUrl: url [ 89 | super updateUrl: url. 90 | url addToPath: '/browser'; addToPath: currentExample class exampleName 91 | ] 92 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSExampleInformsConfirms.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap information and confirmation messages example 3 | " 4 | Class { 5 | #name : #TBSExampleInformsConfirms, 6 | #superclass : #TBSBootstrapExample, 7 | #instVars : [ 8 | 'informMessage', 9 | 'confirmMessage', 10 | 'yourAnswer' 11 | ], 12 | #category : 'Bootstrap-Examples-Core' 13 | } 14 | 15 | { #category : #accessing } 16 | TBSExampleInformsConfirms class >> exampleName [ 17 | 18 | ^'Alerts and Confirmations' 19 | ] 20 | 21 | { #category : #accessing } 22 | TBSExampleInformsConfirms class >> label [ 23 | ^ [ :html | html text: 'Bootstrap versions of Seaside''s '; code: 'WAComponent>>#inform'; text: ', '; code: 'WAComponent>>#confirm' ] 24 | ] 25 | 26 | { #category : #accessing } 27 | TBSExampleInformsConfirms >> confirmMessage [ 28 | ^ confirmMessage ifNil: [ 'Does this colour suit me?' ] 29 | ] 30 | 31 | { #category : #accessing } 32 | TBSExampleInformsConfirms >> confirmMessage: anObject [ 33 | confirmMessage := anObject 34 | ] 35 | 36 | { #category : #accessing } 37 | TBSExampleInformsConfirms >> confirms [ 38 | ^ Array with: #confirmInfo -> 'btn-info' with: #confirmSuccess -> 'btn-success' with: #confirmWarning -> 'btn-warning' with: #confirmError -> 'btn-danger' 39 | 40 | ] 41 | 42 | { #category : #accessing } 43 | TBSExampleInformsConfirms >> informMessage [ 44 | ^ informMessage ifNil: [ informMessage := 'A really important message' ] 45 | ] 46 | 47 | { #category : #accessing } 48 | TBSExampleInformsConfirms >> informMessage: anObject [ 49 | informMessage := anObject 50 | ] 51 | 52 | { #category : #accessing } 53 | TBSExampleInformsConfirms >> informs [ 54 | ^ Array with: #informInfo -> 'btn-info' with: #informSuccess -> 'btn-success' with: #informWarning -> 'btn-warning' with: #informError -> 'btn-danger' 55 | 56 | ] 57 | 58 | { #category : #rendering } 59 | TBSExampleInformsConfirms >> renderExampleOn: html [ 60 | html form: [ 61 | html label: [ 62 | html text: 'Inform Message: '. 63 | html textInput 64 | on: #informMessage of: self ]. 65 | 66 | html div: [ 67 | self informs do: [ :each | 68 | html button 69 | class: 'btn'; 70 | class: each value; 71 | callback: [ 72 | yourAnswer := nil. 73 | self perform: each key asMutator with: [ :r | r strong: 'Message: '; text: self informMessage ] ]; 74 | with: each key ] 75 | separatedBy: [ html space ] ]. 76 | 77 | html break. 78 | html label: [ 79 | html text: 'Confirm Message: '. 80 | html textInput 81 | on: #confirmMessage of: self ]. 82 | 83 | html div: [ 84 | self confirms do: [ :each | 85 | html button 86 | class: 'btn'; 87 | class: each value; 88 | callback: [ yourAnswer := (self perform: each key asMutator with: [ :r | r strong: 'Message: '; text: self confirmMessage ]) ]; 89 | with: each key ] 90 | separatedBy: [ html space ] ]. 91 | yourAnswer ifNotNil: [ 92 | html div: [ 93 | yourAnswer ifTrue: [ html text: 'Your answer was yes' ] 94 | ifFalse: [ html text: 'Your answer was no' ] ] ]. 95 | 96 | html div 97 | class: 'form-actions'; 98 | with: [ 99 | html button 100 | class: 'btn'; 101 | callback: [ self answer ]; 102 | with: 'Return' ] ] 103 | ] 104 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSExamplesHome.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for Bootstrap 3 | " 4 | Class { 5 | #name : #TBSExamplesHome, 6 | #superclass : #WAComponent, 7 | #instVars : [ 8 | 'displayIntro', 9 | 'browser', 10 | 'currentExample' 11 | ], 12 | #category : 'Bootstrap-Examples-Browser' 13 | } 14 | 15 | { #category : #initialization } 16 | TBSExamplesHome class >> initialize [ 17 | 18 | self register 19 | ] 20 | 21 | { #category : #registration } 22 | TBSExamplesHome class >> register [ 23 | 24 | |app| 25 | app := WAAdmin register: self asApplicationAt: 'bootstrap'. 26 | app 27 | addLibrary: JQDeploymentLibrary; 28 | addLibrary: TBSDevelopmentLibrary; 29 | addLibrary: TBSExamplesLibrary; 30 | addLibrary: TBSJasnyDeploymentLibrary; 31 | addLibrary: TBSVerticalTabsDeploymentLibrary 32 | ] 33 | 34 | { #category : #actions } 35 | TBSExamplesHome >> browseExamples [ 36 | displayIntro := false. 37 | 38 | ] 39 | 40 | { #category : #accessing } 41 | TBSExamplesHome >> children [ 42 | ^self isDisplayingIntro 43 | ifTrue: [ #() ] 44 | ifFalse: [ Array with: browser ] 45 | ] 46 | 47 | { #category : #actions } 48 | TBSExamplesHome >> initialRequest: request [ 49 | super initialRequest: request. 50 | browser initialRequest: request. 51 | displayIntro := (request url path includes: 'browser') not. 52 | ] 53 | 54 | { #category : #initialization } 55 | TBSExamplesHome >> initialize [ 56 | super initialize. 57 | displayIntro := true. 58 | browser := TBSExampleBrowser new 59 | ] 60 | 61 | { #category : #testing } 62 | TBSExamplesHome >> isDisplayingIntro [ 63 | 64 | ^displayIntro 65 | ] 66 | 67 | { #category : #testing } 68 | TBSExamplesHome >> noExampleSelected [ 69 | 70 | ^currentExample isNil 71 | ] 72 | 73 | { #category : #rendering } 74 | TBSExamplesHome >> renderContentOn: html [ 75 | 76 | self renderNavigationbarOn: html. 77 | self isDisplayingIntro 78 | ifTrue: [ self renderIntroOn: html ] 79 | ifFalse: [ browser renderOn: html ] 80 | 81 | ] 82 | 83 | { #category : #'rendering components' } 84 | TBSExamplesHome >> renderIntroOn: html [ 85 | html tbsContainer: [ 86 | html tbsJumbotron: [ 87 | html heading: 'Bootstrap for Seaside'. 88 | html image url: TBSExamplesLibrary / #logoPng. 89 | html break; break. 90 | html paragraph: [ 91 | html text: 'Combine the sleek, intuitive, and powerful '. 92 | html anchor url: 'http://getbootstrap.com'; with: 'mobile first front-end framework'. 93 | html text: ' together with the most '. 94 | html anchor url: 'http://www.seaside.st'; with: 'productive web framework'. 95 | html text: ' and the hottest '. 96 | html anchor url: 'http://www.pharo.org'; with: 'innovative open source development platform'. 97 | html text: ' for faster and easier web application development '. 98 | html text: ' using the latest version of '. 99 | html anchor url: 'http://smalltalkhub.com/#!/~TorstenBergmann/Bootstrap'; with: 'Bootstrap for Seaside'. ]. 100 | html paragraph: [ 101 | html form: [ 102 | html tbsButton 103 | bePrimary; 104 | beLarge; 105 | callback: [ self browseExamples ]; 106 | with: 'Browse Examples' ]]. 107 | 108 | 109 | ]] 110 | ] 111 | 112 | { #category : #'rendering components' } 113 | TBSExamplesHome >> renderNavigationbarOn: html [ 114 | 115 | html tbsNavbar beDefault; with: [ 116 | 117 | html tbsContainer: [ 118 | html tbsNavbarHeader: [ 119 | html image tbsPullLeft; style: 'padding: 10px;';url: TBSExamplesLibrary / #logosmallPng. 120 | html tbsNavbarBrand 121 | url: 'http://smalltalkhub.com/#!/~TorstenBergmann/Bootstrap'; 122 | with: 'Bootstrap for Seaside'. 123 | ]. 124 | html form: [ 125 | html tbsNavbarButton 126 | tbsPullRight; 127 | callback: [ self returnToIntro ]; 128 | with: 'Home' ]] ] 129 | 130 | ] 131 | 132 | { #category : #actions } 133 | TBSExamplesHome >> returnToIntro [ 134 | 135 | displayIntro := true. 136 | 137 | ] 138 | 139 | { #category : #updating } 140 | TBSExamplesHome >> updateRoot: htmlRoot [ 141 | 142 | htmlRoot title: 'Bootstrap for Seaside' 143 | ] 144 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSFormsExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap forms example 3 | " 4 | Class { 5 | #name : #TBSFormsExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSFormsExample class >> exampleName [ 12 | 13 | ^'Forms' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSFormsExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Basic example'. 20 | 21 | html tbsFormGroup: [ 22 | html label for: 'exampleInputEmail1'; with: 'Email address'. 23 | html textInput tbsFormControl; id: 'exampleInputEmail1'; placeholder: 'Enter email']. 24 | 25 | html tbsFormGroup: [ 26 | html label for: 'exampleInputPassword1'; with: 'Password'. 27 | html passwordInput tbsFormControl id: 'exampleInputPassword1'; placeholder: 'Password' ]. 28 | 29 | html heading level: 2; with: 'Inline form'. 30 | 31 | html tbsForm beInline; with: [ 32 | html tbsFormGroup: [ 33 | html label for: 'exampleInputEmail1'; class: 'sr-only'; with: 'Email address'. 34 | html textInput tbsFormControl; id: 'exampleInputEmail1'; placeholder: 'Enter email'. 35 | html space]. 36 | 37 | html tbsFormGroup: [ 38 | html label for: 'exampleInputPassword2'; class: 'sr-only'; with: 'Password'. 39 | html passwordInput tbsFormControl id: 'exampleInputPassword2'; placeholder: 'Password'. 40 | html space]. 41 | 42 | html div class: 'checkbox'; with: [html label: [html checkbox. html text: ' Remember me' ]]. 43 | ]. 44 | 45 | 46 | ] 47 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSGlyphIconsExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the glyph icons 3 | " 4 | Class { 5 | #name : #TBSGlyphIconsExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSGlyphIconsExample class >> exampleName [ 12 | 13 | ^'Glyphicons' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSGlyphIconsExample >> renderExampleOn: html [ 18 | html text: 'Use #tbsGlyphIcon and then the icon that is required'. 19 | 20 | (((TBSGlyphTag methodDict 21 | collect: [:each | each selector ]) 22 | select: [:each | each greaseString beginsWith: 'icon' ]) asArray 23 | sort: [:e1 :e2 | e1 greaseString < e2 greaseString ]) 24 | do: [:selector | 25 | html break. 26 | html tbsGlyphIcon perform: selector. 27 | html space;space;space. 28 | html text: selector greaseString ] 29 | ] 30 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSGridSystemExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap grid system 3 | " 4 | Class { 5 | #name : #TBSGridSystemExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSGridSystemExample class >> exampleName [ 12 | 13 | ^'Grid system' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSGridSystemExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Example: Stacked-to-horizontal'. 20 | html tbsRow showGrid; 21 | with: [ 12 timesRepeat: [ html tbsColumn: '.col-md-1' mediumSize: 1]]. 22 | 23 | html break. 24 | html tbsRow showGrid; 25 | with: [ html tbsColumn: '.col-md-8' mediumSize: 8. 26 | html tbsColumn: '.col-md-4' mediumSize: 4. ]. 27 | 28 | html break. 29 | html tbsRow showGrid; 30 | with: [ html tbsColumn: '.col-md-4' mediumSize: 4. 31 | html tbsColumn: '.col-md-4' mediumSize: 4. 32 | html tbsColumn: '.col-md-4' mediumSize: 4. ]. 33 | 34 | html break. 35 | html tbsRow showGrid; 36 | with: [ html tbsColumn: '.col-md-6' mediumSize: 6. 37 | html tbsColumn: '.col-md-6' mediumSize: 6. ]. 38 | 39 | html heading level: 2; with: 'Example: Mobile and desktop'. 40 | html tbsRow showGrid; 41 | with: [ html tbsColumn 42 | extraSmallSize: 12; 43 | mediumSize: 8; 44 | with: '.col-xs-12 .col-md-8'. 45 | html tbsColumn 46 | extraSmallSize: 6; 47 | mediumSize: 4; 48 | with: '.col-xs-6 .col-md-4' ]. 49 | 50 | html break. 51 | html tbsRow showGrid; 52 | with: [ 3 timesRepeat: [html tbsColumn 53 | extraSmallSize: 6; 54 | mediumSize: 4; 55 | with: '.col-xs-6 .col-md-4']]. 56 | 57 | html break. 58 | html tbsRow showGrid; 59 | with: [ 2 timesRepeat: [html tbsColumn 60 | extraSmallSize: 6; 61 | with: '.col-xs-6' ] ]. 62 | 63 | html heading level: 2; with: 'Example: Mobile, tablet, desktops'. 64 | 65 | html tbsRow showGrid; 66 | with: [ html tbsColumn 67 | extraSmallSize: 12; 68 | smallSize: 6; 69 | mediumSize: 8; 70 | with: '.col-xs-12 .col-sm-6 .col-md-8'. 71 | html tbsColumn 72 | extraSmallSize: 6; 73 | smallSize: 6; 74 | mediumSize: 4; 75 | with: '.col-xs-6 .col-sm-6 .col-md-4' ]. 76 | 77 | html break. 78 | html tbsRow showGrid; 79 | with: [ 3 timesRepeat: [html tbsColumn 80 | extraSmallSize: 6; 81 | smallSize: 4; 82 | mediumSize: 4; 83 | with: '.col-xs-6 .col-sm-4 .col-md-4']]. 84 | 85 | html heading level: 2; with: 'Offsetting columns'. 86 | html tbsRow showGrid; 87 | with: [ html tbsColumn: '.col-md-4' mediumSize: 4. 88 | html tbsColumn 89 | mediumSize: 4; 90 | mediumOffset: 4; 91 | with: '.col-md-4 .col-md-offset-4' ]. 92 | 93 | html break. 94 | html tbsRow showGrid; 95 | with: [ 2 timesRepeat: [ 96 | html tbsColumn 97 | mediumSize: 3; 98 | mediumOffset: 3; 99 | with: '.col-md-3 .col-md-offset-3']]. 100 | 101 | html break. 102 | html tbsRow showGrid; 103 | with: [ html tbsColumn 104 | mediumSize: 6; 105 | mediumOffset: 3; 106 | with: '.col-md-6 .col-md-offset-3']. 107 | 108 | html heading level: 2; with: 'Column ordering'. 109 | html text: 'Easily change the order of our built-in grid columns with #push: and #pull:'. 110 | html tbsRow showGrid; 111 | with: [ html tbsColumn 112 | mediumSize: 9; 113 | mediumPush: 3; 114 | with: '.col-md-9 .col-md-push-3'. 115 | html tbsColumn 116 | mediumSize: 3; 117 | mediumPull: 9; 118 | with: '.col-md-3 .col-md-pull-9']. 119 | 120 | 121 | 122 | ] 123 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSHelperClassesExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap helper classes 3 | " 4 | Class { 5 | #name : #TBSHelperClassesExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSHelperClassesExample class >> exampleName [ 12 | 13 | ^'Helper classes' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSHelperClassesExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Close icon'. 20 | 21 | html text: 'Use the generic close icon for dismissing content like modals and alerts. You will find it on the right side'. 22 | html tbsCloseIcon with: 'x'. 23 | 24 | html heading level: 2; with: 'Screen reader only'. 25 | 26 | html text: 'Hide an element to all users except screen readers.'. 27 | html paragraph 28 | tbsScreenReaderOnly; 29 | with: 'hi' 30 | ] 31 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSImageExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap image support 3 | " 4 | Class { 5 | #name : #TBSImageExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSImageExample class >> exampleName [ 12 | 13 | ^'Images' 14 | ] 15 | 16 | { #category : #private } 17 | TBSImageExample >> dataImage140x140 [ 18 | 19 | ^'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIwAAACMCAYAAACuwEE+AAAErUlEQVR4Xu3YwStscRjG8d8QQnZEFkqyY6NE/n0rlOxkS1ZqrCiFe/udOtPcue6YJ889Gc93Vtz7eo/3eT/9zjl6/X7/V+FDAhMm0APMhElR1iQAGCBICQBGiotiwGBASgAwUlwUAwYDUgKAkeKiGDAYkBIAjBQXxYDBgJQAYKS4KAYMBqQEACPFRTFgMCAlABgpLooBgwEpAcBIcVEMGAxICQBGiotiwGBASgAwUlwUAwYDUgKAkeKiGDAYkBIAjBQXxYDBgJQAYKS4KAYMBqQEACPFRTFgMCAlABgpLooBgwEpAcBIcVEMGAxICQBGiotiwGBASgAwUlwUAwYDUgKAkeKiGDAYkBIAjBQXxYDBgJQAYKS4KAYMBqQEACPFRTFgMCAlABgpLooBgwEpAcBIcVEMGAxICQBGiotiwGBASgAwUlwUAwYDUgKAkeKiGDAYkBIAjBQXxYDBgJQAYKS4KAYMBqQEACPFRTFgMCAlABgpLooBgwEpgakH8/7+Xs7Ozsrz83M5OTkpi4uLfwRwd3dXbm5uyvr6etnf32/+r9/vl6urq1J/tn729vbKxsbGRMF1fb2JfqkOi6YazOvrazk9PS1vb2+l1+v9BaZd7tPT0wBM+zNLS0vl6OioXF5eNtjq13Nzc2Oj7/p6HTqY+FJTC2Z4eXXaj8BcX1+Xh4eHUmvX1taaE6Y9cba3t8vOzs7g+3rKzM/PNyfP8vJyA6j+/P39fXMCra6uDnC6rjfpqTbxNjsonGowFxcX5eDgYHBKDN+S2tvO1tZWub29/RRMC6ieOI+Pj+X4+Licn5+X9iSq6P7H9TrYsfUSUwumTeGjZ4r232ZmZsru7m5zarQnTHtqjJ4w7feT3naGn5m+cj3rNjto9iPBDN9K2tvMZ7ekFkzNvJ4y9YQaflAeB/Sr1+tgz7ZL/DgwCwsLzVtTfdAd/aysrJTNzc3mremjZ5j6TNHeyuoD8MvLy19vUKMn2levZ9tkR41+HJjR1+oWQHvCjHtLmp2dbbDVt67Dw8PmpKlfD79BffZarVzvs7eyjgxIl4kDM+7vMP96vhm+Nalgxl1P2tQ3KZ56MN8kx5hfAzAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gwKGE+OMV0AE7Nqz6CA8eQY0wUwMav2DAoYT44xXQATs2rPoIDx5BjTBTAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gwKGE+OMV0AE7Nqz6CA8eQY0wUwMav2DAoYT44xXQATs2rPoIDx5BjTBTAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gwKGE+OMV0AE7Nqz6CA8eQY0wUwMav2DAoYT44xXQATs2rPoIDx5BjTBTAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gwKGE+OMV0AE7Nqz6CA8eQY0wUwMav2DAoYT44xXQATs2rPoIDx5BjTBTAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gwKGE+OMV0AE7Nqz6CA8eQY0wUwMav2DAoYT44xXQATs2rPoIDx5BjTBTAxq/YMChhPjjFdABOzas+ggPHkGNMFMDGr9gz6G1HzSbXtC7t7AAAAAElFTkSuQmCC' 20 | ] 21 | 22 | { #category : #rendering } 23 | TBSImageExample >> renderExampleOn: html [ 24 | 25 | html tbsImage 26 | beRounded; 27 | url: self dataImage140x140. 28 | 29 | html tbsImage 30 | beCircle; 31 | url: self dataImage140x140. 32 | 33 | html tbsImage 34 | beThumbnail; 35 | url: self dataImage140x140. 36 | 37 | ] 38 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSInputGroupExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap input groups 3 | " 4 | Class { 5 | #name : #TBSInputGroupExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSInputGroupExample class >> exampleName [ 12 | 13 | ^'Input groups' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSInputGroupExample >> renderExampleOn: html [ 18 | 19 | |menu| 20 | menu := [ html tbsDropdownMenuItem: [ html anchor: 'Action' ]. 21 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 22 | html tbsDropdownMenuItem: [ html anchor: 'Something else here' ]. 23 | html tbsDivider. 24 | html tbsDropdownMenuItem: [ html anchor: 'Separated link' ]]. 25 | 26 | html heading level: 2; with: 'Basic example'. 27 | 28 | html tbsInputGroup: [ 29 | html tbsInputGroupAddOn: '@'. 30 | html textInput 31 | tbsFormControl; 32 | placeholder: 'Username' ]. 33 | 34 | html break. 35 | html tbsInputGroup: [ 36 | html textInput tbsFormControl. 37 | html tbsInputGroupAddOn: '.00']. 38 | 39 | html break. 40 | html tbsInputGroup: [ 41 | html tbsInputGroupAddOn: '$'. 42 | html textInput tbsFormControl. 43 | html tbsInputGroupAddOn: '.00']. 44 | 45 | html heading level: 2; with: 'Sizes'. 46 | 47 | html tbsInputGroup beLarge; with: [ 48 | html tbsInputGroupAddOn: '@'. 49 | html textInput tbsFormControl; placeholder: 'Username' ]. 50 | 51 | html break. 52 | html tbsInputGroup: [ 53 | html tbsInputGroupAddOn: '@'. 54 | html textInput tbsFormControl; placeholder: 'Username' ]. 55 | 56 | html break. 57 | html tbsInputGroup beSmall; with: [ 58 | html tbsInputGroupAddOn: '@'. 59 | html textInput tbsFormControl; placeholder: 'Username' ]. 60 | 61 | html heading level: 2; with: 'Checkboxes and radio addons'. 62 | 63 | html tbsInputGroup: [ 64 | html tbsInputGroupAddOn: [ html checkbox ]. 65 | html textInput tbsFormControl ]. 66 | 67 | html break. 68 | html tbsInputGroup: [ 69 | html tbsInputGroupAddOn: [ html radioButton ]. 70 | html textInput tbsFormControl ]. 71 | 72 | html heading level: 2; with: 'Button addons'. 73 | html tbsInputGroup: [ 74 | html tbsInputGroupButton: [ html tbsDropdownButton beDefault; with: [html text: 'Default '; tbsCaret]. html tbsDropdownMenu: menu]. 75 | html textInput tbsFormControl ]. 76 | 77 | html break. 78 | html tbsInputGroup: [ 79 | html textInput tbsFormControl. 80 | html tbsInputGroupButton: [ html tbsDropdownButton beDefault; with: [html text: 'Default '; tbsCaret]. html tbsDropdownMenu tbsPullRight; with: menu]]. 81 | 82 | ] 83 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSJasnyButtonLabelsExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Labeled buttons from Jasni 3 | " 4 | Class { 5 | #name : #TBSJasnyButtonLabelsExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Jasny' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSJasnyButtonLabelsExample class >> exampleName [ 12 | 13 | ^'Jasny Button Label' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSJasnyButtonLabelsExample >> renderExampleOn: html [ 18 | "Standard button with label" 19 | html tbsButton beLabeled; beDefault; with: [ 20 | html tbsButtonLabel: [ html tbsGlyphIcon iconArrowLeft ]. 21 | html text: 'Left' 22 | ]. 23 | 24 | html space. 25 | 26 | "Standard button with label on the right side" 27 | html tbsButton beLabeled; beDefault; with: [ 28 | html text: 'Right'. 29 | html tbsButtonLabelRight: [ html tbsGlyphIcon iconArrowRight ]. 30 | ]. 31 | 32 | html space. 33 | 34 | "Success button with label" 35 | html tbsButton beLabeled; beSuccess; with: [ 36 | html tbsButtonLabel: [ html tbsGlyphIcon iconOk ]. 37 | html text: 'Success' 38 | ]. 39 | 40 | html space. 41 | 42 | "Danger button with label" 43 | html tbsButton beLabeled; beDanger; with: [ 44 | html tbsButtonLabel: [ html tbsGlyphIcon iconRemove ]. 45 | html text: 'Danger' 46 | ]. 47 | 48 | 49 | ] 50 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSJasnyInputMaskExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Example for an input mask 3 | " 4 | Class { 5 | #name : #TBSJasnyInputMaskExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Jasny' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSJasnyInputMaskExample class >> exampleName [ 12 | 13 | ^'Jasny - Input Mask' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSJasnyInputMaskExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Input mask'. 20 | html textInput 21 | tbsFormControl; 22 | attributeAt: 'data-mask' put: '999-99-999-9999-9'; 23 | placeholder: 'ISBN'. 24 | 25 | ] 26 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSJasnyNavmenuExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for Jasni navmenu 3 | " 4 | Class { 5 | #name : #TBSJasnyNavmenuExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Jasny' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSJasnyNavmenuExample class >> exampleName [ 12 | 13 | ^'Jasny - Navmenu' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSJasnyNavmenuExample >> renderExampleOn: html [ 18 | html text: 'Navmenu is a vertical navigation component. By default it shares it look and feel with the navmenu component.'. 19 | html heading level: 2; with: 'Default navmenu'. 20 | 21 | html tbsNavmenu beDefault; with: [ 22 | html tbsNavmenuBrand: 'Brand'. 23 | html tbsNav beNavmenuNavigation; with: [ 24 | html tbsNavItem beActive; with: [ html anchor: 'Link' ]. 25 | html tbsNavItem: [ html anchor: 'Link' ]. 26 | html tbsNavItem tbsDropdown with: [ 27 | html tbsDropdownAnchor with: [html text: 'Dropdown '; tbsCaret]. 28 | html tbsDropdownMenu: [ 29 | html tbsDropdownMenuItem: [ html anchor: 'Action' ]. 30 | html tbsDropdownMenuItem: [ html anchor: 'Another Action' ]. 31 | html tbsDropdownMenuItem: [ html anchor: 'Something else here' ]. 32 | html tbsDivider. 33 | html tbsDropdownMenuItem: [ html anchor: 'Separated link' ] ]]]]. 34 | 35 | 36 | ] 37 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSJumbotronExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap jumbotron 3 | " 4 | Class { 5 | #name : #TBSJumbotronExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSJumbotronExample class >> exampleName [ 12 | 13 | ^'Jumbotron' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSJumbotronExample >> renderExampleOn: html [ 18 | 19 | 20 | html tbsJumbotron: [ 21 | html heading: 'Hello, world!'. 22 | html paragraph: 'This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.'. 23 | html paragraph: [ 24 | html tbsButton 25 | bePrimary; 26 | beLarge; 27 | with: 'Learn more' ]] 28 | 29 | ] 30 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSLabelExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap labels 3 | " 4 | Class { 5 | #name : #TBSLabelExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSLabelExample class >> exampleName [ 12 | 13 | ^'Labels' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSLabelExample >> renderExampleOn: html [ 18 | 19 | html heading level:2; with: 'Example'. 20 | 1 to: 6 do: [:each | html heading 21 | level: each; 22 | with: [ html text: 'Example heading '. 23 | html tbsLabel beDefault with: 'New' ]]. 24 | 25 | 26 | html heading level: 2; with: 'Available variations'. 27 | html tbsLabel beDefault; with: 'Default'. html space. 28 | html tbsLabel bePrimary; with: 'Primary'. html space. 29 | html tbsLabel beSuccess; with: 'Success'. html space. 30 | html tbsLabel beInfo; with: 'Info'. html space. 31 | html tbsLabel beWarning; with: 'Warning'. html space. 32 | html tbsLabel beDanger; with: 'Danger'. 33 | ] 34 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSListGroupExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap list group example 3 | " 4 | Class { 5 | #name : #TBSListGroupExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSListGroupExample class >> exampleName [ 12 | 13 | ^'List group' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSListGroupExample >> renderExampleOn: html [ 18 | 19 | | customContent | 20 | html heading level: 2; with: 'Basic example'. 21 | 22 | html tbsListGroup: [ 23 | html 24 | tbsListGroupItem: 'Cras justo odio'; 25 | tbsListGroupItem: 'Dapibus ac facilisis in'; 26 | tbsListGroupItem: 'Morbi leo risus'; 27 | tbsListGroupItem: 'Porta ac consectetur ac'; 28 | tbsListGroupItem: 'Vestibulum at eros' ]. 29 | 30 | html heading level: 2; with: 'Badges'. 31 | html tbsListGroup: [ 32 | html 33 | tbsListGroupItem: [html tbsBadge: '14'. html text: 'Cras justo odio']; 34 | tbsListGroupItem: [html tbsBadge: '2'. html text: 'Dapibus ac facilisis in']; 35 | tbsListGroupItem: [html tbsBadge: '1'. html text: 'Morbi leo risus']]. 36 | 37 | html heading level: 2; with: 'Linked Items'. 38 | html tbsListGroup: [ 39 | html tbsLinkifyListGroupItem beActive; with: 'Dapibus ac facilisis in'. 40 | html tbsLinkifyListGroupItem: 'Morbi leo risus'. 41 | html tbsLinkifyListGroupItem: 'Porta ac consectetur ac'. 42 | html tbsLinkifyListGroupItem: 'Vestibulum at eros' ]. 43 | 44 | html heading level: 2; with: 'Custom content'. 45 | customContent := [ html tbsListGroupItemHeading level: 4; with: 'List group item heading'. 46 | html tbsListGroupItemText: 'Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.' ]. 47 | 48 | html tbsListGroup: [ 49 | html tbsLinkifyListGroupItem beActive; with: customContent. 50 | html tbsLinkifyListGroupItem: customContent. 51 | html tbsLinkifyListGroupItem: customContent. 52 | ] 53 | 54 | ] 55 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSModalExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap modal example 3 | " 4 | Class { 5 | #name : #TBSModalExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSModalExample class >> exampleName [ 12 | 13 | ^'Modal example' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSModalExample >> renderExample2On: html [ 18 | 19 | html tbsModal: [ 20 | html tbsModalDialog: [ 21 | html tbsModalContent: [ 22 | html tbsModalHeader: [ ] 23 | ] 24 | ] 25 | ]. 26 | 27 | 28 | html html: ' 29 | Launch demo modal 30 | 31 | 32 | '. 49 | 50 | ] 51 | 52 | { #category : #rendering } 53 | TBSModalExample >> renderExampleOn: html [ 54 | 55 | html html: 'Launch demo modal'. 56 | 57 | html tbsModal id: 'myModal'; with: [ 58 | html tbsModalDialog: [ 59 | html tbsModalContent: [ 60 | html tbsModalHeader: [ 61 | html tbsModalCloseIcon. 62 | html tbsModalTitle level: 4; with: 'Modal title 2' 63 | ]. 64 | html tbsModalBody: [ ] . 65 | html tbsModalFooter: [ 66 | html tbsButton: 'Close'. 67 | html tbsButton bePrimary; with: 'Save changes' 68 | ] 69 | ] 70 | ] 71 | ]. 72 | 73 | 74 | 75 | ] 76 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSNavExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap navs 3 | " 4 | Class { 5 | #name : #TBSNavExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSNavExample class >> exampleName [ 12 | ^'Navs' 13 | ] 14 | 15 | { #category : #rendering } 16 | TBSNavExample >> renderExampleOn: html [ 17 | 18 | html heading level: 2; with: 'List'. 19 | html tbsNav: [ 20 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 21 | html tbsNavItem: [ html anchor: 'Profile' ]. 22 | html tbsNavItem: [ html anchor: 'Message' ]]. 23 | 24 | html heading level: 2; with: 'Tabs'. 25 | html tbsNav beTabs; with: [ 26 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 27 | html tbsNavItem: [ html anchor: 'Profile' ]. 28 | html tbsNavItem: [ html anchor: 'Message' ]]. 29 | 30 | html heading level: 2; with: 'Pills'. 31 | html tbsNav bePills; with: [ 32 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 33 | html tbsNavItem: [ html anchor: 'Profile' ]. 34 | html tbsNavItem: [ html anchor: 'Message' ]]. 35 | 36 | html heading level: 2; with: 'Stacked Pills'. 37 | html tbsNav bePills; beStacked; with: [ 38 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 39 | html tbsNavItem: [ html anchor: 'Profile' ]. 40 | html tbsNavItem: [ html anchor: 'Message' ]]. 41 | 42 | html heading level: 2; with: 'Disabled'. 43 | html tbsNav beTabs; with: [ 44 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 45 | html tbsNavItem: [ html anchor: 'Profile' ]. 46 | html tbsNavItem beDisabled; with: [ html anchor: 'Message' ]]. 47 | ] 48 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSNavbarExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap navbars 3 | " 4 | Class { 5 | #name : #TBSNavbarExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSNavbarExample class >> exampleName [ 12 | 13 | ^'Navbar' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSNavbarExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Default navbar'. 20 | 21 | html tbsNavbar beDefault with: [ 22 | html tbsNavbarBrand 23 | url: 'http://getbootstrap.com'; 24 | with: 'Bootstrap'. 25 | html tbsNavbarButton: 'SignIn']. 26 | 27 | html heading level: 2; with: 'Non-nav links'. 28 | html tbsNavbar beDefault with: [ 29 | html tbsNavbarHeader: [ html tbsNavbarBrand: 'Brand' ]. 30 | html tbsNavbarText tbsPullRight 31 | with: [ html text: 'Signed in as '. 32 | html tbsNavbarLink: 'Mark Otto' ]] 33 | 34 | ] 35 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSOfferExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An example for an offer built using Bootstrap 3 | " 4 | Class { 5 | #name : #TBSOfferExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Widgets-Canvas' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSOfferExample class >> exampleName [ 12 | ^ 'Offer' 13 | ] 14 | 15 | { #category : #rendering } 16 | TBSOfferExample >> renderExampleOn: html [ 17 | 18 | html tbsContainer: [ 19 | html tbsRow: [ 20 | 21 | "Default" 22 | html tbsColumn extraSmallSize: 3; with: [ 23 | html tbsOffer beDefault with: [ 24 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 25 | html tbsOfferContent: [ 26 | html heading level: 3; with: 'A default offer'. 27 | html paragraph: 'And a little description']]]. 28 | 29 | "Success" 30 | html tbsColumn extraSmallSize: 3; with: [ 31 | html tbsOffer beSuccess with: [ 32 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 33 | html tbsOfferContent: [ 34 | html heading level: 3; with: 'A success offer'. 35 | html paragraph: 'And a little description']]]. 36 | 37 | "Primary rounded" 38 | html tbsColumn extraSmallSize: 3; with: [ 39 | html tbsOffer bePrimary; beRounded; with: [ 40 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 41 | html tbsOfferContent: [ 42 | html heading level: 3; with: 'A primary-rounded offer'. 43 | html paragraph: 'And a little description']]]. 44 | 45 | "Info" 46 | html tbsColumn extraSmallSize: 3; with: [ 47 | html tbsOffer beInfo; with: [ 48 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 49 | html tbsOfferContent: [ 50 | html heading level: 3; with: 'An info offer'. 51 | html paragraph: 'And a little description']]]. 52 | 53 | "Warning" 54 | html tbsColumn extraSmallSize: 3; with: [ 55 | html tbsOffer beWarning; with: [ 56 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 57 | html tbsOfferContent: [ 58 | html heading level: 3; with: 'An warning offer'. 59 | html paragraph: 'And a little description']]]. 60 | 61 | "Danger rounded" 62 | html tbsColumn extraSmallSize: 3; with: [ 63 | html tbsOffer beDanger; beRounded; with: [ 64 | html tbsOfferShape: [ html tbsOfferShapeText: 'top' ]. 65 | html tbsOfferContent: [ 66 | html heading level: 3; with: 'A dangerrous rounded offer'. 67 | html paragraph: 'And a little description']]]. 68 | ] 69 | ] 70 | ] 71 | 72 | { #category : #styling } 73 | TBSOfferExample >> style [ 74 | 75 | ^' 76 | .offer-shape{ 77 | border-style: solid; 78 | border-width: 0 70px 40px 0; float:right; height: 0px; width: 0px; 79 | -ms-transform:rotate(360deg); /* IE 9 */ 80 | -o-transform: rotate(360deg); /* Opera 10.5 */ 81 | -webkit-transform:rotate(360deg); /* Safari and Chrome */ 82 | transform:rotate(360deg); 83 | } 84 | .offer { 85 | background:#fff; 86 | border:1px solid #ddd; 87 | box-shadow: 0 10px 20px rgba(0, 0, 0, 0.2); 88 | margin: 15px 0; 89 | overflow:hidden; 90 | } 91 | 92 | .offer-rounded { 93 | border-radius:7px; 94 | } 95 | 96 | .offer-danger { border-color: #d9534f; } 97 | .offer-danger .offer-shape{ 98 | border-color: transparent #d9534f transparent transparent; 99 | border-color: rgba(255,255,255,0) #d9534f rgba(255,255,255,0) rgba(255,255,255,0); 100 | } 101 | 102 | .offer-success { 103 | border-color: #5cb85c; } 104 | .offer-success .offer-shape{ 105 | border-color: transparent #5cb85c transparent transparent; 106 | border-color: rgba(255,255,255,0) #5cb85c rgba(255,255,255,0) rgba(255,255,255,0); 107 | } 108 | 109 | .offer-default { border-color: #999999; } 110 | .offer-default .offer-shape{ 111 | border-color: transparent #999999 transparent transparent; 112 | border-color: rgba(255,255,255,0) #999999 rgba(255,255,255,0) rgba(255,255,255,0); 113 | } 114 | 115 | .offer-primary { border-color: #428bca; } 116 | .offer-primary .offer-shape{ 117 | border-color: transparent #428bca transparent transparent; 118 | border-color: rgba(255,255,255,0) #428bca rgba(255,255,255,0) rgba(255,255,255,0); 119 | } 120 | 121 | .offer-info { border-color: #5bc0de; } 122 | .offer-info .offer-shape{ 123 | border-color: transparent #5bc0de transparent transparent; 124 | border-color: rgba(255,255,255,0) #5bc0de rgba(255,255,255,0) rgba(255,255,255,0); 125 | } 126 | 127 | .offer-warning { border-color: #f0ad4e; } 128 | .offer-warning .offer-shape{ 129 | border-color: transparent #f0ad4e transparent transparent; 130 | border-color: rgba(255,255,255,0) #f0ad4e rgba(255,255,255,0) rgba(255,255,255,0); 131 | } 132 | 133 | .offer-shape-text{ 134 | color:#fff; 135 | font-size:12px; 136 | font-weight:bold; 137 | position:relative; 138 | right:-40px; 139 | top:2px; 140 | white-space: nowrap; 141 | -ms-transform:rotate(30deg); /* IE 9 */ 142 | -o-transform: rotate(360deg); /* Opera 10.5 */ 143 | -webkit-transform:rotate(30deg); /* Safari and Chrome */ 144 | transform:rotate(30deg); 145 | } 146 | 147 | .offer-content{ 148 | padding:0 20px 10px; 149 | } 150 | 151 | 152 | ' 153 | ] 154 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSPageHeaderExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap page headers 3 | " 4 | Class { 5 | #name : #TBSPageHeaderExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSPageHeaderExample class >> exampleName [ 12 | 13 | ^'Page header' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSPageHeaderExample >> renderExampleOn: html [ 18 | 19 | html tbsPageHeader: [ 20 | html heading: [ 21 | html text: 'Example page header'. 22 | html space. 23 | html small: 'Subtext for header' ]] 24 | 25 | ] 26 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSPaginationExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap pagination 3 | " 4 | Class { 5 | #name : #TBSPaginationExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSPaginationExample class >> exampleName [ 12 | 13 | ^'Pagination' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSPaginationExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Default pagination'. 20 | html tbsPagination: [ 21 | html tbsPaginationItem: [ html anchor with: [html tbsSingleLeftAngleQuote ]]. 22 | 1 to: 5 do: [:each | html tbsPaginationItem: [ html anchor: each ] ]. 23 | html tbsPaginationItem: [ html anchor with: [html tbsSingleRightAngleQuote ]]]. 24 | 25 | 26 | html heading level: 2; with: 'Disabled and active states'. 27 | html tbsPagination: [ 28 | html tbsPaginationItem beDisabled; with: [ html anchor with: [html tbsDoubleLeftAngleQuote ]]. 29 | html tbsPaginationItem beActive with: [ html anchor: '1' ]. 30 | 2 to: 5 do: [:each | html tbsPaginationItem: [ html anchor: each greaseString ] ]. 31 | html tbsPaginationItem: [ html anchor with: [html tbsDoubleRightAngleQuote ]]]. 32 | ] 33 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSPanelExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap panels 3 | " 4 | Class { 5 | #name : #TBSPanelExample, 6 | #superclass : #TBSBootstrapExample, 7 | #instVars : [ 8 | 'data', 9 | 'headerBlock', 10 | 'tableBlock' 11 | ], 12 | #category : 'Bootstrap-Examples-Core' 13 | } 14 | 15 | { #category : #accessing } 16 | TBSPanelExample class >> exampleName [ 17 | 18 | ^'Panel' 19 | ] 20 | 21 | { #category : #rendering } 22 | TBSPanelExample >> renderExampleOn: html [ 23 | 24 | html heading level: 2; with: 'Basic example'. 25 | 26 | html tbsPanel beDefault 27 | with: [ html tbsPanelBody: 'Basic panel example']. 28 | 29 | 30 | html heading level: 2; with: 'Panel with heading'. 31 | 32 | html tbsPanel beDefault 33 | with: [ html tbsPanelHeading: 'Panel heading without title'. 34 | html tbsPanelBody: 'Panel content']. 35 | 36 | html tbsPanel beDefault 37 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title' ]. 38 | html tbsPanelBody: 'Panel content']. 39 | 40 | html heading level: 3; with: 'Panel with footer'. 41 | html tbsPanel beDefault 42 | with: [ html tbsPanelBody: 'Panel content'. 43 | html tbsPanelFooter: 'Panel footer']. 44 | 45 | html heading level: 2; with: 'Contextual alternatives'. 46 | 47 | html tbsPanel bePrimary 48 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title - Primary' ]. 49 | html tbsPanelBody: 'Panel content']. 50 | 51 | html tbsPanel beSuccess 52 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title - Success' ]. 53 | html tbsPanelBody: 'Panel content']. 54 | 55 | html tbsPanel beInfo 56 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title - Info' ]. 57 | html tbsPanelBody: 'Panel content']. 58 | 59 | html tbsPanel beWarning 60 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title - Warning' ]. 61 | html tbsPanelBody: 'Panel content']. 62 | 63 | html tbsPanel beDanger 64 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title - Danger' ]. 65 | html tbsPanelBody: 'Panel content']. 66 | 67 | 68 | 69 | data := #(('1' 'Mark' 'Otto' '@mdo') ('2' 'Jacob' 'Thornton' '@fat') ('3' 'Larry' 'the Bird' '@twitter')). 70 | 71 | headerBlock := [ 72 | html tableHeading: '#'. 73 | html tableHeading: 'First Name'. 74 | html tableHeading: 'Last Name'. 75 | html tableHeading: 'Username' ]. 76 | 77 | tableBlock := [ 78 | html tableHead: (headerBlock). 79 | html tableBody: [ 80 | data do: [:row | html tableRow: [ row do: [:col | html tableData: col ]]]]]. 81 | 82 | html heading level: 2; with: 'With tables'. 83 | html tbsPanel beDefault 84 | with: [ html tbsPanelHeading: [ html tbsPanelTitle level: 3; with: 'Panel title' ]. 85 | html tbsPanelBody: [ html paragraph: 'Some default panel content here. Nulla vitae elit libero, a pharetra augue. Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit.' ]. 86 | html tbsTable: tableBlock ]. 87 | 88 | 89 | 90 | ] 91 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSProgressBarExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap progress bar 3 | " 4 | Class { 5 | #name : #TBSProgressBarExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSProgressBarExample class >> exampleName [ 12 | 13 | ^'Progress bar' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSProgressBarExample >> renderExampleOn: html [ 18 | 19 | html tbsProgress: [ 20 | html tbsProgressbar 21 | valueNow: 60 ]. 22 | 23 | html heading level: 2; with: 'Contextual alternatives'. 24 | 25 | html tbsProgress: [ html tbsProgressbar beSuccess; valueNow: 40 ]. 26 | html tbsProgress: [ html tbsProgressbar beInfo; valueNow: 20 ]. 27 | html tbsProgress: [ html tbsProgressbar beWarning; valueNow: 60 ]. 28 | html tbsProgress: [ html tbsProgressbar beDanger; valueNow: 80 ]. 29 | 30 | html heading level: 2; with: 'Striped'. 31 | html tbsProgress beStriped with: [ html tbsProgressbar beSuccess; valueNow: 40 ]. 32 | html tbsProgress beStriped with: [ html tbsProgressbar beInfo; valueNow: 20 ]. 33 | html tbsProgress beStriped with: [ html tbsProgressbar beWarning; valueNow: 60 ]. 34 | html tbsProgress beStriped with: [ html tbsProgressbar beDanger; valueNow: 80 ]. 35 | 36 | html heading level: 2; with: 'Animated'. 37 | html tbsProgress beAnimated with: [ html tbsProgressbar valueNow: 45 ]. 38 | 39 | html heading level: 2; with: 'Stacked'. 40 | html tbsProgress: [ 41 | html tbsProgressbar beSuccess; valueNow: 35. 42 | html tbsProgressbar beWarning; valueNow: 20. 43 | html tbsProgressbar beDanger; valueNow: 10 44 | ] 45 | 46 | 47 | ] 48 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSTableExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for bootstrap tables 3 | " 4 | Class { 5 | #name : #TBSTableExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSTableExample class >> exampleName [ 12 | 13 | ^'Tables' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSTableExample >> renderExampleOn: html [ 18 | 19 | |headerBlock data tableBlock | 20 | data := #(('1' 'Mark' 'Otto' '@mdo') ('2' 'Jacob' 'Thornton' '@fat') ('3' 'Larry' 'the Bird' '@twitter')). 21 | 22 | headerBlock := [ 23 | html tableHeading: '#'. 24 | html tableHeading: 'First Name'. 25 | html tableHeading: 'Last Name'. 26 | html tableHeading: 'Username' ]. 27 | 28 | tableBlock := [ 29 | html tableHead: (headerBlock). 30 | html tableBody: [ 31 | data do: [:row | html tableRow: [ row do: [:col | html tableData: col ]]]]]. 32 | 33 | html heading level: 2; with: 'Basic example'. 34 | 35 | html tbsTable: tableBlock. 36 | 37 | html heading level: 2; with: 'Striped rows'. 38 | html tbsTable 39 | beStriped; 40 | with: tableBlock. 41 | 42 | html heading level: 2; with: 'Bordered table'. 43 | html tbsTable 44 | beBordered; 45 | with: tableBlock. 46 | 47 | html heading level: 2; with: 'Hover table'. 48 | html tbsTable 49 | beHover; 50 | with: tableBlock. 51 | 52 | html heading level: 2; with: 'Condensed table'. 53 | html tbsTable 54 | beCondensed; 55 | with: tableBlock. 56 | ] 57 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSTableJSONTableExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Example for http://wenzhixin.net.cn/p/bootstrap-table/docs/index.html 3 | " 4 | Class { 5 | #name : #TBSTableJSONTableExample, 6 | #superclass : #TBSBootstrapTableExample, 7 | #category : 'Bootstrap-Examples-Widgets-Table' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSTableJSONTableExample class >> exampleName [ 12 | 13 | ^'Table - JSONTable' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSTableJSONTableExample >> renderExampleOn: html [ 18 | 19 | html table 20 | attributeAt: 'data-toggle' put: 'table'; 21 | attributeAt: 'data-url' put: TBSBootstrapTableExampleLibrary / #data1Json; 22 | attributeAt: 'data-cache' put: 'false'; 23 | attributeAt: 'data-height' put: '300'; 24 | with: [ 25 | html tableHead: [ html tableRow: [ 26 | html tableHeading 27 | attributeAt: 'data-field' put: 'id'; 28 | with: 'Item ID'. 29 | html tableHeading 30 | attributeAt: 'data-field' put: 'name'; 31 | with: 'Item name'. 32 | html tableHeading 33 | attributeAt: 'data-field' put: 'price'; 34 | with: 'Item Price' ]]. 35 | 36 | ]. 37 | 38 | 39 | 40 | ] 41 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSTableTransformTableExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Transform a normal HTML table example 3 | " 4 | Class { 5 | #name : #TBSTableTransformTableExample, 6 | #superclass : #TBSBootstrapTableExample, 7 | #category : 'Bootstrap-Examples-Widgets-Table' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSTableTransformTableExample class >> exampleName [ 12 | 13 | ^'Table - Transform' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSTableTransformTableExample >> renderExampleOn: html [ 18 | html tbsButtonGroup with: [ 19 | html tbsButton id: 'transform'; beDefault; with: [ 20 | html tbsGlyphIcon iconTransfer. 21 | html span: 'Transform']]. 22 | 23 | html tbsButtonGroup with: [ 24 | html tbsButton id: 'destroy'; beDefault; with: [ 25 | html tbsGlyphIcon iconTrash. 26 | html span: 'Destroy']]. 27 | 28 | html table 29 | id: 'table-transform'; 30 | attributeAt: 'data-toolbar' put: '#transform-buttons'; 31 | with: [ 32 | html tableHead: [ html tableRow: [ html tableHeading: 'Item ID'; tableHeading: 'Item name'; tableHeading: 'Item Price' ]]. 33 | 1 to: 10 do: [:each | 34 | html tableRow: [ 35 | html tableData: each asString. 36 | html tableData: 'test', each asString. 37 | html tableData: '$', each asString. ] 38 | ]. 39 | ]. 40 | html script: self toogleTableTransformScript 41 | 42 | 43 | 44 | ] 45 | 46 | { #category : #scripts } 47 | TBSTableTransformTableExample >> toogleTableTransformScript [ 48 | 49 | ^'$(function () { 50 | var $table = $(''#table-transform''); 51 | $(''#transform'').click(function () { 52 | $table.bootstrapTable(); 53 | }); 54 | $(''#destroy'').click(function () { 55 | $table.bootstrapTable(''destroy''); 56 | }); 57 | });' 58 | ] 59 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSThumbnailExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for bootstrap thumbnails 3 | " 4 | Class { 5 | #name : #TBSThumbnailExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSThumbnailExample class >> exampleName [ 12 | 13 | ^'Thumbnails' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSThumbnailExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Default example'. 20 | html tbsRow: [ 21 | 4 timesRepeat: [ 22 | html tbsColumn: [ html tbsThumbnailActive: [ html image placeHolder: '100%x120' ]] mediumSize: 2. 23 | ] 24 | ]. 25 | 26 | 27 | html heading level: 2; with: 'Custom content'. 28 | html tbsRow: [ 29 | 3 timesRepeat: [ 30 | html tbsColumn: [ 31 | html tbsThumbnail: [ 32 | html image placeHolder: '100%x180'. html break. 33 | html paragraph: 'Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.'. 34 | html tbsButton bePrimary with: 'Button'. 35 | html space. 36 | html tbsButton beDefault with: 'Button'. 37 | ]] mediumSize: 3. 38 | ] 39 | ] 40 | 41 | 42 | 43 | 44 | ] 45 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSTypographyExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for bootstrap styled typography 3 | " 4 | Class { 5 | #name : #TBSTypographyExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSTypographyExample class >> exampleName [ 12 | 13 | ^'Typography' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSTypographyExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Headings'. 20 | 1 to: 6 do: [:each | 21 | html heading level: each; with: ('h', each greaseString, '. bootstrap heading') ] 22 | ] 23 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSVerticalTabsExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An example for vertical tabs (see also https://github.com/dbtek/bootstrap-vertical-tabs) 3 | " 4 | Class { 5 | #name : #TBSVerticalTabsExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Widgets-VerticalTabs' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSVerticalTabsExample class >> exampleName [ 12 | 13 | ^'Vertical Tabs' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSVerticalTabsExample >> renderExampleOn: html [ 18 | html tbsRow: [ 19 | html tbsColumn smallSize: 6; with: [ 20 | html heading level: 3; with: 'Left Tabs'. 21 | html horizontalRule. 22 | html tbsColumn extraSmallSize: 3; with: [ 23 | html tbsNav beTabs; beTabsLeft; with: [ 24 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 25 | html tbsNavItem: [ html anchor: 'Profile' ]. 26 | html tbsNavItem: [ html anchor: 'Messages' ]. 27 | html tbsNavItem: [ html anchor: 'Settings' ]]]]. 28 | 29 | html tbsColumn smallSize: 6; with: [ 30 | html heading level: 3; with: 'Right Tabs'. 31 | html horizontalRule. 32 | html tbsColumn extraSmallSize: 3; with: [ 33 | html tbsNav beTabs; beTabsRight; with: [ 34 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 35 | html tbsNavItem: [ html anchor: 'Profile' ]. 36 | html tbsNavItem: [ html anchor: 'Messages' ]. 37 | html tbsNavItem: [ html anchor: 'Settings' ]]]]. 38 | 39 | html tbsColumn smallSize: 6; with: [ 40 | html heading level: 3; with: 'Left Tabs - Sideways'. 41 | html horizontalRule. 42 | html tbsColumn extraSmallSize: 3; with: [ 43 | html tbsNav beTabs; beTabsLeft; beTabsSideways; with: [ 44 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 45 | html tbsNavItem: [ html anchor: 'Profile' ]. 46 | html tbsNavItem: [ html anchor: 'Messages' ]. 47 | html tbsNavItem: [ html anchor: 'Settings' ]]]]. 48 | 49 | html tbsColumn smallSize: 6; with: [ 50 | html heading level: 3; with: 'Right Tabs - Sideways'. 51 | html horizontalRule. 52 | html tbsColumn extraSmallSize: 3; with: [ 53 | html tbsNav beTabs; beTabsRight; beTabsSideways; with: [ 54 | html tbsNavItem beActive; with: [ html anchor: 'Home' ]. 55 | html tbsNavItem: [ html anchor: 'Profile' ]. 56 | html tbsNavItem: [ html anchor: 'Messages' ]. 57 | html tbsNavItem: [ html anchor: 'Settings' ]]]]. 58 | 59 | ]. 60 | 61 | 62 | ] 63 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/TBSWellExample.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Examples for the bootstrap well 3 | " 4 | Class { 5 | #name : #TBSWellExample, 6 | #superclass : #TBSBootstrapExample, 7 | #category : 'Bootstrap-Examples-Core' 8 | } 9 | 10 | { #category : #accessing } 11 | TBSWellExample class >> exampleName [ 12 | 13 | ^'Well' 14 | ] 15 | 16 | { #category : #rendering } 17 | TBSWellExample >> renderExampleOn: html [ 18 | 19 | html heading level: 2; with: 'Default well'. 20 | html text: 'Use the well as a simple effect on an element to give it an inset effect.'. 21 | html tbsWell: 'Look, I''m in a well!'. 22 | 23 | html heading level: 2; with: 'Optional classes'. 24 | 25 | html text: 'Control padding and rounded corners with two optional modifier classes.'. 26 | 27 | html tbsWell 28 | beLarge; with: 'Look, I''m a large well!'. 29 | 30 | html tbsWell 31 | beSmall; with: 'Look, I''m a small well!'. 32 | ] 33 | -------------------------------------------------------------------------------- /src/Bootstrap-Examples/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Examples' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Jasny/TBSButtonTag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #TBSButtonTag } 2 | 3 | { #category : #'*Bootstrap-Jasny-Canvas' } 4 | TBSButtonTag >> beLabeled [ 5 | "Creates an labeled type button." 6 | 7 | self beLabeledIf: true 8 | ] 9 | 10 | { #category : #'*Bootstrap-Jasny-Canvas' } 11 | TBSButtonTag >> beLabeledIf: aBlock [ 12 | "Creates an labeled type button if aBlock is true." 13 | 14 | self class: 'btn-labeled' if: aBlock 15 | ] 16 | -------------------------------------------------------------------------------- /src/Bootstrap-Jasny/TBSNavTag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #TBSNavTag } 2 | 3 | { #category : #'*Bootstrap-Jasny-Canvas' } 4 | TBSNavTag >> beNavmenuNavigation [ 5 | "Creates a navigation specialized for a nav menu." 6 | 7 | self class: 'navmenu-nav' 8 | ] 9 | -------------------------------------------------------------------------------- /src/Bootstrap-Jasny/TBSNavmenuTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Bootstrap navigation menu (Jasni) 3 | " 4 | Class { 5 | #name : #TBSNavmenuTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Jasny-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSNavmenuTag >> beDefault [ 12 | "Creates an default navmenu." 13 | 14 | self class: 'navmenu-default' 15 | ] 16 | 17 | { #category : #options } 18 | TBSNavmenuTag >> beFixedLeft [ 19 | "Creates a left fixed navmenu." 20 | 21 | self class: 'navmenu-fixed-left' 22 | ] 23 | 24 | { #category : #options } 25 | TBSNavmenuTag >> beFixedRight [ 26 | "Creates a right fixed navmenu." 27 | 28 | self class: 'navmenu-fixed-right' 29 | ] 30 | 31 | { #category : #options } 32 | TBSNavmenuTag >> beInverse [ 33 | "Creates an Inverse navmenu." 34 | 35 | self class: 'navmenu-inverse' 36 | ] 37 | 38 | { #category : #initialization } 39 | TBSNavmenuTag >> initialize [ 40 | super initialize. 41 | self 42 | class: 'nav'; 43 | class: 'navmenu'. 44 | ] 45 | 46 | { #category : #accessing } 47 | TBSNavmenuTag >> tag [ 48 | ^ 'div' 49 | ] 50 | -------------------------------------------------------------------------------- /src/Bootstrap-Jasny/WAHtmlCanvas.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WAHtmlCanvas } 2 | 3 | { #category : #'*Bootstrap-Jasny-Canvas' } 4 | WAHtmlCanvas >> tbsButtonLabel [ 5 | 6 | ^(self span) 7 | class: 'btn-label'; 8 | yourself 9 | ] 10 | 11 | { #category : #'*Bootstrap-Jasny-Canvas' } 12 | WAHtmlCanvas >> tbsButtonLabel: aBlock [ 13 | 14 | ^self tbsButtonLabel 15 | with: aBlock 16 | 17 | ] 18 | 19 | { #category : #'*Bootstrap-Jasny-Canvas' } 20 | WAHtmlCanvas >> tbsButtonLabelRight [ 21 | 22 | ^(self span) 23 | class: 'btn-label'; 24 | class: 'btn-label-right'; 25 | yourself 26 | ] 27 | 28 | { #category : #'*Bootstrap-Jasny-Canvas' } 29 | WAHtmlCanvas >> tbsButtonLabelRight: aBlock [ 30 | 31 | ^self tbsButtonLabelRight 32 | with: aBlock 33 | 34 | ] 35 | 36 | { #category : #'*Bootstrap-Jasny-Canvas' } 37 | WAHtmlCanvas >> tbsContainerSmooth [ 38 | "Provides a container to use the same max-width for all viewport sizes. This means that the container size won't jump at media query breakpoints." 39 | 40 | ^ self div 41 | class: 'container-smooth' 42 | ] 43 | 44 | { #category : #'*Bootstrap-Jasny-Canvas' } 45 | WAHtmlCanvas >> tbsContainerSmooth: aBlock [ 46 | "Provides a container to use the same max-width for all viewport sizes. This means that the container size won't jump at media query breakpoints." 47 | 48 | ^ self tbsContainerSmooth 49 | with: aBlock 50 | 51 | ] 52 | 53 | { #category : #'*Bootstrap-Jasny-Canvas' } 54 | WAHtmlCanvas >> tbsNavmenu [ 55 | "Defines an Twitter Bootstrap navigation menu." 56 | 57 | ^self brush: TBSNavmenuTag new 58 | 59 | ] 60 | 61 | { #category : #'*Bootstrap-Jasny-Canvas' } 62 | WAHtmlCanvas >> tbsNavmenu: aBlock [ 63 | "Defines an Twitter Bootstrap navigation menu." 64 | 65 | ^ self tbsNavmenu 66 | with: aBlock 67 | ] 68 | 69 | { #category : #'*Bootstrap-Jasny-Canvas' } 70 | WAHtmlCanvas >> tbsNavmenuBrand [ 71 | "Create a bootstrap navigation menu brand." 72 | 73 | ^ self anchor 74 | class: 'navmenu-brand'; 75 | yourself 76 | 77 | ] 78 | 79 | { #category : #'*Bootstrap-Jasny-Canvas' } 80 | WAHtmlCanvas >> tbsNavmenuBrand: aBlock [ 81 | "Defines an Jasni navigation menu brand" 82 | 83 | ^ self tbsNavmenuBrand 84 | with: aBlock 85 | ] 86 | -------------------------------------------------------------------------------- /src/Bootstrap-Jasny/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Jasny' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Core/TBSDeploymentLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Test the Bootstrap deployment file libary 3 | " 4 | Class { 5 | #name : #TBSDeploymentLibraryTest, 6 | #superclass : #TestCase, 7 | #category : 'Bootstrap-Tests-Core-Libraries' 8 | } 9 | 10 | { #category : #testing } 11 | TBSDeploymentLibraryTest >> testIncludeBootstrapMinCSSByDefault [ 12 | 13 | self assert: (TBSDeploymentLibrary new selectorsToInclude includes: #cssbootstrapminCss) 14 | 15 | ] 16 | 17 | { #category : #testing } 18 | TBSDeploymentLibraryTest >> testIncludeBootstrapMinJSByDefault [ 19 | 20 | self assert: (TBSDeploymentLibrary new selectorsToInclude includes: #jsbootstrapminJs) 21 | 22 | ] 23 | 24 | { #category : #testing } 25 | TBSDeploymentLibraryTest >> testIncludeBootstrapThemeMinCSSByDefault [ 26 | 27 | self assert: (TBSDeploymentLibrary new selectorsToInclude includes: #cssbootstrapthememinCss) 28 | 29 | ] 30 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Core/TBSDevelopmentLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSDevelopmentLibraryTest, 3 | #superclass : #TestCase, 4 | #category : 'Bootstrap-Tests-Core-Libraries' 5 | } 6 | 7 | { #category : #testing } 8 | TBSDevelopmentLibraryTest >> testIncludeBootstrapCSSByDefault [ 9 | 10 | self assert: (TBSDevelopmentLibrary new selectorsToInclude includes: #cssbootstrapCss) 11 | 12 | ] 13 | 14 | { #category : #testing } 15 | TBSDevelopmentLibraryTest >> testIncludeBootstrapJSByDefault [ 16 | 17 | self assert: (TBSDevelopmentLibrary new selectorsToInclude includes: #jsbootstrapJs) 18 | 19 | ] 20 | 21 | { #category : #testing } 22 | TBSDevelopmentLibraryTest >> testIncludeBootstrapThemeCSSByDefault [ 23 | 24 | self assert: (TBSDevelopmentLibrary new selectorsToInclude includes: #cssbootstrapthemeCss) 25 | 26 | ] 27 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Core/TBSHolderJSTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSHolderJSTest, 3 | #superclass : #WAAbstractCanvasBrushTest, 4 | #category : 'Bootstrap-Tests-Core-Canvas' 5 | } 6 | 7 | { #category : #testing } 8 | TBSHolderJSTest >> testTbsAlertBeDanger [ 9 | 10 | self 11 | assert: [ :html | html image placeHolder: '80x80' ] 12 | gives: '' 13 | 14 | ] 15 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Core/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Tests-Core' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Jasny/TBSJasnyCanvasBrushTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSJasnyCanvasBrushTest, 3 | #superclass : #WAAbstractCanvasBrushTest, 4 | #category : 'Bootstrap-Tests-Jasny-Canvas' 5 | } 6 | 7 | { #category : #'tests-button options' } 8 | TBSJasnyCanvasBrushTest >> testTbsButtonBeLabeled [ 9 | 10 | self 11 | assert: [ :html | html tbsButton beLabeled ] 12 | gives: '' 13 | 14 | 15 | ] 16 | 17 | { #category : #'tests-button options' } 18 | TBSJasnyCanvasBrushTest >> testTbsButtonBeLabeledConditional [ 19 | 20 | self 21 | assert: [ :html | html tbsButton beLabeledIf: true ] 22 | gives: ''. 23 | 24 | self 25 | assert: [ :html | html tbsButton beLabeledIf: false ] 26 | gives: '' 27 | 28 | ] 29 | 30 | { #category : #'tests-button label' } 31 | TBSJasnyCanvasBrushTest >> testTbsButtonLabel [ 32 | self 33 | assert: [ :html | html tbsButtonLabel ] 34 | gives: '' 35 | 36 | 37 | ] 38 | 39 | { #category : #'tests-button label' } 40 | TBSJasnyCanvasBrushTest >> testTbsButtonLabelRight [ 41 | self 42 | assert: [ :html | html tbsButtonLabelRight ] 43 | gives: '' 44 | 45 | 46 | ] 47 | 48 | { #category : #'tests-button label' } 49 | TBSJasnyCanvasBrushTest >> testTbsButtonLabelRightWithContents [ 50 | 51 | self 52 | assert: [ :html | html tbsButtonLabelRight: 'Bootstrap' ] 53 | gives: 'Bootstrap' 54 | 55 | 56 | ] 57 | 58 | { #category : #'tests-button label' } 59 | TBSJasnyCanvasBrushTest >> testTbsButtonLabelWithContents [ 60 | 61 | self 62 | assert: [ :html | html tbsButtonLabel: 'Bootstrap' ] 63 | gives: 'Bootstrap' 64 | 65 | 66 | ] 67 | 68 | { #category : #'tests-container' } 69 | TBSJasnyCanvasBrushTest >> testTbsContainerSmooth [ 70 | 71 | self 72 | assert: [ :html | html tbsContainerSmooth ] 73 | gives: '
' 74 | 75 | 76 | ] 77 | 78 | { #category : #'tests-container' } 79 | TBSJasnyCanvasBrushTest >> testTbsContainerSmoothWithContents [ 80 | 81 | self 82 | assert: [ :html | html tbsContainerSmooth: 'Bootstrap' ] 83 | gives: '
Bootstrap
' 84 | 85 | ] 86 | 87 | { #category : #'tests-nav options' } 88 | TBSJasnyCanvasBrushTest >> testTbsNavBeNavmenuNavigation [ 89 | 90 | self 91 | assert: [ :html | html tbsNav beNavmenuNavigation ] 92 | gives: '' 93 | 94 | 95 | ] 96 | 97 | { #category : #'tests-navmenu' } 98 | TBSJasnyCanvasBrushTest >> testTbsNavmenu [ 99 | 100 | self 101 | assert: [ :html | html tbsNavmenu ] 102 | gives: '' 103 | ] 104 | 105 | { #category : #'tests-navmenu options' } 106 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBeDefault [ 107 | 108 | self 109 | assert: [ :html | html tbsNavmenu beDefault ] 110 | gives: '' 111 | ] 112 | 113 | { #category : #'tests-navmenu options' } 114 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBeFixedLeft [ 115 | 116 | self 117 | assert: [ :html | html tbsNavmenu beFixedLeft ] 118 | gives: '' 119 | ] 120 | 121 | { #category : #'tests-navmenu options' } 122 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBeFixedRight [ 123 | 124 | self 125 | assert: [ :html | html tbsNavmenu beFixedRight ] 126 | gives: '' 127 | ] 128 | 129 | { #category : #'tests-navmenu options' } 130 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBeInverse [ 131 | 132 | self 133 | assert: [ :html | html tbsNavmenu beInverse ] 134 | gives: '' 135 | ] 136 | 137 | { #category : #'tests-navmenu' } 138 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBrand [ 139 | 140 | self 141 | assert: [ :html | html tbsNavmenuBrand ] 142 | gives: '' 143 | ] 144 | 145 | { #category : #'tests-navmenu' } 146 | TBSJasnyCanvasBrushTest >> testTbsNavmenuBrandWithContent [ 147 | 148 | self 149 | assert: [ :html | html tbsNavmenuBrand: 'Bootstrap' ] 150 | gives: 'Bootstrap' 151 | ] 152 | 153 | { #category : #'tests-navmenu' } 154 | TBSJasnyCanvasBrushTest >> testTbsNavmenuWithContent [ 155 | 156 | self 157 | assert: [ :html | html tbsNavmenu: 'Bootstrap' ] 158 | gives: '' 159 | 160 | ] 161 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Jasny/TBSJasnyDeploymentLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Unit test for deployment library 3 | " 4 | Class { 5 | #name : #TBSJasnyDeploymentLibraryTest, 6 | #superclass : #TestCase, 7 | #category : 'Bootstrap-Tests-Jasny-Libraries' 8 | } 9 | 10 | { #category : #tests } 11 | TBSJasnyDeploymentLibraryTest >> testIncludeJasnyMinCSSByDefault [ 12 | 13 | self assert: (TBSJasnyDeploymentLibrary new selectorsToInclude includes: #cssjasnybootstrapminCss) 14 | 15 | ] 16 | 17 | { #category : #tests } 18 | TBSJasnyDeploymentLibraryTest >> testIncludeJasnyMinJSByDefault [ 19 | 20 | self assert: (TBSJasnyDeploymentLibrary new selectorsToInclude includes: #jsjasnybootstrapminJs) 21 | 22 | ] 23 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Jasny/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Tests-Jasny' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSAccordionItemTest.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A test for accordion item 3 | " 4 | Class { 5 | #name : #TBSAccordionItemTest, 6 | #superclass : #TestCase, 7 | #category : 'Bootstrap-Tests-Widgets-Components' 8 | } 9 | 10 | { #category : #tests } 11 | TBSAccordionItemTest >> testRenderBlock [ 12 | |builder renderBlock parent item calledCorrectly | 13 | builder := WAHtmlCanvas builder. 14 | renderBlock := [:html | calledCorrectly := html class = builder rendererClass ]. 15 | parent := TBSAccordion new. 16 | parent add: renderBlock title: 'Something to render'. 17 | 18 | builder render: parent. 19 | self assert: calledCorrectly. 20 | 21 | item := parent items first. 22 | self 23 | assert: item componentOrBlock = renderBlock; 24 | assert: item title = 'Something to render' 25 | ] 26 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSTableFileLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSTableFileLibraryTest, 3 | #superclass : #TestCase, 4 | #category : 'Bootstrap-Tests-Widgets-Libraries' 5 | } 6 | 7 | { #category : #tests } 8 | TBSTableFileLibraryTest >> testIncludeTableCSSByDefault [ 9 | 10 | self assert: (TBSTableFileLibrary new selectorsToInclude includes: #bootstraptableCss) 11 | 12 | ] 13 | 14 | { #category : #tests } 15 | TBSTableFileLibraryTest >> testIncludeTableJSByDefault [ 16 | 17 | self assert: (TBSTableFileLibrary new selectorsToInclude includes: #bootstraptableJs) 18 | 19 | ] 20 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSVerticalTabsCanvasBrushTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSVerticalTabsCanvasBrushTest, 3 | #superclass : #WAAbstractCanvasBrushTest, 4 | #category : 'Bootstrap-Tests-Widgets-Canvas' 5 | } 6 | 7 | { #category : #testing } 8 | TBSVerticalTabsCanvasBrushTest >> testTbsNavBeTabsLeft [ 9 | 10 | self 11 | assert: [ :html | html tbsNav beTabs beTabsLeft ] 12 | gives: '' 13 | ] 14 | 15 | { #category : #testing } 16 | TBSVerticalTabsCanvasBrushTest >> testTbsNavBeTabsRight [ 17 | 18 | self 19 | assert: [ :html | html tbsNav beTabs beTabsRight ] 20 | gives: '' 21 | ] 22 | 23 | { #category : #testing } 24 | TBSVerticalTabsCanvasBrushTest >> testTbsNavBeTabsSideways [ 25 | 26 | self 27 | assert: [ :html | html tbsNav beTabs beTabsSideways ] 28 | gives: '' 29 | ] 30 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSVerticalTabsDeploymentLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSVerticalTabsDeploymentLibraryTest, 3 | #superclass : #TestCase, 4 | #category : 'Bootstrap-Tests-Widgets-Libraries' 5 | } 6 | 7 | { #category : #tests } 8 | TBSVerticalTabsDeploymentLibraryTest >> testIncludeVerticalTabsMinCSSByDefault [ 9 | 10 | self assert: (TBSVerticalTabsDeploymentLibrary new selectorsToInclude includes: #bootstrapverticaltabsminCss) 11 | 12 | ] 13 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSVerticalTabsDevelopmentLibraryTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSVerticalTabsDevelopmentLibraryTest, 3 | #superclass : #TestCase, 4 | #category : 'Bootstrap-Tests-Widgets-Libraries' 5 | } 6 | 7 | { #category : #tests } 8 | TBSVerticalTabsDevelopmentLibraryTest >> testIncludeVerticalTabsCSSByDefault [ 9 | 10 | self assert: (TBSVerticalTabsDevelopmentLibrary new selectorsToInclude includes: #bootstrapverticaltabsCss) 11 | 12 | ] 13 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/TBSWidgetsCanvasBrushTest.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #TBSWidgetsCanvasBrushTest, 3 | #superclass : #WAAbstractCanvasBrushTest, 4 | #category : 'Bootstrap-Tests-Widgets-Components' 5 | } 6 | 7 | { #category : #'testing - offer' } 8 | TBSWidgetsCanvasBrushTest >> testTbsOffer [ 9 | 10 | self 11 | assert: [ :html | html tbsOffer ] 12 | gives: '
' 13 | 14 | ] 15 | 16 | { #category : #'testing - offer' } 17 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeDanger [ 18 | self 19 | assert: [ :html | html tbsOffer beDanger ] 20 | gives: '
' 21 | 22 | ] 23 | 24 | { #category : #'testing - offer' } 25 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeDefault [ 26 | 27 | self 28 | assert: [ :html | html tbsOffer beDefault ] 29 | gives: '
' 30 | 31 | ] 32 | 33 | { #category : #'testing - offer' } 34 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeInfo [ 35 | 36 | self 37 | assert: [ :html | html tbsOffer beInfo ] 38 | gives: '
' 39 | 40 | ] 41 | 42 | { #category : #'testing - offer' } 43 | TBSWidgetsCanvasBrushTest >> testTbsOfferBePrimary [ 44 | 45 | self 46 | assert: [ :html | html tbsOffer bePrimary ] 47 | gives: '
' 48 | 49 | ] 50 | 51 | { #category : #'testing - offer' } 52 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeRounded [ 53 | 54 | self 55 | assert: [ :html | html tbsOffer beRounded ] 56 | gives: '
' 57 | 58 | ] 59 | 60 | { #category : #'testing - offer' } 61 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeSuccess [ 62 | 63 | self 64 | assert: [ :html | html tbsOffer beSuccess ] 65 | gives: '
' 66 | 67 | ] 68 | 69 | { #category : #'testing - offer' } 70 | TBSWidgetsCanvasBrushTest >> testTbsOfferBeWarning [ 71 | 72 | self 73 | assert: [ :html | html tbsOffer beWarning ] 74 | gives: '
' 75 | 76 | ] 77 | 78 | { #category : #'testing - offer' } 79 | TBSWidgetsCanvasBrushTest >> testTbsOfferContent [ 80 | 81 | self 82 | assert: [ :html | html tbsOfferContent ] 83 | gives: '
' 84 | 85 | ] 86 | 87 | { #category : #'testing - offer' } 88 | TBSWidgetsCanvasBrushTest >> testTbsOfferContentWithContents [ 89 | 90 | self 91 | assert: [ :html | html tbsOfferContent: 'Bootstrap' ] 92 | gives: '
Bootstrap
' 93 | 94 | ] 95 | 96 | { #category : #'testing - offer' } 97 | TBSWidgetsCanvasBrushTest >> testTbsOfferShape [ 98 | 99 | self 100 | assert: [ :html | html tbsOfferShape ] 101 | gives: '
' 102 | 103 | ] 104 | 105 | { #category : #'testing - offer' } 106 | TBSWidgetsCanvasBrushTest >> testTbsOfferShapeText [ 107 | 108 | self 109 | assert: [ :html | html tbsOfferShapeText ] 110 | gives: '
' 111 | 112 | ] 113 | 114 | { #category : #'testing - offer' } 115 | TBSWidgetsCanvasBrushTest >> testTbsOfferShapeTextWithContents [ 116 | 117 | self 118 | assert: [ :html | html tbsOfferShapeText: 'Bootstrap' ] 119 | gives: '
Bootstrap
' 120 | 121 | ] 122 | 123 | { #category : #'testing - offer' } 124 | TBSWidgetsCanvasBrushTest >> testTbsOfferShapeWithContents [ 125 | 126 | self 127 | assert: [ :html | html tbsOfferShape: 'Bootstrap' ] 128 | gives: '
Bootstrap
' 129 | 130 | ] 131 | 132 | { #category : #'testing - offer' } 133 | TBSWidgetsCanvasBrushTest >> testTbsOfferWithContents [ 134 | 135 | self 136 | assert: [ :html | html tbsOffer: 'Bootstrap' ] 137 | gives: '
Bootstrap
' 138 | 139 | ] 140 | -------------------------------------------------------------------------------- /src/Bootstrap-Tests-Widgets/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Tests-Widgets' } 2 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSAccordion.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An accordion 3 | " 4 | Class { 5 | #name : #TBSAccordion, 6 | #superclass : #WACanvasWidget, 7 | #instVars : [ 8 | 'items', 9 | 'id' 10 | ], 11 | #category : 'Bootstrap-Widgets-Components' 12 | } 13 | 14 | { #category : #accessing } 15 | TBSAccordion >> add: aComponentOrOneArgumentBlock title: aString [ 16 | "Add the given Seaside component to the accordion with the given title. 17 | As an alternative a block can be given taking the html renderer as argument" 18 | 19 | self addItem: (self itemClass 20 | on: aComponentOrOneArgumentBlock 21 | title: aString 22 | in: self) 23 | ] 24 | 25 | { #category : #accessing } 26 | TBSAccordion >> addItem: anAccordionItem [ 27 | 28 | self items add: anAccordionItem 29 | ] 30 | 31 | { #category : #accessing } 32 | TBSAccordion >> children [ 33 | 34 | ^items 35 | ] 36 | 37 | { #category : #accessing } 38 | TBSAccordion >> id [ 39 | ^id 40 | ] 41 | 42 | { #category : #accessing } 43 | TBSAccordion >> id: anId [ 44 | 45 | id := anId 46 | ] 47 | 48 | { #category : #initialization } 49 | TBSAccordion >> initialize [ 50 | super initialize. 51 | items := OrderedCollection new 52 | ] 53 | 54 | { #category : #'private - accessing' } 55 | TBSAccordion >> itemClass [ 56 | "Return the item class. Can be overriden by subclasses" 57 | 58 | ^TBSAccordionItem 59 | ] 60 | 61 | { #category : #accessing } 62 | TBSAccordion >> items [ 63 | 64 | ^items 65 | ] 66 | 67 | { #category : #rendering } 68 | TBSAccordion >> renderContentOn: html [ 69 | self id ifNil: [ self id: html nextId ]. 70 | 71 | html tbsPanelGroup 72 | id: self id asSymbol; 73 | with: [ 74 | self items do: [:item | 75 | self renderItem: item on: html ]] 76 | ] 77 | 78 | { #category : #'private - rendering' } 79 | TBSAccordion >> renderItem: item on: html [ 80 | 81 | html tbsPanel 82 | beDefault; 83 | with: [ 84 | html render: item ]. 85 | 86 | ] 87 | 88 | { #category : #'private - rendering' } 89 | TBSAccordion >> uniqueIdStringForItem: item [ 90 | 91 | ^'item', (items hash) asString 92 | ] 93 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSAccordionItem.class.st: -------------------------------------------------------------------------------- 1 | " 2 | An accordion item 3 | " 4 | Class { 5 | #name : #TBSAccordionItem, 6 | #superclass : #WACanvasWidget, 7 | #instVars : [ 8 | 'componentOrBlock', 9 | 'title', 10 | 'isCollapsed', 11 | 'accordion' 12 | ], 13 | #category : 'Bootstrap-Widgets-Components' 14 | } 15 | 16 | { #category : #'instance creation' } 17 | TBSAccordionItem class >> on: aComponentOrOneArgumentBlock title: aString in: anAccordion [ 18 | 19 | ^(self new) 20 | componentOrBlock: aComponentOrOneArgumentBlock; 21 | title: aString; 22 | accordion: anAccordion; 23 | yourself 24 | ] 25 | 26 | { #category : #accessing } 27 | TBSAccordionItem >> accordion [ 28 | ^ accordion 29 | ] 30 | 31 | { #category : #accessing } 32 | TBSAccordionItem >> accordion: anObject [ 33 | accordion := anObject 34 | ] 35 | 36 | { #category : #accessing } 37 | TBSAccordionItem >> children [ 38 | ^self componentOrBlock isBlock 39 | ifTrue: [ #() ] 40 | ifFalse: [ Array with: componentOrBlock ] 41 | ] 42 | 43 | { #category : #accessing } 44 | TBSAccordionItem >> componentOrBlock [ 45 | ^ componentOrBlock 46 | ] 47 | 48 | { #category : #accessing } 49 | TBSAccordionItem >> componentOrBlock: aComponentOrOneArgumentBlock [ 50 | componentOrBlock := aComponentOrOneArgumentBlock 51 | ] 52 | 53 | { #category : #initialization } 54 | TBSAccordionItem >> initialize [ 55 | 56 | super initialize. 57 | self isCollapsed: false 58 | ] 59 | 60 | { #category : #accessing } 61 | TBSAccordionItem >> isCollapsed [ 62 | ^ isCollapsed 63 | ] 64 | 65 | { #category : #accessing } 66 | TBSAccordionItem >> isCollapsed: anObject [ 67 | isCollapsed := anObject 68 | ] 69 | 70 | { #category : #'private - rendering' } 71 | TBSAccordionItem >> renderBodyOn: html [ 72 | |styleClasses| 73 | styleClasses := 'panel-collapse collapse'. 74 | self isCollapsed ifFalse: [styleClasses := styleClasses, ' in']. 75 | 76 | html div 77 | id: self uniqueIdString; 78 | class: styleClasses; 79 | with: [ 80 | html tbsPanelBody: [ 81 | self componentOrBlock isBlock 82 | ifTrue: [ self componentOrBlock value: html ] 83 | ifFalse: [ html render: self componentOrBlock ]]] 84 | ] 85 | 86 | { #category : #rendering } 87 | TBSAccordionItem >> renderContentOn: html [ 88 | 89 | self renderHeadingOn: html. 90 | self renderBodyOn: html 91 | ] 92 | 93 | { #category : #'private - rendering' } 94 | TBSAccordionItem >> renderHeadingOn: html [ 95 | 96 | html tbsPanelHeading: [ 97 | html tbsPanelTitle: [ 98 | html anchor 99 | attributeAt: 'data-toggle' ifAbsentPut: 'collapse'; 100 | attributeAt: 'data-parent' ifAbsentPut: self accordion id asSymbol printString; 101 | url: '#', self uniqueIdString; 102 | with: self title 103 | ]] 104 | ] 105 | 106 | { #category : #accessing } 107 | TBSAccordionItem >> title [ 108 | ^ title 109 | ] 110 | 111 | { #category : #accessing } 112 | TBSAccordionItem >> title: anObject [ 113 | title := anObject 114 | ] 115 | 116 | { #category : #'private - accessing' } 117 | TBSAccordionItem >> uniqueIdString [ 118 | 119 | ^'item', (self hash) asString 120 | ] 121 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSBatchedList.class.st: -------------------------------------------------------------------------------- 1 | " 2 | I'm a batched list that uses a sexy Twitter Bootstrap style. See WABatchedList and TBSPaginationExample for more information. 3 | " 4 | Class { 5 | #name : #TBSBatchedList, 6 | #superclass : #WABatchedList, 7 | #category : 'Bootstrap-Widgets-Components' 8 | } 9 | 10 | { #category : #rendering } 11 | TBSBatchedList >> renderContentOn: html [ 12 | self maxPages = 0 13 | ifTrue: [ ^ self ]. 14 | html tbsPagination: [ 15 | self renderPreviousOn: html. 16 | self renderPagesOn: html. 17 | self renderNextOn: html ] 18 | ] 19 | 20 | { #category : #rendering } 21 | TBSBatchedList >> renderNextOn: html [ 22 | | item | 23 | item := html tbsPaginationItem. 24 | self isOnLastPage ifTrue: [ item beDisabled ]. 25 | item with: [ 26 | html anchor 27 | callback: [ self nextPage ]; 28 | with: [ html tbsSingleRightAngleQuote ] ]. 29 | item := html tbsPaginationItem. 30 | self isOnLastPage ifTrue: [ item beDisabled ]. 31 | item with: [ 32 | html anchor 33 | callback: [ self currentPage: self maxPages ]; 34 | with: [ html tbsDoubleRightAngleQuote ] ]. 35 | 36 | ] 37 | 38 | { #category : #rendering } 39 | TBSBatchedList >> renderPagesOn: html [ 40 | | item | 41 | self pageRange 42 | do: [ :index | 43 | item := html tbsPaginationItem. 44 | (self currentPage = index) 45 | ifTrue: [ item beActive. item beDisabled ]. 46 | item with: [ 47 | html anchor 48 | callback: [ self currentPage: index ]; 49 | with: index ] ] 50 | ] 51 | 52 | { #category : #rendering } 53 | TBSBatchedList >> renderPreviousOn: html [ 54 | | item | 55 | item := html tbsPaginationItem. 56 | self isOnFirstPage ifTrue: [ item beDisabled ]. 57 | item with: [ 58 | html anchor 59 | callback: [ self currentPage: 1 ]; 60 | with: [ html tbsDoubleLeftAngleQuote ] ]. 61 | item := html tbsPaginationItem. 62 | self isOnFirstPage ifTrue: [ item beDisabled ]. 63 | item with: [ 64 | html anchor 65 | callback: [ self previousPage ]; 66 | with: [ html tbsSingleLeftAngleQuote ] ] 67 | ] 68 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSNavTag.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #TBSNavTag } 2 | 3 | { #category : #'*Bootstrap-Widgets-Canvas' } 4 | TBSNavTag >> beTabsLeft [ 5 | "Creates tabs on the left" 6 | self class: 'tabs-left'. 7 | 8 | ] 9 | 10 | { #category : #'*Bootstrap-Widgets-Canvas' } 11 | TBSNavTag >> beTabsRight [ 12 | "Creates an Tabs nav." 13 | self class: 'tabs-right'. 14 | 15 | ] 16 | 17 | { #category : #'*Bootstrap-Widgets-Canvas' } 18 | TBSNavTag >> beTabsSideways [ 19 | "Creates tabs on the right" 20 | self class: 'sideways'. 21 | 22 | ] 23 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSOfferTag.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Defines an offer for twitter bootstrap 3 | " 4 | Class { 5 | #name : #TBSOfferTag, 6 | #superclass : #WATagBrush, 7 | #category : 'Bootstrap-Widgets-Canvas' 8 | } 9 | 10 | { #category : #options } 11 | TBSOfferTag >> beDanger [ 12 | 13 | self class: 'offer-danger' 14 | ] 15 | 16 | { #category : #options } 17 | TBSOfferTag >> beDefault [ 18 | 19 | self class: 'offer-default' 20 | ] 21 | 22 | { #category : #options } 23 | TBSOfferTag >> beInfo [ 24 | 25 | self class: 'offer-info' 26 | ] 27 | 28 | { #category : #options } 29 | TBSOfferTag >> bePrimary [ 30 | 31 | self class: 'offer-primary' 32 | ] 33 | 34 | { #category : #options } 35 | TBSOfferTag >> beRounded [ 36 | 37 | self class: 'offer-rounded' 38 | ] 39 | 40 | { #category : #options } 41 | TBSOfferTag >> beSuccess [ 42 | 43 | self class: 'offer-success' 44 | ] 45 | 46 | { #category : #options } 47 | TBSOfferTag >> beWarning [ 48 | 49 | self class: 'offer-warning' 50 | ] 51 | 52 | { #category : #initialization } 53 | TBSOfferTag >> initialize [ 54 | super initialize. 55 | self class: 'offer' 56 | ] 57 | 58 | { #category : #accessing } 59 | TBSOfferTag >> tag [ 60 | 61 | ^'div' 62 | ] 63 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSVerticalTabsDeploymentLibrary.class.st: -------------------------------------------------------------------------------- 1 | " 2 | For deployment, see https://github.com/dbtek/bootstrap-vertical-tabs 3 | " 4 | Class { 5 | #name : #TBSVerticalTabsDeploymentLibrary, 6 | #superclass : #TBSVerticalTabsFileLibrary, 7 | #category : 'Bootstrap-Widgets-Libraries' 8 | } 9 | 10 | { #category : #'uploaded metadata' } 11 | TBSVerticalTabsDeploymentLibrary >> bootstrapverticaltabsminCss [ 12 | ^ WAFileLibraryResource 13 | filepath: 'bootstrap.vertical-tabs.min.css' 14 | mimeType: (WAMimeType main: 'text' sub: 'css') 15 | cacheDuration: (Duration days: 0 hours: 0 minutes: 30 seconds: 0) 16 | contents: (GRDelayedSend receiver: self selector: #bootstrapverticaltabsminCssContent) 17 | ] 18 | 19 | { #category : #uploaded } 20 | TBSVerticalTabsDeploymentLibrary >> bootstrapverticaltabsminCssContent [ 21 | ^ '/*! 22 | * bootstrap-vertical-tabs - v1.1.0 23 | * https://dbtek.github.io/bootstrap-vertical-tabs 24 | * 2014-07-24 25 | * Copyright (c) 2014 İsmail Demirbilek 26 | * License: MIT 27 | */ 28 | 29 | .tabs-left,.tabs-right{border-bottom:none;padding-top:2px}.tabs-left{border-right:1px solid #ddd}.tabs-right{border-left:1px solid #ddd}.tabs-left>li,.tabs-right>li{float:none;margin-bottom:2px}.tabs-left>li{margin-right:-1px}.tabs-right>li{margin-left:-1px}.tabs-left>li.active>a,.tabs-left>li.active>a:focus,.tabs-left>li.active>a:hover{border-bottom-color:#ddd;border-right-color:transparent}.tabs-right>li.active>a,.tabs-right>li.active>a:focus,.tabs-right>li.active>a:hover{border-bottom:1px solid #ddd;border-left-color:transparent}.tabs-left>li>a{border-radius:4px 0 0 4px;margin-right:0;display:block}.tabs-right>li>a{border-radius:0 4px 4px 0;margin-right:0}.sideways{margin-top:50px;border:none;position:relative}.sideways>li{height:20px;width:120px;margin-bottom:100px}.sideways>li>a{border-bottom:1px solid #ddd;border-right-color:transparent;text-align:center;border-radius:4px 4px 0 0}.sideways>li.active>a,.sideways>li.active>a:focus,.sideways>li.active>a:hover{border-bottom-color:transparent;border-right-color:#ddd;border-left-color:#ddd}.sideways.tabs-left{left:-50px}.sideways.tabs-right{right:-50px}.sideways.tabs-right>li{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.sideways.tabs-left>li{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}' 30 | ] 31 | 32 | { #category : #accessing } 33 | TBSVerticalTabsDeploymentLibrary >> selectorsToInclude [ 34 | ^ #(bootstrapverticaltabsminCss) 35 | ] 36 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSVerticalTabsDevelopmentLibrary.class.st: -------------------------------------------------------------------------------- 1 | " 2 | For development, see https://github.com/dbtek/bootstrap-vertical-tabs 3 | " 4 | Class { 5 | #name : #TBSVerticalTabsDevelopmentLibrary, 6 | #superclass : #TBSVerticalTabsFileLibrary, 7 | #category : 'Bootstrap-Widgets-Libraries' 8 | } 9 | 10 | { #category : #'uploaded metadata' } 11 | TBSVerticalTabsDevelopmentLibrary >> bootstrapverticaltabsCss [ 12 | ^ WAFileLibraryResource 13 | filepath: 'bootstrap.vertical-tabs.css' 14 | mimeType: (WAMimeType main: 'text' sub: 'css') 15 | cacheDuration: (Duration days: 0 hours: 0 minutes: 30 seconds: 0) 16 | contents: (GRDelayedSend receiver: self selector: #bootstrapverticaltabsCssContent) 17 | ] 18 | 19 | { #category : #uploaded } 20 | TBSVerticalTabsDevelopmentLibrary >> bootstrapverticaltabsCssContent [ 21 | ^ '/*! 22 | * bootstrap-vertical-tabs - v1.1.0 23 | * https://dbtek.github.io/bootstrap-vertical-tabs 24 | * 2014-07-24 25 | * Copyright (c) 2014 İsmail Demirbilek 26 | * License: MIT 27 | */ 28 | .tabs-left, .tabs-right { 29 | border-bottom: none; 30 | padding-top: 2px; 31 | } 32 | .tabs-left { 33 | border-right: 1px solid #ddd; 34 | } 35 | .tabs-right { 36 | border-left: 1px solid #ddd; 37 | } 38 | .tabs-left>li, .tabs-right>li { 39 | float: none; 40 | margin-bottom: 2px; 41 | } 42 | .tabs-left>li { 43 | margin-right: -1px; 44 | } 45 | .tabs-right>li { 46 | margin-left: -1px; 47 | } 48 | .tabs-left>li.active>a, 49 | .tabs-left>li.active>a:hover, 50 | .tabs-left>li.active>a:focus { 51 | border-bottom-color: #ddd; 52 | border-right-color: transparent; 53 | } 54 | 55 | .tabs-right>li.active>a, 56 | .tabs-right>li.active>a:hover, 57 | .tabs-right>li.active>a:focus { 58 | border-bottom: 1px solid #ddd; 59 | border-left-color: transparent; 60 | } 61 | .tabs-left>li>a { 62 | border-radius: 4px 0 0 4px; 63 | margin-right: 0; 64 | display:block; 65 | } 66 | .tabs-right>li>a { 67 | border-radius: 0 4px 4px 0; 68 | margin-right: 0; 69 | } 70 | .sideways { 71 | margin-top:50px; 72 | border: none; 73 | position: relative; 74 | } 75 | .sideways>li { 76 | height: 20px; 77 | width: 120px; 78 | margin-bottom: 100px; 79 | } 80 | .sideways>li>a { 81 | border-bottom: 1px solid #ddd; 82 | border-right-color: transparent; 83 | text-align: center; 84 | border-radius: 4px 4px 0px 0px; 85 | } 86 | .sideways>li.active>a, 87 | .sideways>li.active>a:hover, 88 | .sideways>li.active>a:focus { 89 | border-bottom-color: transparent; 90 | border-right-color: #ddd; 91 | border-left-color: #ddd; 92 | } 93 | .sideways.tabs-left { 94 | left: -50px; 95 | } 96 | .sideways.tabs-right { 97 | right: -50px; 98 | } 99 | .sideways.tabs-right>li { 100 | -webkit-transform: rotate(90deg); 101 | -moz-transform: rotate(90deg); 102 | -ms-transform: rotate(90deg); 103 | -o-transform: rotate(90deg); 104 | transform: rotate(90deg); 105 | } 106 | .sideways.tabs-left>li { 107 | -webkit-transform: rotate(-90deg); 108 | -moz-transform: rotate(-90deg); 109 | -ms-transform: rotate(-90deg); 110 | -o-transform: rotate(-90deg); 111 | transform: rotate(-90deg); 112 | }' 113 | ] 114 | 115 | { #category : #accessing } 116 | TBSVerticalTabsDevelopmentLibrary >> selectorsToInclude [ 117 | ^ #(bootstrapverticaltabsCss) 118 | ] 119 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/TBSVerticalTabsFileLibrary.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A file library for vertical tabs. See https://github.com/dbtek/bootstrap-vertical-tabs 3 | " 4 | Class { 5 | #name : #TBSVerticalTabsFileLibrary, 6 | #superclass : #WAFileMetadataLibrary, 7 | #category : 'Bootstrap-Widgets-Libraries' 8 | } 9 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/WAHtmlCanvas.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #WAHtmlCanvas } 2 | 3 | { #category : #'*bootstrap-widgets' } 4 | WAHtmlCanvas >> tbsOffer [ 5 | "Defines an Twitter Bootstrap offer." 6 | 7 | ^ self brush: TBSOfferTag new 8 | 9 | ] 10 | 11 | { #category : #'*bootstrap-widgets' } 12 | WAHtmlCanvas >> tbsOffer: aBlock [ 13 | "Defines an Twitter Bootstrap offer." 14 | 15 | ^ self tbsOffer 16 | with: aBlock 17 | 18 | ] 19 | 20 | { #category : #'*bootstrap-widgets' } 21 | WAHtmlCanvas >> tbsOfferContent [ 22 | "Defines an Twitter Bootstrap offer content." 23 | 24 | ^ self div 25 | class: 'offer-content'; 26 | yourself 27 | ] 28 | 29 | { #category : #'*bootstrap-widgets' } 30 | WAHtmlCanvas >> tbsOfferContent: aBlock [ 31 | "Defines an Twitter Bootstrap offer content." 32 | 33 | ^ self tbsOfferContent 34 | with: aBlock 35 | 36 | ] 37 | 38 | { #category : #'*bootstrap-widgets' } 39 | WAHtmlCanvas >> tbsOfferShape [ 40 | "Defines an Twitter Bootstrap offer." 41 | 42 | ^ self div 43 | class: 'offer-shape'; 44 | yourself 45 | ] 46 | 47 | { #category : #'*bootstrap-widgets' } 48 | WAHtmlCanvas >> tbsOfferShape: aBlock [ 49 | "Defines an Twitter Bootstrap offer shape." 50 | 51 | ^ self tbsOfferShape 52 | with: aBlock 53 | 54 | ] 55 | 56 | { #category : #'*bootstrap-widgets' } 57 | WAHtmlCanvas >> tbsOfferShapeText [ 58 | "Defines an Twitter Bootstrap offer shape text." 59 | 60 | ^ self div 61 | class: 'offer-shape-text'; 62 | yourself 63 | ] 64 | 65 | { #category : #'*bootstrap-widgets' } 66 | WAHtmlCanvas >> tbsOfferShapeText: aBlock [ 67 | "Defines an Twitter Bootstrap offer shape text." 68 | 69 | ^ self tbsOfferShapeText 70 | with: aBlock 71 | 72 | ] 73 | -------------------------------------------------------------------------------- /src/Bootstrap-Widgets/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Bootstrap-Widgets' } 2 | -------------------------------------------------------------------------------- /src/ConfigurationOfBootstrap/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #ConfigurationOfBootstrap } 2 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cd run 4 | ./pharo-ui Pharo.image 5 | --------------------------------------------------------------------------------