@egose/shadcn-theme-ng-tw 0.0.28 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -13
- package/accordion/README.md +376 -34
- package/accordion/fesm2022/accordion.mjs +20 -20
- package/alert/README.md +343 -34
- package/alert/fesm2022/alert.mjs +18 -18
- package/alert-dialog/README.md +471 -5
- package/alert-dialog/fesm2022/alert-dialog.mjs +48 -48
- package/alert-dialog/types/alert-dialog.d.ts +1 -1
- package/aspect-ratio/README.md +272 -5
- package/aspect-ratio/fesm2022/aspect-ratio.mjs +9 -9
- package/autocomplete/README.md +473 -34
- package/autocomplete/fesm2022/autocomplete.mjs +54 -54
- package/autocomplete/types/autocomplete.d.ts +1 -1
- package/avatar/README.md +357 -5
- package/avatar/fesm2022/avatar.mjs +32 -32
- package/badge/README.md +289 -34
- package/badge/fesm2022/badge.mjs +4 -4
- package/basic-alert/README.md +324 -34
- package/basic-alert/fesm2022/basic-alert.mjs +4 -4
- package/basic-alert/types/basic-alert.d.ts +1 -1
- package/breadcrumb/README.md +406 -5
- package/breadcrumb/fesm2022/breadcrumb.mjs +34 -34
- package/button/README.md +453 -34
- package/button/fesm2022/button.mjs +96 -118
- package/button/types/button.d.ts +7 -10
- package/button-group/README.md +318 -5
- package/button-group/fesm2022/button-group.mjs +20 -20
- package/calendar/README.md +328 -34
- package/calendar/fesm2022/calendar.mjs +154 -154
- package/card/README.md +331 -5
- package/card/fesm2022/card.mjs +33 -33
- package/carousel/README.md +333 -5
- package/carousel/fesm2022/carousel.mjs +47 -44
- package/carousel/types/carousel.d.ts +1 -1
- package/checkbox/README.md +291 -34
- package/checkbox/fesm2022/checkbox.mjs +22 -20
- package/checkbox/types/checkbox.d.ts +5 -4
- package/collapsible/README.md +332 -5
- package/collapsible/fesm2022/collapsible.mjs +15 -15
- package/combobox/README.md +507 -5
- package/combobox/fesm2022/combobox.mjs +95 -92
- package/combobox/types/combobox.d.ts +1 -1
- package/command/README.md +435 -5
- package/command/fesm2022/command.mjs +56 -56
- package/confirmation-dialog/README.md +272 -34
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs +13 -12
- package/confirmation-dialog/types/confirmation-dialog.d.ts +9 -5
- package/context-menu/README.md +366 -5
- package/context-menu/fesm2022/context-menu.mjs +9 -9
- package/date-picker/README.md +436 -34
- package/date-picker/fesm2022/date-picker.mjs +79 -68
- package/date-picker/types/date-picker.d.ts +8 -4
- package/dialog/README.md +419 -34
- package/dialog/fesm2022/dialog.mjs +48 -48
- package/drawer/README.md +395 -5
- package/drawer/fesm2022/drawer.mjs +45 -45
- package/dropdown-menu/README.md +417 -5
- package/dropdown-menu/fesm2022/dropdown-menu.mjs +85 -73
- package/dropdown-menu/types/dropdown-menu.d.ts +4 -0
- package/empty/README.md +329 -5
- package/empty/fesm2022/empty.mjs +31 -31
- package/field/README.md +385 -5
- package/field/fesm2022/field.mjs +59 -59
- package/field/types/field.d.ts +1 -1
- package/form-checkbox/README.md +283 -34
- package/form-checkbox/fesm2022/form-checkbox.mjs +37 -19
- package/form-checkbox/types/form-checkbox.d.ts +7 -1
- package/form-date-picker/README.md +293 -34
- package/form-date-picker/fesm2022/form-date-picker.mjs +59 -24
- package/form-date-picker/types/form-date-picker.d.ts +7 -1
- package/form-field/README.md +327 -34
- package/form-field/fesm2022/form-field.mjs +30 -16
- package/form-field/types/form-field.d.ts +28 -20
- package/form-field-simple/README.md +311 -34
- package/form-field-simple/fesm2022/form-field-simple.mjs +4 -4
- package/form-searchable-multiselect/README.md +332 -34
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs +41 -21
- package/form-searchable-multiselect/types/form-searchable-multiselect.d.ts +8 -2
- package/form-select/README.md +321 -34
- package/form-select/fesm2022/form-select.mjs +62 -29
- package/form-select/types/form-select.d.ts +7 -1
- package/form-text-input/README.md +342 -34
- package/form-text-input/fesm2022/form-text-input.mjs +43 -55
- package/form-text-input/types/form-text-input.d.ts +9 -12
- package/form-textarea/README.md +318 -34
- package/form-textarea/fesm2022/form-textarea.mjs +42 -23
- package/form-textarea/types/form-textarea.d.ts +8 -1
- package/hover-card/README.md +256 -5
- package/hover-card/fesm2022/hover-card.mjs +19 -19
- package/icon/README.md +210 -34
- package/icon/fesm2022/icon.mjs +8 -8
- package/input/README.md +240 -34
- package/input/fesm2022/input.mjs +17 -12
- package/input/types/input.d.ts +2 -1
- package/input-group/README.md +335 -5
- package/input-group/fesm2022/input-group.mjs +37 -37
- package/input-group/types/input-group.d.ts +3 -3
- package/input-otp/README.md +375 -5
- package/input-otp/fesm2022/input-otp.mjs +27 -27
- package/item/README.md +385 -5
- package/item/fesm2022/item.mjs +54 -54
- package/kbd/README.md +291 -5
- package/kbd/fesm2022/kbd.mjs +13 -13
- package/label/README.md +243 -34
- package/label/fesm2022/label.mjs +9 -9
- package/label/types/label.d.ts +1 -1
- package/layout-simple/README.md +174 -44
- package/layout-simple/fesm2022/layout-simple.mjs +917 -398
- package/layout-simple/types/layout-simple.d.ts +180 -129
- package/menu/README.md +418 -0
- package/menu/fesm2022/menu.mjs +461 -0
- package/menu/package.json +24 -0
- package/menu/types/menu.d.ts +137 -0
- package/menubar/README.md +343 -5
- package/menubar/fesm2022/menubar.mjs +13 -13
- package/native-select/README.md +323 -5
- package/native-select/fesm2022/native-select.mjs +19 -19
- package/navigation-menu/README.md +369 -5
- package/navigation-menu/fesm2022/navigation-menu.mjs +37 -37
- package/package.json +183 -154
- package/pagination/README.md +388 -5
- package/pagination/fesm2022/pagination.mjs +63 -63
- package/popover/README.md +302 -34
- package/popover/fesm2022/popover.mjs +30 -30
- package/progress/README.md +311 -5
- package/progress/fesm2022/progress.mjs +13 -13
- package/radio-group/README.md +335 -34
- package/radio-group/fesm2022/radio-group.mjs +26 -19
- package/resizable/README.md +269 -5
- package/resizable/fesm2022/resizable.mjs +19 -19
- package/scroll-area/README.md +233 -5
- package/scroll-area/fesm2022/scroll-area.mjs +9 -9
- package/searchable-multiselect/README.md +294 -34
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs +63 -16
- package/searchable-multiselect/types/searchable-multiselect.d.ts +8 -2
- package/select/README.md +408 -34
- package/select/fesm2022/select.mjs +80 -72
- package/select/types/select.d.ts +3 -1
- package/separator/README.md +193 -34
- package/separator/fesm2022/separator.mjs +9 -9
- package/separator/types/separator.d.ts +1 -1
- package/sheet/README.md +282 -34
- package/sheet/fesm2022/sheet.mjs +30 -30
- package/sidebar/README.md +457 -5
- package/sidebar/fesm2022/sidebar.mjs +136 -134
- package/sidebar/types/sidebar.d.ts +3 -3
- package/skeleton/README.md +217 -5
- package/skeleton/fesm2022/skeleton.mjs +9 -9
- package/slider/README.md +273 -5
- package/slider/fesm2022/slider.mjs +29 -25
- package/sonner/README.md +317 -34
- package/sonner/fesm2022/sonner.mjs +9 -9
- package/spinner/README.md +255 -34
- package/spinner/fesm2022/spinner.mjs +8 -8
- package/switch/README.md +281 -34
- package/switch/fesm2022/switch.mjs +12 -14
- package/table/README.md +423 -5
- package/table/fesm2022/table.mjs +41 -41
- package/tabs/README.md +382 -34
- package/tabs/fesm2022/tabs.mjs +48 -38
- package/textarea/README.md +282 -5
- package/textarea/fesm2022/textarea.mjs +9 -9
- package/toggle/README.md +270 -5
- package/toggle/fesm2022/toggle.mjs +14 -14
- package/toggle-group/README.md +340 -5
- package/toggle-group/fesm2022/toggle-group.mjs +13 -13
- package/toggle-group/types/toggle-group.d.ts +13 -7
- package/tooltip/README.md +240 -34
- package/tooltip/fesm2022/tooltip.mjs +14 -14
- package/typography/README.md +271 -5
- package/typography/fesm2022/typography.mjs +53 -53
- package/typography/types/typography.d.ts +12 -12
- package/utils/README.md +274 -34
- package/utils/fesm2022/utils.mjs +68 -44
- package/accordion/fesm2022/accordion.mjs.map +0 -1
- package/alert/fesm2022/alert.mjs.map +0 -1
- package/alert-dialog/fesm2022/alert-dialog.mjs.map +0 -1
- package/aspect-ratio/fesm2022/aspect-ratio.mjs.map +0 -1
- package/autocomplete/fesm2022/autocomplete.mjs.map +0 -1
- package/avatar/fesm2022/avatar.mjs.map +0 -1
- package/badge/fesm2022/badge.mjs.map +0 -1
- package/basic-alert/fesm2022/basic-alert.mjs.map +0 -1
- package/breadcrumb/fesm2022/breadcrumb.mjs.map +0 -1
- package/button/fesm2022/button.mjs.map +0 -1
- package/button-group/fesm2022/button-group.mjs.map +0 -1
- package/calendar/fesm2022/calendar.mjs.map +0 -1
- package/card/fesm2022/card.mjs.map +0 -1
- package/carousel/fesm2022/carousel.mjs.map +0 -1
- package/checkbox/fesm2022/checkbox.mjs.map +0 -1
- package/collapsible/fesm2022/collapsible.mjs.map +0 -1
- package/combobox/fesm2022/combobox.mjs.map +0 -1
- package/command/fesm2022/command.mjs.map +0 -1
- package/confirmation-dialog/fesm2022/confirmation-dialog.mjs.map +0 -1
- package/context-menu/fesm2022/context-menu.mjs.map +0 -1
- package/date-picker/fesm2022/date-picker.mjs.map +0 -1
- package/dialog/fesm2022/dialog.mjs.map +0 -1
- package/drawer/fesm2022/drawer.mjs.map +0 -1
- package/dropdown-menu/fesm2022/dropdown-menu.mjs.map +0 -1
- package/empty/fesm2022/empty.mjs.map +0 -1
- package/field/fesm2022/field.mjs.map +0 -1
- package/form-checkbox/fesm2022/form-checkbox.mjs.map +0 -1
- package/form-date-picker/fesm2022/form-date-picker.mjs.map +0 -1
- package/form-field/fesm2022/form-field.mjs.map +0 -1
- package/form-field-simple/fesm2022/form-field-simple.mjs.map +0 -1
- package/form-searchable-multiselect/fesm2022/form-searchable-multiselect.mjs.map +0 -1
- package/form-select/fesm2022/form-select.mjs.map +0 -1
- package/form-text-input/fesm2022/form-text-input.mjs.map +0 -1
- package/form-textarea/fesm2022/form-textarea.mjs.map +0 -1
- package/hover-card/fesm2022/hover-card.mjs.map +0 -1
- package/icon/fesm2022/icon.mjs.map +0 -1
- package/input/fesm2022/input.mjs.map +0 -1
- package/input-group/fesm2022/input-group.mjs.map +0 -1
- package/input-otp/fesm2022/input-otp.mjs.map +0 -1
- package/item/fesm2022/item.mjs.map +0 -1
- package/kbd/fesm2022/kbd.mjs.map +0 -1
- package/label/fesm2022/label.mjs.map +0 -1
- package/layout-simple/fesm2022/layout-simple.mjs.map +0 -1
- package/menubar/fesm2022/menubar.mjs.map +0 -1
- package/native-select/fesm2022/native-select.mjs.map +0 -1
- package/navigation-menu/fesm2022/navigation-menu.mjs.map +0 -1
- package/pagination/fesm2022/pagination.mjs.map +0 -1
- package/popover/fesm2022/popover.mjs.map +0 -1
- package/progress/fesm2022/progress.mjs.map +0 -1
- package/radio-group/fesm2022/radio-group.mjs.map +0 -1
- package/resizable/fesm2022/resizable.mjs.map +0 -1
- package/scroll-area/fesm2022/scroll-area.mjs.map +0 -1
- package/searchable-multiselect/fesm2022/searchable-multiselect.mjs.map +0 -1
- package/select/fesm2022/select.mjs.map +0 -1
- package/separator/fesm2022/separator.mjs.map +0 -1
- package/sheet/fesm2022/sheet.mjs.map +0 -1
- package/sidebar/fesm2022/sidebar.mjs.map +0 -1
- package/skeleton/fesm2022/skeleton.mjs.map +0 -1
- package/slider/fesm2022/slider.mjs.map +0 -1
- package/sonner/fesm2022/sonner.mjs.map +0 -1
- package/spinner/fesm2022/spinner.mjs.map +0 -1
- package/switch/fesm2022/switch.mjs.map +0 -1
- package/table/fesm2022/table.mjs.map +0 -1
- package/tabs/fesm2022/tabs.mjs.map +0 -1
- package/textarea/fesm2022/textarea.mjs.map +0 -1
- package/toggle/fesm2022/toggle.mjs.map +0 -1
- package/toggle-group/fesm2022/toggle-group.mjs.map +0 -1
- package/tooltip/fesm2022/tooltip.mjs.map +0 -1
- package/typography/fesm2022/typography.mjs.map +0 -1
- package/utils/fesm2022/utils.mjs.map +0 -1
package/spinner/README.md
CHANGED
|
@@ -1,64 +1,285 @@
|
|
|
1
|
-
# Spinner
|
|
1
|
+
# Spinner (`@egose/shadcn-theme-ng/spinner`)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A loading spinner, equivalent to [shadcn/ui Spinner](https://ui.shadcn.com/docs/components/spinner). This subpath ships a single standalone component, `HlmSpinner`, that renders an animated [`@ng-icons`](https://www.ng-icons.dev/) `tablerLoader2` icon (spinning via `animate-spin`) inside a flex container with `role="status"`. There is no spartan-ng primitive underneath — it is a pure styled icon wrapper with `size`/`show` inputs.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> **Ships as:** `@egose/shadcn-theme-ng/spinner` and `@egose/shadcn-theme-ng-tw/spinner` (the `tw:`-prefixed Tailwind variant). See the [package README](../../README.md) for install steps, peer dependencies, Tailwind setup, and testing/release guidance. Do not publish this project directory independently.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Installation
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
|
|
10
|
+
# Plain Tailwind (no prefix)
|
|
11
|
+
npm install @egose/shadcn-theme-ng
|
|
12
|
+
|
|
13
|
+
# Or the tw:-prefixed variant
|
|
14
|
+
npm install @egose/shadcn-theme-ng-tw
|
|
11
15
|
```
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
No extra runtime install is needed — `@ng-icons/core` / `@ng-icons/tabler-icons` and `clsx`/`tailwind-merge` (via `utils`) arrive transitively. See the [package README](../../README.md) for the full peer-dependency table.
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
## Imports
|
|
20
|
+
|
|
21
|
+
All public symbols are re-exported from `projects/spinner/src/public-api.ts`:
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule } from '@egose/shadcn-theme-ng/spinner';
|
|
25
|
+
// tw variant:
|
|
26
|
+
// import { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule } from '@egose/shadcn-theme-ng-tw/spinner';
|
|
17
27
|
```
|
|
18
28
|
|
|
19
|
-
|
|
29
|
+
Standalone-component usage (preferred):
|
|
20
30
|
|
|
21
|
-
|
|
31
|
+
```ts
|
|
32
|
+
import { Component } from '@angular/core';
|
|
33
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
22
34
|
|
|
23
|
-
|
|
24
|
-
|
|
35
|
+
@Component({
|
|
36
|
+
selector: 'app-demo',
|
|
37
|
+
standalone: true,
|
|
38
|
+
imports: [...HlmSpinnerImports],
|
|
39
|
+
template: `<hlm-spinner />`,
|
|
40
|
+
})
|
|
41
|
+
export class DemoComponent {}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
NgModule usage:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { NgModule } from '@angular/core';
|
|
48
|
+
import { HlmSpinnerModule } from '@egose/shadcn-theme-ng/spinner';
|
|
49
|
+
|
|
50
|
+
@NgModule({ imports: [HlmSpinnerModule] })
|
|
51
|
+
export class FeatureModule {}
|
|
25
52
|
```
|
|
26
53
|
|
|
27
|
-
|
|
54
|
+
| Symbol | Kind | Description |
|
|
55
|
+
| ------------------- | -------------------- | ---------------------------------------------- |
|
|
56
|
+
| `HlmSpinner` | Standalone component | The `<hlm-spinner>` loading indicator. |
|
|
57
|
+
| `HlmSpinnerImports` | `const` array | `[HlmSpinner]` — spread into `imports: [...]`. |
|
|
58
|
+
| `HlmSpinnerModule` | NgModule | Imports + re-exports `HlmSpinner`. |
|
|
28
59
|
|
|
29
|
-
|
|
60
|
+
## Anatomy / Structure
|
|
30
61
|
|
|
31
|
-
|
|
62
|
+
```html
|
|
63
|
+
<!-- host element: <hlm-spinner role="status" class="flex … | hidden"> -->
|
|
64
|
+
<hlm-spinner />
|
|
65
|
+
<hlm-spinner size="2rem" />
|
|
66
|
+
<hlm-spinner [show]="loading()" class="my-4" spinnerClass="text-primary" />
|
|
67
|
+
```
|
|
32
68
|
|
|
33
|
-
|
|
69
|
+
The host carries `role="status"` and toggles `flex`/`hidden` from `show()`. The inner `<ng-icon>` always renders the fixed `tablerLoader2` glyph at `size()` with `animate-spin`.
|
|
34
70
|
|
|
35
|
-
|
|
36
|
-
cd dist/spinner
|
|
37
|
-
```
|
|
71
|
+
## API reference
|
|
38
72
|
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
npm publish
|
|
42
|
-
```
|
|
73
|
+
### `HlmSpinner` — selector `hlm-spinner` (component)
|
|
43
74
|
|
|
44
|
-
|
|
75
|
+
| Input | Type | Default | Description |
|
|
76
|
+
| -------------- | ------------------------------------------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
77
|
+
| `size` | `string` | `'1.5rem'` | Passed as `[size]` to the inner `<ng-icon>`; any CSS length (`'1rem'`, `'24px'`, …). |
|
|
78
|
+
| `show` | `boolean` | `true` | Toggles the host between `flex` (visible) and `hidden`. |
|
|
79
|
+
| `class` | `ClassValue` (aliased input `wrapperClass`) | `''` | Extra classes merged onto the **host container** via `hlm('flex-col items-center justify-center', show ? 'flex' : 'hidden', …)`. |
|
|
80
|
+
| `spinnerClass` | `ClassValue` | `''` | Extra classes merged onto the **inner icon** (`animate-spin`, primary color, inherit sizing). |
|
|
45
81
|
|
|
46
|
-
|
|
82
|
+
Public field:
|
|
47
83
|
|
|
48
|
-
|
|
49
|
-
|
|
84
|
+
| Member | Type | Description |
|
|
85
|
+
| ------ | --------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
86
|
+
| `icon` | `tablerLoader2` glyph | Fixed icon data bound to the inner `<ng-icon [svg]>`. Not an input — the glyph cannot be swapped via API. |
|
|
87
|
+
|
|
88
|
+
No outputs, no methods. Host attributes: `role="status"`.
|
|
89
|
+
|
|
90
|
+
## Examples
|
|
91
|
+
|
|
92
|
+
### 1. Basic usage
|
|
93
|
+
|
|
94
|
+
```ts
|
|
95
|
+
// demo-basic.component.ts
|
|
96
|
+
import { Component } from '@angular/core';
|
|
97
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
98
|
+
|
|
99
|
+
@Component({
|
|
100
|
+
selector: 'demo-basic',
|
|
101
|
+
standalone: true,
|
|
102
|
+
imports: [...HlmSpinnerImports],
|
|
103
|
+
template: `<hlm-spinner />`,
|
|
104
|
+
})
|
|
105
|
+
export class DemoBasic {}
|
|
50
106
|
```
|
|
51
107
|
|
|
52
|
-
|
|
108
|
+
```html
|
|
109
|
+
<hlm-spinner />
|
|
110
|
+
```
|
|
53
111
|
|
|
54
|
-
|
|
112
|
+
### 2. Sizes
|
|
55
113
|
|
|
56
|
-
|
|
57
|
-
|
|
114
|
+
`size` accepts any CSS length string passed straight to `<ng-icon [size]>`.
|
|
115
|
+
|
|
116
|
+
```ts
|
|
117
|
+
// demo-sizes.component.ts
|
|
118
|
+
import { Component } from '@angular/core';
|
|
119
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
120
|
+
|
|
121
|
+
@Component({
|
|
122
|
+
selector: 'demo-sizes',
|
|
123
|
+
standalone: true,
|
|
124
|
+
imports: [...HlmSpinnerImports],
|
|
125
|
+
template: `
|
|
126
|
+
<div class="flex items-end gap-6">
|
|
127
|
+
<hlm-spinner size="1rem" />
|
|
128
|
+
<hlm-spinner size="1.5rem" />
|
|
129
|
+
<hlm-spinner size="2.5rem" />
|
|
130
|
+
<hlm-spinner size="48px" />
|
|
131
|
+
</div>
|
|
132
|
+
`,
|
|
133
|
+
})
|
|
134
|
+
export class DemoSizes {}
|
|
58
135
|
```
|
|
59
136
|
|
|
60
|
-
|
|
137
|
+
### 3. Async loading state with `show`
|
|
138
|
+
|
|
139
|
+
```ts
|
|
140
|
+
// demo-async.component.ts
|
|
141
|
+
import { Component, inject, signal } from '@angular/core';
|
|
142
|
+
import { HttpClient } from '@angular/common/http';
|
|
143
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
144
|
+
import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
|
|
145
|
+
|
|
146
|
+
@Component({
|
|
147
|
+
selector: 'demo-async',
|
|
148
|
+
standalone: true,
|
|
149
|
+
imports: [...HlmSpinnerImports, ...HlmButtonImports],
|
|
150
|
+
template: `
|
|
151
|
+
<button hlmBtn (click)="reload()" [disabled]="loading()">Reload</button>
|
|
152
|
+
<hlm-spinner [show]="loading()" class="my-4" />
|
|
153
|
+
@if (!loading()) {
|
|
154
|
+
<p hlmP>Data: {{ data() ?? '—' }}</p>
|
|
155
|
+
}
|
|
156
|
+
`,
|
|
157
|
+
})
|
|
158
|
+
export class DemoAsync {
|
|
159
|
+
private readonly http = inject(HttpClient);
|
|
160
|
+
readonly loading = signal(false);
|
|
161
|
+
readonly data = signal<string | null>(null);
|
|
162
|
+
|
|
163
|
+
reload() {
|
|
164
|
+
this.loading.set(true);
|
|
165
|
+
this.http.get('/api/status', { responseType: 'text' }).subscribe({
|
|
166
|
+
next: (v) => {
|
|
167
|
+
this.data.set(v);
|
|
168
|
+
this.loading.set(false);
|
|
169
|
+
},
|
|
170
|
+
error: () => {
|
|
171
|
+
this.data.set('error');
|
|
172
|
+
this.loading.set(false);
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
> `show` hides with `display: none` (`hidden`) — the icon stays in the DOM. For conditional mounting instead, use `@if (loading()) { <hlm-spinner /> }`.
|
|
180
|
+
|
|
181
|
+
### 4. Inside a button (inline submitting state)
|
|
182
|
+
|
|
183
|
+
The spinner inherits font sizing from `spinnerClass`; pair it with a disabled button.
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
// demo-button.component.ts
|
|
187
|
+
import { Component, signal } from '@angular/core';
|
|
188
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
189
|
+
import { HlmButtonImports } from '@egose/shadcn-theme-ng/button';
|
|
190
|
+
|
|
191
|
+
@Component({
|
|
192
|
+
selector: 'demo-button',
|
|
193
|
+
standalone: true,
|
|
194
|
+
imports: [...HlmSpinnerImports, ...HlmButtonImports],
|
|
195
|
+
template: `
|
|
196
|
+
<button hlmBtn [disabled]="saving()">
|
|
197
|
+
@if (saving()) {
|
|
198
|
+
<hlm-spinner size="1rem" spinnerClass="[&>svg]:text-primary-foreground" />
|
|
199
|
+
}
|
|
200
|
+
{{ saving() ? 'Saving…' : 'Save changes' }}
|
|
201
|
+
</button>
|
|
202
|
+
`,
|
|
203
|
+
})
|
|
204
|
+
export class DemoButton {
|
|
205
|
+
readonly saving = signal(false);
|
|
206
|
+
|
|
207
|
+
save() {
|
|
208
|
+
this.saving.set(true);
|
|
209
|
+
setTimeout(() => this.saving.set(false), 1500);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 5. Custom colors and layout via `class` / `spinnerClass`
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
// demo-styled.component.ts
|
|
218
|
+
import { Component } from '@angular/core';
|
|
219
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
220
|
+
|
|
221
|
+
@Component({
|
|
222
|
+
selector: 'demo-styled',
|
|
223
|
+
standalone: true,
|
|
224
|
+
imports: [...HlmSpinnerImports],
|
|
225
|
+
template: `
|
|
226
|
+
<!-- centered page loader -->
|
|
227
|
+
<hlm-spinner size="3rem" class="min-h-40 w-full" spinnerClass="[&>svg]:text-muted-foreground" />
|
|
228
|
+
|
|
229
|
+
<!-- destructive-tinted spinner -->
|
|
230
|
+
<hlm-spinner size="1.25rem" spinnerClass="[&>svg]:text-destructive" />
|
|
231
|
+
`,
|
|
232
|
+
})
|
|
233
|
+
export class DemoStyled {}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`class` targets the outer flex container; `spinnerClass` targets the inner `<ng-icon>`/`<svg>`. Both merge through `hlm()` so Tailwind conflicts resolve.
|
|
237
|
+
|
|
238
|
+
### 6. Overlay + empty-state composition
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
// demo-overlay.component.ts
|
|
242
|
+
import { Component, signal } from '@angular/core';
|
|
243
|
+
import { HlmSpinnerImports } from '@egose/shadcn-theme-ng/spinner';
|
|
244
|
+
import { HlmCardImports } from '@egose/shadcn-theme-ng/card';
|
|
245
|
+
|
|
246
|
+
@Component({
|
|
247
|
+
selector: 'demo-overlay',
|
|
248
|
+
standalone: true,
|
|
249
|
+
imports: [...HlmSpinnerImports, ...HlmCardImports],
|
|
250
|
+
template: `
|
|
251
|
+
<section hlmCard class="relative min-h-48 p-6">
|
|
252
|
+
<h3 hlmH3>Dashboard</h3>
|
|
253
|
+
@if (loading()) {
|
|
254
|
+
<div class="absolute inset-0 flex items-center justify-center rounded-md bg-background/70 backdrop-blur-[1px]">
|
|
255
|
+
<hlm-spinner size="2rem" />
|
|
256
|
+
<span class="sr-only">Loading dashboard…</span>
|
|
257
|
+
</div>
|
|
258
|
+
} @else {
|
|
259
|
+
<p hlmP>Dashboard content goes here.</p>
|
|
260
|
+
}
|
|
261
|
+
</section>
|
|
262
|
+
`,
|
|
263
|
+
})
|
|
264
|
+
export class DemoOverlay {
|
|
265
|
+
readonly loading = signal(true);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Accessibility notes
|
|
270
|
+
|
|
271
|
+
- The host has `role="status"` so assistive tech announces the loading state; add adjacent text (visible or `.sr-only`, e.g. “Loading…”) describing _what_ is loading — the icon alone conveys nothing to screen readers.
|
|
272
|
+
- Keep `show`-hidden spinners out of the tab order (they contain no focusable elements by default — do not add any).
|
|
273
|
+
- For actions that take >1s, disable the triggering control while `show` is true to prevent duplicate submissions.
|
|
274
|
+
- Avoid stacking multiple spinners in one view; a single `role="status"` region per async region is enough.
|
|
275
|
+
|
|
276
|
+
## Theming / CSS variables
|
|
277
|
+
|
|
278
|
+
The icon inherits `text-primary` by default (`[&>svg]:text-primary`); override with `spinnerClass` (e.g. `spinnerClass="[&>svg]:text-muted-foreground"`). Sizing is fully controlled by `size`. No additional CSS variables.
|
|
61
279
|
|
|
62
|
-
##
|
|
280
|
+
## Related subpaths
|
|
63
281
|
|
|
64
|
-
|
|
282
|
+
- `@egose/shadcn-theme-ng/button` — inline submitting states.
|
|
283
|
+
- `@egose/shadcn-theme-ng/skeleton` — content placeholders to pair with spinners.
|
|
284
|
+
- `@egose/shadcn-theme-ng/sonner` — notify on async completion (`toast.promise()`).
|
|
285
|
+
- `@egose/shadcn-theme-ng/card` — surfaces to overlay a spinner on.
|
|
@@ -22,10 +22,10 @@ class HlmSpinner {
|
|
|
22
22
|
_iconClass = computed(() => hlm('tw:[&>svg]:animate-spin tw:[&>svg]:text-primary tw:[&>svg]:w-[inherit]! tw:[&>svg]:h-[inherit]!', // base svg styles
|
|
23
23
|
this.spinnerClass()), /* @ts-ignore */
|
|
24
24
|
...(ngDevMode ? [{ debugName: "_iconClass" }] : /* istanbul ignore next */ []));
|
|
25
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
26
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.
|
|
25
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinner, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
26
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.3", type: HlmSpinner, isStandalone: true, selector: "hlm-spinner", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, show: { classPropertyName: "show", publicName: "show", isSignal: true, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, spinnerClass: { classPropertyName: "spinnerClass", publicName: "spinnerClass", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "status" }, properties: { "class": "_containerClass()" } }, ngImport: i0, template: `<ng-icon [svg]="icon" [size]="size()" [class]="_iconClass()" />`, isInline: true, dependencies: [{ kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
27
27
|
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
28
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinner, decorators: [{
|
|
29
29
|
type: Component,
|
|
30
30
|
args: [{
|
|
31
31
|
selector: 'hlm-spinner',
|
|
@@ -45,11 +45,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
45
45
|
*/
|
|
46
46
|
const HlmSpinnerImports = [HlmSpinner];
|
|
47
47
|
class HlmSpinnerModule {
|
|
48
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.
|
|
49
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.
|
|
50
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.
|
|
48
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
49
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinner], exports: [HlmSpinner] });
|
|
50
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, imports: [HlmSpinnerImports] });
|
|
51
51
|
}
|
|
52
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: HlmSpinnerModule, decorators: [{
|
|
53
53
|
type: NgModule,
|
|
54
54
|
args: [{
|
|
55
55
|
imports: [...HlmSpinnerImports],
|
|
@@ -62,4 +62,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
62
62
|
*/
|
|
63
63
|
|
|
64
64
|
export { HlmSpinner, HlmSpinnerImports, HlmSpinnerModule };
|
|
65
|
-
|
|
65
|
+
|