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.
- package/dist/components/ThemeSwitcher.js +2 -2
- package/dist/utils/context.js +1 -0
- package/dist/utils/theme.js +1 -0
- package/docs/components/theme-switcher.html +18 -6
- package/docs/index.html +18 -6
- package/docs/nav-1.inc.html +2 -0
- package/docs/nav.inc.html +2 -0
- package/docs/src/components/ThemeSwitcher.js +2 -2
- package/docs/src/utils/context.js +1 -0
- package/docs/src/utils/theme.js +1 -0
- package/docs/utils/context.html +160 -0
- package/docs/utils/theme.html +153 -0
- package/package.json +2 -2
- package/src/components/Table.js +2 -1
- package/src/components/ThemeSwitcher.js +17 -30
- package/src/components/tableControls/PageSelect.js +20 -28
- package/src/utils/context.js +40 -0
- package/src/utils/theme.js +50 -0
- package/tests/components/Accordion.browser-test.js +470 -0
- package/tests/components/Card.browser-test.js +286 -0
- package/tests/components/ColorPicker.browser-test.js +658 -0
- package/tests/components/ContentSlider.browser-test.js +495 -0
- package/tests/components/Dialog.browser-test.js +677 -0
- package/tests/components/FocusCapture.browser-test.js +187 -0
- package/tests/components/HybridComponent.browser-test.js +1 -1
- package/tests/components/Icon.browser-test.js +355 -0
- package/tests/components/Import.browser-test.js +312 -0
- package/tests/components/PhotoViewer.browser-test.js +640 -0
- package/tests/components/Resize.browser-test.js +553 -0
- package/tests/components/ShadowComponent.browser-test.js +3 -3
- package/tests/components/ShowMore.browser-test.js +618 -0
- package/tests/components/SideMenu.browser-test.js +667 -0
- package/tests/components/Sortable.browser-test.js +650 -0
- package/tests/components/Split.browser-test.js +629 -0
- package/tests/components/Table.browser-test.js +1119 -0
- package/tests/components/Tabs.browser-test.js +847 -0
- package/tests/components/Tags.browser-test.js +604 -0
- package/tests/components/ThemeSwitcher.browser-test.js +413 -0
- package/tests/components/Timestamp.browser-test.js +509 -0
- package/tests/components/Toast.browser-test.js +616 -0
- package/tests/components/Toggle.browser-test.js +557 -0
- package/tests/components/Tree.browser-test.js +790 -0
- package/tests/components/tableControls/ExportControls.browser-test.js +307 -0
- package/tests/components/tableControls/FieldSortHide.browser-test.js +347 -0
- package/tests/components/tableControls/Filters.browser-test.js +376 -0
- package/tests/components/tableControls/HiddenCount.browser-test.js +263 -0
- package/tests/components/tableControls/PaginationControls.browser-test.js +514 -0
- package/tests/components/tableControls/RecordControls.browser-test.js +360 -0
- package/tests/components/tableControls/Search.browser-test.js +283 -0
- package/tests/components/tableControls/TableControl.browser-test.js +300 -0
- package/tests/utils/context.test.js +224 -0
- package/tests/utils/cookie.browser-test.js +146 -0
- package/tests/utils/drag.browser-test.js +285 -0
- package/tests/utils/formatTimestamp.test.js +224 -0
- package/tests/utils/object.browser-test.js +378 -0
- package/tests/utils/propConverters.test.js +207 -0
- package/tests/utils/string.test.js +379 -0
- package/tests/utils/theme.browser-test.js +177 -0
- package/tests/utils/type.test.js +211 -0
- 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 =
|
|
14
|
+
this.currentTheme = theme.get();
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
/*
|
|
17
18
|
Event Handlers
|
|
18
19
|
*/
|
|
19
20
|
handleClick = () => {
|
|
20
|
-
const current =
|
|
21
|
-
if(current === 'auto')
|
|
22
|
-
if(current === 'light')
|
|
23
|
-
if(current === 'dark')
|
|
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
|
-
|
|
32
|
+
this.unsubscribe = theme.subscribe(t => {
|
|
33
|
+
this.currentTheme = t;
|
|
34
|
+
});
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
disconnectedCallback() {
|
|
42
38
|
super.disconnectedCallback();
|
|
43
|
-
|
|
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(
|
|
88
|
-
|
|
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
|
-
|
|
95
|
-
if(!theme) theme = localStorage.getItem('theme');
|
|
96
|
-
return theme || 'auto';
|
|
88
|
+
return theme.get();
|
|
97
89
|
}
|
|
98
|
-
}
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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.
|
|
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.
|
|
34
|
-
this.table.removeEventListener('pageSizeChange', this.
|
|
35
|
-
this.table.removeEventListener('pageCountChanged', this.
|
|
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
|
-
|
|
44
|
-
|
|
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
|
+
};
|