tyrell-components 1.0.0-TC7
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 +221 -0
- package/css/tyrell.css +1783 -0
- package/dist/tyrell.css +1783 -0
- package/dist/tyrell.js +2 -0
- package/lib/base/ty-component.d.ts +133 -0
- package/lib/base/ty-component.d.ts.map +1 -0
- package/lib/base/ty-component.js +297 -0
- package/lib/base/ty-component.js.map +1 -0
- package/lib/components/button.d.ts +126 -0
- package/lib/components/button.d.ts.map +1 -0
- package/lib/components/button.js +244 -0
- package/lib/components/button.js.map +1 -0
- package/lib/components/calendar-month.d.ts +132 -0
- package/lib/components/calendar-month.d.ts.map +1 -0
- package/lib/components/calendar-month.js +440 -0
- package/lib/components/calendar-month.js.map +1 -0
- package/lib/components/calendar-navigation.d.ts +137 -0
- package/lib/components/calendar-navigation.d.ts.map +1 -0
- package/lib/components/calendar-navigation.js +366 -0
- package/lib/components/calendar-navigation.js.map +1 -0
- package/lib/components/calendar.d.ts +166 -0
- package/lib/components/calendar.d.ts.map +1 -0
- package/lib/components/calendar.js +774 -0
- package/lib/components/calendar.js.map +1 -0
- package/lib/components/checkbox.d.ts +189 -0
- package/lib/components/checkbox.d.ts.map +1 -0
- package/lib/components/checkbox.js +400 -0
- package/lib/components/checkbox.js.map +1 -0
- package/lib/components/copy.d.ts +180 -0
- package/lib/components/copy.d.ts.map +1 -0
- package/lib/components/copy.js +393 -0
- package/lib/components/copy.js.map +1 -0
- package/lib/components/date-picker.d.ts +379 -0
- package/lib/components/date-picker.d.ts.map +1 -0
- package/lib/components/date-picker.js +1586 -0
- package/lib/components/date-picker.js.map +1 -0
- package/lib/components/dropdown.d.ts +402 -0
- package/lib/components/dropdown.d.ts.map +1 -0
- package/lib/components/dropdown.js +1564 -0
- package/lib/components/dropdown.js.map +1 -0
- package/lib/components/icon.d.ts +107 -0
- package/lib/components/icon.d.ts.map +1 -0
- package/lib/components/icon.js +230 -0
- package/lib/components/icon.js.map +1 -0
- package/lib/components/input.d.ts +270 -0
- package/lib/components/input.d.ts.map +1 -0
- package/lib/components/input.js +721 -0
- package/lib/components/input.js.map +1 -0
- package/lib/components/modal.d.ts +58 -0
- package/lib/components/modal.d.ts.map +1 -0
- package/lib/components/modal.js +473 -0
- package/lib/components/modal.js.map +1 -0
- package/lib/components/multiselect.d.ts +397 -0
- package/lib/components/multiselect.d.ts.map +1 -0
- package/lib/components/multiselect.js +1580 -0
- package/lib/components/multiselect.js.map +1 -0
- package/lib/components/option.d.ts +66 -0
- package/lib/components/option.d.ts.map +1 -0
- package/lib/components/option.js +314 -0
- package/lib/components/option.js.map +1 -0
- package/lib/components/popup.d.ts +43 -0
- package/lib/components/popup.d.ts.map +1 -0
- package/lib/components/popup.js +380 -0
- package/lib/components/popup.js.map +1 -0
- package/lib/components/radio.d.ts +198 -0
- package/lib/components/radio.d.ts.map +1 -0
- package/lib/components/radio.js +437 -0
- package/lib/components/radio.js.map +1 -0
- package/lib/components/resize-observer.d.ts +48 -0
- package/lib/components/resize-observer.d.ts.map +1 -0
- package/lib/components/resize-observer.js +108 -0
- package/lib/components/resize-observer.js.map +1 -0
- package/lib/components/scroll-container.d.ts +51 -0
- package/lib/components/scroll-container.d.ts.map +1 -0
- package/lib/components/scroll-container.js +239 -0
- package/lib/components/scroll-container.js.map +1 -0
- package/lib/components/step.d.ts +26 -0
- package/lib/components/step.d.ts.map +1 -0
- package/lib/components/step.js +75 -0
- package/lib/components/step.js.map +1 -0
- package/lib/components/switch.d.ts +111 -0
- package/lib/components/switch.d.ts.map +1 -0
- package/lib/components/switch.js +240 -0
- package/lib/components/switch.js.map +1 -0
- package/lib/components/tab.d.ts +23 -0
- package/lib/components/tab.d.ts.map +1 -0
- package/lib/components/tab.js +76 -0
- package/lib/components/tab.js.map +1 -0
- package/lib/components/tabs.d.ts +93 -0
- package/lib/components/tabs.d.ts.map +1 -0
- package/lib/components/tabs.js +653 -0
- package/lib/components/tabs.js.map +1 -0
- package/lib/components/tag.d.ts +144 -0
- package/lib/components/tag.d.ts.map +1 -0
- package/lib/components/tag.js +314 -0
- package/lib/components/tag.js.map +1 -0
- package/lib/components/textarea.d.ts +241 -0
- package/lib/components/textarea.d.ts.map +1 -0
- package/lib/components/textarea.js +585 -0
- package/lib/components/textarea.js.map +1 -0
- package/lib/components/tooltip.d.ts +40 -0
- package/lib/components/tooltip.d.ts.map +1 -0
- package/lib/components/tooltip.js +439 -0
- package/lib/components/tooltip.js.map +1 -0
- package/lib/components/wizard.d.ts +86 -0
- package/lib/components/wizard.d.ts.map +1 -0
- package/lib/components/wizard.js +636 -0
- package/lib/components/wizard.js.map +1 -0
- package/lib/icons/fontawesome/brands.d.ts +557 -0
- package/lib/icons/fontawesome/brands.d.ts.map +1 -0
- package/lib/icons/fontawesome/brands.js +557 -0
- package/lib/icons/fontawesome/brands.js.map +1 -0
- package/lib/icons/fontawesome/regular.d.ts +281 -0
- package/lib/icons/fontawesome/regular.d.ts.map +1 -0
- package/lib/icons/fontawesome/regular.js +281 -0
- package/lib/icons/fontawesome/regular.js.map +1 -0
- package/lib/icons/fontawesome/solid.d.ts +1992 -0
- package/lib/icons/fontawesome/solid.d.ts.map +1 -0
- package/lib/icons/fontawesome/solid.js +1992 -0
- package/lib/icons/fontawesome/solid.js.map +1 -0
- package/lib/icons/heroicons/micro.d.ts +324 -0
- package/lib/icons/heroicons/micro.d.ts.map +1 -0
- package/lib/icons/heroicons/micro.js +1032 -0
- package/lib/icons/heroicons/micro.js.map +1 -0
- package/lib/icons/heroicons/mini.d.ts +332 -0
- package/lib/icons/heroicons/mini.d.ts.map +1 -0
- package/lib/icons/heroicons/mini.js +1038 -0
- package/lib/icons/heroicons/mini.js.map +1 -0
- package/lib/icons/heroicons/outline.d.ts +332 -0
- package/lib/icons/heroicons/outline.d.ts.map +1 -0
- package/lib/icons/heroicons/outline.js +993 -0
- package/lib/icons/heroicons/outline.js.map +1 -0
- package/lib/icons/heroicons/solid.d.ts +332 -0
- package/lib/icons/heroicons/solid.d.ts.map +1 -0
- package/lib/icons/heroicons/solid.js +1063 -0
- package/lib/icons/heroicons/solid.js.map +1 -0
- package/lib/icons/lucide.d.ts +1872 -0
- package/lib/icons/lucide.d.ts.map +1 -0
- package/lib/icons/lucide.js +28212 -0
- package/lib/icons/lucide.js.map +1 -0
- package/lib/icons/material/filled.d.ts +2180 -0
- package/lib/icons/material/filled.d.ts.map +1 -0
- package/lib/icons/material/filled.js +14003 -0
- package/lib/icons/material/filled.js.map +1 -0
- package/lib/icons/material/outlined.d.ts +2142 -0
- package/lib/icons/material/outlined.d.ts.map +1 -0
- package/lib/icons/material/outlined.js +14545 -0
- package/lib/icons/material/outlined.js.map +1 -0
- package/lib/icons/material/round.d.ts +2147 -0
- package/lib/icons/material/round.d.ts.map +1 -0
- package/lib/icons/material/round.js +14779 -0
- package/lib/icons/material/round.js.map +1 -0
- package/lib/icons/material/sharp.d.ts +2147 -0
- package/lib/icons/material/sharp.d.ts.map +1 -0
- package/lib/icons/material/sharp.js +14189 -0
- package/lib/icons/material/sharp.js.map +1 -0
- package/lib/icons/material/two-tone.d.ts +2185 -0
- package/lib/icons/material/two-tone.d.ts.map +1 -0
- package/lib/icons/material/two-tone.js +17152 -0
- package/lib/icons/material/two-tone.js.map +1 -0
- package/lib/index.d.ts +78 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +71 -0
- package/lib/index.js.map +1 -0
- package/lib/styles/button.d.ts +14 -0
- package/lib/styles/button.d.ts.map +1 -0
- package/lib/styles/button.js +457 -0
- package/lib/styles/button.js.map +1 -0
- package/lib/styles/calendar-month.d.ts +6 -0
- package/lib/styles/calendar-month.d.ts.map +1 -0
- package/lib/styles/calendar-month.js +229 -0
- package/lib/styles/calendar-month.js.map +1 -0
- package/lib/styles/calendar-navigation.d.ts +6 -0
- package/lib/styles/calendar-navigation.d.ts.map +1 -0
- package/lib/styles/calendar-navigation.js +125 -0
- package/lib/styles/calendar-navigation.js.map +1 -0
- package/lib/styles/calendar.d.ts +6 -0
- package/lib/styles/calendar.d.ts.map +1 -0
- package/lib/styles/calendar.js +28 -0
- package/lib/styles/calendar.js.map +1 -0
- package/lib/styles/checkbox.d.ts +9 -0
- package/lib/styles/checkbox.d.ts.map +1 -0
- package/lib/styles/checkbox.js +19 -0
- package/lib/styles/checkbox.js.map +1 -0
- package/lib/styles/copy.d.ts +7 -0
- package/lib/styles/copy.d.ts.map +1 -0
- package/lib/styles/copy.js +94 -0
- package/lib/styles/copy.js.map +1 -0
- package/lib/styles/custom-scrollbar.d.ts +6 -0
- package/lib/styles/custom-scrollbar.d.ts.map +1 -0
- package/lib/styles/custom-scrollbar.js +157 -0
- package/lib/styles/custom-scrollbar.js.map +1 -0
- package/lib/styles/date-picker.d.ts +6 -0
- package/lib/styles/date-picker.d.ts.map +1 -0
- package/lib/styles/date-picker.js +400 -0
- package/lib/styles/date-picker.js.map +1 -0
- package/lib/styles/dropdown.d.ts +12 -0
- package/lib/styles/dropdown.d.ts.map +1 -0
- package/lib/styles/dropdown.js +983 -0
- package/lib/styles/dropdown.js.map +1 -0
- package/lib/styles/icon.d.ts +6 -0
- package/lib/styles/icon.d.ts.map +1 -0
- package/lib/styles/icon.js +231 -0
- package/lib/styles/icon.js.map +1 -0
- package/lib/styles/input.d.ts +7 -0
- package/lib/styles/input.d.ts.map +1 -0
- package/lib/styles/input.js +685 -0
- package/lib/styles/input.js.map +1 -0
- package/lib/styles/modal.d.ts +8 -0
- package/lib/styles/modal.d.ts.map +1 -0
- package/lib/styles/modal.js +134 -0
- package/lib/styles/modal.js.map +1 -0
- package/lib/styles/multiselect.d.ts +6 -0
- package/lib/styles/multiselect.d.ts.map +1 -0
- package/lib/styles/multiselect.js +774 -0
- package/lib/styles/multiselect.js.map +1 -0
- package/lib/styles/option.d.ts +6 -0
- package/lib/styles/option.d.ts.map +1 -0
- package/lib/styles/option.js +116 -0
- package/lib/styles/option.js.map +1 -0
- package/lib/styles/popup.d.ts +8 -0
- package/lib/styles/popup.d.ts.map +1 -0
- package/lib/styles/popup.js +95 -0
- package/lib/styles/popup.js.map +1 -0
- package/lib/styles/radio.d.ts +8 -0
- package/lib/styles/radio.d.ts.map +1 -0
- package/lib/styles/radio.js +160 -0
- package/lib/styles/radio.js.map +1 -0
- package/lib/styles/resize-observer.d.ts +6 -0
- package/lib/styles/resize-observer.d.ts.map +1 -0
- package/lib/styles/resize-observer.js +18 -0
- package/lib/styles/resize-observer.js.map +1 -0
- package/lib/styles/scroll-container.d.ts +6 -0
- package/lib/styles/scroll-container.d.ts.map +1 -0
- package/lib/styles/scroll-container.js +198 -0
- package/lib/styles/scroll-container.js.map +1 -0
- package/lib/styles/step.d.ts +5 -0
- package/lib/styles/step.d.ts.map +1 -0
- package/lib/styles/step.js +50 -0
- package/lib/styles/step.js.map +1 -0
- package/lib/styles/switch.d.ts +9 -0
- package/lib/styles/switch.d.ts.map +1 -0
- package/lib/styles/switch.js +100 -0
- package/lib/styles/switch.js.map +1 -0
- package/lib/styles/tab.d.ts +5 -0
- package/lib/styles/tab.d.ts.map +1 -0
- package/lib/styles/tab.js +51 -0
- package/lib/styles/tab.js.map +1 -0
- package/lib/styles/tabs.d.ts +13 -0
- package/lib/styles/tabs.d.ts.map +1 -0
- package/lib/styles/tabs.js +184 -0
- package/lib/styles/tabs.js.map +1 -0
- package/lib/styles/tag.d.ts +6 -0
- package/lib/styles/tag.d.ts.map +1 -0
- package/lib/styles/tag.js +415 -0
- package/lib/styles/tag.js.map +1 -0
- package/lib/styles/textarea.d.ts +6 -0
- package/lib/styles/textarea.d.ts.map +1 -0
- package/lib/styles/textarea.js +350 -0
- package/lib/styles/textarea.js.map +1 -0
- package/lib/styles/tooltip.d.ts +9 -0
- package/lib/styles/tooltip.d.ts.map +1 -0
- package/lib/styles/tooltip.js +136 -0
- package/lib/styles/tooltip.js.map +1 -0
- package/lib/styles/wizard.d.ts +25 -0
- package/lib/styles/wizard.d.ts.map +1 -0
- package/lib/styles/wizard.js +325 -0
- package/lib/styles/wizard.js.map +1 -0
- package/lib/types/common.d.ts +143 -0
- package/lib/types/common.d.ts.map +1 -0
- package/lib/types/common.js +5 -0
- package/lib/types/common.js.map +1 -0
- package/lib/utils/calendar-utils.d.ts +176 -0
- package/lib/utils/calendar-utils.d.ts.map +1 -0
- package/lib/utils/calendar-utils.js +370 -0
- package/lib/utils/calendar-utils.js.map +1 -0
- package/lib/utils/custom-scrollbar.d.ts +82 -0
- package/lib/utils/custom-scrollbar.d.ts.map +1 -0
- package/lib/utils/custom-scrollbar.js +320 -0
- package/lib/utils/custom-scrollbar.js.map +1 -0
- package/lib/utils/icon-registry.d.ts +78 -0
- package/lib/utils/icon-registry.d.ts.map +1 -0
- package/lib/utils/icon-registry.js +304 -0
- package/lib/utils/icon-registry.js.map +1 -0
- package/lib/utils/locale.d.ts +136 -0
- package/lib/utils/locale.d.ts.map +1 -0
- package/lib/utils/locale.js +213 -0
- package/lib/utils/locale.js.map +1 -0
- package/lib/utils/mobile.d.ts +14 -0
- package/lib/utils/mobile.d.ts.map +1 -0
- package/lib/utils/mobile.js +21 -0
- package/lib/utils/mobile.js.map +1 -0
- package/lib/utils/number-format.d.ts +83 -0
- package/lib/utils/number-format.d.ts.map +1 -0
- package/lib/utils/number-format.js +143 -0
- package/lib/utils/number-format.js.map +1 -0
- package/lib/utils/parse-boolean.d.ts +39 -0
- package/lib/utils/parse-boolean.d.ts.map +1 -0
- package/lib/utils/parse-boolean.js +58 -0
- package/lib/utils/parse-boolean.js.map +1 -0
- package/lib/utils/positioning.d.ts +143 -0
- package/lib/utils/positioning.d.ts.map +1 -0
- package/lib/utils/positioning.js +308 -0
- package/lib/utils/positioning.js.map +1 -0
- package/lib/utils/property-capture.d.ts +132 -0
- package/lib/utils/property-capture.d.ts.map +1 -0
- package/lib/utils/property-capture.js +152 -0
- package/lib/utils/property-capture.js.map +1 -0
- package/lib/utils/property-manager.d.ts +90 -0
- package/lib/utils/property-manager.d.ts.map +1 -0
- package/lib/utils/property-manager.js +197 -0
- package/lib/utils/property-manager.js.map +1 -0
- package/lib/utils/resize-observer.d.ts +42 -0
- package/lib/utils/resize-observer.d.ts.map +1 -0
- package/lib/utils/resize-observer.js +71 -0
- package/lib/utils/resize-observer.js.map +1 -0
- package/lib/utils/scroll-lock.d.ts +79 -0
- package/lib/utils/scroll-lock.d.ts.map +1 -0
- package/lib/utils/scroll-lock.js +197 -0
- package/lib/utils/scroll-lock.js.map +1 -0
- package/lib/utils/styles.d.ts +27 -0
- package/lib/utils/styles.d.ts.map +1 -0
- package/lib/utils/styles.js +53 -0
- package/lib/utils/styles.js.map +1 -0
- package/lib/version.d.ts +8 -0
- package/lib/version.d.ts.map +1 -0
- package/lib/version.js +11 -0
- package/lib/version.js.map +1 -0
- package/package.json +159 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TyComponent - Base class for all Ty web components
|
|
3
|
+
*
|
|
4
|
+
* Provides unified property/attribute lifecycle management:
|
|
5
|
+
* - Single code path for all property updates
|
|
6
|
+
* - Declarative property configuration
|
|
7
|
+
* - Predictable rendering behavior
|
|
8
|
+
* - Form association support
|
|
9
|
+
* - Property change events via 'prop:change' (separate from user 'change' events)
|
|
10
|
+
*/
|
|
11
|
+
import { PropertyManager, PropertyConfig, PropertyChange } from '../utils/property-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Base class for all Ty components with unified property lifecycle
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class TyComponent<T = any> extends HTMLElement {
|
|
16
|
+
static formAssociated: boolean;
|
|
17
|
+
protected static properties: Record<string, PropertyConfig>;
|
|
18
|
+
protected props: PropertyManager<T>;
|
|
19
|
+
protected _internals: ElementInternals;
|
|
20
|
+
protected _connected: boolean;
|
|
21
|
+
protected _rendered: boolean;
|
|
22
|
+
constructor();
|
|
23
|
+
/**
|
|
24
|
+
* Define which attributes to observe
|
|
25
|
+
* Auto-generated from property configuration
|
|
26
|
+
* Returns kebab-case attribute names (e.g., 'minHeight' -> 'min-height')
|
|
27
|
+
*/
|
|
28
|
+
static get observedAttributes(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Unified property setter
|
|
31
|
+
* Use this in your property setters instead of direct field assignment
|
|
32
|
+
*/
|
|
33
|
+
protected setProperty(name: string, value: any): void;
|
|
34
|
+
/**
|
|
35
|
+
* Unified property getter
|
|
36
|
+
* Use this in your property getters
|
|
37
|
+
*/
|
|
38
|
+
protected getProperty(name: string): any;
|
|
39
|
+
/**
|
|
40
|
+
* Sync property value to HTML attribute
|
|
41
|
+
*/
|
|
42
|
+
private _syncPropertyToAttribute;
|
|
43
|
+
/**
|
|
44
|
+
* Convert camelCase to kebab-case
|
|
45
|
+
*/
|
|
46
|
+
private _toKebabCase;
|
|
47
|
+
/**
|
|
48
|
+
* Convert kebab-case to camelCase
|
|
49
|
+
*/
|
|
50
|
+
private _toCamelCase;
|
|
51
|
+
/**
|
|
52
|
+
* Attribute changed callback - unified for all components
|
|
53
|
+
*/
|
|
54
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
55
|
+
/**
|
|
56
|
+
* Connected callback - handle pre-set properties
|
|
57
|
+
*/
|
|
58
|
+
connectedCallback(): void;
|
|
59
|
+
/**
|
|
60
|
+
* Disconnected callback
|
|
61
|
+
*/
|
|
62
|
+
disconnectedCallback(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Capture properties that were set before connectedCallback
|
|
65
|
+
* (React, Vue, Reagent set properties before element is connected)
|
|
66
|
+
*/
|
|
67
|
+
private _capturePreSetProperties;
|
|
68
|
+
/**
|
|
69
|
+
* THE CORE LIFECYCLE METHOD
|
|
70
|
+
* All property changes flow through here
|
|
71
|
+
*
|
|
72
|
+
* Lifecycle order:
|
|
73
|
+
* 1. Update internal state (onPropertiesChanged hook)
|
|
74
|
+
* 2. Sync form value (if formValue property changed)
|
|
75
|
+
* 3. Render (if visual property changed)
|
|
76
|
+
* 4. Emit events (if emitChange property changed)
|
|
77
|
+
*/
|
|
78
|
+
private _handlePropertyChanges;
|
|
79
|
+
/**
|
|
80
|
+
* Emit property change events for properties that require it
|
|
81
|
+
* Uses 'prop:change' event to avoid conflicts with user interaction 'change' events
|
|
82
|
+
*/
|
|
83
|
+
private _emitChangeEvents;
|
|
84
|
+
/**
|
|
85
|
+
* Update form value via ElementInternals
|
|
86
|
+
* Subclasses can override to customize form value
|
|
87
|
+
*/
|
|
88
|
+
protected updateFormValue(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Get the form value for this component
|
|
91
|
+
* Default: return 'value' property
|
|
92
|
+
* Override for custom behavior
|
|
93
|
+
*/
|
|
94
|
+
protected getFormValue(): File | string | FormData | null;
|
|
95
|
+
/**
|
|
96
|
+
* Render the component
|
|
97
|
+
* Subclasses MUST implement this
|
|
98
|
+
*/
|
|
99
|
+
protected abstract render(): void;
|
|
100
|
+
/**
|
|
101
|
+
* Hook: Called when properties change
|
|
102
|
+
* Subclasses can override to update internal state
|
|
103
|
+
*
|
|
104
|
+
* This is called BEFORE rendering, so you can update
|
|
105
|
+
* internal state here and it will be reflected in the render
|
|
106
|
+
*/
|
|
107
|
+
protected onPropertiesChanged(changes: PropertyChange[]): void;
|
|
108
|
+
/**
|
|
109
|
+
* Hook: Called when component is connected
|
|
110
|
+
* Use this instead of overriding connectedCallback
|
|
111
|
+
*/
|
|
112
|
+
protected onConnect(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Hook: Called when component is disconnected
|
|
115
|
+
* Use this for cleanup instead of overriding disconnectedCallback
|
|
116
|
+
*/
|
|
117
|
+
protected onDisconnect(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Get the form element this component is associated with
|
|
120
|
+
*/
|
|
121
|
+
get form(): HTMLFormElement | null;
|
|
122
|
+
/**
|
|
123
|
+
* Form reset callback - called when form.reset() is invoked
|
|
124
|
+
* Resets component to its default value
|
|
125
|
+
*/
|
|
126
|
+
formResetCallback(): void;
|
|
127
|
+
/**
|
|
128
|
+
* Hook: Called when form is reset
|
|
129
|
+
* Subclasses can override to perform additional reset actions
|
|
130
|
+
*/
|
|
131
|
+
protected onFormReset(): void;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=ty-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ty-component.d.ts","sourceRoot":"","sources":["../../src/base/ty-component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAE9F;;GAEG;AACH,8BAAsB,WAAW,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,WAAW;IAC5D,MAAM,CAAC,cAAc,UAAO;IAG5B,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAK;IAGhE,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IAGnC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAA;IAGtC,SAAS,CAAC,UAAU,UAAQ;IAG5B,SAAS,CAAC,SAAS,UAAQ;;IAkB3B;;;;OAIG;IACH,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAYxC;IAED;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAYrD;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAIxC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;OAEG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAmB9F;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAqBzB;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAK5B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAkBhC;;;;;;;;;OASG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;;OAGG;IACH,SAAS,CAAC,eAAe,IAAI,IAAI;IAKjC;;;;OAIG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI;IAIzD;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;IAEjC;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAK9D;;;OAGG;IACH,SAAS,CAAC,SAAS,IAAI,IAAI;IAI3B;;;OAGG;IACH,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;OAEG;IACH,IAAI,IAAI,IAAI,eAAe,GAAG,IAAI,CAEjC;IAED;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAgBzB;;;OAGG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;CAI9B"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TyComponent - Base class for all Ty web components
|
|
3
|
+
*
|
|
4
|
+
* Provides unified property/attribute lifecycle management:
|
|
5
|
+
* - Single code path for all property updates
|
|
6
|
+
* - Declarative property configuration
|
|
7
|
+
* - Predictable rendering behavior
|
|
8
|
+
* - Form association support
|
|
9
|
+
* - Property change events via 'prop:change' (separate from user 'change' events)
|
|
10
|
+
*/
|
|
11
|
+
import { PropertyManager } from '../utils/property-manager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Base class for all Ty components with unified property lifecycle
|
|
14
|
+
*/
|
|
15
|
+
export class TyComponent extends HTMLElement {
|
|
16
|
+
constructor() {
|
|
17
|
+
super();
|
|
18
|
+
// Track if component is connected
|
|
19
|
+
this._connected = false;
|
|
20
|
+
// Track if initial render happened
|
|
21
|
+
this._rendered = false;
|
|
22
|
+
// Initialize property manager
|
|
23
|
+
const ctor = this.constructor;
|
|
24
|
+
this.props = new PropertyManager(ctor.properties);
|
|
25
|
+
// Form association
|
|
26
|
+
this._internals = this.attachInternals();
|
|
27
|
+
// Setup shadow DOM (subclasses can override by checking if shadowRoot exists)
|
|
28
|
+
if (!this.shadowRoot) {
|
|
29
|
+
this.attachShadow({ mode: 'open' });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Define which attributes to observe
|
|
34
|
+
* Auto-generated from property configuration
|
|
35
|
+
* Returns kebab-case attribute names (e.g., 'minHeight' -> 'min-height')
|
|
36
|
+
*/
|
|
37
|
+
static get observedAttributes() {
|
|
38
|
+
const attrs = [];
|
|
39
|
+
for (const [name, config] of Object.entries(this.properties)) {
|
|
40
|
+
attrs.push(name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase());
|
|
41
|
+
// Include alias names so attributeChangedCallback fires for them
|
|
42
|
+
if (config.aliases) {
|
|
43
|
+
for (const alias of Object.keys(config.aliases)) {
|
|
44
|
+
attrs.push(alias);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return attrs;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Unified property setter
|
|
52
|
+
* Use this in your property setters instead of direct field assignment
|
|
53
|
+
*/
|
|
54
|
+
setProperty(name, value) {
|
|
55
|
+
const change = this.props.updateProperty(name, value, 'property');
|
|
56
|
+
if (change) {
|
|
57
|
+
// Sync to attribute (kebab-case)
|
|
58
|
+
this._syncPropertyToAttribute(change);
|
|
59
|
+
// Handle the change through unified lifecycle
|
|
60
|
+
this._handlePropertyChanges([change]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Unified property getter
|
|
65
|
+
* Use this in your property getters
|
|
66
|
+
*/
|
|
67
|
+
getProperty(name) {
|
|
68
|
+
return this.props.get(name);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Sync property value to HTML attribute
|
|
72
|
+
*/
|
|
73
|
+
_syncPropertyToAttribute(change) {
|
|
74
|
+
const { name, newValue } = change;
|
|
75
|
+
const config = this.props.getConfig(name);
|
|
76
|
+
if (!config)
|
|
77
|
+
return;
|
|
78
|
+
// Convert to kebab-case for attribute
|
|
79
|
+
const attrName = this._toKebabCase(name);
|
|
80
|
+
// Handle different types
|
|
81
|
+
if (config.type === 'boolean') {
|
|
82
|
+
if (newValue) {
|
|
83
|
+
this.setAttribute(attrName, '');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.removeAttribute(attrName);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
else if (newValue === null || newValue === undefined) {
|
|
90
|
+
this.removeAttribute(attrName);
|
|
91
|
+
}
|
|
92
|
+
else if (typeof newValue === 'object') {
|
|
93
|
+
this.setAttribute(attrName, JSON.stringify(newValue));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.setAttribute(attrName, String(newValue));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Convert camelCase to kebab-case
|
|
101
|
+
*/
|
|
102
|
+
_toKebabCase(str) {
|
|
103
|
+
return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Convert kebab-case to camelCase
|
|
107
|
+
*/
|
|
108
|
+
_toCamelCase(str) {
|
|
109
|
+
return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Attribute changed callback - unified for all components
|
|
113
|
+
*/
|
|
114
|
+
attributeChangedCallback(name, oldValue, newValue) {
|
|
115
|
+
if (oldValue === newValue)
|
|
116
|
+
return;
|
|
117
|
+
// Check if this is an alias (e.g., not-searchable)
|
|
118
|
+
let change = this.props.handleAlias(name, newValue);
|
|
119
|
+
if (!change) {
|
|
120
|
+
// Properties may be registered with kebab-case (e.g., 'display-month')
|
|
121
|
+
// or camelCase. Try the attribute name as-is first, then camelCase.
|
|
122
|
+
const camelName = this._toCamelCase(name);
|
|
123
|
+
const propName = this.props.hasConfig(name) ? name : camelName;
|
|
124
|
+
change = this.props.updateProperty(propName, newValue, 'attribute');
|
|
125
|
+
}
|
|
126
|
+
if (change) {
|
|
127
|
+
this._handlePropertyChanges([change]);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Connected callback - handle pre-set properties
|
|
132
|
+
*/
|
|
133
|
+
connectedCallback() {
|
|
134
|
+
this._connected = true;
|
|
135
|
+
// Capture pre-set properties (React/Vue/Reagent pattern)
|
|
136
|
+
const preSetProps = this._capturePreSetProperties();
|
|
137
|
+
// Batch process all pre-set properties
|
|
138
|
+
if (preSetProps.length > 0) {
|
|
139
|
+
this._handlePropertyChanges(preSetProps);
|
|
140
|
+
}
|
|
141
|
+
// Initialize component (subclass hook)
|
|
142
|
+
this.onConnect();
|
|
143
|
+
// Initial render
|
|
144
|
+
if (!this._rendered) {
|
|
145
|
+
this.render();
|
|
146
|
+
this._rendered = true;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Disconnected callback
|
|
151
|
+
*/
|
|
152
|
+
disconnectedCallback() {
|
|
153
|
+
this._connected = false;
|
|
154
|
+
this.onDisconnect();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Capture properties that were set before connectedCallback
|
|
158
|
+
* (React, Vue, Reagent set properties before element is connected)
|
|
159
|
+
*/
|
|
160
|
+
_capturePreSetProperties() {
|
|
161
|
+
const changes = [];
|
|
162
|
+
const ctor = this.constructor;
|
|
163
|
+
for (const propName of Object.keys(ctor.properties)) {
|
|
164
|
+
// Check if property was set on the element before connection
|
|
165
|
+
const descriptor = Object.getOwnPropertyDescriptor(this, propName);
|
|
166
|
+
if (descriptor && descriptor.value !== undefined) {
|
|
167
|
+
const change = this.props.updateProperty(propName, descriptor.value, 'property');
|
|
168
|
+
if (change) {
|
|
169
|
+
changes.push(change);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return changes;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* THE CORE LIFECYCLE METHOD
|
|
177
|
+
* All property changes flow through here
|
|
178
|
+
*
|
|
179
|
+
* Lifecycle order:
|
|
180
|
+
* 1. Update internal state (onPropertiesChanged hook)
|
|
181
|
+
* 2. Sync form value (if formValue property changed)
|
|
182
|
+
* 3. Render (if visual property changed)
|
|
183
|
+
* 4. Emit events (if emitChange property changed)
|
|
184
|
+
*/
|
|
185
|
+
_handlePropertyChanges(changes) {
|
|
186
|
+
if (changes.length === 0)
|
|
187
|
+
return;
|
|
188
|
+
// 1. Update internal state (subclass-specific)
|
|
189
|
+
this.onPropertiesChanged(changes);
|
|
190
|
+
// 2. Sync form value if needed
|
|
191
|
+
const formValueChanged = changes.some(c => this.props.isFormValue(c.name));
|
|
192
|
+
if (formValueChanged) {
|
|
193
|
+
this.updateFormValue();
|
|
194
|
+
}
|
|
195
|
+
// 3. Render only if visual properties changed AND component is connected
|
|
196
|
+
const visualChanged = changes.some(c => this.props.isVisual(c.name));
|
|
197
|
+
if (visualChanged && this._connected) {
|
|
198
|
+
this.render();
|
|
199
|
+
}
|
|
200
|
+
// 4. Emit change events if configured
|
|
201
|
+
this._emitChangeEvents(changes);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Emit property change events for properties that require it
|
|
205
|
+
* Uses 'prop:change' event to avoid conflicts with user interaction 'change' events
|
|
206
|
+
*/
|
|
207
|
+
_emitChangeEvents(changes) {
|
|
208
|
+
for (const change of changes) {
|
|
209
|
+
if (this.props.shouldEmitChange(change.name)) {
|
|
210
|
+
this.dispatchEvent(new CustomEvent('prop:change', {
|
|
211
|
+
detail: {
|
|
212
|
+
property: change.name,
|
|
213
|
+
oldValue: change.oldValue,
|
|
214
|
+
newValue: change.newValue
|
|
215
|
+
},
|
|
216
|
+
bubbles: true,
|
|
217
|
+
composed: true
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Update form value via ElementInternals
|
|
224
|
+
* Subclasses can override to customize form value
|
|
225
|
+
*/
|
|
226
|
+
updateFormValue() {
|
|
227
|
+
const formValue = this.getFormValue();
|
|
228
|
+
this._internals.setFormValue(formValue);
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Get the form value for this component
|
|
232
|
+
* Default: return 'value' property
|
|
233
|
+
* Override for custom behavior
|
|
234
|
+
*/
|
|
235
|
+
getFormValue() {
|
|
236
|
+
return this.props.get('value') ?? null;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Hook: Called when properties change
|
|
240
|
+
* Subclasses can override to update internal state
|
|
241
|
+
*
|
|
242
|
+
* This is called BEFORE rendering, so you can update
|
|
243
|
+
* internal state here and it will be reflected in the render
|
|
244
|
+
*/
|
|
245
|
+
onPropertiesChanged(changes) {
|
|
246
|
+
// Default: no-op
|
|
247
|
+
// Subclasses can override to update _state, _config, etc.
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Hook: Called when component is connected
|
|
251
|
+
* Use this instead of overriding connectedCallback
|
|
252
|
+
*/
|
|
253
|
+
onConnect() {
|
|
254
|
+
// Default: no-op
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Hook: Called when component is disconnected
|
|
258
|
+
* Use this for cleanup instead of overriding disconnectedCallback
|
|
259
|
+
*/
|
|
260
|
+
onDisconnect() {
|
|
261
|
+
// Default: no-op
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Get the form element this component is associated with
|
|
265
|
+
*/
|
|
266
|
+
get form() {
|
|
267
|
+
return this._internals.form;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Form reset callback - called when form.reset() is invoked
|
|
271
|
+
* Resets component to its default value
|
|
272
|
+
*/
|
|
273
|
+
formResetCallback() {
|
|
274
|
+
// Get the default value from property configuration
|
|
275
|
+
const ctor = this.constructor;
|
|
276
|
+
const valueConfig = ctor.properties['value'];
|
|
277
|
+
if (valueConfig) {
|
|
278
|
+
const defaultValue = valueConfig.default ?? '';
|
|
279
|
+
// Reset the value property through setProperty to trigger lifecycle
|
|
280
|
+
this.setProperty('value', defaultValue);
|
|
281
|
+
}
|
|
282
|
+
// Call subclass hook for custom reset behavior
|
|
283
|
+
this.onFormReset();
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Hook: Called when form is reset
|
|
287
|
+
* Subclasses can override to perform additional reset actions
|
|
288
|
+
*/
|
|
289
|
+
onFormReset() {
|
|
290
|
+
// Default: no-op
|
|
291
|
+
// Subclasses can override to reset additional state
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
TyComponent.formAssociated = true;
|
|
295
|
+
// Subclasses must define their property configuration
|
|
296
|
+
TyComponent.properties = {};
|
|
297
|
+
//# sourceMappingURL=ty-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ty-component.js","sourceRoot":"","sources":["../../src/base/ty-component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TyButton Web Component
|
|
3
|
+
*
|
|
4
|
+
* Three appearance variants × six flavors × three tones (+/base/-).
|
|
5
|
+
* appearance="solid" saturated brand fill (default)
|
|
6
|
+
* appearance="outlined" transparent bg, text === border
|
|
7
|
+
* appearance="ghost" text only, hover bg
|
|
8
|
+
*
|
|
9
|
+
* Append `+` or `-` to a flavor for stronger/softer tone (e.g. "primary+").
|
|
10
|
+
*/
|
|
11
|
+
import type { Flavor, Size, TyButtonElement } from "../types/common.js";
|
|
12
|
+
import { TyComponent } from "../base/ty-component.js";
|
|
13
|
+
import type { PropertyChange } from "../utils/property-manager.js";
|
|
14
|
+
type Appearance = "solid" | "outlined" | "ghost";
|
|
15
|
+
interface ButtonState {
|
|
16
|
+
flavor: Flavor;
|
|
17
|
+
size: Size;
|
|
18
|
+
appearance: Appearance;
|
|
19
|
+
disabled: boolean;
|
|
20
|
+
type: "button" | "submit" | "reset";
|
|
21
|
+
pill: boolean;
|
|
22
|
+
action: boolean;
|
|
23
|
+
wide: boolean;
|
|
24
|
+
name: string;
|
|
25
|
+
value: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Ty Button Component
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```html
|
|
32
|
+
* <ty-button flavor="primary">Default solid</ty-button>
|
|
33
|
+
* <ty-button appearance="outlined" flavor="danger">Outlined</ty-button>
|
|
34
|
+
* <ty-button appearance="ghost" flavor="success+">Ghost stronger</ty-button>
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class TyButton extends TyComponent<ButtonState> implements TyButtonElement {
|
|
38
|
+
static formAssociated: boolean;
|
|
39
|
+
protected static properties: {
|
|
40
|
+
flavor: {
|
|
41
|
+
type: "string";
|
|
42
|
+
visual: boolean;
|
|
43
|
+
default: string;
|
|
44
|
+
};
|
|
45
|
+
size: {
|
|
46
|
+
type: "string";
|
|
47
|
+
visual: boolean;
|
|
48
|
+
default: string;
|
|
49
|
+
validate: (v: any) => boolean;
|
|
50
|
+
coerce: (v: any) => any;
|
|
51
|
+
};
|
|
52
|
+
appearance: {
|
|
53
|
+
type: "string";
|
|
54
|
+
visual: boolean;
|
|
55
|
+
default: string;
|
|
56
|
+
validate: (v: any) => boolean;
|
|
57
|
+
coerce: (v: any) => any;
|
|
58
|
+
};
|
|
59
|
+
disabled: {
|
|
60
|
+
type: "boolean";
|
|
61
|
+
visual: boolean;
|
|
62
|
+
default: boolean;
|
|
63
|
+
};
|
|
64
|
+
type: {
|
|
65
|
+
type: "string";
|
|
66
|
+
visual: boolean;
|
|
67
|
+
default: string;
|
|
68
|
+
};
|
|
69
|
+
pill: {
|
|
70
|
+
type: "boolean";
|
|
71
|
+
visual: boolean;
|
|
72
|
+
default: boolean;
|
|
73
|
+
};
|
|
74
|
+
action: {
|
|
75
|
+
type: "boolean";
|
|
76
|
+
visual: boolean;
|
|
77
|
+
default: boolean;
|
|
78
|
+
};
|
|
79
|
+
wide: {
|
|
80
|
+
type: "boolean";
|
|
81
|
+
visual: boolean;
|
|
82
|
+
default: boolean;
|
|
83
|
+
};
|
|
84
|
+
name: {
|
|
85
|
+
type: "string";
|
|
86
|
+
default: string;
|
|
87
|
+
};
|
|
88
|
+
value: {
|
|
89
|
+
type: "string";
|
|
90
|
+
default: string;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
private _structureInitialized;
|
|
94
|
+
constructor();
|
|
95
|
+
protected onConnect(): void;
|
|
96
|
+
protected onDisconnect(): void;
|
|
97
|
+
protected onPropertiesChanged(_changes: PropertyChange[]): void;
|
|
98
|
+
get flavor(): Flavor;
|
|
99
|
+
set flavor(value: Flavor);
|
|
100
|
+
get size(): Size;
|
|
101
|
+
set size(value: Size);
|
|
102
|
+
get appearance(): Appearance;
|
|
103
|
+
set appearance(value: Appearance);
|
|
104
|
+
get disabled(): boolean;
|
|
105
|
+
set disabled(value: boolean);
|
|
106
|
+
get type(): "button" | "submit" | "reset";
|
|
107
|
+
set type(value: "button" | "submit" | "reset");
|
|
108
|
+
get pill(): boolean;
|
|
109
|
+
set pill(value: boolean);
|
|
110
|
+
get action(): boolean;
|
|
111
|
+
set action(value: boolean);
|
|
112
|
+
get wide(): boolean;
|
|
113
|
+
set wide(value: boolean);
|
|
114
|
+
get name(): string;
|
|
115
|
+
set name(value: string);
|
|
116
|
+
get value(): string;
|
|
117
|
+
set value(value: string);
|
|
118
|
+
/** Parse the optional `+`/`-` shade suffix from a flavor string. */
|
|
119
|
+
private parseFlavor;
|
|
120
|
+
private buildClasses;
|
|
121
|
+
private handleFormAction;
|
|
122
|
+
private initializeButtonStructure;
|
|
123
|
+
protected render(): void;
|
|
124
|
+
}
|
|
125
|
+
export {};
|
|
126
|
+
//# sourceMappingURL=button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/components/button.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAInE,KAAK,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEjD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,qBAAa,QACX,SAAQ,WAAW,CAAC,WAAW,CAC/B,YAAW,eAAe;IAE1B,MAAM,CAAC,cAAc,UAAQ;IAE7B,SAAS,CAAC,MAAM,CAAC,UAAU;;;;;;;;;;0BAUT,GAAG;wBACL,GAAG;;;;;;0BAYD,GAAG;wBACL,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAyCjB;IAEF,OAAO,CAAC,qBAAqB,CAAS;;IAOtC,SAAS,CAAC,SAAS,IAAI,IAAI;IAC3B,SAAS,CAAC,YAAY,IAAI,IAAI;IAC9B,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IAM/D,IAAI,MAAM,IAAI,MAAM,CAEnB;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAEvB;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAEnB;IAED,IAAI,UAAU,IAAI,UAAU,CAE3B;IACD,IAAI,UAAU,CAAC,KAAK,EAAE,UAAU,EAE/B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACD,IAAI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAE1B;IAED,IAAI,IAAI,IAAI,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAExC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,EAE5C;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAEtB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,EAExB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,EAEtB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAErB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAEtB;IAMD,oEAAoE;IACpE,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,yBAAyB;IAuCjC,SAAS,CAAC,MAAM,IAAI,IAAI;CAezB"}
|