@mono-lit/helper 0.0.4 → 0.0.5

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 (133) hide show
  1. package/dist/control-tooltip-7vegYmq3.js +678 -0
  2. package/dist/{tooltip-FCMRUSLi.js → control-tooltip-C3rA_nSH.js} +12 -119
  3. package/dist/{data-source-controller-Cf_sMxEh.js → data-source-controller-C6C4ej_M.js} +1 -1
  4. package/dist/{data-source-options-Bk-UoaZV.js → data-source-options-Cz9fVLK8.js} +3 -2
  5. package/dist/{data-source-read-Cuqw3LcP.js → data-source-read-i6CYSUEl.js} +2 -1
  6. package/dist/{excel-DtRpxmxs.js → excel-BPdDt06G.js} +1 -1
  7. package/dist/{export-B91P6J1y.js → export-DgomqI_3.js} +2 -2
  8. package/dist/export.js +2 -2
  9. package/dist/{field-icons-FmyBWa0g.js → field-icons-t8rXRCKs.js} +50 -1
  10. package/dist/field-tooltip-FyMi9vNM.js +266 -0
  11. package/dist/field-tooltip.css_raw-DEctHXKm.js +270 -0
  12. package/dist/field-validation-CHHQi1zl.js +170 -0
  13. package/dist/field-validation.css_raw-B3Iu33rS.js +178 -0
  14. package/dist/index.js +4 -3
  15. package/dist/{index.node-dvrNviMx.js → index.node-DzCuvHLg.js} +1 -1
  16. package/dist/index.node.js +4 -3
  17. package/dist/input-format-GrRCJBqV.js +251 -0
  18. package/dist/input.css_raw-CQu2fAsU.js +5 -0
  19. package/dist/{mono-data-grid-BHlo1IgR.js → mono-data-grid-KDpu4d4_.js} +5 -4
  20. package/dist/{mono-form-controller-IYn0MuUQ.js → mono-form-controller-BkMR8g14.js} +18 -3
  21. package/dist/{reactive-DFCdZbH9.js → normalize-error-BmLbgANw.js} +1 -48
  22. package/dist/nuxt.js +1 -1
  23. package/dist/{popup-portal-HWhkd7oy.js → popup-portal-C8ttHDRX.js} +17 -1
  24. package/dist/{popup-stack-De05Y-mJ.js → popup-stack-C64WCuXq.js} +21 -1
  25. package/dist/src/components/accordion/accordion-core.d.ts +4 -1
  26. package/dist/src/components/accordion/mono-accordion.shadow.d.ts +4 -1
  27. package/dist/src/components/date/date-core.d.ts +3 -0
  28. package/dist/src/components/date/date-types.d.ts +36 -1
  29. package/dist/src/components/drawer/drawer-core.d.ts +1 -0
  30. package/dist/src/components/dropdown-table/dropdown-table-core.d.ts +3 -0
  31. package/dist/src/components/dropdown-table/dropdown-table-types.d.ts +31 -0
  32. package/dist/src/components/form/form-types.d.ts +23 -5
  33. package/dist/src/components/input/index.d.ts +2 -2
  34. package/dist/src/components/input/index.shadow.d.ts +2 -2
  35. package/dist/src/components/input/input-core.d.ts +23 -3
  36. package/dist/src/components/input/input-types.d.ts +84 -9
  37. package/dist/src/components/input/mono-input.d.ts +3 -2
  38. package/dist/src/components/input/mono-input.shadow.d.ts +3 -2
  39. package/dist/src/components/modal/modal-core.d.ts +1 -0
  40. package/dist/src/components/otp/index.d.ts +5 -0
  41. package/dist/src/components/otp/index.shadow.d.ts +6 -0
  42. package/dist/src/components/otp/mono-otp.d.ts +32 -0
  43. package/dist/src/components/otp/mono-otp.shadow.d.ts +30 -0
  44. package/dist/src/components/otp/otp-core.d.ts +91 -0
  45. package/dist/src/components/otp/otp-types.d.ts +161 -0
  46. package/dist/src/components/otp/otp-utils.d.ts +41 -0
  47. package/dist/src/components/select/select-core.d.ts +3 -0
  48. package/dist/src/components/select/select-types.d.ts +31 -0
  49. package/dist/src/components/slider/index.d.ts +5 -0
  50. package/dist/src/components/slider/index.shadow.d.ts +6 -0
  51. package/dist/src/components/slider/mono-slider.d.ts +33 -0
  52. package/dist/src/components/slider/mono-slider.shadow.d.ts +29 -0
  53. package/dist/src/components/slider/slider-core.d.ts +77 -0
  54. package/dist/src/components/slider/slider-math.d.ts +102 -0
  55. package/dist/src/components/slider/slider-types.d.ts +188 -0
  56. package/dist/src/components/tag-input/tag-input-core.d.ts +3 -0
  57. package/dist/src/components/tag-input/tag-input-types.d.ts +31 -0
  58. package/dist/src/components/textarea/textarea-core.d.ts +3 -0
  59. package/dist/src/components/textarea/textarea-types.d.ts +31 -0
  60. package/dist/src/composables/field-bubble.d.ts +34 -0
  61. package/dist/src/composables/field-icons.d.ts +10 -0
  62. package/dist/src/composables/field-tooltip.d.ts +52 -0
  63. package/dist/src/composables/field-validation.d.ts +58 -0
  64. package/dist/src/composables/popup-portal.d.ts +12 -0
  65. package/dist/src/composables/popup-stack.d.ts +21 -0
  66. package/dist/src/entries/index.d.ts +1 -1
  67. package/dist/src/entries/index.node.d.ts +1 -1
  68. package/dist/ssr-lit/runtime/components/LitWrapper.vue +11 -11
  69. package/dist/ssr-lit/runtime/components/LitWrapperClient.vue +11 -11
  70. package/dist/ssr-lit/runtime/components/LitWrapperServer.vue +38 -38
  71. package/dist/ssr-lit/runtime/plugins/antiFouc.server.js +25 -25
  72. package/dist/ssr-lit/runtime/plugins/hydrateSupport.client.js +4 -4
  73. package/dist/ssr-lit/runtime/plugins/polyfill.client.js +9 -9
  74. package/dist/ssr-lit/runtime/utils/customElements.js +11 -11
  75. package/dist/ssr-lit/runtime/utils/litElementRenderer.js +28 -28
  76. package/dist/{styles-D-ergrfR.js → styles-BODNpZV1.js} +1 -1
  77. package/dist/tooltip-Drekihf5.js +102 -0
  78. package/dist/tooltip-loader-3U9FTOXj.js +20 -0
  79. package/dist/tooltip-loader-Dcp9AUZn.js +23 -0
  80. package/dist/tooltip.js +3 -1
  81. package/dist/ui/accordion.js +16 -3
  82. package/dist/ui/alert.js +2 -2
  83. package/dist/ui/breadcrumb.js +1 -1
  84. package/dist/ui/button-dropdown.js +1 -1
  85. package/dist/ui/chart.js +1 -1
  86. package/dist/ui/date.js +66 -5
  87. package/dist/ui/drawer.js +11 -2
  88. package/dist/ui/dropdown-table.js +60 -5
  89. package/dist/ui/dropdown.js +3 -2
  90. package/dist/ui/file-upload.js +1 -1
  91. package/dist/ui/form.js +1 -1
  92. package/dist/ui/index.css +8857 -3974
  93. package/dist/ui/input.js +362 -260
  94. package/dist/ui/menu.js +1 -1
  95. package/dist/ui/modal.js +11 -2
  96. package/dist/ui/otp.js +835 -0
  97. package/dist/ui/select.js +67 -3
  98. package/dist/ui/shadow/accordion.js +31 -4
  99. package/dist/ui/shadow/alert.js +1 -1
  100. package/dist/ui/shadow/button-dropdown.js +1 -1
  101. package/dist/ui/shadow/chart.js +4 -4
  102. package/dist/ui/shadow/date.js +67 -6
  103. package/dist/ui/shadow/drawer.js +11 -2
  104. package/dist/ui/shadow/dropdown-table.js +62 -7
  105. package/dist/ui/shadow/dropdown.js +3 -2
  106. package/dist/ui/shadow/input.js +367 -261
  107. package/dist/ui/shadow/modal.js +11 -2
  108. package/dist/ui/shadow/otp.js +842 -0
  109. package/dist/ui/shadow/select.js +71 -6
  110. package/dist/ui/shadow/sidebar.js +2 -2
  111. package/dist/ui/shadow/slider.js +1082 -0
  112. package/dist/ui/shadow/table.js +6 -6
  113. package/dist/ui/shadow/tag-input.js +72 -7
  114. package/dist/ui/shadow/textarea.js +63 -2
  115. package/dist/ui/sidebar.js +2 -2
  116. package/dist/ui/slider.js +1079 -0
  117. package/dist/ui/table.js +2 -2
  118. package/dist/ui/tag-input.js +67 -3
  119. package/dist/ui/textarea.js +62 -1
  120. package/dist/ui/theme/luma.css +505 -466
  121. package/dist/ui/theme/lyra.css +505 -466
  122. package/dist/ui/theme/maia.css +501 -466
  123. package/dist/ui/theme/mira.css +505 -466
  124. package/dist/ui/theme/nova.css +503 -466
  125. package/dist/ui/theme/one.css +742 -699
  126. package/dist/ui/theme/rhea.css +506 -466
  127. package/dist/ui/theme/sera.css +507 -466
  128. package/dist/ui/theme/vega.css +495 -466
  129. package/dist/{vite-DcyRlTTf.js → vite-CivRCJaf.js} +2 -0
  130. package/dist/vite.js +1 -1
  131. package/dist/vue.d.ts +10 -0
  132. package/package.json +31 -13
  133. package/dist/input.css_raw-CGESifay.js +0 -5
@@ -0,0 +1,188 @@
1
+ import { VisibilityProps } from "../../composables/visibility.js";
2
+ import { MonoTooltipOptions } from "../tooltip/tooltip-types.js";
3
+ import { InputFormat, InputFormatCtx } from "../input/input-format.js";
4
+ //#region src/components/slider/slider-types.d.ts
5
+ export type SliderSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
6
+ export type SliderColor = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'teal' | 'purple' | 'neutral' | 'dark';
7
+ /** Which way the track runs. Vertical puts `min` at the bottom. */
8
+ export type SliderType = 'horizontal' | 'vertical';
9
+ /**
10
+ * What the coloured part of the track covers.
11
+ * - `auto`: from `min` to the thumb with one thumb; between the first and last thumb with several.
12
+ * - `start`: from `min` to the FIRST thumb.
13
+ * - `end`: from the LAST thumb to `max`.
14
+ * - `none`: no fill.
15
+ */
16
+ export type SliderFill = 'auto' | 'start' | 'end' | 'none';
17
+ /** When each thumb shows its value bubble. */
18
+ export type SliderValueTooltip = 'auto' | 'always' | 'never';
19
+ export type SliderValidationState = 'default' | 'valid' | 'invalid' | 'warning';
20
+ /** A slider value: one thumb is a number, several thumbs are an array (its length = the thumb count). */
21
+ export type SliderValue = number | number[];
22
+ /** One tick on the track. A bare number is a tick without a label. */
23
+ export type SliderMark = number | {
24
+ value: number;
25
+ label?: string;
26
+ };
27
+ export type SliderModelEventDetail = {
28
+ /** The value in the shape it came in: a number for a single-number model, an array otherwise. */
29
+ modelValue: SliderValue;
30
+ currentValue: SliderValue;
31
+ oldValue: SliderValue;
32
+ value: SliderValue;
33
+ /** Always an array, whatever the model's shape. */
34
+ values: number[];
35
+ /** The thumb that moved (-1 when the whole value was replaced, e.g. a segment drag moves two). */
36
+ index: number;
37
+ name?: string;
38
+ sourceEvent?: Event;
39
+ };
40
+ export type SliderModelEvent = CustomEvent<SliderModelEventDetail>;
41
+ export interface SliderCssClass {
42
+ root?: string;
43
+ label?: string;
44
+ required?: string;
45
+ value?: string;
46
+ control?: string;
47
+ track?: string;
48
+ fill?: string;
49
+ thumb?: string;
50
+ tooltip?: string;
51
+ marks?: string;
52
+ mark?: string;
53
+ markLabel?: string;
54
+ messageWrap?: string;
55
+ message?: string;
56
+ }
57
+ export interface SliderProps extends VisibilityProps {
58
+ /**
59
+ * The value: a number for one thumb, an array for several (`[20, 80]` is a range, `[2, 2, 3]`
60
+ * is three thumbs). The shape you pass is the shape you get back. A JSON string is accepted.
61
+ */
62
+ modelValue?: SliderValue | string;
63
+ 'model-value'?: SliderValue | string;
64
+ modelvalue?: SliderValue | string;
65
+ /** The same as `modelValue`. */
66
+ value?: SliderValue | string;
67
+ /** Lowest value. Default 0. */
68
+ min?: number | string;
69
+ /** Highest value. Default 100. */
70
+ max?: number | string;
71
+ /** Snap interval. Default 1; `0` slides continuously. Ignored when `stops` is set. */
72
+ step?: number | string;
73
+ /**
74
+ * Discrete snap points: the thumb can only land on these values (`[0, 10, 25, 50, 100]`).
75
+ * Replaces `step`. A JSON string is accepted.
76
+ */
77
+ stops?: number[] | string;
78
+ /** Smallest distance kept between neighbouring thumbs. Default 0 (thumbs may stack). */
79
+ minGap?: number | string;
80
+ 'min-gap'?: number | string;
81
+ mingap?: number | string;
82
+ /** `vertical` runs the track bottom (min) to top (max). Give it a `height`. */
83
+ type?: SliderType;
84
+ /**
85
+ * Tick marks: `true` for one at every step (or every stop), or a list of values / `{ value, label }`.
86
+ * Labels render under the track (beside it when vertical), drawn through `format-display` when
87
+ * a mark has no label of its own. A JSON string is accepted.
88
+ */
89
+ marks?: boolean | SliderMark[] | string;
90
+ /** What the coloured part of the track covers. Default `auto`. */
91
+ fill?: SliderFill;
92
+ /** Empty space cut out of the track around each thumb, in px (Material 3 style). Default 0. */
93
+ trackGap?: number | string;
94
+ 'track-gap'?: number | string;
95
+ trackgap?: number | string;
96
+ /** When each thumb shows its value bubble. Default `auto` (hover, focus or drag). */
97
+ valueTooltip?: SliderValueTooltip;
98
+ 'value-tooltip'?: SliderValueTooltip;
99
+ valuetooltip?: SliderValueTooltip;
100
+ /** Show the value at the end of the label row. Default `true`; `show-value="false"` hides it. */
101
+ showValue?: boolean;
102
+ 'show-value'?: boolean;
103
+ showvalue?: boolean;
104
+ /** Joins the values in the label-row readout. Default `" – "`. */
105
+ valueSeparator?: string;
106
+ 'value-separator'?: string;
107
+ valueseparator?: string;
108
+ /**
109
+ * How a value is DISPLAYED (readout, bubbles, mark labels, `aria-valuetext`): a pattern
110
+ * (`"{}%"`, `'"Rp "#,##0'`) or a function `({ value }) => string`. The model stays a number.
111
+ */
112
+ formatDisplay?: InputFormat;
113
+ 'format-display'?: InputFormat;
114
+ formatdisplay?: InputFormat;
115
+ /** Locale a numeric `format-display` pattern is drawn with. */
116
+ formatLocale?: string;
117
+ 'format-locale'?: string;
118
+ formatlocale?: string;
119
+ /** Visual size: scales the track, thumb and type. */
120
+ size?: SliderSize;
121
+ /** Accent colour of the fill and thumb. */
122
+ color?: SliderColor;
123
+ /** Label text above the slider. */
124
+ label?: string;
125
+ /** Helper text under the slider. */
126
+ helperText?: string;
127
+ 'helper-text'?: string;
128
+ helpertext?: string;
129
+ /**
130
+ * Info icon at the end of the label; hovering, focusing or tapping it shows this text.
131
+ * Plain text → a small built-in bubble (no dependency). Full tooltip options
132
+ * (`:tooltip.prop="{ content, placement, color }"`) → a `mono-tooltip`, which needs the
133
+ * optional `@floating-ui/dom` + `@floating-ui/core` peers (without them that form renders
134
+ * no icon). Shown only beside a label.
135
+ * This is NOT the thumb's value bubble — that is `value-tooltip`.
136
+ */
137
+ tooltip?: string | MonoTooltipOptions;
138
+ validationState?: SliderValidationState;
139
+ 'validation-state'?: SliderValidationState;
140
+ validationstate?: SliderValidationState;
141
+ validationMessage?: string;
142
+ 'validation-message'?: string;
143
+ validationmessage?: string;
144
+ error?: boolean;
145
+ errorMessage?: string;
146
+ 'error-message'?: string;
147
+ errormessage?: string;
148
+ success?: boolean;
149
+ successMessage?: string;
150
+ 'success-message'?: string;
151
+ successmessage?: string;
152
+ /** Disables interaction and dims the slider. */
153
+ disabled?: boolean;
154
+ /** Focusable, but the value cannot be changed. */
155
+ readonly?: boolean;
156
+ /** Marks the field required (asterisk + `aria-required`). */
157
+ required?: boolean;
158
+ /**
159
+ * Form field name. The element writes one hidden `<input>` per thumb, so a native `<form>`
160
+ * submits it (`name` for one thumb, `name[]` repeated for several).
161
+ */
162
+ name?: string;
163
+ /** Accessible label (each thumb adds "minimum" / "maximum" / its position). */
164
+ ariaLabelText?: string;
165
+ ariaLabel?: string;
166
+ 'aria-label'?: string;
167
+ arialabel?: string;
168
+ /** Track length when vertical (CSS length or px number). Default 200px. */
169
+ height?: string | number;
170
+ /** Width of the whole field (CSS length or px number). */
171
+ width?: string | number;
172
+ /** Per-part class overrides for internal elements. */
173
+ cssClass?: SliderCssClass;
174
+ /** Simple root class. */
175
+ 'css-class'?: string;
176
+ }
177
+ export interface SliderEvents {
178
+ /** While dragging / on every key press. */
179
+ input: SliderModelEvent;
180
+ /** On release / when keyboard interaction ends. */
181
+ change: SliderModelEvent;
182
+ 'mno-input': SliderModelEvent;
183
+ mnoInput: SliderModelEvent;
184
+ 'mno-change': SliderModelEvent;
185
+ mnoChange: SliderModelEvent;
186
+ }
187
+ //#endregion
188
+ export type { InputFormat as SliderFormat, InputFormatCtx as SliderFormatCtx };
@@ -1,6 +1,7 @@
1
1
  import { Constructor } from "../../composables/hybird-prop.js";
2
2
  import { CssSizeValue } from "../../composables/css-size.js";
3
3
  import { MonoSearchValue } from "../../search/data-search.js";
4
+ import { FieldTooltipController, FieldTooltipValue } from "../../composables/field-tooltip.js";
4
5
  import { TagInputChipProps, TagInputColor, TagInputCssClass, TagInputDataSource, TagInputDisplayGroup, TagInputDisplayValue, TagInputDropdownOptions, TagInputItem, TagInputLoadMore, TagInputSize, TagInputValidationState, TagInputValue, TagInputVariant } from "./tag-input-types.js";
5
6
  import { LateSlotWatcher } from "../../composables/light-slots.js";
6
7
  import { LitElement, TemplateResult } from "lit";
@@ -43,6 +44,8 @@ export declare class MonoTagInputCoreInterface {
43
44
  label: string;
44
45
  placeholder: string;
45
46
  helperText: string;
47
+ tooltip: FieldTooltipValue;
48
+ protected readonly _tooltip: FieldTooltipController;
46
49
  validationState: TagInputValidationState;
47
50
  validationMessage: string;
48
51
  errorMessage: string;
@@ -4,11 +4,16 @@ import { LoadMoreMode, MonoDataSource } from "../../composables/data-source-cont
4
4
  import { VisibilityProps } from "../../composables/visibility.js";
5
5
  import { MonoSearchValue } from "../../search/data-search.js";
6
6
  import { ChipBehaviour, ChipColor, ChipCssClass, ChipRounded, ChipSize, ChipVariant } from "../chip/chip-types.js";
7
+ import { MonoTooltipOptions } from "../tooltip/tooltip-types.js";
7
8
  import { ChipLimitProps } from "../../composables/chip-limits.js";
8
9
  //#region src/components/tag-input/tag-input-types.d.ts
9
10
  export type TagInputSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
10
11
  export type TagInputColor = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'teal' | 'purple' | 'neutral' | 'dark';
11
12
  export type TagInputVariant = 'outlined' | 'filled' | 'underlined';
13
+ /** Where the label sits: above the box (default), notched into its top border (inset for filled / underlined), or beside it. */
14
+ export type TagInputLabelPosition = 'top' | 'notched' | 'left' | 'right';
15
+ /** Where the validation message shows: under the box (default), behind a state icon inside it, or floating under it on hover / focus. */
16
+ export type TagInputValidationPosition = 'bottom' | 'icon' | 'float';
12
17
  /**
13
18
  * Configuration for the tag chips inside the field, passed as one object:
14
19
  * `<mono-tag-input :chip.prop="{ size: 'md', shape: 'rounded', dot: true }">`.
@@ -270,6 +275,24 @@ export interface TagInputProps extends VisibilityProps {
270
275
  color?: TagInputColor;
271
276
  /** Visual style of the tag input. */
272
277
  variant?: TagInputVariant;
278
+ /**
279
+ * Where the label sits: `top` (above the box, default), `notched` (on the top
280
+ * border for outlined; inset inside the box for filled / underlined), or
281
+ * `left` / `right` of the box. Knobs: `--mono-tag-input-label-width`, `-label-side-gap`,
282
+ * `-label-notch-font-size`, `-label-notch-bg`.
283
+ */
284
+ labelPosition?: TagInputLabelPosition;
285
+ 'label-position'?: TagInputLabelPosition;
286
+ labelposition?: TagInputLabelPosition;
287
+ /**
288
+ * Where the validation message shows. `bottom` (default): the row under the box.
289
+ * `icon`: a state icon inside the box; hover / tap / keyboard focus shows the message in
290
+ * a state-coloured bubble. `float`: the message floats under the box only while the field
291
+ * is hovered or focused. In `icon` / `float` the row under the box keeps the helper text.
292
+ */
293
+ validationPosition?: TagInputValidationPosition;
294
+ 'validation-position'?: TagInputValidationPosition;
295
+ validationposition?: TagInputValidationPosition;
273
296
  /**
274
297
  * Tag chip configuration — the `mono-chip` props to apply to every tag.
275
298
  * Bind it as a real property (`:chip.prop="{ size: 'md' }"`); a plain
@@ -284,6 +307,14 @@ export interface TagInputProps extends VisibilityProps {
284
307
  helperText?: string;
285
308
  'helper-text'?: string;
286
309
  helpertext?: string;
310
+ /**
311
+ * Info icon at the end of the label; hovering, focusing or tapping it shows this text.
312
+ * Plain text → a small built-in bubble (no dependency). Full tooltip options
313
+ * (`:tooltip.prop="{ content, placement, color }"`) → a `mono-tooltip`, which needs the
314
+ * optional `@floating-ui/dom` + `@floating-ui/core` peers (without them that form renders
315
+ * no icon). Shown only beside a label.
316
+ */
317
+ tooltip?: string | MonoTooltipOptions;
287
318
  /** Validation state controlling field styling. */
288
319
  validationState?: TagInputValidationState;
289
320
  'validation-state'?: TagInputValidationState;
@@ -1,5 +1,6 @@
1
1
  import { Constructor } from "../../composables/hybird-prop.js";
2
2
  import { CssSizeValue } from "../../composables/css-size.js";
3
+ import { FieldTooltipController, FieldTooltipValue } from "../../composables/field-tooltip.js";
3
4
  import { TextareaColor, TextareaCssClass, TextareaSize, TextareaValidationState, TextareaVariant } from "./textarea-types.js";
4
5
  import { LitElement, TemplateResult } from "lit";
5
6
  //#region src/components/textarea/textarea-core.d.ts
@@ -25,6 +26,8 @@ export declare class MonoTextareaCoreInterface {
25
26
  placeholder: string;
26
27
  label: string;
27
28
  helperText: string;
29
+ tooltip: FieldTooltipValue;
30
+ protected readonly _tooltip: FieldTooltipController;
28
31
  validationState: TextareaValidationState;
29
32
  validationMessage: string;
30
33
  errorMessage: string;
@@ -1,8 +1,13 @@
1
1
  import { VisibilityProps } from "../../composables/visibility.js";
2
+ import { MonoTooltipOptions } from "../tooltip/tooltip-types.js";
2
3
  //#region src/components/textarea/textarea-types.d.ts
3
4
  export type TextareaSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
4
5
  export type TextareaColor = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'teal' | 'purple' | 'neutral' | 'dark';
5
6
  export type TextareaVariant = 'outlined' | 'filled' | 'underlined';
7
+ /** Where the label sits: above the box (default), notched into its top border (inset for filled / underlined), or beside it. */
8
+ export type TextareaLabelPosition = 'top' | 'notched' | 'left' | 'right';
9
+ /** Where the validation message shows: under the box (default), behind a state icon inside it, or floating under it on hover / focus. */
10
+ export type TextareaValidationPosition = 'bottom' | 'icon' | 'float';
6
11
  export type TextareaValidationState = 'default' | 'valid' | 'invalid' | 'warning';
7
12
  export interface TextareaCssClass {
8
13
  root?: string;
@@ -40,6 +45,14 @@ export interface TextareaProps extends VisibilityProps {
40
45
  helperText?: string;
41
46
  'helper-text'?: string;
42
47
  helpertext?: string;
48
+ /**
49
+ * Info icon at the end of the label; hovering, focusing or tapping it shows this text.
50
+ * Plain text → a small built-in bubble (no dependency). Full tooltip options
51
+ * (`:tooltip.prop="{ content, placement, color }"`) → a `mono-tooltip`, which needs the
52
+ * optional `@floating-ui/dom` + `@floating-ui/core` peers (without them that form renders
53
+ * no icon). Shown only beside a label.
54
+ */
55
+ tooltip?: string | MonoTooltipOptions;
43
56
  /** Validation state controlling field styling. */
44
57
  validationState?: TextareaValidationState;
45
58
  'validation-state'?: TextareaValidationState;
@@ -62,6 +75,24 @@ export interface TextareaProps extends VisibilityProps {
62
75
  color?: TextareaColor;
63
76
  /** Visual style of the textarea. */
64
77
  variant?: TextareaVariant;
78
+ /**
79
+ * Where the label sits: `top` (above the box, default), `notched` (on the top
80
+ * border for outlined; inset inside the box for filled / underlined), or
81
+ * `left` / `right` of the box. Knobs: `--mono-textarea-label-width`, `-label-side-gap`,
82
+ * `-label-notch-font-size`, `-label-notch-bg`.
83
+ */
84
+ labelPosition?: TextareaLabelPosition;
85
+ 'label-position'?: TextareaLabelPosition;
86
+ labelposition?: TextareaLabelPosition;
87
+ /**
88
+ * Where the validation message shows. `bottom` (default): the row under the box.
89
+ * `icon`: a state icon inside the box; hover / tap / keyboard focus shows the message in
90
+ * a state-coloured bubble. `float`: the message floats under the box only while the field
91
+ * is hovered or focused. In `icon` / `float` the row under the box keeps the helper text.
92
+ */
93
+ validationPosition?: TextareaValidationPosition;
94
+ 'validation-position'?: TextareaValidationPosition;
95
+ validationposition?: TextareaValidationPosition;
65
96
  /** Disables interaction with the textarea. */
66
97
  disabled?: boolean;
67
98
  /** Makes the textarea read-only. */
@@ -0,0 +1,34 @@
1
+ //#region src/composables/field-bubble.d.ts
2
+ export interface FieldBubbleOptions {
3
+ /** Preferred side of the anchor; flips when it doesn't fit. Default `top`. */
4
+ side?: 'top' | 'bottom';
5
+ /** `center` on the anchor (tooltip), or `start` = flush with its left edge (a message under a box). */
6
+ align?: 'center' | 'start';
7
+ }
8
+ export declare class FieldBubble {
9
+ /** For `id` / `aria-describedby`. */
10
+ readonly id: string;
11
+ private _anchor;
12
+ private _bubble;
13
+ private _open;
14
+ private _hideTimer;
15
+ private readonly _side;
16
+ private readonly _align;
17
+ constructor(options?: FieldBubbleOptions);
18
+ get isOpen(): boolean;
19
+ /** `ref` callback for the element the bubble points at. */
20
+ setAnchor: (el: Element | undefined | null) => void;
21
+ /** `ref` callback for the bubble itself — a new node closes the old one. */
22
+ setBubble: (el: Element | undefined) => void;
23
+ show: () => void;
24
+ hide: () => void;
25
+ scheduleHide: () => void;
26
+ cancelHide: () => void;
27
+ /** `pointerleave` handler: a touch "leaves" on lift — that would close what the tap just opened. */
28
+ onPointerLeave: (e: PointerEvent) => void;
29
+ /** `keydown` handler: Escape closes. */
30
+ onKeydown: (e: KeyboardEvent) => void;
31
+ /** Fixed-position the bubble on its side of the anchor (the other if it doesn't fit), clamped to the viewport. */
32
+ place: () => void;
33
+ }
34
+ //#endregion
@@ -14,4 +14,14 @@ export declare function chevronIcon(dir: -1 | 1): TemplateResult;
14
14
  export declare function spinnerIcon(): TemplateResult;
15
15
  /** ↻ — the retry affordance a field shows after its data source failed. */
16
16
  export declare function refreshIcon(): TemplateResult;
17
+ /**
18
+ * ⓘ — the label's "more information" affordance (`tooltip` prop). The
19
+ * `mdi:information-outline` path, so the shadow builds draw exactly what the
20
+ * light build's `i-mdi-information-outline` mask paints.
21
+ */
22
+ export declare function infoIcon(): TemplateResult;
23
+ /** `validation-position="icon"` — mdi alert-circle-outline (invalid / warning). */
24
+ export declare function alertCircleIcon(): TemplateResult;
25
+ /** `validation-position="icon"` — mdi check-circle-outline (valid). */
26
+ export declare function checkCircleIcon(): TemplateResult;
17
27
  //#endregion
@@ -0,0 +1,52 @@
1
+ import { MonoTooltipOptions } from "../components/tooltip/tooltip-types.js";
2
+ import { ReactiveController, ReactiveControllerHost, TemplateResult, nothing } from "lit";
3
+ //#region src/composables/field-tooltip.d.ts
4
+ /** What the `tooltip` prop accepts: plain text, or full tooltip options. */
5
+ export type FieldTooltipValue = string | MonoTooltipOptions | null | undefined | false;
6
+ /** @internal — tests: forget the cached probe so a re-mocked peer is probed again. */
7
+ export declare function resetFieldTooltipProbe(): void;
8
+ /** `string` → `{ content }`; anything without content → `null` (renders nothing). */
9
+ export declare function normalizeFieldTooltip(value: FieldTooltipValue): MonoTooltipOptions | null;
10
+ /** A click on the bubble is still inside the `<label>` and the icon: neither should react. */
11
+ export declare const stopBubbleClick: (e: Event) => void;
12
+ export declare class FieldTooltipController implements ReactiveController {
13
+ private readonly host;
14
+ private readonly read;
15
+ private _fn;
16
+ private _ctrl;
17
+ private _el;
18
+ /** The options last handed to the controller — keys dropped since get blanked. */
19
+ private _applied;
20
+ /** The raw prop value behind `_applied` — a string re-normalizes to a new object every time. */
21
+ private _raw;
22
+ private _connected;
23
+ /** The built-in bubble behind a plain-text tooltip. */
24
+ private readonly _bubble;
25
+ constructor(host: ReactiveControllerHost & {
26
+ readonly renderRoot?: Node;
27
+ }, read: () => FieldTooltipValue);
28
+ hostConnected(): void;
29
+ hostDisconnected(): void;
30
+ hostUpdated(): void;
31
+ /** The ⓘ for the end of the label row, or `nothing`. */
32
+ render(): TemplateResult | typeof nothing;
33
+ /**
34
+ * Plain text: the icon carries its own bubble. `aria-describedby` reads the
35
+ * text to screen readers on focus; hover, focus or a tap shows it, Escape
36
+ * dismisses it, and the pointer may move onto it without it closing.
37
+ */
38
+ private _renderSimple;
39
+ /**
40
+ * Light build: the UnoCSS `i-mdi-information-outline` mask (shipped in
41
+ * `ui/index.css`). Shadow build: the same path inline — the page's icon CSS
42
+ * cannot reach a shadow root.
43
+ */
44
+ private _icon;
45
+ private _ensureProbe;
46
+ private _setEl;
47
+ private _sync;
48
+ private _unbind;
49
+ /** Touch has no hover: a tap shows it, and it closes when focus leaves. */
50
+ private _onIconClick;
51
+ }
52
+ //#endregion
@@ -0,0 +1,58 @@
1
+ import { ReactiveController, ReactiveControllerHost, TemplateResult, nothing } from "lit";
2
+ //#region src/composables/field-validation.d.ts
3
+ export type FieldValidationPosition = 'bottom' | 'icon' | 'float';
4
+ /** The normalized state painted on the icon / bubbles. */
5
+ export type FieldValidationTone = 'invalid' | 'warning' | 'valid';
6
+ export interface FieldValidationRead {
7
+ position: FieldValidationPosition | string | undefined;
8
+ /** The component's own state name (`invalid` / `error` / `warning` / `valid` / `success` / `default`). */
9
+ state: string | undefined;
10
+ /** The validation message; empty → nothing moves. */
11
+ text: string | undefined | null;
12
+ /** While the control's own popup (dropdown, calendar) is open the float bubble stays closed. */
13
+ suppressed?: boolean;
14
+ }
15
+ export interface FieldValidationNotice {
16
+ position: 'icon' | 'float';
17
+ tone: FieldValidationTone;
18
+ text: string;
19
+ }
20
+ export declare class FieldValidationController implements ReactiveController {
21
+ private readonly host;
22
+ private readonly read;
23
+ private readonly getBox;
24
+ private readonly _iconBubble;
25
+ private readonly _floatBubble;
26
+ private _hovered;
27
+ private _focused;
28
+ constructor(host: ReactiveControllerHost & HTMLElement, read: () => FieldValidationRead, getBox: () => Element | null | undefined);
29
+ /** The message that moved out of the bottom row, or `null` (bottom mode / no text). */
30
+ get notice(): FieldValidationNotice | null;
31
+ /** True when the bottom row should show the helper and keep the validation text sr-only. */
32
+ get moved(): boolean;
33
+ hostConnected(): void;
34
+ hostDisconnected(): void;
35
+ hostUpdated(): void;
36
+ /** Re-evaluate the float bubble — for popups the host opens without a re-render (date's calendar). */
37
+ refresh(): void;
38
+ /**
39
+ * `icon` mode: the state icon for inside the box (before the clear button /
40
+ * actions). `anchored` wraps it in a zero-height `[mono-validation-anchor]`
41
+ * — for the textarea, whose box can't hold children.
42
+ */
43
+ renderIcon(options?: {
44
+ anchored?: boolean;
45
+ }): TemplateResult | typeof nothing;
46
+ /** `float` mode: the bubble that floats under the box while the field is hovered or focused. */
47
+ renderFloat(): TemplateResult | typeof nothing;
48
+ /** Light build: UnoCSS mask icons; shadow build: inline SVG (page icon CSS can't reach a shadow root). */
49
+ private _glyph;
50
+ /** Touch has no hover: a tap shows the tip — and must not open / focus the control underneath. */
51
+ private _onIconClick;
52
+ private _onEnter;
53
+ private _onLeave;
54
+ private _onFocusIn;
55
+ private _onFocusOut;
56
+ private _syncFloat;
57
+ }
58
+ //#endregion
@@ -188,6 +188,18 @@ export declare class PopupPortalController implements ReactiveController, PopupL
188
188
  * in the library asks this method.
189
189
  */
190
190
  containsInPath(path: EventTarget[]): boolean;
191
+ /**
192
+ * PopupLayer hook — this popup's OWN containment: its portaled panel or a popup
193
+ * opened from inside it. Never the layers above (that is `inLayerAbove`), so
194
+ * `pathInLayerAbove` walking the stack does not recurse.
195
+ */
196
+ containsEventPath(path: EventTarget[]): boolean;
197
+ /**
198
+ * True when the path lands in a layer opened ABOVE this popup while it is open
199
+ * — a modal opened from a figure in this panel, say. That layer is on top of the
200
+ * panel, not outside it, so its clicks, focus and Escape are not a dismiss.
201
+ */
202
+ inLayerAbove(path: EventTarget[]): boolean;
191
203
  /**
192
204
  * True when the path passes through a popup opened from INSIDE this one
193
205
  * (at any depth) — not this popup's own panel.
@@ -38,6 +38,12 @@ export interface PopupLayer {
38
38
  * underneath the very dialog it belongs to.
39
39
  */
40
40
  readonly pinnedZ?: number;
41
+ /**
42
+ * True when an event's composed path lands inside THIS layer — its own
43
+ * surface and any popup opened from within it, never the layers above it.
44
+ * What `pathInLayerAbove` asks each layer stacked over another one.
45
+ */
46
+ containsEventPath?(path: EventTarget[]): boolean;
41
47
  }
42
48
  /** Add a layer to the top of the stack (call on open). */
43
49
  export declare function registerPopupLayer(layer: PopupLayer): void;
@@ -69,4 +75,19 @@ export declare function setExternalScrollLock(owner: object, wanted: boolean): v
69
75
  * own type — filter the returned list by `instanceof`.
70
76
  */
71
77
  export declare function getOpenPopupLayers(): readonly PopupLayer[];
78
+ /**
79
+ * True when an event's composed path lands inside a layer opened AFTER `layer`
80
+ * — one stacked above it.
81
+ *
82
+ * The other half of the "topmost only" rule modal and drawer apply to their own
83
+ * outside click. A dropdown open under a dialog that was opened from its panel
84
+ * (a figure in a tag-input option opening a breakdown modal) must not read a
85
+ * click or focus in that dialog as "outside": the dialog is not behind the
86
+ * panel, it is on top of it. Ownership (`pathOwnedBy`) cannot tell, because the
87
+ * dialog's element usually lives elsewhere on the page, not inside the panel.
88
+ *
89
+ * A layer opened BEFORE `layer` (the modal a dropdown sits in) is below it and
90
+ * does not count, so a click in that modal's body still closes the dropdown.
91
+ */
92
+ export declare function pathInLayerAbove(layer: PopupLayer, path: EventTarget[]): boolean;
72
93
  //#endregion
@@ -14,6 +14,7 @@ import { MonoChartAgg, MonoChartAggregateCtx, MonoChartController, MonoChartData
14
14
  import { arrayToODataString, arrayToTree, odataStringToArray, treeToArray } from "../components/filter/filter-odata.js";
15
15
  import { MonoChartOdataRequest, buildChartApply, buildChartOdataRequest, composeApply } from "../components/chart/chart-odata.js";
16
16
  import { controlMonoChart as monoChart } from "../components/chart/mono-data-chart.js";
17
+ import { MonoTooltipColor, MonoTooltipContent, MonoTooltipController, MonoTooltipGlobal, MonoTooltipGlobalOptions, MonoTooltipOptions, MonoTooltipPlacement, MonoTooltipSize, MonoTooltipTarget, MonoTooltipTrigger, MonoTooltipVariant } from "../components/tooltip/tooltip-types.js";
17
18
  import { MonoDataDropdownOptions, MonoDropdownController, MonoDropdownItem, controlMonoDataDropdown as monoDataDropdown } from "../components/dropdown-table/mono-data-dropdown.js";
18
19
  import { controlMonoFilterBuilder as monoFilterBuilder } from "../components/filter/filter-builder.js";
19
20
  import { DEFAULT_TEXTS, OPERATOR_ARITY, operatorsFor } from "../components/filter/filter-operators.js";
@@ -24,7 +25,6 @@ import { controlMonoModal as monoModal } from "../components/modal/mono-modal-co
24
25
  import { MonoArraySourceOptions, monoArraySource } from "../components/table/array-source.js";
25
26
  import { FieldSegment, ODataClause, ParsedFieldPath, getFieldValue, isPath, mergePatch, parseFieldPath, setFieldValue, toODataClause, toODataSelector } from "../search/field-path.js";
26
27
  import { TableCheckboxProps, TableDetailProps, TableInfoProps, TableLoadingProps, TablePageSizeProps, TablePagingProps, TableSearchProps, TableSortProps, TableSummaryProps, TableThProps, TableThSort } from "../components/table/table-types.js";
27
- import { MonoTooltipColor, MonoTooltipContent, MonoTooltipController, MonoTooltipGlobal, MonoTooltipGlobalOptions, MonoTooltipOptions, MonoTooltipPlacement, MonoTooltipSize, MonoTooltipTarget, MonoTooltipTrigger, MonoTooltipVariant } from "../components/tooltip/tooltip-types.js";
28
28
  import { controlMonoTooltip, monoTooltip } from "../components/tooltip/control-tooltip.js";
29
29
  import { createMonoTooltip, destroyAllMonoTooltips, resetMonoTooltip } from "../components/tooltip/tooltip-declarative.js";
30
30
  import { getMonoTooltipGlobal } from "../components/tooltip/tooltip-config.js";
@@ -14,6 +14,7 @@ import { MonoChartAgg, MonoChartAggregateCtx, MonoChartController, MonoChartData
14
14
  import { arrayToODataString, arrayToTree, odataStringToArray, treeToArray } from "../components/filter/filter-odata.js";
15
15
  import { MonoChartOdataRequest, buildChartApply, buildChartOdataRequest, composeApply } from "../components/chart/chart-odata.js";
16
16
  import { controlMonoChart as monoChart } from "../components/chart/mono-data-chart.js";
17
+ import { MonoTooltipColor, MonoTooltipContent, MonoTooltipController, MonoTooltipGlobal, MonoTooltipGlobalOptions, MonoTooltipOptions, MonoTooltipPlacement, MonoTooltipSize, MonoTooltipTarget, MonoTooltipTrigger, MonoTooltipVariant } from "../components/tooltip/tooltip-types.js";
17
18
  import { MonoDataDropdownOptions, MonoDropdownController, MonoDropdownItem, controlMonoDataDropdown as monoDataDropdown } from "../components/dropdown-table/mono-data-dropdown.js";
18
19
  import { controlMonoFilterBuilder as monoFilterBuilder } from "../components/filter/filter-builder.js";
19
20
  import { DEFAULT_TEXTS, OPERATOR_ARITY, operatorsFor } from "../components/filter/filter-operators.js";
@@ -24,7 +25,6 @@ import { controlMonoModal as monoModal } from "../components/modal/mono-modal-co
24
25
  import { MonoArraySourceOptions, monoArraySource } from "../components/table/array-source.js";
25
26
  import { FieldSegment, ODataClause, ParsedFieldPath, getFieldValue, isPath, mergePatch, parseFieldPath, setFieldValue, toODataClause, toODataSelector } from "../search/field-path.js";
26
27
  import { TableCheckboxProps, TableDetailProps, TableInfoProps, TableLoadingProps, TablePageSizeProps, TablePagingProps, TableSearchProps, TableSortProps, TableSummaryProps, TableThProps, TableThSort } from "../components/table/table-types.js";
27
- import { MonoTooltipColor, MonoTooltipContent, MonoTooltipController, MonoTooltipGlobal, MonoTooltipGlobalOptions, MonoTooltipOptions, MonoTooltipPlacement, MonoTooltipSize, MonoTooltipTarget, MonoTooltipTrigger, MonoTooltipVariant } from "../components/tooltip/tooltip-types.js";
28
28
  import { controlMonoTooltip, monoTooltip } from "../components/tooltip/control-tooltip.js";
29
29
  import { createMonoTooltip, destroyAllMonoTooltips, resetMonoTooltip } from "../components/tooltip/tooltip-declarative.js";
30
30
  import { getMonoTooltipGlobal } from "../components/tooltip/tooltip-config.js";
@@ -1,11 +1,11 @@
1
- <script>
2
- import { h, defineComponent, defineAsyncComponent } from "vue";
3
- import LitWrapperClient from "./LitWrapperClient.vue";
4
- const LitWrapperServer = defineAsyncComponent(() => import("./LitWrapperServer.vue"));
5
- export default defineComponent({
6
- name: "LitWrapper",
7
- render() {
8
- return h(import.meta.server ? LitWrapperServer : LitWrapperClient, this.$slots.default);
9
- }
10
- });
11
- </script>
1
+ <script>
2
+ import { h, defineComponent, defineAsyncComponent } from "vue";
3
+ import LitWrapperClient from "./LitWrapperClient.vue";
4
+ const LitWrapperServer = defineAsyncComponent(() => import("./LitWrapperServer.vue"));
5
+ export default defineComponent({
6
+ name: "LitWrapper",
7
+ render() {
8
+ return h(import.meta.server ? LitWrapperServer : LitWrapperClient, this.$slots.default);
9
+ }
10
+ });
11
+ </script>
@@ -1,11 +1,11 @@
1
- <script>
2
- import { defineComponent } from "vue";
3
- export default defineComponent({
4
- setup(_, context) {
5
- return () => context.slots.default?.()?.[0];
6
- },
7
- mounted() {
8
- this.$el?.removeAttribute?.("defer-hydration");
9
- }
10
- });
11
- </script>
1
+ <script>
2
+ import { defineComponent } from "vue";
3
+ export default defineComponent({
4
+ setup(_, context) {
5
+ return () => context.slots.default?.()?.[0];
6
+ },
7
+ mounted() {
8
+ this.$el?.removeAttribute?.("defer-hydration");
9
+ }
10
+ });
11
+ </script>