tyrell-components 1.0.0-RC13 → 1.0.0-RC14

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 (355) hide show
  1. package/README.md +1 -1
  2. package/css/tyrell-theme.css +167 -178
  3. package/css/tyrell.css +19 -0
  4. package/dist/tyrell-theme.css +167 -178
  5. package/dist/tyrell.css +19 -0
  6. package/dist/tyrell.js +1 -1
  7. package/lib/base/ty-component.d.ts +20 -10
  8. package/lib/base/ty-component.js +21 -144
  9. package/lib/components/button.d.ts +2 -16
  10. package/lib/components/button.js +0 -36
  11. package/lib/components/calendar-month.d.ts +2 -48
  12. package/lib/components/calendar-month.js +4 -166
  13. package/lib/components/calendar-navigation.d.ts +3 -48
  14. package/lib/components/calendar-navigation.js +3 -126
  15. package/lib/components/calendar.d.ts +3 -80
  16. package/lib/components/calendar.js +8 -230
  17. package/lib/components/checkbox.d.ts +4 -71
  18. package/lib/components/checkbox.js +7 -151
  19. package/lib/components/copy.d.ts +3 -56
  20. package/lib/components/copy.js +1 -120
  21. package/lib/components/date-picker.d.ts +13 -162
  22. package/lib/components/date-picker.js +41 -592
  23. package/lib/components/file-upload.d.ts +9 -15
  24. package/lib/components/file-upload.js +19 -41
  25. package/lib/components/icon.d.ts +3 -24
  26. package/lib/components/icon.js +1 -90
  27. package/lib/components/input.d.ts +7 -107
  28. package/lib/components/input.js +5 -193
  29. package/lib/components/modal.d.ts +17 -26
  30. package/lib/components/modal.js +57 -201
  31. package/lib/components/option.d.ts +2 -9
  32. package/lib/components/option.js +0 -48
  33. package/lib/components/popup.d.ts +2 -17
  34. package/lib/components/popup.js +8 -139
  35. package/lib/components/radio.d.ts +3 -23
  36. package/lib/components/radio.js +10 -65
  37. package/lib/components/resize-observer.d.ts +3 -30
  38. package/lib/components/resize-observer.js +12 -46
  39. package/lib/components/scroll-container.d.ts +2 -12
  40. package/lib/components/scroll-container.js +3 -46
  41. package/lib/components/select.d.ts +22 -153
  42. package/lib/components/select.js +33 -590
  43. package/lib/components/selected-tags.d.ts +4 -47
  44. package/lib/components/selected-tags.js +1 -95
  45. package/lib/components/step.d.ts +1 -6
  46. package/lib/components/step.js +0 -6
  47. package/lib/components/switch.d.ts +0 -11
  48. package/lib/components/switch.js +2 -36
  49. package/lib/components/tab.d.ts +1 -6
  50. package/lib/components/tab.js +0 -7
  51. package/lib/components/tabs.d.ts +5 -63
  52. package/lib/components/tabs.js +20 -283
  53. package/lib/components/tag.d.ts +2 -36
  54. package/lib/components/tag.js +5 -105
  55. package/lib/components/textarea.d.ts +6 -86
  56. package/lib/components/textarea.js +2 -173
  57. package/lib/components/tooltip.d.ts +3 -11
  58. package/lib/components/tooltip.js +24 -160
  59. package/lib/components/wizard.d.ts +6 -54
  60. package/lib/components/wizard.js +15 -228
  61. package/lib/icons/fontawesome/brands.d.ts +0 -1
  62. package/lib/icons/fontawesome/brands.js +0 -8
  63. package/lib/icons/fontawesome/regular.d.ts +0 -1
  64. package/lib/icons/fontawesome/regular.js +0 -8
  65. package/lib/icons/fontawesome/solid.d.ts +0 -1
  66. package/lib/icons/fontawesome/solid.js +0 -8
  67. package/lib/icons/heroicons/micro.d.ts +0 -1
  68. package/lib/icons/heroicons/micro.js +0 -8
  69. package/lib/icons/heroicons/mini.d.ts +0 -1
  70. package/lib/icons/heroicons/mini.js +0 -8
  71. package/lib/icons/heroicons/outline.d.ts +0 -1
  72. package/lib/icons/heroicons/outline.js +0 -8
  73. package/lib/icons/heroicons/solid.d.ts +0 -1
  74. package/lib/icons/heroicons/solid.js +0 -8
  75. package/lib/icons/lucide.d.ts +0 -1
  76. package/lib/icons/lucide.js +0 -1872
  77. package/lib/icons/material/filled.d.ts +0 -1
  78. package/lib/icons/material/filled.js +0 -10
  79. package/lib/icons/material/outlined.d.ts +0 -1
  80. package/lib/icons/material/outlined.js +0 -10
  81. package/lib/icons/material/round.d.ts +0 -1
  82. package/lib/icons/material/round.js +0 -10
  83. package/lib/icons/material/sharp.d.ts +0 -1
  84. package/lib/icons/material/sharp.js +0 -10
  85. package/lib/icons/material/two-tone.d.ts +0 -1
  86. package/lib/icons/material/two-tone.js +0 -10
  87. package/lib/index.d.ts +0 -1
  88. package/lib/index.js +0 -20
  89. package/lib/styles/button.d.ts +2 -20
  90. package/lib/styles/button.js +22 -122
  91. package/lib/styles/calendar-month.d.ts +1 -5
  92. package/lib/styles/calendar-month.js +4 -61
  93. package/lib/styles/calendar-navigation.d.ts +2 -6
  94. package/lib/styles/calendar-navigation.js +2 -27
  95. package/lib/styles/calendar.d.ts +1 -2
  96. package/lib/styles/calendar.js +1 -14
  97. package/lib/styles/checkbox.d.ts +0 -1
  98. package/lib/styles/checkbox.js +1 -23
  99. package/lib/styles/copy.d.ts +0 -1
  100. package/lib/styles/copy.js +2 -17
  101. package/lib/styles/custom-scrollbar.d.ts +1 -2
  102. package/lib/styles/custom-scrollbar.js +3 -18
  103. package/lib/styles/date-picker.d.ts +1 -5
  104. package/lib/styles/date-picker.js +35 -39
  105. package/lib/styles/file-upload.d.ts +1 -2
  106. package/lib/styles/file-upload.js +1 -16
  107. package/lib/styles/icon.d.ts +2 -6
  108. package/lib/styles/icon.js +7 -21
  109. package/lib/styles/input.d.ts +1 -6
  110. package/lib/styles/input.js +5 -54
  111. package/lib/styles/modal.d.ts +1 -2
  112. package/lib/styles/modal.js +21 -23
  113. package/lib/styles/option.d.ts +2 -6
  114. package/lib/styles/option.js +17 -12
  115. package/lib/styles/popup.d.ts +1 -2
  116. package/lib/styles/popup.js +26 -30
  117. package/lib/styles/radio.d.ts +0 -1
  118. package/lib/styles/radio.js +2 -16
  119. package/lib/styles/resize-observer.d.ts +1 -2
  120. package/lib/styles/resize-observer.js +0 -7
  121. package/lib/styles/scroll-container.d.ts +1 -2
  122. package/lib/styles/scroll-container.js +0 -19
  123. package/lib/styles/select-base.d.ts +0 -1
  124. package/lib/styles/select-base.js +68 -79
  125. package/lib/styles/select.d.ts +1 -2
  126. package/lib/styles/select.js +7 -15
  127. package/lib/styles/step.d.ts +1 -2
  128. package/lib/styles/step.js +0 -4
  129. package/lib/styles/switch.d.ts +0 -1
  130. package/lib/styles/switch.js +2 -20
  131. package/lib/styles/tab.d.ts +1 -2
  132. package/lib/styles/tab.js +0 -5
  133. package/lib/styles/tabs.d.ts +3 -11
  134. package/lib/styles/tabs.js +10 -48
  135. package/lib/styles/tag.d.ts +1 -5
  136. package/lib/styles/tag.js +2 -31
  137. package/lib/styles/textarea.d.ts +1 -2
  138. package/lib/styles/textarea.js +2 -45
  139. package/lib/styles/tooltip.d.ts +0 -1
  140. package/lib/styles/tooltip.js +0 -10
  141. package/lib/styles/wizard.d.ts +5 -21
  142. package/lib/styles/wizard.js +8 -88
  143. package/lib/types/common.d.ts +0 -2
  144. package/lib/types/common.js +0 -12
  145. package/lib/utils/calendar-utils.d.ts +4 -21
  146. package/lib/utils/calendar-utils.js +4 -177
  147. package/lib/utils/custom-scrollbar.d.ts +6 -20
  148. package/lib/utils/custom-scrollbar.js +1 -45
  149. package/lib/utils/flavor-sheet.d.ts +0 -1
  150. package/lib/utils/flavor-sheet.js +0 -23
  151. package/lib/utils/icon-registry.d.ts +0 -2
  152. package/lib/utils/icon-registry.js +1 -107
  153. package/lib/utils/icons.d.ts +0 -1
  154. package/lib/utils/icons.js +0 -9
  155. package/lib/utils/loader-registry.d.ts +0 -1
  156. package/lib/utils/loader-registry.js +0 -32
  157. package/lib/utils/locale.d.ts +2 -23
  158. package/lib/utils/locale.js +0 -86
  159. package/lib/utils/mobile.d.ts +0 -1
  160. package/lib/utils/mobile.js +0 -17
  161. package/lib/utils/number-format.d.ts +6 -3
  162. package/lib/utils/number-format.js +11 -67
  163. package/lib/utils/positioning.d.ts +50 -7
  164. package/lib/utils/positioning.js +52 -62
  165. package/lib/utils/property-capture.d.ts +5 -27
  166. package/lib/utils/property-capture.js +0 -108
  167. package/lib/utils/property-manager.d.ts +0 -1
  168. package/lib/utils/property-manager.js +0 -70
  169. package/lib/utils/resize-observer.d.ts +0 -1
  170. package/lib/utils/resize-observer.js +0 -36
  171. package/lib/utils/scroll-lock.d.ts +4 -11
  172. package/lib/utils/scroll-lock.js +0 -107
  173. package/lib/utils/styles.d.ts +0 -1
  174. package/lib/utils/styles.js +0 -24
  175. package/lib/version.d.ts +1 -2
  176. package/lib/version.js +1 -11
  177. package/package.json +2 -2
  178. package/lib/base/ty-component.d.ts.map +0 -1
  179. package/lib/base/ty-component.js.map +0 -1
  180. package/lib/components/button.d.ts.map +0 -1
  181. package/lib/components/button.js.map +0 -1
  182. package/lib/components/calendar-month.d.ts.map +0 -1
  183. package/lib/components/calendar-month.js.map +0 -1
  184. package/lib/components/calendar-navigation.d.ts.map +0 -1
  185. package/lib/components/calendar-navigation.js.map +0 -1
  186. package/lib/components/calendar.d.ts.map +0 -1
  187. package/lib/components/calendar.js.map +0 -1
  188. package/lib/components/checkbox.d.ts.map +0 -1
  189. package/lib/components/checkbox.js.map +0 -1
  190. package/lib/components/copy.d.ts.map +0 -1
  191. package/lib/components/copy.js.map +0 -1
  192. package/lib/components/date-picker.d.ts.map +0 -1
  193. package/lib/components/date-picker.js.map +0 -1
  194. package/lib/components/file-upload.d.ts.map +0 -1
  195. package/lib/components/file-upload.js.map +0 -1
  196. package/lib/components/icon.d.ts.map +0 -1
  197. package/lib/components/icon.js.map +0 -1
  198. package/lib/components/input.d.ts.map +0 -1
  199. package/lib/components/input.js.map +0 -1
  200. package/lib/components/modal.d.ts.map +0 -1
  201. package/lib/components/modal.js.map +0 -1
  202. package/lib/components/option.d.ts.map +0 -1
  203. package/lib/components/option.js.map +0 -1
  204. package/lib/components/popup.d.ts.map +0 -1
  205. package/lib/components/popup.js.map +0 -1
  206. package/lib/components/radio.d.ts.map +0 -1
  207. package/lib/components/radio.js.map +0 -1
  208. package/lib/components/resize-observer.d.ts.map +0 -1
  209. package/lib/components/resize-observer.js.map +0 -1
  210. package/lib/components/scroll-container.d.ts.map +0 -1
  211. package/lib/components/scroll-container.js.map +0 -1
  212. package/lib/components/select.d.ts.map +0 -1
  213. package/lib/components/select.js.map +0 -1
  214. package/lib/components/selected-tags.d.ts.map +0 -1
  215. package/lib/components/selected-tags.js.map +0 -1
  216. package/lib/components/step.d.ts.map +0 -1
  217. package/lib/components/step.js.map +0 -1
  218. package/lib/components/switch.d.ts.map +0 -1
  219. package/lib/components/switch.js.map +0 -1
  220. package/lib/components/tab.d.ts.map +0 -1
  221. package/lib/components/tab.js.map +0 -1
  222. package/lib/components/tabs.d.ts.map +0 -1
  223. package/lib/components/tabs.js.map +0 -1
  224. package/lib/components/tag.d.ts.map +0 -1
  225. package/lib/components/tag.js.map +0 -1
  226. package/lib/components/textarea.d.ts.map +0 -1
  227. package/lib/components/textarea.js.map +0 -1
  228. package/lib/components/tooltip.d.ts.map +0 -1
  229. package/lib/components/tooltip.js.map +0 -1
  230. package/lib/components/wizard.d.ts.map +0 -1
  231. package/lib/components/wizard.js.map +0 -1
  232. package/lib/icons/fontawesome/brands.d.ts.map +0 -1
  233. package/lib/icons/fontawesome/brands.js.map +0 -1
  234. package/lib/icons/fontawesome/regular.d.ts.map +0 -1
  235. package/lib/icons/fontawesome/regular.js.map +0 -1
  236. package/lib/icons/fontawesome/solid.d.ts.map +0 -1
  237. package/lib/icons/fontawesome/solid.js.map +0 -1
  238. package/lib/icons/heroicons/micro.d.ts.map +0 -1
  239. package/lib/icons/heroicons/micro.js.map +0 -1
  240. package/lib/icons/heroicons/mini.d.ts.map +0 -1
  241. package/lib/icons/heroicons/mini.js.map +0 -1
  242. package/lib/icons/heroicons/outline.d.ts.map +0 -1
  243. package/lib/icons/heroicons/outline.js.map +0 -1
  244. package/lib/icons/heroicons/solid.d.ts.map +0 -1
  245. package/lib/icons/heroicons/solid.js.map +0 -1
  246. package/lib/icons/lucide.d.ts.map +0 -1
  247. package/lib/icons/lucide.js.map +0 -1
  248. package/lib/icons/material/filled.d.ts.map +0 -1
  249. package/lib/icons/material/filled.js.map +0 -1
  250. package/lib/icons/material/outlined.d.ts.map +0 -1
  251. package/lib/icons/material/outlined.js.map +0 -1
  252. package/lib/icons/material/round.d.ts.map +0 -1
  253. package/lib/icons/material/round.js.map +0 -1
  254. package/lib/icons/material/sharp.d.ts.map +0 -1
  255. package/lib/icons/material/sharp.js.map +0 -1
  256. package/lib/icons/material/two-tone.d.ts.map +0 -1
  257. package/lib/icons/material/two-tone.js.map +0 -1
  258. package/lib/index.d.ts.map +0 -1
  259. package/lib/index.js.map +0 -1
  260. package/lib/styles/button.d.ts.map +0 -1
  261. package/lib/styles/button.js.map +0 -1
  262. package/lib/styles/calendar-month.d.ts.map +0 -1
  263. package/lib/styles/calendar-month.js.map +0 -1
  264. package/lib/styles/calendar-navigation.d.ts.map +0 -1
  265. package/lib/styles/calendar-navigation.js.map +0 -1
  266. package/lib/styles/calendar.d.ts.map +0 -1
  267. package/lib/styles/calendar.js.map +0 -1
  268. package/lib/styles/checkbox.d.ts.map +0 -1
  269. package/lib/styles/checkbox.js.map +0 -1
  270. package/lib/styles/copy.d.ts.map +0 -1
  271. package/lib/styles/copy.js.map +0 -1
  272. package/lib/styles/custom-scrollbar.d.ts.map +0 -1
  273. package/lib/styles/custom-scrollbar.js.map +0 -1
  274. package/lib/styles/date-picker.d.ts.map +0 -1
  275. package/lib/styles/date-picker.js.map +0 -1
  276. package/lib/styles/file-upload.d.ts.map +0 -1
  277. package/lib/styles/file-upload.js.map +0 -1
  278. package/lib/styles/icon.d.ts.map +0 -1
  279. package/lib/styles/icon.js.map +0 -1
  280. package/lib/styles/input.d.ts.map +0 -1
  281. package/lib/styles/input.js.map +0 -1
  282. package/lib/styles/modal.d.ts.map +0 -1
  283. package/lib/styles/modal.js.map +0 -1
  284. package/lib/styles/multiselect.d.ts +0 -8
  285. package/lib/styles/multiselect.d.ts.map +0 -1
  286. package/lib/styles/multiselect.js +0 -849
  287. package/lib/styles/multiselect.js.map +0 -1
  288. package/lib/styles/option.d.ts.map +0 -1
  289. package/lib/styles/option.js.map +0 -1
  290. package/lib/styles/popup.d.ts.map +0 -1
  291. package/lib/styles/popup.js.map +0 -1
  292. package/lib/styles/radio.d.ts.map +0 -1
  293. package/lib/styles/radio.js.map +0 -1
  294. package/lib/styles/resize-observer.d.ts.map +0 -1
  295. package/lib/styles/resize-observer.js.map +0 -1
  296. package/lib/styles/scroll-container.d.ts.map +0 -1
  297. package/lib/styles/scroll-container.js.map +0 -1
  298. package/lib/styles/select-base.d.ts.map +0 -1
  299. package/lib/styles/select-base.js.map +0 -1
  300. package/lib/styles/select.d.ts.map +0 -1
  301. package/lib/styles/select.js.map +0 -1
  302. package/lib/styles/step.d.ts.map +0 -1
  303. package/lib/styles/step.js.map +0 -1
  304. package/lib/styles/switch.d.ts.map +0 -1
  305. package/lib/styles/switch.js.map +0 -1
  306. package/lib/styles/tab.d.ts.map +0 -1
  307. package/lib/styles/tab.js.map +0 -1
  308. package/lib/styles/tabs.d.ts.map +0 -1
  309. package/lib/styles/tabs.js.map +0 -1
  310. package/lib/styles/tag.d.ts.map +0 -1
  311. package/lib/styles/tag.js.map +0 -1
  312. package/lib/styles/textarea.d.ts.map +0 -1
  313. package/lib/styles/textarea.js.map +0 -1
  314. package/lib/styles/tooltip.d.ts.map +0 -1
  315. package/lib/styles/tooltip.js.map +0 -1
  316. package/lib/styles/wizard.d.ts.map +0 -1
  317. package/lib/styles/wizard.js.map +0 -1
  318. package/lib/types/common.d.ts.map +0 -1
  319. package/lib/types/common.js.map +0 -1
  320. package/lib/utils/calendar-utils.d.ts.map +0 -1
  321. package/lib/utils/calendar-utils.js.map +0 -1
  322. package/lib/utils/custom-scrollbar.d.ts.map +0 -1
  323. package/lib/utils/custom-scrollbar.js.map +0 -1
  324. package/lib/utils/flavor-sheet.d.ts.map +0 -1
  325. package/lib/utils/flavor-sheet.js.map +0 -1
  326. package/lib/utils/icon-registry.d.ts.map +0 -1
  327. package/lib/utils/icon-registry.js.map +0 -1
  328. package/lib/utils/icons.d.ts.map +0 -1
  329. package/lib/utils/icons.js.map +0 -1
  330. package/lib/utils/loader-registry.d.ts.map +0 -1
  331. package/lib/utils/loader-registry.js.map +0 -1
  332. package/lib/utils/locale.d.ts.map +0 -1
  333. package/lib/utils/locale.js.map +0 -1
  334. package/lib/utils/mobile.d.ts.map +0 -1
  335. package/lib/utils/mobile.js.map +0 -1
  336. package/lib/utils/number-format.d.ts.map +0 -1
  337. package/lib/utils/number-format.js.map +0 -1
  338. package/lib/utils/parse-boolean.d.ts +0 -39
  339. package/lib/utils/parse-boolean.d.ts.map +0 -1
  340. package/lib/utils/parse-boolean.js +0 -58
  341. package/lib/utils/parse-boolean.js.map +0 -1
  342. package/lib/utils/positioning.d.ts.map +0 -1
  343. package/lib/utils/positioning.js.map +0 -1
  344. package/lib/utils/property-capture.d.ts.map +0 -1
  345. package/lib/utils/property-capture.js.map +0 -1
  346. package/lib/utils/property-manager.d.ts.map +0 -1
  347. package/lib/utils/property-manager.js.map +0 -1
  348. package/lib/utils/resize-observer.d.ts.map +0 -1
  349. package/lib/utils/resize-observer.js.map +0 -1
  350. package/lib/utils/scroll-lock.d.ts.map +0 -1
  351. package/lib/utils/scroll-lock.js.map +0 -1
  352. package/lib/utils/styles.d.ts.map +0 -1
  353. package/lib/utils/styles.js.map +0 -1
  354. package/lib/version.d.ts.map +0 -1
  355. package/lib/version.js.map +0 -1
@@ -1,18 +1,7 @@
1
1
  /**
2
- * TyFileUpload Web Component
3
- *
4
- * Drop zone + file picker primitive. Replaces `<input type="file">` with
5
- * a styleable, drag-and-drop-capable equivalent that works everywhere.
6
- *
7
- * - Click to browse or drag-and-drop
8
- * - Multiple file support
9
- * - Accept filter passed to the underlying file input
10
- * - Emits `change` with `{ files, names }` on every selection
11
- * - Form-associated: participates in FormData and form.reset()
12
- *
13
- * @example
14
- * <ty-file-upload name="avatar" accept="image/*" label="Profile photo"></ty-file-upload>
15
- * <ty-file-upload name="docs" multiple accept=".pdf,.docx" label="Attachments"></ty-file-upload>
2
+ * TyFileUpload Web Component — drop zone + file picker primitive. Replaces
3
+ * `<input type="file">` with a styleable, drag-and-drop-capable equivalent.
4
+ * Form-associated: participates in FormData and form.reset().
16
5
  */
17
6
  import { TyComponent } from "../base/ty-component.js";
18
7
  import type { PropertyChange } from "../utils/property-manager.js";
@@ -91,6 +80,12 @@ export declare class TyFileUpload extends TyComponent<FileUploadState> implement
91
80
  protected onPropertiesChanged(_changes: PropertyChange[]): void;
92
81
  protected onFormReset(): void;
93
82
  protected getFormValue(): FormData | string | null;
83
+ /**
84
+ * Match a file against the `accept` attribute the way native inputs do:
85
+ * comma-separated list of `.ext`, `type/subtype` or `type/*` entries.
86
+ * No/blank accept matches everything.
87
+ */
88
+ private matchesAccept;
94
89
  get files(): File[];
95
90
  get multiple(): boolean;
96
91
  set multiple(v: boolean);
@@ -118,4 +113,3 @@ export declare class TyFileUpload extends TyComponent<FileUploadState> implement
118
113
  protected render(): void;
119
114
  }
120
115
  export {};
121
- //# sourceMappingURL=file-upload.d.ts.map
@@ -1,19 +1,3 @@
1
- /**
2
- * TyFileUpload Web Component
3
- *
4
- * Drop zone + file picker primitive. Replaces `<input type="file">` with
5
- * a styleable, drag-and-drop-capable equivalent that works everywhere.
6
- *
7
- * - Click to browse or drag-and-drop
8
- * - Multiple file support
9
- * - Accept filter passed to the underlying file input
10
- * - Emits `change` with `{ files, names }` on every selection
11
- * - Form-associated: participates in FormData and form.reset()
12
- *
13
- * @example
14
- * <ty-file-upload name="avatar" accept="image/*" label="Profile photo"></ty-file-upload>
15
- * <ty-file-upload name="docs" multiple accept=".pdf,.docx" label="Attachments"></ty-file-upload>
16
- */
17
1
  import { TyComponent } from "../base/ty-component.js";
18
2
  import { ensureStyles } from "../utils/styles.js";
19
3
  import { fileUploadStyles } from "../styles/file-upload.js";
@@ -60,18 +44,30 @@ export class TyFileUpload extends TyComponent {
60
44
  fileInput.value = "";
61
45
  }
62
46
  getFormValue() {
63
- if (this._files.length === 0)
47
+ if (this._files.length === 0 || !this.name)
64
48
  return null;
65
49
  const fd = new FormData();
66
- const fieldName = this.name || "files";
67
50
  for (const file of this._files) {
68
- fd.append(fieldName, file);
51
+ fd.append(this.name, file);
69
52
  }
70
53
  return fd;
71
54
  }
72
- // ============================================================================
73
- // PUBLIC API
74
- // ============================================================================
55
+ matchesAccept(file) {
56
+ const accept = this.accept?.trim();
57
+ if (!accept)
58
+ return true;
59
+ return accept.split(",").some((raw) => {
60
+ const entry = raw.trim().toLowerCase();
61
+ if (!entry)
62
+ return false;
63
+ if (entry.startsWith("."))
64
+ return file.name.toLowerCase().endsWith(entry);
65
+ const type = file.type.toLowerCase();
66
+ if (entry.endsWith("/*"))
67
+ return type.startsWith(entry.slice(0, -1));
68
+ return type === entry;
69
+ });
70
+ }
75
71
  get files() {
76
72
  return [...this._files];
77
73
  }
@@ -126,9 +122,6 @@ export class TyFileUpload extends TyComponent {
126
122
  get form() {
127
123
  return this._internals.form;
128
124
  }
129
- // ============================================================================
130
- // INTERNAL FILE MANAGEMENT
131
- // ============================================================================
132
125
  setFiles(newFiles) {
133
126
  this._files = this.multiple ? newFiles : newFiles.slice(0, 1);
134
127
  this.updateFormValue();
@@ -150,9 +143,6 @@ export class TyFileUpload extends TyComponent {
150
143
  if (fileInput)
151
144
  fileInput.value = "";
152
145
  }
153
- // ============================================================================
154
- // EVENT LISTENERS
155
- // ============================================================================
156
146
  setupEventListeners() {
157
147
  if (this._listenersSetup)
158
148
  return;
@@ -203,7 +193,7 @@ export class TyFileUpload extends TyComponent {
203
193
  e.stopPropagation();
204
194
  this._isDragging = false;
205
195
  dropZone.classList.remove("drag-active");
206
- const files = Array.from(e.dataTransfer?.files ?? []);
196
+ const files = Array.from(e.dataTransfer?.files ?? []).filter((f) => this.matchesAccept(f));
207
197
  if (files.length > 0)
208
198
  this.setFiles(files);
209
199
  };
@@ -251,9 +241,6 @@ export class TyFileUpload extends TyComponent {
251
241
  fileInput.removeEventListener("change", this._inputChangeHandler);
252
242
  this._listenersSetup = false;
253
243
  }
254
- // ============================================================================
255
- // RENDERING
256
- // ============================================================================
257
244
  buildDropZoneClasses() {
258
245
  const classes = ["drop-zone"];
259
246
  if (this._isDragging)
@@ -336,7 +323,6 @@ export class TyFileUpload extends TyComponent {
336
323
  shadow.appendChild(container);
337
324
  this.setupEventListeners();
338
325
  }
339
- // Label
340
326
  const labelEl = container.querySelector(".upload-label");
341
327
  if (this.label) {
342
328
  labelEl.style.display = "";
@@ -353,21 +339,17 @@ export class TyFileUpload extends TyComponent {
353
339
  else {
354
340
  labelEl.style.display = "none";
355
341
  }
356
- // Drop zone
357
342
  const dropZone = container.querySelector(".drop-zone");
358
343
  dropZone.className = this.buildDropZoneClasses();
359
344
  dropZone.tabIndex = this.disabled ? -1 : 0;
360
345
  dropZone.setAttribute("aria-disabled", String(this.disabled));
361
346
  dropZone.setAttribute("aria-label", this.placeholder || "Upload files");
362
- // File input
363
347
  const fileInput = container.querySelector(".file-input");
364
348
  fileInput.multiple = this.multiple;
365
349
  fileInput.accept = this.accept;
366
350
  fileInput.disabled = this.disabled;
367
- // Upload icon — hide once files are selected to give room to the compact zone
368
351
  const uploadIcon = container.querySelector(".upload-icon");
369
352
  uploadIcon.style.display = this._files.length > 0 ? "none" : "";
370
- // Hint text
371
353
  const hintEl = container.querySelector(".upload-hint");
372
354
  if (this._files.length > 0) {
373
355
  hintEl.innerHTML = `<strong>${this._files.length} file${this._files.length !== 1 ? "s" : ""} selected</strong>`;
@@ -375,7 +357,6 @@ export class TyFileUpload extends TyComponent {
375
357
  else {
376
358
  hintEl.innerHTML = `Drop files here or <span class="browse-link">click to browse</span>`;
377
359
  }
378
- // Sub-hint
379
360
  const subHintEl = container.querySelector(".upload-sub-hint");
380
361
  if (this.accept && this._files.length === 0) {
381
362
  subHintEl.textContent = `Accepted: ${this.accept}`;
@@ -384,10 +365,8 @@ export class TyFileUpload extends TyComponent {
384
365
  else {
385
366
  subHintEl.style.display = "none";
386
367
  }
387
- // File list
388
368
  const fileList = container.querySelector(".file-list");
389
369
  this.renderFileList(fileList);
390
- // Error message
391
370
  const errorEl = container.querySelector(".error-message");
392
371
  errorEl.textContent = this.error;
393
372
  errorEl.style.display = this.error ? "" : "none";
@@ -438,4 +417,3 @@ TyFileUpload.properties = {
438
417
  if (!customElements.get("ty-file-upload")) {
439
418
  customElements.define("ty-file-upload", TyFileUpload);
440
419
  }
441
- //# sourceMappingURL=file-upload.js.map
@@ -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,101 +1,49 @@
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
7
  viewBox="0 0 512 512"
14
8
  fill="currentColor"
15
9
  opacity="0.2">
16
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
13
  constructor() {
30
- super(); // TyComponent handles attachInternals() and attachShadow()
31
- // ============================================================================
32
- // INTERNAL STATE - Not managed by PropertyManager
33
- // ============================================================================
14
+ super();
34
15
  this._watchId = null;
35
- /** Track currently rendered SVG to avoid unnecessary re-renders */
36
16
  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
17
  this._slot = null;
46
- // Apply styles to shadow root
47
18
  ensureStyles(this.shadowRoot, { css: iconStyles, id: 'ty-icon' });
48
- // Build the slot once. Fallback content shows when no light-DOM children are slotted.
49
19
  this._slot = document.createElement('slot');
50
20
  this._slot.innerHTML = NOT_FOUND_ICON;
51
21
  this._currentSvg = NOT_FOUND_ICON;
52
22
  this.shadowRoot.appendChild(this._slot);
53
23
  }
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
24
  onConnect() {
62
- // Generate unique watch ID
63
25
  this._watchId = `ty-icon-${++_iconIdCounter}`;
64
- // Watch for registry changes that affect this icon
65
26
  if (this.name) {
66
27
  IconRegistry.addWatcher(this._watchId, this.name, (changedIcons) => {
67
- // Re-render if our icon changed
68
28
  if (this.name && changedIcons.has(this.name)) {
69
29
  this.render();
70
30
  }
71
31
  });
72
32
  }
73
- // Update host element classes
74
33
  this.updateClasses();
75
- // TyComponent will call render() automatically after this hook
76
34
  }
77
- /**
78
- * Called when component disconnects from DOM
79
- */
80
35
  onDisconnect() {
81
- // Clean up watcher
82
36
  if (this._watchId) {
83
37
  IconRegistry.removeWatcher(this._watchId);
84
38
  this._watchId = null;
85
39
  }
86
40
  }
87
- /**
88
- * Handle property changes - called BEFORE render
89
- * Detects name changes to update icon registry watcher
90
- */
91
41
  onPropertiesChanged(changes) {
92
42
  for (const change of changes) {
93
43
  if (change.name === 'name') {
94
- // Remove old watcher
95
44
  if (this._watchId) {
96
45
  IconRegistry.removeWatcher(this._watchId);
97
46
  }
98
- // Re-add watcher for new name
99
47
  const newName = change.newValue || '';
100
48
  if (newName && this.isConnected) {
101
49
  this._watchId = `ty-icon-${++_iconIdCounter}`;
@@ -107,12 +55,8 @@ export class TyIcon extends TyComponent {
107
55
  }
108
56
  }
109
57
  }
110
- // Update host element classes for any visual change
111
58
  this.updateClasses();
112
59
  }
113
- // ============================================================================
114
- // PROPERTY ACCESSORS - Simple wrappers (no logic!)
115
- // ============================================================================
116
60
  get name() {
117
61
  return this.getProperty('name');
118
62
  }
@@ -145,32 +89,23 @@ export class TyIcon extends TyComponent {
145
89
  set tempo(value) {
146
90
  this.setProperty('tempo', value || '');
147
91
  }
148
- // ============================================================================
149
- // RENDERING
150
- // ============================================================================
151
- /** Build CSS classes for the host element */
152
92
  buildClasses() {
153
93
  const classes = [];
154
- // Size class
155
94
  const size = this.getProperty('size');
156
95
  if (size) {
157
96
  classes.push(`icon-${size}`);
158
97
  }
159
- // Animation classes
160
98
  if (this.getProperty('spin')) {
161
99
  classes.push('icon-spin');
162
100
  }
163
101
  if (this.getProperty('pulse')) {
164
102
  classes.push('icon-pulse');
165
103
  }
166
- // Tempo class
167
104
  const tempo = this.getProperty('tempo');
168
105
  if (tempo && (this.getProperty('spin') || this.getProperty('pulse'))) {
169
106
  classes.push(`icon-tempo-${tempo}`);
170
107
  }
171
- // Preserve user-added classes that don't conflict
172
108
  const currentClasses = this.className.split(/\s+/).filter(cls => {
173
- // Filter out component-managed classes
174
109
  return cls &&
175
110
  !cls.startsWith('icon-') &&
176
111
  cls !== 'icon-spin' &&
@@ -178,29 +113,18 @@ export class TyIcon extends TyComponent {
178
113
  });
179
114
  return [...classes, ...currentClasses];
180
115
  }
181
- /** Update host element classes */
182
116
  updateClasses() {
183
117
  const newClasses = this.buildClasses().join(' ');
184
118
  if (this.className !== newClasses) {
185
119
  this.className = newClasses;
186
120
  }
187
121
  }
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
122
  render() {
198
123
  const name = this.getProperty('name');
199
124
  if (!name) {
200
125
  this.renderSvg(NOT_FOUND_ICON);
201
126
  return;
202
127
  }
203
- // Fast path: Check memory registry first
204
128
  const memorySvg = IconRegistry.getIcon(name);
205
129
  if (memorySvg) {
206
130
  this.renderSvg(memorySvg);
@@ -208,14 +132,7 @@ export class TyIcon extends TyComponent {
208
132
  }
209
133
  this.renderSvg(NOT_FOUND_ICON);
210
134
  }
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
135
  renderSvg(svg) {
218
- // Only render if content actually changed
219
136
  if (this._currentSvg === svg) {
220
137
  return;
221
138
  }
@@ -226,9 +143,6 @@ export class TyIcon extends TyComponent {
226
143
  }
227
144
  }
228
145
  TyIcon.formAssociated = false;
229
- // ============================================================================
230
- // PROPERTY CONFIGURATION - Declarative property lifecycle
231
- // ============================================================================
232
146
  TyIcon.properties = {
233
147
  name: { type: 'string', visual: true, default: '' },
234
148
  size: { type: 'string', visual: true, default: '' },
@@ -236,10 +150,7 @@ TyIcon.properties = {
236
150
  pulse: { type: 'boolean', visual: true, default: false },
237
151
  tempo: { type: 'string', visual: true, default: '' },
238
152
  };
239
- // Register the custom element
240
153
  if (!customElements.get('ty-icon')) {
241
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;
@@ -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