snice 2.5.4 → 3.1.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 (323) hide show
  1. package/README.md +501 -882
  2. package/bin/templates/base/src/components/counter-button.ts +13 -26
  3. package/bin/templates/base/src/controllers/counter-controller.ts +3 -3
  4. package/dist/components/accordion/snice-accordion-item.d.ts +4 -5
  5. package/dist/components/accordion/snice-accordion-item.js +37 -39
  6. package/dist/components/accordion/snice-accordion-item.js.map +1 -1
  7. package/dist/components/accordion/snice-accordion.d.ts +5 -11
  8. package/dist/components/accordion/snice-accordion.js +51 -52
  9. package/dist/components/accordion/snice-accordion.js.map +1 -1
  10. package/dist/components/alert/snice-alert.d.ts +2 -6
  11. package/dist/components/alert/snice-alert.js +41 -56
  12. package/dist/components/alert/snice-alert.js.map +1 -1
  13. package/dist/components/avatar/snice-avatar.d.ts +2 -6
  14. package/dist/components/avatar/snice-avatar.js +64 -71
  15. package/dist/components/avatar/snice-avatar.js.map +1 -1
  16. package/dist/components/badge/snice-badge.d.ts +2 -3
  17. package/dist/components/badge/snice-badge.js +22 -23
  18. package/dist/components/badge/snice-badge.js.map +1 -1
  19. package/dist/components/breadcrumbs/snice-breadcrumbs.d.ts +5 -12
  20. package/dist/components/breadcrumbs/snice-breadcrumbs.js +88 -89
  21. package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -1
  22. package/dist/components/button/snice-button.d.ts +3 -7
  23. package/dist/components/button/snice-button.js +37 -58
  24. package/dist/components/button/snice-button.js.map +1 -1
  25. package/dist/components/card/snice-card.d.ts +5 -8
  26. package/dist/components/card/snice-card.js +71 -56
  27. package/dist/components/card/snice-card.js.map +1 -1
  28. package/dist/components/checkbox/snice-checkbox.d.ts +4 -13
  29. package/dist/components/checkbox/snice-checkbox.js +66 -137
  30. package/dist/components/checkbox/snice-checkbox.js.map +1 -1
  31. package/dist/components/chip/snice-chip.d.ts +5 -11
  32. package/dist/components/chip/snice-chip.js +44 -47
  33. package/dist/components/chip/snice-chip.js.map +1 -1
  34. package/dist/components/date-picker/snice-date-picker.d.ts +11 -11
  35. package/dist/components/date-picker/snice-date-picker.js +134 -133
  36. package/dist/components/date-picker/snice-date-picker.js.map +1 -1
  37. package/dist/components/divider/snice-divider.d.ts +2 -4
  38. package/dist/components/divider/snice-divider.js +14 -22
  39. package/dist/components/divider/snice-divider.js.map +1 -1
  40. package/dist/components/drawer/snice-drawer.d.ts +4 -4
  41. package/dist/components/drawer/snice-drawer.js +25 -19
  42. package/dist/components/drawer/snice-drawer.js.map +1 -1
  43. package/dist/components/input/snice-input.d.ts +8 -6
  44. package/dist/components/input/snice-input.js +122 -105
  45. package/dist/components/input/snice-input.js.map +1 -1
  46. package/dist/components/layout/snice-layout-blog.d.ts +4 -4
  47. package/dist/components/layout/snice-layout-blog.js +21 -19
  48. package/dist/components/layout/snice-layout-blog.js.map +1 -1
  49. package/dist/components/layout/snice-layout-card.d.ts +2 -2
  50. package/dist/components/layout/snice-layout-card.js +16 -9
  51. package/dist/components/layout/snice-layout-card.js.map +1 -1
  52. package/dist/components/layout/snice-layout-centered.d.ts +2 -2
  53. package/dist/components/layout/snice-layout-centered.js +14 -7
  54. package/dist/components/layout/snice-layout-centered.js.map +1 -1
  55. package/dist/components/layout/snice-layout-dashboard.d.ts +5 -5
  56. package/dist/components/layout/snice-layout-dashboard.js +38 -30
  57. package/dist/components/layout/snice-layout-dashboard.js.map +1 -1
  58. package/dist/components/layout/snice-layout-fullscreen.d.ts +2 -2
  59. package/dist/components/layout/snice-layout-fullscreen.js +17 -10
  60. package/dist/components/layout/snice-layout-fullscreen.js.map +1 -1
  61. package/dist/components/layout/snice-layout-landing.d.ts +4 -4
  62. package/dist/components/layout/snice-layout-landing.js +21 -19
  63. package/dist/components/layout/snice-layout-landing.js.map +1 -1
  64. package/dist/components/layout/snice-layout-minimal.d.ts +2 -2
  65. package/dist/components/layout/snice-layout-minimal.js +17 -6
  66. package/dist/components/layout/snice-layout-minimal.js.map +1 -1
  67. package/dist/components/layout/snice-layout-sidebar.d.ts +5 -4
  68. package/dist/components/layout/snice-layout-sidebar.js +42 -20
  69. package/dist/components/layout/snice-layout-sidebar.js.map +1 -1
  70. package/dist/components/layout/snice-layout-split.d.ts +2 -2
  71. package/dist/components/layout/snice-layout-split.js +14 -7
  72. package/dist/components/layout/snice-layout-split.js.map +1 -1
  73. package/dist/components/layout/snice-layout.d.ts +4 -4
  74. package/dist/components/layout/snice-layout.js +16 -10
  75. package/dist/components/layout/snice-layout.js.map +1 -1
  76. package/dist/components/login/snice-login.d.ts +6 -11
  77. package/dist/components/login/snice-login.js +97 -71
  78. package/dist/components/login/snice-login.js.map +1 -1
  79. package/dist/components/modal/snice-modal.d.ts +5 -9
  80. package/dist/components/modal/snice-modal.js +47 -78
  81. package/dist/components/modal/snice-modal.js.map +1 -1
  82. package/dist/components/nav/snice-nav.d.ts +13 -7
  83. package/dist/components/nav/snice-nav.js +191 -100
  84. package/dist/components/nav/snice-nav.js.map +1 -1
  85. package/dist/components/nav/snice-nav.types.d.ts +3 -3
  86. package/dist/components/pagination/snice-pagination.d.ts +6 -7
  87. package/dist/components/pagination/snice-pagination.js +94 -81
  88. package/dist/components/pagination/snice-pagination.js.map +1 -1
  89. package/dist/components/progress/snice-progress.d.ts +2 -7
  90. package/dist/components/progress/snice-progress.js +41 -98
  91. package/dist/components/progress/snice-progress.js.map +1 -1
  92. package/dist/components/radio/snice-radio.d.ts +4 -4
  93. package/dist/components/radio/snice-radio.js +52 -44
  94. package/dist/components/radio/snice-radio.js.map +1 -1
  95. package/dist/components/select/snice-option.d.ts +2 -1
  96. package/dist/components/select/snice-option.js +12 -5
  97. package/dist/components/select/snice-option.js.map +1 -1
  98. package/dist/components/select/snice-select.d.ts +9 -21
  99. package/dist/components/select/snice-select.js +98 -170
  100. package/dist/components/select/snice-select.js.map +1 -1
  101. package/dist/components/skeleton/snice-skeleton.d.ts +2 -6
  102. package/dist/components/skeleton/snice-skeleton.js +18 -49
  103. package/dist/components/skeleton/snice-skeleton.js.map +1 -1
  104. package/dist/components/snice-cell-BLFVdxPp.js +4 -0
  105. package/dist/components/snice-cell-BLFVdxPp.js.map +1 -0
  106. package/dist/components/switch/snice-switch.d.ts +2 -2
  107. package/dist/components/switch/snice-switch.js +38 -26
  108. package/dist/components/switch/snice-switch.js.map +1 -1
  109. package/dist/components/table/snice-cell-actions.d.ts +24 -0
  110. package/dist/components/table/snice-cell-actions.js +149 -0
  111. package/dist/components/table/snice-cell-actions.js.map +1 -0
  112. package/dist/components/table/snice-cell-boolean.d.ts +2 -2
  113. package/dist/components/table/snice-cell-boolean.js +13 -7
  114. package/dist/components/table/snice-cell-boolean.js.map +1 -1
  115. package/dist/components/table/snice-cell-color.d.ts +18 -0
  116. package/dist/components/table/snice-cell-color.js +149 -0
  117. package/dist/components/table/snice-cell-color.js.map +1 -0
  118. package/dist/components/table/snice-cell-currency.d.ts +24 -0
  119. package/dist/components/table/snice-cell-currency.js +235 -0
  120. package/dist/components/table/snice-cell-currency.js.map +1 -0
  121. package/dist/components/table/snice-cell-date.d.ts +2 -2
  122. package/dist/components/table/snice-cell-date.js +14 -8
  123. package/dist/components/table/snice-cell-date.js.map +1 -1
  124. package/dist/components/table/snice-cell-duration.d.ts +2 -2
  125. package/dist/components/table/snice-cell-duration.js +12 -6
  126. package/dist/components/table/snice-cell-duration.js.map +1 -1
  127. package/dist/components/table/snice-cell-email.d.ts +15 -0
  128. package/dist/components/table/snice-cell-email.js +125 -0
  129. package/dist/components/table/snice-cell-email.js.map +1 -0
  130. package/dist/components/table/snice-cell-filesize.d.ts +2 -2
  131. package/dist/components/table/snice-cell-filesize.js +12 -6
  132. package/dist/components/table/snice-cell-filesize.js.map +1 -1
  133. package/dist/components/table/snice-cell-image.d.ts +20 -0
  134. package/dist/components/table/snice-cell-image.js +162 -0
  135. package/dist/components/table/snice-cell-image.js.map +1 -0
  136. package/dist/components/table/snice-cell-json.d.ts +20 -0
  137. package/dist/components/table/snice-cell-json.js +186 -0
  138. package/dist/components/table/snice-cell-json.js.map +1 -0
  139. package/dist/components/table/snice-cell-link.d.ts +17 -0
  140. package/dist/components/table/snice-cell-link.js +142 -0
  141. package/dist/components/table/snice-cell-link.js.map +1 -0
  142. package/dist/components/table/snice-cell-location.d.ts +19 -0
  143. package/dist/components/table/snice-cell-location.js +185 -0
  144. package/dist/components/table/snice-cell-location.js.map +1 -0
  145. package/dist/components/table/snice-cell-number.d.ts +2 -2
  146. package/dist/components/table/snice-cell-number.js +12 -6
  147. package/dist/components/table/snice-cell-number.js.map +1 -1
  148. package/dist/components/table/snice-cell-percentage.d.ts +22 -0
  149. package/dist/components/table/snice-cell-percentage.js +208 -0
  150. package/dist/components/table/snice-cell-percentage.js.map +1 -0
  151. package/dist/components/table/snice-cell-phone.d.ts +18 -0
  152. package/dist/components/table/snice-cell-phone.js +153 -0
  153. package/dist/components/table/snice-cell-phone.js.map +1 -0
  154. package/dist/components/table/snice-cell-progress.d.ts +2 -2
  155. package/dist/components/table/snice-cell-progress.js +12 -6
  156. package/dist/components/table/snice-cell-progress.js.map +1 -1
  157. package/dist/components/table/snice-cell-rating.d.ts +2 -2
  158. package/dist/components/table/snice-cell-rating.js +12 -6
  159. package/dist/components/table/snice-cell-rating.js.map +1 -1
  160. package/dist/components/table/snice-cell-sparkline.d.ts +2 -2
  161. package/dist/components/table/snice-cell-sparkline.js +13 -7
  162. package/dist/components/table/snice-cell-sparkline.js.map +1 -1
  163. package/dist/components/table/snice-cell-status.d.ts +17 -0
  164. package/dist/components/table/snice-cell-status.js +144 -0
  165. package/dist/components/table/snice-cell-status.js.map +1 -0
  166. package/dist/components/table/snice-cell-tag.d.ts +16 -0
  167. package/dist/components/table/snice-cell-tag.js +131 -0
  168. package/dist/components/table/snice-cell-tag.js.map +1 -0
  169. package/dist/components/table/snice-cell-text.d.ts +2 -2
  170. package/dist/components/table/snice-cell-text.js +14 -8
  171. package/dist/components/table/snice-cell-text.js.map +1 -1
  172. package/dist/components/table/snice-cell.d.ts +2 -2
  173. package/dist/components/table/snice-cell.js +12 -6
  174. package/dist/components/table/snice-cell.js.map +1 -1
  175. package/dist/components/table/snice-column.d.ts +1 -1
  176. package/dist/components/table/snice-column.js +6 -3
  177. package/dist/components/table/snice-column.js.map +1 -1
  178. package/dist/components/table/snice-header.d.ts +5 -5
  179. package/dist/components/table/snice-header.js +60 -50
  180. package/dist/components/table/snice-header.js.map +1 -1
  181. package/dist/components/table/snice-progress.d.ts +2 -2
  182. package/dist/components/table/snice-progress.js +18 -11
  183. package/dist/components/table/snice-progress.js.map +1 -1
  184. package/dist/components/table/snice-rating.d.ts +2 -2
  185. package/dist/components/table/snice-rating.js +15 -8
  186. package/dist/components/table/snice-rating.js.map +1 -1
  187. package/dist/components/table/snice-row.d.ts +17 -6
  188. package/dist/components/table/snice-row.js +95 -44
  189. package/dist/components/table/snice-row.js.map +1 -1
  190. package/dist/components/table/snice-table.d.ts +18 -10
  191. package/dist/components/table/snice-table.js +355 -173
  192. package/dist/components/table/snice-table.js.map +1 -1
  193. package/dist/components/table/snice-table.types.d.ts +101 -2
  194. package/dist/components/tabs/snice-tab-panel.d.ts +2 -2
  195. package/dist/components/tabs/snice-tab-panel.js +12 -6
  196. package/dist/components/tabs/snice-tab-panel.js.map +1 -1
  197. package/dist/components/tabs/snice-tab.d.ts +6 -5
  198. package/dist/components/tabs/snice-tab.js +36 -19
  199. package/dist/components/tabs/snice-tab.js.map +1 -1
  200. package/dist/components/tabs/snice-tabs.d.ts +5 -5
  201. package/dist/components/tabs/snice-tabs.js +38 -28
  202. package/dist/components/tabs/snice-tabs.js.map +1 -1
  203. package/dist/components/toast/snice-toast-container.d.ts +7 -7
  204. package/dist/components/toast/snice-toast-container.js +19 -12
  205. package/dist/components/toast/snice-toast-container.js.map +1 -1
  206. package/dist/components/toast/snice-toast.d.ts +3 -15
  207. package/dist/components/toast/snice-toast.js +49 -108
  208. package/dist/components/toast/snice-toast.js.map +1 -1
  209. package/dist/components/tooltip/snice-tooltip.d.ts +2 -2
  210. package/dist/components/tooltip/snice-tooltip.js +14 -7
  211. package/dist/components/tooltip/snice-tooltip.js.map +1 -1
  212. package/dist/context.d.ts +44 -0
  213. package/dist/element-ready.d.ts +40 -0
  214. package/dist/{types/element.d.ts → element.d.ts} +2 -8
  215. package/dist/{types/events.d.ts → events.d.ts} +0 -4
  216. package/dist/index.cjs +2589 -605
  217. package/dist/index.cjs.map +1 -1
  218. package/dist/index.d.ts +21 -0
  219. package/dist/index.esm.js +2568 -604
  220. package/dist/index.esm.js.map +1 -1
  221. package/dist/index.iife.js +2589 -605
  222. package/dist/index.iife.js.map +1 -1
  223. package/dist/method-decorators.d.ts +121 -0
  224. package/dist/on.d.ts +59 -0
  225. package/dist/parts.d.ts +159 -0
  226. package/dist/render-debug.d.ts +27 -0
  227. package/dist/render-tracker.d.ts +14 -0
  228. package/dist/render.d.ts +96 -0
  229. package/dist/symbols.cjs +163 -0
  230. package/dist/symbols.cjs.map +1 -1
  231. package/dist/{types/symbols.d.ts → symbols.d.ts} +22 -0
  232. package/dist/symbols.esm.js +27 -3
  233. package/dist/symbols.esm.js.map +1 -1
  234. package/dist/template.d.ts +100 -0
  235. package/dist/transitions.cjs +219 -0
  236. package/dist/transitions.esm.js +2 -2
  237. package/dist/types/context.d.ts +48 -0
  238. package/dist/types/element-options.d.ts +26 -0
  239. package/dist/types/index.d.ts +25 -9
  240. package/dist/types/nav-context.d.ts +19 -0
  241. package/dist/types/{types/on-options.d.ts → on-options.d.ts} +2 -0
  242. package/dist/types/{types/placard.d.ts → placard.d.ts} +0 -1
  243. package/docs/ai/README.md +17 -0
  244. package/docs/ai/api.md +175 -0
  245. package/docs/ai/architecture.md +160 -0
  246. package/docs/ai/components/accordion.md +174 -0
  247. package/docs/ai/components/alert.md +77 -0
  248. package/docs/ai/components/avatar.md +61 -0
  249. package/docs/ai/components/badge.md +69 -0
  250. package/docs/ai/components/breadcrumbs.md +74 -0
  251. package/docs/ai/components/button.md +75 -0
  252. package/docs/ai/components/card.md +61 -0
  253. package/docs/ai/components/checkbox.md +74 -0
  254. package/docs/ai/components/chip.md +73 -0
  255. package/docs/ai/components/date-picker.md +75 -0
  256. package/docs/ai/components/divider.md +66 -0
  257. package/docs/ai/components/drawer.md +80 -0
  258. package/docs/ai/components/input.md +111 -0
  259. package/docs/ai/components/login.md +109 -0
  260. package/docs/ai/components/modal.md +67 -0
  261. package/docs/ai/components/nav.md +76 -0
  262. package/docs/ai/components/pagination.md +55 -0
  263. package/docs/ai/components/progress.md +72 -0
  264. package/docs/ai/components/radio.md +79 -0
  265. package/docs/ai/components/select.md +92 -0
  266. package/docs/ai/components/skeleton.md +57 -0
  267. package/docs/ai/components/switch.md +53 -0
  268. package/docs/ai/components/table.md +227 -0
  269. package/docs/ai/components/tabs.md +83 -0
  270. package/docs/ai/components/toast.md +140 -0
  271. package/docs/ai/components/tooltip.md +146 -0
  272. package/docs/ai/patterns.md +244 -0
  273. package/docs/components/accordion.md +558 -0
  274. package/docs/components/drawer.md +602 -0
  275. package/docs/components/modal.md +558 -0
  276. package/docs/components/nav.md +239 -0
  277. package/docs/components/pagination.md +289 -0
  278. package/docs/components/select.md +599 -0
  279. package/docs/components/switch.md +354 -0
  280. package/docs/components/tabs.md +546 -0
  281. package/docs/components/toast.md +506 -0
  282. package/docs/components/tooltip.md +523 -0
  283. package/docs/controllers.md +744 -0
  284. package/docs/elements.md +855 -0
  285. package/docs/events.md +807 -0
  286. package/docs/migration-v2-to-v3.md +569 -0
  287. package/docs/observe.md +588 -0
  288. package/docs/placards.md +401 -0
  289. package/docs/request-response.md +852 -0
  290. package/docs/routing.md +1186 -0
  291. package/package.json +10 -11
  292. package/dist/components/snice-cell-C9N6yGxQ.js +0 -4
  293. package/dist/components/snice-cell-C9N6yGxQ.js.map +0 -1
  294. package/dist/types/types/index.d.ts +0 -23
  295. /package/dist/{types/controller.d.ts → controller.d.ts} +0 -0
  296. /package/dist/{types/global.d.ts → global.d.ts} +0 -0
  297. /package/dist/{types/observe.d.ts → observe.d.ts} +0 -0
  298. /package/dist/{types/request-response.d.ts → request-response.d.ts} +0 -0
  299. /package/dist/{types/router.d.ts → router.d.ts} +0 -0
  300. /package/dist/{types/testing.d.ts → testing.d.ts} +0 -0
  301. /package/dist/{types/transitions.d.ts → transitions.d.ts} +0 -0
  302. /package/dist/types/{types/adopted-options.d.ts → adopted-options.d.ts} +0 -0
  303. /package/dist/types/{types/app-context.d.ts → app-context.d.ts} +0 -0
  304. /package/dist/types/{types/dispatch-options.d.ts → dispatch-options.d.ts} +0 -0
  305. /package/dist/types/{types/guard.d.ts → guard.d.ts} +0 -0
  306. /package/dist/types/{types/i-controller.d.ts → i-controller.d.ts} +0 -0
  307. /package/dist/types/{types/moved-options.d.ts → moved-options.d.ts} +0 -0
  308. /package/dist/types/{types/observe-options.d.ts → observe-options.d.ts} +0 -0
  309. /package/dist/types/{types/page-options.d.ts → page-options.d.ts} +0 -0
  310. /package/dist/types/{types/part-options.d.ts → part-options.d.ts} +0 -0
  311. /package/dist/types/{types/property-converter.d.ts → property-converter.d.ts} +0 -0
  312. /package/dist/types/{types/property-options.d.ts → property-options.d.ts} +0 -0
  313. /package/dist/types/{types/query-options.d.ts → query-options.d.ts} +0 -0
  314. /package/dist/types/{types/request-options.d.ts → request-options.d.ts} +0 -0
  315. /package/dist/types/{types/respond-options.d.ts → respond-options.d.ts} +0 -0
  316. /package/dist/types/{types/route-params.d.ts → route-params.d.ts} +0 -0
  317. /package/dist/types/{types/router-instance.d.ts → router-instance.d.ts} +0 -0
  318. /package/dist/types/{types/router-options.d.ts → router-options.d.ts} +0 -0
  319. /package/dist/types/{types/simple-array.d.ts → simple-array.d.ts} +0 -0
  320. /package/dist/types/{types/snice-element.d.ts → snice-element.d.ts} +0 -0
  321. /package/dist/types/{types/snice-global.d.ts → snice-global.d.ts} +0 -0
  322. /package/dist/types/{types/transition.d.ts → transition.d.ts} +0 -0
  323. /package/dist/{types/utils.d.ts → utils.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  import { __runInitializers, __esDecorate } from 'tslib';
2
- import { element, property, query, queryAll, ready, dispose, on, watch, dispatch } from 'snice';
2
+ import { element, property, query, queryAll, render, styles, ready, dispose, watch, dispatch, html, css } from 'snice';
3
3
  import './snice-option.js';
4
4
 
5
- var css = ":host {\n display: inline-block;\n font-family: var(--snice-font-family);\n position: relative;\n width: 100%;\n max-width: 18.75rem; /* 300px */\n}\n\n[hidden] {\n display: none !important;\n}\n\n/* Hide empty image tags */\nimg[src=\"\"] {\n display: none;\n}\n\n.select-wrapper {\n position: relative;\n width: 100%;\n}\n\n/* Label */\n.select-label {\n display: block;\n margin-bottom: 0.25rem; /* 4px */\n color: var(--snice-color-text);\n font-weight: 500;\n}\n\n.select-label--small {\n font-size: var(--snice-font-size-sm);\n}\n\n.select-label--medium {\n font-size: var(--snice-font-size-md);\n}\n\n.select-label--large {\n font-size: var(--snice-font-size-lg);\n}\n\n.select-label--required::after {\n content: ' *';\n color: var(--snice-color-danger);\n}\n\n/* Select trigger button */\n.select-trigger {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n cursor: pointer;\n transition: all var(--snice-transition-fast) ease;\n position: relative;\n text-align: left;\n font-family: inherit;\n color: var(--snice-color-text);\n}\n\n.select-trigger--small {\n padding: 0.375rem 2rem 0.375rem 0.625rem; /* 6px 32px 6px 10px */\n font-size: var(--snice-font-size-sm);\n min-height: 2rem; /* 32px */\n}\n\n.select-trigger--medium {\n padding: 0.5rem 2.25rem 0.5rem 0.75rem; /* 8px 36px 8px 12px */\n font-size: var(--snice-font-size-md);\n min-height: 2.5rem; /* 40px */\n}\n\n.select-trigger--large {\n padding: 0.625rem 2.5rem 0.625rem 0.875rem; /* 10px 40px 10px 14px */\n font-size: var(--snice-font-size-lg);\n min-height: 3rem; /* 48px */\n}\n\n.select-trigger:hover:not(.select-trigger--disabled) {\n border-color: var(--snice-color-border-hover);\n}\n\n.select-trigger:focus-visible {\n outline: 2px solid var(--snice-color-primary);\n outline-offset: 2px;\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--open {\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--disabled {\n background: var(--snice-color-background-secondary);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.select-trigger--readonly {\n background: var(--snice-color-background-secondary);\n cursor: default;\n}\n\n.select-trigger--invalid {\n border-color: var(--snice-color-danger);\n}\n\n/* Placeholder */\n.select-placeholder {\n color: var(--snice-color-text-secondary);\n}\n\n/* Selected value display */\n.select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.select-value--single {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* 8px */\n}\n\n.select-value-icon {\n width: 1rem; /* 16px */\n height: 1rem; /* 16px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-value--multiple {\n display: flex;\n gap: 0.25rem; /* 4px */\n flex-wrap: wrap;\n}\n\n.select-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n padding: 0.125rem 0.375rem; /* 2px 6px */\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-xs);\n}\n\n.select-tag-icon {\n width: 0.75rem; /* 12px */\n height: 0.75rem; /* 12px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-tag-remove {\n cursor: pointer;\n padding: 0;\n background: none;\n border: none;\n color: inherit;\n font-size: 0.75rem; /* 12px */\n line-height: 1;\n}\n\n.select-tag-remove:hover {\n opacity: 0.7;\n}\n\n/* Icons */\n.select-icons {\n position: absolute;\n right: 0.5rem; /* 8px */\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n pointer-events: none;\n z-index: 1;\n}\n\n.select-clear {\n padding: 2px;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--snice-color-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--snice-border-radius-sm);\n pointer-events: auto;\n}\n\n.select-clear:hover {\n background: var(--snice-color-background-secondary);\n color: var(--snice-color-text);\n}\n\n.select-arrow {\n transition: transform var(--snice-transition-fast) ease;\n color: var(--snice-color-text-secondary);\n pointer-events: none;\n}\n\n.select-arrow--open {\n transform: rotate(180deg);\n}\n\n/* Dropdown */\n.select-dropdown {\n position: absolute;\n top: 100%;\n margin-top: 4px;\n left: 0;\n right: 0;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n box-shadow: var(--snice-shadow-lg);\n z-index: 1000;\n opacity: 0;\n transform: translateY(-8px) scaleY(0.95);\n transform-origin: top;\n pointer-events: none;\n transition: opacity var(--snice-transition-fast) ease,\n transform var(--snice-transition-fast) ease;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.select-dropdown--open {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n pointer-events: auto;\n}\n\n/* Search input */\n.select-search {\n padding: 8px;\n border-bottom: 1px solid var(--snice-color-border);\n flex-shrink: 0;\n}\n\n.select-search-input {\n width: 100%;\n padding: 6px 10px;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-sm);\n font-family: inherit;\n color: var(--snice-color-text);\n box-sizing: border-box;\n}\n\n.select-search-input:focus {\n outline: none;\n border-color: var(--snice-color-primary);\n}\n\n/* Options list */\n.select-options {\n max-height: 200px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px;\n scrollbar-gutter: stable;\n}\n\n/* Custom scrollbar styling for better appearance */\n.select-options::-webkit-scrollbar {\n width: 8px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 4px;\n margin: 4px 0;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 4px;\n border: 2px solid var(--snice-color-background);\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}\n\n/* Firefox scrollbar styling */\n.select-options {\n scrollbar-width: thin;\n scrollbar-color: var(--snice-color-border) var(--snice-color-background-secondary);\n}\n\n.select-option {\n padding: 8px 12px;\n cursor: pointer;\n border-radius: var(--snice-border-radius-sm);\n transition: background var(--snice-transition-fast) ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.select-option:hover:not(.select-option--disabled) {\n background: var(--snice-color-background-secondary);\n}\n\n.select-option--selected {\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n font-weight: 500;\n}\n\n.select-option--focused {\n background: var(--snice-color-background-secondary);\n outline: 2px solid var(--snice-color-primary);\n outline-offset: -2px;\n}\n\n.select-option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Option icon */\n.select-option-icon {\n width: 16px;\n height: 16px;\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-option-check {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.select-option-label {\n flex: 1;\n}\n\n/* No options message */\n.select-no-options {\n padding: 16px;\n text-align: center;\n color: var(--snice-color-text-secondary);\n font-size: var(--snice-font-size-sm);\n}\n\n/* Native select (hidden) */\n.select-native {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n width: 0;\n height: 0;\n}\n\n/* Scrollbar styling */\n.select-options::-webkit-scrollbar {\n width: 6px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}";
5
+ var cssContent = ":host {\n display: inline-block;\n font-family: var(--snice-font-family);\n position: relative;\n width: 100%;\n max-width: 18.75rem; /* 300px */\n}\n\n[hidden] {\n display: none !important;\n}\n\n/* Hide empty image tags */\nimg[src=\"\"] {\n display: none;\n}\n\n.select-wrapper {\n position: relative;\n width: 100%;\n}\n\n/* Label */\n.select-label {\n display: block;\n margin-bottom: 0.25rem; /* 4px */\n color: var(--snice-color-text);\n font-weight: 500;\n}\n\n.select-label--small {\n font-size: var(--snice-font-size-sm);\n}\n\n.select-label--medium {\n font-size: var(--snice-font-size-md);\n}\n\n.select-label--large {\n font-size: var(--snice-font-size-lg);\n}\n\n.select-label--required::after {\n content: ' *';\n color: var(--snice-color-danger);\n}\n\n/* Select trigger button */\n.select-trigger {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n cursor: pointer;\n transition: all var(--snice-transition-fast) ease;\n position: relative;\n text-align: left;\n font-family: inherit;\n color: var(--snice-color-text);\n}\n\n.select-trigger--small {\n padding: 0.375rem 2rem 0.375rem 0.625rem; /* 6px 32px 6px 10px */\n font-size: var(--snice-font-size-sm);\n min-height: 2rem; /* 32px */\n}\n\n.select-trigger--medium {\n padding: 0.5rem 2.25rem 0.5rem 0.75rem; /* 8px 36px 8px 12px */\n font-size: var(--snice-font-size-md);\n min-height: var(--snice-select-min-height, 2.5rem); /* 40px */\n}\n\n.select-trigger--large {\n padding: 0.625rem 2.5rem 0.625rem 0.875rem; /* 10px 40px 10px 14px */\n font-size: var(--snice-font-size-lg);\n min-height: 3rem; /* 48px */\n}\n\n.select-trigger:hover:not(.select-trigger--disabled) {\n border-color: var(--snice-color-border-hover);\n}\n\n.select-trigger:focus-visible {\n outline: 2px solid var(--snice-color-primary);\n outline-offset: 2px;\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--open {\n border-color: var(--snice-color-primary);\n}\n\n.select-trigger--disabled {\n background: var(--snice-color-background-secondary);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.select-trigger--readonly {\n background: var(--snice-color-background-secondary);\n cursor: default;\n}\n\n.select-trigger--invalid {\n border-color: var(--snice-color-danger);\n}\n\n/* Placeholder */\n.select-placeholder {\n color: var(--snice-color-text-secondary);\n}\n\n/* Selected value display */\n.select-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.select-value--single {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* 8px */\n}\n\n.select-value-icon {\n width: 1rem; /* 16px */\n height: 1rem; /* 16px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-value--multiple {\n display: flex;\n gap: 0.25rem; /* 4px */\n flex-wrap: wrap;\n}\n\n.select-tag {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n padding: 0.125rem 0.375rem; /* 2px 6px */\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-xs);\n}\n\n.select-tag-icon {\n width: 0.75rem; /* 12px */\n height: 0.75rem; /* 12px */\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-tag-remove {\n cursor: pointer;\n padding: 0;\n background: none;\n border: none;\n color: inherit;\n font-size: 0.75rem; /* 12px */\n line-height: 1;\n}\n\n.select-tag-remove:hover {\n opacity: 0.7;\n}\n\n/* Icons */\n.select-icons {\n position: absolute;\n right: 0.5rem; /* 8px */\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n gap: 0.25rem; /* 4px */\n pointer-events: none;\n z-index: 1;\n}\n\n.select-clear {\n padding: 2px;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--snice-color-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--snice-border-radius-sm);\n pointer-events: auto;\n}\n\n.select-clear:hover {\n background: var(--snice-color-background-secondary);\n color: var(--snice-color-text);\n}\n\n.select-arrow {\n transition: transform var(--snice-transition-fast) ease;\n color: var(--snice-color-text-secondary);\n pointer-events: none;\n}\n\n.select-arrow--open {\n transform: rotate(180deg);\n}\n\n/* Dropdown */\n.select-dropdown {\n position: absolute;\n top: 100%;\n margin-top: 4px;\n left: 0;\n right: 0;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-md);\n box-shadow: var(--snice-shadow-lg);\n z-index: 1000;\n opacity: 0;\n transform: translateY(-8px) scaleY(0.95);\n transform-origin: top;\n pointer-events: none;\n transition: opacity var(--snice-transition-fast) ease,\n transform var(--snice-transition-fast) ease;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.select-dropdown--open {\n opacity: 1;\n transform: translateY(0) scaleY(1);\n pointer-events: auto;\n}\n\n/* Search input */\n.select-search {\n padding: 8px;\n border-bottom: 1px solid var(--snice-color-border);\n flex-shrink: 0;\n}\n\n.select-search-input {\n width: 100%;\n padding: 6px 10px;\n background: var(--snice-color-background);\n border: 1px solid var(--snice-color-border);\n border-radius: var(--snice-border-radius-sm);\n font-size: var(--snice-font-size-sm);\n font-family: inherit;\n color: var(--snice-color-text);\n box-sizing: border-box;\n}\n\n.select-search-input:focus {\n outline: none;\n border-color: var(--snice-color-primary);\n}\n\n/* Options list */\n.select-options {\n max-height: 200px;\n overflow-y: auto;\n overflow-x: hidden;\n padding: 4px;\n scrollbar-gutter: stable;\n}\n\n/* Custom scrollbar styling for better appearance */\n.select-options::-webkit-scrollbar {\n width: 8px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 4px;\n margin: 4px 0;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 4px;\n border: 2px solid var(--snice-color-background);\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}\n\n/* Firefox scrollbar styling */\n.select-options {\n scrollbar-width: thin;\n scrollbar-color: var(--snice-color-border) var(--snice-color-background-secondary);\n}\n\n.select-option {\n padding: 8px 12px;\n cursor: pointer;\n border-radius: var(--snice-border-radius-sm);\n transition: background var(--snice-transition-fast) ease;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.select-option:hover:not(.select-option--disabled) {\n background: var(--snice-color-background-secondary);\n}\n\n.select-option--selected {\n background: var(--snice-color-primary-light);\n color: var(--snice-color-primary);\n font-weight: 500;\n}\n\n.select-option--focused {\n background: var(--snice-color-background-secondary);\n outline: 2px solid var(--snice-color-primary);\n outline-offset: -2px;\n}\n\n.select-option--disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* Option icon */\n.select-option-icon {\n width: 16px;\n height: 16px;\n object-fit: contain;\n flex-shrink: 0;\n}\n\n.select-option-check {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.select-option-label {\n flex: 1;\n}\n\n/* No options message */\n.select-no-options {\n padding: 16px;\n text-align: center;\n color: var(--snice-color-text-secondary);\n font-size: var(--snice-font-size-sm);\n}\n\n/* Native select (hidden) */\n.select-native {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n width: 0;\n height: 0;\n}\n\n/* Scrollbar styling */\n.select-options::-webkit-scrollbar {\n width: 6px;\n}\n\n.select-options::-webkit-scrollbar-track {\n background: var(--snice-color-background-secondary);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb {\n background: var(--snice-color-border);\n border-radius: 3px;\n}\n\n.select-options::-webkit-scrollbar-thumb:hover {\n background: var(--snice-color-border-hover);\n}";
6
6
 
7
7
  let SniceSelect = (() => {
8
8
  let _classDecorators = [element('snice-select')];
@@ -86,30 +86,14 @@ let SniceSelect = (() => {
86
86
  let _optionElements_decorators;
87
87
  let _optionElements_initializers = [];
88
88
  let _optionElements_extraInitializers = [];
89
+ let _renderContent_decorators;
90
+ let _componentStyles_decorators;
89
91
  let _init_decorators;
90
92
  let _cleanup_decorators;
91
- let _handleTriggerOpen_decorators;
92
- let _handleSearchEscape_decorators;
93
- let _handleSearchArrowDown_decorators;
94
- let _handleSearchArrowUp_decorators;
95
- let _handleSearchEnter_decorators;
96
- let _handleTriggerClick_decorators;
97
- let _handleClearClick_decorators;
98
- let _handleTagRemove_decorators;
99
- let _handleOptionsClick_decorators;
100
- let _handleSearchInput_decorators;
101
93
  let _handleValueChange_decorators;
102
94
  let _handleDisabledChange_decorators;
103
- let _handleReadonlyChange_decorators;
104
- let _handleInvalidChange_decorators;
105
95
  let _handleOpenChange_decorators;
106
- let _handleLabelChange_decorators;
107
- let _handlePlaceholderChange_decorators;
108
- let _handleRequiredChange_decorators;
109
- let _handleMultipleChange_decorators;
110
- let _handleNameChange_decorators;
111
- let _handleClearableChange_decorators;
112
- let _handleSearchableChange_decorators;
96
+ let _handleNativeSelectAttributeChange_decorators;
113
97
  let _dispatchChangeEvent_decorators;
114
98
  let _dispatchOpenEvent_decorators;
115
99
  let _dispatchCloseEvent_decorators;
@@ -175,57 +159,25 @@ let SniceSelect = (() => {
175
159
  _arrow_decorators = [query('.select-arrow')];
176
160
  _searchContainer_decorators = [query('.select-search')];
177
161
  _optionElements_decorators = [queryAll('.select-option')];
162
+ _renderContent_decorators = [render()];
163
+ _componentStyles_decorators = [styles()];
178
164
  _init_decorators = [ready()];
179
165
  _cleanup_decorators = [dispose()];
180
- _handleTriggerOpen_decorators = [on(['keydown:Enter', 'keydown:Space', 'keydown:ArrowDown', 'keydown:ArrowUp'], '.select-trigger')];
181
- _handleSearchEscape_decorators = [on('keydown:Escape', '.select-search-input')];
182
- _handleSearchArrowDown_decorators = [on('keydown:ArrowDown', '.select-search-input')];
183
- _handleSearchArrowUp_decorators = [on('keydown:ArrowUp', '.select-search-input')];
184
- _handleSearchEnter_decorators = [on('keydown:Enter', '.select-search-input')];
185
- _handleTriggerClick_decorators = [on('click', '.select-trigger')];
186
- _handleClearClick_decorators = [on('click', '.select-clear', { preventDefault: true, stopPropagation: true })];
187
- _handleTagRemove_decorators = [on('click', '.select-tag-remove')];
188
- _handleOptionsClick_decorators = [on('click', '.select-options')];
189
- _handleSearchInput_decorators = [on('input', '.select-search-input')];
190
166
  _handleValueChange_decorators = [watch('value')];
191
167
  _handleDisabledChange_decorators = [watch('disabled')];
192
- _handleReadonlyChange_decorators = [watch('readonly')];
193
- _handleInvalidChange_decorators = [watch('invalid')];
194
168
  _handleOpenChange_decorators = [watch('open')];
195
- _handleLabelChange_decorators = [watch('label')];
196
- _handlePlaceholderChange_decorators = [watch('placeholder')];
197
- _handleRequiredChange_decorators = [watch('required')];
198
- _handleMultipleChange_decorators = [watch('multiple')];
199
- _handleNameChange_decorators = [watch('name')];
200
- _handleClearableChange_decorators = [watch('clearable')];
201
- _handleSearchableChange_decorators = [watch('searchable')];
169
+ _handleNativeSelectAttributeChange_decorators = [watch('multiple', 'name')];
202
170
  _dispatchChangeEvent_decorators = [dispatch('@snice/select-change', { bubbles: true, composed: true })];
203
171
  _dispatchOpenEvent_decorators = [dispatch('@snice/select-open', { bubbles: true, composed: true })];
204
172
  _dispatchCloseEvent_decorators = [dispatch('@snice/select-close', { bubbles: true, composed: true })];
173
+ __esDecorate(this, null, _renderContent_decorators, { kind: "method", name: "renderContent", static: false, private: false, access: { has: obj => "renderContent" in obj, get: obj => obj.renderContent }, metadata: _metadata }, null, _instanceExtraInitializers);
174
+ __esDecorate(this, null, _componentStyles_decorators, { kind: "method", name: "componentStyles", static: false, private: false, access: { has: obj => "componentStyles" in obj, get: obj => obj.componentStyles }, metadata: _metadata }, null, _instanceExtraInitializers);
205
175
  __esDecorate(this, null, _init_decorators, { kind: "method", name: "init", static: false, private: false, access: { has: obj => "init" in obj, get: obj => obj.init }, metadata: _metadata }, null, _instanceExtraInitializers);
206
176
  __esDecorate(this, null, _cleanup_decorators, { kind: "method", name: "cleanup", static: false, private: false, access: { has: obj => "cleanup" in obj, get: obj => obj.cleanup }, metadata: _metadata }, null, _instanceExtraInitializers);
207
- __esDecorate(this, null, _handleTriggerOpen_decorators, { kind: "method", name: "handleTriggerOpen", static: false, private: false, access: { has: obj => "handleTriggerOpen" in obj, get: obj => obj.handleTriggerOpen }, metadata: _metadata }, null, _instanceExtraInitializers);
208
- __esDecorate(this, null, _handleSearchEscape_decorators, { kind: "method", name: "handleSearchEscape", static: false, private: false, access: { has: obj => "handleSearchEscape" in obj, get: obj => obj.handleSearchEscape }, metadata: _metadata }, null, _instanceExtraInitializers);
209
- __esDecorate(this, null, _handleSearchArrowDown_decorators, { kind: "method", name: "handleSearchArrowDown", static: false, private: false, access: { has: obj => "handleSearchArrowDown" in obj, get: obj => obj.handleSearchArrowDown }, metadata: _metadata }, null, _instanceExtraInitializers);
210
- __esDecorate(this, null, _handleSearchArrowUp_decorators, { kind: "method", name: "handleSearchArrowUp", static: false, private: false, access: { has: obj => "handleSearchArrowUp" in obj, get: obj => obj.handleSearchArrowUp }, metadata: _metadata }, null, _instanceExtraInitializers);
211
- __esDecorate(this, null, _handleSearchEnter_decorators, { kind: "method", name: "handleSearchEnter", static: false, private: false, access: { has: obj => "handleSearchEnter" in obj, get: obj => obj.handleSearchEnter }, metadata: _metadata }, null, _instanceExtraInitializers);
212
- __esDecorate(this, null, _handleTriggerClick_decorators, { kind: "method", name: "handleTriggerClick", static: false, private: false, access: { has: obj => "handleTriggerClick" in obj, get: obj => obj.handleTriggerClick }, metadata: _metadata }, null, _instanceExtraInitializers);
213
- __esDecorate(this, null, _handleClearClick_decorators, { kind: "method", name: "handleClearClick", static: false, private: false, access: { has: obj => "handleClearClick" in obj, get: obj => obj.handleClearClick }, metadata: _metadata }, null, _instanceExtraInitializers);
214
- __esDecorate(this, null, _handleTagRemove_decorators, { kind: "method", name: "handleTagRemove", static: false, private: false, access: { has: obj => "handleTagRemove" in obj, get: obj => obj.handleTagRemove }, metadata: _metadata }, null, _instanceExtraInitializers);
215
- __esDecorate(this, null, _handleOptionsClick_decorators, { kind: "method", name: "handleOptionsClick", static: false, private: false, access: { has: obj => "handleOptionsClick" in obj, get: obj => obj.handleOptionsClick }, metadata: _metadata }, null, _instanceExtraInitializers);
216
- __esDecorate(this, null, _handleSearchInput_decorators, { kind: "method", name: "handleSearchInput", static: false, private: false, access: { has: obj => "handleSearchInput" in obj, get: obj => obj.handleSearchInput }, metadata: _metadata }, null, _instanceExtraInitializers);
217
177
  __esDecorate(this, null, _handleValueChange_decorators, { kind: "method", name: "handleValueChange", static: false, private: false, access: { has: obj => "handleValueChange" in obj, get: obj => obj.handleValueChange }, metadata: _metadata }, null, _instanceExtraInitializers);
218
178
  __esDecorate(this, null, _handleDisabledChange_decorators, { kind: "method", name: "handleDisabledChange", static: false, private: false, access: { has: obj => "handleDisabledChange" in obj, get: obj => obj.handleDisabledChange }, metadata: _metadata }, null, _instanceExtraInitializers);
219
- __esDecorate(this, null, _handleReadonlyChange_decorators, { kind: "method", name: "handleReadonlyChange", static: false, private: false, access: { has: obj => "handleReadonlyChange" in obj, get: obj => obj.handleReadonlyChange }, metadata: _metadata }, null, _instanceExtraInitializers);
220
- __esDecorate(this, null, _handleInvalidChange_decorators, { kind: "method", name: "handleInvalidChange", static: false, private: false, access: { has: obj => "handleInvalidChange" in obj, get: obj => obj.handleInvalidChange }, metadata: _metadata }, null, _instanceExtraInitializers);
221
179
  __esDecorate(this, null, _handleOpenChange_decorators, { kind: "method", name: "handleOpenChange", static: false, private: false, access: { has: obj => "handleOpenChange" in obj, get: obj => obj.handleOpenChange }, metadata: _metadata }, null, _instanceExtraInitializers);
222
- __esDecorate(this, null, _handleLabelChange_decorators, { kind: "method", name: "handleLabelChange", static: false, private: false, access: { has: obj => "handleLabelChange" in obj, get: obj => obj.handleLabelChange }, metadata: _metadata }, null, _instanceExtraInitializers);
223
- __esDecorate(this, null, _handlePlaceholderChange_decorators, { kind: "method", name: "handlePlaceholderChange", static: false, private: false, access: { has: obj => "handlePlaceholderChange" in obj, get: obj => obj.handlePlaceholderChange }, metadata: _metadata }, null, _instanceExtraInitializers);
224
- __esDecorate(this, null, _handleRequiredChange_decorators, { kind: "method", name: "handleRequiredChange", static: false, private: false, access: { has: obj => "handleRequiredChange" in obj, get: obj => obj.handleRequiredChange }, metadata: _metadata }, null, _instanceExtraInitializers);
225
- __esDecorate(this, null, _handleMultipleChange_decorators, { kind: "method", name: "handleMultipleChange", static: false, private: false, access: { has: obj => "handleMultipleChange" in obj, get: obj => obj.handleMultipleChange }, metadata: _metadata }, null, _instanceExtraInitializers);
226
- __esDecorate(this, null, _handleNameChange_decorators, { kind: "method", name: "handleNameChange", static: false, private: false, access: { has: obj => "handleNameChange" in obj, get: obj => obj.handleNameChange }, metadata: _metadata }, null, _instanceExtraInitializers);
227
- __esDecorate(this, null, _handleClearableChange_decorators, { kind: "method", name: "handleClearableChange", static: false, private: false, access: { has: obj => "handleClearableChange" in obj, get: obj => obj.handleClearableChange }, metadata: _metadata }, null, _instanceExtraInitializers);
228
- __esDecorate(this, null, _handleSearchableChange_decorators, { kind: "method", name: "handleSearchableChange", static: false, private: false, access: { has: obj => "handleSearchableChange" in obj, get: obj => obj.handleSearchableChange }, metadata: _metadata }, null, _instanceExtraInitializers);
180
+ __esDecorate(this, null, _handleNativeSelectAttributeChange_decorators, { kind: "method", name: "handleNativeSelectAttributeChange", static: false, private: false, access: { has: obj => "handleNativeSelectAttributeChange" in obj, get: obj => obj.handleNativeSelectAttributeChange }, metadata: _metadata }, null, _instanceExtraInitializers);
229
181
  __esDecorate(this, null, _dispatchChangeEvent_decorators, { kind: "method", name: "dispatchChangeEvent", static: false, private: false, access: { has: obj => "dispatchChangeEvent" in obj, get: obj => obj.dispatchChangeEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
230
182
  __esDecorate(this, null, _dispatchOpenEvent_decorators, { kind: "method", name: "dispatchOpenEvent", static: false, private: false, access: { has: obj => "dispatchOpenEvent" in obj, get: obj => obj.dispatchOpenEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
231
183
  __esDecorate(this, null, _dispatchCloseEvent_decorators, { kind: "method", name: "dispatchCloseEvent", static: false, private: false, access: { has: obj => "dispatchCloseEvent" in obj, get: obj => obj.dispatchCloseEvent }, metadata: _metadata }, null, _instanceExtraInitializers);
@@ -259,28 +211,32 @@ let SniceSelect = (() => {
259
211
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
260
212
  __runInitializers(_classThis, _classExtraInitializers);
261
213
  }
262
- html() {
263
- // Initial render - options will be populated in @ready()
264
- return /*html*/ `
214
+ renderContent() {
215
+ const labelClasses = `select-label select-label--${this.size} ${this.required ? 'select-label--required' : ''}`;
216
+ const triggerClasses = `select-trigger select-trigger--${this.size}`;
217
+ const searchHidden = !this.searchable;
218
+ return html `
265
219
  <div class="select-wrapper">
266
- <label class="select-label select-label--${this.size} ${this.required ? 'select-label--required' : ''}" part="label" ${!this.label ? 'hidden' : ''}>
220
+ <label class="${labelClasses}" part="label" ?hidden="${!this.label}">
267
221
  ${this.label}
268
222
  </label>
269
-
223
+
270
224
  <button
271
225
  type="button"
272
- class="select-trigger select-trigger--${this.size}"
226
+ class="${triggerClasses}"
273
227
  aria-haspopup="listbox"
274
228
  aria-expanded="false"
275
229
  aria-label="${this.label || 'Select'}"
276
- part="trigger">
277
-
230
+ part="trigger"
231
+ @keydown="${(e) => this.handleTriggerOpen(e)}"
232
+ @click="${(e) => this.handleTriggerClick(e)}">
233
+
278
234
  <div class="select-value" part="value">
279
235
  <span class="select-placeholder">${this.placeholder}</span>
280
236
  </div>
281
-
237
+
282
238
  <span class="select-icons">
283
- <span class="select-clear" aria-label="Clear selection" style="display: none;">
239
+ <span class="select-clear" aria-label="Clear selection" style="display: none;" @click="${(e) => this.handleClearClick(e)}">
284
240
  <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor">
285
241
  <path d="M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z"/>
286
242
  </svg>
@@ -292,26 +248,29 @@ let SniceSelect = (() => {
292
248
  </span>
293
249
  </span>
294
250
  </button>
295
-
296
- <div class="select-dropdown"
297
- role="listbox"
251
+
252
+ <div class="select-dropdown"
253
+ role="listbox"
298
254
  aria-label="${this.label || 'Options'}"
299
- part="dropdown">
300
-
301
- <div class="select-search" part="search" ${!this.searchable ? 'hidden' : ''}>
255
+ part="dropdown"
256
+ @click="${(e) => this.handleOptionsClick(e)}">
257
+
258
+ <div class="select-search" part="search" ?hidden="${searchHidden}">
302
259
  <input
303
260
  type="text"
304
261
  class="select-search-input"
305
262
  placeholder="Search..."
306
263
  aria-label="Search options"
307
- part="search-input" />
264
+ part="search-input"
265
+ @keydown="${(e) => this.handleSearchKeydown(e)}"
266
+ @input="${(e) => this.handleSearchInput(e)}" />
308
267
  </div>
309
-
268
+
310
269
  <div class="select-options" part="options">
311
270
  <!-- Options will be rendered in @ready() -->
312
271
  </div>
313
272
  </div>
314
-
273
+
315
274
  <!-- Hidden native select for form submission -->
316
275
  <select
317
276
  class="select-native"
@@ -357,8 +316,8 @@ let SniceSelect = (() => {
357
316
  `;
358
317
  }).join('');
359
318
  }
360
- css() {
361
- return css;
319
+ componentStyles() {
320
+ return css `${cssContent}`;
362
321
  }
363
322
  init() {
364
323
  // Read options from child snice-option elements
@@ -487,31 +446,37 @@ let SniceSelect = (() => {
487
446
  });
488
447
  }
489
448
  handleTriggerOpen(e) {
490
- e.preventDefault();
491
- if (!this.open) {
492
- this.openDropdown();
449
+ if (['Enter', ' ', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
450
+ e.preventDefault();
451
+ if (!this.open) {
452
+ this.openDropdown();
453
+ }
493
454
  }
494
455
  }
495
- handleSearchEscape() {
496
- this.closeDropdown();
497
- this.trigger?.focus();
498
- }
499
- handleSearchArrowDown(e) {
500
- e.preventDefault();
501
- this.focusNextOption();
502
- }
503
- handleSearchArrowUp(e) {
504
- e.preventDefault();
505
- this.focusPreviousOption();
506
- }
507
- handleSearchEnter(e) {
508
- e.preventDefault();
509
- if (this.focusedIndex >= 0) {
510
- const options = this.searchable ? this.filteredOptions : this.options;
511
- const option = options[this.focusedIndex];
512
- if (option && !option.disabled) {
513
- this.handleOptionSelect(option);
514
- }
456
+ handleSearchKeydown(e) {
457
+ switch (e.key) {
458
+ case 'Escape':
459
+ this.closeDropdown();
460
+ this.trigger?.focus();
461
+ break;
462
+ case 'ArrowDown':
463
+ e.preventDefault();
464
+ this.focusNextOption();
465
+ break;
466
+ case 'ArrowUp':
467
+ e.preventDefault();
468
+ this.focusPreviousOption();
469
+ break;
470
+ case 'Enter':
471
+ e.preventDefault();
472
+ if (this.focusedIndex >= 0) {
473
+ const options = this.searchable ? this.filteredOptions : this.options;
474
+ const option = options[this.focusedIndex];
475
+ if (option && !option.disabled) {
476
+ this.handleOptionSelect(option);
477
+ }
478
+ }
479
+ break;
515
480
  }
516
481
  }
517
482
  focusNextOption() {
@@ -555,39 +520,43 @@ let SniceSelect = (() => {
555
520
  });
556
521
  }
557
522
  }
558
- handleTriggerClick(e) {
523
+ handleClearClick(e) {
524
+ e.preventDefault();
559
525
  e.stopPropagation();
560
- // Don't toggle if clicking on the clear button or tag remove buttons
526
+ this.clear();
527
+ }
528
+ handleTriggerClick(e) {
561
529
  const target = e.target;
562
- if (target.closest('.select-clear') || target.closest('.select-tag-remove')) {
530
+ // Don't toggle if clicking on the clear button
531
+ if (target.closest('.select-clear')) {
563
532
  return;
564
533
  }
534
+ e.stopPropagation();
565
535
  if (!this.disabled && !this.readonly) {
566
536
  this.toggleDropdown();
567
537
  }
568
538
  }
569
- handleClearClick(_e) {
570
- this.clear();
571
- }
572
- handleTagRemove(e) {
573
- e.stopPropagation();
574
- const target = e.target;
575
- const value = target.getAttribute('data-value');
576
- if (value && this.multiple) {
577
- this.selectedValues.delete(value);
578
- this.value = Array.from(this.selectedValues).join(',');
579
- this.updateNativeSelect();
580
- this.updateValueDisplay();
581
- this.updateClearButton();
582
- this.dispatchChangeEvent();
583
- }
584
- }
585
539
  handleOptionsClick(e) {
586
- e.stopPropagation();
587
540
  const target = e.target;
541
+ // Handle tag remove click
542
+ if (target.closest('.select-tag-remove')) {
543
+ e.stopPropagation();
544
+ const removeBtn = target.closest('.select-tag-remove');
545
+ const value = removeBtn.getAttribute('data-value');
546
+ if (value && this.multiple) {
547
+ this.selectedValues.delete(value);
548
+ this.value = Array.from(this.selectedValues).join(',');
549
+ this.updateNativeSelect();
550
+ this.updateValueDisplay();
551
+ this.updateClearButton();
552
+ this.dispatchChangeEvent();
553
+ }
554
+ return;
555
+ }
588
556
  const optionEl = target.closest('.select-option');
589
557
  if (!optionEl)
590
558
  return;
559
+ e.stopPropagation();
591
560
  const value = optionEl.getAttribute('data-value');
592
561
  if (!value)
593
562
  return;
@@ -597,8 +566,8 @@ let SniceSelect = (() => {
597
566
  }
598
567
  }
599
568
  handleSearchInput(e) {
600
- const target = e.target;
601
- const searchTerm = target.value.toLowerCase();
569
+ const input = e.target;
570
+ const searchTerm = input.value.toLowerCase();
602
571
  if (searchTerm) {
603
572
  this.filteredOptions = this.options.filter(opt => opt.label.toLowerCase().includes(searchTerm));
604
573
  }
@@ -640,24 +609,19 @@ let SniceSelect = (() => {
640
609
  this.updateTriggerState();
641
610
  this.updateNativeSelectAttributes();
642
611
  this.updateClearButton();
612
+ // Side effect: close dropdown when disabled
643
613
  if (this.disabled && this.open) {
644
614
  this.closeDropdown();
645
615
  }
646
616
  }
647
- handleReadonlyChange() {
648
- this.updateTriggerState();
649
- this.updateClearButton();
650
- }
651
- handleInvalidChange() {
652
- this.updateTriggerState();
653
- }
654
- // Remove the @watch('options') since options are now read from children
655
617
  handleOpenChange() {
656
618
  this.updateDropdownState();
657
619
  this.updateTriggerState();
620
+ // Side effect: focus search input when opened
658
621
  if (this.open && this.searchable && this.searchInput) {
659
622
  setTimeout(() => this.searchInput?.focus(), 100);
660
623
  }
624
+ // Side effect: reset search when closed
661
625
  if (!this.open) {
662
626
  this.focusedIndex = -1;
663
627
  if (this.searchInput) {
@@ -667,45 +631,9 @@ let SniceSelect = (() => {
667
631
  }
668
632
  }
669
633
  }
670
- handleLabelChange() {
671
- if (this.labelElement) {
672
- this.labelElement.textContent = this.label;
673
- if (this.label) {
674
- this.labelElement.removeAttribute('hidden');
675
- }
676
- else {
677
- this.labelElement.setAttribute('hidden', '');
678
- }
679
- }
680
- }
681
- handlePlaceholderChange() {
682
- this.updateValueDisplay();
683
- }
684
- handleRequiredChange() {
685
- if (this.labelElement) {
686
- this.labelElement.classList.toggle('select-label--required', this.required);
687
- }
688
- this.updateNativeSelectAttributes();
689
- }
690
- handleMultipleChange() {
691
- this.updateNativeSelectAttributes();
692
- }
693
- handleNameChange() {
634
+ handleNativeSelectAttributeChange() {
694
635
  this.updateNativeSelectAttributes();
695
636
  }
696
- handleClearableChange() {
697
- this.updateClearButton();
698
- }
699
- handleSearchableChange() {
700
- if (this.searchContainer) {
701
- if (this.searchable) {
702
- this.searchContainer.removeAttribute('hidden');
703
- }
704
- else {
705
- this.searchContainer.setAttribute('hidden', '');
706
- }
707
- }
708
- }
709
637
  updateValueDisplay() {
710
638
  if (!this.valueDisplay)
711
639
  return;