@hypoth-ui/wc 0.1.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/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/button-MKQKTC5Q.js +10 -0
- package/dist/button-MKQKTC5Q.js.map +1 -0
- package/dist/chunk-4HLM6DBG.js +910 -0
- package/dist/chunk-4HLM6DBG.js.map +1 -0
- package/dist/chunk-55ID7LJL.js +3602 -0
- package/dist/chunk-55ID7LJL.js.map +1 -0
- package/dist/chunk-66HFYJD7.js +86 -0
- package/dist/chunk-66HFYJD7.js.map +1 -0
- package/dist/chunk-CZOXIJVS.js +70 -0
- package/dist/chunk-CZOXIJVS.js.map +1 -0
- package/dist/chunk-DHUM4Q5Y.js +495 -0
- package/dist/chunk-DHUM4Q5Y.js.map +1 -0
- package/dist/chunk-DNNI5BDE.js +1842 -0
- package/dist/chunk-DNNI5BDE.js.map +1 -0
- package/dist/chunk-GXKZ6E6K.js +99 -0
- package/dist/chunk-GXKZ6E6K.js.map +1 -0
- package/dist/chunk-H4GJJZ3N.js +51 -0
- package/dist/chunk-H4GJJZ3N.js.map +1 -0
- package/dist/chunk-JMPTFALJ.js +175 -0
- package/dist/chunk-JMPTFALJ.js.map +1 -0
- package/dist/chunk-MYQWCLUJ.js +45 -0
- package/dist/chunk-MYQWCLUJ.js.map +1 -0
- package/dist/chunk-QZSPWT7L.js +183 -0
- package/dist/chunk-QZSPWT7L.js.map +1 -0
- package/dist/chunk-TSKBQCTR.js +5137 -0
- package/dist/chunk-TSKBQCTR.js.map +1 -0
- package/dist/chunk-TXIIUVL3.js +130 -0
- package/dist/chunk-TXIIUVL3.js.map +1 -0
- package/dist/chunk-UM7WRO7W.js +237 -0
- package/dist/chunk-UM7WRO7W.js.map +1 -0
- package/dist/chunk-VPXL4RB3.js +202 -0
- package/dist/chunk-VPXL4RB3.js.map +1 -0
- package/dist/chunk-VX5CKSMN.js +39 -0
- package/dist/chunk-VX5CKSMN.js.map +1 -0
- package/dist/chunk-WQ5BEP3E.js +2845 -0
- package/dist/chunk-WQ5BEP3E.js.map +1 -0
- package/dist/chunk-YDQ434UH.js +60 -0
- package/dist/chunk-YDQ434UH.js.map +1 -0
- package/dist/chunk-ZWV4VI6D.js +153 -0
- package/dist/chunk-ZWV4VI6D.js.map +1 -0
- package/dist/core.d.ts +127 -0
- package/dist/core.js +38 -0
- package/dist/core.js.map +1 -0
- package/dist/data-display.d.ts +872 -0
- package/dist/data-display.js +57 -0
- package/dist/data-display.js.map +1 -0
- package/dist/ds-element-Db0LMfxI.d.ts +43 -0
- package/dist/feedback.d.ts +292 -0
- package/dist/feedback.js +31 -0
- package/dist/feedback.js.map +1 -0
- package/dist/form-controls.d.ts +1713 -0
- package/dist/form-controls.js +63 -0
- package/dist/form-controls.js.map +1 -0
- package/dist/icon-7IZTJ5WT.js +8 -0
- package/dist/icon-7IZTJ5WT.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +423 -0
- package/dist/index.js.map +1 -0
- package/dist/input-LB6UR37A.js +10 -0
- package/dist/input-LB6UR37A.js.map +1 -0
- package/dist/layout.d.ts +504 -0
- package/dist/layout.js +34 -0
- package/dist/layout.js.map +1 -0
- package/dist/link-NHDJ6SFY.js +9 -0
- package/dist/link-NHDJ6SFY.js.map +1 -0
- package/dist/navigation.d.ts +255 -0
- package/dist/navigation.js +111 -0
- package/dist/navigation.js.map +1 -0
- package/dist/overlays.d.ts +1291 -0
- package/dist/overlays.js +106 -0
- package/dist/overlays.js.map +1 -0
- package/dist/primitives.d.ts +230 -0
- package/dist/primitives.js +26 -0
- package/dist/primitives.js.map +1 -0
- package/dist/registry-Bns0t11H.d.ts +233 -0
- package/dist/skeleton-MUdd2029.d.ts +109 -0
- package/dist/spinner-BWaNlc-Y.d.ts +45 -0
- package/dist/spinner-UIYDUVBZ.js +8 -0
- package/dist/spinner-UIYDUVBZ.js.map +1 -0
- package/dist/stepper-CCRwcQOe.d.ts +851 -0
- package/dist/text-MT3S3EMU.js +8 -0
- package/dist/text-MT3S3EMU.js.map +1 -0
- package/dist/visually-hidden-MW2XY4CS.js +8 -0
- package/dist/visually-hidden-MW2XY4CS.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/dev-warnings.ts"],"sourcesContent":["/**\n * Development Mode Warnings\n *\n * Provides console warnings in development mode for common component misuse.\n * These warnings are stripped in production builds via dead code elimination.\n *\n * ## Warning Codes Reference\n *\n * | Code | Name | Description | Example Fix |\n * |------|------|-------------|-------------|\n * | DS001 | MISSING_REQUIRED_CHILD | A required child element is missing | Add `<ds-dialog-title>` to dialogs |\n * | DS002 | INVALID_PROP_COMBINATION | Two incompatible props used together | Don't use `disabled` with `loading` |\n * | DS003 | ACCESSIBILITY_VIOLATION | ARIA or accessibility issue detected | Add `aria-label` or wrap in `<ds-field>` |\n * | DS004 | DEPRECATED_USAGE | Using deprecated API | Use the suggested replacement |\n * | DS005 | MISSING_CONTEXT | Component needs parent context | Wrap input in `<ds-field>` |\n * | DS006 | INVALID_VALUE | Invalid value for a prop | Use valid variant: \"primary\" | \"secondary\" |\n *\n * ## Production Builds\n *\n * All warnings are automatically stripped in production builds via:\n * - Dead code elimination on `process.env.NODE_ENV !== 'production'` check\n * - Tree-shaking removes the warning utility if unused\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Warning Codes\n// =============================================================================\n\n/**\n * Warning code identifiers\n *\n * - DS001: Required child element is missing (e.g., DialogTitle in Dialog)\n * - DS002: Invalid combination of props (e.g., disabled + loading together)\n * - DS003: Accessibility violation (e.g., missing label on form input)\n * - DS004: Deprecated usage (e.g., old prop name)\n * - DS005: Missing required context (e.g., Input not in Field)\n * - DS006: Invalid value for a prop (e.g., invalid variant name)\n */\nexport const WarningCodes = {\n MISSING_REQUIRED_CHILD: \"DS001\",\n INVALID_PROP_COMBINATION: \"DS002\",\n ACCESSIBILITY_VIOLATION: \"DS003\",\n DEPRECATED_USAGE: \"DS004\",\n MISSING_CONTEXT: \"DS005\",\n INVALID_VALUE: \"DS006\",\n} as const;\n\nexport type WarningCode = keyof typeof WarningCodes;\n\n// =============================================================================\n// Warning Types\n// =============================================================================\n\n/**\n * Dev warning configuration\n */\nexport interface DevWarning {\n /** Warning code identifier */\n code: WarningCode;\n /** Component that emitted the warning */\n component: string;\n /** Warning message */\n message: string;\n /** Suggestion for fixing the issue */\n suggestion?: string;\n /** Additional context data */\n context?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Warning Emission\n// =============================================================================\n\n/**\n * Whether warnings are enabled (only in development)\n */\nconst isDev = typeof process !== \"undefined\" && process.env.NODE_ENV !== \"production\";\n\n/**\n * Set of already-emitted warnings (to avoid duplicate spam)\n */\nconst emittedWarnings = new Set<string>();\n\n/**\n * Emit a development-only warning.\n * Stripped in production builds via dead code elimination.\n *\n * @example\n * ```ts\n * devWarn({\n * code: \"MISSING_REQUIRED_CHILD\",\n * component: \"ds-dialog\",\n * message: \"Missing required ds-dialog-title for accessibility.\",\n * suggestion: \"Add a <ds-dialog-title> element inside the dialog.\",\n * });\n * ```\n */\nexport function devWarn(warning: DevWarning): void {\n if (!isDev) return;\n\n const prefix = `[${warning.component}]`;\n const codeStr = WarningCodes[warning.code];\n const key = `${warning.component}:${warning.code}:${warning.message}`;\n\n // Avoid duplicate warnings\n if (emittedWarnings.has(key)) return;\n emittedWarnings.add(key);\n\n const suggestionText = warning.suggestion ? `\\n💡 ${warning.suggestion}` : \"\";\n const fullMessage = `${prefix} ${warning.message} (${codeStr})${suggestionText}`;\n\n console.warn(fullMessage);\n\n if (warning.context) {\n console.warn(\"Context:\", warning.context);\n }\n}\n\n/**\n * Emit a warning only once per session (by key)\n */\nexport function devWarnOnce(key: string, warning: DevWarning): void {\n if (emittedWarnings.has(key)) return;\n emittedWarnings.add(key);\n devWarn(warning);\n}\n\n/**\n * Clear all emitted warnings (useful for testing)\n */\nexport function clearWarnings(): void {\n emittedWarnings.clear();\n}\n\n// =============================================================================\n// Pre-defined Warnings\n// =============================================================================\n\n/**\n * Pre-defined warnings for common misuse patterns\n */\nexport const Warnings = {\n /**\n * Dialog missing title element\n */\n dialogMissingTitle: (component: string): DevWarning => ({\n code: \"MISSING_REQUIRED_CHILD\",\n component,\n message: \"Missing required ds-dialog-title for accessibility.\",\n suggestion:\n \"Add a <ds-dialog-title> element inside the dialog, or use aria-label on the dialog.\",\n }),\n\n /**\n * Dialog missing description when using title\n */\n dialogMissingDescription: (component: string): DevWarning => ({\n code: \"ACCESSIBILITY_VIOLATION\",\n component,\n message: \"Dialog has title but no description for screen readers.\",\n suggestion:\n \"Add a <ds-dialog-description> element, or use aria-describedby to reference existing content.\",\n }),\n\n /**\n * Input missing accessible label\n */\n inputMissingLabel: (component: string): DevWarning => ({\n code: \"ACCESSIBILITY_VIOLATION\",\n component,\n message: \"Input is missing an accessible label.\",\n suggestion:\n \"Add aria-label, aria-labelledby, or wrap in a <ds-field> with <ds-label>.\",\n }),\n\n /**\n * Invalid variant value\n */\n invalidVariant: (\n component: string,\n variant: string,\n validVariants: string[]\n ): DevWarning => ({\n code: \"INVALID_VALUE\",\n component,\n message: `Invalid variant \"${variant}\".`,\n suggestion: `Use one of: ${validVariants.join(\", \")}.`,\n context: { received: variant, valid: validVariants },\n }),\n\n /**\n * Invalid size value\n */\n invalidSize: (\n component: string,\n size: string,\n validSizes: string[]\n ): DevWarning => ({\n code: \"INVALID_VALUE\",\n component,\n message: `Invalid size \"${size}\".`,\n suggestion: `Use one of: ${validSizes.join(\", \")}.`,\n context: { received: size, valid: validSizes },\n }),\n\n /**\n * Missing form field context\n */\n missingFieldContext: (component: string): DevWarning => ({\n code: \"MISSING_CONTEXT\",\n component,\n message: \"Form input is not wrapped in a <ds-field> context.\",\n suggestion:\n \"Wrap your input in <ds-field> to enable automatic label association and error display.\",\n }),\n\n /**\n * Missing form context\n */\n missingFormContext: (component: string): DevWarning => ({\n code: \"MISSING_CONTEXT\",\n component,\n message: \"Form control is not inside a <ds-form> context.\",\n suggestion:\n \"Wrap your form controls in <ds-form> to enable form-level validation and submission.\",\n }),\n\n /**\n * Deprecated prop usage\n */\n deprecatedProp: (\n component: string,\n oldProp: string,\n newProp: string\n ): DevWarning => ({\n code: \"DEPRECATED_USAGE\",\n component,\n message: `Prop \"${oldProp}\" is deprecated.`,\n suggestion: `Use \"${newProp}\" instead.`,\n context: { deprecated: oldProp, replacement: newProp },\n }),\n\n /**\n * Conflicting props\n */\n conflictingProps: (\n component: string,\n prop1: string,\n prop2: string\n ): DevWarning => ({\n code: \"INVALID_PROP_COMBINATION\",\n component,\n message: `Props \"${prop1}\" and \"${prop2}\" should not be used together.`,\n suggestion: \"Choose one or the other based on your use case.\",\n context: { conflicting: [prop1, prop2] },\n }),\n\n /**\n * Required children missing\n */\n missingRequiredChild: (\n component: string,\n childType: string\n ): DevWarning => ({\n code: \"MISSING_REQUIRED_CHILD\",\n component,\n message: `Missing required child element <${childType}>.`,\n suggestion: `Add a <${childType}> element as a child of <${component}>.`,\n }),\n\n /**\n * Invalid ARIA reference\n */\n invalidAriaReference: (\n component: string,\n attribute: string,\n targetId: string\n ): DevWarning => ({\n code: \"ACCESSIBILITY_VIOLATION\",\n component,\n message: `${attribute} references \"${targetId}\" which does not exist in the document.`,\n suggestion: `Ensure an element with id=\"${targetId}\" exists, or remove the ${attribute} attribute.`,\n context: { attribute, targetId },\n }),\n\n /**\n * Interactive element inside interactive element\n */\n nestedInteractive: (\n component: string,\n childType: string\n ): DevWarning => ({\n code: \"ACCESSIBILITY_VIOLATION\",\n component,\n message: `Interactive element <${childType}> is nested inside another interactive element.`,\n suggestion:\n \"Avoid nesting interactive elements. Screen readers may not announce them correctly.\",\n context: { nestedElement: childType },\n }),\n};\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\n/**\n * Validate a prop value against a list of valid values\n */\nexport function validateProp<T extends string>(\n component: string,\n propName: string,\n value: T | undefined,\n validValues: readonly T[]\n): boolean {\n if (value !== undefined && !validValues.includes(value)) {\n if (propName === \"variant\") {\n devWarn(Warnings.invalidVariant(component, value, [...validValues]));\n } else if (propName === \"size\") {\n devWarn(Warnings.invalidSize(component, value, [...validValues]));\n } else {\n devWarn({\n code: \"INVALID_VALUE\",\n component,\n message: `Invalid ${propName} \"${value}\".`,\n suggestion: `Use one of: ${validValues.join(\", \")}.`,\n });\n }\n return false;\n }\n return true;\n}\n\n/**\n * Check if an element has an accessible label\n */\nexport function hasAccessibleLabel(element: HTMLElement): boolean {\n return !!(\n element.getAttribute(\"aria-label\") ||\n element.getAttribute(\"aria-labelledby\") ||\n element.getAttribute(\"title\") ||\n (element as HTMLInputElement).labels?.length\n );\n}\n\n/**\n * Check if a required child element exists\n */\nexport function hasRequiredChild(\n parent: HTMLElement,\n selector: string\n): boolean {\n return parent.querySelector(selector) !== null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DSElement,
|
|
3
|
+
__decorateClass,
|
|
4
|
+
define
|
|
5
|
+
} from "./chunk-H4GJJZ3N.js";
|
|
6
|
+
|
|
7
|
+
// src/components/spinner/spinner.ts
|
|
8
|
+
import { html } from "lit";
|
|
9
|
+
import { property } from "lit/decorators.js";
|
|
10
|
+
import { classMap } from "lit/directives/class-map.js";
|
|
11
|
+
var DsSpinner = class extends DSElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.size = "md";
|
|
15
|
+
this.label = "Loading";
|
|
16
|
+
}
|
|
17
|
+
static {
|
|
18
|
+
this.styles = [];
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
const classes = {
|
|
22
|
+
"ds-spinner": true,
|
|
23
|
+
[`ds-spinner--${this.size}`]: true
|
|
24
|
+
};
|
|
25
|
+
return html`
|
|
26
|
+
<span
|
|
27
|
+
class=${classMap(classes)}
|
|
28
|
+
role="status"
|
|
29
|
+
aria-label=${this.label}
|
|
30
|
+
></span>
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
__decorateClass([
|
|
35
|
+
property({ type: String, reflect: true })
|
|
36
|
+
], DsSpinner.prototype, "size", 2);
|
|
37
|
+
__decorateClass([
|
|
38
|
+
property({ type: String })
|
|
39
|
+
], DsSpinner.prototype, "label", 2);
|
|
40
|
+
define("ds-spinner", DsSpinner);
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
DsSpinner
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunk-MYQWCLUJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/spinner/spinner.ts"],"sourcesContent":["import { type TemplateResult, html } from \"lit\";\nimport { property } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { define } from \"../../registry/define.js\";\n\nexport type SpinnerSize = \"sm\" | \"md\" | \"lg\";\n\n/**\n * A loading spinner component with accessibility support.\n *\n * Automatically respects prefers-reduced-motion by replacing\n * rotation with an opacity pulse animation.\n *\n * @element ds-spinner\n *\n * @example\n * ```html\n * <ds-spinner label=\"Loading content\"></ds-spinner>\n * ```\n *\n * @example\n * ```html\n * <!-- In a loading region -->\n * <div aria-busy=\"true\">\n * <ds-spinner label=\"Fetching data\"></ds-spinner>\n * </div>\n * ```\n */\nexport class DsSpinner extends DSElement {\n static override styles = [];\n\n /**\n * The spinner size.\n */\n @property({ type: String, reflect: true })\n size: SpinnerSize = \"md\";\n\n /**\n * Accessible label for the spinner.\n * Announced by screen readers to indicate loading state.\n */\n @property({ type: String })\n label = \"Loading\";\n\n override render(): TemplateResult {\n const classes = {\n \"ds-spinner\": true,\n [`ds-spinner--${this.size}`]: true,\n };\n\n return html`\n <span\n class=${classMap(classes)}\n role=\"status\"\n aria-label=${this.label}\n ></span>\n `;\n }\n}\n\n// Register the component\ndefine(\"ds-spinner\", DsSpinner);\n\n// TypeScript declaration for HTML\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-spinner\": DsSpinner;\n }\n}\n"],"mappings":";;;;;;;AAAA,SAA8B,YAAY;AAC1C,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AA2BlB,IAAM,YAAN,cAAwB,UAAU;AAAA,EAAlC;AAAA;AAOL,gBAAoB;AAOpB,iBAAQ;AAAA;AAAA,EAbR;AAAA,SAAgB,SAAS,CAAC;AAAA;AAAA,EAejB,SAAyB;AAChC,UAAM,UAAU;AAAA,MACd,cAAc;AAAA,MACd,CAAC,eAAe,KAAK,IAAI,EAAE,GAAG;AAAA,IAChC;AAEA,WAAO;AAAA;AAAA,gBAEK,SAAS,OAAO,CAAC;AAAA;AAAA,qBAEZ,KAAK,KAAK;AAAA;AAAA;AAAA,EAG7B;AACF;AAvBE;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC;AAAA,GAN9B,UAOX;AAOA;AAAA,EADC,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAbf,UAcX;AAmBF,OAAO,cAAc,SAAS;","names":[]}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Warnings,
|
|
3
|
+
devWarn,
|
|
4
|
+
hasAccessibleLabel
|
|
5
|
+
} from "./chunk-JMPTFALJ.js";
|
|
6
|
+
import {
|
|
7
|
+
StandardEvents,
|
|
8
|
+
emitEvent
|
|
9
|
+
} from "./chunk-YDQ434UH.js";
|
|
10
|
+
import {
|
|
11
|
+
DSElement,
|
|
12
|
+
__decorateClass,
|
|
13
|
+
define
|
|
14
|
+
} from "./chunk-H4GJJZ3N.js";
|
|
15
|
+
|
|
16
|
+
// src/components/input/input.ts
|
|
17
|
+
import { html } from "lit";
|
|
18
|
+
import { property, state } from "lit/decorators.js";
|
|
19
|
+
import { ifDefined } from "lit/directives/if-defined.js";
|
|
20
|
+
var DsInput = class extends DSElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
this.type = "text";
|
|
24
|
+
this.size = "md";
|
|
25
|
+
this.name = "";
|
|
26
|
+
this.value = "";
|
|
27
|
+
this.placeholder = "";
|
|
28
|
+
this.disabled = false;
|
|
29
|
+
this.readonly = false;
|
|
30
|
+
this.required = false;
|
|
31
|
+
this.error = false;
|
|
32
|
+
this.attributeObserver = null;
|
|
33
|
+
}
|
|
34
|
+
connectedCallback() {
|
|
35
|
+
super.connectedCallback();
|
|
36
|
+
this.attributeObserver = new MutationObserver((mutations) => {
|
|
37
|
+
for (const mutation of mutations) {
|
|
38
|
+
if (mutation.type === "attributes") {
|
|
39
|
+
this.syncAriaAttributes();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
this.attributeObserver.observe(this, {
|
|
44
|
+
attributes: true,
|
|
45
|
+
attributeFilter: [
|
|
46
|
+
"aria-labelledby",
|
|
47
|
+
"aria-describedby",
|
|
48
|
+
"aria-invalid",
|
|
49
|
+
"aria-required",
|
|
50
|
+
"aria-disabled"
|
|
51
|
+
]
|
|
52
|
+
});
|
|
53
|
+
this.syncAriaAttributes();
|
|
54
|
+
requestAnimationFrame(() => {
|
|
55
|
+
if (!hasAccessibleLabel(this)) {
|
|
56
|
+
const field = this.closest("ds-field");
|
|
57
|
+
const hasFieldLabel = field?.querySelector("ds-label") !== null;
|
|
58
|
+
if (!hasFieldLabel) {
|
|
59
|
+
devWarn(Warnings.inputMissingLabel("ds-input"));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
disconnectedCallback() {
|
|
65
|
+
super.disconnectedCallback();
|
|
66
|
+
this.attributeObserver?.disconnect();
|
|
67
|
+
this.attributeObserver = null;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Syncs ARIA attributes from the host element to internal state.
|
|
71
|
+
* The render method will apply these to the native input.
|
|
72
|
+
*/
|
|
73
|
+
syncAriaAttributes() {
|
|
74
|
+
this.ariaLabelledBy = this.getAttribute("aria-labelledby") ?? void 0;
|
|
75
|
+
this.ariaDescribedBy = this.getAttribute("aria-describedby") ?? void 0;
|
|
76
|
+
const ariaInvalid = this.getAttribute("aria-invalid");
|
|
77
|
+
if (ariaInvalid === "true") {
|
|
78
|
+
this.error = true;
|
|
79
|
+
} else if (ariaInvalid === "false") {
|
|
80
|
+
this.error = false;
|
|
81
|
+
}
|
|
82
|
+
const ariaRequired = this.getAttribute("aria-required");
|
|
83
|
+
if (ariaRequired === "true") {
|
|
84
|
+
this.required = true;
|
|
85
|
+
}
|
|
86
|
+
const ariaDisabled = this.getAttribute("aria-disabled");
|
|
87
|
+
if (ariaDisabled === "true") {
|
|
88
|
+
this.disabled = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
handleInput(event) {
|
|
92
|
+
const input = event.target;
|
|
93
|
+
this.value = input.value;
|
|
94
|
+
this.dispatchEvent(
|
|
95
|
+
new CustomEvent("input", {
|
|
96
|
+
detail: { value: this.value },
|
|
97
|
+
bubbles: true,
|
|
98
|
+
composed: true
|
|
99
|
+
})
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
handleChange(event) {
|
|
103
|
+
const input = event.target;
|
|
104
|
+
this.value = input.value;
|
|
105
|
+
emitEvent(this, StandardEvents.CHANGE, {
|
|
106
|
+
detail: { value: this.value }
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
render() {
|
|
110
|
+
return html`
|
|
111
|
+
<div class="ds-input" part="container" data-size=${this.size}>
|
|
112
|
+
<input
|
|
113
|
+
part="input"
|
|
114
|
+
class="ds-input__field"
|
|
115
|
+
type=${this.type}
|
|
116
|
+
name=${this.name}
|
|
117
|
+
.value=${this.value}
|
|
118
|
+
placeholder=${this.placeholder}
|
|
119
|
+
?disabled=${this.disabled}
|
|
120
|
+
?readonly=${this.readonly}
|
|
121
|
+
?required=${this.required}
|
|
122
|
+
aria-invalid=${this.error ? "true" : "false"}
|
|
123
|
+
aria-labelledby=${ifDefined(this.ariaLabelledBy)}
|
|
124
|
+
aria-describedby=${ifDefined(this.ariaDescribedBy)}
|
|
125
|
+
aria-required=${this.required ? "true" : "false"}
|
|
126
|
+
minlength=${this.minlength ?? ""}
|
|
127
|
+
maxlength=${this.maxlength ?? ""}
|
|
128
|
+
pattern=${this.pattern ?? ""}
|
|
129
|
+
@input=${this.handleInput}
|
|
130
|
+
@change=${this.handleChange}
|
|
131
|
+
/>
|
|
132
|
+
</div>
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
__decorateClass([
|
|
137
|
+
property({ type: String, reflect: true })
|
|
138
|
+
], DsInput.prototype, "type", 2);
|
|
139
|
+
__decorateClass([
|
|
140
|
+
property({ type: String, reflect: true })
|
|
141
|
+
], DsInput.prototype, "size", 2);
|
|
142
|
+
__decorateClass([
|
|
143
|
+
property({ type: String, reflect: true })
|
|
144
|
+
], DsInput.prototype, "name", 2);
|
|
145
|
+
__decorateClass([
|
|
146
|
+
property({ type: String })
|
|
147
|
+
], DsInput.prototype, "value", 2);
|
|
148
|
+
__decorateClass([
|
|
149
|
+
property({ type: String })
|
|
150
|
+
], DsInput.prototype, "placeholder", 2);
|
|
151
|
+
__decorateClass([
|
|
152
|
+
property({ type: Boolean, reflect: true })
|
|
153
|
+
], DsInput.prototype, "disabled", 2);
|
|
154
|
+
__decorateClass([
|
|
155
|
+
property({ type: Boolean, reflect: true })
|
|
156
|
+
], DsInput.prototype, "readonly", 2);
|
|
157
|
+
__decorateClass([
|
|
158
|
+
property({ type: Boolean, reflect: true })
|
|
159
|
+
], DsInput.prototype, "required", 2);
|
|
160
|
+
__decorateClass([
|
|
161
|
+
property({ type: Boolean, reflect: true })
|
|
162
|
+
], DsInput.prototype, "error", 2);
|
|
163
|
+
__decorateClass([
|
|
164
|
+
property({ type: Number })
|
|
165
|
+
], DsInput.prototype, "minlength", 2);
|
|
166
|
+
__decorateClass([
|
|
167
|
+
property({ type: Number })
|
|
168
|
+
], DsInput.prototype, "maxlength", 2);
|
|
169
|
+
__decorateClass([
|
|
170
|
+
property({ type: String })
|
|
171
|
+
], DsInput.prototype, "pattern", 2);
|
|
172
|
+
__decorateClass([
|
|
173
|
+
state()
|
|
174
|
+
], DsInput.prototype, "ariaLabelledBy", 2);
|
|
175
|
+
__decorateClass([
|
|
176
|
+
state()
|
|
177
|
+
], DsInput.prototype, "ariaDescribedBy", 2);
|
|
178
|
+
define("ds-input", DsInput);
|
|
179
|
+
|
|
180
|
+
export {
|
|
181
|
+
DsInput
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=chunk-QZSPWT7L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/input/input.ts"],"sourcesContent":["import { html } from \"lit\";\nimport { property, state } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { DSElement } from \"../../base/ds-element.js\";\nimport { StandardEvents, emitEvent } from \"../../events/emit.js\";\nimport { define } from \"../../registry/define.js\";\nimport { devWarn, hasAccessibleLabel, Warnings } from \"../../utils/dev-warnings.js\";\n\nexport type InputType = \"text\" | \"email\" | \"password\" | \"number\" | \"tel\" | \"url\" | \"search\";\nexport type InputSize = \"sm\" | \"md\" | \"lg\";\n\n/**\n * A text input field component.\n *\n * @element ds-input\n * @fires input - Fired when the input value changes\n * @fires change - Fired when the input value is committed\n *\n * @example\n * ```html\n * <ds-field>\n * <ds-label>Email</ds-label>\n * <ds-input type=\"email\" name=\"email\"></ds-input>\n * </ds-field>\n * ```\n */\nexport class DsInput extends DSElement {\n /** Input type */\n @property({ type: String, reflect: true })\n type: InputType = \"text\";\n\n /** Input size */\n @property({ type: String, reflect: true })\n size: InputSize = \"md\";\n\n /** Input name */\n @property({ type: String, reflect: true })\n name = \"\";\n\n /** Input value */\n @property({ type: String })\n value = \"\";\n\n /** Placeholder text */\n @property({ type: String })\n placeholder = \"\";\n\n /** Disabled state */\n @property({ type: Boolean, reflect: true })\n disabled = false;\n\n /** Read-only state */\n @property({ type: Boolean, reflect: true })\n readonly = false;\n\n /** Required state */\n @property({ type: Boolean, reflect: true })\n required = false;\n\n /** Error state */\n @property({ type: Boolean, reflect: true })\n error = false;\n\n /** Minimum length */\n @property({ type: Number })\n minlength?: number;\n\n /** Maximum length */\n @property({ type: Number })\n maxlength?: number;\n\n /** Pattern for validation */\n @property({ type: String })\n pattern?: string;\n\n /** ARIA labelledby - ID of element that labels this input */\n @state()\n private ariaLabelledBy?: string;\n\n /** ARIA describedby - IDs of elements that describe this input */\n @state()\n private ariaDescribedBy?: string;\n\n private attributeObserver: MutationObserver | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n // Observe ARIA attribute changes on the host element\n this.attributeObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === \"attributes\") {\n this.syncAriaAttributes();\n }\n }\n });\n\n this.attributeObserver.observe(this, {\n attributes: true,\n attributeFilter: [\n \"aria-labelledby\",\n \"aria-describedby\",\n \"aria-invalid\",\n \"aria-required\",\n \"aria-disabled\",\n ],\n });\n\n // Initial sync\n this.syncAriaAttributes();\n\n // Dev warning: Check for accessible label after DOM is ready\n requestAnimationFrame(() => {\n if (!hasAccessibleLabel(this)) {\n // Also check if inside a ds-field with a label\n const field = this.closest(\"ds-field\");\n const hasFieldLabel = field?.querySelector(\"ds-label\") !== null;\n if (!hasFieldLabel) {\n devWarn(Warnings.inputMissingLabel(\"ds-input\"));\n }\n }\n });\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.attributeObserver?.disconnect();\n this.attributeObserver = null;\n }\n\n /**\n * Syncs ARIA attributes from the host element to internal state.\n * The render method will apply these to the native input.\n */\n private syncAriaAttributes(): void {\n this.ariaLabelledBy = this.getAttribute(\"aria-labelledby\") ?? undefined;\n this.ariaDescribedBy = this.getAttribute(\"aria-describedby\") ?? undefined;\n\n // Sync error state from aria-invalid\n const ariaInvalid = this.getAttribute(\"aria-invalid\");\n if (ariaInvalid === \"true\") {\n this.error = true;\n } else if (ariaInvalid === \"false\") {\n this.error = false;\n }\n\n // Sync required state from aria-required\n const ariaRequired = this.getAttribute(\"aria-required\");\n if (ariaRequired === \"true\") {\n this.required = true;\n }\n\n // Sync disabled state from aria-disabled\n const ariaDisabled = this.getAttribute(\"aria-disabled\");\n if (ariaDisabled === \"true\") {\n this.disabled = true;\n }\n }\n\n private handleInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n // Also emit native input event for compatibility\n this.dispatchEvent(\n new CustomEvent(\"input\", {\n detail: { value: this.value },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private handleChange(event: Event) {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n // Emit ds:change event using standard convention\n emitEvent(this, StandardEvents.CHANGE, {\n detail: { value: this.value },\n });\n }\n\n override render() {\n return html`\n <div class=\"ds-input\" part=\"container\" data-size=${this.size}>\n <input\n part=\"input\"\n class=\"ds-input__field\"\n type=${this.type}\n name=${this.name}\n .value=${this.value}\n placeholder=${this.placeholder}\n ?disabled=${this.disabled}\n ?readonly=${this.readonly}\n ?required=${this.required}\n aria-invalid=${this.error ? \"true\" : \"false\"}\n aria-labelledby=${ifDefined(this.ariaLabelledBy)}\n aria-describedby=${ifDefined(this.ariaDescribedBy)}\n aria-required=${this.required ? \"true\" : \"false\"}\n minlength=${this.minlength ?? \"\"}\n maxlength=${this.maxlength ?? \"\"}\n pattern=${this.pattern ?? \"\"}\n @input=${this.handleInput}\n @change=${this.handleChange}\n />\n </div>\n `;\n }\n}\n\ndefine(\"ds-input\", DsInput);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ds-input\": DsInput;\n }\n}\n"],"mappings":"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","names":[]}
|