@birdycom/omniaui-vue 0.0.0-stage → 0.11.0

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 (364) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -2
  3. package/dist/blocks/OcBlockAboutTimeline.vue.d.ts +29 -0
  4. package/dist/blocks/OcBlockAppHeader.vue.d.ts +33 -0
  5. package/dist/blocks/OcBlockAppShell.vue.d.ts +33 -0
  6. package/dist/blocks/OcBlockAuth.vue.d.ts +28 -0
  7. package/dist/blocks/OcBlockAuthSplit.vue.d.ts +45 -0
  8. package/dist/blocks/OcBlockContactGrid.vue.d.ts +32 -0
  9. package/dist/blocks/OcBlockCta.vue.d.ts +17 -0
  10. package/dist/blocks/OcBlockDataTable.vue.d.ts +33 -0
  11. package/dist/blocks/OcBlockFaq.vue.d.ts +32 -0
  12. package/dist/blocks/OcBlockFeatures.vue.d.ts +25 -0
  13. package/dist/blocks/OcBlockFooter.vue.d.ts +27 -0
  14. package/dist/blocks/OcBlockFormPage.vue.d.ts +36 -0
  15. package/dist/blocks/OcBlockHero.vue.d.ts +18 -0
  16. package/dist/blocks/OcBlockHeroCode.vue.d.ts +32 -0
  17. package/dist/blocks/OcBlockHeroOrbit.vue.d.ts +36 -0
  18. package/dist/blocks/OcBlockHeroSplit.vue.d.ts +19 -0
  19. package/dist/blocks/OcBlockModuleHeader.vue.d.ts +24 -0
  20. package/dist/blocks/OcBlockPageHero.vue.d.ts +18 -0
  21. package/dist/blocks/OcBlockPortfolioGrid.vue.d.ts +34 -0
  22. package/dist/blocks/OcBlockPricing.vue.d.ts +38 -0
  23. package/dist/blocks/OcBlockProcess.vue.d.ts +18 -0
  24. package/dist/blocks/OcBlockProductGrid.vue.d.ts +25 -0
  25. package/dist/blocks/OcBlockProfileHeader.vue.d.ts +36 -0
  26. package/dist/blocks/OcBlockShowcase.vue.d.ts +23 -0
  27. package/dist/blocks/OcBlockSiteFooter.vue.d.ts +42 -0
  28. package/dist/blocks/OcBlockSiteHeader.vue.d.ts +32 -0
  29. package/dist/blocks/OcBlockSpotlight.vue.d.ts +32 -0
  30. package/dist/blocks/OcBlockStats.vue.d.ts +10 -0
  31. package/dist/blocks/OcBlockStatsCounter.vue.d.ts +10 -0
  32. package/dist/blocks/OcBlockTeamList.vue.d.ts +42 -0
  33. package/dist/blocks/OcBlockTwoFactor.vue.d.ts +38 -0
  34. package/dist/blocks/OcBlockWizardDialog.vue.d.ts +52 -0
  35. package/dist/components/OcAccordion.vue.d.ts +15 -0
  36. package/dist/components/OcAccordionAccent.vue.d.ts +20 -0
  37. package/dist/components/OcAccordionItem.vue.d.ts +24 -0
  38. package/dist/components/OcAffixInput.vue.d.ts +31 -0
  39. package/dist/components/OcAlert.vue.d.ts +21 -0
  40. package/dist/components/OcAlertDialog.vue.d.ts +48 -0
  41. package/dist/components/OcAlphaTabs.vue.d.ts +23 -0
  42. package/dist/components/OcAspectRatio.vue.d.ts +16 -0
  43. package/dist/components/OcAttachment.vue.d.ts +26 -0
  44. package/dist/components/OcAttachmentImage.vue.d.ts +10 -0
  45. package/dist/components/OcAttachmentList.vue.d.ts +31 -0
  46. package/dist/components/OcAttachmentThumb.vue.d.ts +16 -0
  47. package/dist/components/OcAvatar.vue.d.ts +21 -0
  48. package/dist/components/OcAvatarGroup.vue.d.ts +12 -0
  49. package/dist/components/OcBackLink.vue.d.ts +18 -0
  50. package/dist/components/OcBadge.vue.d.ts +18 -0
  51. package/dist/components/OcBarcodeInput.vue.d.ts +27 -0
  52. package/dist/components/OcBreadcrumb.vue.d.ts +24 -0
  53. package/dist/components/OcBrowserFrame.vue.d.ts +35 -0
  54. package/dist/components/OcBusyOverlay.vue.d.ts +30 -0
  55. package/dist/components/OcButton.vue.d.ts +31 -0
  56. package/dist/components/OcButtonGroup.vue.d.ts +17 -0
  57. package/dist/components/OcButtonGroupText.vue.d.ts +12 -0
  58. package/dist/components/OcCard.vue.d.ts +27 -0
  59. package/dist/components/OcChartLine.vue.d.ts +28 -0
  60. package/dist/components/OcChatComposer.vue.d.ts +33 -0
  61. package/dist/components/OcCheckbox.vue.d.ts +26 -0
  62. package/dist/components/OcChecklist.vue.d.ts +32 -0
  63. package/dist/components/OcChipFilter.vue.d.ts +24 -0
  64. package/dist/components/OcCollapsible.vue.d.ts +28 -0
  65. package/dist/components/OcColorField.vue.d.ts +17 -0
  66. package/dist/components/OcColorSelect.vue.d.ts +24 -0
  67. package/dist/components/OcColumnMenu.vue.d.ts +31 -0
  68. package/dist/components/OcCommand.vue.d.ts +28 -0
  69. package/dist/components/OcConfirmDialog.vue.d.ts +44 -0
  70. package/dist/components/OcCookieConsent.vue.d.ts +52 -0
  71. package/dist/components/OcCopyField.vue.d.ts +14 -0
  72. package/dist/components/OcCounter.vue.d.ts +9 -0
  73. package/dist/components/OcDataTable.vue.d.ts +37 -0
  74. package/dist/components/OcDecimalInput.vue.d.ts +19 -0
  75. package/dist/components/OcDefinitionList.vue.d.ts +34 -0
  76. package/dist/components/OcDocViewer.vue.d.ts +24 -0
  77. package/dist/components/OcDropdown.vue.d.ts +19 -0
  78. package/dist/components/OcDropdownItem.vue.d.ts +18 -0
  79. package/dist/components/OcDropdownLabel.vue.d.ts +12 -0
  80. package/dist/components/OcDropdownSeparator.vue.d.ts +2 -0
  81. package/dist/components/OcDropzone.vue.d.ts +29 -0
  82. package/dist/components/OcEmojiPicker.vue.d.ts +32 -0
  83. package/dist/components/OcEmptyState.vue.d.ts +24 -0
  84. package/dist/components/OcEntityCard.vue.d.ts +37 -0
  85. package/dist/components/OcFactList.vue.d.ts +29 -0
  86. package/dist/components/OcFilterCounts.vue.d.ts +25 -0
  87. package/dist/components/OcFlipCard.vue.d.ts +31 -0
  88. package/dist/components/OcFormField.vue.d.ts +26 -0
  89. package/dist/components/OcGreeting.vue.d.ts +26 -0
  90. package/dist/components/OcHeading.vue.d.ts +24 -0
  91. package/dist/components/OcHoverCard.vue.d.ts +22 -0
  92. package/dist/components/OcImageZoom.vue.d.ts +28 -0
  93. package/dist/components/OcInput.vue.d.ts +13 -0
  94. package/dist/components/OcInputGroup.vue.d.ts +21 -0
  95. package/dist/components/OcItem.vue.d.ts +39 -0
  96. package/dist/components/OcItemGroup.vue.d.ts +12 -0
  97. package/dist/components/OcItemSeparator.vue.d.ts +2 -0
  98. package/dist/components/OcKbd.vue.d.ts +12 -0
  99. package/dist/components/OcKbdGroup.vue.d.ts +17 -0
  100. package/dist/components/OcLabel.vue.d.ts +19 -0
  101. package/dist/components/OcLanguageSelect.vue.d.ts +32 -0
  102. package/dist/components/OcLauncherCard.vue.d.ts +26 -0
  103. package/dist/components/OcLightbox.vue.d.ts +45 -0
  104. package/dist/components/OcLinkArrow.vue.d.ts +23 -0
  105. package/dist/components/OcListToolbar.vue.d.ts +44 -0
  106. package/dist/components/OcMarquee.vue.d.ts +16 -0
  107. package/dist/components/OcMediaCard.vue.d.ts +24 -0
  108. package/dist/components/OcMediaRow.vue.d.ts +21 -0
  109. package/dist/components/OcMediaThumb.vue.d.ts +32 -0
  110. package/dist/components/OcMessage.vue.d.ts +63 -0
  111. package/dist/components/OcMessageList.vue.d.ts +35 -0
  112. package/dist/components/OcMessageThread.vue.d.ts +80 -0
  113. package/dist/components/OcModal.vue.d.ts +36 -0
  114. package/dist/components/OcNavmenu.vue.d.ts +24 -0
  115. package/dist/components/OcNavmenuList.vue.d.ts +29 -0
  116. package/dist/components/OcNextTeaser.vue.d.ts +29 -0
  117. package/dist/components/OcNumberInput.vue.d.ts +25 -0
  118. package/dist/components/OcOtpInput.vue.d.ts +19 -0
  119. package/dist/components/OcPageHeader.vue.d.ts +36 -0
  120. package/dist/components/OcPagination.vue.d.ts +20 -0
  121. package/dist/components/OcPasswordInput.vue.d.ts +18 -0
  122. package/dist/components/OcPasswordRequirements.vue.d.ts +19 -0
  123. package/dist/components/OcPhoneInput.vue.d.ts +25 -0
  124. package/dist/components/OcPopover.vue.d.ts +24 -0
  125. package/dist/components/OcPriceCard.vue.d.ts +41 -0
  126. package/dist/components/OcProductMark.vue.d.ts +25 -0
  127. package/dist/components/OcProgress.vue.d.ts +11 -0
  128. package/dist/components/OcProjectCard.vue.d.ts +35 -0
  129. package/dist/components/OcProse.vue.d.ts +25 -0
  130. package/dist/components/OcRadio.vue.d.ts +27 -0
  131. package/dist/components/OcRadioGroup.vue.d.ts +32 -0
  132. package/dist/components/OcRecoveryCodes.vue.d.ts +36 -0
  133. package/dist/components/OcScrollArea.vue.d.ts +18 -0
  134. package/dist/components/OcSegmented.vue.d.ts +21 -0
  135. package/dist/components/OcSelect.vue.d.ts +28 -0
  136. package/dist/components/OcSeparator.vue.d.ts +21 -0
  137. package/dist/components/OcSeverityCard.vue.d.ts +36 -0
  138. package/dist/components/OcSheet.vue.d.ts +37 -0
  139. package/dist/components/OcSidebar.vue.d.ts +28 -0
  140. package/dist/components/OcSidebarCollapsible.vue.d.ts +27 -0
  141. package/dist/components/OcSidebarGroup.vue.d.ts +16 -0
  142. package/dist/components/OcSidebarMenu.vue.d.ts +12 -0
  143. package/dist/components/OcSidebarMenuButton.vue.d.ts +21 -0
  144. package/dist/components/OcSidebarSeparator.vue.d.ts +2 -0
  145. package/dist/components/OcSkeleton.vue.d.ts +8 -0
  146. package/dist/components/OcSlider.vue.d.ts +18 -0
  147. package/dist/components/OcSortableRow.vue.d.ts +32 -0
  148. package/dist/components/OcSpinner.vue.d.ts +8 -0
  149. package/dist/components/OcStackCard.vue.d.ts +22 -0
  150. package/dist/components/OcStackList.vue.d.ts +28 -0
  151. package/dist/components/OcStatCard.vue.d.ts +25 -0
  152. package/dist/components/OcStepper.vue.d.ts +24 -0
  153. package/dist/components/OcSwitch.vue.d.ts +9 -0
  154. package/dist/components/OcTable.vue.d.ts +61 -0
  155. package/dist/components/OcTableActions.vue.d.ts +18 -0
  156. package/dist/components/OcTableCompact.vue.d.ts +37 -0
  157. package/dist/components/OcTabs.vue.d.ts +28 -0
  158. package/dist/components/OcTagInput.vue.d.ts +18 -0
  159. package/dist/components/OcTerminalLog.vue.d.ts +20 -0
  160. package/dist/components/OcTextarea.vue.d.ts +13 -0
  161. package/dist/components/OcThemeSwitch.vue.d.ts +20 -0
  162. package/dist/components/OcTimeInput.vue.d.ts +14 -0
  163. package/dist/components/OcTimeline.vue.d.ts +33 -0
  164. package/dist/components/OcToast.vue.d.ts +31 -0
  165. package/dist/components/OcToastContainer.vue.d.ts +8 -0
  166. package/dist/components/OcToggle.vue.d.ts +29 -0
  167. package/dist/components/OcToggleField.vue.d.ts +27 -0
  168. package/dist/components/OcToggleGroup.vue.d.ts +27 -0
  169. package/dist/components/OcTooltip.vue.d.ts +16 -0
  170. package/dist/components/OcTopProgress.vue.d.ts +18 -0
  171. package/dist/components/OcTree.vue.d.ts +40 -0
  172. package/dist/components/OcUpgradeBanner.vue.d.ts +41 -0
  173. package/dist/components/OcUser.vue.d.ts +20 -0
  174. package/dist/components/OcVersionBanner.vue.d.ts +32 -0
  175. package/dist/composables/chartLine.d.ts +6 -0
  176. package/dist/composables/keys.d.ts +19 -0
  177. package/dist/composables/useAttrsSplit.d.ts +14 -0
  178. package/dist/composables/useDialog.d.ts +9 -0
  179. package/dist/composables/useToast.d.ts +34 -0
  180. package/dist/composables/useUid.d.ts +5 -0
  181. package/dist/index.d.ts +233 -0
  182. package/dist/omniaui-vue.js +8811 -0
  183. package/dist/omniaui-vue.js.map +1 -0
  184. package/manifest.json +1036 -0
  185. package/package.json +67 -4
  186. package/src/blocks/OcBlockAboutTimeline.vue +44 -0
  187. package/src/blocks/OcBlockAppHeader.vue +36 -0
  188. package/src/blocks/OcBlockAppShell.vue +29 -0
  189. package/src/blocks/OcBlockAuth.vue +24 -0
  190. package/src/blocks/OcBlockAuthSplit.vue +47 -0
  191. package/src/blocks/OcBlockContactGrid.vue +53 -0
  192. package/src/blocks/OcBlockCta.vue +12 -0
  193. package/src/blocks/OcBlockDataTable.vue +27 -0
  194. package/src/blocks/OcBlockFaq.vue +49 -0
  195. package/src/blocks/OcBlockFeatures.vue +23 -0
  196. package/src/blocks/OcBlockFooter.vue +25 -0
  197. package/src/blocks/OcBlockFormPage.vue +24 -0
  198. package/src/blocks/OcBlockHero.vue +13 -0
  199. package/src/blocks/OcBlockHeroCode.vue +42 -0
  200. package/src/blocks/OcBlockHeroOrbit.vue +69 -0
  201. package/src/blocks/OcBlockHeroSplit.vue +15 -0
  202. package/src/blocks/OcBlockModuleHeader.vue +21 -0
  203. package/src/blocks/OcBlockPageHero.vue +13 -0
  204. package/src/blocks/OcBlockPortfolioGrid.vue +63 -0
  205. package/src/blocks/OcBlockPricing.vue +39 -0
  206. package/src/blocks/OcBlockProcess.vue +39 -0
  207. package/src/blocks/OcBlockProductGrid.vue +41 -0
  208. package/src/blocks/OcBlockProfileHeader.vue +50 -0
  209. package/src/blocks/OcBlockShowcase.vue +43 -0
  210. package/src/blocks/OcBlockSiteFooter.vue +54 -0
  211. package/src/blocks/OcBlockSiteHeader.vue +34 -0
  212. package/src/blocks/OcBlockSpotlight.vue +47 -0
  213. package/src/blocks/OcBlockStats.vue +17 -0
  214. package/src/blocks/OcBlockStatsCounter.vue +20 -0
  215. package/src/blocks/OcBlockTeamList.vue +53 -0
  216. package/src/blocks/OcBlockTwoFactor.vue +61 -0
  217. package/src/blocks/OcBlockWizardDialog.vue +67 -0
  218. package/src/components/OcAccordion.vue +12 -0
  219. package/src/components/OcAccordionAccent.vue +27 -0
  220. package/src/components/OcAccordionItem.vue +19 -0
  221. package/src/components/OcAffixInput.vue +40 -0
  222. package/src/components/OcAlert.vue +17 -0
  223. package/src/components/OcAlertDialog.vue +66 -0
  224. package/src/components/OcAlphaTabs.vue +54 -0
  225. package/src/components/OcAspectRatio.vue +21 -0
  226. package/src/components/OcAttachment.vue +59 -0
  227. package/src/components/OcAttachmentImage.vue +13 -0
  228. package/src/components/OcAttachmentList.vue +31 -0
  229. package/src/components/OcAttachmentThumb.vue +14 -0
  230. package/src/components/OcAvatar.vue +18 -0
  231. package/src/components/OcAvatarGroup.vue +7 -0
  232. package/src/components/OcBackLink.vue +8 -0
  233. package/src/components/OcBadge.vue +13 -0
  234. package/src/components/OcBarcodeInput.vue +51 -0
  235. package/src/components/OcBreadcrumb.vue +22 -0
  236. package/src/components/OcBrowserFrame.vue +33 -0
  237. package/src/components/OcBusyOverlay.vue +32 -0
  238. package/src/components/OcButton.vue +47 -0
  239. package/src/components/OcButtonGroup.vue +10 -0
  240. package/src/components/OcButtonGroupText.vue +7 -0
  241. package/src/components/OcCard.vue +20 -0
  242. package/src/components/OcChartLine.vue +80 -0
  243. package/src/components/OcChatComposer.vue +42 -0
  244. package/src/components/OcCheckbox.vue +26 -0
  245. package/src/components/OcChecklist.vue +29 -0
  246. package/src/components/OcChipFilter.vue +48 -0
  247. package/src/components/OcCollapsible.vue +19 -0
  248. package/src/components/OcColorField.vue +15 -0
  249. package/src/components/OcColorSelect.vue +33 -0
  250. package/src/components/OcColumnMenu.vue +50 -0
  251. package/src/components/OcCommand.vue +119 -0
  252. package/src/components/OcConfirmDialog.vue +65 -0
  253. package/src/components/OcCookieConsent.vue +119 -0
  254. package/src/components/OcCopyField.vue +37 -0
  255. package/src/components/OcCounter.vue +15 -0
  256. package/src/components/OcDataTable.vue +144 -0
  257. package/src/components/OcDecimalInput.vue +53 -0
  258. package/src/components/OcDefinitionList.vue +35 -0
  259. package/src/components/OcDocViewer.vue +79 -0
  260. package/src/components/OcDropdown.vue +23 -0
  261. package/src/components/OcDropdownItem.vue +9 -0
  262. package/src/components/OcDropdownLabel.vue +7 -0
  263. package/src/components/OcDropdownSeparator.vue +7 -0
  264. package/src/components/OcDropzone.vue +36 -0
  265. package/src/components/OcEmojiPicker.vue +45 -0
  266. package/src/components/OcEmptyState.vue +13 -0
  267. package/src/components/OcEntityCard.vue +47 -0
  268. package/src/components/OcFactList.vue +37 -0
  269. package/src/components/OcFilterCounts.vue +38 -0
  270. package/src/components/OcFlipCard.vue +36 -0
  271. package/src/components/OcFormField.vue +36 -0
  272. package/src/components/OcGreeting.vue +52 -0
  273. package/src/components/OcHeading.vue +19 -0
  274. package/src/components/OcHoverCard.vue +25 -0
  275. package/src/components/OcImageZoom.vue +39 -0
  276. package/src/components/OcInput.vue +9 -0
  277. package/src/components/OcInputGroup.vue +12 -0
  278. package/src/components/OcItem.vue +40 -0
  279. package/src/components/OcItemGroup.vue +7 -0
  280. package/src/components/OcItemSeparator.vue +7 -0
  281. package/src/components/OcKbd.vue +7 -0
  282. package/src/components/OcKbdGroup.vue +15 -0
  283. package/src/components/OcLabel.vue +10 -0
  284. package/src/components/OcLanguageSelect.vue +40 -0
  285. package/src/components/OcLauncherCard.vue +34 -0
  286. package/src/components/OcLightbox.vue +63 -0
  287. package/src/components/OcLinkArrow.vue +25 -0
  288. package/src/components/OcListToolbar.vue +44 -0
  289. package/src/components/OcMarquee.vue +36 -0
  290. package/src/components/OcMediaCard.vue +28 -0
  291. package/src/components/OcMediaRow.vue +28 -0
  292. package/src/components/OcMediaThumb.vue +38 -0
  293. package/src/components/OcMessage.vue +91 -0
  294. package/src/components/OcMessageList.vue +43 -0
  295. package/src/components/OcMessageThread.vue +155 -0
  296. package/src/components/OcModal.vue +42 -0
  297. package/src/components/OcNavmenu.vue +18 -0
  298. package/src/components/OcNavmenuList.vue +38 -0
  299. package/src/components/OcNextTeaser.vue +25 -0
  300. package/src/components/OcNumberInput.vue +47 -0
  301. package/src/components/OcOtpInput.vue +34 -0
  302. package/src/components/OcPageHeader.vue +34 -0
  303. package/src/components/OcPagination.vue +33 -0
  304. package/src/components/OcPasswordInput.vue +27 -0
  305. package/src/components/OcPasswordRequirements.vue +28 -0
  306. package/src/components/OcPhoneInput.vue +72 -0
  307. package/src/components/OcPopover.vue +25 -0
  308. package/src/components/OcPriceCard.vue +69 -0
  309. package/src/components/OcProductMark.vue +31 -0
  310. package/src/components/OcProgress.vue +21 -0
  311. package/src/components/OcProjectCard.vue +36 -0
  312. package/src/components/OcProse.vue +57 -0
  313. package/src/components/OcRadio.vue +40 -0
  314. package/src/components/OcRadioGroup.vue +32 -0
  315. package/src/components/OcRecoveryCodes.vue +55 -0
  316. package/src/components/OcScrollArea.vue +15 -0
  317. package/src/components/OcSegmented.vue +28 -0
  318. package/src/components/OcSelect.vue +21 -0
  319. package/src/components/OcSeparator.vue +18 -0
  320. package/src/components/OcSeverityCard.vue +46 -0
  321. package/src/components/OcSheet.vue +49 -0
  322. package/src/components/OcSidebar.vue +16 -0
  323. package/src/components/OcSidebarCollapsible.vue +19 -0
  324. package/src/components/OcSidebarGroup.vue +11 -0
  325. package/src/components/OcSidebarMenu.vue +7 -0
  326. package/src/components/OcSidebarMenuButton.vue +31 -0
  327. package/src/components/OcSidebarSeparator.vue +7 -0
  328. package/src/components/OcSkeleton.vue +8 -0
  329. package/src/components/OcSlider.vue +27 -0
  330. package/src/components/OcSortableRow.vue +40 -0
  331. package/src/components/OcSpinner.vue +13 -0
  332. package/src/components/OcStackCard.vue +24 -0
  333. package/src/components/OcStackList.vue +31 -0
  334. package/src/components/OcStatCard.vue +39 -0
  335. package/src/components/OcStepper.vue +34 -0
  336. package/src/components/OcSwitch.vue +15 -0
  337. package/src/components/OcTable.vue +115 -0
  338. package/src/components/OcTableActions.vue +26 -0
  339. package/src/components/OcTableCompact.vue +46 -0
  340. package/src/components/OcTabs.vue +37 -0
  341. package/src/components/OcTagInput.vue +50 -0
  342. package/src/components/OcTerminalLog.vue +50 -0
  343. package/src/components/OcTextarea.vue +9 -0
  344. package/src/components/OcThemeSwitch.vue +31 -0
  345. package/src/components/OcTimeInput.vue +50 -0
  346. package/src/components/OcTimeline.vue +36 -0
  347. package/src/components/OcToast.vue +31 -0
  348. package/src/components/OcToastContainer.vue +21 -0
  349. package/src/components/OcToggle.vue +63 -0
  350. package/src/components/OcToggleField.vue +28 -0
  351. package/src/components/OcToggleGroup.vue +40 -0
  352. package/src/components/OcTooltip.vue +8 -0
  353. package/src/components/OcTopProgress.vue +54 -0
  354. package/src/components/OcTree.vue +70 -0
  355. package/src/components/OcUpgradeBanner.vue +42 -0
  356. package/src/components/OcUser.vue +25 -0
  357. package/src/components/OcVersionBanner.vue +34 -0
  358. package/src/composables/chartLine.ts +28 -0
  359. package/src/composables/keys.ts +22 -0
  360. package/src/composables/useAttrsSplit.ts +16 -0
  361. package/src/composables/useDialog.ts +21 -0
  362. package/src/composables/useToast.ts +66 -0
  363. package/src/composables/useUid.ts +12 -0
  364. package/src/index.ts +589 -0
package/package.json CHANGED
@@ -1,6 +1,69 @@
1
1
  {
2
2
  "name": "@birdycom/omniaui-vue",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.11.0",
4
+ "description": "OmniaUI for Vue 3: one single-file component per OmniaUI component and block, rendering the exact markup of the CSS packages.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Serge Cools (Birdycom)",
8
+ "homepage": "https://omniaui.eu",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/Birdycom/OmniaUI.git",
12
+ "directory": "packages/vue"
13
+ },
14
+ "bugs": {
15
+ "url": "https://github.com/Birdycom/OmniaUI/issues"
16
+ },
17
+ "keywords": [
18
+ "vue",
19
+ "vue3",
20
+ "components",
21
+ "css",
22
+ "omniaui"
23
+ ],
24
+ "main": "./dist/omniaui-vue.js",
25
+ "module": "./dist/omniaui-vue.js",
26
+ "types": "./dist/index.d.ts",
27
+ "exports": {
28
+ ".": {
29
+ "types": "./dist/index.d.ts",
30
+ "import": "./dist/omniaui-vue.js"
31
+ },
32
+ "./src/*": "./src/*",
33
+ "./manifest.json": "./manifest.json",
34
+ "./package.json": "./package.json"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "src",
39
+ "manifest.json",
40
+ "README.md",
41
+ "LICENSE"
42
+ ],
43
+ "sideEffects": false,
44
+ "scripts": {
45
+ "generate": "node scripts/generate-index.mjs",
46
+ "build": "npm run generate && vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
47
+ "typecheck": "vue-tsc --noEmit",
48
+ "test": "vitest run"
49
+ },
50
+ "peerDependencies": {
51
+ "vue": "^3.4.0"
52
+ },
53
+ "devDependencies": {
54
+ "@vitejs/plugin-vue": "^6.0.0",
55
+ "@vue/test-utils": "^2.4.6",
56
+ "jsdom": "^26.0.0",
57
+ "typescript": "^5.7.0",
58
+ "vite": "^7.0.0",
59
+ "vitest": "^3.0.0",
60
+ "vue": "^3.5.0",
61
+ "vue-tsc": "^2.2.0"
62
+ },
63
+ "engines": {
64
+ "node": ">=22"
65
+ },
66
+ "publishConfig": {
67
+ "access": "public"
68
+ }
69
+ }
@@ -0,0 +1,44 @@
1
+ <!-- File: packages/vue/src/blocks/OcBlockAboutTimeline.vue | Map: props -> media (+ badge slot) -> copy (title, default slot) -> OcTimeline -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * About section: picture with a badge next to the company story and a year timeline.
5
+ * `title` + `highlight` (gradient part), or the `title` slot. Slots: title, default (paragraphs), badge.
6
+ * Classes: .oc-block-about (--reverse), -inner, -media, -badge, -copy, -title + .oc-timeline
7
+ */
8
+ import OcTimeline from '../components/OcTimeline.vue'
9
+ import type { TimelineEntry } from '../components/OcTimeline.vue'
10
+ import { useUid } from '../composables/useUid'
11
+
12
+ withDefaults(
13
+ defineProps<{
14
+ eyebrow?: string
15
+ title?: string
16
+ highlight?: string
17
+ timeline?: TimelineEntry[]
18
+ image?: string
19
+ imageAlt?: string
20
+ reverse?: boolean
21
+ }>(),
22
+ { timeline: () => [], imageAlt: '' },
23
+ )
24
+ const titleId = useUid('oc-about-title')
25
+ </script>
26
+
27
+ <template>
28
+ <section :class="['oc-block-about', reverse && 'oc-block-about--reverse']" :aria-labelledby="titleId">
29
+ <div class="oc-block-about-inner">
30
+ <figure class="oc-block-about-media" :aria-hidden="image ? undefined : 'true'">
31
+ <img v-if="image" :src="image" :alt="imageAlt" loading="lazy" />
32
+ <span v-if="$slots.badge" class="oc-block-about-badge"><slot name="badge" /></span>
33
+ </figure>
34
+ <div class="oc-block-about-copy">
35
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
36
+ <h2 :id="titleId" class="oc-block-about-title">
37
+ <slot name="title">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></slot>
38
+ </h2>
39
+ <slot />
40
+ <OcTimeline v-if="timeline.length" :items="timeline" />
41
+ </div>
42
+ </div>
43
+ </section>
44
+ </template>
@@ -0,0 +1,36 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Top bar with sidebar toggle, module navigation and user actions.
4
+ * `toggleFor` = id of the checkbox that collapses the sidebar (see OcBlockAppShell).
5
+ * Slots: toggle (replaces the default hamburger label), nav (replaces the items), title, actions.
6
+ * Classes: .oc-block-appbar, -nav, -actions, -title
7
+ */
8
+ import OcNavmenuList, { type NavmenuItem } from '../components/OcNavmenuList.vue'
9
+
10
+ withDefaults(
11
+ defineProps<{
12
+ toggleFor?: string
13
+ toggleLabel?: string
14
+ navItems?: NavmenuItem[]
15
+ navLabel?: string
16
+ title?: string
17
+ }>(),
18
+ { toggleLabel: 'Toggle sidebar', navLabel: 'Module navigation' },
19
+ )
20
+ </script>
21
+
22
+ <template>
23
+ <header class="oc-block-appbar">
24
+ <slot name="toggle">
25
+ <label v-if="toggleFor" class="oc-btn oc-btn--ghost oc-btn--icon" :for="toggleFor" :title="toggleLabel">
26
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6h16M4 12h16M4 18h16" /></svg>
27
+ <span class="oc-visually-hidden">{{ toggleLabel }}</span>
28
+ </label>
29
+ </slot>
30
+ <span v-if="title" class="oc-block-appbar-title">{{ title }}</span>
31
+ <nav v-if="navItems?.length || $slots.nav" class="oc-block-appbar-nav" :aria-label="navLabel">
32
+ <slot name="nav"><OcNavmenuList :items="navItems" /></slot>
33
+ </nav>
34
+ <div v-if="$slots.actions" class="oc-block-appbar-actions"><slot name="actions" /></div>
35
+ </header>
36
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Application layout: sidebar, header bar, breadcrumb strip and scrolling content.
4
+ * v-model:collapsed drives the hidden checkbox (`toggleId`) that collapses the sidebar; point the header's
5
+ * toggle label at the same id. `height` sets --oc-block-shell-height (default 100dvh).
6
+ * Slots: sidebar (an OcSidebar), header (an OcBlockAppHeader), breadcrumbs, default (content).
7
+ * Classes: .oc-block-shell, -toggle, -main, -breadcrumbs, -content
8
+ */
9
+ import { computed } from 'vue'
10
+
11
+ const props = withDefaults(defineProps<{ toggleId?: string; height?: string; toggleLabel?: string }>(), {
12
+ toggleId: 'oc-shell-toggle',
13
+ toggleLabel: 'Collapse sidebar',
14
+ })
15
+ const collapsed = defineModel<boolean>('collapsed', { default: false })
16
+ const style = computed(() => (props.height ? { '--oc-block-shell-height': props.height } : undefined))
17
+ </script>
18
+
19
+ <template>
20
+ <div class="oc-block-shell" :style="style">
21
+ <input :id="toggleId" v-model="collapsed" class="oc-block-shell-toggle" type="checkbox" :aria-label="toggleLabel" />
22
+ <slot name="sidebar" />
23
+ <div class="oc-block-shell-main">
24
+ <slot name="header" />
25
+ <div v-if="$slots.breadcrumbs" class="oc-block-shell-breadcrumbs"><slot name="breadcrumbs" /></div>
26
+ <main class="oc-block-shell-content"><slot /></main>
27
+ </div>
28
+ </div>
29
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Sign-in card. Slots: default (fields, e.g. .oc-form-group blocks), actions (primary button),
4
+ * social (alternative sign-in buttons, shown under the divider text), footer.
5
+ * Classes: .oc-block-auth, -card, -divider, -footer, .oc-block-subtitle
6
+ */
7
+ defineProps<{ title?: string; subtitle?: string; divider?: string }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div class="oc-block-auth">
12
+ <div class="oc-block-auth-card">
13
+ <h2 v-if="title">{{ title }}</h2>
14
+ <p v-if="subtitle" class="oc-block-subtitle">{{ subtitle }}</p>
15
+ <slot />
16
+ <slot name="actions" />
17
+ <template v-if="$slots.social">
18
+ <div v-if="divider" class="oc-block-auth-divider">{{ divider }}</div>
19
+ <slot name="social" />
20
+ </template>
21
+ </div>
22
+ <div v-if="$slots.footer" class="oc-block-auth-footer"><slot name="footer" /></div>
23
+ </div>
24
+ </template>
@@ -0,0 +1,47 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Sign-in with a brand panel (logo, quote) next to the form. Emits `submit` (the native submit event).
4
+ * Slots: logo, quote (or `quote` + `quoteAuthor` props), default (fields), row (remember me / forgot password),
5
+ * submit (default: a full-width primary button with `submitLabel`), footer.
6
+ * Classes: .oc-block-authsplit, -brand, -logo, -quote, -form, -card, -title, -subtitle, -fields, -row
7
+ */
8
+ withDefaults(
9
+ defineProps<{
10
+ title?: string
11
+ subtitle?: string
12
+ quote?: string
13
+ quoteAuthor?: string
14
+ submitLabel?: string
15
+ action?: string
16
+ method?: string
17
+ }>(),
18
+ { submitLabel: 'Sign in', action: '#', method: 'post' },
19
+ )
20
+ defineEmits<{ submit: [event: SubmitEvent] }>()
21
+ </script>
22
+
23
+ <template>
24
+ <div class="oc-block-authsplit">
25
+ <aside class="oc-block-authsplit-brand">
26
+ <a v-if="$slots.logo" class="oc-block-authsplit-logo" href="/"><slot name="logo" /></a>
27
+ <blockquote v-if="quote || $slots.quote" class="oc-block-authsplit-quote">
28
+ <slot name="quote">
29
+ <p>{{ quote }}</p>
30
+ <footer v-if="quoteAuthor">{{ quoteAuthor }}</footer>
31
+ </slot>
32
+ </blockquote>
33
+ </aside>
34
+ <div class="oc-block-authsplit-form">
35
+ <form class="oc-block-authsplit-card" :action="action" :method="method" @submit="$emit('submit', $event)">
36
+ <h1 v-if="title" class="oc-block-authsplit-title">{{ title }}</h1>
37
+ <p v-if="subtitle" class="oc-block-authsplit-subtitle">{{ subtitle }}</p>
38
+ <div class="oc-block-authsplit-fields">
39
+ <slot />
40
+ <div v-if="$slots.row" class="oc-block-authsplit-row"><slot name="row" /></div>
41
+ <slot name="submit"><button class="oc-btn" type="submit" style="width: 100%">{{ submitLabel }}</button></slot>
42
+ </div>
43
+ <slot name="footer" />
44
+ </form>
45
+ </div>
46
+ </div>
47
+ </template>
@@ -0,0 +1,53 @@
1
+ <!-- File: packages/vue/src/blocks/OcBlockContactGrid.vue | Map: props -> head -> grid -> cards (mark, title, lines) -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * Contact info cards (e-mail, phone, address, hours). A card with `address: true` renders as <address>.
5
+ * Slot: default (own cards). Classes: .oc-block-contact (--plain), -head, -heading, -lead, -grid, -card, -title, -line
6
+ */
7
+ import { useUid } from '../composables/useUid'
8
+
9
+ export interface ContactGridLine {
10
+ text: string
11
+ href?: string
12
+ }
13
+ export interface ContactGridCard {
14
+ title: string
15
+ lines: ContactGridLine[]
16
+ icon?: string
17
+ accent?: string
18
+ address?: boolean
19
+ }
20
+ withDefaults(
21
+ defineProps<{
22
+ eyebrow?: string
23
+ title?: string
24
+ lead?: string
25
+ cards?: ContactGridCard[]
26
+ plain?: boolean
27
+ }>(),
28
+ { cards: () => [] },
29
+ )
30
+ const titleId = useUid('oc-contact-title')
31
+ </script>
32
+
33
+ <template>
34
+ <section :class="['oc-block-contact', plain && 'oc-block-contact--plain']" :aria-labelledby="title ? titleId : undefined">
35
+ <div v-if="eyebrow || title || lead" class="oc-block-contact-head">
36
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
37
+ <h2 v-if="title" :id="titleId" class="oc-block-contact-heading">{{ title }}</h2>
38
+ <p v-if="lead" class="oc-block-contact-lead">{{ lead }}</p>
39
+ </div>
40
+ <div class="oc-block-contact-grid">
41
+ <slot>
42
+ <component :is="card.address ? 'address' : 'article'" v-for="(card, i) in cards" :key="i" class="oc-block-contact-card">
43
+ <span v-if="card.icon" :class="['oc-product-mark oc-product-mark--sm oc-product-mark--soft', card.accent && `oc-accent--${card.accent}`]" aria-hidden="true">{{ card.icon }}</span>
44
+ <component :is="card.address ? 'span' : 'h3'" class="oc-block-contact-title">{{ card.title }}</component>
45
+ <template v-for="(line, j) in card.lines" :key="j">
46
+ <a v-if="line.href" class="oc-block-contact-line" :href="line.href">{{ line.text }}</a>
47
+ <component :is="card.address ? 'span' : 'p'" v-else class="oc-block-contact-line">{{ line.text }}</component>
48
+ </template>
49
+ </component>
50
+ </slot>
51
+ </div>
52
+ </section>
53
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ /** Call to action banner. Slot `actions` holds the buttons (inside .oc-block-hero-actions). */
3
+ defineProps<{ title?: string; text?: string }>()
4
+ </script>
5
+
6
+ <template>
7
+ <div class="oc-block-cta">
8
+ <h2 v-if="title">{{ title }}</h2>
9
+ <p v-if="text">{{ text }}</p>
10
+ <div v-if="$slots.actions" class="oc-block-hero-actions"><slot name="actions" /></div>
11
+ </div>
12
+ </template>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Card with title, actions, toolbar, table, bulk bar and footer. Put an <OcTable> in the default slot.
4
+ * Slots: actions (header buttons), toolbar (.oc-table-toolbar content: search, filter pills, columns popover),
5
+ * bulk (selection bar, shown when `selectedCount` > 0), default (table), footer (.oc-table-footer: entries text, page size, pagination).
6
+ * Classes: .oc-card.oc-block-datatable, -head, -title, -description, -body, -bulk, .oc-table-toolbar, .oc-table-footer
7
+ */
8
+ defineProps<{ title?: string; description?: string; selectedCount?: number }>()
9
+ </script>
10
+
11
+ <template>
12
+ <section class="oc-card oc-block-datatable">
13
+ <header v-if="title || description || $slots.actions" class="oc-block-datatable-head">
14
+ <div>
15
+ <h2 v-if="title" class="oc-block-datatable-title">{{ title }}</h2>
16
+ <p v-if="description" class="oc-block-datatable-description">{{ description }}</p>
17
+ </div>
18
+ <div v-if="$slots.actions"><slot name="actions" /></div>
19
+ </header>
20
+ <div class="oc-block-datatable-body">
21
+ <div v-if="$slots.toolbar" class="oc-table-toolbar"><slot name="toolbar" /></div>
22
+ <div v-if="$slots.bulk && selectedCount" class="oc-block-datatable-bulk"><slot name="bulk" :count="selectedCount" /></div>
23
+ <slot />
24
+ <div v-if="$slots.footer" class="oc-table-footer"><slot name="footer" /></div>
25
+ </div>
26
+ </section>
27
+ </template>
@@ -0,0 +1,49 @@
1
+ <!-- File: packages/vue/src/blocks/OcBlockFaq.vue | Map: props -> section.oc-block-faq -> head -> accordion (details name) -> more slot -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * FAQ section: title + exclusive accordion on native <details name> (no JavaScript).
5
+ * Slots: lead, default (own details items), more. Classes: .oc-block-faq (--split), -inner, -head, -title, -lead, -list, -more
6
+ */
7
+ import { useUid } from '../composables/useUid'
8
+
9
+ export interface FaqItem {
10
+ question: string
11
+ answer: string
12
+ }
13
+ const props = withDefaults(
14
+ defineProps<{
15
+ eyebrow?: string
16
+ title: string
17
+ lead?: string
18
+ items?: FaqItem[]
19
+ openIndex?: number
20
+ split?: boolean
21
+ name?: string
22
+ }>(),
23
+ { items: () => [], openIndex: 0 },
24
+ )
25
+ const titleId = useUid('oc-faq-title')
26
+ const autoGroup = useUid('oc-faq')
27
+ const group = props.name ?? autoGroup
28
+ </script>
29
+
30
+ <template>
31
+ <section :class="['oc-block-faq', split && 'oc-block-faq--split']" :aria-labelledby="titleId">
32
+ <div class="oc-block-faq-inner">
33
+ <div class="oc-block-faq-head">
34
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
35
+ <h2 :id="titleId" class="oc-block-faq-title">{{ title }}</h2>
36
+ <p v-if="lead || $slots.lead" class="oc-block-faq-lead"><slot name="lead">{{ lead }}</slot></p>
37
+ </div>
38
+ <div class="oc-accordion oc-block-faq-list">
39
+ <slot>
40
+ <details v-for="(item, i) in items" :key="i" class="oc-accordion-item" :name="group" :open="i === openIndex">
41
+ <summary class="oc-accordion-trigger">{{ item.question }}</summary>
42
+ <div class="oc-accordion-content">{{ item.answer }}</div>
43
+ </details>
44
+ </slot>
45
+ </div>
46
+ <p v-if="$slots.more" class="oc-block-faq-more"><slot name="more" /></p>
47
+ </div>
48
+ </section>
49
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ /** Feature grid with icons. Slot `icon` (scoped: { item }) overrides the glyph. Classes: .oc-block-features, -grid, .oc-block-feature-card, -icon */
3
+ export interface FeatureItem {
4
+ icon?: string
5
+ title: string
6
+ text: string
7
+ }
8
+ defineProps<{ title?: string; description?: string; items: FeatureItem[] }>()
9
+ </script>
10
+
11
+ <template>
12
+ <div class="oc-block-features">
13
+ <h2 v-if="title">{{ title }}</h2>
14
+ <p v-if="description">{{ description }}</p>
15
+ <div class="oc-block-features-grid">
16
+ <div v-for="(item, i) in items" :key="i" class="oc-block-feature-card">
17
+ <div class="oc-block-feature-icon"><slot name="icon" :item="item">{{ item.icon }}</slot></div>
18
+ <h3>{{ item.title }}</h3>
19
+ <p>{{ item.text }}</p>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ /** Multi-column site footer. Slots: bottom-start, bottom-end (default text via `copyright` / `credit`). Classes: .oc-block-footer, -grid, -col, -bottom */
3
+ export interface FooterColumn {
4
+ title: string
5
+ links: { label: string; href: string }[]
6
+ }
7
+ defineProps<{ columns: FooterColumn[]; copyright?: string; credit?: string }>()
8
+ </script>
9
+
10
+ <template>
11
+ <div class="oc-block-footer">
12
+ <div class="oc-block-footer-grid">
13
+ <div v-for="col in columns" :key="col.title" class="oc-block-footer-col">
14
+ <h4>{{ col.title }}</h4>
15
+ <ul>
16
+ <li v-for="link in col.links" :key="link.href + link.label"><a :href="link.href">{{ link.label }}</a></li>
17
+ </ul>
18
+ </div>
19
+ </div>
20
+ <div v-if="copyright || credit || $slots['bottom-start'] || $slots['bottom-end']" class="oc-block-footer-bottom">
21
+ <span><slot name="bottom-start">{{ copyright }}</slot></span>
22
+ <span><slot name="bottom-end">{{ credit }}</slot></span>
23
+ </div>
24
+ </div>
25
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Collapsible form sections with a sticky action bar. Default slot = sections (OcCollapsible containing a
4
+ * `<div class="oc-block-formpage-grid">` for the two-column field grid). Emits `submit`.
5
+ * Slot `actions` replaces the default Cancel / Save buttons. Classes: .oc-block-formpage, -grid, -actions
6
+ */
7
+ withDefaults(
8
+ defineProps<{ cancelLabel?: string; submitLabel?: string; action?: string; method?: string }>(),
9
+ { cancelLabel: 'Cancel', submitLabel: 'Save', action: '#', method: 'post' },
10
+ )
11
+ defineEmits<{ submit: [event: SubmitEvent]; cancel: [] }>()
12
+ </script>
13
+
14
+ <template>
15
+ <form class="oc-block-formpage" :action="action" :method="method" @submit="$emit('submit', $event)">
16
+ <slot />
17
+ <div class="oc-block-formpage-actions">
18
+ <slot name="actions">
19
+ <button class="oc-btn oc-btn--outline" type="button" @click="$emit('cancel')">{{ cancelLabel }}</button>
20
+ <button class="oc-btn" type="submit">{{ submitLabel }}</button>
21
+ </slot>
22
+ </div>
23
+ </form>
24
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ /** Centered hero with badge, headline, text and actions. Classes: .oc-block-hero, -badge, -actions */
3
+ defineProps<{ badge?: string; title?: string; text?: string }>()
4
+ </script>
5
+
6
+ <template>
7
+ <div class="oc-block-hero">
8
+ <span v-if="badge" class="oc-block-hero-badge">{{ badge }}</span>
9
+ <h1 v-if="title">{{ title }}</h1>
10
+ <p v-if="text">{{ text }}</p>
11
+ <div v-if="$slots.actions" class="oc-block-hero-actions"><slot name="actions" /></div>
12
+ </div>
13
+ </template>
@@ -0,0 +1,42 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Landing hero: eyebrow, display title with a gradient word, lead, buttons and a code window with floating icon tiles.
4
+ * `title` + `highlight` (gradient word) + `titleEnd`, or the `title` slot. Slots: lead, actions, visual (replaces the code window).
5
+ * Classes: .oc-section-pad, .oc-container, .oc-split, .oc-eyebrow, .oc-display, .oc-text-gradient, .oc-lead, .oc-code-window
6
+ */
7
+ defineProps<{
8
+ eyebrow?: string
9
+ title?: string
10
+ highlight?: string
11
+ titleEnd?: string
12
+ lead?: string
13
+ code?: string
14
+ codeTitle?: string
15
+ }>()
16
+ </script>
17
+
18
+ <template>
19
+ <section class="oc-section-pad">
20
+ <div class="oc-container oc-split">
21
+ <div>
22
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
23
+ <h1 class="oc-display">
24
+ <slot name="title">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span>{{ titleEnd }}</slot>
25
+ </h1>
26
+ <p v-if="lead || $slots.lead" class="oc-lead"><slot name="lead">{{ lead }}</slot></p>
27
+ <div v-if="$slots.actions" class="flex flex-wrap gap-1 mt-2"><slot name="actions" /></div>
28
+ </div>
29
+ <div class="relative p-2">
30
+ <slot name="visual">
31
+ <span class="oc-icon-tile oc-icon-tile--float oc-accent--green absolute" style="inset: -0.5rem auto auto 8%" aria-hidden="true">&#9670;</span>
32
+ <span class="oc-icon-tile oc-icon-tile--float oc-accent--violet absolute" style="inset: 0 6% auto auto; animation-delay: -2s" aria-hidden="true">&#9673;</span>
33
+ <span class="oc-icon-tile oc-icon-tile--float oc-accent--orange absolute" style="inset: auto 10% -0.5rem auto; animation-delay: -4s" aria-hidden="true">&#9650;</span>
34
+ <div class="oc-code-window">
35
+ <div class="oc-code-window__bar"><i></i><i></i><i></i><span v-if="codeTitle" class="oc-code-window__title">{{ codeTitle }}</span></div>
36
+ <pre class="oc-code-window__body">{{ code }}</pre>
37
+ </div>
38
+ </slot>
39
+ </div>
40
+ </div>
41
+ </section>
42
+ </template>
@@ -0,0 +1,69 @@
1
+ <!-- File: packages/vue/src/blocks/OcBlockHeroOrbit.vue | Map: props + default marks -> copy -> visual (ring with marks + center slot / code window) -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * Hero with a code window and product marks that orbit around it (reduced motion: they stand still).
5
+ * `title` + `highlight` + `titleEnd`, or the `title` slot. Slots: lead, actions, center (replaces the code window;
6
+ * give it class="oc-block-orbit-center"). Classes: .oc-block-orbit-visual, -ring, -mark (--oc-orbit-angle), -center
7
+ */
8
+ import { computed } from 'vue'
9
+
10
+ export interface HeroOrbitMark {
11
+ glyph: string
12
+ accent: string
13
+ }
14
+ const props = withDefaults(
15
+ defineProps<{
16
+ eyebrow?: string
17
+ title?: string
18
+ highlight?: string
19
+ titleEnd?: string
20
+ lead?: string
21
+ code?: string
22
+ codeTitle?: string
23
+ marks?: HeroOrbitMark[]
24
+ duration?: string
25
+ }>(),
26
+ {
27
+ code: '',
28
+ marks: () => [
29
+ { glyph: '◆', accent: 'green' },
30
+ { glyph: '◉', accent: 'violet' },
31
+ { glyph: '▲', accent: 'orange' },
32
+ { glyph: '★', accent: 'cyan' },
33
+ { glyph: '♥', accent: 'red' },
34
+ { glyph: '☀', accent: 'yellow' },
35
+ ],
36
+ },
37
+ )
38
+ // Spread the marks evenly over the ring.
39
+ const angle = (i: number) => `--oc-orbit-angle: ${(360 / props.marks.length) * i}deg`
40
+ const visualStyle = computed(() => (props.duration ? `--oc-orbit-duration: ${props.duration}` : undefined))
41
+ </script>
42
+
43
+ <template>
44
+ <section class="oc-block-orbit oc-section-pad">
45
+ <div class="oc-container oc-split">
46
+ <div>
47
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
48
+ <h1 class="oc-display">
49
+ <slot name="title">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span>{{ titleEnd }}</slot>
50
+ </h1>
51
+ <p v-if="lead || $slots.lead" class="oc-lead"><slot name="lead">{{ lead }}</slot></p>
52
+ <div v-if="$slots.actions" class="flex flex-wrap gap-1 mt-2"><slot name="actions" /></div>
53
+ </div>
54
+ <div class="oc-block-orbit-visual" :style="visualStyle">
55
+ <div class="oc-block-orbit-ring" aria-hidden="true">
56
+ <span v-for="(mark, i) in marks" :key="i" class="oc-block-orbit-mark" :style="angle(i)">
57
+ <span :class="['oc-product-mark oc-product-mark--sm', `oc-accent--${mark.accent}`]">{{ mark.glyph }}</span>
58
+ </span>
59
+ </div>
60
+ <slot name="center">
61
+ <div class="oc-code-window oc-block-orbit-center">
62
+ <div class="oc-code-window__bar"><i></i><i></i><i></i><span v-if="codeTitle" class="oc-code-window__title">{{ codeTitle }}</span></div>
63
+ <pre class="oc-code-window__body">{{ code }}</pre>
64
+ </div>
65
+ </slot>
66
+ </div>
67
+ </div>
68
+ </section>
69
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ /** Hero with text left and visual right. Slots: actions, visual. Classes: .oc-block-hero-split, -actions, -visual */
3
+ defineProps<{ title?: string; text?: string }>()
4
+ </script>
5
+
6
+ <template>
7
+ <div class="oc-block-hero-split">
8
+ <div>
9
+ <h1 v-if="title">{{ title }}</h1>
10
+ <p v-if="text">{{ text }}</p>
11
+ <div v-if="$slots.actions" class="oc-block-hero-actions justify-start"><slot name="actions" /></div>
12
+ </div>
13
+ <div class="oc-block-hero-visual"><slot name="visual" /></div>
14
+ </div>
15
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * Page header with icon tile, title, intro, meta badges and an action row.
4
+ * Slots: icon, meta (badges), actions. Classes: .oc-block-modulehead, -band, -icon, -body, -title, -intro, -meta, -actions
5
+ */
6
+ defineProps<{ title: string; intro?: string }>()
7
+ </script>
8
+
9
+ <template>
10
+ <header class="oc-block-modulehead">
11
+ <div class="oc-block-modulehead-band">
12
+ <span v-if="$slots.icon" class="oc-block-modulehead-icon" aria-hidden="true"><slot name="icon" /></span>
13
+ <div class="oc-block-modulehead-body">
14
+ <h1 class="oc-block-modulehead-title">{{ title }}</h1>
15
+ <p v-if="intro" class="oc-block-modulehead-intro">{{ intro }}</p>
16
+ <div v-if="$slots.meta" class="oc-block-modulehead-meta"><slot name="meta" /></div>
17
+ </div>
18
+ </div>
19
+ <div v-if="$slots.actions" class="oc-block-modulehead-actions"><slot name="actions" /></div>
20
+ </header>
21
+ </template>