@plexui/vue 0.5.0 → 0.5.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.
@@ -64,7 +64,8 @@ export const TagInput = defineComponent({
64
64
  const containerRef = ref(null);
65
65
  const measureRef = ref(null);
66
66
  const showInput = computed(() => !props.maxTags || tags.value.size < props.maxTags);
67
- const placeholderText = computed(() => (tags.value.size === 0 ? props.placeholder : undefined));
67
+ // A ghost has no frame: the hint stays after the first tag to show where to type.
68
+ const placeholderText = computed(() => tags.value.size === 0 || props.variant === "ghost" ? props.placeholder : undefined);
68
69
  // Handle focusing the correct part of the tag input
69
70
  watch([focused, selectedTag, showInput], () => {
70
71
  if (!focused.value || !containerRef.value) {
@@ -1 +1 @@
1
- {"version":3,"file":"TagInput.js","sourceRoot":"","sources":["../../../../src/components/TagInput/TagInput.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computed,\n defineComponent,\n h,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n watch,\n type PropType,\n} from \"vue\"\nimport type { Sizes, Variants } from \"@plexui/styles/types\"\nimport { toCssVariables } from \"../../lib/helpers.js\"\nimport { X } from \"../Icon/index.js\"\nimport s from \"@plexui/styles/components/TagInput/TagInput.module.css\"\n\nexport type Tag = {\n value: string\n valid: boolean\n}\n\n// How many pixels to reserve on the right of the input as a buffer before wrapping to the next line\nconst INPUT_CURSOR_TOLERANCE_PX = 10\n// The total space reserved on either side of the input for padding\nconst CONTAINER_PADDING_PX = 24\nconst SHAKE_ANIMATION_DURATION_MS = 500\n\n/**\n * Port of packages/ui/src/components/TagInput/TagInput.tsx. Controlled with\n * `value` (`v-model:value`), uncontrolled with `defaultValue`; every change\n * emits `update:value` and `change` with the new tag list.\n */\nexport const TagInput = defineComponent({\n name: \"TagInput\",\n // React's TagInput takes no extra attributes (Field's aria-describedby and\n // aria-invalid are ignored); the render has several roots, so drop them\n inheritAttrs: false,\n props: {\n /** The state of the tag input when it is initially rendered, used when uncontrolled */\n defaultValue: { type: Array as PropType<Tag[]>, default: () => [] },\n /** The value of the tag input, used to control the tag input */\n value: Array as PropType<Tag[]>,\n /** Allows the tag input to be targeted with `for` */\n id: String,\n /** Corresponds with Input height when rows=1. @default \"xl\" */\n size: { type: String as PropType<Sizes<\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\">>, default: \"xl\" },\n /** Visual style. `ghost` has no frame, for a field that its container already frames. @default \"outline\" */\n variant: { type: String as PropType<Variants<\"outline\" | \"ghost\">>, default: \"outline\" },\n /** Placeholder text for the input */\n placeholder: { type: String, default: \"\" },\n /** Returns whether a value is a valid tag; invalid tags are highlighted. Evaluated on creation only. */\n validator: Function as PropType<(value: string) => boolean>,\n /** The maximum number of tags allowed before the input is disabled; displays a counter below the input */\n maxTags: Number,\n /** Whether to focus this input on mount */\n autoFocus: { type: Boolean, default: false },\n /** The minimum number of rows for the tag input. @default 1 */\n rows: { type: Number, default: 1 },\n /** Controls what characters will count towards creating a new tag. @default [\",\", \" \"] */\n delimiters: { type: Array as PropType<string[]>, default: () => [\",\", \" \"] },\n /** Disables the tag input visually and from interactions */\n disabled: { type: Boolean, default: undefined },\n /** Fully-rounded container and chips, matching `Input pill` */\n pill: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_tags: Tag[]) => true,\n \"change\": (_tags: Tag[]) => true,\n },\n setup(props, { emit }) {\n // Shallow, like React state: emitted lists hold the caller's tag objects, not proxies\n const internalTags = shallowRef<Tag[]>(props.defaultValue)\n const value = computed(() => props.value ?? internalTags.value)\n const isControlled = computed(() => props.value !== undefined)\n const tags = computed(() => new Map(value.value.map((tag) => [tag.value, tag])))\n\n const currentInput = ref(\"\")\n const focused = ref(props.autoFocus)\n const selectedTag = ref<string | null>(null)\n const duplicateTags = ref(new Set<string>())\n const inputWidth = ref(0)\n\n const inputRef = ref<HTMLInputElement | null>(null)\n const containerRef = ref<HTMLDivElement | null>(null)\n const measureRef = ref<HTMLSpanElement | null>(null)\n\n const showInput = computed(() => !props.maxTags || tags.value.size < props.maxTags)\n const placeholderText = computed(() => (tags.value.size === 0 ? props.placeholder : undefined))\n\n // Handle focusing the correct part of the tag input\n watch(\n [focused, selectedTag, showInput],\n () => {\n if (!focused.value || !containerRef.value) {\n return\n }\n const defaultFocusEl = inputRef.value ?? containerRef.value\n if (selectedTag.value === null) {\n defaultFocusEl.focus()\n } else {\n const selectedTagElement = containerRef.value.querySelector(\n `[data-tag=\"${CSS.escape(selectedTag.value)}\"]`,\n ) as HTMLElement | null\n if (selectedTagElement) {\n selectedTagElement.focus()\n } else {\n defaultFocusEl.focus()\n }\n }\n },\n { flush: \"post\" },\n )\n\n // Position the real input inside the container (see the React source for the reasoning)\n let observer: ResizeObserver | undefined\n const measure = () => {\n observer?.disconnect()\n const container = containerRef.value\n const measureEl = measureRef.value\n if (!container || !measureEl) {\n return\n }\n\n const recompute = () => {\n const containerRect = container.getBoundingClientRect()\n const tagElements = Array.from(container.querySelectorAll(\"[data-tag]\")) as HTMLDivElement[]\n\n // Grab the right edge of the last tag if it exists, otherwise the left edge of the container\n const leftBound =\n tagElements.length > 0\n ? tagElements[tagElements.length - 1]!.getBoundingClientRect().right\n : containerRect.left\n\n measureEl.textContent = currentInput.value || placeholderText.value || \"\"\n\n // By padding the text width, we ensure the input wraps to the next line\n // before we get to the point where we start to overflow\n const textWidth = measureEl.getBoundingClientRect().width + INPUT_CURSOR_TOLERANCE_PX\n const remainingSpace = containerRect.right - leftBound - CONTAINER_PADDING_PX\n\n if (textWidth <= remainingSpace) {\n inputWidth.value = remainingSpace\n } else {\n // We are going to flow to a new line, so recalculate remaining space based on the container size\n inputWidth.value = containerRect.right - containerRect.left - CONTAINER_PADDING_PX\n }\n }\n\n recompute()\n observer = new ResizeObserver(recompute)\n observer.observe(container)\n container.querySelectorAll(\"[data-tag]\").forEach((chip) => observer!.observe(chip))\n }\n onMounted(measure)\n watch([currentInput, placeholderText, tags], measure, { flush: \"post\" })\n\n const setTags = (newTags: Tag[]) => {\n emit(\"update:value\", newTags)\n emit(\"change\", newTags)\n if (!isControlled.value) {\n internalTags.value = newTags\n }\n }\n\n // Adds every value in one update: a paste of \"a,b\" must not compute\n // each addition from the same stale `tags` snapshot.\n const addTags = (tagValues: string[]) => {\n const next = new Map(tags.value)\n let changed = false\n for (const tagValue of tagValues) {\n if (props.maxTags && next.size >= props.maxTags) {\n break\n }\n const trimmed = tagValue.trim()\n if (!trimmed) {\n continue\n }\n if (next.has(trimmed)) {\n duplicateTags.value = new Set(duplicateTags.value).add(trimmed)\n setTimeout(() => {\n const remaining = new Set(duplicateTags.value)\n remaining.delete(trimmed)\n duplicateTags.value = remaining\n }, SHAKE_ANIMATION_DURATION_MS)\n continue\n }\n const validTag = props.validator?.(trimmed) ?? true\n next.set(trimmed, { value: trimmed, valid: validTag })\n changed = true\n }\n if (!changed) {\n return\n }\n setTags(Array.from(next.values()))\n }\n\n const addTag = (tagValue: string) => addTags([tagValue])\n\n const removeTag = (tag: string) => {\n if (props.disabled) {\n return\n }\n const next = new Map(tags.value)\n next.delete(tag)\n setTags(Array.from(next.values()))\n if (selectedTag.value === tag) {\n selectedTag.value = null\n }\n }\n\n const selectPreviousTag = () => {\n if (tags.value.size === 0) {\n return\n }\n const tagList = Array.from(tags.value.keys())\n if (selectedTag.value === null) {\n selectedTag.value = tagList[tagList.length - 1]!\n } else {\n const prevIndex = tagList.indexOf(selectedTag.value)\n selectedTag.value = tagList[Math.max(0, prevIndex - 1)]!\n }\n }\n\n const selectNextTag = () => {\n if (selectedTag.value === null) {\n return\n }\n const tagList = Array.from(tags.value.keys())\n const index = tagList.indexOf(selectedTag.value) + 1\n selectedTag.value = index < tagList.length ? tagList[index]! : null\n }\n\n const isEmptyStartingSelection = () => {\n const input = inputRef.value\n if (!input) {\n return true\n }\n return input.selectionStart === 0 && input.selectionEnd === 0\n }\n\n const handleContainerBlur = () => {\n focused.value = false\n selectedTag.value = null\n // A disabled tag input keeps the pending text instead of committing it\n if (currentInput.value && !props.disabled) {\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n }\n\n const handleContainerKeyDown = (e: KeyboardEvent) => {\n // A tag can keep focus while the input turns disabled: no selecting or removing then\n if (props.disabled) {\n return\n }\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n if (isEmptyStartingSelection()) {\n e.preventDefault()\n selectPreviousTag()\n }\n } else if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n if (selectedTag.value !== null) {\n e.preventDefault()\n selectNextTag()\n }\n } else if (e.key === \"Backspace\") {\n if (selectedTag.value !== null) {\n removeTag(selectedTag.value)\n } else if (isEmptyStartingSelection()) {\n selectPreviousTag()\n }\n }\n }\n\n const handleInputKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || props.delimiters.includes(e.key)) {\n e.preventDefault()\n if (currentInput.value) {\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n } else if (e.key === \"Tab\") {\n if (currentInput.value) {\n e.preventDefault()\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n }\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n const text = e.clipboardData?.getData(\"Text\") ?? \"\"\n let parts = [text]\n\n // Split by all delimiters\n for (const delimiter of props.delimiters) {\n const newParts: string[] = []\n for (const segment of parts) {\n newParts.push(...segment.split(delimiter))\n }\n parts = newParts\n }\n\n // Remove empty parts\n parts = parts.filter(Boolean)\n\n if (parts.length > 1) {\n e.preventDefault()\n addTags(parts)\n }\n }\n\n const handleContainerMouseDown = (e: MouseEvent) => {\n // All clicks in the container focus the container\n focused.value = true\n\n // If the click is on a tag pill, the tag's click handler focuses it\n if (e.target && e.target instanceof Element && e.target.closest(\"[data-tag]\")) {\n return\n }\n\n // Since we know we didn't click a tag, clear any selected tag\n selectedTag.value = null\n\n // If this click is outside of the input, prevent it from \"stealing\" focus from the input\n const input = inputRef.value\n if (e.target && e.target instanceof Element && input && !input.contains(e.target)) {\n e.preventDefault()\n\n const { left, right, top, bottom } = input.getBoundingClientRect()\n const { clientX, clientY } = e\n\n // If this is the first click, clear the selection. Otherwise, select the input contents\n if (e.detail === 1) {\n if (clientY < top || clientX < left) {\n // \"Before\" the input: top/left\n input.setSelectionRange(0, 0)\n } else if (clientY > bottom || clientX > right) {\n // \"After\" the input: bottom/right\n const length = input.value.length\n input.setSelectionRange(length, length)\n }\n } else {\n input.select()\n }\n }\n }\n\n const handleFocus = (e: FocusEvent) => {\n // If the focus is on a tag pill, the click handler for the tag handles it\n if (e.target && e.target instanceof Element && e.target.closest(\"[data-tag]\")) {\n return\n }\n focused.value = true\n }\n\n const handleBlur = (e: FocusEvent) => {\n // If there is no related target, don't remove focus (clicks inside the container)\n if (!e.relatedTarget || !(e.relatedTarget instanceof Node)) {\n return\n }\n // Don't clear focus if focus is only moved elsewhere within the container\n if (containerRef.value && containerRef.value.contains(e.relatedTarget)) {\n // If we just tabbed into the input, clear the selected tag\n if (inputRef.value && inputRef.value.contains(e.relatedTarget)) {\n selectedTag.value = null\n }\n return\n }\n handleContainerBlur()\n }\n\n // usehooks-ts' useOnClickOutside: mousedown outside the container\n const handleDocumentMouseDown = (e: MouseEvent) => {\n const container = containerRef.value\n if (!container || !(e.target instanceof Node) || container.contains(e.target)) return\n handleContainerBlur()\n }\n onMounted(() => document.addEventListener(\"mousedown\", handleDocumentMouseDown))\n onBeforeUnmount(() => {\n document.removeEventListener(\"mousedown\", handleDocumentMouseDown)\n observer?.disconnect()\n })\n\n // Focus on mount when requested, like React's initial `focused` state\n onMounted(() => {\n if (focused.value) void nextTick(() => (inputRef.value ?? containerRef.value)?.focus())\n })\n\n return () => [\n h(\n \"div\",\n {\n \"class\": s.Container,\n \"ref\": containerRef,\n \"onKeydown\": handleContainerKeyDown,\n \"onMousedown\": handleContainerMouseDown,\n \"onFocusin\": handleFocus,\n \"onFocusout\": handleBlur,\n \"data-size\": props.size,\n \"data-variant\": props.variant,\n \"data-focused\": focused.value ? \"\" : undefined,\n \"data-empty\": tags.value.size === 0 ? \"\" : undefined,\n \"data-pill\": props.pill ? \"\" : undefined,\n // At maxTags the input is gone, so the container becomes the tab stop;\n // arrow keys and Backspace then select and remove tags from here\n \"tabindex\": showInput.value || props.disabled ? -1 : 0,\n \"style\": toCssVariables({ \"min-rows\": String(props.rows) }),\n \"data-disabled\": props.disabled ? \"\" : undefined,\n },\n [\n h(\"div\", { class: s.TagInput }, [\n ...Array.from(tags.value.values()).map((tag) =>\n h(\n \"div\",\n {\n \"key\": tag.value,\n \"class\": s.Tag,\n \"tabindex\": -1,\n \"onClick\": () => (selectedTag.value = tag.value),\n \"data-tag\": tag.value,\n \"data-invalid\": !tag.valid ? \"\" : undefined,\n \"data-duplicate\": duplicateTags.value.has(tag.value) ? \"\" : undefined,\n },\n [\n h(\"span\", { class: \"overflow-hidden text-ellipsis\", title: tag.value }, [\n h(\"span\", { class: s.TagValue }, tag.value),\n ]),\n h(\n \"div\",\n { \"class\": s.TagRemove, \"onClick\": () => removeTag(tag.value), \"role\": \"button\", \"aria-label\": \"Remove item\" },\n [h(X)],\n ),\n ],\n ),\n ),\n showInput.value\n ? h(\"div\", { class: s.InputContainer }, [\n // Hidden element to measure input width\n h(\"span\", { ref: measureRef, class: s.InputMeasure }),\n h(\"div\", { class: s.InputWrapper }, [\n h(\"input\", {\n id: props.id,\n class: s.Input,\n ref: inputRef,\n value: currentInput.value,\n onInput: (e: Event) => (currentInput.value = (e.target as HTMLInputElement).value),\n onPaste: handlePaste,\n onKeydown: handleInputKeyDown,\n placeholder: placeholderText.value,\n style: { width: `${inputWidth.value}px` },\n disabled: props.disabled,\n }),\n ]),\n ])\n : null,\n ]),\n ],\n ),\n // 0 means no limit, as for the input above: no counter\n props.maxTags\n ? h(\"div\", { class: s.Limit }, [String(tags.value.size), h(\"span\", { class: \"mx-px\" }, \"/\"), String(props.maxTags)])\n : null,\n ]\n },\n})\n\nexport type TagInputProps = InstanceType<typeof TagInput>[\"$props\"]\n"]}
1
+ {"version":3,"file":"TagInput.js","sourceRoot":"","sources":["../../../../src/components/TagInput/TagInput.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n computed,\n defineComponent,\n h,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n watch,\n type PropType,\n} from \"vue\"\nimport type { Sizes, Variants } from \"@plexui/styles/types\"\nimport { toCssVariables } from \"../../lib/helpers.js\"\nimport { X } from \"../Icon/index.js\"\nimport s from \"@plexui/styles/components/TagInput/TagInput.module.css\"\n\nexport type Tag = {\n value: string\n valid: boolean\n}\n\n// How many pixels to reserve on the right of the input as a buffer before wrapping to the next line\nconst INPUT_CURSOR_TOLERANCE_PX = 10\n// The total space reserved on either side of the input for padding\nconst CONTAINER_PADDING_PX = 24\nconst SHAKE_ANIMATION_DURATION_MS = 500\n\n/**\n * Port of packages/ui/src/components/TagInput/TagInput.tsx. Controlled with\n * `value` (`v-model:value`), uncontrolled with `defaultValue`; every change\n * emits `update:value` and `change` with the new tag list.\n */\nexport const TagInput = defineComponent({\n name: \"TagInput\",\n // React's TagInput takes no extra attributes (Field's aria-describedby and\n // aria-invalid are ignored); the render has several roots, so drop them\n inheritAttrs: false,\n props: {\n /** The state of the tag input when it is initially rendered, used when uncontrolled */\n defaultValue: { type: Array as PropType<Tag[]>, default: () => [] },\n /** The value of the tag input, used to control the tag input */\n value: Array as PropType<Tag[]>,\n /** Allows the tag input to be targeted with `for` */\n id: String,\n /** Corresponds with Input height when rows=1. @default \"xl\" */\n size: { type: String as PropType<Sizes<\"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\">>, default: \"xl\" },\n /** Visual style. `ghost` has no frame, for a field that its container already frames. @default \"outline\" */\n variant: { type: String as PropType<Variants<\"outline\" | \"ghost\">>, default: \"outline\" },\n /** Placeholder text for the input */\n placeholder: { type: String, default: \"\" },\n /** Returns whether a value is a valid tag; invalid tags are highlighted. Evaluated on creation only. */\n validator: Function as PropType<(value: string) => boolean>,\n /** The maximum number of tags allowed before the input is disabled; displays a counter below the input */\n maxTags: Number,\n /** Whether to focus this input on mount */\n autoFocus: { type: Boolean, default: false },\n /** The minimum number of rows for the tag input. @default 1 */\n rows: { type: Number, default: 1 },\n /** Controls what characters will count towards creating a new tag. @default [\",\", \" \"] */\n delimiters: { type: Array as PropType<string[]>, default: () => [\",\", \" \"] },\n /** Disables the tag input visually and from interactions */\n disabled: { type: Boolean, default: undefined },\n /** Fully-rounded container and chips, matching `Input pill` */\n pill: { type: Boolean, default: false },\n },\n emits: {\n \"update:value\": (_tags: Tag[]) => true,\n \"change\": (_tags: Tag[]) => true,\n },\n setup(props, { emit }) {\n // Shallow, like React state: emitted lists hold the caller's tag objects, not proxies\n const internalTags = shallowRef<Tag[]>(props.defaultValue)\n const value = computed(() => props.value ?? internalTags.value)\n const isControlled = computed(() => props.value !== undefined)\n const tags = computed(() => new Map(value.value.map((tag) => [tag.value, tag])))\n\n const currentInput = ref(\"\")\n const focused = ref(props.autoFocus)\n const selectedTag = ref<string | null>(null)\n const duplicateTags = ref(new Set<string>())\n const inputWidth = ref(0)\n\n const inputRef = ref<HTMLInputElement | null>(null)\n const containerRef = ref<HTMLDivElement | null>(null)\n const measureRef = ref<HTMLSpanElement | null>(null)\n\n const showInput = computed(() => !props.maxTags || tags.value.size < props.maxTags)\n // A ghost has no frame: the hint stays after the first tag to show where to type.\n const placeholderText = computed(() =>\n tags.value.size === 0 || props.variant === \"ghost\" ? props.placeholder : undefined,\n )\n\n // Handle focusing the correct part of the tag input\n watch(\n [focused, selectedTag, showInput],\n () => {\n if (!focused.value || !containerRef.value) {\n return\n }\n const defaultFocusEl = inputRef.value ?? containerRef.value\n if (selectedTag.value === null) {\n defaultFocusEl.focus()\n } else {\n const selectedTagElement = containerRef.value.querySelector(\n `[data-tag=\"${CSS.escape(selectedTag.value)}\"]`,\n ) as HTMLElement | null\n if (selectedTagElement) {\n selectedTagElement.focus()\n } else {\n defaultFocusEl.focus()\n }\n }\n },\n { flush: \"post\" },\n )\n\n // Position the real input inside the container (see the React source for the reasoning)\n let observer: ResizeObserver | undefined\n const measure = () => {\n observer?.disconnect()\n const container = containerRef.value\n const measureEl = measureRef.value\n if (!container || !measureEl) {\n return\n }\n\n const recompute = () => {\n const containerRect = container.getBoundingClientRect()\n const tagElements = Array.from(container.querySelectorAll(\"[data-tag]\")) as HTMLDivElement[]\n\n // Grab the right edge of the last tag if it exists, otherwise the left edge of the container\n const leftBound =\n tagElements.length > 0\n ? tagElements[tagElements.length - 1]!.getBoundingClientRect().right\n : containerRect.left\n\n measureEl.textContent = currentInput.value || placeholderText.value || \"\"\n\n // By padding the text width, we ensure the input wraps to the next line\n // before we get to the point where we start to overflow\n const textWidth = measureEl.getBoundingClientRect().width + INPUT_CURSOR_TOLERANCE_PX\n const remainingSpace = containerRect.right - leftBound - CONTAINER_PADDING_PX\n\n if (textWidth <= remainingSpace) {\n inputWidth.value = remainingSpace\n } else {\n // We are going to flow to a new line, so recalculate remaining space based on the container size\n inputWidth.value = containerRect.right - containerRect.left - CONTAINER_PADDING_PX\n }\n }\n\n recompute()\n observer = new ResizeObserver(recompute)\n observer.observe(container)\n container.querySelectorAll(\"[data-tag]\").forEach((chip) => observer!.observe(chip))\n }\n onMounted(measure)\n watch([currentInput, placeholderText, tags], measure, { flush: \"post\" })\n\n const setTags = (newTags: Tag[]) => {\n emit(\"update:value\", newTags)\n emit(\"change\", newTags)\n if (!isControlled.value) {\n internalTags.value = newTags\n }\n }\n\n // Adds every value in one update: a paste of \"a,b\" must not compute\n // each addition from the same stale `tags` snapshot.\n const addTags = (tagValues: string[]) => {\n const next = new Map(tags.value)\n let changed = false\n for (const tagValue of tagValues) {\n if (props.maxTags && next.size >= props.maxTags) {\n break\n }\n const trimmed = tagValue.trim()\n if (!trimmed) {\n continue\n }\n if (next.has(trimmed)) {\n duplicateTags.value = new Set(duplicateTags.value).add(trimmed)\n setTimeout(() => {\n const remaining = new Set(duplicateTags.value)\n remaining.delete(trimmed)\n duplicateTags.value = remaining\n }, SHAKE_ANIMATION_DURATION_MS)\n continue\n }\n const validTag = props.validator?.(trimmed) ?? true\n next.set(trimmed, { value: trimmed, valid: validTag })\n changed = true\n }\n if (!changed) {\n return\n }\n setTags(Array.from(next.values()))\n }\n\n const addTag = (tagValue: string) => addTags([tagValue])\n\n const removeTag = (tag: string) => {\n if (props.disabled) {\n return\n }\n const next = new Map(tags.value)\n next.delete(tag)\n setTags(Array.from(next.values()))\n if (selectedTag.value === tag) {\n selectedTag.value = null\n }\n }\n\n const selectPreviousTag = () => {\n if (tags.value.size === 0) {\n return\n }\n const tagList = Array.from(tags.value.keys())\n if (selectedTag.value === null) {\n selectedTag.value = tagList[tagList.length - 1]!\n } else {\n const prevIndex = tagList.indexOf(selectedTag.value)\n selectedTag.value = tagList[Math.max(0, prevIndex - 1)]!\n }\n }\n\n const selectNextTag = () => {\n if (selectedTag.value === null) {\n return\n }\n const tagList = Array.from(tags.value.keys())\n const index = tagList.indexOf(selectedTag.value) + 1\n selectedTag.value = index < tagList.length ? tagList[index]! : null\n }\n\n const isEmptyStartingSelection = () => {\n const input = inputRef.value\n if (!input) {\n return true\n }\n return input.selectionStart === 0 && input.selectionEnd === 0\n }\n\n const handleContainerBlur = () => {\n focused.value = false\n selectedTag.value = null\n // A disabled tag input keeps the pending text instead of committing it\n if (currentInput.value && !props.disabled) {\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n }\n\n const handleContainerKeyDown = (e: KeyboardEvent) => {\n // A tag can keep focus while the input turns disabled: no selecting or removing then\n if (props.disabled) {\n return\n }\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowUp\") {\n if (isEmptyStartingSelection()) {\n e.preventDefault()\n selectPreviousTag()\n }\n } else if (e.key === \"ArrowRight\" || e.key === \"ArrowDown\") {\n if (selectedTag.value !== null) {\n e.preventDefault()\n selectNextTag()\n }\n } else if (e.key === \"Backspace\") {\n if (selectedTag.value !== null) {\n removeTag(selectedTag.value)\n } else if (isEmptyStartingSelection()) {\n selectPreviousTag()\n }\n }\n }\n\n const handleInputKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" || props.delimiters.includes(e.key)) {\n e.preventDefault()\n if (currentInput.value) {\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n } else if (e.key === \"Tab\") {\n if (currentInput.value) {\n e.preventDefault()\n addTag(currentInput.value)\n currentInput.value = \"\"\n }\n }\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n const text = e.clipboardData?.getData(\"Text\") ?? \"\"\n let parts = [text]\n\n // Split by all delimiters\n for (const delimiter of props.delimiters) {\n const newParts: string[] = []\n for (const segment of parts) {\n newParts.push(...segment.split(delimiter))\n }\n parts = newParts\n }\n\n // Remove empty parts\n parts = parts.filter(Boolean)\n\n if (parts.length > 1) {\n e.preventDefault()\n addTags(parts)\n }\n }\n\n const handleContainerMouseDown = (e: MouseEvent) => {\n // All clicks in the container focus the container\n focused.value = true\n\n // If the click is on a tag pill, the tag's click handler focuses it\n if (e.target && e.target instanceof Element && e.target.closest(\"[data-tag]\")) {\n return\n }\n\n // Since we know we didn't click a tag, clear any selected tag\n selectedTag.value = null\n\n // If this click is outside of the input, prevent it from \"stealing\" focus from the input\n const input = inputRef.value\n if (e.target && e.target instanceof Element && input && !input.contains(e.target)) {\n e.preventDefault()\n\n const { left, right, top, bottom } = input.getBoundingClientRect()\n const { clientX, clientY } = e\n\n // If this is the first click, clear the selection. Otherwise, select the input contents\n if (e.detail === 1) {\n if (clientY < top || clientX < left) {\n // \"Before\" the input: top/left\n input.setSelectionRange(0, 0)\n } else if (clientY > bottom || clientX > right) {\n // \"After\" the input: bottom/right\n const length = input.value.length\n input.setSelectionRange(length, length)\n }\n } else {\n input.select()\n }\n }\n }\n\n const handleFocus = (e: FocusEvent) => {\n // If the focus is on a tag pill, the click handler for the tag handles it\n if (e.target && e.target instanceof Element && e.target.closest(\"[data-tag]\")) {\n return\n }\n focused.value = true\n }\n\n const handleBlur = (e: FocusEvent) => {\n // If there is no related target, don't remove focus (clicks inside the container)\n if (!e.relatedTarget || !(e.relatedTarget instanceof Node)) {\n return\n }\n // Don't clear focus if focus is only moved elsewhere within the container\n if (containerRef.value && containerRef.value.contains(e.relatedTarget)) {\n // If we just tabbed into the input, clear the selected tag\n if (inputRef.value && inputRef.value.contains(e.relatedTarget)) {\n selectedTag.value = null\n }\n return\n }\n handleContainerBlur()\n }\n\n // usehooks-ts' useOnClickOutside: mousedown outside the container\n const handleDocumentMouseDown = (e: MouseEvent) => {\n const container = containerRef.value\n if (!container || !(e.target instanceof Node) || container.contains(e.target)) return\n handleContainerBlur()\n }\n onMounted(() => document.addEventListener(\"mousedown\", handleDocumentMouseDown))\n onBeforeUnmount(() => {\n document.removeEventListener(\"mousedown\", handleDocumentMouseDown)\n observer?.disconnect()\n })\n\n // Focus on mount when requested, like React's initial `focused` state\n onMounted(() => {\n if (focused.value) void nextTick(() => (inputRef.value ?? containerRef.value)?.focus())\n })\n\n return () => [\n h(\n \"div\",\n {\n \"class\": s.Container,\n \"ref\": containerRef,\n \"onKeydown\": handleContainerKeyDown,\n \"onMousedown\": handleContainerMouseDown,\n \"onFocusin\": handleFocus,\n \"onFocusout\": handleBlur,\n \"data-size\": props.size,\n \"data-variant\": props.variant,\n \"data-focused\": focused.value ? \"\" : undefined,\n \"data-empty\": tags.value.size === 0 ? \"\" : undefined,\n \"data-pill\": props.pill ? \"\" : undefined,\n // At maxTags the input is gone, so the container becomes the tab stop;\n // arrow keys and Backspace then select and remove tags from here\n \"tabindex\": showInput.value || props.disabled ? -1 : 0,\n \"style\": toCssVariables({ \"min-rows\": String(props.rows) }),\n \"data-disabled\": props.disabled ? \"\" : undefined,\n },\n [\n h(\"div\", { class: s.TagInput }, [\n ...Array.from(tags.value.values()).map((tag) =>\n h(\n \"div\",\n {\n \"key\": tag.value,\n \"class\": s.Tag,\n \"tabindex\": -1,\n \"onClick\": () => (selectedTag.value = tag.value),\n \"data-tag\": tag.value,\n \"data-invalid\": !tag.valid ? \"\" : undefined,\n \"data-duplicate\": duplicateTags.value.has(tag.value) ? \"\" : undefined,\n },\n [\n h(\"span\", { class: \"overflow-hidden text-ellipsis\", title: tag.value }, [\n h(\"span\", { class: s.TagValue }, tag.value),\n ]),\n h(\n \"div\",\n { \"class\": s.TagRemove, \"onClick\": () => removeTag(tag.value), \"role\": \"button\", \"aria-label\": \"Remove item\" },\n [h(X)],\n ),\n ],\n ),\n ),\n showInput.value\n ? h(\"div\", { class: s.InputContainer }, [\n // Hidden element to measure input width\n h(\"span\", { ref: measureRef, class: s.InputMeasure }),\n h(\"div\", { class: s.InputWrapper }, [\n h(\"input\", {\n id: props.id,\n class: s.Input,\n ref: inputRef,\n value: currentInput.value,\n onInput: (e: Event) => (currentInput.value = (e.target as HTMLInputElement).value),\n onPaste: handlePaste,\n onKeydown: handleInputKeyDown,\n placeholder: placeholderText.value,\n style: { width: `${inputWidth.value}px` },\n disabled: props.disabled,\n }),\n ]),\n ])\n : null,\n ]),\n ],\n ),\n // 0 means no limit, as for the input above: no counter\n props.maxTags\n ? h(\"div\", { class: s.Limit }, [String(tags.value.size), h(\"span\", { class: \"mx-px\" }, \"/\"), String(props.maxTags)])\n : null,\n ]\n },\n})\n\nexport type TagInputProps = InstanceType<typeof TagInput>[\"$props\"]\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plexui/vue",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "description": "Plex UI components for Vue 3, built on Reka UI and the shared @plexui/styles CSS",
5
5
  "type": "module",
6
6
  "license": "MIT",