@cdevhub/ngx-tw 0.2.1 → 0.3.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 (139) hide show
  1. package/README.md +264 -49
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +11 -7
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-alert.mjs +43 -29
  5. package/fesm2022/cdevhub-ngx-tw-alert.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs +103 -0
  7. package/fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs.map +1 -0
  8. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +56 -31
  9. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-badge.mjs +61 -35
  11. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +154 -93
  13. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-button.mjs +24 -15
  15. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +3 -3
  17. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +408 -215
  19. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-card.mjs +33 -24
  21. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +144 -79
  23. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +99 -47
  25. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +34 -20
  27. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +46 -29
  29. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +195 -110
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +140 -73
  33. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  34. package/fesm2022/cdevhub-ngx-tw-core.mjs +16 -11
  35. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +393 -149
  37. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +305 -150
  39. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  40. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +56 -43
  41. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +51 -33
  43. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  44. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +905 -0
  45. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -0
  46. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +49 -26
  47. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  48. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +133 -74
  49. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs +2 -2
  51. package/fesm2022/cdevhub-ngx-tw-icon-lucide.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-icon.mjs +28 -17
  53. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  54. package/fesm2022/cdevhub-ngx-tw-input.mjs +37 -21
  55. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-item.mjs +33 -24
  57. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-menu.mjs +63 -48
  59. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +622 -0
  61. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -0
  62. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +137 -71
  63. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-popover.mjs +101 -46
  65. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +57 -30
  67. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  68. package/fesm2022/cdevhub-ngx-tw-radio.mjs +108 -57
  69. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +46 -26
  71. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-select.mjs +217 -122
  73. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-separator.mjs +21 -12
  75. package/fesm2022/cdevhub-ngx-tw-separator.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +58 -44
  77. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs +25 -14
  79. package/fesm2022/cdevhub-ngx-tw-skeleton.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-slider.mjs +155 -79
  81. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-sort.mjs +44 -25
  83. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  84. package/fesm2022/cdevhub-ngx-tw-spinner.mjs +29 -16
  85. package/fesm2022/cdevhub-ngx-tw-spinner.mjs.map +1 -1
  86. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -42
  87. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  88. package/fesm2022/cdevhub-ngx-tw-stat.mjs +107 -64
  89. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  90. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +113 -47
  91. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-switch.mjs +61 -32
  93. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +88 -42
  95. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-table.mjs +266 -118
  97. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +101 -51
  99. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +798 -0
  101. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -0
  102. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +11 -7
  103. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-theme.mjs +22 -14
  105. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +243 -95
  107. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +149 -82
  109. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-toast.mjs +89 -55
  111. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  112. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +50 -28
  113. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +1129 -0
  115. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -0
  116. package/fesm2022/cdevhub-ngx-tw-tree.mjs +554 -0
  117. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -0
  118. package/fesm2022/cdevhub-ngx-tw.mjs +7 -0
  119. package/fesm2022/cdevhub-ngx-tw.mjs.map +1 -1
  120. package/package.json +45 -20
  121. package/theme/index.css +10 -2
  122. package/types/cdevhub-ngx-tw-aspect-ratio.d.ts +40 -0
  123. package/types/cdevhub-ngx-tw-calendar.d.ts +39 -8
  124. package/types/cdevhub-ngx-tw-command-palette.d.ts +7 -0
  125. package/types/cdevhub-ngx-tw-date-picker.d.ts +36 -10
  126. package/types/cdevhub-ngx-tw-file-upload.d.ts +250 -0
  127. package/types/cdevhub-ngx-tw-form-field.d.ts +22 -3
  128. package/types/cdevhub-ngx-tw-icon-lucide.d.ts +21 -3
  129. package/types/cdevhub-ngx-tw-number-input.d.ts +130 -0
  130. package/types/cdevhub-ngx-tw-popover.d.ts +8 -0
  131. package/types/cdevhub-ngx-tw-stepper.d.ts +30 -2
  132. package/types/cdevhub-ngx-tw-tab-nav.d.ts +8 -0
  133. package/types/cdevhub-ngx-tw-table.d.ts +30 -1
  134. package/types/cdevhub-ngx-tw-tabs.d.ts +8 -0
  135. package/types/cdevhub-ngx-tw-tags-input.d.ts +217 -0
  136. package/types/cdevhub-ngx-tw-time-picker.d.ts +31 -6
  137. package/types/cdevhub-ngx-tw-transfer.d.ts +330 -0
  138. package/types/cdevhub-ngx-tw-tree.d.ts +189 -0
  139. package/types/cdevhub-ngx-tw.d.ts +7 -0
@@ -19,6 +19,7 @@ export * from '@cdevhub/ngx-tw/popover';
19
19
  export * from '@cdevhub/ngx-tw/dialog';
20
20
  export * from '@cdevhub/ngx-tw/command-palette';
21
21
  export * from '@cdevhub/ngx-tw/toast';
22
+ export * from '@cdevhub/ngx-tw/transfer';
22
23
  export * from '@cdevhub/ngx-tw/form-field';
23
24
  export * from '@cdevhub/ngx-tw/switch';
24
25
  export * from '@cdevhub/ngx-tw/checkbox';
@@ -26,6 +27,9 @@ export * from '@cdevhub/ngx-tw/radio';
26
27
  export * from '@cdevhub/ngx-tw/select';
27
28
  export * from '@cdevhub/ngx-tw/input';
28
29
  export * from '@cdevhub/ngx-tw/textarea';
30
+ export * from '@cdevhub/ngx-tw/file-upload';
31
+ export * from '@cdevhub/ngx-tw/number-input';
32
+ export * from '@cdevhub/ngx-tw/tags-input';
29
33
  export * from '@cdevhub/ngx-tw/spinner';
30
34
  export * from '@cdevhub/ngx-tw/progress-bar';
31
35
  export * from '@cdevhub/ngx-tw/skeleton';
@@ -47,6 +51,9 @@ export * from '@cdevhub/ngx-tw/stat';
47
51
  export * from '@cdevhub/ngx-tw/combobox';
48
52
  export * from '@cdevhub/ngx-tw/empty-state';
49
53
  export * from '@cdevhub/ngx-tw/sheet';
54
+ export * from '@cdevhub/ngx-tw/aspect-ratio';
55
+ export * from '@cdevhub/ngx-tw/tree';
56
+ export * from '@cdevhub/ngx-tw/theme';
50
57
 
51
58
  /*
52
59
  * Public API Surface of ngx-tw
@@ -1 +1 @@
1
- {"version":3,"file":"cdevhub-ngx-tw.mjs","sources":["../../../projects/ngx-tw/src/public-api.ts","../../../projects/ngx-tw/src/cdevhub-ngx-tw.ts"],"sourcesContent":["/*\n * Public API Surface of ngx-tw\n *\n * Consumers should use direct imports for tree-shaking:\n * import { ButtonDirective } from '@cdevhub/ngx-tw/button';\n */\n\nexport * from '@cdevhub/ngx-tw/core';\nexport * from '@cdevhub/ngx-tw/badge';\nexport * from '@cdevhub/ngx-tw/button';\nexport * from '@cdevhub/ngx-tw/card';\nexport * from '@cdevhub/ngx-tw/flip-card';\nexport * from '@cdevhub/ngx-tw/alert';\nexport * from '@cdevhub/ngx-tw/tabs';\nexport * from '@cdevhub/ngx-tw/tab-nav';\nexport * from '@cdevhub/ngx-tw/separator';\nexport * from '@cdevhub/ngx-tw/tooltip';\nexport * from '@cdevhub/ngx-tw/code-block';\nexport * from '@cdevhub/ngx-tw/segmented-control';\nexport * from '@cdevhub/ngx-tw/avatar';\nexport * from '@cdevhub/ngx-tw/menu';\nexport * from '@cdevhub/ngx-tw/icon';\nexport * from '@cdevhub/ngx-tw/collapsible';\nexport * from '@cdevhub/ngx-tw/accordion';\nexport * from '@cdevhub/ngx-tw/popover';\nexport * from '@cdevhub/ngx-tw/dialog';\nexport * from '@cdevhub/ngx-tw/command-palette';\nexport * from '@cdevhub/ngx-tw/toast';\nexport * from '@cdevhub/ngx-tw/form-field';\nexport * from '@cdevhub/ngx-tw/switch';\nexport * from '@cdevhub/ngx-tw/checkbox';\nexport * from '@cdevhub/ngx-tw/radio';\nexport * from '@cdevhub/ngx-tw/select';\nexport * from '@cdevhub/ngx-tw/input';\nexport * from '@cdevhub/ngx-tw/textarea';\nexport * from '@cdevhub/ngx-tw/spinner';\nexport * from '@cdevhub/ngx-tw/progress-bar';\nexport * from '@cdevhub/ngx-tw/skeleton';\nexport * from '@cdevhub/ngx-tw/calendar';\nexport * from '@cdevhub/ngx-tw/date-picker';\nexport * from '@cdevhub/ngx-tw/date-range-picker';\nexport * from '@cdevhub/ngx-tw/time-picker';\nexport * from '@cdevhub/ngx-tw/slider';\nexport * from '@cdevhub/ngx-tw/stepper';\nexport * from '@cdevhub/ngx-tw/paginator';\nexport * from '@cdevhub/ngx-tw/sort';\nexport * from '@cdevhub/ngx-tw/split';\nexport * from '@cdevhub/ngx-tw/table';\nexport * from '@cdevhub/ngx-tw/item';\nexport * from '@cdevhub/ngx-tw/breadcrumbs';\nexport * from '@cdevhub/ngx-tw/timeline';\nexport * from '@cdevhub/ngx-tw/carousel';\nexport * from '@cdevhub/ngx-tw/stat';\nexport * from '@cdevhub/ngx-tw/combobox';\nexport * from '@cdevhub/ngx-tw/empty-state';\nexport * from '@cdevhub/ngx-tw/sheet';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;;ACLH;;AAEG"}
1
+ {"version":3,"file":"cdevhub-ngx-tw.mjs","sources":["../../../projects/ngx-tw/src/public-api.ts","../../../projects/ngx-tw/src/cdevhub-ngx-tw.ts"],"sourcesContent":["/*\n * Public API Surface of ngx-tw\n *\n * Consumers should use direct imports for tree-shaking:\n * import { ButtonDirective } from '@cdevhub/ngx-tw/button';\n */\n\nexport * from '@cdevhub/ngx-tw/core';\nexport * from '@cdevhub/ngx-tw/badge';\nexport * from '@cdevhub/ngx-tw/button';\nexport * from '@cdevhub/ngx-tw/card';\nexport * from '@cdevhub/ngx-tw/flip-card';\nexport * from '@cdevhub/ngx-tw/alert';\nexport * from '@cdevhub/ngx-tw/tabs';\nexport * from '@cdevhub/ngx-tw/tab-nav';\nexport * from '@cdevhub/ngx-tw/separator';\nexport * from '@cdevhub/ngx-tw/tooltip';\nexport * from '@cdevhub/ngx-tw/code-block';\nexport * from '@cdevhub/ngx-tw/segmented-control';\nexport * from '@cdevhub/ngx-tw/avatar';\nexport * from '@cdevhub/ngx-tw/menu';\nexport * from '@cdevhub/ngx-tw/icon';\nexport * from '@cdevhub/ngx-tw/collapsible';\nexport * from '@cdevhub/ngx-tw/accordion';\nexport * from '@cdevhub/ngx-tw/popover';\nexport * from '@cdevhub/ngx-tw/dialog';\nexport * from '@cdevhub/ngx-tw/command-palette';\nexport * from '@cdevhub/ngx-tw/toast';\nexport * from '@cdevhub/ngx-tw/transfer';\nexport * from '@cdevhub/ngx-tw/form-field';\nexport * from '@cdevhub/ngx-tw/switch';\nexport * from '@cdevhub/ngx-tw/checkbox';\nexport * from '@cdevhub/ngx-tw/radio';\nexport * from '@cdevhub/ngx-tw/select';\nexport * from '@cdevhub/ngx-tw/input';\nexport * from '@cdevhub/ngx-tw/textarea';\nexport * from '@cdevhub/ngx-tw/file-upload';\nexport * from '@cdevhub/ngx-tw/number-input';\nexport * from '@cdevhub/ngx-tw/tags-input';\nexport * from '@cdevhub/ngx-tw/spinner';\nexport * from '@cdevhub/ngx-tw/progress-bar';\nexport * from '@cdevhub/ngx-tw/skeleton';\nexport * from '@cdevhub/ngx-tw/calendar';\nexport * from '@cdevhub/ngx-tw/date-picker';\nexport * from '@cdevhub/ngx-tw/date-range-picker';\nexport * from '@cdevhub/ngx-tw/time-picker';\nexport * from '@cdevhub/ngx-tw/slider';\nexport * from '@cdevhub/ngx-tw/stepper';\nexport * from '@cdevhub/ngx-tw/paginator';\nexport * from '@cdevhub/ngx-tw/sort';\nexport * from '@cdevhub/ngx-tw/split';\nexport * from '@cdevhub/ngx-tw/table';\nexport * from '@cdevhub/ngx-tw/item';\nexport * from '@cdevhub/ngx-tw/breadcrumbs';\nexport * from '@cdevhub/ngx-tw/timeline';\nexport * from '@cdevhub/ngx-tw/carousel';\nexport * from '@cdevhub/ngx-tw/stat';\nexport * from '@cdevhub/ngx-tw/combobox';\nexport * from '@cdevhub/ngx-tw/empty-state';\nexport * from '@cdevhub/ngx-tw/sheet';\nexport * from '@cdevhub/ngx-tw/aspect-ratio';\nexport * from '@cdevhub/ngx-tw/tree';\nexport * from '@cdevhub/ngx-tw/theme';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;AAKG;;ACLH;;AAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdevhub/ngx-tw",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Angular component library for Tailwind CSS v4 — accessible, signal-based, built on Angular CDK.",
5
5
  "keywords": [
6
6
  "angular",
@@ -24,26 +24,8 @@
24
24
  "bugs": {
25
25
  "url": "https://github.com/avs2001/ngx-tw/issues"
26
26
  },
27
- "peerDependencies": {
28
- "@angular/common": "^21.2.0",
29
- "@angular/core": "^21.2.0",
30
- "@angular/cdk": "^21.0.0",
31
- "tailwindcss": "^4.0.0",
32
- "tailwind-variants": "^0.3.0"
33
- },
34
- "dependencies": {
35
- "tslib": "^2.3.0"
36
- },
37
- "engines": {
38
- "node": ">=20.19.0 || >=22.12.0"
39
- },
40
- "sideEffects": false,
41
- "publishConfig": {
42
- "access": "public"
43
- },
44
- "module": "fesm2022/cdevhub-ngx-tw.mjs",
45
- "typings": "types/cdevhub-ngx-tw.d.ts",
46
27
  "exports": {
28
+ "./theme/*.css": "./theme/*.css",
47
29
  "./package.json": {
48
30
  "default": "./package.json"
49
31
  },
@@ -59,6 +41,10 @@
59
41
  "types": "./types/cdevhub-ngx-tw-alert.d.ts",
60
42
  "default": "./fesm2022/cdevhub-ngx-tw-alert.mjs"
61
43
  },
44
+ "./aspect-ratio": {
45
+ "types": "./types/cdevhub-ngx-tw-aspect-ratio.d.ts",
46
+ "default": "./fesm2022/cdevhub-ngx-tw-aspect-ratio.mjs"
47
+ },
62
48
  "./avatar": {
63
49
  "types": "./types/cdevhub-ngx-tw-avatar.d.ts",
64
50
  "default": "./fesm2022/cdevhub-ngx-tw-avatar.mjs"
@@ -135,6 +121,10 @@
135
121
  "types": "./types/cdevhub-ngx-tw-empty-state.d.ts",
136
122
  "default": "./fesm2022/cdevhub-ngx-tw-empty-state.mjs"
137
123
  },
124
+ "./file-upload": {
125
+ "types": "./types/cdevhub-ngx-tw-file-upload.d.ts",
126
+ "default": "./fesm2022/cdevhub-ngx-tw-file-upload.mjs"
127
+ },
138
128
  "./flip-card": {
139
129
  "types": "./types/cdevhub-ngx-tw-flip-card.d.ts",
140
130
  "default": "./fesm2022/cdevhub-ngx-tw-flip-card.mjs"
@@ -163,6 +153,10 @@
163
153
  "types": "./types/cdevhub-ngx-tw-menu.d.ts",
164
154
  "default": "./fesm2022/cdevhub-ngx-tw-menu.mjs"
165
155
  },
156
+ "./number-input": {
157
+ "types": "./types/cdevhub-ngx-tw-number-input.d.ts",
158
+ "default": "./fesm2022/cdevhub-ngx-tw-number-input.mjs"
159
+ },
166
160
  "./paginator": {
167
161
  "types": "./types/cdevhub-ngx-tw-paginator.d.ts",
168
162
  "default": "./fesm2022/cdevhub-ngx-tw-paginator.mjs"
@@ -239,6 +233,10 @@
239
233
  "types": "./types/cdevhub-ngx-tw-tabs.d.ts",
240
234
  "default": "./fesm2022/cdevhub-ngx-tw-tabs.mjs"
241
235
  },
236
+ "./tags-input": {
237
+ "types": "./types/cdevhub-ngx-tw-tags-input.d.ts",
238
+ "default": "./fesm2022/cdevhub-ngx-tw-tags-input.mjs"
239
+ },
242
240
  "./textarea": {
243
241
  "types": "./types/cdevhub-ngx-tw-textarea.d.ts",
244
242
  "default": "./fesm2022/cdevhub-ngx-tw-textarea.mjs"
@@ -262,7 +260,34 @@
262
260
  "./tooltip": {
263
261
  "types": "./types/cdevhub-ngx-tw-tooltip.d.ts",
264
262
  "default": "./fesm2022/cdevhub-ngx-tw-tooltip.mjs"
263
+ },
264
+ "./transfer": {
265
+ "types": "./types/cdevhub-ngx-tw-transfer.d.ts",
266
+ "default": "./fesm2022/cdevhub-ngx-tw-transfer.mjs"
267
+ },
268
+ "./tree": {
269
+ "types": "./types/cdevhub-ngx-tw-tree.d.ts",
270
+ "default": "./fesm2022/cdevhub-ngx-tw-tree.mjs"
265
271
  }
266
272
  },
273
+ "peerDependencies": {
274
+ "@angular/common": "^22.0.0",
275
+ "@angular/core": "^22.0.0",
276
+ "@angular/cdk": "^22.0.0",
277
+ "tailwindcss": "^4.0.0",
278
+ "tailwind-variants": "^0.3.0"
279
+ },
280
+ "dependencies": {
281
+ "tslib": "^2.3.0"
282
+ },
283
+ "engines": {
284
+ "node": "^22.22.3 || ^24.15.0 || >=26.0.0"
285
+ },
286
+ "sideEffects": false,
287
+ "publishConfig": {
288
+ "access": "public"
289
+ },
290
+ "module": "fesm2022/cdevhub-ngx-tw.mjs",
291
+ "typings": "types/cdevhub-ngx-tw.d.ts",
267
292
  "type": "module"
268
293
  }
package/theme/index.css CHANGED
@@ -25,8 +25,16 @@
25
25
  }
26
26
  }
27
27
 
28
- /* Scan library source for Tailwind class usage */
29
- @source "../src/**/*.ts";
28
+ /* ===== Library class scanning =====
29
+ Paths here resolve relative to THIS file's location in the *published*
30
+ package (`node_modules/@cdevhub/ngx-tw/theme/`), because that is the only
31
+ copy a consumer ever imports. The published tarball ships compiled bundles
32
+ (`fesm2022/*.mjs`) and no `.ts` source, and Tailwind v4 never auto-scans
33
+ `node_modules` — so without this line a consumer's build emits the semantic
34
+ tokens and base layer but *zero* component utilities, silently. Tailwind
35
+ does not error on a glob that matches nothing, so a wrong path here fails
36
+ invisibly — `npm run verify:package` is what guards it. */
37
+ @source "../fesm2022/**/*.mjs";
30
38
 
31
39
  /* ===== Slot-token utility safelist =====
32
40
  Components consume role slot utilities (`bg-info-soft`, `text-info-fg`, …)
@@ -0,0 +1,40 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /**
4
+ * Sets the native CSS `aspect-ratio` property on its host element, standardizing
5
+ * the `aspect-[16/9]` pattern consumers otherwise hand-roll across cards,
6
+ * thumbnails, video, and image grids.
7
+ *
8
+ * The directive sets **only** `aspect-ratio` — it does not set `width`,
9
+ * `display`, or any other layout property (matching Tailwind's `aspect-*`
10
+ * utility). Block-level hosts already fill their container width; for replaced
11
+ * elements (`<img>`, `<video>`) pair it with `w-full` / `object-cover` so the
12
+ * box has a definite cross-axis size.
13
+ *
14
+ * Purely presentational: it adds no `role` or `aria-*` and leaves the host
15
+ * media's own accessibility (`alt`, `aria-*`, `title`) untouched.
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <div twAspectRatio class="w-full bg-surface-muted"></div>
20
+ * <img twAspectRatio="16/9" class="w-full object-cover rounded-lg" [src]="thumb" alt="Preview" />
21
+ * <div [twAspectRatio]="4 / 3" class="w-full"></div>
22
+ * <video twAspectRatio="21:9" class="w-full" [src]="clip"></video>
23
+ * ```
24
+ */
25
+ declare class AspectRatioDirective {
26
+ /**
27
+ * Sets the host's aspect ratio. Accepts a unitless number (e.g. `1.7777`) or a
28
+ * ratio string using `/` or `:` (e.g. `'16/9'` or `'16:9'`). The value is
29
+ * normalized to CSS `'<w> / <h>'` form (a bare number `n` becomes `'n / 1'`).
30
+ * Invalid or non-positive values fall back to the default. Defaults to a
31
+ * square (`1 / 1`).
32
+ */
33
+ readonly twAspectRatio: _angular_core.InputSignal<string | number>;
34
+ /** The coerced, CSS-valid `aspect-ratio` value applied to the host. */
35
+ readonly ratio: _angular_core.Signal<string>;
36
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AspectRatioDirective, never>;
37
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AspectRatioDirective, "[twAspectRatio]", ["twAspectRatio"], { "twAspectRatio": { "alias": "twAspectRatio"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
38
+ }
39
+
40
+ export { AspectRatioDirective };
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Provider, InjectionToken, Type, OnInit, ModelSignal, InputSignal, TemplateRef, OutputEmitterRef, Signal, WritableSignal, EnvironmentProviders } from '@angular/core';
2
+ import { Provider, InjectionToken, Type, OnInit, InputSignal, WritableSignal, TemplateRef, OutputEmitterRef, Signal, ModelSignal, EnvironmentProviders } from '@angular/core';
3
3
  import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
4
4
  import { RangeBehaviorConfig } from '@cdevhub/ngx-tw/core';
5
5
  import { FormValueControl, ValidationError, WithOptionalFieldTree, DisabledReason } from '@angular/forms/signals';
@@ -523,12 +523,14 @@ declare class CalendarComponent<M extends CalendarMode = 'single', D = Date, TOu
523
523
  */
524
524
  private readonly localStrategies;
525
525
  /** Selection mode (§5). Changing this at runtime clears the value and emits `modeChange`. */
526
- readonly mode: ModelSignal<CalendarMode>;
526
+ readonly modeInput: InputSignal<CalendarMode>;
527
+ readonly mode: WritableSignal<CalendarMode>;
527
528
  /**
528
529
  * Consumer-bound value. Shape narrows by `M`: `D | null` for single,
529
530
  * `D[]` for multiple, `{ start; end }` for range.
530
531
  */
531
- readonly value: ModelSignal<CalendarValue<M, D>>;
532
+ readonly valueInput: InputSignal<CalendarValue<M, D>>;
533
+ readonly value: WritableSignal<CalendarValue<M, D>>;
532
534
  /** Anchor date for the displayed view. Defaults to today on mount. */
533
535
  readonly startAt: InputSignal<D | null>;
534
536
  /** Minimum selectable date. */
@@ -826,14 +828,43 @@ declare class CalendarComponent<M extends CalendarMode = 'single', D = Date, TOu
826
828
  clearSelection(): void;
827
829
  /** Resets to initial state — value + view + active date per `resetBehavior`. Phase 3 extends this with form-reset integration. */
828
830
  reset(): void;
829
- /** Revalidates constraints + cell filters (Phase 4 wires it). */
831
+ /**
832
+ * Re-runs validation against the current constraints and cell filters.
833
+ *
834
+ * Call this after mutating a constraint imperatively (rather than through an
835
+ * input binding), so the bound control's errors reflect the new rules.
836
+ */
830
837
  revalidate(): void;
831
- /** Opens the overlay. Phase 10 wires the CDK overlay; inline mode is a no-op. */
838
+ /**
839
+ * Opens the overlay.
840
+ *
841
+ * @deprecated Not implemented. `tw-calendar` is inline-only today; the overlay
842
+ * is part of the phased v1 cutover. Use `tw-date-picker` or
843
+ * `tw-date-range-picker` for an overlay-mounted calendar. Throws in dev mode.
844
+ */
832
845
  open(): void;
833
- /** Closes the overlay. */
846
+ /**
847
+ * Closes the overlay.
848
+ *
849
+ * @deprecated Not implemented — see {@link open}. Throws in dev mode.
850
+ */
834
851
  close(): void;
835
- /** Toggles the overlay. */
852
+ /**
853
+ * Toggles the overlay.
854
+ *
855
+ * @deprecated Not implemented — see {@link open}. Throws in dev mode.
856
+ */
836
857
  toggle(): void;
858
+ /**
859
+ * Fails loudly in development for the unimplemented overlay API.
860
+ *
861
+ * These three shipped as silent no-ops with JSDoc that described them as
862
+ * working ("Closes the overlay."), which Compodoc rendered straight into the
863
+ * published API table. A consumer calling `calendar.open()` got no overlay, no
864
+ * error, and no clue. Dev-mode throw turns that into an immediate, explainable
865
+ * failure while leaving production builds untouched.
866
+ */
867
+ private warnOverlayUnsupported;
837
868
  /** Imperatively focuses the currently active cell. */
838
869
  focusActiveCell(): void;
839
870
  /** @internal */
@@ -917,7 +948,7 @@ declare class CalendarComponent<M extends CalendarMode = 'single', D = Date, TOu
917
948
  /** Locale-aware long-form date format used in announcements (e.g. "Wednesday, April 15, 2026"). */
918
949
  private formatDate;
919
950
  static ɵfac: i0.ɵɵFactoryDeclaration<CalendarComponent<any, any, any>, never>;
920
- static ɵcmp: i0.ɵɵComponentDeclaration<CalendarComponent<any, any, any>, "tw-calendar", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "disabledDaysOfWeek": { "alias": "disabledDaysOfWeek"; "required": false; "isSignal": true; }; "constraints": { "alias": "constraints"; "required": false; "isSignal": true; }; "minRangeLength": { "alias": "minRangeLength"; "required": false; "isSignal": true; }; "maxRangeLength": { "alias": "maxRangeLength"; "required": false; "isSignal": true; }; "maxSelections": { "alias": "maxSelections"; "required": false; "isSignal": true; }; "maxSelectionBehavior": { "alias": "maxSelectionBehavior"; "required": false; "isSignal": true; }; "errorAriaDescribedBy": { "alias": "errorAriaDescribedBy"; "required": false; "isSignal": true; }; "rangeClickBehavior": { "alias": "rangeClickBehavior"; "required": false; "isSignal": true; }; "rangeBehavior": { "alias": "rangeBehavior"; "required": false; "isSignal": true; }; "dateClass": { "alias": "dateClass"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "monthColumns": { "alias": "monthColumns"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "resetBehavior": { "alias": "resetBehavior"; "required": false; "isSignal": true; }; "cellTemplate": { "alias": "cellTemplate"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "intl": { "alias": "intl"; "required": false; "isSignal": true; }; }, { "mode": "modeChange"; "value": "valueChange"; "valueChange": "valueChange"; "selectionStart": "selectionStart"; "rangePreview": "rangePreview"; "selectionComplete": "selectionComplete"; "selectionRestart": "selectionRestart"; "selectionCleared": "selectionCleared"; "selectionLimitReached": "selectionLimitReached"; "presetChange": "presetChange"; "viewChange": "viewChange"; "activeDateChange": "activeDateChange"; "monthChange": "monthChange"; "yearChange": "yearChange"; "cellClick": "cellClick"; "cellHover": "cellHover"; "modeChange": "modeChange"; }, never, ["[twCalendarPresets]"], true, never>;
951
+ static ɵcmp: i0.ɵɵComponentDeclaration<CalendarComponent<any, any, any>, "tw-calendar", never, { "modeInput": { "alias": "mode"; "required": false; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "startAt": { "alias": "startAt"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "disabledDates": { "alias": "disabledDates"; "required": false; "isSignal": true; }; "disabledDaysOfWeek": { "alias": "disabledDaysOfWeek"; "required": false; "isSignal": true; }; "constraints": { "alias": "constraints"; "required": false; "isSignal": true; }; "minRangeLength": { "alias": "minRangeLength"; "required": false; "isSignal": true; }; "maxRangeLength": { "alias": "maxRangeLength"; "required": false; "isSignal": true; }; "maxSelections": { "alias": "maxSelections"; "required": false; "isSignal": true; }; "maxSelectionBehavior": { "alias": "maxSelectionBehavior"; "required": false; "isSignal": true; }; "errorAriaDescribedBy": { "alias": "errorAriaDescribedBy"; "required": false; "isSignal": true; }; "rangeClickBehavior": { "alias": "rangeClickBehavior"; "required": false; "isSignal": true; }; "rangeBehavior": { "alias": "rangeBehavior"; "required": false; "isSignal": true; }; "dateClass": { "alias": "dateClass"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "firstDayOfWeek": { "alias": "firstDayOfWeek"; "required": false; "isSignal": true; }; "monthColumns": { "alias": "monthColumns"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "resetBehavior": { "alias": "resetBehavior"; "required": false; "isSignal": true; }; "cellTemplate": { "alias": "cellTemplate"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "intl": { "alias": "intl"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "selectionStart": "selectionStart"; "rangePreview": "rangePreview"; "selectionComplete": "selectionComplete"; "selectionRestart": "selectionRestart"; "selectionCleared": "selectionCleared"; "selectionLimitReached": "selectionLimitReached"; "presetChange": "presetChange"; "viewChange": "viewChange"; "activeDateChange": "activeDateChange"; "monthChange": "monthChange"; "yearChange": "yearChange"; "cellClick": "cellClick"; "cellHover": "cellHover"; "modeChange": "modeChange"; }, never, ["[twCalendarPresets]"], true, never>;
921
952
  }
922
953
 
923
954
  /**
@@ -205,6 +205,13 @@ declare class CommandPaletteComponent {
205
205
  private setupFocusTrap;
206
206
  private destroyFocusTrap;
207
207
  private disposeOverlay;
208
+ /**
209
+ * Aborts an in-flight close, leaving the palette open.
210
+ *
211
+ * The overlay is still attached (only the detach is deferred), so this
212
+ * restores the focus trap that `closePalette` tore down up front.
213
+ */
214
+ private cancelPendingClose;
208
215
  private clearCloseTimer;
209
216
  private clearAnnounceTimer;
210
217
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CommandPaletteComponent, never>;
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnInit, TemplateRef, Signal } from '@angular/core';
3
- import { ControlValueAccessor } from '@angular/forms';
3
+ import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
4
4
  import { TwSize, TwColor, TimePickerFormat, ErrorStateMatcher } from '@cdevhub/ngx-tw/core';
5
5
  export { TimePickerFormat } from '@cdevhub/ngx-tw/core';
6
6
  import { FormFieldControl } from '@cdevhub/ngx-tw/form-field';
@@ -72,14 +72,14 @@ interface DatePickerTimeConfig<D = Date> {
72
72
  * All date operations go through the injected `DateAdapter<D>`; call
73
73
  * `provideNativeDateAdapter()` in your app providers to bootstrap the default.
74
74
  */
75
- declare class DatePickerComponent<D = Date> extends FormFieldControl<D> implements ControlValueAccessor, OnInit {
75
+ declare class DatePickerComponent<D = Date> extends FormFieldControl<D> implements ControlValueAccessor, Validator, OnInit {
76
76
  /** Id on the date-picker's input element. Auto-generated when not provided. Used by the form-field's `<label for>` attribute. */
77
77
  readonly idInput: _angular_core.InputSignal<string | undefined>;
78
- /** Minimum selectable date. Typed input earlier than this sets `errorState` and the calendar disables the cell. Defaults to `null`. */
78
+ /** Minimum selectable date. Typed input earlier than this commits the value and marks the bound control invalid with `calendarMinDate`; the calendar disables the cell. Defaults to `null`. */
79
79
  readonly minDate: _angular_core.InputSignal<D | null>;
80
- /** Maximum selectable date. Typed input later than this sets `errorState` and the calendar disables the cell. Defaults to `null`. */
80
+ /** Maximum selectable date. Typed input later than this commits the value and marks the bound control invalid with `calendarMaxDate`; the calendar disables the cell. Defaults to `null`. */
81
81
  readonly maxDate: _angular_core.InputSignal<D | null>;
82
- /** Per-date predicate — return `false` to disable. Applied in both the calendar and the text-parse path. */
82
+ /** Per-date predicate — return `false` to disable. Applied in the calendar, the text-parse path, and the `calendarDisabledDate` validation error. */
83
83
  readonly dateFilter: _angular_core.InputSignal<DateFilterFn<D> | null>;
84
84
  /** Which calendar view opens first — `'day'`, `'month'`, or `'year'`. Defaults to `'day'`. */
85
85
  readonly startView: _angular_core.InputSignal<CalendarViewState>;
@@ -173,7 +173,7 @@ declare class DatePickerComponent<D = Date> extends FormFieldControl<D> implemen
173
173
  private readonly injector;
174
174
  private readonly destroyRef;
175
175
  private readonly formField;
176
- private readonly ngControl;
176
+ private ngControl;
177
177
  private readonly parentForm;
178
178
  private readonly parentFormGroup;
179
179
  private readonly defaultMatcher;
@@ -190,10 +190,31 @@ declare class DatePickerComponent<D = Date> extends FormFieldControl<D> implemen
190
190
  readonly internalValue: _angular_core.WritableSignal<D | null>;
191
191
  /** @internal */
192
192
  readonly rawInputText: _angular_core.WritableSignal<string>;
193
- /** @internal */
194
- readonly parseError: _angular_core.WritableSignal<boolean>;
195
- /** @internal */
196
- readonly rangeError: _angular_core.WritableSignal<boolean>;
193
+ /**
194
+ * @internal The text the user typed that could not be parsed into a date,
195
+ * or `null` when the current entry parsed cleanly.
196
+ *
197
+ * This is the single source of truth for "the typed text is bad". It drives
198
+ * both the visual error state (via `parseError` below) and the form error
199
+ * (via `validate()`, which feeds it to `calendarValidator` as
200
+ * `lastInvalidFormValue`). Keeping one field instead of a boolean flag plus a
201
+ * separate string is what stops the two from disagreeing.
202
+ */
203
+ private readonly unparseableText;
204
+ /** @internal Whether the current input text failed to parse. */
205
+ readonly parseError: Signal<boolean>;
206
+ /**
207
+ * @internal Whether the committed value violates `minDate` / `maxDate` /
208
+ * `dateFilter`.
209
+ *
210
+ * Derived, not a flag. An out-of-range entry is committed to the form (so the
211
+ * control holds what the user typed and is *invalid*, rather than silently
212
+ * keeping an older value), which means the value-sync effect below runs and
213
+ * would immediately clear any manually-set flag. Deriving it also keeps the
214
+ * error correct when the consumer moves a constraint after the fact, which a
215
+ * flag set once at commit time cannot do.
216
+ */
217
+ readonly rangeError: Signal<boolean>;
197
218
  /** @internal */
198
219
  readonly focusedSignal: _angular_core.WritableSignal<boolean>;
199
220
  private readonly cvaDisabled;
@@ -305,6 +326,11 @@ declare class DatePickerComponent<D = Date> extends FormFieldControl<D> implemen
305
326
  registerOnChange(fn: (value: D | null) => void): void;
306
327
  registerOnTouched(fn: () => void): void;
307
328
  setDisabledState(isDisabled: boolean): void;
329
+ private validatorOnChange;
330
+ /** @internal */
331
+ validate(control: AbstractControl): ValidationErrors | null;
332
+ /** @internal */
333
+ registerOnValidatorChange(fn: () => void): void;
308
334
  /** @internal */
309
335
  setDescribedByIds(ids: string[]): void;
310
336
  /** @internal */