@frame-kit/ui-ng 0.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/COMPONENTS.md +683 -0
- package/DEVELOPMENT_GUIDE.md +1102 -0
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/THEMING.md +130 -0
- package/core/headline/README.md +121 -0
- package/core/icon/README.md +173 -0
- package/core/image/README.md +210 -0
- package/core/link/README.md +297 -0
- package/core/separator/README.md +145 -0
- package/core/text/README.md +240 -0
- package/directives/infinite-scroll/README.md +102 -0
- package/directives/spotlight/README.md +154 -0
- package/directives/tooltip/README.md +147 -0
- package/docs/endpoint-link/README.md +142 -0
- package/docs/method-badge/README.md +154 -0
- package/fesm2022/frame-kit-ui-ng-core-headline.mjs +122 -0
- package/fesm2022/frame-kit-ui-ng-core-headline.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-icon.mjs +189 -0
- package/fesm2022/frame-kit-ui-ng-core-icon.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-image.mjs +123 -0
- package/fesm2022/frame-kit-ui-ng-core-image.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-link.mjs +369 -0
- package/fesm2022/frame-kit-ui-ng-core-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-separator.mjs +59 -0
- package/fesm2022/frame-kit-ui-ng-core-separator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-core-text.mjs +204 -0
- package/fesm2022/frame-kit-ui-ng-core-text.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs +74 -0
- package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs +76 -0
- package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs +425 -0
- package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs +63 -0
- package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs +43 -0
- package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-forms.mjs +3632 -0
- package/fesm2022/frame-kit-ui-ng-forms.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs +239 -0
- package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs +132 -0
- package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs +133 -0
- package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs +60 -0
- package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-services-toast.mjs +166 -0
- package/fesm2022/frame-kit-ui-ng-services-toast.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs +214 -0
- package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-alert.mjs +82 -0
- package/fesm2022/frame-kit-ui-ng-ui-alert.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs +76 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-badge.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs +68 -0
- package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-button.mjs +108 -0
- package/fesm2022/frame-kit-ui-ng-ui-button.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-callout.mjs +58 -0
- package/fesm2022/frame-kit-ui-ng-ui-callout.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-card.mjs +70 -0
- package/fesm2022/frame-kit-ui-ng-ui-card.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs +113 -0
- package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs +1288 -0
- package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs +456 -0
- package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs +398 -0
- package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs +398 -0
- package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs +125 -0
- package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs +113 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs +111 -0
- package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs +103 -0
- package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs +135 -0
- package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-loader.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-loader.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs +79 -0
- package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs +40 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs +110 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs +91 -0
- package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs +86 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs +443 -0
- package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-note.mjs +56 -0
- package/fesm2022/frame-kit-ui-ng-ui-note.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs +105 -0
- package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs +110 -0
- package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs +129 -0
- package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs +42 -0
- package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs +894 -0
- package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs +81 -0
- package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-toast.mjs +179 -0
- package/fesm2022/frame-kit-ui-ng-ui-toast.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs +143 -0
- package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs +191 -0
- package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs.map +1 -0
- package/fesm2022/frame-kit-ui-ng.mjs +58 -0
- package/fesm2022/frame-kit-ui-ng.mjs.map +1 -0
- package/layouts/app-shell/README.md +357 -0
- package/layouts/content-split/README.md +180 -0
- package/package.json +253 -0
- package/services/overlay-orchestrator/README.md +184 -0
- package/services/spotlight/README.md +61 -0
- package/services/toast/README.md +118 -0
- package/types/frame-kit-ui-ng-core-headline.d.ts +38 -0
- package/types/frame-kit-ui-ng-core-icon.d.ts +74 -0
- package/types/frame-kit-ui-ng-core-image.d.ts +93 -0
- package/types/frame-kit-ui-ng-core-link.d.ts +251 -0
- package/types/frame-kit-ui-ng-core-separator.d.ts +28 -0
- package/types/frame-kit-ui-ng-core-text.d.ts +186 -0
- package/types/frame-kit-ui-ng-directives-infinite-scroll.d.ts +42 -0
- package/types/frame-kit-ui-ng-directives-spotlight.d.ts +51 -0
- package/types/frame-kit-ui-ng-directives-tooltip.d.ts +70 -0
- package/types/frame-kit-ui-ng-docs-endpoint-link.d.ts +43 -0
- package/types/frame-kit-ui-ng-docs-method-badge.d.ts +30 -0
- package/types/frame-kit-ui-ng-forms.d.ts +1674 -0
- package/types/frame-kit-ui-ng-layouts-app-shell.d.ts +75 -0
- package/types/frame-kit-ui-ng-layouts-content-split.d.ts +43 -0
- package/types/frame-kit-ui-ng-services-overlay-orchestrator.d.ts +96 -0
- package/types/frame-kit-ui-ng-services-spotlight.d.ts +32 -0
- package/types/frame-kit-ui-ng-services-toast.d.ts +100 -0
- package/types/frame-kit-ui-ng-ui-accordion.d.ts +86 -0
- package/types/frame-kit-ui-ng-ui-alert.d.ts +34 -0
- package/types/frame-kit-ui-ng-ui-avatar-stack.d.ts +38 -0
- package/types/frame-kit-ui-ng-ui-avatar.d.ts +36 -0
- package/types/frame-kit-ui-ng-ui-badge.d.ts +33 -0
- package/types/frame-kit-ui-ng-ui-breadcrumb.d.ts +45 -0
- package/types/frame-kit-ui-ng-ui-button.d.ts +48 -0
- package/types/frame-kit-ui-ng-ui-callout.d.ts +26 -0
- package/types/frame-kit-ui-ng-ui-card.d.ts +30 -0
- package/types/frame-kit-ui-ng-ui-copyable-field.d.ts +62 -0
- package/types/frame-kit-ui-ng-ui-data-table.d.ts +482 -0
- package/types/frame-kit-ui-ng-ui-dialog.d.ts +166 -0
- package/types/frame-kit-ui-ng-ui-drawer.d.ts +130 -0
- package/types/frame-kit-ui-ng-ui-dropdown-menu.d.ts +77 -0
- package/types/frame-kit-ui-ng-ui-editable-field.d.ts +65 -0
- package/types/frame-kit-ui-ng-ui-icon-badge.d.ts +45 -0
- package/types/frame-kit-ui-ng-ui-icon-list.d.ts +67 -0
- package/types/frame-kit-ui-ng-ui-inline-edit.d.ts +44 -0
- package/types/frame-kit-ui-ng-ui-list-editor.d.ts +56 -0
- package/types/frame-kit-ui-ng-ui-loader.d.ts +32 -0
- package/types/frame-kit-ui-ng-ui-menu-item.d.ts +27 -0
- package/types/frame-kit-ui-ng-ui-nav-brand.d.ts +25 -0
- package/types/frame-kit-ui-ng-ui-nav-group.d.ts +60 -0
- package/types/frame-kit-ui-ng-ui-nav-separator.d.ts +33 -0
- package/types/frame-kit-ui-ng-ui-node-tree-breadcrumb.d.ts +35 -0
- package/types/frame-kit-ui-ng-ui-node-tree.d.ts +135 -0
- package/types/frame-kit-ui-ng-ui-note.d.ts +22 -0
- package/types/frame-kit-ui-ng-ui-numbered-list.d.ts +52 -0
- package/types/frame-kit-ui-ng-ui-pagination.d.ts +49 -0
- package/types/frame-kit-ui-ng-ui-progress-bar.d.ts +50 -0
- package/types/frame-kit-ui-ng-ui-sidenav-link.d.ts +24 -0
- package/types/frame-kit-ui-ng-ui-tabs.d.ts +266 -0
- package/types/frame-kit-ui-ng-ui-timeline.d.ts +42 -0
- package/types/frame-kit-ui-ng-ui-toast.d.ts +56 -0
- package/types/frame-kit-ui-ng-ui-user-menu.d.ts +87 -0
- package/types/frame-kit-ui-ng-ui-wizard-dialog.d.ts +116 -0
- package/types/frame-kit-ui-ng.d.ts +53 -0
- package/ui/accordion/README.md +261 -0
- package/ui/alert/README.md +211 -0
- package/ui/avatar/README.md +167 -0
- package/ui/avatar-stack/README.md +164 -0
- package/ui/badge/README.md +162 -0
- package/ui/breadcrumb/README.md +240 -0
- package/ui/button/README.md +184 -0
- package/ui/callout/README.md +159 -0
- package/ui/card/README.md +174 -0
- package/ui/copyable-field/README.md +235 -0
- package/ui/data-table/README.md +408 -0
- package/ui/dialog/README.md +222 -0
- package/ui/drawer/README.md +274 -0
- package/ui/dropdown-menu/README.md +336 -0
- package/ui/editable-field/README.md +171 -0
- package/ui/icon-badge/README.md +131 -0
- package/ui/icon-list/README.md +205 -0
- package/ui/inline-edit/README.md +135 -0
- package/ui/list-editor/README.md +162 -0
- package/ui/loader/README.md +160 -0
- package/ui/menu-item/README.md +204 -0
- package/ui/nav-brand/README.md +111 -0
- package/ui/nav-group/README.md +145 -0
- package/ui/nav-separator/README.md +44 -0
- package/ui/node-tree/README.md +278 -0
- package/ui/node-tree-breadcrumb/README.md +164 -0
- package/ui/note/README.md +146 -0
- package/ui/numbered-list/README.md +187 -0
- package/ui/pagination/README.md +174 -0
- package/ui/progress-bar/README.md +223 -0
- package/ui/sidenav-link/README.md +214 -0
- package/ui/tabs/README.md +204 -0
- package/ui/timeline/README.md +285 -0
- package/ui/toast/README.md +243 -0
- package/ui/user-menu/README.md +260 -0
- package/ui/wizard-dialog/README.md +283 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# fk-icon-list
|
|
2
|
+
|
|
3
|
+
A token-driven list that pairs each row's label with an icon marker. Ships as a pair: `fk-icon-list` is the container, `fk-icon-list-item` is the renderable row — use either a data-driven `items` input, content projection with `<fk-icon-list-item>` children, or a standalone `<fk-icon-list-item>` outside any list.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
### `fk-icon-list`
|
|
10
|
+
|
|
11
|
+
#### Inputs
|
|
12
|
+
|
|
13
|
+
| Input | Type | Default | Description |
|
|
14
|
+
| ----------- | --------------------------------- | ----------- | ----------------------------------------------------------------------------------------------- |
|
|
15
|
+
| `items` | `readonly IconListItem[] \| null` | `null` | Data-driven rows. When `null`, the list projects `<fk-icon-list-item>` children instead |
|
|
16
|
+
| `icon` | `string \| null` | `null` | Default icon for rows that don't set their own |
|
|
17
|
+
| `variant` | `IconListVariant` | `"default"` | Default tone inherited by items: `"default"`, `"primary"`, `"success"`, `"warning"`, `"danger"` |
|
|
18
|
+
| `size` | `IconListSize` | `"md"` | Default size inherited by items: `"sm"`, `"md"`, `"lg"` |
|
|
19
|
+
| `className` | `string` | `''` | Additional CSS classes merged onto the host element |
|
|
20
|
+
| `id` | `string \| null` | `null` | Optional ID applied to the inner `role="list"` container |
|
|
21
|
+
| `ariaLabel` | `string \| null` | `null` | Accessible label on the inner `role="list"` container |
|
|
22
|
+
|
|
23
|
+
### `fk-icon-list-item`
|
|
24
|
+
|
|
25
|
+
#### Inputs
|
|
26
|
+
|
|
27
|
+
| Input | Type | Default | Description |
|
|
28
|
+
| ----------- | ------------------------- | ------- | ------------------------------------------------------------- |
|
|
29
|
+
| `icon` | `string \| null` | `null` | Per-item icon name. Falls through to the parent list's `icon` |
|
|
30
|
+
| `variant` | `IconListVariant \| null` | `null` | Per-item tone override. Falls through to the parent list |
|
|
31
|
+
| `size` | `IconListSize \| null` | `null` | Per-item size override. Falls through to the parent list |
|
|
32
|
+
| `className` | `string` | `''` | Additional CSS classes merged onto the host element |
|
|
33
|
+
| `id` | `string \| null` | `null` | Optional ID applied to the host element |
|
|
34
|
+
| `ariaLabel` | `string \| null` | `null` | Accessible label when the label alone is insufficient |
|
|
35
|
+
|
|
36
|
+
#### Content
|
|
37
|
+
|
|
38
|
+
`fk-icon-list-item` projects its label content:
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<fk-icon-list-item icon="check">Your label here</fk-icon-list-item>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Outputs
|
|
45
|
+
|
|
46
|
+
None on either component.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Features
|
|
51
|
+
|
|
52
|
+
- Three usage modes — data-driven (`items` input), content-projection (`<fk-icon-list-item>` children), and standalone items outside a list
|
|
53
|
+
- Items inherit the list's `icon`, `variant`, and `size` via element-injector DI; any input on the item overrides the parent
|
|
54
|
+
- Token-driven icon colors (default / primary / success / warning / danger)
|
|
55
|
+
- Three size steps that scale both label typography and icon size
|
|
56
|
+
- Semantic `role="list"` / `role="listitem"` pairing; item roles are only advertised when inside an `fk-icon-list` container, so standalone items don't announce orphan list semantics
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Quick Start
|
|
61
|
+
|
|
62
|
+
Data-driven:
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<fk-icon-list [items]="items" icon="check" variant="success" />
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
readonly items = [
|
|
70
|
+
{ label: "Hierarchical RBAC" },
|
|
71
|
+
{ label: "Organization modeling" },
|
|
72
|
+
{ label: "Permission inheritance" },
|
|
73
|
+
];
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Content-projection:
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<fk-icon-list icon="check" variant="primary">
|
|
80
|
+
<fk-icon-list-item>Admin</fk-icon-list-item>
|
|
81
|
+
<fk-icon-list-item>Manager</fk-icon-list-item>
|
|
82
|
+
<fk-icon-list-item>Viewer</fk-icon-list-item>
|
|
83
|
+
</fk-icon-list>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Manual loop:
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<fk-icon-list variant="success">
|
|
90
|
+
@for (role of roles; track $index) {
|
|
91
|
+
<fk-icon-list-item [icon]="role.icon">{{ role.label }}</fk-icon-list-item>
|
|
92
|
+
}
|
|
93
|
+
</fk-icon-list>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Standalone:
|
|
97
|
+
|
|
98
|
+
```html
|
|
99
|
+
<fk-icon-list-item icon="check" variant="success"> One-off note without a list wrapper </fk-icon-list-item>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Import
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import { IconListComponent, IconListItemComponent } from '@frame-kit/ui-ng';
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
@Component({
|
|
112
|
+
selector: 'app-example',
|
|
113
|
+
imports: [IconListComponent, IconListItemComponent],
|
|
114
|
+
templateUrl: './example.component.html',
|
|
115
|
+
})
|
|
116
|
+
export class ExampleComponent {}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Selectors
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
<fk-icon-list></fk-icon-list> <fk-icon-list-item></fk-icon-list-item>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Examples
|
|
130
|
+
|
|
131
|
+
### Uniform marker with data-driven items
|
|
132
|
+
|
|
133
|
+
```html
|
|
134
|
+
<fk-icon-list [items]="items" icon="check" variant="primary" />
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Per-item icons and tone overrides
|
|
138
|
+
|
|
139
|
+
```html
|
|
140
|
+
<fk-icon-list variant="success" icon="check">
|
|
141
|
+
<fk-icon-list-item icon="shield-check">Secured endpoints</fk-icon-list-item>
|
|
142
|
+
<fk-icon-list-item icon="circle-check-outline" variant="primary"> Verified identities </fk-icon-list-item>
|
|
143
|
+
<fk-icon-list-item variant="danger">Flagged for review</fk-icon-list-item>
|
|
144
|
+
</fk-icon-list>
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Sizing
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<fk-icon-list [items]="items" icon="check" size="sm" />
|
|
151
|
+
<fk-icon-list [items]="items" icon="check" size="md" />
|
|
152
|
+
<fk-icon-list [items]="items" icon="check" size="lg" />
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Accessibility
|
|
158
|
+
|
|
159
|
+
- `fk-icon-list` renders `<div role="list">` so list semantics survive the `list-style: none` reset (Safari otherwise strips the implicit list role).
|
|
160
|
+
- `fk-icon-list-item` sets `role="listitem"` only when nested inside an `fk-icon-list` — this avoids announcing orphan list items when the component is used standalone.
|
|
161
|
+
- Each `fk-icon` child is decorative (`aria-hidden="true"`) — the projected label is the assistive-tech readable content.
|
|
162
|
+
- Set `ariaLabel` on the list when the surrounding context doesn't already name the collection.
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Design Tokens
|
|
167
|
+
|
|
168
|
+
```scss
|
|
169
|
+
/* Container */
|
|
170
|
+
--fk-icon-list-margin-top;
|
|
171
|
+
--fk-icon-list-row-gap;
|
|
172
|
+
|
|
173
|
+
/* Item */
|
|
174
|
+
--fk-icon-list-item-gap;
|
|
175
|
+
--fk-icon-list-item-label-color;
|
|
176
|
+
--fk-icon-list-item-line-height;
|
|
177
|
+
|
|
178
|
+
--fk-icon-list-item-sm-font-size;
|
|
179
|
+
--fk-icon-list-item-md-font-size;
|
|
180
|
+
--fk-icon-list-item-lg-font-size;
|
|
181
|
+
|
|
182
|
+
--fk-icon-list-item-default-color;
|
|
183
|
+
--fk-icon-list-item-primary-color;
|
|
184
|
+
--fk-icon-list-item-success-color;
|
|
185
|
+
--fk-icon-list-item-warning-color;
|
|
186
|
+
--fk-icon-list-item-danger-color;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Override in your app stylesheet:
|
|
190
|
+
|
|
191
|
+
```scss
|
|
192
|
+
:root {
|
|
193
|
+
--fk-icon-list-row-gap: 0.75rem;
|
|
194
|
+
--fk-icon-list-item-primary-color: var(--fk-color-primary-hover);
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Behavior Notes
|
|
201
|
+
|
|
202
|
+
- Data-driven mode internally renders `fk-icon-list-item` per row, so the DOM is identical whether you use `[items]` or content projection.
|
|
203
|
+
- If neither a list-level nor per-item icon is set, the icon slot is skipped — label-only rows still render cleanly.
|
|
204
|
+
- Icon color is applied via CSS `color` cascade onto `fk-icon`, whose SVG paths use `currentColor` — no per-icon `color` prop needed.
|
|
205
|
+
- Item `variant` / `size` inputs accept `null` (the default) to mean "inherit from parent"; pass a concrete value to override.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# fk-inline-edit
|
|
2
|
+
|
|
3
|
+
A click-to-edit component that toggles between a display value and an inline text input with save/cancel actions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
### Inputs
|
|
10
|
+
|
|
11
|
+
| Input | Type | Default | Description |
|
|
12
|
+
| ------------- | ---------------- | ------------------ | ------------------------------------ |
|
|
13
|
+
| `value` | `string` | `''` | The current display value |
|
|
14
|
+
| `placeholder` | `string` | `'Enter a value…'` | Placeholder text shown in the input |
|
|
15
|
+
| `size` | `InlineEditSize` | `'md'` | Size variant (`sm`, `md`, `lg`) |
|
|
16
|
+
| `emptyText` | `string` | `'None'` | Text shown when `value` is empty |
|
|
17
|
+
| `disabled` | `boolean` | `false` | Disables editing |
|
|
18
|
+
| `ariaLabel` | `string \| null` | `null` | ARIA label for the input and trigger |
|
|
19
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
20
|
+
| `id` | `string \| null` | `null` | Optional ID for the host |
|
|
21
|
+
|
|
22
|
+
### Outputs
|
|
23
|
+
|
|
24
|
+
| Output | Type | Description |
|
|
25
|
+
| ------------- | -------- | -------------------------------------- |
|
|
26
|
+
| `valueChange` | `string` | Emitted with the trimmed value on save |
|
|
27
|
+
| `editStart` | `void` | Emitted when entering edit mode |
|
|
28
|
+
| `editCancel` | `void` | Emitted when editing is cancelled |
|
|
29
|
+
|
|
30
|
+
### Content Slots
|
|
31
|
+
|
|
32
|
+
| Slot | Selector | Description |
|
|
33
|
+
| --------------- | -------------- | -------------------------------------------------- |
|
|
34
|
+
| **Edit icon** | `[editIcon]` | Custom icon for the edit trigger (replaces "Edit") |
|
|
35
|
+
| **Save icon** | `[saveIcon]` | Custom content for the save button |
|
|
36
|
+
| **Cancel icon** | `[cancelIcon]` | Custom content for the cancel button |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
- Click-to-edit with display/edit mode toggle
|
|
43
|
+
- Enter to save, Escape to cancel
|
|
44
|
+
- Auto-focuses input on edit start
|
|
45
|
+
- Size variants for different contexts (headings, body text, captions)
|
|
46
|
+
- Content slots for custom icons on trigger and action buttons
|
|
47
|
+
- Disabled state hides the edit trigger
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Quick Start
|
|
52
|
+
|
|
53
|
+
```html
|
|
54
|
+
<fk-inline-edit [value]="roleName" placeholder="Enter role name" size="lg" ariaLabel="Role name" (valueChange)="onNameChange($event)" />
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### With custom icons
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<fk-inline-edit [value]="description" (valueChange)="onDescChange($event)">
|
|
61
|
+
<fk-icon editIcon name="pen-outline" size="sm" />
|
|
62
|
+
</fk-inline-edit>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Import
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { InlineEditComponent } from '@frame-kit/ui-ng';
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
@Component({
|
|
75
|
+
selector: 'app-example',
|
|
76
|
+
imports: [InlineEditComponent],
|
|
77
|
+
templateUrl: './example.component.html',
|
|
78
|
+
})
|
|
79
|
+
export class ExampleComponent {}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Selector
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<fk-inline-edit></fk-inline-edit>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Accessibility
|
|
93
|
+
|
|
94
|
+
- Input receives focus automatically on edit start
|
|
95
|
+
- Enter key saves, Escape key cancels
|
|
96
|
+
- Edit trigger has `aria-label` derived from the `ariaLabel` input
|
|
97
|
+
- Focus ring uses `--fk-focus-ring` token
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Design Tokens
|
|
102
|
+
|
|
103
|
+
```scss
|
|
104
|
+
// Layout
|
|
105
|
+
--fk-inline-edit-gap
|
|
106
|
+
|
|
107
|
+
// Input
|
|
108
|
+
--fk-inline-edit-input-padding
|
|
109
|
+
--fk-inline-edit-input-bg
|
|
110
|
+
--fk-inline-edit-border-color
|
|
111
|
+
--fk-inline-edit-border-radius
|
|
112
|
+
--fk-inline-edit-focus-border
|
|
113
|
+
--fk-inline-edit-focus-ring
|
|
114
|
+
|
|
115
|
+
// Typography
|
|
116
|
+
--fk-inline-edit-font-size
|
|
117
|
+
--fk-inline-edit-font-weight
|
|
118
|
+
--fk-inline-edit-color
|
|
119
|
+
--fk-inline-edit-empty-color
|
|
120
|
+
--fk-inline-edit-action-font-size
|
|
121
|
+
|
|
122
|
+
// Large variant
|
|
123
|
+
--fk-inline-edit-lg-font-size
|
|
124
|
+
--fk-inline-edit-lg-font-weight
|
|
125
|
+
|
|
126
|
+
// Trigger
|
|
127
|
+
--fk-inline-edit-trigger-color
|
|
128
|
+
--fk-inline-edit-trigger-hover-color
|
|
129
|
+
|
|
130
|
+
// Actions
|
|
131
|
+
--fk-inline-edit-save-bg
|
|
132
|
+
--fk-inline-edit-save-color
|
|
133
|
+
--fk-inline-edit-cancel-bg
|
|
134
|
+
--fk-inline-edit-cancel-color
|
|
135
|
+
```
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# fk-list-editor
|
|
2
|
+
|
|
3
|
+
A token-driven list editor for building ordered string lists with add, remove, inline edit, and drag-to-reorder.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
### Inputs
|
|
8
|
+
|
|
9
|
+
| Input | Type | Default | Description |
|
|
10
|
+
| -------------- | ---------------- | ----------------------- | -------------------------------------------------- |
|
|
11
|
+
| `items` | `string[]` | `[]` | Two-way bound list of items (model) |
|
|
12
|
+
| `placeholder` | `string` | `"Add an item..."` | Placeholder for the add input |
|
|
13
|
+
| `emptyMessage` | `string` | `"No items added yet."` | Message shown when the list is empty |
|
|
14
|
+
| `addLabel` | `string` | `"Add"` | Label for the add button |
|
|
15
|
+
| `orderable` | `boolean` | `true` | Enable drag-to-reorder |
|
|
16
|
+
| `showOrder` | `boolean` | `true` | Show numbered order badges |
|
|
17
|
+
| `size` | `ListEditorSize` | `"md"` | Size variant (`"sm"` or `"md"`) |
|
|
18
|
+
| `lockedItems` | `string[]` | `[]` | Items that cannot be edited or removed (lowercase) |
|
|
19
|
+
| `className` | `string` | `""` | Additional CSS classes on host |
|
|
20
|
+
| `disabled` | `boolean` | `false` | Disables all interaction |
|
|
21
|
+
| `ariaLabel` | `string \| null` | `null` | Accessible label for the list container |
|
|
22
|
+
|
|
23
|
+
### Outputs
|
|
24
|
+
|
|
25
|
+
| Output | Type | Description |
|
|
26
|
+
| ------------- | --------------------------------- | ------------------------------------ |
|
|
27
|
+
| `itemsChange` | `string[]` | Emitted when the items array changes |
|
|
28
|
+
| `itemAdded` | `string` | Emitted when a new item is added |
|
|
29
|
+
| `itemRemoved` | `{ item: string; index: number }` | Emitted when an item is removed |
|
|
30
|
+
|
|
31
|
+
### Content
|
|
32
|
+
|
|
33
|
+
`fk-list-editor` does not use content projection. All configuration is via inputs.
|
|
34
|
+
|
|
35
|
+
## Features
|
|
36
|
+
|
|
37
|
+
- Add items via text input with Enter key or button click
|
|
38
|
+
- Remove items with the remove button
|
|
39
|
+
- Inline edit existing items
|
|
40
|
+
- Drag-to-reorder with CDK drag-drop
|
|
41
|
+
- Duplicate detection with error message
|
|
42
|
+
- Lock specific items from editing or removal
|
|
43
|
+
- Configurable order badges, placeholder, and labels
|
|
44
|
+
- Two size variants (sm, md)
|
|
45
|
+
- Full keyboard support
|
|
46
|
+
|
|
47
|
+
## Quick Start
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<fk-list-editor [(items)]="roles" placeholder="e.g. Admin, Editor, Viewer" addLabel="Add Role" />
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Import
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { ListEditorComponent } from '@frame-kit/ui-ng';
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
@Component({
|
|
61
|
+
selector: 'app-example',
|
|
62
|
+
imports: [ListEditorComponent],
|
|
63
|
+
templateUrl: './example.component.html',
|
|
64
|
+
})
|
|
65
|
+
export class ExampleComponent {}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Selector
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<fk-list-editor />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Examples
|
|
75
|
+
|
|
76
|
+
### Basic role editor
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<fk-list-editor [(items)]="roleNames" placeholder="e.g. Admin, Editor, Viewer" addLabel="Add Role" emptyMessage="No roles defined. Add your first role." />
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Non-orderable list
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<fk-list-editor [(items)]="tags" [orderable]="false" [showOrder]="false" placeholder="Add a tag..." addLabel="Add Tag" />
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### With locked items
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<fk-list-editor [(items)]="levels" [lockedItems]="inUseLevels" placeholder="Add a level..." addLabel="Add Level" />
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Accessibility
|
|
95
|
+
|
|
96
|
+
- The list container supports `ariaLabel` for screen readers
|
|
97
|
+
- Drag handles are keyboard accessible via CDK drag-drop
|
|
98
|
+
- Remove buttons include descriptive `title` attributes
|
|
99
|
+
- Disabled state prevents all interaction and applies `pointer-events: none`
|
|
100
|
+
- Focus ring uses the shared `--fk-focus-ring` token
|
|
101
|
+
|
|
102
|
+
## Design Tokens
|
|
103
|
+
|
|
104
|
+
```scss
|
|
105
|
+
--fk-list-editor-row-gap
|
|
106
|
+
--fk-list-editor-item-padding
|
|
107
|
+
--fk-list-editor-item-bg
|
|
108
|
+
--fk-list-editor-item-border-color
|
|
109
|
+
--fk-list-editor-item-radius
|
|
110
|
+
--fk-list-editor-item-hover-shadow
|
|
111
|
+
--fk-list-editor-handle-padding
|
|
112
|
+
--fk-list-editor-order-size
|
|
113
|
+
--fk-list-editor-order-radius
|
|
114
|
+
--fk-list-editor-order-bg
|
|
115
|
+
--fk-list-editor-order-color
|
|
116
|
+
--fk-list-editor-order-font-size
|
|
117
|
+
--fk-list-editor-order-font-weight
|
|
118
|
+
--fk-list-editor-input-padding
|
|
119
|
+
--fk-list-editor-input-border-color
|
|
120
|
+
--fk-list-editor-input-radius
|
|
121
|
+
--fk-list-editor-input-font-size
|
|
122
|
+
--fk-list-editor-input-color
|
|
123
|
+
--fk-list-editor-input-bg
|
|
124
|
+
--fk-list-editor-input-focus-border-color
|
|
125
|
+
--fk-list-editor-remove-color
|
|
126
|
+
--fk-list-editor-remove-hover-color
|
|
127
|
+
--fk-list-editor-remove-padding
|
|
128
|
+
--fk-list-editor-add-clear-reserve
|
|
129
|
+
--fk-list-editor-add-clear-offset
|
|
130
|
+
--fk-list-editor-add-clear-padding
|
|
131
|
+
--fk-list-editor-add-clear-radius
|
|
132
|
+
--fk-list-editor-focus-ring
|
|
133
|
+
--fk-list-editor-placeholder-height
|
|
134
|
+
--fk-list-editor-placeholder-border-color
|
|
135
|
+
--fk-list-editor-placeholder-bg
|
|
136
|
+
--fk-list-editor-empty-padding
|
|
137
|
+
--fk-list-editor-empty-color
|
|
138
|
+
--fk-list-editor-empty-font-size
|
|
139
|
+
--fk-list-editor-add-gap
|
|
140
|
+
--fk-list-editor-error-gap
|
|
141
|
+
--fk-list-editor-error-color
|
|
142
|
+
--fk-list-editor-error-font-size
|
|
143
|
+
--fk-list-editor-disabled-opacity
|
|
144
|
+
--fk-list-editor-drag-shadow
|
|
145
|
+
--fk-list-editor-drag-border-color
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Override in your app stylesheet:
|
|
149
|
+
|
|
150
|
+
```scss
|
|
151
|
+
:root {
|
|
152
|
+
--fk-list-editor-item-radius: 0.75rem;
|
|
153
|
+
--fk-list-editor-order-bg: #f0f0f0;
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Behavior Notes
|
|
158
|
+
|
|
159
|
+
- Duplicate detection is case-insensitive
|
|
160
|
+
- Pressing Enter in the add input triggers `addItem()`
|
|
161
|
+
- Locked items are matched case-insensitively against the `lockedItems` input
|
|
162
|
+
- The component uses Angular CDK drag-drop; `@angular/cdk` must be available
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# fk-loader
|
|
2
|
+
|
|
3
|
+
A lightweight loading spinner component with token-driven styling and zero external dependencies.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
### Inputs
|
|
10
|
+
|
|
11
|
+
| Input | Type | Default | Description |
|
|
12
|
+
| ----------- | ---------------- | ----------- | ----------------------------------------------------------------------------- |
|
|
13
|
+
| `size` | `LoaderSize` | `"md"` | Visual size of the loader (`xs`, `sm`, `md`, `lg`, `xl`) |
|
|
14
|
+
| `color` | `LoaderColor` | `"inherit"` | Color variant (`inherit`, `default`, `muted`, `primary`, `danger`, `success`) |
|
|
15
|
+
| `className` | `string` | `''` | Additional CSS classes merged onto the host element |
|
|
16
|
+
| `id` | `string \| null` | `null` | Optional ID for the loader element |
|
|
17
|
+
| `ariaLabel` | `string` | `"Loading"` | Accessible label describing what is loading |
|
|
18
|
+
|
|
19
|
+
### Content Slots
|
|
20
|
+
|
|
21
|
+
| Slot | Selector | Description |
|
|
22
|
+
| --------------- | ---------------- | ------------------------------------------------------ |
|
|
23
|
+
| **Custom icon** | `[fkLoaderIcon]` | Custom spinner icon, replaces the built-in default SVG |
|
|
24
|
+
|
|
25
|
+
### Outputs
|
|
26
|
+
|
|
27
|
+
`fk-loader` does not emit outputs; it is purely presentational.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Features
|
|
32
|
+
|
|
33
|
+
- Built-in inline SVG spinner — no icon registry dependency
|
|
34
|
+
- Optional custom icon via `[fkLoaderIcon]` content projection
|
|
35
|
+
- Size and color variants mapped to design tokens
|
|
36
|
+
- Can be embedded inline inside buttons, cards, and other components
|
|
37
|
+
- Accessible status indicator with `role="status"` and `aria-label`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```html
|
|
44
|
+
<!-- Uses built-in spinner, no setup needed -->
|
|
45
|
+
<fk-loader />
|
|
46
|
+
|
|
47
|
+
<!-- With a custom icon from the consumer app -->
|
|
48
|
+
<fk-loader size="sm">
|
|
49
|
+
<fk-icon fkLoaderIcon name="my-spinner" size="sm" />
|
|
50
|
+
</fk-loader>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Import
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { LoaderComponent } from '@frame-kit/ui-ng';
|
|
59
|
+
|
|
60
|
+
// Only needed if using custom icon slot:
|
|
61
|
+
import { FkLoaderIconDirective } from '@frame-kit/ui-ng';
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
@Component({
|
|
66
|
+
selector: 'app-example',
|
|
67
|
+
imports: [LoaderComponent],
|
|
68
|
+
templateUrl: './example.component.html',
|
|
69
|
+
})
|
|
70
|
+
export class ExampleComponent {}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Selector
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<fk-loader></fk-loader>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Examples
|
|
84
|
+
|
|
85
|
+
### Sizes
|
|
86
|
+
|
|
87
|
+
```html
|
|
88
|
+
<fk-loader size="xs" />
|
|
89
|
+
<fk-loader size="sm" />
|
|
90
|
+
<fk-loader size="md" />
|
|
91
|
+
<fk-loader size="lg" />
|
|
92
|
+
<fk-loader size="xl" />
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Color variants
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<fk-loader color="default" />
|
|
99
|
+
<fk-loader color="primary" />
|
|
100
|
+
<fk-loader color="muted" />
|
|
101
|
+
<fk-loader color="danger" />
|
|
102
|
+
<fk-loader color="success" />
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Custom icon
|
|
106
|
+
|
|
107
|
+
```html
|
|
108
|
+
<fk-loader size="md">
|
|
109
|
+
<fk-icon fkLoaderIcon name="my-custom-spinner" size="sm" />
|
|
110
|
+
</fk-loader>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Accessibility
|
|
116
|
+
|
|
117
|
+
- Uses `role="status"` on the host element
|
|
118
|
+
- `aria-label` describes the loading action (e.g. `"Loading"`, `"Saving"`)
|
|
119
|
+
- Should typically be paired with visible text for users who do not rely on assistive tech
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Design Tokens
|
|
124
|
+
|
|
125
|
+
```scss
|
|
126
|
+
// Animation
|
|
127
|
+
--fk-loader-animation-duration
|
|
128
|
+
|
|
129
|
+
// Sizes (fallback chain: component token → semantic token → raw value)
|
|
130
|
+
--fk-loader-size-xs // → --fk-font-size-xs → 0.75rem
|
|
131
|
+
--fk-loader-size-sm // → --fk-font-size-sm → 1rem
|
|
132
|
+
--fk-loader-size-md // → --fk-font-size-md → 1.25rem
|
|
133
|
+
--fk-loader-size-lg // → --fk-font-size-lg → 1.5rem
|
|
134
|
+
--fk-loader-size-xl // → --fk-font-size-xl → 2rem
|
|
135
|
+
|
|
136
|
+
// Colors (uses shared icon color tokens)
|
|
137
|
+
--fk-icon-color-default // → --fk-color-text → #1f2d3d
|
|
138
|
+
--fk-icon-color-primary // → --fk-color-primary → #0a84ff
|
|
139
|
+
--fk-icon-color-muted // → --fk-color-muted → #8a98a8
|
|
140
|
+
--fk-icon-color-danger // → --fk-color-danger → #e02424
|
|
141
|
+
--fk-icon-color-success // → --fk-color-success → #10b981
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Customizing Tokens
|
|
145
|
+
|
|
146
|
+
```css
|
|
147
|
+
:root {
|
|
148
|
+
--fk-loader-size-md: 1.5rem;
|
|
149
|
+
--fk-loader-animation-duration: 1.2s;
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## Behavior Notes
|
|
156
|
+
|
|
157
|
+
- The built-in SVG spinner renders automatically when no `[fkLoaderIcon]` content is projected
|
|
158
|
+
- When a custom icon is provided via `[fkLoaderIcon]`, the built-in SVG is hidden
|
|
159
|
+
- Use `inherit` for `color` when you want the loader to follow the surrounding text color
|
|
160
|
+
- The spinner animation is a simple CSS rotation, controlled by `--fk-loader-animation-duration`
|