iryx-ui 0.18.5 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/component-names.d.ts +8 -0
- package/dist/component-names.js +10 -2
- package/dist/marketing/BrowserFrame.js +5 -0
- package/dist/marketing/BrowserFrame.vue.d.ts +40 -0
- package/dist/marketing/BrowserFrame.vue_vue_type_script_setup_true_lang.js +57 -0
- package/dist/marketing/FeatureCard.js +5 -0
- package/dist/marketing/FeatureCard.vue.d.ts +40 -0
- package/dist/marketing/FeatureCard.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/marketing/Hero.js +5 -0
- package/dist/marketing/Hero.vue.d.ts +64 -0
- package/dist/marketing/Hero.vue_vue_type_script_setup_true_lang.js +94 -0
- package/dist/marketing/PricingCard.js +5 -0
- package/dist/marketing/PricingCard.vue.d.ts +70 -0
- package/dist/marketing/PricingCard.vue_vue_type_script_setup_true_lang.js +94 -0
- package/dist/marketing/PricingTable.js +5 -0
- package/dist/marketing/PricingTable.vue.d.ts +41 -0
- package/dist/marketing/PricingTable.vue_vue_type_script_setup_true_lang.js +57 -0
- package/dist/marketing/Section.js +5 -0
- package/dist/marketing/Section.vue.d.ts +53 -0
- package/dist/marketing/Section.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/marketing/TestimonialCard.js +5 -0
- package/dist/marketing/TestimonialCard.vue.d.ts +41 -0
- package/dist/marketing/TestimonialCard.vue_vue_type_script_setup_true_lang.js +61 -0
- package/dist/marketing/index.d.ts +7 -0
- package/dist/marketing/index.js +20 -0
- package/dist/marketing.d.ts +30 -0
- package/dist/marketing.js +9 -0
- package/dist/nuxt.d.ts +5 -0
- package/dist/nuxt.js +19 -13
- package/dist/plugin.d.ts +6 -1
- package/dist/plugin.js +3 -2
- package/dist/theme/accordion.js +1 -1
- package/dist/theme/alert.js +1 -1
- package/dist/theme/app-shell.js +1 -1
- package/dist/theme/banner.js +1 -1
- package/dist/theme/breadcrumb.js +1 -1
- package/dist/theme/browser-frame.d.ts +59 -0
- package/dist/theme/browser-frame.js +20 -0
- package/dist/theme/calendar.js +2 -2
- package/dist/theme/checkbox.js +1 -1
- package/dist/theme/collapsible.js +1 -1
- package/dist/theme/color-picker.js +2 -2
- package/dist/theme/combobox.js +2 -2
- package/dist/theme/date-picker.js +1 -1
- package/dist/theme/dialog.js +1 -1
- package/dist/theme/drawer.js +1 -1
- package/dist/theme/editable.js +1 -1
- package/dist/theme/feature-card.d.ts +41 -0
- package/dist/theme/feature-card.js +20 -0
- package/dist/theme/file-upload.js +1 -1
- package/dist/theme/hero.d.ts +98 -0
- package/dist/theme/hero.js +45 -0
- package/dist/theme/input.d.ts +2 -2
- package/dist/theme/input.js +2 -2
- package/dist/theme/menubar.js +1 -1
- package/dist/theme/navigation-menu.js +1 -1
- package/dist/theme/password-input.js +1 -1
- package/dist/theme/pin-input.js +1 -1
- package/dist/theme/popover.js +1 -1
- package/dist/theme/pricing-card.d.ts +62 -0
- package/dist/theme/pricing-card.js +23 -0
- package/dist/theme/radio-group.js +1 -1
- package/dist/theme/section.d.ts +140 -0
- package/dist/theme/section.js +48 -0
- package/dist/theme/sidebar.js +1 -1
- package/dist/theme/signature-pad.js +1 -1
- package/dist/theme/stepper.js +1 -1
- package/dist/theme/switch.js +1 -1
- package/dist/theme/table.js +2 -2
- package/dist/theme/tabs.js +1 -1
- package/dist/theme/tags-input.js +2 -2
- package/dist/theme/testimonial-card.d.ts +53 -0
- package/dist/theme/testimonial-card.js +20 -0
- package/dist/theme/toast.js +2 -2
- package/dist/theme/tree.js +1 -1
- package/package.json +5 -1
- package/theme.css +172 -0
package/README.md
CHANGED
|
@@ -71,6 +71,43 @@ Components are auto-imported with the `I` prefix.
|
|
|
71
71
|
</template>
|
|
72
72
|
```
|
|
73
73
|
|
|
74
|
+
## Blocks
|
|
75
|
+
|
|
76
|
+
Whole page sections — a hero, a banded section, a framed screenshot — on their own
|
|
77
|
+
import path, so an app that never uses them never carries them:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { createIryxUi } from 'iryx-ui'
|
|
81
|
+
import { marketingComponents } from 'iryx-ui/marketing'
|
|
82
|
+
|
|
83
|
+
app.use(createIryxUi({ components: marketingComponents }))
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
In Nuxt, the module auto-imports them once `blocks` is on:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
export default defineNuxtConfig({
|
|
90
|
+
modules: ['iryx-ui/nuxt'],
|
|
91
|
+
iryxUi: { blocks: true },
|
|
92
|
+
})
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```vue
|
|
96
|
+
<IHero grid heading="Invoicing that chases the money for you">
|
|
97
|
+
<template #actions>
|
|
98
|
+
<IButton size="lg">Start free</IButton>
|
|
99
|
+
</template>
|
|
100
|
+
</IHero>
|
|
101
|
+
|
|
102
|
+
<ISection tone="muted" bordered heading="Everything the money side needs">
|
|
103
|
+
<!-- … -->
|
|
104
|
+
</ISection>
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Seven so far: `IHero`, `ISection`, `IPricingTable`, `IPricingCard`, `IFeatureCard`,
|
|
108
|
+
`ITestimonialCard` and `IBrowserFrame`. Importing the subpath also declares
|
|
109
|
+
them on Vue's `GlobalComponents`; a project that never imports it is untouched.
|
|
110
|
+
|
|
74
111
|
## Three ways to take the styling back
|
|
75
112
|
|
|
76
113
|
```vue
|
|
@@ -5,3 +5,11 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export declare const componentNames: readonly ["Accordion", "Alert", "App", "AppShell", "AspectRatio", "AuthProviders", "Avatar", "AvatarGroup", "Badge", "BarChart", "Banner", "Breadcrumb", "Button", "ButtonGroup", "Calendar", "Card", "ChartLegend", "Checkbox", "ColorPicker", "Combobox", "Collapsible", "CommandPalette", "Container", "ConfirmDialog", "ContextMenu", "DateField", "DatePicker", "DateRangePicker", "Dialog", "DonutChart", "Drawer", "DropdownMenu", "Editable", "EmptyState", "FileUpload", "Form", "FormField", "HoverCard", "Icon", "Input", "Kbd", "Label", "LineChart", "NavigationMenu", "NumberInput", "Menubar", "PageHeader", "Pagination", "PasswordInput", "PinInput", "Popover", "Progress", "RadioGroup", "ScrollArea", "ScrollFade", "Select", "Separator", "Sidebar", "SignaturePad", "Skeleton", "Slider", "Sparkline", "Splitter", "Stat", "Stepper", "Switch", "Table", "Tabs", "TagsInput", "Textarea", "Toaster", "Toggle", "ToggleGroup", "TimeField", "Timeline", "Toolbar", "Tooltip", "Tree"];
|
|
7
7
|
export type ComponentName = (typeof componentNames)[number];
|
|
8
|
+
/**
|
|
9
|
+
* Names of every block exported from `iryx-ui/marketing`.
|
|
10
|
+
* A list of strings rather than the modules themselves, because the Nuxt module
|
|
11
|
+
* runs at build time and must not pull `.vue` files into Node.
|
|
12
|
+
* Keep in sync with `src/marketing/index.ts`.
|
|
13
|
+
*/
|
|
14
|
+
export declare const marketingComponentNames: readonly ["BrowserFrame", "FeatureCard", "Hero", "PricingCard", "PricingTable", "Section", "TestimonialCard"];
|
|
15
|
+
export type MarketingComponentName = (typeof marketingComponentNames)[number];
|
package/dist/component-names.js
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
//#region src/component-names.ts
|
|
2
|
-
var e = /* @__PURE__ */ "Accordion.Alert.App.AppShell.AspectRatio.AuthProviders.Avatar.AvatarGroup.Badge.BarChart.Banner.Breadcrumb.Button.ButtonGroup.Calendar.Card.ChartLegend.Checkbox.ColorPicker.Combobox.Collapsible.CommandPalette.Container.ConfirmDialog.ContextMenu.DateField.DatePicker.DateRangePicker.Dialog.DonutChart.Drawer.DropdownMenu.Editable.EmptyState.FileUpload.Form.FormField.HoverCard.Icon.Input.Kbd.Label.LineChart.NavigationMenu.NumberInput.Menubar.PageHeader.Pagination.PasswordInput.PinInput.Popover.Progress.RadioGroup.ScrollArea.ScrollFade.Select.Separator.Sidebar.SignaturePad.Skeleton.Slider.Sparkline.Splitter.Stat.Stepper.Switch.Table.Tabs.TagsInput.Textarea.Toaster.Toggle.ToggleGroup.TimeField.Timeline.Toolbar.Tooltip.Tree".split(".")
|
|
2
|
+
var e = /* @__PURE__ */ "Accordion.Alert.App.AppShell.AspectRatio.AuthProviders.Avatar.AvatarGroup.Badge.BarChart.Banner.Breadcrumb.Button.ButtonGroup.Calendar.Card.ChartLegend.Checkbox.ColorPicker.Combobox.Collapsible.CommandPalette.Container.ConfirmDialog.ContextMenu.DateField.DatePicker.DateRangePicker.Dialog.DonutChart.Drawer.DropdownMenu.Editable.EmptyState.FileUpload.Form.FormField.HoverCard.Icon.Input.Kbd.Label.LineChart.NavigationMenu.NumberInput.Menubar.PageHeader.Pagination.PasswordInput.PinInput.Popover.Progress.RadioGroup.ScrollArea.ScrollFade.Select.Separator.Sidebar.SignaturePad.Skeleton.Slider.Sparkline.Splitter.Stat.Stepper.Switch.Table.Tabs.TagsInput.Textarea.Toaster.Toggle.ToggleGroup.TimeField.Timeline.Toolbar.Tooltip.Tree".split("."), t = [
|
|
3
|
+
"BrowserFrame",
|
|
4
|
+
"FeatureCard",
|
|
5
|
+
"Hero",
|
|
6
|
+
"PricingCard",
|
|
7
|
+
"PricingTable",
|
|
8
|
+
"Section",
|
|
9
|
+
"TestimonialCard"
|
|
10
|
+
];
|
|
3
11
|
//#endregion
|
|
4
|
-
export { e as componentNames };
|
|
12
|
+
export { e as componentNames, t as marketingComponentNames };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ClassValue } from '../class-value';
|
|
2
|
+
export interface BrowserFrameProps {
|
|
3
|
+
/** Address shown in the bar. Decorative — nothing is fetched. */
|
|
4
|
+
url?: string;
|
|
5
|
+
/**
|
|
6
|
+
* Hold the body at a fixed ratio, e.g. `16 / 10`. Leave it out when the
|
|
7
|
+
* content sizes itself, and set it when the content is an image that has
|
|
8
|
+
* not loaded yet — a reserved box is what stops the page jumping.
|
|
9
|
+
*/
|
|
10
|
+
ratio?: number;
|
|
11
|
+
shadow?: 'none' | 'sm' | 'md' | 'lg';
|
|
12
|
+
/** Skip built-in classes; you take over styling entirely. */
|
|
13
|
+
unstyled?: boolean;
|
|
14
|
+
class?: ClassValue;
|
|
15
|
+
/** Override classes per slot, e.g. `{ bar: 'py-2' }`. */
|
|
16
|
+
ui?: {
|
|
17
|
+
root?: string;
|
|
18
|
+
bar?: string;
|
|
19
|
+
dot?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
body?: string;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
declare var __VLS_14: {}, __VLS_16: {};
|
|
25
|
+
type __VLS_Slots = {} & {
|
|
26
|
+
default?: (props: typeof __VLS_14) => any;
|
|
27
|
+
} & {
|
|
28
|
+
default?: (props: typeof __VLS_16) => any;
|
|
29
|
+
};
|
|
30
|
+
declare const __VLS_base: import("vue").DefineComponent<BrowserFrameProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<BrowserFrameProps> & Readonly<{}>, {
|
|
31
|
+
unstyled: boolean;
|
|
32
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
34
|
+
declare const _default: typeof __VLS_export;
|
|
35
|
+
export default _default;
|
|
36
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
37
|
+
new (): {
|
|
38
|
+
$slots: S;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useIryxUiConfig as e } from "../config.js";
|
|
2
|
+
import t from "../components/AspectRatio.js";
|
|
3
|
+
import n from "../components/Card.js";
|
|
4
|
+
import { browserFrameTheme as r } from "../theme/browser-frame.js";
|
|
5
|
+
import { Fragment as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, renderList as p, renderSlot as m, toDisplayString as h, withCtx as g } from "vue";
|
|
6
|
+
//#region src/marketing/BrowserFrame.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var _ = /*@__PURE__*/ u({
|
|
8
|
+
__name: "BrowserFrame",
|
|
9
|
+
props: {
|
|
10
|
+
url: {},
|
|
11
|
+
ratio: {},
|
|
12
|
+
shadow: {},
|
|
13
|
+
unstyled: {
|
|
14
|
+
type: Boolean,
|
|
15
|
+
default: void 0
|
|
16
|
+
},
|
|
17
|
+
class: { type: [
|
|
18
|
+
String,
|
|
19
|
+
Boolean,
|
|
20
|
+
null,
|
|
21
|
+
Array
|
|
22
|
+
] },
|
|
23
|
+
ui: {}
|
|
24
|
+
},
|
|
25
|
+
setup(u) {
|
|
26
|
+
let _ = u, v = e(), y = a(() => _.unstyled ?? v.unstyled), b = a(() => r({ shadow: _.shadow }));
|
|
27
|
+
function x(e, t) {
|
|
28
|
+
return y.value ? [_.ui?.[e], t] : b.value[e]({ class: [_.ui?.[e], t] });
|
|
29
|
+
}
|
|
30
|
+
return (e, r) => (f(), o(n, {
|
|
31
|
+
padding: "none",
|
|
32
|
+
unstyled: _.unstyled,
|
|
33
|
+
class: d(x("root", _.class))
|
|
34
|
+
}, {
|
|
35
|
+
default: g(() => [l("div", { class: d(x("bar")) }, [(f(), c(i, null, p(3, (e) => l("span", {
|
|
36
|
+
key: e,
|
|
37
|
+
class: d(x("dot"))
|
|
38
|
+
}, null, 2)), 64)), _.url ? (f(), c("span", {
|
|
39
|
+
key: 0,
|
|
40
|
+
class: d(x("url"))
|
|
41
|
+
}, h(_.url), 3)) : s("", !0)], 2), _.ratio ? (f(), o(t, {
|
|
42
|
+
key: 0,
|
|
43
|
+
ratio: _.ratio,
|
|
44
|
+
class: d(["rounded-t-none", [_.ui?.body]])
|
|
45
|
+
}, {
|
|
46
|
+
default: g(() => [m(e.$slots, "default")]),
|
|
47
|
+
_: 3
|
|
48
|
+
}, 8, ["ratio", "class"])) : (f(), c("div", {
|
|
49
|
+
key: 1,
|
|
50
|
+
class: d(x("body"))
|
|
51
|
+
}, [m(e.$slots, "default")], 2))]),
|
|
52
|
+
_: 3
|
|
53
|
+
}, 8, ["unstyled", "class"]));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
//#endregion
|
|
57
|
+
export { _ as default };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ClassValue } from '../class-value';
|
|
2
|
+
import type { IconLike } from '../composables/icon';
|
|
3
|
+
export interface FeatureCardProps {
|
|
4
|
+
/** A Hugeicons export, or any component that renders an SVG. */
|
|
5
|
+
icon?: IconLike;
|
|
6
|
+
title?: string;
|
|
7
|
+
description?: string;
|
|
8
|
+
align?: 'start' | 'center';
|
|
9
|
+
/** Skip built-in classes; you take over styling entirely. */
|
|
10
|
+
unstyled?: boolean;
|
|
11
|
+
class?: ClassValue;
|
|
12
|
+
/** Override classes per slot, e.g. `{ icon: 'bg-success/10' }`. */
|
|
13
|
+
ui?: {
|
|
14
|
+
root?: string;
|
|
15
|
+
icon?: string;
|
|
16
|
+
title?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
declare var __VLS_8: {}, __VLS_15: {}, __VLS_17: {}, __VLS_19: {};
|
|
21
|
+
type __VLS_Slots = {} & {
|
|
22
|
+
icon?: (props: typeof __VLS_8) => any;
|
|
23
|
+
} & {
|
|
24
|
+
title?: (props: typeof __VLS_15) => any;
|
|
25
|
+
} & {
|
|
26
|
+
description?: (props: typeof __VLS_17) => any;
|
|
27
|
+
} & {
|
|
28
|
+
default?: (props: typeof __VLS_19) => any;
|
|
29
|
+
};
|
|
30
|
+
declare const __VLS_base: import("vue").DefineComponent<FeatureCardProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<FeatureCardProps> & Readonly<{}>, {
|
|
31
|
+
unstyled: boolean;
|
|
32
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
33
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
34
|
+
declare const _default: typeof __VLS_export;
|
|
35
|
+
export default _default;
|
|
36
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
37
|
+
new (): {
|
|
38
|
+
$slots: S;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { useIryxUiConfig as e } from "../config.js";
|
|
2
|
+
import t from "../components/Icon.js";
|
|
3
|
+
import n from "../components/Card.js";
|
|
4
|
+
import { featureCardTheme as r } from "../theme/feature-card.js";
|
|
5
|
+
import { computed as i, createBlock as a, createCommentVNode as o, createElementBlock as s, createTextVNode as c, createVNode as l, defineComponent as u, normalizeClass as d, openBlock as f, renderSlot as p, toDisplayString as m, unref as h, useSlots as g, withCtx as _ } from "vue";
|
|
6
|
+
//#region src/marketing/FeatureCard.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var v = /*@__PURE__*/ u({
|
|
8
|
+
__name: "FeatureCard",
|
|
9
|
+
props: {
|
|
10
|
+
icon: {},
|
|
11
|
+
title: {},
|
|
12
|
+
description: {},
|
|
13
|
+
align: {},
|
|
14
|
+
unstyled: {
|
|
15
|
+
type: Boolean,
|
|
16
|
+
default: void 0
|
|
17
|
+
},
|
|
18
|
+
class: { type: [
|
|
19
|
+
String,
|
|
20
|
+
Boolean,
|
|
21
|
+
null,
|
|
22
|
+
Array
|
|
23
|
+
] },
|
|
24
|
+
ui: {}
|
|
25
|
+
},
|
|
26
|
+
setup(u) {
|
|
27
|
+
let v = u, y = g(), b = e(), x = i(() => v.unstyled ?? b.unstyled), S = i(() => r({ align: v.align }));
|
|
28
|
+
function C(e, t) {
|
|
29
|
+
return x.value ? [v.ui?.[e], t] : S.value[e]({ class: [v.ui?.[e], t] });
|
|
30
|
+
}
|
|
31
|
+
return (e, r) => (f(), a(n, {
|
|
32
|
+
unstyled: v.unstyled,
|
|
33
|
+
class: d(C("root", v.class))
|
|
34
|
+
}, {
|
|
35
|
+
default: _(() => [
|
|
36
|
+
v.icon || h(y).icon ? (f(), s("div", {
|
|
37
|
+
key: 0,
|
|
38
|
+
class: d(C("icon"))
|
|
39
|
+
}, [p(e.$slots, "icon", {}, () => [l(t, { icon: v.icon }, null, 8, ["icon"])])], 2)) : o("", !0),
|
|
40
|
+
v.title || h(y).title ? (f(), s("h3", {
|
|
41
|
+
key: 1,
|
|
42
|
+
class: d(C("title"))
|
|
43
|
+
}, [p(e.$slots, "title", {}, () => [c(m(v.title), 1)])], 2)) : o("", !0),
|
|
44
|
+
v.description || h(y).description ? (f(), s("p", {
|
|
45
|
+
key: 2,
|
|
46
|
+
class: d(C("description"))
|
|
47
|
+
}, [p(e.$slots, "description", {}, () => [c(m(v.description), 1)])], 2)) : o("", !0),
|
|
48
|
+
p(e.$slots, "default")
|
|
49
|
+
]),
|
|
50
|
+
_: 3
|
|
51
|
+
}, 8, ["unstyled", "class"]));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
//#endregion
|
|
55
|
+
export { v as default };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { ClassValue } from '../class-value';
|
|
2
|
+
export interface HeroProps {
|
|
3
|
+
/** Render as a different element or component. */
|
|
4
|
+
as?: string;
|
|
5
|
+
heading?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
/** Line under the calls to action, e.g. pricing small print. */
|
|
8
|
+
note?: string;
|
|
9
|
+
/**
|
|
10
|
+
* The moving wash behind the content. `aurora` turns, `bloom` drifts; both
|
|
11
|
+
* stop under `prefers-reduced-motion`.
|
|
12
|
+
*/
|
|
13
|
+
backdrop?: 'none' | 'aurora' | 'bloom';
|
|
14
|
+
/** Faint ruled grid over the backdrop. */
|
|
15
|
+
grid?: boolean;
|
|
16
|
+
align?: 'start' | 'center';
|
|
17
|
+
/** Vertical rhythm. `none` leaves it to you. */
|
|
18
|
+
padding?: 'none' | 'sm' | 'md' | 'lg';
|
|
19
|
+
/** Maximum content width, passed to the container. */
|
|
20
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | 'full';
|
|
21
|
+
/** Skip built-in classes; you take over styling entirely. */
|
|
22
|
+
unstyled?: boolean;
|
|
23
|
+
class?: ClassValue;
|
|
24
|
+
/** Override classes per slot, e.g. `{ heading: 'text-7xl' }`. */
|
|
25
|
+
ui?: {
|
|
26
|
+
root?: string;
|
|
27
|
+
container?: string;
|
|
28
|
+
badge?: string;
|
|
29
|
+
heading?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
actions?: string;
|
|
32
|
+
note?: string;
|
|
33
|
+
media?: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
declare var __VLS_14: {}, __VLS_16: {}, __VLS_18: {}, __VLS_20: {}, __VLS_22: {}, __VLS_24: {}, __VLS_26: {};
|
|
37
|
+
type __VLS_Slots = {} & {
|
|
38
|
+
badge?: (props: typeof __VLS_14) => any;
|
|
39
|
+
} & {
|
|
40
|
+
heading?: (props: typeof __VLS_16) => any;
|
|
41
|
+
} & {
|
|
42
|
+
description?: (props: typeof __VLS_18) => any;
|
|
43
|
+
} & {
|
|
44
|
+
actions?: (props: typeof __VLS_20) => any;
|
|
45
|
+
} & {
|
|
46
|
+
note?: (props: typeof __VLS_22) => any;
|
|
47
|
+
} & {
|
|
48
|
+
media?: (props: typeof __VLS_24) => any;
|
|
49
|
+
} & {
|
|
50
|
+
default?: (props: typeof __VLS_26) => any;
|
|
51
|
+
};
|
|
52
|
+
declare const __VLS_base: import("vue").DefineComponent<HeroProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<HeroProps> & Readonly<{}>, {
|
|
53
|
+
unstyled: boolean;
|
|
54
|
+
as: string;
|
|
55
|
+
backdrop: "none" | "aurora" | "bloom";
|
|
56
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
57
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
58
|
+
declare const _default: typeof __VLS_export;
|
|
59
|
+
export default _default;
|
|
60
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
61
|
+
new (): {
|
|
62
|
+
$slots: S;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useIryxUiConfig as e } from "../config.js";
|
|
2
|
+
import t from "../components/Container.js";
|
|
3
|
+
import { heroTheme as n } from "../theme/hero.js";
|
|
4
|
+
import { computed as r, createBlock as i, createCommentVNode as a, createElementBlock as o, createTextVNode as s, createVNode as c, defineComponent as l, normalizeClass as u, openBlock as d, renderSlot as f, toDisplayString as p, unref as m, useSlots as h, withCtx as g } from "vue";
|
|
5
|
+
import { Primitive as _ } from "reka-ui";
|
|
6
|
+
//#region src/marketing/Hero.vue?vue&type=script&setup=true&lang.ts
|
|
7
|
+
var v = {
|
|
8
|
+
key: 1,
|
|
9
|
+
class: "iryx-hero-grid",
|
|
10
|
+
"aria-hidden": "true"
|
|
11
|
+
}, y = /*@__PURE__*/ l({
|
|
12
|
+
__name: "Hero",
|
|
13
|
+
props: {
|
|
14
|
+
as: { default: "section" },
|
|
15
|
+
heading: {},
|
|
16
|
+
description: {},
|
|
17
|
+
note: {},
|
|
18
|
+
backdrop: { default: "aurora" },
|
|
19
|
+
grid: { type: Boolean },
|
|
20
|
+
align: {},
|
|
21
|
+
padding: {},
|
|
22
|
+
size: {},
|
|
23
|
+
unstyled: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: void 0
|
|
26
|
+
},
|
|
27
|
+
class: { type: [
|
|
28
|
+
String,
|
|
29
|
+
Boolean,
|
|
30
|
+
null,
|
|
31
|
+
Array
|
|
32
|
+
] },
|
|
33
|
+
ui: {}
|
|
34
|
+
},
|
|
35
|
+
setup(l) {
|
|
36
|
+
let y = l, b = h(), x = e(), S = r(() => y.unstyled ?? x.unstyled), C = r(() => n({
|
|
37
|
+
align: y.align,
|
|
38
|
+
padding: y.padding
|
|
39
|
+
}));
|
|
40
|
+
function w(e, t) {
|
|
41
|
+
return S.value ? [y.ui?.[e], t] : C.value[e]({ class: [y.ui?.[e], t] });
|
|
42
|
+
}
|
|
43
|
+
let T = r(() => w("root", y.class));
|
|
44
|
+
return (e, n) => (d(), i(m(_), {
|
|
45
|
+
as: y.as,
|
|
46
|
+
class: u(T.value)
|
|
47
|
+
}, {
|
|
48
|
+
default: g(() => [
|
|
49
|
+
y.backdrop !== "none" && !S.value ? (d(), o("div", {
|
|
50
|
+
key: 0,
|
|
51
|
+
class: u(`iryx-hero-${y.backdrop}`),
|
|
52
|
+
"aria-hidden": "true"
|
|
53
|
+
}, null, 2)) : a("", !0),
|
|
54
|
+
y.grid && !S.value ? (d(), o("div", v)) : a("", !0),
|
|
55
|
+
c(t, {
|
|
56
|
+
size: y.size,
|
|
57
|
+
class: u(w("container"))
|
|
58
|
+
}, {
|
|
59
|
+
default: g(() => [
|
|
60
|
+
m(b).badge ? (d(), o("div", {
|
|
61
|
+
key: 0,
|
|
62
|
+
class: u(w("badge"))
|
|
63
|
+
}, [f(e.$slots, "badge")], 2)) : a("", !0),
|
|
64
|
+
y.heading || m(b).heading ? (d(), o("h1", {
|
|
65
|
+
key: 1,
|
|
66
|
+
class: u(w("heading"))
|
|
67
|
+
}, [f(e.$slots, "heading", {}, () => [s(p(y.heading), 1)])], 2)) : a("", !0),
|
|
68
|
+
y.description || m(b).description ? (d(), o("p", {
|
|
69
|
+
key: 2,
|
|
70
|
+
class: u(w("description"))
|
|
71
|
+
}, [f(e.$slots, "description", {}, () => [s(p(y.description), 1)])], 2)) : a("", !0),
|
|
72
|
+
m(b).actions ? (d(), o("div", {
|
|
73
|
+
key: 3,
|
|
74
|
+
class: u(w("actions"))
|
|
75
|
+
}, [f(e.$slots, "actions")], 2)) : a("", !0),
|
|
76
|
+
y.note || m(b).note ? (d(), o("p", {
|
|
77
|
+
key: 4,
|
|
78
|
+
class: u(w("note"))
|
|
79
|
+
}, [f(e.$slots, "note", {}, () => [s(p(y.note), 1)])], 2)) : a("", !0),
|
|
80
|
+
m(b).media ? (d(), o("div", {
|
|
81
|
+
key: 5,
|
|
82
|
+
class: u(w("media"))
|
|
83
|
+
}, [f(e.$slots, "media")], 2)) : a("", !0),
|
|
84
|
+
f(e.$slots, "default")
|
|
85
|
+
]),
|
|
86
|
+
_: 3
|
|
87
|
+
}, 8, ["size", "class"])
|
|
88
|
+
]),
|
|
89
|
+
_: 3
|
|
90
|
+
}, 8, ["as", "class"]));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
//#endregion
|
|
94
|
+
export { y as default };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ClassValue } from '../class-value';
|
|
2
|
+
export interface PricingCardProps {
|
|
3
|
+
name?: string;
|
|
4
|
+
/**
|
|
5
|
+
* The price, already formatted — `'€19'`, `'Free'`, `'Custom'`. A string
|
|
6
|
+
* rather than a number: the card never formats currency, because it does not
|
|
7
|
+
* know the locale and half the plans in the world do not name a figure.
|
|
8
|
+
*/
|
|
9
|
+
price?: string;
|
|
10
|
+
/** What the price is per, e.g. `'/ month'`. */
|
|
11
|
+
period?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
/** One line each. Every line gets a tick. */
|
|
14
|
+
features?: string[];
|
|
15
|
+
/** Label for the button. Leave out and no button renders. */
|
|
16
|
+
cta?: string;
|
|
17
|
+
/**
|
|
18
|
+
* The plan being pushed: a ring, a heavier shadow and a solid button. One
|
|
19
|
+
* card in a row should carry it.
|
|
20
|
+
*/
|
|
21
|
+
featured?: boolean;
|
|
22
|
+
/** Text of the badge shown on the featured card. */
|
|
23
|
+
badge?: string;
|
|
24
|
+
/** Skip built-in classes; you take over styling entirely. */
|
|
25
|
+
unstyled?: boolean;
|
|
26
|
+
class?: ClassValue;
|
|
27
|
+
/** Override classes per slot, e.g. `{ amount: 'text-5xl' }`. */
|
|
28
|
+
ui?: {
|
|
29
|
+
root?: string;
|
|
30
|
+
header?: string;
|
|
31
|
+
name?: string;
|
|
32
|
+
price?: string;
|
|
33
|
+
amount?: string;
|
|
34
|
+
period?: string;
|
|
35
|
+
description?: string;
|
|
36
|
+
features?: string;
|
|
37
|
+
feature?: string;
|
|
38
|
+
featureIcon?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
declare var __VLS_9: {}, __VLS_11: {}, __VLS_19: {}, __VLS_21: {}, __VLS_28: {}, __VLS_31: {};
|
|
42
|
+
type __VLS_Slots = {} & {
|
|
43
|
+
name?: (props: typeof __VLS_9) => any;
|
|
44
|
+
} & {
|
|
45
|
+
badge?: (props: typeof __VLS_11) => any;
|
|
46
|
+
} & {
|
|
47
|
+
price?: (props: typeof __VLS_19) => any;
|
|
48
|
+
} & {
|
|
49
|
+
description?: (props: typeof __VLS_21) => any;
|
|
50
|
+
} & {
|
|
51
|
+
default?: (props: typeof __VLS_28) => any;
|
|
52
|
+
} & {
|
|
53
|
+
footer?: (props: typeof __VLS_31) => any;
|
|
54
|
+
};
|
|
55
|
+
declare const __VLS_base: import("vue").DefineComponent<PricingCardProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
56
|
+
select: () => any;
|
|
57
|
+
}, string, import("vue").PublicProps, Readonly<PricingCardProps> & Readonly<{
|
|
58
|
+
onSelect?: (() => any) | undefined;
|
|
59
|
+
}>, {
|
|
60
|
+
unstyled: boolean;
|
|
61
|
+
badge: string;
|
|
62
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
63
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
64
|
+
declare const _default: typeof __VLS_export;
|
|
65
|
+
export default _default;
|
|
66
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
67
|
+
new (): {
|
|
68
|
+
$slots: S;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { useIryxUiConfig as e } from "../config.js";
|
|
2
|
+
import t from "../components/Icon.js";
|
|
3
|
+
import n from "../components/Button.js";
|
|
4
|
+
import r from "../components/Badge.js";
|
|
5
|
+
import i from "../components/Card.js";
|
|
6
|
+
import { pricingCardTheme as a } from "../theme/pricing-card.js";
|
|
7
|
+
import { Fragment as o, computed as s, createBlock as c, createCommentVNode as l, createElementBlock as u, createElementVNode as d, createSlots as f, createTextVNode as p, createVNode as m, defineComponent as h, normalizeClass as g, openBlock as _, renderList as v, renderSlot as y, toDisplayString as b, unref as x, useSlots as S, withCtx as C } from "vue";
|
|
8
|
+
import { Tick02Icon as w } from "@hugeicons/core-free-icons";
|
|
9
|
+
//#region src/marketing/PricingCard.vue?vue&type=script&setup=true&lang.ts
|
|
10
|
+
var T = /*@__PURE__*/ h({
|
|
11
|
+
__name: "PricingCard",
|
|
12
|
+
props: {
|
|
13
|
+
name: {},
|
|
14
|
+
price: {},
|
|
15
|
+
period: {},
|
|
16
|
+
description: {},
|
|
17
|
+
features: {},
|
|
18
|
+
cta: {},
|
|
19
|
+
featured: { type: Boolean },
|
|
20
|
+
badge: { default: "Most popular" },
|
|
21
|
+
unstyled: {
|
|
22
|
+
type: Boolean,
|
|
23
|
+
default: void 0
|
|
24
|
+
},
|
|
25
|
+
class: { type: [
|
|
26
|
+
String,
|
|
27
|
+
Boolean,
|
|
28
|
+
null,
|
|
29
|
+
Array
|
|
30
|
+
] },
|
|
31
|
+
ui: {}
|
|
32
|
+
},
|
|
33
|
+
emits: ["select"],
|
|
34
|
+
setup(h, { emit: T }) {
|
|
35
|
+
let E = h, D = T, O = S(), k = e(), A = s(() => E.unstyled ?? k.unstyled), j = s(() => a({ featured: E.featured }));
|
|
36
|
+
function M(e, t) {
|
|
37
|
+
return A.value ? [E.ui?.[e], t] : j.value[e]({ class: [E.ui?.[e], t] });
|
|
38
|
+
}
|
|
39
|
+
let N = s(() => !!(E.name ?? O.name) || !!(E.featured && E.badge)), P = s(() => !!(E.cta ?? O.footer));
|
|
40
|
+
return (e, a) => (_(), c(i, {
|
|
41
|
+
unstyled: E.unstyled,
|
|
42
|
+
class: g(M("root", E.class))
|
|
43
|
+
}, f({
|
|
44
|
+
default: C(() => [
|
|
45
|
+
E.price != null || x(O).price ? (_(), u("p", {
|
|
46
|
+
key: 0,
|
|
47
|
+
class: g(M("price"))
|
|
48
|
+
}, [y(e.$slots, "price", {}, () => [d("span", { class: g(M("amount")) }, b(E.price), 3), E.period ? (_(), u("span", {
|
|
49
|
+
key: 0,
|
|
50
|
+
class: g(M("period"))
|
|
51
|
+
}, b(E.period), 3)) : l("", !0)])], 2)) : l("", !0),
|
|
52
|
+
E.description || x(O).description ? (_(), u("p", {
|
|
53
|
+
key: 1,
|
|
54
|
+
class: g(M("description"))
|
|
55
|
+
}, [y(e.$slots, "description", {}, () => [p(b(E.description), 1)])], 2)) : l("", !0),
|
|
56
|
+
E.features?.length ? (_(), u("ul", {
|
|
57
|
+
key: 2,
|
|
58
|
+
class: g(M("features"))
|
|
59
|
+
}, [(_(!0), u(o, null, v(E.features, (e) => (_(), u("li", {
|
|
60
|
+
key: e,
|
|
61
|
+
class: g(M("feature"))
|
|
62
|
+
}, [m(t, {
|
|
63
|
+
icon: x(w),
|
|
64
|
+
class: g(M("featureIcon"))
|
|
65
|
+
}, null, 8, ["icon", "class"]), p(" " + b(e), 1)], 2))), 128))], 2)) : l("", !0),
|
|
66
|
+
y(e.$slots, "default")
|
|
67
|
+
]),
|
|
68
|
+
_: 2
|
|
69
|
+
}, [N.value ? {
|
|
70
|
+
name: "header",
|
|
71
|
+
fn: C(() => [d("div", { class: g(M("header")) }, [d("h3", { class: g(M("name")) }, [y(e.$slots, "name", {}, () => [p(b(E.name), 1)])], 2), y(e.$slots, "badge", {}, () => [E.featured && E.badge ? (_(), c(r, {
|
|
72
|
+
key: 0,
|
|
73
|
+
size: "sm"
|
|
74
|
+
}, {
|
|
75
|
+
default: C(() => [p(b(E.badge), 1)]),
|
|
76
|
+
_: 1
|
|
77
|
+
})) : l("", !0)])], 2)]),
|
|
78
|
+
key: "0"
|
|
79
|
+
} : void 0, P.value ? {
|
|
80
|
+
name: "footer",
|
|
81
|
+
fn: C(() => [y(e.$slots, "footer", {}, () => [m(n, {
|
|
82
|
+
variant: E.featured ? "solid" : "outline",
|
|
83
|
+
block: "",
|
|
84
|
+
onClick: a[0] ||= (e) => D("select")
|
|
85
|
+
}, {
|
|
86
|
+
default: C(() => [p(b(E.cta), 1)]),
|
|
87
|
+
_: 1
|
|
88
|
+
}, 8, ["variant"])])]),
|
|
89
|
+
key: "1"
|
|
90
|
+
} : void 0]), 1032, ["unstyled", "class"]));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
//#endregion
|
|
94
|
+
export { T as default };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ClassValue } from '../class-value';
|
|
2
|
+
import type { PricingCardProps } from './PricingCard.vue';
|
|
3
|
+
export interface PricingPlan extends PricingCardProps {
|
|
4
|
+
/** Identity for the list and for the `select` event. */
|
|
5
|
+
id?: string | number;
|
|
6
|
+
}
|
|
7
|
+
export interface PricingTableProps {
|
|
8
|
+
/** Render as a different element or component. */
|
|
9
|
+
as?: string;
|
|
10
|
+
plans?: PricingPlan[];
|
|
11
|
+
/** Badge for the featured plan. A plan's own `badge` wins over it. */
|
|
12
|
+
badge?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Columns from `lg` up. Defaults to one per plan, which is right until there
|
|
15
|
+
* are more than four — past that, set it and let them wrap.
|
|
16
|
+
*/
|
|
17
|
+
columns?: 1 | 2 | 3 | 4;
|
|
18
|
+
/** Skip built-in classes; you take over styling entirely. */
|
|
19
|
+
unstyled?: boolean;
|
|
20
|
+
class?: ClassValue;
|
|
21
|
+
}
|
|
22
|
+
declare var __VLS_8: {};
|
|
23
|
+
type __VLS_Slots = {} & {
|
|
24
|
+
default?: (props: typeof __VLS_8) => any;
|
|
25
|
+
};
|
|
26
|
+
declare const __VLS_base: import("vue").DefineComponent<PricingTableProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
27
|
+
select: (plan: PricingPlan) => any;
|
|
28
|
+
}, string, import("vue").PublicProps, Readonly<PricingTableProps> & Readonly<{
|
|
29
|
+
onSelect?: ((plan: PricingPlan) => any) | undefined;
|
|
30
|
+
}>, {
|
|
31
|
+
unstyled: boolean;
|
|
32
|
+
as: string;
|
|
33
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
34
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
35
|
+
declare const _default: typeof __VLS_export;
|
|
36
|
+
export default _default;
|
|
37
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
38
|
+
new (): {
|
|
39
|
+
$slots: S;
|
|
40
|
+
};
|
|
41
|
+
};
|