@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.
Files changed (220) hide show
  1. package/COMPONENTS.md +683 -0
  2. package/DEVELOPMENT_GUIDE.md +1102 -0
  3. package/LICENSE +21 -0
  4. package/README.md +69 -0
  5. package/THEMING.md +130 -0
  6. package/core/headline/README.md +121 -0
  7. package/core/icon/README.md +173 -0
  8. package/core/image/README.md +210 -0
  9. package/core/link/README.md +297 -0
  10. package/core/separator/README.md +145 -0
  11. package/core/text/README.md +240 -0
  12. package/directives/infinite-scroll/README.md +102 -0
  13. package/directives/spotlight/README.md +154 -0
  14. package/directives/tooltip/README.md +147 -0
  15. package/docs/endpoint-link/README.md +142 -0
  16. package/docs/method-badge/README.md +154 -0
  17. package/fesm2022/frame-kit-ui-ng-core-headline.mjs +122 -0
  18. package/fesm2022/frame-kit-ui-ng-core-headline.mjs.map +1 -0
  19. package/fesm2022/frame-kit-ui-ng-core-icon.mjs +189 -0
  20. package/fesm2022/frame-kit-ui-ng-core-icon.mjs.map +1 -0
  21. package/fesm2022/frame-kit-ui-ng-core-image.mjs +123 -0
  22. package/fesm2022/frame-kit-ui-ng-core-image.mjs.map +1 -0
  23. package/fesm2022/frame-kit-ui-ng-core-link.mjs +369 -0
  24. package/fesm2022/frame-kit-ui-ng-core-link.mjs.map +1 -0
  25. package/fesm2022/frame-kit-ui-ng-core-separator.mjs +59 -0
  26. package/fesm2022/frame-kit-ui-ng-core-separator.mjs.map +1 -0
  27. package/fesm2022/frame-kit-ui-ng-core-text.mjs +204 -0
  28. package/fesm2022/frame-kit-ui-ng-core-text.mjs.map +1 -0
  29. package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs +74 -0
  30. package/fesm2022/frame-kit-ui-ng-directives-infinite-scroll.mjs.map +1 -0
  31. package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs +76 -0
  32. package/fesm2022/frame-kit-ui-ng-directives-spotlight.mjs.map +1 -0
  33. package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs +425 -0
  34. package/fesm2022/frame-kit-ui-ng-directives-tooltip.mjs.map +1 -0
  35. package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs +63 -0
  36. package/fesm2022/frame-kit-ui-ng-docs-endpoint-link.mjs.map +1 -0
  37. package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs +43 -0
  38. package/fesm2022/frame-kit-ui-ng-docs-method-badge.mjs.map +1 -0
  39. package/fesm2022/frame-kit-ui-ng-forms.mjs +3632 -0
  40. package/fesm2022/frame-kit-ui-ng-forms.mjs.map +1 -0
  41. package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs +239 -0
  42. package/fesm2022/frame-kit-ui-ng-layouts-app-shell.mjs.map +1 -0
  43. package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs +132 -0
  44. package/fesm2022/frame-kit-ui-ng-layouts-content-split.mjs.map +1 -0
  45. package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs +133 -0
  46. package/fesm2022/frame-kit-ui-ng-services-overlay-orchestrator.mjs.map +1 -0
  47. package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs +60 -0
  48. package/fesm2022/frame-kit-ui-ng-services-spotlight.mjs.map +1 -0
  49. package/fesm2022/frame-kit-ui-ng-services-toast.mjs +166 -0
  50. package/fesm2022/frame-kit-ui-ng-services-toast.mjs.map +1 -0
  51. package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs +214 -0
  52. package/fesm2022/frame-kit-ui-ng-ui-accordion.mjs.map +1 -0
  53. package/fesm2022/frame-kit-ui-ng-ui-alert.mjs +82 -0
  54. package/fesm2022/frame-kit-ui-ng-ui-alert.mjs.map +1 -0
  55. package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs +76 -0
  56. package/fesm2022/frame-kit-ui-ng-ui-avatar-stack.mjs.map +1 -0
  57. package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs +81 -0
  58. package/fesm2022/frame-kit-ui-ng-ui-avatar.mjs.map +1 -0
  59. package/fesm2022/frame-kit-ui-ng-ui-badge.mjs +81 -0
  60. package/fesm2022/frame-kit-ui-ng-ui-badge.mjs.map +1 -0
  61. package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs +68 -0
  62. package/fesm2022/frame-kit-ui-ng-ui-breadcrumb.mjs.map +1 -0
  63. package/fesm2022/frame-kit-ui-ng-ui-button.mjs +108 -0
  64. package/fesm2022/frame-kit-ui-ng-ui-button.mjs.map +1 -0
  65. package/fesm2022/frame-kit-ui-ng-ui-callout.mjs +58 -0
  66. package/fesm2022/frame-kit-ui-ng-ui-callout.mjs.map +1 -0
  67. package/fesm2022/frame-kit-ui-ng-ui-card.mjs +70 -0
  68. package/fesm2022/frame-kit-ui-ng-ui-card.mjs.map +1 -0
  69. package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs +113 -0
  70. package/fesm2022/frame-kit-ui-ng-ui-copyable-field.mjs.map +1 -0
  71. package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs +1288 -0
  72. package/fesm2022/frame-kit-ui-ng-ui-data-table.mjs.map +1 -0
  73. package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs +456 -0
  74. package/fesm2022/frame-kit-ui-ng-ui-dialog.mjs.map +1 -0
  75. package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs +398 -0
  76. package/fesm2022/frame-kit-ui-ng-ui-drawer.mjs.map +1 -0
  77. package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs +398 -0
  78. package/fesm2022/frame-kit-ui-ng-ui-dropdown-menu.mjs.map +1 -0
  79. package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs +125 -0
  80. package/fesm2022/frame-kit-ui-ng-ui-editable-field.mjs.map +1 -0
  81. package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs +113 -0
  82. package/fesm2022/frame-kit-ui-ng-ui-icon-badge.mjs.map +1 -0
  83. package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs +111 -0
  84. package/fesm2022/frame-kit-ui-ng-ui-icon-list.mjs.map +1 -0
  85. package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs +103 -0
  86. package/fesm2022/frame-kit-ui-ng-ui-inline-edit.mjs.map +1 -0
  87. package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs +135 -0
  88. package/fesm2022/frame-kit-ui-ng-ui-list-editor.mjs.map +1 -0
  89. package/fesm2022/frame-kit-ui-ng-ui-loader.mjs +81 -0
  90. package/fesm2022/frame-kit-ui-ng-ui-loader.mjs.map +1 -0
  91. package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs +79 -0
  92. package/fesm2022/frame-kit-ui-ng-ui-menu-item.mjs.map +1 -0
  93. package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs +40 -0
  94. package/fesm2022/frame-kit-ui-ng-ui-nav-brand.mjs.map +1 -0
  95. package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs +110 -0
  96. package/fesm2022/frame-kit-ui-ng-ui-nav-group.mjs.map +1 -0
  97. package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs +91 -0
  98. package/fesm2022/frame-kit-ui-ng-ui-nav-separator.mjs.map +1 -0
  99. package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs +86 -0
  100. package/fesm2022/frame-kit-ui-ng-ui-node-tree-breadcrumb.mjs.map +1 -0
  101. package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs +443 -0
  102. package/fesm2022/frame-kit-ui-ng-ui-node-tree.mjs.map +1 -0
  103. package/fesm2022/frame-kit-ui-ng-ui-note.mjs +56 -0
  104. package/fesm2022/frame-kit-ui-ng-ui-note.mjs.map +1 -0
  105. package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs +105 -0
  106. package/fesm2022/frame-kit-ui-ng-ui-numbered-list.mjs.map +1 -0
  107. package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs +110 -0
  108. package/fesm2022/frame-kit-ui-ng-ui-pagination.mjs.map +1 -0
  109. package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs +129 -0
  110. package/fesm2022/frame-kit-ui-ng-ui-progress-bar.mjs.map +1 -0
  111. package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs +42 -0
  112. package/fesm2022/frame-kit-ui-ng-ui-sidenav-link.mjs.map +1 -0
  113. package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs +894 -0
  114. package/fesm2022/frame-kit-ui-ng-ui-tabs.mjs.map +1 -0
  115. package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs +81 -0
  116. package/fesm2022/frame-kit-ui-ng-ui-timeline.mjs.map +1 -0
  117. package/fesm2022/frame-kit-ui-ng-ui-toast.mjs +179 -0
  118. package/fesm2022/frame-kit-ui-ng-ui-toast.mjs.map +1 -0
  119. package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs +143 -0
  120. package/fesm2022/frame-kit-ui-ng-ui-user-menu.mjs.map +1 -0
  121. package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs +191 -0
  122. package/fesm2022/frame-kit-ui-ng-ui-wizard-dialog.mjs.map +1 -0
  123. package/fesm2022/frame-kit-ui-ng.mjs +58 -0
  124. package/fesm2022/frame-kit-ui-ng.mjs.map +1 -0
  125. package/layouts/app-shell/README.md +357 -0
  126. package/layouts/content-split/README.md +180 -0
  127. package/package.json +253 -0
  128. package/services/overlay-orchestrator/README.md +184 -0
  129. package/services/spotlight/README.md +61 -0
  130. package/services/toast/README.md +118 -0
  131. package/types/frame-kit-ui-ng-core-headline.d.ts +38 -0
  132. package/types/frame-kit-ui-ng-core-icon.d.ts +74 -0
  133. package/types/frame-kit-ui-ng-core-image.d.ts +93 -0
  134. package/types/frame-kit-ui-ng-core-link.d.ts +251 -0
  135. package/types/frame-kit-ui-ng-core-separator.d.ts +28 -0
  136. package/types/frame-kit-ui-ng-core-text.d.ts +186 -0
  137. package/types/frame-kit-ui-ng-directives-infinite-scroll.d.ts +42 -0
  138. package/types/frame-kit-ui-ng-directives-spotlight.d.ts +51 -0
  139. package/types/frame-kit-ui-ng-directives-tooltip.d.ts +70 -0
  140. package/types/frame-kit-ui-ng-docs-endpoint-link.d.ts +43 -0
  141. package/types/frame-kit-ui-ng-docs-method-badge.d.ts +30 -0
  142. package/types/frame-kit-ui-ng-forms.d.ts +1674 -0
  143. package/types/frame-kit-ui-ng-layouts-app-shell.d.ts +75 -0
  144. package/types/frame-kit-ui-ng-layouts-content-split.d.ts +43 -0
  145. package/types/frame-kit-ui-ng-services-overlay-orchestrator.d.ts +96 -0
  146. package/types/frame-kit-ui-ng-services-spotlight.d.ts +32 -0
  147. package/types/frame-kit-ui-ng-services-toast.d.ts +100 -0
  148. package/types/frame-kit-ui-ng-ui-accordion.d.ts +86 -0
  149. package/types/frame-kit-ui-ng-ui-alert.d.ts +34 -0
  150. package/types/frame-kit-ui-ng-ui-avatar-stack.d.ts +38 -0
  151. package/types/frame-kit-ui-ng-ui-avatar.d.ts +36 -0
  152. package/types/frame-kit-ui-ng-ui-badge.d.ts +33 -0
  153. package/types/frame-kit-ui-ng-ui-breadcrumb.d.ts +45 -0
  154. package/types/frame-kit-ui-ng-ui-button.d.ts +48 -0
  155. package/types/frame-kit-ui-ng-ui-callout.d.ts +26 -0
  156. package/types/frame-kit-ui-ng-ui-card.d.ts +30 -0
  157. package/types/frame-kit-ui-ng-ui-copyable-field.d.ts +62 -0
  158. package/types/frame-kit-ui-ng-ui-data-table.d.ts +482 -0
  159. package/types/frame-kit-ui-ng-ui-dialog.d.ts +166 -0
  160. package/types/frame-kit-ui-ng-ui-drawer.d.ts +130 -0
  161. package/types/frame-kit-ui-ng-ui-dropdown-menu.d.ts +77 -0
  162. package/types/frame-kit-ui-ng-ui-editable-field.d.ts +65 -0
  163. package/types/frame-kit-ui-ng-ui-icon-badge.d.ts +45 -0
  164. package/types/frame-kit-ui-ng-ui-icon-list.d.ts +67 -0
  165. package/types/frame-kit-ui-ng-ui-inline-edit.d.ts +44 -0
  166. package/types/frame-kit-ui-ng-ui-list-editor.d.ts +56 -0
  167. package/types/frame-kit-ui-ng-ui-loader.d.ts +32 -0
  168. package/types/frame-kit-ui-ng-ui-menu-item.d.ts +27 -0
  169. package/types/frame-kit-ui-ng-ui-nav-brand.d.ts +25 -0
  170. package/types/frame-kit-ui-ng-ui-nav-group.d.ts +60 -0
  171. package/types/frame-kit-ui-ng-ui-nav-separator.d.ts +33 -0
  172. package/types/frame-kit-ui-ng-ui-node-tree-breadcrumb.d.ts +35 -0
  173. package/types/frame-kit-ui-ng-ui-node-tree.d.ts +135 -0
  174. package/types/frame-kit-ui-ng-ui-note.d.ts +22 -0
  175. package/types/frame-kit-ui-ng-ui-numbered-list.d.ts +52 -0
  176. package/types/frame-kit-ui-ng-ui-pagination.d.ts +49 -0
  177. package/types/frame-kit-ui-ng-ui-progress-bar.d.ts +50 -0
  178. package/types/frame-kit-ui-ng-ui-sidenav-link.d.ts +24 -0
  179. package/types/frame-kit-ui-ng-ui-tabs.d.ts +266 -0
  180. package/types/frame-kit-ui-ng-ui-timeline.d.ts +42 -0
  181. package/types/frame-kit-ui-ng-ui-toast.d.ts +56 -0
  182. package/types/frame-kit-ui-ng-ui-user-menu.d.ts +87 -0
  183. package/types/frame-kit-ui-ng-ui-wizard-dialog.d.ts +116 -0
  184. package/types/frame-kit-ui-ng.d.ts +53 -0
  185. package/ui/accordion/README.md +261 -0
  186. package/ui/alert/README.md +211 -0
  187. package/ui/avatar/README.md +167 -0
  188. package/ui/avatar-stack/README.md +164 -0
  189. package/ui/badge/README.md +162 -0
  190. package/ui/breadcrumb/README.md +240 -0
  191. package/ui/button/README.md +184 -0
  192. package/ui/callout/README.md +159 -0
  193. package/ui/card/README.md +174 -0
  194. package/ui/copyable-field/README.md +235 -0
  195. package/ui/data-table/README.md +408 -0
  196. package/ui/dialog/README.md +222 -0
  197. package/ui/drawer/README.md +274 -0
  198. package/ui/dropdown-menu/README.md +336 -0
  199. package/ui/editable-field/README.md +171 -0
  200. package/ui/icon-badge/README.md +131 -0
  201. package/ui/icon-list/README.md +205 -0
  202. package/ui/inline-edit/README.md +135 -0
  203. package/ui/list-editor/README.md +162 -0
  204. package/ui/loader/README.md +160 -0
  205. package/ui/menu-item/README.md +204 -0
  206. package/ui/nav-brand/README.md +111 -0
  207. package/ui/nav-group/README.md +145 -0
  208. package/ui/nav-separator/README.md +44 -0
  209. package/ui/node-tree/README.md +278 -0
  210. package/ui/node-tree-breadcrumb/README.md +164 -0
  211. package/ui/note/README.md +146 -0
  212. package/ui/numbered-list/README.md +187 -0
  213. package/ui/pagination/README.md +174 -0
  214. package/ui/progress-bar/README.md +223 -0
  215. package/ui/sidenav-link/README.md +214 -0
  216. package/ui/tabs/README.md +204 -0
  217. package/ui/timeline/README.md +285 -0
  218. package/ui/toast/README.md +243 -0
  219. package/ui/user-menu/README.md +260 -0
  220. package/ui/wizard-dialog/README.md +283 -0
@@ -0,0 +1,184 @@
1
+ # fk-button
2
+
3
+ A token-driven button component for Angular that supports visual variants, sizes, loading state, icons, and accessible interaction patterns.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | ----------------- | ---------------- | ----------- | ------------------------------------------------------------------------ |
13
+ | `variant` | `ButtonVariant` | `"primary"` | Visual style of the button (for example `primary`, `secondary`, `ghost`) |
14
+ | `size` | `ButtonSize` | `"md"` | Size of the button (`sm`, `md`, `lg`) |
15
+ | `loading` | `boolean` | `false` | Shows a loader and disables interaction |
16
+ | `disabled` | `boolean` | `false` | Disables the button |
17
+ | `fullWidth` | `boolean` | `false` | Stretches the button host to fill its parent's inline size |
18
+ | `type` | `ButtonType` | `"button"` | Native button type (`"button"`, `"submit"`, `"reset"`) |
19
+ | `id` | `string \| null` | `null` | Optional ID for the button element |
20
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host element |
21
+ | `ariaLabel` | `string \| null` | `null` | ARIA label for icon-only or ambiguous buttons |
22
+ | `ariaDescribedBy` | `string \| null` | `null` | IDs of additional descriptive elements |
23
+
24
+ The button label and icons are provided via content projection:
25
+
26
+ ```html
27
+ <fk-button>Save</fk-button>
28
+ ```
29
+
30
+ ### Icon directives
31
+
32
+ Icons are projected into the button using structural directives rather than inputs. Import `FkButtonIconStartDirective` and/or `FkButtonIconEndDirective` alongside `IconComponent`:
33
+
34
+ | Directive | Selector | Description |
35
+ | ------------------- | --------------------- | ---------------------------------------- |
36
+ | `fkButtonIconStart` | `[fkButtonIconStart]` | Projects an icon before the button label |
37
+ | `fkButtonIconEnd` | `[fkButtonIconEnd]` | Projects an icon after the button label |
38
+
39
+ Both directives apply `aria-hidden="true"` automatically.
40
+
41
+ ### Outputs
42
+
43
+ `fk-button` relies on the native `click` event and does not expose custom Angular outputs. Listen via `(click)`:
44
+
45
+ ```html
46
+ <fk-button (click)="onSave()">Save</fk-button>
47
+ ```
48
+
49
+ ---
50
+
51
+ ## Features
52
+
53
+ - Multiple visual variants and sizes
54
+ - Loading state with spinner integration
55
+ - Icon support via `fkButtonIconStart` and `fkButtonIconEnd` content projection directives
56
+ - Disabled and loading states prevent interaction
57
+ - Token-driven styling for color, radius, spacing, and typography
58
+
59
+ ---
60
+
61
+ ## Quick Start
62
+
63
+ ```html
64
+ <fk-button variant="primary" (click)="onSave()"> Save changes </fk-button>
65
+ ```
66
+
67
+ ---
68
+
69
+ ## Import
70
+
71
+ ```ts
72
+ import { ButtonComponent, FkButtonIconStartDirective, FkButtonIconEndDirective, IconComponent } from '@frame-kit/ui-ng';
73
+ ```
74
+
75
+ ```ts
76
+ @Component({
77
+ selector: 'app-example',
78
+ imports: [ButtonComponent, FkButtonIconStartDirective, FkButtonIconEndDirective, IconComponent],
79
+ templateUrl: './example.component.html',
80
+ })
81
+ export class ExampleComponent {}
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Selector
87
+
88
+ ```html
89
+ <fk-button></fk-button>
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Examples
95
+
96
+ ### Variants
97
+
98
+ ```html
99
+ <fk-button variant="primary">Primary</fk-button>
100
+ <fk-button variant="secondary">Secondary</fk-button>
101
+ <fk-button variant="ghost">Ghost</fk-button>
102
+ ```
103
+
104
+ ### Sizes
105
+
106
+ ```html
107
+ <fk-button size="sm">Small</fk-button>
108
+ <fk-button size="md">Medium</fk-button>
109
+ <fk-button size="lg">Large</fk-button>
110
+ ```
111
+
112
+ ### With icon (start)
113
+
114
+ ```html
115
+ <fk-button variant="primary">
116
+ <fk-icon fkButtonIconStart name="plus" size="sm"></fk-icon>
117
+ New record
118
+ </fk-button>
119
+ ```
120
+
121
+ ### With icon (end)
122
+
123
+ ```html
124
+ <fk-button variant="secondary">
125
+ Next step
126
+ <fk-icon fkButtonIconEnd name="arrow-right" size="sm"></fk-icon>
127
+ </fk-button>
128
+ ```
129
+
130
+ ### Loading state
131
+
132
+ ```html
133
+ <fk-button variant="primary" [loading]="isSaving" (click)="save()"> Save changes </fk-button>
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Accessibility
139
+
140
+ - Renders a native `<button>` element with proper keyboard interaction.
141
+ - Uses `aria-disabled="true"` when `loading` or `disabled` to signal non-interactive state.
142
+ - For icon-only buttons, always provide an `ariaLabel`:
143
+
144
+ ```html
145
+ <fk-button ariaLabel="Delete record">
146
+ <fk-icon fkButtonIconStart name="trash" size="sm"></fk-icon>
147
+ </fk-button>
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Design Tokens
153
+
154
+ `fk-button` is styled entirely through design tokens, typically including:
155
+
156
+ ```scss
157
+ --fk-button-radius;
158
+ --fk-button-font-weight;
159
+ --fk-button-padding-inline;
160
+ --fk-button-gap;
161
+
162
+ --fk-button-primary-bg;
163
+ --fk-button-primary-color;
164
+ --fk-button-primary-border-color;
165
+
166
+ --fk-button-secondary-bg;
167
+ --fk-button-secondary-color;
168
+ --fk-button-secondary-border-color;
169
+ ```
170
+
171
+ Override tokens in your stylesheet:
172
+
173
+ ```scss
174
+ :root {
175
+ --fk-button-radius: 9999px;
176
+ }
177
+ ```
178
+
179
+ ---
180
+
181
+ ## Behavior Notes
182
+
183
+ - `loading` implies a disabled state for interaction, but you still control `disabled` independently.
184
+ - `type` defaults to `"button"` to avoid accidental form submissions inside `<form>` elements.
@@ -0,0 +1,159 @@
1
+ # fk-callout
2
+
3
+ A token-driven callout component for highlighting supplementary information such as tips, notices, or contextual messages.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | ----------------- | --------------------- | --------- | -------------------------------------------- |
13
+ | `title` | `string \| null` | `null` | Optional headline rendered via `fk-headline` |
14
+ | `align` | `'start' \| 'center'` | `'start'` | Text alignment of the description |
15
+ | `backgroundColor` | `string \| null` | `null` | Custom background color (overrides token) |
16
+ | `borderColor` | `string \| null` | `null` | Custom border color (overrides token) |
17
+ | `className` | `string` | `''` | Additional CSS classes for the host element |
18
+
19
+ ### Content projection
20
+
21
+ The callout body is the projected content (default `<ng-content />`). Pass plain text or template fragments — the component never renders untrusted HTML through `[innerHTML]`.
22
+
23
+ ### Outputs
24
+
25
+ `fk-callout` is presentational and does not emit outputs.
26
+
27
+ ---
28
+
29
+ ## Features
30
+
31
+ - Optional title with a projected description body
32
+ - Text alignment control
33
+ - Custom background and border colors via inputs
34
+ - Token-driven styling
35
+ - Description accepts arbitrary template content via projection (no `innerHTML`)
36
+
37
+ ---
38
+
39
+ ## Quick Start
40
+
41
+ ```html
42
+ <fk-callout title="Heads up">Your session will expire in 5 minutes.</fk-callout>
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Import
48
+
49
+ ```ts
50
+ import { CalloutComponent } from '@frame-kit/ui-ng';
51
+ ```
52
+
53
+ ```ts
54
+ @Component({
55
+ selector: 'app-example',
56
+ imports: [CalloutComponent],
57
+ templateUrl: './example.component.html',
58
+ })
59
+ export class ExampleComponent {}
60
+ ```
61
+
62
+ ---
63
+
64
+ ## Selector
65
+
66
+ ```html
67
+ <fk-callout></fk-callout>
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Examples
73
+
74
+ ### Title and description
75
+
76
+ ```html
77
+ <fk-callout title="Important">Please review the details before submitting.</fk-callout>
78
+ ```
79
+
80
+ ### Description only
81
+
82
+ ```html
83
+ <fk-callout>A verification email has been sent to your inbox.</fk-callout>
84
+ ```
85
+
86
+ ### Title only
87
+
88
+ ```html
89
+ <fk-callout title="No new notifications" />
90
+ ```
91
+
92
+ ### Centered text
93
+
94
+ ```html
95
+ <fk-callout title="Welcome" align="center">Your account has been created.</fk-callout>
96
+ ```
97
+
98
+ ### Rich content via projection
99
+
100
+ ```html
101
+ <fk-callout title="Idempotency"> Send an <code>Idempotency-Key</code> header to make retries safe. </fk-callout>
102
+ ```
103
+
104
+ ### Custom colors
105
+
106
+ ```html
107
+ <fk-callout title="Info" backgroundColor="#f0f9ff" borderColor="#0ea5e9"> This uses custom colors. </fk-callout>
108
+ ```
109
+
110
+ ---
111
+
112
+ ## Accessibility
113
+
114
+ - The title renders as an `fk-headline` (`h6`), providing a semantic heading for assistive technologies.
115
+ - Body content is projected as live template nodes, so links and interactive children participate in the normal accessibility tree.
116
+ - The component is presentational; wrap it in a landmark or live region if it conveys time-sensitive information.
117
+
118
+ ---
119
+
120
+ ## Design Tokens
121
+
122
+ `fk-callout` is styled entirely through design tokens.
123
+
124
+ ```scss
125
+ --fk-callout-bg
126
+ --fk-callout-border-color
127
+ --fk-callout-padding
128
+ --fk-callout-border-radius
129
+ --fk-callout-font-size
130
+ --fk-callout-title-font-size
131
+ --fk-callout-title-gap
132
+ ```
133
+
134
+ Override tokens in your theme stylesheet:
135
+
136
+ ```scss
137
+ :root {
138
+ --fk-callout-bg: #fffbeb;
139
+ --fk-callout-border-color: #f59e0b;
140
+ --fk-callout-padding: 1.5rem;
141
+ }
142
+ ```
143
+
144
+ Or scope overrides to a specific context:
145
+
146
+ ```scss
147
+ .dark-theme fk-callout {
148
+ --fk-callout-bg: #1e1e2e;
149
+ --fk-callout-border-color: #334155;
150
+ }
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Behavior Notes
156
+
157
+ - `backgroundColor` and `borderColor` inputs override the corresponding token values via `@HostBinding` inline styles.
158
+ - When `title` is `null` and no content is projected, the component renders an empty container — avoid this in practice.
159
+ - The body is projected (`<ng-content />`) — there is no `[innerHTML]` sink, so no caller can inject HTML strings through the API.
@@ -0,0 +1,174 @@
1
+ # fk-card
2
+
3
+ A token-driven container component for grouping related content with consistent padding, background, border, and alignment.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | ----------- | ------------------------------------------- | ----------- | -------------------------------------------------------------- |
13
+ | `size` | `'sm' \| 'md' \| 'lg' \| string` | `'md'` | Padding preset or custom CSS value (e.g. `'3rem'`) |
14
+ | `align` | `'start' \| 'center' \| 'end' \| 'stretch'` | `'stretch'` | Cross-axis alignment of projected content |
15
+ | `className` | `string` | `''` | Additional CSS classes for the host element |
16
+ | `id` | `string \| null` | `null` | Sets the `id` attribute on the host element |
17
+ | `ariaLabel` | `string \| null` | `null` | Sets `aria-label` on the host element for assistive technology |
18
+
19
+ ### Outputs
20
+
21
+ `fk-card` is presentational and does not emit outputs.
22
+
23
+ ### Content
24
+
25
+ Card content is provided through content projection.
26
+
27
+ ```html
28
+ <fk-card>
29
+ <h2>Title</h2>
30
+ <p>Card body content goes here.</p>
31
+ </fk-card>
32
+ ```
33
+
34
+ ---
35
+
36
+ ## Features
37
+
38
+ - Preset and custom padding sizes
39
+ - Cross-axis content alignment
40
+ - Token-driven styling
41
+ - Self-sufficient rendering without any theme file loaded
42
+
43
+ ---
44
+
45
+ ## Quick Start
46
+
47
+ ```html
48
+ <fk-card size="md">
49
+ <p>Hello from inside a card.</p>
50
+ </fk-card>
51
+ ```
52
+
53
+ ---
54
+
55
+ ## Import
56
+
57
+ ```ts
58
+ import { CardComponent } from '@frame-kit/ui-ng';
59
+ ```
60
+
61
+ ```ts
62
+ @Component({
63
+ selector: 'app-example',
64
+ imports: [CardComponent],
65
+ templateUrl: './example.component.html',
66
+ })
67
+ export class ExampleComponent {}
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Selector
73
+
74
+ ```html
75
+ <fk-card></fk-card>
76
+ ```
77
+
78
+ ---
79
+
80
+ ## Examples
81
+
82
+ ### Small
83
+
84
+ ```html
85
+ <fk-card size="sm">
86
+ <p>Compact content area.</p>
87
+ </fk-card>
88
+ ```
89
+
90
+ ### Medium (default)
91
+
92
+ ```html
93
+ <fk-card>
94
+ <p>Standard content area.</p>
95
+ </fk-card>
96
+ ```
97
+
98
+ ### Large
99
+
100
+ ```html
101
+ <fk-card size="lg">
102
+ <p>Spacious content area.</p>
103
+ </fk-card>
104
+ ```
105
+
106
+ ### Custom padding
107
+
108
+ ```html
109
+ <fk-card size="3rem">
110
+ <p>Custom padding applied directly.</p>
111
+ </fk-card>
112
+ ```
113
+
114
+ ### Centered content
115
+
116
+ ```html
117
+ <fk-card align="center">
118
+ <fk-icon-badge name="check" />
119
+ <fk-headline [level]="3">Success</fk-headline>
120
+ <p>Your changes have been saved.</p>
121
+ </fk-card>
122
+ ```
123
+
124
+ ---
125
+
126
+ ## Accessibility
127
+
128
+ - `fk-card` is a presentational container and does not imply a landmark role.
129
+ - Use `ariaLabel` when the card represents a distinct, labeled region.
130
+ - For interactive cards, wrap the content in an appropriate interactive element rather than making the card itself clickable.
131
+
132
+ ---
133
+
134
+ ## Design Tokens
135
+
136
+ `fk-card` is styled entirely through design tokens.
137
+
138
+ ```
139
+ --fk-card-bg
140
+ --fk-card-border-color
141
+ --fk-card-border-radius
142
+ --fk-card-padding-sm
143
+ --fk-card-padding-md
144
+ --fk-card-padding-lg
145
+ ```
146
+
147
+ ### Customizing Tokens
148
+
149
+ Override tokens in your application's global stylesheet or a scoped selector:
150
+
151
+ ```scss
152
+ :root {
153
+ --fk-card-bg: #fafafa;
154
+ --fk-card-border-color: #e5e7eb;
155
+ --fk-card-border-radius: 1rem;
156
+ }
157
+ ```
158
+
159
+ Or scope overrides to a specific context:
160
+
161
+ ```scss
162
+ .dark-theme fk-card {
163
+ --fk-card-bg: #1e1e2e;
164
+ --fk-card-border-color: #334155;
165
+ }
166
+ ```
167
+
168
+ ---
169
+
170
+ ## Behavior Notes
171
+
172
+ - When `size` is a preset (`sm`, `md`, `lg`), padding is controlled via the corresponding token. When `size` is a custom string, it is applied directly as inline `padding`.
173
+ - The card renders as a flex column container, so projected content flows vertically by default.
174
+ - `align` controls `align-items` on the flex container, affecting horizontal alignment of children.