/**
* 3D Foundation Project
* Copyright 2025 Smithsonian Institution
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import Property from "@ff/graph/Property";
import CustomElement, { customElement, property, PropertyValues, html } from "@ff/ui/CustomElement";
import PropertyBase from "./PropertyBase";
////////////////////////////////////////////////////////////////////////////////
@customElement("sv-property-string")
export default class PropertyString extends PropertyBase
{
type = "string";
@property({ attribute: false })
property: Property = null;
@property({ type: String })
name = "";
protected firstConnected()
{
super.firstConnected();
this.classList.add( "sv-property-string");
}
protected update(changedProperties: PropertyValues): void
{
if (!this.property) {
throw new Error("missing property attribute");
}
if (this.property.type !== "string") {
throw new Error(`not a string property: '${this.property.path}'`);
}
if (changedProperties.has("property")) {
const property = changedProperties.get("property") as Property;
if (property) {
property.off("value", this.onUpdate, this);
}
if (this.property) {
this.property.on("value", this.onUpdate, this);
}
}
super.update(changedProperties);
}
protected onChange = (event: Event) => {
const value = (event.target as HTMLInputElement).value;
this.property.setValue(value);
}
protected render()
{
const property = this.property;
const name = this.name || property.name;
const text = property.value;
return html`${name? html``:null}
{ e.target.select();}}}
@keypress=${(e)=>{if(e.key === "Enter"){e.target.blur();}}}
>
`;
}
}