tyrell-components 1.0.0-RC13 → 1.0.0-RC15

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 (358) hide show
  1. package/README.md +10 -2
  2. package/css/tyrell-theme.css +192 -180
  3. package/css/tyrell.css +23 -0
  4. package/dist/tyrell-colors-static.css +1 -316
  5. package/dist/tyrell-theme.css +1 -1454
  6. package/dist/tyrell.css +1 -1371
  7. package/dist/tyrell.js +1 -1
  8. package/lib/base/ty-component.d.ts +20 -10
  9. package/lib/base/ty-component.js +196 -319
  10. package/lib/components/button.d.ts +3 -17
  11. package/lib/components/button.js +261 -295
  12. package/lib/components/calendar-month.d.ts +4 -50
  13. package/lib/components/calendar-month.js +443 -582
  14. package/lib/components/calendar-navigation.d.ts +3 -48
  15. package/lib/components/calendar-navigation.js +239 -362
  16. package/lib/components/calendar.d.ts +8 -83
  17. package/lib/components/calendar.js +616 -829
  18. package/lib/components/checkbox.d.ts +5 -72
  19. package/lib/components/checkbox.js +273 -416
  20. package/lib/components/copy.d.ts +4 -57
  21. package/lib/components/copy.js +280 -397
  22. package/lib/components/date-picker.d.ts +21 -163
  23. package/lib/components/date-picker.js +1143 -1674
  24. package/lib/components/file-upload.d.ts +9 -15
  25. package/lib/components/file-upload.js +404 -426
  26. package/lib/components/icon.d.ts +3 -24
  27. package/lib/components/icon.js +141 -230
  28. package/lib/components/input.d.ts +8 -108
  29. package/lib/components/input.js +593 -784
  30. package/lib/components/modal.d.ts +17 -26
  31. package/lib/components/modal.js +340 -484
  32. package/lib/components/option.d.ts +2 -9
  33. package/lib/components/option.js +168 -216
  34. package/lib/components/popup.d.ts +2 -17
  35. package/lib/components/popup.js +249 -380
  36. package/lib/components/radio.d.ts +5 -25
  37. package/lib/components/radio.js +407 -461
  38. package/lib/components/resize-observer.d.ts +3 -30
  39. package/lib/components/resize-observer.js +69 -103
  40. package/lib/components/scroll-container.d.ts +2 -12
  41. package/lib/components/scroll-container.js +293 -338
  42. package/lib/components/select.d.ts +87 -159
  43. package/lib/components/select.js +1609 -2090
  44. package/lib/components/selected-tags.d.ts +5 -48
  45. package/lib/components/selected-tags.js +188 -276
  46. package/lib/components/step.d.ts +1 -6
  47. package/lib/components/step.js +62 -68
  48. package/lib/components/switch.d.ts +1 -12
  49. package/lib/components/switch.js +214 -247
  50. package/lib/components/tab.d.ts +1 -6
  51. package/lib/components/tab.js +62 -69
  52. package/lib/components/tabs.d.ts +6 -63
  53. package/lib/components/tabs.js +545 -777
  54. package/lib/components/tag.d.ts +3 -37
  55. package/lib/components/tag.js +236 -335
  56. package/lib/components/textarea.d.ts +7 -87
  57. package/lib/components/textarea.js +457 -627
  58. package/lib/components/tooltip.d.ts +3 -11
  59. package/lib/components/tooltip.js +307 -443
  60. package/lib/components/wizard.d.ts +6 -54
  61. package/lib/components/wizard.js +405 -618
  62. package/lib/icons/fontawesome/brands.d.ts +0 -1
  63. package/lib/icons/fontawesome/brands.js +0 -8
  64. package/lib/icons/fontawesome/regular.d.ts +0 -1
  65. package/lib/icons/fontawesome/regular.js +0 -8
  66. package/lib/icons/fontawesome/solid.d.ts +0 -1
  67. package/lib/icons/fontawesome/solid.js +0 -8
  68. package/lib/icons/heroicons/micro.d.ts +0 -1
  69. package/lib/icons/heroicons/micro.js +392 -400
  70. package/lib/icons/heroicons/mini.d.ts +0 -1
  71. package/lib/icons/heroicons/mini.js +382 -390
  72. package/lib/icons/heroicons/outline.d.ts +0 -1
  73. package/lib/icons/heroicons/outline.js +337 -345
  74. package/lib/icons/heroicons/solid.d.ts +0 -1
  75. package/lib/icons/heroicons/solid.js +407 -415
  76. package/lib/icons/lucide.d.ts +0 -1
  77. package/lib/icons/lucide.js +24479 -26351
  78. package/lib/icons/material/filled.d.ts +0 -1
  79. package/lib/icons/material/filled.js +9653 -9663
  80. package/lib/icons/material/outlined.d.ts +0 -1
  81. package/lib/icons/material/outlined.js +10271 -10281
  82. package/lib/icons/material/round.d.ts +0 -1
  83. package/lib/icons/material/round.js +10495 -10505
  84. package/lib/icons/material/sharp.d.ts +0 -1
  85. package/lib/icons/material/sharp.js +9905 -9915
  86. package/lib/icons/material/two-tone.d.ts +0 -1
  87. package/lib/icons/material/two-tone.js +12792 -12802
  88. package/lib/index.d.ts +0 -1
  89. package/lib/index.js +21 -41
  90. package/lib/styles/button.d.ts +2 -20
  91. package/lib/styles/button.js +202 -404
  92. package/lib/styles/calendar-month.d.ts +1 -5
  93. package/lib/styles/calendar-month.js +127 -244
  94. package/lib/styles/calendar-navigation.d.ts +2 -6
  95. package/lib/styles/calendar-navigation.js +64 -104
  96. package/lib/styles/calendar.d.ts +1 -2
  97. package/lib/styles/calendar.js +9 -22
  98. package/lib/styles/checkbox.d.ts +0 -1
  99. package/lib/styles/checkbox.js +45 -94
  100. package/lib/styles/copy.d.ts +0 -1
  101. package/lib/styles/copy.js +67 -106
  102. package/lib/styles/custom-scrollbar.d.ts +1 -2
  103. package/lib/styles/custom-scrollbar.js +80 -115
  104. package/lib/styles/date-picker.d.ts +1 -5
  105. package/lib/styles/date-picker.js +261 -335
  106. package/lib/styles/field-size.d.ts +6 -0
  107. package/lib/styles/field-size.js +91 -0
  108. package/lib/styles/file-upload.d.ts +1 -2
  109. package/lib/styles/file-upload.js +143 -188
  110. package/lib/styles/icon.d.ts +2 -6
  111. package/lib/styles/icon.js +92 -170
  112. package/lib/styles/input.d.ts +1 -6
  113. package/lib/styles/input.js +125 -290
  114. package/lib/styles/modal.d.ts +1 -2
  115. package/lib/styles/modal.js +71 -108
  116. package/lib/styles/option.d.ts +2 -6
  117. package/lib/styles/option.js +49 -64
  118. package/lib/styles/popup.d.ts +1 -2
  119. package/lib/styles/popup.js +42 -77
  120. package/lib/styles/radio.d.ts +0 -1
  121. package/lib/styles/radio.js +69 -110
  122. package/lib/styles/resize-observer.d.ts +1 -2
  123. package/lib/styles/resize-observer.js +2 -12
  124. package/lib/styles/scroll-container.d.ts +1 -2
  125. package/lib/styles/scroll-container.js +100 -149
  126. package/lib/styles/select-base.d.ts +0 -1
  127. package/lib/styles/select-base.js +597 -785
  128. package/lib/styles/select.d.ts +1 -2
  129. package/lib/styles/select.js +140 -236
  130. package/lib/styles/step.d.ts +1 -2
  131. package/lib/styles/step.js +22 -33
  132. package/lib/styles/switch.d.ts +0 -1
  133. package/lib/styles/switch.js +34 -73
  134. package/lib/styles/tab.d.ts +1 -2
  135. package/lib/styles/tab.js +22 -34
  136. package/lib/styles/tabs.d.ts +3 -11
  137. package/lib/styles/tabs.js +190 -222
  138. package/lib/styles/tag.d.ts +1 -5
  139. package/lib/styles/tag.js +136 -218
  140. package/lib/styles/textarea.d.ts +1 -2
  141. package/lib/styles/textarea.js +210 -319
  142. package/lib/styles/tooltip.d.ts +0 -1
  143. package/lib/styles/tooltip.js +3 -13
  144. package/lib/styles/wizard.d.ts +5 -21
  145. package/lib/styles/wizard.js +170 -306
  146. package/lib/types/common.d.ts +2 -2
  147. package/lib/types/common.js +6 -17
  148. package/lib/utils/calendar-utils.d.ts +4 -21
  149. package/lib/utils/calendar-utils.js +100 -273
  150. package/lib/utils/custom-scrollbar.d.ts +6 -20
  151. package/lib/utils/custom-scrollbar.js +273 -317
  152. package/lib/utils/flavor-sheet.d.ts +0 -1
  153. package/lib/utils/flavor-sheet.js +14 -37
  154. package/lib/utils/icon-registry.d.ts +0 -2
  155. package/lib/utils/icon-registry.js +137 -243
  156. package/lib/utils/icons.d.ts +0 -1
  157. package/lib/utils/icons.js +0 -9
  158. package/lib/utils/loader-registry.d.ts +0 -1
  159. package/lib/utils/loader-registry.js +3 -35
  160. package/lib/utils/locale.d.ts +2 -23
  161. package/lib/utils/locale.js +34 -120
  162. package/lib/utils/mobile.d.ts +0 -1
  163. package/lib/utils/mobile.js +1 -18
  164. package/lib/utils/number-format.d.ts +6 -3
  165. package/lib/utils/number-format.js +54 -110
  166. package/lib/utils/positioning.d.ts +50 -7
  167. package/lib/utils/positioning.js +224 -234
  168. package/lib/utils/property-capture.d.ts +5 -27
  169. package/lib/utils/property-capture.js +36 -144
  170. package/lib/utils/property-manager.d.ts +0 -1
  171. package/lib/utils/property-manager.js +126 -196
  172. package/lib/utils/resize-observer.d.ts +0 -1
  173. package/lib/utils/resize-observer.js +23 -59
  174. package/lib/utils/scroll-lock.d.ts +4 -11
  175. package/lib/utils/scroll-lock.js +65 -172
  176. package/lib/utils/styles.d.ts +0 -1
  177. package/lib/utils/styles.js +17 -41
  178. package/lib/version.d.ts +1 -2
  179. package/lib/version.js +1 -11
  180. package/package.json +4 -4
  181. package/lib/base/ty-component.d.ts.map +0 -1
  182. package/lib/base/ty-component.js.map +0 -1
  183. package/lib/components/button.d.ts.map +0 -1
  184. package/lib/components/button.js.map +0 -1
  185. package/lib/components/calendar-month.d.ts.map +0 -1
  186. package/lib/components/calendar-month.js.map +0 -1
  187. package/lib/components/calendar-navigation.d.ts.map +0 -1
  188. package/lib/components/calendar-navigation.js.map +0 -1
  189. package/lib/components/calendar.d.ts.map +0 -1
  190. package/lib/components/calendar.js.map +0 -1
  191. package/lib/components/checkbox.d.ts.map +0 -1
  192. package/lib/components/checkbox.js.map +0 -1
  193. package/lib/components/copy.d.ts.map +0 -1
  194. package/lib/components/copy.js.map +0 -1
  195. package/lib/components/date-picker.d.ts.map +0 -1
  196. package/lib/components/date-picker.js.map +0 -1
  197. package/lib/components/file-upload.d.ts.map +0 -1
  198. package/lib/components/file-upload.js.map +0 -1
  199. package/lib/components/icon.d.ts.map +0 -1
  200. package/lib/components/icon.js.map +0 -1
  201. package/lib/components/input.d.ts.map +0 -1
  202. package/lib/components/input.js.map +0 -1
  203. package/lib/components/modal.d.ts.map +0 -1
  204. package/lib/components/modal.js.map +0 -1
  205. package/lib/components/option.d.ts.map +0 -1
  206. package/lib/components/option.js.map +0 -1
  207. package/lib/components/popup.d.ts.map +0 -1
  208. package/lib/components/popup.js.map +0 -1
  209. package/lib/components/radio.d.ts.map +0 -1
  210. package/lib/components/radio.js.map +0 -1
  211. package/lib/components/resize-observer.d.ts.map +0 -1
  212. package/lib/components/resize-observer.js.map +0 -1
  213. package/lib/components/scroll-container.d.ts.map +0 -1
  214. package/lib/components/scroll-container.js.map +0 -1
  215. package/lib/components/select.d.ts.map +0 -1
  216. package/lib/components/select.js.map +0 -1
  217. package/lib/components/selected-tags.d.ts.map +0 -1
  218. package/lib/components/selected-tags.js.map +0 -1
  219. package/lib/components/step.d.ts.map +0 -1
  220. package/lib/components/step.js.map +0 -1
  221. package/lib/components/switch.d.ts.map +0 -1
  222. package/lib/components/switch.js.map +0 -1
  223. package/lib/components/tab.d.ts.map +0 -1
  224. package/lib/components/tab.js.map +0 -1
  225. package/lib/components/tabs.d.ts.map +0 -1
  226. package/lib/components/tabs.js.map +0 -1
  227. package/lib/components/tag.d.ts.map +0 -1
  228. package/lib/components/tag.js.map +0 -1
  229. package/lib/components/textarea.d.ts.map +0 -1
  230. package/lib/components/textarea.js.map +0 -1
  231. package/lib/components/tooltip.d.ts.map +0 -1
  232. package/lib/components/tooltip.js.map +0 -1
  233. package/lib/components/wizard.d.ts.map +0 -1
  234. package/lib/components/wizard.js.map +0 -1
  235. package/lib/icons/fontawesome/brands.d.ts.map +0 -1
  236. package/lib/icons/fontawesome/brands.js.map +0 -1
  237. package/lib/icons/fontawesome/regular.d.ts.map +0 -1
  238. package/lib/icons/fontawesome/regular.js.map +0 -1
  239. package/lib/icons/fontawesome/solid.d.ts.map +0 -1
  240. package/lib/icons/fontawesome/solid.js.map +0 -1
  241. package/lib/icons/heroicons/micro.d.ts.map +0 -1
  242. package/lib/icons/heroicons/micro.js.map +0 -1
  243. package/lib/icons/heroicons/mini.d.ts.map +0 -1
  244. package/lib/icons/heroicons/mini.js.map +0 -1
  245. package/lib/icons/heroicons/outline.d.ts.map +0 -1
  246. package/lib/icons/heroicons/outline.js.map +0 -1
  247. package/lib/icons/heroicons/solid.d.ts.map +0 -1
  248. package/lib/icons/heroicons/solid.js.map +0 -1
  249. package/lib/icons/lucide.d.ts.map +0 -1
  250. package/lib/icons/lucide.js.map +0 -1
  251. package/lib/icons/material/filled.d.ts.map +0 -1
  252. package/lib/icons/material/filled.js.map +0 -1
  253. package/lib/icons/material/outlined.d.ts.map +0 -1
  254. package/lib/icons/material/outlined.js.map +0 -1
  255. package/lib/icons/material/round.d.ts.map +0 -1
  256. package/lib/icons/material/round.js.map +0 -1
  257. package/lib/icons/material/sharp.d.ts.map +0 -1
  258. package/lib/icons/material/sharp.js.map +0 -1
  259. package/lib/icons/material/two-tone.d.ts.map +0 -1
  260. package/lib/icons/material/two-tone.js.map +0 -1
  261. package/lib/index.d.ts.map +0 -1
  262. package/lib/index.js.map +0 -1
  263. package/lib/styles/button.d.ts.map +0 -1
  264. package/lib/styles/button.js.map +0 -1
  265. package/lib/styles/calendar-month.d.ts.map +0 -1
  266. package/lib/styles/calendar-month.js.map +0 -1
  267. package/lib/styles/calendar-navigation.d.ts.map +0 -1
  268. package/lib/styles/calendar-navigation.js.map +0 -1
  269. package/lib/styles/calendar.d.ts.map +0 -1
  270. package/lib/styles/calendar.js.map +0 -1
  271. package/lib/styles/checkbox.d.ts.map +0 -1
  272. package/lib/styles/checkbox.js.map +0 -1
  273. package/lib/styles/copy.d.ts.map +0 -1
  274. package/lib/styles/copy.js.map +0 -1
  275. package/lib/styles/custom-scrollbar.d.ts.map +0 -1
  276. package/lib/styles/custom-scrollbar.js.map +0 -1
  277. package/lib/styles/date-picker.d.ts.map +0 -1
  278. package/lib/styles/date-picker.js.map +0 -1
  279. package/lib/styles/file-upload.d.ts.map +0 -1
  280. package/lib/styles/file-upload.js.map +0 -1
  281. package/lib/styles/icon.d.ts.map +0 -1
  282. package/lib/styles/icon.js.map +0 -1
  283. package/lib/styles/input.d.ts.map +0 -1
  284. package/lib/styles/input.js.map +0 -1
  285. package/lib/styles/modal.d.ts.map +0 -1
  286. package/lib/styles/modal.js.map +0 -1
  287. package/lib/styles/multiselect.d.ts +0 -8
  288. package/lib/styles/multiselect.d.ts.map +0 -1
  289. package/lib/styles/multiselect.js +0 -849
  290. package/lib/styles/multiselect.js.map +0 -1
  291. package/lib/styles/option.d.ts.map +0 -1
  292. package/lib/styles/option.js.map +0 -1
  293. package/lib/styles/popup.d.ts.map +0 -1
  294. package/lib/styles/popup.js.map +0 -1
  295. package/lib/styles/radio.d.ts.map +0 -1
  296. package/lib/styles/radio.js.map +0 -1
  297. package/lib/styles/resize-observer.d.ts.map +0 -1
  298. package/lib/styles/resize-observer.js.map +0 -1
  299. package/lib/styles/scroll-container.d.ts.map +0 -1
  300. package/lib/styles/scroll-container.js.map +0 -1
  301. package/lib/styles/select-base.d.ts.map +0 -1
  302. package/lib/styles/select-base.js.map +0 -1
  303. package/lib/styles/select.d.ts.map +0 -1
  304. package/lib/styles/select.js.map +0 -1
  305. package/lib/styles/step.d.ts.map +0 -1
  306. package/lib/styles/step.js.map +0 -1
  307. package/lib/styles/switch.d.ts.map +0 -1
  308. package/lib/styles/switch.js.map +0 -1
  309. package/lib/styles/tab.d.ts.map +0 -1
  310. package/lib/styles/tab.js.map +0 -1
  311. package/lib/styles/tabs.d.ts.map +0 -1
  312. package/lib/styles/tabs.js.map +0 -1
  313. package/lib/styles/tag.d.ts.map +0 -1
  314. package/lib/styles/tag.js.map +0 -1
  315. package/lib/styles/textarea.d.ts.map +0 -1
  316. package/lib/styles/textarea.js.map +0 -1
  317. package/lib/styles/tooltip.d.ts.map +0 -1
  318. package/lib/styles/tooltip.js.map +0 -1
  319. package/lib/styles/wizard.d.ts.map +0 -1
  320. package/lib/styles/wizard.js.map +0 -1
  321. package/lib/types/common.d.ts.map +0 -1
  322. package/lib/types/common.js.map +0 -1
  323. package/lib/utils/calendar-utils.d.ts.map +0 -1
  324. package/lib/utils/calendar-utils.js.map +0 -1
  325. package/lib/utils/custom-scrollbar.d.ts.map +0 -1
  326. package/lib/utils/custom-scrollbar.js.map +0 -1
  327. package/lib/utils/flavor-sheet.d.ts.map +0 -1
  328. package/lib/utils/flavor-sheet.js.map +0 -1
  329. package/lib/utils/icon-registry.d.ts.map +0 -1
  330. package/lib/utils/icon-registry.js.map +0 -1
  331. package/lib/utils/icons.d.ts.map +0 -1
  332. package/lib/utils/icons.js.map +0 -1
  333. package/lib/utils/loader-registry.d.ts.map +0 -1
  334. package/lib/utils/loader-registry.js.map +0 -1
  335. package/lib/utils/locale.d.ts.map +0 -1
  336. package/lib/utils/locale.js.map +0 -1
  337. package/lib/utils/mobile.d.ts.map +0 -1
  338. package/lib/utils/mobile.js.map +0 -1
  339. package/lib/utils/number-format.d.ts.map +0 -1
  340. package/lib/utils/number-format.js.map +0 -1
  341. package/lib/utils/parse-boolean.d.ts +0 -39
  342. package/lib/utils/parse-boolean.d.ts.map +0 -1
  343. package/lib/utils/parse-boolean.js +0 -58
  344. package/lib/utils/parse-boolean.js.map +0 -1
  345. package/lib/utils/positioning.d.ts.map +0 -1
  346. package/lib/utils/positioning.js.map +0 -1
  347. package/lib/utils/property-capture.d.ts.map +0 -1
  348. package/lib/utils/property-capture.js.map +0 -1
  349. package/lib/utils/property-manager.d.ts.map +0 -1
  350. package/lib/utils/property-manager.js.map +0 -1
  351. package/lib/utils/resize-observer.d.ts.map +0 -1
  352. package/lib/utils/resize-observer.js.map +0 -1
  353. package/lib/utils/scroll-lock.d.ts.map +0 -1
  354. package/lib/utils/scroll-lock.js.map +0 -1
  355. package/lib/utils/styles.d.ts.map +0 -1
  356. package/lib/utils/styles.js.map +0 -1
  357. package/lib/version.d.ts.map +0 -1
  358. package/lib/version.js.map +0 -1
@@ -1,7 +1,5 @@
1
1
  /**
2
- * TyIcon Web Component
3
- * PORTED FROM: clj/ty/components/icon.cljs
4
- * SVG icon component with size variants and animations
2
+ * TyIcon Web Component — SVG icon with size variants and animations.
5
3
  */
6
4
  import type { IconSize, IconTempo, TyIconElement } from '../types/common.js';
7
5
  import { TyComponent } from '../base/ty-component.js';
@@ -19,13 +17,6 @@ interface IconState {
19
17
  }
20
18
  /**
21
19
  * Ty Icon Component
22
- *
23
- * @example
24
- * ```html
25
- * <ty-icon name="check"></ty-icon>
26
- * <ty-icon name="spinner" spin></ty-icon>
27
- * <ty-icon name="heart" size="xl"></ty-icon>
28
- * ```
29
20
  */
30
21
  export declare class TyIcon extends TyComponent<IconState> implements TyIconElement {
31
22
  static formAssociated: boolean;
@@ -69,13 +60,7 @@ export declare class TyIcon extends TyComponent<IconState> implements TyIconElem
69
60
  */
70
61
  private _slot;
71
62
  constructor();
72
- /**
73
- * Called when component connects to DOM
74
- */
75
63
  protected onConnect(): void;
76
- /**
77
- * Called when component disconnects from DOM
78
- */
79
64
  protected onDisconnect(): void;
80
65
  /**
81
66
  * Handle property changes - called BEFORE render
@@ -97,13 +82,8 @@ export declare class TyIcon extends TyComponent<IconState> implements TyIconElem
97
82
  /** Update host element classes */
98
83
  private updateClasses;
99
84
  /**
100
- * Render the icon SVG
101
- * Smart rendering strategy:
102
- * 1. Check memory registry (instant)
103
- * 2. If found in memory -> render immediately
104
- * 3. If not in memory -> show NOT_FOUND_ICON immediately (prevents empty state)
105
- * 4. Then check cache asynchronously and replace if found
106
- * 5. Only re-render if SVG actually changed
85
+ * Render the icon SVG. Unknown/unset names fall back to NOT_FOUND_ICON
86
+ * immediately rather than rendering nothing (prevents layout shift).
107
87
  */
108
88
  protected render(): void;
109
89
  /**
@@ -115,4 +95,3 @@ export declare class TyIcon extends TyComponent<IconState> implements TyIconElem
115
95
  private renderSvg;
116
96
  }
117
97
  export { IconRegistry };
118
- //# sourceMappingURL=icon.d.ts.map
@@ -1,245 +1,156 @@
1
- /**
2
- * TyIcon Web Component
3
- * PORTED FROM: clj/ty/components/icon.cljs
4
- * SVG icon component with size variants and animations
5
- */
6
1
  import { TyComponent } from '../base/ty-component.js';
7
2
  import { ensureStyles } from '../utils/styles.js';
8
3
  import { iconStyles } from '../styles/icon.js';
9
4
  import * as IconRegistry from '../utils/icon-registry.js';
10
5
  let _iconIdCounter = 0;
11
- /** Fallback SVG for missing icons - More visible to prevent layout shift */
12
6
  const NOT_FOUND_ICON = `<svg xmlns="http://www.w3.org/2000/svg"
13
- viewBox="0 0 512 512"
14
- fill="currentColor"
15
- opacity="0.2">
16
- <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512z"/>
7
+ viewBox="0 0 512 512"
8
+ fill="currentColor"
9
+ opacity="0.2">
10
+ <path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512z"/>
17
11
  </svg>`;
18
- /**
19
- * Ty Icon Component
20
- *
21
- * @example
22
- * ```html
23
- * <ty-icon name="check"></ty-icon>
24
- * <ty-icon name="spinner" spin></ty-icon>
25
- * <ty-icon name="heart" size="xl"></ty-icon>
26
- * ```
27
- */
28
12
  export class TyIcon extends TyComponent {
29
- constructor() {
30
- super(); // TyComponent handles attachInternals() and attachShadow()
31
- // ============================================================================
32
- // INTERNAL STATE - Not managed by PropertyManager
33
- // ============================================================================
34
- this._watchId = null;
35
- /** Track currently rendered SVG to avoid unnecessary re-renders */
36
- this._currentSvg = '';
37
- /**
38
- * Single shadow-DOM <slot> that holds either:
39
- * - light-DOM children supplied by the user (server-side path: pasted SVG), or
40
- * - fallback content driven by the registry (`name=`) or NOT_FOUND_ICON.
41
- *
42
- * Browser slot semantics handle precedence: when the host has assigned nodes,
43
- * the slot's fallback content is hidden automatically — no detection logic needed.
44
- */
45
- this._slot = null;
46
- // Apply styles to shadow root
47
- ensureStyles(this.shadowRoot, { css: iconStyles, id: 'ty-icon' });
48
- // Build the slot once. Fallback content shows when no light-DOM children are slotted.
49
- this._slot = document.createElement('slot');
50
- this._slot.innerHTML = NOT_FOUND_ICON;
51
- this._currentSvg = NOT_FOUND_ICON;
52
- this.shadowRoot.appendChild(this._slot);
53
- }
54
- // observedAttributes auto-generated by TyComponent from properties config
55
- // ============================================================================
56
- // TYCOMPONENT LIFECYCLE HOOKS
57
- // ============================================================================
58
- /**
59
- * Called when component connects to DOM
60
- */
61
- onConnect() {
62
- // Generate unique watch ID
63
- this._watchId = `ty-icon-${++_iconIdCounter}`;
64
- // Watch for registry changes that affect this icon
65
- if (this.name) {
66
- IconRegistry.addWatcher(this._watchId, this.name, (changedIcons) => {
67
- // Re-render if our icon changed
68
- if (this.name && changedIcons.has(this.name)) {
69
- this.render();
70
- }
71
- });
72
- }
73
- // Update host element classes
74
- this.updateClasses();
75
- // TyComponent will call render() automatically after this hook
76
- }
77
- /**
78
- * Called when component disconnects from DOM
79
- */
80
- onDisconnect() {
81
- // Clean up watcher
82
- if (this._watchId) {
83
- IconRegistry.removeWatcher(this._watchId);
84
- this._watchId = null;
85
- }
86
- }
87
- /**
88
- * Handle property changes - called BEFORE render
89
- * Detects name changes to update icon registry watcher
90
- */
91
- onPropertiesChanged(changes) {
92
- for (const change of changes) {
93
- if (change.name === 'name') {
94
- // Remove old watcher
95
- if (this._watchId) {
96
- IconRegistry.removeWatcher(this._watchId);
97
- }
98
- // Re-add watcher for new name
99
- const newName = change.newValue || '';
100
- if (newName && this.isConnected) {
101
- this._watchId = `ty-icon-${++_iconIdCounter}`;
102
- IconRegistry.addWatcher(this._watchId, newName, (changedIcons) => {
103
- if (this.name && changedIcons.has(this.name)) {
104
- this.render();
105
- }
106
- });
107
- }
108
- }
109
- }
110
- // Update host element classes for any visual change
111
- this.updateClasses();
112
- }
113
- // ============================================================================
114
- // PROPERTY ACCESSORS - Simple wrappers (no logic!)
115
- // ============================================================================
116
- get name() {
117
- return this.getProperty('name');
118
- }
119
- set name(value) {
120
- this.setProperty('name', value);
121
- }
122
- get size() {
123
- const val = this.getProperty('size');
124
- return val || undefined;
125
- }
126
- set size(value) {
127
- this.setProperty('size', value || '');
128
- }
129
- get spin() {
130
- return this.getProperty('spin');
131
- }
132
- set spin(value) {
133
- this.setProperty('spin', value);
134
- }
135
- get pulse() {
136
- return this.getProperty('pulse');
137
- }
138
- set pulse(value) {
139
- this.setProperty('pulse', value);
140
- }
141
- get tempo() {
142
- const val = this.getProperty('tempo');
143
- return val || undefined;
144
- }
145
- set tempo(value) {
146
- this.setProperty('tempo', value || '');
147
- }
148
- // ============================================================================
149
- // RENDERING
150
- // ============================================================================
151
- /** Build CSS classes for the host element */
152
- buildClasses() {
153
- const classes = [];
154
- // Size class
155
- const size = this.getProperty('size');
156
- if (size) {
157
- classes.push(`icon-${size}`);
158
- }
159
- // Animation classes
160
- if (this.getProperty('spin')) {
161
- classes.push('icon-spin');
162
- }
163
- if (this.getProperty('pulse')) {
164
- classes.push('icon-pulse');
165
- }
166
- // Tempo class
167
- const tempo = this.getProperty('tempo');
168
- if (tempo && (this.getProperty('spin') || this.getProperty('pulse'))) {
169
- classes.push(`icon-tempo-${tempo}`);
170
- }
171
- // Preserve user-added classes that don't conflict
172
- const currentClasses = this.className.split(/\s+/).filter(cls => {
173
- // Filter out component-managed classes
174
- return cls &&
175
- !cls.startsWith('icon-') &&
176
- cls !== 'icon-spin' &&
177
- cls !== 'icon-pulse';
178
- });
179
- return [...classes, ...currentClasses];
180
- }
181
- /** Update host element classes */
182
- updateClasses() {
183
- const newClasses = this.buildClasses().join(' ');
184
- if (this.className !== newClasses) {
185
- this.className = newClasses;
186
- }
187
- }
188
- /**
189
- * Render the icon SVG
190
- * Smart rendering strategy:
191
- * 1. Check memory registry (instant)
192
- * 2. If found in memory -> render immediately
193
- * 3. If not in memory -> show NOT_FOUND_ICON immediately (prevents empty state)
194
- * 4. Then check cache asynchronously and replace if found
195
- * 5. Only re-render if SVG actually changed
196
- */
197
- render() {
198
- const name = this.getProperty('name');
199
- if (!name) {
200
- this.renderSvg(NOT_FOUND_ICON);
201
- return;
202
- }
203
- // Fast path: Check memory registry first
204
- const memorySvg = IconRegistry.getIcon(name);
205
- if (memorySvg) {
206
- this.renderSvg(memorySvg);
207
- return;
208
- }
209
- this.renderSvg(NOT_FOUND_ICON);
210
- }
211
- /**
212
- * Update the slot's fallback content.
213
- * If the user has slotted light-DOM children (e.g., raw <svg>), the browser
214
- * shows those instead and the fallback stays hidden — but we still keep it
215
- * up to date so removing the children reveals the right registry/fallback SVG.
216
- */
217
- renderSvg(svg) {
218
- // Only render if content actually changed
219
- if (this._currentSvg === svg) {
220
- return;
221
- }
222
- if (this._slot) {
223
- this._slot.innerHTML = svg;
224
- this._currentSvg = svg;
225
- }
226
- }
13
+ constructor() {
14
+ super();
15
+ this._watchId = null;
16
+ this._currentSvg = '';
17
+ this._slot = null;
18
+ ensureStyles(this.shadowRoot, { css: iconStyles, id: 'ty-icon' });
19
+ this._slot = document.createElement('slot');
20
+ this._slot.innerHTML = NOT_FOUND_ICON;
21
+ this._currentSvg = NOT_FOUND_ICON;
22
+ this.shadowRoot.appendChild(this._slot);
23
+ }
24
+ onConnect() {
25
+ this._watchId = `ty-icon-${++_iconIdCounter}`;
26
+ if (this.name) {
27
+ IconRegistry.addWatcher(this._watchId, this.name, (changedIcons) => {
28
+ if (this.name && changedIcons.has(this.name)) {
29
+ this.render();
30
+ }
31
+ });
32
+ }
33
+ this.updateClasses();
34
+ }
35
+ onDisconnect() {
36
+ if (this._watchId) {
37
+ IconRegistry.removeWatcher(this._watchId);
38
+ this._watchId = null;
39
+ }
40
+ }
41
+ onPropertiesChanged(changes) {
42
+ for (const change of changes) {
43
+ if (change.name === 'name') {
44
+ if (this._watchId) {
45
+ IconRegistry.removeWatcher(this._watchId);
46
+ }
47
+ const newName = change.newValue || '';
48
+ if (newName && this.isConnected) {
49
+ this._watchId = `ty-icon-${++_iconIdCounter}`;
50
+ IconRegistry.addWatcher(this._watchId, newName, (changedIcons) => {
51
+ if (this.name && changedIcons.has(this.name)) {
52
+ this.render();
53
+ }
54
+ });
55
+ }
56
+ }
57
+ }
58
+ this.updateClasses();
59
+ }
60
+ get name() {
61
+ return this.getProperty('name');
62
+ }
63
+ set name(value) {
64
+ this.setProperty('name', value);
65
+ }
66
+ get size() {
67
+ const val = this.getProperty('size');
68
+ return val || undefined;
69
+ }
70
+ set size(value) {
71
+ this.setProperty('size', value || '');
72
+ }
73
+ get spin() {
74
+ return this.getProperty('spin');
75
+ }
76
+ set spin(value) {
77
+ this.setProperty('spin', value);
78
+ }
79
+ get pulse() {
80
+ return this.getProperty('pulse');
81
+ }
82
+ set pulse(value) {
83
+ this.setProperty('pulse', value);
84
+ }
85
+ get tempo() {
86
+ const val = this.getProperty('tempo');
87
+ return val || undefined;
88
+ }
89
+ set tempo(value) {
90
+ this.setProperty('tempo', value || '');
91
+ }
92
+ buildClasses() {
93
+ const classes = [];
94
+ const size = this.getProperty('size');
95
+ if (size) {
96
+ classes.push(`icon-${size}`);
97
+ }
98
+ if (this.getProperty('spin')) {
99
+ classes.push('icon-spin');
100
+ }
101
+ if (this.getProperty('pulse')) {
102
+ classes.push('icon-pulse');
103
+ }
104
+ const tempo = this.getProperty('tempo');
105
+ if (tempo && (this.getProperty('spin') || this.getProperty('pulse'))) {
106
+ classes.push(`icon-tempo-${tempo}`);
107
+ }
108
+ const currentClasses = this.className.split(/\s+/).filter(cls => {
109
+ return cls &&
110
+ !cls.startsWith('icon-') &&
111
+ cls !== 'icon-spin' &&
112
+ cls !== 'icon-pulse';
113
+ });
114
+ return [...classes, ...currentClasses];
115
+ }
116
+ updateClasses() {
117
+ const newClasses = this.buildClasses().join(' ');
118
+ if (this.className !== newClasses) {
119
+ this.className = newClasses;
120
+ }
121
+ }
122
+ render() {
123
+ const name = this.getProperty('name');
124
+ if (!name) {
125
+ this.renderSvg(NOT_FOUND_ICON);
126
+ return;
127
+ }
128
+ const memorySvg = IconRegistry.getIcon(name);
129
+ if (memorySvg) {
130
+ this.renderSvg(memorySvg);
131
+ return;
132
+ }
133
+ this.renderSvg(NOT_FOUND_ICON);
134
+ }
135
+ renderSvg(svg) {
136
+ if (this._currentSvg === svg) {
137
+ return;
138
+ }
139
+ if (this._slot) {
140
+ this._slot.innerHTML = svg;
141
+ this._currentSvg = svg;
142
+ }
143
+ }
227
144
  }
228
145
  TyIcon.formAssociated = false;
229
- // ============================================================================
230
- // PROPERTY CONFIGURATION - Declarative property lifecycle
231
- // ============================================================================
232
146
  TyIcon.properties = {
233
- name: { type: 'string', visual: true, default: '' },
234
- size: { type: 'string', visual: true, default: '' },
235
- spin: { type: 'boolean', visual: true, default: false },
236
- pulse: { type: 'boolean', visual: true, default: false },
237
- tempo: { type: 'string', visual: true, default: '' },
147
+ name: { type: 'string', visual: true, default: '' },
148
+ size: { type: 'string', visual: true, default: '' },
149
+ spin: { type: 'boolean', visual: true, default: false },
150
+ pulse: { type: 'boolean', visual: true, default: false },
151
+ tempo: { type: 'string', visual: true, default: '' },
238
152
  };
239
- // Register the custom element
240
153
  if (!customElements.get('ty-icon')) {
241
- customElements.define('ty-icon', TyIcon);
154
+ customElements.define('ty-icon', TyIcon);
242
155
  }
243
- // Export for use in other modules
244
156
  export { IconRegistry };
245
- //# sourceMappingURL=icon.js.map
@@ -1,63 +1,11 @@
1
1
  /**
2
- * TyInput Web Component
3
- * PORTED FROM: clj/ty/components/input.cljs
4
- * Phase D: Complete with debounce feature for input and change events
5
- *
6
- * Enhanced input component with:
7
- * - Label, error messages, semantic styling
8
- * - Icon slots (start/end)
9
- * - Numeric formatting with shadow values
10
- * - Currency, percent, compact notation
11
- * - Format-on-blur / raw-on-focus behavior
12
- * - Debounce (0-5000ms) for input/change events
13
- * - Immediate event firing on blur (cancels pending debounce)
14
- *
15
- * NOTE: Checkbox functionality is in separate ty-checkbox component
2
+ * TyInput Web Component - text input with label, error, icon slots and
3
+ * locale-aware numeric formatting (format-on-blur / raw-on-focus via a parsed
4
+ * "shadow value"). Debounce 0-5000ms; blur flushes any pending debounced event.
16
5
  */
17
6
  import type { Flavor, Size, InputType, TyInputElement } from '../types/common.js';
18
7
  import { TyComponent } from '../base/ty-component.js';
19
8
  import type { PropertyChange } from '../utils/property-manager.js';
20
- /**
21
- * Ty Input Component (Phase D - Complete with Debounce)
22
- *
23
- * @example
24
- * ```html
25
- * <!-- Basic input -->
26
- * <ty-input label="Email" type="email" placeholder="Enter email" required></ty-input>
27
- *
28
- * <!-- With icons -->
29
- * <ty-input label="Search">
30
- * <ty-icon slot="start" name="search"></ty-icon>
31
- * </ty-input>
32
- *
33
- * <!-- With debounce (500ms) -->
34
- * <ty-input
35
- * label="Search"
36
- * debounce="500"
37
- * placeholder="Type to search...">
38
- * </ty-input>
39
- *
40
- * <!-- Currency formatting -->
41
- * <ty-input
42
- * label="Price"
43
- * type="currency"
44
- * currency="USD"
45
- * locale="en-US"
46
- * value="1234.56">
47
- * </ty-input>
48
- *
49
- * <!-- Percent formatting -->
50
- * <ty-input
51
- * label="Tax Rate"
52
- * type="percent"
53
- * value="15"
54
- * precision="2">
55
- * </ty-input>
56
- * ```
57
- */
58
- /**
59
- * Internal state interface for TyInput component
60
- */
61
9
  interface InputState {
62
10
  shadowValue: number | string | null;
63
11
  isFocused: boolean;
@@ -119,7 +67,7 @@ export declare class TyInput extends TyComponent<InputState> implements TyInputE
119
67
  size: {
120
68
  type: "string";
121
69
  visual: boolean;
122
- default: string;
70
+ default: Size;
123
71
  validate: (v: any) => boolean;
124
72
  coerce: (v: any) => any;
125
73
  };
@@ -165,51 +113,23 @@ export declare class TyInput extends TyComponent<InputState> implements TyInputE
165
113
  private _changeDebounceTimer;
166
114
  private _localeObserver?;
167
115
  constructor();
168
- /**
169
- * Called when component connects to DOM
170
- * TyComponent already handled pre-connection property capture
171
- */
116
+ /** TyComponent already handled pre-connection property capture. */
172
117
  protected onConnect(): void;
173
118
  /** Custom (non-built-in) flavors — see utils/flavor-sheet.ts. */
174
119
  private _syncCustomFlavor;
175
- /**
176
- * Called when component disconnects from DOM
177
- */
178
120
  protected onDisconnect(): void;
179
- /**
180
- * Handle property changes - called BEFORE render
181
- * This replaces the old attributeChangedCallback logic
182
- */
121
+ /** Handle property changes — called BEFORE render. */
183
122
  protected onPropertiesChanged(changes: PropertyChange[]): void;
184
- /**
185
- * Hook: Called when form is reset
186
- * Clear shadow value and focus state
187
- */
188
123
  protected onFormReset(): void;
189
124
  /**
190
125
  * Override form value to return shadow value
191
126
  * This ensures numeric types submit their parsed values
192
127
  */
193
128
  protected getFormValue(): FormDataEntryValue | null;
194
- /**
195
- * Initialize shadow value from the initial value attribute
196
- */
197
129
  private initializeShadowValue;
198
- /**
199
- * Parse a string value to the appropriate shadow value type
200
- */
201
130
  private parseShadowValue;
202
- /**
203
- * Check if current input should format numbers
204
- */
205
131
  private shouldFormat;
206
- /**
207
- * Get the format configuration for current input
208
- */
209
132
  private getFormatConfig;
210
- /**
211
- * Get the display value (formatted or raw)
212
- */
213
133
  private getDisplayValue;
214
134
  get type(): InputType;
215
135
  set type(v: InputType);
@@ -240,32 +160,13 @@ export declare class TyInput extends TyComponent<InputState> implements TyInputE
240
160
  get debounce(): number;
241
161
  set debounce(v: number | string);
242
162
  get form(): HTMLFormElement | null;
243
- /**
244
- * Build CSS class list for input wrapper
245
- */
246
163
  private buildClassList;
247
- /**
248
- * Dispatch input event (helper method for debouncing)
249
- */
250
164
  private dispatchInputEvent;
251
- /**
252
- * Dispatch change event (helper method for debouncing)
253
- */
254
165
  private dispatchChangeEvent;
255
- /**
256
- * Remove event listeners for cleanup
257
- */
258
166
  private removeEventListeners;
259
- /**
260
- * Setup event listeners for input element
261
- * IMPORTANT: Only called ONCE, not on every render (like ClojureScript)
262
- */
167
+ /** IMPORTANT: Only called ONCE, not on every render. */
263
168
  private setupEventListeners;
264
- /**
265
- * Render the input component with wrapper and slots
266
- * Phase C: Uses getDisplayValue() for formatted output
267
- *
268
- */
169
+ /** Render the input component with wrapper and slots. */
269
170
  render(): void;
270
171
  /**
271
172
  * Wire the password reveal toggle (rendered only for type="password").
@@ -282,4 +183,3 @@ export declare class TyInput extends TyComponent<InputState> implements TyInputE
282
183
  private updateValidity;
283
184
  }
284
185
  export {};
285
- //# sourceMappingURL=input.d.ts.map