@refraction-ui/react 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-O4453CBF.js → chunk-VZLV27H2.js} +2 -2
- package/dist/{chunk-O4453CBF.js.map → chunk-VZLV27H2.js.map} +1 -1
- package/dist/form.js +1 -1
- package/dist/index.cjs +10 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -6
- package/dist/index.js.map +1 -1
- package/dist/internal/analytics/index.d.cts +11 -1
- package/dist/internal/analytics/index.d.ts +11 -1
- package/dist/internal/react-analytics/index.d.cts +4 -1
- package/dist/internal/react-analytics/index.d.ts +4 -1
- package/dist/internal/shared/index.d.cts +3 -3
- package/dist/internal/shared/index.d.ts +3 -3
- package/dist/internal/theme/index.d.cts +1 -1
- package/dist/internal/theme/index.d.ts +1 -1
- package/dist/theme.cjs.map +1 -1
- package/dist/theme.js +1 -1
- package/dist/theme.js.map +1 -1
- package/package.json +1 -1
|
@@ -133,5 +133,5 @@ function devWarn(code, message, detail) {
|
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
export { Keys, cn, createKeyboardHandler, createMachine, cva, devWarn, generateId };
|
|
136
|
-
//# sourceMappingURL=chunk-
|
|
137
|
-
//# sourceMappingURL=chunk-
|
|
136
|
+
//# sourceMappingURL=chunk-VZLV27H2.js.map
|
|
137
|
+
//# sourceMappingURL=chunk-VZLV27H2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../shared/src/aria.ts","../../shared/src/keyboard.ts","../../shared/src/state-machine.ts","../../shared/src/cn.ts","../../shared/src/cva.ts","../../shared/src/dev-feedback.ts"],"names":[],"mappings":"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","file":"chunk-O4453CBF.js","sourcesContent":["/** Merge multiple ARIA prop objects, later values override earlier ones */\nexport function mergeAriaProps(\n ...propSets: Array<Record<string, unknown>>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const props of propSets) {\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined) {\n result[key] = value\n }\n }\n }\n return result\n}\n\nlet idCounter = 0\n\n/**\n * Generate a unique ID, safe for SSR (deterministic within a render pass).\n * In browsers, uses crypto.randomUUID when available.\n */\nexport function generateId(prefix = 'rfr'): string {\n idCounter++\n return `${prefix}-${idCounter}`\n}\n\n/** Reset the ID counter (useful for tests) */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n","/** Standard keyboard key constants */\nexport const Keys = {\n Enter: 'Enter',\n Space: ' ',\n Escape: 'Escape',\n Tab: 'Tab',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n Backspace: 'Backspace',\n Delete: 'Delete',\n} as const\n\nexport type KeyboardKey = (typeof Keys)[keyof typeof Keys]\n\n/** Map of key → handler function */\nexport type KeyboardHandlerMap = Partial<\n Record<string, (event: KeyboardEvent) => void>\n>\n\n/** Create a keyboard event handler from a handler map */\nexport function createKeyboardHandler(\n handlers: KeyboardHandlerMap,\n): (event: KeyboardEvent) => void {\n return (event: KeyboardEvent) => {\n const handler = handlers[event.key]\n if (handler) {\n handler(event)\n }\n }\n}\n","/**\n * Minimal state machine — zero dependencies, < 1KB.\n * Inspired by XState concepts but dramatically simpler.\n */\n\nexport interface MachineConfig<TState extends string, TEvent extends string> {\n initial: TState\n states: Record<TState, {\n on?: Partial<Record<TEvent, TState>>\n }>\n}\n\nexport interface Machine<TState extends string, TEvent extends string> {\n /** Current state */\n state: TState\n /** Send an event to transition */\n send(event: TEvent): void\n /** Subscribe to state changes. Returns unsubscribe function. */\n subscribe(fn: (state: TState) => void): () => void\n /** Check if machine is in a given state */\n matches(state: TState): boolean\n}\n\nexport function createMachine<TState extends string, TEvent extends string>(\n config: MachineConfig<TState, TEvent>,\n): Machine<TState, TEvent> {\n let current = config.initial\n const listeners = new Set<(state: TState) => void>()\n\n return {\n get state() {\n return current\n },\n\n send(event: TEvent) {\n const stateConfig = config.states[current]\n const next = stateConfig?.on?.[event]\n if (next && next !== current) {\n current = next\n for (const fn of listeners) {\n fn(current)\n }\n }\n },\n\n subscribe(fn: (state: TState) => void) {\n listeners.add(fn)\n return () => {\n listeners.delete(fn)\n }\n },\n\n matches(state: TState) {\n return current === state\n },\n }\n}\n","/**\n * Lightweight class name utility — our own implementation.\n * Handles conditional classes, arrays, and falsy values.\n * No external dependencies (no clsx, no tailwind-merge).\n *\n * For Tailwind class conflict resolution (e.g., 'p-2 p-4' → 'p-4'),\n * consumers can use @refraction-ui/tailwind-config which provides\n * a tw-merge-aware variant of this function.\n */\n\ntype ClassValue = string | number | boolean | undefined | null | ClassValue[]\ntype ClassRecord = Record<string, boolean | undefined | null>\n\nexport function cn(...inputs: Array<ClassValue | ClassRecord>): string {\n const classes: string[] = []\n\n for (const input of inputs) {\n if (!input) continue\n\n if (typeof input === 'string') {\n classes.push(input)\n } else if (typeof input === 'number') {\n classes.push(String(input))\n } else if (Array.isArray(input)) {\n const nested = cn(...input)\n if (nested) classes.push(nested)\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key)\n }\n }\n }\n\n return classes.join(' ')\n}\n","/**\n * Lightweight class-variance-authority alternative — zero dependencies.\n * Creates variant-driven class name functions for components.\n */\n\ninterface VariantConfig {\n [variant: string]: Record<string, string>\n}\n\ninterface CVAConfig<V extends VariantConfig> {\n base?: string\n variants?: V\n defaultVariants?: {\n [K in keyof V]?: keyof V[K]\n }\n compoundVariants?: Array<\n {\n [K in keyof V]?: keyof V[K]\n } & { class: string }\n >\n}\n\ntype VariantProps<V extends VariantConfig> = {\n [K in keyof V]?: keyof V[K]\n}\n\nexport function cva<V extends VariantConfig>(config: CVAConfig<V>) {\n return (props?: VariantProps<V> & { className?: string }): string => {\n const classes: string[] = []\n\n if (config.base) {\n classes.push(config.base)\n }\n\n if (config.variants) {\n for (const [variantKey, variantOptions] of Object.entries(config.variants)) {\n const selectedValue =\n (props as Record<string, unknown> | undefined)?.[variantKey] ??\n config.defaultVariants?.[variantKey]\n\n if (selectedValue != null) {\n const variantClass = (variantOptions as Record<string, string>)[\n selectedValue as string\n ]\n if (variantClass) {\n classes.push(variantClass)\n }\n }\n }\n }\n\n if (config.compoundVariants) {\n for (const compound of config.compoundVariants) {\n const { class: compoundClass, ...conditions } = compound\n let matches = true\n\n for (const [key, value] of Object.entries(conditions)) {\n const propValue =\n (props as Record<string, unknown>)?.[key] ??\n config.defaultVariants?.[key]\n if (propValue !== value) {\n matches = false\n break\n }\n }\n\n if (matches) {\n classes.push(compoundClass as string)\n }\n }\n }\n\n if (props?.className) {\n classes.push(props.className)\n }\n\n return classes.filter(Boolean).join(' ')\n }\n}\n","/**\n * dev-feedback — zero-dependency `devWarn` / `devError` primitives.\n *\n * Design constraints (epic #247, issue #248):\n * - Guarded by `process.env.NODE_ENV !== 'production'` so production bundlers\n * dead-code-strip every call (the guard is a static string compare that\n * minifiers fold to `false` in prod builds).\n * - Warn-once dedupe per `code` — a footgun is reported once, not on every\n * render.\n * - NO import of `@refraction-ui/logger` (no hard dependency on the telemetry\n * lib). Forwarding to a telemetry sink happens ONLY if the consumer\n * explicitly injects one (dependency inversion, never an import).\n */\n\n/**\n * Minimal structural shape of the record a telemetry sink consumes. This is a\n * deliberate structural mirror of `@refraction-ui/logger`'s `LogRecord` — it is\n * NOT imported, so `@refraction-ui/shared` keeps zero dependency on the\n * telemetry lib. A consumer that wires the real logger sink satisfies this\n * shape structurally.\n */\nexport interface DevFeedbackRecord {\n level: 'warn' | 'error'\n message: string\n timestamp: number\n /** Structured detail — the library-origin envelope lives here. */\n context: Record<string, unknown>\n}\n\n/**\n * The narrow contract a consumer-injected telemetry sink must satisfy. Kept\n * intentionally minimal and structural so the real `TelemetrySink` from\n * `@refraction-ui/logger` is assignable WITHOUT shared importing the logger.\n */\nexport interface DevFeedbackSink {\n /** Receive a single dev-feedback record. Must never throw to the caller. */\n log(record: DevFeedbackRecord): void\n}\n\n/**\n * Minimal ambient view of `process.env` so we can read `NODE_ENV` WITHOUT\n * pulling `@types/node` into this zero-dependency package. Accessed defensively\n * (the `typeof process === 'undefined'` guard) so this is safe in browsers too.\n */\ndeclare const process:\n | { env?: { NODE_ENV?: string } }\n | undefined\n\n/** Per-code dedupe set — module-scoped so it survives across calls. */\nconst seen = new Set<string>()\n\n/**\n * Optional, consumer-injected sink. `null` until a consumer explicitly wires\n * one via {@link setDevFeedbackSink}. Nothing phones home implicitly.\n */\nlet injectedSink: DevFeedbackSink | null = null\n\n/**\n * Wire an optional telemetry sink that {@link devWarn} / {@link devError}\n * forward to (in addition to the console). Inversion of control: the consumer\n * owns the sink; this package never imports it. Pass `null` to unwire.\n *\n * Forwarding still only happens in non-production (the calls themselves are\n * stripped in prod), and still respects warn-once dedupe.\n */\nexport function setDevFeedbackSink(sink: DevFeedbackSink | null): void {\n injectedSink = sink\n}\n\n/** Test-only / consumer-only escape hatch to reset warn-once dedupe state. */\nexport function resetDevFeedback(): void {\n seen.clear()\n}\n\nfunction isDev(): boolean {\n // String compare (not a negated truthiness) so bundlers can statically fold\n // `process.env.NODE_ENV` and strip the whole branch in production builds.\n return (\n typeof process === 'undefined' ||\n process.env?.NODE_ENV !== 'production'\n )\n}\n\nfunction emit(\n level: 'warn' | 'error',\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n if (!isDev()) return\n\n // Warn-once dedupe, keyed by (level, code) so an error and a warning sharing\n // a code are not collapsed into one.\n const key = `${level}:${code}`\n if (seen.has(key)) return\n seen.add(key)\n\n const text = `[refraction-ui] ${code}: ${message}`\n\n if (level === 'error') {\n console.error(text, detail ?? '')\n } else {\n console.warn(text, detail ?? '')\n }\n\n // Forward to the consumer-injected sink ONLY if one was explicitly wired.\n if (injectedSink) {\n const record: DevFeedbackRecord = {\n level,\n message: `${code}: ${message}`,\n timestamp: Date.now(),\n context: { code, ...(detail ?? {}) },\n }\n try {\n injectedSink.log(record)\n } catch {\n // A broken sink must never break the consumer app.\n }\n }\n}\n\n/**\n * Emit a development-only warning for a refraction-ui footgun.\n *\n * @param code Stable, greppable identifier (e.g. `'react/no-controlled-prop'`).\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Warned at most once per `code`.\n */\nexport function devWarn(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('warn', code, message, detail)\n}\n\n/**\n * Emit a development-only error for a refraction-ui misuse / invariant break.\n *\n * @param code Stable, greppable identifier.\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Reported at most once per `code`.\n */\nexport function devError(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('error', code, message, detail)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../shared/src/aria.ts","../../shared/src/keyboard.ts","../../shared/src/state-machine.ts","../../shared/src/cn.ts","../../shared/src/cva.ts","../../shared/src/dev-feedback.ts"],"names":[],"mappings":"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","file":"chunk-VZLV27H2.js","sourcesContent":["/** Merge multiple ARIA prop objects, later values override earlier ones */\nexport function mergeAriaProps(\n ...propSets: Array<Record<string, unknown>>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const props of propSets) {\n for (const [key, value] of Object.entries(props)) {\n if (value !== undefined) {\n result[key] = value\n }\n }\n }\n return result\n}\n\nlet idCounter = 0\n\n/**\n * Generate a unique ID, safe for SSR (deterministic within a render pass).\n * In browsers, uses crypto.randomUUID when available.\n */\nexport function generateId(prefix = 'rfr'): string {\n idCounter++\n return `${prefix}-${idCounter}`\n}\n\n/** Reset the ID counter (useful for tests) */\nexport function resetIdCounter(): void {\n idCounter = 0\n}\n","/** Standard keyboard key constants */\nexport const Keys = {\n Enter: 'Enter',\n Space: ' ',\n Escape: 'Escape',\n Tab: 'Tab',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n PageUp: 'PageUp',\n PageDown: 'PageDown',\n Backspace: 'Backspace',\n Delete: 'Delete',\n} as const\n\nexport type KeyboardKey = (typeof Keys)[keyof typeof Keys]\n\n/** Map of key → handler function */\nexport type KeyboardHandlerMap = Partial<\n Record<string, (event: KeyboardEvent) => void>\n>\n\n/** Create a keyboard event handler from a handler map */\nexport function createKeyboardHandler(\n handlers: KeyboardHandlerMap,\n): (event: KeyboardEvent) => void {\n return (event: KeyboardEvent) => {\n const handler = handlers[event.key]\n if (handler) {\n handler(event)\n }\n }\n}\n","/**\n * Minimal state machine — zero dependencies, < 1KB.\n * Inspired by XState concepts but dramatically simpler.\n */\n\nexport interface MachineConfig<TState extends string, TEvent extends string> {\n initial: TState\n states: Record<TState, {\n on?: Partial<Record<TEvent, TState>>\n }>\n}\n\nexport interface Machine<TState extends string, TEvent extends string> {\n /** Current state */\n state: TState\n /** Send an event to transition */\n send(event: TEvent): void\n /** Subscribe to state changes. Returns unsubscribe function. */\n subscribe(fn: (state: TState) => void): () => void\n /** Check if machine is in a given state */\n matches(state: TState): boolean\n}\n\nexport function createMachine<TState extends string, TEvent extends string>(\n config: MachineConfig<TState, TEvent>,\n): Machine<TState, TEvent> {\n let current = config.initial\n const listeners = new Set<(state: TState) => void>()\n\n return {\n get state() {\n return current\n },\n\n send(event: TEvent) {\n const stateConfig = config.states[current]\n const next = stateConfig?.on?.[event]\n if (next && next !== current) {\n current = next\n for (const fn of listeners) {\n fn(current)\n }\n }\n },\n\n subscribe(fn: (state: TState) => void) {\n listeners.add(fn)\n return () => {\n listeners.delete(fn)\n }\n },\n\n matches(state: TState) {\n return current === state\n },\n }\n}\n","/**\n * Lightweight class name utility — our own implementation.\n * Handles conditional classes, arrays, and falsy values.\n * No external dependencies (no clsx, no tailwind-merge).\n *\n * For Tailwind class conflict resolution (e.g., 'p-2 p-4' → 'p-4'),\n * consumers can use @refraction-ui/tailwind-config which provides\n * a tw-merge-aware variant of this function.\n */\n\ntype ClassValue = string | number | boolean | undefined | null | ClassValue[]\ntype ClassRecord = Record<string, boolean | undefined | null>\n\nexport function cn(...inputs: Array<ClassValue | ClassRecord>): string {\n const classes: string[] = []\n\n for (const input of inputs) {\n if (!input) continue\n\n if (typeof input === 'string') {\n classes.push(input)\n } else if (typeof input === 'number') {\n classes.push(String(input))\n } else if (Array.isArray(input)) {\n const nested = cn(...input)\n if (nested) classes.push(nested)\n } else if (typeof input === 'object') {\n for (const [key, value] of Object.entries(input)) {\n if (value) classes.push(key)\n }\n }\n }\n\n return classes.join(' ')\n}\n","/**\n * Lightweight class-variance-authority alternative — zero dependencies.\n * Creates variant-driven class name functions for components.\n */\n\ninterface VariantConfig {\n [variant: string]: Record<string, string>\n}\n\ninterface CVAConfig<V extends VariantConfig> {\n base?: string\n variants?: V\n defaultVariants?: {\n [K in keyof V]?: keyof V[K]\n }\n compoundVariants?: Array<\n {\n [K in keyof V]?: keyof V[K]\n } & { class: string }\n >\n}\n\ntype VariantProps<V extends VariantConfig> = {\n [K in keyof V]?: keyof V[K]\n}\n\nexport function cva<V extends VariantConfig>(config: CVAConfig<V>) {\n return (props?: VariantProps<V> & { className?: string }): string => {\n const classes: string[] = []\n\n if (config.base) {\n classes.push(config.base)\n }\n\n if (config.variants) {\n for (const [variantKey, variantOptions] of Object.entries(config.variants)) {\n const selectedValue =\n (props as Record<string, unknown> | undefined)?.[variantKey] ??\n config.defaultVariants?.[variantKey]\n\n if (selectedValue != null) {\n const variantClass = (variantOptions as Record<string, string>)[\n selectedValue as string\n ]\n if (variantClass) {\n classes.push(variantClass)\n }\n }\n }\n }\n\n if (config.compoundVariants) {\n for (const compound of config.compoundVariants) {\n const { class: compoundClass, ...conditions } = compound\n let matches = true\n\n for (const [key, value] of Object.entries(conditions)) {\n const propValue =\n (props as Record<string, unknown>)?.[key] ??\n config.defaultVariants?.[key]\n if (propValue !== value) {\n matches = false\n break\n }\n }\n\n if (matches) {\n classes.push(compoundClass as string)\n }\n }\n }\n\n if (props?.className) {\n classes.push(props.className)\n }\n\n return classes.filter(Boolean).join(' ')\n }\n}\n","/**\n * dev-feedback — zero-dependency `devWarn` / `devError` primitives.\n *\n * Design constraints (epic #247, issue #248):\n * - Guarded by `process.env.NODE_ENV !== 'production'` so production bundlers\n * dead-code-strip every call (the guard is a static string compare that\n * minifiers fold to `false` in prod builds).\n * - Warn-once dedupe per `code` — a footgun is reported once, not on every\n * render.\n * - NO import of `@refraction-ui/logger` (no hard dependency on the telemetry\n * lib). Forwarding to a telemetry sink happens ONLY if the consumer\n * explicitly injects one (dependency inversion, never an import).\n */\n\n/**\n * Minimal structural shape of the record a telemetry sink consumes. This is a\n * deliberate structural mirror of `@refraction-ui/logger`'s `LogRecord` — it is\n * NOT imported, so `@refraction-ui/shared` keeps zero dependency on the\n * telemetry lib. A consumer that wires the real logger sink satisfies this\n * shape structurally.\n */\nexport interface DevFeedbackRecord {\n level: 'warn' | 'error'\n message: string\n timestamp: number\n /** Structured detail — the library-origin envelope lives here. */\n context: Record<string, unknown>\n}\n\n/**\n * The narrow contract a consumer-injected telemetry sink must satisfy. Kept\n * intentionally minimal and structural so the real `TelemetrySink` from\n * `@refraction-ui/logger` is assignable WITHOUT shared importing the logger.\n */\nexport interface DevFeedbackSink {\n /** Receive a single dev-feedback record. Must never throw to the caller. */\n log(record: DevFeedbackRecord): void\n}\n\n/**\n * Minimal ambient view of `process.env` so we can read `NODE_ENV` WITHOUT\n * pulling `@types/node` into this zero-dependency package. Accessed defensively\n * (the `typeof process === 'undefined'` guard) so this is safe in browsers too.\n */\ndeclare const process:\n | { env?: { NODE_ENV?: string } }\n | undefined\n\n/** Per-code dedupe set — module-scoped so it survives across calls. */\nconst seen = new Set<string>()\n\n/**\n * Optional, consumer-injected sink. `null` until a consumer explicitly wires\n * one via {@link setDevFeedbackSink}. Nothing phones home implicitly.\n */\nlet injectedSink: DevFeedbackSink | null = null\n\n/**\n * Wire an optional telemetry sink that {@link devWarn} / {@link devError}\n * forward to (in addition to the console). Inversion of control: the consumer\n * owns the sink; this package never imports it. Pass `null` to unwire.\n *\n * Forwarding still only happens in non-production (the calls themselves are\n * stripped in prod), and still respects warn-once dedupe.\n */\nexport function setDevFeedbackSink(sink: DevFeedbackSink | null): void {\n injectedSink = sink\n}\n\n/** Test-only / consumer-only escape hatch to reset warn-once dedupe state. */\nexport function resetDevFeedback(): void {\n seen.clear()\n}\n\nfunction isDev(): boolean {\n // String compare (not a negated truthiness) so bundlers can statically fold\n // `process.env.NODE_ENV` and strip the whole branch in production builds.\n return (\n typeof process === 'undefined' ||\n process.env?.NODE_ENV !== 'production'\n )\n}\n\nfunction emit(\n level: 'warn' | 'error',\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n if (!isDev()) return\n\n // Warn-once dedupe, keyed by (level, code) so an error and a warning sharing\n // a code are not collapsed into one.\n const key = `${level}:${code}`\n if (seen.has(key)) return\n seen.add(key)\n\n const text = `[refraction-ui] ${code}: ${message}`\n\n if (level === 'error') {\n console.error(text, detail ?? '')\n } else {\n console.warn(text, detail ?? '')\n }\n\n // Forward to the consumer-injected sink ONLY if one was explicitly wired.\n if (injectedSink) {\n const record: DevFeedbackRecord = {\n level,\n message: `${code}: ${message}`,\n timestamp: Date.now(),\n context: { code, ...(detail ?? {}) },\n }\n try {\n injectedSink.log(record)\n } catch {\n // A broken sink must never break the consumer app.\n }\n }\n}\n\n/**\n * Emit a development-only warning for a refraction-ui footgun.\n *\n * @param code Stable, greppable identifier (e.g. `'react/no-controlled-prop'`).\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Warned at most once per `code`.\n */\nexport function devWarn(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('warn', code, message, detail)\n}\n\n/**\n * Emit a development-only error for a refraction-ui misuse / invariant break.\n *\n * @param code Stable, greppable identifier.\n * @param message Human-readable explanation.\n * @param detail Optional structured detail (forwarded to an injected sink).\n *\n * Stripped entirely in production. Reported at most once per `code`.\n */\nexport function devError(\n code: string,\n message: string,\n detail?: Record<string, unknown>,\n): void {\n emit('error', code, message, detail)\n}\n"]}
|
package/dist/form.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cva, cn, devWarn } from './chunk-
|
|
1
|
+
import { cva, cn, devWarn } from './chunk-VZLV27H2.js';
|
|
2
2
|
import * as React2 from 'react';
|
|
3
3
|
import { useFormContext, useFormState, FormProvider, Controller } from 'react-hook-form';
|
|
4
4
|
export { Controller, FormProvider, useController, useForm, useFormContext, useFormState, useWatch } from 'react-hook-form';
|
package/dist/index.cjs
CHANGED
|
@@ -45403,6 +45403,10 @@ async function startSessionReplay(options) {
|
|
|
45403
45403
|
|
|
45404
45404
|
// ../react-analytics/dist/index.js
|
|
45405
45405
|
var AnalyticsContext = React11__namespace.createContext(null);
|
|
45406
|
+
var noopAnalytics = null;
|
|
45407
|
+
function getNoopAnalytics() {
|
|
45408
|
+
return noopAnalytics ??= createNoopAnalytics();
|
|
45409
|
+
}
|
|
45406
45410
|
function AnalyticsProvider({ children, value }) {
|
|
45407
45411
|
const analyticsRef = React11__namespace.useRef(null);
|
|
45408
45412
|
if (!analyticsRef.current) {
|
|
@@ -45416,17 +45420,18 @@ function AnalyticsProvider({ children, value }) {
|
|
|
45416
45420
|
}
|
|
45417
45421
|
function useAnalytics(options) {
|
|
45418
45422
|
const ctx = React11__namespace.useContext(AnalyticsContext);
|
|
45419
|
-
|
|
45423
|
+
let base = ctx;
|
|
45424
|
+
if (!base) {
|
|
45420
45425
|
devWarn(
|
|
45421
45426
|
"react-analytics/use-analytics-outside-provider",
|
|
45422
|
-
"useAnalytics() was called outside an <AnalyticsProvider>.
|
|
45427
|
+
"useAnalytics() (or useTrackEvent()) was called outside an <AnalyticsProvider>. Analytics is a no-op here; wrap your app (or the consuming subtree) in <AnalyticsProvider> to enable it."
|
|
45423
45428
|
);
|
|
45424
|
-
|
|
45429
|
+
base = getNoopAnalytics();
|
|
45425
45430
|
}
|
|
45426
45431
|
const scope = options?.scope;
|
|
45427
45432
|
return React11__namespace.useMemo(
|
|
45428
|
-
() => scope ?
|
|
45429
|
-
[
|
|
45433
|
+
() => scope ? base.with(scope) : base,
|
|
45434
|
+
[base, scope]
|
|
45430
45435
|
);
|
|
45431
45436
|
}
|
|
45432
45437
|
function useTrackEvent(options) {
|