@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,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`