@birdycom/omniaui-vue 0.11.0 → 0.11.2

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 (178) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +49 -49
  3. package/dist/omniaui-vue.js.map +1 -1
  4. package/package.json +69 -69
  5. package/src/blocks/OcBlockAboutTimeline.vue +44 -44
  6. package/src/blocks/OcBlockAppHeader.vue +36 -36
  7. package/src/blocks/OcBlockAppShell.vue +29 -29
  8. package/src/blocks/OcBlockAuth.vue +24 -24
  9. package/src/blocks/OcBlockAuthSplit.vue +47 -47
  10. package/src/blocks/OcBlockContactGrid.vue +53 -53
  11. package/src/blocks/OcBlockCta.vue +12 -12
  12. package/src/blocks/OcBlockDataTable.vue +27 -27
  13. package/src/blocks/OcBlockFaq.vue +49 -49
  14. package/src/blocks/OcBlockFeatures.vue +23 -23
  15. package/src/blocks/OcBlockFooter.vue +25 -25
  16. package/src/blocks/OcBlockFormPage.vue +24 -24
  17. package/src/blocks/OcBlockHero.vue +13 -13
  18. package/src/blocks/OcBlockHeroCode.vue +42 -42
  19. package/src/blocks/OcBlockHeroOrbit.vue +69 -69
  20. package/src/blocks/OcBlockHeroSplit.vue +15 -15
  21. package/src/blocks/OcBlockModuleHeader.vue +21 -21
  22. package/src/blocks/OcBlockPageHero.vue +13 -13
  23. package/src/blocks/OcBlockPortfolioGrid.vue +63 -63
  24. package/src/blocks/OcBlockPricing.vue +39 -39
  25. package/src/blocks/OcBlockProcess.vue +39 -39
  26. package/src/blocks/OcBlockProductGrid.vue +41 -41
  27. package/src/blocks/OcBlockProfileHeader.vue +50 -50
  28. package/src/blocks/OcBlockShowcase.vue +43 -43
  29. package/src/blocks/OcBlockSiteFooter.vue +54 -54
  30. package/src/blocks/OcBlockSiteHeader.vue +34 -34
  31. package/src/blocks/OcBlockSpotlight.vue +47 -47
  32. package/src/blocks/OcBlockStats.vue +17 -17
  33. package/src/blocks/OcBlockStatsCounter.vue +20 -20
  34. package/src/blocks/OcBlockTeamList.vue +53 -53
  35. package/src/blocks/OcBlockTwoFactor.vue +61 -61
  36. package/src/blocks/OcBlockWizardDialog.vue +67 -67
  37. package/src/components/OcAccordion.vue +12 -12
  38. package/src/components/OcAccordionAccent.vue +27 -27
  39. package/src/components/OcAccordionItem.vue +19 -19
  40. package/src/components/OcAffixInput.vue +40 -40
  41. package/src/components/OcAlert.vue +17 -17
  42. package/src/components/OcAlertDialog.vue +66 -66
  43. package/src/components/OcAlphaTabs.vue +54 -54
  44. package/src/components/OcAspectRatio.vue +21 -21
  45. package/src/components/OcAttachment.vue +59 -59
  46. package/src/components/OcAttachmentImage.vue +13 -13
  47. package/src/components/OcAttachmentList.vue +31 -31
  48. package/src/components/OcAttachmentThumb.vue +14 -14
  49. package/src/components/OcAvatar.vue +18 -18
  50. package/src/components/OcAvatarGroup.vue +7 -7
  51. package/src/components/OcBackLink.vue +8 -8
  52. package/src/components/OcBadge.vue +13 -13
  53. package/src/components/OcBarcodeInput.vue +51 -51
  54. package/src/components/OcBreadcrumb.vue +22 -22
  55. package/src/components/OcBrowserFrame.vue +33 -33
  56. package/src/components/OcBusyOverlay.vue +32 -32
  57. package/src/components/OcButton.vue +47 -47
  58. package/src/components/OcButtonGroup.vue +10 -10
  59. package/src/components/OcButtonGroupText.vue +7 -7
  60. package/src/components/OcCard.vue +20 -20
  61. package/src/components/OcChartLine.vue +80 -80
  62. package/src/components/OcChatComposer.vue +42 -42
  63. package/src/components/OcCheckbox.vue +26 -26
  64. package/src/components/OcChecklist.vue +29 -29
  65. package/src/components/OcCollapsible.vue +19 -19
  66. package/src/components/OcColorField.vue +15 -15
  67. package/src/components/OcColorSelect.vue +33 -33
  68. package/src/components/OcColumnMenu.vue +50 -50
  69. package/src/components/OcCommand.vue +119 -119
  70. package/src/components/OcConfirmDialog.vue +65 -65
  71. package/src/components/OcCookieConsent.vue +119 -119
  72. package/src/components/OcCopyField.vue +37 -37
  73. package/src/components/OcCounter.vue +15 -15
  74. package/src/components/OcDataTable.vue +144 -144
  75. package/src/components/OcDefinitionList.vue +35 -35
  76. package/src/components/OcDropdown.vue +23 -23
  77. package/src/components/OcDropdownItem.vue +9 -9
  78. package/src/components/OcDropdownLabel.vue +7 -7
  79. package/src/components/OcDropdownSeparator.vue +7 -7
  80. package/src/components/OcDropzone.vue +36 -36
  81. package/src/components/OcEmojiPicker.vue +45 -45
  82. package/src/components/OcEmptyState.vue +13 -13
  83. package/src/components/OcEntityCard.vue +47 -47
  84. package/src/components/OcFactList.vue +37 -37
  85. package/src/components/OcFilterCounts.vue +38 -38
  86. package/src/components/OcFlipCard.vue +36 -36
  87. package/src/components/OcFormField.vue +36 -36
  88. package/src/components/OcGreeting.vue +52 -52
  89. package/src/components/OcHeading.vue +19 -19
  90. package/src/components/OcHoverCard.vue +25 -25
  91. package/src/components/OcImageZoom.vue +39 -39
  92. package/src/components/OcInput.vue +9 -9
  93. package/src/components/OcInputGroup.vue +12 -12
  94. package/src/components/OcItem.vue +40 -40
  95. package/src/components/OcItemGroup.vue +7 -7
  96. package/src/components/OcItemSeparator.vue +7 -7
  97. package/src/components/OcKbd.vue +7 -7
  98. package/src/components/OcKbdGroup.vue +15 -15
  99. package/src/components/OcLabel.vue +10 -10
  100. package/src/components/OcLanguageSelect.vue +40 -40
  101. package/src/components/OcLauncherCard.vue +34 -34
  102. package/src/components/OcLightbox.vue +63 -63
  103. package/src/components/OcLinkArrow.vue +25 -25
  104. package/src/components/OcListToolbar.vue +44 -44
  105. package/src/components/OcMarquee.vue +36 -36
  106. package/src/components/OcMediaCard.vue +28 -28
  107. package/src/components/OcMediaRow.vue +28 -28
  108. package/src/components/OcMediaThumb.vue +38 -38
  109. package/src/components/OcMessage.vue +91 -91
  110. package/src/components/OcMessageList.vue +43 -43
  111. package/src/components/OcMessageThread.vue +155 -155
  112. package/src/components/OcModal.vue +42 -42
  113. package/src/components/OcNavmenu.vue +18 -18
  114. package/src/components/OcNavmenuList.vue +38 -38
  115. package/src/components/OcNextTeaser.vue +25 -25
  116. package/src/components/OcNumberInput.vue +47 -47
  117. package/src/components/OcOtpInput.vue +34 -34
  118. package/src/components/OcPageHeader.vue +34 -34
  119. package/src/components/OcPagination.vue +33 -33
  120. package/src/components/OcPasswordInput.vue +27 -27
  121. package/src/components/OcPasswordRequirements.vue +28 -28
  122. package/src/components/OcPhoneInput.vue +72 -72
  123. package/src/components/OcPopover.vue +25 -25
  124. package/src/components/OcPriceCard.vue +69 -69
  125. package/src/components/OcProductMark.vue +31 -31
  126. package/src/components/OcProgress.vue +21 -21
  127. package/src/components/OcProjectCard.vue +36 -36
  128. package/src/components/OcProse.vue +57 -57
  129. package/src/components/OcRadio.vue +40 -40
  130. package/src/components/OcRadioGroup.vue +32 -32
  131. package/src/components/OcRecoveryCodes.vue +55 -55
  132. package/src/components/OcScrollArea.vue +15 -15
  133. package/src/components/OcSegmented.vue +28 -28
  134. package/src/components/OcSelect.vue +21 -21
  135. package/src/components/OcSeparator.vue +18 -18
  136. package/src/components/OcSeverityCard.vue +46 -46
  137. package/src/components/OcSheet.vue +49 -49
  138. package/src/components/OcSidebarCollapsible.vue +19 -19
  139. package/src/components/OcSidebarGroup.vue +11 -11
  140. package/src/components/OcSidebarMenu.vue +7 -7
  141. package/src/components/OcSidebarMenuButton.vue +31 -31
  142. package/src/components/OcSidebarSeparator.vue +7 -7
  143. package/src/components/OcSkeleton.vue +8 -8
  144. package/src/components/OcSlider.vue +27 -27
  145. package/src/components/OcSortableRow.vue +40 -40
  146. package/src/components/OcSpinner.vue +13 -13
  147. package/src/components/OcStackCard.vue +24 -24
  148. package/src/components/OcStackList.vue +31 -31
  149. package/src/components/OcStatCard.vue +39 -39
  150. package/src/components/OcStepper.vue +34 -34
  151. package/src/components/OcSwitch.vue +15 -15
  152. package/src/components/OcTable.vue +115 -115
  153. package/src/components/OcTableActions.vue +26 -26
  154. package/src/components/OcTableCompact.vue +46 -46
  155. package/src/components/OcTabs.vue +37 -37
  156. package/src/components/OcTagInput.vue +50 -50
  157. package/src/components/OcTerminalLog.vue +50 -50
  158. package/src/components/OcTextarea.vue +9 -9
  159. package/src/components/OcThemeSwitch.vue +31 -31
  160. package/src/components/OcTimeInput.vue +50 -50
  161. package/src/components/OcTimeline.vue +36 -36
  162. package/src/components/OcToast.vue +31 -31
  163. package/src/components/OcToastContainer.vue +21 -21
  164. package/src/components/OcToggle.vue +63 -63
  165. package/src/components/OcToggleField.vue +28 -28
  166. package/src/components/OcToggleGroup.vue +40 -40
  167. package/src/components/OcTooltip.vue +8 -8
  168. package/src/components/OcTopProgress.vue +54 -54
  169. package/src/components/OcTree.vue +70 -70
  170. package/src/components/OcUpgradeBanner.vue +42 -42
  171. package/src/components/OcUser.vue +25 -25
  172. package/src/components/OcVersionBanner.vue +34 -34
  173. package/src/composables/chartLine.ts +28 -28
  174. package/src/composables/keys.ts +22 -22
  175. package/src/composables/useAttrsSplit.ts +16 -16
  176. package/src/composables/useDialog.ts +21 -21
  177. package/src/composables/useToast.ts +66 -66
  178. package/src/composables/useUid.ts +12 -12
@@ -1,13 +1,13 @@
1
- <script setup lang="ts">
2
- /** Page header (the oc-hero used on every docs page): eyebrow, title, text, actions. Classes: .oc-hero, -eyebrow, -title, -text, -actions */
3
- defineProps<{ eyebrow?: string; title: string; text?: string }>()
4
- </script>
5
-
6
- <template>
7
- <section class="oc-hero">
8
- <span v-if="eyebrow" class="oc-hero-eyebrow">{{ eyebrow }}</span>
9
- <h1 class="oc-hero-title">{{ title }}</h1>
10
- <p v-if="text" class="oc-hero-text">{{ text }}</p>
11
- <div v-if="$slots.actions" class="oc-hero-actions"><slot name="actions" /></div>
12
- </section>
13
- </template>
1
+ <script setup lang="ts">
2
+ /** Page header (the oc-hero used on every docs page): eyebrow, title, text, actions. Classes: .oc-hero, -eyebrow, -title, -text, -actions */
3
+ defineProps<{ eyebrow?: string; title: string; text?: string }>()
4
+ </script>
5
+
6
+ <template>
7
+ <section class="oc-hero">
8
+ <span v-if="eyebrow" class="oc-hero-eyebrow">{{ eyebrow }}</span>
9
+ <h1 class="oc-hero-title">{{ title }}</h1>
10
+ <p v-if="text" class="oc-hero-text">{{ text }}</p>
11
+ <div v-if="$slots.actions" class="oc-hero-actions"><slot name="actions" /></div>
12
+ </section>
13
+ </template>
@@ -1,63 +1,63 @@
1
- <!-- File: packages/vue/src/blocks/OcBlockPortfolioGrid.vue | Map: props -> head (title, lead, link slot) -> grid of OcProjectCard -->
2
- <script setup lang="ts">
3
- /**
4
- * Portfolio section: heading, lead, "all projects" link and a grid of project cards.
5
- * `title` + `highlight` (gradient word). Slots: link, default (own cards). Classes: .oc-block-portfolio (--two), -head, -lead, -grid
6
- */
7
- import OcProjectCard from '../components/OcProjectCard.vue'
8
- import { useUid } from '../composables/useUid'
9
-
10
- export interface PortfolioGridProject {
11
- href: string
12
- name: string
13
- type?: string
14
- meta?: string
15
- more?: string
16
- image?: string
17
- imageAlt?: string
18
- accent?: string
19
- }
20
- withDefaults(
21
- defineProps<{
22
- eyebrow?: string
23
- title?: string
24
- highlight?: string
25
- lead?: string
26
- projects?: PortfolioGridProject[]
27
- two?: boolean
28
- }>(),
29
- { projects: () => [] },
30
- )
31
- const titleId = useUid('oc-portfolio-title')
32
- </script>
33
-
34
- <template>
35
- <section :class="['oc-block-portfolio oc-section-pad', two && 'oc-block-portfolio--two']" :aria-labelledby="titleId">
36
- <div class="oc-container">
37
- <div class="oc-block-portfolio-head">
38
- <div>
39
- <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
40
- <h2 :id="titleId" class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
41
- <p v-if="lead" class="oc-block-portfolio-lead">{{ lead }}</p>
42
- </div>
43
- <slot name="link" />
44
- </div>
45
- <div class="oc-block-portfolio-grid">
46
- <slot>
47
- <OcProjectCard
48
- v-for="(p, i) in projects"
49
- :key="i"
50
- :class="p.accent && `oc-accent--${p.accent}`"
51
- :href="p.href"
52
- :name="p.name"
53
- :type="p.type"
54
- :meta="p.meta"
55
- :more="p.more ?? 'View project'"
56
- :image="p.image"
57
- :image-alt="p.imageAlt"
58
- />
59
- </slot>
60
- </div>
61
- </div>
62
- </section>
63
- </template>
1
+ <!-- File: packages/vue/src/blocks/OcBlockPortfolioGrid.vue | Map: props -> head (title, lead, link slot) -> grid of OcProjectCard -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * Portfolio section: heading, lead, "all projects" link and a grid of project cards.
5
+ * `title` + `highlight` (gradient word). Slots: link, default (own cards). Classes: .oc-block-portfolio (--two), -head, -lead, -grid
6
+ */
7
+ import OcProjectCard from '../components/OcProjectCard.vue'
8
+ import { useUid } from '../composables/useUid'
9
+
10
+ export interface PortfolioGridProject {
11
+ href: string
12
+ name: string
13
+ type?: string
14
+ meta?: string
15
+ more?: string
16
+ image?: string
17
+ imageAlt?: string
18
+ accent?: string
19
+ }
20
+ withDefaults(
21
+ defineProps<{
22
+ eyebrow?: string
23
+ title?: string
24
+ highlight?: string
25
+ lead?: string
26
+ projects?: PortfolioGridProject[]
27
+ two?: boolean
28
+ }>(),
29
+ { projects: () => [] },
30
+ )
31
+ const titleId = useUid('oc-portfolio-title')
32
+ </script>
33
+
34
+ <template>
35
+ <section :class="['oc-block-portfolio oc-section-pad', two && 'oc-block-portfolio--two']" :aria-labelledby="titleId">
36
+ <div class="oc-container">
37
+ <div class="oc-block-portfolio-head">
38
+ <div>
39
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
40
+ <h2 :id="titleId" class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
41
+ <p v-if="lead" class="oc-block-portfolio-lead">{{ lead }}</p>
42
+ </div>
43
+ <slot name="link" />
44
+ </div>
45
+ <div class="oc-block-portfolio-grid">
46
+ <slot>
47
+ <OcProjectCard
48
+ v-for="(p, i) in projects"
49
+ :key="i"
50
+ :class="p.accent && `oc-accent--${p.accent}`"
51
+ :href="p.href"
52
+ :name="p.name"
53
+ :type="p.type"
54
+ :meta="p.meta"
55
+ :more="p.more ?? 'View project'"
56
+ :image="p.image"
57
+ :image-alt="p.imageAlt"
58
+ />
59
+ </slot>
60
+ </div>
61
+ </div>
62
+ </section>
63
+ </template>
@@ -1,39 +1,39 @@
1
- <script setup lang="ts">
2
- /**
3
- * Pricing cards with a featured plan. Emits `select` with the plan when its button is clicked.
4
- * Slot `action` (scoped: { plan }) replaces the button. Classes: .oc-block-pricing, -grid, -card(--featured),
5
- * -name, -desc, -price, -features
6
- */
7
- export interface PricingPlan {
8
- name: string
9
- description?: string
10
- price: string
11
- /** e.g. "/month" */
12
- period?: string
13
- features: string[]
14
- cta: string
15
- featured?: boolean
16
- }
17
- defineProps<{ title?: string; description?: string; plans: PricingPlan[] }>()
18
- defineEmits<{ select: [plan: PricingPlan] }>()
19
- </script>
20
-
21
- <template>
22
- <div class="oc-block-pricing">
23
- <h2 v-if="title">{{ title }}</h2>
24
- <p v-if="description">{{ description }}</p>
25
- <div class="oc-block-pricing-grid">
26
- <div v-for="plan in plans" :key="plan.name" :class="['oc-block-pricing-card', plan.featured && 'oc-block-pricing-card--featured']">
27
- <p class="oc-block-pricing-name">{{ plan.name }}</p>
28
- <p v-if="plan.description" class="oc-block-pricing-desc">{{ plan.description }}</p>
29
- <p class="oc-block-pricing-price">{{ plan.price }} <span v-if="plan.period">{{ plan.period }}</span></p>
30
- <ul class="oc-block-pricing-features">
31
- <li v-for="f in plan.features" :key="f">{{ f }}</li>
32
- </ul>
33
- <slot name="action" :plan="plan">
34
- <button :class="['oc-btn', !plan.featured && 'oc-btn--outline']" type="button" style="width: 100%" @click="$emit('select', plan)">{{ plan.cta }}</button>
35
- </slot>
36
- </div>
37
- </div>
38
- </div>
39
- </template>
1
+ <script setup lang="ts">
2
+ /**
3
+ * Pricing cards with a featured plan. Emits `select` with the plan when its button is clicked.
4
+ * Slot `action` (scoped: { plan }) replaces the button. Classes: .oc-block-pricing, -grid, -card(--featured),
5
+ * -name, -desc, -price, -features
6
+ */
7
+ export interface PricingPlan {
8
+ name: string
9
+ description?: string
10
+ price: string
11
+ /** e.g. "/month" */
12
+ period?: string
13
+ features: string[]
14
+ cta: string
15
+ featured?: boolean
16
+ }
17
+ defineProps<{ title?: string; description?: string; plans: PricingPlan[] }>()
18
+ defineEmits<{ select: [plan: PricingPlan] }>()
19
+ </script>
20
+
21
+ <template>
22
+ <div class="oc-block-pricing">
23
+ <h2 v-if="title">{{ title }}</h2>
24
+ <p v-if="description">{{ description }}</p>
25
+ <div class="oc-block-pricing-grid">
26
+ <div v-for="plan in plans" :key="plan.name" :class="['oc-block-pricing-card', plan.featured && 'oc-block-pricing-card--featured']">
27
+ <p class="oc-block-pricing-name">{{ plan.name }}</p>
28
+ <p v-if="plan.description" class="oc-block-pricing-desc">{{ plan.description }}</p>
29
+ <p class="oc-block-pricing-price">{{ plan.price }} <span v-if="plan.period">{{ plan.period }}</span></p>
30
+ <ul class="oc-block-pricing-features">
31
+ <li v-for="f in plan.features" :key="f">{{ f }}</li>
32
+ </ul>
33
+ <slot name="action" :plan="plan">
34
+ <button :class="['oc-btn', !plan.featured && 'oc-btn--outline']" type="button" style="width: 100%" @click="$emit('select', plan)">{{ plan.cta }}</button>
35
+ </slot>
36
+ </div>
37
+ </div>
38
+ </div>
39
+ </template>
@@ -1,39 +1,39 @@
1
- <script setup lang="ts">
2
- /**
3
- * Numbered steps (CSS counter) + an endless marquee of technologies (the list is rendered twice, the copy aria-hidden).
4
- * Classes: .oc-section-pad, .oc-container, .oc-eyebrow, .oc-display(--md), .oc-text-gradient, .oc-steps, .oc-marquee
5
- */
6
- export interface ProcessStep {
7
- title: string
8
- text: string
9
- }
10
- defineProps<{
11
- eyebrow?: string
12
- title?: string
13
- highlight?: string
14
- steps: ProcessStep[]
15
- marquee?: string[]
16
- marqueeLabel?: string
17
- }>()
18
- </script>
19
-
20
- <template>
21
- <section class="oc-section-pad">
22
- <div class="oc-container">
23
- <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
24
- <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
25
- <ol class="oc-steps">
26
- <li v-for="step in steps" :key="step.title">
27
- <h3>{{ step.title }}</h3>
28
- <p>{{ step.text }}</p>
29
- </li>
30
- </ol>
31
- <div v-if="marquee?.length" class="oc-marquee mt-4" :aria-label="marqueeLabel">
32
- <div class="oc-marquee__track">
33
- <span v-for="item in marquee" :key="item" class="oc-marquee__item">{{ item }}</span>
34
- <span v-for="item in marquee" :key="'copy-' + item" class="oc-marquee__item" aria-hidden="true">{{ item }}</span>
35
- </div>
36
- </div>
37
- </div>
38
- </section>
39
- </template>
1
+ <script setup lang="ts">
2
+ /**
3
+ * Numbered steps (CSS counter) + an endless marquee of technologies (the list is rendered twice, the copy aria-hidden).
4
+ * Classes: .oc-section-pad, .oc-container, .oc-eyebrow, .oc-display(--md), .oc-text-gradient, .oc-steps, .oc-marquee
5
+ */
6
+ export interface ProcessStep {
7
+ title: string
8
+ text: string
9
+ }
10
+ defineProps<{
11
+ eyebrow?: string
12
+ title?: string
13
+ highlight?: string
14
+ steps: ProcessStep[]
15
+ marquee?: string[]
16
+ marqueeLabel?: string
17
+ }>()
18
+ </script>
19
+
20
+ <template>
21
+ <section class="oc-section-pad">
22
+ <div class="oc-container">
23
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
24
+ <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
25
+ <ol class="oc-steps">
26
+ <li v-for="step in steps" :key="step.title">
27
+ <h3>{{ step.title }}</h3>
28
+ <p>{{ step.text }}</p>
29
+ </li>
30
+ </ol>
31
+ <div v-if="marquee?.length" class="oc-marquee mt-4" :aria-label="marqueeLabel">
32
+ <div class="oc-marquee__track">
33
+ <span v-for="item in marquee" :key="item" class="oc-marquee__item">{{ item }}</span>
34
+ <span v-for="item in marquee" :key="'copy-' + item" class="oc-marquee__item" aria-hidden="true">{{ item }}</span>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </section>
39
+ </template>
@@ -1,41 +1,41 @@
1
- <script setup lang="ts">
2
- /**
3
- * Section title + grid of product cards, each with its own accent color (oc-accent--green|orange|violet|cyan...).
4
- * Classes: .oc-card-grid, .oc-product-card, -top, -name, -tagline, -summary, -more, .oc-icon-tile, .oc-pill
5
- */
6
- export interface ProductItem {
7
- name: string
8
- tagline?: string
9
- summary?: string
10
- /** Pill text, e.g. "Own product" */
11
- tag?: string
12
- /** Glyph for the icon tile */
13
- icon?: string
14
- /** Accent name: green, orange, violet, cyan, ... */
15
- accent?: string
16
- href?: string
17
- more?: string
18
- }
19
- defineProps<{ eyebrow?: string; title?: string; highlight?: string; products: ProductItem[] }>()
20
- </script>
21
-
22
- <template>
23
- <section class="oc-section-pad">
24
- <div class="oc-container">
25
- <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
26
- <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
27
- <div class="oc-card-grid">
28
- <a v-for="p in products" :key="p.name" :class="['oc-product-card', p.accent && `oc-accent--${p.accent}`]" :href="p.href ?? '#'">
29
- <div class="oc-product-card__top">
30
- <span class="oc-icon-tile" aria-hidden="true">{{ p.icon }}</span>
31
- <span v-if="p.tag" class="oc-pill">{{ p.tag }}</span>
32
- </div>
33
- <h3 class="oc-product-card__name">{{ p.name }}</h3>
34
- <p v-if="p.tagline" class="oc-product-card__tagline">{{ p.tagline }}</p>
35
- <p v-if="p.summary" class="oc-product-card__summary">{{ p.summary }}</p>
36
- <span v-if="p.more" class="oc-product-card__more">{{ p.more }}</span>
37
- </a>
38
- </div>
39
- </div>
40
- </section>
41
- </template>
1
+ <script setup lang="ts">
2
+ /**
3
+ * Section title + grid of product cards, each with its own accent color (oc-accent--green|orange|violet|cyan...).
4
+ * Classes: .oc-card-grid, .oc-product-card, -top, -name, -tagline, -summary, -more, .oc-icon-tile, .oc-pill
5
+ */
6
+ export interface ProductItem {
7
+ name: string
8
+ tagline?: string
9
+ summary?: string
10
+ /** Pill text, e.g. "Own product" */
11
+ tag?: string
12
+ /** Glyph for the icon tile */
13
+ icon?: string
14
+ /** Accent name: green, orange, violet, cyan, ... */
15
+ accent?: string
16
+ href?: string
17
+ more?: string
18
+ }
19
+ defineProps<{ eyebrow?: string; title?: string; highlight?: string; products: ProductItem[] }>()
20
+ </script>
21
+
22
+ <template>
23
+ <section class="oc-section-pad">
24
+ <div class="oc-container">
25
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
26
+ <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
27
+ <div class="oc-card-grid">
28
+ <a v-for="p in products" :key="p.name" :class="['oc-product-card', p.accent && `oc-accent--${p.accent}`]" :href="p.href ?? '#'">
29
+ <div class="oc-product-card__top">
30
+ <span class="oc-icon-tile" aria-hidden="true">{{ p.icon }}</span>
31
+ <span v-if="p.tag" class="oc-pill">{{ p.tag }}</span>
32
+ </div>
33
+ <h3 class="oc-product-card__name">{{ p.name }}</h3>
34
+ <p v-if="p.tagline" class="oc-product-card__tagline">{{ p.tagline }}</p>
35
+ <p v-if="p.summary" class="oc-product-card__summary">{{ p.summary }}</p>
36
+ <span v-if="p.more" class="oc-product-card__more">{{ p.more }}</span>
37
+ </a>
38
+ </div>
39
+ </div>
40
+ </section>
41
+ </template>
@@ -1,50 +1,50 @@
1
- <!-- File: packages/vue/src/blocks/OcBlockProfileHeader.vue | Map: props -> banner -> bar (avatar slot, info, actions slot) -> tabs -->
2
- <script setup lang="ts">
3
- /**
4
- * Profile / channel header: banner, overhanging avatar, name, meta, bio, actions and link tabs.
5
- * Slots: avatar (initials or <img>), actions, bio. Classes: .oc-block-profile (--compact), -banner, -bar, -avatar,
6
- * -info, -name, -meta, -bio, -actions, -tabs, -tab (aria-current="page")
7
- */
8
- import { computed } from 'vue'
9
- import { useUid } from '../composables/useUid'
10
-
11
- export interface ProfileHeaderTab {
12
- label: string
13
- href: string
14
- current?: boolean
15
- }
16
- const props = withDefaults(
17
- defineProps<{
18
- name: string
19
- meta?: string
20
- bio?: string
21
- initials?: string
22
- banner?: string
23
- tabs?: ProfileHeaderTab[]
24
- tabsLabel?: string
25
- compact?: boolean
26
- headingLevel?: 1 | 2
27
- }>(),
28
- { tabs: () => [], tabsLabel: 'Profile sections', headingLevel: 1 },
29
- )
30
- const nameId = useUid('oc-profile-name')
31
- const bannerStyle = computed(() => (props.banner ? `--oc-profile-banner: url("${props.banner}")` : undefined))
32
- </script>
33
-
34
- <template>
35
- <section :class="['oc-block-profile', compact && 'oc-block-profile--compact']" :aria-labelledby="nameId">
36
- <div class="oc-block-profile-banner" :style="bannerStyle" aria-hidden="true"></div>
37
- <div class="oc-block-profile-bar">
38
- <span class="oc-avatar oc-block-profile-avatar" aria-hidden="true"><slot name="avatar">{{ initials }}</slot></span>
39
- <div class="oc-block-profile-info">
40
- <component :is="headingLevel === 1 ? 'h1' : 'h2'" :id="nameId" class="oc-block-profile-name">{{ name }}</component>
41
- <p v-if="meta" class="oc-block-profile-meta">{{ meta }}</p>
42
- <p v-if="bio || $slots.bio" class="oc-block-profile-bio"><slot name="bio">{{ bio }}</slot></p>
43
- </div>
44
- <div v-if="$slots.actions" class="oc-block-profile-actions"><slot name="actions" /></div>
45
- </div>
46
- <nav v-if="tabs.length" class="oc-block-profile-tabs" :aria-label="tabsLabel">
47
- <a v-for="(tab, i) in tabs" :key="i" class="oc-block-profile-tab" :href="tab.href" :aria-current="tab.current ? 'page' : undefined">{{ tab.label }}</a>
48
- </nav>
49
- </section>
50
- </template>
1
+ <!-- File: packages/vue/src/blocks/OcBlockProfileHeader.vue | Map: props -> banner -> bar (avatar slot, info, actions slot) -> tabs -->
2
+ <script setup lang="ts">
3
+ /**
4
+ * Profile / channel header: banner, overhanging avatar, name, meta, bio, actions and link tabs.
5
+ * Slots: avatar (initials or <img>), actions, bio. Classes: .oc-block-profile (--compact), -banner, -bar, -avatar,
6
+ * -info, -name, -meta, -bio, -actions, -tabs, -tab (aria-current="page")
7
+ */
8
+ import { computed } from 'vue'
9
+ import { useUid } from '../composables/useUid'
10
+
11
+ export interface ProfileHeaderTab {
12
+ label: string
13
+ href: string
14
+ current?: boolean
15
+ }
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ name: string
19
+ meta?: string
20
+ bio?: string
21
+ initials?: string
22
+ banner?: string
23
+ tabs?: ProfileHeaderTab[]
24
+ tabsLabel?: string
25
+ compact?: boolean
26
+ headingLevel?: 1 | 2
27
+ }>(),
28
+ { tabs: () => [], tabsLabel: 'Profile sections', headingLevel: 1 },
29
+ )
30
+ const nameId = useUid('oc-profile-name')
31
+ const bannerStyle = computed(() => (props.banner ? `--oc-profile-banner: url("${props.banner}")` : undefined))
32
+ </script>
33
+
34
+ <template>
35
+ <section :class="['oc-block-profile', compact && 'oc-block-profile--compact']" :aria-labelledby="nameId">
36
+ <div class="oc-block-profile-banner" :style="bannerStyle" aria-hidden="true"></div>
37
+ <div class="oc-block-profile-bar">
38
+ <span class="oc-avatar oc-block-profile-avatar" aria-hidden="true"><slot name="avatar">{{ initials }}</slot></span>
39
+ <div class="oc-block-profile-info">
40
+ <component :is="headingLevel === 1 ? 'h1' : 'h2'" :id="nameId" class="oc-block-profile-name">{{ name }}</component>
41
+ <p v-if="meta" class="oc-block-profile-meta">{{ meta }}</p>
42
+ <p v-if="bio || $slots.bio" class="oc-block-profile-bio"><slot name="bio">{{ bio }}</slot></p>
43
+ </div>
44
+ <div v-if="$slots.actions" class="oc-block-profile-actions"><slot name="actions" /></div>
45
+ </div>
46
+ <nav v-if="tabs.length" class="oc-block-profile-tabs" :aria-label="tabsLabel">
47
+ <a v-for="(tab, i) in tabs" :key="i" class="oc-block-profile-tab" :href="tab.href" :aria-current="tab.current ? 'page' : undefined">{{ tab.label }}</a>
48
+ </nav>
49
+ </section>
50
+ </template>
@@ -1,43 +1,43 @@
1
- <script setup lang="ts">
2
- /**
3
- * Portfolio grid: project cards with a browser frame around the screenshot.
4
- * `background` is any CSS background (use Omnia tokens, e.g. linear-gradient(135deg, var(--color-green-40), var(--color-teal-80))); `image` shows an img.
5
- * Classes: .oc-card-grid, .oc-product-card, .oc-browser-frame(__bar/__body), .oc-pill--accent
6
- */
7
- export interface ShowcaseProject {
8
- name: string
9
- summary?: string
10
- tag?: string
11
- accent?: string
12
- href?: string
13
- background?: string
14
- image?: string
15
- more?: string
16
- }
17
- defineProps<{ eyebrow?: string; title?: string; highlight?: string; projects: ShowcaseProject[] }>()
18
- </script>
19
-
20
- <template>
21
- <section class="oc-section-pad">
22
- <div class="oc-container">
23
- <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
24
- <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
25
- <div class="oc-card-grid" style="--oc-card-min: 26rem">
26
- <a v-for="p in projects" :key="p.name" :class="['oc-product-card', p.accent && `oc-accent--${p.accent}`, 'p-0 overflow-hidden']" :href="p.href ?? '#'">
27
- <span class="oc-browser-frame m-1">
28
- <span class="oc-browser-frame__bar"><i></i><i></i><i></i></span>
29
- <span class="oc-browser-frame__body" :style="p.background ? { background: p.background } : undefined">
30
- <img v-if="p.image" :src="p.image" alt="" />
31
- </span>
32
- </span>
33
- <span class="grid gap-0.5 p-1.5 pt-0">
34
- <span v-if="p.tag" class="oc-pill oc-pill--accent">{{ p.tag }}</span>
35
- <span class="oc-product-card__name">{{ p.name }}</span>
36
- <span v-if="p.summary" class="oc-product-card__summary">{{ p.summary }}</span>
37
- <span v-if="p.more" class="oc-product-card__more">{{ p.more }}</span>
38
- </span>
39
- </a>
40
- </div>
41
- </div>
42
- </section>
43
- </template>
1
+ <script setup lang="ts">
2
+ /**
3
+ * Portfolio grid: project cards with a browser frame around the screenshot.
4
+ * `background` is any CSS background (use Omnia tokens, e.g. linear-gradient(135deg, var(--color-green-40), var(--color-teal-80))); `image` shows an img.
5
+ * Classes: .oc-card-grid, .oc-product-card, .oc-browser-frame(__bar/__body), .oc-pill--accent
6
+ */
7
+ export interface ShowcaseProject {
8
+ name: string
9
+ summary?: string
10
+ tag?: string
11
+ accent?: string
12
+ href?: string
13
+ background?: string
14
+ image?: string
15
+ more?: string
16
+ }
17
+ defineProps<{ eyebrow?: string; title?: string; highlight?: string; projects: ShowcaseProject[] }>()
18
+ </script>
19
+
20
+ <template>
21
+ <section class="oc-section-pad">
22
+ <div class="oc-container">
23
+ <p v-if="eyebrow" class="oc-eyebrow">{{ eyebrow }}</p>
24
+ <h2 class="oc-display oc-display--md">{{ title }} <span v-if="highlight" class="oc-text-gradient">{{ highlight }}</span></h2>
25
+ <div class="oc-card-grid" style="--oc-card-min: 26rem">
26
+ <a v-for="p in projects" :key="p.name" :class="['oc-product-card', p.accent && `oc-accent--${p.accent}`, 'p-0 overflow-hidden']" :href="p.href ?? '#'">
27
+ <span class="oc-browser-frame m-1">
28
+ <span class="oc-browser-frame__bar"><i></i><i></i><i></i></span>
29
+ <span class="oc-browser-frame__body" :style="p.background ? { background: p.background } : undefined">
30
+ <img v-if="p.image" :src="p.image" alt="" />
31
+ </span>
32
+ </span>
33
+ <span class="grid gap-0.5 p-1.5 pt-0">
34
+ <span v-if="p.tag" class="oc-pill oc-pill--accent">{{ p.tag }}</span>
35
+ <span class="oc-product-card__name">{{ p.name }}</span>
36
+ <span v-if="p.summary" class="oc-product-card__summary">{{ p.summary }}</span>
37
+ <span v-if="p.more" class="oc-product-card__more">{{ p.more }}</span>
38
+ </span>
39
+ </a>
40
+ </div>
41
+ </div>
42
+ </section>
43
+ </template>