@teselia/password 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +61 -2
- package/dist/TesPassword.vue.d.ts +27 -0
- package/dist/composables/use-caps-lock.d.ts +11 -0
- package/dist/composables/use-field-options.d.ts +7 -0
- package/dist/composables/use-public-events.d.ts +5 -0
- package/dist/composables/use-requirements.d.ts +20 -0
- package/dist/composables/use-reveal.d.ts +16 -0
- package/dist/composables/use-validation.d.ts +17 -0
- package/dist/composables/use-value-sync.d.ts +10 -0
- package/dist/core/changes.d.ts +7 -0
- package/dist/core/ids.d.ts +1 -0
- package/dist/core/purpose.d.ts +4 -0
- package/dist/core/rules.d.ts +23 -0
- package/dist/core/validation.d.ts +17 -0
- package/dist/element.d.ts +40 -0
- package/dist/index.d.ts +9 -0
- package/dist/props.d.ts +58 -0
- package/dist/styles.d.ts +2 -0
- package/dist/tes-password.iife.js +2 -0
- package/dist/tes-password.iife.js.map +1 -0
- package/dist/tes-password.js +607 -0
- package/dist/tes-password.js.map +1 -0
- package/package.json +60 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tes-password.js","names":["_openBlock","_createElementBlock","_createElementVNode","_unref","_toDisplayString","_normalizeClass","_withModifiers","_createCommentVNode","_Fragment","_renderList","_sfc_main","TesPasswordComponent","css","TYPING_PAUSE_MS","EMPTY_REGION_GAP_MS","useAnnouncer","announcement","ref","pending","clear","announceNow","message","announceOnceTypingPauses","onBeforeUnmount","useCustomStates","customStates","internals","name","active","states","useCapsLock","capsLockOn","readCapsLock","on","event","props","forgetCapsLock","AUTOCOMPLETE","isPurpose","value","resolvePurpose","autocompleteFor","explicit","purpose","CHARACTER_CLASSES","CLASS_PATTERNS","APPLE_CLASS_NAMES","positiveInteger","number","isCharacterClass","resolveRuleOptions","minLength","raw","maxLength","names","characterLength","checkRequirements","options","requirementsMet","check","isTooLong","passwordRules","useFieldOptions","computed","ruleOptions","usePublicEvents","dispatch","detail","host","requirementChanges","wasMet","previous","changed","current","useRequirements","checks","items","ruleText","announcedChecks","userChangePending","requirement","describeChanges","changes","reportUserChange","watch","useReveal","revealed","inputType","toggleLabel","toggleByUser","hide","hideForOwnForm","input","onMounted","validatePassword","customError","required","texts","useValidation","error","state","visibleError","markEdited","revealErrors","revealErrorsIfEdited","forgetErrorsForOwnForm","watchEffect","useValueSync","syncFromInput","syncAfterOwnFormReset","instanceCount","nextInstanceId","prefix","TES_PASSWORD_DEFAULTS","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","VueTesPassword","defineCustomElement","defineComponent","__props","attrs","useAttrs","useHost","useTemplateRef","inputId","requirementsId","capsLockId","hintId","errorId","defaultValue","describedBy","ids","requirementItems","handleUserInput","dispatchInput","disabled","item","leaveField","openBlock","createElementBlock","createElementVNode","unref","toDisplayString","normalizeClass","autocomplete","rulesForPasswordManagers","withModifiers","_cache","args","dispatchChange","createCommentVNode","Fragment","renderList","TesPasswordElement","reactive","initialProps","tes_password_default","HOST_SELECTOR","stylesFor","tagName","adoptStyles","sheet","TAG_NAME","define","registryAllowsOneTagPerConstructor"],"sources":["../../shared/src/use-announcer.ts","../../shared/src/use-custom-states.ts","../src/composables/use-caps-lock.ts","../src/core/purpose.ts","../src/core/rules.ts","../src/composables/use-field-options.ts","../src/composables/use-public-events.ts","../src/core/changes.ts","../src/composables/use-requirements.ts","../src/composables/use-reveal.ts","../src/core/validation.ts","../src/composables/use-validation.ts","../src/composables/use-value-sync.ts","../src/core/ids.ts","../src/props.ts","../src/TesPassword.vue","../src/TesPassword.vue","../src/element.ts","../src/tes-password.css?inline","../src/styles.ts","../src/index.ts"],"sourcesContent":["import { type Ref, onBeforeUnmount, ref } from 'vue'\n\nconst TYPING_PAUSE_MS = 500\n// Chromium batches accessibility updates per frame, so emptying and refilling the region in one task\n// is a no-op for a repeated message. The gap makes the empty state reach the accessibility tree.\nconst EMPTY_REGION_GAP_MS = 100\n\nexport interface Announcer {\n announcement: Ref<string>\n announceNow: (message: string) => void\n announceOnceTypingPauses: (message: () => string) => void\n clear: () => void\n}\n\nexport function useAnnouncer(): Announcer {\n const announcement = ref('')\n let pending: ReturnType<typeof setTimeout> | undefined\n\n function clear(): void {\n clearTimeout(pending)\n announcement.value = ''\n }\n\n function announceNow(message: string): void {\n clear()\n pending = setTimeout(() => {\n announcement.value = message\n }, EMPTY_REGION_GAP_MS)\n }\n\n function announceOnceTypingPauses(message: () => string): void {\n clear()\n pending = setTimeout(() => {\n announcement.value = message()\n }, TYPING_PAUSE_MS)\n }\n\n onBeforeUnmount(() => clearTimeout(pending))\n\n return { announcement, announceNow, announceOnceTypingPauses, clear }\n}\n","import { watchEffect } from 'vue'\n\nexport function useCustomStates<State extends string>(\n internals: ElementInternals,\n states: () => Record<State, boolean>,\n): void {\n watchEffect(() => {\n const customStates = internals.states\n if (!customStates) return\n\n for (const [name, active] of Object.entries<boolean>(states())) {\n if (active) customStates.add(name)\n else customStates.delete(name)\n }\n })\n}\n","import { ref } from 'vue'\nimport type { ResolvedTesPasswordProps } from '../props'\n\ninterface CapsLockOptions {\n props: ResolvedTesPasswordProps\n announceNow: (message: string) => void\n}\n\nexport function useCapsLock({ props, announceNow }: CapsLockOptions) {\n const capsLockOn = ref(false)\n\n function readCapsLock(event: KeyboardEvent | PointerEvent): void {\n const on = event.getModifierState('CapsLock')\n if (on && !capsLockOn.value) announceNow(props.textCapsLock)\n capsLockOn.value = on\n }\n\n function forgetCapsLock(): void {\n capsLockOn.value = false\n }\n\n return { capsLockOn, readCapsLock, forgetCapsLock }\n}\n","export type Purpose = 'current' | 'new'\n\nconst AUTOCOMPLETE: Record<Purpose, string> = {\n current: 'current-password',\n new: 'new-password',\n}\n\nexport function isPurpose(value: unknown): value is Purpose {\n return value === 'current' || value === 'new'\n}\n\nexport function resolvePurpose(value: unknown): Purpose {\n return isPurpose(value) ? value : 'current'\n}\n\nexport function autocompleteFor(purpose: Purpose, explicit: string | undefined): string {\n return explicit?.trim() ? explicit : AUTOCOMPLETE[purpose]\n}\n","export type CharacterClass = 'lowercase' | 'uppercase' | 'digit' | 'symbol'\nexport type Requirement = 'length' | CharacterClass\n\nexport interface RuleOptions {\n minLength: number\n maxLength: number | null\n classes: CharacterClass[]\n unknown: string[]\n}\n\nexport interface RequirementCheck {\n requirement: Requirement\n met: boolean\n}\n\nexport const DEFAULT_MIN_LENGTH = 8\n\nconst CHARACTER_CLASSES: readonly CharacterClass[] = ['lowercase', 'uppercase', 'digit', 'symbol']\n\nconst CLASS_PATTERNS: Record<CharacterClass, RegExp> = {\n lowercase: /\\p{Ll}/u,\n uppercase: /[\\p{Lu}\\p{Lt}]/u,\n digit: /\\p{Nd}/u,\n symbol: /[^\\p{L}\\p{N}\\s]/u,\n}\n\nconst APPLE_CLASS_NAMES: Record<CharacterClass, string> = {\n lowercase: 'lower',\n uppercase: 'upper',\n digit: 'digit',\n symbol: 'special',\n}\n\nfunction positiveInteger(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null\n const number = Number(value)\n return Number.isInteger(number) && number > 0 ? number : null\n}\n\nfunction isCharacterClass(name: string): name is CharacterClass {\n return (CHARACTER_CLASSES as readonly string[]).includes(name)\n}\n\nexport function resolveRuleOptions(raw: { minlength?: unknown; maxlength?: unknown; requirements?: unknown }): RuleOptions {\n const minLength = positiveInteger(raw.minlength) ?? DEFAULT_MIN_LENGTH\n const maxLength = positiveInteger(raw.maxlength)\n const names = String(raw.requirements ?? '')\n .toLowerCase()\n .split(/[\\s,]+/)\n .filter(Boolean)\n\n return {\n minLength,\n maxLength: maxLength !== null && maxLength >= minLength ? maxLength : null,\n classes: CHARACTER_CLASSES.filter((name) => names.includes(name)),\n unknown: [...new Set(names.filter((name) => !isCharacterClass(name)))],\n }\n}\n\nexport function characterLength(value: string): number {\n return [...value].length\n}\n\nexport function checkRequirements(value: string, options: RuleOptions): RequirementCheck[] {\n return [\n { requirement: 'length', met: characterLength(value) >= options.minLength },\n ...options.classes.map((name) => ({ requirement: name, met: CLASS_PATTERNS[name].test(value) })),\n ]\n}\n\nexport function requirementsMet(value: string, options: RuleOptions): boolean {\n return checkRequirements(value, options).every((check) => check.met)\n}\n\nexport function isTooLong(value: string, options: RuleOptions): boolean {\n return options.maxLength !== null && characterLength(value) > options.maxLength\n}\n\nexport function passwordRules(options: RuleOptions): string {\n const rules = [\n `minlength: ${options.minLength};`,\n options.maxLength !== null && `maxlength: ${options.maxLength};`,\n ...options.classes.map((name) => `required: ${APPLE_CLASS_NAMES[name]};`),\n 'allowed: lower, upper, digit, special;',\n ]\n return rules.filter(Boolean).join(' ')\n}\n","import { computed, watchEffect } from 'vue'\nimport { autocompleteFor, isPurpose, resolvePurpose } from '../core/purpose'\nimport { passwordRules, resolveRuleOptions } from '../core/rules'\nimport type { TesPasswordProps } from '../props'\n\nexport function useFieldOptions(props: Readonly<TesPasswordProps>) {\n const purpose = computed(() => resolvePurpose(props.purpose))\n\n const ruleOptions = computed(() =>\n purpose.value === 'new'\n ? resolveRuleOptions({ minlength: props.minlength, maxlength: props.maxlength, requirements: props.requirements })\n : null,\n )\n\n const autocomplete = computed(() => autocompleteFor(purpose.value, props.autocomplete))\n const rulesForPasswordManagers = computed(() => (ruleOptions.value ? passwordRules(ruleOptions.value) : undefined))\n\n if (import.meta.env.DEV) {\n watchEffect(() => {\n if (props.purpose !== undefined && !isPurpose(props.purpose)) {\n console.warn(`[tes-password] \\`purpose\\` must be \"current\" or \"new\". Using \"current\".`)\n }\n const unknown = ruleOptions.value?.unknown ?? []\n if (unknown.length > 0) {\n console.warn(`[tes-password] Unknown requirements ignored: ${unknown.join(', ')}.`)\n }\n const hasRules = props.minlength !== undefined || props.maxlength !== undefined || Boolean(props.requirements)\n if (purpose.value === 'current' && hasRules) {\n console.warn('[tes-password] `minlength`, `maxlength` and `requirements` only apply with `purpose=\"new\"`.')\n }\n })\n }\n\n return { purpose, ruleOptions, autocomplete, rulesForPasswordManagers }\n}\n","import type { TesPasswordElement } from '../element'\n\nexport function usePublicEvents(host: TesPasswordElement) {\n function dispatch(name: 'input' | 'change'): void {\n const detail = { value: host.value, requirementsMet: host.requirementsMet }\n host.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, detail }))\n }\n\n return {\n dispatchInput: () => dispatch('input'),\n dispatchChange: () => dispatch('change'),\n }\n}\n","import type { Requirement, RequirementCheck } from './rules'\n\nexport interface RequirementChanges {\n met: Requirement[]\n unmet: Requirement[]\n allMet: boolean\n}\n\nexport function requirementChanges(previous: RequirementCheck[], current: RequirementCheck[]): RequirementChanges | null {\n const wasMet = new Map(previous.map((check) => [check.requirement, check.met]))\n const changed = current.filter((check) => wasMet.get(check.requirement) !== check.met)\n if (changed.length === 0) return null\n\n return {\n met: changed.filter((check) => check.met).map((check) => check.requirement),\n unmet: changed.filter((check) => !check.met).map((check) => check.requirement),\n allMet: current.every((check) => check.met),\n }\n}\n","import { type ComputedRef, computed, watch } from 'vue'\nimport { type RequirementChanges, requirementChanges } from '../core/changes'\nimport { type Requirement, type RequirementCheck, type RuleOptions, checkRequirements } from '../core/rules'\nimport type { TesPasswordElement } from '../element'\nimport type { ResolvedTesPasswordProps } from '../props'\n\ninterface RequirementsOptions {\n host: TesPasswordElement\n props: ResolvedTesPasswordProps\n ruleOptions: ComputedRef<RuleOptions | null>\n announceOnceTypingPauses: (message: () => string) => void\n}\n\nexport interface RequirementItem {\n requirement: Requirement\n met: boolean\n text: string\n}\n\nexport function useRequirements({ host, props, ruleOptions, announceOnceTypingPauses }: RequirementsOptions) {\n const checks = computed<RequirementCheck[]>(() =>\n ruleOptions.value ? checkRequirements(host.state.value, ruleOptions.value) : [],\n )\n\n const items = computed<RequirementItem[]>(() =>\n checks.value.map((check) => ({ ...check, text: ruleText(check.requirement) })),\n )\n\n let announcedChecks = checks.value\n let userChangePending = false\n\n function ruleText(requirement: Requirement): string {\n const texts: Record<Requirement, string> = {\n length: props.textRuleLength.replaceAll('{minlength}', String(ruleOptions.value?.minLength ?? '')),\n lowercase: props.textRuleLowercase,\n uppercase: props.textRuleUppercase,\n digit: props.textRuleDigit,\n symbol: props.textRuleSymbol,\n }\n return texts[requirement]\n }\n\n function describeChanges(changes: RequirementChanges): string {\n if (changes.allMet) return props.textAllMet\n return checks.value\n .filter((check) => changes.met.includes(check.requirement) || changes.unmet.includes(check.requirement))\n .map((check) => `${ruleText(check.requirement)}, ${check.met ? props.textRuleMet : props.textRuleUnmet}`)\n .join('. ')\n }\n\n function reportUserChange(): void {\n if (!ruleOptions.value) return\n userChangePending = true\n announceOnceTypingPauses(() => {\n userChangePending = false\n const changes = requirementChanges(announcedChecks, checks.value)\n announcedChecks = checks.value\n return changes ? describeChanges(changes) : ''\n })\n }\n\n watch(checks, (current) => {\n if (!userChangePending) announcedChecks = current\n })\n\n return { requirementItems: items, reportUserChange }\n}\n","import { type Ref, computed, onBeforeUnmount, onMounted } from 'vue'\nimport type { TesPasswordElement } from '../element'\nimport type { ResolvedTesPasswordProps } from '../props'\n\ninterface RevealOptions {\n host: TesPasswordElement\n props: ResolvedTesPasswordProps\n input: Readonly<Ref<HTMLInputElement | null>>\n announceNow: (message: string) => void\n}\n\nexport function useReveal({ host, props, input, announceNow }: RevealOptions) {\n\n const revealed = computed(() => host.state.revealed)\n const inputType = computed(() => (revealed.value ? 'text' : 'password'))\n const toggleLabel = computed(() => (revealed.value ? props.textHideLabel : props.textShowLabel))\n\n function toggleByUser(): void {\n host.revealed = !host.revealed\n announceNow(host.revealed ? props.textShown : props.textHidden)\n }\n\n function hide(): void {\n host.revealed = false\n }\n\n function hideForOwnForm(event: Event): void {\n if (event.target === input.value?.form) hide()\n }\n\n onMounted(() => {\n window.addEventListener('submit', hideForOwnForm, true)\n window.addEventListener('reset', hideForOwnForm, true)\n window.addEventListener('pagehide', hide)\n })\n\n onBeforeUnmount(() => {\n window.removeEventListener('submit', hideForOwnForm, true)\n window.removeEventListener('reset', hideForOwnForm, true)\n window.removeEventListener('pagehide', hide)\n })\n\n return { revealed, inputType, toggleLabel, toggleByUser }\n}\n","import { type RuleOptions, isTooLong, requirementsMet } from './rules'\n\nexport interface PasswordValidationInput {\n value: string\n required: boolean\n ruleOptions: RuleOptions | null\n customError: string\n}\n\nexport interface PasswordValidationTexts {\n required: string\n unmet: string\n tooLong: string\n}\n\nexport interface PasswordValidationError {\n flag: 'customError' | 'valueMissing' | 'tooLong' | 'unmet'\n message: string\n}\n\nexport function validatePassword(\n { value, required, ruleOptions, customError }: PasswordValidationInput,\n texts: PasswordValidationTexts,\n): PasswordValidationError | null {\n if (customError) return { flag: 'customError', message: customError }\n if (value === '') return required ? { flag: 'valueMissing', message: texts.required } : null\n if (!ruleOptions) return null\n if (isTooLong(value, ruleOptions)) {\n return { flag: 'tooLong', message: texts.tooLong.replaceAll('{maxlength}', String(ruleOptions.maxLength)) }\n }\n if (!requirementsMet(value, ruleOptions)) return { flag: 'unmet', message: texts.unmet }\n return null\n}\n","import { type ComputedRef, type Ref, computed, onBeforeUnmount, onMounted, watchEffect } from 'vue'\nimport type { RuleOptions } from '../core/rules'\nimport { validatePassword } from '../core/validation'\nimport type { TesPasswordElement } from '../element'\nimport type { ResolvedTesPasswordProps } from '../props'\n\ninterface ValidationOptions {\n host: TesPasswordElement\n props: ResolvedTesPasswordProps\n input: Readonly<Ref<HTMLInputElement | null>>\n ruleOptions: ComputedRef<RuleOptions | null>\n}\n\nexport function useValidation({ host, props, input, ruleOptions }: ValidationOptions) {\n const { state } = host\n\n const error = computed(() =>\n validatePassword(\n { value: state.value, required: props.required, ruleOptions: ruleOptions.value, customError: state.customError },\n { required: props.textRequired, unmet: props.textUnmet, tooLong: props.textTooLong },\n ),\n )\n\n const visibleError = computed(() => (state.errorsVisible ? error.value : null))\n\n function markEdited(): void {\n state.edited = true\n state.customError = ''\n }\n\n function revealErrors(): void {\n state.errorsVisible = true\n }\n\n function revealErrorsIfEdited(): void {\n if (state.edited) revealErrors()\n }\n\n function forgetErrorsForOwnForm(event: Event): void {\n if (event.target !== input.value?.form) return\n state.edited = false\n state.errorsVisible = false\n state.customError = ''\n }\n\n watchEffect(() => input.value?.setCustomValidity(error.value?.message ?? ''), { flush: 'sync' })\n\n onMounted(() => window.addEventListener('reset', forgetErrorsForOwnForm, true))\n onBeforeUnmount(() => window.removeEventListener('reset', forgetErrorsForOwnForm, true))\n\n return { visibleError, markEdited, revealErrors, revealErrorsIfEdited }\n}\n","import { type Ref, onBeforeUnmount, onMounted } from 'vue'\nimport type { TesPasswordElement } from '../element'\n\ninterface ValueSyncOptions {\n host: TesPasswordElement\n input: Readonly<Ref<HTMLInputElement | null>>\n}\n\nexport function useValueSync({ host, input }: ValueSyncOptions) {\n function syncFromInput(): void {\n if (input.value) host.state.value = input.value.value\n }\n\n function syncAfterOwnFormReset(event: Event): void {\n if (event.target === input.value?.form) setTimeout(syncFromInput)\n }\n\n onMounted(() => {\n syncFromInput()\n window.addEventListener('reset', syncAfterOwnFormReset, true)\n })\n\n onBeforeUnmount(() => window.removeEventListener('reset', syncAfterOwnFormReset, true))\n\n return { syncFromInput }\n}\n","let instanceCount = 0\n\nexport function nextInstanceId(prefix: string): string {\n instanceCount += 1\n return `${prefix}-${instanceCount}`\n}\n","import type { Purpose } from './core/purpose'\n\nexport interface TesPasswordProps {\n label?: string\n name?: string\n hint?: string\n required?: boolean\n disabled?: boolean\n readonly?: boolean\n purpose?: Purpose\n minlength?: number\n maxlength?: number\n requirements?: string\n autocomplete?: string\n textShow?: string\n textHide?: string\n textShowLabel?: string\n textHideLabel?: string\n textShown?: string\n textHidden?: string\n textRequirements?: string\n textRuleLength?: string\n textRuleLowercase?: string\n textRuleUppercase?: string\n textRuleDigit?: string\n textRuleSymbol?: string\n textRuleMet?: string\n textRuleUnmet?: string\n textAllMet?: string\n textCapsLock?: string\n textRequired?: string\n textUnmet?: string\n textTooLong?: string\n}\n\nexport const TES_PASSWORD_DEFAULTS = {\n required: false,\n disabled: false,\n readonly: false,\n textShow: 'Show',\n textHide: 'Hide',\n textShowLabel: 'Show password',\n textHideLabel: 'Hide password',\n textShown: 'Your password is shown',\n textHidden: 'Your password is hidden',\n textRequirements: 'Your password must have:',\n textRuleLength: 'At least {minlength} characters',\n textRuleLowercase: 'A lowercase letter',\n textRuleUppercase: 'An uppercase letter',\n textRuleDigit: 'A number',\n textRuleSymbol: 'A symbol, like ! or #',\n textRuleMet: 'done',\n textRuleUnmet: 'not yet',\n textAllMet: 'All requirements met',\n textCapsLock: 'Caps Lock is on',\n textRequired: 'Enter a password',\n textUnmet: 'Your password does not meet all the requirements',\n textTooLong: 'Use {maxlength} characters or fewer',\n}\n\nexport type ResolvedTesPasswordProps = Readonly<TesPasswordProps & typeof TES_PASSWORD_DEFAULTS>\n","<template>\n <div class=\"tes-password__field\">\n <label :for=\"inputId\" class=\"tes-password__label\">{{ label }}</label>\n <div class=\"tes-password__control\" :class=\"{ 'tes-password__control--invalid': visibleError }\">\n <input\n :id=\"inputId\"\n ref=\"input\"\n class=\"tes-password__input\"\n :type=\"inputType\"\n :name=\"name\"\n :value.attr=\"defaultValue\"\n :autocomplete=\"autocomplete\"\n :passwordrules=\"rulesForPasswordManagers\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"visibleError ? 'true' : undefined\"\n :required=\"required\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n @input.stop=\"handleUserInput\"\n @change.stop=\"dispatchChange\"\n @keydown=\"readCapsLock\"\n @keyup=\"readCapsLock\"\n @pointerdown=\"readCapsLock\"\n @blur=\"leaveField\"\n @invalid=\"revealErrors\"\n />\n <button type=\"button\" class=\"tes-password__toggle\" :aria-label=\"toggleLabel\" @click=\"toggleByUser\">\n <span class=\"tes-password__toggle-text\" :class=\"{ 'tes-password__toggle-text--inactive': revealed }\">{{\n textShow\n }}</span>\n <span class=\"tes-password__toggle-text\" :class=\"{ 'tes-password__toggle-text--inactive': !revealed }\">{{\n textHide\n }}</span>\n </button>\n </div>\n <p v-if=\"hint\" :id=\"hintId\" class=\"tes-password__hint\">{{ hint }}</p>\n <p v-if=\"capsLockOn\" :id=\"capsLockId\" class=\"tes-password__caps-lock\">{{ textCapsLock }}</p>\n <div v-if=\"requirementItems.length\" :id=\"requirementsId\" class=\"tes-password__requirements\">\n <p class=\"tes-password__requirements-title\">{{ textRequirements }}</p>\n <ul class=\"tes-password__requirements-list\">\n <li\n v-for=\"item in requirementItems\"\n :key=\"item.requirement\"\n class=\"tes-password__requirement\"\n :class=\"{ 'tes-password__requirement--met': item.met }\"\n >\n <svg\n v-if=\"item.met\"\n class=\"tes-password__icon tes-password__icon--met\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n <svg\n v-else\n class=\"tes-password__icon tes-password__icon--unmet\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"5\" />\n </svg>\n <span>{{ item.text }}</span\n ><span class=\"tes-password__visually-hidden\">, {{ item.met ? textRuleMet : textRuleUnmet }}</span>\n </li>\n </ul>\n </div>\n <p :id=\"errorId\" class=\"tes-password__error\" aria-live=\"polite\">{{ visibleError?.message }}</p>\n <div role=\"status\" class=\"tes-password__visually-hidden\">{{ announcement }}</div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAnnouncer, useCustomStates } from '@teselia/shared'\nimport { computed, useAttrs, useHost, useTemplateRef, watch } from 'vue'\nimport { useCapsLock } from './composables/use-caps-lock'\nimport { useFieldOptions } from './composables/use-field-options'\nimport { usePublicEvents } from './composables/use-public-events'\nimport { useRequirements } from './composables/use-requirements'\nimport { useReveal } from './composables/use-reveal'\nimport { useValidation } from './composables/use-validation'\nimport { useValueSync } from './composables/use-value-sync'\nimport { nextInstanceId } from './core/ids'\nimport type { TesPasswordElement } from './element'\nimport { TES_PASSWORD_DEFAULTS, type TesPasswordProps } from './props'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TesPasswordProps>(), TES_PASSWORD_DEFAULTS)\nconst attrs = useAttrs()\nconst host = useHost() as TesPasswordElement\nconst input = useTemplateRef<HTMLInputElement>('input')\n\nconst inputId = nextInstanceId('tes-password')\nconst requirementsId = `${inputId}-requirements`\nconst capsLockId = `${inputId}-caps-lock`\nconst hintId = `${inputId}-hint`\nconst errorId = `${inputId}-error`\nconst defaultValue = computed(() => (typeof attrs.value === 'string' ? attrs.value : undefined))\n\nconst { announcement, announceNow, announceOnceTypingPauses } = useAnnouncer()\nconst { ruleOptions, autocomplete, rulesForPasswordManagers } = useFieldOptions(props)\nconst { revealed, inputType, toggleLabel, toggleByUser } = useReveal({ host, props, input, announceNow })\nconst { syncFromInput } = useValueSync({ host, input })\nconst { requirementItems, reportUserChange } = useRequirements({\n host,\n props,\n ruleOptions,\n announceOnceTypingPauses,\n})\n\nconst { capsLockOn, readCapsLock, forgetCapsLock } = useCapsLock({ props, announceNow })\n\nconst { visibleError, markEdited, revealErrors, revealErrorsIfEdited } = useValidation({\n host,\n props,\n input,\n ruleOptions,\n})\n\nconst describedBy = computed(() => {\n const ids = [\n props.hint && hintId,\n requirementItems.value.length > 0 && requirementsId,\n capsLockOn.value && capsLockId,\n visibleError.value && errorId,\n ].filter(Boolean)\n return ids.length > 0 ? ids.join(' ') : undefined\n})\n\nconst { dispatchInput, dispatchChange } = usePublicEvents(host)\n\nfunction handleUserInput(): void {\n markEdited()\n syncFromInput()\n reportUserChange()\n dispatchInput()\n}\n\nwatch(\n () => props.disabled,\n (disabled) => {\n if (disabled) host.revealed = false\n },\n)\n\nuseCustomStates(host.internals, () => ({\n invalid: visibleError.value !== null,\n empty: host.state.value === '',\n revealed: revealed.value,\n 'requirements-met': requirementItems.value.length > 0 && requirementItems.value.every((item) => item.met),\n 'caps-lock': capsLockOn.value,\n}))\n\nfunction leaveField(): void {\n forgetCapsLock()\n revealErrorsIfEdited()\n}\n\nif (import.meta.env.DEV && !props.label) {\n console.warn('[tes-password] The `label` attribute is required for an accessible name.')\n}\n</script>\n","<template>\n <div class=\"tes-password__field\">\n <label :for=\"inputId\" class=\"tes-password__label\">{{ label }}</label>\n <div class=\"tes-password__control\" :class=\"{ 'tes-password__control--invalid': visibleError }\">\n <input\n :id=\"inputId\"\n ref=\"input\"\n class=\"tes-password__input\"\n :type=\"inputType\"\n :name=\"name\"\n :value.attr=\"defaultValue\"\n :autocomplete=\"autocomplete\"\n :passwordrules=\"rulesForPasswordManagers\"\n :aria-describedby=\"describedBy\"\n :aria-invalid=\"visibleError ? 'true' : undefined\"\n :required=\"required\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocorrect=\"off\"\n @input.stop=\"handleUserInput\"\n @change.stop=\"dispatchChange\"\n @keydown=\"readCapsLock\"\n @keyup=\"readCapsLock\"\n @pointerdown=\"readCapsLock\"\n @blur=\"leaveField\"\n @invalid=\"revealErrors\"\n />\n <button type=\"button\" class=\"tes-password__toggle\" :aria-label=\"toggleLabel\" @click=\"toggleByUser\">\n <span class=\"tes-password__toggle-text\" :class=\"{ 'tes-password__toggle-text--inactive': revealed }\">{{\n textShow\n }}</span>\n <span class=\"tes-password__toggle-text\" :class=\"{ 'tes-password__toggle-text--inactive': !revealed }\">{{\n textHide\n }}</span>\n </button>\n </div>\n <p v-if=\"hint\" :id=\"hintId\" class=\"tes-password__hint\">{{ hint }}</p>\n <p v-if=\"capsLockOn\" :id=\"capsLockId\" class=\"tes-password__caps-lock\">{{ textCapsLock }}</p>\n <div v-if=\"requirementItems.length\" :id=\"requirementsId\" class=\"tes-password__requirements\">\n <p class=\"tes-password__requirements-title\">{{ textRequirements }}</p>\n <ul class=\"tes-password__requirements-list\">\n <li\n v-for=\"item in requirementItems\"\n :key=\"item.requirement\"\n class=\"tes-password__requirement\"\n :class=\"{ 'tes-password__requirement--met': item.met }\"\n >\n <svg\n v-if=\"item.met\"\n class=\"tes-password__icon tes-password__icon--met\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path d=\"M3.5 8.5l3 3 6-7\" />\n </svg>\n <svg\n v-else\n class=\"tes-password__icon tes-password__icon--unmet\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <circle cx=\"8\" cy=\"8\" r=\"5\" />\n </svg>\n <span>{{ item.text }}</span\n ><span class=\"tes-password__visually-hidden\">, {{ item.met ? textRuleMet : textRuleUnmet }}</span>\n </li>\n </ul>\n </div>\n <p :id=\"errorId\" class=\"tes-password__error\" aria-live=\"polite\">{{ visibleError?.message }}</p>\n <div role=\"status\" class=\"tes-password__visually-hidden\">{{ announcement }}</div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { useAnnouncer, useCustomStates } from '@teselia/shared'\nimport { computed, useAttrs, useHost, useTemplateRef, watch } from 'vue'\nimport { useCapsLock } from './composables/use-caps-lock'\nimport { useFieldOptions } from './composables/use-field-options'\nimport { usePublicEvents } from './composables/use-public-events'\nimport { useRequirements } from './composables/use-requirements'\nimport { useReveal } from './composables/use-reveal'\nimport { useValidation } from './composables/use-validation'\nimport { useValueSync } from './composables/use-value-sync'\nimport { nextInstanceId } from './core/ids'\nimport type { TesPasswordElement } from './element'\nimport { TES_PASSWORD_DEFAULTS, type TesPasswordProps } from './props'\n\ndefineOptions({ inheritAttrs: false })\n\nconst props = withDefaults(defineProps<TesPasswordProps>(), TES_PASSWORD_DEFAULTS)\nconst attrs = useAttrs()\nconst host = useHost() as TesPasswordElement\nconst input = useTemplateRef<HTMLInputElement>('input')\n\nconst inputId = nextInstanceId('tes-password')\nconst requirementsId = `${inputId}-requirements`\nconst capsLockId = `${inputId}-caps-lock`\nconst hintId = `${inputId}-hint`\nconst errorId = `${inputId}-error`\nconst defaultValue = computed(() => (typeof attrs.value === 'string' ? attrs.value : undefined))\n\nconst { announcement, announceNow, announceOnceTypingPauses } = useAnnouncer()\nconst { ruleOptions, autocomplete, rulesForPasswordManagers } = useFieldOptions(props)\nconst { revealed, inputType, toggleLabel, toggleByUser } = useReveal({ host, props, input, announceNow })\nconst { syncFromInput } = useValueSync({ host, input })\nconst { requirementItems, reportUserChange } = useRequirements({\n host,\n props,\n ruleOptions,\n announceOnceTypingPauses,\n})\n\nconst { capsLockOn, readCapsLock, forgetCapsLock } = useCapsLock({ props, announceNow })\n\nconst { visibleError, markEdited, revealErrors, revealErrorsIfEdited } = useValidation({\n host,\n props,\n input,\n ruleOptions,\n})\n\nconst describedBy = computed(() => {\n const ids = [\n props.hint && hintId,\n requirementItems.value.length > 0 && requirementsId,\n capsLockOn.value && capsLockId,\n visibleError.value && errorId,\n ].filter(Boolean)\n return ids.length > 0 ? ids.join(' ') : undefined\n})\n\nconst { dispatchInput, dispatchChange } = usePublicEvents(host)\n\nfunction handleUserInput(): void {\n markEdited()\n syncFromInput()\n reportUserChange()\n dispatchInput()\n}\n\nwatch(\n () => props.disabled,\n (disabled) => {\n if (disabled) host.revealed = false\n },\n)\n\nuseCustomStates(host.internals, () => ({\n invalid: visibleError.value !== null,\n empty: host.state.value === '',\n revealed: revealed.value,\n 'requirements-met': requirementItems.value.length > 0 && requirementItems.value.every((item) => item.met),\n 'caps-lock': capsLockOn.value,\n}))\n\nfunction leaveField(): void {\n forgetCapsLock()\n revealErrorsIfEdited()\n}\n\nif (import.meta.env.DEV && !props.label) {\n console.warn('[tes-password] The `label` attribute is required for an accessible name.')\n}\n</script>\n","import { defineCustomElement, reactive } from 'vue'\nimport TesPasswordComponent from './TesPassword.vue'\nimport { resolvePurpose } from './core/purpose'\nimport { requirementsMet, resolveRuleOptions } from './core/rules'\n\nexport interface TesPasswordState {\n revealed: boolean\n value: string\n edited: boolean\n errorsVisible: boolean\n customError: string\n}\n\nconst VueTesPassword = defineCustomElement(TesPasswordComponent, { shadowRoot: false })\n\nexport class TesPasswordElement extends VueTesPassword {\n readonly state: TesPasswordState = reactive({\n revealed: false,\n value: '',\n edited: false,\n errorsVisible: false,\n customError: '',\n })\n\n readonly internals: ElementInternals\n\n private pendingValue: string | null = null\n\n constructor(initialProps?: Record<string, unknown>) {\n super(initialProps)\n this.internals = this.attachInternals()\n }\n\n get revealed(): boolean {\n return this.state.revealed\n }\n\n set revealed(revealed: boolean) {\n if (revealed === this.state.revealed) return\n this.state.revealed = revealed\n this.syncInputType()\n this.dispatchEvent(new CustomEvent('revealchange', { bubbles: true, composed: true, detail: { revealed } }))\n }\n\n get value(): string {\n return this.input?.value ?? this.pendingValue ?? this.defaultValue\n }\n\n set value(value: string) {\n const input = this.input\n if (input) input.value = value\n else this.pendingValue = value\n this.state.value = value\n }\n\n get requirementsMet(): boolean {\n if (resolvePurpose(this.getAttribute('purpose')) !== 'new') return true\n const options = resolveRuleOptions({\n minlength: this.getAttribute('minlength'),\n maxlength: this.getAttribute('maxlength'),\n requirements: this.getAttribute('requirements'),\n })\n return requirementsMet(this.state.value, options)\n }\n\n get defaultValue(): string {\n return this.getAttribute('value') ?? ''\n }\n\n set defaultValue(value: string) {\n this.setAttribute('value', value)\n }\n\n get minLength(): number {\n return resolveRuleOptions({ minlength: this.getAttribute('minlength') }).minLength\n }\n\n set minLength(value: number) {\n this.setAttribute('minlength', String(value))\n }\n\n get maxLength(): number {\n return resolveRuleOptions({ minlength: 1, maxlength: this.getAttribute('maxlength') }).maxLength ?? -1\n }\n\n set maxLength(value: number) {\n this.setAttribute('maxlength', String(value))\n }\n\n get readOnly(): boolean {\n return this.hasAttribute('readonly')\n }\n\n set readOnly(value: boolean) {\n this.toggleAttribute('readonly', value)\n }\n\n get form(): HTMLFormElement | null {\n return this.input?.form ?? null\n }\n\n get validity(): ValidityState {\n return (this.input ?? document.createElement('input')).validity\n }\n\n get validationMessage(): string {\n return this.input?.validationMessage ?? ''\n }\n\n get willValidate(): boolean {\n return this.input?.willValidate ?? false\n }\n\n setCustomValidity(message: string): void {\n this.state.customError = message\n if (message) this.state.errorsVisible = true\n }\n\n checkValidity(): boolean {\n return this.input?.checkValidity() ?? true\n }\n\n reportValidity(): boolean {\n return this.input?.reportValidity() ?? true\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n this.applyPendingValue()\n }\n\n override focus(options?: FocusOptions): void {\n this.input?.focus(options)\n }\n\n private get input(): HTMLInputElement | null {\n return this.querySelector<HTMLInputElement>('.tes-password__input')\n }\n\n private syncInputType(): void {\n const input = this.input\n if (input) input.type = this.state.revealed ? 'text' : 'password'\n }\n\n private applyPendingValue(): void {\n const input = this.input\n if (!input || this.pendingValue === null) return\n input.value = this.pendingValue\n this.state.value = this.pendingValue\n this.pendingValue = null\n }\n}\n",":where(tes-password) {\n --_text: var(--tes-color-text, light-dark(#1f2328, #e8eaee));\n --_muted: var(--tes-color-muted, light-dark(#59636e, #a3adba));\n --_bg: var(--tes-color-bg, light-dark(#ffffff, #16181d));\n --_border: var(--tes-color-border, light-dark(#7d8590, #7f8a99));\n --_accent: var(--tes-color-accent, light-dark(#0b5fcc, #7aa7ff));\n --_on-accent: var(--tes-color-on-accent, light-dark(#ffffff, #0d1117));\n --_hover: var(--tes-color-hover, light-dark(#eef3fb, #232a36));\n --_focus: var(--tes-color-focus, light-dark(#0b5fcc, #7aa7ff));\n --_error: var(--tes-color-error, light-dark(#c4232b, #ff8a80));\n --_success: var(--tes-color-success, light-dark(#1f7a3a, #4cc26a));\n --_radius: var(--tes-radius, 0.375rem);\n --_space: var(--tes-space, 0.5rem);\n --_control-height: 2.75rem;\n\n display: inline-block;\n color: var(--_text);\n font-family: var(--tes-font-family);\n font-size: var(--tes-font-size);\n}\n\n:where(tes-password[hidden]) {\n display: none;\n}\n\n:where(.tes-password__field) {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: calc(var(--_space) / 2);\n}\n\n:where(.tes-password__label) {\n font-weight: 500;\n}\n\n:where(.tes-password__control) {\n box-sizing: border-box;\n display: flex;\n block-size: var(--_control-height);\n border: 1px solid var(--_border);\n border-radius: var(--_radius);\n background: var(--_bg);\n}\n\n:where(.tes-password__control--invalid) {\n border: 2px solid var(--_error);\n}\n\n:where(.tes-password__control:has(.tes-password__input:focus-visible)) {\n outline: 2px solid var(--_focus);\n outline-offset: 2px;\n}\n\n:where(.tes-password__input) {\n box-sizing: border-box;\n flex: 1;\n min-inline-size: 0;\n margin: 0;\n padding-inline: 0.75rem;\n border: 0;\n border-radius: var(--_radius);\n outline: none;\n background: transparent;\n color: var(--_text);\n font: inherit;\n font-size: max(1em, 16px);\n}\n\n:where(.tes-password__toggle) {\n display: grid;\n place-items: center;\n flex: none;\n min-inline-size: 2.75rem;\n margin: 0;\n padding-inline: 0.75rem;\n border: 0;\n border-radius: var(--_radius);\n background: transparent;\n color: var(--_accent);\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n}\n\n:where(.tes-password__control:has(.tes-password__input:disabled)) {\n background: color-mix(in srgb, var(--_muted) 12%, var(--_bg));\n}\n\n:where(.tes-password__input:disabled) {\n color: var(--_muted);\n cursor: not-allowed;\n}\n\n:where(.tes-password__input:disabled ~ .tes-password__toggle) {\n display: none;\n}\n\n:where(.tes-password__toggle-text) {\n grid-area: 1 / 1;\n}\n\n:where(.tes-password__toggle-text--inactive) {\n visibility: hidden;\n}\n\n:where(.tes-password__toggle:hover) {\n background: var(--_hover);\n}\n\n:where(.tes-password__toggle:focus-visible) {\n outline: 2px solid var(--_focus);\n outline-offset: -2px;\n}\n\n:where(.tes-password__hint) {\n margin: 0;\n padding-block-start: 0.25rem;\n color: var(--_muted);\n font-size: 0.875em;\n}\n\n:where(.tes-password__caps-lock) {\n margin: 0;\n padding-block-start: 0.25rem;\n font-size: 0.875em;\n font-weight: 500;\n}\n\n:where(.tes-password__requirements) {\n padding-block-start: 0.25rem;\n color: var(--_muted);\n font-size: 0.875em;\n}\n\n:where(.tes-password__requirements-title) {\n margin: 0;\n}\n\n:where(.tes-password__requirements-list) {\n display: grid;\n gap: 0.125rem;\n margin: 0.25rem 0 0;\n padding: 0;\n list-style: none;\n}\n\n:where(.tes-password__requirement) {\n display: flex;\n gap: 0.375rem;\n align-items: center;\n margin: 0;\n}\n\n:where(.tes-password__requirement--met) {\n color: var(--_text);\n}\n\n:where(.tes-password__icon) {\n flex: none;\n inline-size: 1em;\n block-size: 1em;\n fill: none;\n stroke: currentColor;\n stroke-width: 1.5;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n:where(.tes-password__icon--met) {\n stroke: var(--_success);\n stroke-width: 2;\n}\n\n:where(.tes-password__error) {\n margin: 0;\n color: var(--_error);\n font-size: 0.875em;\n font-weight: 500;\n}\n\n:where(.tes-password__error:empty) {\n display: none;\n}\n\n:where(.tes-password__visually-hidden) {\n position: absolute;\n inline-size: 1px;\n block-size: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n border: 0;\n}\n\n@media (forced-colors: active) {\n :where(.tes-password__control:has(.tes-password__input:focus-visible)),\n :where(.tes-password__toggle:focus-visible) {\n outline-color: Highlight;\n }\n\n :where(.tes-password__input:disabled) {\n color: GrayText;\n }\n}\n","import css from './tes-password.css?inline'\n\nconst HOST_SELECTOR = ':where(tes-password'\n\nexport function stylesFor(tagName: string): string {\n return css.replaceAll(HOST_SELECTOR, `:where(${tagName}`)\n}\n\nexport function adoptStyles(tagName: string): void {\n if (typeof document === 'undefined' || typeof CSSStyleSheet === 'undefined') return\n\n const sheet = new CSSStyleSheet()\n sheet.replaceSync(stylesFor(tagName))\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet]\n}\n","import { TesPasswordElement } from './element'\nimport { adoptStyles } from './styles'\n\nexport { TesPasswordElement }\n\nexport const TAG_NAME = 'tes-password'\n\nexport function define(tagName: string = TAG_NAME): void {\n if (typeof customElements === 'undefined' || customElements.get(tagName)) return\n\n const registryAllowsOneTagPerConstructor = class extends TesPasswordElement {}\n customElements.define(\n tagName,\n tagName === TAG_NAME ? TesPasswordElement : registryAllowsOneTagPerConstructor,\n )\n adoptStyles(tagName)\n}\n\ndefine()\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'tes-password': TesPasswordElement\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teselia/password",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "Accessible password input with a show/hide button and live requirements, shipped as a framework-agnostic Web Component. Works with password managers. WCAG 2.2 AA by default.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"password",
|
|
7
|
+
"password-input",
|
|
8
|
+
"show-password",
|
|
9
|
+
"password-requirements",
|
|
10
|
+
"web-component",
|
|
11
|
+
"custom-element",
|
|
12
|
+
"accessibility",
|
|
13
|
+
"a11y",
|
|
14
|
+
"wcag",
|
|
15
|
+
"vue"
|
|
16
|
+
],
|
|
17
|
+
"license": "MIT",
|
|
18
|
+
"author": "caicesardev",
|
|
19
|
+
"homepage": "https://teselia.caicesardev.com/password",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/caicesardev/teselia.git",
|
|
23
|
+
"directory": "packages/password"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/caicesardev/teselia/issues"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"sideEffects": true,
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"CHANGELOG.md"
|
|
33
|
+
],
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"module": "./dist/tes-password.js",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"import": "./dist/tes-password.js"
|
|
40
|
+
},
|
|
41
|
+
"./iife": "./dist/tes-password.iife.js",
|
|
42
|
+
"./package.json": "./package.json"
|
|
43
|
+
},
|
|
44
|
+
"unpkg": "./dist/tes-password.iife.js",
|
|
45
|
+
"jsdelivr": "./dist/tes-password.iife.js",
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"vue": "^3.5.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@vitejs/plugin-vue": "^6.0.10",
|
|
51
|
+
"vite": "^8.3.6",
|
|
52
|
+
"vue": "^3.5.45",
|
|
53
|
+
"vue-tsc": "^3.3.14",
|
|
54
|
+
"@teselia/shared": "0.0.0"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"scripts": {
|
|
60
|
+
"build": "vite build && vite build --mode iife && vue-tsc -p tsconfig.build.json && node ../../scripts/check-public-types.mjs && node ../../scripts/check-built-css.mjs",
|
|
61
|
+
"typecheck": "vue-tsc --noEmit"
|
|
62
|
+
}
|
|
6
63
|
}
|