kempo-ui 0.0.35 → 0.0.37

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 (60) hide show
  1. package/dist/components/ThemeSwitcher.js +2 -2
  2. package/dist/utils/context.js +1 -0
  3. package/dist/utils/theme.js +1 -0
  4. package/docs/components/theme-switcher.html +18 -6
  5. package/docs/index.html +18 -6
  6. package/docs/nav-1.inc.html +2 -0
  7. package/docs/nav.inc.html +2 -0
  8. package/docs/src/components/ThemeSwitcher.js +2 -2
  9. package/docs/src/utils/context.js +1 -0
  10. package/docs/src/utils/theme.js +1 -0
  11. package/docs/utils/context.html +160 -0
  12. package/docs/utils/theme.html +153 -0
  13. package/package.json +2 -2
  14. package/src/components/Table.js +2 -1
  15. package/src/components/ThemeSwitcher.js +17 -30
  16. package/src/components/tableControls/PageSelect.js +20 -28
  17. package/src/utils/context.js +40 -0
  18. package/src/utils/theme.js +50 -0
  19. package/tests/components/Accordion.browser-test.js +470 -0
  20. package/tests/components/Card.browser-test.js +286 -0
  21. package/tests/components/ColorPicker.browser-test.js +658 -0
  22. package/tests/components/ContentSlider.browser-test.js +495 -0
  23. package/tests/components/Dialog.browser-test.js +677 -0
  24. package/tests/components/FocusCapture.browser-test.js +187 -0
  25. package/tests/components/HybridComponent.browser-test.js +1 -1
  26. package/tests/components/Icon.browser-test.js +355 -0
  27. package/tests/components/Import.browser-test.js +312 -0
  28. package/tests/components/PhotoViewer.browser-test.js +640 -0
  29. package/tests/components/Resize.browser-test.js +553 -0
  30. package/tests/components/ShadowComponent.browser-test.js +3 -3
  31. package/tests/components/ShowMore.browser-test.js +618 -0
  32. package/tests/components/SideMenu.browser-test.js +667 -0
  33. package/tests/components/Sortable.browser-test.js +650 -0
  34. package/tests/components/Split.browser-test.js +629 -0
  35. package/tests/components/Table.browser-test.js +1119 -0
  36. package/tests/components/Tabs.browser-test.js +847 -0
  37. package/tests/components/Tags.browser-test.js +604 -0
  38. package/tests/components/ThemeSwitcher.browser-test.js +413 -0
  39. package/tests/components/Timestamp.browser-test.js +509 -0
  40. package/tests/components/Toast.browser-test.js +616 -0
  41. package/tests/components/Toggle.browser-test.js +557 -0
  42. package/tests/components/Tree.browser-test.js +790 -0
  43. package/tests/components/tableControls/ExportControls.browser-test.js +307 -0
  44. package/tests/components/tableControls/FieldSortHide.browser-test.js +347 -0
  45. package/tests/components/tableControls/Filters.browser-test.js +376 -0
  46. package/tests/components/tableControls/HiddenCount.browser-test.js +263 -0
  47. package/tests/components/tableControls/PaginationControls.browser-test.js +514 -0
  48. package/tests/components/tableControls/RecordControls.browser-test.js +360 -0
  49. package/tests/components/tableControls/Search.browser-test.js +283 -0
  50. package/tests/components/tableControls/TableControl.browser-test.js +300 -0
  51. package/tests/utils/context.test.js +224 -0
  52. package/tests/utils/cookie.browser-test.js +146 -0
  53. package/tests/utils/drag.browser-test.js +285 -0
  54. package/tests/utils/formatTimestamp.test.js +224 -0
  55. package/tests/utils/object.browser-test.js +378 -0
  56. package/tests/utils/propConverters.test.js +207 -0
  57. package/tests/utils/string.test.js +379 -0
  58. package/tests/utils/theme.browser-test.js +177 -0
  59. package/tests/utils/type.test.js +211 -0
  60. package/tests/utils/wait.browser-test.js +19 -0
@@ -1,5 +1,6 @@
1
1
  import ShadowComponent from './ShadowComponent.js';
2
2
  import { html, css } from '../lit-all.min.js';
3
+ import theme from '../utils/theme.js';
3
4
  import './Icon.js';
4
5
 
5
6
  export default class ThemeSwitcher extends ShadowComponent {
@@ -10,24 +11,17 @@ export default class ThemeSwitcher extends ShadowComponent {
10
11
 
11
12
  constructor() {
12
13
  super();
13
- this.currentTheme = ThemeSwitcher.getCurrentTheme();
14
+ this.currentTheme = theme.get();
14
15
  }
15
16
 
16
17
  /*
17
18
  Event Handlers
18
19
  */
19
20
  handleClick = () => {
20
- const current = ThemeSwitcher.getCurrentTheme();
21
- if(current === 'auto') ThemeSwitcher.setTheme('light');
22
- if(current === 'light') ThemeSwitcher.setTheme('dark');
23
- if(current === 'dark') ThemeSwitcher.setTheme('auto');
24
- }
25
-
26
- handleStorageChange = (event) => {
27
- if (event.key === 'theme') {
28
- this.currentTheme = event.newValue || 'auto';
29
- document.documentElement.setAttribute('theme', this.currentTheme);
30
- }
21
+ const current = theme.get();
22
+ if(current === 'auto') theme.set('light');
23
+ if(current === 'light') theme.set('dark');
24
+ if(current === 'dark') theme.set('auto');
31
25
  }
32
26
 
33
27
  /*
@@ -35,12 +29,14 @@ export default class ThemeSwitcher extends ShadowComponent {
35
29
  */
36
30
  connectedCallback() {
37
31
  super.connectedCallback();
38
- window.addEventListener('storage', this.handleStorageChange);
32
+ this.unsubscribe = theme.subscribe(t => {
33
+ this.currentTheme = t;
34
+ });
39
35
  }
40
36
 
41
37
  disconnectedCallback() {
42
38
  super.disconnectedCallback();
43
- window.removeEventListener('storage', this.handleStorageChange);
39
+ if(this.unsubscribe) this.unsubscribe();
44
40
  }
45
41
 
46
42
  /*
@@ -84,26 +80,17 @@ export default class ThemeSwitcher extends ShadowComponent {
84
80
  /*
85
81
  Static Methods
86
82
  */
87
- static setTheme(theme) {
88
- localStorage.setItem('theme', theme);
89
- document.documentElement.setAttribute('theme', theme);
90
- window.dispatchEvent(new StorageEvent('storage', { key: 'theme', newValue: theme }));
83
+ static setTheme(t) {
84
+ theme.set(t);
91
85
  }
92
86
 
93
87
  static getCurrentTheme() {
94
- let theme = document.documentElement.getAttribute('theme');
95
- if(!theme) theme = localStorage.getItem('theme');
96
- return theme || 'auto';
88
+ return theme.get();
97
89
  }
98
- }
99
90
 
100
- /*
101
- Auto Theme Detection
102
- */
103
- const colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');
104
- const colorSchemeChangeHandler = event => document.documentElement.setAttribute('auto-theme', event.matches ? 'dark' : 'light');
105
- colorSchemeQuery.addEventListener('change', colorSchemeChangeHandler);
106
- colorSchemeChangeHandler(colorSchemeQuery);
91
+ static getCalculatedCurrentTheme() {
92
+ return theme.getCalculated();
93
+ }
94
+ }
107
95
 
108
- ThemeSwitcher.setTheme(ThemeSwitcher.getCurrentTheme());
109
96
  customElements.define('k-theme-switcher', ThemeSwitcher);
@@ -3,17 +3,13 @@ import { html, css } from '../../lit-all.min.js';
3
3
 
4
4
  export default class PageSelect extends TableControl {
5
5
  static properties = {
6
- ...TableControl.properties,
7
- currentPage: { type: Number, state: true },
8
- totalPages: { type: Number, state: true }
6
+ ...TableControl.properties
9
7
  };
10
8
 
11
9
  constructor() {
12
10
  super({
13
11
  maxWidth: null
14
12
  });
15
- this.currentPage = 1;
16
- this.totalPages = 1;
17
13
  }
18
14
 
19
15
  /*
@@ -22,17 +18,16 @@ export default class PageSelect extends TableControl {
22
18
 
23
19
  connectedCallback() {
24
20
  super.connectedCallback();
25
- this.onTableEvent('pageChange', this.handlePageChange);
26
- this.onTableEvent('pageSizeChange', this.handlePageSizeChange);
27
- this.onTableEvent('pageCountChanged', this.handlePageCountChange);
21
+ this.onTableEvent('pageChange pageSizeChange pageCountChanged recordsSet', this.handleTableUpdate);
28
22
  }
29
23
 
30
24
  disconnectedCallback() {
31
25
  super.disconnectedCallback();
32
26
  if(this.table){
33
- this.table.removeEventListener('pageChange', this.handlePageChange);
34
- this.table.removeEventListener('pageSizeChange', this.handlePageSizeChange);
35
- this.table.removeEventListener('pageCountChanged', this.handlePageCountChange);
27
+ this.table.removeEventListener('pageChange', this.handleTableUpdate);
28
+ this.table.removeEventListener('pageSizeChange', this.handleTableUpdate);
29
+ this.table.removeEventListener('pageCountChanged', this.handleTableUpdate);
30
+ this.table.removeEventListener('recordsSet', this.handleTableUpdate);
36
31
  }
37
32
  }
38
33
 
@@ -40,23 +35,8 @@ export default class PageSelect extends TableControl {
40
35
  Event Handlers
41
36
  */
42
37
 
43
- handlePageChange = () => {
44
- if(this.table){
45
- this.currentPage = this.table.getCurrentPage();
46
- }
47
- };
48
-
49
- handlePageSizeChange = () => {
50
- if(this.table){
51
- this.currentPage = this.table.getCurrentPage();
52
- this.totalPages = this.table.getTotalPages();
53
- }
54
- };
55
-
56
- handlePageCountChange = () => {
57
- if(this.table){
58
- this.totalPages = this.table.getTotalPages();
59
- }
38
+ handleTableUpdate = () => {
39
+ this.requestUpdate();
60
40
  };
61
41
 
62
42
  handleSelectChange = e => {
@@ -65,6 +45,18 @@ export default class PageSelect extends TableControl {
65
45
  }
66
46
  };
67
47
 
48
+ /*
49
+ Getters
50
+ */
51
+
52
+ get currentPage() {
53
+ return this.table ? this.table.getCurrentPage() : 1;
54
+ }
55
+
56
+ get totalPages() {
57
+ return this.table ? this.table.getTotalPages() : 1;
58
+ }
59
+
68
60
  /*
69
61
  Rendering Logic
70
62
  */
@@ -0,0 +1,40 @@
1
+ /*
2
+ Context Utility
3
+ - Create global or named shared state
4
+ - Subscribe/unsubscribe to changes
5
+ - Set/get context values
6
+ */
7
+
8
+ const contexts = {};
9
+
10
+ const getContext = name => {
11
+ if(!contexts[name]){
12
+ contexts[name] = {
13
+ value: undefined,
14
+ subscribers: new Set()
15
+ };
16
+ }
17
+ return contexts[name];
18
+ };
19
+
20
+ export const createContext = (name = 'global', initialValue) => {
21
+ const ctx = getContext(name);
22
+ if(initialValue !== undefined && ctx.value === undefined){
23
+ ctx.value = initialValue;
24
+ }
25
+ return {
26
+ get: () => ctx.value,
27
+ set: val => {
28
+ ctx.value = val;
29
+ ctx.subscribers.forEach(fn => fn(val));
30
+ },
31
+ subscribe: fn => {
32
+ ctx.subscribers.add(fn);
33
+ fn(ctx.value);
34
+ return () => ctx.subscribers.delete(fn);
35
+ },
36
+ unsubscribe: fn => ctx.subscribers.delete(fn)
37
+ };
38
+ };
39
+
40
+ export default createContext;
@@ -0,0 +1,50 @@
1
+ /*
2
+ Theme Utility
3
+ - Manage global theme state
4
+ - Subscribe to theme changes
5
+ - Persist theme to localStorage
6
+ */
7
+
8
+ import createContext from './context.js';
9
+
10
+ const getInitialTheme = () => {
11
+ let theme = document.documentElement.getAttribute('theme');
12
+ if(!theme) theme = localStorage.getItem('theme');
13
+ return theme || 'auto';
14
+ };
15
+
16
+ const themeContext = createContext('theme', getInitialTheme());
17
+
18
+ themeContext.subscribe(theme => {
19
+ localStorage.setItem('theme', theme);
20
+ document.documentElement.setAttribute('theme', theme);
21
+ });
22
+
23
+ export const setTheme = theme => themeContext.set(theme);
24
+
25
+ export const getTheme = () => themeContext.get();
26
+
27
+ export const subscribeToTheme = callback => themeContext.subscribe(callback);
28
+
29
+ export const getCalculatedTheme = () => {
30
+ const theme = getTheme();
31
+ if(theme === 'auto'){
32
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
33
+ }
34
+ return theme;
35
+ };
36
+
37
+ /*
38
+ Auto Theme Detection
39
+ */
40
+ const colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');
41
+ const colorSchemeChangeHandler = event => document.documentElement.setAttribute('auto-theme', event.matches ? 'dark' : 'light');
42
+ colorSchemeQuery.addEventListener('change', colorSchemeChangeHandler);
43
+ colorSchemeChangeHandler(colorSchemeQuery);
44
+
45
+ export default {
46
+ get: getTheme,
47
+ set: setTheme,
48
+ subscribe: subscribeToTheme,
49
+ getCalculated: getCalculatedTheme
50
+ };