@poupe/vue
Version:
Vue component library for Poupe UI framework with theme customization and accessibility support
1,287 lines (1,286 loc) • 35.7 kB
JavaScript
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, guardReactiveProps, mergeDefaults, mergeModels, mergeProps, normalizeClass, normalizeProps, normalizeStyle, onMounted, openBlock, reactive, readonly, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, toValue, useId, useModel, useSlots, useTemplateRef, vModelDynamic, withCtx, withDirectives } from "vue";
import { usePoupeMergedProps, useRipple } from "@poupe/vue/composables";
import { Icon } from "@iconify/vue";
import { usePoupeIcons } from "@poupe/vue/composables/use-icons";
import { unsafeKeys } from "@poupe/css";
import { tv } from "tailwind-variants";
import { twMerge } from "tailwind-merge";
import { Toggle, useForwardExpose } from "reka-ui";
import { createPoupe, poupeInjectionKey } from "@poupe/vue/composables/use-poupe";
var icon_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "icon",
props: {
icon: {
type: [Object, String],
required: false
},
mode: {
type: String,
required: false
},
color: {
type: String,
required: false
},
flip: {
type: String,
required: false
},
horizontalFlip: {
type: Boolean,
required: false
},
verticalFlip: {
type: Boolean,
required: false
},
rotate: {
type: [Number, String],
required: false
},
hFlip: {
type: Boolean,
required: false
},
vFlip: {
type: Boolean,
required: false
},
width: {
type: [
null,
String,
Number
],
required: false
},
height: {
type: [
null,
String,
Number
],
required: false
},
inline: {
type: Boolean,
required: false
},
ariaHidden: {
type: Boolean,
required: false
}
},
setup(__props, { expose: __expose }) {
__expose();
const props = __props;
const { toIcon } = usePoupeIcons();
const __returned__ = {
props,
toIcon,
icon: computed(() => toIcon(props.icon)),
get IconifyIcon() {
return Icon;
}
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
var export_helper_default = (sfc, props) => {
const target = sfc.__vccOpts || sfc;
for (const [key, val] of props) target[key] = val;
return target;
};
function _sfc_render$5(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createBlock($setup["IconifyIcon"], mergeProps($setup.props, { icon: $setup.icon }), null, 16, ["icon"]);
}
var icon_default = /* @__PURE__ */ export_helper_default(icon_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render$5], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/icon.vue"]]);
const pe = {
0: "pe-0",
1: "pe-1",
2: "pe-2",
3: "pe-3",
4: "pe-4"
};
const ps = {
0: "ps-0",
1: "ps-1",
2: "ps-2",
3: "ps-3",
4: "ps-4",
5: "ps-5",
6: "ps-6"
};
const px = {
0: "px-0",
1: "px-1",
2: "px-2",
3: "px-3",
4: "px-4"
};
const py = {
0: "py-0",
1: "py-1",
2: "py-2",
3: "py-3",
4: "py-4"
};
const onSlot = (slot, classes) => {
const slots = Array.isArray(slot) ? slot : [slot];
const out = {};
for (const name of unsafeKeys(classes)) {
const v = {};
for (const s of slots) v[s] = classes[name];
out[name] = v;
}
return out;
};
const borderVariantsBase = "border-solid border";
const borderVariants$1 = {
none: "border-transparent",
current: "border-current",
primary: "border-primary",
secondary: "border-secondary",
tertiary: "border-tertiary",
error: "border-error",
outline: "border-outline"
};
const borderInFocusVariantsBase = "ring-solid ring-2 ring-transparent";
const borderInFocusVariants = {
none: "",
current: "focus-within:ring-current",
primary: "focus-within:ring-primary",
secondary: "focus-within:ring-secondary",
tertiary: "focus-within:ring-tertiary",
error: "focus-within:ring-error",
outline: "focus-within:ring-outline"
};
const roundedVariants = {
full: "rounded-full",
none: "rounded-none",
xs: "rounded-sm",
sm: "rounded",
md: "rounded-md",
lg: "rounded-lg",
xl: "rounded-xl",
["2xl"]: "rounded-2xl",
["3xl"]: "rounded-3xl"
};
const shapeVariants = {
"none": "shape-none",
"xs": "shape-squircle-extra-small",
"sm": "shape-squircle-small",
"md": "shape-squircle-medium",
"lg": "shape-squircle-large",
"xl": "shape-squircle-extra-large",
"rounded": "shape-full",
"full": "shape-full",
"squircle-xs": "shape-squircle-extra-small",
"squircle-sm": "shape-squircle-small",
"squircle-md": "shape-squircle-medium",
"squircle-lg": "shape-squircle-large",
"squircle-xl": "shape-squircle-extra-large",
"squircle-full": "shape-squircle-full"
};
const shadowVariants = {
current: "shadow-shadow shadow",
none: "shadow-none",
z1: "shadow-shadow shadow-z1",
z2: "shadow-shadow shadow-z2",
z3: "shadow-shadow shadow-z3",
z4: "shadow-shadow shadow-z4",
z5: "shadow-shadow shadow-z5",
inset: "inset-shadow-shadow inset-shadow"
};
const colorSurfaceVariants = {
primary: "surface-primary",
secondary: "surface-secondary",
tertiary: "surface-tertiary",
error: "surface-error",
["primary-fixed"]: "surface-primary-fixed",
["secondary-fixed"]: "surface-secondary-fixed",
["tertiary-fixed"]: "surface-tertiary-fixed",
["primary-container"]: "surface-primary-container",
["secondary-container"]: "surface-secondary-container",
["tertiary-container"]: "surface-tertiary-container",
["error-container"]: "surface-error-container",
inverse: "surface-inverse",
["inverse-primary"]: "surface-inverse-primary"
};
({ ...colorSurfaceVariants });
({ ...colorSurfaceVariants });
const colorSurfaceInteractiveVariants = {
primary: "interactive-surface-primary",
secondary: "interactive-surface-secondary",
tertiary: "interactive-surface-tertiary",
error: "interactive-surface-error",
["primary-fixed"]: "interactive-surface-primary-fixed",
["secondary-fixed"]: "interactive-surface-secondary-fixed",
["tertiary-fixed"]: "interactive-surface-tertiary-fixed",
["primary-container"]: "interactive-surface-primary-container",
["secondary-container"]: "interactive-surface-secondary-container",
["tertiary-container"]: "interactive-surface-tertiary-container",
["error-container"]: "interactive-surface-error-container",
inverse: "interactive-surface-inverse",
["inverse-primary"]: "interactive-surface-inverse-primary"
};
const surfaceInteractiveVariants = {
...colorSurfaceInteractiveVariants,
dim: "interactive-surface-dim",
base: "interactive-surface",
bright: "interactive-surface-bright",
variant: "interactive-surface-variant"
};
const containerInteractiveVariants = {
...colorSurfaceInteractiveVariants,
lowest: "interactive-surface-container-lowest",
low: "interactive-surface-container-low",
base: "interactive-surface-container",
high: "interactive-surface-container-high",
highest: "interactive-surface-container-highest"
};
const surfaceDefaults = {
tag: "div",
class: "",
role: "surface",
tone: "base",
level: "base",
shape: "none",
shadow: "none",
border: "none",
interactive: false,
padding: "none"
};
const surface = tv({
slots: { wrapper: "relative" },
variants: {
role: {
surface: {},
container: {}
},
tone: {
dim: { wrapper: "surface-dim" },
base: { wrapper: "surface" },
bright: { wrapper: "surface-bright" }
},
level: {
lowest: { wrapper: "surface-container-lowest" },
low: { wrapper: "surface-container-low" },
base: { wrapper: "surface-container" },
high: { wrapper: "surface-container-high" },
highest: { wrapper: "surface-container-highest" }
},
variant: {
"primary": { wrapper: "surface-primary" },
"secondary": { wrapper: "surface-secondary" },
"tertiary": { wrapper: "surface-tertiary" },
"error": { wrapper: "surface-error" },
"primary-fixed": { wrapper: "surface-primary-fixed" },
"secondary-fixed": { wrapper: "surface-secondary-fixed" },
"tertiary-fixed": { wrapper: "surface-tertiary-fixed" },
"primary-container": { wrapper: "surface-primary-container" },
"secondary-container": { wrapper: "surface-secondary-container" },
"tertiary-container": { wrapper: "surface-tertiary-container" },
"error-container": { wrapper: "surface-error-container" },
"inverse": { wrapper: "surface-inverse" },
"inverse-primary": { wrapper: "surface-inverse-primary" }
},
shape: onSlot("wrapper", shapeVariants),
shadow: onSlot("wrapper", shadowVariants),
border: onSlot("wrapper", borderVariants$1),
interactive: {
true: { wrapper: "cursor-pointer" },
false: {}
},
padding: {
none: {},
sm: { wrapper: "p-2" },
md: { wrapper: "p-4" },
lg: { wrapper: "p-6" },
xl: { wrapper: "p-8" }
}
},
defaultVariants: {
role: surfaceDefaults.role,
tone: surfaceDefaults.tone,
level: surfaceDefaults.level,
shape: surfaceDefaults.shape,
shadow: surfaceDefaults.shadow,
border: surfaceDefaults.border,
interactive: surfaceDefaults.interactive,
padding: surfaceDefaults.padding
},
compoundVariants: [{
border: [
"primary",
"secondary",
"tertiary",
"error",
"outline",
"current"
],
class: { wrapper: borderVariantsBase }
}]
});
var surface_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "surface",
props: {
tag: {
type: String,
required: false
},
role: {
type: null,
required: false
},
tone: {
type: null,
required: false
},
level: {
type: null,
required: false
},
variant: {
type: null,
required: false
},
shape: {
type: null,
required: false
},
shadow: {
type: null,
required: false
},
border: {
type: null,
required: false
},
interactive: {
type: null,
required: false
},
padding: {
type: null,
required: false
},
class: {
type: String,
required: false
}
},
setup(__props, { expose: __expose }) {
const directProps = __props;
const rootElement = ref();
__expose({ rootElement });
const props = computed(() => usePoupeMergedProps(directProps, "surface", surfaceDefaults));
const variants = computed(() => {
const baseVariants = surface({
role: props.value.role,
tone: props.value.tone,
level: props.value.level,
variant: props.value.variant,
shape: props.value.shape,
shadow: props.value.shadow,
border: props.value.border,
interactive: props.value.interactive,
padding: props.value.padding
});
if (props.value.interactive) {
const role = props.value.role;
const interactiveVariants = role === "container" ? containerInteractiveVariants : surfaceInteractiveVariants;
let colorKey;
if (props.value.variant) colorKey = props.value.variant;
else if (role === "surface" && props.value.tone) colorKey = props.value.tone;
else if (role === "container" && props.value.level) colorKey = props.value.level;
if (colorKey && colorKey in interactiveVariants) return { wrapper: () => twMerge(baseVariants.wrapper(), interactiveVariants[colorKey]) };
}
return baseVariants;
});
const __returned__ = {
surfaceDefaults,
surface,
directProps,
rootElement,
props,
variants,
classes: computed(() => twMerge(variants.value.wrapper(), props.value.class))
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
function _sfc_render$4(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createBlock(resolveDynamicComponent($setup.props.tag), {
ref: "rootElement",
class: normalizeClass($setup.classes)
}, {
default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
_: 3
}, 8, ["class"]);
}
var surface_default = /* @__PURE__ */ export_helper_default(surface_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render$4], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/surface.vue"]]);
const buttonDefaults = {
type: "filled",
size: "base",
variant: "primary",
shape: "md",
disabled: false,
loading: false,
expand: false,
ellipsis: false,
fab: false,
extended: false,
iconButton: false,
toggle: false,
pressed: false
};
var button_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "button",
props: {
label: {
type: String,
required: false
},
type: {
type: String,
required: false
},
size: {
type: String,
required: false
},
variant: {
type: String,
required: false
},
loading: {
type: Boolean,
required: false
},
disabled: {
type: Boolean,
required: false
},
expand: {
type: Boolean,
required: false
},
ellipsis: {
type: Boolean,
required: false
},
fab: {
type: Boolean,
required: false
},
extended: {
type: Boolean,
required: false
},
iconButton: {
type: Boolean,
required: false
},
toggle: {
type: Boolean,
required: false
},
pressed: {
type: Boolean,
required: false
},
icon: {
type: String,
required: false
},
trailingIcon: {
type: String,
required: false
},
iconStart: {
type: String,
required: false
},
iconEnd: {
type: String,
required: false
},
tag: {
type: String,
required: false
},
shape: {
type: null,
required: false
},
shadow: {
type: null,
required: false
},
border: {
type: null,
required: false
},
interactive: {
type: null,
required: false
},
class: {
type: String,
required: false
}
},
emits: ["click"],
setup(__props, { expose: __expose, emit: __emit }) {
__expose();
const directProps = __props;
const emit = __emit;
const props = computed(() => usePoupeMergedProps(directProps, "button", buttonDefaults));
const surfaceReference = useTemplateRef("surfaceReference");
const buttonElement = ref();
onMounted(() => {
buttonElement.value = surfaceReference.value?.rootElement;
});
const isDisabled = computed(() => props.value.disabled);
const { ripples, getRippleStyle } = useRipple(buttonElement, { disabled: isDisabled });
const __returned__ = {
buttonDefaults,
directProps,
emit,
props,
surfaceReference,
buttonElement,
isDisabled,
ripples,
getRippleStyle,
surfaceProps: computed(() => {
const { type, variant, shape, shadow, border, interactive } = props.value;
const baseProps = {
shape,
padding: "none",
interactive: interactive ?? true
};
if (props.value.fab) {
baseProps.shape = props.value.extended ? "lg" : "full";
baseProps.shadow = shadow ?? "z3";
}
if (props.value.iconButton && !props.value.fab) baseProps.shape = shape ?? "full";
const getOutlineBorder = () => {
if (border) return border;
switch (variant) {
case "primary":
case "secondary":
case "tertiary":
case "error": return variant;
default: return "outline";
}
};
switch (type) {
case "text": return {
...baseProps,
role: "surface",
tone: "base",
shadow: shadow ?? "none",
border: border ?? "none"
};
case "outlined": return {
...baseProps,
role: "surface",
tone: "base",
shadow: shadow ?? "none",
border: getOutlineBorder()
};
case "filled": return {
...baseProps,
variant: variant === "base" ? void 0 : variant,
role: variant === "base" ? "surface" : void 0,
tone: variant === "base" ? "base" : void 0,
shadow: shadow ?? "none",
border: border ?? "none"
};
case "elevated": return {
...baseProps,
role: "surface",
tone: "base",
shadow: shadow ?? "z1",
border: border ?? "none"
};
case "tonal": {
const tonalVariant = variant === "base" ? void 0 : `${variant}-container`;
return {
...baseProps,
variant: tonalVariant,
role: variant === "base" ? "container" : void 0,
level: variant === "base" ? "base" : void 0,
shadow: shadow ?? "none",
border: border ?? "none"
};
}
default: return baseProps;
}
}),
buttonClasses: computed(() => {
const { size, expand, disabled, loading, fab, iconButton } = props.value;
const classes = [
"inline-flex items-center justify-center gap-2",
"transition-all duration-200",
"select-none",
"font-medium"
];
const sizeClasses = {
xs: "text-xs h-8 px-2",
sm: "text-sm h-9 px-3",
base: "text-sm h-10 px-6",
lg: "text-base h-12 px-7",
xl: "text-lg h-14 px-8"
};
const fabSizeClasses = {
xs: "h-10 w-10",
sm: "h-12 w-12",
base: "h-14 w-14",
lg: "h-16 w-16",
xl: "h-20 w-20"
};
const extendedFabSizeClasses = {
xs: "h-10 px-3",
sm: "h-12 px-4",
base: "h-14 px-5",
lg: "h-16 px-6",
xl: "h-20 px-8"
};
const iconButtonSizeClasses = {
xs: "h-8 w-8",
sm: "h-9 w-9",
base: "h-10 w-10",
lg: "h-12 w-12",
xl: "h-14 w-14"
};
if (fab && !props.value.extended) classes.push(fabSizeClasses[size]);
else if (fab && props.value.extended) classes.push(extendedFabSizeClasses[size]);
else if (iconButton) classes.push(iconButtonSizeClasses[size]);
else classes.push(sizeClasses[size]);
if (disabled || loading) classes.push("opacity-38 cursor-not-allowed");
if (expand) classes.push("w-full");
return classes.join(" ");
}),
computedLabel: computed(() => {
const label = props.value.label || "";
return props.value.ellipsis ? `${label}…` : label;
}),
iconSize: computed(() => {
return {
xs: "text-base",
sm: "text-lg",
base: "text-xl",
lg: "text-2xl",
xl: "text-3xl"
}[props.value.size];
}),
Icon: icon_default,
Surface: surface_default
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
const _hoisted_1$3 = {
key: 1,
class: "leading-none"
};
function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createBlock($setup["Surface"], mergeProps({ ref: "surfaceReference" }, $setup.surfaceProps, {
tag: "button",
class: $setup.buttonClasses,
disabled: $setup.props.disabled || $setup.props.loading,
onClick: _cache[0] || (_cache[0] = ($event) => $setup.emit("click", $event))
}), {
default: withCtx(() => [
createCommentVNode(" Leading icon "),
$setup.props.icon || $setup.props.iconStart ? (openBlock(), createBlock($setup["Icon"], {
key: 0,
icon: $setup.props.icon || $setup.props.iconStart,
class: normalizeClass($setup.iconSize)
}, null, 8, ["icon", "class"])) : createCommentVNode("v-if", true),
createCommentVNode(" Label "),
$setup.computedLabel && (!$setup.props.iconButton || $setup.props.extended) ? (openBlock(), createElementBlock("span", _hoisted_1$3, toDisplayString($setup.computedLabel), 1)) : createCommentVNode("v-if", true),
createCommentVNode(" Default slot "),
!$setup.computedLabel && !$setup.props.iconButton ? renderSlot(_ctx.$slots, "default", { key: 2 }) : createCommentVNode("v-if", true),
createCommentVNode(" Trailing icon "),
$setup.props.trailingIcon || $setup.props.iconEnd ? (openBlock(), createBlock($setup["Icon"], {
key: 3,
icon: $setup.props.trailingIcon || $setup.props.iconEnd,
class: normalizeClass($setup.iconSize)
}, null, 8, ["icon", "class"])) : createCommentVNode("v-if", true),
createCommentVNode(" Loading indicator "),
$setup.props.loading ? (openBlock(), createBlock($setup["Icon"], {
key: 4,
icon: "svg-spinners:12-dots-scale-rotate",
class: normalizeClass($setup.iconSize)
}, null, 8, ["class"])) : createCommentVNode("v-if", true),
createCommentVNode(" Ripple particles "),
(openBlock(true), createElementBlock(Fragment, null, renderList($setup.ripples, (r) => {
return openBlock(), createElementBlock("span", {
key: r.id,
"aria-hidden": "true",
style: normalizeStyle($setup.getRippleStyle(r))
}, null, 4);
}), 128))
]),
_: 3
}, 16, ["class", "disabled"]);
}
var button_default = /* @__PURE__ */ export_helper_default(button_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render$3], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/button.vue"]]);
function tryWarn(message) {
if (typeof console === "undefined" || !console.warn) return;
const { env } = import.meta;
if (env?.DEV) console.warn(message);
}
const cardDefaults = {
title: void 0,
surface: "container",
container: void 0,
shape: "md",
shadow: "z1"
};
var card_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "card",
props: {
title: {
type: String,
required: false
},
surface: {
type: String,
required: false
},
container: {
type: String,
required: false
},
tag: {
type: String,
required: false
},
role: {
type: null,
required: false
},
tone: {
type: null,
required: false
},
level: {
type: null,
required: false
},
variant: {
type: null,
required: false
},
shape: {
type: null,
required: false
},
shadow: {
type: null,
required: false
},
border: {
type: null,
required: false
},
interactive: {
type: null,
required: false
},
class: {
type: String,
required: false
}
},
setup(__props, { expose: __expose }) {
__expose();
const directProps = __props;
const props = computed(() => usePoupeMergedProps(directProps, "card", cardDefaults));
function mapSurfaceToRoleAndLevel(surface) {
switch (surface) {
case "lowest":
case "low":
case "container":
case "high":
case "highest": return {
role: "container",
level: surface === "container" ? "base" : surface
};
case "base":
case "dim":
case "bright": return {
role: "surface",
tone: surface
};
default: return;
}
}
const surfaceProps = computed(() => {
if (props.value.surface && props.value.container) tryWarn("[PCard] Both \"surface\" and \"container\" props are specified. The \"container\" prop will take precedence. Please use only one of these props.");
const result = {
shape: props.value.shape,
shadow: props.value.shadow,
border: props.value.border,
interactive: props.value.interactive,
padding: "none"
};
if (props.value.container) result.variant = props.value.container;
else if (props.value.surface) {
const mapped = mapSurfaceToRoleAndLevel(props.value.surface);
if (mapped) Object.assign(result, mapped);
} else {
if (props.value.role) result.role = props.value.role;
if (props.value.tone) result.tone = props.value.tone;
if (props.value.level) result.level = props.value.level;
if (props.value.variant) result.variant = props.value.variant;
}
return result;
});
const slots = useSlots();
const __returned__ = {
cardDefaults,
directProps,
props,
mapSurfaceToRoleAndLevel,
surfaceProps,
slots,
hasHeader: computed(() => props.value.title !== void 0 || slots.header !== void 0),
hasFooter: computed(() => slots.footer !== void 0),
Surface: surface_default
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
const _hoisted_1$2 = {
key: 0,
class: "px-4 pt-4"
};
const _hoisted_2$2 = {
key: 0,
class: "text-xl font-medium"
};
const _hoisted_3$1 = { class: "px-4 py-4" };
const _hoisted_4 = {
key: 1,
class: "px-4 pb-4"
};
function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createBlock($setup["Surface"], normalizeProps(guardReactiveProps($setup.surfaceProps)), {
default: withCtx(() => [
createCommentVNode(" Header "),
$setup.hasHeader ? (openBlock(), createElementBlock("div", _hoisted_1$2, [renderSlot(_ctx.$slots, "header", {}, () => [$setup.props.title ? (openBlock(), createElementBlock("h3", _hoisted_2$2, toDisplayString($setup.props.title), 1)) : createCommentVNode("v-if", true)])])) : createCommentVNode("v-if", true),
createCommentVNode(" Content "),
createElementVNode("div", _hoisted_3$1, [renderSlot(_ctx.$slots, "default")]),
createCommentVNode(" Footer "),
$setup.hasFooter ? (openBlock(), createElementBlock("div", _hoisted_4, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("v-if", true)
]),
_: 3
}, 16);
}
var card_default = /* @__PURE__ */ export_helper_default(card_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render$2], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/card.vue"]]);
const globalIcons = reactive({ poupe: {
blankIcon: {
body: "",
width: 24,
height: 24
},
unknownIcon: {
body: "<text y=\".9em\" font-size=\"90\" fill=\"currentColor\">�</text>",
width: 100,
height: 100
},
spinner: "svg-spinners:6-dots-scale",
showPassword: "heroicons:eye",
hidePassword: "heroicons:eye-slash"
} });
const registerIcons = (namespace, icons) => {
globalIcons[namespace] = {
...globalIcons[namespace],
...icons
};
};
const toIcon = (icon) => {
const v = toValue(icon);
if (!v) return globalIcons.poupe.blankIcon;
if (typeof v !== "string") return v;
const i = v.indexOf(":");
const icons = globalIcons[i > 0 ? v.slice(0, i) : "poupe"];
if (!icons) return v;
const name = i === -1 ? v : v.slice(i + 1);
if (icons[name]) return toIcon(icons[name]);
const camelCase = name.replaceAll(/[-_]([a-z])/g, (_, c) => c.toUpperCase());
if (icons[camelCase]) return toIcon(icons[camelCase]);
return globalIcons.poupe.unknownIcon;
};
const usePoupeIcons$1 = () => ({
icons: readonly(globalIcons),
toIcon,
registerIcons
});
function usePasswordToggle(origType) {
const { poupe: icons } = usePoupeIcons$1().icons;
const showPassword = ref(false);
return {
showPassword,
passwordToggleIcon: computed(() => showPassword.value ? icons.hidePassword : icons.showPassword),
typeAttr: computed(() => showPassword.value ? "text" : toValue(origType))
};
}
const padding = (n) => `${px[n]} ${py[n]}`;
const paddingSlot = (n) => {
return { [n]: {
start: padding(n),
field: padding(n),
unit: `${ps[n + 1]} ${pe[n]} ${py[n]}`,
end: padding(n)
} };
};
const inputWrapperVariants = tv({
slots: {
wrapper: [
"flex flex-1 flex-nowrap rtl:flex-row-reverse overflow-hidden",
borderVariantsBase,
borderInFocusVariantsBase
],
field: "flex-1",
start: "flex items-center",
input: "w-full focus:outline-none bg-transparent",
unit: "text-xs font-medium justify-end",
end: "flex items-center"
},
variants: {
surface: onSlot("wrapper", containerInteractiveVariants),
border: onSlot("wrapper", borderVariants$1),
outline: onSlot("wrapper", borderInFocusVariants),
rounded: onSlot("wrapper", {
...roundedVariants,
full: `${roundedVariants.full} px-4`
}),
padding: {
...paddingSlot(0),
...paddingSlot(1),
...paddingSlot(2),
...paddingSlot(3),
...paddingSlot(4)
},
expand: { true: { wrapper: "w-full" } }
},
defaultVariants: {
surface: "base",
border: "outline",
outline: "current",
rounded: "full",
padding: 2,
expand: false
}
});
const defaultInputWrapperProps = {
...inputWrapperVariants.defaultVariants,
type: "text"
};
var wrapper_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
inheritAttrs: false,
__name: "wrapper",
props: /* @__PURE__ */ mergeModels(/* @__PURE__ */ mergeDefaults({
class: {
type: String,
required: false
},
id: {
type: String,
required: false
},
type: {
type: [String, Object],
required: false
},
modelValue: {
type: null,
required: false
},
value: {
type: null,
required: false
},
iconEnd: {
type: String,
required: false
},
iconStart: {
type: String,
required: false
},
unit: {
type: String,
required: false
},
border: {
type: null,
required: false
},
expand: {
type: null,
required: false
},
outline: {
type: null,
required: false
},
padding: {
type: null,
required: false
},
rounded: {
type: null,
required: false
},
surface: {
type: null,
required: false
}
}, defaultInputWrapperProps), {
"modelValue": { type: null },
"modelModifiers": {}
}),
emits: ["update:modelValue"],
setup(__props, { expose: __expose }) {
__expose();
const model = useModel(__props, "modelValue");
const props = __props;
const variants = computed(() => inputWrapperVariants(props));
const wrapperClasses = computed(() => twMerge(variants.value.wrapper(), props.class));
const { forwardRef } = useForwardExpose();
const { showPassword, passwordToggleIcon, typeAttr } = usePasswordToggle(props.type);
const __returned__ = {
model,
props,
variants,
wrapperClasses,
forwardRef,
showPassword,
passwordToggleIcon,
typeAttr,
get RekaToggle() {
return Toggle;
},
Icon: icon_default
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
const _hoisted_1$1 = ["id", "type"];
const _hoisted_2$1 = ["aria-label", "textContent"];
function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createElementBlock("div", { class: normalizeClass($setup.wrapperClasses) }, [
createCommentVNode(" [[ start ][ input ][ unit ][ end ]] "),
_ctx.$slots.start || _ctx.$props.iconStart !== void 0 ? renderSlot(_ctx.$slots, "start", {
key: 0,
class: normalizeClass($setup.variants.start()),
padding: _ctx.$props.padding
}, () => [createElementVNode("div", {
class: normalizeClass($setup.variants.start()),
role: "presentation",
"aria-hidden": "true"
}, [createVNode($setup["Icon"], { icon: _ctx.$props.iconStart }, null, 8, ["icon"])], 2)]) : createCommentVNode("v-if", true),
createElementVNode("div", { class: normalizeClass($setup.variants.field()) }, [renderSlot(_ctx.$slots, "field", {
ref: $setup.forwardRef,
class: normalizeClass($setup.variants.input()),
padding: _ctx.$props.padding
}, () => [withDirectives(createElementVNode("input", mergeProps(_ctx.$attrs, {
id: $setup.props.id,
ref: $setup.forwardRef,
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => $setup.model = $event),
class: $setup.variants.input(),
type: $setup.typeAttr
}), null, 16, _hoisted_1$1), [[vModelDynamic, $setup.model]])])], 2),
_ctx.$slots.unit || _ctx.$props.unit ? renderSlot(_ctx.$slots, "unit", {
key: 1,
class: normalizeClass($setup.variants.unit()),
padding: _ctx.$props.padding
}, () => [createElementVNode("div", {
class: normalizeClass($setup.variants.unit()),
role: "note",
"aria-label": _ctx.$props.unit,
textContent: toDisplayString(_ctx.$props.unit)
}, null, 10, _hoisted_2$1)]) : createCommentVNode("v-if", true),
_ctx.$slots.end || _ctx.$props.iconEnd !== void 0 || _ctx.$props.type === "password" ? renderSlot(_ctx.$slots, "end", {
key: 2,
class: normalizeClass($setup.variants.end()),
padding: _ctx.$props.padding
}, () => [_ctx.$props.iconEnd !== void 0 ? (openBlock(), createElementBlock("div", {
key: 0,
class: normalizeClass($setup.variants.end()),
role: "presentation",
"aria-hidden": "true"
}, [createVNode($setup["Icon"], { icon: _ctx.$props.iconEnd }, null, 8, ["icon"])], 2)) : $setup.props.type === "password" ? (openBlock(), createBlock($setup["RekaToggle"], {
key: 1,
modelValue: $setup.showPassword,
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => $setup.showPassword = $event),
class: normalizeClass($setup.variants.end())
}, {
default: withCtx(() => [createVNode($setup["Icon"], { icon: $setup.passwordToggleIcon }, null, 8, ["icon"])]),
_: 1
}, 8, ["modelValue", "class"])) : createCommentVNode("v-if", true)]) : createCommentVNode("v-if", true)
], 2);
}
var wrapper_default = /* @__PURE__ */ export_helper_default(wrapper_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render$1], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/input/wrapper.vue"]]);
const borderVariants = {
solid: "border-solid border",
none: "border-none",
dashed: "border-dashed border"
};
const placeholder = tv({
slots: {
wrapper: "overflow-hidden",
pattern: "w-full h-full"
},
variants: {
border: onSlot("wrapper", borderVariants),
color: {
current: {
wrapper: "border-current",
pattern: "stroke-current"
},
["outline-variant"]: {
wrapper: "border-outline-variant",
pattern: "stroke-outline-variant"
},
outline: {
wrapper: "border-outline",
pattern: "stroke-outline"
},
primary: {
wrapper: "border-primary",
pattern: "stroke-primary"
},
secondary: {
wrapper: "border-secondary",
pattern: "stroke-secondary"
},
tertiary: {
wrapper: "border-tertiary",
pattern: "stroke-tertiary"
},
error: {
wrapper: "border-error",
pattern: "stroke-error"
}
},
rounded: onSlot("wrapper", roundedVariants),
shadow: onSlot("wrapper", shadowVariants)
}
});
var placeholder_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
__name: "placeholder",
props: {
rh: {
type: Number,
required: false,
default: 20
},
rw: {
type: Number,
required: false,
default: 10
},
border: {
type: null,
required: false,
default: "dashed"
},
color: {
type: null,
required: false,
default: "outline-variant"
},
rounded: {
type: null,
required: false,
default: "xl"
},
shadow: {
type: null,
required: false,
default: "none"
}
},
setup(__props, { expose: __expose }) {
__expose();
const props = __props;
const __returned__ = {
borderVariants,
placeholder,
props,
id: useId(),
variants: computed(() => placeholder({
border: props.border,
color: props.color,
rounded: props.rounded,
shadow: props.shadow
}))
};
Object.defineProperty(__returned__, "__isScriptSetup", {
enumerable: false,
value: true
});
return __returned__;
}
});
const _hoisted_1 = [
"id",
"width",
"height"
];
const _hoisted_2 = ["d"];
const _hoisted_3 = ["fill"];
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return openBlock(), createElementBlock("div", { class: normalizeClass($setup.variants.wrapper()) }, [(openBlock(), createElementBlock("svg", {
class: normalizeClass($setup.variants.pattern()),
"aria-hidden": "true"
}, [createElementVNode("defs", null, [createElementVNode("pattern", {
id: $setup.id,
x: "0",
y: "0",
width: $props.rw,
height: $props.rh,
patternUnits: "userSpaceOnUse"
}, [createElementVNode("path", {
d: `M0 0 ${$props.rw} ${$props.rh} M${$props.rw} 0 0 ${$props.rh}`,
"stroke-width": "1px",
"vector-effect": "non-scaling-stroke"
}, null, 8, _hoisted_2)], 8, _hoisted_1)]), createElementVNode("rect", {
stroke: "none",
fill: `url(#${$setup.id})`,
width: "100%",
height: "100%"
}, null, 8, _hoisted_3)], 2)), renderSlot(_ctx.$slots, "default")], 2);
}
var placeholder_default = /* @__PURE__ */ export_helper_default(placeholder_vue_vue_type_script_setup_true_lang_default, [["render", _sfc_render], ["__file", "/home/runner/work/poupe/poupe/packages/@poupe-vue/src/components/placeholder.vue"]]);
export { button_default as Button, card_default as Card, icon_default as Icon, wrapper_default as Input, placeholder_default as Placeholder, surface_default as Surface, createPoupe, poupeInjectionKey };
//# sourceMappingURL=index.mjs.map