@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
package/package.json
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@birdycom/omniaui-vue",
|
|
3
|
-
"version": "0.11.
|
|
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": "^
|
|
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
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@birdycom/omniaui-vue",
|
|
3
|
+
"version": "0.11.2",
|
|
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": "^5.0.5",
|
|
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
|
+
}
|
|
@@ -1,44 +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>
|
|
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>
|
|
@@ -1,36 +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>
|
|
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>
|
|
@@ -1,29 +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>
|
|
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>
|
|
@@ -1,24 +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>
|
|
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>
|
|
@@ -1,47 +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>
|
|
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>
|
|
@@ -1,53 +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>
|
|
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>
|
|
@@ -1,12 +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>
|
|
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>
|