neo.mjs 6.15.3 → 6.15.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/apps/ServiceWorker.mjs +2 -2
  2. package/apps/portal/view/Viewport.mjs +73 -10
  3. package/apps/portal/view/ViewportModel.mjs +29 -0
  4. package/apps/portal/view/learn/MainContainer.mjs +7 -10
  5. package/apps/portal/view/learn/MainContainerController.mjs +1 -1
  6. package/apps/portal/view/learn/PageSectionsContainer.mjs +51 -0
  7. package/examples/ServiceWorker.mjs +2 -2
  8. package/package.json +2 -2
  9. package/resources/data/deck/learnneo/pages/2023-10-14T19-25-08-153Z.md +0 -2
  10. package/resources/data/deck/learnneo/pages/ComponentsAndContainers.md +44 -11
  11. package/resources/data/deck/learnneo/pages/Config.md +0 -2
  12. package/resources/data/deck/learnneo/pages/CustomComponents.md +45 -0
  13. package/resources/data/deck/learnneo/pages/DescribingTheUI.md +0 -2
  14. package/resources/data/deck/learnneo/pages/Earthquakes.md +0 -2
  15. package/resources/data/deck/learnneo/pages/Events.md +0 -2
  16. package/resources/data/deck/learnneo/pages/Extending.md +0 -1
  17. package/resources/data/deck/learnneo/pages/References.md +0 -2
  18. package/resources/data/deck/learnneo/pages/Setup.md +0 -2
  19. package/resources/data/deck/learnneo/tree.json +2 -2
  20. package/resources/scss/src/apps/portal/learn/ContentView.scss +25 -20
  21. package/resources/scss/src/apps/portal/learn/LivePreview.scss +27 -6
  22. package/resources/scss/src/apps/portal/learn/MainContainer.scss +3 -33
  23. package/resources/scss/src/apps/portal/learn/PageContainer.scss +8 -4
  24. package/resources/scss/src/apps/portal/learn/PageSectionsContainer.scss +14 -0
  25. package/resources/scss/src/apps/portal/learn/PageSectionsList.scss +5 -6
  26. package/resources/scss/src/component/wrapper/MonacoEditor.scss +3 -0
  27. package/src/DefaultConfig.mjs +2 -2
  28. package/src/component/Base.mjs +0 -1
  29. package/src/component/wrapper/MonacoEditor.mjs +5 -0
  30. package/src/core/Base.mjs +24 -4
  31. package/src/form/field/ComboBox.mjs +1 -0
  32. package/src/list/Base.mjs +12 -5
  33. package/src/main/addon/IntersectionObserver.mjs +29 -5
  34. package/src/main/addon/Navigator.mjs +207 -155
  35. package/apps/portal/view/learn/PageSectionsPanel.mjs +0 -59
  36. package/resources/scss/src/apps/portal/learn/PageSectionsPanel.scss +0 -40
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.15.3'
23
+ * @member {String} version='6.15.4'
24
24
  */
25
- version: '6.15.3'
25
+ version: '6.15.4'
26
26
  }
27
27
 
28
28
  /**
@@ -1,13 +1,23 @@
1
1
  import BaseViewport from '../../../src/container/Viewport.mjs';
2
2
  import Container from '../../../src/container/Base.mjs';
3
3
  import HeaderToolbar from './HeaderToolbar.mjs';
4
+ import NeoArray from '../../../src/util/Array.mjs';
4
5
  import ViewportController from './ViewportController.mjs';
6
+ import ViewportModel from './ViewportModel.mjs';
5
7
 
6
8
  /**
7
9
  * @class Portal.view.Viewport
8
10
  * @extends Neo.container.Viewport
9
11
  */
10
12
  class Viewport extends BaseViewport {
13
+ /**
14
+ * Valid values for size
15
+ * @member {String[]} sizes=['large','medium','small','x-small',null]
16
+ * @protected
17
+ * @static
18
+ */
19
+ static sizes = ['large', 'medium', 'small', 'x-small', null]
20
+
11
21
  static config = {
12
22
  /**
13
23
  * @member {String} className='Portal.view.Viewport'
@@ -35,23 +45,76 @@ class Viewport extends BaseViewport {
35
45
  {module: () => import('./blog/Container.mjs')},
36
46
  {module: () => import('../../../docs/app/view/MainContainer.mjs')}
37
47
  ]
38
- }]
48
+ }],
49
+ /**
50
+ * @member {Neo.model.Component} model=ViewportModel
51
+ */
52
+ model: ViewportModel,
53
+ /**
54
+ * Values are: large, medium, small, xSmall
55
+ * @member {String|null} size_=null
56
+ */
57
+ size_: null
58
+ }
59
+
60
+ /**
61
+ * @param {Object} config
62
+ */
63
+ construct(config) {
64
+ super.construct(config);
65
+ this.addDomListeners([{resize: this.onResize, scope: this}])
39
66
  }
40
67
 
41
68
  /**
42
- *
69
+ * Triggered after the size config got changed
70
+ * @param {String|null} value
71
+ * @param {String|null} oldValue
72
+ * @protected
43
73
  */
44
- async onConstructed() {
45
- super.onConstructed();
74
+ afterSetSize(value, oldValue) {
75
+ if (value) {
76
+ let me = this,
77
+ cls = me.cls;
46
78
 
47
- let me = this,
48
- data = await Neo.Main.getByPath({path: 'location.search'}),
49
- searchString = data?.substr(1),
50
- search = searchString ? JSON.parse(`{"${decodeURI(searchString.replace(/&/g, "\",\"").replace(/=/g, "\":\""))}"}`) : {};
79
+ NeoArray.remove(cls, 'portal-size-' + oldValue);
80
+ NeoArray.add( cls, 'portal-size-' + value);
81
+ me.cls = cls;
51
82
 
52
- me.deck = search.deck || 'learnneo';
83
+ me.model.setData({size: value})
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Triggered before the size config gets changed
89
+ * @param {String|null} value
90
+ * @param {String|null} oldValue
91
+ * @returns {String|null}
92
+ * @protected
93
+ */
94
+ beforeSetSize(value, oldValue) {
95
+ return this.beforeSetEnumValue(value, oldValue, 'size')
96
+ }
97
+
98
+ /**
99
+ * @param {Number} width
100
+ * @returns {String}
101
+ */
102
+ getSize(width) {
103
+ if (width <= 640) {return 'x-small'}
104
+ if (width <= 1024) {return 'small'}
105
+ if (width <= 1296) {return 'medium'}
106
+ return 'large'
107
+ }
108
+
109
+ /**
110
+ * @param {Object} data
111
+ */
112
+ onResize(data) {
113
+ let me = this;
53
114
 
54
- me.addCls(me.deck)
115
+ if (me.id === data.id) {
116
+ me.size = me.getSize(data.borderBoxSize.inlineSize)
117
+ }
55
118
  }
56
119
  }
57
120
 
@@ -0,0 +1,29 @@
1
+ import Component from '../../../src/model/Component.mjs';
2
+
3
+ /**
4
+ * @class Portal.view.ViewportModel
5
+ * @extends Neo.model.Component
6
+ */
7
+ class ViewportModel extends Component {
8
+ static config = {
9
+ /**
10
+ * @member {String} className='Portal.view.ViewportModel'
11
+ * @protected
12
+ */
13
+ className: 'Portal.view.ViewportModel',
14
+ /**
15
+ * @member {Object} data
16
+ */
17
+ data: {
18
+ /**
19
+ * Values are: large, medium, small, xSmall, null
20
+ * @member {String|null} size
21
+ */
22
+ size: null
23
+ }
24
+ }
25
+ }
26
+
27
+ Neo.setupClass(ViewportModel);
28
+
29
+ export default ViewportModel;
@@ -3,7 +3,7 @@ import ContentTreeList from './ContentTreeList.mjs';
3
3
  import MainContainerController from './MainContainerController.mjs';
4
4
  import MainContainerModel from './MainContainerModel.mjs';
5
5
  import PageContainer from './PageContainer.mjs';
6
- import PageSectionsPanel from './PageSectionsPanel.mjs';
6
+ import PageSectionsContainer from './PageSectionsContainer.mjs';
7
7
  import Splitter from '../../../../src/component/Splitter.mjs';
8
8
 
9
9
  /**
@@ -30,6 +30,7 @@ class MainContainer extends Container {
30
30
  */
31
31
  items: [{
32
32
  module : Container,
33
+ bind : {hidden: data => data.size === 'x-small'},
33
34
  cls : ['sidenav-container'],
34
35
  layout : 'fit',
35
36
  minWidth: 350,
@@ -41,20 +42,16 @@ class MainContainer extends Container {
41
42
  }]
42
43
  }, {
43
44
  module : Splitter,
45
+ bind : {hidden: data => data.size === 'x-small'},
44
46
  cls : ['main-content-splitter'],
45
47
  resizeTarget: 'previous',
46
48
  size : 3
47
49
  }, {
48
50
  module: PageContainer
49
- },
50
- // {
51
- // module: Splitter,
52
- // cls : ['main-content-splitter'],
53
- // size : 3
54
- // },
55
- {
56
- module : PageSectionsPanel,
57
- reference: 'page-sections-panel',
51
+ }, {
52
+ module : PageSectionsContainer,
53
+ bind : {hidden: data => data.size !== 'large'},
54
+ reference: 'page-sections-container',
58
55
  width : 250
59
56
  }],
60
57
  /**
@@ -184,7 +184,7 @@ class MainContainerController extends Controller {
184
184
  * @param {Object} data
185
185
  */
186
186
  onIntersect(data) {
187
- let panel = this.getReference('page-sections-panel'),
187
+ let panel = this.getReference('page-sections-container'),
188
188
  list = panel.list,
189
189
  recordId = parseInt(data.data.recordId);
190
190
 
@@ -0,0 +1,51 @@
1
+ import Container from '../../../../src/container/Base.mjs';
2
+ import PageSectionsList from './PageSectionsList.mjs';
3
+
4
+ /**
5
+ * @class Portal.view.learn.PageSectionsContainer
6
+ * @extends Neo.container.Base
7
+ */
8
+ class PageSectionsContainer extends Container {
9
+ static config = {
10
+ /**
11
+ * @member {String} className='Portal.view.learn.PageSectionsContainer'
12
+ * @protected
13
+ */
14
+ className: 'Portal.view.learn.PageSectionsContainer',
15
+ /**
16
+ * @member {String[]} cls=['portal-page-sections-container']
17
+ */
18
+ cls: ['portal-page-sections-container'],
19
+ /**
20
+ * @member {Object[]} items
21
+ */
22
+ items: [{
23
+ vdom:
24
+ {cn: [
25
+ {tag: 'h3', html: 'On this page'}
26
+ ]}
27
+
28
+ }, {
29
+ module : PageSectionsList,
30
+ reference: 'list'
31
+ }],
32
+ /**
33
+ * @member {Object} layout={ntype:'vbox'}
34
+ */
35
+ layout: {
36
+ ntype: 'vbox'
37
+ }
38
+ }
39
+
40
+ /**
41
+ * Convenience shortcut
42
+ * @member {Portal.view.learn.PageSectionsList} list
43
+ */
44
+ get list() {
45
+ return this.getReference('list')
46
+ }
47
+ }
48
+
49
+ Neo.setupClass(PageSectionsContainer);
50
+
51
+ export default PageSectionsContainer;
@@ -20,9 +20,9 @@ class ServiceWorker extends ServiceBase {
20
20
  */
21
21
  singleton: true,
22
22
  /**
23
- * @member {String} version='6.15.3'
23
+ * @member {String} version='6.15.4'
24
24
  */
25
- version: '6.15.3'
25
+ version: '6.15.4'
26
26
  }
27
27
 
28
28
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  {
3
3
  "name": "neo.mjs",
4
- "version": "6.15.3",
4
+ "version": "6.15.4",
5
5
  "description": "The webworkers driven UI framework",
6
6
  "type": "module",
7
7
  "repository": {
@@ -49,7 +49,7 @@
49
49
  "chalk": "^5.3.0",
50
50
  "clean-webpack-plugin": "^4.0.0",
51
51
  "commander": "^12.0.0",
52
- "cssnano": "^6.1.1",
52
+ "cssnano": "^6.1.2",
53
53
  "envinfo": "^7.11.1",
54
54
  "fs-extra": "^11.2.0",
55
55
  "highlightjs-line-numbers.js": "^2.8.0",
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  The purpose of this tutorial is to let you see the structure of a Neo.mjs workspace,
4
2
  and the structure of an application.
5
3
 
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  Neo.mjs views are made up of components and containers.
4
2
 
5
3
  A component is a visual widget, such as a button, label, or text field. A container is a visual
@@ -88,7 +86,7 @@ class MainView extends Container {
88
86
  layout : 'fit', // If no configs are needed, simply use the ntype of the layout
89
87
  items : [{
90
88
  ntype: 'component',
91
- style: {backgroundColor: 'lightgreen'}, // The camel-cased property converts to the hyphenated css style
89
+ style: {backgroundColor: 'lightgreen'}, // The camel-cased backgroundColor property converts to the hyphenated css style
92
90
  }]
93
91
  }
94
92
  }
@@ -98,7 +96,7 @@ Neo.setupClass(MainView);
98
96
 
99
97
  ### Vbox and hbox
100
98
 
101
- Items are arranged vertically or horizontally. On-axis and off-axis alignment can be specified.
99
+ With `vbox` and `hbox`, items are arranged vertically or horizontally.
102
100
 
103
101
  <pre data-neo>
104
102
  import Button from '../../../../src/button/Base.mjs';
@@ -125,7 +123,7 @@ Neo.setupClass(MainView);
125
123
 
126
124
  ### Card
127
125
 
128
- Having multiple child items, one of which is visible.
126
+ A card container has multiple child items, one of which is visible.
129
127
 
130
128
  <pre data-neo>
131
129
  import Button from '../../../../src/button/Base.mjs';
@@ -146,7 +144,7 @@ class MainView extends Base {
146
144
  iconPosition: 'right',
147
145
  handler: data => {
148
146
  const container = data.component.up('container').getReference('cardContainer');
149
- container.layout.activeIndex = (container.layout.activeIndex +1) % container.items.length;
147
+ container.layout.activeIndex = (container.layout.activeIndex + 1) % container.items.length;
150
148
  }
151
149
  }]
152
150
  }, {
@@ -156,13 +154,13 @@ class MainView extends Base {
156
154
  flex: 1,
157
155
  items: [{
158
156
  ntype : 'component',
159
- style: {backgroundColor: 'lightsalmon'}, // The camel-cased property converts to the hyphated css style
157
+ style: {backgroundColor: 'lightsalmon'} // https://drafts.csswg.org/css-color/#named-colors
160
158
  }, {
161
159
  ntype : 'component',
162
- style: {backgroundColor: 'darkseagreen'} // https://drafts.csswg.org/css-color/#named-colors
160
+ style: {backgroundColor: 'darkseagreen'} // Who came up with these names?
163
161
  }, {
164
162
  ntype : 'component',
165
- style: {backgroundColor: 'cornflowerblue'} // Who came up with these names?
163
+ style: {backgroundColor: 'cornflowerblue'}
166
164
  }]
167
165
  }]
168
166
  }
@@ -174,7 +172,42 @@ Neo.setupClass(MainView);
174
172
 
175
173
 
176
174
 
177
- ## Reusing containers
175
+ ## Reusing components
176
+
177
+ Neo.mjs is class-based, and thus, any component or container can be defined as its own class, and reused like any
178
+ other component in the framework.
179
+
180
+ <pre data-neo>
181
+ import Button from '../../../../src/button/Base.mjs';
182
+ // In practice this would be some handy reusable component
183
+ class MySpecialButton extends Button {
184
+ static config = {
185
+ className: 'Example.view.MySpecialButton',
186
+ iconCls: 'far fa-face-grin-wide',
187
+ ui: 'ghost'
188
+ }
189
+ }
190
+
191
+ Neo.setupClass(MySpecialButton);
192
+
193
+
194
+ import Container from '../../../../src/container/Base.mjs';
195
+
196
+ class MainView extends Container {
197
+ static config = {
198
+ className: 'Example.view.MainView',
199
+ layout : {ntype:'vbox', align:'start'},
200
+ items : [{
201
+ module : Button,
202
+ iconCls: 'fa fa-home',
203
+ text : 'A framework button'
204
+ }, {
205
+ module : MySpecialButton,
206
+ text : 'My special button'
207
+ }]
208
+ }
209
+ }
178
210
 
211
+ Neo.setupClass(MainView);
212
+ </pre>
179
213
 
180
- ## Lifecycle methods
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  As you've probably noticed, Neo.mjs classes have a `static config` property.
4
2
 
5
3
  The config describes properties you can specify as you create an instance of the class.
@@ -0,0 +1,45 @@
1
+ ## Introduction
2
+
3
+ Neo.mjs is class-based, which means you're free to extend any component (or any other Neo.mjs class).
4
+
5
+
6
+ ## Overriding ancestor configs
7
+
8
+ ## Introducing new configs
9
+
10
+ ## Lifecycle config properties
11
+
12
+ <pre data-neo>
13
+ import Button from '../../../../src/button/Base.mjs';
14
+ // In practice this would be some handy reusable component
15
+ class MySpecialButton extends Button {
16
+ static config = {
17
+ className: 'Example.view.MySpecialButton',
18
+ iconCls: 'far fa-face-grin-wide',
19
+ ui: 'ghost'
20
+ }
21
+ }
22
+
23
+ Neo.setupClass(MySpecialButton);
24
+
25
+
26
+ import Container from '../../../../src/container/Base.mjs';
27
+
28
+ class MainView extends Container {
29
+ static config = {
30
+ className: 'Example.view.MainView',
31
+ layout : {ntype:'vbox', align:'start'},
32
+ items : [{
33
+ module : Button,
34
+ iconCls: 'fa fa-home',
35
+ text : 'A framework button'
36
+ }, {
37
+ module : MySpecialButton,
38
+ text : 'My special button'
39
+ }]
40
+ }
41
+ }
42
+
43
+ Neo.setupClass(MainView);
44
+ </pre>
45
+
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  A Neo.mjs view is comprised of components and containers. A component is a visual widget, like a button,
4
2
  and a container is a visual collection of components.
5
3
 
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  In this topic you'll create an application that fetches data on earthquakes in Iceland,
4
2
  and show the information in two views: a table, and a map.
5
3
 
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  All components fire events. For example, form fields fire a `change` event, various
4
2
  focus events, and others. Some other types fire events too, such as `Neo.data.Store`,
5
3
  which fires a `load` event after the store is loaded with data.
@@ -1,4 +1,3 @@
1
-
2
1
  In theory, a Neo.mjs app could be defined in a single `.mjs` source file. But that would be very hard to
3
2
  maintain, and any reusable configs would have to be duplicated. Instead, each of your views and reusable
4
3
  widgets will be defined as its own class. The result is simpler views which are inherently reusable and easier
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  Controllers often need to get references to components in order to update
4
2
  the UI or access component properties.
5
3
  There are two common ways of doing that:
@@ -1,5 +1,3 @@
1
- ## Introduction
2
-
3
1
  Setting up Neo.mjs is pretty easy &mdash; all you have to do is confirm that you have some required
4
2
  software then follow a single npx script.
5
3
 
@@ -23,9 +23,9 @@
23
23
  {"name": "Config", "parentId": "InDepth", "isLeaf": false, "id": "Config"},
24
24
  {"name": "Instance Lifecycle", "parentId": "InDepth", "isLeaf": false, "id": "InstanceLifecycle"},
25
25
  {"name": "User Input (Forms)", "parentId": "InDepth", "isLeaf": false, "id": "Forms"},
26
- {"name": "Components and Containers", "parentId": "InDepth", "isLeaf": true, "id": "ComponentsAndContainers"},
26
+ {"name": "Component and Container Basics", "parentId": "InDepth", "isLeaf": true, "id": "ComponentsAndContainers"},
27
27
  {"name": "Layouts", "parentId": "InDepth", "isLeaf": false, "id": "Layouts"},
28
- {"name": "Custom Components", "parentId": "InDepth", "isLeaf": false, "id": "CustomComponents"},
28
+ {"name": "Custom Components", "parentId": "InDepth", "isLeaf": true, "id": "CustomComponents"},
29
29
  {"name": "Events", "parentId": "InDepth", "isLeaf": true, "expanded": false, "id": "GuideEvents"},
30
30
  {"name": "Tables (Stores)", "parentId": "InDepth", "isLeaf": false, "id": "Tables"},
31
31
  {"name": "Shared Bindable Data (Component Models)", "parentId": "InDepth", "isLeaf": false, "id": "InDepthComponentModels"},
@@ -1,25 +1,25 @@
1
1
  .learn-content {
2
-
3
- max-width: 900px;
4
- padding: 0 250px 0 3rem;
5
- margin: 0 auto;
6
2
  background-color: white;
7
- border-radius: 8px;
8
- letter-spacing: 1px;
9
- overflow: unset;
3
+ border-radius : 8px;
4
+ letter-spacing : 1px;
5
+ margin : 0 auto;
6
+ max-width : 900px;
7
+ overflow : unset;
8
+ padding : 0 3rem;
9
+ width : -webkit-fill-available;
10
10
 
11
11
  pre[data-javascript] {
12
+ border : thin solid lightgray;
12
13
  border-radius: 4px;
13
- padding: 12px;
14
- border: thin solid lightgray;
14
+ padding : 12px;
15
15
  }
16
16
 
17
17
  p {
18
- margin: 0.5em 0em 0.7em 0em;
18
+ margin: 0.5em 0 0.7em 0;
19
19
  }
20
20
 
21
21
  details summary {
22
- cursor: pointer;
22
+ cursor : pointer;
23
23
  transition: margin 300ms ease-out;
24
24
  }
25
25
 
@@ -28,12 +28,11 @@
28
28
  }
29
29
 
30
30
  details summary {
31
- list-style: none;
32
- color: #555;
33
- display: flex;
34
- /* also removes the list marker */
35
31
  align-items: center;
32
+ color : #555;
33
+ display : flex;
36
34
  font-weight: bold;
35
+ list-style : none;
37
36
  }
38
37
 
39
38
  details summary::before {
@@ -45,11 +44,11 @@
45
44
  }
46
45
 
47
46
  details summary::before {
48
- color: #c4c4c4;
47
+ color : #c4c4c4;
49
48
  font-family: var(--fa-style-family, "Font Awesome 6 Free");
50
- font-size: 1em;
49
+ font-size : 1em;
51
50
  font-weight: var(--fa-style, 900);
52
- margin: 0.4em 0.4em 0.4em 0;
51
+ margin : 0.4em 0.4em 0.4em 0;
53
52
  }
54
53
 
55
54
  summary::-webkit-details-marker {
@@ -61,8 +60,8 @@
61
60
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
62
61
  transition: 0.3s;
63
62
  /* Add some padding inside the card container */
64
- padding: 2px 16px;
65
- font-size: 1em;
63
+ padding : 2px 16px;
64
+ font-size : 1em;
66
65
  margin-bottom: 1em;
67
66
  }
68
67
 
@@ -71,3 +70,9 @@
71
70
  box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
72
71
  }
73
72
  }
73
+
74
+ .portal-size-large {
75
+ .learn-content {
76
+ padding: 0 250px 0 3rem;
77
+ }
78
+ }
@@ -1,8 +1,29 @@
1
1
  .learn-live-preview {
2
- textarea {
3
- height: 100%;
4
- font-family: monospace !important;
5
- }
6
-
7
2
  margin-bottom: 2em;
8
- }
3
+
4
+ .live-preview-container {
5
+ border-radius: calc(var(--cmp-tab-strip-height) + var(--cmp-button-borderradius));
6
+ box-shadow : rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0px 4px 6px -2px;
7
+ overflow : hidden;
8
+
9
+ .neo-tab-header-toolbar {
10
+ background-color : var(--sem-color-surface-neutral-default);
11
+ border : 1px solid #e6e6e6;
12
+ border-top-left-radius : calc(var(--cmp-tab-strip-height) + var(--cmp-button-borderradius));
13
+ border-top-right-radius: calc(var(--cmp-tab-strip-height) + var(--cmp-button-borderradius));
14
+ padding : var(--cmp-tab-strip-height);
15
+ }
16
+
17
+ .neo-tab-strip {
18
+ margin-top: calc(var(--cmp-tab-strip-height) * (-1) - 1px);
19
+ }
20
+
21
+ .neo-tab-content-container {
22
+ background-color : transparent;
23
+ border : 1px solid #e6e6e6;
24
+ border-bottom-left-radius : calc(var(--cmp-tab-strip-height) + var(--cmp-button-borderradius));
25
+ border-bottom-right-radius: calc(var(--cmp-tab-strip-height) + var(--cmp-button-borderradius));
26
+ border-top : 0;
27
+ }
28
+ }
29
+ }