@edsis/ui 0.0.2

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 (265) hide show
  1. package/README.md +40 -0
  2. package/accordion/README.md +195 -0
  3. package/alert/README.md +177 -0
  4. package/alert-dialog/README.md +239 -0
  5. package/aspect-ratio/README.md +112 -0
  6. package/avatar/README.md +176 -0
  7. package/badge/README.md +133 -0
  8. package/breadcrumb/README.md +216 -0
  9. package/button/README.md +139 -0
  10. package/button-group/README.md +204 -0
  11. package/calendar/README.md +132 -0
  12. package/card/README.md +220 -0
  13. package/carousel/README.md +276 -0
  14. package/chart/README.md +249 -0
  15. package/checkbox/README.md +149 -0
  16. package/collapsible/README.md +191 -0
  17. package/combobox/README.md +198 -0
  18. package/command/README.md +275 -0
  19. package/composer/README.md +235 -0
  20. package/context-menu/README.md +267 -0
  21. package/date-picker/README.md +177 -0
  22. package/dialog/README.md +237 -0
  23. package/drawer/README.md +145 -0
  24. package/dropdown-menu/README.md +311 -0
  25. package/editor/README.md +136 -0
  26. package/empty/README.md +183 -0
  27. package/fesm2022/edsis-ui-accordion.mjs +174 -0
  28. package/fesm2022/edsis-ui-accordion.mjs.map +1 -0
  29. package/fesm2022/edsis-ui-alert-dialog.mjs +242 -0
  30. package/fesm2022/edsis-ui-alert-dialog.mjs.map +1 -0
  31. package/fesm2022/edsis-ui-alert.mjs +90 -0
  32. package/fesm2022/edsis-ui-alert.mjs.map +1 -0
  33. package/fesm2022/edsis-ui-aspect-ratio.mjs +33 -0
  34. package/fesm2022/edsis-ui-aspect-ratio.mjs.map +1 -0
  35. package/fesm2022/edsis-ui-avatar.mjs +123 -0
  36. package/fesm2022/edsis-ui-avatar.mjs.map +1 -0
  37. package/fesm2022/edsis-ui-badge.mjs +47 -0
  38. package/fesm2022/edsis-ui-badge.mjs.map +1 -0
  39. package/fesm2022/edsis-ui-breadcrumb.mjs +186 -0
  40. package/fesm2022/edsis-ui-breadcrumb.mjs.map +1 -0
  41. package/fesm2022/edsis-ui-button-group.mjs +95 -0
  42. package/fesm2022/edsis-ui-button-group.mjs.map +1 -0
  43. package/fesm2022/edsis-ui-button.mjs +64 -0
  44. package/fesm2022/edsis-ui-button.mjs.map +1 -0
  45. package/fesm2022/edsis-ui-calendar.mjs +78 -0
  46. package/fesm2022/edsis-ui-calendar.mjs.map +1 -0
  47. package/fesm2022/edsis-ui-card.mjs +137 -0
  48. package/fesm2022/edsis-ui-card.mjs.map +1 -0
  49. package/fesm2022/edsis-ui-carousel.mjs +310 -0
  50. package/fesm2022/edsis-ui-carousel.mjs.map +1 -0
  51. package/fesm2022/edsis-ui-chart-area.mjs +6 -0
  52. package/fesm2022/edsis-ui-chart-area.mjs.map +1 -0
  53. package/fesm2022/edsis-ui-chart-bar.mjs +6 -0
  54. package/fesm2022/edsis-ui-chart-bar.mjs.map +1 -0
  55. package/fesm2022/edsis-ui-chart-line.mjs +6 -0
  56. package/fesm2022/edsis-ui-chart-line.mjs.map +1 -0
  57. package/fesm2022/edsis-ui-chart-pie.mjs +6 -0
  58. package/fesm2022/edsis-ui-chart-pie.mjs.map +1 -0
  59. package/fesm2022/edsis-ui-chart-radar.mjs +6 -0
  60. package/fesm2022/edsis-ui-chart-radar.mjs.map +1 -0
  61. package/fesm2022/edsis-ui-chart-radial.mjs +6 -0
  62. package/fesm2022/edsis-ui-chart-radial.mjs.map +1 -0
  63. package/fesm2022/edsis-ui-chart-scatter.mjs +6 -0
  64. package/fesm2022/edsis-ui-chart-scatter.mjs.map +1 -0
  65. package/fesm2022/edsis-ui-chart.mjs +3714 -0
  66. package/fesm2022/edsis-ui-chart.mjs.map +1 -0
  67. package/fesm2022/edsis-ui-checkbox.mjs +104 -0
  68. package/fesm2022/edsis-ui-checkbox.mjs.map +1 -0
  69. package/fesm2022/edsis-ui-collapsible.mjs +116 -0
  70. package/fesm2022/edsis-ui-collapsible.mjs.map +1 -0
  71. package/fesm2022/edsis-ui-combobox.mjs +263 -0
  72. package/fesm2022/edsis-ui-combobox.mjs.map +1 -0
  73. package/fesm2022/edsis-ui-command.mjs +268 -0
  74. package/fesm2022/edsis-ui-command.mjs.map +1 -0
  75. package/fesm2022/edsis-ui-composer.mjs +329 -0
  76. package/fesm2022/edsis-ui-composer.mjs.map +1 -0
  77. package/fesm2022/edsis-ui-context-menu.mjs +100 -0
  78. package/fesm2022/edsis-ui-context-menu.mjs.map +1 -0
  79. package/fesm2022/edsis-ui-date-picker.mjs +155 -0
  80. package/fesm2022/edsis-ui-date-picker.mjs.map +1 -0
  81. package/fesm2022/edsis-ui-dialog.mjs +262 -0
  82. package/fesm2022/edsis-ui-dialog.mjs.map +1 -0
  83. package/fesm2022/edsis-ui-drawer.mjs +6 -0
  84. package/fesm2022/edsis-ui-drawer.mjs.map +1 -0
  85. package/fesm2022/edsis-ui-dropdown-menu.mjs +466 -0
  86. package/fesm2022/edsis-ui-dropdown-menu.mjs.map +1 -0
  87. package/fesm2022/edsis-ui-editor.mjs +692 -0
  88. package/fesm2022/edsis-ui-editor.mjs.map +1 -0
  89. package/fesm2022/edsis-ui-empty.mjs +132 -0
  90. package/fesm2022/edsis-ui-empty.mjs.map +1 -0
  91. package/fesm2022/edsis-ui-form.mjs +334 -0
  92. package/fesm2022/edsis-ui-form.mjs.map +1 -0
  93. package/fesm2022/edsis-ui-hover-card.mjs +284 -0
  94. package/fesm2022/edsis-ui-hover-card.mjs.map +1 -0
  95. package/fesm2022/edsis-ui-input-group.mjs +164 -0
  96. package/fesm2022/edsis-ui-input-group.mjs.map +1 -0
  97. package/fesm2022/edsis-ui-input-otp.mjs +485 -0
  98. package/fesm2022/edsis-ui-input-otp.mjs.map +1 -0
  99. package/fesm2022/edsis-ui-input.mjs +43 -0
  100. package/fesm2022/edsis-ui-input.mjs.map +1 -0
  101. package/fesm2022/edsis-ui-item.mjs +241 -0
  102. package/fesm2022/edsis-ui-item.mjs.map +1 -0
  103. package/fesm2022/edsis-ui-kanban.mjs +289 -0
  104. package/fesm2022/edsis-ui-kanban.mjs.map +1 -0
  105. package/fesm2022/edsis-ui-kbd.mjs +51 -0
  106. package/fesm2022/edsis-ui-kbd.mjs.map +1 -0
  107. package/fesm2022/edsis-ui-label.mjs +30 -0
  108. package/fesm2022/edsis-ui-label.mjs.map +1 -0
  109. package/fesm2022/edsis-ui-menubar.mjs +302 -0
  110. package/fesm2022/edsis-ui-menubar.mjs.map +1 -0
  111. package/fesm2022/edsis-ui-native-select.mjs +61 -0
  112. package/fesm2022/edsis-ui-native-select.mjs.map +1 -0
  113. package/fesm2022/edsis-ui-navigation-menu.mjs +399 -0
  114. package/fesm2022/edsis-ui-navigation-menu.mjs.map +1 -0
  115. package/fesm2022/edsis-ui-pagination.mjs +216 -0
  116. package/fesm2022/edsis-ui-pagination.mjs.map +1 -0
  117. package/fesm2022/edsis-ui-pillbox.mjs +777 -0
  118. package/fesm2022/edsis-ui-pillbox.mjs.map +1 -0
  119. package/fesm2022/edsis-ui-popover.mjs +163 -0
  120. package/fesm2022/edsis-ui-popover.mjs.map +1 -0
  121. package/fesm2022/edsis-ui-progress.mjs +53 -0
  122. package/fesm2022/edsis-ui-progress.mjs.map +1 -0
  123. package/fesm2022/edsis-ui-radio.mjs +111 -0
  124. package/fesm2022/edsis-ui-radio.mjs.map +1 -0
  125. package/fesm2022/edsis-ui-resizable.mjs +454 -0
  126. package/fesm2022/edsis-ui-resizable.mjs.map +1 -0
  127. package/fesm2022/edsis-ui-scroll-area.mjs +48 -0
  128. package/fesm2022/edsis-ui-scroll-area.mjs.map +1 -0
  129. package/fesm2022/edsis-ui-select.mjs +164 -0
  130. package/fesm2022/edsis-ui-select.mjs.map +1 -0
  131. package/fesm2022/edsis-ui-separator.mjs +33 -0
  132. package/fesm2022/edsis-ui-separator.mjs.map +1 -0
  133. package/fesm2022/edsis-ui-sheet.mjs +264 -0
  134. package/fesm2022/edsis-ui-sheet.mjs.map +1 -0
  135. package/fesm2022/edsis-ui-skeleton.mjs +29 -0
  136. package/fesm2022/edsis-ui-skeleton.mjs.map +1 -0
  137. package/fesm2022/edsis-ui-slider.mjs +405 -0
  138. package/fesm2022/edsis-ui-slider.mjs.map +1 -0
  139. package/fesm2022/edsis-ui-spinner.mjs +58 -0
  140. package/fesm2022/edsis-ui-spinner.mjs.map +1 -0
  141. package/fesm2022/edsis-ui-switch.mjs +107 -0
  142. package/fesm2022/edsis-ui-switch.mjs.map +1 -0
  143. package/fesm2022/edsis-ui-table.mjs +139 -0
  144. package/fesm2022/edsis-ui-table.mjs.map +1 -0
  145. package/fesm2022/edsis-ui-tabs.mjs +252 -0
  146. package/fesm2022/edsis-ui-tabs.mjs.map +1 -0
  147. package/fesm2022/edsis-ui-textarea.mjs +37 -0
  148. package/fesm2022/edsis-ui-textarea.mjs.map +1 -0
  149. package/fesm2022/edsis-ui-timeline.mjs +213 -0
  150. package/fesm2022/edsis-ui-timeline.mjs.map +1 -0
  151. package/fesm2022/edsis-ui-toast.mjs +71 -0
  152. package/fesm2022/edsis-ui-toast.mjs.map +1 -0
  153. package/fesm2022/edsis-ui-toggle-group.mjs +269 -0
  154. package/fesm2022/edsis-ui-toggle-group.mjs.map +1 -0
  155. package/fesm2022/edsis-ui-toggle.mjs +76 -0
  156. package/fesm2022/edsis-ui-toggle.mjs.map +1 -0
  157. package/fesm2022/edsis-ui-tooltip.mjs +339 -0
  158. package/fesm2022/edsis-ui-tooltip.mjs.map +1 -0
  159. package/fesm2022/edsis-ui-utils.mjs +13 -0
  160. package/fesm2022/edsis-ui-utils.mjs.map +1 -0
  161. package/fesm2022/edsis-ui.mjs +11 -0
  162. package/fesm2022/edsis-ui.mjs.map +1 -0
  163. package/form/README.md +210 -0
  164. package/hover-card/README.md +146 -0
  165. package/input/README.md +159 -0
  166. package/input-group/README.md +234 -0
  167. package/input-otp/README.md +273 -0
  168. package/item/README.md +247 -0
  169. package/kanban/README.md +81 -0
  170. package/kbd/README.md +139 -0
  171. package/label/README.md +136 -0
  172. package/menubar/README.md +269 -0
  173. package/native-select/README.md +176 -0
  174. package/navigation-menu/README.md +160 -0
  175. package/package.json +310 -0
  176. package/pagination/README.md +144 -0
  177. package/pillbox/README.md +67 -0
  178. package/popover/README.md +43 -0
  179. package/progress/README.md +160 -0
  180. package/radio/README.md +209 -0
  181. package/resizable/README.md +164 -0
  182. package/scroll-area/README.md +143 -0
  183. package/select/README.md +174 -0
  184. package/separator/README.md +170 -0
  185. package/sheet/README.md +183 -0
  186. package/skeleton/README.md +158 -0
  187. package/slider/README.md +207 -0
  188. package/spinner/README.md +160 -0
  189. package/switch/README.md +166 -0
  190. package/table/README.md +291 -0
  191. package/tabs/README.md +214 -0
  192. package/textarea/README.md +154 -0
  193. package/timeline/README.md +94 -0
  194. package/toast/README.md +321 -0
  195. package/toggle/README.md +131 -0
  196. package/toggle-group/README.md +206 -0
  197. package/tooltip/README.md +211 -0
  198. package/types/edsis-ui-accordion.d.ts +51 -0
  199. package/types/edsis-ui-alert-dialog.d.ts +93 -0
  200. package/types/edsis-ui-alert.d.ts +37 -0
  201. package/types/edsis-ui-aspect-ratio.d.ts +12 -0
  202. package/types/edsis-ui-avatar.d.ts +51 -0
  203. package/types/edsis-ui-badge.d.ts +19 -0
  204. package/types/edsis-ui-breadcrumb.d.ts +46 -0
  205. package/types/edsis-ui-button-group.d.ts +26 -0
  206. package/types/edsis-ui-button.d.ts +22 -0
  207. package/types/edsis-ui-calendar.d.ts +33 -0
  208. package/types/edsis-ui-card.d.ts +60 -0
  209. package/types/edsis-ui-carousel.d.ts +86 -0
  210. package/types/edsis-ui-chart-area.d.ts +1 -0
  211. package/types/edsis-ui-chart-bar.d.ts +1 -0
  212. package/types/edsis-ui-chart-line.d.ts +1 -0
  213. package/types/edsis-ui-chart-pie.d.ts +1 -0
  214. package/types/edsis-ui-chart-radar.d.ts +1 -0
  215. package/types/edsis-ui-chart-radial.d.ts +1 -0
  216. package/types/edsis-ui-chart-scatter.d.ts +1 -0
  217. package/types/edsis-ui-chart.d.ts +1094 -0
  218. package/types/edsis-ui-checkbox.d.ts +35 -0
  219. package/types/edsis-ui-collapsible.d.ts +42 -0
  220. package/types/edsis-ui-combobox.d.ts +51 -0
  221. package/types/edsis-ui-command.d.ts +99 -0
  222. package/types/edsis-ui-composer.d.ts +90 -0
  223. package/types/edsis-ui-context-menu.d.ts +35 -0
  224. package/types/edsis-ui-date-picker.d.ts +41 -0
  225. package/types/edsis-ui-dialog.d.ts +87 -0
  226. package/types/edsis-ui-drawer.d.ts +1 -0
  227. package/types/edsis-ui-dropdown-menu.d.ts +136 -0
  228. package/types/edsis-ui-editor.d.ts +123 -0
  229. package/types/edsis-ui-empty.d.ts +50 -0
  230. package/types/edsis-ui-form.d.ts +141 -0
  231. package/types/edsis-ui-hover-card.d.ts +74 -0
  232. package/types/edsis-ui-input-group.d.ts +51 -0
  233. package/types/edsis-ui-input-otp.d.ts +136 -0
  234. package/types/edsis-ui-input.d.ts +16 -0
  235. package/types/edsis-ui-item.d.ts +88 -0
  236. package/types/edsis-ui-kanban.d.ts +70 -0
  237. package/types/edsis-ui-kbd.d.ts +16 -0
  238. package/types/edsis-ui-label.d.ts +11 -0
  239. package/types/edsis-ui-menubar.d.ts +67 -0
  240. package/types/edsis-ui-native-select.d.ts +26 -0
  241. package/types/edsis-ui-navigation-menu.d.ts +96 -0
  242. package/types/edsis-ui-pagination.d.ts +34 -0
  243. package/types/edsis-ui-pillbox.d.ts +157 -0
  244. package/types/edsis-ui-popover.d.ts +43 -0
  245. package/types/edsis-ui-progress.d.ts +17 -0
  246. package/types/edsis-ui-radio.d.ts +40 -0
  247. package/types/edsis-ui-resizable.d.ts +99 -0
  248. package/types/edsis-ui-scroll-area.d.ts +19 -0
  249. package/types/edsis-ui-select.d.ts +57 -0
  250. package/types/edsis-ui-separator.d.ts +14 -0
  251. package/types/edsis-ui-sheet.d.ts +76 -0
  252. package/types/edsis-ui-skeleton.d.ts +10 -0
  253. package/types/edsis-ui-slider.d.ts +74 -0
  254. package/types/edsis-ui-spinner.d.ts +13 -0
  255. package/types/edsis-ui-switch.d.ts +40 -0
  256. package/types/edsis-ui-table.d.ts +52 -0
  257. package/types/edsis-ui-tabs.d.ts +92 -0
  258. package/types/edsis-ui-textarea.d.ts +12 -0
  259. package/types/edsis-ui-timeline.d.ts +63 -0
  260. package/types/edsis-ui-toast.d.ts +38 -0
  261. package/types/edsis-ui-toggle-group.d.ts +89 -0
  262. package/types/edsis-ui-toggle.d.ts +25 -0
  263. package/types/edsis-ui-tooltip.d.ts +89 -0
  264. package/types/edsis-ui-utils.d.ts +5 -0
  265. package/types/edsis-ui.d.ts +2 -0
package/tabs/README.md ADDED
@@ -0,0 +1,214 @@
1
+ # Tabs
2
+
3
+ A set of layered sections of content, known as tab panels, that are displayed one at a time.
4
+
5
+ Use Tabs for compact settings surfaces, dashboards, account forms, and any view where related panels should share the same page location.
6
+
7
+ ## Import
8
+
9
+ ```ts
10
+ import { TabsComponent, TabsContentComponent, TabsListComponent, TabsTriggerComponent } from '@edsis/ui/tabs';
11
+ ```
12
+
13
+ ## Composition
14
+
15
+ The Angular structure mirrors shadcn and Radix while using Angular selectors and native button triggers.
16
+
17
+ ```text
18
+ ui-tabs
19
+ ├── ui-tabs-list
20
+ │ ├── button[ui-tabs-trigger]
21
+ │ └── button[ui-tabs-trigger]
22
+ ├── ui-tabs-content
23
+ └── ui-tabs-content
24
+ ```
25
+
26
+ ## Basic usage
27
+
28
+ Pair every trigger value with a matching panel value. Bind `[(value)]` when the parent should seed the active tab or observe changes.
29
+
30
+ ```ts
31
+ const activeTab = signal<string | null>('account');
32
+ ```
33
+
34
+ ```html
35
+ <ui-tabs [(value)]="activeTab" class="w-full max-w-md">
36
+ <ui-tabs-list>
37
+ <button ui-tabs-trigger value="account">Account</button>
38
+ <button ui-tabs-trigger value="password">Password</button>
39
+ </ui-tabs-list>
40
+
41
+ <ui-tabs-content value="account">Make changes to your account here.</ui-tabs-content>
42
+ <ui-tabs-content value="password">Change your password here.</ui-tabs-content>
43
+ </ui-tabs>
44
+ ```
45
+
46
+ ## Common patterns
47
+
48
+ ### Line variant
49
+
50
+ Use `variant="line"` on `ui-tabs-list` for the underline treatment from the shadcn examples.
51
+
52
+ ```ts
53
+ const lineTab = signal<string | null>('overview');
54
+ ```
55
+
56
+ ```html
57
+ <ui-tabs [(value)]="lineTab">
58
+ <ui-tabs-list variant="line">
59
+ <button ui-tabs-trigger value="overview">Overview</button>
60
+ <button ui-tabs-trigger value="analytics">Analytics</button>
61
+ <button ui-tabs-trigger value="reports">Reports</button>
62
+ </ui-tabs-list>
63
+
64
+ <ui-tabs-content value="overview">Overview metrics are selected.</ui-tabs-content>
65
+ <ui-tabs-content value="analytics">Analytics metrics are selected.</ui-tabs-content>
66
+ <ui-tabs-content value="reports">Reports metrics are selected.</ui-tabs-content>
67
+ </ui-tabs>
68
+ ```
69
+
70
+ ### Vertical orientation
71
+
72
+ Set `orientation="vertical"` on `ui-tabs` when triggers should stack beside the active panel.
73
+
74
+ ```ts
75
+ const verticalTab = signal<string | null>('account');
76
+ ```
77
+
78
+ ```html
79
+ <ui-tabs [(value)]="verticalTab" orientation="vertical" class="w-full max-w-2xl">
80
+ <ui-tabs-list class="min-w-40">
81
+ <button ui-tabs-trigger value="account">Account</button>
82
+ <button ui-tabs-trigger value="password">Password</button>
83
+ <button ui-tabs-trigger value="notifications">Notifications</button>
84
+ </ui-tabs-list>
85
+
86
+ <ui-tabs-content value="account" class="mt-0 flex-1 rounded-lg border border-border p-4">
87
+ Account preferences and details live in this panel.
88
+ </ui-tabs-content>
89
+ </ui-tabs>
90
+ ```
91
+
92
+ ### Disabled triggers
93
+
94
+ Disable a trigger with `[disabled]="true"`. Disabled triggers remain visible, expose disabled state, and are skipped by arrow-key navigation.
95
+
96
+ ```ts
97
+ const disabledTab = signal<string | null>('home');
98
+ ```
99
+
100
+ ```html
101
+ <ui-tabs [(value)]="disabledTab">
102
+ <ui-tabs-list>
103
+ <button ui-tabs-trigger value="home">Home</button>
104
+ <button ui-tabs-trigger value="settings" [disabled]="true">Disabled</button>
105
+ </ui-tabs-list>
106
+
107
+ <ui-tabs-content value="home">Home content stays reachable.</ui-tabs-content>
108
+ <ui-tabs-content value="settings">Settings is intentionally unavailable.</ui-tabs-content>
109
+ </ui-tabs>
110
+ ```
111
+
112
+ ### Icons
113
+
114
+ Project icon components or inline SVG before trigger text. The trigger includes icon and label spacing.
115
+
116
+ ```html
117
+ <ui-tabs value="preview">
118
+ <ui-tabs-list>
119
+ <button ui-tabs-trigger value="preview">
120
+ <svg aria-hidden="true" class="size-4" viewBox="0 0 24 24">...</svg>
121
+ Preview
122
+ </button>
123
+ <button ui-tabs-trigger value="code">
124
+ <svg aria-hidden="true" class="size-4" viewBox="0 0 24 24">...</svg>
125
+ Code
126
+ </button>
127
+ </ui-tabs-list>
128
+
129
+ <ui-tabs-content value="preview">Rendered preview is selected.</ui-tabs-content>
130
+ <ui-tabs-content value="code">Code sample is selected.</ui-tabs-content>
131
+ </ui-tabs>
132
+ ```
133
+
134
+ ### RTL
135
+
136
+ Set `dir="rtl"` on the tabs root or an ancestor container when the surrounding interface runs right to left.
137
+
138
+ ```html
139
+ <ui-tabs value="overview" dir="rtl" lang="ar" class="w-full max-w-md text-right">
140
+ <ui-tabs-list>
141
+ <button ui-tabs-trigger value="overview">نظرة عامة</button>
142
+ <button ui-tabs-trigger value="analytics">التحليلات</button>
143
+ <button ui-tabs-trigger value="reports">التقارير</button>
144
+ <button ui-tabs-trigger value="settings">الإعدادات</button>
145
+ </ui-tabs-list>
146
+
147
+ <ui-tabs-content value="overview">لديك ١٢ مشروعًا نشطًا و٣ مهام معلقة.</ui-tabs-content>
148
+ </ui-tabs>
149
+ ```
150
+
151
+ ## API reference
152
+
153
+ ### `TabsComponent`
154
+
155
+ | Input | Type | Default |
156
+ | --------------- | ---------------------------- | -------------- |
157
+ | `value` (model) | `string \| null` | `null` |
158
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
159
+ | `class` | `string` | `''` |
160
+
161
+ ### `TabsListComponent`
162
+
163
+ | Input | Type | Default |
164
+ | --------- | --------------------- | ----------- |
165
+ | `variant` | `'default' \| 'line'` | `'default'` |
166
+ | `class` | `string` | `''` |
167
+
168
+ ### `TabsTriggerComponent`
169
+
170
+ | Input | Type | Default |
171
+ | ---------- | --------- | ------- |
172
+ | `value` | `string` | — |
173
+ | `disabled` | `boolean` | `false` |
174
+ | `class` | `string` | `''` |
175
+
176
+ ### `TabsContentComponent`
177
+
178
+ | Input | Type | Default |
179
+ | ------- | -------- | ------- |
180
+ | `value` | `string` | — |
181
+ | `class` | `string` | `''` |
182
+
183
+ ## Styling and theming
184
+
185
+ The default list uses `bg-muted` and active triggers use `bg-background`, `text-foreground`, and `shadow-sm` to match the shadcn look.
186
+
187
+ The line variant uses `border-border` on the list and an active `border-foreground` underline on the trigger. Pass `class` to the root, list, trigger, or content to tune width, grid layouts, spacing, and panel framing.
188
+
189
+ ## Accessibility
190
+
191
+ - `ui-tabs-list` renders `role="tablist"` and `aria-orientation`.
192
+ - `button[ui-tabs-trigger]` renders `role="tab"`, `aria-selected`, roving `tabindex`, `aria-controls`, and `aria-disabled` when disabled.
193
+ - `ui-tabs-content` renders `role="tabpanel"`, `aria-labelledby`, `tabindex="0"`, and `hidden` when inactive.
194
+ - Keep trigger labels concise and unique. Icons inside triggers should be decorative or have their own accessible text outside the icon.
195
+
196
+ ## Keyboard interactions
197
+
198
+ - `ArrowRight` and `ArrowLeft` move selection and focus through horizontal tabs.
199
+ - `ArrowDown` and `ArrowUp` move selection and focus through vertical tabs.
200
+ - `Home` and `End` jump to the first and last enabled trigger.
201
+ - Disabled triggers are skipped by arrow-key, Home, and End navigation.
202
+ - Enter and Space retain native button activation behavior.
203
+
204
+ ## Angular notes
205
+
206
+ - The component uses Angular signal-based `model()` binding for `value`.
207
+ - Use `signal<string | null>()` with `[(value)]` as the Angular equivalent of shadcn `defaultValue` when parent state matters.
208
+ - Values are strings and should be unique within a tabs root.
209
+ - `variant="line"` belongs to `ui-tabs-list`, matching the upstream shadcn API.
210
+ - Icons are projected content; bring an app icon component or inline SVG where needed.
211
+
212
+ ## Source parity
213
+
214
+ This Angular implementation follows the current shadcn Tabs docs: preview card tabs, usage, composition, line, vertical, disabled, icons, RTL, and Radix API guidance. React props are translated to Angular selectors, native buttons, and signal-friendly state.
@@ -0,0 +1,154 @@
1
+ # Textarea
2
+
3
+ Displays a multiline native `<textarea>` with the shared Angular theme tokens and shadcn-style field composition.
4
+
5
+ Use Textarea for feedback, notes, comments, support messages, and any form surface that needs multi-line entry while keeping browser-native editing behavior.
6
+
7
+ ## Import
8
+
9
+ ```ts
10
+ import { TextareaComponent } from '@edsis/ui/textarea';
11
+ ```
12
+
13
+ Import the `form`, `label`, or `button` entrypoints separately when the page also needs structured field copy or submit actions.
14
+
15
+ ## Composition
16
+
17
+ Textarea stays intentionally small because it styles the native control instead of wrapping it in a custom value accessor.
18
+
19
+ ```text
20
+ label[ui-label]
21
+ └── textarea[ui-textarea]
22
+ ```
23
+
24
+ For the richer shadcn field pattern, compose it with the existing form primitives.
25
+
26
+ ```text
27
+ ui-form-field
28
+ ├── ui-form-label
29
+ ├── textarea[ui-textarea][uiFormControl]
30
+ └── ui-form-description or ui-form-message
31
+ ```
32
+
33
+ ## Basic Usage
34
+
35
+ Use a visible label plus the styled native textarea when you only need the base multiline control.
36
+
37
+ ```html
38
+ <label ui-label for="bio">Bio</label>
39
+ <textarea id="bio" ui-textarea rows="4" placeholder="Tell us about yourself"></textarea>
40
+ ```
41
+
42
+ When the textarea lives inside `ui-form-field`, add `uiFormControl` so labels, descriptions, and invalid state stay wired together.
43
+
44
+ ```html
45
+ <ui-form-field>
46
+ <ui-form-label>Message</ui-form-label>
47
+ <textarea ui-textarea uiFormControl rows="4" placeholder="Type your message here."></textarea>
48
+ <ui-form-description>Enter your message below.</ui-form-description>
49
+ </ui-form-field>
50
+ ```
51
+
52
+ ## Common Patterns
53
+
54
+ ### Field Composition
55
+
56
+ The upstream shadcn `Field`, `FieldLabel`, and `FieldDescription` helpers map to the local `form` entrypoint.
57
+
58
+ ```html
59
+ <ui-form-field>
60
+ <ui-form-label>Feedback</ui-form-label>
61
+ <textarea ui-textarea uiFormControl rows="4" placeholder="Your feedback helps us improve..."></textarea>
62
+ <ui-form-description>Share your thoughts about our service.</ui-form-description>
63
+ </ui-form-field>
64
+ ```
65
+
66
+ ### Disabled and Invalid States
67
+
68
+ Use the native `disabled` attribute for disabled state and `aria-invalid="true"` for validation styling.
69
+
70
+ ```html
71
+ <ui-form-field>
72
+ <ui-form-label>Message</ui-form-label>
73
+ <textarea ui-textarea uiFormControl rows="4" disabled></textarea>
74
+ <ui-form-description>This field is currently disabled.</ui-form-description>
75
+ </ui-form-field>
76
+
77
+ <ui-form-field>
78
+ <ui-form-label>Message</ui-form-label>
79
+ <textarea ui-textarea uiFormControl rows="4" aria-invalid="true"></textarea>
80
+ <ui-form-description>Please enter a valid message.</ui-form-description>
81
+ </ui-form-field>
82
+ ```
83
+
84
+ ### Submit Row
85
+
86
+ Pair the textarea with `button[ui-button]` to create feedback and messaging layouts.
87
+
88
+ ```html
89
+ <div class="grid w-full max-w-md gap-2">
90
+ <textarea ui-textarea rows="5" class="min-h-[140px]" placeholder="Type your message here."></textarea>
91
+ <button ui-button type="button" class="w-fit">Send message</button>
92
+ </div>
93
+ ```
94
+
95
+ ### RTL
96
+
97
+ Set `dir="rtl"` on a wrapping container or manage direction globally in your layout. The textarea stays native while labels and helper text follow the document direction.
98
+
99
+ ```html
100
+ <div dir="rtl" lang="ar" class="max-w-md text-right">
101
+ <ui-form-field>
102
+ <ui-form-label>التعليقات</ui-form-label>
103
+ <textarea ui-textarea uiFormControl rows="4" placeholder="تعليقاتك تساعدنا على التحسين..."></textarea>
104
+ <ui-form-description>شاركنا أفكارك حول خدمتنا.</ui-form-description>
105
+ </ui-form-field>
106
+ </div>
107
+ ```
108
+
109
+ ## API Reference
110
+
111
+ ### `TextareaComponent`
112
+
113
+ | Input | Type | Default |
114
+ | ------- | -------- | ------- |
115
+ | `class` | `string` | `''` |
116
+
117
+ ### Native Attributes
118
+
119
+ All standard `<textarea>` attributes such as `rows`, `placeholder`, `disabled`, `required`, `readonly`, `dir`, and `aria-invalid` pass through unchanged.
120
+
121
+ The component also exposes a `focus()` instance method when accessed through `ViewChild(TextareaComponent)`.
122
+
123
+ ## Styling and Theming
124
+
125
+ The component uses the shared `border-input`, `ring-ring`, `text-foreground`, `placeholder:text-muted-foreground`, and `aria-[invalid=true]:border-destructive` tokens.
126
+
127
+ Base styling includes a `min-h-[60px]` guard to avoid collapsed textareas and `resize-y` so users can increase the writing area without breaking width-constrained layouts.
128
+
129
+ Pass `class` to tune height, spacing, or layout while keeping the base focus, disabled, invalid, and resize treatment.
130
+
131
+ ## Accessibility
132
+
133
+ - Pair the textarea with a visible label using `label[ui-label]` or `ui-form-label`.
134
+ - Use `uiFormControl` inside `ui-form-field` so helper and error text participate in the same accessible description chain.
135
+ - Mark validation failures with `aria-invalid="true"` and provide descriptive helper or error text nearby.
136
+ - Keep the native resize handle available so pointer and touch users can increase the input area when needed.
137
+
138
+ ## Keyboard Interactions
139
+
140
+ - `Tab` and `Shift+Tab` move focus in and out using the normal browser order.
141
+ - `Enter` inserts a new line instead of submitting by itself.
142
+ - Arrow keys, Home, End, selection, and clipboard shortcuts stay browser-native.
143
+
144
+ ## Angular Notes
145
+
146
+ - Textarea styles the native `<textarea>`, so it works with both `ngModel` and reactive forms.
147
+ - Prefer using `uiFormControl` when the textarea lives inside `ui-form-field`.
148
+ - Let Angular form state drive invalid styling when possible, but `aria-invalid="true"` also works for externally managed validation.
149
+
150
+ ## Source Parity
151
+
152
+ This Angular implementation follows the shadcn Textarea page closely for the core textarea, disabled and invalid states, button layout, and RTL guidance.
153
+
154
+ The upstream `Field` helper family intentionally maps to the existing Angular `form` entrypoint instead of adding a separate `field` runtime surface.
@@ -0,0 +1,94 @@
1
+ # Timeline
2
+
3
+ Display a series of events or steps in a vertical or horizontal timeline.
4
+
5
+ This component is conceptually inspired by Flux Timeline. The Angular API, slot names, styling tokens, and examples are implemented for this library's shadcn-style component system.
6
+
7
+ ## Import
8
+
9
+ ```ts
10
+ import {
11
+ TimelineBlockComponent,
12
+ TimelineComponent,
13
+ TimelineContentComponent,
14
+ TimelineIndicatorComponent,
15
+ TimelineItemComponent,
16
+ TimelineSubgridComponent,
17
+ } from '@edsis/ui/timeline';
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ ```html
23
+ <ui-timeline>
24
+ <ui-timeline-item status="complete">
25
+ <ui-timeline-indicator>1</ui-timeline-indicator>
26
+ <ui-timeline-content>
27
+ <h3 class="text-sm font-medium">Submit</h3>
28
+ <p class="text-muted-foreground">Complete the form and provide all necessary assets.</p>
29
+ </ui-timeline-content>
30
+ </ui-timeline-item>
31
+ </ui-timeline>
32
+ ```
33
+
34
+ ## Composition
35
+
36
+ ```text
37
+ ui-timeline
38
+ |-- ui-timeline-item
39
+ | |-- ui-timeline-indicator
40
+ | `-- ui-timeline-content
41
+ |-- ui-timeline-item
42
+ | `-- ui-timeline-block
43
+ | `-- ui-timeline-subgrid
44
+ ```
45
+
46
+ ## Horizontal Status
47
+
48
+ ```html
49
+ <ui-timeline horizontal>
50
+ <ui-timeline-item status="complete">
51
+ <ui-timeline-indicator>1</ui-timeline-indicator>
52
+ <ui-timeline-content>Order confirmed</ui-timeline-content>
53
+ </ui-timeline-item>
54
+ <ui-timeline-item status="current">
55
+ <ui-timeline-indicator>2</ui-timeline-indicator>
56
+ <ui-timeline-content>On its way</ui-timeline-content>
57
+ </ui-timeline-item>
58
+ <ui-timeline-item status="incomplete">
59
+ <ui-timeline-indicator>3</ui-timeline-indicator>
60
+ <ui-timeline-content>Delivered</ui-timeline-content>
61
+ </ui-timeline-item>
62
+ </ui-timeline>
63
+ ```
64
+
65
+ ## Inputs
66
+
67
+ | Part | Input | Type | Default |
68
+ | ---------------------------- | ------------ | ------------------------------------ | ---------- |
69
+ | `TimelineComponent` | `horizontal` | `boolean` | `false` |
70
+ | `TimelineComponent` | `align` | `start \| baseline \| center \| end` | `center` |
71
+ | `TimelineComponent` | `size` | `default \| lg` | `default` |
72
+ | `TimelineItemComponent` | `status` | `complete \| current \| incomplete` | `null` |
73
+ | `TimelineItemComponent` | `align` | `start \| baseline \| center \| end` | root value |
74
+ | `TimelineItemComponent` | `size` | `default \| lg` | root value |
75
+ | `TimelineIndicatorComponent` | `variant` | `default \| bare` | `default` |
76
+ | `TimelineIndicatorComponent` | `status` | `complete \| current \| incomplete` | item value |
77
+ | `TimelineIndicatorComponent` | `color` | standard color token | `null` |
78
+
79
+ ## Spacing
80
+
81
+ The root exposes CSS variables for spacing and indicator sizing.
82
+
83
+ ```html
84
+ <ui-timeline class="[--timeline-item-gap:3rem] [--timeline-content-gap:1rem]">
85
+ <!-- timeline items -->
86
+ </ui-timeline>
87
+ ```
88
+
89
+ ## Accessibility
90
+
91
+ - Use semantic headings and text inside `ui-timeline-content`.
92
+ - Give icon-only indicators an accessible label when the icon communicates meaning.
93
+ - Keep chronological order in DOM order for screen readers.
94
+ - Do not rely on color alone; pair status indicators with text content.