@loomui-ng/ui 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +46 -2
- package/accordion/README.md +38 -0
- package/alert/README.md +32 -0
- package/alert-dialog/README.md +37 -0
- package/aspect-ratio/README.md +24 -0
- package/attachment/README.md +40 -0
- package/avatar/README.md +34 -0
- package/badge/README.md +29 -0
- package/breadcrumb/README.md +33 -0
- package/bubble/README.md +32 -0
- package/button/README.md +31 -0
- package/button-group/README.md +30 -0
- package/calendar/README.md +35 -0
- package/card/README.md +41 -0
- package/carousel/README.md +41 -0
- package/chart/README.md +25 -0
- package/checkbox/README.md +31 -0
- package/collapsible/README.md +31 -0
- package/combobox/README.md +47 -0
- package/command/README.md +44 -0
- package/context-menu/README.md +36 -0
- package/data-table/README.md +39 -0
- package/date-picker/README.md +23 -0
- package/dialog/README.md +52 -0
- package/direction/README.md +19 -0
- package/drawer/README.md +37 -0
- package/dropdown-menu/README.md +46 -0
- package/empty/README.md +38 -0
- package/fesm2022/loomui-ng-ui-accordion.mjs +555 -0
- package/fesm2022/loomui-ng-ui-accordion.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-alert-dialog.mjs +652 -0
- package/fesm2022/loomui-ng-ui-alert-dialog.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-alert.mjs +286 -0
- package/fesm2022/loomui-ng-ui-alert.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-aspect-ratio.mjs +97 -0
- package/fesm2022/loomui-ng-ui-aspect-ratio.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-attachment.mjs +713 -0
- package/fesm2022/loomui-ng-ui-attachment.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-avatar.mjs +561 -0
- package/fesm2022/loomui-ng-ui-avatar.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-badge.mjs +102 -0
- package/fesm2022/loomui-ng-ui-badge.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-breadcrumb.mjs +520 -0
- package/fesm2022/loomui-ng-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-bubble.mjs +386 -0
- package/fesm2022/loomui-ng-ui-bubble.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-button-group.mjs +193 -0
- package/fesm2022/loomui-ng-ui-button-group.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-button.mjs +162 -0
- package/fesm2022/loomui-ng-ui-button.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-calendar.mjs +681 -0
- package/fesm2022/loomui-ng-ui-calendar.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-card.mjs +461 -0
- package/fesm2022/loomui-ng-ui-card.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-carousel.mjs +532 -0
- package/fesm2022/loomui-ng-ui-carousel.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-chart.mjs +373 -0
- package/fesm2022/loomui-ng-ui-chart.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-checkbox.mjs +265 -0
- package/fesm2022/loomui-ng-ui-checkbox.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-collapsible.mjs +274 -0
- package/fesm2022/loomui-ng-ui-collapsible.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-combobox.mjs +971 -0
- package/fesm2022/loomui-ng-ui-combobox.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-command.mjs +982 -0
- package/fesm2022/loomui-ng-ui-command.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-context-menu.mjs +1359 -0
- package/fesm2022/loomui-ng-ui-context-menu.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-data-table.mjs +535 -0
- package/fesm2022/loomui-ng-ui-data-table.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-date-picker.mjs +312 -0
- package/fesm2022/loomui-ng-ui-date-picker.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-dialog.mjs +508 -0
- package/fesm2022/loomui-ng-ui-dialog.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-direction.mjs +112 -0
- package/fesm2022/loomui-ng-ui-direction.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-drawer.mjs +590 -0
- package/fesm2022/loomui-ng-ui-drawer.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-dropdown-menu.mjs +1322 -0
- package/fesm2022/loomui-ng-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-empty.mjs +408 -0
- package/fesm2022/loomui-ng-ui-empty.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-field.mjs +630 -0
- package/fesm2022/loomui-ng-ui-field.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-hover-card.mjs +230 -0
- package/fesm2022/loomui-ng-ui-hover-card.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-icon.mjs +498 -0
- package/fesm2022/loomui-ng-ui-icon.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-input-group.mjs +463 -0
- package/fesm2022/loomui-ng-ui-input-group.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-input-otp.mjs +586 -0
- package/fesm2022/loomui-ng-ui-input-otp.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-input.mjs +289 -0
- package/fesm2022/loomui-ng-ui-input.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-item.mjs +598 -0
- package/fesm2022/loomui-ng-ui-item.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-kbd.mjs +129 -0
- package/fesm2022/loomui-ng-ui-kbd.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-label.mjs +68 -0
- package/fesm2022/loomui-ng-ui-label.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-marker.mjs +234 -0
- package/fesm2022/loomui-ng-ui-marker.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-menubar.mjs +1523 -0
- package/fesm2022/loomui-ng-ui-menubar.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-message-scroller.mjs +519 -0
- package/fesm2022/loomui-ng-ui-message-scroller.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-message.mjs +408 -0
- package/fesm2022/loomui-ng-ui-message.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-native-select.mjs +389 -0
- package/fesm2022/loomui-ng-ui-native-select.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-navigation-menu.mjs +609 -0
- package/fesm2022/loomui-ng-ui-navigation-menu.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-pagination.mjs +611 -0
- package/fesm2022/loomui-ng-ui-pagination.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-popover.mjs +358 -0
- package/fesm2022/loomui-ng-ui-popover.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-progress.mjs +159 -0
- package/fesm2022/loomui-ng-ui-progress.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-questionnaire.mjs +1012 -0
- package/fesm2022/loomui-ng-ui-questionnaire.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-radio-group.mjs +399 -0
- package/fesm2022/loomui-ng-ui-radio-group.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-resizable.mjs +518 -0
- package/fesm2022/loomui-ng-ui-resizable.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-scroll-area.mjs +135 -0
- package/fesm2022/loomui-ng-ui-scroll-area.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-select.mjs +863 -0
- package/fesm2022/loomui-ng-ui-select.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-separator.mjs +114 -0
- package/fesm2022/loomui-ng-ui-separator.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-sheet.mjs +530 -0
- package/fesm2022/loomui-ng-ui-sheet.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-sidebar.mjs +1918 -0
- package/fesm2022/loomui-ng-ui-sidebar.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-skeleton.mjs +69 -0
- package/fesm2022/loomui-ng-ui-skeleton.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-slider.mjs +390 -0
- package/fesm2022/loomui-ng-ui-slider.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-spinner.mjs +85 -0
- package/fesm2022/loomui-ng-ui-spinner.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-switch.mjs +212 -0
- package/fesm2022/loomui-ng-ui-switch.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-table.mjs +559 -0
- package/fesm2022/loomui-ng-ui-table.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-tabs.mjs +544 -0
- package/fesm2022/loomui-ng-ui-tabs.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-textarea.mjs +206 -0
- package/fesm2022/loomui-ng-ui-textarea.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-toast.mjs +432 -0
- package/fesm2022/loomui-ng-ui-toast.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-toggle-group.mjs +477 -0
- package/fesm2022/loomui-ng-ui-toggle-group.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-toggle.mjs +219 -0
- package/fesm2022/loomui-ng-ui-toggle.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-tooltip.mjs +240 -0
- package/fesm2022/loomui-ng-ui-tooltip.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-typography.mjs +129 -0
- package/fesm2022/loomui-ng-ui-typography.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui-utils.mjs +1533 -0
- package/fesm2022/loomui-ng-ui-utils.mjs.map +1 -0
- package/fesm2022/loomui-ng-ui.mjs +4 -0
- package/fesm2022/loomui-ng-ui.mjs.map +1 -0
- package/field/README.md +43 -0
- package/hover-card/README.md +31 -0
- package/icon/README.md +42 -0
- package/input/README.md +26 -0
- package/input-group/README.md +40 -0
- package/input-otp/README.md +35 -0
- package/item/README.md +33 -0
- package/kbd/README.md +21 -0
- package/label/README.md +24 -0
- package/marker/README.md +24 -0
- package/menubar/README.md +40 -0
- package/message/README.md +32 -0
- package/message-scroller/README.md +40 -0
- package/native-select/README.md +26 -0
- package/navigation-menu/README.md +39 -0
- package/package.json +325 -3
- package/pagination/README.md +37 -0
- package/popover/README.md +37 -0
- package/progress/README.md +25 -0
- package/questionnaire/README.md +52 -0
- package/radio-group/README.md +33 -0
- package/resizable/README.md +37 -0
- package/scroll-area/README.md +25 -0
- package/select/README.md +45 -0
- package/separator/README.md +28 -0
- package/sheet/README.md +38 -0
- package/sidebar/README.md +60 -0
- package/skeleton/README.md +21 -0
- package/slider/README.md +29 -0
- package/spinner/README.md +15 -0
- package/styles/loomui.css +330 -0
- package/switch/README.md +29 -0
- package/table/README.md +31 -0
- package/tabs/README.md +42 -0
- package/textarea/README.md +28 -0
- package/toast/README.md +27 -0
- package/toggle/README.md +27 -0
- package/toggle-group/README.md +37 -0
- package/tooltip/README.md +31 -0
- package/types/loomui-ng-ui-accordion.d.ts +141 -0
- package/types/loomui-ng-ui-alert-dialog.d.ts +175 -0
- package/types/loomui-ng-ui-alert.d.ts +77 -0
- package/types/loomui-ng-ui-aspect-ratio.d.ts +31 -0
- package/types/loomui-ng-ui-attachment.d.ts +192 -0
- package/types/loomui-ng-ui-avatar.d.ts +147 -0
- package/types/loomui-ng-ui-badge.d.ts +32 -0
- package/types/loomui-ng-ui-breadcrumb.d.ts +118 -0
- package/types/loomui-ng-ui-bubble.d.ts +100 -0
- package/types/loomui-ng-ui-button-group.d.ts +51 -0
- package/types/loomui-ng-ui-button.d.ts +57 -0
- package/types/loomui-ng-ui-calendar.d.ts +171 -0
- package/types/loomui-ng-ui-card.d.ts +123 -0
- package/types/loomui-ng-ui-carousel.d.ts +140 -0
- package/types/loomui-ng-ui-chart.d.ts +95 -0
- package/types/loomui-ng-ui-checkbox.d.ts +62 -0
- package/types/loomui-ng-ui-collapsible.d.ts +74 -0
- package/types/loomui-ng-ui-combobox.d.ts +229 -0
- package/types/loomui-ng-ui-command.d.ts +231 -0
- package/types/loomui-ng-ui-context-menu.d.ts +288 -0
- package/types/loomui-ng-ui-data-table.d.ts +111 -0
- package/types/loomui-ng-ui-date-picker.d.ts +63 -0
- package/types/loomui-ng-ui-dialog.d.ts +127 -0
- package/types/loomui-ng-ui-direction.d.ts +42 -0
- package/types/loomui-ng-ui-drawer.d.ts +149 -0
- package/types/loomui-ng-ui-dropdown-menu.d.ts +258 -0
- package/types/loomui-ng-ui-empty.d.ts +109 -0
- package/types/loomui-ng-ui-field.d.ts +169 -0
- package/types/loomui-ng-ui-hover-card.d.ts +62 -0
- package/types/loomui-ng-ui-icon.d.ts +156 -0
- package/types/loomui-ng-ui-input-group.d.ts +130 -0
- package/types/loomui-ng-ui-input-otp.d.ts +149 -0
- package/types/loomui-ng-ui-input.d.ts +89 -0
- package/types/loomui-ng-ui-item.d.ts +157 -0
- package/types/loomui-ng-ui-kbd.d.ts +36 -0
- package/types/loomui-ng-ui-label.d.ts +19 -0
- package/types/loomui-ng-ui-marker.d.ts +61 -0
- package/types/loomui-ng-ui-menubar.d.ts +321 -0
- package/types/loomui-ng-ui-message-scroller.d.ts +138 -0
- package/types/loomui-ng-ui-message.d.ts +109 -0
- package/types/loomui-ng-ui-native-select.d.ts +84 -0
- package/types/loomui-ng-ui-navigation-menu.d.ts +160 -0
- package/types/loomui-ng-ui-pagination.d.ts +130 -0
- package/types/loomui-ng-ui-popover.d.ts +90 -0
- package/types/loomui-ng-ui-progress.d.ts +39 -0
- package/types/loomui-ng-ui-questionnaire.d.ts +274 -0
- package/types/loomui-ng-ui-radio-group.d.ts +109 -0
- package/types/loomui-ng-ui-resizable.d.ts +121 -0
- package/types/loomui-ng-ui-scroll-area.d.ts +44 -0
- package/types/loomui-ng-ui-select.d.ts +204 -0
- package/types/loomui-ng-ui-separator.d.ts +35 -0
- package/types/loomui-ng-ui-sheet.d.ts +124 -0
- package/types/loomui-ng-ui-sidebar.d.ts +485 -0
- package/types/loomui-ng-ui-skeleton.d.ts +20 -0
- package/types/loomui-ng-ui-slider.d.ts +103 -0
- package/types/loomui-ng-ui-spinner.d.ts +19 -0
- package/types/loomui-ng-ui-switch.d.ts +56 -0
- package/types/loomui-ng-ui-table.d.ts +148 -0
- package/types/loomui-ng-ui-tabs.d.ts +148 -0
- package/types/loomui-ng-ui-textarea.d.ts +52 -0
- package/types/loomui-ng-ui-toast.d.ts +97 -0
- package/types/loomui-ng-ui-toggle-group.d.ts +138 -0
- package/types/loomui-ng-ui-toggle.d.ts +63 -0
- package/types/loomui-ng-ui-tooltip.d.ts +63 -0
- package/types/loomui-ng-ui-typography.d.ts +42 -0
- package/types/loomui-ng-ui-utils.d.ts +392 -0
- package/types/loomui-ng-ui.d.ts +5 -0
- package/typography/README.md +29 -0
package/select/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# uiSelect
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SELECT } from '@loomui-ng/ui/select';
|
|
5
|
+
// add to the component imports array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiSelect [(value)]="fruit" class="contents">
|
|
10
|
+
<button uiSelectTrigger class="w-[180px]"><span uiSelectValue placeholder="Select a fruit"></span></button>
|
|
11
|
+
<div uiSelectContent>
|
|
12
|
+
<div uiSelectGroup>
|
|
13
|
+
<div uiSelectLabel>Fruits</div>
|
|
14
|
+
<div uiSelectItem value="apple">Apple</div>
|
|
15
|
+
<div uiSelectItem value="grapes" disabled>Grapes</div>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<ui-select [(value)]="fruit" class="contents">
|
|
25
|
+
<ui-select-trigger class="w-[180px]"><ui-select-value placeholder="Select a fruit"></ui-select-value></ui-select-trigger>
|
|
26
|
+
<ui-select-content>
|
|
27
|
+
<ui-select-group>
|
|
28
|
+
<ui-select-label>Fruits</ui-select-label>
|
|
29
|
+
<ui-select-item value="apple">Apple</ui-select-item>
|
|
30
|
+
<ui-select-item value="grapes" disabled>Grapes</ui-select-item>
|
|
31
|
+
</ui-select-group>
|
|
32
|
+
</ui-select-content>
|
|
33
|
+
</ui-select>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
| Input | Values | Default |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| `value` | model string | `''` |
|
|
39
|
+
| `disabled` / `invalid` | boolean | `false` |
|
|
40
|
+
| `size` (trigger) | `default` `sm` | `default` |
|
|
41
|
+
| `placeholder` (uiSelectValue) | string | `''` |
|
|
42
|
+
|
|
43
|
+
Also works with ngModel / reactive forms (ControlValueAccessor). Always wrap items in uiSelectGroup (it supplies the padding, like shadcn). Opens below the trigger (no item-aligned mode).
|
|
44
|
+
|
|
45
|
+
Spec: docs/behavior-specs/select.md - Manual checks: docs/manual-tests/select.md
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# uiSeparator
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UiSeparator } from '@loomui-ng/ui/separator';
|
|
5
|
+
// add to the component imports array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiSeparator></div>
|
|
10
|
+
<div uiSeparator orientation="vertical"></div>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<ui-separator></ui-separator>
|
|
17
|
+
<ui-separator orientation="vertical"></ui-separator>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Input | Values | Default |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `orientation` | `horizontal` `vertical` | `horizontal` |
|
|
23
|
+
| `decorative` | boolean | `true` (role=none) |
|
|
24
|
+
| `class` | extra classes | - |
|
|
25
|
+
|
|
26
|
+
decorative=false gives role=separator.
|
|
27
|
+
|
|
28
|
+
Spec: docs/behavior-specs/separator.md - Manual checks: docs/manual-tests/separator.md
|
package/sheet/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# uiSheet
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SHEET } from '@loomui-ng/ui/sheet';
|
|
5
|
+
// add to the component imports array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiSheet class="contents">
|
|
10
|
+
<button uiButton uiSheetTrigger>Open</button>
|
|
11
|
+
<div uiSheetContent side="right">
|
|
12
|
+
<div uiSheetHeader><h2 uiSheetTitle>Title</h2><p uiSheetDescription>Description</p></div>
|
|
13
|
+
<div uiSheetFooter><button uiButton uiSheetClose>Close</button></div>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
19
|
+
|
|
20
|
+
```html
|
|
21
|
+
<ui-sheet class="contents">
|
|
22
|
+
<ui-button uiSheetTrigger>Open</ui-button>
|
|
23
|
+
<ui-sheet-content side="right">
|
|
24
|
+
<ui-sheet-header><ui-sheet-title>Title</ui-sheet-title><ui-sheet-description>Description</ui-sheet-description></ui-sheet-header>
|
|
25
|
+
<ui-sheet-footer><ui-button uiSheetClose>Close</ui-button></ui-sheet-footer>
|
|
26
|
+
</ui-sheet-content>
|
|
27
|
+
</ui-sheet>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Input | Values | Default |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `open` (uiSheet) | model boolean | `false` |
|
|
33
|
+
| `side` (uiSheetContent) | `top` `right` `bottom` `left` | `right` |
|
|
34
|
+
| `showCloseButton` | boolean | `true` |
|
|
35
|
+
|
|
36
|
+
Same engine as Dialog (shared UiModalRoot).
|
|
37
|
+
|
|
38
|
+
Spec: docs/behavior-specs/sheet.md - Manual checks: docs/manual-tests/sheet.md
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Sidebar
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SIDEBAR } from '@loomui-ng/ui/sidebar';
|
|
5
|
+
// add to the component `imports` array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiSidebarProvider>
|
|
10
|
+
<aside uiSidebar collapsible="icon">
|
|
11
|
+
<div uiSidebarContent>
|
|
12
|
+
<div uiSidebarGroup>
|
|
13
|
+
<div uiSidebarGroupLabel>Platform</div>
|
|
14
|
+
<ul uiSidebarMenu>
|
|
15
|
+
<li uiSidebarMenuItem><a uiSidebarMenuButton [isActive]="true" href="#">Home</a></li>
|
|
16
|
+
</ul>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
<button uiSidebarRail></button>
|
|
20
|
+
</aside>
|
|
21
|
+
<main uiSidebarInset><button uiSidebarTrigger></button>…</main>
|
|
22
|
+
</div>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<ui-sidebar-provider>
|
|
29
|
+
<ui-sidebar collapsible="icon">
|
|
30
|
+
<ui-sidebar-content>
|
|
31
|
+
<ui-sidebar-group>
|
|
32
|
+
<ui-sidebar-group-label>Platform</ui-sidebar-group-label>
|
|
33
|
+
<ui-sidebar-menu>
|
|
34
|
+
<ui-sidebar-menu-item><ui-sidebar-menu-button [isActive]="true" href="#">Home</ui-sidebar-menu-button></ui-sidebar-menu-item>
|
|
35
|
+
</ui-sidebar-menu>
|
|
36
|
+
</ui-sidebar-group>
|
|
37
|
+
</ui-sidebar-content>
|
|
38
|
+
<ui-sidebar-rail></ui-sidebar-rail>
|
|
39
|
+
</ui-sidebar>
|
|
40
|
+
<ui-sidebar-inset><ui-sidebar-trigger></ui-sidebar-trigger>…</ui-sidebar-inset>
|
|
41
|
+
</ui-sidebar-provider>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Input / output | Type / values | Default |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `open` (model) | | `true` |
|
|
47
|
+
| `openMobile` (model) | | `false` |
|
|
48
|
+
| `width` | | `'16rem'` |
|
|
49
|
+
| `shortcut` | | `'b'` |
|
|
50
|
+
| `side` | `'left' \| 'right'` | `'left'` |
|
|
51
|
+
| `variant` | `'sidebar' \| 'floating' \| 'inset'` | `'sidebar'` |
|
|
52
|
+
| `collapsible` | `'offcanvas' \| 'icon' \| 'none'` | `'offcanvas'` |
|
|
53
|
+
| `disabled` | | `false` |
|
|
54
|
+
| `isActive` | | `false` |
|
|
55
|
+
| `size` | `'default' \| 'sm' \| 'lg'` | `'default'` |
|
|
56
|
+
| `tooltip` | `string` | `''` |
|
|
57
|
+
|
|
58
|
+
Parts (selectors): `[uiSidebarProvider], ui-sidebar-provider`, `[uiSidebar], ui-sidebar`, `button[uiSidebarTrigger], ui-sidebar-trigger`, `button[uiSidebarRail], ui-sidebar-rail`, `[uiSidebarInset], ui-sidebar-inset`, `[uiSidebarHeader], ui-sidebar-header`, `[uiSidebarFooter], ui-sidebar-footer`, `[uiSidebarContent], ui-sidebar-content`, `[uiSidebarSeparator], ui-sidebar-separator`, `[uiSidebarGroup], ui-sidebar-group`, `[uiSidebarGroupLabel], ui-sidebar-group-label`, `button[uiSidebarGroupAction], ui-sidebar-group-action`, `[uiSidebarGroupContent], ui-sidebar-group-content`, `ul[uiSidebarMenu], ui-sidebar-menu`, `li[uiSidebarMenuItem], ui-sidebar-menu-item`, `button[uiSidebarMenuAction], ui-sidebar-menu-action`, `[uiSidebarMenuBadge], ui-sidebar-menu-badge`, `ul[uiSidebarMenuSub], ui-sidebar-menu-sub`, `li[uiSidebarMenuSubItem], ui-sidebar-menu-sub-item`, `button[uiSidebarMenuButton], a[uiSidebarMenuButton], ui-sidebar-menu-button`, `a[uiSidebarMenuSubButton], button[uiSidebarMenuSubButton], ui-sidebar-menu-sub-button`.
|
|
59
|
+
|
|
60
|
+
Requires the `--sidebar-*` tokens (see the playground `styles.css`). Spec: `docs/behavior-specs/sidebar.md` · Manual test: `docs/manual-tests/sidebar.md`
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Skeleton
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SKELETON_GENERATED } from '@loomui-ng/ui/skeleton';
|
|
5
|
+
// add to the component `imports` array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiSkeleton class="h-4 w-40"></div>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<ui-skeleton class="h-4 w-40"></ui-skeleton>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
Parts (selectors): `[uiSkeleton], ui-skeleton`.
|
|
20
|
+
|
|
21
|
+
Spec: `docs/behavior-specs/skeleton.md` · Manual test: `docs/manual-tests/skeleton.md`
|
package/slider/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Slider
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SLIDER } from '@loomui-ng/ui/slider';
|
|
5
|
+
// add to the component `imports` array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<span uiSlider [(value)]="v" [min]="0" [max]="100" [step]="5"></span> <!-- v: number[], e.g. [25] -->
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
13
|
+
|
|
14
|
+
```html
|
|
15
|
+
<ui-slider [(value)]="v" [min]="0" [max]="100" [step]="5"></ui-slider> <!-- v: number[], e.g. [25] -->
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
| Input / output | Type / values | Default |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `value` (model) | `number[]` | `[0]` |
|
|
21
|
+
| `min` | | `0` |
|
|
22
|
+
| `max` | | `100` |
|
|
23
|
+
| `step` | | `1` |
|
|
24
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
|
|
25
|
+
| `disabled` | | `false` |
|
|
26
|
+
|
|
27
|
+
Parts (selectors): `span[uiSlider], ui-slider`.
|
|
28
|
+
|
|
29
|
+
Spec: `docs/behavior-specs/slider.md` · Manual test: `docs/manual-tests/slider.md`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Spinner
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_SPINNER } from '@loomui-ng/ui/spinner';
|
|
5
|
+
// add to the component `imports` array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<ui-spinner class="size-6" />
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
Parts (selectors): `ui-spinner`.
|
|
14
|
+
|
|
15
|
+
Spec: `docs/behavior-specs/spinner.md` · Manual test: `docs/manual-tests/spinner.md`
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* @loomui-ng/ui theme — generated by tools/build-theme-css.mjs. Import once in your global stylesheet AFTER tailwindcss:
|
|
3
|
+
*
|
|
4
|
+
* @import 'tailwindcss';
|
|
5
|
+
* @import '@loomui-ng/ui/styles/loomui.css';
|
|
6
|
+
*
|
|
7
|
+
* (class scanning of the package is configured inside this file via @source)
|
|
8
|
+
*
|
|
9
|
+
* Add class="dark" to <html> for dark mode; add e.g. class="theme-blue" for an accent preset.
|
|
10
|
+
*/
|
|
11
|
+
@import 'tw-animate-css';
|
|
12
|
+
@import '@angular/cdk/overlay-prebuilt.css';
|
|
13
|
+
|
|
14
|
+
/* Let Tailwind scan this package's compiled components for class names. */
|
|
15
|
+
@source "../";
|
|
16
|
+
|
|
17
|
+
@custom-variant dark (&:is(.dark *):not(:is(.force-light *)));
|
|
18
|
+
/* shadcn's current styles use data-open:/data-closed: next to Radix's data-state. Map both. */
|
|
19
|
+
@custom-variant data-open (&:where([data-state="open"], [data-open]));
|
|
20
|
+
@custom-variant data-closed (&:where([data-state="closed"], [data-closed]));
|
|
21
|
+
@custom-variant data-checked (&:where([data-state="checked"], [data-checked]));
|
|
22
|
+
@custom-variant data-unchecked (&:where([data-state="unchecked"], [data-unchecked]));
|
|
23
|
+
@custom-variant data-active (&:where([data-state="active"], [data-active]));
|
|
24
|
+
@custom-variant data-inactive (&:where([data-state="inactive"], [data-inactive]));
|
|
25
|
+
@custom-variant data-horizontal (&:where([data-orientation="horizontal"], [data-horizontal]));
|
|
26
|
+
@custom-variant data-vertical (&:where([data-orientation="vertical"], [data-vertical]));
|
|
27
|
+
|
|
28
|
+
:root,
|
|
29
|
+
.force-light {
|
|
30
|
+
--radius: 0.625rem;
|
|
31
|
+
--background: oklch(1 0 0);
|
|
32
|
+
--foreground: oklch(0.145 0 0);
|
|
33
|
+
--card: oklch(1 0 0);
|
|
34
|
+
--card-foreground: oklch(0.145 0 0);
|
|
35
|
+
--popover: oklch(1 0 0);
|
|
36
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
37
|
+
--primary: oklch(0.205 0 0);
|
|
38
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
39
|
+
--secondary: oklch(0.97 0 0);
|
|
40
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
41
|
+
--muted: oklch(0.97 0 0);
|
|
42
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
43
|
+
--accent: oklch(0.97 0 0);
|
|
44
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
45
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
46
|
+
--border: oklch(0.922 0 0);
|
|
47
|
+
--input: oklch(0.922 0 0);
|
|
48
|
+
--ring: oklch(0.708 0 0);
|
|
49
|
+
--chart-1: oklch(0.809 0.105 251.813);
|
|
50
|
+
--chart-2: oklch(0.623 0.214 259.815);
|
|
51
|
+
--chart-3: oklch(0.546 0.245 262.881);
|
|
52
|
+
--chart-4: oklch(0.488 0.243 264.376);
|
|
53
|
+
--chart-5: oklch(0.424 0.199 265.638);
|
|
54
|
+
--sidebar: oklch(0.985 0 0);
|
|
55
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
56
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
57
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
58
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
59
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
60
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
61
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.dark {
|
|
65
|
+
--background: oklch(0.145 0 0);
|
|
66
|
+
--foreground: oklch(0.985 0 0);
|
|
67
|
+
--card: oklch(0.205 0 0);
|
|
68
|
+
--card-foreground: oklch(0.985 0 0);
|
|
69
|
+
--popover: oklch(0.205 0 0);
|
|
70
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
71
|
+
--primary: oklch(0.922 0 0);
|
|
72
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
73
|
+
--secondary: oklch(0.269 0 0);
|
|
74
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
75
|
+
--muted: oklch(0.269 0 0);
|
|
76
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
77
|
+
--accent: oklch(0.269 0 0);
|
|
78
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
79
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
80
|
+
--border: oklch(1 0 0 / 10%);
|
|
81
|
+
--input: oklch(1 0 0 / 15%);
|
|
82
|
+
--ring: oklch(0.556 0 0);
|
|
83
|
+
--chart-1: oklch(0.809 0.105 251.813);
|
|
84
|
+
--chart-2: oklch(0.623 0.214 259.815);
|
|
85
|
+
--chart-3: oklch(0.546 0.245 262.881);
|
|
86
|
+
--chart-4: oklch(0.488 0.243 264.376);
|
|
87
|
+
--chart-5: oklch(0.424 0.199 265.638);
|
|
88
|
+
--sidebar: oklch(0.205 0 0);
|
|
89
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
90
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
91
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
92
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
93
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
94
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
95
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@theme inline {
|
|
99
|
+
--color-background: var(--background);
|
|
100
|
+
--color-foreground: var(--foreground);
|
|
101
|
+
--color-card: var(--card);
|
|
102
|
+
--color-card-foreground: var(--card-foreground);
|
|
103
|
+
--color-popover: var(--popover);
|
|
104
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
105
|
+
--color-primary: var(--primary);
|
|
106
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
107
|
+
--color-secondary: var(--secondary);
|
|
108
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
109
|
+
--color-muted: var(--muted);
|
|
110
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
111
|
+
--color-accent: var(--accent);
|
|
112
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
113
|
+
--color-destructive: var(--destructive);
|
|
114
|
+
--color-border: var(--border);
|
|
115
|
+
--color-input: var(--input);
|
|
116
|
+
--color-ring: var(--ring);
|
|
117
|
+
--color-chart-1: var(--chart-1);
|
|
118
|
+
--color-chart-2: var(--chart-2);
|
|
119
|
+
--color-chart-3: var(--chart-3);
|
|
120
|
+
--color-chart-4: var(--chart-4);
|
|
121
|
+
--color-chart-5: var(--chart-5);
|
|
122
|
+
--color-sidebar: var(--sidebar);
|
|
123
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
124
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
125
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
126
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
127
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
128
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
129
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
130
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
131
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
132
|
+
--radius-lg: var(--radius);
|
|
133
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@layer base {
|
|
137
|
+
* {
|
|
138
|
+
@apply border-border outline-ring/50;
|
|
139
|
+
}
|
|
140
|
+
body {
|
|
141
|
+
@apply bg-background text-foreground;
|
|
142
|
+
}
|
|
143
|
+
/* Native <select> popups are drawn by the browser: a transparent/tinted select would get a white list with light text.
|
|
144
|
+
Give options an explicit surface so they are readable in light and dark. */
|
|
145
|
+
select option,
|
|
146
|
+
select optgroup {
|
|
147
|
+
background-color: var(--popover);
|
|
148
|
+
color: var(--popover-foreground);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/* CDK overlay backdrop: shadcn animates the backdrop with tw-animate-css, so neutralise the CDK opacity fade. */
|
|
153
|
+
.cdk-overlay-backdrop[data-slot] {
|
|
154
|
+
opacity: 1;
|
|
155
|
+
transition: none;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.no-scrollbar {
|
|
159
|
+
-ms-overflow-style: none;
|
|
160
|
+
scrollbar-width: none;
|
|
161
|
+
}
|
|
162
|
+
.no-scrollbar::-webkit-scrollbar {
|
|
163
|
+
display: none;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* input-otp fake caret */
|
|
167
|
+
@theme inline {
|
|
168
|
+
--animate-caret-blink: caret-blink 1.25s ease-out infinite;
|
|
169
|
+
}
|
|
170
|
+
@keyframes caret-blink {
|
|
171
|
+
0%,
|
|
172
|
+
70%,
|
|
173
|
+
100% {
|
|
174
|
+
opacity: 1;
|
|
175
|
+
}
|
|
176
|
+
20%,
|
|
177
|
+
50% {
|
|
178
|
+
opacity: 0;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* ---------- Accent presets (class on <html>, combine with .dark) ---------- */
|
|
183
|
+
.theme-blue { --primary: oklch(0.546 0.245 262.881); --primary-foreground: oklch(0.985 0 0); --ring: oklch(0.623 0.214 259.815); --sidebar-primary: var(--primary); }
|
|
184
|
+
.dark.theme-blue { --primary: oklch(0.623 0.214 259.815); --ring: oklch(0.546 0.245 262.881); }
|
|
185
|
+
.theme-rose { --primary: oklch(0.586 0.253 17.585); --primary-foreground: oklch(0.985 0 0); --ring: oklch(0.645 0.246 16.439); --sidebar-primary: var(--primary); }
|
|
186
|
+
.dark.theme-rose { --primary: oklch(0.645 0.246 16.439); --ring: oklch(0.586 0.253 17.585); }
|
|
187
|
+
.theme-green { --primary: oklch(0.627 0.194 149.214); --primary-foreground: oklch(0.985 0 0); --ring: oklch(0.723 0.219 149.579); --sidebar-primary: var(--primary); }
|
|
188
|
+
.dark.theme-green { --primary: oklch(0.696 0.17 162.48); --primary-foreground: oklch(0.205 0 0); --ring: oklch(0.627 0.194 149.214); }
|
|
189
|
+
.theme-orange { --primary: oklch(0.646 0.222 41.116); --primary-foreground: oklch(0.985 0 0); --ring: oklch(0.705 0.213 47.604); --sidebar-primary: var(--primary); }
|
|
190
|
+
.dark.theme-orange { --primary: oklch(0.705 0.213 47.604); --primary-foreground: oklch(0.205 0 0); --ring: oklch(0.646 0.222 41.116); }
|
|
191
|
+
.theme-violet { --primary: oklch(0.541 0.281 293.009); --primary-foreground: oklch(0.985 0 0); --ring: oklch(0.606 0.25 292.717); --sidebar-primary: var(--primary); }
|
|
192
|
+
.dark.theme-violet { --primary: oklch(0.606 0.25 292.717); --ring: oklch(0.541 0.281 293.009); }
|
|
193
|
+
:is(.theme-blue, .theme-rose, .theme-green, .theme-orange, .theme-violet) {
|
|
194
|
+
--chart-1: color-mix(in oklab, var(--primary) 55%, white);
|
|
195
|
+
--chart-2: color-mix(in oklab, var(--primary) 80%, white);
|
|
196
|
+
--chart-3: var(--primary);
|
|
197
|
+
--chart-4: color-mix(in oklab, var(--primary) 78%, black);
|
|
198
|
+
--chart-5: color-mix(in oklab, var(--primary) 58%, black);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* ---- Toast (ui-toaster) ---- */
|
|
202
|
+
/* Styles for <ui-toaster>. Sonner ships its own injected CSS; this is the equivalent for the same data-* attributes.
|
|
203
|
+
Import once: @import '<path>/libs/ui/toast/toast.css'; */
|
|
204
|
+
|
|
205
|
+
ui-toaster {
|
|
206
|
+
display: contents;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
[data-sonner-toaster] {
|
|
210
|
+
position: fixed;
|
|
211
|
+
z-index: 999999999;
|
|
212
|
+
width: var(--width);
|
|
213
|
+
margin: 0;
|
|
214
|
+
padding: 0;
|
|
215
|
+
list-style: none;
|
|
216
|
+
outline: none;
|
|
217
|
+
pointer-events: none;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
[data-sonner-toaster][data-x-position='right'] { right: var(--offset-right); }
|
|
221
|
+
[data-sonner-toaster][data-x-position='left'] { left: var(--offset-left); }
|
|
222
|
+
[data-sonner-toaster][data-x-position='center'] { left: 50%; transform: translateX(-50%); }
|
|
223
|
+
[data-sonner-toaster][data-y-position='bottom'] { bottom: var(--offset-bottom); }
|
|
224
|
+
[data-sonner-toaster][data-y-position='top'] { top: var(--offset-top); }
|
|
225
|
+
|
|
226
|
+
@media (max-width: 600px) {
|
|
227
|
+
[data-sonner-toaster] {
|
|
228
|
+
width: calc(100% - 32px);
|
|
229
|
+
left: 16px !important;
|
|
230
|
+
right: 16px !important;
|
|
231
|
+
transform: none !important;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
[data-sonner-toast] {
|
|
236
|
+
--lift: -1;
|
|
237
|
+
position: absolute;
|
|
238
|
+
left: 0;
|
|
239
|
+
right: 0;
|
|
240
|
+
display: flex;
|
|
241
|
+
align-items: center;
|
|
242
|
+
gap: 8px;
|
|
243
|
+
box-sizing: border-box;
|
|
244
|
+
width: 100%;
|
|
245
|
+
padding: 16px;
|
|
246
|
+
border: 1px solid var(--normal-border);
|
|
247
|
+
border-radius: var(--border-radius);
|
|
248
|
+
background: var(--normal-bg);
|
|
249
|
+
color: var(--normal-text);
|
|
250
|
+
font-size: 13px;
|
|
251
|
+
line-height: 1.4;
|
|
252
|
+
box-shadow: 0 4px 12px rgb(0 0 0 / 0.1);
|
|
253
|
+
outline: none;
|
|
254
|
+
pointer-events: auto;
|
|
255
|
+
opacity: 0;
|
|
256
|
+
z-index: var(--z-index);
|
|
257
|
+
transition:
|
|
258
|
+
transform 400ms,
|
|
259
|
+
opacity 400ms;
|
|
260
|
+
transform: translateY(calc(var(--lift) * -100%));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
[data-sonner-toast][data-y-position='bottom'] { bottom: 0; --lift: -1; }
|
|
264
|
+
[data-sonner-toast][data-y-position='top'] { top: 0; --lift: 1; }
|
|
265
|
+
|
|
266
|
+
/* mounted + collapsed stack */
|
|
267
|
+
[data-sonner-toast][data-mounted='true'] {
|
|
268
|
+
opacity: 1;
|
|
269
|
+
transform: translateY(calc(var(--lift) * var(--index) * var(--gap)))
|
|
270
|
+
scale(calc(1 - var(--index) * 0.05));
|
|
271
|
+
}
|
|
272
|
+
[data-sonner-toast][data-mounted='true']:not([data-front='true']) { transition-timing-function: ease; }
|
|
273
|
+
|
|
274
|
+
/* hidden beyond visibleToasts */
|
|
275
|
+
[data-sonner-toast][data-visible='false'] { opacity: 0; pointer-events: none; }
|
|
276
|
+
|
|
277
|
+
/* expanded stack: offsets measured in TS (--offset px) */
|
|
278
|
+
[data-sonner-toast][data-mounted='true'][data-expanded='true'] {
|
|
279
|
+
transform: translateY(calc(var(--lift) * var(--offset)));
|
|
280
|
+
}
|
|
281
|
+
[data-sonner-toast][data-expanded='true'][data-visible='true'] { opacity: 1; }
|
|
282
|
+
|
|
283
|
+
/* removal */
|
|
284
|
+
[data-sonner-toast][data-removed='true'] {
|
|
285
|
+
opacity: 0;
|
|
286
|
+
pointer-events: none;
|
|
287
|
+
transform: translateY(calc(var(--lift) * -1 * 100%));
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* keep hover alive across the gap between toasts */
|
|
291
|
+
[data-sonner-toast]::after {
|
|
292
|
+
content: '';
|
|
293
|
+
position: absolute;
|
|
294
|
+
left: 0;
|
|
295
|
+
right: 0;
|
|
296
|
+
height: calc(var(--gap) + 1px);
|
|
297
|
+
bottom: 100%;
|
|
298
|
+
}
|
|
299
|
+
[data-sonner-toast][data-y-position='top']::after { top: 100%; bottom: auto; }
|
|
300
|
+
|
|
301
|
+
[data-sonner-toast] [data-content] { display: flex; flex-direction: column; gap: 2px; flex: 1; }
|
|
302
|
+
[data-sonner-toast] [data-title] { font-weight: 500; }
|
|
303
|
+
[data-sonner-toast] [data-description] { color: var(--muted-foreground); }
|
|
304
|
+
|
|
305
|
+
[data-sonner-toast] [data-icon] { display: flex; width: 16px; height: 16px; }
|
|
306
|
+
[data-sonner-toast] [data-icon] svg { width: 16px; height: 16px; }
|
|
307
|
+
[data-sonner-toast][data-type='success'] [data-icon] { color: oklch(0.627 0.194 149.2); }
|
|
308
|
+
[data-sonner-toast][data-type='error'] [data-icon] { color: var(--destructive); }
|
|
309
|
+
[data-sonner-toast][data-type='warning'] [data-icon] { color: oklch(0.769 0.188 70.08); }
|
|
310
|
+
[data-sonner-toast] [data-icon] svg[data-spin='true'] { animation: ui-toast-spin 1s linear infinite; }
|
|
311
|
+
|
|
312
|
+
[data-sonner-toast] [data-button] {
|
|
313
|
+
flex-shrink: 0;
|
|
314
|
+
height: 24px;
|
|
315
|
+
padding: 0 8px;
|
|
316
|
+
border: 0;
|
|
317
|
+
border-radius: 6px;
|
|
318
|
+
background: var(--primary);
|
|
319
|
+
color: var(--primary-foreground);
|
|
320
|
+
font-size: 12px;
|
|
321
|
+
font-weight: 500;
|
|
322
|
+
cursor: pointer;
|
|
323
|
+
}
|
|
324
|
+
[data-sonner-toast] [data-button]:focus-visible { outline: 2px solid var(--ring); outline-offset: 2px; }
|
|
325
|
+
|
|
326
|
+
@keyframes ui-toast-spin { to { transform: rotate(360deg); } }
|
|
327
|
+
|
|
328
|
+
@media (prefers-reduced-motion: reduce) {
|
|
329
|
+
[data-sonner-toast] { transition-duration: 1ms; }
|
|
330
|
+
}
|
package/switch/README.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# uiSwitch
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UiSwitch } from '@loomui-ng/ui/switch';
|
|
5
|
+
// add to the component imports array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<button uiSwitch [(checked)]="on"></button>
|
|
10
|
+
<button uiSwitch size="sm" [formControl]="ctrl"></button>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<ui-switch [(checked)]="on"></ui-switch>
|
|
17
|
+
<ui-switch size="sm" [formControl]="ctrl"></ui-switch>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Input | Values | Default |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `checked` | model boolean | `false` |
|
|
23
|
+
| `size` | `default` `sm` | `default` |
|
|
24
|
+
| `disabled` / `invalid` | boolean | `false` |
|
|
25
|
+
| `class` | extra classes | - |
|
|
26
|
+
|
|
27
|
+
ControlValueAccessor + signal-forms compatible shape. RTL mirrors the thumb.
|
|
28
|
+
|
|
29
|
+
Spec: docs/behavior-specs/switch.md - Manual checks: docs/manual-tests/switch.md
|
package/table/README.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Table
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_TABLE_GENERATED } from '@loomui-ng/ui/table';
|
|
5
|
+
// add to the component `imports` array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiTableContainer>
|
|
10
|
+
<table uiTable>
|
|
11
|
+
<thead uiTableHeader><tr uiTableRow><th uiTableHead>Name</th></tr></thead>
|
|
12
|
+
<tbody uiTableBody><tr uiTableRow><td uiTableCell>Ada</td></tr></tbody>
|
|
13
|
+
</table>
|
|
14
|
+
</div>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
18
|
+
|
|
19
|
+
```html
|
|
20
|
+
<ui-table-container>
|
|
21
|
+
<ui-table>
|
|
22
|
+
<ui-table-header><ui-table-row><ui-table-head>Name</ui-table-head></ui-table-row></ui-table-header>
|
|
23
|
+
<ui-table-body><ui-table-row><ui-table-cell>Ada</ui-table-cell></ui-table-row></ui-table-body>
|
|
24
|
+
</ui-table>
|
|
25
|
+
</ui-table-container>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Parts (selectors): `[uiTableContainer], ui-table-container`, `table[uiTable], ui-table`, `caption[uiTableCaption], ui-table-caption`, `thead[uiTableHeader], ui-table-header`, `tbody[uiTableBody], ui-table-body`, `tfoot[uiTableFooter], ui-table-footer`, `tr[uiTableRow], ui-table-row`, `th[uiTableHead], ui-table-head`, `td[uiTableCell], ui-table-cell`.
|
|
30
|
+
|
|
31
|
+
For sorting/filtering/pagination use the Data Table recipe (`@loomui-ng/ui/data-table` + TanStack Table). Spec: `docs/behavior-specs/table.md` · Manual test: `docs/manual-tests/table.md`
|
package/tabs/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# uiTabs
|
|
2
|
+
|
|
3
|
+
```ts
|
|
4
|
+
import { UI_TABS } from '@loomui-ng/ui/tabs';
|
|
5
|
+
// add to the component imports array
|
|
6
|
+
```
|
|
7
|
+
|
|
8
|
+
```html
|
|
9
|
+
<div uiTabs [(value)]="tab">
|
|
10
|
+
<div uiTabsList variant="line">
|
|
11
|
+
<button uiTabsTrigger value="a">A</button>
|
|
12
|
+
<button uiTabsTrigger value="b" disabled>B</button>
|
|
13
|
+
</div>
|
|
14
|
+
<div uiTabsContent value="a">…</div>
|
|
15
|
+
<div uiTabsContent value="b">…</div>
|
|
16
|
+
</div>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Same thing as custom elements (identical inputs; directives keep working):
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<ui-tabs [(value)]="tab">
|
|
23
|
+
<ui-tabs-list variant="line">
|
|
24
|
+
<ui-tabs-trigger value="a">A</ui-tabs-trigger>
|
|
25
|
+
<ui-tabs-trigger value="b" disabled>B</ui-tabs-trigger>
|
|
26
|
+
</ui-tabs-list>
|
|
27
|
+
<ui-tabs-content value="a">…</ui-tabs-content>
|
|
28
|
+
<ui-tabs-content value="b">…</ui-tabs-content>
|
|
29
|
+
</ui-tabs>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| Input | Values | Default |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `value` (uiTabs) | model string | - |
|
|
35
|
+
| `orientation` | `horizontal` `vertical` | `horizontal` |
|
|
36
|
+
| `activationMode` | `automatic` `manual` | `automatic` |
|
|
37
|
+
| `dir` | `ltr` `rtl` | inherited |
|
|
38
|
+
| `variant` (uiTabsList) | `default` `line` | `default` |
|
|
39
|
+
|
|
40
|
+
Uses CDK FocusKeyManager. Needs data-active/data-horizontal/data-vertical custom variants.
|
|
41
|
+
|
|
42
|
+
Spec: docs/behavior-specs/tabs.md - Manual checks: docs/manual-tests/tabs.md
|