@skunkworksai/ui-kit 0.1.18

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 (274) hide show
  1. package/AGENTS.md +250 -0
  2. package/README.md +429 -0
  3. package/dist/assets/Service-applets-apps/audience-measurement.png +0 -0
  4. package/dist/assets/Service-applets-apps/coatro-app.png +0 -0
  5. package/dist/assets/Service-applets-apps/content-effectiveness.png +0 -0
  6. package/dist/assets/Service-applets-apps/hop-tracking.png +0 -0
  7. package/dist/assets/Service-applets-apps/index.ts +13 -0
  8. package/dist/assets/Service-applets-apps/journeys-app.png +0 -0
  9. package/dist/assets/Service-applets-apps/people-counting.png +0 -0
  10. package/dist/assets/Service-applets-apps/petra.png +0 -0
  11. package/dist/assets/Service-applets-apps/sam-generic.png +0 -0
  12. package/dist/assets/Service-applets-apps/sami-for-environment.png +0 -0
  13. package/dist/assets/Service-applets-apps/shelf-engagement.png +0 -0
  14. package/dist/assets/Service-applets-apps/traffic-management.png +0 -0
  15. package/dist/assets/Service-applets-apps/viana.png +0 -0
  16. package/dist/assets/Service-applets-apps/zone-engagement.png +0 -0
  17. package/dist/assets/icons/Dashboard-active.svg +29 -0
  18. package/dist/assets/icons/Dashboard.svg +25 -0
  19. package/dist/assets/icons/DashboardActiveIcon.tsx +35 -0
  20. package/dist/assets/icons/DashboardIcon.tsx +31 -0
  21. package/dist/assets/icons/Devices-active.svg +27 -0
  22. package/dist/assets/icons/Devices.svg +20 -0
  23. package/dist/assets/icons/DevicesActiveIcon.tsx +33 -0
  24. package/dist/assets/icons/DevicesIcon.tsx +26 -0
  25. package/dist/assets/icons/Installer-active.svg +29 -0
  26. package/dist/assets/icons/Installer.svg +17 -0
  27. package/dist/assets/icons/InstallerActiveIcon.tsx +35 -0
  28. package/dist/assets/icons/InstallerIcon.tsx +23 -0
  29. package/dist/assets/icons/Manifest-active.svg +49 -0
  30. package/dist/assets/icons/Manifest.svg +49 -0
  31. package/dist/assets/icons/ManifestActiveIcon.tsx +55 -0
  32. package/dist/assets/icons/ManifestIcon.tsx +55 -0
  33. package/dist/assets/icons/Sensor-active.svg +15 -0
  34. package/dist/assets/icons/Sensor.svg +11 -0
  35. package/dist/assets/icons/SensorActiveIcon.tsx +21 -0
  36. package/dist/assets/icons/SensorIcon.tsx +17 -0
  37. package/dist/assets/icons/Site-active.svg +14 -0
  38. package/dist/assets/icons/Site.svg +10 -0
  39. package/dist/assets/icons/SiteActiveIcon.tsx +20 -0
  40. package/dist/assets/icons/SiteIcon.tsx +16 -0
  41. package/dist/assets/icons/X-ray-active.svg +199 -0
  42. package/dist/assets/icons/X-ray.svg +47 -0
  43. package/dist/assets/icons/XrayActiveIcon.tsx +205 -0
  44. package/dist/assets/icons/XrayIcon.tsx +53 -0
  45. package/dist/assets/icons/index.ts +14 -0
  46. package/dist/assets/logos/DarkLogo.tsx +28 -0
  47. package/dist/assets/logos/DarkSymbol.tsx +9 -0
  48. package/dist/assets/logos/PrimaryLogo.tsx +28 -0
  49. package/dist/assets/logos/PrimarySymbol.tsx +9 -0
  50. package/dist/assets/logos/WhiteLogo.tsx +28 -0
  51. package/dist/assets/logos/WhiteSymbol.tsx +9 -0
  52. package/dist/assets/logos/dark_logo.svg +22 -0
  53. package/dist/assets/logos/dark_symbol.svg +3 -0
  54. package/dist/assets/logos/index.ts +6 -0
  55. package/dist/assets/logos/primary-logo.svg +22 -0
  56. package/dist/assets/logos/primary_logo.svg +22 -0
  57. package/dist/assets/logos/primary_symbol.svg +3 -0
  58. package/dist/assets/logos/white_symbol.svg +3 -0
  59. package/dist/index.cjs +160 -0
  60. package/dist/index.cjs.map +1 -0
  61. package/dist/index.js +45276 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/tokens-source.css +121 -0
  64. package/dist/types/assets/Service-applets-apps/index.d.ts +13 -0
  65. package/dist/types/assets/icons/DashboardActiveIcon.d.ts +2 -0
  66. package/dist/types/assets/icons/DashboardIcon.d.ts +2 -0
  67. package/dist/types/assets/icons/DevicesActiveIcon.d.ts +2 -0
  68. package/dist/types/assets/icons/DevicesIcon.d.ts +2 -0
  69. package/dist/types/assets/icons/InstallerActiveIcon.d.ts +2 -0
  70. package/dist/types/assets/icons/InstallerIcon.d.ts +2 -0
  71. package/dist/types/assets/icons/ManifestActiveIcon.d.ts +2 -0
  72. package/dist/types/assets/icons/ManifestIcon.d.ts +2 -0
  73. package/dist/types/assets/icons/SensorActiveIcon.d.ts +2 -0
  74. package/dist/types/assets/icons/SensorIcon.d.ts +2 -0
  75. package/dist/types/assets/icons/SiteActiveIcon.d.ts +2 -0
  76. package/dist/types/assets/icons/SiteIcon.d.ts +2 -0
  77. package/dist/types/assets/icons/XrayActiveIcon.d.ts +2 -0
  78. package/dist/types/assets/icons/XrayIcon.d.ts +2 -0
  79. package/dist/types/assets/icons/index.d.ts +14 -0
  80. package/dist/types/assets/logos/DarkLogo.d.ts +2 -0
  81. package/dist/types/assets/logos/DarkSymbol.d.ts +2 -0
  82. package/dist/types/assets/logos/PrimaryLogo.d.ts +2 -0
  83. package/dist/types/assets/logos/PrimarySymbol.d.ts +2 -0
  84. package/dist/types/assets/logos/WhiteLogo.d.ts +2 -0
  85. package/dist/types/assets/logos/WhiteSymbol.d.ts +2 -0
  86. package/dist/types/assets/logos/index.d.ts +6 -0
  87. package/dist/types/components/blocks/AppBentoMenu.d.ts +31 -0
  88. package/dist/types/components/blocks/AppDashboard.d.ts +121 -0
  89. package/dist/types/components/blocks/AppHeader.d.ts +198 -0
  90. package/dist/types/components/blocks/AppLocationTreeFilter.d.ts +44 -0
  91. package/dist/types/components/blocks/AppNotificationsMenu.d.ts +50 -0
  92. package/dist/types/components/blocks/AppPageTitle.d.ts +86 -0
  93. package/dist/types/components/blocks/AppProfile.d.ts +53 -0
  94. package/dist/types/components/blocks/TableManager.d.ts +194 -0
  95. package/dist/types/components/blocks/backgrounds/AppDashboardBackgroundDots.d.ts +14 -0
  96. package/dist/types/components/blocks/backgrounds/AppDashboardBackgroundWave.d.ts +14 -0
  97. package/dist/types/components/blocks/backgrounds/index.d.ts +3 -0
  98. package/dist/types/components/blocks/backgrounds/types.d.ts +13 -0
  99. package/dist/types/components/blocks/index.d.ts +9 -0
  100. package/dist/types/components/primitives/AppAccordion.d.ts +22 -0
  101. package/dist/types/components/primitives/AppAlert.d.ts +33 -0
  102. package/dist/types/components/primitives/AppAlertDialog.d.ts +79 -0
  103. package/dist/types/components/primitives/AppAspectRatio.d.ts +7 -0
  104. package/dist/types/components/primitives/AppAvatar.d.ts +17 -0
  105. package/dist/types/components/primitives/AppBadge.d.ts +9 -0
  106. package/dist/types/components/primitives/AppBreadcrumb.d.ts +45 -0
  107. package/dist/types/components/primitives/AppButton.d.ts +24 -0
  108. package/dist/types/components/primitives/AppButtonGroup.d.ts +10 -0
  109. package/dist/types/components/primitives/AppCalendar.d.ts +51 -0
  110. package/dist/types/components/primitives/AppCard.d.ts +41 -0
  111. package/dist/types/components/primitives/AppCarousel.d.ts +26 -0
  112. package/dist/types/components/primitives/AppChart.d.ts +27 -0
  113. package/dist/types/components/primitives/AppCheckbox.d.ts +9 -0
  114. package/dist/types/components/primitives/AppCollapsible.d.ts +20 -0
  115. package/dist/types/components/primitives/AppCombobox.d.ts +37 -0
  116. package/dist/types/components/primitives/AppCommand.d.ts +47 -0
  117. package/dist/types/components/primitives/AppContextMenu.d.ts +82 -0
  118. package/dist/types/components/primitives/AppDataTable.d.ts +23 -0
  119. package/dist/types/components/primitives/AppDatePicker.d.ts +26 -0
  120. package/dist/types/components/primitives/AppDialog.d.ts +40 -0
  121. package/dist/types/components/primitives/AppDrawer.d.ts +58 -0
  122. package/dist/types/components/primitives/AppDropdownMenu.d.ts +85 -0
  123. package/dist/types/components/primitives/AppEmpty.d.ts +35 -0
  124. package/dist/types/components/primitives/AppField.d.ts +65 -0
  125. package/dist/types/components/primitives/AppForm.d.ts +58 -0
  126. package/dist/types/components/primitives/AppHoverCard.d.ts +19 -0
  127. package/dist/types/components/primitives/AppInput.d.ts +21 -0
  128. package/dist/types/components/primitives/AppKbd.d.ts +18 -0
  129. package/dist/types/components/primitives/AppLabel.d.ts +8 -0
  130. package/dist/types/components/primitives/AppMenubar.d.ts +83 -0
  131. package/dist/types/components/primitives/AppNavigationMenu.d.ts +51 -0
  132. package/dist/types/components/primitives/AppPagination.d.ts +46 -0
  133. package/dist/types/components/primitives/AppPopover.d.ts +20 -0
  134. package/dist/types/components/primitives/AppProgress.d.ts +9 -0
  135. package/dist/types/components/primitives/AppRadioGroup.d.ts +15 -0
  136. package/dist/types/components/primitives/AppScrollArea.d.ts +12 -0
  137. package/dist/types/components/primitives/AppScrollText.d.ts +7 -0
  138. package/dist/types/components/primitives/AppSelect.d.ts +46 -0
  139. package/dist/types/components/primitives/AppSeparator.d.ts +8 -0
  140. package/dist/types/components/primitives/AppSheet.d.ts +32 -0
  141. package/dist/types/components/primitives/AppSidebar.d.ts +59 -0
  142. package/dist/types/components/primitives/AppSkeleton.d.ts +6 -0
  143. package/dist/types/components/primitives/AppSpinner.d.ts +13 -0
  144. package/dist/types/components/primitives/AppSwitch.d.ts +8 -0
  145. package/dist/types/components/primitives/AppTable.d.ts +53 -0
  146. package/dist/types/components/primitives/AppTabs.d.ts +10 -0
  147. package/dist/types/components/primitives/AppTextarea.d.ts +9 -0
  148. package/dist/types/components/primitives/AppThemeProvider.d.ts +46 -0
  149. package/dist/types/components/primitives/AppToaster.d.ts +7 -0
  150. package/dist/types/components/primitives/AppToggle.d.ts +9 -0
  151. package/dist/types/components/primitives/AppToggleGroup.d.ts +18 -0
  152. package/dist/types/components/primitives/AppTooltip.d.ts +26 -0
  153. package/dist/types/components/primitives/AppTypography.d.ts +80 -0
  154. package/dist/types/components/primitives/index.d.ts +57 -0
  155. package/dist/types/components/ui/accordion.d.ts +7 -0
  156. package/dist/types/components/ui/alert-dialog.d.ts +20 -0
  157. package/dist/types/components/ui/alert.d.ts +8 -0
  158. package/dist/types/components/ui/aspect-ratio.d.ts +4 -0
  159. package/dist/types/components/ui/avatar.d.ts +6 -0
  160. package/dist/types/components/ui/badge.d.ts +9 -0
  161. package/dist/types/components/ui/breadcrumb.d.ts +19 -0
  162. package/dist/types/components/ui/button.d.ts +13 -0
  163. package/dist/types/components/ui/calendar.d.ts +8 -0
  164. package/dist/types/components/ui/card.d.ts +11 -0
  165. package/dist/types/components/ui/carousel.d.ts +28 -0
  166. package/dist/types/components/ui/chart.d.ts +48 -0
  167. package/dist/types/components/ui/checkbox.d.ts +4 -0
  168. package/dist/types/components/ui/collapsible.d.ts +6 -0
  169. package/dist/types/components/ui/combobox.d.ts +83 -0
  170. package/dist/types/components/ui/command.d.ts +82 -0
  171. package/dist/types/components/ui/context-menu.d.ts +27 -0
  172. package/dist/types/components/ui/dialog.d.ts +19 -0
  173. package/dist/types/components/ui/drawer.d.ts +23 -0
  174. package/dist/types/components/ui/dropdown-menu.d.ts +27 -0
  175. package/dist/types/components/ui/empty.d.ts +14 -0
  176. package/dist/types/components/ui/field.d.ts +40 -0
  177. package/dist/types/components/ui/form.d.ts +22 -0
  178. package/dist/types/components/ui/hover-card.d.ts +6 -0
  179. package/dist/types/components/ui/input.d.ts +3 -0
  180. package/dist/types/components/ui/kbd.d.ts +4 -0
  181. package/dist/types/components/ui/label.d.ts +4 -0
  182. package/dist/types/components/ui/menubar.d.ts +30 -0
  183. package/dist/types/components/ui/navigation-menu.d.ts +12 -0
  184. package/dist/types/components/ui/pagination.d.ts +28 -0
  185. package/dist/types/components/ui/popover.d.ts +6 -0
  186. package/dist/types/components/ui/progress.d.ts +4 -0
  187. package/dist/types/components/ui/radio-group.d.ts +5 -0
  188. package/dist/types/components/ui/scroll-area.d.ts +5 -0
  189. package/dist/types/components/ui/scroll-text.d.ts +6 -0
  190. package/dist/types/components/ui/select.d.ts +13 -0
  191. package/dist/types/components/ui/separator.d.ts +4 -0
  192. package/dist/types/components/ui/sheet.d.ts +25 -0
  193. package/dist/types/components/ui/sidebar.d.ts +69 -0
  194. package/dist/types/components/ui/skeleton.d.ts +2 -0
  195. package/dist/types/components/ui/sonner.d.ts +2 -0
  196. package/dist/types/components/ui/switch.d.ts +4 -0
  197. package/dist/types/components/ui/table.d.ts +10 -0
  198. package/dist/types/components/ui/tabs.d.ts +19 -0
  199. package/dist/types/components/ui/textarea.d.ts +5 -0
  200. package/dist/types/components/ui/toggle-group.d.ts +15 -0
  201. package/dist/types/components/ui/toggle.d.ts +12 -0
  202. package/dist/types/components/ui/tooltip.d.ts +7 -0
  203. package/dist/types/hooks/use-mobile.d.ts +13 -0
  204. package/dist/types/hooks/use-page-title.d.ts +23 -0
  205. package/dist/types/index.d.ts +2 -0
  206. package/dist/types/lib/utils.d.ts +2 -0
  207. package/dist/ui-kit.css +1 -0
  208. package/package.json +117 -0
  209. package/rules/accordion.md +60 -0
  210. package/rules/alert-dialog.md +62 -0
  211. package/rules/alert.md +61 -0
  212. package/rules/aspect-ratio.md +47 -0
  213. package/rules/avatar.md +52 -0
  214. package/rules/badge.md +55 -0
  215. package/rules/bento-menu.md +86 -0
  216. package/rules/breadcrumb.md +80 -0
  217. package/rules/button-group.md +58 -0
  218. package/rules/button.md +66 -0
  219. package/rules/calendar.md +97 -0
  220. package/rules/card.md +84 -0
  221. package/rules/carousel.md +113 -0
  222. package/rules/chart.md +125 -0
  223. package/rules/checkbox.md +49 -0
  224. package/rules/collapsible.md +57 -0
  225. package/rules/combobox.md +133 -0
  226. package/rules/command.md +73 -0
  227. package/rules/context-menu.md +65 -0
  228. package/rules/dashboard.md +368 -0
  229. package/rules/data-table.md +91 -0
  230. package/rules/date-picker.md +65 -0
  231. package/rules/dialog.md +60 -0
  232. package/rules/drawer.md +65 -0
  233. package/rules/dropdown-menu.md +72 -0
  234. package/rules/empty.md +110 -0
  235. package/rules/field.md +149 -0
  236. package/rules/form.md +60 -0
  237. package/rules/header.md +245 -0
  238. package/rules/hover-card.md +53 -0
  239. package/rules/icons.md +141 -0
  240. package/rules/input.md +66 -0
  241. package/rules/kbd.md +58 -0
  242. package/rules/label.md +30 -0
  243. package/rules/location-tree-filter.md +165 -0
  244. package/rules/logo.md +58 -0
  245. package/rules/menubar.md +75 -0
  246. package/rules/navigation-menu.md +68 -0
  247. package/rules/notifications-menu.md +137 -0
  248. package/rules/pagetitle.md +160 -0
  249. package/rules/pagination.md +71 -0
  250. package/rules/popover.md +48 -0
  251. package/rules/profile.md +125 -0
  252. package/rules/progress.md +41 -0
  253. package/rules/radio-group.md +44 -0
  254. package/rules/scroll-area.md +32 -0
  255. package/rules/scroll-text.md +40 -0
  256. package/rules/select.md +86 -0
  257. package/rules/separator.md +43 -0
  258. package/rules/sheet.md +76 -0
  259. package/rules/sidebar.md +442 -0
  260. package/rules/skeleton.md +46 -0
  261. package/rules/spinner.md +43 -0
  262. package/rules/switch.md +46 -0
  263. package/rules/table-manager.md +306 -0
  264. package/rules/table.md +177 -0
  265. package/rules/tabs.md +82 -0
  266. package/rules/text.md +3 -0
  267. package/rules/textarea.md +38 -0
  268. package/rules/toaster.md +58 -0
  269. package/rules/toggle-group.md +50 -0
  270. package/rules/toggle.md +40 -0
  271. package/rules/tokens.md +88 -0
  272. package/rules/tooltip.md +78 -0
  273. package/rules/typography.md +81 -0
  274. package/scripts/scaffold.mjs +28 -0
@@ -0,0 +1,71 @@
1
+ # AppPagination
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/pagination
4
+
5
+ ```tsx
6
+ import {
7
+ AppPagination,
8
+ AppPaginationContent,
9
+ AppPaginationItem,
10
+ AppPaginationLink,
11
+ AppPaginationPrevious,
12
+ AppPaginationNext,
13
+ AppPaginationEllipsis,
14
+ } from "@/components/primitives/AppPagination"
15
+ ```
16
+
17
+ ## AppPaginationLink
18
+
19
+ | Prop | Type | Default | Description |
20
+ | :--- | :--- | :--- | :--- |
21
+ | `isActive` | `boolean` | `false` | Whether the link represents the current page. |
22
+ | `size` | `"default" \| "sm" \| "lg" \| "icon"` | `"icon"` | The size of the link. |
23
+
24
+ ## Usage
25
+
26
+ ### Default Pagination
27
+ ```tsx
28
+ <AppPagination>
29
+ <AppPaginationContent>
30
+ <AppPaginationItem>
31
+ <AppPaginationPrevious href="#" />
32
+ </AppPaginationItem>
33
+ <AppPaginationItem>
34
+ <AppPaginationLink href="#">1</AppPaginationLink>
35
+ </AppPaginationItem>
36
+ <AppPaginationItem>
37
+ <AppPaginationLink href="#" isActive>2</AppPaginationLink>
38
+ </AppPaginationItem>
39
+ <AppPaginationItem>
40
+ <AppPaginationEllipsis />
41
+ </AppPaginationItem>
42
+ <AppPaginationItem>
43
+ <AppPaginationNext href="#" />
44
+ </AppPaginationItem>
45
+ </AppPaginationContent>
46
+ </AppPagination>
47
+ ```
48
+
49
+ ## Rules
50
+
51
+ - **Do** use `AppPagination` for navigating through paginated lists.
52
+ - **Do** mark the current page with `isActive`.
53
+ - **Don't** show too many page links; use `AppPaginationEllipsis` for collapsed ranges.
54
+ - If a prop you need is missing, stop and inform the design team.
55
+
56
+ ## Responsive
57
+
58
+ `AppPaginationLink` (page numbers) and `AppPaginationEllipsis` are hidden below `sm` (640px) via `hidden sm:inline-flex` and `hidden sm:flex` respectively. Previous and next buttons are always visible. On mobile, show a "Page X of Y" label alongside prev/next if page context is needed.
59
+
60
+ ```tsx
61
+ // Mobile-friendly pagination with page label
62
+ <div className="flex items-center gap-2">
63
+ <AppPagination>
64
+ <AppPaginationContent>
65
+ <AppPaginationItem><AppPaginationPrevious href="#" /></AppPaginationItem>
66
+ <AppPaginationItem className="sm:hidden"><span className="text-sm">Page 2 of 10</span></AppPaginationItem>
67
+ <AppPaginationItem><AppPaginationNext href="#" /></AppPaginationItem>
68
+ </AppPaginationContent>
69
+ </AppPagination>
70
+ </div>
71
+ ```
@@ -0,0 +1,48 @@
1
+ # AppPopover
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/popover
4
+
5
+ ```tsx
6
+ import { AppPopover, AppPopoverTrigger, AppPopoverContent } from "@/components/primitives/AppPopover"
7
+ ```
8
+
9
+ ## AppPopoverContent
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `side` | `"top" \| "right" \| "bottom" \| "left"` | `"bottom"` | The preferred side of the trigger to render against when open. |
14
+ | `align` | `"start" \| "center" \| "end"` | `"center"` | The preferred alignment against the trigger. |
15
+ | `sideOffset` | `number` | `4` | The distance in pixels from the trigger. |
16
+
17
+ ## Usage
18
+
19
+ ### Basic Popover
20
+ ```tsx
21
+ <AppPopover>
22
+ <AppPopoverTrigger asChild>
23
+ <AppButton variant="outline">Open Popover</AppButton>
24
+ </AppPopoverTrigger>
25
+ <AppPopoverContent className="w-80">
26
+ <div className="grid gap-4">
27
+ <div className="space-y-2">
28
+ <h4 className="font-medium leading-none">Dimensions</h4>
29
+ <p className="text-sm text-muted-foreground">Set the dimensions for the layer.</p>
30
+ </div>
31
+ </div>
32
+ </AppPopoverContent>
33
+ </AppPopover>
34
+ ```
35
+
36
+ ## Rules
37
+
38
+ - **Do** use `AppPopover` for rich content that should appear upon click.
39
+ - **Do** use `asChild` on `AppPopoverTrigger` to use an `AppButton`.
40
+ - **Do** always set width via `className` on `AppPopoverContent` (e.g. `className="w-64"`) — no default width.
41
+ - **Don't** use `AppPopover` if the content is just a simple text label; use `AppTooltip` instead.
42
+ - If a prop you need is missing, stop and inform the design team.
43
+
44
+ ## Responsive
45
+
46
+ On mobile (<768px) `AppPopover` renders as a bottom `Drawer`; `AppPopoverTrigger` becomes a `DrawerTrigger` and `AppPopoverContent` becomes `DrawerContent`. The consumer API is unchanged across all viewport sizes.
47
+
48
+ > **Implementation note:** On mobile, `AppPopoverContent` wraps `{children}` in an inner `div` inside `DrawerContent`. Consumer `className` (e.g. `p-0`) applies to that inner div, preserving `DrawerContent`'s own padding. `AppNotificationsMenu` and `AppProfile` do not use `AppPopover` on mobile — they branch directly to `AppDrawer` for a purpose-built drawer header.
@@ -0,0 +1,125 @@
1
+ # AppProfile
2
+
3
+ Avatar trigger that opens a user profile popover with name, role, and action items (Settings, Administrator, Log Out by default).
4
+
5
+ ## Exports
6
+
7
+ ```ts
8
+ import {
9
+ AppProfile,
10
+ type AppProfileUser,
11
+ type AppProfileItem,
12
+ type AppProfileProps,
13
+ } from '@skunkworksai/ui-kit'
14
+ ```
15
+
16
+ ## Props
17
+
18
+ ### `AppProfile`
19
+
20
+ | Prop | Type | Default | Description |
21
+ |------|------|---------|-------------|
22
+ | `user` | `AppProfileUser` | — | Required. User data for the header row and avatar. |
23
+ | `items` | `AppProfileItem[]` | Settings + Administrator + Log Out | Override the full menu item list. |
24
+ | `onSettings` | `() => void` | — | Called when Settings is clicked. |
25
+ | `onAdministrator` | `() => void` | — | Called when Administrator is clicked. |
26
+ | `onLogout` | `() => void` | — | Called when Log Out is clicked. |
27
+ | `open` | `boolean` | — | Controlled open state. |
28
+ | `onOpenChange` | `(open: boolean) => void` | — | Open state change handler. |
29
+ | `trigger` | `ReactNode` | avatar button | Replace the default avatar trigger. |
30
+ | `className` | `string` | — | Extra classes added to the popover content. |
31
+
32
+ ### `AppProfileUser`
33
+
34
+ | Field | Type | Required | Description |
35
+ |-------|------|----------|-------------|
36
+ | `name` | `string` | ✓ | Full display name shown in the popover header. |
37
+ | `role` | `string` | — | Subtitle shown below the name. |
38
+ | `avatarSrc` | `string` | — | Image URL for the avatar. |
39
+ | `avatarFallback` | `string` | — | Initials override. Derived from `name` when omitted. |
40
+
41
+ ### `AppProfileItem`
42
+
43
+ | Field | Type | Required | Description |
44
+ |-------|------|----------|-------------|
45
+ | `label` | `string` | ✓ | Display text. |
46
+ | `icon` | `ComponentType` | — | Lucide icon component. |
47
+ | `onClick` | `() => void` | — | Click handler. |
48
+ | `href` | `string` | — | Renders the item as an `<a>` tag. |
49
+ | `destructive` | `boolean` | — | Applies destructive color. |
50
+
51
+ ## Usage
52
+
53
+ ### Via AppDashboard (standard)
54
+
55
+ ```tsx
56
+ <AppDashboard
57
+ nav={nav}
58
+ header={{
59
+ profile: { name: "Joshua Intern", role: "Admin" },
60
+ onSettings: handleSettings,
61
+ onAdministrator: handleAdministrator,
62
+ onLogout: handleLogout,
63
+ }}
64
+ >
65
+ <PageContent />
66
+ </AppDashboard>
67
+ ```
68
+
69
+ ### Standalone
70
+
71
+ ```tsx
72
+ <AppProfile
73
+ user={{ name: "Joshua Intern", role: "Admin" }}
74
+ onSettings={handleSettings}
75
+ onAdministrator={handleAdministrator}
76
+ onLogout={handleLogout}
77
+ />
78
+ ```
79
+
80
+ ### With avatar image
81
+
82
+ ```tsx
83
+ <AppProfile
84
+ user={{ name: "Joshua Intern", role: "Admin", avatarSrc: "https://..." }}
85
+ onLogout={handleLogout}
86
+ />
87
+ ```
88
+
89
+ ### Custom items
90
+
91
+ ```tsx
92
+ import { User, HelpCircle, LogOut } from "lucide-react"
93
+
94
+ <AppProfile
95
+ user={{ name: "Joshua Intern", role: "Admin" }}
96
+ items={[
97
+ { label: "My Account", icon: User, onClick: handleAccount },
98
+ { label: "Help", icon: HelpCircle, href: "/help" },
99
+ { label: "Log Out", icon: LogOut, onClick: handleLogout, destructive: true },
100
+ ]}
101
+ />
102
+ ```
103
+
104
+ ### Controlled open state
105
+
106
+ ```tsx
107
+ const [open, setOpen] = React.useState(false)
108
+
109
+ <AppProfile
110
+ user={{ name: "Joshua Intern", role: "Admin" }}
111
+ open={open}
112
+ onOpenChange={setOpen}
113
+ onLogout={() => setOpen(false)}
114
+ />
115
+ ```
116
+
117
+ ## Rules
118
+
119
+ - Use `profile` + handler props on `AppDashboard`/`AppHeader` rather than dropping `AppProfile` directly into slots.
120
+ - The `avatar` prop on `AppHeader` takes precedence over `profile` — do not set both.
121
+ - The `actions` prop on `AppHeader` overrides everything; profile props are ignored when `actions` is set.
122
+ - Default initials are derived from `name` (first letter of each word, max 2). Supply `avatarFallback` to override.
123
+ - Each item closes the popover on click; `href` items also close on click.
124
+ - Mobile: `AppProfile` renders as a side `AppDrawer` on viewports below 768px, with user avatar, name, role, and a close button in the drawer header. Desktop uses `AppPopover`. The public API is unchanged across viewport sizes.
125
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,41 @@
1
+ # AppProgress
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/progress
4
+
5
+ ```tsx
6
+ import { AppProgress } from "@/components/primitives/AppProgress"
7
+ ```
8
+
9
+ ## AppProgress
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `value` | `number \| null` | - | The progress value. |
14
+ | `max` | `number` | `100` | The maximum progress value. |
15
+
16
+ ## Usage
17
+
18
+ > `AppProgress` has no default width. Set width on a parent wrapper or via `className` (e.g. `className="w-full"` or `className="w-64"`).
19
+
20
+ ### Simple Progress Bar
21
+ ```tsx
22
+ <AppProgress value={33} className="w-full" />
23
+ ```
24
+
25
+ ### Progress with Label
26
+ ```tsx
27
+ <div className="w-full space-y-1.5">
28
+ <div className="flex justify-between text-sm">
29
+ <span>Uploading…</span>
30
+ <span>66%</span>
31
+ </div>
32
+ <AppProgress value={66} />
33
+ </div>
34
+ ```
35
+
36
+ ## Rules
37
+
38
+ - **Do** use `AppProgress` to show completion status of a task.
39
+ - **Do** provide additional context (like percentages) for better clarity when needed.
40
+ - **Don't** use `AppProgress` for indeterminate loading states where time is unknown; use `AppSpinner` or a skeleton instead if appropriate.
41
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,44 @@
1
+ # AppRadioGroup
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/radio-group
4
+
5
+ ```tsx
6
+ import { AppRadioGroup, AppRadioGroupItem } from "@/components/primitives/AppRadioGroup"
7
+ ```
8
+
9
+ ## AppRadioGroup
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `defaultValue` | `string` | - | The value of the radio item that should be checked by default. |
14
+ | `onValueChange` | `(value: string) => void` | - | Event handler called when the value changes. |
15
+
16
+ ## AppRadioGroupItem
17
+
18
+ | Prop | Type | Default | Description |
19
+ | :--- | :--- | :--- | :--- |
20
+ | `value` | `string` | - | The value given as data to the radio item when submitted in a form. |
21
+ | `id` | `string` | - | A unique ID for the radio item, used to link with a label. |
22
+
23
+ ## Usage
24
+
25
+ ### Default Radio Group
26
+ ```tsx
27
+ <AppRadioGroup defaultValue="option-one">
28
+ <div className="flex items-center gap-2">
29
+ <AppRadioGroupItem value="option-one" id="option-one" />
30
+ <AppLabel htmlFor="option-one">Option One</AppLabel>
31
+ </div>
32
+ <div className="flex items-center gap-2">
33
+ <AppRadioGroupItem value="option-two" id="option-two" />
34
+ <AppLabel htmlFor="option-two">Option Two</AppLabel>
35
+ </div>
36
+ </AppRadioGroup>
37
+ ```
38
+
39
+ ## Rules
40
+
41
+ - **Do** use `AppRadioGroup` when only one option can be selected from a set.
42
+ - **Do** always provide a label for each `AppRadioGroupItem`.
43
+ - **Don't** use `AppRadioGroup` for multi-select; use `AppCheckbox` instead.
44
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,32 @@
1
+ # AppScrollArea
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/scroll-area
4
+
5
+ ```tsx
6
+ import { AppScrollArea, AppScrollBar } from "@/components/primitives/AppScrollArea"
7
+ ```
8
+
9
+ ## AppScrollArea
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `type` | `"auto" \| "always" \| "scroll" \| "hover"` | `"hover"` | Describes the nature of scrollbar visibility. |
14
+
15
+ ## Usage
16
+
17
+ ### Simple Scroll Area
18
+ ```tsx
19
+ <AppScrollArea className="h-[200px] w-[350px] rounded-md border p-4">
20
+ Jokester began sneaking into the castle in the middle of the night and leaving
21
+ jokes all over the place: under the king's pillow, in his soup, even in the
22
+ royal toilet. The king was furious, but he couldn't help but laugh at the
23
+ jokes.
24
+ </AppScrollArea>
25
+ ```
26
+
27
+ ## Rules
28
+
29
+ - **Do** use `AppScrollArea` for custom-styled scrollbars that work across browsers.
30
+ - **Do** specify a height for the `AppScrollArea` container.
31
+ - **Don't** use `AppScrollArea` for the entire page; use native browser scrolling for better performance.
32
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,40 @@
1
+ # AppScrollText
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/scroll-text
4
+
5
+ ```tsx
6
+ import { AppScrollText } from "@/components/primitives/AppScrollText"
7
+ ```
8
+
9
+ ## AppScrollText
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `direction` | `"left" \| "right"` | `"left"` | The direction of the scrolling text. |
14
+ | `speed` | `number` | `50` | The speed of the scrolling animation. |
15
+ | `pauseOnHover` | `boolean` | `false` | Whether to pause the animation when hovered. |
16
+
17
+ ## Usage
18
+
19
+ ### Left Scrolling Text
20
+ ```tsx
21
+ <AppScrollText direction="left" className="text-2xl font-bold">
22
+ <span>Special Offer!</span>
23
+ <span>50% Off all items</span>
24
+ <span>Ends tonight!</span>
25
+ </AppScrollText>
26
+ ```
27
+
28
+ ### Fast Right Scrolling Text
29
+ ```tsx
30
+ <AppScrollText direction="right" speed={100} className="text-lg">
31
+ <span>Breaking News: New components released!</span>
32
+ </AppScrollText>
33
+ ```
34
+
35
+ ## Rules
36
+
37
+ - **Do** use `AppScrollText` for marquee-like announcements.
38
+ - **Do** ensure the text remains readable at the chosen `speed`.
39
+ - **Don't** use `AppScrollText` for critical information that the user might miss.
40
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,86 @@
1
+ # AppSelect
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/select
4
+
5
+ ```tsx
6
+ import {
7
+ AppSelect,
8
+ AppSelectTrigger,
9
+ AppSelectValue,
10
+ AppSelectContent,
11
+ AppSelectGroup,
12
+ AppSelectItem,
13
+ AppSelectLabel,
14
+ } from "@/components/primitives/AppSelect"
15
+ ```
16
+
17
+ ## AppSelect
18
+
19
+ | Prop | Type | Default | Description |
20
+ | :--- | :--- | :--- | :--- |
21
+ | `defaultValue` | `string` | - | The value of the select that should be open by default. |
22
+ | `onValueChange` | `(value: string) => void` | - | Event handler called when the value changes. |
23
+
24
+ ## AppSelectTrigger
25
+
26
+ | Prop | Type | Default | Description |
27
+ | :--- | :--- | :--- | :--- |
28
+ | `loading` | `boolean` | `false` | If true, shows a spinner and disables the trigger. |
29
+
30
+ ## Usage
31
+
32
+ ### Basic Select
33
+ ```tsx
34
+ <AppSelect>
35
+ <AppSelectTrigger className="w-48">
36
+ <AppSelectValue placeholder="Select a fruit" />
37
+ </AppSelectTrigger>
38
+ <AppSelectContent>
39
+ <AppSelectItem value="apple">Apple</AppSelectItem>
40
+ <AppSelectItem value="banana">Banana</AppSelectItem>
41
+ <AppSelectItem value="blueberry">Blueberry</AppSelectItem>
42
+ </AppSelectContent>
43
+ </AppSelect>
44
+ ```
45
+
46
+ ### Grouped options
47
+ ```tsx
48
+ <AppSelect>
49
+ <AppSelectTrigger className="w-48">
50
+ <AppSelectValue placeholder="Select a fruit" />
51
+ </AppSelectTrigger>
52
+ <AppSelectContent>
53
+ <AppSelectGroup>
54
+ <AppSelectLabel>Fruits</AppSelectLabel>
55
+ <AppSelectItem value="apple">Apple</AppSelectItem>
56
+ <AppSelectItem value="banana">Banana</AppSelectItem>
57
+ </AppSelectGroup>
58
+ <AppSelectGroup>
59
+ <AppSelectLabel>Vegetables</AppSelectLabel>
60
+ <AppSelectItem value="carrot">Carrot</AppSelectItem>
61
+ <AppSelectItem value="broccoli">Broccoli</AppSelectItem>
62
+ </AppSelectGroup>
63
+ </AppSelectContent>
64
+ </AppSelect>
65
+ ```
66
+
67
+ ### Loading State
68
+ ```tsx
69
+ <AppSelect>
70
+ <AppSelectTrigger loading className="w-48">
71
+ <AppSelectValue placeholder="Loading options..." />
72
+ </AppSelectTrigger>
73
+ <AppSelectContent>
74
+ {/* Items would be here after loading */}
75
+ </AppSelectContent>
76
+ </AppSelect>
77
+ ```
78
+
79
+ ## Rules
80
+
81
+ - **Do** use `AppSelect` for picking a single value from a list of options.
82
+ - **Do** use the `loading` prop on `AppSelectTrigger` when fetching data.
83
+ - **Do** use `AppSelectGroup` + `AppSelectLabel` to group related options.
84
+ - **Do** set trigger width explicitly via `className` (e.g. `className="w-48"`) — no default width.
85
+ - **Don't** use raw `<select>` elements.
86
+ - If a prop you need is missing, stop and inform the design team.
@@ -0,0 +1,43 @@
1
+ # AppSeparator
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/separator
4
+
5
+ ```tsx
6
+ import { AppSeparator } from "@/components/primitives/AppSeparator"
7
+ ```
8
+
9
+ ## AppSeparator
10
+
11
+ | Prop | Type | Default | Description |
12
+ | :--- | :--- | :--- | :--- |
13
+ | `orientation` | `"horizontal" \| "vertical"` | `"horizontal"` | The orientation of the separator. |
14
+ | `decorative` | `boolean` | `true` | Whether the separator is purely decorative. If `false`, it's accessible to screen readers as a separator. |
15
+
16
+ ## Usage
17
+
18
+ ### Horizontal Separator
19
+ ```tsx
20
+ <div className="space-y-4">
21
+ <p>Top section</p>
22
+ <AppSeparator />
23
+ <p>Bottom section</p>
24
+ </div>
25
+ ```
26
+
27
+ ### Vertical Separator
28
+ ```tsx
29
+ <div className="flex h-5 items-center space-x-4">
30
+ <div>Item 1</div>
31
+ <AppSeparator orientation="vertical" />
32
+ <div>Item 2</div>
33
+ </div>
34
+ ```
35
+
36
+ ## Rules
37
+
38
+ - **Do** use `AppSeparator` to visually divide content.
39
+ - **Do** set `orientation="vertical"` when used within flex containers for side-by-side items.
40
+ - **Don't** use raw `<hr />` tags for separation.
41
+ - **Don't** use `AppSeparator` for purely layout purposes if a border on a container is more appropriate.
42
+
43
+ If a prop you need is missing, stop and inform the design team.
package/rules/sheet.md ADDED
@@ -0,0 +1,76 @@
1
+ # AppSheet
2
+
3
+ > Docs: https://ui-kit.vercel.app/docs/components/sheet
4
+
5
+ ```tsx
6
+ import {
7
+ AppSheet,
8
+ AppSheetTrigger,
9
+ AppSheetContent,
10
+ AppSheetHeader,
11
+ AppSheetTitle,
12
+ AppSheetDescription
13
+ } from "@/components/primitives/AppSheet"
14
+ ```
15
+
16
+ ## AppSheet
17
+
18
+ | Prop | Type | Default | Description |
19
+ | :--- | :--- | :--- | :--- |
20
+ | `open` | `boolean` | - | Controlled open state. |
21
+ | `onOpenChange` | `(open: boolean) => void` | - | Callback for open state changes. |
22
+ | `defaultOpen` | `boolean` | - | Initial open state. |
23
+
24
+ ## AppSheetTrigger
25
+
26
+ | Prop | Type | Default | Description |
27
+ | :--- | :--- | :--- | :--- |
28
+ | `asChild` | `boolean` | `false` | Change the rendered element to the child. |
29
+
30
+ ## AppSheetContent
31
+
32
+ | Prop | Type | Default | Description |
33
+ | :--- | :--- | :--- | :--- |
34
+ | `side` | `"top" \| "bottom" \| "left" \| "right"` | `"right"` | The side the sheet slides from. |
35
+
36
+ ## Usage
37
+
38
+ ### Default Sheet
39
+ ```tsx
40
+ <AppSheet>
41
+ <AppSheetTrigger asChild>
42
+ <AppButton variant="outline">Open Sheet</AppButton>
43
+ </AppSheetTrigger>
44
+ <AppSheetContent>
45
+ <AppSheetHeader>
46
+ <AppSheetTitle>Edit Profile</AppSheetTitle>
47
+ <AppSheetDescription>Make changes to your profile here.</AppSheetDescription>
48
+ </AppSheetHeader>
49
+ <div className="py-4">Profile edit form...</div>
50
+ </AppSheetContent>
51
+ </AppSheet>
52
+ ```
53
+
54
+ ### Left Side Sheet
55
+ ```tsx
56
+ <AppSheet>
57
+ <AppSheetTrigger asChild>
58
+ <AppButton variant="ghost">Menu</AppButton>
59
+ </AppSheetTrigger>
60
+ <AppSheetContent side="left">
61
+ <AppSheetHeader>
62
+ <AppSheetTitle>Navigation</AppSheetTitle>
63
+ </AppSheetHeader>
64
+ <nav>Links...</nav>
65
+ </AppSheetContent>
66
+ </AppSheet>
67
+ ```
68
+
69
+ ## Rules
70
+
71
+ - **Do** use `AppSheet` for secondary information or forms that don't fit in a standard dialog.
72
+ - **Do** provide a clear `AppSheetTitle` and `AppSheetDescription` for accessibility.
73
+ - **Don't** overfill the sheet with complex multi-step workflows.
74
+ - **Don't** use `AppSheet` for small confirmation tasks; use `AppAlertDialog` instead.
75
+
76
+ If a prop you need is missing, stop and inform the design team.