@sekiui/elements 0.0.55 → 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.
Files changed (298) hide show
  1. package/dist/cdn/index.js +1053 -91
  2. package/dist/cdn/p-BJCq8m2o.js +138 -0
  3. package/dist/cdn/p-BfRJQMIU.js +111 -0
  4. package/dist/cdn/{p-bMBhrs0a.js → p-Bp7tjKwQ.js} +427 -7
  5. package/dist/cdn/seki-button.js +1 -1
  6. package/dist/cdn/seki-card-action.d.ts +11 -0
  7. package/dist/cdn/seki-card-action.js +38 -0
  8. package/dist/cdn/seki-card-content.d.ts +11 -0
  9. package/dist/cdn/seki-card-content.js +38 -0
  10. package/dist/cdn/seki-card-description.d.ts +11 -0
  11. package/dist/cdn/seki-card-description.js +38 -0
  12. package/dist/cdn/seki-card-footer.d.ts +11 -0
  13. package/dist/cdn/seki-card-footer.js +44 -0
  14. package/dist/cdn/seki-card-header.d.ts +11 -0
  15. package/dist/cdn/seki-card-header.js +38 -0
  16. package/dist/cdn/seki-card-title.d.ts +11 -0
  17. package/dist/cdn/seki-card-title.js +59 -0
  18. package/dist/cdn/seki-card.d.ts +11 -0
  19. package/dist/cdn/seki-card.js +39 -0
  20. package/dist/cdn/seki-field-description.js +2 -2
  21. package/dist/cdn/seki-field-error.js +2 -2
  22. package/dist/cdn/seki-field-group.js +2 -2
  23. package/dist/cdn/seki-field-label.js +2 -2
  24. package/dist/cdn/seki-field-legend.js +2 -2
  25. package/dist/cdn/seki-field.js +2 -2
  26. package/dist/cdn/seki-fieldset.js +2 -2
  27. package/dist/cdn/seki-input.js +2 -2
  28. package/dist/cdn/seki-select-content.js +1 -1
  29. package/dist/cdn/seki-select-group.js +2 -2
  30. package/dist/cdn/seki-select-option.js +2 -2
  31. package/dist/cdn/seki-select-trigger.js +1 -1
  32. package/dist/cdn/seki-select.js +2 -2
  33. package/dist/cdn/seki-sidebar-content.d.ts +11 -0
  34. package/dist/cdn/seki-sidebar-content.js +38 -0
  35. package/dist/cdn/seki-sidebar-footer.d.ts +11 -0
  36. package/dist/cdn/seki-sidebar-footer.js +38 -0
  37. package/dist/cdn/seki-sidebar-group.d.ts +11 -0
  38. package/dist/cdn/seki-sidebar-group.js +131 -0
  39. package/dist/cdn/seki-sidebar-header.d.ts +11 -0
  40. package/dist/cdn/seki-sidebar-header.js +38 -0
  41. package/dist/cdn/seki-sidebar-menu-item.d.ts +11 -0
  42. package/dist/cdn/seki-sidebar-menu-item.js +200 -0
  43. package/dist/cdn/seki-sidebar-menu-sub.d.ts +11 -0
  44. package/dist/cdn/seki-sidebar-menu-sub.js +123 -0
  45. package/dist/cdn/seki-sidebar-menu.d.ts +11 -0
  46. package/dist/cdn/seki-sidebar-menu.js +38 -0
  47. package/dist/cdn/seki-sidebar-trigger.d.ts +11 -0
  48. package/dist/cdn/seki-sidebar-trigger.js +109 -0
  49. package/dist/cdn/seki-sidebar.d.ts +11 -0
  50. package/dist/cdn/seki-sidebar.js +380 -0
  51. package/dist/cdn/seki-skeleton.js +2 -2
  52. package/dist/cdn/seki-switch.js +1 -1
  53. package/dist/cdn/seki-tooltip.js +1 -1
  54. package/dist/cjs/{index-Dd6_-KaR.js → index-tQYksITZ.js} +426 -6
  55. package/dist/cjs/index.cjs.js +1115 -63
  56. package/dist/cjs/keyboard-Cjl5HYES.js +142 -0
  57. package/dist/cjs/loader.cjs.js +2 -2
  58. package/dist/cjs/seki-button.cjs.entry.js +1 -1
  59. package/dist/cjs/seki-card-action.cjs.entry.js +17 -0
  60. package/dist/cjs/seki-card-content.cjs.entry.js +17 -0
  61. package/dist/cjs/seki-card-description.cjs.entry.js +17 -0
  62. package/dist/cjs/seki-card-footer.cjs.entry.js +22 -0
  63. package/dist/cjs/seki-card-header.cjs.entry.js +17 -0
  64. package/dist/cjs/seki-card-title.cjs.entry.js +37 -0
  65. package/dist/cjs/seki-card.cjs.entry.js +17 -0
  66. package/dist/cjs/seki-field-description.cjs.entry.js +2 -2
  67. package/dist/cjs/seki-field-error.cjs.entry.js +2 -2
  68. package/dist/cjs/seki-field-group.cjs.entry.js +2 -2
  69. package/dist/cjs/seki-field-label.cjs.entry.js +2 -2
  70. package/dist/cjs/seki-field-legend.cjs.entry.js +2 -2
  71. package/dist/cjs/seki-field.cjs.entry.js +2 -2
  72. package/dist/cjs/seki-fieldset.cjs.entry.js +2 -2
  73. package/dist/cjs/seki-input.cjs.entry.js +2 -2
  74. package/dist/cjs/seki-select-content.cjs.entry.js +1 -1
  75. package/dist/cjs/seki-select-group.cjs.entry.js +2 -2
  76. package/dist/cjs/seki-select-option.cjs.entry.js +2 -2
  77. package/dist/cjs/seki-select-trigger.cjs.entry.js +1 -1
  78. package/dist/cjs/seki-select.cjs.entry.js +2 -2
  79. package/dist/cjs/seki-sidebar-content.cjs.entry.js +20 -0
  80. package/dist/cjs/seki-sidebar-footer.cjs.entry.js +20 -0
  81. package/dist/cjs/seki-sidebar-group.cjs.entry.js +105 -0
  82. package/dist/cjs/seki-sidebar-header.cjs.entry.js +20 -0
  83. package/dist/cjs/seki-sidebar-menu-item.cjs.entry.js +174 -0
  84. package/dist/cjs/seki-sidebar-menu-sub.cjs.entry.js +99 -0
  85. package/dist/cjs/seki-sidebar-menu.cjs.entry.js +20 -0
  86. package/dist/cjs/seki-sidebar-trigger.cjs.entry.js +86 -0
  87. package/dist/cjs/seki-sidebar.cjs.entry.js +342 -0
  88. package/dist/cjs/seki-skeleton.cjs.entry.js +2 -2
  89. package/dist/cjs/seki-switch.cjs.entry.js +81 -3
  90. package/dist/cjs/seki-tooltip.cjs.entry.js +1 -1
  91. package/dist/cjs/sekiui.cjs.js +2 -2
  92. package/dist/collection/collection-manifest.json +16 -0
  93. package/dist/collection/components/card/seki-card-action.js +50 -0
  94. package/dist/collection/components/card/seki-card-content.js +51 -0
  95. package/dist/collection/components/card/seki-card-description.js +48 -0
  96. package/dist/collection/components/card/seki-card-footer.js +83 -0
  97. package/dist/collection/components/card/seki-card-header.js +54 -0
  98. package/dist/collection/components/card/seki-card-title.js +95 -0
  99. package/dist/collection/components/card/seki-card.a11y.js +363 -0
  100. package/dist/collection/components/card/seki-card.css +608 -0
  101. package/dist/collection/components/card/seki-card.js +72 -0
  102. package/dist/collection/components/field/seki-field.js +1 -1
  103. package/dist/collection/components/field-description/seki-field-description.js +1 -1
  104. package/dist/collection/components/field-error/seki-field-error.js +1 -1
  105. package/dist/collection/components/field-group/seki-field-group.js +1 -1
  106. package/dist/collection/components/field-label/seki-field-label.js +1 -1
  107. package/dist/collection/components/field-legend/seki-field-legend.js +1 -1
  108. package/dist/collection/components/fieldset/seki-fieldset.js +1 -1
  109. package/dist/collection/components/input/seki-input.js +1 -1
  110. package/dist/collection/components/select/seki-select.js +1 -1
  111. package/dist/collection/components/select-group/seki-select-group.js +1 -1
  112. package/dist/collection/components/select-option/seki-select-option.js +1 -1
  113. package/dist/collection/components/sidebar/seki-sidebar-content.css +82 -0
  114. package/dist/collection/components/sidebar/seki-sidebar-content.js +33 -0
  115. package/dist/collection/components/sidebar/seki-sidebar-footer.css +44 -0
  116. package/dist/collection/components/sidebar/seki-sidebar-footer.js +31 -0
  117. package/dist/collection/components/sidebar/seki-sidebar-group.css +158 -0
  118. package/dist/collection/components/sidebar/seki-sidebar-group.js +300 -0
  119. package/dist/collection/components/sidebar/seki-sidebar-header.css +44 -0
  120. package/dist/collection/components/sidebar/seki-sidebar-header.js +32 -0
  121. package/dist/collection/components/sidebar/seki-sidebar-menu-item.css +196 -0
  122. package/dist/collection/components/sidebar/seki-sidebar-menu-item.js +403 -0
  123. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.css +357 -0
  124. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.js +256 -0
  125. package/dist/collection/components/sidebar/seki-sidebar-menu.css +25 -0
  126. package/dist/collection/components/sidebar/seki-sidebar-menu.js +32 -0
  127. package/dist/collection/components/sidebar/seki-sidebar-trigger.css +68 -0
  128. package/dist/collection/components/sidebar/seki-sidebar-trigger.js +175 -0
  129. package/dist/collection/components/sidebar/seki-sidebar.css +352 -0
  130. package/dist/collection/components/sidebar/seki-sidebar.js +812 -0
  131. package/dist/collection/components/sidebar/types.js +18 -0
  132. package/dist/collection/components/skeleton/seki-skeleton.js +1 -1
  133. package/dist/collection/index.js +7 -0
  134. package/dist/collection/services/focus.js +192 -0
  135. package/dist/collection/services/index.js +7 -0
  136. package/dist/collection/services/keyboard.js +136 -0
  137. package/dist/collection/services/media-query.js +254 -0
  138. package/dist/collection/types.js +41 -0
  139. package/dist/collection/utils/a11y.js +291 -0
  140. package/dist/collection/utils/common.js +286 -0
  141. package/dist/components/index.js +1053 -91
  142. package/dist/components/p-BJCq8m2o.js +138 -0
  143. package/dist/components/{p-QhPshhKB.js → p-BzYKy7d3.js} +427 -7
  144. package/dist/components/p-DwTISp-i.js +111 -0
  145. package/dist/components/seki-button.js +1 -1
  146. package/dist/components/seki-card-action.d.ts +11 -0
  147. package/dist/components/seki-card-action.js +38 -0
  148. package/dist/components/seki-card-content.d.ts +11 -0
  149. package/dist/components/seki-card-content.js +38 -0
  150. package/dist/components/seki-card-description.d.ts +11 -0
  151. package/dist/components/seki-card-description.js +38 -0
  152. package/dist/components/seki-card-footer.d.ts +11 -0
  153. package/dist/components/seki-card-footer.js +44 -0
  154. package/dist/components/seki-card-header.d.ts +11 -0
  155. package/dist/components/seki-card-header.js +38 -0
  156. package/dist/components/seki-card-title.d.ts +11 -0
  157. package/dist/components/seki-card-title.js +59 -0
  158. package/dist/components/seki-card.d.ts +11 -0
  159. package/dist/components/seki-card.js +39 -0
  160. package/dist/components/seki-field-description.js +2 -2
  161. package/dist/components/seki-field-error.js +2 -2
  162. package/dist/components/seki-field-group.js +2 -2
  163. package/dist/components/seki-field-label.js +2 -2
  164. package/dist/components/seki-field-legend.js +2 -2
  165. package/dist/components/seki-field.js +2 -2
  166. package/dist/components/seki-fieldset.js +2 -2
  167. package/dist/components/seki-input.js +2 -2
  168. package/dist/components/seki-select-content.js +1 -1
  169. package/dist/components/seki-select-group.js +2 -2
  170. package/dist/components/seki-select-option.js +2 -2
  171. package/dist/components/seki-select-trigger.js +1 -1
  172. package/dist/components/seki-select.js +2 -2
  173. package/dist/components/seki-sidebar-content.d.ts +11 -0
  174. package/dist/components/seki-sidebar-content.js +38 -0
  175. package/dist/components/seki-sidebar-footer.d.ts +11 -0
  176. package/dist/components/seki-sidebar-footer.js +38 -0
  177. package/dist/components/seki-sidebar-group.d.ts +11 -0
  178. package/dist/components/seki-sidebar-group.js +131 -0
  179. package/dist/components/seki-sidebar-header.d.ts +11 -0
  180. package/dist/components/seki-sidebar-header.js +38 -0
  181. package/dist/components/seki-sidebar-menu-item.d.ts +11 -0
  182. package/dist/components/seki-sidebar-menu-item.js +200 -0
  183. package/dist/components/seki-sidebar-menu-sub.d.ts +11 -0
  184. package/dist/components/seki-sidebar-menu-sub.js +123 -0
  185. package/dist/components/seki-sidebar-menu.d.ts +11 -0
  186. package/dist/components/seki-sidebar-menu.js +38 -0
  187. package/dist/components/seki-sidebar-trigger.d.ts +11 -0
  188. package/dist/components/seki-sidebar-trigger.js +109 -0
  189. package/dist/components/seki-sidebar.d.ts +11 -0
  190. package/dist/components/seki-sidebar.js +380 -0
  191. package/dist/components/seki-skeleton.js +2 -2
  192. package/dist/components/seki-switch.js +1 -1
  193. package/dist/components/seki-tooltip.js +1 -1
  194. package/dist/esm/{index-CuXbV_yz.js → index-Dfzpqq0a.js} +426 -6
  195. package/dist/esm/index.js +1053 -63
  196. package/dist/esm/keyboard-BJCq8m2o.js +138 -0
  197. package/dist/esm/loader.js +3 -3
  198. package/dist/esm/seki-button.entry.js +1 -1
  199. package/dist/esm/seki-card-action.entry.js +15 -0
  200. package/dist/esm/seki-card-content.entry.js +15 -0
  201. package/dist/esm/seki-card-description.entry.js +15 -0
  202. package/dist/esm/seki-card-footer.entry.js +20 -0
  203. package/dist/esm/seki-card-header.entry.js +15 -0
  204. package/dist/esm/seki-card-title.entry.js +35 -0
  205. package/dist/esm/seki-card.entry.js +15 -0
  206. package/dist/esm/seki-field-description.entry.js +2 -2
  207. package/dist/esm/seki-field-error.entry.js +2 -2
  208. package/dist/esm/seki-field-group.entry.js +2 -2
  209. package/dist/esm/seki-field-label.entry.js +2 -2
  210. package/dist/esm/seki-field-legend.entry.js +2 -2
  211. package/dist/esm/seki-field.entry.js +2 -2
  212. package/dist/esm/seki-fieldset.entry.js +2 -2
  213. package/dist/esm/seki-input.entry.js +2 -2
  214. package/dist/esm/seki-select-content.entry.js +1 -1
  215. package/dist/esm/seki-select-group.entry.js +2 -2
  216. package/dist/esm/seki-select-option.entry.js +2 -2
  217. package/dist/esm/seki-select-trigger.entry.js +1 -1
  218. package/dist/esm/seki-select.entry.js +2 -2
  219. package/dist/esm/seki-sidebar-content.entry.js +18 -0
  220. package/dist/esm/seki-sidebar-footer.entry.js +18 -0
  221. package/dist/esm/seki-sidebar-group.entry.js +103 -0
  222. package/dist/esm/seki-sidebar-header.entry.js +18 -0
  223. package/dist/esm/seki-sidebar-menu-item.entry.js +172 -0
  224. package/dist/esm/seki-sidebar-menu-sub.entry.js +97 -0
  225. package/dist/esm/seki-sidebar-menu.entry.js +18 -0
  226. package/dist/esm/seki-sidebar-trigger.entry.js +84 -0
  227. package/dist/esm/seki-sidebar.entry.js +340 -0
  228. package/dist/esm/seki-skeleton.entry.js +2 -2
  229. package/dist/esm/seki-switch.entry.js +84 -2
  230. package/dist/esm/seki-tooltip.entry.js +1 -1
  231. package/dist/esm/sekiui.js +3 -3
  232. package/dist/sekiui/index.esm.js +1 -1
  233. package/dist/sekiui/p-01cfb4e7.entry.js +1 -0
  234. package/dist/sekiui/{p-431f46a1.entry.js → p-042ec460.entry.js} +1 -1
  235. package/dist/sekiui/{p-a36f1ac4.entry.js → p-10c008fc.entry.js} +1 -1
  236. package/dist/sekiui/p-352bd295.entry.js +1 -0
  237. package/dist/sekiui/p-37c5f4d9.entry.js +1 -0
  238. package/dist/sekiui/p-40fb71d6.entry.js +1 -0
  239. package/dist/sekiui/{p-eefbc037.entry.js → p-44191aed.entry.js} +1 -1
  240. package/dist/sekiui/{p-81709fc2.entry.js → p-4423d621.entry.js} +1 -1
  241. package/dist/sekiui/{p-e679d501.entry.js → p-4636588f.entry.js} +1 -1
  242. package/dist/sekiui/p-471b97a5.entry.js +1 -0
  243. package/dist/sekiui/{p-de4735fb.entry.js → p-56f0d754.entry.js} +1 -1
  244. package/dist/sekiui/p-5bc0f5aa.entry.js +1 -0
  245. package/dist/sekiui/p-6164cd8a.entry.js +1 -0
  246. package/dist/sekiui/{p-0fba4e2d.entry.js → p-635f4098.entry.js} +1 -1
  247. package/dist/sekiui/{p-434be19f.entry.js → p-743fc6d9.entry.js} +1 -1
  248. package/dist/sekiui/p-83e65cbe.entry.js +1 -0
  249. package/dist/sekiui/p-8b7bd061.entry.js +1 -0
  250. package/dist/sekiui/p-8d9a4878.entry.js +1 -0
  251. package/dist/sekiui/p-9cb9cdfe.entry.js +1 -0
  252. package/dist/sekiui/p-9f2d95d7.entry.js +1 -0
  253. package/dist/sekiui/p-BJCq8m2o.js +1 -0
  254. package/dist/sekiui/p-Dfzpqq0a.js +2 -0
  255. package/dist/sekiui/p-a1a71958.entry.js +1 -0
  256. package/dist/sekiui/{p-bf942ad5.entry.js → p-a71e0c55.entry.js} +1 -1
  257. package/dist/sekiui/{p-6ff91f7f.entry.js → p-ae227955.entry.js} +1 -1
  258. package/dist/sekiui/{p-80a41058.entry.js → p-b365f5fb.entry.js} +1 -1
  259. package/dist/sekiui/{p-6bde807e.entry.js → p-b387a2a5.entry.js} +1 -1
  260. package/dist/sekiui/p-b8590f4d.entry.js +1 -0
  261. package/dist/sekiui/p-c98b6d6a.entry.js +1 -0
  262. package/dist/sekiui/{p-7c2245be.entry.js → p-d73cdb9a.entry.js} +1 -1
  263. package/dist/sekiui/{p-a56602b3.entry.js → p-d96e770e.entry.js} +1 -1
  264. package/dist/sekiui/p-e62dd89b.entry.js +1 -0
  265. package/dist/sekiui/{p-386c00ac.entry.js → p-e7bb140c.entry.js} +1 -1
  266. package/dist/sekiui/{p-6e238adf.entry.js → p-eecc18f3.entry.js} +1 -1
  267. package/dist/sekiui/p-ff636955.entry.js +1 -0
  268. package/dist/sekiui/sekiui.esm.js +1 -1
  269. package/dist/types/components/card/seki-card-action.d.ts +16 -0
  270. package/dist/types/components/card/seki-card-content.d.ts +17 -0
  271. package/dist/types/components/card/seki-card-description.d.ts +14 -0
  272. package/dist/types/components/card/seki-card-footer.d.ts +24 -0
  273. package/dist/types/components/card/seki-card-header.d.ts +20 -0
  274. package/dist/types/components/card/seki-card-title.d.ts +20 -0
  275. package/dist/types/components/card/seki-card.a11y.d.ts +1 -0
  276. package/dist/types/components/card/seki-card.d.ts +23 -0
  277. package/dist/types/components/sidebar/seki-sidebar-content.d.ts +18 -0
  278. package/dist/types/components/sidebar/seki-sidebar-footer.d.ts +16 -0
  279. package/dist/types/components/sidebar/seki-sidebar-group.d.ts +81 -0
  280. package/dist/types/components/sidebar/seki-sidebar-header.d.ts +17 -0
  281. package/dist/types/components/sidebar/seki-sidebar-menu-item.d.ts +104 -0
  282. package/dist/types/components/sidebar/seki-sidebar-menu-sub.d.ts +81 -0
  283. package/dist/types/components/sidebar/seki-sidebar-menu.d.ts +17 -0
  284. package/dist/types/components/sidebar/seki-sidebar-trigger.d.ts +53 -0
  285. package/dist/types/components/sidebar/seki-sidebar.d.ts +185 -0
  286. package/dist/types/components/sidebar/types.d.ts +245 -0
  287. package/dist/types/components.d.ts +899 -0
  288. package/dist/types/index.d.ts +4 -0
  289. package/dist/types/services/focus.d.ts +74 -0
  290. package/dist/types/services/index.d.ts +7 -0
  291. package/dist/types/services/keyboard.d.ts +74 -0
  292. package/dist/types/services/media-query.d.ts +121 -0
  293. package/dist/types/types.d.ts +105 -0
  294. package/dist/types/utils/a11y.d.ts +130 -0
  295. package/dist/types/utils/common.d.ts +142 -0
  296. package/package.json +2 -1
  297. package/dist/sekiui/p-9fe07f6e.entry.js +0 -1
  298. package/dist/sekiui/p-CuXbV_yz.js +0 -2
@@ -1,86 +1,1138 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-Dd6_-KaR.js');
3
+ var sekiSwitch_entry = require('./seki-switch.cjs.entry.js');
4
+ var keyboard = require('./keyboard-Cjl5HYES.js');
5
+ require('./index-tQYksITZ.js');
4
6
 
5
- 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%))}}";
6
-
7
- const SekiSwitch = class {
8
- constructor(hostRef) {
9
- index.registerInstance(this, hostRef);
10
- this.sekiChange = index.createEvent(this, "sekiChange");
11
- /**
12
- * @description Initial checked state for uncontrolled mode. Ignored if checked prop is provided.
13
- */
14
- this.defaultChecked = false;
15
- /**
16
- * @description Disables all interactions when true.
17
- */
18
- this.disabled = false;
19
- /**
20
- * @description Marks switch as required for form validation.
21
- */
22
- this.required = false;
23
- /**
24
- * @description Value sent in form data when switch is checked. Defaults to 'on'.
25
- */
26
- this.value = 'on';
27
- /**
28
- * @description Internal checked state for uncontrolled mode.
29
- */
30
- this.internalChecked = false;
31
- /**
32
- * Toggle switch state and emit event
33
- */
34
- this.toggle = () => {
35
- if (this.disabled) {
7
+ /**
8
+ * Focus Management Service
9
+ * Provides utilities for focus management, focus traps, and focus restoration
10
+ */
11
+ /**
12
+ * FocusService - Centralized focus management
13
+ * Provides:
14
+ * - Focus trap implementation
15
+ * - Focus restoration
16
+ * - Focusable element detection
17
+ * - Focus utilities for accessibility
18
+ */
19
+ class FocusService {
20
+ constructor() {
21
+ this.focusTrapStack = new Map();
22
+ this.previouslyFocusedElement = null;
23
+ }
24
+ /**
25
+ * Get all focusable elements within a container
26
+ * Includes buttons, links, inputs, textareas, selects, and elements with tabindex
27
+ */
28
+ getFocusableElements(container = document) {
29
+ const focusableSelectors = [
30
+ 'button:not([disabled])',
31
+ 'a[href]',
32
+ 'input:not([disabled])',
33
+ 'textarea:not([disabled])',
34
+ 'select:not([disabled])',
35
+ '[tabindex]:not([tabindex="-1"])',
36
+ ].join(',');
37
+ const elements = Array.from(container.querySelectorAll(focusableSelectors));
38
+ return elements.filter((el) => {
39
+ // Exclude hidden elements
40
+ const style = window.getComputedStyle(el);
41
+ return style.display !== 'none' && style.visibility !== 'hidden';
42
+ });
43
+ }
44
+ /**
45
+ * Check if an element is focusable
46
+ */
47
+ isFocusable(element) {
48
+ const focusableSelectors = [
49
+ 'button',
50
+ 'a[href]',
51
+ 'input',
52
+ 'textarea',
53
+ 'select',
54
+ '[tabindex]',
55
+ ];
56
+ return focusableSelectors.some((selector) => element.matches(selector)) && !element.hasAttribute('disabled');
57
+ }
58
+ /**
59
+ * Set focus to an element with optional callbacks
60
+ */
61
+ setFocus(element, options) {
62
+ var _a;
63
+ if (!element)
64
+ return false;
65
+ try {
66
+ element.focus({ preventScroll: (_a = options === null || options === void 0 ? void 0 : options.preventScroll) !== null && _a !== void 0 ? _a : false });
67
+ return document.activeElement === element;
68
+ }
69
+ catch (error) {
70
+ console.warn('Failed to set focus:', error);
71
+ return false;
72
+ }
73
+ }
74
+ /**
75
+ * Trap focus within a container (keyboard navigation stays within bounds)
76
+ * @param container - The element to trap focus within
77
+ * @param options - Focus trap options
78
+ */
79
+ createFocusTrap(container, options = {}) {
80
+ if (typeof window === 'undefined')
81
+ return;
82
+ const { initialFocus, restoreFocus = true } = options;
83
+ // Store the previously focused element for restoration
84
+ if (restoreFocus) {
85
+ this.previouslyFocusedElement = document.activeElement;
86
+ }
87
+ // Set initial focus
88
+ if (initialFocus) {
89
+ this.setFocus(initialFocus);
90
+ }
91
+ else {
92
+ const focusableElements = this.getFocusableElements(container);
93
+ if (focusableElements.length > 0) {
94
+ this.setFocus(focusableElements[0]);
95
+ }
96
+ }
97
+ // Handle Tab key for focus trap
98
+ const handleKeyDown = (event) => {
99
+ if (event.key !== 'Tab')
36
100
  return;
101
+ const focusableElements = this.getFocusableElements(container);
102
+ if (focusableElements.length === 0)
103
+ return;
104
+ const currentFocusIndex = focusableElements.indexOf(document.activeElement);
105
+ if (event.shiftKey) {
106
+ // Shift+Tab - move backwards
107
+ const previousIndex = currentFocusIndex - 1;
108
+ const targetElement = previousIndex >= 0 ? focusableElements[previousIndex] : focusableElements[focusableElements.length - 1];
109
+ event.preventDefault();
110
+ this.setFocus(targetElement);
37
111
  }
38
- const newCheckedState = !this.isChecked;
39
- // Update internal state only in uncontrolled mode
40
- if (this.checked === undefined) {
41
- this.internalChecked = newCheckedState;
112
+ else {
113
+ // Tab - move forwards
114
+ const nextIndex = currentFocusIndex + 1;
115
+ const targetElement = nextIndex < focusableElements.length ? focusableElements[nextIndex] : focusableElements[0];
116
+ event.preventDefault();
117
+ this.setFocus(targetElement);
42
118
  }
43
- // Always emit event (for both controlled and uncontrolled)
44
- this.sekiChange.emit({ checked: newCheckedState });
45
119
  };
46
- /**
47
- * Handle click events
48
- */
49
- this.handleClick = () => {
50
- this.toggle();
120
+ container.addEventListener('keydown', handleKeyDown);
121
+ this.focusTrapStack.set(container, this.previouslyFocusedElement);
122
+ // Store the handler for potential later cleanup
123
+ // Note: Manual cleanup should be done via releaseFocusTrap()
124
+ }
125
+ /**
126
+ * Release focus trap from a container
127
+ */
128
+ releaseFocusTrap(container, restoreFocus = true) {
129
+ const previousElement = this.focusTrapStack.get(container);
130
+ this.focusTrapStack.delete(container);
131
+ if (restoreFocus && previousElement) {
132
+ this.setFocus(previousElement);
133
+ }
134
+ }
135
+ /**
136
+ * Get the first focusable element in a container
137
+ */
138
+ getFirstFocusable(container = document) {
139
+ const focusable = this.getFocusableElements(container);
140
+ return focusable.length > 0 ? focusable[0] : null;
141
+ }
142
+ /**
143
+ * Get the last focusable element in a container
144
+ */
145
+ getLastFocusable(container = document) {
146
+ const focusable = this.getFocusableElements(container);
147
+ return focusable.length > 0 ? focusable[focusable.length - 1] : null;
148
+ }
149
+ /**
150
+ * Move focus to the next focusable element
151
+ */
152
+ focusNext(container = document) {
153
+ const focusable = this.getFocusableElements(container);
154
+ const currentIndex = focusable.indexOf(document.activeElement);
155
+ const nextIndex = (currentIndex + 1) % focusable.length;
156
+ if (focusable.length > 0) {
157
+ this.setFocus(focusable[nextIndex]);
158
+ return true;
159
+ }
160
+ return false;
161
+ }
162
+ /**
163
+ * Move focus to the previous focusable element
164
+ */
165
+ focusPrevious(container = document) {
166
+ const focusable = this.getFocusableElements(container);
167
+ const currentIndex = focusable.indexOf(document.activeElement);
168
+ const previousIndex = (currentIndex - 1 + focusable.length) % focusable.length;
169
+ if (focusable.length > 0) {
170
+ this.setFocus(focusable[previousIndex]);
171
+ return true;
172
+ }
173
+ return false;
174
+ }
175
+ /**
176
+ * Clear all focus traps
177
+ */
178
+ clearFocusTraps() {
179
+ this.focusTrapStack.clear();
180
+ }
181
+ }
182
+ // Singleton instance
183
+ let focusServiceInstance = null;
184
+ /**
185
+ * Get the singleton FocusService instance
186
+ */
187
+ function getFocusService() {
188
+ if (!focusServiceInstance) {
189
+ focusServiceInstance = new FocusService();
190
+ }
191
+ return focusServiceInstance;
192
+ }
193
+ /**
194
+ * Create a new isolated FocusService instance
195
+ */
196
+ function createFocusService() {
197
+ return new FocusService();
198
+ }
199
+
200
+ /**
201
+ * Media Query Service
202
+ * Provides utilities for responsive design and media query management
203
+ */
204
+ /**
205
+ * Default breakpoints (Tailwind-inspired)
206
+ */
207
+ const DEFAULT_BREAKPOINTS = {
208
+ sm: '640px',
209
+ md: '768px',
210
+ lg: '1024px',
211
+ xl: '1280px',
212
+ '2xl': '1536px',
213
+ };
214
+ /**
215
+ * MediaQueryService - Centralized media query management
216
+ * Provides:
217
+ * - Media query listener registration
218
+ * - Breakpoint detection
219
+ * - Window resize handling
220
+ * - Current viewport information
221
+ */
222
+ class MediaQueryService {
223
+ constructor(breakpoints = DEFAULT_BREAKPOINTS) {
224
+ this.listeners = new Map();
225
+ this.resizeObserver = null;
226
+ this.resizeListeners = new Map();
227
+ this.breakpoints = breakpoints;
228
+ }
229
+ /**
230
+ * Register a media query listener
231
+ * @param id - Unique identifier for this listener
232
+ * @param query - CSS media query string
233
+ * @param handler - Callback when media query matches/unmatches
234
+ */
235
+ registerMediaQuery(id, query, handler) {
236
+ if (typeof window === 'undefined')
237
+ return;
238
+ try {
239
+ const matcher = window.matchMedia(query);
240
+ const listener = { query, handler, matcher };
241
+ // Call handler with initial state
242
+ handler(matcher.matches);
243
+ // Listen for changes
244
+ matcher.addEventListener('change', (e) => handler(e.matches));
245
+ this.listeners.set(id, listener);
246
+ }
247
+ catch (error) {
248
+ console.warn(`Failed to register media query "${query}":`, error);
249
+ }
250
+ }
251
+ /**
252
+ * Register a breakpoint listener (easier than raw media queries)
253
+ * @param id - Unique identifier
254
+ * @param breakpoint - Breakpoint name (sm, md, lg, xl, 2xl)
255
+ * @param type - Type of match: 'min' (mobile-first) or 'max' (desktop-first)
256
+ * @param handler - Callback when breakpoint matches
257
+ */
258
+ registerBreakpoint(id, breakpoint, type = 'min', handler) {
259
+ const size = this.breakpoints[breakpoint];
260
+ if (!size) {
261
+ console.warn(`Unknown breakpoint: ${breakpoint}`);
262
+ return;
263
+ }
264
+ const query = type === 'min' ? `(min-width: ${size})` : `(max-width: ${size})`;
265
+ this.registerMediaQuery(id, query, handler);
266
+ }
267
+ /**
268
+ * Unregister a media query listener
269
+ */
270
+ unregisterMediaQuery(id) {
271
+ const listener = this.listeners.get(id);
272
+ if (listener && listener.matcher) {
273
+ listener.matcher.removeEventListener('change', () => { });
274
+ }
275
+ this.listeners.delete(id);
276
+ }
277
+ /**
278
+ * Check if a media query currently matches
279
+ */
280
+ isMatching(query) {
281
+ if (typeof window === 'undefined')
282
+ return false;
283
+ try {
284
+ return window.matchMedia(query).matches;
285
+ }
286
+ catch (error) {
287
+ console.warn(`Failed to check media query "${query}":`, error);
288
+ return false;
289
+ }
290
+ }
291
+ /**
292
+ * Check if a breakpoint is currently active
293
+ */
294
+ isBreakpointActive(breakpoint, type = 'min') {
295
+ const size = this.breakpoints[breakpoint];
296
+ if (!size)
297
+ return false;
298
+ const query = type === 'min' ? `(min-width: ${size})` : `(max-width: ${size})`;
299
+ return this.isMatching(query);
300
+ }
301
+ /**
302
+ * Get the current viewport width
303
+ */
304
+ getViewportWidth() {
305
+ if (typeof window === 'undefined')
306
+ return 0;
307
+ return window.innerWidth;
308
+ }
309
+ /**
310
+ * Get the current viewport height
311
+ */
312
+ getViewportHeight() {
313
+ if (typeof window === 'undefined')
314
+ return 0;
315
+ return window.innerHeight;
316
+ }
317
+ /**
318
+ * Check if viewport is mobile-sized (< 768px)
319
+ */
320
+ isMobile() {
321
+ return this.getViewportWidth() < 768;
322
+ }
323
+ /**
324
+ * Check if viewport is tablet-sized (768px - 1024px)
325
+ */
326
+ isTablet() {
327
+ const width = this.getViewportWidth();
328
+ return width >= 768 && width < 1024;
329
+ }
330
+ /**
331
+ * Check if viewport is desktop-sized (>= 1024px)
332
+ */
333
+ isDesktop() {
334
+ return this.getViewportWidth() >= 1024;
335
+ }
336
+ /**
337
+ * Check if prefers-reduced-motion is enabled
338
+ */
339
+ prefersReducedMotion() {
340
+ if (typeof window === 'undefined')
341
+ return false;
342
+ try {
343
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
344
+ }
345
+ catch (_a) {
346
+ return false;
347
+ }
348
+ }
349
+ /**
350
+ * Check if dark mode is preferred
351
+ */
352
+ prefersDarkMode() {
353
+ if (typeof window === 'undefined')
354
+ return false;
355
+ try {
356
+ return window.matchMedia('(prefers-color-scheme: dark)').matches;
357
+ }
358
+ catch (_a) {
359
+ return false;
360
+ }
361
+ }
362
+ /**
363
+ * Get the current device orientation
364
+ */
365
+ getOrientation() {
366
+ if (typeof window === 'undefined')
367
+ return 'portrait';
368
+ return window.innerHeight > window.innerWidth ? 'portrait' : 'landscape';
369
+ }
370
+ /**
371
+ * Register a window resize listener
372
+ * @param id - Unique identifier
373
+ * @param handler - Callback with (width, height)
374
+ * @param debounceMs - Debounce delay in milliseconds
375
+ */
376
+ registerResizeListener(id, handler, debounceMs = 0) {
377
+ if (typeof window === 'undefined')
378
+ return;
379
+ let timeoutId = null;
380
+ const eventListener = () => {
381
+ if (timeoutId)
382
+ clearTimeout(timeoutId);
383
+ if (debounceMs > 0) {
384
+ timeoutId = setTimeout(() => {
385
+ handler(this.getViewportWidth(), this.getViewportHeight());
386
+ }, debounceMs);
387
+ }
388
+ else {
389
+ handler(this.getViewportWidth(), this.getViewportHeight());
390
+ }
51
391
  };
392
+ this.resizeListeners.set(id, { handler, eventListener });
393
+ window.addEventListener('resize', eventListener);
394
+ // Call handler with initial dimensions
395
+ handler(this.getViewportWidth(), this.getViewportHeight());
52
396
  }
53
397
  /**
54
- * Initialize internal checked state from defaultChecked
398
+ * Unregister a resize listener
55
399
  */
56
- componentWillLoad() {
57
- this.internalChecked = this.defaultChecked;
400
+ unregisterResizeListener(id) {
401
+ if (typeof window === 'undefined')
402
+ return;
403
+ const entry = this.resizeListeners.get(id);
404
+ if (entry) {
405
+ window.removeEventListener('resize', entry.eventListener);
406
+ this.resizeListeners.delete(id);
407
+ }
58
408
  }
59
409
  /**
60
- * Get current checked state (controlled vs uncontrolled)
410
+ * Clean up all listeners
61
411
  */
62
- get isChecked() {
63
- return this.checked !== undefined ? this.checked : this.internalChecked;
412
+ cleanup() {
413
+ this.listeners.forEach((listener) => {
414
+ if (listener.matcher) {
415
+ listener.matcher.removeEventListener('change', () => { });
416
+ }
417
+ });
418
+ this.listeners.clear();
419
+ if (typeof window !== 'undefined') {
420
+ this.resizeListeners.forEach((entry) => {
421
+ window.removeEventListener('resize', entry.eventListener);
422
+ });
423
+ }
424
+ this.resizeListeners.clear();
425
+ if (this.resizeObserver) {
426
+ this.resizeObserver.disconnect();
427
+ this.resizeObserver = null;
428
+ }
64
429
  }
65
430
  /**
66
- * Handle keyboard events (Space and Enter keys)
431
+ * Update breakpoint configuration
67
432
  */
68
- handleKeyDown(event) {
69
- if (this.disabled) {
433
+ setBreakpoints(breakpoints) {
434
+ this.breakpoints = Object.assign(Object.assign({}, DEFAULT_BREAKPOINTS), breakpoints);
435
+ }
436
+ }
437
+ // Singleton instance
438
+ let mediaQueryServiceInstance = null;
439
+ /**
440
+ * Get the singleton MediaQueryService instance
441
+ */
442
+ function getMediaQueryService(breakpoints) {
443
+ if (!mediaQueryServiceInstance) {
444
+ mediaQueryServiceInstance = new MediaQueryService(breakpoints);
445
+ }
446
+ return mediaQueryServiceInstance;
447
+ }
448
+ /**
449
+ * Create a new isolated MediaQueryService instance
450
+ */
451
+ function createMediaQueryService(breakpoints) {
452
+ return new MediaQueryService(breakpoints || DEFAULT_BREAKPOINTS);
453
+ }
454
+
455
+ /**
456
+ * Common Utilities
457
+ * Shared utility functions used across the component library
458
+ */
459
+ /* eslint-disable no-undef, @typescript-eslint/no-explicit-any */
460
+ let idCounter = 0;
461
+ /**
462
+ * Generate a unique ID with optional prefix
463
+ * @param prefix - Optional prefix for the ID (default: 'id')
464
+ */
465
+ function generateUniqueId(prefix = 'id') {
466
+ return `${prefix}-${++idCounter}-${Math.random().toString(36).substr(2, 9)}`;
467
+ }
468
+ /**
469
+ * Reset ID counter (useful for testing)
470
+ */
471
+ function resetIdCounter() {
472
+ idCounter = 0;
473
+ }
474
+ /**
475
+ * Debounce a function
476
+ * @param fn - Function to debounce
477
+ * @param delay - Delay in milliseconds
478
+ */
479
+ function debounce(fn, delay) {
480
+ let timeoutId = null;
481
+ return (...args) => {
482
+ if (timeoutId)
483
+ clearTimeout(timeoutId);
484
+ timeoutId = setTimeout(() => fn(...args), delay);
485
+ };
486
+ }
487
+ /**
488
+ * Throttle a function
489
+ * @param fn - Function to throttle
490
+ * @param delay - Delay in milliseconds
491
+ */
492
+ function throttle(fn, delay) {
493
+ let lastCall = 0;
494
+ let timeoutId = null;
495
+ return (...args) => {
496
+ const now = Date.now();
497
+ if (now - lastCall >= delay) {
498
+ lastCall = now;
499
+ fn(...args);
500
+ }
501
+ else {
502
+ if (timeoutId)
503
+ clearTimeout(timeoutId);
504
+ timeoutId = setTimeout(() => {
505
+ lastCall = Date.now();
506
+ fn(...args);
507
+ }, delay - (now - lastCall));
508
+ }
509
+ };
510
+ }
511
+ /**
512
+ * Add a class to an element
513
+ * @param element - The element
514
+ * @param className - Class name to add
515
+ */
516
+ function addClass(element, className) {
517
+ element.classList.add(className);
518
+ }
519
+ /**
520
+ * Remove a class from an element
521
+ * @param element - The element
522
+ * @param className - Class name to remove
523
+ */
524
+ function removeClass(element, className) {
525
+ element.classList.remove(className);
526
+ }
527
+ /**
528
+ * Toggle a class on an element
529
+ * @param element - The element
530
+ * @param className - Class name to toggle
531
+ * @param force - Optional force add/remove
532
+ */
533
+ function toggleClass(element, className, force) {
534
+ element.classList.toggle(className, force);
535
+ }
536
+ /**
537
+ * Check if element has a class
538
+ * @param element - The element
539
+ * @param className - Class name to check
540
+ */
541
+ function hasClass(element, className) {
542
+ return element.classList.contains(className);
543
+ }
544
+ /**
545
+ * Get all data attributes from an element as an object
546
+ */
547
+ function getDataAttributes(element) {
548
+ const data = {};
549
+ Array.from(element.attributes).forEach((attr) => {
550
+ if (attr.name.startsWith('data-')) {
551
+ const key = attr.name.slice(5); // Remove 'data-' prefix
552
+ data[key] = attr.value;
553
+ }
554
+ });
555
+ return data;
556
+ }
557
+ /**
558
+ * Set a data attribute on an element
559
+ * @param element - The element
560
+ * @param key - Data attribute name (without 'data-' prefix)
561
+ * @param value - The value to set
562
+ */
563
+ function setDataAttribute(element, key, value) {
564
+ if (value === null) {
565
+ element.removeAttribute(`data-${key}`);
566
+ }
567
+ else {
568
+ element.setAttribute(`data-${key}`, value);
569
+ }
570
+ }
571
+ /**
572
+ * Get the value of a data attribute
573
+ * @param element - The element
574
+ * @param key - Data attribute name (without 'data-' prefix)
575
+ */
576
+ function getDataAttribute(element, key) {
577
+ return element.getAttribute(`data-${key}`) || undefined;
578
+ }
579
+ /**
580
+ * Dispatch a custom event from an element
581
+ * @param element - The element to dispatch from
582
+ * @param eventName - Name of the custom event
583
+ * @param detail - Optional detail object to include in the event
584
+ */
585
+ function dispatchCustomEvent(element, eventName, detail) {
586
+ const event = new CustomEvent(eventName, {
587
+ detail,
588
+ bubbles: true,
589
+ cancelable: true,
590
+ composed: true,
591
+ });
592
+ element.dispatchEvent(event);
593
+ }
594
+ /**
595
+ * Listen for a custom event
596
+ * @param element - The element to listen on
597
+ * @param eventName - Name of the custom event
598
+ * @param handler - Callback function
599
+ * @returns Cleanup function to remove listener
600
+ */
601
+ function onCustomEvent(element, eventName, handler) {
602
+ const listener = (event) => {
603
+ handler(event.detail);
604
+ };
605
+ element.addEventListener(eventName, listener);
606
+ return () => {
607
+ element.removeEventListener(eventName, listener);
608
+ };
609
+ }
610
+ /**
611
+ * Get the offset position of an element relative to the viewport
612
+ */
613
+ function getElementOffset(element) {
614
+ const rect = element.getBoundingClientRect();
615
+ return {
616
+ top: rect.top + window.scrollY,
617
+ left: rect.left + window.scrollX,
618
+ };
619
+ }
620
+ /**
621
+ * Check if an element is in the viewport
622
+ */
623
+ function isElementInViewport(element) {
624
+ const rect = element.getBoundingClientRect();
625
+ return rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
626
+ }
627
+ /**
628
+ * Scroll element into view
629
+ * @param element - The element to scroll into view
630
+ * @param options - Scroll behavior options
631
+ */
632
+ function scrollIntoView(element, options = {}) {
633
+ element.scrollIntoView(Object.assign({ behavior: 'smooth', block: 'nearest', inline: 'nearest' }, options));
634
+ }
635
+ /**
636
+ * Get computed style value
637
+ */
638
+ function getComputedValue(element, property) {
639
+ return window.getComputedStyle(element).getPropertyValue(property);
640
+ }
641
+ /**
642
+ * Wait for a specific time
643
+ * @param ms - Time in milliseconds
644
+ */
645
+ function wait(ms) {
646
+ return new Promise((resolve) => setTimeout(resolve, ms));
647
+ }
648
+ /**
649
+ * Wait for an element to appear in the DOM
650
+ * @param selector - CSS selector to wait for
651
+ * @param timeout - Timeout in milliseconds (default: 5000)
652
+ */
653
+ function waitForElement(selector, timeout = 5000) {
654
+ return new Promise((resolve, reject) => {
655
+ const element = document.querySelector(selector);
656
+ if (element) {
657
+ resolve(element);
70
658
  return;
71
659
  }
72
- // Toggle on Space or Enter
73
- if (event.key === ' ' || event.key === 'Enter') {
74
- event.preventDefault(); // Prevent page scroll on Space
75
- this.toggle();
660
+ const observer = new MutationObserver(() => {
661
+ const el = document.querySelector(selector);
662
+ if (el) {
663
+ observer.disconnect();
664
+ resolve(el);
665
+ }
666
+ });
667
+ observer.observe(document.body, { childList: true, subtree: true });
668
+ setTimeout(() => {
669
+ observer.disconnect();
670
+ reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
671
+ }, timeout);
672
+ });
673
+ }
674
+ /**
675
+ * Clone an object deeply
676
+ */
677
+ function deepClone(obj) {
678
+ if (obj === null || typeof obj !== 'object')
679
+ return obj;
680
+ if (obj instanceof Date)
681
+ return new Date(obj.getTime());
682
+ if (obj instanceof Array)
683
+ return obj.map((item) => deepClone(item));
684
+ if (obj instanceof Object) {
685
+ const cloned = {};
686
+ Object.keys(obj).forEach((key) => {
687
+ cloned[key] = deepClone(obj[key]);
688
+ });
689
+ return cloned;
690
+ }
691
+ return obj;
692
+ }
693
+ /**
694
+ * Merge objects
695
+ */
696
+ function mergeObjects(target, ...sources) {
697
+ return sources.reduce((result, source) => (Object.assign(Object.assign({}, result), source)), target);
698
+ }
699
+ /**
700
+ * Get the prefixed CSS property name (for vendor prefixes)
701
+ */
702
+ function getPrefixedProperty(property) {
703
+ const element = document.createElement('div');
704
+ const style = element.style;
705
+ if (property in style)
706
+ return property;
707
+ if (`webkit${property[0].toUpperCase()}${property.slice(1)}` in style)
708
+ return `webkit${property[0].toUpperCase()}${property.slice(1)}`;
709
+ if (`moz${property[0].toUpperCase()}${property.slice(1)}` in style)
710
+ return `moz${property[0].toUpperCase()}${property.slice(1)}`;
711
+ if (`ms${property[0].toUpperCase()}${property.slice(1)}` in style)
712
+ return `ms${property[0].toUpperCase()}${property.slice(1)}`;
713
+ return property;
714
+ }
715
+ /**
716
+ * Check if browser supports a CSS feature
717
+ */
718
+ function supportsCSSFeature(property, value) {
719
+ const element = document.createElement('div');
720
+ element.style.setProperty(property, value);
721
+ return element.style.getPropertyValue(property) !== '';
722
+ }
723
+ /**
724
+ * Request animation frame with promise
725
+ */
726
+ function requestAnimationFramePromise() {
727
+ return new Promise((resolve) => requestAnimationFrame(resolve));
728
+ }
729
+ /**
730
+ * Convert camelCase to kebab-case
731
+ */
732
+ function camelToKebab(str) {
733
+ return str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);
734
+ }
735
+ /**
736
+ * Convert kebab-case to camelCase
737
+ */
738
+ function kebabToCamel(str) {
739
+ return str.replace(/-./g, (x) => x[1].toUpperCase());
740
+ }
741
+
742
+ /**
743
+ * Accessibility Utilities
744
+ * Provides helpers for ARIA attributes, keyboard navigation, and accessibility features
745
+ */
746
+ /**
747
+ * Generate a unique ID for ARIA relationships
748
+ * @param prefix - Optional prefix for the ID
749
+ * @param suffix - Optional suffix for the ID
750
+ */
751
+ function generateAriaId(prefix = 'aria', suffix) {
752
+ const timestamp = Date.now().toString(36);
753
+ const random = Math.random().toString(36).substr(2, 9);
754
+ const finalSuffix = suffix ? `-${suffix}` : '';
755
+ return `${prefix}-${timestamp}-${random}${finalSuffix}`;
756
+ }
757
+ /**
758
+ * Set ARIA attributes on an element
759
+ * @param element - The element to set attributes on
760
+ * @param attributes - Object with attribute names and values
761
+ */
762
+ function setAriaAttributes(element, attributes) {
763
+ Object.entries(attributes).forEach(([key, value]) => {
764
+ if (value === null || value === false) {
765
+ element.removeAttribute(`aria-${key}`);
766
+ }
767
+ else if (value === true) {
768
+ element.setAttribute(`aria-${key}`, 'true');
769
+ }
770
+ else {
771
+ element.setAttribute(`aria-${key}`, String(value));
76
772
  }
773
+ });
774
+ }
775
+ /**
776
+ * Add accessible label to an element
777
+ * @param element - The element to label
778
+ * @param label - The label text or element ID
779
+ * @param useAriaLabel - If true, uses aria-label; if false, uses aria-labelledby
780
+ */
781
+ function addAriaLabel(element, label, useAriaLabel = true) {
782
+ if (useAriaLabel) {
783
+ element.setAttribute('aria-label', label);
77
784
  }
78
- render() {
79
- const isChecked = this.isChecked;
80
- const dataState = isChecked ? 'checked' : 'unchecked';
81
- return (index.h(index.Host, { key: '3046a6647d7cfd10bf9789aa9cf3b7a88b9a3a10', "data-state": dataState, "data-disabled": this.disabled ? '' : null }, index.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 }, index.h("span", { key: '618ab67d5fab80323f64ec0b1b342561be2585b0', class: "thumb", part: "thumb" })), this.name && (index.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" }))));
785
+ else {
786
+ element.setAttribute('aria-labelledby', label);
82
787
  }
83
- };
84
- SekiSwitch.style = sekiSwitchCss;
788
+ }
789
+ /**
790
+ * Add accessible description to an element
791
+ * @param element - The element to describe
792
+ * @param description - The description text or element ID
793
+ * @param useAriaDescription - If true, uses aria-description; if false, uses aria-describedby
794
+ */
795
+ function addAriaDescription(element, description, useAriaDescription = false) {
796
+ if (useAriaDescription) {
797
+ element.setAttribute('aria-description', description);
798
+ }
799
+ else {
800
+ element.setAttribute('aria-describedby', description);
801
+ }
802
+ }
803
+ /**
804
+ * Set ARIA live region announcement
805
+ * @param element - The element to make a live region
806
+ * @param message - The message to announce
807
+ * @param politeness - 'polite' (default), 'assertive', or 'off'
808
+ * @param atomic - Whether to announce the entire region
809
+ */
810
+ function announceAriaLive(element, message, politeness = 'polite', atomic = false) {
811
+ element.setAttribute('aria-live', politeness);
812
+ if (atomic) {
813
+ element.setAttribute('aria-atomic', 'true');
814
+ }
815
+ element.textContent = message;
816
+ }
817
+ /**
818
+ * Mark an element as disabled with ARIA attributes
819
+ * @param element - The element to mark as disabled
820
+ * @param disabled - Whether the element is disabled
821
+ */
822
+ function setAriaDisabled(element, disabled) {
823
+ if (disabled) {
824
+ element.setAttribute('aria-disabled', 'true');
825
+ element.style.pointerEvents = 'none';
826
+ element.style.opacity = '0.5';
827
+ }
828
+ else {
829
+ element.removeAttribute('aria-disabled');
830
+ element.style.pointerEvents = '';
831
+ element.style.opacity = '';
832
+ }
833
+ }
834
+ /**
835
+ * Mark an element as expanded/collapsed (for collapsible sections)
836
+ * @param element - The element to mark
837
+ * @param expanded - Whether the element is expanded
838
+ * @param targetId - ID of the element being controlled (optional)
839
+ */
840
+ function setAriaExpanded(element, expanded, targetId) {
841
+ element.setAttribute('aria-expanded', expanded ? 'true' : 'false');
842
+ if (targetId) {
843
+ element.setAttribute('aria-controls', targetId);
844
+ }
845
+ }
846
+ /**
847
+ * Mark an element as selected
848
+ * @param element - The element to mark
849
+ * @param selected - Whether the element is selected
850
+ */
851
+ function setAriaSelected(element, selected) {
852
+ element.setAttribute('aria-selected', selected ? 'true' : 'false');
853
+ }
854
+ /**
855
+ * Mark an element as checked (for checkboxes and radio buttons)
856
+ * @param element - The element to mark
857
+ * @param checked - The checked state ('true', 'false', or 'mixed')
858
+ */
859
+ function setAriaChecked(element, checked) {
860
+ element.setAttribute('aria-checked', checked);
861
+ }
862
+ /**
863
+ * Set the current value of an element (for sliders, spinbuttons, etc.)
864
+ * @param element - The element
865
+ * @param current - Current value
866
+ * @param min - Minimum value
867
+ * @param max - Maximum value
868
+ * @param text - Optional text description of the value
869
+ */
870
+ function setAriaValueNow(element, current, min, max, text) {
871
+ element.setAttribute('aria-valuenow', String(current));
872
+ if (min !== undefined)
873
+ element.setAttribute('aria-valuemin', String(min));
874
+ if (max !== undefined)
875
+ element.setAttribute('aria-valuemax', String(max));
876
+ if (text !== undefined)
877
+ element.setAttribute('aria-valuetext', text);
878
+ }
879
+ /**
880
+ * Mark an element as having a popup (for menus, popovers, etc.)
881
+ * @param element - The element with the popup trigger
882
+ * @param type - Type of popup: 'menu', 'listbox', 'tree', 'grid', 'dialog'
883
+ * @param popupId - ID of the popup element
884
+ */
885
+ function setAriaPopup(element, type = 'menu', popupId) {
886
+ element.setAttribute('aria-haspopup', type);
887
+ if (popupId) {
888
+ element.setAttribute('aria-owns', popupId);
889
+ }
890
+ }
891
+ /**
892
+ * Set role for an element
893
+ * @param element - The element
894
+ * @param role - The role (button, menu, menuitem, etc.)
895
+ */
896
+ function setRole(element, role) {
897
+ element.setAttribute('role', role);
898
+ }
899
+ /**
900
+ * Get the accessible name of an element
901
+ * Follows ARIA naming convention: aria-labelledby > aria-label > title > textContent
902
+ */
903
+ function getAccessibleName(element) {
904
+ // Check aria-labelledby
905
+ const labelledby = element.getAttribute('aria-labelledby');
906
+ if (labelledby) {
907
+ const labelElement = document.getElementById(labelledby);
908
+ if (labelElement)
909
+ return labelElement.textContent || '';
910
+ }
911
+ // Check aria-label
912
+ const ariaLabel = element.getAttribute('aria-label');
913
+ if (ariaLabel)
914
+ return ariaLabel;
915
+ // Check title
916
+ const title = element.getAttribute('title');
917
+ if (title)
918
+ return title;
919
+ // Fall back to textContent
920
+ return element.textContent || '';
921
+ }
922
+ /**
923
+ * Create a skip link for keyboard navigation
924
+ * @param text - Link text
925
+ * @param targetId - ID of element to skip to
926
+ */
927
+ function createSkipLink(text, targetId) {
928
+ const link = document.createElement('a');
929
+ link.href = `#${targetId}`;
930
+ link.textContent = text;
931
+ link.className = 'sr-only'; // Visually hidden but accessible to screen readers
932
+ link.style.position = 'absolute';
933
+ link.style.top = '-9999px';
934
+ link.style.left = '-9999px';
935
+ // Show on focus
936
+ link.addEventListener('focus', () => {
937
+ link.style.top = '0';
938
+ link.style.left = '0';
939
+ });
940
+ // Hide on blur
941
+ link.addEventListener('blur', () => {
942
+ link.style.top = '-9999px';
943
+ link.style.left = '-9999px';
944
+ });
945
+ return link;
946
+ }
947
+ /**
948
+ * Check if element should be hidden from screen readers
949
+ */
950
+ function isAriaHidden(element) {
951
+ return element.getAttribute('aria-hidden') === 'true';
952
+ }
953
+ /**
954
+ * Hide element from screen readers but keep visually visible
955
+ */
956
+ function setAriaHidden(element, hidden) {
957
+ if (hidden) {
958
+ element.setAttribute('aria-hidden', 'true');
959
+ }
960
+ else {
961
+ element.removeAttribute('aria-hidden');
962
+ }
963
+ }
964
+ /**
965
+ * Announce a message to screen readers immediately (without ARIA live regions)
966
+ * @param message - The message to announce
967
+ * @param politeness - 'polite' (default) or 'assertive'
968
+ */
969
+ function announceToScreenReader(message, politeness = 'polite') {
970
+ if (typeof document === 'undefined')
971
+ return;
972
+ const announcement = document.createElement('div');
973
+ announcement.setAttribute('aria-live', politeness);
974
+ announcement.setAttribute('aria-atomic', 'true');
975
+ announcement.className = 'sr-only';
976
+ announcement.style.position = 'absolute';
977
+ announcement.style.left = '-9999px';
978
+ announcement.style.top = '-9999px';
979
+ announcement.textContent = message;
980
+ document.body.appendChild(announcement);
981
+ // Remove after announcement is made
982
+ setTimeout(() => {
983
+ announcement.remove();
984
+ }, 1000);
985
+ }
986
+ /**
987
+ * Set proper heading hierarchy
988
+ * @param element - The heading element
989
+ * @param level - Heading level (1-6)
990
+ */
991
+ function setHeadingLevel(element, level) {
992
+ const tag = `h${level}`;
993
+ if (element.tagName.toLowerCase() !== tag) {
994
+ // If element is not correct tag, set role as fallback
995
+ element.setAttribute('role', tag);
996
+ }
997
+ }
998
+ /**
999
+ * Enable keyboard navigation for a custom component
1000
+ * @param element - The element that should handle keyboard
1001
+ * @param keys - Map of key to handler function
1002
+ */
1003
+ function enableKeyboardNavigation(element, keys) {
1004
+ const handleKeyDown = (event) => {
1005
+ const handler = keys[event.key.toLowerCase()];
1006
+ if (handler) {
1007
+ event.preventDefault();
1008
+ handler(event);
1009
+ }
1010
+ };
1011
+ element.addEventListener('keydown', handleKeyDown);
1012
+ // Return cleanup function
1013
+ return () => {
1014
+ element.removeEventListener('keydown', handleKeyDown);
1015
+ };
1016
+ }
1017
+ /**
1018
+ * Check if element has accessible focus styling
1019
+ */
1020
+ function hasAccessibleFocus(element) {
1021
+ const styles = window.getComputedStyle(element);
1022
+ return !!(styles.outline || styles.boxShadow || styles.border);
1023
+ }
1024
+ /**
1025
+ * Ensure focus visible styling (for focus-visible pseudo-class)
1026
+ */
1027
+ function ensureFocusVisible(element) {
1028
+ if (!hasAccessibleFocus(element)) {
1029
+ element.style.outline = '2px solid #4A90E2';
1030
+ element.style.outlineOffset = '2px';
1031
+ }
1032
+ }
1033
+
1034
+ /**
1035
+ * SekiUI Type Definitions
1036
+ * Central export point for all type definitions across components and services
1037
+ */
1038
+ // ============================================================================
1039
+ // NOTE: Types from ./components/sidebar/types and ./utils/select/types
1040
+ // are already re-exported at the top of this file via the main index.ts
1041
+ // ============================================================================
1042
+ // ============================================================================
1043
+ // TYPE GUARDS AND UTILITY TYPES
1044
+ // ============================================================================
1045
+ /**
1046
+ * Type guard to check if a value is a valid sidebar variant
1047
+ */
1048
+ function isSidebarVariant(value) {
1049
+ return ['sidebar', 'floating', 'inset'].includes(value);
1050
+ }
1051
+ /**
1052
+ * Type guard to check if a value is a valid collapse mode
1053
+ */
1054
+ function isCollapseMode(value) {
1055
+ return ['offcanvas', 'icon', 'none'].includes(value);
1056
+ }
1057
+ /**
1058
+ * Type guard to check if a value is a valid button size
1059
+ */
1060
+ function isButtonSize(value) {
1061
+ return ['sm', 'md', 'lg', 'icon-sm', 'icon', 'icon-lg'].includes(value);
1062
+ }
1063
+ /**
1064
+ * Type guard to check if a value is a valid button variant
1065
+ */
1066
+ function isButtonVariant(value) {
1067
+ return ['primary', 'secondary', 'outline', 'ghost', 'destructive', 'link'].includes(value);
1068
+ }
1069
+ /**
1070
+ * Type guard to check if a value is a valid tooltip side
1071
+ */
1072
+ function isTooltipSide(value) {
1073
+ return ['top', 'right', 'bottom', 'left'].includes(value);
1074
+ }
85
1075
 
86
- exports.SekiSwitch = SekiSwitch;
1076
+ exports.SekiSwitch = sekiSwitch_entry.seki_switch;
1077
+ exports.KeyboardService = keyboard.KeyboardService;
1078
+ exports.createKeyboardService = keyboard.createKeyboardService;
1079
+ exports.getKeyboardService = keyboard.getKeyboardService;
1080
+ exports.DEFAULT_BREAKPOINTS = DEFAULT_BREAKPOINTS;
1081
+ exports.FocusService = FocusService;
1082
+ exports.MediaQueryService = MediaQueryService;
1083
+ exports.addAriaDescription = addAriaDescription;
1084
+ exports.addAriaLabel = addAriaLabel;
1085
+ exports.addClass = addClass;
1086
+ exports.announceAriaLive = announceAriaLive;
1087
+ exports.announceToScreenReader = announceToScreenReader;
1088
+ exports.camelToKebab = camelToKebab;
1089
+ exports.createFocusService = createFocusService;
1090
+ exports.createMediaQueryService = createMediaQueryService;
1091
+ exports.createSkipLink = createSkipLink;
1092
+ exports.debounce = debounce;
1093
+ exports.deepClone = deepClone;
1094
+ exports.dispatchCustomEvent = dispatchCustomEvent;
1095
+ exports.enableKeyboardNavigation = enableKeyboardNavigation;
1096
+ exports.ensureFocusVisible = ensureFocusVisible;
1097
+ exports.generateAriaId = generateAriaId;
1098
+ exports.generateUniqueId = generateUniqueId;
1099
+ exports.getAccessibleName = getAccessibleName;
1100
+ exports.getComputedValue = getComputedValue;
1101
+ exports.getDataAttribute = getDataAttribute;
1102
+ exports.getDataAttributes = getDataAttributes;
1103
+ exports.getElementOffset = getElementOffset;
1104
+ exports.getFocusService = getFocusService;
1105
+ exports.getMediaQueryService = getMediaQueryService;
1106
+ exports.getPrefixedProperty = getPrefixedProperty;
1107
+ exports.hasAccessibleFocus = hasAccessibleFocus;
1108
+ exports.hasClass = hasClass;
1109
+ exports.isAriaHidden = isAriaHidden;
1110
+ exports.isButtonSize = isButtonSize;
1111
+ exports.isButtonVariant = isButtonVariant;
1112
+ exports.isCollapseMode = isCollapseMode;
1113
+ exports.isElementInViewport = isElementInViewport;
1114
+ exports.isSidebarVariant = isSidebarVariant;
1115
+ exports.isTooltipSide = isTooltipSide;
1116
+ exports.kebabToCamel = kebabToCamel;
1117
+ exports.mergeObjects = mergeObjects;
1118
+ exports.onCustomEvent = onCustomEvent;
1119
+ exports.removeClass = removeClass;
1120
+ exports.requestAnimationFramePromise = requestAnimationFramePromise;
1121
+ exports.resetIdCounter = resetIdCounter;
1122
+ exports.scrollIntoView = scrollIntoView;
1123
+ exports.setAriaAttributes = setAriaAttributes;
1124
+ exports.setAriaChecked = setAriaChecked;
1125
+ exports.setAriaDisabled = setAriaDisabled;
1126
+ exports.setAriaExpanded = setAriaExpanded;
1127
+ exports.setAriaHidden = setAriaHidden;
1128
+ exports.setAriaPopup = setAriaPopup;
1129
+ exports.setAriaSelected = setAriaSelected;
1130
+ exports.setAriaValueNow = setAriaValueNow;
1131
+ exports.setDataAttribute = setDataAttribute;
1132
+ exports.setHeadingLevel = setHeadingLevel;
1133
+ exports.setRole = setRole;
1134
+ exports.supportsCSSFeature = supportsCSSFeature;
1135
+ exports.throttle = throttle;
1136
+ exports.toggleClass = toggleClass;
1137
+ exports.wait = wait;
1138
+ exports.waitForElement = waitForElement;