@haiyue/ui 0.1.2 → 0.2.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.
Files changed (95) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +444 -1
  3. package/dist/adapters/web/controls.d.ts +19 -0
  4. package/dist/adapters/web/controls.js +284 -0
  5. package/dist/adapters/web/dom.d.ts +10 -0
  6. package/dist/adapters/web/dom.js +98 -0
  7. package/dist/adapters/web/index.d.ts +3 -0
  8. package/dist/adapters/web/index.js +3 -0
  9. package/dist/adapters/web/renderer.d.ts +18 -0
  10. package/dist/adapters/web/renderer.js +545 -0
  11. package/dist/adapters/web/styles.d.ts +3 -0
  12. package/dist/adapters/web/styles.js +62 -0
  13. package/dist/adapters/web/types.d.ts +46 -0
  14. package/dist/adapters/web/types.js +2 -0
  15. package/dist/affix.d.ts +35 -0
  16. package/dist/affix.js +137 -0
  17. package/dist/badge.d.ts +45 -0
  18. package/dist/badge.js +168 -0
  19. package/dist/breadcrumb.d.ts +37 -0
  20. package/dist/breadcrumb.js +210 -0
  21. package/dist/button-group.d.ts +12 -0
  22. package/dist/button-group.js +72 -0
  23. package/dist/button.d.ts +15 -1
  24. package/dist/button.js +101 -12
  25. package/dist/cascader.d.ts +65 -0
  26. package/dist/cascader.js +479 -0
  27. package/dist/collapse.d.ts +55 -0
  28. package/dist/collapse.js +261 -0
  29. package/dist/core/actions.d.ts +32 -0
  30. package/dist/core/actions.js +145 -0
  31. package/dist/core/data.d.ts +4 -0
  32. package/dist/core/data.js +27 -0
  33. package/dist/core/index.d.ts +7 -0
  34. package/dist/core/index.js +6 -0
  35. package/dist/core/platform-view.d.ts +17 -0
  36. package/dist/core/platform-view.js +84 -0
  37. package/dist/core/selection.d.ts +14 -0
  38. package/dist/core/selection.js +93 -0
  39. package/dist/core/text.d.ts +31 -0
  40. package/dist/core/text.js +154 -0
  41. package/dist/core/types.d.ts +250 -0
  42. package/dist/core/types.js +2 -0
  43. package/dist/core/validation.d.ts +24 -0
  44. package/dist/core/validation.js +238 -0
  45. package/dist/date-picker.d.ts +60 -0
  46. package/dist/date-picker.js +355 -0
  47. package/dist/dialog.d.ts +4 -0
  48. package/dist/dialog.js +23 -5
  49. package/dist/divider.d.ts +33 -0
  50. package/dist/divider.js +113 -0
  51. package/dist/draggable.d.ts +78 -0
  52. package/dist/draggable.js +255 -0
  53. package/dist/index.d.ts +45 -1
  54. package/dist/index.js +66 -0
  55. package/dist/input.d.ts +30 -1
  56. package/dist/input.js +166 -54
  57. package/dist/portable/index.d.ts +4 -0
  58. package/dist/portable/index.js +3 -0
  59. package/dist/portable/page.d.ts +38 -0
  60. package/dist/portable/page.js +361 -0
  61. package/dist/portable/theme.d.ts +19 -0
  62. package/dist/portable/theme.js +40 -0
  63. package/dist/portable/tree.d.ts +10 -0
  64. package/dist/portable/tree.js +96 -0
  65. package/dist/range.d.ts +3 -0
  66. package/dist/range.js +16 -5
  67. package/dist/rate.d.ts +46 -0
  68. package/dist/rate.js +193 -0
  69. package/dist/resizable.d.ts +97 -0
  70. package/dist/resizable.js +426 -0
  71. package/dist/skeleton.d.ts +41 -0
  72. package/dist/skeleton.js +141 -0
  73. package/dist/steps.d.ts +45 -0
  74. package/dist/steps.js +203 -0
  75. package/dist/table.d.ts +106 -0
  76. package/dist/table.js +689 -0
  77. package/dist/tabs.d.ts +3 -0
  78. package/dist/tabs.js +11 -1
  79. package/dist/tag.d.ts +55 -0
  80. package/dist/tag.js +225 -0
  81. package/dist/time-picker.d.ts +62 -0
  82. package/dist/time-picker.js +298 -0
  83. package/dist/timeline.d.ts +48 -0
  84. package/dist/timeline.js +201 -0
  85. package/dist/toast.d.ts +55 -0
  86. package/dist/toast.js +224 -0
  87. package/dist/tour.d.ts +89 -0
  88. package/dist/tour.js +306 -0
  89. package/dist/virtual-keyboard.d.ts +95 -0
  90. package/dist/virtual-keyboard.js +432 -0
  91. package/dist/virtual-mouse.d.ts +82 -0
  92. package/dist/virtual-mouse.js +358 -0
  93. package/dist/watermark.d.ts +44 -0
  94. package/dist/watermark.js +148 -0
  95. package/package.json +115 -4
package/dist/rate.js ADDED
@@ -0,0 +1,193 @@
1
+ function finiteNumber(value, fallback) {
2
+ if (value == null || value === '')
3
+ return fallback;
4
+ const number = Number(value);
5
+ return Number.isFinite(number) ? number : fallback;
6
+ }
7
+ /** Accessible star rating with optional half-step pointer and keyboard selection. */
8
+ export class HYRate extends HTMLElement {
9
+ _group = document.createElement('div');
10
+ _value = 0;
11
+ _hoverValue = null;
12
+ _tooltips = [];
13
+ _reflecting = false;
14
+ static get observedAttributes() {
15
+ return ['value', 'count', 'allow-half', 'allow-clear', 'disabled', 'readonly', 'character', 'aria-label'];
16
+ }
17
+ constructor() {
18
+ super();
19
+ const root = this.attachShadow({ mode: 'open' });
20
+ const style = document.createElement('style');
21
+ style.textContent = `
22
+ :host { display: inline-block; color: var(--hy-text-color, #eef3ff); font: 12px/1 system-ui, sans-serif; }
23
+ .group { display: inline-flex; align-items: center; gap: var(--hy-rate-gap, 5px); border-radius: var(--hy-rate-focus-radius, 5px); }
24
+ .group:focus-visible { outline: 2px solid var(--hy-focus-border-color, #79a8ff); outline-offset: 3px; }
25
+ .star { position: relative; width: 1em; height: 1em; padding: 0; overflow: hidden; border: 0; color: inherit; background: transparent; cursor: pointer; font: var(--hy-rate-font-size, 25px)/1 system-ui, sans-serif; transition: transform 120ms ease; }
26
+ .star:hover { transform: scale(1.12); }
27
+ .empty, .fill-inner { display: block; width: 1em; height: 1em; }
28
+ .empty { color: var(--hy-rate-empty-color, color-mix(in srgb, var(--hy-text-color, #eef3ff) 16%, transparent)); }
29
+ .fill { position: absolute; inset: 0 auto 0 0; width: var(--_fill, 0%); overflow: hidden; pointer-events: none; }
30
+ .fill-inner { color: var(--hy-rate-color, #f2b84b); }
31
+ .star:focus { outline: none; }
32
+ :host([disabled]), :host([readonly]) { opacity: .62; }
33
+ :host([disabled]) .star, :host([readonly]) .star { cursor: default; }
34
+ :host([disabled]) .star:hover, :host([readonly]) .star:hover { transform: none; }
35
+ @media (prefers-reduced-motion: reduce) { .star { transition: none; } }
36
+ `;
37
+ this._group.className = 'group';
38
+ this._group.part.add('group');
39
+ this._group.setAttribute('role', 'slider');
40
+ root.append(style, this._group);
41
+ this._group.addEventListener('pointermove', event => this._handlePointerMove(event));
42
+ this._group.addEventListener('pointerleave', () => this._setHover(null));
43
+ this._group.addEventListener('click', event => this._handleClick(event));
44
+ this._group.addEventListener('keydown', event => this._handleKeydown(event));
45
+ }
46
+ connectedCallback() { this._value = this._normalize(this.getAttribute('value')); this._reflectValue(); this._render(); }
47
+ attributeChangedCallback(name, oldValue, newValue) {
48
+ if (oldValue === newValue || this._reflecting)
49
+ return;
50
+ if (name === 'value' || name === 'count' || name === 'allow-half') {
51
+ this._value = this._normalize(this.getAttribute('value'));
52
+ this._reflectValue();
53
+ }
54
+ this._render();
55
+ }
56
+ get value() { return this._value; }
57
+ set value(value) { this._value = this._normalize(value); this._reflectValue(); this._render(); }
58
+ get count() { return Math.min(20, Math.max(1, Math.floor(finiteNumber(this.getAttribute('count'), 5)))); }
59
+ set count(value) { this.setAttribute('count', String(Math.min(20, Math.max(1, Math.floor(finiteNumber(value, 5)))))); }
60
+ get allowHalf() { return this.hasAttribute('allow-half'); }
61
+ set allowHalf(value) { this.toggleAttribute('allow-half', Boolean(value)); }
62
+ get allowClear() { return this.getAttribute('allow-clear') !== 'false'; }
63
+ set allowClear(value) { this.setAttribute('allow-clear', String(Boolean(value))); }
64
+ get disabled() { return this.hasAttribute('disabled'); }
65
+ set disabled(value) { this.toggleAttribute('disabled', Boolean(value)); }
66
+ get readOnly() { return this.hasAttribute('readonly'); }
67
+ set readOnly(value) { this.toggleAttribute('readonly', Boolean(value)); }
68
+ get character() { return this.getAttribute('character') || '★'; }
69
+ set character(value) { const normalized = String(value); if (normalized)
70
+ this.setAttribute('character', normalized);
71
+ else
72
+ this.removeAttribute('character'); }
73
+ get tooltips() { return this._tooltips; }
74
+ set tooltips(value) { this._tooltips = Array.isArray(value) ? value.map(String) : []; this._render(); }
75
+ _normalize(value) {
76
+ const step = this.allowHalf ? 0.5 : 1;
77
+ const number = Math.min(this.count, Math.max(0, finiteNumber(value, 0)));
78
+ return Math.round(number / step) * step;
79
+ }
80
+ _reflectValue() {
81
+ const value = String(this._value);
82
+ if (this.getAttribute('value') === value)
83
+ return;
84
+ this._reflecting = true;
85
+ this.setAttribute('value', value);
86
+ this._reflecting = false;
87
+ }
88
+ _render() {
89
+ if (!this.isConnected)
90
+ return;
91
+ const stars = [];
92
+ for (let index = 0; index < this.count; index += 1) {
93
+ const button = document.createElement('button');
94
+ const empty = document.createElement('span');
95
+ const fill = document.createElement('span');
96
+ const fillInner = document.createElement('span');
97
+ button.type = 'button';
98
+ button.className = 'star';
99
+ button.part.add('star');
100
+ button.dataset.index = String(index);
101
+ button.tabIndex = -1;
102
+ button.setAttribute('aria-hidden', 'true');
103
+ empty.className = 'empty';
104
+ empty.textContent = this.character;
105
+ fill.className = 'fill';
106
+ fill.part.add('fill');
107
+ fillInner.className = 'fill-inner';
108
+ fillInner.textContent = this.character;
109
+ fill.append(fillInner);
110
+ button.append(empty, fill);
111
+ stars.push(button);
112
+ }
113
+ this._group.replaceChildren(...stars);
114
+ this._group.tabIndex = this.disabled || this.readOnly ? -1 : 0;
115
+ this._group.setAttribute('aria-disabled', String(this.disabled));
116
+ this._group.setAttribute('aria-readonly', String(this.readOnly));
117
+ this._group.setAttribute('aria-valuemin', '0');
118
+ this._group.setAttribute('aria-valuemax', String(this.count));
119
+ this._group.setAttribute('aria-valuenow', String(this._value));
120
+ this._group.setAttribute('aria-valuetext', this._valueText(this._value));
121
+ this._group.setAttribute('aria-label', this.getAttribute('aria-label') || 'Rating');
122
+ this._updateVisuals();
123
+ }
124
+ _updateVisuals() {
125
+ const shown = this._hoverValue ?? this._value;
126
+ this._group.querySelectorAll('.star').forEach((star, index) => { const fill = Math.min(1, Math.max(0, shown - index)); star.style.setProperty('--_fill', `${fill * 100}%`); star.title = this._valueText(index + 1); });
127
+ }
128
+ _pointerValue(event) {
129
+ const target = event.target?.closest('.star');
130
+ if (!target || !this._group.contains(target))
131
+ return null;
132
+ const index = Number(target.dataset.index);
133
+ if (!this.allowHalf)
134
+ return index + 1;
135
+ const rect = target.getBoundingClientRect();
136
+ return index + (event.clientX < rect.left + rect.width / 2 ? 0.5 : 1);
137
+ }
138
+ _handlePointerMove(event) { if (this.disabled || this.readOnly)
139
+ return; const value = this._pointerValue(event); if (value != null)
140
+ this._setHover(value); }
141
+ _handleClick(event) {
142
+ if (this.disabled || this.readOnly)
143
+ return;
144
+ const pointed = this._pointerValue(event);
145
+ if (pointed == null)
146
+ return;
147
+ const value = this.allowClear && pointed === this._value ? 0 : pointed;
148
+ this._setHover(null);
149
+ this._commit(value);
150
+ }
151
+ _handleKeydown(event) {
152
+ if (this.disabled || this.readOnly)
153
+ return;
154
+ const step = this.allowHalf ? 0.5 : 1;
155
+ let next = null;
156
+ if (event.key === 'ArrowRight' || event.key === 'ArrowUp')
157
+ next = this._value + step;
158
+ else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown')
159
+ next = this._value - step;
160
+ else if (event.key === 'Home')
161
+ next = 0;
162
+ else if (event.key === 'End')
163
+ next = this.count;
164
+ if (next == null)
165
+ return;
166
+ event.preventDefault();
167
+ this._commit(next);
168
+ }
169
+ _setHover(value) {
170
+ if (this._hoverValue === value)
171
+ return;
172
+ this._hoverValue = value;
173
+ this._updateVisuals();
174
+ this.dispatchEvent(new CustomEvent('hover-change', { bubbles: true, composed: true, detail: { value } }));
175
+ }
176
+ _commit(value) {
177
+ const next = this._normalize(value);
178
+ if (next === this._value)
179
+ return;
180
+ this._value = next;
181
+ this._reflectValue();
182
+ this._group.setAttribute('aria-valuenow', String(next));
183
+ this._group.setAttribute('aria-valuetext', this._valueText(next));
184
+ this._updateVisuals();
185
+ this.dispatchEvent(new CustomEvent('value-change', { bubbles: true, composed: true, detail: { value: next } }));
186
+ }
187
+ _valueText(value) { const index = Math.ceil(value) - 1; return value > 0 && this._tooltips[index] ? `${value}: ${this._tooltips[index]}` : `${value} of ${this.count}`; }
188
+ }
189
+ export function defineRateComponents() {
190
+ if (!customElements.get('hy-rate'))
191
+ customElements.define('hy-rate', HYRate);
192
+ }
193
+ //# sourceMappingURL=rate.js.map
@@ -0,0 +1,97 @@
1
+ export type HYResizableHandle = 'move' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'nw';
2
+ export type HYResizableBoundsMode = 'none' | 'parent' | 'viewport';
3
+ export type HYResizableBounds = HYResizableBoundsMode | HTMLElement;
4
+ export type HYResizableSource = 'pointer' | 'keyboard' | 'api';
5
+ export interface HYResizableRect {
6
+ readonly x: number;
7
+ readonly y: number;
8
+ readonly width: number;
9
+ readonly height: number;
10
+ }
11
+ export interface HYResizableChangeDetail extends HYResizableRect {
12
+ readonly handle: HYResizableHandle;
13
+ readonly source: HYResizableSource;
14
+ }
15
+ export interface HYResizableEndDetail extends HYResizableChangeDetail {
16
+ readonly cancelled: boolean;
17
+ }
18
+ /** Eight-handle resize frame that can also move its slotted content. */
19
+ export declare class HYResizable extends HTMLElement {
20
+ private readonly _frame;
21
+ private readonly _content;
22
+ private readonly _handles;
23
+ private _x;
24
+ private _y;
25
+ private _width;
26
+ private _height;
27
+ private _initialRect;
28
+ private _boundsTarget;
29
+ private _reflecting;
30
+ private _pointerId;
31
+ private _activeHandle;
32
+ private _origin;
33
+ private _pointerX;
34
+ private _pointerY;
35
+ private _dragAbort;
36
+ static get observedAttributes(): string[];
37
+ constructor();
38
+ connectedCallback(): void;
39
+ disconnectedCallback(): void;
40
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
41
+ get x(): number;
42
+ set x(value: number);
43
+ get y(): number;
44
+ set y(value: number);
45
+ get width(): number;
46
+ set width(value: number);
47
+ get height(): number;
48
+ set height(value: number);
49
+ get rect(): HYResizableRect;
50
+ get minWidth(): number;
51
+ set minWidth(value: number);
52
+ get minHeight(): number;
53
+ set minHeight(value: number);
54
+ get maxWidth(): number;
55
+ set maxWidth(value: number);
56
+ get maxHeight(): number;
57
+ set maxHeight(value: number);
58
+ get grid(): number;
59
+ set grid(value: number);
60
+ get aspectRatio(): number | null;
61
+ set aspectRatio(value: number | null);
62
+ get bounds(): HYResizableBounds;
63
+ set bounds(value: HYResizableBounds);
64
+ get boundsMode(): HYResizableBoundsMode;
65
+ get disabled(): boolean;
66
+ set disabled(value: boolean);
67
+ get movable(): boolean;
68
+ set movable(value: boolean);
69
+ get keyboard(): boolean;
70
+ set keyboard(value: boolean);
71
+ get cancel(): string;
72
+ set cancel(value: string);
73
+ get resizing(): boolean;
74
+ setRect(rect: HYResizableRect): HYResizableRect;
75
+ moveTo(x: number, y: number): HYResizableRect;
76
+ moveBy(deltaX: number, deltaY: number): HYResizableRect;
77
+ resizeTo(width: number, height: number): HYResizableRect;
78
+ reset(): HYResizableRect;
79
+ refresh(): HYResizableRect;
80
+ private _startPointer;
81
+ private _handlePointerMove;
82
+ private _finishPointer;
83
+ private _cancelDrag;
84
+ private _handleKeydown;
85
+ private _rectFromDelta;
86
+ private _applyRect;
87
+ private _normalizeRect;
88
+ private _relativeBounds;
89
+ private _resolveHandle;
90
+ private _isCancelledTarget;
91
+ private _readRectAttributes;
92
+ private _sync;
93
+ private _reflectRect;
94
+ private _syncAccessibility;
95
+ private _setFiniteLimit;
96
+ }
97
+ export declare function defineResizableComponents(): void;