@elvora/core 1.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/composeRefs.ts","../src/utils/composeEventHandlers.ts","../src/utils/mergeProps.ts","../src/utils/dataAttr.ts","../src/utils/qrcode.ts","../src/a11y/keys.ts","../src/styles/button.ts","../src/styles/input.ts","../src/styles/floatingLabel.ts","../src/components/button.ts","../src/components/input.ts","../src/components/tabs.ts"],"names":["sizeMap"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Compose multiple refs into a single ref callback. Useful when a component\r\n * needs both an internal ref (e.g. for focus management) and a forwarded ref\r\n * from the caller.\r\n *\r\n * Framework-agnostic: works with any ref shape (callback or object with `.current`).\r\n */\r\n\r\nexport type PossibleRef<T> = ((instance: T | null) => void) | { current: T | null } | null | undefined;\r\n\r\nexport function setRef<T>(ref: PossibleRef<T>, value: T | null): void {\r\n if (typeof ref === 'function') {\r\n ref(value);\r\n } else if (ref != null) {\r\n ref.current = value;\r\n }\r\n}\r\n\r\nexport function composeRefs<T>(...refs: PossibleRef<T>[]): (node: T | null) => void {\r\n return (node: T | null) => {\r\n for (const ref of refs) {\r\n setRef(ref, node);\r\n }\r\n };\r\n}\r\n","/**\r\n * Compose two event handlers so the consumer's handler runs first; if it\r\n * calls `event.preventDefault()` (or passes `checkForDefaultPrevented` and the\r\n * synthetic event reports `defaultPrevented`), the internal handler is skipped.\r\n *\r\n * This pattern lets internal handlers do \"after\" work (e.g. close a popover)\r\n * while still letting the consumer opt out.\r\n */\r\n\r\ntype AnyEvent = { defaultPrevented?: boolean };\r\n\r\nexport function composeEventHandlers<E extends AnyEvent>(\r\n originalEventHandler: ((event: E) => void) | undefined,\r\n ourEventHandler: ((event: E) => void) | undefined,\r\n { checkForDefaultPrevented = true }: { checkForDefaultPrevented?: boolean } = {},\r\n): (event: E) => void {\r\n return function handleEvent(event: E) {\r\n originalEventHandler?.(event);\r\n if (checkForDefaultPrevented === false || !event.defaultPrevented) {\r\n ourEventHandler?.(event);\r\n }\r\n };\r\n}\r\n","/**\r\n * Merge two prop bags. Event handlers (`on*`) are chained via\r\n * composeEventHandlers; className strings are concatenated; style objects\r\n * are shallow-merged; everything else: the second arg wins.\r\n */\r\nimport { composeEventHandlers } from './composeEventHandlers';\r\n\r\ntype AnyProps = Record<string, unknown>;\r\n\r\nexport function mergeProps<A extends AnyProps, B extends AnyProps>(a: A, b: B): A & B {\r\n const merged: AnyProps = { ...a };\r\n\r\n for (const key in b) {\r\n const aValue = (a as AnyProps)[key];\r\n const bValue = (b as AnyProps)[key];\r\n\r\n if (\r\n key.startsWith('on') &&\r\n typeof aValue === 'function' &&\r\n typeof bValue === 'function'\r\n ) {\r\n merged[key] = composeEventHandlers(\r\n aValue as (event: { defaultPrevented?: boolean }) => void,\r\n bValue as (event: { defaultPrevented?: boolean }) => void,\r\n );\r\n } else if (key === 'className' && typeof aValue === 'string' && typeof bValue === 'string') {\r\n merged[key] = `${aValue} ${bValue}`.trim();\r\n } else if (key === 'style' && aValue && bValue && typeof aValue === 'object' && typeof bValue === 'object') {\r\n merged[key] = { ...(aValue as object), ...(bValue as object) };\r\n } else {\r\n merged[key] = bValue;\r\n }\r\n }\r\n\r\n return merged as A & B;\r\n}\r\n","/**\r\n * Helpers for conditionally emitting ARIA + data attributes. Returning\r\n * `undefined` (instead of `false`) keeps DOM clean: the attribute is omitted\r\n * entirely when the state isn't active.\r\n */\r\n\r\nexport function dataAttr(condition: boolean | undefined): '' | undefined {\r\n return condition ? '' : undefined;\r\n}\r\n\r\nexport function ariaAttr(condition: boolean | undefined): boolean | undefined {\r\n return condition ? true : undefined;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\r\n/**\r\n * Minimal QR Code generator (byte mode only, error-correction levels L/M/Q/H,\r\n * versions 1–10). Adapted from Nayuki's QR Code generator algorithm; this is a\r\n * lean self-contained TypeScript port small enough to ship in a UI library\r\n * without pulling in an external dependency.\r\n *\r\n * Returns a square boolean matrix (true = dark module, false = light) plus the\r\n * chosen version. The caller is responsible for rendering it (SVG, canvas,\r\n * native paths, …).\r\n */\r\n\r\nexport type ErrorCorrection = 'L' | 'M' | 'Q' | 'H';\r\n\r\nexport interface QRMatrix {\r\n size: number;\r\n modules: boolean[][];\r\n version: number;\r\n}\r\n\r\nconst ECC_ORDER: Record<ErrorCorrection, number> = { L: 0, M: 1, Q: 2, H: 3 };\r\n\r\n// EC codewords per version per level (versions 1-10)\r\nconst ECC_CODEWORDS_PER_BLOCK: number[][] = [\r\n // L, M, Q, H\r\n [7, 10, 13, 17], // 1\r\n [10, 16, 22, 28], // 2\r\n [15, 26, 18, 22], // 3\r\n [20, 18, 26, 16], // 4\r\n [26, 24, 18, 22], // 5\r\n [18, 16, 24, 28], // 6\r\n [20, 18, 18, 26], // 7\r\n [24, 22, 22, 26], // 8\r\n [30, 22, 20, 24], // 9\r\n [18, 26, 24, 28], // 10\r\n];\r\n\r\nconst NUM_ERROR_CORRECTION_BLOCKS: number[][] = [\r\n [1, 1, 1, 1],\r\n [1, 1, 1, 1],\r\n [1, 1, 2, 2],\r\n [1, 2, 2, 4],\r\n [1, 2, 4, 4],\r\n [2, 4, 4, 4],\r\n [2, 4, 6, 5],\r\n [2, 4, 6, 6],\r\n [2, 5, 8, 8],\r\n [4, 5, 8, 8],\r\n];\r\n\r\nfunction getEccCount(ver: number, ecl: ErrorCorrection): number {\r\n return ECC_CODEWORDS_PER_BLOCK[ver - 1]![ECC_ORDER[ecl]]!;\r\n}\r\n\r\nfunction getNumBlocks(ver: number, ecl: ErrorCorrection): number {\r\n return NUM_ERROR_CORRECTION_BLOCKS[ver - 1]![ECC_ORDER[ecl]]!;\r\n}\r\n\r\nconst NUM_RAW_DATA_MODULES = (ver: number): number => {\r\n let result = (16 * ver + 128) * ver + 64;\r\n if (ver >= 2) {\r\n const align = Math.floor(ver / 7) + 2;\r\n result -= (25 * align - 10) * align - 55;\r\n if (ver >= 7) result -= 36;\r\n }\r\n return result;\r\n};\r\n\r\nconst NUM_DATA_CODEWORDS = (ver: number, ecl: ErrorCorrection): number => {\r\n return Math.floor(NUM_RAW_DATA_MODULES(ver) / 8) - getEccCount(ver, ecl) * getNumBlocks(ver, ecl);\r\n};\r\n\r\nconst EXP_TABLE: number[] = new Array(256).fill(0);\r\nconst LOG_TABLE: number[] = new Array(256).fill(0);\r\n{\r\n let x = 1;\r\n for (let i = 0; i < 255; i++) {\r\n EXP_TABLE[i] = x;\r\n LOG_TABLE[x] = i;\r\n x = x << 1;\r\n if (x & 0x100) x ^= 0x11d;\r\n }\r\n EXP_TABLE[255] = EXP_TABLE[0]!;\r\n}\r\n\r\nfunction rsMul(x: number, y: number): number {\r\n if (x === 0 || y === 0) return 0;\r\n return EXP_TABLE[(LOG_TABLE[x]! + LOG_TABLE[y]!) % 255]!;\r\n}\r\n\r\nfunction rsGeneratorPoly(degree: number): number[] {\r\n const result: number[] = [1];\r\n for (let i = 0; i < degree; i++) {\r\n const next: number[] = new Array(result.length + 1).fill(0);\r\n for (let j = 0; j < result.length; j++) {\r\n next[j] = (next[j]! ^ rsMul(result[j]!, EXP_TABLE[i]!)) & 0xff;\r\n next[j + 1] = (next[j + 1]! ^ result[j]!) & 0xff;\r\n }\r\n for (let j = 0; j < next.length; j++) result[j] = next[j]!;\r\n result.push(next[next.length - 1]!);\r\n }\r\n return result;\r\n}\r\n\r\nfunction rsRemainder(data: number[], generator: number[]): number[] {\r\n const result: number[] = new Array(generator.length - 1).fill(0);\r\n for (const b of data) {\r\n const factor = (b ^ result.shift()!) & 0xff;\r\n result.push(0);\r\n for (let i = 0; i < result.length; i++) result[i] = (result[i]! ^ rsMul(generator[i]!, factor)) & 0xff;\r\n }\r\n return result;\r\n}\r\n\r\nclass BitBuffer {\r\n bits: number[] = [];\r\n append(value: number, length: number): void {\r\n for (let i = length - 1; i >= 0; i--) this.bits.push((value >>> i) & 1);\r\n }\r\n}\r\n\r\nfunction encodeToBitBuffer(text: string, version: number): BitBuffer {\r\n const buf = new BitBuffer();\r\n buf.append(0x4, 4);\r\n const charCountBits = version < 10 ? 8 : 16;\r\n const enc = new TextEncoder();\r\n const arr = enc.encode(text);\r\n buf.append(arr.length, charCountBits);\r\n for (const b of arr) buf.append(b, 8);\r\n return buf;\r\n}\r\n\r\nfunction chooseVersion(text: string, ecl: ErrorCorrection): { version: number; bits: BitBuffer } {\r\n for (let v = 1; v <= 10; v++) {\r\n const buf = encodeToBitBuffer(text, v);\r\n const capacity = NUM_DATA_CODEWORDS(v, ecl) * 8;\r\n if (buf.bits.length <= capacity) return { version: v, bits: buf };\r\n }\r\n throw new Error('Data too long for QR Code v1-10. Trim the input or use a smaller ECC level.');\r\n}\r\n\r\nfunction buildDataCodewords(version: number, ecl: ErrorCorrection, bits: BitBuffer): number[] {\r\n const capacity = NUM_DATA_CODEWORDS(version, ecl) * 8;\r\n const termLen = Math.min(4, capacity - bits.bits.length);\r\n bits.append(0, termLen);\r\n bits.append(0, (8 - (bits.bits.length % 8)) % 8);\r\n const padBytes = [0xec, 0x11];\r\n for (let i = 0; bits.bits.length < capacity; i++) bits.append(padBytes[i % 2]!, 8);\r\n const bytes: number[] = [];\r\n for (let i = 0; i < bits.bits.length; i += 8) {\r\n let b = 0;\r\n for (let j = 0; j < 8; j++) b = (b << 1) | bits.bits[i + j]!;\r\n bytes.push(b);\r\n }\r\n const eccPerBlock = getEccCount(version, ecl);\r\n const numBlocks = getNumBlocks(version, ecl);\r\n const totalCodewords = Math.floor(NUM_RAW_DATA_MODULES(version) / 8);\r\n const numShortBlocks = numBlocks - (totalCodewords % numBlocks);\r\n const shortBlockLen = Math.floor(totalCodewords / numBlocks);\r\n const blocks: number[][] = [];\r\n const generator = rsGeneratorPoly(eccPerBlock);\r\n let k = 0;\r\n for (let i = 0; i < numBlocks; i++) {\r\n const dataLen = shortBlockLen - eccPerBlock + (i < numShortBlocks ? 0 : 1);\r\n const data = bytes.slice(k, k + dataLen);\r\n k += dataLen;\r\n const block = data.slice();\r\n const ec = rsRemainder(data, generator);\r\n for (const b of ec) block.push(b);\r\n blocks.push(block);\r\n }\r\n const result: number[] = [];\r\n const lastBlock = blocks[blocks.length - 1]!;\r\n for (let i = 0; i < lastBlock.length; i++) {\r\n for (let j = 0; j < blocks.length; j++) {\r\n if (i !== shortBlockLen - eccPerBlock || j >= numShortBlocks) result.push(blocks[j]![i]!);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\nfunction buildMatrix(version: number, ecl: ErrorCorrection, codewords: number[]): boolean[][] {\r\n const size = version * 4 + 17;\r\n const matrix: boolean[][] = Array.from({ length: size }, () => new Array(size).fill(false));\r\n const reserved: boolean[][] = Array.from({ length: size }, () => new Array(size).fill(false));\r\n\r\n const setModule = (x: number, y: number, dark: boolean) => {\r\n matrix[y]![x] = dark;\r\n reserved[y]![x] = true;\r\n };\r\n\r\n const drawFinder = (cx: number, cy: number) => {\r\n for (let dy = -4; dy <= 4; dy++) {\r\n for (let dx = -4; dx <= 4; dx++) {\r\n const x = cx + dx;\r\n const y = cy + dy;\r\n if (x < 0 || y < 0 || x >= size || y >= size) continue;\r\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\r\n setModule(x, y, dist !== 2 && dist !== 4);\r\n }\r\n }\r\n };\r\n drawFinder(3, 3);\r\n drawFinder(size - 4, 3);\r\n drawFinder(3, size - 4);\r\n\r\n for (let i = 8; i < size - 8; i++) {\r\n setModule(6, i, i % 2 === 0);\r\n setModule(i, 6, i % 2 === 0);\r\n }\r\n\r\n if (version >= 2) {\r\n const positions = getAlignmentPositions(version);\r\n for (const ay of positions) {\r\n for (const ax of positions) {\r\n if ((ax === 6 && ay === 6) || (ax === 6 && ay === size - 7) || (ax === size - 7 && ay === 6)) continue;\r\n for (let dy = -2; dy <= 2; dy++) {\r\n for (let dx = -2; dx <= 2; dx++) {\r\n const dist = Math.max(Math.abs(dx), Math.abs(dy));\r\n setModule(ax + dx, ay + dy, dist !== 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n setModule(8, size - 8, true);\r\n\r\n for (let i = 0; i < 9; i++) {\r\n reserved[8]![i] = true;\r\n reserved[i]![8] = true;\r\n }\r\n for (let i = 0; i < 8; i++) {\r\n reserved[8]![size - 1 - i] = true;\r\n reserved[size - 1 - i]![8] = true;\r\n }\r\n\r\n const bits: number[] = [];\r\n for (const b of codewords) for (let i = 7; i >= 0; i--) bits.push((b >>> i) & 1);\r\n let bitIdx = 0;\r\n for (let right = size - 1; right >= 1; right -= 2) {\r\n if (right === 6) right = 5;\r\n for (let vert = 0; vert < size; vert++) {\r\n for (let j = 0; j < 2; j++) {\r\n const x = right - j;\r\n const upward = ((right + 1) & 2) === 0;\r\n const y = upward ? size - 1 - vert : vert;\r\n if (!reserved[y]![x] && bitIdx < bits.length) {\r\n matrix[y]![x] = bits[bitIdx] === 1;\r\n bitIdx++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const mask = 0;\r\n for (let y = 0; y < size; y++) {\r\n for (let x = 0; x < size; x++) {\r\n if (reserved[y]![x]) continue;\r\n if ((x + y) % 2 === 0) matrix[y]![x] = !matrix[y]![x];\r\n }\r\n }\r\n\r\n const formatBits = encodeFormat(ECC_ORDER[ecl], mask);\r\n for (let i = 0; i <= 5; i++) matrix[8]![i] = ((formatBits >> i) & 1) === 1;\r\n matrix[8]![7] = ((formatBits >> 6) & 1) === 1;\r\n matrix[8]![8] = ((formatBits >> 7) & 1) === 1;\r\n matrix[7]![8] = ((formatBits >> 8) & 1) === 1;\r\n for (let i = 9; i < 15; i++) matrix[14 - i]![8] = ((formatBits >> i) & 1) === 1;\r\n for (let i = 0; i < 8; i++) matrix[size - 1 - i]![8] = ((formatBits >> i) & 1) === 1;\r\n for (let i = 8; i < 15; i++) matrix[8]![size - 15 + i] = ((formatBits >> i) & 1) === 1;\r\n\r\n return matrix;\r\n}\r\n\r\nfunction getAlignmentPositions(version: number): number[] {\r\n if (version === 1) return [];\r\n const numAlign = Math.floor(version / 7) + 2;\r\n const step = Math.ceil(((version * 4 + 4) / (numAlign * 2 - 2)) * 2) / 2 * 2;\r\n const positions: number[] = [6];\r\n for (let pos = version * 4 + 10; positions.length < numAlign; pos -= step) positions.splice(1, 0, pos);\r\n return positions;\r\n}\r\n\r\nfunction encodeFormat(eclLevel: number, mask: number): number {\r\n const map = [1, 0, 3, 2];\r\n const eclBits = map[eclLevel]!;\r\n const data = (eclBits << 3) | mask;\r\n let bch = data;\r\n for (let i = 0; i < 10; i++) bch = (bch << 1) ^ ((bch >> 9) * 0x537);\r\n return ((data << 10) | bch) ^ 0x5412;\r\n}\r\n\r\n/** Generate a QR matrix for the given text. */\r\nexport function generateQrMatrix(text: string, ecl: ErrorCorrection = 'M'): QRMatrix {\r\n const { version, bits } = chooseVersion(text, ecl);\r\n const codewords = buildDataCodewords(version, ecl, bits);\r\n const modules = buildMatrix(version, ecl, codewords);\r\n return { size: modules.length, modules, version };\r\n}\r\n","/**\r\n * Named keyboard constants. Adapters use these instead of magic strings so\r\n * keyboard logic is consistent across frameworks.\r\n */\r\nexport const Keys = {\r\n Enter: 'Enter',\r\n Space: ' ',\r\n Escape: 'Escape',\r\n Tab: 'Tab',\r\n ArrowUp: 'ArrowUp',\r\n ArrowDown: 'ArrowDown',\r\n ArrowLeft: 'ArrowLeft',\r\n ArrowRight: 'ArrowRight',\r\n Home: 'Home',\r\n End: 'End',\r\n PageUp: 'PageUp',\r\n PageDown: 'PageDown',\r\n Backspace: 'Backspace',\r\n Delete: 'Delete',\r\n} as const;\r\n\r\nexport type KeyName = (typeof Keys)[keyof typeof Keys];\r\n\r\n/** True when the event represents an activation (Enter or Space). */\r\nexport function isActivationKey(key: string): boolean {\r\n return key === Keys.Enter || key === Keys.Space;\r\n}\r\n","/**\r\n * Headless style descriptor for the Button component. Given a theme and the\r\n * Button's variant/size/state, returns a flat style object usable by both web\r\n * adapters (inline styles or vanilla-extract recipes) and React Native.\r\n *\r\n * Keeping this here means every framework adapter looks identical visually\r\n * without re-implementing variant logic per framework.\r\n */\r\nimport type { ElvoraTheme, IntentScale } from '../theme-shape';\r\nimport type { ElvoraSize, ElvoraVariant } from '../types';\r\n\r\nexport interface ButtonStyleInputs {\r\n theme: ElvoraTheme;\r\n variant: ElvoraVariant;\r\n size: ElvoraSize;\r\n fullWidth: boolean;\r\n isLoading: boolean;\r\n isDisabled: boolean;\r\n isPressed: boolean;\r\n isHovered: boolean;\r\n isFocusVisible: boolean;\r\n /** Intent overrides the variant's default color scheme (defaults to primary). */\r\n intent?: keyof ElvoraTheme['colors']['intent'];\r\n}\r\n\r\nexport interface ButtonStyle {\r\n /** Root style object — keys are camelCase so the same shape works in RN + web. */\r\n root: Record<string, string | number | undefined>;\r\n /** Label/text style. */\r\n label: Record<string, string | number | undefined>;\r\n /** Loading spinner color. */\r\n spinnerColor: string;\r\n}\r\n\r\nconst sizeMap: Record<\r\n ElvoraSize,\r\n { padX: number; padY: number; font: number; height: number; gap: number; radius: keyof ElvoraTheme['radii'] }\r\n> = {\r\n xs: { padX: 8, padY: 4, font: 12, height: 24, gap: 4, radius: 'sm' },\r\n sm: { padX: 12, padY: 6, font: 13, height: 32, gap: 6, radius: 'md' },\r\n md: { padX: 16, padY: 8, font: 14, height: 40, gap: 8, radius: 'md' },\r\n lg: { padX: 20, padY: 10, font: 16, height: 48, gap: 8, radius: 'lg' },\r\n xl: { padX: 24, padY: 12, font: 18, height: 56, gap: 10, radius: 'lg' },\r\n};\r\n\r\nexport function getButtonStyle(input: ButtonStyleInputs): ButtonStyle {\r\n const { theme, variant, size, fullWidth, isLoading, isDisabled, isPressed, isHovered, isFocusVisible } =\r\n input;\r\n const intent: IntentScale =\r\n theme.colors.intent[input.intent ?? (variant === 'destructive' ? 'danger' : 'primary')];\r\n\r\n const dims = sizeMap[size];\r\n const radius = theme.radii[dims.radius];\r\n\r\n const baseRoot: Record<string, string | number | undefined> = {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n flexDirection: 'row',\r\n gap: dims.gap,\r\n paddingLeft: dims.padX,\r\n paddingRight: dims.padX,\r\n paddingTop: dims.padY,\r\n paddingBottom: dims.padY,\r\n minHeight: dims.height,\r\n borderRadius: radius,\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor: 'transparent',\r\n fontFamily: theme.tokens.typography.fontFamilies.sans,\r\n fontSize: dims.font,\r\n fontWeight: theme.tokens.typography.fontWeights.medium,\r\n lineHeight: theme.tokens.typography.lineHeights.tight,\r\n width: fullWidth ? '100%' : 'auto',\r\n cursor: isDisabled || isLoading ? 'not-allowed' : 'pointer',\r\n opacity: isDisabled ? 0.5 : 1,\r\n userSelect: 'none',\r\n transitionProperty: 'background-color, border-color, color, box-shadow, transform',\r\n transitionDuration: theme.durations.fast,\r\n transitionTimingFunction: theme.easings.standard,\r\n boxShadow: isFocusVisible ? theme.shadows.focus : undefined,\r\n };\r\n\r\n let root = baseRoot;\r\n let labelColor: string = theme.colors.fg;\r\n let spinnerColor: string = theme.colors.fg;\r\n\r\n switch (variant) {\r\n case 'primary':\r\n case 'destructive': {\r\n const bg = isPressed ? intent.solidActive : isHovered ? intent.solidHover : intent.solid;\r\n root = { ...root, backgroundColor: bg, borderColor: bg, color: intent.solidFg };\r\n labelColor = intent.solidFg;\r\n spinnerColor = intent.solidFg;\r\n break;\r\n }\r\n case 'secondary': {\r\n const bg = isPressed\r\n ? theme.colors.intent.neutral.subtleHover\r\n : isHovered\r\n ? theme.colors.intent.neutral.subtleHover\r\n : theme.colors.intent.neutral.subtle;\r\n root = {\r\n ...root,\r\n backgroundColor: bg,\r\n borderColor: theme.colors.border,\r\n color: theme.colors.fg,\r\n };\r\n labelColor = theme.colors.fg;\r\n spinnerColor = theme.colors.fg;\r\n break;\r\n }\r\n case 'tertiary': {\r\n const bg = isPressed ? intent.subtleHover : isHovered ? intent.subtle : 'transparent';\r\n root = { ...root, backgroundColor: bg, color: intent.fg };\r\n labelColor = intent.fg;\r\n spinnerColor = intent.fg;\r\n break;\r\n }\r\n case 'outline': {\r\n const bg = isPressed ? intent.subtleHover : isHovered ? intent.subtle : 'transparent';\r\n root = { ...root, backgroundColor: bg, borderColor: intent.border, color: intent.fg };\r\n labelColor = intent.fg;\r\n spinnerColor = intent.fg;\r\n break;\r\n }\r\n case 'ghost': {\r\n const bg = isPressed\r\n ? theme.colors.intent.neutral.subtleHover\r\n : isHovered\r\n ? theme.colors.intent.neutral.subtle\r\n : 'transparent';\r\n root = { ...root, backgroundColor: bg, color: theme.colors.fg };\r\n labelColor = theme.colors.fg;\r\n spinnerColor = theme.colors.fg;\r\n break;\r\n }\r\n case 'link': {\r\n root = {\r\n ...root,\r\n backgroundColor: 'transparent',\r\n minHeight: 'auto',\r\n padding: 0,\r\n color: intent.fg,\r\n textDecoration: isHovered || isPressed ? 'underline' : 'none',\r\n borderWidth: 0,\r\n };\r\n labelColor = intent.fg;\r\n spinnerColor = intent.fg;\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n root,\r\n label: {\r\n color: labelColor,\r\n fontSize: dims.font,\r\n fontWeight: theme.tokens.typography.fontWeights.medium,\r\n opacity: isLoading ? 0 : 1,\r\n },\r\n spinnerColor,\r\n };\r\n}\r\n","import type { ElvoraTheme } from '../theme-shape';\r\nimport type { ElvoraSize, ElvoraStatus } from '../types';\r\n\r\nexport interface InputStyleInputs {\r\n theme: ElvoraTheme;\r\n size: ElvoraSize;\r\n status: ElvoraStatus;\r\n isDisabled: boolean;\r\n isReadOnly: boolean;\r\n isInvalid: boolean;\r\n isFocused: boolean;\r\n isHovered: boolean;\r\n}\r\n\r\nconst sizeMap: Record<ElvoraSize, { padX: number; padY: number; font: number; height: number; radius: keyof ElvoraTheme['radii'] }> = {\r\n xs: { padX: 8, padY: 4, font: 12, height: 24, radius: 'sm' },\r\n sm: { padX: 10, padY: 6, font: 13, height: 32, radius: 'md' },\r\n md: { padX: 12, padY: 8, font: 14, height: 40, radius: 'md' },\r\n lg: { padX: 14, padY: 10, font: 16, height: 48, radius: 'lg' },\r\n xl: { padX: 16, padY: 12, font: 18, height: 56, radius: 'lg' },\r\n};\r\n\r\nconst statusIntent: Record<ElvoraStatus, keyof ElvoraTheme['colors']['intent']> = {\r\n neutral: 'neutral',\r\n info: 'info',\r\n success: 'success',\r\n warning: 'warning',\r\n error: 'danger',\r\n};\r\n\r\nexport function getInputStyle(input: InputStyleInputs): Record<string, string | number | undefined> {\r\n const { theme, size, status, isDisabled, isReadOnly, isInvalid, isFocused, isHovered } = input;\r\n const dims = sizeMap[size];\r\n const intent = theme.colors.intent[isInvalid ? 'danger' : statusIntent[status]];\r\n\r\n const borderColor = isFocused\r\n ? intent.border\r\n : isHovered && !isDisabled\r\n ? theme.colors.borderStrong\r\n : isInvalid || status === 'error'\r\n ? theme.colors.intent.danger.border\r\n : theme.colors.border;\r\n\r\n return {\r\n display: 'inline-flex',\r\n alignItems: 'center',\r\n width: '100%',\r\n minHeight: dims.height,\r\n paddingLeft: dims.padX,\r\n paddingRight: dims.padX,\r\n paddingTop: dims.padY,\r\n paddingBottom: dims.padY,\r\n borderRadius: theme.radii[dims.radius],\r\n borderWidth: 1,\r\n borderStyle: 'solid',\r\n borderColor,\r\n backgroundColor: isDisabled ? theme.colors.surface : theme.colors.surfaceElevated,\r\n color: theme.colors.fg,\r\n fontFamily: theme.tokens.typography.fontFamilies.sans,\r\n fontSize: dims.font,\r\n lineHeight: theme.tokens.typography.lineHeights.normal,\r\n outline: 'none',\r\n opacity: isDisabled ? 0.6 : 1,\r\n cursor: isDisabled ? 'not-allowed' : isReadOnly ? 'default' : 'text',\r\n boxShadow: isFocused ? `0 0 0 3px ${intent.ring}33` : undefined,\r\n transitionProperty: 'border-color, box-shadow, background-color',\r\n transitionDuration: theme.durations.fast,\r\n transitionTimingFunction: theme.easings.standard,\r\n };\r\n}\r\n","import type { ElvoraTheme } from '../theme-shape';\nimport type { ElvoraSize } from '../types';\n\nexport type FloatingLabelVariant = 'outlined' | 'filled';\n\nexport interface FloatingLabelStyleInputs {\n theme: ElvoraTheme;\n size: ElvoraSize;\n variant: FloatingLabelVariant;\n floated: boolean;\n focused: boolean;\n invalid: boolean;\n /**\n * Vertical resting position of the label when the field is empty. `center`\n * suits single-line controls; `top` suits multi-line controls (textarea)\n * where the text starts at the top.\n */\n restAlign?: 'center' | 'top';\n}\n\nconst sizeMap: Record<ElvoraSize, { padX: number; padY: number; restFont: number; floatFont: number }> = {\n xs: { padX: 8, padY: 4, restFont: 12, floatFont: 10 },\n sm: { padX: 10, padY: 6, restFont: 13, floatFont: 11 },\n md: { padX: 12, padY: 8, restFont: 14, floatFont: 12 },\n lg: { padX: 14, padY: 10, restFont: 16, floatFont: 12 },\n xl: { padX: 16, padY: 12, restFont: 18, floatFont: 13 },\n};\n\nexport interface FloatingLabelStyle {\n wrapper: Record<string, string | number | undefined>;\n label: Record<string, string | number | undefined>;\n}\n\n/**\n * Headless style descriptor for a floating label. Drives the `outlined`\n * (label notches the top border) and `filled` (label floats inside the field)\n * variants. The float is React-state driven via `floated` because the library\n * styles with inline CSS and cannot rely on `:focus`/`:placeholder-shown`.\n */\nexport function getFloatingLabelStyle(input: FloatingLabelStyleInputs): FloatingLabelStyle {\n const { theme, size, variant, floated, focused, invalid, restAlign = 'center' } = input;\n const dims = sizeMap[size];\n\n const activeColor = invalid\n ? theme.colors.intent.danger.fg\n : focused\n ? theme.colors.intent.info.fg\n : theme.colors.fgMuted;\n\n // Where the floated label sits vertically. Outlined rides the top border;\n // filled tucks just inside the top of the filled box.\n const floatedTop = variant === 'outlined' ? 0 : 4;\n\n // Resting position. `center` vertically centres over single-line fields;\n // `top` aligns to the first text line for multi-line fields.\n const restTop: number | string = restAlign === 'top' ? dims.padY : '50%';\n const restTransform = restAlign === 'top' ? 'translateY(0)' : 'translateY(-50%)';\n\n return {\n wrapper: {\n position: 'relative',\n display: 'inline-flex',\n width: '100%',\n },\n label: {\n position: 'absolute',\n left: dims.padX,\n maxWidth: `calc(100% - ${dims.padX * 2}px)`,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n pointerEvents: 'none',\n fontFamily: theme.tokens.typography.fontFamilies.sans,\n color: floated ? activeColor : theme.colors.fgMuted,\n top: floated ? floatedTop : restTop,\n transform: floated ? 'translateY(-50%)' : restTransform,\n fontSize: floated ? dims.floatFont : dims.restFont,\n lineHeight: theme.tokens.typography.lineHeights.snug,\n transitionProperty: 'top, font-size, color',\n transitionDuration: theme.durations.fast,\n transitionTimingFunction: theme.easings.standard,\n // Outlined: paint the field background behind the floated label so the\n // label visually \"notches\" the top border.\n ...(variant === 'outlined' && floated\n ? { paddingLeft: 4, paddingRight: 4, backgroundColor: theme.colors.surfaceElevated }\n : null),\n },\n };\n}\n","/**\r\n * Framework-agnostic Button contract. Each adapter extends/maps this to its\r\n * framework-idiomatic event names (onPress vs press vs @press) but the\r\n * semantics are identical: same variants, same sizes, same states.\r\n */\r\nimport type { ElvoraSize, ElvoraVariant } from '../types';\r\nimport type { ElvoraTheme } from '../theme-shape';\r\n\r\nexport interface ButtonOwnProps {\r\n /** Visual variant. Defaults to `'primary'`. */\r\n variant?: ElvoraVariant;\r\n /** Size. Defaults to `'md'`. */\r\n size?: ElvoraSize;\r\n /** Override the intent (color scheme) for this button. */\r\n intent?: keyof ElvoraTheme['colors']['intent'];\r\n /** When true, stretches the button to fill its container. */\r\n fullWidth?: boolean;\r\n /** When true, shows a spinner and prevents activation. */\r\n isLoading?: boolean;\r\n /** Disabled state. */\r\n isDisabled?: boolean;\r\n /** Loading-state announcement for assistive tech. Defaults to \"Loading\". */\r\n loadingText?: string;\r\n /** Type attribute for HTML buttons. Defaults to `'button'`. */\r\n type?: 'button' | 'submit' | 'reset';\r\n}\r\n\r\nexport const defaultButtonProps = {\r\n variant: 'primary' as ElvoraVariant,\r\n size: 'md' as ElvoraSize,\r\n type: 'button' as const,\r\n fullWidth: false,\r\n isLoading: false,\r\n isDisabled: false,\r\n loadingText: 'Loading',\r\n};\r\n","import type { ElvoraSize, ElvoraStatus } from '../types';\r\n\r\nexport interface InputOwnProps {\r\n size?: ElvoraSize;\r\n /** Validation status (changes border color and icon). */\r\n status?: ElvoraStatus;\r\n /** When true, renders a read-only input. */\r\n isReadOnly?: boolean;\r\n /** When true, disables the input. */\r\n isDisabled?: boolean;\r\n /** When true, the field is required for form submission. */\r\n isRequired?: boolean;\r\n /** When true, marks the input as invalid (`aria-invalid`). */\r\n isInvalid?: boolean;\r\n}\r\n\r\nexport const defaultInputProps = {\r\n size: 'md' as ElvoraSize,\r\n status: 'neutral' as ElvoraStatus,\r\n isReadOnly: false,\r\n isDisabled: false,\r\n isRequired: false,\r\n isInvalid: false,\r\n};\r\n","/**\r\n * Headless Tabs contract. Each adapter renders tab buttons + panels and wires\r\n * keyboard navigation per WAI-ARIA Tabs pattern.\r\n */\r\n\r\nimport type { Orientation } from '../types';\r\n\r\nexport interface TabDescriptor<V extends string = string> {\r\n /** Stable identifier for this tab; becomes the selected value. */\r\n value: V;\r\n /** Visible label. */\r\n label: string;\r\n /** Disable this tab. */\r\n isDisabled?: boolean;\r\n}\r\n\r\nexport type TabsActivation = 'automatic' | 'manual';\r\n\r\nexport interface TabsKeyboardOptions {\r\n orientation?: Orientation;\r\n /** When `automatic` (default) arrow keys also select; `manual` only moves focus. */\r\n activation?: TabsActivation;\r\n}\r\n\r\n/**\r\n * Compute the next focusable tab index for a keyboard event. Returns the\r\n * current index if the key shouldn't move focus.\r\n */\r\nexport function getNextTabIndex(\r\n event: { key: string },\r\n currentIndex: number,\r\n tabs: ReadonlyArray<{ isDisabled?: boolean }>,\r\n options: TabsKeyboardOptions = {},\r\n): number {\r\n const { orientation = 'horizontal' } = options;\r\n const last = tabs.length - 1;\r\n const next = (i: number) => {\r\n let n = i;\r\n do {\r\n n = n >= last ? 0 : n + 1;\r\n } while (tabs[n]?.isDisabled && n !== i);\r\n return n;\r\n };\r\n const prev = (i: number) => {\r\n let p = i;\r\n do {\r\n p = p <= 0 ? last : p - 1;\r\n } while (tabs[p]?.isDisabled && p !== i);\r\n return p;\r\n };\r\n if (orientation === 'horizontal') {\r\n if (event.key === 'ArrowRight') return next(currentIndex);\r\n if (event.key === 'ArrowLeft') return prev(currentIndex);\r\n } else {\r\n if (event.key === 'ArrowDown') return next(currentIndex);\r\n if (event.key === 'ArrowUp') return prev(currentIndex);\r\n }\r\n if (event.key === 'Home') return next(-1);\r\n if (event.key === 'End') return prev(0);\r\n return currentIndex;\r\n}\r\n"]}
@@ -0,0 +1,245 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+
5
+ // src/react/useIsomorphicLayoutEffect.ts
6
+ var useIsomorphicLayoutEffect = typeof window !== "undefined" && typeof window.document !== "undefined" ? react.useLayoutEffect : react.useEffect;
7
+ function useEventCallback(fn) {
8
+ const ref = react.useRef(fn);
9
+ useIsomorphicLayoutEffect(() => {
10
+ ref.current = fn;
11
+ });
12
+ return react.useCallback((...args) => ref.current?.(...args), []);
13
+ }
14
+
15
+ // src/id.ts
16
+ var counter = 0;
17
+ function generateId(prefix = "elvora") {
18
+ if (typeof globalThis !== "undefined" && globalThis.crypto?.randomUUID) {
19
+ return `${prefix}-${globalThis.crypto.randomUUID().slice(0, 8)}`;
20
+ }
21
+ counter = counter + 1 | 0;
22
+ return `${prefix}-${counter.toString(36)}`;
23
+ }
24
+
25
+ // src/react/useId.ts
26
+ function useId(providedId, prefix = "elvora") {
27
+ const reactId = typeof react.useId === "function" ? react.useId() : void 0;
28
+ const fallback = react.useMemo(() => generateId(prefix), [prefix]);
29
+ if (providedId) return providedId;
30
+ return reactId ? `${prefix}-${reactId.replace(/:/g, "")}` : fallback;
31
+ }
32
+ function useControllableState({
33
+ value,
34
+ defaultValue,
35
+ onChange
36
+ }) {
37
+ const isControlled = value !== void 0;
38
+ const [uncontrolled, setUncontrolled] = react.useState(defaultValue);
39
+ const onChangeStable = useEventCallback(onChange);
40
+ const currentRef = react.useRef(isControlled ? value : uncontrolled);
41
+ currentRef.current = isControlled ? value : uncontrolled;
42
+ const setValue = react.useCallback(
43
+ (next) => {
44
+ const resolved = typeof next === "function" ? next(currentRef.current) : next;
45
+ if (!isControlled) {
46
+ setUncontrolled(resolved);
47
+ }
48
+ onChangeStable(resolved);
49
+ },
50
+ [isControlled, onChangeStable]
51
+ );
52
+ return [isControlled ? value : uncontrolled, setValue];
53
+ }
54
+ function usePortal(id = "elvora-portal-root") {
55
+ const [container, setContainer] = react.useState(null);
56
+ react.useEffect(() => {
57
+ if (typeof document === "undefined") return;
58
+ let node = document.getElementById(id);
59
+ let created = false;
60
+ if (!node) {
61
+ node = document.createElement("div");
62
+ node.id = id;
63
+ node.setAttribute("data-elvora-portal", "");
64
+ document.body.appendChild(node);
65
+ created = true;
66
+ }
67
+ setContainer(node);
68
+ return () => {
69
+ if (created && node && node.parentElement && node.childNodes.length === 0) {
70
+ node.parentElement.removeChild(node);
71
+ }
72
+ };
73
+ }, [id]);
74
+ return container;
75
+ }
76
+
77
+ // src/focus/focusable.ts
78
+ var FOCUSABLE_SELECTORS = [
79
+ "a[href]",
80
+ "area[href]",
81
+ "button:not([disabled])",
82
+ 'input:not([disabled]):not([type="hidden"])',
83
+ "select:not([disabled])",
84
+ "textarea:not([disabled])",
85
+ "iframe",
86
+ "object",
87
+ "embed",
88
+ "audio[controls]",
89
+ "video[controls]",
90
+ '[contenteditable]:not([contenteditable="false"])',
91
+ '[tabindex]:not([tabindex^="-"])'
92
+ ];
93
+ var FOCUSABLE_SELECTOR = FOCUSABLE_SELECTORS.join(", ");
94
+ function isElementVisible(el) {
95
+ if (el.hidden) return false;
96
+ const style = el.ownerDocument.defaultView?.getComputedStyle(el);
97
+ if (!style) return true;
98
+ return style.visibility !== "hidden" && style.display !== "none";
99
+ }
100
+ function isFocusable(el) {
101
+ if (!el.isConnected) return false;
102
+ if (el.disabled) return false;
103
+ if (el.getAttribute("aria-hidden") === "true") return false;
104
+ if (el.hasAttribute("inert")) return false;
105
+ if (!isElementVisible(el)) return false;
106
+ return el.matches(FOCUSABLE_SELECTOR);
107
+ }
108
+ function getFocusableElements(container) {
109
+ const nodes = Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR));
110
+ return nodes.filter(isFocusable);
111
+ }
112
+ function getFirstFocusable(container) {
113
+ return getFocusableElements(container)[0] ?? null;
114
+ }
115
+ function getLastFocusable(container) {
116
+ const list = getFocusableElements(container);
117
+ return list[list.length - 1] ?? null;
118
+ }
119
+
120
+ // src/focus/focusTrap.ts
121
+ function createFocusTrap(container, options = {}) {
122
+ let active = false;
123
+ let previouslyFocused = null;
124
+ function handleKeyDown(event) {
125
+ if (!active) return;
126
+ if (event.key === "Escape" && options.onEscape) {
127
+ options.onEscape(event);
128
+ return;
129
+ }
130
+ if (event.key !== "Tab") return;
131
+ const first = getFirstFocusable(container);
132
+ const last = getLastFocusable(container);
133
+ if (!first || !last) {
134
+ event.preventDefault();
135
+ container.focus();
136
+ return;
137
+ }
138
+ const activeEl = container.ownerDocument.activeElement;
139
+ if (event.shiftKey) {
140
+ if (activeEl === first || !container.contains(activeEl)) {
141
+ event.preventDefault();
142
+ last.focus();
143
+ }
144
+ } else {
145
+ if (activeEl === last) {
146
+ event.preventDefault();
147
+ first.focus();
148
+ }
149
+ }
150
+ }
151
+ function handlePointerDown(event) {
152
+ if (!active) return;
153
+ const target = event.target;
154
+ if (target && !container.contains(target)) {
155
+ options.onOutsideClick?.(event);
156
+ }
157
+ }
158
+ return {
159
+ activate() {
160
+ if (active) return;
161
+ active = true;
162
+ previouslyFocused = container.ownerDocument.activeElement ?? null;
163
+ const target = options.initialFocus ?? getFirstFocusable(container) ?? (isFocusable(container) ? container : null);
164
+ if (target) {
165
+ target.focus({ preventScroll: false });
166
+ } else {
167
+ container.setAttribute("tabindex", "-1");
168
+ container.focus({ preventScroll: false });
169
+ }
170
+ container.ownerDocument.addEventListener("keydown", handleKeyDown, true);
171
+ container.ownerDocument.addEventListener("mousedown", handlePointerDown, true);
172
+ container.ownerDocument.addEventListener("touchstart", handlePointerDown, true);
173
+ },
174
+ deactivate() {
175
+ if (!active) return;
176
+ active = false;
177
+ container.ownerDocument.removeEventListener("keydown", handleKeyDown, true);
178
+ container.ownerDocument.removeEventListener("mousedown", handlePointerDown, true);
179
+ container.ownerDocument.removeEventListener("touchstart", handlePointerDown, true);
180
+ const returnTo = options.returnFocus ?? previouslyFocused;
181
+ if (returnTo && returnTo.isConnected) {
182
+ returnTo.focus({ preventScroll: false });
183
+ }
184
+ },
185
+ isActive() {
186
+ return active;
187
+ }
188
+ };
189
+ }
190
+
191
+ // src/react/useFocusTrap.ts
192
+ function useFocusTrap(ref, options) {
193
+ const trapRef = react.useRef(null);
194
+ react.useEffect(() => {
195
+ const node = ref.current;
196
+ if (!node || !options.enabled) {
197
+ trapRef.current?.deactivate();
198
+ trapRef.current = null;
199
+ return;
200
+ }
201
+ const trap = createFocusTrap(node, options);
202
+ trap.activate();
203
+ trapRef.current = trap;
204
+ return () => {
205
+ trap.deactivate();
206
+ trapRef.current = null;
207
+ };
208
+ }, [ref, options.enabled]);
209
+ }
210
+ function useDismissable(ref, {
211
+ enabled,
212
+ onDismiss,
213
+ closeOnEscape = true,
214
+ closeOnOutsideClick = true
215
+ }) {
216
+ react.useEffect(() => {
217
+ if (!enabled) return;
218
+ function handleKey(e) {
219
+ if (closeOnEscape && e.key === "Escape") onDismiss(e);
220
+ }
221
+ function handlePointer(e) {
222
+ if (!closeOnOutsideClick) return;
223
+ const target = e.target;
224
+ if (target && ref.current && !ref.current.contains(target)) onDismiss(e);
225
+ }
226
+ document.addEventListener("keydown", handleKey, true);
227
+ document.addEventListener("mousedown", handlePointer, true);
228
+ document.addEventListener("touchstart", handlePointer, true);
229
+ return () => {
230
+ document.removeEventListener("keydown", handleKey, true);
231
+ document.removeEventListener("mousedown", handlePointer, true);
232
+ document.removeEventListener("touchstart", handlePointer, true);
233
+ };
234
+ }, [enabled, onDismiss, closeOnEscape, closeOnOutsideClick, ref]);
235
+ }
236
+
237
+ exports.useControllableState = useControllableState;
238
+ exports.useDismissable = useDismissable;
239
+ exports.useEventCallback = useEventCallback;
240
+ exports.useFocusTrap = useFocusTrap;
241
+ exports.useId = useId;
242
+ exports.useIsomorphicLayoutEffect = useIsomorphicLayoutEffect;
243
+ exports.usePortal = usePortal;
244
+ //# sourceMappingURL=index.cjs.map
245
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/useIsomorphicLayoutEffect.ts","../../src/react/useEventCallback.ts","../../src/id.ts","../../src/react/useId.ts","../../src/react/useControllableState.ts","../../src/react/usePortal.ts","../../src/focus/focusable.ts","../../src/focus/focusTrap.ts","../../src/react/useFocusTrap.ts","../../src/react/useDismissable.ts"],"names":["useLayoutEffect","useEffect","useRef","useCallback","useReactId","useMemo","useState"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useLayoutEffect } from 'react';\r\n\r\n/**\r\n * `useLayoutEffect` warns when used during SSR; this swaps in `useEffect` on\r\n * the server so components stay isomorphic.\r\n */\r\nexport const useIsomorphicLayoutEffect =\r\n typeof window !== 'undefined' && typeof window.document !== 'undefined'\r\n ? useLayoutEffect\r\n : useEffect;\r\n","import { useCallback, useRef } from 'react';\r\nimport { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect';\r\n\r\n/**\r\n * Returns a stable callback identity whose body reads the latest props/state.\r\n * Lets a component pass the same handler down across renders without making\r\n * dependents re-render, while still calling the latest closure.\r\n */\r\nexport function useEventCallback<Args extends unknown[], R>(\r\n fn: ((...args: Args) => R) | undefined,\r\n): (...args: Args) => R | undefined {\r\n const ref = useRef(fn);\r\n\r\n useIsomorphicLayoutEffect(() => {\r\n ref.current = fn;\r\n });\r\n\r\n return useCallback((...args: Args) => ref.current?.(...args), []);\r\n}\r\n","/**\r\n * Tiny, SSR-safe id generator. Prefer crypto.randomUUID when available, fall\r\n * back to a monotonic counter otherwise so generated ids are stable across\r\n * server/client when adapters seed them once.\r\n */\r\n\r\nlet counter = 0;\r\n\r\nexport function generateId(prefix = 'elvora'): string {\r\n if (typeof globalThis !== 'undefined' && globalThis.crypto?.randomUUID) {\r\n return `${prefix}-${globalThis.crypto.randomUUID().slice(0, 8)}`;\r\n }\r\n counter = (counter + 1) | 0;\r\n return `${prefix}-${counter.toString(36)}`;\r\n}\r\n","import { useId as useReactId, useMemo } from 'react';\r\nimport { generateId } from '../id';\r\n\r\n/**\r\n * SSR-safe id hook. Prefers React 18's built-in `useId`; falls back to a\r\n * memoized id when consumers pin an older React, or when they explicitly\r\n * provide an id via props (passed through).\r\n */\r\nexport function useId(providedId?: string, prefix = 'elvora'): string {\r\n const reactId = typeof useReactId === 'function' ? useReactId() : undefined;\r\n const fallback = useMemo(() => generateId(prefix), [prefix]);\r\n if (providedId) return providedId;\r\n return reactId ? `${prefix}-${reactId.replace(/:/g, '')}` : fallback;\r\n}\r\n","import { useCallback, useRef, useState } from 'react';\r\nimport { useEventCallback } from './useEventCallback';\r\n\r\nexport interface UseControllableStateOptions<T> {\r\n /** Controlled value. When defined the hook reports it directly. */\r\n value?: T;\r\n /** Default value for uncontrolled mode. */\r\n defaultValue?: T | (() => T);\r\n /** Called whenever the value changes (controlled or uncontrolled). */\r\n onChange?: (value: T) => void;\r\n}\r\n\r\n/**\r\n * Bridges controlled and uncontrolled component patterns. Returns\r\n * `[value, setValue]`: in controlled mode `value` mirrors the prop and\r\n * `setValue` only fires `onChange`; in uncontrolled mode `setValue` also\r\n * updates internal state.\r\n *\r\n * Mirrors the pattern used by Radix UI, Aria, and Reach UI.\r\n */\r\nexport function useControllableState<T>({\r\n value,\r\n defaultValue,\r\n onChange,\r\n}: UseControllableStateOptions<T>): [T | undefined, (next: T | ((prev: T | undefined) => T)) => void] {\r\n const isControlled = value !== undefined;\r\n const [uncontrolled, setUncontrolled] = useState<T | undefined>(defaultValue);\r\n const onChangeStable = useEventCallback(onChange);\r\n\r\n // Track latest internal value for functional updates in controlled mode.\r\n const currentRef = useRef(isControlled ? value : uncontrolled);\r\n currentRef.current = isControlled ? value : uncontrolled;\r\n\r\n const setValue = useCallback(\r\n (next: T | ((prev: T | undefined) => T)) => {\r\n const resolved =\r\n typeof next === 'function' ? (next as (prev: T | undefined) => T)(currentRef.current) : next;\r\n\r\n if (!isControlled) {\r\n setUncontrolled(resolved);\r\n }\r\n onChangeStable(resolved);\r\n },\r\n [isControlled, onChangeStable],\r\n );\r\n\r\n return [isControlled ? value : uncontrolled, setValue];\r\n}\r\n","import { useEffect, useState } from 'react';\r\n\r\n/**\r\n * Returns a DOM container suitable for `ReactDOM.createPortal`. Lazily creates\r\n * one on first render under `document.body` so consumers don't need to set\r\n * up portal roots themselves. SSR-safe (returns null until mount).\r\n */\r\nexport function usePortal(id = 'elvora-portal-root'): HTMLElement | null {\r\n const [container, setContainer] = useState<HTMLElement | null>(null);\r\n\r\n useEffect(() => {\r\n if (typeof document === 'undefined') return;\r\n\r\n let node = document.getElementById(id);\r\n let created = false;\r\n if (!node) {\r\n node = document.createElement('div');\r\n node.id = id;\r\n node.setAttribute('data-elvora-portal', '');\r\n document.body.appendChild(node);\r\n created = true;\r\n }\r\n setContainer(node);\r\n\r\n return () => {\r\n // Only remove the node if this hook created it AND it has no other\r\n // portal children mounted into it.\r\n if (created && node && node.parentElement && node.childNodes.length === 0) {\r\n node.parentElement.removeChild(node);\r\n }\r\n };\r\n }, [id]);\r\n\r\n return container;\r\n}\r\n","/**\r\n * Discover and walk focusable elements within a container. Used by focus traps,\r\n * roving-tabindex managers, and keyboard-navigable lists/menus.\r\n *\r\n * Selectors are based on the WAI-ARIA Authoring Practices and the live\r\n * `tabindex`/`disabled`/`inert` semantics of HTML.\r\n */\r\n\r\nconst FOCUSABLE_SELECTORS = [\r\n 'a[href]',\r\n 'area[href]',\r\n 'button:not([disabled])',\r\n 'input:not([disabled]):not([type=\"hidden\"])',\r\n 'select:not([disabled])',\r\n 'textarea:not([disabled])',\r\n 'iframe',\r\n 'object',\r\n 'embed',\r\n 'audio[controls]',\r\n 'video[controls]',\r\n '[contenteditable]:not([contenteditable=\"false\"])',\r\n '[tabindex]:not([tabindex^=\"-\"])',\r\n] as const;\r\n\r\nexport const FOCUSABLE_SELECTOR = FOCUSABLE_SELECTORS.join(', ');\r\n\r\nexport function isElementVisible(el: HTMLElement): boolean {\r\n if (el.hidden) return false;\r\n const style = el.ownerDocument.defaultView?.getComputedStyle(el);\r\n if (!style) return true;\r\n return style.visibility !== 'hidden' && style.display !== 'none';\r\n}\r\n\r\nexport function isFocusable(el: HTMLElement): boolean {\r\n if (!el.isConnected) return false;\r\n if ((el as HTMLInputElement).disabled) return false;\r\n if (el.getAttribute('aria-hidden') === 'true') return false;\r\n if (el.hasAttribute('inert')) return false;\r\n if (!isElementVisible(el)) return false;\r\n return el.matches(FOCUSABLE_SELECTOR);\r\n}\r\n\r\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\r\n const nodes = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\r\n return nodes.filter(isFocusable);\r\n}\r\n\r\nexport function getFirstFocusable(container: HTMLElement): HTMLElement | null {\r\n return getFocusableElements(container)[0] ?? null;\r\n}\r\n\r\nexport function getLastFocusable(container: HTMLElement): HTMLElement | null {\r\n const list = getFocusableElements(container);\r\n return list[list.length - 1] ?? null;\r\n}\r\n","/**\r\n * Headless focus trap. Pure DOM, no framework dependency.\r\n *\r\n * Adapters call `createFocusTrap(node)` on mount, `trap.activate()` when the\r\n * dialog/menu opens, and `trap.deactivate()` when it closes. The trap is\r\n * compliant with WAI-ARIA APG's modal-dialog pattern.\r\n */\r\nimport { getFirstFocusable, getLastFocusable, isFocusable } from './focusable';\r\n\r\nexport interface FocusTrapOptions {\r\n /** Element to restore focus to on deactivation. Defaults to the previously active element. */\r\n returnFocus?: HTMLElement | null;\r\n /** Initial element to focus. Defaults to first focusable child. */\r\n initialFocus?: HTMLElement | null;\r\n /** When true, pressing Escape calls `onEscape`. */\r\n onEscape?: (event: KeyboardEvent) => void;\r\n /** Outside clicks call this. Trap does not auto-close on outside click. */\r\n onOutsideClick?: (event: MouseEvent | TouchEvent) => void;\r\n}\r\n\r\nexport interface FocusTrap {\r\n activate(): void;\r\n deactivate(): void;\r\n isActive(): boolean;\r\n}\r\n\r\nexport function createFocusTrap(container: HTMLElement, options: FocusTrapOptions = {}): FocusTrap {\r\n let active = false;\r\n let previouslyFocused: HTMLElement | null = null;\r\n\r\n function handleKeyDown(event: KeyboardEvent): void {\r\n if (!active) return;\r\n\r\n if (event.key === 'Escape' && options.onEscape) {\r\n options.onEscape(event);\r\n return;\r\n }\r\n\r\n if (event.key !== 'Tab') return;\r\n\r\n const first = getFirstFocusable(container);\r\n const last = getLastFocusable(container);\r\n if (!first || !last) {\r\n event.preventDefault();\r\n container.focus();\r\n return;\r\n }\r\n\r\n const activeEl = container.ownerDocument.activeElement as HTMLElement | null;\r\n\r\n if (event.shiftKey) {\r\n if (activeEl === first || !container.contains(activeEl)) {\r\n event.preventDefault();\r\n last.focus();\r\n }\r\n } else {\r\n if (activeEl === last) {\r\n event.preventDefault();\r\n first.focus();\r\n }\r\n }\r\n }\r\n\r\n function handlePointerDown(event: MouseEvent | TouchEvent): void {\r\n if (!active) return;\r\n const target = event.target as Node | null;\r\n if (target && !container.contains(target)) {\r\n options.onOutsideClick?.(event);\r\n }\r\n }\r\n\r\n return {\r\n activate() {\r\n if (active) return;\r\n active = true;\r\n previouslyFocused = (container.ownerDocument.activeElement as HTMLElement) ?? null;\r\n\r\n const target =\r\n options.initialFocus ??\r\n getFirstFocusable(container) ??\r\n (isFocusable(container) ? container : null);\r\n\r\n if (target) {\r\n target.focus({ preventScroll: false });\r\n } else {\r\n container.setAttribute('tabindex', '-1');\r\n container.focus({ preventScroll: false });\r\n }\r\n\r\n container.ownerDocument.addEventListener('keydown', handleKeyDown, true);\r\n container.ownerDocument.addEventListener('mousedown', handlePointerDown, true);\r\n container.ownerDocument.addEventListener('touchstart', handlePointerDown, true);\r\n },\r\n deactivate() {\r\n if (!active) return;\r\n active = false;\r\n container.ownerDocument.removeEventListener('keydown', handleKeyDown, true);\r\n container.ownerDocument.removeEventListener('mousedown', handlePointerDown, true);\r\n container.ownerDocument.removeEventListener('touchstart', handlePointerDown, true);\r\n\r\n const returnTo = options.returnFocus ?? previouslyFocused;\r\n if (returnTo && returnTo.isConnected) {\r\n returnTo.focus({ preventScroll: false });\r\n }\r\n },\r\n isActive() {\r\n return active;\r\n },\r\n };\r\n}\r\n","import { useEffect, useRef, type RefObject } from 'react';\r\nimport { createFocusTrap, type FocusTrapOptions } from '../focus/focusTrap';\r\n\r\nexport interface UseFocusTrapOptions extends FocusTrapOptions {\r\n /** Whether the trap is active. Toggle this when the modal/menu opens/closes. */\r\n enabled: boolean;\r\n}\r\n\r\n/**\r\n * Activates a focus trap on the provided ref while `enabled` is true. Cleans\r\n * up on unmount and disables on `enabled === false`.\r\n */\r\nexport function useFocusTrap<T extends HTMLElement>(\r\n ref: RefObject<T | null>,\r\n options: UseFocusTrapOptions,\r\n): void {\r\n const trapRef = useRef<ReturnType<typeof createFocusTrap> | null>(null);\r\n\r\n useEffect(() => {\r\n const node = ref.current;\r\n if (!node || !options.enabled) {\r\n trapRef.current?.deactivate();\r\n trapRef.current = null;\r\n return;\r\n }\r\n\r\n const trap = createFocusTrap(node, options);\r\n trap.activate();\r\n trapRef.current = trap;\r\n\r\n return () => {\r\n trap.deactivate();\r\n trapRef.current = null;\r\n };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [ref, options.enabled]);\r\n}\r\n","import { useEffect, type RefObject } from 'react';\r\n\r\nexport interface UseDismissableOptions {\r\n enabled: boolean;\r\n onDismiss: (event: Event) => void;\r\n /** When true, Escape triggers dismiss. Default true. */\r\n closeOnEscape?: boolean;\r\n /** When true, outside pointerdown triggers dismiss. Default true. */\r\n closeOnOutsideClick?: boolean;\r\n}\r\n\r\n/**\r\n * Listens for Escape and/or outside-click and calls `onDismiss`. Designed for\r\n * popovers, dropdowns, drawers, and toasts.\r\n */\r\nexport function useDismissable<T extends HTMLElement>(\r\n ref: RefObject<T | null>,\r\n {\r\n enabled,\r\n onDismiss,\r\n closeOnEscape = true,\r\n closeOnOutsideClick = true,\r\n }: UseDismissableOptions,\r\n): void {\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n function handleKey(e: KeyboardEvent): void {\r\n if (closeOnEscape && e.key === 'Escape') onDismiss(e);\r\n }\r\n function handlePointer(e: MouseEvent | TouchEvent): void {\r\n if (!closeOnOutsideClick) return;\r\n const target = e.target as Node | null;\r\n if (target && ref.current && !ref.current.contains(target)) onDismiss(e);\r\n }\r\n\r\n document.addEventListener('keydown', handleKey, true);\r\n document.addEventListener('mousedown', handlePointer, true);\r\n document.addEventListener('touchstart', handlePointer, true);\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleKey, true);\r\n document.removeEventListener('mousedown', handlePointer, true);\r\n document.removeEventListener('touchstart', handlePointer, true);\r\n };\r\n }, [enabled, onDismiss, closeOnEscape, closeOnOutsideClick, ref]);\r\n}\r\n"]}
@@ -0,0 +1,73 @@
1
+ import { useLayoutEffect, RefObject } from 'react';
2
+ import { a as FocusTrapOptions } from '../focusTrap-Bko1L5FG.cjs';
3
+
4
+ /**
5
+ * `useLayoutEffect` warns when used during SSR; this swaps in `useEffect` on
6
+ * the server so components stay isomorphic.
7
+ */
8
+ declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
9
+
10
+ /**
11
+ * Returns a stable callback identity whose body reads the latest props/state.
12
+ * Lets a component pass the same handler down across renders without making
13
+ * dependents re-render, while still calling the latest closure.
14
+ */
15
+ declare function useEventCallback<Args extends unknown[], R>(fn: ((...args: Args) => R) | undefined): (...args: Args) => R | undefined;
16
+
17
+ /**
18
+ * SSR-safe id hook. Prefers React 18's built-in `useId`; falls back to a
19
+ * memoized id when consumers pin an older React, or when they explicitly
20
+ * provide an id via props (passed through).
21
+ */
22
+ declare function useId(providedId?: string, prefix?: string): string;
23
+
24
+ interface UseControllableStateOptions<T> {
25
+ /** Controlled value. When defined the hook reports it directly. */
26
+ value?: T;
27
+ /** Default value for uncontrolled mode. */
28
+ defaultValue?: T | (() => T);
29
+ /** Called whenever the value changes (controlled or uncontrolled). */
30
+ onChange?: (value: T) => void;
31
+ }
32
+ /**
33
+ * Bridges controlled and uncontrolled component patterns. Returns
34
+ * `[value, setValue]`: in controlled mode `value` mirrors the prop and
35
+ * `setValue` only fires `onChange`; in uncontrolled mode `setValue` also
36
+ * updates internal state.
37
+ *
38
+ * Mirrors the pattern used by Radix UI, Aria, and Reach UI.
39
+ */
40
+ declare function useControllableState<T>({ value, defaultValue, onChange, }: UseControllableStateOptions<T>): [T | undefined, (next: T | ((prev: T | undefined) => T)) => void];
41
+
42
+ /**
43
+ * Returns a DOM container suitable for `ReactDOM.createPortal`. Lazily creates
44
+ * one on first render under `document.body` so consumers don't need to set
45
+ * up portal roots themselves. SSR-safe (returns null until mount).
46
+ */
47
+ declare function usePortal(id?: string): HTMLElement | null;
48
+
49
+ interface UseFocusTrapOptions extends FocusTrapOptions {
50
+ /** Whether the trap is active. Toggle this when the modal/menu opens/closes. */
51
+ enabled: boolean;
52
+ }
53
+ /**
54
+ * Activates a focus trap on the provided ref while `enabled` is true. Cleans
55
+ * up on unmount and disables on `enabled === false`.
56
+ */
57
+ declare function useFocusTrap<T extends HTMLElement>(ref: RefObject<T | null>, options: UseFocusTrapOptions): void;
58
+
59
+ interface UseDismissableOptions {
60
+ enabled: boolean;
61
+ onDismiss: (event: Event) => void;
62
+ /** When true, Escape triggers dismiss. Default true. */
63
+ closeOnEscape?: boolean;
64
+ /** When true, outside pointerdown triggers dismiss. Default true. */
65
+ closeOnOutsideClick?: boolean;
66
+ }
67
+ /**
68
+ * Listens for Escape and/or outside-click and calls `onDismiss`. Designed for
69
+ * popovers, dropdowns, drawers, and toasts.
70
+ */
71
+ declare function useDismissable<T extends HTMLElement>(ref: RefObject<T | null>, { enabled, onDismiss, closeOnEscape, closeOnOutsideClick, }: UseDismissableOptions): void;
72
+
73
+ export { type UseControllableStateOptions, type UseDismissableOptions, type UseFocusTrapOptions, useControllableState, useDismissable, useEventCallback, useFocusTrap, useId, useIsomorphicLayoutEffect, usePortal };
@@ -0,0 +1,73 @@
1
+ import { useLayoutEffect, RefObject } from 'react';
2
+ import { a as FocusTrapOptions } from '../focusTrap-Bko1L5FG.js';
3
+
4
+ /**
5
+ * `useLayoutEffect` warns when used during SSR; this swaps in `useEffect` on
6
+ * the server so components stay isomorphic.
7
+ */
8
+ declare const useIsomorphicLayoutEffect: typeof useLayoutEffect;
9
+
10
+ /**
11
+ * Returns a stable callback identity whose body reads the latest props/state.
12
+ * Lets a component pass the same handler down across renders without making
13
+ * dependents re-render, while still calling the latest closure.
14
+ */
15
+ declare function useEventCallback<Args extends unknown[], R>(fn: ((...args: Args) => R) | undefined): (...args: Args) => R | undefined;
16
+
17
+ /**
18
+ * SSR-safe id hook. Prefers React 18's built-in `useId`; falls back to a
19
+ * memoized id when consumers pin an older React, or when they explicitly
20
+ * provide an id via props (passed through).
21
+ */
22
+ declare function useId(providedId?: string, prefix?: string): string;
23
+
24
+ interface UseControllableStateOptions<T> {
25
+ /** Controlled value. When defined the hook reports it directly. */
26
+ value?: T;
27
+ /** Default value for uncontrolled mode. */
28
+ defaultValue?: T | (() => T);
29
+ /** Called whenever the value changes (controlled or uncontrolled). */
30
+ onChange?: (value: T) => void;
31
+ }
32
+ /**
33
+ * Bridges controlled and uncontrolled component patterns. Returns
34
+ * `[value, setValue]`: in controlled mode `value` mirrors the prop and
35
+ * `setValue` only fires `onChange`; in uncontrolled mode `setValue` also
36
+ * updates internal state.
37
+ *
38
+ * Mirrors the pattern used by Radix UI, Aria, and Reach UI.
39
+ */
40
+ declare function useControllableState<T>({ value, defaultValue, onChange, }: UseControllableStateOptions<T>): [T | undefined, (next: T | ((prev: T | undefined) => T)) => void];
41
+
42
+ /**
43
+ * Returns a DOM container suitable for `ReactDOM.createPortal`. Lazily creates
44
+ * one on first render under `document.body` so consumers don't need to set
45
+ * up portal roots themselves. SSR-safe (returns null until mount).
46
+ */
47
+ declare function usePortal(id?: string): HTMLElement | null;
48
+
49
+ interface UseFocusTrapOptions extends FocusTrapOptions {
50
+ /** Whether the trap is active. Toggle this when the modal/menu opens/closes. */
51
+ enabled: boolean;
52
+ }
53
+ /**
54
+ * Activates a focus trap on the provided ref while `enabled` is true. Cleans
55
+ * up on unmount and disables on `enabled === false`.
56
+ */
57
+ declare function useFocusTrap<T extends HTMLElement>(ref: RefObject<T | null>, options: UseFocusTrapOptions): void;
58
+
59
+ interface UseDismissableOptions {
60
+ enabled: boolean;
61
+ onDismiss: (event: Event) => void;
62
+ /** When true, Escape triggers dismiss. Default true. */
63
+ closeOnEscape?: boolean;
64
+ /** When true, outside pointerdown triggers dismiss. Default true. */
65
+ closeOnOutsideClick?: boolean;
66
+ }
67
+ /**
68
+ * Listens for Escape and/or outside-click and calls `onDismiss`. Designed for
69
+ * popovers, dropdowns, drawers, and toasts.
70
+ */
71
+ declare function useDismissable<T extends HTMLElement>(ref: RefObject<T | null>, { enabled, onDismiss, closeOnEscape, closeOnOutsideClick, }: UseDismissableOptions): void;
72
+
73
+ export { type UseControllableStateOptions, type UseDismissableOptions, type UseFocusTrapOptions, useControllableState, useDismissable, useEventCallback, useFocusTrap, useId, useIsomorphicLayoutEffect, usePortal };