@ojiepermana/angular 21.3.4 → 22.0.1
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 +10 -6
- package/component/accordion/README.md +195 -0
- package/component/alert/README.md +182 -0
- package/component/alert-dialog/README.md +239 -0
- package/component/aspect-ratio/README.md +112 -0
- package/component/avatar/README.md +176 -0
- package/component/badge/README.md +133 -0
- package/component/breadcrumb/README.md +216 -0
- package/component/button/README.md +139 -0
- package/component/button-group/README.md +208 -0
- package/component/calendar/README.md +132 -0
- package/component/card/README.md +220 -0
- package/component/carousel/README.md +276 -0
- package/component/checkbox/README.md +149 -0
- package/component/collapsible/README.md +195 -0
- package/component/combobox/README.md +198 -0
- package/component/command/README.md +275 -0
- package/component/composer/README.md +235 -0
- package/component/composer/package.json +4 -0
- package/component/context-menu/README.md +267 -0
- package/component/date-picker/README.md +177 -0
- package/component/dialog/README.md +237 -0
- package/component/drawer/README.md +145 -0
- package/component/dropdown-menu/README.md +311 -0
- package/component/editor/README.md +136 -0
- package/component/editor/package.json +4 -0
- package/component/empty/README.md +183 -0
- package/component/empty/package.json +4 -0
- package/component/form/README.md +210 -0
- package/component/hover-card/README.md +146 -0
- package/component/hover-card/package.json +4 -0
- package/component/input/README.md +159 -0
- package/component/input-group/README.md +239 -0
- package/component/input-otp/README.md +278 -0
- package/component/input-otp/package.json +4 -0
- package/component/item/README.md +247 -0
- package/component/kanban/README.md +81 -0
- package/component/kanban/package.json +4 -0
- package/component/kbd/README.md +139 -0
- package/component/kbd/package.json +4 -0
- package/component/label/README.md +136 -0
- package/component/menubar/README.md +269 -0
- package/component/menubar/package.json +4 -0
- package/component/native-select/README.md +176 -0
- package/component/native-select/package.json +4 -0
- package/component/navigation-menu/README.md +160 -0
- package/component/navigation-menu/package.json +4 -0
- package/component/pagination/README.md +144 -0
- package/component/pillbox/README.md +67 -0
- package/component/pillbox/package.json +4 -0
- package/component/popover/README.md +43 -0
- package/component/progress/README.md +160 -0
- package/component/radio/README.md +209 -0
- package/component/resizable/README.md +168 -0
- package/component/resizable/package.json +4 -0
- package/component/scroll-area/README.md +143 -0
- package/component/select/README.md +174 -0
- package/component/separator/README.md +170 -0
- package/component/sheet/README.md +183 -0
- package/component/skeleton/README.md +158 -0
- package/component/slider/README.md +207 -0
- package/component/spinner/README.md +160 -0
- package/component/spinner/package.json +4 -0
- package/component/switch/README.md +166 -0
- package/component/table/README.md +291 -0
- package/component/tabs/README.md +219 -0
- package/component/textarea/README.md +154 -0
- package/component/timeline/README.md +94 -0
- package/component/timeline/package.json +4 -0
- package/component/toast/README.md +321 -0
- package/component/toggle/README.md +131 -0
- package/component/toggle/package.json +4 -0
- package/component/toggle-group/README.md +206 -0
- package/component/toggle-group/package.json +4 -0
- package/component/tooltip/README.md +211 -0
- package/fesm2022/ojiepermana-angular-component-accordion.mjs +45 -30
- package/fesm2022/ojiepermana-angular-component-accordion.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs +95 -61
- package/fesm2022/ojiepermana-angular-component-alert-dialog.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-alert.mjs +30 -21
- package/fesm2022/ojiepermana-angular-component-alert.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs +11 -7
- package/fesm2022/ojiepermana-angular-component-aspect-ratio.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-avatar.mjs +50 -34
- package/fesm2022/ojiepermana-angular-component-avatar.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-badge.mjs +9 -6
- package/fesm2022/ojiepermana-angular-component-badge.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs +49 -35
- package/fesm2022/ojiepermana-angular-component-breadcrumb.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-button-group.mjs +25 -17
- package/fesm2022/ojiepermana-angular-component-button-group.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-button.mjs +11 -7
- package/fesm2022/ojiepermana-angular-component-button.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-calendar.mjs +23 -13
- package/fesm2022/ojiepermana-angular-component-calendar.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-card.mjs +51 -36
- package/fesm2022/ojiepermana-angular-component-card.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-carousel.mjs +66 -42
- package/fesm2022/ojiepermana-angular-component-carousel.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-chart.mjs +494 -283
- package/fesm2022/ojiepermana-angular-component-chart.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-checkbox.mjs +23 -13
- package/fesm2022/ojiepermana-angular-component-checkbox.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-collapsible.mjs +28 -20
- package/fesm2022/ojiepermana-angular-component-collapsible.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-combobox.mjs +27 -18
- package/fesm2022/ojiepermana-angular-component-combobox.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-command.mjs +77 -52
- package/fesm2022/ojiepermana-angular-component-command.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-composer.mjs +352 -0
- package/fesm2022/ojiepermana-angular-component-composer.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-context-menu.mjs +9 -6
- package/fesm2022/ojiepermana-angular-component-context-menu.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-date-picker.mjs +34 -19
- package/fesm2022/ojiepermana-angular-component-date-picker.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-dialog.mjs +55 -38
- package/fesm2022/ojiepermana-angular-component-dialog.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-drawer.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs +108 -74
- package/fesm2022/ojiepermana-angular-component-dropdown-menu.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-editor.mjs +717 -0
- package/fesm2022/ojiepermana-angular-component-editor.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-empty.mjs +145 -0
- package/fesm2022/ojiepermana-angular-component-empty.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-form.mjs +200 -42
- package/fesm2022/ojiepermana-angular-component-form.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-hover-card.mjs +297 -0
- package/fesm2022/ojiepermana-angular-component-hover-card.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-input-group.mjs +48 -33
- package/fesm2022/ojiepermana-angular-component-input-group.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-input-otp.mjs +514 -0
- package/fesm2022/ojiepermana-angular-component-input-otp.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-input.mjs +7 -5
- package/fesm2022/ojiepermana-angular-component-input.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-item.mjs +76 -53
- package/fesm2022/ojiepermana-angular-component-item.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-kanban.mjs +314 -0
- package/fesm2022/ojiepermana-angular-component-kanban.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-kbd.mjs +55 -0
- package/fesm2022/ojiepermana-angular-component-kbd.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-label.mjs +9 -6
- package/fesm2022/ojiepermana-angular-component-label.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-menubar.mjs +308 -0
- package/fesm2022/ojiepermana-angular-component-menubar.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-native-select.mjs +67 -0
- package/fesm2022/ojiepermana-angular-component-native-select.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs +413 -0
- package/fesm2022/ojiepermana-angular-component-navigation-menu.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-pagination.mjs +65 -31
- package/fesm2022/ojiepermana-angular-component-pagination.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-pillbox.mjs +812 -0
- package/fesm2022/ojiepermana-angular-component-pillbox.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-popover.mjs +18 -12
- package/fesm2022/ojiepermana-angular-component-popover.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-progress.mjs +17 -10
- package/fesm2022/ojiepermana-angular-component-progress.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-radio.mjs +47 -17
- package/fesm2022/ojiepermana-angular-component-radio.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-resizable.mjs +481 -0
- package/fesm2022/ojiepermana-angular-component-resizable.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-scroll-area.mjs +15 -9
- package/fesm2022/ojiepermana-angular-component-scroll-area.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-select.mjs +71 -26
- package/fesm2022/ojiepermana-angular-component-select.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-separator.mjs +11 -7
- package/fesm2022/ojiepermana-angular-component-separator.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-sheet.mjs +91 -42
- package/fesm2022/ojiepermana-angular-component-sheet.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-skeleton.mjs +7 -5
- package/fesm2022/ojiepermana-angular-component-skeleton.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-slider.mjs +401 -7
- package/fesm2022/ojiepermana-angular-component-slider.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-spinner.mjs +60 -0
- package/fesm2022/ojiepermana-angular-component-spinner.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-switch.mjs +47 -15
- package/fesm2022/ojiepermana-angular-component-switch.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-table.mjs +56 -40
- package/fesm2022/ojiepermana-angular-component-table.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-tabs.mjs +58 -38
- package/fesm2022/ojiepermana-angular-component-tabs.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-textarea.mjs +8 -6
- package/fesm2022/ojiepermana-angular-component-textarea.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-timeline.mjs +237 -0
- package/fesm2022/ojiepermana-angular-component-timeline.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-toast.mjs +28 -4
- package/fesm2022/ojiepermana-angular-component-toast.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-toggle-group.mjs +289 -0
- package/fesm2022/ojiepermana-angular-component-toggle-group.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-toggle.mjs +82 -0
- package/fesm2022/ojiepermana-angular-component-toggle.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-component-tooltip.mjs +304 -6
- package/fesm2022/ojiepermana-angular-component-tooltip.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-component-utils.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-component.mjs +45 -24
- package/fesm2022/ojiepermana-angular-layout-component.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-provider.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-services.mjs +7 -5
- package/fesm2022/ojiepermana-angular-layout-services.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-shell.mjs +3 -3
- package/fesm2022/ojiepermana-angular-layout-shell.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-token-directive.mjs +9 -6
- package/fesm2022/ojiepermana-angular-layout-token-directive.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-layout-token.mjs.map +1 -1
- package/fesm2022/{ojiepermana-angular-layout-empty.mjs → ojiepermana-angular-layout-type-empty.mjs} +4 -4
- package/fesm2022/ojiepermana-angular-layout-type-empty.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-layout-horizontal.mjs → ojiepermana-angular-layout-type-horizontal.mjs} +26 -17
- package/fesm2022/ojiepermana-angular-layout-type-horizontal.mjs.map +1 -0
- package/fesm2022/{ojiepermana-angular-layout-vertical.mjs → ojiepermana-angular-layout-type-vertical.mjs} +28 -18
- package/fesm2022/ojiepermana-angular-layout-type-vertical.mjs.map +1 -0
- package/fesm2022/ojiepermana-angular-layout.mjs +74 -50
- package/fesm2022/ojiepermana-angular-layout.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-demo-data.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-icon.mjs +11 -7
- package/fesm2022/ojiepermana-angular-navigation-icon.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-item.mjs +27 -16
- package/fesm2022/ojiepermana-angular-navigation-item.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-service.mjs +29 -20
- package/fesm2022/ojiepermana-angular-navigation-service.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs +71 -43
- package/fesm2022/ojiepermana-angular-navigation-sidebar.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-navigation-topbar.mjs +261 -24
- package/fesm2022/ojiepermana-angular-navigation-topbar.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-theme-provider.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-theme-services.mjs +19 -11
- package/fesm2022/ojiepermana-angular-theme-services.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-theme-token.mjs.map +1 -1
- package/fesm2022/ojiepermana-angular-theme.mjs +19 -11
- package/fesm2022/ojiepermana-angular-theme.mjs.map +1 -1
- package/generator/api/bin/src/emit/client.js +4 -2
- package/generator/api/bin/src/writer/index.js +2 -2
- package/generator/guide/bin/schematics/build/index.js +3 -2
- package/generator/guide/bin/src/engine/component.js +2 -2
- package/generator/guide/bin/src/engine/index.js +3 -3
- package/generator/guide/bin/src/engine/render.js +10 -5
- package/layout/type/empty/package.json +4 -0
- package/layout/type/horizontal/package.json +4 -0
- package/layout/type/vertical/package.json +4 -0
- package/navigation/topbar/README.md +196 -0
- package/package.json +89 -25
- package/theme/README.md +110 -3
- package/theme/styles/integrations/material/autocomplete.css +178 -0
- package/theme/styles/integrations/material/button.css +468 -0
- package/theme/styles/integrations/material/dialog.css +152 -0
- package/theme/styles/integrations/material/select.css +175 -0
- package/theme/styles/integrations/material/slide-toggle.css +234 -0
- package/theme/styles/integrations/material/slider.css +194 -0
- package/theme/styles/integrations/material/tabs.css +229 -0
- package/theme/styles/integrations/material.css +70 -60
- package/types/ojiepermana-angular-component-combobox.d.ts +1 -2
- package/types/ojiepermana-angular-component-composer.d.ts +90 -0
- package/types/ojiepermana-angular-component-dropdown-menu.d.ts +2 -0
- package/types/ojiepermana-angular-component-editor.d.ts +123 -0
- package/types/ojiepermana-angular-component-empty.d.ts +50 -0
- package/types/ojiepermana-angular-component-form.d.ts +52 -3
- package/types/ojiepermana-angular-component-hover-card.d.ts +74 -0
- package/types/ojiepermana-angular-component-input-otp.d.ts +136 -0
- package/types/ojiepermana-angular-component-kanban.d.ts +70 -0
- package/types/ojiepermana-angular-component-kbd.d.ts +16 -0
- package/types/ojiepermana-angular-component-menubar.d.ts +67 -0
- package/types/ojiepermana-angular-component-native-select.d.ts +26 -0
- package/types/ojiepermana-angular-component-navigation-menu.d.ts +96 -0
- package/types/ojiepermana-angular-component-pagination.d.ts +10 -4
- package/types/ojiepermana-angular-component-pillbox.d.ts +157 -0
- package/types/ojiepermana-angular-component-radio.d.ts +7 -1
- package/types/ojiepermana-angular-component-resizable.d.ts +99 -0
- package/types/ojiepermana-angular-component-select.d.ts +17 -5
- package/types/ojiepermana-angular-component-sheet.d.ts +3 -1
- package/types/ojiepermana-angular-component-slider.d.ts +59 -1
- package/types/ojiepermana-angular-component-spinner.d.ts +13 -0
- package/types/ojiepermana-angular-component-switch.d.ts +13 -3
- package/types/ojiepermana-angular-component-timeline.d.ts +63 -0
- package/types/ojiepermana-angular-component-toast.d.ts +12 -3
- package/types/ojiepermana-angular-component-toggle-group.d.ts +89 -0
- package/types/ojiepermana-angular-component-toggle.d.ts +25 -0
- package/types/ojiepermana-angular-component-tooltip.d.ts +72 -5
- package/types/{ojiepermana-angular-layout-horizontal.d.ts → ojiepermana-angular-layout-type-horizontal.d.ts} +3 -3
- package/types/{ojiepermana-angular-layout-vertical.d.ts → ojiepermana-angular-layout-type-vertical.d.ts} +3 -3
- package/types/ojiepermana-angular-layout.d.ts +5 -5
- package/types/ojiepermana-angular-navigation-item.d.ts +1 -1
- package/types/ojiepermana-angular-navigation-service.d.ts +7 -7
- package/types/ojiepermana-angular-navigation-sidebar.d.ts +8 -8
- package/types/ojiepermana-angular-navigation-topbar.d.ts +24 -4
- package/types/ojiepermana-angular-navigation-types.d.ts +14 -8
- package/fesm2022/ojiepermana-angular-layout-empty.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-layout-horizontal.mjs.map +0 -1
- package/fesm2022/ojiepermana-angular-layout-vertical.mjs.map +0 -1
- package/layout/empty/package.json +0 -4
- package/layout/horizontal/package.json +0 -4
- package/layout/vertical/package.json +0 -4
- /package/types/{ojiepermana-angular-layout-empty.d.ts → ojiepermana-angular-layout-type-empty.d.ts} +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# Tooltip
|
|
2
|
+
|
|
3
|
+
Displays a small, supplemental text label when a focusable element receives hover or keyboard focus.
|
|
4
|
+
|
|
5
|
+
This Angular implementation now supports a composition-based tooltip surface with `ui-tooltip`, `[uiTooltipTrigger]`, and `ng-template[uiTooltipContent]`, while keeping the older `[uiTooltip]` string directive as a lightweight shortcut for one-line hints.
|
|
6
|
+
|
|
7
|
+
## Import
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import {
|
|
11
|
+
TooltipComponent,
|
|
12
|
+
TooltipContentDirective,
|
|
13
|
+
TooltipDirective,
|
|
14
|
+
TooltipTriggerDirective,
|
|
15
|
+
} from '@ojiepermana/angular/component/tooltip';
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Composition
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
ui-tooltip
|
|
22
|
+
├── focusable host[uiTooltipTrigger]
|
|
23
|
+
└── ng-template[uiTooltipContent]
|
|
24
|
+
|
|
25
|
+
Optional convenience shortcut:
|
|
26
|
+
button[uiTooltip]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Basic usage
|
|
30
|
+
|
|
31
|
+
Use the composed surface when you want shadcn-style trigger and content structure or richer overlay content.
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<ui-tooltip [openDelay]="0">
|
|
35
|
+
<ng-template uiTooltipContent #tooltipContent="uiTooltipContent">
|
|
36
|
+
<span>Add to library</span>
|
|
37
|
+
</ng-template>
|
|
38
|
+
|
|
39
|
+
<button ui-button type="button" variant="outline" [uiTooltipTrigger]="tooltipContent">Hover</button>
|
|
40
|
+
</ui-tooltip>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Common patterns
|
|
44
|
+
|
|
45
|
+
### Side and alignment
|
|
46
|
+
|
|
47
|
+
Use `side="top|right|bottom|left"` and `align="start|center|end"` on `[uiTooltipTrigger]` to control placement.
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<ui-tooltip side="top" [openDelay]="0">
|
|
51
|
+
<ng-template uiTooltipContent #startContent="uiTooltipContent">
|
|
52
|
+
<span>Start aligned tooltip</span>
|
|
53
|
+
</ng-template>
|
|
54
|
+
|
|
55
|
+
<button ui-button type="button" variant="outline" [uiTooltipTrigger]="startContent" align="start">Start</button>
|
|
56
|
+
</ui-tooltip>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Rich content
|
|
60
|
+
|
|
61
|
+
The overlay template can include small layout fragments, emphasized text, or keyboard shortcut chips.
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<ui-tooltip [openDelay]="0">
|
|
65
|
+
<ng-template uiTooltipContent #shortcutContent="uiTooltipContent">
|
|
66
|
+
<span class="inline-flex items-center gap-1.5">
|
|
67
|
+
Save changes
|
|
68
|
+
<ui-kbd class="border-primary-foreground/30 bg-primary-foreground/10 text-primary-foreground shadow-none">
|
|
69
|
+
Cmd
|
|
70
|
+
</ui-kbd>
|
|
71
|
+
<ui-kbd class="border-primary-foreground/30 bg-primary-foreground/10 text-primary-foreground shadow-none">
|
|
72
|
+
S
|
|
73
|
+
</ui-kbd>
|
|
74
|
+
</span>
|
|
75
|
+
</ng-template>
|
|
76
|
+
|
|
77
|
+
<button ui-button type="button" variant="outline" [uiTooltipTrigger]="shortcutContent">Save</button>
|
|
78
|
+
</ui-tooltip>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Disabled buttons
|
|
82
|
+
|
|
83
|
+
Disabled native buttons do not emit hover or focus events. Wrap them with a focusable element and attach `[uiTooltipTrigger]` to the wrapper.
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<ui-tooltip [openDelay]="0">
|
|
87
|
+
<ng-template uiTooltipContent #disabledContent="uiTooltipContent">
|
|
88
|
+
<span>This feature is currently unavailable</span>
|
|
89
|
+
</ng-template>
|
|
90
|
+
|
|
91
|
+
<span
|
|
92
|
+
class="inline-block rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
93
|
+
tabindex="0"
|
|
94
|
+
[uiTooltipTrigger]="disabledContent">
|
|
95
|
+
<button ui-button type="button" variant="outline" disabled>Disabled</button>
|
|
96
|
+
</span>
|
|
97
|
+
</ui-tooltip>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Quick string API
|
|
101
|
+
|
|
102
|
+
For simple one-line hints, the original directive remains available.
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<button ui-button type="button" variant="outline" [uiTooltip]="'Quick text hint'" uiTooltipPosition="above">
|
|
106
|
+
String directive
|
|
107
|
+
</button>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Programmatic control
|
|
111
|
+
|
|
112
|
+
Export the trigger as `uiTooltipTrigger` when a flow needs to open or close the composed tooltip imperatively.
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<ui-tooltip [openDelay]="0">
|
|
116
|
+
<ng-template uiTooltipContent #saveContent="uiTooltipContent">
|
|
117
|
+
<span>Saved</span>
|
|
118
|
+
</ng-template>
|
|
119
|
+
|
|
120
|
+
<button
|
|
121
|
+
ui-button
|
|
122
|
+
type="button"
|
|
123
|
+
variant="outline"
|
|
124
|
+
#saveTrigger="uiTooltipTrigger"
|
|
125
|
+
[uiTooltipTrigger]="saveContent"
|
|
126
|
+
(click)="saveTrigger.open()">
|
|
127
|
+
Save
|
|
128
|
+
</button>
|
|
129
|
+
</ui-tooltip>
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## API reference
|
|
133
|
+
|
|
134
|
+
### `TooltipComponent`
|
|
135
|
+
|
|
136
|
+
| Input | Type | Default |
|
|
137
|
+
| ------------ | ---------------------------------------- | ---------- |
|
|
138
|
+
| `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'top'` |
|
|
139
|
+
| `align` | `'start' \| 'center' \| 'end'` | `'center'` |
|
|
140
|
+
| `sideOffset` | `number` | `4` |
|
|
141
|
+
| `openDelay` | `number` | `150` |
|
|
142
|
+
| `closeDelay` | `number` | `0` |
|
|
143
|
+
|
|
144
|
+
### `TooltipTriggerDirective`
|
|
145
|
+
|
|
146
|
+
| Input | Type | Notes |
|
|
147
|
+
| ------------------ | ---------------------------------------- | --------------------------------------------------- |
|
|
148
|
+
| `uiTooltipTrigger` | `TooltipContentDirective` | Required content template ref for the overlay body. |
|
|
149
|
+
| `side` | `'top' \| 'right' \| 'bottom' \| 'left'` | Overrides the root side for this trigger. |
|
|
150
|
+
| `align` | `'start' \| 'center' \| 'end'` | Overrides the root alignment for this trigger. |
|
|
151
|
+
| `sideOffset` | `number` | Overrides the root offset for this trigger. |
|
|
152
|
+
| `openDelay` | `number` | Overrides the root open delay for this trigger. |
|
|
153
|
+
| `closeDelay` | `number` | Overrides the root close delay for this trigger. |
|
|
154
|
+
| `disabled` | `boolean` | Suppresses tooltip opening for the trigger. |
|
|
155
|
+
|
|
156
|
+
### `TooltipTriggerDirective` methods
|
|
157
|
+
|
|
158
|
+
- `open()`: opens the composed tooltip.
|
|
159
|
+
- `close()`: closes the composed tooltip.
|
|
160
|
+
|
|
161
|
+
### `TooltipContentDirective`
|
|
162
|
+
|
|
163
|
+
- Applied as `ng-template[uiTooltipContent]`.
|
|
164
|
+
- Supplies the portal content rendered inside the tooltip overlay.
|
|
165
|
+
|
|
166
|
+
### `TooltipDirective`
|
|
167
|
+
|
|
168
|
+
| Input | Type | Notes |
|
|
169
|
+
| ------------------------ | ------------------------- | -------------------------------------------------------- |
|
|
170
|
+
| `uiTooltip` | `string` | Message rendered inside the Material tooltip overlay. |
|
|
171
|
+
| `uiTooltipPosition` | `TooltipPosition` | `left`, `right`, `above`, `below`, `before`, or `after`. |
|
|
172
|
+
| `uiTooltipDisabled` | `boolean` | Temporarily suppresses tooltip display. |
|
|
173
|
+
| `uiTooltipShowDelay` | `number` | Delay in milliseconds before the tooltip opens. |
|
|
174
|
+
| `uiTooltipHideDelay` | `number` | Delay in milliseconds before the tooltip closes. |
|
|
175
|
+
| `uiTooltipTouchGestures` | `'auto' \| 'on' \| 'off'` | Controls touch gesture behavior on mobile devices. |
|
|
176
|
+
|
|
177
|
+
For the original primitive contract, see the Radix Tooltip API: <https://www.radix-ui.com/primitives/docs/components/tooltip#api-reference>.
|
|
178
|
+
|
|
179
|
+
## Styling and theming
|
|
180
|
+
|
|
181
|
+
The composed tooltip applies its visual shell directly on the overlay pane and keeps the stable `ui-tooltip-panel` class hook.
|
|
182
|
+
|
|
183
|
+
Projected content inherits the library theme tokens, so small layout helpers such as `inline-flex`, gap utilities, and subtle emphasis classes can be used without rebuilding the panel wrapper.
|
|
184
|
+
|
|
185
|
+
The string directive continues to force the `ui-tooltip-panel` class on the Material tooltip overlay for backward-compatible styling.
|
|
186
|
+
|
|
187
|
+
## Accessibility
|
|
188
|
+
|
|
189
|
+
- The composed overlay pane uses `role="tooltip"`.
|
|
190
|
+
- Trigger hosts receive `aria-describedby` while the tooltip is open.
|
|
191
|
+
- Tooltip content should stay supplemental and should not be the only place that important instructions live.
|
|
192
|
+
- Use focusable hosts so keyboard users can reveal the tooltip without relying on hover.
|
|
193
|
+
- Disabled controls still need a focusable wrapper if you expect keyboard users to reach the explanation.
|
|
194
|
+
|
|
195
|
+
## Keyboard interactions
|
|
196
|
+
|
|
197
|
+
- Focusing the trigger opens the tooltip after the configured delay.
|
|
198
|
+
- Moving focus away closes it again.
|
|
199
|
+
- Pressing Escape closes the currently open composed tooltip.
|
|
200
|
+
- Native hosts keep their default Enter and Space behavior.
|
|
201
|
+
|
|
202
|
+
## Angular notes
|
|
203
|
+
|
|
204
|
+
- Prefer the composition-based surface when you need richer content or closer shadcn parity.
|
|
205
|
+
- Keep the string directive for quick one-line hints or for existing code that already relies on `MatTooltip` semantics.
|
|
206
|
+
- The composed trigger is exported as `uiTooltipTrigger`, so template refs can call `open()` and `close()` directly.
|
|
207
|
+
- For interactive overlay content, use Popover or Hover Card instead of Tooltip.
|
|
208
|
+
|
|
209
|
+
## Source parity
|
|
210
|
+
|
|
211
|
+
This Angular version now mirrors the shadcn runtime more closely with an explicit root, trigger, and content surface while preserving a compact Angular convenience directive for minimal text hints.
|
|
@@ -3,24 +3,30 @@ import { Directive, input, model, computed, forwardRef, ChangeDetectionStrategy,
|
|
|
3
3
|
import { cn } from '@ojiepermana/angular/component/utils';
|
|
4
4
|
|
|
5
5
|
class AccordionContextBase {
|
|
6
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
7
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionContextBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
7
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: AccordionContextBase, isStandalone: true, ngImport: i0 });
|
|
8
8
|
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionContextBase, decorators: [{
|
|
10
10
|
type: Directive
|
|
11
11
|
}] });
|
|
12
12
|
class AccordionComponent extends AccordionContextBase {
|
|
13
|
-
type = input('single',
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
type = input('single', /* @ts-ignore */
|
|
14
|
+
...(ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []));
|
|
15
|
+
collapsible = input(true, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "collapsible" }] : /* istanbul ignore next */ []));
|
|
17
|
+
value = model(null, /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
19
|
+
class = input('', /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
21
|
+
classes = computed(() => cn('block', this.class()), /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
18
23
|
openSet = computed(() => {
|
|
19
24
|
const v = this.value();
|
|
20
25
|
if (v == null)
|
|
21
26
|
return new Set();
|
|
22
27
|
return new Set(Array.isArray(v) ? v : [v]);
|
|
23
|
-
},
|
|
28
|
+
}, /* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "openSet" }] : /* istanbul ignore next */ []));
|
|
24
30
|
isOpen(value) {
|
|
25
31
|
return this.openSet().has(value);
|
|
26
32
|
}
|
|
@@ -43,10 +49,10 @@ class AccordionComponent extends AccordionContextBase {
|
|
|
43
49
|
}
|
|
44
50
|
}
|
|
45
51
|
}
|
|
46
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
47
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
52
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
53
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: AccordionComponent, isStandalone: true, selector: "ui-accordion", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "class": "classes()" } }, providers: [{ provide: AccordionContextBase, useExisting: forwardRef(() => AccordionComponent) }], usesInheritance: true, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
48
54
|
}
|
|
49
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionComponent, decorators: [{
|
|
50
56
|
type: Component,
|
|
51
57
|
args: [{
|
|
52
58
|
selector: 'ui-accordion',
|
|
@@ -58,21 +64,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
58
64
|
}], propDecorators: { type: [{ type: i0.Input, args: [{ isSignal: true, alias: "type", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
59
65
|
class AccordionItemComponent {
|
|
60
66
|
ctx = inject(AccordionContextBase);
|
|
61
|
-
value = input.required(
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
value = input.required(/* @ts-ignore */
|
|
68
|
+
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
69
|
+
disabled = input(false, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
71
|
+
class = input('', /* @ts-ignore */
|
|
72
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
64
73
|
triggerId = `ui-accordion-trigger-${nextId()}`;
|
|
65
74
|
contentId = `ui-accordion-content-${nextId()}`;
|
|
66
|
-
classes = computed(() => cn('block border-b border-border', this.class()),
|
|
67
|
-
|
|
75
|
+
classes = computed(() => cn('block border-b border-border', this.class()), /* @ts-ignore */
|
|
76
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
77
|
+
open = computed(() => this.ctx.isOpen(this.value()), /* @ts-ignore */
|
|
78
|
+
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
68
79
|
toggle() {
|
|
69
80
|
if (!this.disabled())
|
|
70
81
|
this.ctx.toggle(this.value());
|
|
71
82
|
}
|
|
72
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
73
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
83
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
84
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: AccordionItemComponent, isStandalone: true, selector: "ui-accordion-item", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-state": "open() ? \"open\" : \"closed\"", "attr.data-disabled": "disabled() ? \"\" : null" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
74
85
|
}
|
|
75
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionItemComponent, decorators: [{
|
|
76
87
|
type: Component,
|
|
77
88
|
args: [{
|
|
78
89
|
selector: 'ui-accordion-item',
|
|
@@ -87,10 +98,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
87
98
|
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
88
99
|
class AccordionTriggerComponent {
|
|
89
100
|
item = inject(AccordionItemComponent);
|
|
90
|
-
class = input('',
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
101
|
+
class = input('', /* @ts-ignore */
|
|
102
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
103
|
+
classes = computed(() => cn('flex flex-1 w-full items-center justify-between py-4 text-sm font-medium', 'transition-all hover:underline', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', 'disabled:pointer-events-none disabled:opacity-50', this.class()), /* @ts-ignore */
|
|
104
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
106
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: AccordionTriggerComponent, isStandalone: true, selector: "button[ui-accordion-trigger]", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "item.toggle()" }, properties: { "class": "classes()", "attr.id": "item.triggerId", "attr.aria-controls": "item.contentId", "attr.aria-expanded": "item.open()", "attr.data-state": "item.open() ? \"open\" : \"closed\"", "disabled": "item.disabled() || null" } }, ngImport: i0, template: `
|
|
94
107
|
<ng-content />
|
|
95
108
|
<svg
|
|
96
109
|
aria-hidden="true"
|
|
@@ -106,7 +119,7 @@ class AccordionTriggerComponent {
|
|
|
106
119
|
</svg>
|
|
107
120
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
108
121
|
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionTriggerComponent, decorators: [{
|
|
110
123
|
type: Component,
|
|
111
124
|
args: [{
|
|
112
125
|
selector: 'button[ui-accordion-trigger]',
|
|
@@ -140,12 +153,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
140
153
|
}], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
141
154
|
class AccordionContentComponent {
|
|
142
155
|
item = inject(AccordionItemComponent);
|
|
143
|
-
class = input('',
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
156
|
+
class = input('', /* @ts-ignore */
|
|
157
|
+
...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
158
|
+
classes = computed(() => cn('block overflow-hidden text-sm', this.class()), /* @ts-ignore */
|
|
159
|
+
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
160
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
161
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.0", type: AccordionContentComponent, isStandalone: true, selector: "ui-accordion-content", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "item.contentId", "attr.role": "\"region\"", "attr.aria-labelledby": "item.triggerId", "attr.data-state": "item.open() ? \"open\" : \"closed\"", "hidden": "!item.open()" } }, ngImport: i0, template: `<div class="pb-4 pt-0 text-sm"><ng-content /></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
147
162
|
}
|
|
148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
163
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: AccordionContentComponent, decorators: [{
|
|
149
164
|
type: Component,
|
|
150
165
|
args: [{
|
|
151
166
|
selector: 'ui-accordion-content',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ojiepermana-angular-component-accordion.mjs","sources":["../../../projects/angular/component/accordion/src/lib/accordion.component.ts","../../../projects/angular/component/accordion/ojiepermana-angular-component-accordion.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { cn } from '@ojiepermana/angular/component/utils';\n\nexport type AccordionType = 'single' | 'multiple';\n\n@Directive()\nexport abstract class AccordionContextBase {\n abstract isOpen(value: string): boolean;\n abstract toggle(value: string): void;\n}\n\n@Component({\n selector: 'ui-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AccordionContextBase, useExisting: forwardRef(() => AccordionComponent) }],\n host: { '[class]': 'classes()' },\n template: `<ng-content />`,\n})\nexport class AccordionComponent extends AccordionContextBase {\n readonly type = input<AccordionType>('single');\n readonly collapsible = input<boolean>(true);\n readonly value = model<string | string[] | null>(null);\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => cn('block', this.class()));\n\n private readonly openSet = computed<Set<string>>(() => {\n const v = this.value();\n if (v == null) return new Set();\n return new Set(Array.isArray(v) ? v : [v]);\n });\n\n override isOpen(value: string): boolean {\n return this.openSet().has(value);\n }\n\n override toggle(value: string): void {\n const isMulti = this.type() === 'multiple';\n const current = this.openSet();\n const open = current.has(value);\n if (isMulti) {\n const next = new Set(current);\n open ? next.delete(value) : next.add(value);\n this.value.set([...next]);\n } else {\n if (open) {\n if (this.collapsible()) this.value.set(null);\n } else {\n this.value.set(value);\n }\n }\n }\n}\n\n@Component({\n selector: 'ui-accordion-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n template: `<ng-content />`,\n})\nexport class AccordionItemComponent {\n protected readonly ctx = inject(AccordionContextBase);\n readonly value = input.required<string>();\n readonly disabled = input<boolean>(false);\n readonly class = input<string>('');\n\n readonly triggerId = `ui-accordion-trigger-${nextId()}`;\n readonly contentId = `ui-accordion-content-${nextId()}`;\n\n protected readonly classes = computed(() => cn('block border-b border-border', this.class()));\n\n readonly open = computed(() => this.ctx.isOpen(this.value()));\n\n toggle(): void {\n if (!this.disabled()) this.ctx.toggle(this.value());\n }\n}\n\n@Component({\n selector: 'button[ui-accordion-trigger]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n type: 'button',\n '[attr.id]': 'item.triggerId',\n '[attr.aria-controls]': 'item.contentId',\n '[attr.aria-expanded]': 'item.open()',\n '[attr.data-state]': 'item.open() ? \"open\" : \"closed\"',\n '[disabled]': 'item.disabled() || null',\n '(click)': 'item.toggle()',\n },\n template: `\n <ng-content />\n <svg\n aria-hidden=\"true\"\n class=\"h-4 w-4 shrink-0 transition-transform duration-200\"\n [class.rotate-180]=\"item.open()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n `,\n})\nexport class AccordionTriggerComponent {\n protected readonly item = inject(AccordionItemComponent);\n readonly class = input<string>('');\n protected readonly classes = computed(() =>\n cn(\n 'flex flex-1 w-full items-center justify-between py-4 text-sm font-medium',\n 'transition-all hover:underline',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:pointer-events-none disabled:opacity-50',\n this.class(),\n ),\n );\n}\n\n@Component({\n selector: 'ui-accordion-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.id]': 'item.contentId',\n '[attr.role]': '\"region\"',\n '[attr.aria-labelledby]': 'item.triggerId',\n '[attr.data-state]': 'item.open() ? \"open\" : \"closed\"',\n '[hidden]': '!item.open()',\n },\n template: `<div class=\"pb-4 pt-0 text-sm\"><ng-content /></div>`,\n})\nexport class AccordionContentComponent {\n protected readonly item = inject(AccordionItemComponent);\n readonly class = input<string>('');\n protected readonly classes = computed(() => cn('block overflow-hidden text-sm', this.class()));\n}\n\nlet _id = 0;\nfunction nextId(): number {\n return ++_id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ojiepermana-angular-component-accordion.mjs","sources":["../../../projects/angular/component/accordion/accordion.component.ts","../../../projects/angular/component/accordion/ojiepermana-angular-component-accordion.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n Directive,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { cn } from '@ojiepermana/angular/component/utils';\n\nexport type AccordionType = 'single' | 'multiple';\n\n@Directive()\nexport abstract class AccordionContextBase {\n abstract isOpen(value: string): boolean;\n abstract toggle(value: string): void;\n}\n\n@Component({\n selector: 'ui-accordion',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [{ provide: AccordionContextBase, useExisting: forwardRef(() => AccordionComponent) }],\n host: { '[class]': 'classes()' },\n template: `<ng-content />`,\n})\nexport class AccordionComponent extends AccordionContextBase {\n readonly type = input<AccordionType>('single');\n readonly collapsible = input<boolean>(true);\n readonly value = model<string | string[] | null>(null);\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => cn('block', this.class()));\n\n private readonly openSet = computed<Set<string>>(() => {\n const v = this.value();\n if (v == null) return new Set();\n return new Set(Array.isArray(v) ? v : [v]);\n });\n\n override isOpen(value: string): boolean {\n return this.openSet().has(value);\n }\n\n override toggle(value: string): void {\n const isMulti = this.type() === 'multiple';\n const current = this.openSet();\n const open = current.has(value);\n if (isMulti) {\n const next = new Set(current);\n open ? next.delete(value) : next.add(value);\n this.value.set([...next]);\n } else {\n if (open) {\n if (this.collapsible()) this.value.set(null);\n } else {\n this.value.set(value);\n }\n }\n }\n}\n\n@Component({\n selector: 'ui-accordion-item',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.data-state]': 'open() ? \"open\" : \"closed\"',\n '[attr.data-disabled]': 'disabled() ? \"\" : null',\n },\n template: `<ng-content />`,\n})\nexport class AccordionItemComponent {\n protected readonly ctx = inject(AccordionContextBase);\n readonly value = input.required<string>();\n readonly disabled = input<boolean>(false);\n readonly class = input<string>('');\n\n readonly triggerId = `ui-accordion-trigger-${nextId()}`;\n readonly contentId = `ui-accordion-content-${nextId()}`;\n\n protected readonly classes = computed(() => cn('block border-b border-border', this.class()));\n\n readonly open = computed(() => this.ctx.isOpen(this.value()));\n\n toggle(): void {\n if (!this.disabled()) this.ctx.toggle(this.value());\n }\n}\n\n@Component({\n selector: 'button[ui-accordion-trigger]',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n type: 'button',\n '[attr.id]': 'item.triggerId',\n '[attr.aria-controls]': 'item.contentId',\n '[attr.aria-expanded]': 'item.open()',\n '[attr.data-state]': 'item.open() ? \"open\" : \"closed\"',\n '[disabled]': 'item.disabled() || null',\n '(click)': 'item.toggle()',\n },\n template: `\n <ng-content />\n <svg\n aria-hidden=\"true\"\n class=\"h-4 w-4 shrink-0 transition-transform duration-200\"\n [class.rotate-180]=\"item.open()\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n `,\n})\nexport class AccordionTriggerComponent {\n protected readonly item = inject(AccordionItemComponent);\n readonly class = input<string>('');\n protected readonly classes = computed(() =>\n cn(\n 'flex flex-1 w-full items-center justify-between py-4 text-sm font-medium',\n 'transition-all hover:underline',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n 'disabled:pointer-events-none disabled:opacity-50',\n this.class(),\n ),\n );\n}\n\n@Component({\n selector: 'ui-accordion-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.id]': 'item.contentId',\n '[attr.role]': '\"region\"',\n '[attr.aria-labelledby]': 'item.triggerId',\n '[attr.data-state]': 'item.open() ? \"open\" : \"closed\"',\n '[hidden]': '!item.open()',\n },\n template: `<div class=\"pb-4 pt-0 text-sm\"><ng-content /></div>`,\n})\nexport class AccordionContentComponent {\n protected readonly item = inject(AccordionItemComponent);\n readonly class = input<string>('');\n protected readonly classes = computed(() => cn('block overflow-hidden text-sm', this.class()));\n}\n\nlet _id = 0;\nfunction nextId(): number {\n return ++_id;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|