@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,187 @@
1
+ # fk-numbered-list
2
+
3
+ A token-driven numbered list for ordered procedures and step-by-step instructions. Ships as a pair: `fk-numbered-list` is the container, `fk-numbered-list-item` is the renderable row — use either a data-driven `items` input or content projection with `<fk-numbered-list-item>` children. Numbering is automatic via CSS counters.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### `fk-numbered-list`
10
+
11
+ #### Inputs
12
+
13
+ | Input | Type | Default | Description |
14
+ | ----------- | ------------------------------------- | ------- | ----------------------------------------------------------------------------------- |
15
+ | `items` | `readonly NumberedListItem[] \| null` | `null` | Data-driven rows. When `null`, the list projects `<fk-numbered-list-item>` children |
16
+ | `size` | `NumberedListSize` | `"md"` | Default size inherited by items: `"sm"`, `"md"`, `"lg"` |
17
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host element |
18
+ | `id` | `string \| null` | `null` | Optional ID applied to the inner `role="list"` container |
19
+ | `ariaLabel` | `string \| null` | `null` | Accessible label on the inner `role="list"` container |
20
+
21
+ ### `fk-numbered-list-item`
22
+
23
+ #### Inputs
24
+
25
+ | Input | Type | Default | Description |
26
+ | ----------- | -------------------------- | ------- | -------------------------------------------------------- |
27
+ | `size` | `NumberedListSize \| null` | `null` | Per-item size override. Falls through to the parent list |
28
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host element |
29
+ | `id` | `string \| null` | `null` | Optional ID applied to the host element |
30
+ | `ariaLabel` | `string \| null` | `null` | Accessible label when the label alone is insufficient |
31
+
32
+ #### Content
33
+
34
+ `fk-numbered-list-item` projects its label content:
35
+
36
+ ```html
37
+ <fk-numbered-list-item>Your step text here</fk-numbered-list-item>
38
+ ```
39
+
40
+ ### Outputs
41
+
42
+ None on either component.
43
+
44
+ ---
45
+
46
+ ## Features
47
+
48
+ - Two usage modes — data-driven (`items` input) or content-projection (`<fk-numbered-list-item>` children)
49
+ - Automatic numbering via CSS counters — no manual index tracking
50
+ - Items inherit the list's `size` via element-injector DI; the per-item `size` input overrides the parent
51
+ - Three size steps that scale label typography
52
+ - Semantic `role="list"` / `role="listitem"` pairing; item roles are only advertised when inside an `fk-numbered-list` container, so standalone items don't announce orphan list semantics
53
+
54
+ ---
55
+
56
+ ## Quick Start
57
+
58
+ Data-driven:
59
+
60
+ ```html
61
+ <fk-numbered-list [items]="steps" />
62
+ ```
63
+
64
+ ```ts
65
+ readonly steps = [
66
+ { label: "Open the page" },
67
+ { label: "Click the button" },
68
+ { label: "Confirm the change" },
69
+ ];
70
+ ```
71
+
72
+ Content-projection:
73
+
74
+ ```html
75
+ <fk-numbered-list>
76
+ <fk-numbered-list-item>Open the page</fk-numbered-list-item>
77
+ <fk-numbered-list-item>Click the button</fk-numbered-list-item>
78
+ <fk-numbered-list-item>Confirm the change</fk-numbered-list-item>
79
+ </fk-numbered-list>
80
+ ```
81
+
82
+ ---
83
+
84
+ ## Import
85
+
86
+ ```ts
87
+ import { NumberedListComponent, NumberedListItemComponent } from '@frame-kit/ui-ng';
88
+ ```
89
+
90
+ ```ts
91
+ @Component({
92
+ selector: 'app-example',
93
+ imports: [NumberedListComponent, NumberedListItemComponent],
94
+ templateUrl: './example.component.html',
95
+ })
96
+ export class ExampleComponent {}
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Selectors
102
+
103
+ ```html
104
+ <fk-numbered-list></fk-numbered-list> <fk-numbered-list-item></fk-numbered-list-item>
105
+ ```
106
+
107
+ ---
108
+
109
+ ## Examples
110
+
111
+ ### Procedure with data-driven items
112
+
113
+ ```html
114
+ <fk-numbered-list [items]="steps" />
115
+ ```
116
+
117
+ ### Sizing
118
+
119
+ ```html
120
+ <fk-numbered-list [items]="steps" size="sm" />
121
+ <fk-numbered-list [items]="steps" size="md" />
122
+ <fk-numbered-list [items]="steps" size="lg" />
123
+ ```
124
+
125
+ ### Mixed sizes per item
126
+
127
+ ```html
128
+ <fk-numbered-list size="md">
129
+ <fk-numbered-list-item>Standard step</fk-numbered-list-item>
130
+ <fk-numbered-list-item size="lg">A larger emphasised step</fk-numbered-list-item>
131
+ <fk-numbered-list-item>Standard step</fk-numbered-list-item>
132
+ </fk-numbered-list>
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Accessibility
138
+
139
+ - `fk-numbered-list` renders `<div role="list">` so list semantics survive the `list-style: none` reset (Safari otherwise strips the implicit list role).
140
+ - `fk-numbered-list-item` sets `role="listitem"` only when nested inside an `fk-numbered-list` — this avoids announcing orphan list items when the component is used standalone.
141
+ - The number badge is generated by a CSS counter on a pseudo-element marked `aria-hidden="true"` — the projected label is the assistive-tech-readable content. Screen readers announce the list items in order via the parent's list role.
142
+ - Set `ariaLabel` on the list when the surrounding context doesn't already name the procedure.
143
+
144
+ ---
145
+
146
+ ## Design Tokens
147
+
148
+ ```scss
149
+ /* Container */
150
+ --fk-numbered-list-margin-top;
151
+ --fk-numbered-list-row-gap;
152
+
153
+ /* Item */
154
+ --fk-numbered-list-item-gap;
155
+ --fk-numbered-list-item-color;
156
+ --fk-numbered-list-item-line-height;
157
+
158
+ --fk-numbered-list-item-sm-font-size;
159
+ --fk-numbered-list-item-md-font-size;
160
+ --fk-numbered-list-item-lg-font-size;
161
+
162
+ /* Number badge */
163
+ --fk-numbered-list-badge-size;
164
+ --fk-numbered-list-badge-radius;
165
+ --fk-numbered-list-badge-bg;
166
+ --fk-numbered-list-badge-color;
167
+ --fk-numbered-list-badge-font-size;
168
+ --fk-numbered-list-badge-font-weight;
169
+ ```
170
+
171
+ Override in your app stylesheet:
172
+
173
+ ```scss
174
+ :root {
175
+ --fk-numbered-list-row-gap: 1rem;
176
+ --fk-numbered-list-badge-bg: var(--fk-color-success-light);
177
+ --fk-numbered-list-badge-color: var(--fk-color-success);
178
+ }
179
+ ```
180
+
181
+ ---
182
+
183
+ ## Behavior Notes
184
+
185
+ - Data-driven mode internally renders `fk-numbered-list-item` per row, so the DOM is identical whether you use `[items]` or content projection.
186
+ - Numbering is purely visual via CSS counters. Each new `fk-numbered-list` instance restarts the counter at 1, so multiple lists on the same page each number from one independently.
187
+ - The default top margin (`--fk-numbered-list-margin-top`) matches `fk-icon-list` so vertical rhythm is consistent when the two are used side by side in the same docs section.
@@ -0,0 +1,174 @@
1
+ # fk-pagination
2
+
3
+ A table/list pagination control with page navigation, page-size selector, and range summary.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | ----------------- | ---------------- | ------------------- | ---------------------------------------------------- |
13
+ | `page` | `number` | **required** | Current page number (1-based) |
14
+ | `take` | `number` | **required** | Number of items per page |
15
+ | `itemCount` | `number` | **required** | Total number of items across all pages |
16
+ | `pageSizeOptions` | `number[]` | `[10, 20, 50, 100]` | Options shown in the "Rows per page" dropdown |
17
+ | `showFirstLast` | `boolean` | `false` | Show "First page" and "Last page" navigation buttons |
18
+ | `className` | `string` | `''` | Additional CSS classes for the host element |
19
+ | `id` | `string \| null` | `null` | ID bound to the host element |
20
+ | `ariaLabel` | `string \| null` | `null` | `aria-label` bound to the host element |
21
+
22
+ ### Outputs
23
+
24
+ | Output | Type | Description |
25
+ | ------------ | ----------------- | ------------------------------------------------------ |
26
+ | `pageChange` | `PageChangeEvent` | Emitted on page or page-size change (`{ page, take }`) |
27
+
28
+ ---
29
+
30
+ ## Features
31
+
32
+ - Displays a human-readable range summary (e.g. "1 -- 20 of 100")
33
+ - Previous / Next navigation buttons with automatic disabled state
34
+ - Optional First / Last page buttons via `showFirstLast`
35
+ - Built-in "Rows per page" dropdown with configurable options
36
+ - Page resets to 1 when page size changes
37
+ - Unique auto-generated ID for the page-size select element
38
+ - Token-driven styling for full theme customization
39
+
40
+ ---
41
+
42
+ ## Quick Start
43
+
44
+ ```html
45
+ <fk-pagination [page]="currentPage" [take]="pageSize" [itemCount]="totalItems" (pageChange)="onPageChange($event)"></fk-pagination>
46
+ ```
47
+
48
+ ```ts
49
+ onPageChange(event: PageChangeEvent): void {
50
+ this.currentPage = event.page;
51
+ this.pageSize = event.take;
52
+ this.loadData();
53
+ }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Import
59
+
60
+ ```ts
61
+ import { PaginationComponent } from '@frame-kit/ui-ng';
62
+ ```
63
+
64
+ ```ts
65
+ @Component({
66
+ selector: 'app-example',
67
+ imports: [PaginationComponent],
68
+ templateUrl: './example.component.html',
69
+ })
70
+ export class ExampleComponent {}
71
+ ```
72
+
73
+ ---
74
+
75
+ ## Selector
76
+
77
+ ```html
78
+ <fk-pagination></fk-pagination>
79
+ ```
80
+
81
+ ---
82
+
83
+ ## Examples
84
+
85
+ ### Basic pagination
86
+
87
+ ```html
88
+ <fk-pagination [page]="page" [take]="take" [itemCount]="totalItems" (pageChange)="onPageChange($event)"></fk-pagination>
89
+ ```
90
+
91
+ ### With first/last buttons
92
+
93
+ ```html
94
+ <fk-pagination [page]="page" [take]="take" [itemCount]="totalItems" [showFirstLast]="true" (pageChange)="onPageChange($event)"></fk-pagination>
95
+ ```
96
+
97
+ ### Custom page size options
98
+
99
+ ```html
100
+ <fk-pagination [page]="page" [take]="take" [itemCount]="totalItems" [pageSizeOptions]="[5, 25, 50]" (pageChange)="onPageChange($event)"></fk-pagination>
101
+ ```
102
+
103
+ ---
104
+
105
+ ## Accessibility
106
+
107
+ - Navigation buttons use `aria-label` attributes ("Previous page", "Next page", "First page", "Last page")
108
+ - The navigation wrapper has `role="navigation"` with `aria-label="Pagination"`
109
+ - Arrow SVGs are marked `aria-hidden="true"`
110
+ - The page-size `<select>` is associated with its label via a unique auto-generated `id`
111
+ - Disabled buttons use the native `disabled` attribute
112
+
113
+ ---
114
+
115
+ ## Design Tokens
116
+
117
+ ```scss
118
+ /* Layout */
119
+ --fk-pagination-gap
120
+ --fk-pagination-padding
121
+ --fk-pagination-padding-inline
122
+ --fk-pagination-controls-gap
123
+ --fk-pagination-nav-gap
124
+
125
+ /* Typography */
126
+ --fk-pagination-font-family
127
+ --fk-pagination-font-size
128
+ --fk-pagination-color
129
+ --fk-pagination-label-color
130
+ --fk-pagination-page-info-color
131
+ --fk-pagination-page-info-min-width
132
+
133
+ /* Border */
134
+ --fk-pagination-border-width
135
+ --fk-pagination-border-color
136
+
137
+ /* Page-size select */
138
+ --fk-pagination-select-padding-block
139
+ --fk-pagination-select-padding-left
140
+ --fk-pagination-select-padding-right
141
+ --fk-pagination-select-chevron-offset
142
+ --fk-pagination-select-color
143
+ --fk-pagination-select-bg
144
+ --fk-pagination-select-border-color
145
+ --fk-pagination-select-border-radius
146
+ --fk-pagination-select-focus-border-color
147
+ --fk-pagination-select-focus-ring
148
+
149
+ /* Navigation buttons */
150
+ --fk-pagination-btn-size
151
+ --fk-pagination-btn-color
152
+ --fk-pagination-btn-bg
153
+ --fk-pagination-btn-bg-hover
154
+ --fk-pagination-btn-border-color
155
+ --fk-pagination-btn-border-color-hover
156
+ --fk-pagination-btn-border-radius
157
+ --fk-pagination-btn-disabled-opacity
158
+ --fk-pagination-btn-focus-border-color
159
+ --fk-pagination-btn-focus-ring
160
+
161
+ /* Arrow icon */
162
+ --fk-pagination-arrow-size
163
+ ```
164
+
165
+ ---
166
+
167
+ ## Behavior Notes
168
+
169
+ - `pageCount` is always >= 1. When `itemCount` is 0, `pageCount` is 1 (not 0) so the UI shows "1 / 1" rather than "1 / 0". This matches the backend `PageMetaDto` contract
170
+ - `rangeStart` returns 0 when `itemCount` is 0, otherwise `(page - 1) * take + 1`
171
+ - `rangeEnd` is clamped to `itemCount` so the last page never overshoots the total
172
+ - Navigation methods (`goToNext`, `goToPrevious`, `goToFirst`, `goToLast`) are no-ops when the target page is out of bounds
173
+ - Changing the page size always resets `page` to 1 in the emitted event
174
+ - Each component instance receives a unique select ID (`fk-pagination-take-<n>`) via an incrementing module-level counter
@@ -0,0 +1,223 @@
1
+ # fk-progress-bar
2
+
3
+ A token-driven progress bar component for indicating how far along a single task or process is, with determinate and indeterminate modes.
4
+
5
+ ---
6
+
7
+ ## API
8
+
9
+ ### Inputs
10
+
11
+ | Input | Type | Default | Description |
12
+ | ----------------- | ------------------------------------------------- | --------------- | ---------------------------------------------- |
13
+ | `value` | `number` | `0` | Current value, clamped to 0–max |
14
+ | `max` | `number` | `100` | Maximum value |
15
+ | `mode` | `'determinate' \| 'indeterminate'` | `'determinate'` | Bar mode |
16
+ | `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Bar height preset |
17
+ | `variant` | `'default' \| 'success' \| 'warning' \| 'danger'` | `'default'` | Semantic color variant |
18
+ | `color` | `string \| null` | `null` | Custom fill color (overrides variant) |
19
+ | `trackColor` | `string \| null` | `null` | Custom track/background color |
20
+ | `height` | `string \| null` | `null` | Custom height (e.g. `'4px'`), overrides `size` |
21
+ | `showValue` | `boolean` | `false` | Show percentage label beside the bar |
22
+ | `striped` | `boolean` | `false` | Animated stripe pattern on the fill |
23
+ | `ariaLabel` | `string \| null` | `null` | Accessible label |
24
+ | `ariaDescribedBy` | `string \| null` | `null` | ARIA described-by ID |
25
+ | `id` | `string \| null` | `null` | Element ID |
26
+ | `className` | `string` | `''` | Additional CSS classes merged onto the host |
27
+
28
+ ### Outputs
29
+
30
+ None.
31
+
32
+ ---
33
+
34
+ ## Features
35
+
36
+ - Determinate and indeterminate modes
37
+ - Three size presets (sm, md, lg) plus custom height override
38
+ - Four semantic color variants plus custom color override
39
+ - Animated stripe pattern
40
+ - Optional percentage label
41
+ - Token-driven styling with two-tier fallbacks
42
+ - Full ARIA progressbar semantics
43
+ - Respects `prefers-reduced-motion`
44
+
45
+ ---
46
+
47
+ ## Quick Start
48
+
49
+ ```html
50
+ <fk-progress-bar [value]="45"></fk-progress-bar>
51
+ ```
52
+
53
+ ---
54
+
55
+ ## Import
56
+
57
+ ```ts
58
+ import { ProgressBarComponent } from '@frame-kit/ui-ng';
59
+ ```
60
+
61
+ ```ts
62
+ @Component({
63
+ selector: 'app-example',
64
+ imports: [ProgressBarComponent],
65
+ templateUrl: './example.component.html',
66
+ })
67
+ export class ExampleComponent {}
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Selector
73
+
74
+ ```html
75
+ <fk-progress-bar></fk-progress-bar>
76
+ ```
77
+
78
+ ---
79
+
80
+ ## Examples
81
+
82
+ ### Default
83
+
84
+ ```html
85
+ <fk-progress-bar [value]="60"></fk-progress-bar>
86
+ ```
87
+
88
+ ### With percentage label
89
+
90
+ ```html
91
+ <fk-progress-bar [value]="72" [showValue]="true"></fk-progress-bar>
92
+ ```
93
+
94
+ ### Sizes
95
+
96
+ ```html
97
+ <fk-progress-bar [value]="60" size="sm"></fk-progress-bar>
98
+ <fk-progress-bar [value]="60" size="md"></fk-progress-bar>
99
+ <fk-progress-bar [value]="60" size="lg"></fk-progress-bar>
100
+ ```
101
+
102
+ ### Semantic variants
103
+
104
+ ```html
105
+ <fk-progress-bar [value]="80" variant="success"></fk-progress-bar>
106
+ <fk-progress-bar [value]="50" variant="warning"></fk-progress-bar>
107
+ <fk-progress-bar [value]="30" variant="danger"></fk-progress-bar>
108
+ ```
109
+
110
+ ### Striped
111
+
112
+ ```html
113
+ <fk-progress-bar [value]="65" [striped]="true"></fk-progress-bar>
114
+ ```
115
+
116
+ ### Indeterminate
117
+
118
+ ```html
119
+ <fk-progress-bar mode="indeterminate"></fk-progress-bar>
120
+ ```
121
+
122
+ ### Custom colors
123
+
124
+ ```html
125
+ <fk-progress-bar [value]="50" color="#8b5cf6" trackColor="#ede9fe"></fk-progress-bar>
126
+ ```
127
+
128
+ ### Custom max
129
+
130
+ ```html
131
+ <fk-progress-bar [value]="3" [max]="10" [showValue]="true"></fk-progress-bar>
132
+ ```
133
+
134
+ ---
135
+
136
+ ## Accessibility
137
+
138
+ `fk-progress-bar` applies `role="progressbar"` on the host element with full ARIA value attributes.
139
+
140
+ Accessibility behavior:
141
+
142
+ - `aria-valuemin`, `aria-valuemax`, and `aria-valuenow` reflect current state
143
+ - `aria-valuetext` provides a human-readable value (e.g. "45%" or "Loading...")
144
+ - In indeterminate mode, `aria-valuenow`, `aria-valuemax`, and `aria-valuemin` are removed
145
+ - Supports `ariaLabel` and `ariaDescribedBy` for additional context
146
+
147
+ ### Recommended
148
+
149
+ ```html
150
+ <fk-progress-bar [value]="progress" ariaLabel="Upload progress"></fk-progress-bar>
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Design Tokens
156
+
157
+ `fk-progress-bar` is styled entirely through design tokens.
158
+
159
+ ### Component-specific tokens
160
+
161
+ ```
162
+ --fk-progress-bar-height-sm
163
+ --fk-progress-bar-height-md
164
+ --fk-progress-bar-height-lg
165
+ --fk-progress-bar-radius
166
+ --fk-progress-bar-bg
167
+ --fk-progress-bar-fill
168
+ --fk-progress-bar-fill-success
169
+ --fk-progress-bar-fill-warning
170
+ --fk-progress-bar-fill-danger
171
+ --fk-progress-bar-label-color
172
+ --fk-progress-bar-label-size
173
+ --fk-progress-bar-label-weight
174
+ --fk-progress-bar-label-gap
175
+ --fk-progress-bar-transition
176
+ --fk-progress-bar-animation-duration
177
+ ```
178
+
179
+ ### Shared tokens
180
+
181
+ ```
182
+ --fk-color-primary
183
+ --fk-color-success
184
+ --fk-color-warning
185
+ --fk-color-danger
186
+ --fk-color-surface-muted
187
+ --fk-color-text
188
+ --fk-radius-full
189
+ --fk-rhythm-1
190
+ --fk-rhythm-2
191
+ --fk-rhythm-3
192
+ --fk-typography-caption-font-size
193
+ --fk-font-weight-medium
194
+ ```
195
+
196
+ ### Customizing Tokens
197
+
198
+ Override tokens in your application's stylesheet:
199
+
200
+ ```scss
201
+ :root {
202
+ --fk-progress-bar-fill: #6366f1;
203
+ --fk-progress-bar-radius: 4px;
204
+ --fk-progress-bar-height-md: 0.75rem;
205
+ }
206
+ ```
207
+
208
+ Or scope overrides to a specific context:
209
+
210
+ ```scss
211
+ .compact-layout fk-progress-bar {
212
+ --fk-progress-bar-height-md: 0.25rem;
213
+ }
214
+ ```
215
+
216
+ ---
217
+
218
+ ## Behavior Notes
219
+
220
+ - Values are clamped to the range 0–max; negative values resolve to 0, values above max resolve to max
221
+ - When `max` is 0, percentage resolves to 0 to avoid division by zero
222
+ - `color` input overrides the variant fill color via inline style
223
+ - Stripe and indeterminate animations are disabled when `prefers-reduced-motion: reduce` is active