@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.
- package/LICENSE +21 -21
- package/README.md +49 -49
- package/dist/omniaui-vue.js.map +1 -1
- package/package.json +69 -69
- package/src/blocks/OcBlockAboutTimeline.vue +44 -44
- package/src/blocks/OcBlockAppHeader.vue +36 -36
- package/src/blocks/OcBlockAppShell.vue +29 -29
- package/src/blocks/OcBlockAuth.vue +24 -24
- package/src/blocks/OcBlockAuthSplit.vue +47 -47
- package/src/blocks/OcBlockContactGrid.vue +53 -53
- package/src/blocks/OcBlockCta.vue +12 -12
- package/src/blocks/OcBlockDataTable.vue +27 -27
- package/src/blocks/OcBlockFaq.vue +49 -49
- package/src/blocks/OcBlockFeatures.vue +23 -23
- package/src/blocks/OcBlockFooter.vue +25 -25
- package/src/blocks/OcBlockFormPage.vue +24 -24
- package/src/blocks/OcBlockHero.vue +13 -13
- package/src/blocks/OcBlockHeroCode.vue +42 -42
- package/src/blocks/OcBlockHeroOrbit.vue +69 -69
- package/src/blocks/OcBlockHeroSplit.vue +15 -15
- package/src/blocks/OcBlockModuleHeader.vue +21 -21
- package/src/blocks/OcBlockPageHero.vue +13 -13
- package/src/blocks/OcBlockPortfolioGrid.vue +63 -63
- package/src/blocks/OcBlockPricing.vue +39 -39
- package/src/blocks/OcBlockProcess.vue +39 -39
- package/src/blocks/OcBlockProductGrid.vue +41 -41
- package/src/blocks/OcBlockProfileHeader.vue +50 -50
- package/src/blocks/OcBlockShowcase.vue +43 -43
- package/src/blocks/OcBlockSiteFooter.vue +54 -54
- package/src/blocks/OcBlockSiteHeader.vue +34 -34
- package/src/blocks/OcBlockSpotlight.vue +47 -47
- package/src/blocks/OcBlockStats.vue +17 -17
- package/src/blocks/OcBlockStatsCounter.vue +20 -20
- package/src/blocks/OcBlockTeamList.vue +53 -53
- package/src/blocks/OcBlockTwoFactor.vue +61 -61
- package/src/blocks/OcBlockWizardDialog.vue +67 -67
- package/src/components/OcAccordion.vue +12 -12
- package/src/components/OcAccordionAccent.vue +27 -27
- package/src/components/OcAccordionItem.vue +19 -19
- package/src/components/OcAffixInput.vue +40 -40
- package/src/components/OcAlert.vue +17 -17
- package/src/components/OcAlertDialog.vue +66 -66
- package/src/components/OcAlphaTabs.vue +54 -54
- package/src/components/OcAspectRatio.vue +21 -21
- package/src/components/OcAttachment.vue +59 -59
- package/src/components/OcAttachmentImage.vue +13 -13
- package/src/components/OcAttachmentList.vue +31 -31
- package/src/components/OcAttachmentThumb.vue +14 -14
- package/src/components/OcAvatar.vue +18 -18
- package/src/components/OcAvatarGroup.vue +7 -7
- package/src/components/OcBackLink.vue +8 -8
- package/src/components/OcBadge.vue +13 -13
- package/src/components/OcBarcodeInput.vue +51 -51
- package/src/components/OcBreadcrumb.vue +22 -22
- package/src/components/OcBrowserFrame.vue +33 -33
- package/src/components/OcBusyOverlay.vue +32 -32
- package/src/components/OcButton.vue +47 -47
- package/src/components/OcButtonGroup.vue +10 -10
- package/src/components/OcButtonGroupText.vue +7 -7
- package/src/components/OcCard.vue +20 -20
- package/src/components/OcChartLine.vue +80 -80
- package/src/components/OcChatComposer.vue +42 -42
- package/src/components/OcCheckbox.vue +26 -26
- package/src/components/OcChecklist.vue +29 -29
- package/src/components/OcCollapsible.vue +19 -19
- package/src/components/OcColorField.vue +15 -15
- package/src/components/OcColorSelect.vue +33 -33
- package/src/components/OcColumnMenu.vue +50 -50
- package/src/components/OcCommand.vue +119 -119
- package/src/components/OcConfirmDialog.vue +65 -65
- package/src/components/OcCookieConsent.vue +119 -119
- package/src/components/OcCopyField.vue +37 -37
- package/src/components/OcCounter.vue +15 -15
- package/src/components/OcDataTable.vue +144 -144
- package/src/components/OcDefinitionList.vue +35 -35
- package/src/components/OcDropdown.vue +23 -23
- package/src/components/OcDropdownItem.vue +9 -9
- package/src/components/OcDropdownLabel.vue +7 -7
- package/src/components/OcDropdownSeparator.vue +7 -7
- package/src/components/OcDropzone.vue +36 -36
- package/src/components/OcEmojiPicker.vue +45 -45
- package/src/components/OcEmptyState.vue +13 -13
- package/src/components/OcEntityCard.vue +47 -47
- package/src/components/OcFactList.vue +37 -37
- package/src/components/OcFilterCounts.vue +38 -38
- package/src/components/OcFlipCard.vue +36 -36
- package/src/components/OcFormField.vue +36 -36
- package/src/components/OcGreeting.vue +52 -52
- package/src/components/OcHeading.vue +19 -19
- package/src/components/OcHoverCard.vue +25 -25
- package/src/components/OcImageZoom.vue +39 -39
- package/src/components/OcInput.vue +9 -9
- package/src/components/OcInputGroup.vue +12 -12
- package/src/components/OcItem.vue +40 -40
- package/src/components/OcItemGroup.vue +7 -7
- package/src/components/OcItemSeparator.vue +7 -7
- package/src/components/OcKbd.vue +7 -7
- package/src/components/OcKbdGroup.vue +15 -15
- package/src/components/OcLabel.vue +10 -10
- package/src/components/OcLanguageSelect.vue +40 -40
- package/src/components/OcLauncherCard.vue +34 -34
- package/src/components/OcLightbox.vue +63 -63
- package/src/components/OcLinkArrow.vue +25 -25
- package/src/components/OcListToolbar.vue +44 -44
- package/src/components/OcMarquee.vue +36 -36
- package/src/components/OcMediaCard.vue +28 -28
- package/src/components/OcMediaRow.vue +28 -28
- package/src/components/OcMediaThumb.vue +38 -38
- package/src/components/OcMessage.vue +91 -91
- package/src/components/OcMessageList.vue +43 -43
- package/src/components/OcMessageThread.vue +155 -155
- package/src/components/OcModal.vue +42 -42
- package/src/components/OcNavmenu.vue +18 -18
- package/src/components/OcNavmenuList.vue +38 -38
- package/src/components/OcNextTeaser.vue +25 -25
- package/src/components/OcNumberInput.vue +47 -47
- package/src/components/OcOtpInput.vue +34 -34
- package/src/components/OcPageHeader.vue +34 -34
- package/src/components/OcPagination.vue +33 -33
- package/src/components/OcPasswordInput.vue +27 -27
- package/src/components/OcPasswordRequirements.vue +28 -28
- package/src/components/OcPhoneInput.vue +72 -72
- package/src/components/OcPopover.vue +25 -25
- package/src/components/OcPriceCard.vue +69 -69
- package/src/components/OcProductMark.vue +31 -31
- package/src/components/OcProgress.vue +21 -21
- package/src/components/OcProjectCard.vue +36 -36
- package/src/components/OcProse.vue +57 -57
- package/src/components/OcRadio.vue +40 -40
- package/src/components/OcRadioGroup.vue +32 -32
- package/src/components/OcRecoveryCodes.vue +55 -55
- package/src/components/OcScrollArea.vue +15 -15
- package/src/components/OcSegmented.vue +28 -28
- package/src/components/OcSelect.vue +21 -21
- package/src/components/OcSeparator.vue +18 -18
- package/src/components/OcSeverityCard.vue +46 -46
- package/src/components/OcSheet.vue +49 -49
- package/src/components/OcSidebarCollapsible.vue +19 -19
- package/src/components/OcSidebarGroup.vue +11 -11
- package/src/components/OcSidebarMenu.vue +7 -7
- package/src/components/OcSidebarMenuButton.vue +31 -31
- package/src/components/OcSidebarSeparator.vue +7 -7
- package/src/components/OcSkeleton.vue +8 -8
- package/src/components/OcSlider.vue +27 -27
- package/src/components/OcSortableRow.vue +40 -40
- package/src/components/OcSpinner.vue +13 -13
- package/src/components/OcStackCard.vue +24 -24
- package/src/components/OcStackList.vue +31 -31
- package/src/components/OcStatCard.vue +39 -39
- package/src/components/OcStepper.vue +34 -34
- package/src/components/OcSwitch.vue +15 -15
- package/src/components/OcTable.vue +115 -115
- package/src/components/OcTableActions.vue +26 -26
- package/src/components/OcTableCompact.vue +46 -46
- package/src/components/OcTabs.vue +37 -37
- package/src/components/OcTagInput.vue +50 -50
- package/src/components/OcTerminalLog.vue +50 -50
- package/src/components/OcTextarea.vue +9 -9
- package/src/components/OcThemeSwitch.vue +31 -31
- package/src/components/OcTimeInput.vue +50 -50
- package/src/components/OcTimeline.vue +36 -36
- package/src/components/OcToast.vue +31 -31
- package/src/components/OcToastContainer.vue +21 -21
- package/src/components/OcToggle.vue +63 -63
- package/src/components/OcToggleField.vue +28 -28
- package/src/components/OcToggleGroup.vue +40 -40
- package/src/components/OcTooltip.vue +8 -8
- package/src/components/OcTopProgress.vue +54 -54
- package/src/components/OcTree.vue +70 -70
- package/src/components/OcUpgradeBanner.vue +42 -42
- package/src/components/OcUser.vue +25 -25
- package/src/components/OcVersionBanner.vue +34 -34
- package/src/composables/chartLine.ts +28 -28
- package/src/composables/keys.ts +22 -22
- package/src/composables/useAttrsSplit.ts +16 -16
- package/src/composables/useDialog.ts +21 -21
- package/src/composables/useToast.ts +66 -66
- 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>
|