@operato/context 2.0.0-alpha.99 → 2.0.0-beta.0

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 (67) hide show
  1. package/CHANGELOG.md +454 -0
  2. package/dist/src/layouts/ox-context-page-toolbar.js +15 -13
  3. package/dist/src/layouts/ox-context-page-toolbar.js.map +1 -1
  4. package/dist/src/layouts/ox-context-toolbar.js +21 -25
  5. package/dist/src/layouts/ox-context-toolbar.js.map +1 -1
  6. package/dist/src/tools/ox-page-action-context-bar.d.ts +3 -2
  7. package/dist/src/tools/ox-page-action-context-bar.js +74 -49
  8. package/dist/src/tools/ox-page-action-context-bar.js.map +1 -1
  9. package/dist/src/tools/ox-page-action-overlay-template.d.ts +1 -0
  10. package/dist/src/tools/ox-page-action-overlay-template.js +29 -21
  11. package/dist/src/tools/ox-page-action-overlay-template.js.map +1 -1
  12. package/dist/src/tools/ox-page-title-bar.js +9 -8
  13. package/dist/src/tools/ox-page-title-bar.js.map +1 -1
  14. package/dist/src/tools/ox-title-bar.js +13 -12
  15. package/dist/src/tools/ox-title-bar.js.map +1 -1
  16. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.d.ts +5 -0
  17. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.js +59 -30
  18. package/dist/stories/ox-context-page-toolbar-select-buttons.stories.js.map +1 -1
  19. package/dist/stories/ox-context-page-toolbar-select.stories.d.ts +5 -0
  20. package/dist/stories/ox-context-page-toolbar-select.stories.js +60 -25
  21. package/dist/stories/ox-context-page-toolbar-select.stories.js.map +1 -1
  22. package/dist/stories/ox-context-page-toolbar.stories.d.ts +5 -0
  23. package/dist/stories/ox-context-page-toolbar.stories.js +53 -26
  24. package/dist/stories/ox-context-page-toolbar.stories.js.map +1 -1
  25. package/dist/stories/ox-context-toolbar-complex.stories.d.ts +7 -1
  26. package/dist/stories/ox-context-toolbar-complex.stories.js +31 -8
  27. package/dist/stories/ox-context-toolbar-complex.stories.js.map +1 -1
  28. package/dist/stories/ox-context-toolbar-cooldown.stories.d.ts +18 -0
  29. package/dist/stories/ox-context-toolbar-cooldown.stories.js +100 -0
  30. package/dist/stories/ox-context-toolbar-cooldown.stories.js.map +1 -0
  31. package/dist/stories/ox-context-toolbar-empty.stories.d.ts +7 -2
  32. package/dist/stories/ox-context-toolbar-empty.stories.js +32 -18
  33. package/dist/stories/ox-context-toolbar-empty.stories.js.map +1 -1
  34. package/dist/stories/ox-context-toolbar-overflow.stories.d.ts +7 -1
  35. package/dist/stories/ox-context-toolbar-overflow.stories.js +35 -9
  36. package/dist/stories/ox-context-toolbar-overflow.stories.js.map +1 -1
  37. package/dist/stories/ox-context-toolbar.stories.d.ts +1 -0
  38. package/dist/stories/ox-context-toolbar.stories.js +32 -7
  39. package/dist/stories/ox-context-toolbar.stories.js.map +1 -1
  40. package/dist/tsconfig.tsbuildinfo +1 -1
  41. package/package.json +8 -8
  42. package/src/layouts/ox-context-page-toolbar.ts +15 -13
  43. package/src/layouts/ox-context-toolbar.ts +21 -25
  44. package/src/tools/ox-page-action-context-bar.ts +76 -48
  45. package/src/tools/ox-page-action-overlay-template.ts +30 -22
  46. package/src/tools/ox-page-title-bar.ts +9 -8
  47. package/src/tools/ox-title-bar.ts +13 -12
  48. package/stories/ox-context-page-toolbar-select-buttons.stories.ts +122 -91
  49. package/stories/ox-context-page-toolbar-select.stories.ts +93 -57
  50. package/stories/ox-context-page-toolbar.stories.ts +92 -63
  51. package/stories/ox-context-toolbar-complex.stories.ts +34 -9
  52. package/stories/ox-context-toolbar-cooldown.stories.ts +112 -0
  53. package/stories/ox-context-toolbar-empty.stories.ts +36 -19
  54. package/stories/ox-context-toolbar-overflow.stories.ts +38 -10
  55. package/stories/ox-context-toolbar.stories.ts +35 -8
  56. package/themes/dark-hc.css +51 -0
  57. package/themes/dark-mc.css +51 -0
  58. package/themes/dark.css +51 -0
  59. package/themes/light-hc.css +51 -0
  60. package/themes/light-mc.css +51 -0
  61. package/themes/light.css +57 -0
  62. package/themes/md-typescale-styles.css +100 -0
  63. package/themes/spacing.css +13 -0
  64. package/themes/state-color.css +6 -0
  65. package/themes/app-theme.css +0 -161
  66. package/themes/context-theme.css +0 -74
  67. package/themes/material-theme.css +0 -88
@@ -1,7 +1,8 @@
1
1
  import '@material/web/icon/icon.js'
2
+ import '@material/web/chips/assist-chip.js'
2
3
  import './ox-page-action-overlay-template.js'
3
4
 
4
- import { css, html, LitElement, PropertyValues } from 'lit'
5
+ import { css, html, LitElement, nothing, PropertyValues } from 'lit'
5
6
  import { customElement, property, query, state } from 'lit/decorators.js'
6
7
  import throttle from 'lodash-es/throttle'
7
8
  import { connect } from 'pwa-helpers/connect-mixin'
@@ -19,35 +20,52 @@ export class PageActionContextBar extends connect(store)(LitElement) {
19
20
  css`
20
21
  :host {
21
22
  display: flex;
22
- overflow: hidden;
23
- gap: var(--padding-narrow);
24
23
  }
25
24
 
26
25
  :host *:focus {
27
26
  outline: none;
28
27
  }
29
28
 
29
+ [container] {
30
+ flex: 1;
31
+
32
+ display: flex;
33
+ overflow: hidden;
34
+ gap: var(--spacing-small);
35
+ padding: 2px; /* only for button shadow */
36
+ align-items: center;
37
+ }
38
+
30
39
  [more] {
31
40
  position: absolute;
32
41
  top: 0;
33
42
  right: 0;
34
- background-color: var(--context-action-bar-more-button-background-color);
43
+ background-color: var(--md-sys-color-inverse-surface);
35
44
  box-shadow: -2px 0px 2px 1px rgba(0, 0, 0, 0.2);
36
- padding: var(--context-action-bar-more-button-padding);
37
- color: var(--context-action-bar-more-button-color);
38
- padding: 11px 10px;
45
+ padding: var(--context-action-bar-more-button-padding, 11px 10px);
46
+ color: var(--md-sys-color-inverse-on-surface);
39
47
  font-size: 2rem;
40
48
  }
41
49
 
42
50
  select,
43
51
  input[type='text'] {
44
- background-color: var(--button-background-color, #fafbfc);
45
- border: 1px solid rgba(var(--primary-color-rgb), 0.5);
46
- border-radius: var(--button-border-radius);
47
- padding: 0 var(--padding-narrow);
52
+ box-sizing: border-box;
53
+ padding: 0 var(--spacing-small);
54
+ height: var(--form-element-height-medium);
55
+ border: 1px solid var(--md-sys-color-outline);
56
+ border-radius: var(--md-sys-shape-corner-small);
57
+ background-color: var(--md-sys-color-on-primary);
58
+ font-size: var(--md-sys-typescale-label-large-size, 0.875rem);
59
+ color: var(--md-sys-color-on-primary-container);
60
+ outline: none;
61
+ }
62
+
63
+ md-icon[working] {
64
+ animation: rotate 1s linear infinite;
65
+ }
48
66
 
49
- font-size: var(--fontsize-default);
50
- color: var(--secondary-color);
67
+ md-assist-chip[icon-only] {
68
+ --md-assist-chip-trailing-space: 0;
51
69
  }
52
70
 
53
71
  @media screen and (max-width: 460px) {
@@ -111,17 +129,21 @@ export class PageActionContextBar extends connect(store)(LitElement) {
111
129
  }
112
130
 
113
131
  render() {
114
- return html`
115
- ${this.renderActions()}
116
- ${this.overflown ? html` <md-icon more @click=${this.showMore.bind(this)}>more_horiz</md-icon> ` : html``}
117
- `
132
+ return this.actions.length > 0
133
+ ? html`
134
+ <div container>
135
+ ${this.renderActions()}
136
+ ${this.overflown ? html` <md-icon more @click=${this.showMore.bind(this)}>more_horiz</md-icon> ` : html``}
137
+ </div>
138
+ `
139
+ : nothing
118
140
  }
119
141
 
120
142
  renderActions() {
121
143
  return html`
122
144
  ${this.actions.map(($action, idx) => {
123
145
  let { type, title, icon, action, select, href, emphasis } = $action as any
124
- let { outlined, raised, dense, danger, filled } = emphasis || {}
146
+ let { raised, danger } = emphasis || {}
125
147
 
126
148
  return type == 'text'
127
149
  ? html` <span @click=${action}>${title}</span> `
@@ -133,37 +155,43 @@ export class PageActionContextBar extends connect(store)(LitElement) {
133
155
  `
134
156
  : type == 'link'
135
157
  ? html` <a href=${href}>${title}</a> `
136
- : type == 'icon'
137
- ? html`<md-icon @click=${action}>${icon}</md-icon>`
138
- : html`
139
- <button
140
- ?dense=${dense}
141
- ?raised=${raised}
142
- ?outlined=${outlined}
143
- ?danger=${danger}
144
- ?filled=${filled}
145
- @click=${async (e: MouseEvent) => {
146
- /* all actions should be bloked for a second */
147
- const button = e.currentTarget as any
148
- button.icon = 'rotate_right'
149
- button.setAttribute('working', true)
150
- button.disabled = true
151
-
152
- try {
153
- await action()
154
- } finally {
155
- await sleep(1000)
156
- button.disabled = false
157
- /* because icon can be changed after sleep, don't use closure 'icon'. */
158
- button.icon = this.actions[idx]?.icon || 'done_all'
159
- button.removeAttribute('working')
158
+ : html`
159
+ <md-assist-chip
160
+ ?icon-only=${type == 'icon' || !title}
161
+ ?elevated=${raised}
162
+ ?danger=${danger}
163
+ label=${title}
164
+ @click=${async (e: MouseEvent) => {
165
+ /* all actions should be bloked for a second */
166
+ const button = e.currentTarget as any
167
+ const iconElement = button.querySelector('[slot="icon"]')
168
+ if (iconElement) {
169
+ icon = this.actions[idx].icon
170
+ this.actions[idx].icon = 'refresh'
171
+ this.requestUpdate()
172
+ iconElement.setAttribute('working', true)
173
+ }
174
+ button.disabled = true
175
+
176
+ try {
177
+ await action()
178
+ } finally {
179
+ await sleep(1000) /* waiting for additionla 1 second */
180
+
181
+ /* because icon can be changed after sleep, don't use closure 'icon'. */
182
+ if (iconElement) {
183
+ this.actions[idx].icon = icon
184
+ this.requestUpdate()
185
+ iconElement.removeAttribute('working')
160
186
  }
161
- }}
162
- >
163
- <md-icon>${icon || 'done_all'}</md-icon>
164
- ${title}
165
- </button>
166
- `
187
+
188
+ button.disabled = false
189
+ }
190
+ }}
191
+ >
192
+ <md-icon slot="icon">${this.actions[idx].icon}</md-icon>
193
+ </md-assist-chip>
194
+ `
167
195
  })}
168
196
  `
169
197
  }
@@ -1,4 +1,5 @@
1
1
  import '@material/web/icon/icon.js'
2
+ import '@material/web/chips/assist-chip.js'
2
3
 
3
4
  import { css, html, LitElement } from 'lit'
4
5
  import { customElement, property, query, state } from 'lit/decorators.js'
@@ -21,15 +22,20 @@ export class PageActionOverlayTemplate extends connect(store)(LitElement) {
21
22
  :host {
22
23
  display: flex;
23
24
  flex-wrap: wrap;
24
- gap: var(--padding-narrow);
25
+ gap: var(--spacing-small);
26
+ align-items: center;
25
27
  }
28
+
26
29
  :host *:focus {
27
30
  outline: none;
28
31
  }
29
32
 
30
- button {
31
- background-color: var(--main-section-background-color);
32
- border-radius: var(--context-action-bar-more-button-border-radius);
33
+ md-icon[working] {
34
+ animation: rotate 1s linear infinite;
35
+ }
36
+
37
+ md-assist-chip[icon-only] {
38
+ --md-assist-chip-trailing-space: 0;
33
39
  }
34
40
 
35
41
  @keyframes rotate {
@@ -50,7 +56,7 @@ export class PageActionOverlayTemplate extends connect(store)(LitElement) {
50
56
  return html`
51
57
  ${this.actions.map(($action, idx) => {
52
58
  let { type, title, icon, action, select, href, emphasis } = $action as any
53
- let { outlined, raised, dense, danger, filled } = emphasis || {}
59
+ let { raised, danger } = emphasis || {}
54
60
 
55
61
  return type == 'text'
56
62
  ? html` <span>${title}</span> `
@@ -63,35 +69,37 @@ export class PageActionOverlayTemplate extends connect(store)(LitElement) {
63
69
  : type == 'link'
64
70
  ? html` <a href=${href}>${title}</a> `
65
71
  : html`
66
- <button
67
- ?dense=${dense}
68
- ?raised=${raised}
69
- ?outlined=${outlined}
72
+ <md-assist-chip
73
+ ?icon-only=${type == 'icon' || !title}
74
+ ?elevated=${raised}
70
75
  ?danger=${danger}
71
- ?filled=${filled}
76
+ label=${title}
72
77
  @click=${async (e: MouseEvent) => {
73
78
  /* all actions should be bloked for a second */
74
79
  const button = e.currentTarget as any
75
- button.icon = 'rotate_right'
76
- button.setAttribute('working', true)
80
+ const iconElement = button.querySelector('[slot="icon"]')
81
+ if (iconElement) {
82
+ iconElement.textContent = 'refresh'
83
+ iconElement.setAttribute('working', true)
84
+ }
77
85
  button.disabled = true
78
86
 
79
87
  try {
80
- action()
88
+ await action()
81
89
  } finally {
82
- await sleep(1000)
83
- button.disabled = false
84
- /* because icon can be changed after sleep, don't use closure 'icon'. */
85
- button.icon = this.actions[idx]?.icon || 'done_all'
86
- button.removeAttribute('working')
90
+ await sleep(1000) /* waiting for additionla 1 second */
87
91
 
88
- window.history.back()
92
+ /* because icon can be changed after sleep, don't use closure 'icon'. */
93
+ if (iconElement) {
94
+ iconElement.textContent = this.actions[idx]?.icon
95
+ iconElement.removeAttribute('working')
96
+ }
97
+ button.disabled = false
89
98
  }
90
99
  }}
91
100
  >
92
- <md-icon>${icon || 'done_all'}</md-icon>
93
- ${title}
94
- </button>
101
+ <md-icon slot="icon">${icon || 'done_all'}</md-icon>
102
+ </md-assist-chip>
95
103
  `
96
104
  })}
97
105
  `
@@ -17,20 +17,21 @@ export class PageTitleBar extends connect(store)(LitElement) {
17
17
  display: flex;
18
18
  align-items: center;
19
19
 
20
- --help-icon-color: var(--primary-text-color);
21
- --help-icon-hover-color: var(--secondary-text-color);
20
+ --help-icon-color: var(--md-sys-color-on-surface);
21
+ --help-icon-hover-color: var(--md-sys-color-on-surface-variant);
22
22
  --help-icon-opacity: 0.2;
23
23
  --help-icon-size: 20px;
24
24
 
25
25
  --md-icon-size: 20px;
26
26
 
27
- --input-search-padding: var(--padding-narrow);
27
+ --input-search-padding: var(--spacing-small);
28
28
  --input-search-font: normal 14px var(--theme-font);
29
29
  }
30
30
 
31
31
  [titler] {
32
32
  display: flex;
33
- padding: var(--padding-default) var(--padding-narrow) var(--padding-narrow) var(--padding-narrow);
33
+ padding: var(--spacing-small);
34
+ padding-top: var(--spacing-medium);
34
35
  font: var(--context-toolbar-title);
35
36
  color: var(--title-text-color);
36
37
  }
@@ -52,7 +53,7 @@ export class PageTitleBar extends connect(store)(LitElement) {
52
53
  }
53
54
 
54
55
  [search] [help] {
55
- color: var(--secondary-color);
56
+ color: var(--md-sys-color-on-secondary-container);
56
57
  }
57
58
 
58
59
  [search] {
@@ -61,11 +62,11 @@ export class PageTitleBar extends connect(store)(LitElement) {
61
62
  align-items: center;
62
63
 
63
64
  align-self: center;
64
- color: var(--secondary-color);
65
+ color: var(--md-sys-color-on-secondary-container);
65
66
  background-color: var(--opacity-light-color);
66
- border-radius: 999em;
67
+ border-radius: var(--md-sys-shape-corner-full);
67
68
  margin-left: auto;
68
- padding: 0 10px;
69
+ padding: 0 var(--spacing-medium);
69
70
  }
70
71
 
71
72
  [search] > * {
@@ -16,15 +16,14 @@ export class TitleBar extends connect(store)(LitElement) {
16
16
  display: flex;
17
17
  align-items: center;
18
18
 
19
- --help-icon-color: #fff;
20
- --help-icon-hover-color: #fff;
19
+ --help-icon-color: var(--md-sys-color-primary);
20
+ --help-icon-hover-color: var(--md-sys-color-primary);
21
21
  --help-icon-opacity: 0.2;
22
22
  --help-icon-size: 20px;
23
23
 
24
24
  --md-icon-size: 20px;
25
25
 
26
- --input-search-padding: 7px;
27
- --input-search-border-bottom: none;
26
+ --input-search-padding: var(--spacing-medium);
28
27
  --input-search-focus-border-bottom: none;
29
28
  --input-search-font: normal 16px var(--theme-font);
30
29
  }
@@ -50,25 +49,27 @@ export class TitleBar extends connect(store)(LitElement) {
50
49
  color: var(--help-icon-hover-color);
51
50
  }
52
51
 
53
- [search] [help] {
54
- color: var(--secondary-color);
55
- }
56
-
57
52
  [search] {
58
53
  display: flex;
59
54
  justify-content: space-between;
60
55
  align-items: center;
61
56
 
62
57
  align-self: center;
63
- color: var(--secondary-color);
64
- background-color: var(--opacity-light-color);
65
- border-radius: 999em;
66
- padding: 0 10px;
58
+ color: var(--md-sys-color-primary);
59
+ background-color: var(--md-sys-color-on-primary);
60
+ border-radius: var(--md-sys-shape-corner-full);
61
+ padding: 0 var(--spacing-medium);
67
62
  }
68
63
 
69
64
  [search] > * {
70
65
  align-self: center;
71
66
  }
67
+
68
+ ox-input-search {
69
+ color: var(--md-sys-color-primary);
70
+ background-color: var(--md-sys-color-on-primary);
71
+ border-radius: var(--md-sys-shape-corner-full);
72
+ }
72
73
  `
73
74
  ]
74
75
 
@@ -8,12 +8,14 @@ import { TOOL_POSITION } from '@operato/layout'
8
8
  import '@operato/styles'
9
9
 
10
10
  import { css, html, render, TemplateResult } from 'lit'
11
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
11
12
 
12
13
  export default {
13
14
  title: 'ox-context-page-toolbar select buttons',
14
15
  component: 'ox-context-page-toolbar',
15
16
  argTypes: {
16
- label: { control: 'string' }
17
+ label: { control: 'string' },
18
+ theme: { control: 'select', options: ['light', 'dark'] }
17
19
  }
18
20
  }
19
21
 
@@ -25,112 +27,141 @@ interface Story<T> {
25
27
 
26
28
  interface ArgTypes {
27
29
  label?: string
30
+ theme?: string
28
31
  }
29
32
 
30
- const Template: Story<ArgTypes> = ({ label = '' }: ArgTypes) => html`
31
- <link href="/themes/app-theme.css" rel="stylesheet" />
32
- <link href="/themes/material-theme.css" rel="stylesheet" />
33
-
34
- <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1" rel="stylesheet">
35
- <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1" rel="stylesheet">
36
- <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1" rel="stylesheet">
33
+ const Template: Story<ArgTypes> = ({ label = '', theme = 'light' }: ArgTypes) => html`
34
+ <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
35
+
36
+ <link href="/themes/light.css" rel="stylesheet" />
37
+ <link href="/themes/dark.css" rel="stylesheet" />
38
+ <link href="/themes/spacing.css" rel="stylesheet" />
39
+
40
+ <link
41
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
42
+ rel="stylesheet"
43
+ />
44
+ <link
45
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
46
+ rel="stylesheet"
47
+ />
48
+ <link
49
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
50
+ rel="stylesheet"
51
+ />
52
+
53
+ <style>
54
+ ${MDTypeScaleStyles.cssText}
55
+ </style>
37
56
 
38
57
  <style>
39
- body {
40
- background-color: white;
58
+ .container {
59
+ height: 500px;
60
+ text-align: center;
61
+ padding: 20px;
62
+ background-color: var(--md-sys-color-primary-container);
63
+ color: var(--md-sys-color-on-primary-container);
64
+
65
+ padding: 20px;
41
66
  }
42
67
 
43
- ${CommonHeaderStyles.cssText}
68
+ ox-buttons-radio {
69
+ padding: 20px;
70
+ }
44
71
  </style>
45
72
 
46
- <div style="height:600px;">
73
+ <script>
74
+ document.body.classList.add('${theme}')
75
+ </script>
76
+
77
+ <div class="container md-typescale-body-large-prominent">
47
78
  <div class="header">
48
- <div class="title">
49
- ${label}
50
- </div>
79
+ <div class="title">${label}</div>
51
80
 
52
81
  <div class="filters">
53
- <label>Filter-X</label><input type="text" name="name"></input>
82
+ <label>Filter-X</label><input type="text" name="name" />
54
83
  <ox-input-select-buttons
55
- @change=${(e: Event) => {
56
- console.log((e.target as HTMLInputElement).value)
57
- }}
58
- name="wearables"
59
- .value=${'Gloves'}
60
- .options=${[
61
- { display: 'SHOOSE', value: 'Shoose' },
62
- { display: 'CHOTHES', value: 'Clothes' },
63
- { display: 'GLOVES', value: 'Gloves' }
64
- ]}
65
- multiple
66
- ></ox-input-select-buttons>
84
+ @change=${(e: Event) => {
85
+ console.log((e.target as HTMLInputElement).value)
86
+ }}
87
+ name="wearables"
88
+ .value=${'Gloves'}
89
+ .options=${[
90
+ { display: 'SHOOSE', value: 'Shoose' },
91
+ { display: 'CHOTHES', value: 'Clothes' },
92
+ { display: 'GLOVES', value: 'Gloves' }
93
+ ]}
94
+ multiple
95
+ ></ox-input-select-buttons>
67
96
  </div>
68
97
 
69
- <ox-context-page-toolbar class="actions"
70
- .tools=${[
71
- {
72
- position: TOOL_POSITION.FRONT,
73
- template: html` <md-icon>download</md-icon> `,
74
- context: 'exportable'
75
- },
76
- {
77
- position: TOOL_POSITION.FRONT,
78
- template: html` <md-icon>upload</md-icon> `,
79
- context: 'importable'
80
- },
81
- {
82
- position: TOOL_POSITION.CENTER,
83
- template: html`<ox-page-action-context-bar
84
- .actions=${[
85
- {
86
- title: 'save',
87
- action: () => {},
88
- icon: 'save'
89
- },
90
- {
91
- title: 'copy',
92
- action: () => {},
93
- icon: 'content_copy',
94
- emphasis: {
95
- outlined: true
96
- }
97
- },
98
- {
99
- title: 'edit',
100
- action: () => {},
101
- icon: 'content_copy',
102
- emphasis: {
103
- outlined: true
98
+ <ox-context-page-toolbar
99
+ class="actions"
100
+ .tools=${[
101
+ {
102
+ position: TOOL_POSITION.FRONT,
103
+ template: html` <md-icon>download</md-icon> `,
104
+ context: 'exportable'
105
+ },
106
+ {
107
+ position: TOOL_POSITION.FRONT,
108
+ template: html` <md-icon>upload</md-icon> `,
109
+ context: 'importable'
110
+ },
111
+ {
112
+ position: TOOL_POSITION.CENTER,
113
+ template: html`<ox-page-action-context-bar
114
+ .actions=${[
115
+ {
116
+ title: 'save',
117
+ action: () => {},
118
+ icon: 'save'
119
+ },
120
+ {
121
+ title: 'copy',
122
+ action: () => {},
123
+ icon: 'content_copy',
124
+ emphasis: {
125
+ outlined: true
126
+ }
127
+ },
128
+ {
129
+ title: 'edit',
130
+ action: () => {},
131
+ icon: 'content_copy',
132
+ emphasis: {
133
+ outlined: true
134
+ }
135
+ },
136
+ {
137
+ title: 'hoppaang',
138
+ action: () => {},
139
+ icon: '',
140
+ emphasis: {
141
+ outlined: true
142
+ }
143
+ },
144
+ {
145
+ title: 'delete',
146
+ action: () => {},
147
+ icon: 'delete',
148
+ emphasis: {
149
+ danger: true,
150
+ filled: true
151
+ }
104
152
  }
105
- },
106
- {
107
- title: 'hoppaang',
108
- action: () => {},
109
- icon: '',
110
- emphasis: {
111
- outlined: true
112
- }
113
- },
114
- {
115
- title: 'delete',
116
- action: () => {},
117
- icon: 'delete',
118
- emphasis: {
119
- danger: true,
120
- filled: true
121
- }
122
- }
123
- ]}
124
- ></ox-page-action-context-bar>`
153
+ ]}
154
+ ></ox-page-action-context-bar>`
155
+ }
156
+ ]}
157
+ .context=${{
158
+ exportable: true,
159
+ importable: true,
160
+ toolbar: false
161
+ }}
125
162
  }
126
- ]}
127
- .context=${{
128
- exportable: true,
129
- importable: true,
130
- toolbar: false
131
- }}
132
-
133
- }> </ox-context-page-toolbar>
163
+ >
164
+ </ox-context-page-toolbar>
134
165
  </div>
135
166
  </div>
136
167
  `