@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.
- package/README.md +40 -0
- package/accordion/README.md +195 -0
- package/alert/README.md +177 -0
- package/alert-dialog/README.md +239 -0
- package/aspect-ratio/README.md +112 -0
- package/avatar/README.md +176 -0
- package/badge/README.md +133 -0
- package/breadcrumb/README.md +216 -0
- package/button/README.md +139 -0
- package/button-group/README.md +204 -0
- package/calendar/README.md +132 -0
- package/card/README.md +220 -0
- package/carousel/README.md +276 -0
- package/chart/README.md +249 -0
- package/checkbox/README.md +149 -0
- package/collapsible/README.md +191 -0
- package/combobox/README.md +198 -0
- package/command/README.md +275 -0
- package/composer/README.md +235 -0
- package/context-menu/README.md +267 -0
- package/date-picker/README.md +177 -0
- package/dialog/README.md +237 -0
- package/drawer/README.md +145 -0
- package/dropdown-menu/README.md +311 -0
- package/editor/README.md +136 -0
- package/empty/README.md +183 -0
- package/fesm2022/edsis-ui-accordion.mjs +174 -0
- package/fesm2022/edsis-ui-accordion.mjs.map +1 -0
- package/fesm2022/edsis-ui-alert-dialog.mjs +242 -0
- package/fesm2022/edsis-ui-alert-dialog.mjs.map +1 -0
- package/fesm2022/edsis-ui-alert.mjs +90 -0
- package/fesm2022/edsis-ui-alert.mjs.map +1 -0
- package/fesm2022/edsis-ui-aspect-ratio.mjs +33 -0
- package/fesm2022/edsis-ui-aspect-ratio.mjs.map +1 -0
- package/fesm2022/edsis-ui-avatar.mjs +123 -0
- package/fesm2022/edsis-ui-avatar.mjs.map +1 -0
- package/fesm2022/edsis-ui-badge.mjs +47 -0
- package/fesm2022/edsis-ui-badge.mjs.map +1 -0
- package/fesm2022/edsis-ui-breadcrumb.mjs +186 -0
- package/fesm2022/edsis-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/edsis-ui-button-group.mjs +95 -0
- package/fesm2022/edsis-ui-button-group.mjs.map +1 -0
- package/fesm2022/edsis-ui-button.mjs +64 -0
- package/fesm2022/edsis-ui-button.mjs.map +1 -0
- package/fesm2022/edsis-ui-calendar.mjs +78 -0
- package/fesm2022/edsis-ui-calendar.mjs.map +1 -0
- package/fesm2022/edsis-ui-card.mjs +137 -0
- package/fesm2022/edsis-ui-card.mjs.map +1 -0
- package/fesm2022/edsis-ui-carousel.mjs +310 -0
- package/fesm2022/edsis-ui-carousel.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-area.mjs +6 -0
- package/fesm2022/edsis-ui-chart-area.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-bar.mjs +6 -0
- package/fesm2022/edsis-ui-chart-bar.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-line.mjs +6 -0
- package/fesm2022/edsis-ui-chart-line.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-pie.mjs +6 -0
- package/fesm2022/edsis-ui-chart-pie.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-radar.mjs +6 -0
- package/fesm2022/edsis-ui-chart-radar.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-radial.mjs +6 -0
- package/fesm2022/edsis-ui-chart-radial.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart-scatter.mjs +6 -0
- package/fesm2022/edsis-ui-chart-scatter.mjs.map +1 -0
- package/fesm2022/edsis-ui-chart.mjs +3714 -0
- package/fesm2022/edsis-ui-chart.mjs.map +1 -0
- package/fesm2022/edsis-ui-checkbox.mjs +104 -0
- package/fesm2022/edsis-ui-checkbox.mjs.map +1 -0
- package/fesm2022/edsis-ui-collapsible.mjs +116 -0
- package/fesm2022/edsis-ui-collapsible.mjs.map +1 -0
- package/fesm2022/edsis-ui-combobox.mjs +263 -0
- package/fesm2022/edsis-ui-combobox.mjs.map +1 -0
- package/fesm2022/edsis-ui-command.mjs +268 -0
- package/fesm2022/edsis-ui-command.mjs.map +1 -0
- package/fesm2022/edsis-ui-composer.mjs +329 -0
- package/fesm2022/edsis-ui-composer.mjs.map +1 -0
- package/fesm2022/edsis-ui-context-menu.mjs +100 -0
- package/fesm2022/edsis-ui-context-menu.mjs.map +1 -0
- package/fesm2022/edsis-ui-date-picker.mjs +155 -0
- package/fesm2022/edsis-ui-date-picker.mjs.map +1 -0
- package/fesm2022/edsis-ui-dialog.mjs +262 -0
- package/fesm2022/edsis-ui-dialog.mjs.map +1 -0
- package/fesm2022/edsis-ui-drawer.mjs +6 -0
- package/fesm2022/edsis-ui-drawer.mjs.map +1 -0
- package/fesm2022/edsis-ui-dropdown-menu.mjs +466 -0
- package/fesm2022/edsis-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/edsis-ui-editor.mjs +692 -0
- package/fesm2022/edsis-ui-editor.mjs.map +1 -0
- package/fesm2022/edsis-ui-empty.mjs +132 -0
- package/fesm2022/edsis-ui-empty.mjs.map +1 -0
- package/fesm2022/edsis-ui-form.mjs +334 -0
- package/fesm2022/edsis-ui-form.mjs.map +1 -0
- package/fesm2022/edsis-ui-hover-card.mjs +284 -0
- package/fesm2022/edsis-ui-hover-card.mjs.map +1 -0
- package/fesm2022/edsis-ui-input-group.mjs +164 -0
- package/fesm2022/edsis-ui-input-group.mjs.map +1 -0
- package/fesm2022/edsis-ui-input-otp.mjs +485 -0
- package/fesm2022/edsis-ui-input-otp.mjs.map +1 -0
- package/fesm2022/edsis-ui-input.mjs +43 -0
- package/fesm2022/edsis-ui-input.mjs.map +1 -0
- package/fesm2022/edsis-ui-item.mjs +241 -0
- package/fesm2022/edsis-ui-item.mjs.map +1 -0
- package/fesm2022/edsis-ui-kanban.mjs +289 -0
- package/fesm2022/edsis-ui-kanban.mjs.map +1 -0
- package/fesm2022/edsis-ui-kbd.mjs +51 -0
- package/fesm2022/edsis-ui-kbd.mjs.map +1 -0
- package/fesm2022/edsis-ui-label.mjs +30 -0
- package/fesm2022/edsis-ui-label.mjs.map +1 -0
- package/fesm2022/edsis-ui-menubar.mjs +302 -0
- package/fesm2022/edsis-ui-menubar.mjs.map +1 -0
- package/fesm2022/edsis-ui-native-select.mjs +61 -0
- package/fesm2022/edsis-ui-native-select.mjs.map +1 -0
- package/fesm2022/edsis-ui-navigation-menu.mjs +399 -0
- package/fesm2022/edsis-ui-navigation-menu.mjs.map +1 -0
- package/fesm2022/edsis-ui-pagination.mjs +216 -0
- package/fesm2022/edsis-ui-pagination.mjs.map +1 -0
- package/fesm2022/edsis-ui-pillbox.mjs +777 -0
- package/fesm2022/edsis-ui-pillbox.mjs.map +1 -0
- package/fesm2022/edsis-ui-popover.mjs +163 -0
- package/fesm2022/edsis-ui-popover.mjs.map +1 -0
- package/fesm2022/edsis-ui-progress.mjs +53 -0
- package/fesm2022/edsis-ui-progress.mjs.map +1 -0
- package/fesm2022/edsis-ui-radio.mjs +111 -0
- package/fesm2022/edsis-ui-radio.mjs.map +1 -0
- package/fesm2022/edsis-ui-resizable.mjs +454 -0
- package/fesm2022/edsis-ui-resizable.mjs.map +1 -0
- package/fesm2022/edsis-ui-scroll-area.mjs +48 -0
- package/fesm2022/edsis-ui-scroll-area.mjs.map +1 -0
- package/fesm2022/edsis-ui-select.mjs +164 -0
- package/fesm2022/edsis-ui-select.mjs.map +1 -0
- package/fesm2022/edsis-ui-separator.mjs +33 -0
- package/fesm2022/edsis-ui-separator.mjs.map +1 -0
- package/fesm2022/edsis-ui-sheet.mjs +264 -0
- package/fesm2022/edsis-ui-sheet.mjs.map +1 -0
- package/fesm2022/edsis-ui-skeleton.mjs +29 -0
- package/fesm2022/edsis-ui-skeleton.mjs.map +1 -0
- package/fesm2022/edsis-ui-slider.mjs +405 -0
- package/fesm2022/edsis-ui-slider.mjs.map +1 -0
- package/fesm2022/edsis-ui-spinner.mjs +58 -0
- package/fesm2022/edsis-ui-spinner.mjs.map +1 -0
- package/fesm2022/edsis-ui-switch.mjs +107 -0
- package/fesm2022/edsis-ui-switch.mjs.map +1 -0
- package/fesm2022/edsis-ui-table.mjs +139 -0
- package/fesm2022/edsis-ui-table.mjs.map +1 -0
- package/fesm2022/edsis-ui-tabs.mjs +252 -0
- package/fesm2022/edsis-ui-tabs.mjs.map +1 -0
- package/fesm2022/edsis-ui-textarea.mjs +37 -0
- package/fesm2022/edsis-ui-textarea.mjs.map +1 -0
- package/fesm2022/edsis-ui-timeline.mjs +213 -0
- package/fesm2022/edsis-ui-timeline.mjs.map +1 -0
- package/fesm2022/edsis-ui-toast.mjs +71 -0
- package/fesm2022/edsis-ui-toast.mjs.map +1 -0
- package/fesm2022/edsis-ui-toggle-group.mjs +269 -0
- package/fesm2022/edsis-ui-toggle-group.mjs.map +1 -0
- package/fesm2022/edsis-ui-toggle.mjs +76 -0
- package/fesm2022/edsis-ui-toggle.mjs.map +1 -0
- package/fesm2022/edsis-ui-tooltip.mjs +339 -0
- package/fesm2022/edsis-ui-tooltip.mjs.map +1 -0
- package/fesm2022/edsis-ui-utils.mjs +13 -0
- package/fesm2022/edsis-ui-utils.mjs.map +1 -0
- package/fesm2022/edsis-ui.mjs +11 -0
- package/fesm2022/edsis-ui.mjs.map +1 -0
- package/form/README.md +210 -0
- package/hover-card/README.md +146 -0
- package/input/README.md +159 -0
- package/input-group/README.md +234 -0
- package/input-otp/README.md +273 -0
- package/item/README.md +247 -0
- package/kanban/README.md +81 -0
- package/kbd/README.md +139 -0
- package/label/README.md +136 -0
- package/menubar/README.md +269 -0
- package/native-select/README.md +176 -0
- package/navigation-menu/README.md +160 -0
- package/package.json +310 -0
- package/pagination/README.md +144 -0
- package/pillbox/README.md +67 -0
- package/popover/README.md +43 -0
- package/progress/README.md +160 -0
- package/radio/README.md +209 -0
- package/resizable/README.md +164 -0
- package/scroll-area/README.md +143 -0
- package/select/README.md +174 -0
- package/separator/README.md +170 -0
- package/sheet/README.md +183 -0
- package/skeleton/README.md +158 -0
- package/slider/README.md +207 -0
- package/spinner/README.md +160 -0
- package/switch/README.md +166 -0
- package/table/README.md +291 -0
- package/tabs/README.md +214 -0
- package/textarea/README.md +154 -0
- package/timeline/README.md +94 -0
- package/toast/README.md +321 -0
- package/toggle/README.md +131 -0
- package/toggle-group/README.md +206 -0
- package/tooltip/README.md +211 -0
- package/types/edsis-ui-accordion.d.ts +51 -0
- package/types/edsis-ui-alert-dialog.d.ts +93 -0
- package/types/edsis-ui-alert.d.ts +37 -0
- package/types/edsis-ui-aspect-ratio.d.ts +12 -0
- package/types/edsis-ui-avatar.d.ts +51 -0
- package/types/edsis-ui-badge.d.ts +19 -0
- package/types/edsis-ui-breadcrumb.d.ts +46 -0
- package/types/edsis-ui-button-group.d.ts +26 -0
- package/types/edsis-ui-button.d.ts +22 -0
- package/types/edsis-ui-calendar.d.ts +33 -0
- package/types/edsis-ui-card.d.ts +60 -0
- package/types/edsis-ui-carousel.d.ts +86 -0
- package/types/edsis-ui-chart-area.d.ts +1 -0
- package/types/edsis-ui-chart-bar.d.ts +1 -0
- package/types/edsis-ui-chart-line.d.ts +1 -0
- package/types/edsis-ui-chart-pie.d.ts +1 -0
- package/types/edsis-ui-chart-radar.d.ts +1 -0
- package/types/edsis-ui-chart-radial.d.ts +1 -0
- package/types/edsis-ui-chart-scatter.d.ts +1 -0
- package/types/edsis-ui-chart.d.ts +1094 -0
- package/types/edsis-ui-checkbox.d.ts +35 -0
- package/types/edsis-ui-collapsible.d.ts +42 -0
- package/types/edsis-ui-combobox.d.ts +51 -0
- package/types/edsis-ui-command.d.ts +99 -0
- package/types/edsis-ui-composer.d.ts +90 -0
- package/types/edsis-ui-context-menu.d.ts +35 -0
- package/types/edsis-ui-date-picker.d.ts +41 -0
- package/types/edsis-ui-dialog.d.ts +87 -0
- package/types/edsis-ui-drawer.d.ts +1 -0
- package/types/edsis-ui-dropdown-menu.d.ts +136 -0
- package/types/edsis-ui-editor.d.ts +123 -0
- package/types/edsis-ui-empty.d.ts +50 -0
- package/types/edsis-ui-form.d.ts +141 -0
- package/types/edsis-ui-hover-card.d.ts +74 -0
- package/types/edsis-ui-input-group.d.ts +51 -0
- package/types/edsis-ui-input-otp.d.ts +136 -0
- package/types/edsis-ui-input.d.ts +16 -0
- package/types/edsis-ui-item.d.ts +88 -0
- package/types/edsis-ui-kanban.d.ts +70 -0
- package/types/edsis-ui-kbd.d.ts +16 -0
- package/types/edsis-ui-label.d.ts +11 -0
- package/types/edsis-ui-menubar.d.ts +67 -0
- package/types/edsis-ui-native-select.d.ts +26 -0
- package/types/edsis-ui-navigation-menu.d.ts +96 -0
- package/types/edsis-ui-pagination.d.ts +34 -0
- package/types/edsis-ui-pillbox.d.ts +157 -0
- package/types/edsis-ui-popover.d.ts +43 -0
- package/types/edsis-ui-progress.d.ts +17 -0
- package/types/edsis-ui-radio.d.ts +40 -0
- package/types/edsis-ui-resizable.d.ts +99 -0
- package/types/edsis-ui-scroll-area.d.ts +19 -0
- package/types/edsis-ui-select.d.ts +57 -0
- package/types/edsis-ui-separator.d.ts +14 -0
- package/types/edsis-ui-sheet.d.ts +76 -0
- package/types/edsis-ui-skeleton.d.ts +10 -0
- package/types/edsis-ui-slider.d.ts +74 -0
- package/types/edsis-ui-spinner.d.ts +13 -0
- package/types/edsis-ui-switch.d.ts +40 -0
- package/types/edsis-ui-table.d.ts +52 -0
- package/types/edsis-ui-tabs.d.ts +92 -0
- package/types/edsis-ui-textarea.d.ts +12 -0
- package/types/edsis-ui-timeline.d.ts +63 -0
- package/types/edsis-ui-toast.d.ts +38 -0
- package/types/edsis-ui-toggle-group.d.ts +89 -0
- package/types/edsis-ui-toggle.d.ts +25 -0
- package/types/edsis-ui-tooltip.d.ts +89 -0
- package/types/edsis-ui-utils.d.ts +5 -0
- 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.
|