sveltacular 0.0.76 → 1.0.0

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 (374) hide show
  1. package/README.md +142 -15
  2. package/dist/forms/base-input-wrapper.svelte +99 -0
  3. package/dist/forms/base-input-wrapper.svelte.d.ts +15 -0
  4. package/dist/forms/bool-box/bool-box.svelte +30 -17
  5. package/dist/forms/bool-box/bool-box.svelte.d.ts +9 -21
  6. package/dist/forms/button/button.svelte +153 -89
  7. package/dist/forms/button/button.svelte.d.ts +25 -29
  8. package/dist/forms/check-box/check-box-group.svelte +63 -29
  9. package/dist/forms/check-box/check-box-group.svelte.d.ts +11 -27
  10. package/dist/forms/check-box/check-box.svelte +57 -33
  11. package/dist/forms/check-box/check-box.svelte.d.ts +15 -25
  12. package/dist/forms/check-box/index.d.ts +2 -0
  13. package/dist/forms/check-box/index.js +2 -0
  14. package/dist/forms/combo/new-or-existing-combo.svelte +37 -18
  15. package/dist/forms/combo/new-or-existing-combo.svelte.d.ts +15 -25
  16. package/dist/forms/combo-box/combo-box.svelte +655 -0
  17. package/dist/forms/combo-box/combo-box.svelte.d.ts +62 -0
  18. package/dist/forms/combo-box/index.d.ts +1 -0
  19. package/dist/forms/combo-box/index.js +1 -0
  20. package/dist/forms/date-box/date-box.svelte +80 -54
  21. package/dist/forms/date-box/date-box.svelte.d.ts +21 -32
  22. package/dist/forms/file-area/file-area.svelte +109 -68
  23. package/dist/forms/file-area/file-area.svelte.d.ts +12 -22
  24. package/dist/forms/file-box/file-box.svelte +40 -21
  25. package/dist/forms/file-box/file-box.svelte.d.ts +14 -25
  26. package/dist/forms/form-field.svelte +18 -15
  27. package/dist/forms/form-field.svelte.d.ts +8 -18
  28. package/dist/forms/form-footer.svelte +6 -3
  29. package/dist/forms/form-footer.svelte.d.ts +6 -26
  30. package/dist/forms/form-header.svelte +15 -4
  31. package/dist/forms/form-header.svelte.d.ts +8 -18
  32. package/dist/forms/form-label.svelte +15 -6
  33. package/dist/forms/form-label.svelte.d.ts +8 -19
  34. package/dist/forms/form-section.svelte +15 -4
  35. package/dist/forms/form-section.svelte.d.ts +8 -18
  36. package/dist/forms/form.svelte +30 -13
  37. package/dist/forms/form.svelte.d.ts +11 -22
  38. package/dist/forms/index.d.ts +26 -0
  39. package/dist/forms/index.js +31 -0
  40. package/dist/forms/info-box/info-box.svelte +19 -8
  41. package/dist/forms/info-box/info-box.svelte.d.ts +8 -19
  42. package/dist/forms/list-box/index.d.ts +2 -0
  43. package/dist/forms/list-box/index.js +1 -0
  44. package/dist/forms/list-box/list-box.svelte +190 -118
  45. package/dist/forms/list-box/list-box.svelte.d.ts +16 -26
  46. package/dist/forms/money-box/money-box.svelte +223 -190
  47. package/dist/forms/money-box/money-box.svelte.d.ts +16 -28
  48. package/dist/forms/number-box/number-box.svelte +84 -67
  49. package/dist/forms/number-box/number-box.svelte.d.ts +17 -28
  50. package/dist/forms/phone-box/index.d.ts +1 -0
  51. package/dist/forms/phone-box/index.js +1 -0
  52. package/dist/forms/phone-box/phone-box.svelte +152 -122
  53. package/dist/forms/phone-box/phone-box.svelte.d.ts +8 -20
  54. package/dist/forms/radio-group/index.d.ts +2 -0
  55. package/dist/forms/radio-group/index.js +2 -0
  56. package/dist/forms/radio-group/radio-box.svelte +23 -8
  57. package/dist/forms/radio-group/radio-box.svelte.d.ts +10 -19
  58. package/dist/forms/radio-group/radio-group.svelte +27 -13
  59. package/dist/forms/radio-group/radio-group.svelte.d.ts +10 -21
  60. package/dist/forms/slider/slider.svelte +210 -0
  61. package/dist/forms/slider/slider.svelte.d.ts +17 -0
  62. package/dist/forms/switch-box/switch-box.svelte +35 -21
  63. package/dist/forms/switch-box/switch-box.svelte.d.ts +9 -20
  64. package/dist/forms/text-area/text-area.svelte +89 -15
  65. package/dist/forms/text-area/text-area.svelte.d.ts +15 -23
  66. package/dist/forms/text-box/text-box.svelte +253 -75
  67. package/dist/forms/text-box/text-box.svelte.d.ts +28 -36
  68. package/dist/forms/time-box/time-box.svelte +67 -0
  69. package/dist/forms/time-box/time-box.svelte.d.ts +12 -0
  70. package/dist/forms/url-box/url-box.svelte +32 -18
  71. package/dist/forms/url-box/url-box.svelte.d.ts +9 -20
  72. package/dist/forms/validation.d.ts +60 -0
  73. package/dist/forms/validation.js +123 -0
  74. package/dist/generic/address/address.svelte +22 -13
  75. package/dist/generic/address/address.svelte.d.ts +9 -19
  76. package/dist/generic/avatar/avatar.svelte +86 -0
  77. package/dist/generic/avatar/avatar.svelte.d.ts +10 -0
  78. package/dist/generic/badge/badge.svelte +82 -0
  79. package/dist/generic/badge/badge.svelte.d.ts +11 -0
  80. package/dist/generic/card/card-container.svelte +41 -13
  81. package/dist/generic/card/card-container.svelte.d.ts +8 -18
  82. package/dist/generic/card/card.svelte +47 -29
  83. package/dist/generic/card/card.svelte.d.ts +9 -19
  84. package/dist/generic/card/index.d.ts +3 -0
  85. package/dist/generic/card/index.js +2 -0
  86. package/dist/generic/chip/chip.svelte +90 -0
  87. package/dist/generic/chip/chip.svelte.d.ts +11 -0
  88. package/dist/generic/date/date-time.svelte +86 -64
  89. package/dist/generic/date/date-time.svelte.d.ts +10 -20
  90. package/dist/generic/divider/divider.svelte.d.ts +22 -19
  91. package/dist/generic/dot/dot.svelte +13 -4
  92. package/dist/generic/dot/dot.svelte.d.ts +7 -17
  93. package/dist/generic/dropdown-item/dropdown-item.svelte +24 -12
  94. package/dist/generic/dropdown-item/dropdown-item.svelte.d.ts +10 -21
  95. package/dist/generic/email/email.svelte +6 -4
  96. package/dist/generic/email/email.svelte.d.ts +5 -15
  97. package/dist/generic/empty/empty.svelte +57 -26
  98. package/dist/generic/empty/empty.svelte.d.ts +11 -21
  99. package/dist/generic/header/header.svelte +26 -10
  100. package/dist/generic/header/header.svelte.d.ts +10 -20
  101. package/dist/generic/index.d.ts +28 -0
  102. package/dist/generic/index.js +31 -0
  103. package/dist/generic/link/link.svelte +20 -7
  104. package/dist/generic/link/link.svelte.d.ts +11 -21
  105. package/dist/generic/list/index.d.ts +4 -0
  106. package/dist/generic/list/index.js +3 -0
  107. package/dist/generic/list/list-item.svelte +17 -13
  108. package/dist/generic/list/list-item.svelte.d.ts +6 -15
  109. package/dist/generic/list/list.d.ts +2 -2
  110. package/dist/generic/list/list.svelte +28 -15
  111. package/dist/generic/list/list.svelte.d.ts +9 -19
  112. package/dist/generic/menu/menu.svelte +163 -57
  113. package/dist/generic/menu/menu.svelte.d.ts +16 -24
  114. package/dist/generic/notice/notice.svelte +119 -81
  115. package/dist/generic/notice/notice.svelte.d.ts +17 -26
  116. package/dist/generic/overlay.svelte +40 -14
  117. package/dist/generic/overlay.svelte.d.ts +9 -19
  118. package/dist/generic/panel/panel.svelte +16 -6
  119. package/dist/generic/panel/panel.svelte.d.ts +8 -18
  120. package/dist/generic/phone/phone.svelte +30 -24
  121. package/dist/generic/phone/phone.svelte.d.ts +6 -16
  122. package/dist/generic/pill/pill.svelte +47 -33
  123. package/dist/generic/pill/pill.svelte.d.ts +10 -21
  124. package/dist/generic/popover/popover.svelte +226 -0
  125. package/dist/generic/popover/popover.svelte.d.ts +15 -0
  126. package/dist/generic/rating/rating.svelte +85 -0
  127. package/dist/generic/rating/rating.svelte.d.ts +11 -0
  128. package/dist/generic/scorecard/scorecard.svelte +34 -21
  129. package/dist/generic/scorecard/scorecard.svelte.d.ts +9 -19
  130. package/dist/generic/section/section.svelte +28 -9
  131. package/dist/generic/section/section.svelte.d.ts +11 -21
  132. package/dist/generic/spinner/spinner.svelte +64 -0
  133. package/dist/generic/spinner/spinner.svelte.d.ts +8 -0
  134. package/dist/generic/theme-provider/index.d.ts +1 -0
  135. package/dist/generic/theme-provider/index.js +1 -0
  136. package/dist/generic/theme-provider/theme-provider-demo.svelte +182 -0
  137. package/dist/generic/theme-provider/theme-provider-demo.svelte.d.ts +3 -0
  138. package/dist/generic/theme-provider/theme-provider.svelte +83 -0
  139. package/dist/generic/theme-provider/theme-provider.svelte.d.ts +44 -0
  140. package/dist/generic/toaster/toaster.svelte +31 -6
  141. package/dist/generic/toaster/toaster.svelte.d.ts +7 -15
  142. package/dist/generic/tooltip/tooltip.svelte +389 -0
  143. package/dist/generic/tooltip/tooltip.svelte.d.ts +21 -0
  144. package/dist/helpers/ago.d.ts +7 -1
  145. package/dist/helpers/ago.js +6 -0
  146. package/dist/helpers/animation-actions.d.ts +124 -0
  147. package/dist/helpers/animation-actions.js +299 -0
  148. package/dist/helpers/animations.d.ts +198 -0
  149. package/dist/helpers/animations.js +280 -0
  150. package/dist/helpers/announcer.d.ts +118 -0
  151. package/dist/helpers/announcer.js +250 -0
  152. package/dist/helpers/copy-to-clipboard.svelte.d.ts +5 -0
  153. package/dist/helpers/copy-to-clipboard.svelte.js +28 -0
  154. package/dist/helpers/debounce.d.ts +7 -0
  155. package/dist/helpers/debounce.js +7 -0
  156. package/dist/helpers/focus.d.ts +123 -0
  157. package/dist/helpers/focus.js +335 -0
  158. package/dist/helpers/fuzzy-search.d.ts +41 -0
  159. package/dist/helpers/fuzzy-search.js +114 -0
  160. package/dist/helpers/index.d.ts +24 -0
  161. package/dist/helpers/index.js +24 -0
  162. package/dist/helpers/navigate-to.d.ts +4 -0
  163. package/dist/helpers/navigate-to.js +4 -0
  164. package/dist/helpers/positioning.d.ts +97 -0
  165. package/dist/helpers/positioning.js +230 -0
  166. package/dist/helpers/round-to-decimals.d.ts +7 -5
  167. package/dist/helpers/round-to-decimals.js +7 -5
  168. package/dist/helpers/spring.svelte.d.ts +97 -0
  169. package/dist/helpers/spring.svelte.js +216 -0
  170. package/dist/helpers/subscribable.d.ts +1 -2
  171. package/dist/helpers/theme.svelte.d.ts +63 -0
  172. package/dist/helpers/theme.svelte.js +123 -0
  173. package/dist/helpers/unique-id.d.ts +4 -0
  174. package/dist/helpers/unique-id.js +4 -0
  175. package/dist/helpers/use-position.svelte.d.ts +96 -0
  176. package/dist/helpers/use-position.svelte.js +189 -0
  177. package/dist/helpers/use-virtual-list.svelte.d.ts +121 -0
  178. package/dist/helpers/use-virtual-list.svelte.js +239 -0
  179. package/dist/icons/angle-right-icon.svelte +2 -1
  180. package/dist/icons/angle-right-icon.svelte.d.ts +16 -12
  181. package/dist/icons/angle-up-icon.svelte.d.ts +22 -19
  182. package/dist/icons/check-icon.svelte.d.ts +22 -19
  183. package/dist/icons/copy-icon.svelte +46 -0
  184. package/dist/icons/copy-icon.svelte.d.ts +6 -0
  185. package/dist/icons/envelope-icon.svelte.d.ts +22 -19
  186. package/dist/icons/folder-open-icon.svelte.d.ts +22 -19
  187. package/dist/icons/hamburger-icon.svelte.d.ts +22 -19
  188. package/dist/icons/home-icon.svelte +2 -1
  189. package/dist/icons/home-icon.svelte.d.ts +16 -12
  190. package/dist/icons/index.d.ts +13 -0
  191. package/dist/icons/index.js +13 -0
  192. package/dist/icons/link-icon.svelte.d.ts +22 -19
  193. package/dist/icons/mobile-phone-icon.svelte.d.ts +22 -19
  194. package/dist/icons/phone-icon.svelte.d.ts +22 -19
  195. package/dist/icons/svg-icon.svelte +46 -12
  196. package/dist/icons/svg-icon.svelte.d.ts +13 -23
  197. package/dist/icons/upload-icon.svelte.d.ts +22 -19
  198. package/dist/images/icon.svelte +9 -3
  199. package/dist/images/icon.svelte.d.ts +6 -16
  200. package/dist/images/image.svelte +28 -10
  201. package/dist/images/image.svelte.d.ts +14 -26
  202. package/dist/images/index.d.ts +2 -0
  203. package/dist/images/index.js +2 -0
  204. package/dist/index.d.ts +13 -122
  205. package/dist/index.js +27 -135
  206. package/dist/layout/flex-col.svelte +65 -22
  207. package/dist/layout/flex-col.svelte.d.ts +12 -22
  208. package/dist/layout/flex-item.svelte +13 -3
  209. package/dist/layout/flex-item.svelte.d.ts +8 -18
  210. package/dist/layout/flex-row.svelte +70 -21
  211. package/dist/layout/flex-row.svelte.d.ts +14 -24
  212. package/dist/layout/grid.svelte +7 -1
  213. package/dist/layout/grid.svelte.d.ts +6 -26
  214. package/dist/layout/index.d.ts +4 -0
  215. package/dist/layout/index.js +4 -0
  216. package/dist/modals/alert.svelte +42 -28
  217. package/dist/modals/alert.svelte.d.ts +13 -24
  218. package/dist/modals/confirm.svelte +54 -37
  219. package/dist/modals/confirm.svelte.d.ts +16 -27
  220. package/dist/modals/dialog-body.svelte +10 -4
  221. package/dist/modals/dialog-body.svelte.d.ts +6 -26
  222. package/dist/modals/dialog-close-button.svelte +15 -9
  223. package/dist/modals/dialog-close-button.svelte.d.ts +6 -17
  224. package/dist/modals/dialog-footer.svelte +6 -3
  225. package/dist/modals/dialog-footer.svelte.d.ts +6 -26
  226. package/dist/modals/dialog-header.svelte +13 -1
  227. package/dist/modals/dialog-header.svelte.d.ts +7 -26
  228. package/dist/modals/dialog-window.svelte +42 -14
  229. package/dist/modals/dialog-window.svelte.d.ts +9 -17
  230. package/dist/modals/index.d.ts +9 -0
  231. package/dist/modals/index.js +9 -0
  232. package/dist/modals/modal.svelte +88 -25
  233. package/dist/modals/modal.svelte.d.ts +14 -22
  234. package/dist/modals/prompt.svelte +71 -50
  235. package/dist/modals/prompt.svelte.d.ts +19 -30
  236. package/dist/navigation/accordion/accordion.svelte +104 -0
  237. package/dist/navigation/accordion/accordion.svelte.d.ts +9 -0
  238. package/dist/navigation/app-bar/app-bar.svelte +26 -20
  239. package/dist/navigation/app-bar/app-bar.svelte.d.ts +10 -20
  240. package/dist/navigation/app-bar/app-branding.svelte +10 -5
  241. package/dist/navigation/app-bar/app-branding.svelte.d.ts +6 -15
  242. package/dist/navigation/app-bar/app-logo.svelte +20 -5
  243. package/dist/navigation/app-bar/app-logo.svelte.d.ts +9 -19
  244. package/dist/navigation/app-bar/app-nav-item.svelte +26 -14
  245. package/dist/navigation/app-bar/app-nav-item.svelte.d.ts +9 -20
  246. package/dist/navigation/app-bar/app-nav.svelte +39 -12
  247. package/dist/navigation/app-bar/app-nav.svelte.d.ts +8 -18
  248. package/dist/navigation/app-bar/index.d.ts +5 -0
  249. package/dist/navigation/app-bar/index.js +5 -0
  250. package/dist/navigation/breadcrumbs/breadcrumbs.svelte +54 -28
  251. package/dist/navigation/breadcrumbs/breadcrumbs.svelte.d.ts +12 -21
  252. package/dist/navigation/command-palette/command-palette.svelte +758 -0
  253. package/dist/navigation/command-palette/command-palette.svelte.d.ts +65 -0
  254. package/dist/navigation/command-palette/index.d.ts +2 -0
  255. package/dist/navigation/command-palette/index.js +1 -0
  256. package/dist/navigation/context-menu/README.md +146 -0
  257. package/dist/navigation/context-menu/context-menu-divider.svelte +21 -0
  258. package/dist/navigation/context-menu/context-menu-divider.svelte.d.ts +18 -0
  259. package/dist/navigation/context-menu/context-menu-item.svelte +268 -0
  260. package/dist/navigation/context-menu/context-menu-item.svelte.d.ts +19 -0
  261. package/dist/navigation/context-menu/context-menu.svelte +226 -0
  262. package/dist/navigation/context-menu/context-menu.svelte.d.ts +38 -0
  263. package/dist/navigation/context-menu/index.d.ts +3 -0
  264. package/dist/navigation/context-menu/index.js +3 -0
  265. package/dist/navigation/drawer/drawer.svelte +137 -0
  266. package/dist/navigation/drawer/drawer.svelte.d.ts +11 -0
  267. package/dist/navigation/dropdown-button/dropdown-button.svelte +58 -20
  268. package/dist/navigation/dropdown-button/dropdown-button.svelte.d.ts +10 -20
  269. package/dist/navigation/index.d.ts +11 -0
  270. package/dist/navigation/index.js +14 -0
  271. package/dist/navigation/pagination/pagination.svelte +55 -42
  272. package/dist/navigation/pagination/pagination.svelte.d.ts +10 -21
  273. package/dist/navigation/side-bar/side-bar.svelte +18 -9
  274. package/dist/navigation/side-bar/side-bar.svelte.d.ts +7 -17
  275. package/dist/navigation/tabs/index.d.ts +4 -0
  276. package/dist/navigation/tabs/index.js +3 -0
  277. package/dist/navigation/tabs/tab-context.d.ts +12 -6
  278. package/dist/navigation/tabs/tab-group.svelte +268 -55
  279. package/dist/navigation/tabs/tab-group.svelte.d.ts +9 -20
  280. package/dist/navigation/tabs/tab.svelte +64 -34
  281. package/dist/navigation/tabs/tab.svelte.d.ts +11 -22
  282. package/dist/navigation/wizard/index.d.ts +3 -0
  283. package/dist/navigation/wizard/index.js +2 -0
  284. package/dist/navigation/wizard/wizard-context.d.ts +13 -8
  285. package/dist/navigation/wizard/wizard-step.svelte +38 -15
  286. package/dist/navigation/wizard/wizard-step.svelte.d.ts +8 -18
  287. package/dist/navigation/wizard/wizard.svelte +123 -89
  288. package/dist/navigation/wizard/wizard.svelte.d.ts +15 -26
  289. package/dist/placeholders/index.d.ts +6 -0
  290. package/dist/placeholders/index.js +6 -0
  291. package/dist/placeholders/loading.svelte +39 -23
  292. package/dist/placeholders/loading.svelte.d.ts +10 -17
  293. package/dist/placeholders/progress.svelte +7 -6
  294. package/dist/placeholders/progress.svelte.d.ts +5 -15
  295. package/dist/placeholders/skeleton-input.svelte +66 -38
  296. package/dist/placeholders/skeleton-input.svelte.d.ts +5 -15
  297. package/dist/placeholders/skeleton-paragraph.svelte +25 -0
  298. package/dist/placeholders/skeleton-paragraph.svelte.d.ts +8 -0
  299. package/dist/placeholders/skeleton-table.svelte +75 -0
  300. package/dist/placeholders/skeleton-table.svelte.d.ts +8 -0
  301. package/dist/placeholders/skeleton-text.svelte +46 -16
  302. package/dist/placeholders/skeleton-text.svelte.d.ts +7 -17
  303. package/dist/tables/cell-renderers.d.ts +24 -0
  304. package/dist/tables/cell-renderers.js +228 -0
  305. package/dist/tables/data-grid.svelte +332 -135
  306. package/dist/tables/data-grid.svelte.d.ts +34 -33
  307. package/dist/tables/index.d.ts +10 -0
  308. package/dist/tables/index.js +12 -0
  309. package/dist/tables/table-caption.svelte +13 -4
  310. package/dist/tables/table-caption.svelte.d.ts +8 -18
  311. package/dist/tables/table-cell.svelte +45 -15
  312. package/dist/tables/table-cell.svelte.d.ts +10 -19
  313. package/dist/tables/table-context.svelte.d.ts +32 -0
  314. package/dist/tables/table-context.svelte.js +160 -0
  315. package/dist/tables/table-header-cell.svelte +158 -19
  316. package/dist/tables/table-header-cell.svelte.d.ts +15 -19
  317. package/dist/tables/table-header.svelte +31 -6
  318. package/dist/tables/table-header.svelte.d.ts +7 -26
  319. package/dist/tables/table-row.svelte +87 -7
  320. package/dist/tables/table-row.svelte.d.ts +10 -26
  321. package/dist/tables/table.svelte +61 -2
  322. package/dist/tables/table.svelte.d.ts +13 -26
  323. package/dist/test-utils/accessibility-helpers.d.ts +80 -0
  324. package/dist/test-utils/accessibility-helpers.js +220 -0
  325. package/dist/test-utils/index.d.ts +8 -0
  326. package/dist/test-utils/index.js +8 -0
  327. package/dist/test-utils/mock-helpers.d.ts +68 -0
  328. package/dist/test-utils/mock-helpers.js +165 -0
  329. package/dist/test-utils/render-helpers.d.ts +55 -0
  330. package/dist/test-utils/render-helpers.js +114 -0
  331. package/dist/test-utils/setup.d.ts +5 -0
  332. package/dist/test-utils/setup.js +91 -0
  333. package/dist/test-utils/test-data.d.ts +102 -0
  334. package/dist/test-utils/test-data.js +99 -0
  335. package/dist/timeline/index.d.ts +2 -0
  336. package/dist/timeline/index.js +2 -0
  337. package/dist/timeline/timeline-item.svelte +26 -9
  338. package/dist/timeline/timeline-item.svelte.d.ts +13 -23
  339. package/dist/timeline/timeline.svelte +12 -6
  340. package/dist/timeline/timeline.svelte.d.ts +6 -26
  341. package/dist/types/data.d.ts +61 -0
  342. package/dist/types/date.d.ts +1 -1
  343. package/dist/types/form.d.ts +20 -2
  344. package/dist/types/index.d.ts +5 -0
  345. package/dist/types/index.js +5 -0
  346. package/dist/types/size.d.ts +22 -0
  347. package/dist/types/size.js +22 -0
  348. package/dist/typography/code-block.svelte +89 -10
  349. package/dist/typography/code-block.svelte.d.ts +7 -17
  350. package/dist/typography/code.svelte +89 -0
  351. package/dist/typography/code.svelte.d.ts +7 -0
  352. package/dist/typography/headline.svelte +29 -9
  353. package/dist/typography/headline.svelte.d.ts +8 -18
  354. package/dist/typography/index.d.ts +6 -0
  355. package/dist/typography/index.js +6 -0
  356. package/dist/typography/paragraph.svelte +18 -10
  357. package/dist/typography/paragraph.svelte.d.ts +6 -26
  358. package/dist/typography/subtitle.svelte +18 -4
  359. package/dist/typography/subtitle.svelte.d.ts +8 -18
  360. package/dist/typography/text.svelte +20 -5
  361. package/dist/typography/text.svelte.d.ts +9 -19
  362. package/package.json +46 -36
  363. package/dist/navigation/accordian/accordian.svelte +0 -62
  364. package/dist/navigation/accordian/accordian.svelte.d.ts +0 -19
  365. package/dist/tables/table-body.svelte +0 -3
  366. package/dist/tables/table-body.svelte.d.ts +0 -27
  367. package/dist/tables/table-footer-cell.svelte +0 -22
  368. package/dist/tables/table-footer-cell.svelte.d.ts +0 -18
  369. package/dist/tables/table-footer-row.svelte +0 -3
  370. package/dist/tables/table-footer-row.svelte.d.ts +0 -27
  371. package/dist/tables/table-footer.svelte +0 -13
  372. package/dist/tables/table-footer.svelte.d.ts +0 -27
  373. package/dist/tables/table-header-row.svelte +0 -4
  374. package/dist/tables/table-header-row.svelte.d.ts +0 -27
@@ -0,0 +1,758 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import type { Snippet } from 'svelte';
4
+ import { fuzzySearch, highlightMatches, type FuzzyMatch } from '../../helpers/fuzzy-search.js';
5
+ import { announce } from '../../helpers/announcer.js';
6
+ import Overlay from '../../generic/overlay.svelte';
7
+ import { fadeIn, slideIn } from '../../helpers/animation-actions.js';
8
+
9
+ /**
10
+ * Command item interface
11
+ */
12
+ export interface Command {
13
+ /** Unique identifier for the command */
14
+ id: string;
15
+ /** Display label for the command */
16
+ label: string;
17
+ /** Optional description/subtitle */
18
+ description?: string;
19
+ /** Optional icon (snippet or string class name) */
20
+ icon?: Snippet | string;
21
+ /** Group this command belongs to */
22
+ group?: string;
23
+ /** Keywords for better search matching */
24
+ keywords?: string[];
25
+ /** Custom data to pass to onSelect handler */
26
+ data?: any;
27
+ /** Whether this command is disabled */
28
+ disabled?: boolean;
29
+ /** Action to perform when selected */
30
+ action?: () => void | Promise<void>;
31
+ }
32
+
33
+ export interface CommandGroup {
34
+ /** Group identifier */
35
+ id: string;
36
+ /** Group display name */
37
+ label: string;
38
+ /** Group priority for ordering */
39
+ priority?: number;
40
+ }
41
+
42
+ // Props
43
+ interface Props {
44
+ /** List of available commands */
45
+ commands?: Command[];
46
+ /** Command groups configuration */
47
+ groups?: CommandGroup[];
48
+ /** Whether the palette is open */
49
+ open?: boolean;
50
+ /** Placeholder text for search input */
51
+ placeholder?: string;
52
+ /** Show recent commands at the top */
53
+ showRecent?: boolean;
54
+ /** Maximum recent commands to show */
55
+ maxRecent?: number;
56
+ /** Keyboard shortcut to open (default: 'k' for Cmd/Ctrl+K) */
57
+ shortcut?: string;
58
+ /** Modifier key for shortcut (default: 'meta' for Cmd/Ctrl) */
59
+ shortcutModifier?: 'meta' | 'ctrl' | 'alt' | 'shift';
60
+ /** Enable keyboard shortcut */
61
+ enableShortcut?: boolean;
62
+ /** Empty state message */
63
+ emptyMessage?: string;
64
+ /** Blur background when open */
65
+ blur?: boolean;
66
+ /** Callback when a command is selected */
67
+ onSelect?: (command: Command) => void;
68
+ /** Callback when palette opens */
69
+ onOpen?: () => void;
70
+ /** Callback when palette closes */
71
+ onClose?: () => void;
72
+ }
73
+
74
+ let {
75
+ commands = [],
76
+ groups = [],
77
+ open = $bindable(false),
78
+ placeholder = 'Type a command or search...',
79
+ showRecent = true,
80
+ maxRecent = 5,
81
+ shortcut = 'k',
82
+ shortcutModifier = 'meta',
83
+ enableShortcut = true,
84
+ emptyMessage = 'No commands found',
85
+ blur = true,
86
+ onSelect,
87
+ onOpen,
88
+ onClose
89
+ }: Props = $props();
90
+
91
+ // State
92
+ let query = $state('');
93
+ let selectedIndex = $state(0);
94
+ let inputElement = $state<HTMLInputElement>();
95
+ let recentCommands = $state<string[]>([]);
96
+
97
+ // Load recent commands from localStorage
98
+ onMount(() => {
99
+ if (showRecent) {
100
+ const stored = localStorage.getItem('command-palette-recent');
101
+ if (stored) {
102
+ try {
103
+ recentCommands = JSON.parse(stored);
104
+ } catch {
105
+ recentCommands = [];
106
+ }
107
+ }
108
+ }
109
+ });
110
+
111
+ // Filtered and grouped commands
112
+ const filteredCommands = $derived.by(() => {
113
+ let results: Command[] = [];
114
+
115
+ if (!query.trim()) {
116
+ // Show recent commands first, then all commands
117
+ if (showRecent && recentCommands.length > 0) {
118
+ const recentIds = new Set(recentCommands.slice(0, maxRecent));
119
+ const recent = commands.filter((cmd) => recentIds.has(cmd.id));
120
+ const other = commands.filter((cmd) => !recentIds.has(cmd.id));
121
+ results = [...recent, ...other];
122
+ } else {
123
+ results = [...commands];
124
+ }
125
+ } else {
126
+ // Fuzzy search across label, description, and keywords
127
+ const matches = fuzzySearch<Command>(query, commands, {
128
+ keys: ['label', 'description'],
129
+ threshold: 0.1,
130
+ limit: 50
131
+ });
132
+
133
+ // Also search keywords
134
+ const keywordMatches = commands.filter((cmd) => {
135
+ if (!cmd.keywords) return false;
136
+ return cmd.keywords.some((keyword) =>
137
+ keyword.toLowerCase().includes(query.toLowerCase())
138
+ );
139
+ });
140
+
141
+ // Combine and dedupe
142
+ const seen = new Set<string>();
143
+ for (const match of matches) {
144
+ if (!seen.has(match.item.id)) {
145
+ results.push(match.item);
146
+ seen.add(match.item.id);
147
+ }
148
+ }
149
+ for (const cmd of keywordMatches) {
150
+ if (!seen.has(cmd.id)) {
151
+ results.push(cmd);
152
+ seen.add(cmd.id);
153
+ }
154
+ }
155
+ }
156
+
157
+ return results;
158
+ });
159
+
160
+ // Group commands
161
+ const groupedCommands = $derived.by(() => {
162
+ const grouped = new Map<string, Command[]>();
163
+
164
+ // Group by defined groups
165
+ for (const cmd of filteredCommands) {
166
+ const groupId = cmd.group || 'default';
167
+ if (!grouped.has(groupId)) {
168
+ grouped.set(groupId, []);
169
+ }
170
+ grouped.get(groupId)!.push(cmd);
171
+ }
172
+
173
+ // Sort groups by priority
174
+ const sortedGroups = Array.from(grouped.entries()).sort((a, b) => {
175
+ const groupA = groups.find((g) => g.id === a[0]);
176
+ const groupB = groups.find((g) => g.id === b[0]);
177
+ const priorityA = groupA?.priority ?? 999;
178
+ const priorityB = groupB?.priority ?? 999;
179
+ return priorityA - priorityB;
180
+ });
181
+
182
+ return sortedGroups;
183
+ });
184
+
185
+ // Flat list of filtered commands for keyboard navigation
186
+ const flatCommands = $derived(filteredCommands.filter((cmd) => !cmd.disabled));
187
+
188
+ // Keyboard shortcut handler
189
+ function handleGlobalKeydown(event: KeyboardEvent) {
190
+ if (!enableShortcut) return;
191
+
192
+ const modifierPressed =
193
+ shortcutModifier === 'meta'
194
+ ? event.metaKey || event.ctrlKey
195
+ : event[`${shortcutModifier}Key` as keyof KeyboardEvent];
196
+
197
+ if (modifierPressed && event.key.toLowerCase() === shortcut.toLowerCase()) {
198
+ event.preventDefault();
199
+ openPalette();
200
+ }
201
+ }
202
+
203
+ // Mount/unmount keyboard listener
204
+ onMount(() => {
205
+ window.addEventListener('keydown', handleGlobalKeydown);
206
+ return () => window.removeEventListener('keydown', handleGlobalKeydown);
207
+ });
208
+
209
+ // Open palette
210
+ function openPalette() {
211
+ open = true;
212
+ query = '';
213
+ selectedIndex = 0;
214
+ onOpen?.();
215
+ // Focus input after opening
216
+ setTimeout(() => inputElement?.focus(), 10);
217
+ announce('Command palette opened', { priority: 'polite' });
218
+ }
219
+
220
+ // Close palette
221
+ function closePalette() {
222
+ open = false;
223
+ query = '';
224
+ selectedIndex = 0;
225
+ onClose?.();
226
+ announce('Command palette closed', { priority: 'polite' });
227
+ }
228
+
229
+ // Execute command
230
+ function executeCommand(command: Command) {
231
+ if (command.disabled) return;
232
+
233
+ // Add to recent commands
234
+ if (showRecent) {
235
+ recentCommands = [
236
+ command.id,
237
+ ...recentCommands.filter((id) => id !== command.id)
238
+ ].slice(0, maxRecent);
239
+ localStorage.setItem('command-palette-recent', JSON.stringify(recentCommands));
240
+ }
241
+
242
+ // Execute action
243
+ command.action?.();
244
+ onSelect?.(command);
245
+
246
+ // Close palette
247
+ closePalette();
248
+
249
+ announce(`Executed: ${command.label}`, { priority: 'assertive' });
250
+ }
251
+
252
+ // Keyboard navigation
253
+ function handleKeydown(event: KeyboardEvent) {
254
+ switch (event.key) {
255
+ case 'ArrowDown':
256
+ event.preventDefault();
257
+ selectedIndex = Math.min(selectedIndex + 1, flatCommands.length - 1);
258
+ scrollToSelected();
259
+ announce(
260
+ `${flatCommands[selectedIndex]?.label || 'Unknown command'}`,
261
+ { priority: 'polite' }
262
+ );
263
+ break;
264
+
265
+ case 'ArrowUp':
266
+ event.preventDefault();
267
+ selectedIndex = Math.max(selectedIndex - 1, 0);
268
+ scrollToSelected();
269
+ announce(
270
+ `${flatCommands[selectedIndex]?.label || 'Unknown command'}`,
271
+ { priority: 'polite' }
272
+ );
273
+ break;
274
+
275
+ case 'Home':
276
+ event.preventDefault();
277
+ selectedIndex = 0;
278
+ scrollToSelected();
279
+ break;
280
+
281
+ case 'End':
282
+ event.preventDefault();
283
+ selectedIndex = flatCommands.length - 1;
284
+ scrollToSelected();
285
+ break;
286
+
287
+ case 'Enter':
288
+ event.preventDefault();
289
+ if (flatCommands[selectedIndex]) {
290
+ executeCommand(flatCommands[selectedIndex]);
291
+ }
292
+ break;
293
+
294
+ case 'Escape':
295
+ event.preventDefault();
296
+ closePalette();
297
+ break;
298
+ }
299
+ }
300
+
301
+ // Scroll selected item into view
302
+ function scrollToSelected() {
303
+ const element = document.querySelector(
304
+ `.command-palette__item[data-index="${selectedIndex}"]`
305
+ );
306
+ element?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });
307
+ }
308
+
309
+ // Handle input change
310
+ function handleInput() {
311
+ selectedIndex = 0; // Reset selection on search
312
+ }
313
+
314
+ // Handle overlay click
315
+ function handleOverlayClick() {
316
+ closePalette();
317
+ }
318
+
319
+ // Get group label
320
+ function getGroupLabel(groupId: string): string {
321
+ if (groupId === 'default') return 'Commands';
322
+ return groups.find((g) => g.id === groupId)?.label || groupId;
323
+ }
324
+
325
+ // Check if command is recent
326
+ function isRecent(commandId: string): boolean {
327
+ return showRecent && recentCommands.slice(0, maxRecent).includes(commandId);
328
+ }
329
+
330
+ // Highlight query matches in text
331
+ function getHighlightedText(text: string): string {
332
+ if (!query.trim()) return text;
333
+
334
+ const match = fuzzySearch(query, [text], { threshold: 0 });
335
+ if (match.length > 0) {
336
+ return highlightMatches(text, match[0].matches);
337
+ }
338
+ return text;
339
+ }
340
+ </script>
341
+
342
+ {#if open}
343
+ <div class="command-palette" role="dialog" aria-modal="true" aria-label="Command palette">
344
+ <Overlay onClick={handleOverlayClick} {blur} />
345
+
346
+ <div class="command-palette__container" use:fadeIn use:slideIn={'top'}>
347
+ <div class="command-palette__header">
348
+ <div class="command-palette__search">
349
+ <svg
350
+ class="command-palette__search-icon"
351
+ width="20"
352
+ height="20"
353
+ viewBox="0 0 20 20"
354
+ fill="none"
355
+ xmlns="http://www.w3.org/2000/svg"
356
+ aria-hidden="true"
357
+ >
358
+ <path
359
+ d="M9 17A8 8 0 1 0 9 1a8 8 0 0 0 0 16zM19 19l-4.35-4.35"
360
+ stroke="currentColor"
361
+ stroke-width="2"
362
+ stroke-linecap="round"
363
+ stroke-linejoin="round"
364
+ />
365
+ </svg>
366
+
367
+ <input
368
+ bind:this={inputElement}
369
+ bind:value={query}
370
+ oninput={handleInput}
371
+ onkeydown={handleKeydown}
372
+ type="text"
373
+ class="command-palette__input"
374
+ {placeholder}
375
+ role="combobox"
376
+ aria-expanded="true"
377
+ aria-controls="command-palette-listbox"
378
+ aria-activedescendant={flatCommands[selectedIndex]?.id}
379
+ aria-autocomplete="list"
380
+ />
381
+
382
+ {#if enableShortcut}
383
+ <kbd class="command-palette__shortcut">
384
+ {shortcutModifier === 'meta' ? '⌘' : 'Ctrl'}
385
+ {shortcut.toUpperCase()}
386
+ </kbd>
387
+ {/if}
388
+ </div>
389
+ </div>
390
+
391
+ <div class="command-palette__content" id="command-palette-listbox" role="listbox">
392
+ {#if flatCommands.length === 0}
393
+ <div class="command-palette__empty">
394
+ <svg
395
+ width="48"
396
+ height="48"
397
+ viewBox="0 0 24 24"
398
+ fill="none"
399
+ xmlns="http://www.w3.org/2000/svg"
400
+ aria-hidden="true"
401
+ >
402
+ <circle
403
+ cx="12"
404
+ cy="12"
405
+ r="10"
406
+ stroke="currentColor"
407
+ stroke-width="1.5"
408
+ opacity="0.3"
409
+ />
410
+ <path
411
+ d="M8 12h8M12 8v8"
412
+ stroke="currentColor"
413
+ stroke-width="1.5"
414
+ stroke-linecap="round"
415
+ opacity="0.5"
416
+ />
417
+ </svg>
418
+ <p>{emptyMessage}</p>
419
+ </div>
420
+ {:else}
421
+ {#each groupedCommands as [groupId, groupCommands]}
422
+ <div class="command-palette__group">
423
+ <div class="command-palette__group-label">{getGroupLabel(groupId)}</div>
424
+
425
+ {#each groupCommands as command, index}
426
+ {@const globalIndex = flatCommands.findIndex((c) => c.id === command.id)}
427
+ {@const isSelected = globalIndex === selectedIndex}
428
+ {@const isRecentCommand = isRecent(command.id)}
429
+
430
+ <button
431
+ type="button"
432
+ class="command-palette__item"
433
+ class:command-palette__item--selected={isSelected}
434
+ class:command-palette__item--disabled={command.disabled}
435
+ class:command-palette__item--recent={isRecentCommand}
436
+ data-index={globalIndex}
437
+ role="option"
438
+ aria-selected={isSelected}
439
+ id={command.id}
440
+ disabled={command.disabled}
441
+ onclick={() => executeCommand(command)}
442
+ >
443
+ <div class="command-palette__item-content">
444
+ {#if command.icon}
445
+ <div class="command-palette__item-icon">
446
+ {#if typeof command.icon === 'string'}
447
+ <i class={command.icon}></i>
448
+ {:else}
449
+ {@render command.icon()}
450
+ {/if}
451
+ </div>
452
+ {/if}
453
+
454
+ <div class="command-palette__item-text">
455
+ <div class="command-palette__item-label">
456
+ {@html getHighlightedText(command.label)}
457
+ </div>
458
+ {#if command.description}
459
+ <div class="command-palette__item-description">
460
+ {@html getHighlightedText(command.description)}
461
+ </div>
462
+ {/if}
463
+ </div>
464
+
465
+ {#if isRecentCommand}
466
+ <div class="command-palette__item-badge">Recent</div>
467
+ {/if}
468
+ </div>
469
+ </button>
470
+ {/each}
471
+ </div>
472
+ {/each}
473
+ {/if}
474
+ </div>
475
+
476
+ <div class="command-palette__footer">
477
+ <div class="command-palette__hints">
478
+ <span>
479
+ <kbd>↑</kbd>
480
+ <kbd>↓</kbd>
481
+ Navigate
482
+ </span>
483
+ <span>
484
+ <kbd>↵</kbd>
485
+ Select
486
+ </span>
487
+ <span>
488
+ <kbd>Esc</kbd>
489
+ Close
490
+ </span>
491
+ </div>
492
+ </div>
493
+ </div>
494
+ </div>
495
+ {/if}
496
+
497
+ <style>.command-palette {
498
+ position: fixed;
499
+ top: 0;
500
+ left: 0;
501
+ right: 0;
502
+ bottom: 0;
503
+ z-index: 9999;
504
+ display: flex;
505
+ align-items: flex-start;
506
+ justify-content: center;
507
+ padding: var(--spacing-2xl);
508
+ padding-top: 15vh;
509
+ }
510
+ @media (max-width: 768px) {
511
+ .command-palette {
512
+ padding: var(--spacing-md);
513
+ padding-top: 10vh;
514
+ }
515
+ }
516
+
517
+ .command-palette__container {
518
+ position: relative;
519
+ z-index: 10000;
520
+ width: 100%;
521
+ max-width: 640px;
522
+ background: var(--surface);
523
+ border: 1px solid var(--border);
524
+ border-radius: var(--radius-lg);
525
+ box-shadow: var(--shadow-2xl);
526
+ display: flex;
527
+ flex-direction: column;
528
+ max-height: 60vh;
529
+ overflow: hidden;
530
+ backdrop-filter: blur(20px);
531
+ background: rgba(255, 255, 255, 0.95);
532
+ }
533
+ [data-theme=dark] .command-palette__container {
534
+ background: rgba(30, 30, 30, 0.95);
535
+ }
536
+
537
+ .command-palette__header {
538
+ padding: var(--spacing-md);
539
+ border-bottom: 1px solid var(--border);
540
+ }
541
+
542
+ .command-palette__search {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: var(--spacing-sm);
546
+ }
547
+
548
+ .command-palette__search-icon {
549
+ color: var(--text-muted);
550
+ flex-shrink: 0;
551
+ }
552
+
553
+ .command-palette__input {
554
+ flex: 1;
555
+ border: none;
556
+ background: transparent;
557
+ font-size: var(--font-size-lg);
558
+ color: var(--text);
559
+ outline: none;
560
+ padding: var(--spacing-xs) 0;
561
+ }
562
+ .command-palette__input::placeholder {
563
+ color: var(--text-muted);
564
+ }
565
+
566
+ .command-palette__shortcut {
567
+ display: flex;
568
+ align-items: center;
569
+ gap: 2px;
570
+ padding: var(--spacing-xs) var(--spacing-sm);
571
+ background: var(--background-secondary);
572
+ border: 1px solid var(--border);
573
+ border-radius: var(--radius-sm);
574
+ font-size: var(--font-size-xs);
575
+ font-family: var(--font-mono);
576
+ color: var(--text-muted);
577
+ flex-shrink: 0;
578
+ }
579
+
580
+ .command-palette__content {
581
+ flex: 1;
582
+ overflow-y: auto;
583
+ overflow-x: hidden;
584
+ }
585
+
586
+ .command-palette__group {
587
+ padding: var(--spacing-sm) 0;
588
+ }
589
+ .command-palette__group:not(:last-child) {
590
+ border-bottom: 1px solid var(--border);
591
+ }
592
+
593
+ .command-palette__group-label {
594
+ padding: var(--spacing-xs) var(--spacing-md);
595
+ font-size: var(--font-size-xs);
596
+ font-weight: 600;
597
+ color: var(--text-muted);
598
+ text-transform: uppercase;
599
+ letter-spacing: 0.05em;
600
+ }
601
+
602
+ .command-palette__item {
603
+ width: 100%;
604
+ padding: var(--spacing-sm) var(--spacing-md);
605
+ border: none;
606
+ background: transparent;
607
+ cursor: pointer;
608
+ text-align: left;
609
+ transition: background-color 0.15s ease;
610
+ }
611
+ .command-palette__item:hover:not(.command-palette__item--disabled) {
612
+ background: var(--background-secondary);
613
+ }
614
+ .command-palette__item--selected {
615
+ background: var(--primary-light);
616
+ }
617
+ [data-theme=dark] .command-palette__item--selected {
618
+ background: rgba(var(--primary-rgb), 0.15);
619
+ }
620
+ .command-palette__item--disabled {
621
+ opacity: 0.5;
622
+ cursor: not-allowed;
623
+ }
624
+ .command-palette__item:focus-visible {
625
+ outline: 2px solid var(--focus-ring-color);
626
+ outline-offset: -2px;
627
+ }
628
+
629
+ .command-palette__item-content {
630
+ display: flex;
631
+ align-items: center;
632
+ gap: var(--spacing-sm);
633
+ }
634
+
635
+ .command-palette__item-icon {
636
+ flex-shrink: 0;
637
+ width: 20px;
638
+ height: 20px;
639
+ display: flex;
640
+ align-items: center;
641
+ justify-content: center;
642
+ color: var(--text-muted);
643
+ }
644
+ .command-palette__item-icon i {
645
+ font-size: 18px;
646
+ }
647
+
648
+ .command-palette__item-text {
649
+ flex: 1;
650
+ min-width: 0;
651
+ }
652
+
653
+ .command-palette__item-label {
654
+ font-size: var(--font-size-base);
655
+ color: var(--text);
656
+ font-weight: 500;
657
+ }
658
+ .command-palette__item-label :global(mark) {
659
+ background: var(--warning-light);
660
+ color: var(--text);
661
+ font-weight: 600;
662
+ padding: 0 2px;
663
+ border-radius: 2px;
664
+ }
665
+ [data-theme=dark] .command-palette__item-label :global(mark) {
666
+ background: rgba(var(--warning-rgb), 0.3);
667
+ }
668
+
669
+ .command-palette__item-description {
670
+ font-size: var(--font-size-sm);
671
+ color: var(--text-muted);
672
+ margin-top: 2px;
673
+ white-space: nowrap;
674
+ overflow: hidden;
675
+ text-overflow: ellipsis;
676
+ }
677
+ .command-palette__item-description :global(mark) {
678
+ background: var(--warning-light);
679
+ color: var(--text-muted);
680
+ font-weight: 600;
681
+ padding: 0 2px;
682
+ border-radius: 2px;
683
+ }
684
+ [data-theme=dark] .command-palette__item-description :global(mark) {
685
+ background: rgba(var(--warning-rgb), 0.3);
686
+ }
687
+
688
+ .command-palette__item-badge {
689
+ flex-shrink: 0;
690
+ padding: 2px var(--spacing-xs);
691
+ background: var(--info-light);
692
+ color: var(--info);
693
+ font-size: var(--font-size-xs);
694
+ font-weight: 600;
695
+ border-radius: var(--radius-sm);
696
+ }
697
+ [data-theme=dark] .command-palette__item-badge {
698
+ background: rgba(var(--info-rgb), 0.2);
699
+ color: var(--info-light);
700
+ }
701
+
702
+ .command-palette__empty {
703
+ display: flex;
704
+ flex-direction: column;
705
+ align-items: center;
706
+ justify-content: center;
707
+ padding: var(--spacing-2xl);
708
+ color: var(--text-muted);
709
+ text-align: center;
710
+ }
711
+ .command-palette__empty svg {
712
+ margin-bottom: var(--spacing-md);
713
+ opacity: 0.5;
714
+ }
715
+ .command-palette__empty p {
716
+ margin: 0;
717
+ font-size: var(--font-size-base);
718
+ }
719
+
720
+ .command-palette__footer {
721
+ padding: var(--spacing-sm) var(--spacing-md);
722
+ border-top: 1px solid var(--border);
723
+ background: var(--background-secondary);
724
+ }
725
+
726
+ .command-palette__hints {
727
+ display: flex;
728
+ align-items: center;
729
+ gap: var(--spacing-md);
730
+ font-size: var(--font-size-xs);
731
+ color: var(--text-muted);
732
+ }
733
+ .command-palette__hints span {
734
+ display: flex;
735
+ align-items: center;
736
+ gap: var(--spacing-xs);
737
+ }
738
+ .command-palette__hints kbd {
739
+ padding: 2px var(--spacing-xs);
740
+ background: var(--surface);
741
+ border: 1px solid var(--border);
742
+ border-radius: var(--radius-xs);
743
+ font-size: var(--font-size-xs);
744
+ font-family: var(--font-mono);
745
+ font-weight: 600;
746
+ min-width: 20px;
747
+ text-align: center;
748
+ }
749
+
750
+ @media (prefers-reduced-motion: reduce) {
751
+ .command-palette__container {
752
+ animation: none;
753
+ }
754
+ .command-palette__item {
755
+ transition: none;
756
+ }
757
+ }</style>
758
+