@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,261 @@
|
|
|
1
|
+
# fk-accordion
|
|
2
|
+
|
|
3
|
+
A token-driven accordion/disclosure component for collapsible sections. A single-header trigger toggles a projected panel body.
|
|
4
|
+
|
|
5
|
+
## API
|
|
6
|
+
|
|
7
|
+
### Inputs
|
|
8
|
+
|
|
9
|
+
| Input | Type | Default | Description |
|
|
10
|
+
| ----------------- | ---------------- | ------- | ----------------------------------------------------------------------- |
|
|
11
|
+
| `title` | `string` | `""` | First line of the header — vertically centered with the leading icon. |
|
|
12
|
+
| `description` | `string \| null` | `null` | Optional second line rendered below the title. |
|
|
13
|
+
| `leadingText` | `string \| null` | `null` | Optional label rendered immediately before the chevron (e.g. "Scopes"). |
|
|
14
|
+
| `size` | `AccordionSize` | `"md"` | `"sm"` or `"md"` — controls header padding and title font size. |
|
|
15
|
+
| `disabled` | `boolean` | `false` | Disables interaction and dims the entry. |
|
|
16
|
+
| `defaultExpanded` | `boolean` | `false` | When `true`, the accordion starts in the expanded state. |
|
|
17
|
+
| `className` | `string` | `""` | Additional CSS classes merged onto the host. |
|
|
18
|
+
| `id` | `string \| null` | `null` | Optional host id. |
|
|
19
|
+
| `ariaLabel` | `string \| null` | `null` | Accessible label applied to the header button. |
|
|
20
|
+
|
|
21
|
+
### Outputs
|
|
22
|
+
|
|
23
|
+
| Output | Type | Description |
|
|
24
|
+
| ---------------- | ----------------------- | --------------------------------------------------- |
|
|
25
|
+
| `expandedChange` | `EventEmitter<boolean>` | Emits the new expanded state when the user toggles. |
|
|
26
|
+
|
|
27
|
+
### Content
|
|
28
|
+
|
|
29
|
+
Three projection targets:
|
|
30
|
+
|
|
31
|
+
- **Default slot** — panel body (rendered only while expanded).
|
|
32
|
+
- **`[fkAccordionLeadingIcon]`** — icon slot before the title/description stack.
|
|
33
|
+
- **`[fkAccordionChevron]`** — replaces the default chevron SVG.
|
|
34
|
+
|
|
35
|
+
```html
|
|
36
|
+
<fk-accordion title="API key" description="Management API key" leadingText="Scopes">
|
|
37
|
+
<fk-icon fkAccordionLeadingIcon name="law-shield" size="md" />
|
|
38
|
+
<p>read:users, write:users</p>
|
|
39
|
+
</fk-accordion>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Features
|
|
43
|
+
|
|
44
|
+
- Title + optional description, both vertically centered with the leading icon.
|
|
45
|
+
- Optional leading-text label immediately before the chevron.
|
|
46
|
+
- Built-in inline chevron SVG — no icon-library dependency.
|
|
47
|
+
- Chevron rotates 180° (down → up) on expand.
|
|
48
|
+
- Consumer may override the chevron via the `[fkAccordionChevron]` slot.
|
|
49
|
+
- Panel body is content-projected and only mounted while expanded.
|
|
50
|
+
- Fully token-driven — no brand styling in the component.
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
```html
|
|
55
|
+
<fk-accordion title="API key" description="Management API key">
|
|
56
|
+
<p>Panel content goes here.</p>
|
|
57
|
+
</fk-accordion>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Import
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import { AccordionComponent, FkAccordionChevronDirective, FkAccordionLeadingIconDirective } from '@frame-kit/ui-ng';
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
@Component({
|
|
68
|
+
selector: 'app-example',
|
|
69
|
+
imports: [AccordionComponent, FkAccordionChevronDirective, FkAccordionLeadingIconDirective],
|
|
70
|
+
templateUrl: './example.component.html',
|
|
71
|
+
})
|
|
72
|
+
export class ExampleComponent {}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Selector
|
|
76
|
+
|
|
77
|
+
`fk-accordion`
|
|
78
|
+
|
|
79
|
+
## Examples
|
|
80
|
+
|
|
81
|
+
### Title only
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<fk-accordion title="API key"></fk-accordion>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Title + description
|
|
88
|
+
|
|
89
|
+
```html
|
|
90
|
+
<fk-accordion title="API key" description="Management API key"></fk-accordion>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### With a leading icon
|
|
94
|
+
|
|
95
|
+
```html
|
|
96
|
+
<fk-accordion title="API key" description="Management API key">
|
|
97
|
+
<fk-icon fkAccordionLeadingIcon name="law-shield" size="md" />
|
|
98
|
+
</fk-accordion>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### With a leading-text label (auth-summary "Scopes" pattern)
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<fk-accordion title="API key" description="Management API key" leadingText="Scopes">
|
|
105
|
+
<fk-icon fkAccordionLeadingIcon name="law-shield" size="md" />
|
|
106
|
+
<p>read:users, write:users</p>
|
|
107
|
+
</fk-accordion>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Custom chevron
|
|
111
|
+
|
|
112
|
+
```html
|
|
113
|
+
<fk-accordion title="API key">
|
|
114
|
+
<fk-icon fkAccordionChevron name="lock-password" size="sm" />
|
|
115
|
+
</fk-accordion>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
> Rotation of a custom chevron is the consumer's responsibility — style against the host class `fk-accordion--expanded` if needed.
|
|
119
|
+
|
|
120
|
+
## Accessibility
|
|
121
|
+
|
|
122
|
+
- The header is a native `<button type="button">`, keyboard-reachable and operable with `Enter` / `Space`.
|
|
123
|
+
- `aria-expanded` tracks the current state.
|
|
124
|
+
- `aria-controls` links the trigger to the panel; `aria-labelledby` on the panel links back to the trigger.
|
|
125
|
+
- The panel uses `role="region"` only when expanded.
|
|
126
|
+
- Leading icon and default chevron are marked `aria-hidden="true"` (decorative).
|
|
127
|
+
- Disabled state sets the native `disabled` attribute on the trigger.
|
|
128
|
+
|
|
129
|
+
## Design Tokens
|
|
130
|
+
|
|
131
|
+
```scss
|
|
132
|
+
--fk-accordion-color
|
|
133
|
+
--fk-accordion-border-color
|
|
134
|
+
--fk-accordion-border-width
|
|
135
|
+
--fk-accordion-radius
|
|
136
|
+
--fk-accordion-header-bg
|
|
137
|
+
--fk-accordion-header-bg-hover
|
|
138
|
+
--fk-accordion-header-bg-expanded
|
|
139
|
+
--fk-accordion-header-padding-block
|
|
140
|
+
--fk-accordion-header-padding-inline
|
|
141
|
+
--fk-accordion-leading-icon-gap
|
|
142
|
+
--fk-accordion-trailing-gap
|
|
143
|
+
--fk-accordion-title-color
|
|
144
|
+
--fk-accordion-title-font-size
|
|
145
|
+
--fk-accordion-title-font-weight
|
|
146
|
+
--fk-accordion-description-color
|
|
147
|
+
--fk-accordion-description-font-size
|
|
148
|
+
--fk-accordion-description-gap
|
|
149
|
+
--fk-accordion-leading-text-color
|
|
150
|
+
--fk-accordion-leading-text-font-size
|
|
151
|
+
--fk-accordion-leading-text-font-weight
|
|
152
|
+
--fk-accordion-leading-text-gap
|
|
153
|
+
--fk-accordion-chevron-color
|
|
154
|
+
--fk-accordion-panel-color
|
|
155
|
+
--fk-accordion-panel-gap
|
|
156
|
+
--fk-accordion-panel-padding-block
|
|
157
|
+
--fk-accordion-panel-padding-inline
|
|
158
|
+
--fk-accordion-focus-ring
|
|
159
|
+
--fk-accordion-sm-header-padding-block
|
|
160
|
+
--fk-accordion-sm-header-padding-inline
|
|
161
|
+
--fk-accordion-sm-title-font-size
|
|
162
|
+
--fk-accordion-sm-description-font-size
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Override in your app stylesheet:
|
|
166
|
+
|
|
167
|
+
```scss
|
|
168
|
+
:root {
|
|
169
|
+
--fk-accordion-header-padding-inline: 1.25rem;
|
|
170
|
+
--fk-accordion-chevron-color: var(--fk-color-primary);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Behavior Notes
|
|
175
|
+
|
|
176
|
+
- Internal `expanded` state — pass `defaultExpanded` for initial value; listen to `expandedChange` to observe user toggles.
|
|
177
|
+
- The panel is **only mounted when expanded** — queries, event listeners, and child lifecycle hooks inside the panel fire on open.
|
|
178
|
+
- Disabled accordions cannot toggle (neither via click nor keyboard) and are rendered at reduced opacity.
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
# fk-accordion-group
|
|
183
|
+
|
|
184
|
+
A wrapper that enforces single-open behavior across a set of `<fk-accordion>` children. Opening one accordion auto-collapses the previously active one.
|
|
185
|
+
|
|
186
|
+
## API
|
|
187
|
+
|
|
188
|
+
### Inputs
|
|
189
|
+
|
|
190
|
+
| Input | Type | Default | Description |
|
|
191
|
+
| ----------- | -------- | ------- | ----------------------------------- |
|
|
192
|
+
| `className` | `string` | `""` | Additional CSS classes on the host. |
|
|
193
|
+
|
|
194
|
+
### Outputs
|
|
195
|
+
|
|
196
|
+
None.
|
|
197
|
+
|
|
198
|
+
### Content
|
|
199
|
+
|
|
200
|
+
Project any number of `<fk-accordion>` elements. Non-accordion content is allowed but only `<fk-accordion>` children participate in the single-open enforcement.
|
|
201
|
+
|
|
202
|
+
## Features
|
|
203
|
+
|
|
204
|
+
- Opening any accordion collapses whichever sibling was previously open.
|
|
205
|
+
- Zero API change on the child: existing `<fk-accordion>` elements opt in just by being projected.
|
|
206
|
+
- `defaultExpanded` still honored — if more than one child sets it, only the first wins; the rest are force-collapsed on mount.
|
|
207
|
+
- Closing the active accordion leaves the group with nothing open.
|
|
208
|
+
- Standard top-margin rhythm between children via `--fk-accordion-group-gap`.
|
|
209
|
+
|
|
210
|
+
## Quick Start
|
|
211
|
+
|
|
212
|
+
```html
|
|
213
|
+
<fk-accordion-group>
|
|
214
|
+
<fk-accordion title="API key" description="Management API key">…</fk-accordion>
|
|
215
|
+
<fk-accordion title="Bearer token" description="Authorization header">…</fk-accordion>
|
|
216
|
+
</fk-accordion-group>
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
## Import
|
|
220
|
+
|
|
221
|
+
```ts
|
|
222
|
+
import { AccordionComponent, AccordionGroupComponent } from '@frame-kit/ui-ng';
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
@Component({
|
|
227
|
+
selector: 'app-example',
|
|
228
|
+
imports: [AccordionGroupComponent, AccordionComponent],
|
|
229
|
+
templateUrl: './example.component.html',
|
|
230
|
+
})
|
|
231
|
+
export class ExampleComponent {}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Selector
|
|
235
|
+
|
|
236
|
+
`fk-accordion-group`
|
|
237
|
+
|
|
238
|
+
## Accessibility
|
|
239
|
+
|
|
240
|
+
- The group adds no extra landmark role — each child accordion retains its native `<button>` trigger, `aria-expanded`, and `aria-controls` wiring.
|
|
241
|
+
- Single-open is enforced imperatively; assistive tech announces each accordion's individual state change.
|
|
242
|
+
|
|
243
|
+
## Design Tokens
|
|
244
|
+
|
|
245
|
+
```scss
|
|
246
|
+
--fk-accordion-group-gap
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Override:
|
|
250
|
+
|
|
251
|
+
```scss
|
|
252
|
+
:root {
|
|
253
|
+
--fk-accordion-group-gap: 0.5rem;
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Behavior Notes
|
|
258
|
+
|
|
259
|
+
- **Single-open**: exactly one (or zero) child accordion is expanded at any time.
|
|
260
|
+
- **Groups are independent**: nesting groups is supported — each group has its own scoped coordinator.
|
|
261
|
+
- **Accordions outside a group** behave normally — no coordination, any number may be open simultaneously.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
# fk-alert
|
|
2
|
+
|
|
3
|
+
A token-driven alert component for displaying contextual messages such as info notices, success confirmations, warnings, and errors.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
### Inputs
|
|
10
|
+
|
|
11
|
+
| Input | Type | Default | Description |
|
|
12
|
+
| ----------------- | ---------------- | -------- | ----------------------------------------------------------- |
|
|
13
|
+
| `variant` | `AlertVariant` | `'info'` | Visual style: `'info'`, `'success'`, `'warning'`, `'error'` |
|
|
14
|
+
| `color` | `string \| null` | `null` | Custom text color (inline override) |
|
|
15
|
+
| `backgroundColor` | `string \| null` | `null` | Custom background color (inline override) |
|
|
16
|
+
| `borderColor` | `string \| null` | `null` | Custom border color (inline override) |
|
|
17
|
+
| `className` | `string` | `''` | Additional CSS classes merged onto the host element |
|
|
18
|
+
|
|
19
|
+
### Outputs
|
|
20
|
+
|
|
21
|
+
None.
|
|
22
|
+
|
|
23
|
+
### Content
|
|
24
|
+
|
|
25
|
+
Alert text is provided through content projection. An optional leading icon can be projected using the `fkAlertIconStart` directive:
|
|
26
|
+
|
|
27
|
+
```html
|
|
28
|
+
<!-- Simple -->
|
|
29
|
+
<fk-alert variant="info">Your changes have been saved.</fk-alert>
|
|
30
|
+
|
|
31
|
+
<!-- With icon -->
|
|
32
|
+
<fk-alert variant="warning">
|
|
33
|
+
<fk-icon fkAlertIconStart name="alert-triangle" />
|
|
34
|
+
Please review before continuing.
|
|
35
|
+
</fk-alert>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
- Four semantic variants: info, success, warning, error
|
|
43
|
+
- Optional leading icon slot via `fkAlertIconStart` directive
|
|
44
|
+
- Per-instance color, background, and border overrides
|
|
45
|
+
- Token-driven styling
|
|
46
|
+
- Self-sufficient rendering without any theme file loaded
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Quick Start
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<fk-alert variant="success">Operation completed successfully.</fk-alert>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Import
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { AlertComponent } from '@frame-kit/ui-ng';
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
@Component({
|
|
66
|
+
selector: 'app-example',
|
|
67
|
+
imports: [AlertComponent],
|
|
68
|
+
templateUrl: './example.component.html',
|
|
69
|
+
})
|
|
70
|
+
export class ExampleComponent {}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
To use the icon directive:
|
|
74
|
+
|
|
75
|
+
```ts
|
|
76
|
+
import { AlertComponent, FkAlertIconStartDirective } from '@frame-kit/ui-ng';
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Selector
|
|
82
|
+
|
|
83
|
+
```html
|
|
84
|
+
<fk-alert></fk-alert>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Examples
|
|
90
|
+
|
|
91
|
+
### Info (default)
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<fk-alert>This is an informational message.</fk-alert>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Success
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<fk-alert variant="success">Your changes have been saved.</fk-alert>
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Warning
|
|
104
|
+
|
|
105
|
+
```html
|
|
106
|
+
<fk-alert variant="warning">Please review before submitting.</fk-alert>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Error
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<fk-alert variant="error">Something went wrong. Please try again.</fk-alert>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### With icon
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<fk-alert variant="error">
|
|
119
|
+
<fk-icon fkAlertIconStart name="x-circle" />
|
|
120
|
+
Failed to save changes.
|
|
121
|
+
</fk-alert>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Custom colors
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<fk-alert color="#1e3a5f" backgroundColor="#e8f4fd" borderColor="#b6e0fe"> Custom styled alert. </fk-alert>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Accessibility
|
|
133
|
+
|
|
134
|
+
`fk-alert` renders an inline alert container.
|
|
135
|
+
|
|
136
|
+
Accessibility behavior:
|
|
137
|
+
|
|
138
|
+
- Icons projected via `fkAlertIconStart` are automatically marked `aria-hidden="true"`
|
|
139
|
+
- Content is readable by screen readers
|
|
140
|
+
- Semantic color contrast is maintained through token defaults
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Design Tokens
|
|
145
|
+
|
|
146
|
+
`fk-alert` is styled entirely through design tokens.
|
|
147
|
+
|
|
148
|
+
### Component-specific tokens
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
--fk-alert-padding
|
|
152
|
+
--fk-alert-border-radius
|
|
153
|
+
--fk-alert-font-size
|
|
154
|
+
--fk-alert-icon-gap
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Variant tokens
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
--fk-alert-info-bg
|
|
161
|
+
--fk-alert-info-border-color
|
|
162
|
+
--fk-alert-info-color
|
|
163
|
+
|
|
164
|
+
--fk-alert-success-bg
|
|
165
|
+
--fk-alert-success-border-color
|
|
166
|
+
--fk-alert-success-color
|
|
167
|
+
|
|
168
|
+
--fk-alert-warning-bg
|
|
169
|
+
--fk-alert-warning-border-color
|
|
170
|
+
--fk-alert-warning-color
|
|
171
|
+
|
|
172
|
+
--fk-alert-error-bg
|
|
173
|
+
--fk-alert-error-border-color
|
|
174
|
+
--fk-alert-error-color
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Shared tokens
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
--fk-rhythm-4
|
|
181
|
+
--fk-radius-md
|
|
182
|
+
--fk-typography-small-font-size
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Customizing Tokens
|
|
186
|
+
|
|
187
|
+
Override tokens in your application's stylesheet:
|
|
188
|
+
|
|
189
|
+
```scss
|
|
190
|
+
:root {
|
|
191
|
+
--fk-alert-padding: 1.25rem;
|
|
192
|
+
--fk-alert-border-radius: 0.5rem;
|
|
193
|
+
--fk-alert-info-bg: #dbeafe;
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Or scope overrides to a specific context:
|
|
198
|
+
|
|
199
|
+
```scss
|
|
200
|
+
.dark-theme fk-alert {
|
|
201
|
+
--fk-alert-info-bg: #1e3a5f;
|
|
202
|
+
--fk-alert-info-color: #93c5fd;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Behavior Notes
|
|
209
|
+
|
|
210
|
+
- The `color`, `backgroundColor`, and `borderColor` inputs apply inline styles, overriding token values for that instance
|
|
211
|
+
- The `fkAlertIconStart` directive automatically sets `aria-hidden="true"` on the projected element
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# fk-avatar
|
|
2
|
+
|
|
3
|
+
A token-driven avatar atom that displays a user image with an initials fallback and an optional presence status indicator.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## API
|
|
8
|
+
|
|
9
|
+
### Inputs
|
|
10
|
+
|
|
11
|
+
| Input | Type | Default | Description |
|
|
12
|
+
| ---------- | ----------------------------------------------------------- | ------- | ----------------------------------------------------- |
|
|
13
|
+
| name | `string` | — | **Required.** User's display name |
|
|
14
|
+
| avatarUrl | `string` \| `null` | `null` | URL to the user's avatar image |
|
|
15
|
+
| initials | `string` \| `null` | `null` | Custom initials — auto-derived from `name` if absent |
|
|
16
|
+
| size | `"sm"` \| `"md"` \| `"lg"` | `"md"` | Avatar diameter |
|
|
17
|
+
| status | `"online"` \| `"offline"` \| `"away"` \| `"busy"` \| `null` | `null` | Presence status |
|
|
18
|
+
| showStatus | `boolean` | `false` | Show the status indicator dot |
|
|
19
|
+
| className | `string` | `""` | Additional CSS classes merged with hook classes |
|
|
20
|
+
| id | `string` \| `null` | `null` | Sets the host `id` attribute |
|
|
21
|
+
| ariaLabel | `string` \| `null` | `null` | Custom `aria-label` (defaults to "Avatar for {name}") |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Features
|
|
26
|
+
|
|
27
|
+
- Displays an image when `avatarUrl` is provided, gracefully falling back to initials on load error
|
|
28
|
+
- Auto-derives initials from `name` (first + last initial for multi-word names, first two characters for single names)
|
|
29
|
+
- Status indicator dot positioned at the bottom-right corner, color-coded by status
|
|
30
|
+
- Three size presets (`sm`, `md`, `lg`) controlled via tokens
|
|
31
|
+
- Fully token-driven — all colors, sizes, typography, and radii are overridable
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Quick Start
|
|
36
|
+
|
|
37
|
+
```html
|
|
38
|
+
<fk-avatar name="Jane Doe" avatarUrl="/assets/jane.jpg" />
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Import
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import { AvatarComponent } from '@frame-kit/ui-ng';
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
@Component({
|
|
51
|
+
selector: 'app-header',
|
|
52
|
+
imports: [AvatarComponent],
|
|
53
|
+
templateUrl: './header.component.html',
|
|
54
|
+
})
|
|
55
|
+
export class HeaderComponent {}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Selector
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<fk-avatar />
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Examples
|
|
69
|
+
|
|
70
|
+
### Initials Fallback
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<fk-avatar name="Jane Doe" />
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Renders a circle with "JD" inside.
|
|
77
|
+
|
|
78
|
+
### With Image
|
|
79
|
+
|
|
80
|
+
```html
|
|
81
|
+
<fk-avatar name="Jane Doe" avatarUrl="/assets/jane.jpg" />
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### With Status Indicator
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<fk-avatar name="Jane Doe" [showStatus]="true" status="online" />
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Sizes
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<fk-avatar name="JD" size="sm" />
|
|
94
|
+
<fk-avatar name="JD" size="md" />
|
|
95
|
+
<fk-avatar name="JD" size="lg" />
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Custom Initials
|
|
99
|
+
|
|
100
|
+
```html
|
|
101
|
+
<fk-avatar name="Jane Doe" initials="J" />
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Accessibility
|
|
107
|
+
|
|
108
|
+
- Circle element has `role="img"` with an `aria-label` (defaults to "Avatar for {name}")
|
|
109
|
+
- Status indicator has `role="status"` with an `aria-label` describing the status
|
|
110
|
+
- Initials span is `aria-hidden="true"` since the circle's label already describes the user
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Design Tokens
|
|
115
|
+
|
|
116
|
+
### Component Tokens
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
--fk-avatar-radius
|
|
120
|
+
--fk-avatar-bg
|
|
121
|
+
--fk-avatar-color
|
|
122
|
+
--fk-avatar-font-family
|
|
123
|
+
--fk-avatar-font-weight
|
|
124
|
+
--fk-avatar-size-sm
|
|
125
|
+
--fk-avatar-size-md
|
|
126
|
+
--fk-avatar-size-lg
|
|
127
|
+
--fk-avatar-font-size-sm
|
|
128
|
+
--fk-avatar-font-size-md
|
|
129
|
+
--fk-avatar-font-size-lg
|
|
130
|
+
--fk-avatar-status-border
|
|
131
|
+
--fk-avatar-status-online
|
|
132
|
+
--fk-avatar-status-offline
|
|
133
|
+
--fk-avatar-status-away
|
|
134
|
+
--fk-avatar-status-busy
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Each component token falls back to a semantic token, then a raw value. For example:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
--fk-avatar-bg → --fk-color-surface-muted → #f7f9fb
|
|
141
|
+
--fk-avatar-color → --fk-color-muted → #8a98a8
|
|
142
|
+
--fk-avatar-radius → --fk-radius-full → 9999px
|
|
143
|
+
--fk-avatar-status-online → --fk-color-success → #10b981
|
|
144
|
+
--fk-avatar-status-busy → --fk-color-danger → #e02424
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Customizing Tokens
|
|
148
|
+
|
|
149
|
+
Override tokens at any scope:
|
|
150
|
+
|
|
151
|
+
```css
|
|
152
|
+
:root {
|
|
153
|
+
--fk-avatar-bg: #e0e7ff;
|
|
154
|
+
--fk-avatar-color: #4338ca;
|
|
155
|
+
--fk-avatar-radius: 0.5rem;
|
|
156
|
+
--fk-avatar-size-md: 2.5rem;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Or scope to a specific context:
|
|
161
|
+
|
|
162
|
+
```css
|
|
163
|
+
.compact-header fk-avatar {
|
|
164
|
+
--fk-avatar-size-md: 1.75rem;
|
|
165
|
+
--fk-avatar-font-size-md: 0.625rem;
|
|
166
|
+
}
|
|
167
|
+
```
|