@sekiui/elements 0.0.56 → 0.0.57
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/cdn/index.js +1053 -91
- package/dist/cdn/p-BJCq8m2o.js +138 -0
- package/dist/cdn/p-BfRJQMIU.js +111 -0
- package/dist/cdn/{p-bMBhrs0a.js → p-Bp7tjKwQ.js} +427 -7
- package/dist/cdn/seki-button.js +1 -1
- package/dist/cdn/seki-card-action.js +1 -1
- package/dist/cdn/seki-card-content.js +1 -1
- package/dist/cdn/seki-card-description.js +1 -1
- package/dist/cdn/seki-card-footer.js +1 -1
- package/dist/cdn/seki-card-header.js +1 -1
- package/dist/cdn/seki-card-title.js +1 -1
- package/dist/cdn/seki-card.js +1 -1
- package/dist/cdn/seki-field-description.js +1 -1
- package/dist/cdn/seki-field-error.js +1 -1
- package/dist/cdn/seki-field-group.js +1 -1
- package/dist/cdn/seki-field-label.js +1 -1
- package/dist/cdn/seki-field-legend.js +1 -1
- package/dist/cdn/seki-field.js +1 -1
- package/dist/cdn/seki-fieldset.js +1 -1
- package/dist/cdn/seki-input.js +1 -1
- package/dist/cdn/seki-select-content.js +1 -1
- package/dist/cdn/seki-select-group.js +1 -1
- package/dist/cdn/seki-select-option.js +1 -1
- package/dist/cdn/seki-select-trigger.js +1 -1
- package/dist/cdn/seki-select.js +1 -1
- package/dist/cdn/seki-sidebar-content.d.ts +11 -0
- package/dist/cdn/seki-sidebar-content.js +38 -0
- package/dist/cdn/seki-sidebar-footer.d.ts +11 -0
- package/dist/cdn/seki-sidebar-footer.js +38 -0
- package/dist/cdn/seki-sidebar-group.d.ts +11 -0
- package/dist/cdn/seki-sidebar-group.js +131 -0
- package/dist/cdn/seki-sidebar-header.d.ts +11 -0
- package/dist/cdn/seki-sidebar-header.js +38 -0
- package/dist/cdn/seki-sidebar-menu-item.d.ts +11 -0
- package/dist/cdn/seki-sidebar-menu-item.js +200 -0
- package/dist/cdn/seki-sidebar-menu-sub.d.ts +11 -0
- package/dist/cdn/seki-sidebar-menu-sub.js +123 -0
- package/dist/cdn/seki-sidebar-menu.d.ts +11 -0
- package/dist/cdn/seki-sidebar-menu.js +38 -0
- package/dist/cdn/seki-sidebar-trigger.d.ts +11 -0
- package/dist/cdn/seki-sidebar-trigger.js +109 -0
- package/dist/cdn/seki-sidebar.d.ts +11 -0
- package/dist/cdn/seki-sidebar.js +380 -0
- package/dist/cdn/seki-skeleton.js +2 -2
- package/dist/cdn/seki-switch.js +1 -1
- package/dist/cdn/seki-tooltip.js +1 -1
- package/dist/cjs/{index-Dd6_-KaR.js → index-tQYksITZ.js} +426 -6
- package/dist/cjs/index.cjs.js +1115 -63
- package/dist/cjs/keyboard-Cjl5HYES.js +142 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/seki-button.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-action.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-content.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-description.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-footer.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-header.cjs.entry.js +1 -1
- package/dist/cjs/seki-card-title.cjs.entry.js +1 -1
- package/dist/cjs/seki-card.cjs.entry.js +1 -1
- package/dist/cjs/seki-field-description.cjs.entry.js +1 -1
- package/dist/cjs/seki-field-error.cjs.entry.js +1 -1
- package/dist/cjs/seki-field-group.cjs.entry.js +1 -1
- package/dist/cjs/seki-field-label.cjs.entry.js +1 -1
- package/dist/cjs/seki-field-legend.cjs.entry.js +1 -1
- package/dist/cjs/seki-field.cjs.entry.js +1 -1
- package/dist/cjs/seki-fieldset.cjs.entry.js +1 -1
- package/dist/cjs/seki-input.cjs.entry.js +1 -1
- package/dist/cjs/seki-select-content.cjs.entry.js +1 -1
- package/dist/cjs/seki-select-group.cjs.entry.js +1 -1
- package/dist/cjs/seki-select-option.cjs.entry.js +1 -1
- package/dist/cjs/seki-select-trigger.cjs.entry.js +1 -1
- package/dist/cjs/seki-select.cjs.entry.js +1 -1
- package/dist/cjs/seki-sidebar-content.cjs.entry.js +20 -0
- package/dist/cjs/seki-sidebar-footer.cjs.entry.js +20 -0
- package/dist/cjs/seki-sidebar-group.cjs.entry.js +105 -0
- package/dist/cjs/seki-sidebar-header.cjs.entry.js +20 -0
- package/dist/cjs/seki-sidebar-menu-item.cjs.entry.js +174 -0
- package/dist/cjs/seki-sidebar-menu-sub.cjs.entry.js +99 -0
- package/dist/cjs/seki-sidebar-menu.cjs.entry.js +20 -0
- package/dist/cjs/seki-sidebar-trigger.cjs.entry.js +86 -0
- package/dist/cjs/seki-sidebar.cjs.entry.js +342 -0
- package/dist/cjs/seki-skeleton.cjs.entry.js +2 -2
- package/dist/cjs/seki-switch.cjs.entry.js +81 -3
- package/dist/cjs/seki-tooltip.cjs.entry.js +1 -1
- package/dist/cjs/sekiui.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +9 -0
- package/dist/collection/components/sidebar/seki-sidebar-content.css +82 -0
- package/dist/collection/components/sidebar/seki-sidebar-content.js +33 -0
- package/dist/collection/components/sidebar/seki-sidebar-footer.css +44 -0
- package/dist/collection/components/sidebar/seki-sidebar-footer.js +31 -0
- package/dist/collection/components/sidebar/seki-sidebar-group.css +158 -0
- package/dist/collection/components/sidebar/seki-sidebar-group.js +300 -0
- package/dist/collection/components/sidebar/seki-sidebar-header.css +44 -0
- package/dist/collection/components/sidebar/seki-sidebar-header.js +32 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu-item.css +196 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu-item.js +403 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu-sub.css +357 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu-sub.js +256 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu.css +25 -0
- package/dist/collection/components/sidebar/seki-sidebar-menu.js +32 -0
- package/dist/collection/components/sidebar/seki-sidebar-trigger.css +68 -0
- package/dist/collection/components/sidebar/seki-sidebar-trigger.js +175 -0
- package/dist/collection/components/sidebar/seki-sidebar.css +352 -0
- package/dist/collection/components/sidebar/seki-sidebar.js +812 -0
- package/dist/collection/components/sidebar/types.js +18 -0
- package/dist/collection/components/skeleton/seki-skeleton.js +1 -1
- package/dist/collection/index.js +7 -0
- package/dist/collection/services/focus.js +192 -0
- package/dist/collection/services/index.js +7 -0
- package/dist/collection/services/keyboard.js +136 -0
- package/dist/collection/services/media-query.js +254 -0
- package/dist/collection/types.js +41 -0
- package/dist/collection/utils/a11y.js +291 -0
- package/dist/collection/utils/common.js +286 -0
- package/dist/components/index.js +1053 -91
- package/dist/components/p-BJCq8m2o.js +138 -0
- package/dist/components/{p-QhPshhKB.js → p-BzYKy7d3.js} +427 -7
- package/dist/components/p-DwTISp-i.js +111 -0
- package/dist/components/seki-button.js +1 -1
- package/dist/components/seki-card-action.js +1 -1
- package/dist/components/seki-card-content.js +1 -1
- package/dist/components/seki-card-description.js +1 -1
- package/dist/components/seki-card-footer.js +1 -1
- package/dist/components/seki-card-header.js +1 -1
- package/dist/components/seki-card-title.js +1 -1
- package/dist/components/seki-card.js +1 -1
- package/dist/components/seki-field-description.js +1 -1
- package/dist/components/seki-field-error.js +1 -1
- package/dist/components/seki-field-group.js +1 -1
- package/dist/components/seki-field-label.js +1 -1
- package/dist/components/seki-field-legend.js +1 -1
- package/dist/components/seki-field.js +1 -1
- package/dist/components/seki-fieldset.js +1 -1
- package/dist/components/seki-input.js +1 -1
- package/dist/components/seki-select-content.js +1 -1
- package/dist/components/seki-select-group.js +1 -1
- package/dist/components/seki-select-option.js +1 -1
- package/dist/components/seki-select-trigger.js +1 -1
- package/dist/components/seki-select.js +1 -1
- package/dist/components/seki-sidebar-content.d.ts +11 -0
- package/dist/components/seki-sidebar-content.js +38 -0
- package/dist/components/seki-sidebar-footer.d.ts +11 -0
- package/dist/components/seki-sidebar-footer.js +38 -0
- package/dist/components/seki-sidebar-group.d.ts +11 -0
- package/dist/components/seki-sidebar-group.js +131 -0
- package/dist/components/seki-sidebar-header.d.ts +11 -0
- package/dist/components/seki-sidebar-header.js +38 -0
- package/dist/components/seki-sidebar-menu-item.d.ts +11 -0
- package/dist/components/seki-sidebar-menu-item.js +200 -0
- package/dist/components/seki-sidebar-menu-sub.d.ts +11 -0
- package/dist/components/seki-sidebar-menu-sub.js +123 -0
- package/dist/components/seki-sidebar-menu.d.ts +11 -0
- package/dist/components/seki-sidebar-menu.js +38 -0
- package/dist/components/seki-sidebar-trigger.d.ts +11 -0
- package/dist/components/seki-sidebar-trigger.js +109 -0
- package/dist/components/seki-sidebar.d.ts +11 -0
- package/dist/components/seki-sidebar.js +380 -0
- package/dist/components/seki-skeleton.js +2 -2
- package/dist/components/seki-switch.js +1 -1
- package/dist/components/seki-tooltip.js +1 -1
- package/dist/esm/{index-CuXbV_yz.js → index-Dfzpqq0a.js} +426 -6
- package/dist/esm/index.js +1053 -63
- package/dist/esm/keyboard-BJCq8m2o.js +138 -0
- package/dist/esm/loader.js +3 -3
- package/dist/esm/seki-button.entry.js +1 -1
- package/dist/esm/seki-card-action.entry.js +1 -1
- package/dist/esm/seki-card-content.entry.js +1 -1
- package/dist/esm/seki-card-description.entry.js +1 -1
- package/dist/esm/seki-card-footer.entry.js +1 -1
- package/dist/esm/seki-card-header.entry.js +1 -1
- package/dist/esm/seki-card-title.entry.js +1 -1
- package/dist/esm/seki-card.entry.js +1 -1
- package/dist/esm/seki-field-description.entry.js +1 -1
- package/dist/esm/seki-field-error.entry.js +1 -1
- package/dist/esm/seki-field-group.entry.js +1 -1
- package/dist/esm/seki-field-label.entry.js +1 -1
- package/dist/esm/seki-field-legend.entry.js +1 -1
- package/dist/esm/seki-field.entry.js +1 -1
- package/dist/esm/seki-fieldset.entry.js +1 -1
- package/dist/esm/seki-input.entry.js +1 -1
- package/dist/esm/seki-select-content.entry.js +1 -1
- package/dist/esm/seki-select-group.entry.js +1 -1
- package/dist/esm/seki-select-option.entry.js +1 -1
- package/dist/esm/seki-select-trigger.entry.js +1 -1
- package/dist/esm/seki-select.entry.js +1 -1
- package/dist/esm/seki-sidebar-content.entry.js +18 -0
- package/dist/esm/seki-sidebar-footer.entry.js +18 -0
- package/dist/esm/seki-sidebar-group.entry.js +103 -0
- package/dist/esm/seki-sidebar-header.entry.js +18 -0
- package/dist/esm/seki-sidebar-menu-item.entry.js +172 -0
- package/dist/esm/seki-sidebar-menu-sub.entry.js +97 -0
- package/dist/esm/seki-sidebar-menu.entry.js +18 -0
- package/dist/esm/seki-sidebar-trigger.entry.js +84 -0
- package/dist/esm/seki-sidebar.entry.js +340 -0
- package/dist/esm/seki-skeleton.entry.js +2 -2
- package/dist/esm/seki-switch.entry.js +84 -2
- package/dist/esm/seki-tooltip.entry.js +1 -1
- package/dist/esm/sekiui.js +3 -3
- package/dist/sekiui/index.esm.js +1 -1
- package/dist/sekiui/p-01cfb4e7.entry.js +1 -0
- package/dist/sekiui/{p-97e6e5ce.entry.js → p-042ec460.entry.js} +1 -1
- package/dist/sekiui/{p-3e088b5a.entry.js → p-10c008fc.entry.js} +1 -1
- package/dist/sekiui/{p-ed440425.entry.js → p-352bd295.entry.js} +1 -1
- package/dist/sekiui/p-37c5f4d9.entry.js +1 -0
- package/dist/sekiui/p-40fb71d6.entry.js +1 -0
- package/dist/sekiui/{p-eefbc037.entry.js → p-44191aed.entry.js} +1 -1
- package/dist/sekiui/{p-81709fc2.entry.js → p-4423d621.entry.js} +1 -1
- package/dist/sekiui/{p-9af5286b.entry.js → p-4636588f.entry.js} +1 -1
- package/dist/sekiui/p-471b97a5.entry.js +1 -0
- package/dist/sekiui/{p-0544d787.entry.js → p-56f0d754.entry.js} +1 -1
- package/dist/sekiui/{p-43f7c542.entry.js → p-5bc0f5aa.entry.js} +1 -1
- package/dist/sekiui/{p-eedf44b5.entry.js → p-6164cd8a.entry.js} +1 -1
- package/dist/sekiui/{p-b479935d.entry.js → p-635f4098.entry.js} +1 -1
- package/dist/sekiui/{p-35f8f9c4.entry.js → p-743fc6d9.entry.js} +1 -1
- package/dist/sekiui/p-83e65cbe.entry.js +1 -0
- package/dist/sekiui/p-8b7bd061.entry.js +1 -0
- package/dist/sekiui/{p-009183ab.entry.js → p-8d9a4878.entry.js} +1 -1
- package/dist/sekiui/p-9cb9cdfe.entry.js +1 -0
- package/dist/sekiui/p-9f2d95d7.entry.js +1 -0
- package/dist/sekiui/p-BJCq8m2o.js +1 -0
- package/dist/sekiui/p-Dfzpqq0a.js +2 -0
- package/dist/sekiui/{p-b22df79e.entry.js → p-a1a71958.entry.js} +1 -1
- package/dist/sekiui/{p-dd1e3e87.entry.js → p-a71e0c55.entry.js} +1 -1
- package/dist/sekiui/{p-1607dc4d.entry.js → p-ae227955.entry.js} +1 -1
- package/dist/sekiui/{p-cf11115c.entry.js → p-b365f5fb.entry.js} +1 -1
- package/dist/sekiui/{p-6bde807e.entry.js → p-b387a2a5.entry.js} +1 -1
- package/dist/sekiui/p-b8590f4d.entry.js +1 -0
- package/dist/sekiui/{p-88f91658.entry.js → p-c98b6d6a.entry.js} +1 -1
- package/dist/sekiui/{p-e71ad432.entry.js → p-d73cdb9a.entry.js} +1 -1
- package/dist/sekiui/{p-b10d81a6.entry.js → p-d96e770e.entry.js} +1 -1
- package/dist/sekiui/p-e62dd89b.entry.js +1 -0
- package/dist/sekiui/{p-d4c92041.entry.js → p-e7bb140c.entry.js} +1 -1
- package/dist/sekiui/{p-6e238adf.entry.js → p-eecc18f3.entry.js} +1 -1
- package/dist/sekiui/{p-4d57c6ea.entry.js → p-ff636955.entry.js} +1 -1
- package/dist/sekiui/sekiui.esm.js +1 -1
- package/dist/types/components/sidebar/seki-sidebar-content.d.ts +18 -0
- package/dist/types/components/sidebar/seki-sidebar-footer.d.ts +16 -0
- package/dist/types/components/sidebar/seki-sidebar-group.d.ts +81 -0
- package/dist/types/components/sidebar/seki-sidebar-header.d.ts +17 -0
- package/dist/types/components/sidebar/seki-sidebar-menu-item.d.ts +104 -0
- package/dist/types/components/sidebar/seki-sidebar-menu-sub.d.ts +81 -0
- package/dist/types/components/sidebar/seki-sidebar-menu.d.ts +17 -0
- package/dist/types/components/sidebar/seki-sidebar-trigger.d.ts +53 -0
- package/dist/types/components/sidebar/seki-sidebar.d.ts +185 -0
- package/dist/types/components/sidebar/types.d.ts +245 -0
- package/dist/types/components.d.ts +508 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/services/focus.d.ts +74 -0
- package/dist/types/services/index.d.ts +7 -0
- package/dist/types/services/keyboard.d.ts +74 -0
- package/dist/types/services/media-query.d.ts +121 -0
- package/dist/types/types.d.ts +105 -0
- package/dist/types/utils/a11y.d.ts +130 -0
- package/dist/types/utils/common.d.ts +142 -0
- package/package.json +2 -1
- package/dist/sekiui/p-9fe07f6e.entry.js +0 -1
- package/dist/sekiui/p-CuXbV_yz.js +0 -2
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keyboard Service
|
|
3
|
+
* Provides normalized keyboard event handling and shortcut management
|
|
4
|
+
* Handles cross-platform shortcuts (Ctrl/Cmd combinations)
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* KeyboardService - Centralized keyboard event management
|
|
8
|
+
* Provides:
|
|
9
|
+
* - Normalized keyboard shortcuts (handles Ctrl vs Cmd on Mac)
|
|
10
|
+
* - Cross-platform shortcut registration
|
|
11
|
+
* - Event cleanup and teardown
|
|
12
|
+
*/
|
|
13
|
+
class KeyboardService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.shortcuts = new Map();
|
|
16
|
+
this.listeners = new Map();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register a keyboard shortcut
|
|
20
|
+
* @param id - Unique identifier for this shortcut
|
|
21
|
+
* @param options - Shortcut configuration
|
|
22
|
+
*/
|
|
23
|
+
registerShortcut(id, options) {
|
|
24
|
+
if (typeof window === 'undefined')
|
|
25
|
+
return;
|
|
26
|
+
const { key, ctrl = false, shift = false, alt = false, meta = false, handler, preventDefault = true } = options;
|
|
27
|
+
const handleKeyDown = (event) => {
|
|
28
|
+
const keyboardEvent = event;
|
|
29
|
+
const keyMatches = keyboardEvent.key.toLowerCase() === key.toLowerCase();
|
|
30
|
+
const ctrlMatches = ctrl ? keyboardEvent.ctrlKey : true;
|
|
31
|
+
const shiftMatches = shift ? keyboardEvent.shiftKey : !keyboardEvent.shiftKey;
|
|
32
|
+
const altMatches = alt ? keyboardEvent.altKey : !keyboardEvent.altKey;
|
|
33
|
+
// metaKey matches both metaKey (Mac Cmd) and ctrlKey (Windows/Linux) for cross-platform support
|
|
34
|
+
const metaMatches = meta ? keyboardEvent.metaKey || keyboardEvent.ctrlKey : !keyboardEvent.metaKey && !keyboardEvent.ctrlKey;
|
|
35
|
+
if (keyMatches && ctrlMatches && shiftMatches && altMatches && metaMatches) {
|
|
36
|
+
if (preventDefault) {
|
|
37
|
+
keyboardEvent.preventDefault();
|
|
38
|
+
}
|
|
39
|
+
handler(keyboardEvent);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
this.shortcuts.set(id, {
|
|
43
|
+
key,
|
|
44
|
+
ctrlKey: ctrl,
|
|
45
|
+
shiftKey: shift,
|
|
46
|
+
altKey: alt,
|
|
47
|
+
metaKey: meta,
|
|
48
|
+
handler: handleKeyDown,
|
|
49
|
+
});
|
|
50
|
+
this.listeners.set(id, handleKeyDown);
|
|
51
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Register a shortcut that works with Ctrl on Windows/Linux and Cmd on Mac
|
|
55
|
+
* @param id - Unique identifier for this shortcut
|
|
56
|
+
* @param key - The key to listen for
|
|
57
|
+
* @param handler - Callback when shortcut is triggered
|
|
58
|
+
* @param preventDefault - Whether to prevent default browser behavior
|
|
59
|
+
*/
|
|
60
|
+
registerCtrlOrCmdShortcut(id, key, handler, preventDefault = true) {
|
|
61
|
+
if (typeof window === 'undefined')
|
|
62
|
+
return;
|
|
63
|
+
const handleKeyDown = (event) => {
|
|
64
|
+
const keyboardEvent = event;
|
|
65
|
+
const keyMatches = keyboardEvent.key.toLowerCase() === key.toLowerCase();
|
|
66
|
+
const modifierMatches = keyboardEvent.ctrlKey || keyboardEvent.metaKey;
|
|
67
|
+
if (keyMatches && modifierMatches && !keyboardEvent.shiftKey && !keyboardEvent.altKey) {
|
|
68
|
+
if (preventDefault) {
|
|
69
|
+
keyboardEvent.preventDefault();
|
|
70
|
+
}
|
|
71
|
+
handler(keyboardEvent);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
this.listeners.set(id, handleKeyDown);
|
|
75
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Unregister a keyboard shortcut
|
|
79
|
+
* @param id - The identifier of the shortcut to remove
|
|
80
|
+
*/
|
|
81
|
+
unregisterShortcut(id) {
|
|
82
|
+
if (typeof window === 'undefined')
|
|
83
|
+
return;
|
|
84
|
+
const listener = this.listeners.get(id);
|
|
85
|
+
if (listener) {
|
|
86
|
+
window.removeEventListener('keydown', listener);
|
|
87
|
+
this.listeners.delete(id);
|
|
88
|
+
}
|
|
89
|
+
this.shortcuts.delete(id);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Unregister all shortcuts and clean up
|
|
93
|
+
*/
|
|
94
|
+
cleanup() {
|
|
95
|
+
if (typeof window === 'undefined')
|
|
96
|
+
return;
|
|
97
|
+
this.listeners.forEach((listener) => {
|
|
98
|
+
window.removeEventListener('keydown', listener);
|
|
99
|
+
});
|
|
100
|
+
this.listeners.clear();
|
|
101
|
+
this.shortcuts.clear();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a keyboard event matches a specific key combination
|
|
105
|
+
* @param event - The keyboard event to check
|
|
106
|
+
* @param key - The key to match
|
|
107
|
+
* @param ctrl - Whether Ctrl/Cmd should be pressed
|
|
108
|
+
* @param shift - Whether Shift should be pressed
|
|
109
|
+
* @param alt - Whether Alt should be pressed
|
|
110
|
+
*/
|
|
111
|
+
matchesShortcut(event, key, ctrl = false, shift = false, alt = false) {
|
|
112
|
+
const keyMatches = event.key.toLowerCase() === key.toLowerCase();
|
|
113
|
+
const ctrlMatches = ctrl ? event.ctrlKey || event.metaKey : !event.ctrlKey && !event.metaKey;
|
|
114
|
+
const shiftMatches = shift ? event.shiftKey : !event.shiftKey;
|
|
115
|
+
const altMatches = alt ? event.altKey : !event.altKey;
|
|
116
|
+
return keyMatches && ctrlMatches && shiftMatches && altMatches;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Singleton instance
|
|
120
|
+
let keyboardServiceInstance = null;
|
|
121
|
+
/**
|
|
122
|
+
* Get the singleton KeyboardService instance
|
|
123
|
+
*/
|
|
124
|
+
function getKeyboardService() {
|
|
125
|
+
if (!keyboardServiceInstance) {
|
|
126
|
+
keyboardServiceInstance = new KeyboardService();
|
|
127
|
+
}
|
|
128
|
+
return keyboardServiceInstance;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a new isolated KeyboardService instance
|
|
132
|
+
* Useful for testing or when you need independent event handling
|
|
133
|
+
*/
|
|
134
|
+
function createKeyboardService() {
|
|
135
|
+
return new KeyboardService();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export { KeyboardService as K, createKeyboardService as c, getKeyboardService as g };
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { p as proxyCustomElement, H, d as createEvent, h, c as Host } from './p-Bp7tjKwQ.js';
|
|
2
|
+
|
|
3
|
+
const sekiSwitchCss = ":host{--seki-neutral-50:hsl(0, 0%, 98%);--seki-neutral-100:hsl(0, 0%, 96.1%);--seki-neutral-200:hsl(0, 0%, 89.8%);--seki-neutral-300:hsl(0, 0%, 83.1%);--seki-neutral-400:hsl(0, 0%, 63.9%);--seki-neutral-500:hsl(0, 0%, 45.1%);--seki-neutral-600:hsl(0, 0%, 32.2%);--seki-neutral-700:hsl(0, 0%, 25.1%);--seki-neutral-800:hsl(0, 0%, 14.9%);--seki-neutral-900:hsl(0, 0%, 9%);--seki-neutral-950:hsl(0, 0%, 3.9%);--seki-primary-50:hsl(210, 100%, 97%);--seki-primary-100:hsl(210, 95%, 93%);--seki-primary-200:hsl(210, 95%, 85%);--seki-primary-300:hsl(210, 90%, 73%);--seki-primary-400:hsl(210, 85%, 58%);--seki-primary-500:hsl(210, 80%, 48%);--seki-primary-600:hsl(210, 75%, 40%);--seki-primary-700:hsl(210, 70%, 32%);--seki-primary-800:hsl(210, 65%, 25%);--seki-primary-900:hsl(210, 60%, 18%);--seki-primary-950:hsl(210, 55%, 10%);--seki-success-500:hsl(142, 71%, 45%);--seki-success-600:hsl(142, 71%, 35%);--seki-warning-500:hsl(38, 92%, 50%);--seki-warning-600:hsl(38, 92%, 40%);--seki-destructive-500:hsl(0, 84.2%, 60.2%);--seki-destructive-600:hsl(0, 72%, 41%)}:host{--seki-background:hsl(0, 0%, 100%);--seki-foreground:hsl(0, 0%, 3.9%);--seki-muted:hsl(0, 0%, 96.1%);--seki-muted-foreground:hsl(0, 0%, 45.1%);--seki-card:hsl(0, 0%, 100%);--seki-card-foreground:hsl(0, 0%, 3.9%);--seki-popover:hsl(0, 0%, 100%);--seki-popover-foreground:hsl(0, 0%, 3.9%);--seki-border:hsl(0, 0%, 89.8%);--seki-input:hsl(0, 0%, 89.8%);--seki-primary:hsl(0, 0%, 9%);--seki-primary-foreground:hsl(0, 0%, 98%);--seki-secondary:hsl(0, 0%, 96.1%);--seki-secondary-foreground:hsl(0, 0%, 9%);--seki-accent:hsl(0, 0%, 96.1%);--seki-accent-foreground:hsl(0, 0%, 9%);--seki-destructive:hsl(0, 84.2%, 60.2%);--seki-destructive-foreground:hsl(0, 0%, 98%);--seki-ring:hsl(0, 0%, 3.9%);--seki-bg-primary:var(--seki-background);--seki-bg-secondary:var(--seki-muted);--seki-bg-tertiary:var(--seki-accent);--seki-text-primary:var(--seki-foreground);--seki-text-secondary:var(--seki-muted-foreground);--seki-text-tertiary:var(--seki-neutral-400);--seki-border-default:var(--seki-border);--seki-border-emphasis:var(--seki-neutral-300)}:host([data-theme='dark']){--seki-background:hsl(0, 0%, 3.9%);--seki-foreground:hsl(0, 0%, 98%);--seki-muted:hsl(0, 0%, 14.9%);--seki-muted-foreground:hsl(0, 0%, 63.9%);--seki-card:hsl(0, 0%, 3.9%);--seki-card-foreground:hsl(0, 0%, 98%);--seki-popover:hsl(0, 0%, 3.9%);--seki-popover-foreground:hsl(0, 0%, 98%);--seki-border:hsl(0, 0%, 14.9%);--seki-input:hsl(0, 0%, 14.9%);--seki-primary:hsl(0, 0%, 98%);--seki-primary-foreground:hsl(0, 0%, 9%);--seki-secondary:hsl(0, 0%, 14.9%);--seki-secondary-foreground:hsl(0, 0%, 98%);--seki-accent:hsl(0, 0%, 14.9%);--seki-accent-foreground:hsl(0, 0%, 98%);--seki-destructive:hsl(0, 62.8%, 30.6%);--seki-destructive-foreground:hsl(0, 0%, 98%);--seki-ring:hsl(0, 0%, 83.1%);--seki-bg-primary:var(--seki-background);--seki-bg-secondary:var(--seki-muted);--seki-bg-tertiary:var(--seki-accent);--seki-text-primary:var(--seki-foreground);--seki-text-secondary:var(--seki-muted-foreground);--seki-text-tertiary:var(--seki-neutral-600);--seki-border-default:var(--seki-border);--seki-border-emphasis:var(--seki-neutral-700);--seki-button-primary-hover-bg:hsl(0, 0%, 98%, 0.9);--seki-button-secondary-hover-bg:hsl(0, 0%, 14.9%, 0.8)}:host{--seki-button-primary-bg:var(--seki-primary);--seki-button-primary-text:var(--seki-primary-foreground);--seki-button-primary-border:transparent;--seki-button-primary-hover-bg:hsl(0, 0%, 9%, 0.9);--seki-button-primary-hover-text:var(--seki-primary-foreground);--seki-button-primary-hover-border:transparent;--seki-button-secondary-bg:var(--seki-secondary);--seki-button-secondary-text:var(--seki-secondary-foreground);--seki-button-secondary-border:transparent;--seki-button-secondary-hover-bg:hsl(0, 0%, 96.1%, 0.8);--seki-button-secondary-hover-text:var(--seki-secondary-foreground);--seki-button-secondary-hover-border:transparent;--seki-button-outline-bg:transparent;--seki-button-outline-text:var(--seki-foreground);--seki-button-outline-border:var(--seki-input);--seki-button-outline-hover-bg:var(--seki-accent);--seki-button-outline-hover-text:var(--seki-accent-foreground);--seki-button-outline-hover-border:var(--seki-input);--seki-button-ghost-bg:transparent;--seki-button-ghost-text:var(--seki-foreground);--seki-button-ghost-border:transparent;--seki-button-ghost-hover-bg:var(--seki-accent);--seki-button-ghost-hover-text:var(--seki-accent-foreground);--seki-button-ghost-hover-border:transparent;--seki-button-destructive-bg:var(--seki-destructive);--seki-button-destructive-text:var(--seki-destructive-foreground);--seki-button-destructive-border:transparent;--seki-button-destructive-hover-bg:hsl(0, 84.2%, 60.2%, 0.9);--seki-button-destructive-hover-border:transparent;--seki-button-sm-padding-x:var(--seki-spacing-3, 0.75rem);--seki-button-sm-padding-y:0.375rem;--seki-button-sm-font-size:var(--seki-text-sm, 0.875rem);--seki-button-sm-height:2.25rem;--seki-button-md-padding-x:var(--seki-spacing-4, 1rem);--seki-button-md-padding-y:var(--seki-spacing-2, 0.5rem);--seki-button-md-font-size:var(--seki-text-base, 1rem);--seki-button-md-height:2.5rem;--seki-button-lg-padding-x:2rem;--seki-button-lg-padding-y:0.5rem;--seki-button-lg-font-size:1rem;--seki-button-lg-height:2.75rem;--seki-button-icon-sm-size:2rem;--seki-button-icon-size:2.5rem;--seki-button-icon-lg-size:3rem;--seki-button-icon-gap:0.5rem;--seki-button-link-bg:transparent;--seki-button-link-text:var(--seki-primary);--seki-button-link-border:transparent;--seki-button-link-hover-bg:transparent;--seki-button-link-hover-text:var(--seki-primary);--seki-button-link-hover-border:transparent;--seki-button-radius:var(--seki-radius-md, 0.375rem);--seki-button-font-weight:var(--seki-font-medium, 500);--seki-button-transition-duration:150ms;--seki-button-transition-timing:ease-in-out;--seki-button-shadow:var(--seki-shadow-sm, 0 1px 2px 0 rgb(0 0 0 / 0.05));--seki-button-shadow-hover:var(--seki-shadow-md, 0 4px 6px -1px rgb(0 0 0 / 0.1));--seki-button-disabled-opacity:0.5;--seki-input-bg:var(--seki-background);--seki-input-border:var(--seki-border);--seki-input-text:var(--seki-foreground);--seki-input-placeholder:var(--seki-muted-foreground);--seki-input-ring:var(--seki-ring);--seki-input-invalid-border:var(--seki-destructive);--seki-input-invalid-ring:var(--seki-destructive);--seki-input-disabled-opacity:0.5;--seki-input-radius:var(--seki-radius-md);--seki-input-ring-offset:2px;--seki-select-trigger-bg:var(--seki-background);--seki-select-trigger-border:1px solid var(--seki-border);--seki-select-trigger-bg-hover:var(--seki-muted);--seki-select-trigger-radius:var(--seki-radius-md);--seki-select-trigger-min-height:2.5rem;--seki-select-trigger-padding:0.5rem 0.75rem;--seki-select-trigger-gap:0.5rem;--seki-select-content-bg:var(--seki-popover);--seki-select-content-border:1px solid var(--seki-border);--seki-select-content-shadow:0 10px 15px -3px rgb(0 0 0 / 0.1);--seki-select-content-radius:var(--seki-radius-md);--seki-select-content-padding:0.5rem 0;--seki-select-option-padding:0.5rem 0.75rem;--seki-select-option-gap:0.5rem;--seki-select-option-radius:var(--seki-radius-sm);--seki-select-option-bg-hover:var(--seki-muted);--seki-select-option-bg-selected:var(--seki-muted);--seki-select-group-label-padding:0.5rem 0.75rem;--seki-select-group-label-font-size:var(--seki-font-size-xs);--seki-select-group-label-font-weight:var(--seki-font-semibold);--seki-select-group-label-color:var(--seki-muted-foreground);--seki-select-group-separator:1px solid var(--seki-border)}:host{--seki-spacing-0:0;--seki-spacing-0-5:0.125rem;--seki-spacing-1:0.25rem;--seki-spacing-1-5:0.375rem;--seki-spacing-2:0.5rem;--seki-spacing-2-5:0.625rem;--seki-spacing-3:0.75rem;--seki-spacing-3-5:0.875rem;--seki-spacing-4:1rem;--seki-spacing-5:1.25rem;--seki-spacing-6:1.5rem;--seki-spacing-8:2rem;--seki-spacing-10:2.5rem;--seki-spacing-12:3rem;--seki-spacing-16:4rem;--seki-spacing-20:5rem;--seki-spacing-24:6rem;--seki-input-height-sm:2rem;--seki-input-height-md:2.5rem;--seki-input-height-lg:3rem;--seki-input-padding-x:0.75rem;--seki-input-padding-y:0.5rem;--seki-input-font-size:0.875rem;--seki-input-ring-offset:2px}:host{--seki-shadow-sm:0 1px 2px 0 rgb(0 0 0 / 0.05);--seki-shadow-md:0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);--seki-shadow-lg:0 10px 15px -3px rgb(0 0 0 / 0.15), 0 4px 6px -4px rgb(0 0 0 / 0.1)}:host{--seki-font-sans:-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',\n Arial, sans-serif;--seki-font-mono:ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;--seki-text-xs:0.75rem;--seki-text-sm:0.875rem;--seki-text-base:1rem;--seki-text-lg:1.125rem;--seki-text-xl:1.25rem;--seki-text-2xl:1.5rem;--seki-text-3xl:1.875rem;--seki-text-4xl:2.25rem;--seki-font-normal:400;--seki-font-medium:500;--seki-font-semibold:600;--seki-font-bold:700;--seki-leading-tight:1.25;--seki-leading-normal:1.5;--seki-leading-relaxed:1.75}:host{--seki-radius-sm:0.25rem;--seki-radius-md:0.375rem;--seki-radius-lg:0.5rem;--seki-radius-xl:1rem;}:host{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px}.switch{width:var(--seki-switch-width, 2.75rem);height:var(--seki-switch-height, 1.5rem);position:relative;display:inline-flex;align-items:center;flex-shrink:0;background-color:var(--seki-switch-bg-unchecked, hsl(var(--muted, 240 4.8% 95.9%)));border-radius:9999px;cursor:pointer;transition:background-color var(--seki-switch-transition-duration, 150ms) ease-out;outline:none}.switch:focus-visible{outline:2px solid var(--seki-switch-focus-ring, hsl(var(--ring, 240 5% 64.9%)));outline-offset:2px}:host([data-state=\"checked\"]) .switch{background-color:var(--seki-switch-bg-checked, hsl(var(--primary, 240 5.9% 10%)))}:host([data-disabled]) .switch{background-color:var(--seki-switch-bg-disabled, hsl(var(--muted, 240 4.8% 95.9%) / 0.5));cursor:not-allowed;opacity:0.5}.thumb{width:var(--seki-switch-thumb-size, 1.25rem);height:var(--seki-switch-thumb-size, 1.25rem);background-color:var(--seki-switch-thumb-bg, hsl(var(--background, 0 0% 100%)));position:absolute;left:0.125rem;border-radius:50%;box-shadow:0 1px 2px 0 rgb(0 0 0 / 0.05);transition:transform var(--seki-switch-transition-duration, 150ms) ease-out;pointer-events:none}:host([data-state=\"checked\"]) .thumb{transform:translateX(calc(var(--seki-switch-width, 2.75rem) - var(--seki-switch-thumb-size, 1.25rem) - 0.25rem))}@media (prefers-color-scheme: dark){.switch{--seki-switch-bg-unchecked:hsl(var(--muted, 240 3.7% 15.9%))}.thumb{--seki-switch-thumb-bg:hsl(var(--background, 240 10% 3.9%))}}";
|
|
4
|
+
|
|
5
|
+
const SekiSwitch = /*@__PURE__*/ proxyCustomElement(class SekiSwitch extends H {
|
|
6
|
+
constructor(registerHost) {
|
|
7
|
+
super();
|
|
8
|
+
if (registerHost !== false) {
|
|
9
|
+
this.__registerHost();
|
|
10
|
+
}
|
|
11
|
+
this.__attachShadow();
|
|
12
|
+
this.sekiChange = createEvent(this, "sekiChange");
|
|
13
|
+
/**
|
|
14
|
+
* @description Initial checked state for uncontrolled mode. Ignored if checked prop is provided.
|
|
15
|
+
*/
|
|
16
|
+
this.defaultChecked = false;
|
|
17
|
+
/**
|
|
18
|
+
* @description Disables all interactions when true.
|
|
19
|
+
*/
|
|
20
|
+
this.disabled = false;
|
|
21
|
+
/**
|
|
22
|
+
* @description Marks switch as required for form validation.
|
|
23
|
+
*/
|
|
24
|
+
this.required = false;
|
|
25
|
+
/**
|
|
26
|
+
* @description Value sent in form data when switch is checked. Defaults to 'on'.
|
|
27
|
+
*/
|
|
28
|
+
this.value = 'on';
|
|
29
|
+
/**
|
|
30
|
+
* @description Internal checked state for uncontrolled mode.
|
|
31
|
+
*/
|
|
32
|
+
this.internalChecked = false;
|
|
33
|
+
/**
|
|
34
|
+
* Toggle switch state and emit event
|
|
35
|
+
*/
|
|
36
|
+
this.toggle = () => {
|
|
37
|
+
if (this.disabled) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const newCheckedState = !this.isChecked;
|
|
41
|
+
// Update internal state only in uncontrolled mode
|
|
42
|
+
if (this.checked === undefined) {
|
|
43
|
+
this.internalChecked = newCheckedState;
|
|
44
|
+
}
|
|
45
|
+
// Always emit event (for both controlled and uncontrolled)
|
|
46
|
+
this.sekiChange.emit({ checked: newCheckedState });
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Handle click events
|
|
50
|
+
*/
|
|
51
|
+
this.handleClick = () => {
|
|
52
|
+
this.toggle();
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize internal checked state from defaultChecked
|
|
57
|
+
*/
|
|
58
|
+
componentWillLoad() {
|
|
59
|
+
this.internalChecked = this.defaultChecked;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get current checked state (controlled vs uncontrolled)
|
|
63
|
+
*/
|
|
64
|
+
get isChecked() {
|
|
65
|
+
return this.checked !== undefined ? this.checked : this.internalChecked;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handle keyboard events (Space and Enter keys)
|
|
69
|
+
*/
|
|
70
|
+
handleKeyDown(event) {
|
|
71
|
+
if (this.disabled) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Toggle on Space or Enter
|
|
75
|
+
if (event.key === ' ' || event.key === 'Enter') {
|
|
76
|
+
event.preventDefault(); // Prevent page scroll on Space
|
|
77
|
+
this.toggle();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
render() {
|
|
81
|
+
const isChecked = this.isChecked;
|
|
82
|
+
const dataState = isChecked ? 'checked' : 'unchecked';
|
|
83
|
+
return (h(Host, { key: '3046a6647d7cfd10bf9789aa9cf3b7a88b9a3a10', "data-state": dataState, "data-disabled": this.disabled ? '' : null }, h("div", { key: 'cd8423b9f7295e5e3ef9d7e64ead3fe6502386a2', class: "switch", part: "switch", role: "switch", "aria-checked": isChecked ? 'true' : 'false', "aria-disabled": this.disabled ? 'true' : undefined, "aria-label": this.ariaLabel || undefined, "aria-required": this.required ? 'true' : undefined, tabindex: this.disabled ? -1 : 0, onClick: this.handleClick }, h("span", { key: '618ab67d5fab80323f64ec0b1b342561be2585b0', class: "thumb", part: "thumb" })), this.name && (h("input", { key: 'd51e9108038b8796175082231ca3ce7e61106f31', type: "checkbox", name: this.name, value: this.value, checked: isChecked, required: this.required, disabled: this.disabled, style: { display: 'none' }, tabindex: -1, "aria-hidden": "true" }))));
|
|
84
|
+
}
|
|
85
|
+
static get style() { return sekiSwitchCss; }
|
|
86
|
+
}, [257, "seki-switch", {
|
|
87
|
+
"checked": [4],
|
|
88
|
+
"defaultChecked": [4, "default-checked"],
|
|
89
|
+
"disabled": [4],
|
|
90
|
+
"required": [4],
|
|
91
|
+
"name": [1],
|
|
92
|
+
"value": [1],
|
|
93
|
+
"ariaLabel": [1, "aria-label"],
|
|
94
|
+
"internalChecked": [32]
|
|
95
|
+
}, [[0, "keydown", "handleKeyDown"]]]);
|
|
96
|
+
function defineCustomElement() {
|
|
97
|
+
if (typeof customElements === "undefined") {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const components = ["seki-switch"];
|
|
101
|
+
components.forEach(tagName => { switch (tagName) {
|
|
102
|
+
case "seki-switch":
|
|
103
|
+
if (!customElements.get(tagName)) {
|
|
104
|
+
customElements.define(tagName, SekiSwitch);
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
} });
|
|
108
|
+
}
|
|
109
|
+
defineCustomElement();
|
|
110
|
+
|
|
111
|
+
export { SekiSwitch as S, defineCustomElement as d };
|