@alikhalilll/a-responsive-popover 1.0.1

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/dist/index.js ADDED
@@ -0,0 +1,276 @@
1
+ import { computed, createBlock, defineComponent, inject, mergeModels, normalizeClass, openBlock, provide, renderSlot, resolveDynamicComponent, useModel, withCtx } from "vue";
2
+ import { useMediaQuery } from "@vueuse/core";
3
+ import { APopover, APopoverContent, APopoverTrigger, useEventScrollLock } from "@alikhalilll/a-popover";
4
+ import { ADrawer, ADrawerContent, ADrawerTrigger } from "@alikhalilll/a-drawer";
5
+ //#region src/composables/useResponsivePopoverContext.ts
6
+ const RESPONSIVE_POPOVER_CONTEXT = Symbol("AResponsivePopoverContext");
7
+ function provideResponsivePopoverContext(ctx) {
8
+ provide(RESPONSIVE_POPOVER_CONTEXT, ctx);
9
+ }
10
+ function useResponsivePopoverContext() {
11
+ return inject(RESPONSIVE_POPOVER_CONTEXT, null);
12
+ }
13
+ //#endregion
14
+ //#region \0/plugin-vue/export-helper
15
+ var export_helper_default = (sfc, props) => {
16
+ const target = sfc.__vccOpts || sfc;
17
+ for (const [key, val] of props) target[key] = val;
18
+ return target;
19
+ };
20
+ //#endregion
21
+ //#region src/components/AResponsivePopover.vue
22
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
23
+ __name: "AResponsivePopover",
24
+ props: /* @__PURE__ */ mergeModels({
25
+ breakpoint: {
26
+ type: String,
27
+ required: false,
28
+ default: "(min-width: 768px)"
29
+ },
30
+ modal: {
31
+ type: Boolean,
32
+ required: false,
33
+ default: true
34
+ },
35
+ scrollLock: {
36
+ type: String,
37
+ required: false,
38
+ default: "events"
39
+ }
40
+ }, {
41
+ "open": { type: Boolean },
42
+ "openModifiers": {}
43
+ }),
44
+ emits: ["update:open"],
45
+ setup(__props, { expose: __expose }) {
46
+ __expose();
47
+ const props = __props;
48
+ const open = useModel(__props, "open");
49
+ const isDesktop = useMediaQuery(() => props.breakpoint);
50
+ /**
51
+ * Pre-imported on both branches — do NOT lazy-load. Switching the component identity at runtime
52
+ * means we still hydrate the right tree client-side.
53
+ */
54
+ const Root = computed(() => isDesktop.value ? APopover : ADrawer);
55
+ /**
56
+ * Per-branch `modal` resolution — the two roots interpret the prop differently:
57
+ *
58
+ * APopover (desktop, reka-ui): `modal=true` triggers `PopoverContentModal` + its
59
+ * `useBodyScrollLock`. We only want that when the caller explicitly opted into the
60
+ * body-level scroll lock; for `'events'`/`'none'` we install our own lock in
61
+ * `AResponsivePopoverContent`. Legacy `modal=false` still forces non-modal.
62
+ *
63
+ * ADrawer (mobile, vaul-vue): `modal=false` SUPPRESSES THE OVERLAY entirely. Drawers
64
+ * are modal by convention (a dimmed backdrop is the affordance), so default to modal
65
+ * unless the caller explicitly turned the whole thing off.
66
+ */
67
+ const rekaModal = computed(() => {
68
+ if (props.modal === false) return false;
69
+ return props.scrollLock === "body";
70
+ });
71
+ const drawerModal = computed(() => props.modal !== false);
72
+ const rootModal = computed(() => isDesktop.value ? rekaModal.value : drawerModal.value);
73
+ provideResponsivePopoverContext({
74
+ open: computed(() => open.value ?? false),
75
+ isDesktop: computed(() => isDesktop.value),
76
+ scrollLock: computed(() => props.scrollLock)
77
+ });
78
+ const __returned__ = {
79
+ props,
80
+ open,
81
+ isDesktop,
82
+ Root,
83
+ rekaModal,
84
+ drawerModal,
85
+ rootModal
86
+ };
87
+ Object.defineProperty(__returned__, "__isScriptSetup", {
88
+ enumerable: false,
89
+ value: true
90
+ });
91
+ return __returned__;
92
+ }
93
+ });
94
+ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
95
+ return openBlock(), createBlock(resolveDynamicComponent($setup.Root), {
96
+ open: $setup.open,
97
+ "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.open = $event),
98
+ modal: $setup.rootModal,
99
+ "data-slot": "responsive-popover"
100
+ }, {
101
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default", { isDesktop: $setup.isDesktop })]),
102
+ _: 3
103
+ }, 40, ["open", "modal"]);
104
+ }
105
+ var AResponsivePopover_default = /* @__PURE__ */ export_helper_default(_sfc_main$2, [["render", _sfc_render$2], ["__file", "/Users/alikhalill/Desktop/my-projects/ali-nuxt-toolkit/packages/ui-components/AResponsivePopover/src/components/AResponsivePopover.vue"]]);
106
+ //#endregion
107
+ //#region src/components/AResponsivePopoverTrigger.vue
108
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
109
+ __name: "AResponsivePopoverTrigger",
110
+ props: {
111
+ breakpoint: {
112
+ type: String,
113
+ required: false,
114
+ default: "(min-width: 768px)"
115
+ },
116
+ asChild: {
117
+ type: Boolean,
118
+ required: false
119
+ }
120
+ },
121
+ setup(__props, { expose: __expose }) {
122
+ __expose();
123
+ const props = __props;
124
+ const isDesktop = useMediaQuery(() => props.breakpoint);
125
+ const __returned__ = {
126
+ props,
127
+ isDesktop,
128
+ Trigger: computed(() => isDesktop.value ? APopoverTrigger : ADrawerTrigger)
129
+ };
130
+ Object.defineProperty(__returned__, "__isScriptSetup", {
131
+ enumerable: false,
132
+ value: true
133
+ });
134
+ return __returned__;
135
+ }
136
+ });
137
+ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
138
+ return openBlock(), createBlock(resolveDynamicComponent($setup.Trigger), {
139
+ "as-child": $setup.props.asChild,
140
+ "data-slot": "responsive-popover-trigger"
141
+ }, {
142
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
143
+ _: 3
144
+ }, 8, ["as-child"]);
145
+ }
146
+ var AResponsivePopoverTrigger_default = /* @__PURE__ */ export_helper_default(_sfc_main$1, [["render", _sfc_render$1], ["__file", "/Users/alikhalill/Desktop/my-projects/ali-nuxt-toolkit/packages/ui-components/AResponsivePopover/src/components/AResponsivePopoverTrigger.vue"]]);
147
+ //#endregion
148
+ //#region src/components/AResponsivePopoverContent.vue
149
+ const _sfc_main = /* @__PURE__ */ defineComponent({
150
+ __name: "AResponsivePopoverContent",
151
+ props: {
152
+ breakpoint: {
153
+ type: String,
154
+ required: false,
155
+ default: "(min-width: 768px)"
156
+ },
157
+ class: {
158
+ type: [
159
+ Boolean,
160
+ null,
161
+ String,
162
+ Object,
163
+ Array
164
+ ],
165
+ required: false,
166
+ skipCheck: true
167
+ },
168
+ popoverClass: {
169
+ type: [
170
+ Boolean,
171
+ null,
172
+ String,
173
+ Object,
174
+ Array
175
+ ],
176
+ required: false,
177
+ skipCheck: true
178
+ },
179
+ drawerClass: {
180
+ type: [
181
+ Boolean,
182
+ null,
183
+ String,
184
+ Object,
185
+ Array
186
+ ],
187
+ required: false,
188
+ skipCheck: true
189
+ },
190
+ overlay: {
191
+ type: Boolean,
192
+ required: false,
193
+ default: false
194
+ },
195
+ align: {
196
+ type: String,
197
+ required: false,
198
+ default: "start"
199
+ },
200
+ sideOffset: {
201
+ type: Number,
202
+ required: false,
203
+ default: 4
204
+ }
205
+ },
206
+ setup(__props, { expose: __expose }) {
207
+ __expose();
208
+ const props = __props;
209
+ const ctx = useResponsivePopoverContext();
210
+ const fallbackIsDesktop = useMediaQuery(() => props.breakpoint);
211
+ const isDesktop = computed(() => ctx?.isDesktop.value ?? fallbackIsDesktop.value);
212
+ const scrollLockMode = computed(() => ctx?.scrollLock.value ?? "events");
213
+ const overlayLockScroll = computed(() => scrollLockMode.value === "body");
214
+ const mergedClass = computed(() => [props.class, isDesktop.value ? props.popoverClass : props.drawerClass]);
215
+ useEventScrollLock({
216
+ allowedScrollContainer: () => {
217
+ if (typeof document === "undefined") return [];
218
+ return Array.from(document.querySelectorAll("[data-responsive-popover-scroll-container=\"true\"]"));
219
+ },
220
+ active: computed(() => !!ctx?.open.value && isDesktop.value && scrollLockMode.value === "events")
221
+ });
222
+ const __returned__ = {
223
+ props,
224
+ ctx,
225
+ fallbackIsDesktop,
226
+ isDesktop,
227
+ scrollLockMode,
228
+ overlayLockScroll,
229
+ mergedClass,
230
+ get APopoverContent() {
231
+ return APopoverContent;
232
+ },
233
+ get ADrawerContent() {
234
+ return ADrawerContent;
235
+ }
236
+ };
237
+ Object.defineProperty(__returned__, "__isScriptSetup", {
238
+ enumerable: false,
239
+ value: true
240
+ });
241
+ return __returned__;
242
+ }
243
+ });
244
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
245
+ return $setup.isDesktop ? (openBlock(), createBlock($setup["APopoverContent"], {
246
+ key: 0,
247
+ overlay: $setup.props.overlay,
248
+ "overlay-lock-scroll": $setup.overlayLockScroll,
249
+ align: $setup.props.align,
250
+ "side-offset": $setup.props.sideOffset,
251
+ class: normalizeClass($setup.mergedClass),
252
+ "data-slot": "responsive-popover-content",
253
+ "data-responsive-popover-scroll-container": "true"
254
+ }, {
255
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
256
+ _: 3
257
+ }, 8, [
258
+ "overlay",
259
+ "overlay-lock-scroll",
260
+ "align",
261
+ "side-offset",
262
+ "class"
263
+ ])) : (openBlock(), createBlock($setup["ADrawerContent"], {
264
+ key: 1,
265
+ class: normalizeClass($setup.mergedClass),
266
+ "data-slot": "responsive-popover-content"
267
+ }, {
268
+ default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
269
+ _: 3
270
+ }, 8, ["class"]));
271
+ }
272
+ var AResponsivePopoverContent_default = /* @__PURE__ */ export_helper_default(_sfc_main, [["render", _sfc_render], ["__file", "/Users/alikhalill/Desktop/my-projects/ali-nuxt-toolkit/packages/ui-components/AResponsivePopover/src/components/AResponsivePopoverContent.vue"]]);
273
+ //#endregion
274
+ export { AResponsivePopover_default as AResponsivePopover, AResponsivePopoverContent_default as AResponsivePopoverContent, AResponsivePopoverTrigger_default as AResponsivePopoverTrigger };
275
+
276
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/composables/useResponsivePopoverContext.ts","../src/components/AResponsivePopover.vue","../src/components/AResponsivePopoverTrigger.vue","../src/components/AResponsivePopoverContent.vue"],"sourcesContent":["import { inject, provide, type ComputedRef, type InjectionKey } from 'vue';\nimport type { ScrollLockMode } from '../types';\n\nexport interface ResponsivePopoverContext {\n open: ComputedRef<boolean>;\n isDesktop: ComputedRef<boolean>;\n scrollLock: ComputedRef<ScrollLockMode>;\n}\n\nconst RESPONSIVE_POPOVER_CONTEXT: InjectionKey<ResponsivePopoverContext> = Symbol(\n 'AResponsivePopoverContext'\n);\n\nexport function provideResponsivePopoverContext(ctx: ResponsivePopoverContext) {\n provide(RESPONSIVE_POPOVER_CONTEXT, ctx);\n}\n\nexport function useResponsivePopoverContext(): ResponsivePopoverContext | null {\n return inject(RESPONSIVE_POPOVER_CONTEXT, null);\n}\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopover } from '@alikhalilll/a-popover';\nimport { ADrawer } from '@alikhalilll/a-drawer';\nimport { provideResponsivePopoverContext } from '../composables/useResponsivePopoverContext';\nimport type { AResponsivePopoverProps, AResponsivePopoverSlots } from '../types';\n\nconst props = withDefaults(defineProps<AResponsivePopoverProps>(), {\n breakpoint: '(min-width: 768px)',\n modal: true,\n scrollLock: 'events',\n});\n\ndefineSlots<AResponsivePopoverSlots>();\n\nconst open = defineModel<boolean>('open');\n\nconst isDesktop = useMediaQuery(() => props.breakpoint);\n\n/**\n * Pre-imported on both branches — do NOT lazy-load. Switching the component identity at runtime\n * means we still hydrate the right tree client-side.\n */\nconst Root = computed(() => (isDesktop.value ? APopover : ADrawer));\n\n/**\n * Per-branch `modal` resolution — the two roots interpret the prop differently:\n *\n * APopover (desktop, reka-ui): `modal=true` triggers `PopoverContentModal` + its\n * `useBodyScrollLock`. We only want that when the caller explicitly opted into the\n * body-level scroll lock; for `'events'`/`'none'` we install our own lock in\n * `AResponsivePopoverContent`. Legacy `modal=false` still forces non-modal.\n *\n * ADrawer (mobile, vaul-vue): `modal=false` SUPPRESSES THE OVERLAY entirely. Drawers\n * are modal by convention (a dimmed backdrop is the affordance), so default to modal\n * unless the caller explicitly turned the whole thing off.\n */\nconst rekaModal = computed(() => {\n if (props.modal === false) return false;\n return props.scrollLock === 'body';\n});\nconst drawerModal = computed(() => props.modal !== false);\nconst rootModal = computed(() => (isDesktop.value ? rekaModal.value : drawerModal.value));\n\nprovideResponsivePopoverContext({\n open: computed(() => open.value ?? false),\n isDesktop: computed(() => isDesktop.value),\n scrollLock: computed(() => props.scrollLock),\n});\n</script>\n\n<template>\n <component :is=\"Root\" v-model:open=\"open\" :modal=\"rootModal\" data-slot=\"responsive-popover\">\n <slot :is-desktop=\"isDesktop\" />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopoverTrigger } from '@alikhalilll/a-popover';\nimport { ADrawerTrigger } from '@alikhalilll/a-drawer';\n\nconst props = withDefaults(\n defineProps<{\n breakpoint?: string;\n asChild?: boolean;\n }>(),\n { breakpoint: '(min-width: 768px)' }\n);\n\nconst isDesktop = useMediaQuery(() => props.breakpoint);\nconst Trigger = computed(() => (isDesktop.value ? APopoverTrigger : ADrawerTrigger));\n</script>\n\n<template>\n <component :is=\"Trigger\" :as-child=\"props.asChild\" data-slot=\"responsive-popover-trigger\">\n <slot />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport type { HTMLAttributes } from 'vue';\nimport { computed } from 'vue';\nimport { useMediaQuery } from '@vueuse/core';\nimport { APopoverContent, useEventScrollLock } from '@alikhalilll/a-popover';\nimport { ADrawerContent } from '@alikhalilll/a-drawer';\nimport { useResponsivePopoverContext } from '../composables/useResponsivePopoverContext';\n\nconst props = withDefaults(\n defineProps<{\n breakpoint?: string;\n /** Classes applied on both branches. Avoid width / inset classes here. */\n class?: HTMLAttributes['class'];\n /** Classes applied only when the popover (desktop) branch is rendered. */\n popoverClass?: HTMLAttributes['class'];\n /** Classes applied only when the drawer (mobile) branch is rendered. */\n drawerClass?: HTMLAttributes['class'];\n /**\n * Render the dimmed overlay on the desktop popover branch. Defaults to `false` — popovers\n * on desktop are non-modal-looking by convention. The mobile drawer always has its own\n * overlay (vaul-vue's `DrawerOverlay`) regardless of this prop.\n */\n overlay?: boolean;\n align?: 'start' | 'center' | 'end';\n sideOffset?: number;\n }>(),\n {\n breakpoint: '(min-width: 768px)',\n align: 'start',\n sideOffset: 4,\n overlay: false,\n }\n);\n\nconst ctx = useResponsivePopoverContext();\n\n// Prefer the root's media query (so both layers agree). Fall back to a local one when this\n// component is used outside `AResponsivePopover` (unusual but supported).\nconst fallbackIsDesktop = useMediaQuery(() => props.breakpoint);\nconst isDesktop = computed(() => ctx?.isDesktop.value ?? fallbackIsDesktop.value);\n\nconst scrollLockMode = computed(() => ctx?.scrollLock.value ?? 'events');\nconst overlayLockScroll = computed(() => scrollLockMode.value === 'body');\n\nconst mergedClass = computed(() => [\n props.class,\n isDesktop.value ? props.popoverClass : props.drawerClass,\n]);\n\n// Sticky-safe scroll lock — only active while the popover is open on desktop and the root\n// asked for the event-based strategy. The getter resolves every responsive popover content\n// element currently in the DOM, which lets stacked popovers share the lock cleanly.\nuseEventScrollLock({\n allowedScrollContainer: () => {\n if (typeof document === 'undefined') return [];\n return Array.from(\n document.querySelectorAll<HTMLElement>('[data-responsive-popover-scroll-container=\"true\"]')\n );\n },\n active: computed(() => !!ctx?.open.value && isDesktop.value && scrollLockMode.value === 'events'),\n});\n</script>\n\n<template>\n <APopoverContent\n v-if=\"isDesktop\"\n :overlay=\"props.overlay\"\n :overlay-lock-scroll=\"overlayLockScroll\"\n :align=\"props.align\"\n :side-offset=\"props.sideOffset\"\n :class=\"mergedClass\"\n data-slot=\"responsive-popover-content\"\n data-responsive-popover-scroll-container=\"true\"\n >\n <slot />\n </APopoverContent>\n <ADrawerContent v-else :class=\"mergedClass\" data-slot=\"responsive-popover-content\">\n <slot />\n </ADrawerContent>\n</template>\n"],"mappings":";;;;;AASA,MAAM,6BAAqE,OACzE,2BACF;AAEA,SAAgB,gCAAgC,KAA+B;CAC7E,QAAQ,4BAA4B,GAAG;AACzC;AAEA,SAAgB,8BAA+D;CAC7E,OAAO,OAAO,4BAA4B,IAAI;AAChD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECXA,MAAM,QAAQ;EAQd,MAAM,OAAO,SAAoB,SAAC,MAAM;EAExC,MAAM,YAAY,oBAAoB,MAAM,UAAU;;;;;EAMtD,MAAM,OAAO,eAAgB,UAAU,QAAQ,WAAW,OAAQ;;;;;;;;;;;;;EAclE,MAAM,YAAY,eAAe;GAC/B,IAAI,MAAM,UAAU,OAAO,OAAO;GAClC,OAAO,MAAM,eAAe;EAC9B,CAAC;EACD,MAAM,cAAc,eAAe,MAAM,UAAU,KAAK;EACxD,MAAM,YAAY,eAAgB,UAAU,QAAQ,UAAU,QAAQ,YAAY,KAAM;EAExF,gCAAgC;GAC9B,MAAM,eAAe,KAAK,SAAS,KAAK;GACxC,WAAW,eAAe,UAAU,KAAK;GACzC,YAAY,eAAe,MAAM,UAAU;EAC7C,CAAC;;;;;;;;;;;;;;;;;;qBAIC,YAEY,wBAFI,OAAA,IAAI,GAAA;EAAU,MAAM,OAAA;yDAAA,OAAA,OAAI;EAAG,OAAO,OAAA;EAAW,aAAU;;yBACrC,CAAhC,WAAgC,KAAA,QAAA,WAAA,EAAzB,WAAY,OAAA,UAAS,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;EChDhC,MAAM,QAAQ;EAQd,MAAM,YAAY,oBAAoB,MAAM,UAAU;;;;YACtC,eAAgB,UAAU,QAAQ,kBAAkB,cAAA;;;;;;;;;;qBAIlE,YAEY,wBAFI,OAAA,OAAO,GAAA;EAAG,YAAU,OAAA,MAAM;EAAS,aAAU;;yBACnD,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECZZ,MAAM,QAAQ;EA0Bd,MAAM,MAAM,4BAA4B;EAIxC,MAAM,oBAAoB,oBAAoB,MAAM,UAAU;EAC9D,MAAM,YAAY,eAAe,KAAK,UAAU,SAAS,kBAAkB,KAAK;EAEhF,MAAM,iBAAiB,eAAe,KAAK,WAAW,SAAS,QAAQ;EACvE,MAAM,oBAAoB,eAAe,eAAe,UAAU,MAAM;EAExE,MAAM,cAAc,eAAe,CACjC,MAAM,OACN,UAAU,QAAQ,MAAM,eAAe,MAAM,WAC/C,CAAC;EAKD,mBAAmB;GACjB,8BAA8B;IAC5B,IAAI,OAAO,aAAa,aAAa,OAAO,CAAC;IAC7C,OAAO,MAAM,KACX,SAAS,iBAA8B,qDAAmD,CAC5F;GACF;GACA,QAAQ,eAAe,CAAC,CAAC,KAAK,KAAK,SAAS,UAAU,SAAS,eAAe,UAAU,QAAQ;EAClG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;QAKS,OAAA,aAAA,UAAA,GADR,YAWkB,OAAA,oBAAA;;EATf,SAAS,OAAA,MAAM;EACf,uBAAqB,OAAA;EACrB,OAAO,OAAA,MAAM;EACb,eAAa,OAAA,MAAM;EACnB,OAAK,eAAE,OAAA,WAAW;EACnB,aAAU;EACV,4CAAyC;;yBAEjC,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA;;;;;;;;qBAEV,YAEiB,OAAA,mBAAA;;EAFO,OAAK,eAAE,OAAA,WAAW;EAAE,aAAU;;yBAC5C,CAAR,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
@@ -0,0 +1,30 @@
1
+ let _nuxt_kit = require("@nuxt/kit");
2
+ //#region src/nuxt/index.ts
3
+ const COMPONENTS = {
4
+ AResponsivePopover: "@alikhalilll/a-responsive-popover",
5
+ AResponsivePopoverContent: "@alikhalilll/a-responsive-popover",
6
+ AResponsivePopoverTrigger: "@alikhalilll/a-responsive-popover"
7
+ };
8
+ const module$1 = (0, _nuxt_kit.defineNuxtModule)({
9
+ meta: {
10
+ name: "@alikhalilll/a-responsive-popover",
11
+ configKey: "aResponsivePopover",
12
+ compatibility: { nuxt: ">=3.0.0" }
13
+ },
14
+ defaults: { prefix: "" },
15
+ setup(opts) {
16
+ const prefix = opts.prefix ?? "";
17
+ for (const [exportName, from] of Object.entries(COMPONENTS)) {
18
+ const baseName = exportName.startsWith("A") ? exportName.slice(1) : exportName;
19
+ (0, _nuxt_kit.addComponent)({
20
+ name: `${prefix}${prefix ? baseName : exportName}`,
21
+ export: exportName,
22
+ filePath: from
23
+ });
24
+ }
25
+ }
26
+ });
27
+ //#endregion
28
+ module.exports = module$1;
29
+
30
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["module"],"sources":["../../src/nuxt/index.ts"],"sourcesContent":["import { defineNuxtModule, addComponent } from '@nuxt/kit';\nimport type { NuxtModule } from '@nuxt/schema';\n\n/**\n * `@alikhalilll/a-responsive-popover/nuxt` — registers the responsive-popover\n * components for Nuxt auto-import. Also import the a-popover and a-drawer\n * stylesheets (this component renders them), plus a-ui-base tokens.\n */\n\nexport interface ModuleOptions {\n prefix?: string;\n}\n\nconst COMPONENTS: Record<string, string> = {\n AResponsivePopover: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverContent: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverTrigger: '@alikhalilll/a-responsive-popover',\n};\n\nconst module: NuxtModule<ModuleOptions> = defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@alikhalilll/a-responsive-popover',\n configKey: 'aResponsivePopover',\n compatibility: { nuxt: '>=3.0.0' },\n },\n defaults: { prefix: '' },\n setup(opts) {\n const prefix = opts.prefix ?? '';\n for (const [exportName, from] of Object.entries(COMPONENTS)) {\n const baseName = exportName.startsWith('A') ? exportName.slice(1) : exportName;\n const registeredName = `${prefix}${prefix ? baseName : exportName}`;\n addComponent({ name: registeredName, export: exportName, filePath: from });\n }\n },\n});\n\nexport default module;\n"],"mappings":";;AAaA,MAAM,aAAqC;CACzC,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;AAC7B;AAEA,MAAMA,YAAAA,GAAAA,UAAAA,kBAAoE;CACxE,MAAM;EACJ,MAAM;EACN,WAAW;EACX,eAAe,EAAE,MAAM,UAAU;CACnC;CACA,UAAU,EAAE,QAAQ,GAAG;CACvB,MAAM,MAAM;EACV,MAAM,SAAS,KAAK,UAAU;EAC9B,KAAK,MAAM,CAAC,YAAY,SAAS,OAAO,QAAQ,UAAU,GAAG;GAC3D,MAAM,WAAW,WAAW,WAAW,GAAG,IAAI,WAAW,MAAM,CAAC,IAAI;GAEpE,CAAA,GAAA,UAAA,cAAa;IAAE,MAAM,GADK,SAAS,SAAS,WAAW;IAClB,QAAQ;IAAY,UAAU;GAAK,CAAC;EAC3E;CACF;AACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { NuxtModule } from "@nuxt/schema";
2
+
3
+ //#region src/nuxt/index.d.ts
4
+ /**
5
+ * `@alikhalilll/a-responsive-popover/nuxt` — registers the responsive-popover
6
+ * components for Nuxt auto-import. Also import the a-popover and a-drawer
7
+ * stylesheets (this component renders them), plus a-ui-base tokens.
8
+ */
9
+ interface ModuleOptions {
10
+ prefix?: string;
11
+ }
12
+ declare const module: NuxtModule<ModuleOptions>;
13
+ //#endregion
14
+ export { ModuleOptions, module as default };
15
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,15 @@
1
+ import { NuxtModule } from "@nuxt/schema";
2
+
3
+ //#region src/nuxt/index.d.ts
4
+ /**
5
+ * `@alikhalilll/a-responsive-popover/nuxt` — registers the responsive-popover
6
+ * components for Nuxt auto-import. Also import the a-popover and a-drawer
7
+ * stylesheets (this component renders them), plus a-ui-base tokens.
8
+ */
9
+ interface ModuleOptions {
10
+ prefix?: string;
11
+ }
12
+ declare const module: NuxtModule<ModuleOptions>;
13
+ //#endregion
14
+ export { ModuleOptions, module as default };
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { addComponent, defineNuxtModule } from "@nuxt/kit";
2
+ //#region src/nuxt/index.ts
3
+ const COMPONENTS = {
4
+ AResponsivePopover: "@alikhalilll/a-responsive-popover",
5
+ AResponsivePopoverContent: "@alikhalilll/a-responsive-popover",
6
+ AResponsivePopoverTrigger: "@alikhalilll/a-responsive-popover"
7
+ };
8
+ const module = defineNuxtModule({
9
+ meta: {
10
+ name: "@alikhalilll/a-responsive-popover",
11
+ configKey: "aResponsivePopover",
12
+ compatibility: { nuxt: ">=3.0.0" }
13
+ },
14
+ defaults: { prefix: "" },
15
+ setup(opts) {
16
+ const prefix = opts.prefix ?? "";
17
+ for (const [exportName, from] of Object.entries(COMPONENTS)) {
18
+ const baseName = exportName.startsWith("A") ? exportName.slice(1) : exportName;
19
+ addComponent({
20
+ name: `${prefix}${prefix ? baseName : exportName}`,
21
+ export: exportName,
22
+ filePath: from
23
+ });
24
+ }
25
+ }
26
+ });
27
+ //#endregion
28
+ export { module as default };
29
+
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/nuxt/index.ts"],"sourcesContent":["import { defineNuxtModule, addComponent } from '@nuxt/kit';\nimport type { NuxtModule } from '@nuxt/schema';\n\n/**\n * `@alikhalilll/a-responsive-popover/nuxt` — registers the responsive-popover\n * components for Nuxt auto-import. Also import the a-popover and a-drawer\n * stylesheets (this component renders them), plus a-ui-base tokens.\n */\n\nexport interface ModuleOptions {\n prefix?: string;\n}\n\nconst COMPONENTS: Record<string, string> = {\n AResponsivePopover: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverContent: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverTrigger: '@alikhalilll/a-responsive-popover',\n};\n\nconst module: NuxtModule<ModuleOptions> = defineNuxtModule<ModuleOptions>({\n meta: {\n name: '@alikhalilll/a-responsive-popover',\n configKey: 'aResponsivePopover',\n compatibility: { nuxt: '>=3.0.0' },\n },\n defaults: { prefix: '' },\n setup(opts) {\n const prefix = opts.prefix ?? '';\n for (const [exportName, from] of Object.entries(COMPONENTS)) {\n const baseName = exportName.startsWith('A') ? exportName.slice(1) : exportName;\n const registeredName = `${prefix}${prefix ? baseName : exportName}`;\n addComponent({ name: registeredName, export: exportName, filePath: from });\n }\n },\n});\n\nexport default module;\n"],"mappings":";;AAaA,MAAM,aAAqC;CACzC,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;AAC7B;AAEA,MAAM,SAAoC,iBAAgC;CACxE,MAAM;EACJ,MAAM;EACN,WAAW;EACX,eAAe,EAAE,MAAM,UAAU;CACnC;CACA,UAAU,EAAE,QAAQ,GAAG;CACvB,MAAM,MAAM;EACV,MAAM,SAAS,KAAK,UAAU;EAC9B,KAAK,MAAM,CAAC,YAAY,SAAS,OAAO,QAAQ,UAAU,GAAG;GAC3D,MAAM,WAAW,WAAW,WAAW,GAAG,IAAI,WAAW,MAAM,CAAC,IAAI;GAEpE,aAAa;IAAE,MAAM,GADK,SAAS,SAAS,WAAW;IAClB,QAAQ;IAAY,UAAU;GAAK,CAAC;EAC3E;CACF;AACF,CAAC"}
@@ -0,0 +1,25 @@
1
+ //#region src/resolver/index.ts
2
+ const COMPONENT_TO_ENTRY = {
3
+ AResponsivePopover: "@alikhalilll/a-responsive-popover",
4
+ AResponsivePopoverContent: "@alikhalilll/a-responsive-popover",
5
+ AResponsivePopoverTrigger: "@alikhalilll/a-responsive-popover"
6
+ };
7
+ function AResponsivePopoverResolver(opts = {}) {
8
+ const prefix = opts.prefix ?? "";
9
+ return {
10
+ type: "component",
11
+ resolve(name) {
12
+ const bare = prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;
13
+ const from = COMPONENT_TO_ENTRY[bare];
14
+ if (!from) return;
15
+ return {
16
+ name: bare,
17
+ from
18
+ };
19
+ }
20
+ };
21
+ }
22
+ //#endregion
23
+ module.exports = AResponsivePopoverResolver;
24
+
25
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/resolver/index.ts"],"sourcesContent":["import type { ComponentResolver } from 'unplugin-vue-components';\n\n/**\n * `@alikhalilll/a-responsive-popover/resolver` — auto-import resolver for\n * non-Nuxt Vite/Webpack consumers via `unplugin-vue-components`.\n */\n\nexport interface ResolverOptions {\n prefix?: string;\n}\n\nconst COMPONENT_TO_ENTRY: Record<string, string> = {\n AResponsivePopover: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverContent: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverTrigger: '@alikhalilll/a-responsive-popover',\n};\n\nexport default function AResponsivePopoverResolver(opts: ResolverOptions = {}): ComponentResolver {\n const prefix = opts.prefix ?? '';\n return {\n type: 'component',\n resolve(name) {\n const bare = prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;\n const from = COMPONENT_TO_ENTRY[bare];\n if (!from) return;\n return { name: bare, from };\n },\n };\n}\n"],"mappings":";AAWA,MAAM,qBAA6C;CACjD,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;AAC7B;AAEA,SAAwB,2BAA2B,OAAwB,CAAC,GAAsB;CAChG,MAAM,SAAS,KAAK,UAAU;CAC9B,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;GACZ,MAAM,OAAO,UAAU,KAAK,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,MAAM,IAAI;GAC7E,MAAM,OAAO,mBAAmB;GAChC,IAAI,CAAC,MAAM;GACX,OAAO;IAAE,MAAM;IAAM;GAAK;EAC5B;CACF;AACF"}
@@ -0,0 +1,14 @@
1
+ import { ComponentResolver } from "unplugin-vue-components";
2
+
3
+ //#region src/resolver/index.d.ts
4
+ /**
5
+ * `@alikhalilll/a-responsive-popover/resolver` — auto-import resolver for
6
+ * non-Nuxt Vite/Webpack consumers via `unplugin-vue-components`.
7
+ */
8
+ interface ResolverOptions {
9
+ prefix?: string;
10
+ }
11
+ declare function AResponsivePopoverResolver(opts?: ResolverOptions): ComponentResolver;
12
+ //#endregion
13
+ export { ResolverOptions, AResponsivePopoverResolver as default };
14
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,14 @@
1
+ import { ComponentResolver } from "unplugin-vue-components";
2
+
3
+ //#region src/resolver/index.d.ts
4
+ /**
5
+ * `@alikhalilll/a-responsive-popover/resolver` — auto-import resolver for
6
+ * non-Nuxt Vite/Webpack consumers via `unplugin-vue-components`.
7
+ */
8
+ interface ResolverOptions {
9
+ prefix?: string;
10
+ }
11
+ declare function AResponsivePopoverResolver(opts?: ResolverOptions): ComponentResolver;
12
+ //#endregion
13
+ export { ResolverOptions, AResponsivePopoverResolver as default };
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,25 @@
1
+ //#region src/resolver/index.ts
2
+ const COMPONENT_TO_ENTRY = {
3
+ AResponsivePopover: "@alikhalilll/a-responsive-popover",
4
+ AResponsivePopoverContent: "@alikhalilll/a-responsive-popover",
5
+ AResponsivePopoverTrigger: "@alikhalilll/a-responsive-popover"
6
+ };
7
+ function AResponsivePopoverResolver(opts = {}) {
8
+ const prefix = opts.prefix ?? "";
9
+ return {
10
+ type: "component",
11
+ resolve(name) {
12
+ const bare = prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;
13
+ const from = COMPONENT_TO_ENTRY[bare];
14
+ if (!from) return;
15
+ return {
16
+ name: bare,
17
+ from
18
+ };
19
+ }
20
+ };
21
+ }
22
+ //#endregion
23
+ export { AResponsivePopoverResolver as default };
24
+
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/resolver/index.ts"],"sourcesContent":["import type { ComponentResolver } from 'unplugin-vue-components';\n\n/**\n * `@alikhalilll/a-responsive-popover/resolver` — auto-import resolver for\n * non-Nuxt Vite/Webpack consumers via `unplugin-vue-components`.\n */\n\nexport interface ResolverOptions {\n prefix?: string;\n}\n\nconst COMPONENT_TO_ENTRY: Record<string, string> = {\n AResponsivePopover: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverContent: '@alikhalilll/a-responsive-popover',\n AResponsivePopoverTrigger: '@alikhalilll/a-responsive-popover',\n};\n\nexport default function AResponsivePopoverResolver(opts: ResolverOptions = {}): ComponentResolver {\n const prefix = opts.prefix ?? '';\n return {\n type: 'component',\n resolve(name) {\n const bare = prefix && name.startsWith(prefix) ? name.slice(prefix.length) : name;\n const from = COMPONENT_TO_ENTRY[bare];\n if (!from) return;\n return { name: bare, from };\n },\n };\n}\n"],"mappings":";AAWA,MAAM,qBAA6C;CACjD,oBAAoB;CACpB,2BAA2B;CAC3B,2BAA2B;AAC7B;AAEA,SAAwB,2BAA2B,OAAwB,CAAC,GAAsB;CAChG,MAAM,SAAS,KAAK,UAAU;CAC9B,OAAO;EACL,MAAM;EACN,QAAQ,MAAM;GACZ,MAAM,OAAO,UAAU,KAAK,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,MAAM,IAAI;GAC7E,MAAM,OAAO,mBAAmB;GAChC,IAAI,CAAC,MAAM;GACX,OAAO;IAAE,MAAM;IAAM;GAAK;EAC5B;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
+ :root,.light{--ak-ui-background:0 0% 100%;--ak-ui-foreground:240 10% 3.9%;--ak-ui-card:0 0% 100%;--ak-ui-card-foreground:240 10% 3.9%;--ak-ui-popover:0 0% 100%;--ak-ui-popover-foreground:240 10% 3.9%;--ak-ui-primary:240 5.9% 10%;--ak-ui-primary-foreground:0 0% 98%;--ak-ui-secondary:240 4.8% 95.9%;--ak-ui-secondary-foreground:240 5.9% 10%;--ak-ui-muted:240 4.8% 95.9%;--ak-ui-muted-foreground:240 3.8% 46.1%;--ak-ui-accent:240 4.8% 95.9%;--ak-ui-accent-foreground:240 5.9% 10%;--ak-ui-destructive:0 84.2% 60.2%;--ak-ui-destructive-foreground:0 0% 98%;--ak-ui-border:240 5.9% 90%;--ak-ui-input:240 5.9% 90%;--ak-ui-ring:240 5.9% 10%;--ak-ui-radius:.5rem}.dark{--ak-ui-background:240 10% 3.9%;--ak-ui-foreground:0 0% 98%;--ak-ui-card:240 10% 3.9%;--ak-ui-card-foreground:0 0% 98%;--ak-ui-popover:240 10% 3.9%;--ak-ui-popover-foreground:0 0% 98%;--ak-ui-primary:0 0% 98%;--ak-ui-primary-foreground:240 5.9% 10%;--ak-ui-secondary:240 3.7% 15.9%;--ak-ui-secondary-foreground:0 0% 98%;--ak-ui-muted:240 3.7% 15.9%;--ak-ui-muted-foreground:240 5% 64.9%;--ak-ui-accent:240 3.7% 15.9%;--ak-ui-accent-foreground:0 0% 98%;--ak-ui-destructive:0 62.8% 30.6%;--ak-ui-destructive-foreground:0 0% 98%;--ak-ui-border:240 3.7% 15.9%;--ak-ui-input:240 3.7% 15.9%;--ak-ui-ring:240 4.9% 83.9%}.sticky{position:sticky}.hidden{display:none}
package/package.json ADDED
@@ -0,0 +1,122 @@
1
+ {
2
+ "name": "@alikhalilll/a-responsive-popover",
3
+ "version": "1.0.1",
4
+ "description": "Vue 3 responsive popover: a reka-ui popover on desktop that becomes a vaul drawer on mobile. Part of the @alikhalilll/a-* toolkit.",
5
+ "license": "MIT",
6
+ "author": "alikhalilll",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/alikhalilll/ali-nuxt-toolkit.git",
10
+ "directory": "packages/ui-components/AResponsivePopover"
11
+ },
12
+ "homepage": "https://alikhalilll.github.io/ali-nuxt-toolkit/ui",
13
+ "bugs": {
14
+ "url": "https://github.com/alikhalilll/ali-nuxt-toolkit/issues"
15
+ },
16
+ "type": "module",
17
+ "sideEffects": [
18
+ "**/*.css"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "keywords": [
24
+ "vue",
25
+ "vue3",
26
+ "nuxt",
27
+ "popover",
28
+ "drawer",
29
+ "responsive",
30
+ "headless",
31
+ "shadcn"
32
+ ],
33
+ "exports": {
34
+ ".": {
35
+ "import": {
36
+ "types": "./dist/index.d.ts",
37
+ "default": "./dist/index.js"
38
+ },
39
+ "require": {
40
+ "types": "./dist/index.d.cts",
41
+ "default": "./dist/index.cjs"
42
+ }
43
+ },
44
+ "./nuxt": {
45
+ "import": {
46
+ "types": "./dist/nuxt/index.d.ts",
47
+ "default": "./dist/nuxt/index.js"
48
+ },
49
+ "require": {
50
+ "types": "./dist/nuxt/index.d.cts",
51
+ "default": "./dist/nuxt/index.cjs"
52
+ }
53
+ },
54
+ "./resolver": {
55
+ "import": {
56
+ "types": "./dist/resolver/index.d.ts",
57
+ "default": "./dist/resolver/index.js"
58
+ },
59
+ "require": {
60
+ "types": "./dist/resolver/index.d.cts",
61
+ "default": "./dist/resolver/index.cjs"
62
+ }
63
+ },
64
+ "./styles.css": "./dist/styles.css",
65
+ "./package.json": "./package.json"
66
+ },
67
+ "types": "./dist/index.d.ts",
68
+ "web-types": "./web-types.json",
69
+ "files": [
70
+ "dist",
71
+ "src",
72
+ "web-types.json",
73
+ "README.md",
74
+ "LICENSE"
75
+ ],
76
+ "engines": {
77
+ "node": ">=18"
78
+ },
79
+ "peerDependencies": {
80
+ "@nuxt/kit": "^3.0.0 || ^4.0.0",
81
+ "@vueuse/core": "^14.0.0",
82
+ "unplugin-vue-components": "^28.0.0 || ^29.0.0 || ^30.0.0 || ^31.0.0 || ^32.0.0",
83
+ "vue": "^3.5.0"
84
+ },
85
+ "peerDependenciesMeta": {
86
+ "@nuxt/kit": {
87
+ "optional": true
88
+ },
89
+ "unplugin-vue-components": {
90
+ "optional": true
91
+ }
92
+ },
93
+ "dependencies": {
94
+ "@alikhalilll/a-popover": "1.0.1",
95
+ "@alikhalilll/a-drawer": "1.0.1"
96
+ },
97
+ "devDependencies": {
98
+ "@nuxt/kit": "^4.4.2",
99
+ "@nuxt/schema": "^4.4.2",
100
+ "@tailwindcss/cli": "^4.0.0",
101
+ "@tsdown/css": "0.22.0",
102
+ "@types/node": "^22.13.0",
103
+ "@vueuse/core": "^14.0.0",
104
+ "rimraf": "^6.0.1",
105
+ "tailwindcss": "^4.0.0",
106
+ "tsdown": "0.22.0",
107
+ "typescript": "^5.9.2",
108
+ "unplugin-vue": "7.2.0",
109
+ "unplugin-vue-components": "^32.1.0",
110
+ "vue": "^3.5.0",
111
+ "vue-tsc": "^3.2.4",
112
+ "@alikhalilll/a-ui-base": "1.0.0"
113
+ },
114
+ "scripts": {
115
+ "clean": "rimraf dist web-types.json",
116
+ "build": "tsx ../../../scripts/build/run-component-build.ts",
117
+ "typecheck": "vue-tsc --noEmit -p tsconfig.json",
118
+ "validate-dist": "tsx ../../../scripts/validate/dist-validate.ts --pkg a-responsive-popover",
119
+ "validate-consumer": "tsx ../../../scripts/validate/consumer-validate.ts --pkg a-responsive-popover",
120
+ "validate": "pnpm build && pnpm validate-dist && pnpm validate-consumer"
121
+ }
122
+ }