@operato/data-grist 2.0.0-alpha.146 → 2.0.0-alpha.148

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 (152) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/demo/data-grist-test.html +1 -1
  3. package/demo/index.html +1 -1
  4. package/dist/src/data-card/data-card-field.js +2 -2
  5. package/dist/src/data-card/data-card-field.js.map +1 -1
  6. package/dist/src/data-card/data-card-gutter-menu.js +5 -5
  7. package/dist/src/data-card/data-card-gutter-menu.js.map +1 -1
  8. package/dist/src/data-card/data-card-gutter.js +8 -6
  9. package/dist/src/data-card/data-card-gutter.js.map +1 -1
  10. package/dist/src/data-card/data-card.js +7 -9
  11. package/dist/src/data-card/data-card.js.map +1 -1
  12. package/dist/src/data-card/record-card.js +9 -10
  13. package/dist/src/data-card/record-card.js.map +1 -1
  14. package/dist/src/data-grid/data-grid-accum-field.js +5 -3
  15. package/dist/src/data-grid/data-grid-accum-field.js.map +1 -1
  16. package/dist/src/data-grid/data-grid-body-style.js +1 -1
  17. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  18. package/dist/src/data-grid/data-grid-body.js +3 -3
  19. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  20. package/dist/src/data-grid/data-grid-footer.js +2 -2
  21. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  22. package/dist/src/data-grid/data-grid-header.js +4 -4
  23. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  24. package/dist/src/data-grid/data-grid.js +13 -1
  25. package/dist/src/data-grid/data-grid.js.map +1 -1
  26. package/dist/src/data-list/data-list-field.js +5 -5
  27. package/dist/src/data-list/data-list-field.js.map +1 -1
  28. package/dist/src/data-list/data-list-gutter.js +3 -3
  29. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  30. package/dist/src/data-list/data-list.js +4 -4
  31. package/dist/src/data-list/data-list.js.map +1 -1
  32. package/dist/src/data-list/record-partial.js +9 -10
  33. package/dist/src/data-list/record-partial.js.map +1 -1
  34. package/dist/src/editors/ox-input-tree.js +7 -7
  35. package/dist/src/editors/ox-input-tree.js.map +1 -1
  36. package/dist/src/filters/filter-input-barcode.js +1 -0
  37. package/dist/src/filters/filter-input-barcode.js.map +1 -1
  38. package/dist/src/filters/filter-styles.js +25 -19
  39. package/dist/src/filters/filter-styles.js.map +1 -1
  40. package/dist/src/filters/filters-form.js +4 -0
  41. package/dist/src/filters/filters-form.js.map +1 -1
  42. package/dist/src/gutters/gutter-dirty.js +1 -1
  43. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  44. package/dist/src/renderers/ox-grist-renderer-tree.js +7 -7
  45. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  46. package/dist/src/sorters/sorters-control.js +3 -3
  47. package/dist/src/sorters/sorters-control.js.map +1 -1
  48. package/dist/stories/accumulator-format.stories.d.ts +5 -0
  49. package/dist/stories/accumulator-format.stories.js +17 -4
  50. package/dist/stories/accumulator-format.stories.js.map +1 -1
  51. package/dist/stories/barcode-input-filter.stories.d.ts +5 -0
  52. package/dist/stories/barcode-input-filter.stories.js +19 -5
  53. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  54. package/dist/stories/bounded-select-filters.stories.d.ts +5 -0
  55. package/dist/stories/bounded-select-filters.stories.js +21 -7
  56. package/dist/stories/bounded-select-filters.stories.js.map +1 -1
  57. package/dist/stories/bounded-select-record.stories.d.ts +5 -0
  58. package/dist/stories/bounded-select-record.stories.js +21 -7
  59. package/dist/stories/bounded-select-record.stories.js.map +1 -1
  60. package/dist/stories/creatable-only-column.stories.d.ts +5 -0
  61. package/dist/stories/creatable-only-column.stories.js +34 -21
  62. package/dist/stories/creatable-only-column.stories.js.map +1 -1
  63. package/dist/stories/default-filters.stories.d.ts +5 -0
  64. package/dist/stories/default-filters.stories.js +31 -17
  65. package/dist/stories/default-filters.stories.js.map +1 -1
  66. package/dist/stories/dynamic-editable.stories.d.ts +5 -0
  67. package/dist/stories/dynamic-editable.stories.js +34 -21
  68. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  69. package/dist/stories/empty-sorters.stories.d.ts +7 -1
  70. package/dist/stories/empty-sorters.stories.js +31 -17
  71. package/dist/stories/empty-sorters.stories.js.map +1 -1
  72. package/dist/stories/explicit-fetch.stories.d.ts +5 -0
  73. package/dist/stories/explicit-fetch.stories.js +30 -17
  74. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  75. package/dist/stories/fixed-column.stories.d.ts +5 -0
  76. package/dist/stories/fixed-column.stories.js +34 -21
  77. package/dist/stories/fixed-column.stories.js.map +1 -1
  78. package/dist/stories/grid-setting.stories.d.ts +5 -0
  79. package/dist/stories/grid-setting.stories.js +41 -15
  80. package/dist/stories/grid-setting.stories.js.map +1 -1
  81. package/dist/stories/grist-modes.stories.d.ts +5 -0
  82. package/dist/stories/grist-modes.stories.js +39 -26
  83. package/dist/stories/grist-modes.stories.js.map +1 -1
  84. package/dist/stories/group-header.stories.d.ts +5 -0
  85. package/dist/stories/group-header.stories.js +34 -21
  86. package/dist/stories/group-header.stories.js.map +1 -1
  87. package/dist/stories/textarea.stories.d.ts +5 -0
  88. package/dist/stories/textarea.stories.js +27 -13
  89. package/dist/stories/textarea.stories.js.map +1 -1
  90. package/dist/stories/tree-column-with-checkbox.stories.d.ts +5 -0
  91. package/dist/stories/tree-column-with-checkbox.stories.js +34 -21
  92. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  93. package/dist/stories/tree-column.stories.d.ts +5 -0
  94. package/dist/stories/tree-column.stories.js +34 -21
  95. package/dist/stories/tree-column.stories.js.map +1 -1
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +6 -6
  98. package/src/data-card/data-card-field.ts +2 -2
  99. package/src/data-card/data-card-gutter-menu.ts +5 -5
  100. package/src/data-card/data-card-gutter.ts +8 -6
  101. package/src/data-card/data-card.ts +7 -9
  102. package/src/data-card/record-card.ts +9 -10
  103. package/src/data-grid/data-grid-accum-field.ts +5 -3
  104. package/src/data-grid/data-grid-body-style.ts +1 -1
  105. package/src/data-grid/data-grid-body.ts +4 -3
  106. package/src/data-grid/data-grid-footer.ts +2 -2
  107. package/src/data-grid/data-grid-header.ts +4 -4
  108. package/src/data-grid/data-grid.ts +13 -1
  109. package/src/data-list/data-list-field.ts +5 -5
  110. package/src/data-list/data-list-gutter.ts +3 -3
  111. package/src/data-list/data-list.ts +4 -4
  112. package/src/data-list/record-partial.ts +9 -10
  113. package/src/editors/ox-input-tree.ts +7 -7
  114. package/src/filters/filter-input-barcode.ts +1 -0
  115. package/src/filters/filter-styles.ts +25 -19
  116. package/src/filters/filters-form.ts +4 -0
  117. package/src/gutters/gutter-dirty.ts +1 -1
  118. package/src/renderers/ox-grist-renderer-tree.ts +7 -7
  119. package/src/sorters/sorters-control.ts +3 -3
  120. package/stories/accumulator-format.stories.ts +20 -5
  121. package/stories/barcode-input-filter.stories.ts +21 -6
  122. package/stories/bounded-select-filters.stories.ts +24 -8
  123. package/stories/bounded-select-record.stories.ts +24 -8
  124. package/stories/creatable-only-column.stories.ts +42 -28
  125. package/stories/default-filters.stories.ts +39 -24
  126. package/stories/dynamic-editable.stories.ts +42 -28
  127. package/stories/empty-sorters.stories.ts +41 -25
  128. package/stories/explicit-fetch.stories.ts +38 -24
  129. package/stories/fixed-column.stories.ts +42 -28
  130. package/stories/grid-setting.stories.ts +44 -16
  131. package/stories/grist-modes.stories.ts +53 -33
  132. package/stories/group-header.stories.ts +42 -28
  133. package/stories/textarea.stories.ts +35 -14
  134. package/stories/tree-column-with-checkbox.stories.ts +42 -28
  135. package/stories/tree-column.stories.ts +42 -28
  136. package/themes/dark-hc.css +151 -0
  137. package/themes/dark-mc.css +151 -0
  138. package/themes/dark.css +151 -0
  139. package/themes/grist-theme.css +99 -100
  140. package/themes/light-hc.css +151 -0
  141. package/themes/light-mc.css +151 -0
  142. package/themes/light.css +151 -0
  143. package/themes/md-typescale-styles.css +100 -0
  144. package/themes/spacing.css +43 -0
  145. package/themes/state-color.css +6 -0
  146. package/dist/stories/accumulator-format.stories copy.d.ts +0 -40
  147. package/dist/stories/accumulator-format.stories copy.js +0 -232
  148. package/dist/stories/accumulator-format.stories copy.js.map +0 -1
  149. package/themes/app-theme.css +0 -145
  150. package/themes/form-theme.css +0 -75
  151. package/themes/oops-theme.css +0 -26
  152. package/themes/report-theme.css +0 -47
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -180,7 +181,8 @@ export default {
180
181
  title: 'dynamic-editable for ox-grist',
181
182
  component: 'ox-grist',
182
183
  argTypes: {
183
- headerFilter: { control: 'boolean' }
184
+ headerFilter: { control: 'boolean' },
185
+ theme: { control: 'select', options: ['light', 'dark'] }
184
186
  }
185
187
  }
186
188
 
@@ -192,10 +194,18 @@ interface Story<T> {
192
194
 
193
195
  interface ArgTypes {
194
196
  headerFilter: boolean
197
+ theme: 'light' | 'dark'
195
198
  }
196
199
 
197
- const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
198
- html` <link
200
+ const Template: Story<ArgTypes> = ({ headerFilter, theme = 'light' }: ArgTypes) =>
201
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
202
+
203
+ <link href="/themes/light.css" rel="stylesheet" />
204
+ <link href="/themes/dark.css" rel="stylesheet" />
205
+ <link href="/themes/spacing.css" rel="stylesheet" />
206
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
207
+
208
+ <link
199
209
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
200
210
  rel="stylesheet"
201
211
  />
@@ -208,15 +218,19 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
208
218
  rel="stylesheet"
209
219
  />
210
220
 
211
- <link href="/themes/app-theme.css" rel="stylesheet" />
212
- <link href="/themes/oops-theme.css" rel="stylesheet" />
213
- <link href="/themes/grist-theme.css" rel="stylesheet" />
221
+ <style>
222
+ ${MDTypeScaleStyles.cssText}
223
+ </style>
214
224
 
215
225
  <style>
216
226
  ${CommonGristStyles.cssText}
217
227
  ${CommonHeaderStyles.cssText}
218
228
  </style>
219
229
 
230
+ <script>
231
+ document.body.classList.add('${theme}')
232
+ </script>
233
+
220
234
  <style>
221
235
  ox-grist {
222
236
  height: 600px;
@@ -237,31 +251,31 @@ const Template: Story<ArgTypes> = ({ headerFilter }: ArgTypes) =>
237
251
  console.log(name, number, chk)
238
252
  }}
239
253
  >
240
- <div slot="headroom">
241
- <div id="filters">
254
+ <div slot="headroom" class="header">
255
+ <div class="filters">
242
256
  <ox-filters-form></ox-filters-form>
243
- </div>
244
257
 
245
- <div id="sorters">
246
- Sort
247
- <md-icon
248
- @click=${(e: Event) => {
249
- const target = e.currentTarget as HTMLElement
250
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
251
- right: 0,
252
- top: target.offsetTop + target.offsetHeight
253
- })
254
- }}
255
- >expand_more</md-icon
256
- >
257
- <ox-popup id="sorter-control">
258
- <ox-sorters-control> </ox-sorters-control>
259
- </ox-popup>
260
- </div>
258
+ <div id="sorters">
259
+ Sort
260
+ <md-icon
261
+ @click=${(e: Event) => {
262
+ const target = e.currentTarget as HTMLElement
263
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
264
+ right: 0,
265
+ top: target.offsetTop + target.offsetHeight
266
+ })
267
+ }}
268
+ >expand_more</md-icon
269
+ >
270
+ <ox-popup id="sorter-control">
271
+ <ox-sorters-control> </ox-sorters-control>
272
+ </ox-popup>
273
+ </div>
261
274
 
262
- <ox-record-creator id="add" light-popup>
263
- <button><md-icon>add</md-icon></button>
264
- </ox-record-creator>
275
+ <ox-record-creator id="add" light-popup>
276
+ <button><md-icon>add</md-icon></button>
277
+ </ox-record-creator>
278
+ </div>
265
279
  </div>
266
280
  </ox-grist>`
267
281
 
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -92,7 +93,9 @@ const config = {
92
93
  export default {
93
94
  title: 'empty sorters for ox-grist',
94
95
  component: 'ox-grist',
95
- argTypes: {}
96
+ argTypes: {
97
+ theme: { control: 'select', options: ['light', 'dark'] }
98
+ }
96
99
  }
97
100
 
98
101
  interface Story<T> {
@@ -101,10 +104,19 @@ interface Story<T> {
101
104
  argTypes?: Record<string, unknown>
102
105
  }
103
106
 
104
- interface ArgTypes {}
107
+ interface ArgTypes {
108
+ theme: 'light' | 'dark'
109
+ }
110
+
111
+ const Template: Story<ArgTypes> = ({ theme = 'light' }: ArgTypes) =>
112
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
105
113
 
106
- const Template: Story<ArgTypes> = ({}: ArgTypes) =>
107
- html` <link
114
+ <link href="/themes/light.css" rel="stylesheet" />
115
+ <link href="/themes/dark.css" rel="stylesheet" />
116
+ <link href="/themes/spacing.css" rel="stylesheet" />
117
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
118
+
119
+ <link
108
120
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
109
121
  rel="stylesheet"
110
122
  />
@@ -117,15 +129,19 @@ const Template: Story<ArgTypes> = ({}: ArgTypes) =>
117
129
  rel="stylesheet"
118
130
  />
119
131
 
120
- <link href="/themes/app-theme.css" rel="stylesheet" />
121
- <link href="/themes/oops-theme.css" rel="stylesheet" />
122
- <link href="/themes/grist-theme.css" rel="stylesheet" />
132
+ <style>
133
+ ${MDTypeScaleStyles.cssText}
134
+ </style>
123
135
 
124
136
  <style>
125
137
  ${CommonGristStyles.cssText}
126
138
  ${CommonHeaderStyles.cssText}
127
139
  </style>
128
140
 
141
+ <script>
142
+ document.body.classList.add('${theme}')
143
+ </script>
144
+
129
145
  <style>
130
146
  ox-grist {
131
147
  height: 600px;
@@ -142,26 +158,26 @@ const Template: Story<ArgTypes> = ({}: ArgTypes) =>
142
158
  .fetchHandler=${fetchHandler}
143
159
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
144
160
  >
145
- <div slot="headroom">
146
- <div id="filters">
161
+ <div slot="headroom" class="header">
162
+ <div class="filters">
147
163
  <ox-filters-form></ox-filters-form>
148
- </div>
149
164
 
150
- <div id="sorters">
151
- Sort
152
- <md-icon
153
- @click=${(e: Event) => {
154
- const target = e.currentTarget as HTMLElement
155
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
156
- right: 0,
157
- top: target.offsetTop + target.offsetHeight
158
- })
159
- }}
160
- >expand_more</md-icon
161
- >
162
- <ox-popup id="sorter-control">
163
- <ox-sorters-control> </ox-sorters-control>
164
- </ox-popup>
165
+ <div id="sorters">
166
+ Sort
167
+ <md-icon
168
+ @click=${(e: Event) => {
169
+ const target = e.currentTarget as HTMLElement
170
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
171
+ right: 0,
172
+ top: target.offsetTop + target.offsetHeight
173
+ })
174
+ }}
175
+ >expand_more</md-icon
176
+ >
177
+ <ox-popup id="sorter-control">
178
+ <ox-sorters-control> </ox-sorters-control>
179
+ </ox-popup>
180
+ </div>
165
181
  </div>
166
182
  </div>
167
183
  </ox-grist>`
@@ -5,6 +5,7 @@ import '@operato/popup/ox-popup-list.js'
5
5
  import '@material/web/icon/icon.js'
6
6
 
7
7
  import { html, TemplateResult } from 'lit'
8
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
8
9
 
9
10
  import { FetchHandler } from '../src/types.js'
10
11
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
@@ -94,7 +95,8 @@ export default {
94
95
  title: 'explicit-fetch attribute for ox-grist',
95
96
  component: 'ox-grist',
96
97
  argTypes: {
97
- explicitFetch: { control: 'boolean' }
98
+ explicitFetch: { control: 'boolean' },
99
+ theme: { control: 'select', options: ['light', 'dark'] }
98
100
  }
99
101
  }
100
102
 
@@ -106,10 +108,18 @@ interface Story<T> {
106
108
 
107
109
  interface ArgTypes {
108
110
  explicitFetch: boolean
111
+ theme: 'light' | 'dark'
109
112
  }
110
113
 
111
- const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
112
- html` <link
114
+ const Template: Story<ArgTypes> = ({ explicitFetch = false, theme = 'light' }: ArgTypes) =>
115
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
116
+
117
+ <link href="/themes/light.css" rel="stylesheet" />
118
+ <link href="/themes/dark.css" rel="stylesheet" />
119
+ <link href="/themes/spacing.css" rel="stylesheet" />
120
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
121
+
122
+ <link
113
123
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
114
124
  rel="stylesheet"
115
125
  />
@@ -122,15 +132,19 @@ const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
122
132
  rel="stylesheet"
123
133
  />
124
134
 
125
- <link href="/themes/app-theme.css" rel="stylesheet" />
126
- <link href="/themes/oops-theme.css" rel="stylesheet" />
127
- <link href="/themes/grist-theme.css" rel="stylesheet" />
135
+ <style>
136
+ ${MDTypeScaleStyles.cssText}
137
+ </style>
128
138
 
129
139
  <style>
130
140
  ${CommonGristStyles.cssText}
131
141
  ${CommonHeaderStyles.cssText}
132
142
  </style>
133
143
 
144
+ <script>
145
+ document.body.classList.add('${theme}')
146
+ </script>
147
+
134
148
  <style>
135
149
  ox-grist {
136
150
  height: 600px;
@@ -148,26 +162,26 @@ const Template: Story<ArgTypes> = ({ explicitFetch = false }: ArgTypes) =>
148
162
  .fetchHandler=${fetchHandler}
149
163
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
150
164
  >
151
- <div slot="headroom">
152
- <div id="filters">
165
+ <div slot="headroom" class="header">
166
+ <div class="filters">
153
167
  <ox-filters-form></ox-filters-form>
154
- </div>
155
168
 
156
- <div id="sorters">
157
- Sort
158
- <md-icon
159
- @click=${(e: Event) => {
160
- const target = e.currentTarget as HTMLElement
161
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
162
- right: 0,
163
- top: target.offsetTop + target.offsetHeight
164
- })
165
- }}
166
- >expand_more</md-icon
167
- >
168
- <ox-popup id="sorter-control">
169
- <ox-sorters-control> </ox-sorters-control>
170
- </ox-popup>
169
+ <div id="sorters">
170
+ Sort
171
+ <md-icon
172
+ @click=${(e: Event) => {
173
+ const target = e.currentTarget as HTMLElement
174
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
175
+ right: 0,
176
+ top: target.offsetTop + target.offsetHeight
177
+ })
178
+ }}
179
+ >expand_more</md-icon
180
+ >
181
+ <ox-popup id="sorter-control">
182
+ <ox-sorters-control> </ox-sorters-control>
183
+ </ox-popup>
184
+ </div>
171
185
  </div>
172
186
  </div>
173
187
  </ox-grist>`
@@ -6,6 +6,7 @@ import '@operato/popup/ox-popup-list.js'
6
6
  import '@material/web/icon/icon.js'
7
7
 
8
8
  import { html, TemplateResult } from 'lit'
9
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
9
10
 
10
11
  import {
11
12
  ColumnConfig,
@@ -317,7 +318,8 @@ export default {
317
318
  title: 'fixed column',
318
319
  component: 'ox-grist',
319
320
  argTypes: {
320
- config: { control: 'object' }
321
+ config: { control: 'object' },
322
+ theme: { control: 'select', options: ['light', 'dark'] }
321
323
  }
322
324
  }
323
325
 
@@ -329,10 +331,18 @@ interface Story<T> {
329
331
 
330
332
  interface ArgTypes {
331
333
  config: object
334
+ theme: 'light' | 'dark'
332
335
  }
333
336
 
334
- const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
335
- html` <link
337
+ const Template: Story<ArgTypes> = ({ config, theme = 'light' }: ArgTypes) =>
338
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
339
+
340
+ <link href="/themes/light.css" rel="stylesheet" />
341
+ <link href="/themes/dark.css" rel="stylesheet" />
342
+ <link href="/themes/spacing.css" rel="stylesheet" />
343
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
344
+
345
+ <link
336
346
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
337
347
  rel="stylesheet"
338
348
  />
@@ -345,15 +355,19 @@ const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
345
355
  rel="stylesheet"
346
356
  />
347
357
 
348
- <link href="/themes/app-theme.css" rel="stylesheet" />
349
- <link href="/themes/oops-theme.css" rel="stylesheet" />
350
- <link href="/themes/grist-theme.css" rel="stylesheet" />
358
+ <style>
359
+ ${MDTypeScaleStyles.cssText}
360
+ </style>
351
361
 
352
362
  <style>
353
363
  ${CommonGristStyles.cssText}
354
364
  ${CommonHeaderStyles.cssText}
355
365
  </style>
356
366
 
367
+ <script>
368
+ document.body.classList.add('${theme}')
369
+ </script>
370
+
357
371
  <style>
358
372
  ox-grist {
359
373
  height: 600px;
@@ -370,31 +384,31 @@ const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
370
384
  .fetchHandler=${fetchHandler}
371
385
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
372
386
  >
373
- <div slot="headroom">
374
- <div id="filters">
387
+ <div slot="headroom" class="header">
388
+ <div class="filters">
375
389
  <ox-filters-form autofocus></ox-filters-form>
376
- </div>
377
390
 
378
- <div id="sorters">
379
- Sort
380
- <md-icon
381
- @click=${(e: Event) => {
382
- const target = e.currentTarget as HTMLElement
383
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
384
- right: 0,
385
- top: target.offsetTop + target.offsetHeight
386
- })
387
- }}
388
- >expand_more</md-icon
389
- >
390
- <ox-popup id="sorter-control">
391
- <ox-sorters-control> </ox-sorters-control>
392
- </ox-popup>
393
- </div>
391
+ <div id="sorters">
392
+ Sort
393
+ <md-icon
394
+ @click=${(e: Event) => {
395
+ const target = e.currentTarget as HTMLElement
396
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
397
+ right: 0,
398
+ top: target.offsetTop + target.offsetHeight
399
+ })
400
+ }}
401
+ >expand_more</md-icon
402
+ >
403
+ <ox-popup id="sorter-control">
404
+ <ox-sorters-control> </ox-sorters-control>
405
+ </ox-popup>
406
+ </div>
394
407
 
395
- <ox-record-creator id="add" light-popup>
396
- <button><md-icon>add</md-icon></button>
397
- </ox-record-creator>
408
+ <ox-record-creator id="add" light-popup>
409
+ <button><md-icon>add</md-icon></button>
410
+ </ox-record-creator>
411
+ </div>
398
412
  </div>
399
413
  </ox-grist>`
400
414
 
@@ -11,6 +11,7 @@ import '../src/personalizer/ox-grist-personalizer.js'
11
11
  import '../src/personalizer/ox-grist-filter-personalizer.js'
12
12
 
13
13
  import { html, TemplateResult } from 'lit'
14
+ import { styles as MDTypeScaleStyles } from '@material/web/typography/md-typescale-styles'
14
15
 
15
16
  import { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
16
17
 
@@ -345,6 +346,7 @@ export default {
345
346
  config: { control: 'object' },
346
347
  mode: { control: 'select', options: ['GRID', 'LIST', 'CARD'] },
347
348
  urlParamsSensitive: { control: 'boolean' },
349
+ theme: { control: 'select', options: ['light', 'dark'] },
348
350
  withoutSearch: { control: 'boolean' },
349
351
  debug: { control: 'boolean' }
350
352
  }
@@ -362,6 +364,7 @@ interface ArgTypes {
362
364
  urlParamsSensitive: boolean
363
365
  withoutSearch: boolean
364
366
  fetchHandler: FetchHandler
367
+ theme: 'light' | 'dark'
365
368
  debug: boolean
366
369
  }
367
370
 
@@ -382,9 +385,17 @@ const Template: Story<ArgTypes> = ({
382
385
  urlParamsSensitive = false,
383
386
  withoutSearch = false,
384
387
  debug = false,
385
- fetchHandler
388
+ fetchHandler,
389
+ theme = 'light'
386
390
  }: ArgTypes) =>
387
- html` <link
391
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
392
+
393
+ <link href="/themes/light.css" rel="stylesheet" />
394
+ <link href="/themes/dark.css" rel="stylesheet" />
395
+ <link href="/themes/spacing.css" rel="stylesheet" />
396
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
397
+
398
+ <link
388
399
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
389
400
  rel="stylesheet"
390
401
  />
@@ -397,9 +408,9 @@ const Template: Story<ArgTypes> = ({
397
408
  rel="stylesheet"
398
409
  />
399
410
 
400
- <link href="/themes/app-theme.css" rel="stylesheet" />
401
- <link href="/themes/oops-theme.css" rel="stylesheet" />
402
- <link href="/themes/grist-theme.css" rel="stylesheet" />
411
+ <style>
412
+ ${MDTypeScaleStyles.cssText}
413
+ </style>
403
414
 
404
415
  <style>
405
416
  ${CommonGristStyles.cssText} ${CommonHeaderStyles.cssText}
@@ -441,22 +452,39 @@ const Template: Story<ArgTypes> = ({
441
452
  ?url-params-sensitive=${urlParamsSensitive}
442
453
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
443
454
  >
444
- <div slot="headroom">
445
- <div id="filters">
455
+ <div slot="headroom" class="header">
456
+ <div class="filters">
446
457
  <ox-filters-form autofocus ?without-search=${withoutSearch}>
447
458
  <ox-grist-filter-personalizer slot="setting"></ox-grist-filter-personalizer>
448
459
  </ox-filters-form>
449
- </div>
450
460
 
451
- <div id="modes">
452
- <md-icon @click=${() => (mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</md-icon>
453
- <md-icon @click=${() => (mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</md-icon>
454
- <md-icon @click=${() => (mode = 'CARD')} ?active=${mode == 'CARD'}>apps</md-icon>
455
- </div>
461
+ <div id="sorters">
462
+ Sort
463
+ <md-icon
464
+ @click=${(e: Event) => {
465
+ const target = e.currentTarget as HTMLElement
466
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
467
+ right: 0,
468
+ top: target.offsetTop + target.offsetHeight
469
+ })
470
+ }}
471
+ >expand_more</md-icon
472
+ >
473
+ <ox-popup id="sorter-control">
474
+ <ox-sorters-control> </ox-sorters-control>
475
+ </ox-popup>
476
+ </div>
477
+
478
+ <div id="modes">
479
+ <md-icon @click=${() => (mode = 'GRID')} ?active=${mode == 'GRID'}>grid_on</md-icon>
480
+ <md-icon @click=${() => (mode = 'LIST')} ?active=${mode == 'LIST'}>format_list_bulleted</md-icon>
481
+ <md-icon @click=${() => (mode = 'CARD')} ?active=${mode == 'CARD'}>apps</md-icon>
482
+ </div>
456
483
 
457
- <ox-record-creator id="add" light-popup>
458
- <button><md-icon>add</md-icon></button>
459
- </ox-record-creator>
484
+ <ox-record-creator id="add" light-popup>
485
+ <button><md-icon>add</md-icon></button>
486
+ </ox-record-creator>
487
+ </div>
460
488
  </div>
461
489
 
462
490
  <ox-grist-personalizer slot="setting" ?debug=${debug}></ox-grist-personalizer>