@operato/data-grist 2.0.0-alpha.99 → 2.0.0-beta.1

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 (216) hide show
  1. package/CHANGELOG.md +441 -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 +6 -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 +12 -5
  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 +12 -0
  17. package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
  18. package/dist/src/data-grid/data-grid-body.d.ts +0 -1
  19. package/dist/src/data-grid/data-grid-body.js +14 -21
  20. package/dist/src/data-grid/data-grid-body.js.map +1 -1
  21. package/dist/src/data-grid/data-grid-field.js +8 -2
  22. package/dist/src/data-grid/data-grid-field.js.map +1 -1
  23. package/dist/src/data-grid/data-grid-footer.js +4 -2
  24. package/dist/src/data-grid/data-grid-footer.js.map +1 -1
  25. package/dist/src/data-grid/data-grid-header.js +9 -6
  26. package/dist/src/data-grid/data-grid-header.js.map +1 -1
  27. package/dist/src/data-grid/data-grid.js +23 -1
  28. package/dist/src/data-grid/data-grid.js.map +1 -1
  29. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js +3 -0
  30. package/dist/src/data-grid/event-handlers/data-grid-body-click-handler.js.map +1 -1
  31. package/dist/src/data-grist.d.ts +10 -2
  32. package/dist/src/data-grist.js +71 -8
  33. package/dist/src/data-grist.js.map +1 -1
  34. package/dist/src/data-list/data-list-field.js +5 -5
  35. package/dist/src/data-list/data-list-field.js.map +1 -1
  36. package/dist/src/data-list/data-list-gutter.js +3 -3
  37. package/dist/src/data-list/data-list-gutter.js.map +1 -1
  38. package/dist/src/data-list/data-list.js +4 -4
  39. package/dist/src/data-list/data-list.js.map +1 -1
  40. package/dist/src/data-list/record-partial.js +9 -10
  41. package/dist/src/data-list/record-partial.js.map +1 -1
  42. package/dist/src/data-manipulator.d.ts +1 -1
  43. package/dist/src/data-manipulator.js +5 -5
  44. package/dist/src/data-manipulator.js.map +1 -1
  45. package/dist/src/data-report/data-report-field.js +2 -1
  46. package/dist/src/data-report/data-report-field.js.map +1 -1
  47. package/dist/src/data-report/data-report-header.js +2 -2
  48. package/dist/src/data-report/data-report-header.js.map +1 -1
  49. package/dist/src/editors/ox-grist-editor-select.js +37 -25
  50. package/dist/src/editors/ox-grist-editor-select.js.map +1 -1
  51. package/dist/src/editors/ox-input-tree.js +8 -8
  52. package/dist/src/editors/ox-input-tree.js.map +1 -1
  53. package/dist/src/filters/filter-input-barcode.js +1 -0
  54. package/dist/src/filters/filter-input-barcode.js.map +1 -1
  55. package/dist/src/filters/filter-select.js +30 -16
  56. package/dist/src/filters/filter-select.js.map +1 -1
  57. package/dist/src/filters/filter-styles.js +46 -31
  58. package/dist/src/filters/filter-styles.js.map +1 -1
  59. package/dist/src/filters/filters-form.d.ts +15 -4
  60. package/dist/src/filters/filters-form.js +205 -70
  61. package/dist/src/filters/filters-form.js.map +1 -1
  62. package/dist/src/gutters/gutter-dirty.js +2 -2
  63. package/dist/src/gutters/gutter-dirty.js.map +1 -1
  64. package/dist/src/index.d.ts +1 -0
  65. package/dist/src/index.js +1 -0
  66. package/dist/src/index.js.map +1 -1
  67. package/dist/src/personalizer/index.d.ts +1 -0
  68. package/dist/src/personalizer/index.js +2 -0
  69. package/dist/src/personalizer/index.js.map +1 -0
  70. package/dist/src/personalizer/ox-grist-filter-personalizer.d.ts +8 -0
  71. package/dist/src/personalizer/ox-grist-filter-personalizer.js +177 -0
  72. package/dist/src/personalizer/ox-grist-filter-personalizer.js.map +1 -0
  73. package/dist/src/personalizer/ox-grist-personalizer.d.ts +8 -0
  74. package/dist/src/personalizer/ox-grist-personalizer.js +178 -0
  75. package/dist/src/personalizer/ox-grist-personalizer.js.map +1 -0
  76. package/dist/src/record-view/record-creator.js +2 -2
  77. package/dist/src/record-view/record-creator.js.map +1 -1
  78. package/dist/src/renderers/ox-grist-renderer-select.js +34 -4
  79. package/dist/src/renderers/ox-grist-renderer-select.js.map +1 -1
  80. package/dist/src/renderers/ox-grist-renderer-tree.js +8 -8
  81. package/dist/src/renderers/ox-grist-renderer-tree.js.map +1 -1
  82. package/dist/src/sorters/sorters-control.js +3 -3
  83. package/dist/src/sorters/sorters-control.js.map +1 -1
  84. package/dist/src/types.d.ts +41 -2
  85. package/dist/src/types.js.map +1 -1
  86. package/dist/stories/{accumulator.stories.d.ts → accumulator-format.stories.d.ts} +9 -0
  87. package/dist/stories/{accumulator.stories.js → accumulator-format.stories.js} +24 -12
  88. package/dist/stories/accumulator-format.stories.js.map +1 -0
  89. package/dist/stories/barcode-input-filter.stories.d.ts +5 -0
  90. package/dist/stories/barcode-input-filter.stories.js +29 -5
  91. package/dist/stories/barcode-input-filter.stories.js.map +1 -1
  92. package/dist/stories/bounded-select-filters.stories.d.ts +30 -0
  93. package/dist/stories/bounded-select-filters.stories.js +288 -0
  94. package/dist/stories/bounded-select-filters.stories.js.map +1 -0
  95. package/dist/stories/bounded-select-record.stories.d.ts +30 -0
  96. package/dist/stories/bounded-select-record.stories.js +291 -0
  97. package/dist/stories/bounded-select-record.stories.js.map +1 -0
  98. package/dist/stories/click-event.stories.d.ts +41 -0
  99. package/dist/stories/click-event.stories.js +234 -0
  100. package/dist/stories/click-event.stories.js.map +1 -0
  101. package/dist/stories/creatable-only-column.stories.d.ts +5 -0
  102. package/dist/stories/creatable-only-column.stories.js +46 -21
  103. package/dist/stories/creatable-only-column.stories.js.map +1 -1
  104. package/dist/stories/default-filters.stories.d.ts +5 -0
  105. package/dist/stories/default-filters.stories.js +84 -17
  106. package/dist/stories/default-filters.stories.js.map +1 -1
  107. package/dist/stories/dynamic-editable.stories.d.ts +5 -0
  108. package/dist/stories/dynamic-editable.stories.js +44 -21
  109. package/dist/stories/dynamic-editable.stories.js.map +1 -1
  110. package/dist/stories/empty-sorters.stories.d.ts +7 -1
  111. package/dist/stories/empty-sorters.stories.js +41 -17
  112. package/dist/stories/empty-sorters.stories.js.map +1 -1
  113. package/dist/stories/explicit-fetch.stories.d.ts +5 -0
  114. package/dist/stories/explicit-fetch.stories.js +40 -17
  115. package/dist/stories/explicit-fetch.stories.js.map +1 -1
  116. package/dist/stories/fixed-column.stories.d.ts +5 -0
  117. package/dist/stories/fixed-column.stories.js +53 -30
  118. package/dist/stories/fixed-column.stories.js.map +1 -1
  119. package/dist/stories/grid-setting.stories.d.ts +20 -4
  120. package/dist/stories/grid-setting.stories.js +96 -51
  121. package/dist/stories/grid-setting.stories.js.map +1 -1
  122. package/dist/stories/grist-modes.stories.d.ts +8 -2
  123. package/dist/stories/grist-modes.stories.js +58 -35
  124. package/dist/stories/grist-modes.stories.js.map +1 -1
  125. package/dist/stories/group-header.stories.d.ts +5 -0
  126. package/dist/stories/group-header.stories.js +53 -30
  127. package/dist/stories/group-header.stories.js.map +1 -1
  128. package/dist/stories/textarea.stories.d.ts +8 -2
  129. package/dist/stories/textarea.stories.js +37 -13
  130. package/dist/stories/textarea.stories.js.map +1 -1
  131. package/dist/stories/tree-column-with-checkbox.stories.d.ts +5 -0
  132. package/dist/stories/tree-column-with-checkbox.stories.js +44 -21
  133. package/dist/stories/tree-column-with-checkbox.stories.js.map +1 -1
  134. package/dist/stories/tree-column.stories.d.ts +5 -0
  135. package/dist/stories/tree-column.stories.js +44 -21
  136. package/dist/stories/tree-column.stories.js.map +1 -1
  137. package/dist/tsconfig.tsbuildinfo +1 -1
  138. package/docs/default-value/value-generator/date-generator.md +29 -0
  139. package/docs/default-value/value-generator/hour-time-generator.md +33 -0
  140. package/docs/default-value/value-generator/minute-time-generator.md +33 -0
  141. package/docs/default-value/value-generator/month-date-generator.md +2 -0
  142. package/docs/default-value/value-generator/now-generator.md +29 -0
  143. package/docs/default-value/value-generator/time-generator.md +31 -0
  144. package/docs/default-value/value-generator/today-generator.md +29 -0
  145. package/docs/default-value/value-generator/week-date-generator.md +31 -0
  146. package/docs/default-value/value-generator/year-date-generator.md +31 -0
  147. package/package.json +15 -10
  148. package/src/data-card/data-card-field.ts +2 -2
  149. package/src/data-card/data-card-gutter-menu.ts +5 -5
  150. package/src/data-card/data-card-gutter.ts +6 -6
  151. package/src/data-card/data-card.ts +7 -9
  152. package/src/data-card/record-card.ts +9 -10
  153. package/src/data-grid/data-grid-accum-field.ts +11 -5
  154. package/src/data-grid/data-grid-body-style.ts +12 -0
  155. package/src/data-grid/data-grid-body.ts +16 -29
  156. package/src/data-grid/data-grid-field.ts +7 -2
  157. package/src/data-grid/data-grid-footer.ts +4 -2
  158. package/src/data-grid/data-grid-header.ts +8 -6
  159. package/src/data-grid/data-grid.ts +23 -1
  160. package/src/data-grid/event-handlers/data-grid-body-click-handler.ts +4 -0
  161. package/src/data-grist.ts +88 -8
  162. package/src/data-list/data-list-field.ts +5 -5
  163. package/src/data-list/data-list-gutter.ts +3 -3
  164. package/src/data-list/data-list.ts +4 -4
  165. package/src/data-list/record-partial.ts +9 -10
  166. package/src/data-manipulator.ts +5 -5
  167. package/src/data-report/data-report-field.ts +2 -1
  168. package/src/data-report/data-report-header.ts +2 -2
  169. package/src/editors/ox-grist-editor-select.ts +41 -28
  170. package/src/editors/ox-input-tree.ts +8 -8
  171. package/src/filters/filter-input-barcode.ts +1 -0
  172. package/src/filters/filter-select.ts +41 -28
  173. package/src/filters/filter-styles.ts +46 -31
  174. package/src/filters/filters-form.ts +273 -119
  175. package/src/gutters/gutter-dirty.ts +2 -2
  176. package/src/index.ts +1 -0
  177. package/src/personalizer/index.ts +1 -0
  178. package/src/personalizer/ox-grist-filter-personalizer.ts +191 -0
  179. package/src/personalizer/ox-grist-personalizer.ts +192 -0
  180. package/src/record-view/record-creator.ts +2 -2
  181. package/src/renderers/ox-grist-renderer-select.ts +41 -6
  182. package/src/renderers/ox-grist-renderer-tree.ts +8 -8
  183. package/src/sorters/sorters-control.ts +3 -3
  184. package/src/types.ts +53 -2
  185. package/stories/{accumulator.stories.ts → accumulator-format.stories.ts} +33 -12
  186. package/stories/barcode-input-filter.stories.ts +31 -6
  187. package/stories/bounded-select-filters.stories.ts +339 -0
  188. package/stories/bounded-select-record.stories.ts +342 -0
  189. package/stories/click-event.stories.ts +269 -0
  190. package/stories/creatable-only-column.stories.ts +54 -28
  191. package/stories/default-filters.stories.ts +92 -24
  192. package/stories/dynamic-editable.stories.ts +52 -28
  193. package/stories/empty-sorters.stories.ts +51 -25
  194. package/stories/explicit-fetch.stories.ts +48 -24
  195. package/stories/fixed-column.stories.ts +62 -39
  196. package/stories/grid-setting.stories.ts +120 -63
  197. package/stories/grist-modes.stories.ts +74 -46
  198. package/stories/group-header.stories.ts +61 -39
  199. package/stories/textarea.stories.ts +49 -17
  200. package/stories/tree-column-with-checkbox.stories.ts +52 -28
  201. package/stories/tree-column.stories.ts +52 -28
  202. package/themes/dark-hc.css +151 -0
  203. package/themes/dark-mc.css +151 -0
  204. package/themes/dark.css +151 -0
  205. package/themes/grist-theme.css +103 -100
  206. package/themes/light-hc.css +151 -0
  207. package/themes/light-mc.css +151 -0
  208. package/themes/light.css +151 -0
  209. package/themes/md-typescale-styles.css +100 -0
  210. package/themes/spacing.css +43 -0
  211. package/themes/state-color.css +6 -0
  212. package/dist/stories/accumulator.stories.js.map +0 -1
  213. package/themes/app-theme.css +0 -145
  214. package/themes/form-theme.css +0 -75
  215. package/themes/oops-theme.css +0 -26
  216. package/themes/report-theme.css +0 -47
@@ -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 { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
11
12
 
@@ -17,6 +18,7 @@ import {
17
18
  GristRecord,
18
19
  ValidationCallback
19
20
  } from '../src/types.js'
21
+ import { OxPrompt } from '@operato/popup'
20
22
 
21
23
  const fetchHandler: FetchHandler = async ({ page, limit }) => {
22
24
  var total = 120993
@@ -186,20 +188,17 @@ const config = {
186
188
  filter: 'search',
187
189
  sortable: true,
188
190
  width: 130,
189
- validation: function (after, before, record, column) {
191
+ validation: (async (after, before, record, column) => {
190
192
  if (after.indexOf('@') == -1) {
191
- document.dispatchEvent(
192
- new CustomEvent('notify', {
193
- detail: {
194
- type: 'error',
195
- message: `invalid value - ${after}`
196
- }
197
- })
198
- )
199
- return false
193
+ return await OxPrompt.open({
194
+ title: '잘못된 이메일 포맷',
195
+ text: '그래도 변경하시겠습니까?',
196
+ cancelButton: { text: 'No' },
197
+ confirmButton: { text: 'Yes' }
198
+ })
200
199
  }
201
200
  return true
202
- } as ValidationCallback
201
+ }) as ValidationCallback
203
202
  },
204
203
  {
205
204
  type: 'boolean',
@@ -348,7 +347,8 @@ export default {
348
347
  title: 'group header',
349
348
  component: 'ox-grist',
350
349
  argTypes: {
351
- config: { control: 'object' }
350
+ config: { control: 'object' },
351
+ theme: { control: 'select', options: ['light', 'dark'] }
352
352
  }
353
353
  }
354
354
 
@@ -360,10 +360,18 @@ interface Story<T> {
360
360
 
361
361
  interface ArgTypes {
362
362
  config: object
363
+ theme: 'light' | 'dark'
363
364
  }
364
365
 
365
- const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
366
- html` <link
366
+ const Template: Story<ArgTypes> = ({ config, theme = 'light' }: ArgTypes) =>
367
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
368
+
369
+ <link href="/themes/light.css" rel="stylesheet" />
370
+ <link href="/themes/dark.css" rel="stylesheet" />
371
+ <link href="/themes/spacing.css" rel="stylesheet" />
372
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
373
+
374
+ <link
367
375
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
368
376
  rel="stylesheet"
369
377
  />
@@ -376,46 +384,60 @@ const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
376
384
  rel="stylesheet"
377
385
  />
378
386
 
379
- <link href="/themes/app-theme.css" rel="stylesheet" />
380
- <link href="/themes/oops-theme.css" rel="stylesheet" />
381
- <link href="/themes/grist-theme.css" rel="stylesheet" />
387
+ <style>
388
+ ${MDTypeScaleStyles.cssText}
389
+ </style>
382
390
 
383
391
  <style>
384
392
  ${CommonGristStyles.cssText}
385
393
  ${CommonHeaderStyles.cssText}
386
394
  </style>
387
395
 
396
+ <script>
397
+ document.body.classList.add('${theme}')
398
+ </script>
399
+
400
+ <style>
401
+ ox-grist {
402
+ height: 600px;
403
+ }
404
+
405
+ ox-filters-form {
406
+ flex: 1;
407
+ }
408
+ </style>
409
+
388
410
  <ox-grist
389
411
  mode="GRID"
390
412
  .config=${config}
391
413
  .fetchHandler=${fetchHandler}
392
414
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
393
415
  >
394
- <div slot="headroom">
395
- <div id="filters">
416
+ <div slot="headroom" class="header">
417
+ <div class="filters">
396
418
  <ox-filters-form autofocus></ox-filters-form>
397
- </div>
398
419
 
399
- <div id="sorters">
400
- Sort
401
- <md-icon
402
- @click=${(e: Event) => {
403
- const target = e.currentTarget as HTMLElement
404
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
405
- right: 0,
406
- top: target.offsetTop + target.offsetHeight
407
- })
408
- }}
409
- >expand_more</md-icon
410
- >
411
- <ox-popup id="sorter-control">
412
- <ox-sorters-control> </ox-sorters-control>
413
- </ox-popup>
414
- </div>
420
+ <div id="sorters">
421
+ Sort
422
+ <md-icon
423
+ @click=${(e: Event) => {
424
+ const target = e.currentTarget as HTMLElement
425
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
426
+ right: 0,
427
+ top: target.offsetTop + target.offsetHeight
428
+ })
429
+ }}
430
+ >expand_more</md-icon
431
+ >
432
+ <ox-popup id="sorter-control">
433
+ <ox-sorters-control> </ox-sorters-control>
434
+ </ox-popup>
435
+ </div>
415
436
 
416
- <ox-record-creator id="add" light-popup>
417
- <button><md-icon>add</md-icon></button>
418
- </ox-record-creator>
437
+ <ox-record-creator id="add" light-popup>
438
+ <button><md-icon>add</md-icon></button>
439
+ </ox-record-creator>
440
+ </div>
419
441
  </div>
420
442
  </ox-grist>`
421
443
 
@@ -6,19 +6,21 @@ 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 { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
11
12
 
12
13
  import {
13
14
  ColumnConfig,
14
15
  FetchHandler,
16
+ FetchOption,
15
17
  GristClassifier,
16
18
  GristEventHandlerSet,
17
19
  GristRecord,
18
20
  ValidationCallback
19
21
  } from '../src/types.js'
20
22
 
21
- const fetchHandler: FetchHandler = async ({ page, limit }) => {
23
+ const fetchHandler: FetchHandler = async ({ page, limit }: FetchOption) => {
22
24
  var total = 3
23
25
  var start = (page! - 1) * limit!
24
26
 
@@ -174,7 +176,8 @@ export default {
174
176
  argTypes: {
175
177
  config: { control: 'object' },
176
178
  mode: { control: 'select', options: ['GRID', 'LIST', 'CARD'] },
177
- urlParamsSensitive: { control: 'boolean' }
179
+ urlParamsSensitive: { control: 'boolean' },
180
+ theme: { control: 'select', options: ['light', 'dark'] }
178
181
  }
179
182
  }
180
183
 
@@ -186,13 +189,27 @@ interface Story<T> {
186
189
 
187
190
  interface ArgTypes {
188
191
  config: object
189
- mode: string
192
+ mode: 'GRID' | 'LIST' | 'CARD'
190
193
  urlParamsSensitive: boolean
191
- fetchHandler: object
194
+ theme: 'light' | 'dark'
195
+ fetchHandler: FetchHandler
192
196
  }
193
197
 
194
- const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive = false, fetchHandler }: ArgTypes) =>
195
- html` <link
198
+ const Template: Story<ArgTypes> = ({
199
+ config,
200
+ mode = 'GRID',
201
+ urlParamsSensitive = false,
202
+ fetchHandler,
203
+ theme = 'light'
204
+ }: ArgTypes) =>
205
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
206
+
207
+ <link href="/themes/light.css" rel="stylesheet" />
208
+ <link href="/themes/dark.css" rel="stylesheet" />
209
+ <link href="/themes/spacing.css" rel="stylesheet" />
210
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
211
+
212
+ <link
196
213
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
197
214
  rel="stylesheet"
198
215
  />
@@ -205,13 +222,28 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
205
222
  rel="stylesheet"
206
223
  />
207
224
 
208
- <link href="/themes/app-theme.css" rel="stylesheet" />
209
- <link href="/themes/oops-theme.css" rel="stylesheet" />
210
- <link href="/themes/grist-theme.css" rel="stylesheet" />
225
+ <style>
226
+ ${MDTypeScaleStyles.cssText}
227
+ </style>
211
228
 
212
229
  <style>
213
- ${CommonGristStyles.cssText}
214
- ${CommonHeaderStyles.cssText}
230
+ ${CommonGristStyles.cssText} ${CommonHeaderStyles.cssText} #add {
231
+ margin-left: auto;
232
+ }
233
+ </style>
234
+
235
+ <script>
236
+ document.body.classList.add('${theme}')
237
+ </script>
238
+
239
+ <style>
240
+ ox-grist {
241
+ height: 600px;
242
+ }
243
+
244
+ ox-filters-form {
245
+ flex: 1;
246
+ }
215
247
  </style>
216
248
 
217
249
  <ox-grist
@@ -221,14 +253,14 @@ const Template: Story<ArgTypes> = ({ config, mode = 'GRID', urlParamsSensitive =
221
253
  ?url-params-sensitive=${urlParamsSensitive}
222
254
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
223
255
  >
224
- <div slot="headroom">
225
- <div id="filters">
256
+ <div slot="headroom" class="header">
257
+ <div class="filters">
226
258
  <ox-filters-form autofocus></ox-filters-form>
227
- </div>
228
259
 
229
- <ox-record-creator id="add" light-popup>
230
- <button><md-icon>add</md-icon></button>
231
- </ox-record-creator>
260
+ <ox-record-creator id="add" light-popup>
261
+ <button><md-icon>add</md-icon></button>
262
+ </ox-record-creator>
263
+ </div>
232
264
  </div>
233
265
  </ox-grist>`
234
266
 
@@ -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 { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
11
12
 
@@ -202,7 +203,8 @@ export default {
202
203
  title: 'tree column with checkbox',
203
204
  component: 'ox-grist',
204
205
  argTypes: {
205
- config: { control: 'object' }
206
+ config: { control: 'object' },
207
+ theme: { control: 'select', options: ['light', 'dark'] }
206
208
  }
207
209
  }
208
210
 
@@ -214,10 +216,18 @@ interface Story<T> {
214
216
 
215
217
  interface ArgTypes {
216
218
  config: object
219
+ theme: 'light' | 'dark'
217
220
  }
218
221
 
219
- const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
220
- html` <link
222
+ const Template: Story<ArgTypes> = ({ config, theme = 'light' }: ArgTypes) =>
223
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
224
+
225
+ <link href="/themes/light.css" rel="stylesheet" />
226
+ <link href="/themes/dark.css" rel="stylesheet" />
227
+ <link href="/themes/spacing.css" rel="stylesheet" />
228
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
229
+
230
+ <link
221
231
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
222
232
  rel="stylesheet"
223
233
  />
@@ -230,46 +240,60 @@ const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
230
240
  rel="stylesheet"
231
241
  />
232
242
 
233
- <link href="/themes/app-theme.css" rel="stylesheet" />
234
- <link href="/themes/oops-theme.css" rel="stylesheet" />
235
- <link href="/themes/grist-theme.css" rel="stylesheet" />
243
+ <style>
244
+ ${MDTypeScaleStyles.cssText}
245
+ </style>
236
246
 
237
247
  <style>
238
248
  ${CommonGristStyles.cssText}
239
249
  ${CommonHeaderStyles.cssText}
240
250
  </style>
241
251
 
252
+ <script>
253
+ document.body.classList.add('${theme}')
254
+ </script>
255
+
256
+ <style>
257
+ ox-grist {
258
+ height: 600px;
259
+ }
260
+
261
+ ox-filters-form {
262
+ flex: 1;
263
+ }
264
+ </style>
265
+
242
266
  <ox-grist
243
267
  mode="GRID"
244
268
  .config=${config}
245
269
  .fetchHandler=${fetchHandler}
246
270
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
247
271
  >
248
- <div slot="headroom">
249
- <div id="filters">
272
+ <div slot="headroom" class="header">
273
+ <div class="filters">
250
274
  <ox-filters-form autofocus></ox-filters-form>
251
- </div>
252
275
 
253
- <div id="sorters">
254
- Sort
255
- <md-icon
256
- @click=${(e: Event) => {
257
- const target = e.currentTarget as HTMLElement
258
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
259
- right: 0,
260
- top: target.offsetTop + target.offsetHeight
261
- })
262
- }}
263
- >expand_more</md-icon
264
- >
265
- <ox-popup id="sorter-control">
266
- <ox-sorters-control> </ox-sorters-control>
267
- </ox-popup>
268
- </div>
276
+ <div id="sorters">
277
+ Sort
278
+ <md-icon
279
+ @click=${(e: Event) => {
280
+ const target = e.currentTarget as HTMLElement
281
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
282
+ right: 0,
283
+ top: target.offsetTop + target.offsetHeight
284
+ })
285
+ }}
286
+ >expand_more</md-icon
287
+ >
288
+ <ox-popup id="sorter-control">
289
+ <ox-sorters-control> </ox-sorters-control>
290
+ </ox-popup>
291
+ </div>
269
292
 
270
- <ox-record-creator id="add" light-popup>
271
- <button><md-icon>add</md-icon></button>
272
- </ox-record-creator>
293
+ <ox-record-creator id="add" light-popup>
294
+ <button><md-icon>add</md-icon></button>
295
+ </ox-record-creator>
296
+ </div>
273
297
  </div>
274
298
  </ox-grist>`
275
299
 
@@ -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 { CommonHeaderStyles, CommonGristStyles } from '@operato/styles'
11
12
 
@@ -201,7 +202,8 @@ export default {
201
202
  title: 'tree column',
202
203
  component: 'ox-grist',
203
204
  argTypes: {
204
- config: { control: 'object' }
205
+ config: { control: 'object' },
206
+ theme: { control: 'select', options: ['light', 'dark'] }
205
207
  }
206
208
  }
207
209
 
@@ -213,10 +215,18 @@ interface Story<T> {
213
215
 
214
216
  interface ArgTypes {
215
217
  config: object
218
+ theme: 'light' | 'dark'
216
219
  }
217
220
 
218
- const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
219
- html` <link
221
+ const Template: Story<ArgTypes> = ({ config, theme = 'light' }: ArgTypes) =>
222
+ html` <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet" />
223
+
224
+ <link href="/themes/light.css" rel="stylesheet" />
225
+ <link href="/themes/dark.css" rel="stylesheet" />
226
+ <link href="/themes/spacing.css" rel="stylesheet" />
227
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
228
+
229
+ <link
220
230
  href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
221
231
  rel="stylesheet"
222
232
  />
@@ -229,46 +239,60 @@ const Template: Story<ArgTypes> = ({ config }: ArgTypes) =>
229
239
  rel="stylesheet"
230
240
  />
231
241
 
232
- <link href="/themes/app-theme.css" rel="stylesheet" />
233
- <link href="/themes/oops-theme.css" rel="stylesheet" />
234
- <link href="/themes/grist-theme.css" rel="stylesheet" />
242
+ <style>
243
+ ${MDTypeScaleStyles.cssText}
244
+ </style>
235
245
 
236
246
  <style>
237
247
  ${CommonGristStyles.cssText}
238
248
  ${CommonHeaderStyles.cssText}
239
249
  </style>
240
250
 
251
+ <script>
252
+ document.body.classList.add('${theme}')
253
+ </script>
254
+
255
+ <style>
256
+ ox-grist {
257
+ height: 600px;
258
+ }
259
+
260
+ ox-filters-form {
261
+ flex: 1;
262
+ }
263
+ </style>
264
+
241
265
  <ox-grist
242
266
  mode="GRID"
243
267
  .config=${config}
244
268
  .fetchHandler=${fetchHandler}
245
269
  @filters-change=${(e: Event) => console.log('filters', (e.target as any).filters)}
246
270
  >
247
- <div slot="headroom">
248
- <div id="filters">
271
+ <div slot="headroom" class="header">
272
+ <div class="filters">
249
273
  <ox-filters-form autofocus></ox-filters-form>
250
- </div>
251
274
 
252
- <div id="sorters">
253
- Sort
254
- <md-icon
255
- @click=${(e: Event) => {
256
- const target = e.currentTarget as HTMLElement
257
- ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
258
- right: 0,
259
- top: target.offsetTop + target.offsetHeight
260
- })
261
- }}
262
- >expand_more</md-icon
263
- >
264
- <ox-popup id="sorter-control">
265
- <ox-sorters-control> </ox-sorters-control>
266
- </ox-popup>
267
- </div>
275
+ <div id="sorters">
276
+ Sort
277
+ <md-icon
278
+ @click=${(e: Event) => {
279
+ const target = e.currentTarget as HTMLElement
280
+ ;(target.closest('#sorters')!.querySelector('#sorter-control') as any).open({
281
+ right: 0,
282
+ top: target.offsetTop + target.offsetHeight
283
+ })
284
+ }}
285
+ >expand_more</md-icon
286
+ >
287
+ <ox-popup id="sorter-control">
288
+ <ox-sorters-control> </ox-sorters-control>
289
+ </ox-popup>
290
+ </div>
268
291
 
269
- <ox-record-creator id="add" light-popup>
270
- <button><md-icon>add</md-icon></button>
271
- </ox-record-creator>
292
+ <ox-record-creator id="add" light-popup>
293
+ <button><md-icon>add</md-icon></button>
294
+ </ox-record-creator>
295
+ </div>
272
296
  </div>
273
297
  </ox-grist>`
274
298
 
@@ -0,0 +1,151 @@
1
+ .dark-high-contrast {
2
+ --md-sys-color-primary: rgb(252 250 255);
3
+ --md-sys-color-surface-tint: rgb(178 197 255);
4
+ --md-sys-color-on-primary: rgb(0 0 0);
5
+ --md-sys-color-primary-container: rgb(184 201 255);
6
+ --md-sys-color-on-primary-container: rgb(0 0 0);
7
+ --md-sys-color-secondary: rgb(248 251 255);
8
+ --md-sys-color-on-secondary: rgb(0 0 0);
9
+ --md-sys-color-secondary-container: rgb(147 211 247);
10
+ --md-sys-color-on-secondary-container: rgb(0 0 0);
11
+ --md-sys-color-tertiary: rgb(238 255 242);
12
+ --md-sys-color-on-tertiary: rgb(0 0 0);
13
+ --md-sys-color-tertiary-container: rgb(148 218 179);
14
+ --md-sys-color-on-tertiary-container: rgb(0 0 0);
15
+ --md-sys-color-error: rgb(255 249 249);
16
+ --md-sys-color-on-error: rgb(0 0 0);
17
+ --md-sys-color-error-container: rgb(255 185 180);
18
+ --md-sys-color-on-error-container: rgb(0 0 0);
19
+ --md-sys-color-background: rgb(18 19 24);
20
+ --md-sys-color-on-background: rgb(227 226 233);
21
+ --md-sys-color-surface: rgb(18 19 24);
22
+ --md-sys-color-on-surface: rgb(255 255 255);
23
+ --md-sys-color-surface-variant: rgb(69 70 79);
24
+ --md-sys-color-on-surface-variant: rgb(252 250 255);
25
+ --md-sys-color-outline: rgb(201 202 212);
26
+ --md-sys-color-outline-variant: rgb(201 202 212);
27
+ --md-sys-color-shadow: rgb(0 0 0);
28
+ --md-sys-color-scrim: rgb(0 0 0);
29
+ --md-sys-color-inverse-surface: rgb(227 226 233);
30
+ --md-sys-color-inverse-on-surface: rgb(0 0 0);
31
+ --md-sys-color-inverse-primary: rgb(16 39 90);
32
+ --md-sys-color-primary-fixed: rgb(224 230 255);
33
+ --md-sys-color-on-primary-fixed: rgb(0 0 0);
34
+ --md-sys-color-primary-fixed-dim: rgb(184 201 255);
35
+ --md-sys-color-on-primary-fixed-variant: rgb(0 19 61);
36
+ --md-sys-color-secondary-fixed: rgb(205 235 255);
37
+ --md-sys-color-on-secondary-fixed: rgb(0 0 0);
38
+ --md-sys-color-secondary-fixed-dim: rgb(147 211 247);
39
+ --md-sys-color-on-secondary-fixed-variant: rgb(0 25 36);
40
+ --md-sys-color-tertiary-fixed: rgb(175 246 206);
41
+ --md-sys-color-on-tertiary-fixed: rgb(0 0 0);
42
+ --md-sys-color-tertiary-fixed-dim: rgb(148 218 179);
43
+ --md-sys-color-on-tertiary-fixed-variant: rgb(0 27 14);
44
+ --md-sys-color-surface-dim: rgb(18 19 24);
45
+ --md-sys-color-surface-bright: rgb(56 57 63);
46
+ --md-sys-color-surface-container-lowest: rgb(13 14 19);
47
+ --md-sys-color-surface-container-low: rgb(26 27 33);
48
+ --md-sys-color-surface-container: rgb(30 31 37);
49
+ --md-sys-color-surface-container-high: rgb(41 42 47);
50
+ --md-sys-color-surface-container-highest: rgb(51 52 58);
51
+
52
+ /* primary palette */
53
+ --md-ref-palette-primary0:#000000;
54
+ --md-ref-palette-primary5:#000E32;
55
+ --md-ref-palette-primary10:#001848;
56
+ --md-ref-palette-primary15:#00215E;
57
+ --md-ref-palette-primary20:#002B74;
58
+ --md-ref-palette-primary25:#002B74;
59
+ --md-ref-palette-primary30:#0040A2;
60
+ --md-ref-palette-primary35:#002B74;
61
+ --md-ref-palette-primary40:#1957CA;
62
+ --md-ref-palette-primary50:#3E71E5;
63
+ --md-ref-palette-primary60:#5C8BFF;
64
+ --md-ref-palette-primary70:#89A9FF;
65
+ --md-ref-palette-primary80:#B2C5FF;
66
+ --md-ref-palette-primary90:#DAE2FF;
67
+ --md-ref-palette-primary95:#EEF0FF;
68
+ --md-ref-palette-primary98:#FAF8FF;
69
+ --md-ref-palette-primary99:#FEFBFF;
70
+ --md-ref-palette-primary100:#FFFFFF;
71
+
72
+ /* secondary palette */
73
+ --md-ref-palette-secondary0:#000000;
74
+ --md-ref-palette-secondary5:#00131D;
75
+ --md-ref-palette-secondary10:#001E2C;
76
+ --md-ref-palette-secondary15:#00293A;
77
+ --md-ref-palette-secondary20:#003549;
78
+ --md-ref-palette-secondary25:#004058;
79
+ --md-ref-palette-secondary30:#004C68;
80
+ --md-ref-palette-secondary35:#005978;
81
+ --md-ref-palette-secondary40:#006689;
82
+ --md-ref-palette-secondary50:#0080AC;
83
+ --md-ref-palette-secondary60:#009BCF;
84
+ --md-ref-palette-secondary70:#00B8F4;
85
+ --md-ref-palette-secondary80:#79D1FF;
86
+ --md-ref-palette-secondary90:#C3E8FF;
87
+ --md-ref-palette-secondary95:#E3F3FF;
88
+ --md-ref-palette-secondary98:#F5FAFF;
89
+ --md-ref-palette-secondary99:#FBFCFF;
90
+ --md-ref-palette-secondary100:#FFFFFF;
91
+
92
+ /* tertiary palette */
93
+ --md-ref-palette-tertiary0:#000000;
94
+ --md-ref-palette-tertiary5:#00150A;
95
+ --md-ref-palette-tertiary10:#002113;
96
+ --md-ref-palette-tertiary15:#002C1B;
97
+ --md-ref-palette-tertiary20:#003823;
98
+ --md-ref-palette-tertiary25:#00452B;
99
+ --md-ref-palette-tertiary30:#005234;
100
+ --md-ref-palette-tertiary35:#005F3E;
101
+ --md-ref-palette-tertiary40:#006C47;
102
+ --md-ref-palette-tertiary50:#00885A;
103
+ --md-ref-palette-tertiary60:#31A372;
104
+ --md-ref-palette-tertiary70:#51BF8B;
105
+ --md-ref-palette-tertiary80:#6EDBA5;
106
+ --md-ref-palette-tertiary90:#A2F4C7;
107
+ --md-ref-palette-tertiary95:#BFFFD9;
108
+ --md-ref-palette-tertiary98:#E8FFEF;
109
+ --md-ref-palette-tertiary99:#F4FFF5;
110
+ --md-ref-palette-tertiary100:#FFFFFF;
111
+
112
+ /* error palette */
113
+ --md-ref-palette-error0:#000000;
114
+ --md-ref-palette-error5:#2d0102;
115
+ --md-ref-palette-error10:#410304;
116
+ --md-ref-palette-error15:#540507;
117
+ --md-ref-palette-error20:#68070a;
118
+ --md-ref-palette-error25:#7d0b0e;
119
+ --md-ref-palette-error30:#930f14;
120
+ --md-ref-palette-error35:#a91319;
121
+ --md-ref-palette-error40:#bc1620;
122
+ --md-ref-palette-error50:#e03236;
123
+ --md-ref-palette-error60:#ff5450;
124
+ --md-ref-palette-error70:#ff8982;
125
+ --md-ref-palette-error80:#ffb3ad;
126
+ --md-ref-palette-error90:#ffdad7;
127
+ --md-ref-palette-error95:#ffedeb;
128
+ --md-ref-palette-error98:#fff8f7;
129
+ --md-ref-palette-error99:#fffbff;
130
+ --md-ref-palette-error100:#FFFFFF;
131
+
132
+ /* neutral palette */
133
+ --md-ref-palette-neutral0:#000000;
134
+ --md-ref-palette-neutral5:#111111;
135
+ --md-ref-palette-neutral10:#1C1C1C;
136
+ --md-ref-palette-neutral15:#262626;
137
+ --md-ref-palette-neutral20:#313131;
138
+ --md-ref-palette-neutral25:#3C3C3C;
139
+ --md-ref-palette-neutral30:#474747;
140
+ --md-ref-palette-neutral35:#535353;
141
+ --md-ref-palette-neutral40:#5F5F5F;
142
+ --md-ref-palette-neutral50:#787878;
143
+ --md-ref-palette-neutral60:#929292;
144
+ --md-ref-palette-neutral70:#ACACAC;
145
+ --md-ref-palette-neutral80:#C8C8C8;
146
+ --md-ref-palette-neutral90:#E4E4E4;
147
+ --md-ref-palette-neutral95:#F0F0F0;
148
+ --md-ref-palette-neutral98:#F9F9F9;
149
+ --md-ref-palette-neutral99:#FEFEFE;
150
+ --md-ref-palette-neutral100:#FFFFFF;
151
+ }