@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,210 @@
1
+ # fk-image
2
+
3
+ A flexible image component for Angular with support for fill mode, aspect ratio, fallbacks, and token-driven styling.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Required inputs
10
+
11
+ | Input | Type | Description |
12
+ | ----- | -------- | --------------------------- |
13
+ | `src` | `string` | Image source URL |
14
+ | `alt` | `string` | Accessible alternative text |
15
+
16
+ ### Dimension & layout
17
+
18
+ | Input | Type | Default | Description |
19
+ | ------------- | -------------------------- | ------- | ----------------------------------------------------------- |
20
+ | `fill` | `boolean` | `false` | Makes the image fill its container via absolute positioning |
21
+ | `width` | `number \| null` | `null` | Explicit width (required when `fill` is `false`) |
22
+ | `height` | `number \| null` | `null` | Explicit height (required when `fill` is `false`) |
23
+ | `aspectRatio` | `number \| string \| null` | `null` | Optional aspect ratio (e.g. `16 / 9` or `"16 / 9"`) |
24
+
25
+ In dev mode, `fk-image` will warn if `fill` is `false` and neither `width` nor `height` is provided, to help avoid layout shift.
26
+
27
+ ### Image behavior
28
+
29
+ | Input | Type | Default | Description |
30
+ | ---------------- | -------------------------- | --------- | ------------------------------------------------ |
31
+ | `srcSet` | `string \| null` | `null` | Native `srcset` attribute for responsive images |
32
+ | `sizes` | `string \| null` | `null` | Native `sizes` attribute for responsive images |
33
+ | `loading` | `ImageLoading` | `"lazy"` | Native `loading` attribute (`"lazy" \| "eager"`) |
34
+ | `decoding` | `ImageDecoding` | `"async"` | Native `decoding` attribute |
35
+ | `fetchPriority` | `ImageFetchPriority` | `"auto"` | Native `fetchpriority` attribute |
36
+ | `crossOrigin` | `ImageCrossOrigin \| null` | `null` | Native `crossorigin` attribute |
37
+ | `referrerPolicy` | `string \| null` | `null` | Native `referrerpolicy` attribute |
38
+
39
+ ### Presentation
40
+
41
+ | Input | Type | Default | Description |
42
+ | ---------- | ------------- | ---------- | ----------------------- |
43
+ | `fit` | `ImageFit` | `"cover"` | `object-fit` behavior |
44
+ | `position` | `string` | `"center"` | `object-position` value |
45
+ | `radius` | `ImageRadius` | `"none"` | Corner radius variant |
46
+
47
+ ### Fallback
48
+
49
+ | Input | Type | Default | Description |
50
+ | ------------- | ---------------- | ------- | --------------------------------------------------------- |
51
+ | `fallbackSrc` | `string \| null` | `null` | Optional fallback image source if the primary `src` fails |
52
+
53
+ ### Base props
54
+
55
+ | Input | Type | Default | Description |
56
+ | ----------- | ---------------- | ------- | ------------------------------------------- |
57
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host |
58
+ | `id` | `string \| null` | `null` | Optional ID for the wrapper element |
59
+
60
+ ### Outputs
61
+
62
+ | Output | Type | Description |
63
+ | ------------ | ------ | ----------------------------------------- |
64
+ | `imageLoad` | `void` | Emitted when the image successfully loads |
65
+ | `imageError` | `void` | Emitted when the image fails to load |
66
+
67
+ ---
68
+
69
+ ## Features
70
+
71
+ - Required `alt` text for accessibility
72
+ - Fill mode (`fill=true`) for background-like behavior
73
+ - Optional width/height with dev-time warning to prevent layout shift
74
+ - Fallback image support via `fallbackSrc`
75
+ - Responsive images via `srcset` / `sizes`
76
+ - Aspect ratio and corner radius tokens
77
+
78
+ ---
79
+
80
+ ## Quick Start
81
+
82
+ \`\`\`html
83
+ <fk-image
84
+ src="/assets/property-1.jpg"
85
+ alt="Front view of a two-story house"
86
+ [width]="400"
87
+ [height]="300"
88
+ fit="cover"
89
+ />
90
+ \`\`\`
91
+
92
+ ---
93
+
94
+ ## Import
95
+
96
+ \`\`\`ts
97
+ import { ImageComponent } from "@frame-kit/ui-ng";
98
+ \`\`\`
99
+
100
+ \`\`\`ts
101
+ @Component({
102
+ selector: "app-example",
103
+ imports: [ImageComponent],
104
+ templateUrl: "./example.component.html",
105
+ })
106
+ export class ExampleComponent {}
107
+ \`\`\`
108
+
109
+ ---
110
+
111
+ ## Selector
112
+
113
+ \`\`\`html
114
+ <fk-image></fk-image>
115
+ \`\`\`
116
+
117
+ ---
118
+
119
+ ## Examples
120
+
121
+ ### Responsive card image
122
+
123
+ \`\`\`html
124
+
125
+ <div class="property-card">
126
+ <fk-image
127
+ src="/assets/property-1.jpg"
128
+ alt="Modern condo in downtown"
129
+ [width]="480"
130
+ [height]="320"
131
+ fit="cover"
132
+ radius="md"
133
+ />
134
+ </div>
135
+ \`\`\`
136
+
137
+ ### Fill mode hero image
138
+
139
+ \`\`\`html
140
+
141
+ <div class="hero-image-wrapper">
142
+ <fk-image
143
+ src="/assets/city-skyline.jpg"
144
+ alt="City skyline at sunset"
145
+ [fill]="true"
146
+ fit="cover"
147
+ position="center"
148
+ />
149
+ </div>
150
+ \`\`\`
151
+
152
+ \`\`\`scss
153
+ .hero-image-wrapper {
154
+ position: relative;
155
+ width: 100%;
156
+ height: 320px;
157
+ }
158
+ \`\`\`
159
+
160
+ ### With fallback
161
+
162
+ \`\`\`html
163
+ <fk-image
164
+ src="https://example.com/main-image.jpg"
165
+ fallbackSrc="/assets/fallback.jpg"
166
+ alt="Agent headshot"
167
+ [width]="128"
168
+ [height]="128"
169
+ radius="full"
170
+ />
171
+ \`\`\`
172
+
173
+ ---
174
+
175
+ ## Accessibility
176
+
177
+ - Always requires `alt` text; use descriptive language for important content
178
+ - Use `alt=""` only for decorative images where the surrounding context is enough
179
+ - Emits `imageError` so you can log or recover when the image fails
180
+
181
+ ---
182
+
183
+ ## Design Tokens
184
+
185
+ `fk-image` relies on shared image/shape tokens:
186
+
187
+ \`\`\`scss
188
+ --fk-image-radius-none;
189
+ --fk-image-radius-sm;
190
+ --fk-image-radius-md;
191
+ --fk-image-radius-lg;
192
+ --fk-image-radius-full;
193
+ \`\`\`
194
+
195
+ You can also rely on global layout tokens for spacing around the image.
196
+
197
+ Override tokens in your stylesheet:
198
+
199
+ \`\`\`scss
200
+ :root {
201
+ --fk-image-radius-md: 0.75rem;
202
+ }
203
+ \`\`\`
204
+
205
+ ---
206
+
207
+ ## Behavior Notes
208
+
209
+ - When `fallbackSrc` is set, a failed load will automatically switch to the fallback once
210
+ - Dev-mode logs a warning when neither `fill` nor explicit `width`/`height` is provided, to help you avoid CLS issues
@@ -0,0 +1,297 @@
1
+ # Link Component
2
+
3
+ A flexible, accessible link component for the FrameKit UI library.
4
+
5
+ ## Features
6
+
7
+ - ✅ **Angular Router Integration** — Seamless routing with `routerLink`
8
+ - ✅ **External Link Support** — Automatic detection, icons, and security (`target="_blank"`, `rel="noopener noreferrer"`)
9
+ - ✅ **Design Token System** — CSS custom properties for theming
10
+ - ✅ **Variants** — Default, primary, muted, danger
11
+ - ✅ **Sizes** — Small, medium, large
12
+ - ✅ **Underline Styles** — None, hover (default), always
13
+ - ✅ **Accessibility** — ARIA labels, keyboard navigation, screen reader support
14
+ - ✅ **Analytics Tracking** — Data attributes for tracking (trackingId, trackingCategory, trackingLabel)
15
+ - ✅ **States** — Disabled, loading
16
+ - ✅ **Download Links** — Support for file downloads
17
+ - ✅ **Custom Data Attributes** — Flexible metadata support
18
+
19
+ ## Quick Start
20
+
21
+ ```html
22
+ <fk-link href="https://example.com">Visit Example</fk-link>
23
+ ```
24
+
25
+ ```html
26
+ <fk-link routerLink="/dashboard" variant="primary">Open dashboard</fk-link>
27
+ ```
28
+
29
+ ## Import
30
+
31
+ ```ts
32
+ import { LinkComponent } from '@frame-kit/ui-ng';
33
+ ```
34
+
35
+ ```ts
36
+ @Component({
37
+ selector: 'app-example',
38
+ imports: [LinkComponent],
39
+ templateUrl: './example.component.html',
40
+ })
41
+ export class ExampleComponent {}
42
+ ```
43
+
44
+ ## Usage
45
+
46
+ ### Basic Link
47
+
48
+ ```html
49
+ <fk-link href="https://example.com">Visit Example</fk-link>
50
+ ```
51
+
52
+ ### Internal Navigation (Angular Router)
53
+
54
+ ```html
55
+ <fk-link routerLink="/dashboard">Go to Dashboard</fk-link>
56
+ ```
57
+
58
+ ### External Link with Icon
59
+
60
+ ```html
61
+ <fk-link href="https://example.com" [external]="true"> External Site </fk-link>
62
+ ```
63
+
64
+ ### Variants
65
+
66
+ ```html
67
+ <fk-link href="#" variant="default">Default Link</fk-link>
68
+ <fk-link href="#" variant="primary">Primary Link</fk-link>
69
+ <fk-link href="#" variant="muted">Muted Link</fk-link>
70
+ <fk-link href="#" variant="danger">Delete Account</fk-link>
71
+ ```
72
+
73
+ ### Sizes
74
+
75
+ ```html
76
+ <fk-link href="#" size="small">Small Link</fk-link>
77
+ <fk-link href="#" size="medium">Medium Link</fk-link>
78
+ <fk-link href="#" size="large">Large Link</fk-link>
79
+ ```
80
+
81
+ ### Underline Styles
82
+
83
+ ```html
84
+ <fk-link href="#" underline="none">No Underline</fk-link>
85
+ <fk-link href="#" underline="hover">Hover Underline</fk-link>
86
+ <fk-link href="#" underline="always">Always Underlined</fk-link>
87
+ ```
88
+
89
+ ### Disabled State
90
+
91
+ ```html
92
+ <fk-link href="#" [disabled]="true">Disabled Link</fk-link>
93
+ ```
94
+
95
+ ### Loading State
96
+
97
+ ```html
98
+ <fk-link href="#" [loading]="isLoading">Loading...</fk-link>
99
+ ```
100
+
101
+ ### Analytics Tracking
102
+
103
+ ```html
104
+ <fk-link href="/products" trackingId="nav-products" trackingCategory="navigation" trackingLabel="header-menu"> Products </fk-link>
105
+ ```
106
+
107
+ ### Custom Data Attributes
108
+
109
+ ```html
110
+ <fk-link href="/signup" [dataAttributes]="{ 'data-test-id': 'signup-cta', 'data-priority': 'high' }"> Sign Up </fk-link>
111
+ ```
112
+
113
+ ### Download Link
114
+
115
+ ```html
116
+ <fk-link href="/files/report.pdf" [download]="'monthly-report.pdf'"> Download Report </fk-link>
117
+ ```
118
+
119
+ ### Accessibility
120
+
121
+ ```html
122
+ <fk-link href="/settings" ariaLabel="Go to account settings page" ariaCurrent="page"> Settings </fk-link>
123
+ ```
124
+
125
+ ## API
126
+
127
+ ### Inputs
128
+
129
+ | Input | Type | Default | Description |
130
+ | ------------------ | --------------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------- |
131
+ | `href` | `string \| null` | `null` | External href (for standard `<a>` tags) |
132
+ | `routerLink` | `string \| string[] \| null` | `null` | Angular Router link (for internal navigation) |
133
+ | `variant` | `'default' \| 'primary' \| 'muted' \| 'danger'` | `'default'` | Visual variant |
134
+ | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Link size |
135
+ | `underline` | `'none' \| 'hover' \| 'always'` | `'hover'` | Underline behavior |
136
+ | `target` | `string \| null` | `null` | Target attribute (auto `_blank` for external) |
137
+ | `rel` | `string \| null` | `null` | Rel attribute (auto `noopener noreferrer` for external) |
138
+ | `external` | `boolean` | `false` | Mark as external link (shows icon, sets `target="_blank"`) |
139
+ | `disabled` | `boolean` | `false` | Disable the link |
140
+ | `loading` | `boolean` | `false` | Show loading state |
141
+ | `download` | `string \| boolean \| null` | `null` | Download attribute (for file downloads) |
142
+ | `className` | `string` | `''` | Additional CSS classes |
143
+ | `id` | `string \| null` | `null` | ID attribute |
144
+ | `ariaLabel` | `string \| null` | `null` | ARIA label |
145
+ | `ariaDescribedBy` | `string \| null` | `null` | ARIA described-by |
146
+ | `ariaCurrent` | `'page' \| 'step' \| 'location' \| 'date' \| 'time' \| 'true' \| 'false' \| null` | `null` | ARIA current (for indicating current page/location) |
147
+ | `role` | `string \| null` | `null` | Role attribute |
148
+ | `tabIndex` | `number \| null` | `null` | Tab index (auto `-1` when disabled) |
149
+ | `trackingId` | `string \| null` | `null` | Analytics tracking ID |
150
+ | `trackingCategory` | `string \| null` | `null` | Analytics tracking category |
151
+ | `trackingLabel` | `string \| null` | `null` | Analytics tracking label |
152
+ | `dataAttributes` | `Record<string, string>` | `{}` | Custom data attributes |
153
+
154
+ ### Outputs
155
+
156
+ | Output | Type | Description |
157
+ | --------- | -------------------------- | ----------------------------------------------------------------- |
158
+ | `clicked` | `EventEmitter<MouseEvent>` | Emitted when link is clicked (not emitted if disabled or loading) |
159
+
160
+ ## Design Tokens
161
+
162
+ The Link component uses CSS custom properties for theming:
163
+
164
+ All tokens are defined in `theme/tokens.base.scss`. See `theme/TOKENS.md` for the full contract.
165
+
166
+ ```scss
167
+ // Key link tokens (all --fk-* namespaced):
168
+ --fk-link-color-default
169
+ --fk-link-color-default-hover
170
+ --fk-link-color-primary
171
+ --fk-link-color-primary-hover
172
+ --fk-link-color-primary-active
173
+ --fk-link-color-muted
174
+ --fk-link-color-muted-hover
175
+ --fk-link-color-danger
176
+ --fk-link-color-danger-hover
177
+ --fk-link-color-disabled
178
+ --fk-link-font-size-small
179
+ --fk-link-font-size-medium
180
+ --fk-link-font-size-large
181
+ ```
182
+
183
+ ## Accessibility Features
184
+
185
+ - ✅ **Semantic HTML** — Uses `<a>` for links, `<button>` for button-style links
186
+ - ✅ **Keyboard Navigation** — Full keyboard support (Enter, Space for buttons)
187
+ - ✅ **Focus Indicators** — Visible focus ring (respects `:focus-visible`)
188
+ - ✅ **ARIA Attributes** — Support for `aria-label`, `aria-describedby`, `aria-current`
189
+ - ✅ **Disabled State** — Sets `tabindex="-1"` and prevents navigation
190
+ - ✅ **External Link Indication** — Visual icon (hidden from screen readers with `aria-hidden="true"`)
191
+ - ✅ **Loading State** — Prevents navigation and shows visual feedback
192
+
193
+ ## Best Practices
194
+
195
+ ### When to Use routerLink vs href
196
+
197
+ ```html
198
+ <!-- Use routerLink for internal app navigation -->
199
+ <fk-link routerLink="/dashboard">Dashboard</fk-link>
200
+
201
+ <!-- Use href for external links -->
202
+ <fk-link href="https://example.com" [external]="true">External</fk-link>
203
+
204
+ <!-- Use href for anchor links -->
205
+ <fk-link href="#section">Jump to Section</fk-link>
206
+ ```
207
+
208
+ ### External Links
209
+
210
+ Always mark external links explicitly or let the component auto-detect:
211
+
212
+ ```html
213
+ <!-- Auto-detection (recommended) -->
214
+ <fk-link href="https://example.com">External</fk-link>
215
+
216
+ <!-- Explicit (for internal URLs that should open in new tab) -->
217
+ <fk-link href="/internal" [external]="true">New Tab</fk-link>
218
+ ```
219
+
220
+ ### Accessibility
221
+
222
+ ```html
223
+ <!-- Provide aria-label for icon-only links -->
224
+ <fk-link href="https://github.com" ariaLabel="Visit our GitHub repository">
225
+ <svg>...</svg>
226
+ </fk-link>
227
+
228
+ <!-- Use aria-current for current page -->
229
+ <fk-link routerLink="/home" ariaCurrent="page">Home</fk-link>
230
+ ```
231
+
232
+ ### Analytics Tracking
233
+
234
+ ```html
235
+ <!-- Structured tracking data -->
236
+ <fk-link href="/signup" trackingId="cta-signup-header" trackingCategory="cta" trackingLabel="header"> Sign Up </fk-link>
237
+ ```
238
+
239
+ ## Examples
240
+
241
+ ### Navigation Menu
242
+
243
+ ```html
244
+ <nav>
245
+ <fk-link routerLink="/" ariaCurrent="page" underline="none">Home</fk-link>
246
+ <fk-link routerLink="/products" underline="none">Products</fk-link>
247
+ <fk-link routerLink="/pricing" underline="none">Pricing</fk-link>
248
+ <fk-link href="https://blog.example.com" [external]="true" underline="none"> Blog </fk-link>
249
+ </nav>
250
+ ```
251
+
252
+ ### Footer Links
253
+
254
+ ```html
255
+ <footer>
256
+ <div>
257
+ <h4>Company</h4>
258
+ <fk-link routerLink="/about" variant="muted" size="small">About</fk-link>
259
+ <fk-link routerLink="/careers" variant="muted" size="small">Careers</fk-link>
260
+ <fk-link href="https://blog.example.com" [external]="true" variant="muted" size="small"> Blog </fk-link>
261
+ </div>
262
+ </footer>
263
+ ```
264
+
265
+ ### Call-to-Action
266
+
267
+ ```html
268
+ <fk-link href="/signup" variant="primary" size="large" underline="none"> Get Started Free → </fk-link>
269
+ ```
270
+
271
+ ## Testing
272
+
273
+ The component includes comprehensive unit tests covering:
274
+
275
+ - External link detection
276
+ - Target and rel attributes
277
+ - Tab index behavior
278
+ - Click handling (disabled, loading states)
279
+ - Analytics data attributes
280
+ - CSS class merging
281
+ - All variants, sizes, and underline styles
282
+
283
+ Run tests:
284
+
285
+ ```bash
286
+ npm run test:ui
287
+ ```
288
+
289
+ ## Storybook
290
+
291
+ View all component variations in Storybook:
292
+
293
+ ```bash
294
+ npm run storybook
295
+ ```
296
+
297
+ Navigate to **Atoms → Link** to see interactive examples.
@@ -0,0 +1,145 @@
1
+ # fk-separator
2
+
3
+ A horizontal rule component for visually dividing content sections, styled entirely through design tokens.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | -------------- | ---------------- | ------- | ---------------------------------------------------------- |
13
+ | `marginTop` | `string \| null` | `null` | Custom top margin (sets `--fk-separator-margin-top`) |
14
+ | `marginBottom` | `string \| null` | `null` | Custom bottom margin (sets `--fk-separator-margin-bottom`) |
15
+ | `color` | `string \| null` | `null` | Custom line color (sets `--fk-separator-color`) |
16
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host element |
17
+
18
+ ### Outputs
19
+
20
+ None.
21
+
22
+ ---
23
+
24
+ ## Features
25
+
26
+ - Token-driven styling for color and spacing
27
+ - Per-instance overrides via inputs
28
+ - Renders a semantic `<hr>` element
29
+ - `role="separator"` on the host for accessibility
30
+ - Self-sufficient rendering without any theme file loaded
31
+
32
+ ---
33
+
34
+ ## Quick Start
35
+
36
+ ```html
37
+ <fk-separator />
38
+ ```
39
+
40
+ ---
41
+
42
+ ## Import
43
+
44
+ ```ts
45
+ import { SeparatorComponent } from '@frame-kit/ui-ng';
46
+ ```
47
+
48
+ ```ts
49
+ @Component({
50
+ selector: 'app-example',
51
+ imports: [SeparatorComponent],
52
+ templateUrl: './example.component.html',
53
+ })
54
+ export class ExampleComponent {}
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Selector
60
+
61
+ ```html
62
+ <fk-separator></fk-separator>
63
+ ```
64
+
65
+ ---
66
+
67
+ ## Examples
68
+
69
+ ### Default separator
70
+
71
+ ```html
72
+ <fk-separator />
73
+ ```
74
+
75
+ ### Custom spacing
76
+
77
+ ```html
78
+ <fk-separator marginTop="2rem" marginBottom="1rem" />
79
+ ```
80
+
81
+ ### Custom color
82
+
83
+ ```html
84
+ <fk-separator color="#e02424" />
85
+ ```
86
+
87
+ ---
88
+
89
+ ## Accessibility
90
+
91
+ `fk-separator` renders a native `<hr>` element with `role="separator"` on the host.
92
+
93
+ Accessibility behavior:
94
+
95
+ - Semantic separator role for screen readers
96
+ - Visual divider between content sections
97
+
98
+ ---
99
+
100
+ ## Design Tokens
101
+
102
+ `fk-separator` is styled entirely through design tokens.
103
+
104
+ ### Component-specific tokens
105
+
106
+ ```
107
+ --fk-separator-color
108
+ --fk-separator-margin-top
109
+ --fk-separator-margin-bottom
110
+ --fk-separator-border-width
111
+ ```
112
+
113
+ ### Shared tokens
114
+
115
+ ```
116
+ --fk-color-border
117
+ --fk-rhythm-6
118
+ ```
119
+
120
+ ### Customizing Tokens
121
+
122
+ Override tokens in your application's stylesheet:
123
+
124
+ ```scss
125
+ :root {
126
+ --fk-separator-color: #e5e7eb;
127
+ --fk-separator-margin-top: 2rem;
128
+ --fk-separator-margin-bottom: 1rem;
129
+ }
130
+ ```
131
+
132
+ Or scope overrides to a specific context:
133
+
134
+ ```scss
135
+ .compact-layout fk-separator {
136
+ --fk-separator-margin-top: 0.5rem;
137
+ }
138
+ ```
139
+
140
+ ---
141
+
142
+ ## Behavior Notes
143
+
144
+ - Default margin is applied via `--fk-separator-margin-top` (top only); bottom margin defaults to `0`
145
+ - Per-instance `marginTop`, `marginBottom`, and `color` inputs override the corresponding tokens inline