featuredrop 1.2.0 → 1.4.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 +171 -0
- package/dist/admin.cjs +212 -0
- package/dist/admin.cjs.map +1 -0
- package/dist/admin.d.cts +176 -0
- package/dist/admin.d.ts +176 -0
- package/dist/admin.js +207 -0
- package/dist/admin.js.map +1 -0
- package/dist/angular.cjs +13 -3
- package/dist/angular.cjs.map +1 -1
- package/dist/angular.d.cts +4 -0
- package/dist/angular.d.ts +4 -0
- package/dist/angular.js +13 -3
- package/dist/angular.js.map +1 -1
- package/dist/bridges.cjs +422 -0
- package/dist/bridges.cjs.map +1 -0
- package/dist/bridges.d.cts +194 -0
- package/dist/bridges.d.ts +194 -0
- package/dist/bridges.js +395 -0
- package/dist/bridges.js.map +1 -0
- package/dist/ci.cjs +328 -0
- package/dist/ci.cjs.map +1 -0
- package/dist/ci.d.cts +176 -0
- package/dist/ci.d.ts +176 -0
- package/dist/ci.js +324 -0
- package/dist/ci.js.map +1 -0
- package/dist/featuredrop.cjs +162 -20
- package/dist/featuredrop.cjs.map +1 -1
- package/dist/flags.cjs +51 -0
- package/dist/flags.cjs.map +1 -0
- package/dist/flags.d.cts +48 -0
- package/dist/flags.d.ts +48 -0
- package/dist/flags.js +47 -0
- package/dist/flags.js.map +1 -0
- package/dist/index.cjs +2599 -660
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +743 -206
- package/dist/index.d.ts +743 -206
- package/dist/index.js +2555 -668
- package/dist/index.js.map +1 -1
- package/dist/preact.cjs +747 -221
- package/dist/preact.cjs.map +1 -1
- package/dist/preact.d.cts +67 -120
- package/dist/preact.d.ts +67 -120
- package/dist/preact.js +713 -207
- package/dist/preact.js.map +1 -1
- package/dist/react.cjs +747 -221
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +67 -120
- package/dist/react.d.ts +67 -120
- package/dist/react.js +713 -207
- package/dist/react.js.map +1 -1
- package/dist/schema.cjs +78 -1
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +142 -0
- package/dist/schema.d.ts +142 -0
- package/dist/schema.js +78 -1
- package/dist/schema.js.map +1 -1
- package/dist/solid.cjs +13 -3
- package/dist/solid.cjs.map +1 -1
- package/dist/solid.d.cts +4 -0
- package/dist/solid.d.ts +4 -0
- package/dist/solid.js +13 -3
- package/dist/solid.js.map +1 -1
- package/dist/svelte.cjs +13 -3
- package/dist/svelte.cjs.map +1 -1
- package/dist/svelte.js +13 -3
- package/dist/svelte.js.map +1 -1
- package/dist/testing.cjs +136 -15
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +22 -0
- package/dist/testing.d.ts +22 -0
- package/dist/testing.js +136 -15
- package/dist/testing.js.map +1 -1
- package/dist/vue.cjs +36 -5
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +16 -5
- package/dist/vue.js.map +1 -1
- package/dist/web-components.cjs +14 -4
- package/dist/web-components.cjs.map +1 -1
- package/dist/web-components.d.cts +4 -0
- package/dist/web-components.d.ts +4 -0
- package/dist/web-components.js +14 -4
- package/dist/web-components.js.map +1 -1
- package/package.json +59 -1
package/dist/vue.cjs
CHANGED
|
@@ -1,9 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var vue = require('vue');
|
|
4
|
-
var
|
|
4
|
+
var moduleApi = require('module');
|
|
5
5
|
|
|
6
6
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var moduleApi__namespace = /*#__PURE__*/_interopNamespace(moduleApi);
|
|
26
|
+
|
|
7
27
|
// src/vue/provider.ts
|
|
8
28
|
|
|
9
29
|
// src/semver.ts
|
|
@@ -125,6 +145,14 @@ function isVersionMatch(feature, appVersion) {
|
|
|
125
145
|
if (v.showNewUntil && compareSemver(appVersion, v.showNewUntil) >= 0) return false;
|
|
126
146
|
return true;
|
|
127
147
|
}
|
|
148
|
+
function isFlagMatch(feature, flagBridge, userContext) {
|
|
149
|
+
if (!feature.flagKey) return true;
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
function isProductMatch(feature, product) {
|
|
153
|
+
if (!feature.product || feature.product === "*") return true;
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
128
156
|
function isDependencyMatch(feature, dismissedIds, dependencyState) {
|
|
129
157
|
const dependsOn = feature.dependsOn;
|
|
130
158
|
if (!dependsOn) return true;
|
|
@@ -146,11 +174,13 @@ function isDependencyMatch(feature, dismissedIds, dependencyState) {
|
|
|
146
174
|
}
|
|
147
175
|
return true;
|
|
148
176
|
}
|
|
149
|
-
function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
177
|
+
function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
150
178
|
if (dismissedIds.has(feature.id)) return false;
|
|
151
179
|
if (!isAudienceMatch(feature, userContext, matchAudience)) return false;
|
|
152
180
|
if (!isDependencyMatch(feature, dismissedIds)) return false;
|
|
153
181
|
if (!isVersionMatch(feature, appVersion)) return false;
|
|
182
|
+
if (!isFlagMatch(feature)) return false;
|
|
183
|
+
if (!isProductMatch(feature)) return false;
|
|
154
184
|
if (!isTriggerMatch(feature.trigger)) return false;
|
|
155
185
|
const nowMs = now.getTime();
|
|
156
186
|
if (feature.publishAt) {
|
|
@@ -166,7 +196,7 @@ function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(
|
|
|
166
196
|
}
|
|
167
197
|
return true;
|
|
168
198
|
}
|
|
169
|
-
function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
199
|
+
function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
170
200
|
const watermark = storage.getWatermark();
|
|
171
201
|
const dismissedIds = storage.getDismissedIds();
|
|
172
202
|
return manifest.filter(
|
|
@@ -180,7 +210,7 @@ function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), use
|
|
|
180
210
|
appVersion)
|
|
181
211
|
);
|
|
182
212
|
}
|
|
183
|
-
function hasNewFeature(manifest, sidebarKey, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
213
|
+
function hasNewFeature(manifest, sidebarKey, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
184
214
|
const watermark = storage.getWatermark();
|
|
185
215
|
const dismissedIds = storage.getDismissedIds();
|
|
186
216
|
return manifest.some(
|
|
@@ -452,10 +482,11 @@ var NewBadge = vue.defineComponent({
|
|
|
452
482
|
};
|
|
453
483
|
}
|
|
454
484
|
});
|
|
455
|
-
var dynamicRequire =
|
|
485
|
+
var dynamicRequire = typeof moduleApi__namespace.createRequire === "function" ? moduleApi__namespace.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('vue.cjs', document.baseURI).href))) : null;
|
|
456
486
|
var cachedMarked = null;
|
|
457
487
|
var cachedShiki = null;
|
|
458
488
|
function optionalRequire(name) {
|
|
489
|
+
if (!dynamicRequire) return null;
|
|
459
490
|
try {
|
|
460
491
|
return dynamicRequire(name);
|
|
461
492
|
} catch (error) {
|
package/dist/vue.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/semver.ts","../src/triggers.ts","../src/core.ts","../src/vue/context.ts","../src/vue/provider.ts","../src/vue/composables/use-feature-drop.ts","../src/vue/composables/use-new-feature.ts","../src/vue/composables/use-new-count.ts","../src/vue/composables/use-tab-notification.ts","../src/vue/components/new-badge.ts","../src/markdown.ts","../src/vue/components/changelog-widget.ts","../src/vue/components/spotlight.ts","../src/vue/components/banner.ts","../src/vue/components/toast.ts"],"names":["defineComponent","ref","watch","computed","provide","inject","isNew","onBeforeUnmount","h","createRequire","sanitized","decoded"],"mappings":"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","file":"vue.cjs","sourcesContent":["// Minimal semver comparison utilities (no build metadata sorting needed)\n\nexport type Comparator = \">=\" | \"<=\" | \">\" | \"<\" | \"=\";\n\nexport interface SemverParts {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/;\n\nexport function parseSemver(input: string): SemverParts | null {\n const match = input.trim().match(SEMVER_REGEX);\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : [],\n };\n}\n\nexport function compareSemver(a: string, b: string): number {\n const pa = parseSemver(a);\n const pb = parseSemver(b);\n if (!pa || !pb) return 0;\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (pa[key] !== pb[key]) return pa[key] - pb[key];\n }\n\n // Handle prerelease: absence > presence, otherwise lexicographic\n const aPre = pa.prerelease;\n const bPre = pb.prerelease;\n if (aPre.length === 0 && bPre.length === 0) return 0;\n if (aPre.length === 0) return 1;\n if (bPre.length === 0) return -1;\n\n const len = Math.max(aPre.length, bPre.length);\n for (let i = 0; i < len; i++) {\n const ai = aPre[i];\n const bi = bPre[i];\n if (ai === undefined) return -1;\n if (bi === undefined) return 1;\n const aNum = Number(ai);\n const bNum = Number(bi);\n const aIsNum = Number.isInteger(aNum);\n const bIsNum = Number.isInteger(bNum);\n if (aIsNum && bIsNum && aNum !== bNum) return aNum - bNum;\n if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;\n if (ai !== bi) return ai < bi ? -1 : 1;\n }\n return 0;\n}\n\nfunction parseComparator(comp: string): { op: Comparator; version: string } | null {\n const match = comp.trim().match(/^(>=|<=|>|<|=)?\\\\s*(.+)$/);\n if (!match) return null;\n const op = (match[1] as Comparator) || \">=\";\n const version = match[2];\n if (!parseSemver(version)) return null;\n return { op, version };\n}\n\nfunction satisfiesComparator(version: string, comp: { op: Comparator; version: string }): boolean {\n const diff = compareSemver(version, comp.version);\n switch (comp.op) {\n case \">\":\n return diff > 0;\n case \">=\":\n return diff >= 0;\n case \"<\":\n return diff < 0;\n case \"<=\":\n return diff <= 0;\n case \"=\":\n return diff === 0;\n default:\n return false;\n }\n}\n\n// Space-separated comparator list (AND semantics), e.g. \">=2.5.0 <3.0.0\"\nexport function satisfiesRange(version: string, range: string): boolean {\n const parts = range.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return true;\n for (const part of parts) {\n const comp = parseComparator(part);\n if (!comp) return false;\n if (!satisfiesComparator(version, comp)) return false;\n }\n return true;\n}\n","import type { FeatureEntry, FeatureTrigger, TriggerContext } from \"./types\";\n\nfunction wildcardToRegExp(value: string): RegExp {\n const escaped = value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = `^${escaped.replace(/\\*/g, \".*\")}$`;\n return new RegExp(pattern);\n}\n\nfunction matchPath(path: string, pattern: string | RegExp): boolean {\n if (pattern instanceof RegExp) return pattern.test(path);\n if (!pattern) return false;\n if (pattern.includes(\"*\")) return wildcardToRegExp(pattern).test(path);\n return path === pattern || path.startsWith(pattern);\n}\n\nexport function isTriggerMatch(trigger: FeatureTrigger | undefined, context?: TriggerContext): boolean {\n if (!trigger) return true;\n if (!context) return false;\n\n if (trigger.type === \"page\") {\n const path = context.path;\n if (!path) return false;\n return matchPath(path, trigger.match);\n }\n\n if (trigger.type === \"usage\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.event] ?? 0;\n return count >= (trigger.minActions ?? 1);\n }\n\n if (trigger.type === \"time\") {\n const elapsedMs = context.elapsedMs ?? 0;\n return elapsedMs >= trigger.minSeconds * 1000;\n }\n\n if (trigger.type === \"milestone\") {\n return context.milestones?.has(trigger.event) ?? false;\n }\n\n if (trigger.type === \"frustration\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.pattern] ?? 0;\n return count >= (trigger.threshold ?? 1);\n }\n\n if (trigger.type === \"scroll\") {\n return (context.scrollPercent ?? 0) >= (trigger.minPercent ?? 50);\n }\n\n try {\n return trigger.evaluate(context);\n } catch {\n return false;\n }\n}\n\nexport class TriggerEngine {\n private context: TriggerContext;\n\n constructor(initial?: TriggerContext) {\n this.context = {\n path: initial?.path,\n events: new Set(initial?.events ?? []),\n milestones: new Set(initial?.milestones ?? []),\n usage: { ...(initial?.usage ?? {}) },\n elapsedMs: initial?.elapsedMs ?? 0,\n scrollPercent: initial?.scrollPercent ?? 0,\n metadata: { ...(initial?.metadata ?? {}) },\n };\n }\n\n setPath(path: string): void {\n this.context.path = path;\n }\n\n trackEvent(event: string): void {\n const next = new Set(this.context.events ?? new Set<string>());\n next.add(event);\n this.context.events = next;\n }\n\n trackUsage(event: string, delta = 1): void {\n const usage = { ...(this.context.usage ?? {}) };\n usage[event] = (usage[event] ?? 0) + Math.max(1, delta);\n this.context.usage = usage;\n }\n\n trackMilestone(event: string): void {\n const next = new Set(this.context.milestones ?? new Set<string>());\n next.add(event);\n this.context.milestones = next;\n }\n\n setElapsedMs(elapsedMs: number): void {\n this.context.elapsedMs = Math.max(0, elapsedMs);\n }\n\n setScrollPercent(scrollPercent: number): void {\n const clamped = Math.max(0, Math.min(100, scrollPercent));\n this.context.scrollPercent = clamped;\n }\n\n setMetadata(next: Record<string, unknown>): void {\n this.context.metadata = { ...next };\n }\n\n getContext(): TriggerContext {\n return {\n path: this.context.path,\n events: new Set(this.context.events ?? []),\n milestones: new Set(this.context.milestones ?? []),\n usage: { ...(this.context.usage ?? {}) },\n elapsedMs: this.context.elapsedMs,\n scrollPercent: this.context.scrollPercent,\n metadata: { ...(this.context.metadata ?? {}) },\n };\n }\n\n evaluate(trigger: FeatureTrigger | undefined): boolean {\n return isTriggerMatch(trigger, this.context);\n }\n\n evaluateFeature(feature: Pick<FeatureEntry, \"trigger\">): boolean {\n return this.evaluate(feature.trigger);\n }\n}\n","import type {\n AudienceMatchFn,\n AudienceRule,\n FeatureEntry,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n FeatureDependencyState,\n TriggerContext,\n} from \"./types\";\nimport { compareSemver, satisfiesRange } from \"./semver\";\nimport { isTriggerMatch } from \"./triggers\";\n\n/**\n * Default audience matching logic.\n *\n * For each specified field (plan, role, region), checks if the user's\n * value is included in the allowed list. Fields use AND logic between them,\n * OR logic within each field's array. The `custom` field is ignored by\n * the default matcher — use a custom `AudienceMatchFn` for that.\n */\nexport function matchesAudience(\n audience: AudienceRule,\n userContext: UserContext,\n): boolean {\n if (audience.plan && audience.plan.length > 0) {\n if (!userContext.plan || !audience.plan.includes(userContext.plan)) {\n return false;\n }\n }\n if (audience.role && audience.role.length > 0) {\n if (!userContext.role || !audience.role.includes(userContext.role)) {\n return false;\n }\n }\n if (audience.region && audience.region.length > 0) {\n if (!userContext.region || !audience.region.includes(userContext.region)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Check if a feature's audience allows the given user context.\n *\n * - No `audience` field → visible to all\n * - Empty `audience` ({}) → visible to all\n * - `audience` specified but no `userContext` → hidden (safe default)\n * - Otherwise, delegate to `matchFn` (or default `matchesAudience`)\n */\nfunction isAudienceMatch(\n feature: FeatureEntry,\n userContext?: UserContext,\n matchFn?: AudienceMatchFn,\n): boolean {\n // No audience restriction → show to everyone\n if (!feature.audience) return true;\n\n // Check if audience is empty (no fields with values)\n const { plan, role, region, custom } = feature.audience;\n const hasRules =\n (plan && plan.length > 0) ||\n (role && role.length > 0) ||\n (region && region.length > 0) ||\n (custom && Object.keys(custom).length > 0);\n if (!hasRules) return true;\n\n // Audience specified but no user context → hidden (safe default)\n if (!userContext) return false;\n\n // Use custom matcher if provided, otherwise default\n if (matchFn) return matchFn(feature.audience, userContext);\n return matchesAudience(feature.audience, userContext);\n}\n\nfunction isVersionMatch(feature: FeatureEntry, appVersion?: string): boolean {\n const v = feature.version;\n if (!v || typeof v === \"string\") return true; // string = display only\n if (!appVersion) return false; // Safe default when constraints exist\n if (!v.introduced && !v.showNewUntil && !v.deprecatedAt && !v.showIn) return true;\n\n // Range check\n if (v.showIn && !satisfiesRange(appVersion, v.showIn)) return false;\n\n if (v.introduced && compareSemver(appVersion, v.introduced) < 0) return false;\n if (v.deprecatedAt && compareSemver(appVersion, v.deprecatedAt) >= 0) return false;\n\n // showNewUntil gates \"new\" state only\n if (v.showNewUntil && compareSemver(appVersion, v.showNewUntil) >= 0) return false;\n\n return true;\n}\n\nfunction isDependencyMatch(\n feature: FeatureEntry,\n dismissedIds: ReadonlySet<string>,\n dependencyState?: FeatureDependencyState,\n): boolean {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return true;\n\n const seenIds = dependencyState?.seenIds;\n const clickedIds = dependencyState?.clickedIds;\n const dismissedDependencyIds = dependencyState?.dismissedIds ?? dismissedIds;\n\n if (dependsOn.seen && dependsOn.seen.length > 0) {\n for (const id of dependsOn.seen) {\n const seen = seenIds?.has(id) ?? false;\n if (!seen && !dismissedDependencyIds.has(id)) return false;\n }\n }\n\n if (dependsOn.clicked && dependsOn.clicked.length > 0) {\n for (const id of dependsOn.clicked) {\n if (!(clickedIds?.has(id) ?? false)) return false;\n }\n }\n\n if (dependsOn.dismissed && dependsOn.dismissed.length > 0) {\n for (const id of dependsOn.dismissed) {\n if (!dismissedDependencyIds.has(id)) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if a single feature should show as \"new\".\n *\n * A feature is \"new\" when ALL of these are true:\n * 1. Current time is before `showNewUntil`\n * 2. Feature was released after the watermark (or no watermark exists)\n * 3. Feature has not been individually dismissed\n * 4. If `publishAt` is set, current time must be after it (scheduled publishing)\n * 5. If `audience` is set, user must match the targeting rules\n */\nexport function isNew(\n feature: FeatureEntry,\n watermark: string | null,\n dismissedIds: ReadonlySet<string>,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): boolean {\n // Already dismissed by the user on this device\n if (dismissedIds.has(feature.id)) return false;\n\n // Audience targeting — check before time-based checks\n if (!isAudienceMatch(feature, userContext, matchAudience)) return false;\n\n // Dependency targeting — defer features until prerequisites are satisfied\n if (!isDependencyMatch(feature, dismissedIds, dependencyState)) return false;\n\n // Version targeting — requires appVersion when constraints exist\n if (!isVersionMatch(feature, appVersion)) return false;\n\n // Contextual trigger rules — show only when trigger condition is satisfied.\n if (!isTriggerMatch(feature.trigger, triggerContext)) return false;\n\n const nowMs = now.getTime();\n\n // Scheduled publishing — hidden until publishAt\n if (feature.publishAt) {\n const publishMs = new Date(feature.publishAt).getTime();\n if (nowMs < publishMs) return false;\n }\n\n const showUntilMs = new Date(feature.showNewUntil).getTime();\n\n // Past the display window\n if (nowMs >= showUntilMs) return false;\n\n // If there's a watermark, feature must have been released after it\n if (watermark) {\n const watermarkMs = new Date(watermark).getTime();\n const releasedMs = new Date(feature.releasedAt).getTime();\n if (releasedMs <= watermarkMs) return false;\n }\n\n return true;\n}\n\n/**\n * Get all features that are currently \"new\" for this user.\n */\nexport function getNewFeatures(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter((f) =>\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ),\n );\n}\n\n/**\n * Get the count of new features.\n */\nexport function getNewFeatureCount(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): number {\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ).length;\n}\n\n/**\n * Check if a specific sidebar key has a new feature.\n */\nexport function hasNewFeature(\n manifest: FeatureManifest,\n sidebarKey: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): boolean {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.some(\n (f) =>\n f.sidebarKey === sidebarKey &&\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ),\n );\n}\n\n/**\n * Get all features sorted by priority (critical first) then by release date (newest first).\n */\nexport function getNewFeaturesSorted(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n): FeatureEntry[] {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n ).sort(\n (a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return (\n new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime()\n );\n },\n );\n}\n","import type { ComputedRef, InjectionKey, Ref } from \"vue\";\nimport type { FeatureEntry, FeatureManifest } from \"../types\";\n\nexport interface FeatureDropVueContextValue {\n manifest: FeatureManifest;\n newFeatures: Ref<FeatureEntry[]>;\n newCount: ComputedRef<number>;\n newFeaturesSorted: ComputedRef<FeatureEntry[]>;\n isNew: (sidebarKey: string) => boolean;\n dismiss: (id: string) => void;\n dismissAll: () => Promise<void>;\n getFeature: (sidebarKey: string) => FeatureEntry | undefined;\n}\n\nexport const FeatureDropVueContextKey: InjectionKey<FeatureDropVueContextValue> =\n Symbol(\"FeatureDropVueContext\");\n","import {\n computed,\n defineComponent,\n provide,\n ref,\n watch,\n type PropType,\n} from \"vue\";\nimport { getNewFeatures, hasNewFeature } from \"../core\";\nimport { FeatureDropVueContextKey } from \"./context\";\nimport type {\n AnalyticsCallbacks,\n AudienceMatchFn,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n} from \"../types\";\n\nexport const FeatureDropProvider = defineComponent({\n name: \"FeatureDropProvider\",\n props: {\n manifest: {\n type: Array as PropType<FeatureManifest>,\n required: true,\n },\n storage: {\n type: Object as PropType<StorageAdapter>,\n required: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n userContext: {\n type: Object as PropType<UserContext>,\n required: false,\n },\n matchAudience: {\n type: Function as PropType<AudienceMatchFn>,\n required: false,\n },\n appVersion: {\n type: String,\n required: false,\n },\n },\n setup(props, { slots }) {\n const newFeatures = ref(\n getNewFeatures(\n props.manifest,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n ),\n );\n\n const recompute = (): void => {\n newFeatures.value = getNewFeatures(\n props.manifest,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n );\n };\n\n watch(\n () => [props.manifest, props.storage, props.userContext, props.matchAudience, props.appVersion],\n recompute,\n { deep: false },\n );\n\n const dismiss = (id: string): void => {\n const feature = newFeatures.value.find((f) => f.id === id);\n props.storage.dismiss(id);\n if (feature) {\n props.analytics?.onFeatureDismissed?.(feature);\n }\n recompute();\n };\n\n const dismissAll = async (): Promise<void> => {\n await props.storage.dismissAll(new Date());\n newFeatures.value = [];\n props.analytics?.onAllDismissed?.();\n };\n\n const newCount = computed(() => newFeatures.value.length);\n const newFeaturesSorted = computed(() => {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return [...newFeatures.value].sort((a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime();\n });\n });\n\n const getFeature = (sidebarKey: string) =>\n newFeatures.value.find((f) => f.sidebarKey === sidebarKey);\n\n const isNewFn = (sidebarKey: string) =>\n hasNewFeature(\n props.manifest,\n sidebarKey,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n );\n\n provide(FeatureDropVueContextKey, {\n manifest: props.manifest,\n newFeatures,\n newCount,\n newFeaturesSorted,\n isNew: isNewFn,\n dismiss,\n dismissAll,\n getFeature,\n });\n\n return () => slots.default?.();\n },\n});\n","import { inject } from \"vue\";\nimport { FeatureDropVueContextKey, type FeatureDropVueContextValue } from \"../context\";\n\nexport function useFeatureDrop(): FeatureDropVueContextValue {\n const context = inject(FeatureDropVueContextKey, null);\n if (!context) {\n throw new Error(\"useFeatureDrop must be used within a <FeatureDropProvider>\");\n }\n return context;\n}\n","import { computed } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport function useNewFeature(sidebarKey: string) {\n const { isNew, getFeature, dismiss } = useFeatureDrop();\n\n const feature = computed(() => getFeature(sidebarKey));\n const isNewValue = computed(() => isNew(sidebarKey));\n const dismissFeature = (): void => {\n const value = feature.value;\n if (value) {\n dismiss(value.id);\n }\n };\n\n return {\n feature,\n isNew: isNewValue,\n dismiss: dismissFeature,\n };\n}\n","import { computed } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport function useNewCount() {\n const { newCount } = useFeatureDrop();\n return computed(() => newCount.value);\n}\n","import { onBeforeUnmount, watch } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport interface UseTabNotificationOptions {\n enabled?: boolean;\n template?: string;\n flash?: boolean;\n flashInterval?: number;\n}\n\nexport function useTabNotification(options: UseTabNotificationOptions = {}): void {\n const {\n enabled = true,\n template = \"({count}) {title}\",\n flash = false,\n flashInterval = 1500,\n } = options;\n\n const { newCount } = useFeatureDrop();\n if (typeof document === \"undefined\") return;\n\n const originalTitle = document.title;\n let interval: ReturnType<typeof setInterval> | null = null;\n\n const stop = watch(\n () => newCount.value,\n (count) => {\n if (!enabled || count === 0) {\n document.title = originalTitle;\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n return;\n }\n\n const nextTitle = template\n .replace(\"{count}\", String(count))\n .replace(\"{title}\", originalTitle);\n\n if (!flash) {\n document.title = nextTitle;\n return;\n }\n\n let showNotification = true;\n document.title = nextTitle;\n if (interval) clearInterval(interval);\n interval = setInterval(() => {\n showNotification = !showNotification;\n document.title = showNotification ? nextTitle : originalTitle;\n }, flashInterval);\n },\n { immediate: true },\n );\n\n onBeforeUnmount(() => {\n stop();\n document.title = originalTitle;\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n });\n}\n","import {\n defineComponent,\n h,\n type CSSProperties,\n type PropType,\n type VNodeChild,\n} from \"vue\";\n\nexport const NewBadge = defineComponent({\n name: \"NewBadge\",\n props: {\n variant: {\n type: String as PropType<\"pill\" | \"dot\" | \"count\">,\n default: \"pill\",\n },\n show: {\n type: Boolean,\n default: true,\n },\n count: {\n type: Number,\n required: false,\n },\n label: {\n type: String,\n default: \"New\",\n },\n },\n setup(props, { slots }) {\n return () => {\n if (slots.default) {\n return slots.default({ isNew: props.show });\n }\n if (!props.show) return null;\n\n const baseStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontFamily: \"inherit\",\n };\n\n let style: CSSProperties = baseStyle;\n let content: VNodeChild = props.label;\n if (props.variant === \"dot\") {\n style = {\n ...baseStyle,\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"9999px\",\n backgroundColor: \"var(--featuredrop-color, #f59e0b)\",\n };\n content = null;\n } else if (props.variant === \"count\") {\n style = {\n ...baseStyle,\n minWidth: \"18px\",\n height: \"18px\",\n padding: \"0 4px\",\n borderRadius: \"9999px\",\n fontSize: \"11px\",\n fontWeight: 700,\n color: \"var(--featuredrop-count-color, #fff)\",\n backgroundColor: \"var(--featuredrop-count-bg, #f59e0b)\",\n };\n content = props.count ?? 0;\n } else {\n style = {\n ...baseStyle,\n padding: \"2px 6px\",\n borderRadius: \"9999px\",\n fontSize: \"10px\",\n fontWeight: 700,\n color: \"var(--featuredrop-color, #b45309)\",\n backgroundColor: \"var(--featuredrop-bg, rgba(245,158,11,0.15))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n };\n }\n\n return h(\n \"span\",\n {\n \"data-featuredrop\": props.variant,\n style,\n },\n content ?? undefined,\n );\n };\n },\n});\n","import { createRequire } from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire = createRequire(import.meta.url);\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/<(\\/?)([a-z0-9]+)([^>]*)>/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: \n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import { defineComponent, h, ref, type PropType } from \"vue\";\nimport type { AnalyticsCallbacks, FeatureEntry } from \"../../types\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const ChangelogWidget = defineComponent({\n name: \"ChangelogWidget\",\n props: {\n title: {\n type: String,\n default: \"What's New\",\n },\n triggerLabel: {\n type: String,\n default: \"What's New\",\n },\n showCount: {\n type: Boolean,\n default: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n },\n setup(props, { slots }) {\n const { newFeaturesSorted, newCount, dismiss, dismissAll } = useFeatureDrop();\n const isOpen = ref(false);\n\n const close = (): void => {\n isOpen.value = false;\n props.analytics?.onWidgetClosed?.();\n };\n\n const open = (): void => {\n isOpen.value = true;\n props.analytics?.onWidgetOpened?.();\n };\n\n const toggle = (): void => {\n if (isOpen.value) close();\n else open();\n };\n\n const renderEntry = (feature: FeatureEntry) => {\n if (slots.entry) {\n return slots.entry({ feature, dismiss: () => dismiss(feature.id) });\n }\n return h(\"div\", { style: { padding: \"10px 0\", borderBottom: \"1px solid #e5e7eb\" } }, [\n h(\"p\", { style: { margin: \"0 0 4px\", fontWeight: 600 } }, feature.label),\n feature.description\n ? h(\"div\", {\n style: { margin: \"0 0 6px\", color: \"#6b7280\", fontSize: \"13px\", lineHeight: 1.5 },\n innerHTML: parseDescription(feature.description),\n })\n : null,\n h(\n \"button\",\n {\n onClick: () => dismiss(feature.id),\n style: {\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n },\n },\n \"Dismiss\",\n ),\n ]);\n };\n\n return () => {\n if (slots.default) {\n return slots.default({\n isOpen: isOpen.value,\n toggle,\n open,\n close,\n features: newFeaturesSorted.value,\n count: newCount.value,\n dismiss,\n dismissAll,\n });\n }\n\n return h(\"div\", { \"data-featuredrop-widget\": true }, [\n h(\n \"button\",\n {\n onClick: toggle,\n style: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n border: \"1px solid #d1d5db\",\n background: \"#fff\",\n borderRadius: \"10px\",\n padding: \"8px 12px\",\n cursor: \"pointer\",\n },\n },\n [\n props.triggerLabel,\n props.showCount && newCount.value > 0\n ? h(\n \"span\",\n {\n style: {\n display: \"inline-flex\",\n minWidth: \"18px\",\n height: \"18px\",\n borderRadius: \"999px\",\n background: \"#f59e0b\",\n color: \"#fff\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 700,\n padding: \"0 4px\",\n },\n },\n String(newCount.value),\n )\n : null,\n ],\n ),\n isOpen.value\n ? h(\n \"div\",\n {\n role: \"dialog\",\n style: {\n marginTop: \"8px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"12px\",\n minWidth: \"300px\",\n },\n },\n [\n h(\"div\", { style: { display: \"flex\", justifyContent: \"space-between\", marginBottom: \"8px\" } }, [\n h(\"strong\", props.title),\n h(\"button\", { onClick: close, style: { border: \"none\", background: \"transparent\", cursor: \"pointer\" } }, \"x\"),\n ]),\n newFeaturesSorted.value.length === 0\n ? h(\"p\", { style: { margin: 0, color: \"#6b7280\" } }, \"You're all caught up!\")\n : newFeaturesSorted.value.map((feature) => renderEntry(feature)),\n newFeaturesSorted.value.length > 0\n ? h(\n \"button\",\n {\n onClick: () => void dismissAll(),\n style: {\n marginTop: \"10px\",\n border: \"none\",\n background: \"transparent\",\n color: \"#2563eb\",\n cursor: \"pointer\",\n padding: 0,\n },\n },\n \"Mark all as read\",\n )\n : null,\n ],\n )\n : null,\n ]);\n };\n },\n});\n","import { computed, defineComponent, h, ref } from \"vue\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Spotlight = defineComponent({\n name: \"Spotlight\",\n props: {\n featureId: {\n type: String,\n required: true,\n },\n label: {\n type: String,\n default: \"New feature\",\n },\n },\n setup(props, { slots }) {\n const { newFeatures, dismiss } = useFeatureDrop();\n const open = ref(false);\n const feature = computed(() => newFeatures.value.find((f) => f.id === props.featureId));\n\n return () => {\n if (slots.default) {\n return slots.default({\n feature: feature.value,\n isActive: !!feature.value,\n isTooltipOpen: open.value,\n openTooltip: () => {\n open.value = true;\n },\n closeTooltip: () => {\n open.value = false;\n },\n dismiss: () => dismiss(props.featureId),\n });\n }\n if (!feature.value) return null;\n\n return h(\"div\", { \"data-featuredrop-spotlight\": true, style: { display: \"inline-block\", position: \"relative\" } }, [\n h(\n \"button\",\n {\n onClick: () => {\n open.value = !open.value;\n },\n style: {\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"9999px\",\n border: \"2px solid #f59e0b\",\n background: \"#fff\",\n cursor: \"pointer\",\n },\n \"aria-label\": props.label,\n },\n \"\",\n ),\n open.value\n ? h(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"24px\",\n left: 0,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"10px\",\n width: \"240px\",\n zIndex: 30,\n },\n },\n [\n h(\"p\", { style: { margin: \"0 0 4px\", fontWeight: 600 } }, feature.value.label),\n feature.value.description\n ? h(\"div\", {\n style: { marginBottom: \"8px\", color: \"#6b7280\", fontSize: \"13px\" },\n innerHTML: parseDescription(feature.value.description),\n })\n : null,\n h(\n \"button\",\n {\n onClick: () => {\n dismiss(props.featureId);\n open.value = false;\n },\n style: {\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n cursor: \"pointer\",\n },\n },\n \"Got it\",\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n","import { computed, defineComponent, h, type PropType } from \"vue\";\nimport type { AnalyticsCallbacks } from \"../../types\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Banner = defineComponent({\n name: \"Banner\",\n props: {\n featureId: {\n type: String,\n required: true,\n },\n dismissible: {\n type: Boolean,\n default: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n },\n setup(props, { slots }) {\n const { newFeatures, dismiss } = useFeatureDrop();\n const feature = computed(() => newFeatures.value.find((f) => f.id === props.featureId));\n\n return () => {\n if (slots.default) {\n return slots.default({\n feature: feature.value,\n isActive: !!feature.value,\n dismiss: () => dismiss(props.featureId),\n });\n }\n if (!feature.value) return null;\n\n return h(\n \"div\",\n {\n \"data-featuredrop-banner\": true,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"8px\",\n border: \"1px solid #fbbf24\",\n background: \"#fffbeb\",\n color: \"#92400e\",\n borderRadius: \"10px\",\n padding: \"10px 12px\",\n },\n },\n [\n h(\"div\", [\n h(\"strong\", feature.value.label),\n feature.value.description\n ? h(\"span\", {\n style: { marginLeft: \"6px\" },\n innerHTML: parseDescription(feature.value.description),\n })\n : null,\n ]),\n props.dismissible\n ? h(\n \"button\",\n {\n onClick: () => {\n dismiss(props.featureId);\n props.analytics?.onFeatureDismissed?.(feature.value!);\n },\n style: {\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n lineHeight: 1,\n },\n },\n \"x\",\n )\n : null,\n ],\n );\n };\n },\n});\n","import { computed, defineComponent, h } from \"vue\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Toast = defineComponent({\n name: \"Toast\",\n props: {\n maxVisible: {\n type: Number,\n default: 3,\n },\n },\n setup(props, { slots }) {\n const { newFeaturesSorted, dismiss } = useFeatureDrop();\n const visible = computed(() => newFeaturesSorted.value.slice(0, props.maxVisible));\n\n return () => {\n if (slots.default) {\n return slots.default({\n toasts: visible.value,\n dismiss,\n });\n }\n if (visible.value.length === 0) return null;\n\n return h(\n \"div\",\n {\n \"data-featuredrop-toast-container\": true,\n style: {\n position: \"fixed\",\n right: \"16px\",\n bottom: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n zIndex: 40,\n },\n },\n visible.value.map((feature) =>\n h(\"div\", {\n key: feature.id,\n style: {\n width: \"320px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"10px 12px\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.08)\",\n },\n }, [\n h(\"div\", { style: { display: \"flex\", justifyContent: \"space-between\", gap: \"8px\" } }, [\n h(\"strong\", feature.label),\n h(\n \"button\",\n {\n onClick: () => dismiss(feature.id),\n style: { border: \"none\", background: \"transparent\", cursor: \"pointer\" },\n },\n \"x\",\n ),\n ]),\n feature.description\n ? h(\"div\", {\n style: { marginTop: \"4px\", color: \"#6b7280\", fontSize: \"13px\" },\n innerHTML: parseDescription(feature.description),\n })\n : null,\n ]),\n ),\n );\n };\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/semver.ts","../src/triggers.ts","../src/core.ts","../src/vue/context.ts","../src/vue/provider.ts","../src/vue/composables/use-feature-drop.ts","../src/vue/composables/use-new-feature.ts","../src/vue/composables/use-new-count.ts","../src/vue/composables/use-tab-notification.ts","../src/vue/components/new-badge.ts","../src/markdown.ts","../src/vue/components/changelog-widget.ts","../src/vue/components/spotlight.ts","../src/vue/components/banner.ts","../src/vue/components/toast.ts"],"names":["defineComponent","ref","watch","computed","provide","inject","isNew","onBeforeUnmount","h","moduleApi","sanitized","decoded"],"mappings":"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","file":"vue.cjs","sourcesContent":["// Minimal semver comparison utilities (no build metadata sorting needed)\n\nexport type Comparator = \">=\" | \"<=\" | \">\" | \"<\" | \"=\";\n\nexport interface SemverParts {\n major: number;\n minor: number;\n patch: number;\n prerelease: string[];\n}\n\nconst SEMVER_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?/;\n\nexport function parseSemver(input: string): SemverParts | null {\n const match = input.trim().match(SEMVER_REGEX);\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ? match[4].split(\".\") : [],\n };\n}\n\nexport function compareSemver(a: string, b: string): number {\n const pa = parseSemver(a);\n const pb = parseSemver(b);\n if (!pa || !pb) return 0;\n\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (pa[key] !== pb[key]) return pa[key] - pb[key];\n }\n\n // Handle prerelease: absence > presence, otherwise lexicographic\n const aPre = pa.prerelease;\n const bPre = pb.prerelease;\n if (aPre.length === 0 && bPre.length === 0) return 0;\n if (aPre.length === 0) return 1;\n if (bPre.length === 0) return -1;\n\n const len = Math.max(aPre.length, bPre.length);\n for (let i = 0; i < len; i++) {\n const ai = aPre[i];\n const bi = bPre[i];\n if (ai === undefined) return -1;\n if (bi === undefined) return 1;\n const aNum = Number(ai);\n const bNum = Number(bi);\n const aIsNum = Number.isInteger(aNum);\n const bIsNum = Number.isInteger(bNum);\n if (aIsNum && bIsNum && aNum !== bNum) return aNum - bNum;\n if (aIsNum !== bIsNum) return aIsNum ? -1 : 1;\n if (ai !== bi) return ai < bi ? -1 : 1;\n }\n return 0;\n}\n\nfunction parseComparator(comp: string): { op: Comparator; version: string } | null {\n const match = comp.trim().match(/^(>=|<=|>|<|=)?\\\\s*(.+)$/);\n if (!match) return null;\n const op = (match[1] as Comparator) || \">=\";\n const version = match[2];\n if (!parseSemver(version)) return null;\n return { op, version };\n}\n\nfunction satisfiesComparator(version: string, comp: { op: Comparator; version: string }): boolean {\n const diff = compareSemver(version, comp.version);\n switch (comp.op) {\n case \">\":\n return diff > 0;\n case \">=\":\n return diff >= 0;\n case \"<\":\n return diff < 0;\n case \"<=\":\n return diff <= 0;\n case \"=\":\n return diff === 0;\n default:\n return false;\n }\n}\n\n// Space-separated comparator list (AND semantics), e.g. \">=2.5.0 <3.0.0\"\nexport function satisfiesRange(version: string, range: string): boolean {\n const parts = range.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return true;\n for (const part of parts) {\n const comp = parseComparator(part);\n if (!comp) return false;\n if (!satisfiesComparator(version, comp)) return false;\n }\n return true;\n}\n","import type { FeatureEntry, FeatureTrigger, TriggerContext } from \"./types\";\n\nfunction wildcardToRegExp(value: string): RegExp {\n const escaped = value.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = `^${escaped.replace(/\\*/g, \".*\")}$`;\n return new RegExp(pattern);\n}\n\nfunction matchPath(path: string, pattern: string | RegExp): boolean {\n if (pattern instanceof RegExp) return pattern.test(path);\n if (!pattern) return false;\n if (pattern.includes(\"*\")) return wildcardToRegExp(pattern).test(path);\n return path === pattern || path.startsWith(pattern);\n}\n\nexport function isTriggerMatch(trigger: FeatureTrigger | undefined, context?: TriggerContext): boolean {\n if (!trigger) return true;\n if (!context) return false;\n\n if (trigger.type === \"page\") {\n const path = context.path;\n if (!path) return false;\n return matchPath(path, trigger.match);\n }\n\n if (trigger.type === \"usage\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.event] ?? 0;\n return count >= (trigger.minActions ?? 1);\n }\n\n if (trigger.type === \"time\") {\n const elapsedMs = context.elapsedMs ?? 0;\n return elapsedMs >= trigger.minSeconds * 1000;\n }\n\n if (trigger.type === \"milestone\") {\n return context.milestones?.has(trigger.event) ?? false;\n }\n\n if (trigger.type === \"frustration\") {\n const usage = context.usage ?? {};\n const count = usage[trigger.pattern] ?? 0;\n return count >= (trigger.threshold ?? 1);\n }\n\n if (trigger.type === \"scroll\") {\n return (context.scrollPercent ?? 0) >= (trigger.minPercent ?? 50);\n }\n\n try {\n return trigger.evaluate(context);\n } catch {\n return false;\n }\n}\n\nexport class TriggerEngine {\n private context: TriggerContext;\n\n constructor(initial?: TriggerContext) {\n this.context = {\n path: initial?.path,\n events: new Set(initial?.events ?? []),\n milestones: new Set(initial?.milestones ?? []),\n usage: { ...(initial?.usage ?? {}) },\n elapsedMs: initial?.elapsedMs ?? 0,\n scrollPercent: initial?.scrollPercent ?? 0,\n metadata: { ...(initial?.metadata ?? {}) },\n };\n }\n\n setPath(path: string): void {\n this.context.path = path;\n }\n\n trackEvent(event: string): void {\n const next = new Set(this.context.events ?? new Set<string>());\n next.add(event);\n this.context.events = next;\n }\n\n trackUsage(event: string, delta = 1): void {\n const usage = { ...(this.context.usage ?? {}) };\n usage[event] = (usage[event] ?? 0) + Math.max(1, delta);\n this.context.usage = usage;\n }\n\n trackMilestone(event: string): void {\n const next = new Set(this.context.milestones ?? new Set<string>());\n next.add(event);\n this.context.milestones = next;\n }\n\n setElapsedMs(elapsedMs: number): void {\n this.context.elapsedMs = Math.max(0, elapsedMs);\n }\n\n setScrollPercent(scrollPercent: number): void {\n const clamped = Math.max(0, Math.min(100, scrollPercent));\n this.context.scrollPercent = clamped;\n }\n\n setMetadata(next: Record<string, unknown>): void {\n this.context.metadata = { ...next };\n }\n\n getContext(): TriggerContext {\n return {\n path: this.context.path,\n events: new Set(this.context.events ?? []),\n milestones: new Set(this.context.milestones ?? []),\n usage: { ...(this.context.usage ?? {}) },\n elapsedMs: this.context.elapsedMs,\n scrollPercent: this.context.scrollPercent,\n metadata: { ...(this.context.metadata ?? {}) },\n };\n }\n\n evaluate(trigger: FeatureTrigger | undefined): boolean {\n return isTriggerMatch(trigger, this.context);\n }\n\n evaluateFeature(feature: Pick<FeatureEntry, \"trigger\">): boolean {\n return this.evaluate(feature.trigger);\n }\n}\n","import type {\n AudienceMatchFn,\n AudienceRule,\n FeatureEntry,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n FeatureDependencyState,\n FeatureFlagBridge,\n TriggerContext,\n} from \"./types\";\nimport { compareSemver, satisfiesRange } from \"./semver\";\nimport { isTriggerMatch } from \"./triggers\";\n\n/**\n * Default audience matching logic.\n *\n * For each specified field (plan, role, region), checks if the user's\n * value is included in the allowed list. Fields use AND logic between them,\n * OR logic within each field's array. The `custom` field is ignored by\n * the default matcher — use a custom `AudienceMatchFn` for that.\n */\nexport function matchesAudience(\n audience: AudienceRule,\n userContext: UserContext,\n): boolean {\n if (audience.plan && audience.plan.length > 0) {\n if (!userContext.plan || !audience.plan.includes(userContext.plan)) {\n return false;\n }\n }\n if (audience.role && audience.role.length > 0) {\n if (!userContext.role || !audience.role.includes(userContext.role)) {\n return false;\n }\n }\n if (audience.region && audience.region.length > 0) {\n if (!userContext.region || !audience.region.includes(userContext.region)) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Check if a feature's audience allows the given user context.\n *\n * - No `audience` field → visible to all\n * - Empty `audience` ({}) → visible to all\n * - `audience` specified but no `userContext` → hidden (safe default)\n * - Otherwise, delegate to `matchFn` (or default `matchesAudience`)\n */\nfunction isAudienceMatch(\n feature: FeatureEntry,\n userContext?: UserContext,\n matchFn?: AudienceMatchFn,\n): boolean {\n // No audience restriction → show to everyone\n if (!feature.audience) return true;\n\n // Check if audience is empty (no fields with values)\n const { plan, role, region, custom } = feature.audience;\n const hasRules =\n (plan && plan.length > 0) ||\n (role && role.length > 0) ||\n (region && region.length > 0) ||\n (custom && Object.keys(custom).length > 0);\n if (!hasRules) return true;\n\n // Audience specified but no user context → hidden (safe default)\n if (!userContext) return false;\n\n // Use custom matcher if provided, otherwise default\n if (matchFn) return matchFn(feature.audience, userContext);\n return matchesAudience(feature.audience, userContext);\n}\n\nfunction isVersionMatch(feature: FeatureEntry, appVersion?: string): boolean {\n const v = feature.version;\n if (!v || typeof v === \"string\") return true; // string = display only\n if (!appVersion) return false; // Safe default when constraints exist\n if (!v.introduced && !v.showNewUntil && !v.deprecatedAt && !v.showIn) return true;\n\n // Range check\n if (v.showIn && !satisfiesRange(appVersion, v.showIn)) return false;\n\n if (v.introduced && compareSemver(appVersion, v.introduced) < 0) return false;\n if (v.deprecatedAt && compareSemver(appVersion, v.deprecatedAt) >= 0) return false;\n\n // showNewUntil gates \"new\" state only\n if (v.showNewUntil && compareSemver(appVersion, v.showNewUntil) >= 0) return false;\n\n return true;\n}\n\nfunction isFlagMatch(\n feature: FeatureEntry,\n flagBridge?: FeatureFlagBridge,\n userContext?: UserContext,\n): boolean {\n if (!feature.flagKey) return true;\n if (!flagBridge) return false;\n try {\n return flagBridge.isEnabled(feature.flagKey, userContext);\n } catch {\n return false;\n }\n}\n\nfunction isProductMatch(feature: FeatureEntry, product?: string): boolean {\n if (!feature.product || feature.product === \"*\") return true;\n if (!product) return false;\n return feature.product === product;\n}\n\nfunction isDependencyMatch(\n feature: FeatureEntry,\n dismissedIds: ReadonlySet<string>,\n dependencyState?: FeatureDependencyState,\n): boolean {\n const dependsOn = feature.dependsOn;\n if (!dependsOn) return true;\n\n const seenIds = dependencyState?.seenIds;\n const clickedIds = dependencyState?.clickedIds;\n const dismissedDependencyIds = dependencyState?.dismissedIds ?? dismissedIds;\n\n if (dependsOn.seen && dependsOn.seen.length > 0) {\n for (const id of dependsOn.seen) {\n const seen = seenIds?.has(id) ?? false;\n if (!seen && !dismissedDependencyIds.has(id)) return false;\n }\n }\n\n if (dependsOn.clicked && dependsOn.clicked.length > 0) {\n for (const id of dependsOn.clicked) {\n if (!(clickedIds?.has(id) ?? false)) return false;\n }\n }\n\n if (dependsOn.dismissed && dependsOn.dismissed.length > 0) {\n for (const id of dependsOn.dismissed) {\n if (!dismissedDependencyIds.has(id)) return false;\n }\n }\n\n return true;\n}\n\n/**\n * Check if a single feature should show as \"new\".\n *\n * A feature is \"new\" when ALL of these are true:\n * 1. Current time is before `showNewUntil`\n * 2. Feature was released after the watermark (or no watermark exists)\n * 3. Feature has not been individually dismissed\n * 4. If `publishAt` is set, current time must be after it (scheduled publishing)\n * 5. If `audience` is set, user must match the targeting rules\n * 6. If `flagKey` is set, the flag bridge must resolve it as enabled\n * 7. If `product` is set, it must match the current product scope\n */\nexport function isNew(\n feature: FeatureEntry,\n watermark: string | null,\n dismissedIds: ReadonlySet<string>,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n flagBridge?: FeatureFlagBridge,\n product?: string,\n): boolean {\n // Already dismissed by the user on this device\n if (dismissedIds.has(feature.id)) return false;\n\n // Audience targeting — check before time-based checks\n if (!isAudienceMatch(feature, userContext, matchAudience)) return false;\n\n // Dependency targeting — defer features until prerequisites are satisfied\n if (!isDependencyMatch(feature, dismissedIds, dependencyState)) return false;\n\n // Version targeting — requires appVersion when constraints exist\n if (!isVersionMatch(feature, appVersion)) return false;\n\n // Feature flag targeting — hide flagged entries unless enabled\n if (!isFlagMatch(feature, flagBridge, userContext)) return false;\n\n // Multi-product targeting — hide entries for other product scopes\n if (!isProductMatch(feature, product)) return false;\n\n // Contextual trigger rules — show only when trigger condition is satisfied.\n if (!isTriggerMatch(feature.trigger, triggerContext)) return false;\n\n const nowMs = now.getTime();\n\n // Scheduled publishing — hidden until publishAt\n if (feature.publishAt) {\n const publishMs = new Date(feature.publishAt).getTime();\n if (nowMs < publishMs) return false;\n }\n\n const showUntilMs = new Date(feature.showNewUntil).getTime();\n\n // Past the display window\n if (nowMs >= showUntilMs) return false;\n\n // If there's a watermark, feature must have been released after it\n if (watermark) {\n const watermarkMs = new Date(watermark).getTime();\n const releasedMs = new Date(feature.releasedAt).getTime();\n if (releasedMs <= watermarkMs) return false;\n }\n\n return true;\n}\n\n/**\n * Get all features that are currently \"new\" for this user.\n */\nexport function getNewFeatures(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n flagBridge?: FeatureFlagBridge,\n product?: string,\n): FeatureEntry[] {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.filter((f) =>\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n flagBridge,\n product,\n ),\n );\n}\n\n/**\n * Get the count of new features.\n */\nexport function getNewFeatureCount(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n flagBridge?: FeatureFlagBridge,\n product?: string,\n): number {\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n flagBridge,\n product,\n ).length;\n}\n\n/**\n * Check if a specific sidebar key has a new feature.\n */\nexport function hasNewFeature(\n manifest: FeatureManifest,\n sidebarKey: string,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n flagBridge?: FeatureFlagBridge,\n product?: string,\n): boolean {\n const watermark = storage.getWatermark();\n const dismissedIds = storage.getDismissedIds();\n return manifest.some(\n (f) =>\n f.sidebarKey === sidebarKey &&\n isNew(\n f,\n watermark,\n dismissedIds,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n flagBridge,\n product,\n ),\n );\n}\n\n/**\n * Get all features sorted by priority (critical first) then by release date (newest first).\n */\nexport function getNewFeaturesSorted(\n manifest: FeatureManifest,\n storage: StorageAdapter,\n now: Date = new Date(),\n userContext?: UserContext,\n matchAudience?: AudienceMatchFn,\n appVersion?: string,\n dependencyState?: FeatureDependencyState,\n triggerContext?: TriggerContext,\n flagBridge?: FeatureFlagBridge,\n product?: string,\n): FeatureEntry[] {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return getNewFeatures(\n manifest,\n storage,\n now,\n userContext,\n matchAudience,\n appVersion,\n dependencyState,\n triggerContext,\n flagBridge,\n product,\n ).sort(\n (a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return (\n new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime()\n );\n },\n );\n}\n","import type { ComputedRef, InjectionKey, Ref } from \"vue\";\nimport type { FeatureEntry, FeatureManifest } from \"../types\";\n\nexport interface FeatureDropVueContextValue {\n manifest: FeatureManifest;\n newFeatures: Ref<FeatureEntry[]>;\n newCount: ComputedRef<number>;\n newFeaturesSorted: ComputedRef<FeatureEntry[]>;\n isNew: (sidebarKey: string) => boolean;\n dismiss: (id: string) => void;\n dismissAll: () => Promise<void>;\n getFeature: (sidebarKey: string) => FeatureEntry | undefined;\n}\n\nexport const FeatureDropVueContextKey: InjectionKey<FeatureDropVueContextValue> =\n Symbol(\"FeatureDropVueContext\");\n","import {\n computed,\n defineComponent,\n provide,\n ref,\n watch,\n type PropType,\n} from \"vue\";\nimport { getNewFeatures, hasNewFeature } from \"../core\";\nimport { FeatureDropVueContextKey } from \"./context\";\nimport type {\n AnalyticsCallbacks,\n AudienceMatchFn,\n FeatureManifest,\n StorageAdapter,\n UserContext,\n} from \"../types\";\n\nexport const FeatureDropProvider = defineComponent({\n name: \"FeatureDropProvider\",\n props: {\n manifest: {\n type: Array as PropType<FeatureManifest>,\n required: true,\n },\n storage: {\n type: Object as PropType<StorageAdapter>,\n required: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n userContext: {\n type: Object as PropType<UserContext>,\n required: false,\n },\n matchAudience: {\n type: Function as PropType<AudienceMatchFn>,\n required: false,\n },\n appVersion: {\n type: String,\n required: false,\n },\n },\n setup(props, { slots }) {\n const newFeatures = ref(\n getNewFeatures(\n props.manifest,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n ),\n );\n\n const recompute = (): void => {\n newFeatures.value = getNewFeatures(\n props.manifest,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n );\n };\n\n watch(\n () => [props.manifest, props.storage, props.userContext, props.matchAudience, props.appVersion],\n recompute,\n { deep: false },\n );\n\n const dismiss = (id: string): void => {\n const feature = newFeatures.value.find((f) => f.id === id);\n props.storage.dismiss(id);\n if (feature) {\n props.analytics?.onFeatureDismissed?.(feature);\n }\n recompute();\n };\n\n const dismissAll = async (): Promise<void> => {\n await props.storage.dismissAll(new Date());\n newFeatures.value = [];\n props.analytics?.onAllDismissed?.();\n };\n\n const newCount = computed(() => newFeatures.value.length);\n const newFeaturesSorted = computed(() => {\n const priorityOrder = { critical: 0, normal: 1, low: 2 };\n return [...newFeatures.value].sort((a, b) => {\n const pa = priorityOrder[a.priority ?? \"normal\"];\n const pb = priorityOrder[b.priority ?? \"normal\"];\n if (pa !== pb) return pa - pb;\n return new Date(b.releasedAt).getTime() - new Date(a.releasedAt).getTime();\n });\n });\n\n const getFeature = (sidebarKey: string) =>\n newFeatures.value.find((f) => f.sidebarKey === sidebarKey);\n\n const isNewFn = (sidebarKey: string) =>\n hasNewFeature(\n props.manifest,\n sidebarKey,\n props.storage,\n new Date(),\n props.userContext,\n props.matchAudience,\n props.appVersion,\n );\n\n provide(FeatureDropVueContextKey, {\n manifest: props.manifest,\n newFeatures,\n newCount,\n newFeaturesSorted,\n isNew: isNewFn,\n dismiss,\n dismissAll,\n getFeature,\n });\n\n return () => slots.default?.();\n },\n});\n","import { inject } from \"vue\";\nimport { FeatureDropVueContextKey, type FeatureDropVueContextValue } from \"../context\";\n\nexport function useFeatureDrop(): FeatureDropVueContextValue {\n const context = inject(FeatureDropVueContextKey, null);\n if (!context) {\n throw new Error(\"useFeatureDrop must be used within a <FeatureDropProvider>\");\n }\n return context;\n}\n","import { computed } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport function useNewFeature(sidebarKey: string) {\n const { isNew, getFeature, dismiss } = useFeatureDrop();\n\n const feature = computed(() => getFeature(sidebarKey));\n const isNewValue = computed(() => isNew(sidebarKey));\n const dismissFeature = (): void => {\n const value = feature.value;\n if (value) {\n dismiss(value.id);\n }\n };\n\n return {\n feature,\n isNew: isNewValue,\n dismiss: dismissFeature,\n };\n}\n","import { computed } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport function useNewCount() {\n const { newCount } = useFeatureDrop();\n return computed(() => newCount.value);\n}\n","import { onBeforeUnmount, watch } from \"vue\";\nimport { useFeatureDrop } from \"./use-feature-drop\";\n\nexport interface UseTabNotificationOptions {\n enabled?: boolean;\n template?: string;\n flash?: boolean;\n flashInterval?: number;\n}\n\nexport function useTabNotification(options: UseTabNotificationOptions = {}): void {\n const {\n enabled = true,\n template = \"({count}) {title}\",\n flash = false,\n flashInterval = 1500,\n } = options;\n\n const { newCount } = useFeatureDrop();\n if (typeof document === \"undefined\") return;\n\n const originalTitle = document.title;\n let interval: ReturnType<typeof setInterval> | null = null;\n\n const stop = watch(\n () => newCount.value,\n (count) => {\n if (!enabled || count === 0) {\n document.title = originalTitle;\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n return;\n }\n\n const nextTitle = template\n .replace(\"{count}\", String(count))\n .replace(\"{title}\", originalTitle);\n\n if (!flash) {\n document.title = nextTitle;\n return;\n }\n\n let showNotification = true;\n document.title = nextTitle;\n if (interval) clearInterval(interval);\n interval = setInterval(() => {\n showNotification = !showNotification;\n document.title = showNotification ? nextTitle : originalTitle;\n }, flashInterval);\n },\n { immediate: true },\n );\n\n onBeforeUnmount(() => {\n stop();\n document.title = originalTitle;\n if (interval) {\n clearInterval(interval);\n interval = null;\n }\n });\n}\n","import {\n defineComponent,\n h,\n type CSSProperties,\n type PropType,\n type VNodeChild,\n} from \"vue\";\n\nexport const NewBadge = defineComponent({\n name: \"NewBadge\",\n props: {\n variant: {\n type: String as PropType<\"pill\" | \"dot\" | \"count\">,\n default: \"pill\",\n },\n show: {\n type: Boolean,\n default: true,\n },\n count: {\n type: Number,\n required: false,\n },\n label: {\n type: String,\n default: \"New\",\n },\n },\n setup(props, { slots }) {\n return () => {\n if (slots.default) {\n return slots.default({ isNew: props.show });\n }\n if (!props.show) return null;\n\n const baseStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontFamily: \"inherit\",\n };\n\n let style: CSSProperties = baseStyle;\n let content: VNodeChild = props.label;\n if (props.variant === \"dot\") {\n style = {\n ...baseStyle,\n width: \"8px\",\n height: \"8px\",\n borderRadius: \"9999px\",\n backgroundColor: \"var(--featuredrop-color, #f59e0b)\",\n };\n content = null;\n } else if (props.variant === \"count\") {\n style = {\n ...baseStyle,\n minWidth: \"18px\",\n height: \"18px\",\n padding: \"0 4px\",\n borderRadius: \"9999px\",\n fontSize: \"11px\",\n fontWeight: 700,\n color: \"var(--featuredrop-count-color, #fff)\",\n backgroundColor: \"var(--featuredrop-count-bg, #f59e0b)\",\n };\n content = props.count ?? 0;\n } else {\n style = {\n ...baseStyle,\n padding: \"2px 6px\",\n borderRadius: \"9999px\",\n fontSize: \"10px\",\n fontWeight: 700,\n color: \"var(--featuredrop-color, #b45309)\",\n backgroundColor: \"var(--featuredrop-bg, rgba(245,158,11,0.15))\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n };\n }\n\n return h(\n \"span\",\n {\n \"data-featuredrop\": props.variant,\n style,\n },\n content ?? undefined,\n );\n };\n },\n});\n","import * as moduleApi from \"module\";\n\n// Lightweight markdown parser with optional `marked` + `shiki` support.\n// The function is synchronous and always returns sanitized HTML.\n\ntype MarkedRenderer = {\n link?: (href: string | null, title: string | null, text: string) => string;\n image?: (href: string | null, title: string | null, text: string) => string;\n paragraph?: (text: string) => string;\n heading?: (text: string, level: number) => string;\n};\n\ntype MarkedModule = {\n Renderer?: new () => MarkedRenderer;\n parse?: (markdown: string, options?: { renderer?: MarkedRenderer }) => string | Promise<string>;\n};\n\ntype ShikiLike = {\n codeToHtml?: (code: string, options?: { lang?: string; theme?: string }) => string | Promise<string>;\n};\n\nconst dynamicRequire =\n typeof moduleApi.createRequire === \"function\" ? moduleApi.createRequire(import.meta.url) : null;\n\nlet cachedMarked: MarkedModule | null | false = null;\nlet cachedShiki: ShikiLike | null | false = null;\n\nfunction optionalRequire<T>(name: string): T | null {\n if (!dynamicRequire) return null;\n try {\n // Using dynamic require so missing optional peers don't break bundling/runtime.\n return dynamicRequire(name) as T;\n } catch (error: unknown) {\n if (error && typeof error === \"object\" && \"code\" in error && (error as { code?: string }).code === \"MODULE_NOT_FOUND\") {\n return null;\n }\n // Any other error should still be treated as a failure to keep parsing resilient.\n return null;\n }\n}\n\nfunction getMarked(): MarkedModule | null {\n if (cachedMarked !== null) return cachedMarked || null;\n cachedMarked = optionalRequire<MarkedModule>(\"marked\") ?? false;\n return cachedMarked || null;\n}\n\nfunction getShiki(): ShikiLike | null {\n if (cachedShiki !== null) return cachedShiki || null;\n cachedShiki = optionalRequire<ShikiLike>(\"shiki\") ?? false;\n return cachedShiki || null;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction sanitizeUrl(url: string | null | undefined): string | null {\n if (!url) return null;\n const trimmed = url.trim();\n if (!trimmed) return null;\n\n const lower = trimmed.toLowerCase();\n if (lower.startsWith(\"javascript:\")) return null;\n if (lower.startsWith(\"data:\")) return null;\n if (lower.startsWith(\"vbscript:\")) return null;\n\n // Disallow characters that can break attribute context\n if (/['\"<>\\s]/.test(trimmed)) return null;\n\n return trimmed;\n}\n\nfunction sanitizeHtml(html: string): string {\n return html\n // Remove script/style tags entirely\n .replace(/<script[\\s\\S]*?>[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?>[\\s\\S]*?<\\/style>/gi, \"\")\n // Remove inline event handlers (on*)\n .replace(/\\s+on[a-z]+\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\")\n // Remove javascript: or data: URLs in href/src/xlink:href\n .replace(/\\s+(?:href|src|xlink:href)\\s*=\\s*(\"|')(?:javascript:|data:)[^\"']*\\1/gi, \"\");\n}\n\nfunction decodeAllowedEntities(html: string): string {\n const allowTags = [\n \"p\",\n \"strong\",\n \"em\",\n \"a\",\n \"code\",\n \"pre\",\n \"img\",\n \"ul\",\n \"ol\",\n \"li\",\n \"blockquote\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"br\",\n ];\n\n // Decode common entities inside allowed tags only\n return html.replace(/<(\\/?)([a-z0-9]+)([^>]*)>/gi, (match, slash, tag, rest) => {\n if (!allowTags.includes(tag.toLowerCase())) return match;\n const decodedRest = rest\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n return `<${slash}${tag}${decodedRest}>`;\n });\n}\n\nfunction renderCodeBlock(code: string, language: string | undefined): string {\n const shiki = getShiki();\n if (shiki?.codeToHtml) {\n try {\n const rendered = shiki.codeToHtml(code, { lang: language || \"text\", theme: \"github-dark\" });\n if (typeof rendered === \"string\") return rendered;\n } catch {\n // Fall through to non-highlighted rendering\n }\n }\n\n const langAttr = language ? ` class=\"language-${escapeHtml(language)}\"` : \"\";\n return `<pre><code${langAttr}>${escapeHtml(code)}</code></pre>`;\n}\n\nfunction inlineMarkdown(text: string): string {\n // Escape user-provided HTML before applying markdown conversions.\n let result = escapeHtml(text);\n\n // Protect inline code spans so subsequent replacements don't mangle them.\n const codeSpans: string[] = [];\n result = result.replace(/`([^`]+)`/g, (_match, code) => {\n const idx = codeSpans.length;\n codeSpans.push(`<code>${escapeHtml(code)}</code>`);\n return `§§CODE${idx}§§`;\n });\n\n // Images: \n result = result.replace(/!\\[([^\\]]*)\\]\\(([^)]+)\\)/g, (_match, alt, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeAlt = escapeHtml(alt ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n });\n\n // Links: [text](url)\n result = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (_match, label, url) => {\n const safeUrl = sanitizeUrl(url);\n const safeLabel = escapeHtml(label ?? \"\");\n if (!safeUrl) return safeLabel;\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${safeLabel}</a>`;\n });\n\n // Bold and italic (basic)\n result = result.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n result = result.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n\n // Restore code spans\n result = result.replace(/§§CODE(\\d+)§§/g, (_m, idx) => codeSpans[Number(idx)] ?? \"\");\n\n return result;\n}\n\nfunction fallbackParse(markdown: string): string {\n const lines = markdown.split(/\\r?\\n/);\n const blocks: string[] = [];\n let listBuffer: string[] | null = null;\n let quoteBuffer: string[] | null = null;\n let inCodeBlock = false;\n let codeLang: string | undefined;\n let codeLines: string[] = [];\n\n const flushList = () => {\n if (!listBuffer) return;\n blocks.push(`<ul>${listBuffer.map((item) => `<li>${item}</li>`).join(\"\")}</ul>`);\n listBuffer = null;\n };\n\n const flushQuote = () => {\n if (!quoteBuffer) return;\n const content = quoteBuffer.map((line) => inlineMarkdown(line.trim())).join(\"<br>\");\n blocks.push(`<blockquote>${content}</blockquote>`);\n quoteBuffer = null;\n };\n\n const flushCode = () => {\n if (!inCodeBlock) return;\n blocks.push(renderCodeBlock(codeLines.join(\"\\n\"), codeLang));\n codeLines = [];\n codeLang = undefined;\n inCodeBlock = false;\n };\n\n for (const rawLine of lines) {\n const line = rawLine.replace(/\\s+$/, \"\");\n\n const codeFence = line.match(/^```(.*)$/);\n if (codeFence) {\n if (inCodeBlock) {\n flushCode();\n } else {\n flushList();\n flushQuote();\n inCodeBlock = true;\n codeLang = codeFence[1]?.trim() || undefined;\n codeLines = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeLines.push(rawLine);\n continue;\n }\n\n const listMatch = line.match(/^\\s*[-*+]\\s+(.*)$/);\n if (listMatch) {\n flushQuote();\n listBuffer = listBuffer ?? [];\n listBuffer.push(inlineMarkdown(listMatch[1].trim()));\n continue;\n }\n\n if (listBuffer) flushList();\n\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)$/);\n if (headingMatch) {\n flushQuote();\n const level = headingMatch[1].length;\n const content = inlineMarkdown(headingMatch[2].trim());\n blocks.push(`<h${level}>${content}</h${level}>`);\n continue;\n }\n\n const quoteMatch = line.match(/^>\\s?(.*)$/);\n if (quoteMatch) {\n quoteBuffer = quoteBuffer ?? [];\n quoteBuffer.push(quoteMatch[1]);\n continue;\n }\n\n if (quoteBuffer) flushQuote();\n\n if (!line.trim()) {\n continue;\n }\n\n blocks.push(`<p>${inlineMarkdown(line.trim())}</p>`);\n }\n\n flushList();\n flushQuote();\n flushCode();\n\n return blocks.join(\"\\n\");\n}\n\nfunction renderWithMarked(markdown: string, marked: MarkedModule): string | null {\n if (!marked.parse) return null;\n\n const renderer = marked.Renderer ? new marked.Renderer() : undefined;\n\n if (renderer) {\n renderer.link = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n if (!safeUrl) return escapeHtml(text);\n return `<a href=\"${escapeHtml(safeUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n };\n renderer.image = (href, _title, text) => {\n const safeUrl = sanitizeUrl(href);\n const safeAlt = escapeHtml(text ?? \"\");\n if (!safeUrl) return safeAlt;\n return `<img src=\"${escapeHtml(safeUrl)}\" alt=\"${safeAlt}\" />`;\n };\n }\n\n const output = marked.parse(markdown, renderer ? { renderer } : undefined);\n if (typeof output === \"string\") return output;\n return output ? String(output) : null;\n}\n\n/**\n * Parse a feature description from markdown into sanitized HTML.\n * - Uses `marked` when installed (optional peer dep)\n * - Falls back to a tiny built-in parser when `marked` is absent\n * - Strips script tags, event handlers, and javascript:/data: URLs\n */\nexport function parseDescription(markdown: string): string {\n if (!markdown) return \"\";\n\n const marked = getMarked();\n if (marked) {\n try {\n const rendered = renderWithMarked(markdown, marked);\n if (rendered) {\n const sanitized = sanitizeHtml(rendered);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n } catch {\n // If marked fails for any reason, fall back to the tiny parser.\n }\n }\n\n // Fast path: raw HTML provided without `marked` installed\n if (/<[^>]+>/.test(markdown)) {\n const sanitized = sanitizeHtml(markdown);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n }\n\n const fallback = fallbackParse(markdown);\n const sanitized = sanitizeHtml(fallback);\n const decoded = decodeAllowedEntities(sanitized);\n return sanitizeHtml(decoded);\n}\n","import { defineComponent, h, ref, type PropType } from \"vue\";\nimport type { AnalyticsCallbacks, FeatureEntry } from \"../../types\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const ChangelogWidget = defineComponent({\n name: \"ChangelogWidget\",\n props: {\n title: {\n type: String,\n default: \"What's New\",\n },\n triggerLabel: {\n type: String,\n default: \"What's New\",\n },\n showCount: {\n type: Boolean,\n default: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n },\n setup(props, { slots }) {\n const { newFeaturesSorted, newCount, dismiss, dismissAll } = useFeatureDrop();\n const isOpen = ref(false);\n\n const close = (): void => {\n isOpen.value = false;\n props.analytics?.onWidgetClosed?.();\n };\n\n const open = (): void => {\n isOpen.value = true;\n props.analytics?.onWidgetOpened?.();\n };\n\n const toggle = (): void => {\n if (isOpen.value) close();\n else open();\n };\n\n const renderEntry = (feature: FeatureEntry) => {\n if (slots.entry) {\n return slots.entry({ feature, dismiss: () => dismiss(feature.id) });\n }\n return h(\"div\", { style: { padding: \"10px 0\", borderBottom: \"1px solid #e5e7eb\" } }, [\n h(\"p\", { style: { margin: \"0 0 4px\", fontWeight: 600 } }, feature.label),\n feature.description\n ? h(\"div\", {\n style: { margin: \"0 0 6px\", color: \"#6b7280\", fontSize: \"13px\", lineHeight: 1.5 },\n innerHTML: parseDescription(feature.description),\n })\n : null,\n h(\n \"button\",\n {\n onClick: () => dismiss(feature.id),\n style: {\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n cursor: \"pointer\",\n fontSize: \"12px\",\n },\n },\n \"Dismiss\",\n ),\n ]);\n };\n\n return () => {\n if (slots.default) {\n return slots.default({\n isOpen: isOpen.value,\n toggle,\n open,\n close,\n features: newFeaturesSorted.value,\n count: newCount.value,\n dismiss,\n dismissAll,\n });\n }\n\n return h(\"div\", { \"data-featuredrop-widget\": true }, [\n h(\n \"button\",\n {\n onClick: toggle,\n style: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n border: \"1px solid #d1d5db\",\n background: \"#fff\",\n borderRadius: \"10px\",\n padding: \"8px 12px\",\n cursor: \"pointer\",\n },\n },\n [\n props.triggerLabel,\n props.showCount && newCount.value > 0\n ? h(\n \"span\",\n {\n style: {\n display: \"inline-flex\",\n minWidth: \"18px\",\n height: \"18px\",\n borderRadius: \"999px\",\n background: \"#f59e0b\",\n color: \"#fff\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 700,\n padding: \"0 4px\",\n },\n },\n String(newCount.value),\n )\n : null,\n ],\n ),\n isOpen.value\n ? h(\n \"div\",\n {\n role: \"dialog\",\n style: {\n marginTop: \"8px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"12px\",\n minWidth: \"300px\",\n },\n },\n [\n h(\"div\", { style: { display: \"flex\", justifyContent: \"space-between\", marginBottom: \"8px\" } }, [\n h(\"strong\", props.title),\n h(\"button\", { onClick: close, style: { border: \"none\", background: \"transparent\", cursor: \"pointer\" } }, \"x\"),\n ]),\n newFeaturesSorted.value.length === 0\n ? h(\"p\", { style: { margin: 0, color: \"#6b7280\" } }, \"You're all caught up!\")\n : newFeaturesSorted.value.map((feature) => renderEntry(feature)),\n newFeaturesSorted.value.length > 0\n ? h(\n \"button\",\n {\n onClick: () => void dismissAll(),\n style: {\n marginTop: \"10px\",\n border: \"none\",\n background: \"transparent\",\n color: \"#2563eb\",\n cursor: \"pointer\",\n padding: 0,\n },\n },\n \"Mark all as read\",\n )\n : null,\n ],\n )\n : null,\n ]);\n };\n },\n});\n","import { computed, defineComponent, h, ref } from \"vue\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Spotlight = defineComponent({\n name: \"Spotlight\",\n props: {\n featureId: {\n type: String,\n required: true,\n },\n label: {\n type: String,\n default: \"New feature\",\n },\n },\n setup(props, { slots }) {\n const { newFeatures, dismiss } = useFeatureDrop();\n const open = ref(false);\n const feature = computed(() => newFeatures.value.find((f) => f.id === props.featureId));\n\n return () => {\n if (slots.default) {\n return slots.default({\n feature: feature.value,\n isActive: !!feature.value,\n isTooltipOpen: open.value,\n openTooltip: () => {\n open.value = true;\n },\n closeTooltip: () => {\n open.value = false;\n },\n dismiss: () => dismiss(props.featureId),\n });\n }\n if (!feature.value) return null;\n\n return h(\"div\", { \"data-featuredrop-spotlight\": true, style: { display: \"inline-block\", position: \"relative\" } }, [\n h(\n \"button\",\n {\n onClick: () => {\n open.value = !open.value;\n },\n style: {\n width: \"20px\",\n height: \"20px\",\n borderRadius: \"9999px\",\n border: \"2px solid #f59e0b\",\n background: \"#fff\",\n cursor: \"pointer\",\n },\n \"aria-label\": props.label,\n },\n \"\",\n ),\n open.value\n ? h(\n \"div\",\n {\n style: {\n position: \"absolute\",\n top: \"24px\",\n left: 0,\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"10px\",\n width: \"240px\",\n zIndex: 30,\n },\n },\n [\n h(\"p\", { style: { margin: \"0 0 4px\", fontWeight: 600 } }, feature.value.label),\n feature.value.description\n ? h(\"div\", {\n style: { marginBottom: \"8px\", color: \"#6b7280\", fontSize: \"13px\" },\n innerHTML: parseDescription(feature.value.description),\n })\n : null,\n h(\n \"button\",\n {\n onClick: () => {\n dismiss(props.featureId);\n open.value = false;\n },\n style: {\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n cursor: \"pointer\",\n },\n },\n \"Got it\",\n ),\n ],\n )\n : null,\n ]);\n };\n },\n});\n","import { computed, defineComponent, h, type PropType } from \"vue\";\nimport type { AnalyticsCallbacks } from \"../../types\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Banner = defineComponent({\n name: \"Banner\",\n props: {\n featureId: {\n type: String,\n required: true,\n },\n dismissible: {\n type: Boolean,\n default: true,\n },\n analytics: {\n type: Object as PropType<AnalyticsCallbacks>,\n required: false,\n },\n },\n setup(props, { slots }) {\n const { newFeatures, dismiss } = useFeatureDrop();\n const feature = computed(() => newFeatures.value.find((f) => f.id === props.featureId));\n\n return () => {\n if (slots.default) {\n return slots.default({\n feature: feature.value,\n isActive: !!feature.value,\n dismiss: () => dismiss(props.featureId),\n });\n }\n if (!feature.value) return null;\n\n return h(\n \"div\",\n {\n \"data-featuredrop-banner\": true,\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"8px\",\n border: \"1px solid #fbbf24\",\n background: \"#fffbeb\",\n color: \"#92400e\",\n borderRadius: \"10px\",\n padding: \"10px 12px\",\n },\n },\n [\n h(\"div\", [\n h(\"strong\", feature.value.label),\n feature.value.description\n ? h(\"span\", {\n style: { marginLeft: \"6px\" },\n innerHTML: parseDescription(feature.value.description),\n })\n : null,\n ]),\n props.dismissible\n ? h(\n \"button\",\n {\n onClick: () => {\n dismiss(props.featureId);\n props.analytics?.onFeatureDismissed?.(feature.value!);\n },\n style: {\n border: \"none\",\n background: \"transparent\",\n cursor: \"pointer\",\n fontSize: \"16px\",\n lineHeight: 1,\n },\n },\n \"x\",\n )\n : null,\n ],\n );\n };\n },\n});\n","import { computed, defineComponent, h } from \"vue\";\nimport { parseDescription } from \"../../markdown\";\nimport { useFeatureDrop } from \"../composables/use-feature-drop\";\n\nexport const Toast = defineComponent({\n name: \"Toast\",\n props: {\n maxVisible: {\n type: Number,\n default: 3,\n },\n },\n setup(props, { slots }) {\n const { newFeaturesSorted, dismiss } = useFeatureDrop();\n const visible = computed(() => newFeaturesSorted.value.slice(0, props.maxVisible));\n\n return () => {\n if (slots.default) {\n return slots.default({\n toasts: visible.value,\n dismiss,\n });\n }\n if (visible.value.length === 0) return null;\n\n return h(\n \"div\",\n {\n \"data-featuredrop-toast-container\": true,\n style: {\n position: \"fixed\",\n right: \"16px\",\n bottom: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n zIndex: 40,\n },\n },\n visible.value.map((feature) =>\n h(\"div\", {\n key: feature.id,\n style: {\n width: \"320px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: \"10px\",\n background: \"#fff\",\n padding: \"10px 12px\",\n boxShadow: \"0 4px 20px rgba(0,0,0,0.08)\",\n },\n }, [\n h(\"div\", { style: { display: \"flex\", justifyContent: \"space-between\", gap: \"8px\" } }, [\n h(\"strong\", feature.label),\n h(\n \"button\",\n {\n onClick: () => dismiss(feature.id),\n style: { border: \"none\", background: \"transparent\", cursor: \"pointer\" },\n },\n \"x\",\n ),\n ]),\n feature.description\n ? h(\"div\", {\n style: { marginTop: \"4px\", color: \"#6b7280\", fontSize: \"13px\" },\n innerHTML: parseDescription(feature.description),\n })\n : null,\n ]),\n ),\n );\n };\n },\n});\n"]}
|
package/dist/vue.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineComponent, ref, watch, computed, provide, h, inject, onBeforeUnmount } from 'vue';
|
|
2
|
-
import
|
|
2
|
+
import * as moduleApi from 'module';
|
|
3
3
|
|
|
4
4
|
// src/vue/provider.ts
|
|
5
5
|
|
|
@@ -122,6 +122,14 @@ function isVersionMatch(feature, appVersion) {
|
|
|
122
122
|
if (v.showNewUntil && compareSemver(appVersion, v.showNewUntil) >= 0) return false;
|
|
123
123
|
return true;
|
|
124
124
|
}
|
|
125
|
+
function isFlagMatch(feature, flagBridge, userContext) {
|
|
126
|
+
if (!feature.flagKey) return true;
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
function isProductMatch(feature, product) {
|
|
130
|
+
if (!feature.product || feature.product === "*") return true;
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
125
133
|
function isDependencyMatch(feature, dismissedIds, dependencyState) {
|
|
126
134
|
const dependsOn = feature.dependsOn;
|
|
127
135
|
if (!dependsOn) return true;
|
|
@@ -143,11 +151,13 @@ function isDependencyMatch(feature, dismissedIds, dependencyState) {
|
|
|
143
151
|
}
|
|
144
152
|
return true;
|
|
145
153
|
}
|
|
146
|
-
function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
154
|
+
function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
147
155
|
if (dismissedIds.has(feature.id)) return false;
|
|
148
156
|
if (!isAudienceMatch(feature, userContext, matchAudience)) return false;
|
|
149
157
|
if (!isDependencyMatch(feature, dismissedIds)) return false;
|
|
150
158
|
if (!isVersionMatch(feature, appVersion)) return false;
|
|
159
|
+
if (!isFlagMatch(feature)) return false;
|
|
160
|
+
if (!isProductMatch(feature)) return false;
|
|
151
161
|
if (!isTriggerMatch(feature.trigger)) return false;
|
|
152
162
|
const nowMs = now.getTime();
|
|
153
163
|
if (feature.publishAt) {
|
|
@@ -163,7 +173,7 @@ function isNew(feature, watermark, dismissedIds, now = /* @__PURE__ */ new Date(
|
|
|
163
173
|
}
|
|
164
174
|
return true;
|
|
165
175
|
}
|
|
166
|
-
function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
176
|
+
function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
167
177
|
const watermark = storage.getWatermark();
|
|
168
178
|
const dismissedIds = storage.getDismissedIds();
|
|
169
179
|
return manifest.filter(
|
|
@@ -177,7 +187,7 @@ function getNewFeatures(manifest, storage, now = /* @__PURE__ */ new Date(), use
|
|
|
177
187
|
appVersion)
|
|
178
188
|
);
|
|
179
189
|
}
|
|
180
|
-
function hasNewFeature(manifest, sidebarKey, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext) {
|
|
190
|
+
function hasNewFeature(manifest, sidebarKey, storage, now = /* @__PURE__ */ new Date(), userContext, matchAudience, appVersion, dependencyState, triggerContext, flagBridge, product) {
|
|
181
191
|
const watermark = storage.getWatermark();
|
|
182
192
|
const dismissedIds = storage.getDismissedIds();
|
|
183
193
|
return manifest.some(
|
|
@@ -449,10 +459,11 @@ var NewBadge = defineComponent({
|
|
|
449
459
|
};
|
|
450
460
|
}
|
|
451
461
|
});
|
|
452
|
-
var dynamicRequire = createRequire(import.meta.url);
|
|
462
|
+
var dynamicRequire = typeof moduleApi.createRequire === "function" ? moduleApi.createRequire(import.meta.url) : null;
|
|
453
463
|
var cachedMarked = null;
|
|
454
464
|
var cachedShiki = null;
|
|
455
465
|
function optionalRequire(name) {
|
|
466
|
+
if (!dynamicRequire) return null;
|
|
456
467
|
try {
|
|
457
468
|
return dynamicRequire(name);
|
|
458
469
|
} catch (error) {
|