stimeo-ui 0.13.0 → 0.15.0
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/CHANGELOG.md +73 -5
- package/dist/cable/index.d.ts +1 -1
- package/dist/cable/index.js +60 -14
- package/dist/cable/index.js.map +1 -1
- package/dist/controllers/accordion_controller.d.ts +1 -1
- package/dist/controllers/accordion_controller.js.map +1 -1
- package/dist/controllers/announcer_controller.js +88 -61
- package/dist/controllers/announcer_controller.js.map +1 -1
- package/dist/controllers/auto_submit_controller.js +40 -5
- package/dist/controllers/auto_submit_controller.js.map +1 -1
- package/dist/controllers/breadcrumb_controller.js +29 -3
- package/dist/controllers/breadcrumb_controller.js.map +1 -1
- package/dist/controllers/calendar_controller.d.ts +20 -4
- package/dist/controllers/calendar_controller.js +51 -10
- package/dist/controllers/calendar_controller.js.map +1 -1
- package/dist/controllers/carousel_controller.js +8 -6
- package/dist/controllers/carousel_controller.js.map +1 -1
- package/dist/controllers/checkbox_controller.js +27 -2
- package/dist/controllers/checkbox_controller.js.map +1 -1
- package/dist/controllers/clipboard_controller.d.ts +1 -1
- package/dist/controllers/clipboard_controller.js.map +1 -1
- package/dist/controllers/collapsible_controller.d.ts +1 -1
- package/dist/controllers/collapsible_controller.js.map +1 -1
- package/dist/controllers/conditional_fields_controller.js +36 -7
- package/dist/controllers/conditional_fields_controller.js.map +1 -1
- package/dist/controllers/count_up_controller.js.map +1 -1
- package/dist/controllers/currency_input_controller.d.ts +4 -2
- package/dist/controllers/currency_input_controller.js +77 -25
- package/dist/controllers/currency_input_controller.js.map +1 -1
- package/dist/controllers/date_range_picker_controller.d.ts +10 -3
- package/dist/controllers/date_range_picker_controller.js +43 -10
- package/dist/controllers/date_range_picker_controller.js.map +1 -1
- package/dist/controllers/dialog_controller.d.ts +2 -2
- package/dist/controllers/dialog_controller.js.map +1 -1
- package/dist/controllers/direct_upload_controller.js +21 -10
- package/dist/controllers/direct_upload_controller.js.map +1 -1
- package/dist/controllers/dirty_form_controller.js +32 -12
- package/dist/controllers/dirty_form_controller.js.map +1 -1
- package/dist/controllers/dismissible_controller.d.ts +1 -1
- package/dist/controllers/dismissible_controller.js.map +1 -1
- package/dist/controllers/dropdown_controller.d.ts +1 -1
- package/dist/controllers/dropdown_controller.js.map +1 -1
- package/dist/controllers/flash_controller.js +145 -43
- package/dist/controllers/flash_controller.js.map +1 -1
- package/dist/controllers/form_field_controller.js +7 -1
- package/dist/controllers/form_field_controller.js.map +1 -1
- package/dist/controllers/frame_loading_controller.js +29 -6
- package/dist/controllers/frame_loading_controller.js.map +1 -1
- package/dist/controllers/highlight_controller.js +63 -23
- package/dist/controllers/highlight_controller.js.map +1 -1
- package/dist/controllers/input_mask_controller.d.ts +3 -2
- package/dist/controllers/input_mask_controller.js +33 -12
- package/dist/controllers/input_mask_controller.js.map +1 -1
- package/dist/controllers/intersection_controller.js +10 -5
- package/dist/controllers/intersection_controller.js.map +1 -1
- package/dist/controllers/lazy_frame_controller.js +10 -5
- package/dist/controllers/lazy_frame_controller.js.map +1 -1
- package/dist/controllers/local_time_controller.d.ts +3 -2
- package/dist/controllers/local_time_controller.js +43 -11
- package/dist/controllers/local_time_controller.js.map +1 -1
- package/dist/controllers/masonry_controller.d.ts +4 -4
- package/dist/controllers/masonry_controller.js +32 -14
- package/dist/controllers/masonry_controller.js.map +1 -1
- package/dist/controllers/menu_controller.js +10 -2
- package/dist/controllers/menu_controller.js.map +1 -1
- package/dist/controllers/menubar_controller.js +10 -2
- package/dist/controllers/menubar_controller.js.map +1 -1
- package/dist/controllers/navigation_menu_controller.js +8 -2
- package/dist/controllers/navigation_menu_controller.js.map +1 -1
- package/dist/controllers/optimistic_controller.js +28 -4
- package/dist/controllers/optimistic_controller.js.map +1 -1
- package/dist/controllers/otp_controller.js +23 -10
- package/dist/controllers/otp_controller.js.map +1 -1
- package/dist/controllers/overflow_indicator_controller.js +31 -8
- package/dist/controllers/overflow_indicator_controller.js.map +1 -1
- package/dist/controllers/overflow_menu_controller.js +39 -4
- package/dist/controllers/overflow_menu_controller.js.map +1 -1
- package/dist/controllers/password_reveal_controller.d.ts +1 -1
- package/dist/controllers/password_reveal_controller.js.map +1 -1
- package/dist/controllers/pointer_drag_controller.js +10 -3
- package/dist/controllers/pointer_drag_controller.js.map +1 -1
- package/dist/controllers/portal_controller.js +21 -10
- package/dist/controllers/portal_controller.js.map +1 -1
- package/dist/controllers/radio_group_controller.js +11 -3
- package/dist/controllers/radio_group_controller.js.map +1 -1
- package/dist/controllers/read_more_controller.d.ts +1 -1
- package/dist/controllers/read_more_controller.js +31 -5
- package/dist/controllers/read_more_controller.js.map +1 -1
- package/dist/controllers/reading_progress_controller.js +65 -19
- package/dist/controllers/reading_progress_controller.js.map +1 -1
- package/dist/controllers/relative_time_controller.js +40 -9
- package/dist/controllers/relative_time_controller.js.map +1 -1
- package/dist/controllers/reset_before_cache_controller.js +23 -10
- package/dist/controllers/reset_before_cache_controller.js.map +1 -1
- package/dist/controllers/resizable_controller.js +7 -2
- package/dist/controllers/resizable_controller.js.map +1 -1
- package/dist/controllers/roving_controller.js +7 -3
- package/dist/controllers/roving_controller.js.map +1 -1
- package/dist/controllers/scroll_area_controller.js +70 -26
- package/dist/controllers/scroll_area_controller.js.map +1 -1
- package/dist/controllers/scroll_restore_controller.js +37 -16
- package/dist/controllers/scroll_restore_controller.js.map +1 -1
- package/dist/controllers/scroll_visibility_controller.d.ts +1 -1
- package/dist/controllers/scroll_visibility_controller.js +71 -42
- package/dist/controllers/scroll_visibility_controller.js.map +1 -1
- package/dist/controllers/scrollspy_controller.d.ts +1 -1
- package/dist/controllers/scrollspy_controller.js +76 -32
- package/dist/controllers/scrollspy_controller.js.map +1 -1
- package/dist/controllers/smart_sticky_header_controller.js +72 -37
- package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
- package/dist/controllers/stick_to_bottom_controller.js +29 -3
- package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
- package/dist/controllers/sticky_observer_controller.js +10 -5
- package/dist/controllers/sticky_observer_controller.js.map +1 -1
- package/dist/controllers/submit_once_controller.js +29 -6
- package/dist/controllers/submit_once_controller.js.map +1 -1
- package/dist/controllers/switch_controller.d.ts +1 -1
- package/dist/controllers/switch_controller.js.map +1 -1
- package/dist/controllers/tabs_controller.d.ts +1 -1
- package/dist/controllers/tabs_controller.js.map +1 -1
- package/dist/controllers/textarea_autosize_controller.js +29 -3
- package/dist/controllers/textarea_autosize_controller.js.map +1 -1
- package/dist/controllers/theme_controller.d.ts +2 -3
- package/dist/controllers/theme_controller.js +23 -13
- package/dist/controllers/theme_controller.js.map +1 -1
- package/dist/controllers/toast_controller.d.ts +3 -0
- package/dist/controllers/toast_controller.js +136 -73
- package/dist/controllers/toast_controller.js.map +1 -1
- package/dist/controllers/toggle_group_controller.js +11 -3
- package/dist/controllers/toggle_group_controller.js.map +1 -1
- package/dist/controllers/toolbar_controller.js +7 -3
- package/dist/controllers/toolbar_controller.js.map +1 -1
- package/dist/controllers/transition_controller.js.map +1 -1
- package/dist/index.js +629 -597
- package/dist/index.js.map +1 -1
- package/dist/inspector/cli.d.ts +38 -1
- package/dist/inspector/cli.js +80 -7
- package/dist/inspector/cli.js.map +1 -1
- package/dist/inspector/cli_bin.js +103 -7
- package/dist/inspector/cli_bin.js.map +1 -1
- package/dist/inspector/examples.json +5 -5
- package/dist/inspector/manifest.json +131 -3
- package/package.json +9 -11
|
@@ -71,6 +71,30 @@ function announcerSeatingDiagnostic(sources) {
|
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
// src/utils/declared_value.ts
|
|
75
|
+
function parseDeclared(raw, parse, fallback) {
|
|
76
|
+
try {
|
|
77
|
+
return parse(raw);
|
|
78
|
+
} catch {
|
|
79
|
+
return fallback;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function compileRegExp(source, anchor = "none") {
|
|
83
|
+
return parseDeclared(
|
|
84
|
+
source,
|
|
85
|
+
(text) => {
|
|
86
|
+
const bare = new RegExp(text);
|
|
87
|
+
return anchor === "exact" ? new RegExp(`^(?:${text})$`) : bare;
|
|
88
|
+
},
|
|
89
|
+
null
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
function parseJsonObject(raw) {
|
|
93
|
+
const parsed = parseDeclared(raw, (text) => JSON.parse(text), null);
|
|
94
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) return null;
|
|
95
|
+
return parsed;
|
|
96
|
+
}
|
|
97
|
+
|
|
74
98
|
// src/inspector/html_parser.ts
|
|
75
99
|
var ERB_ELEMENT_TAG = "#erb";
|
|
76
100
|
var VOID_ELEMENTS = /* @__PURE__ */ new Set([
|
|
@@ -989,7 +1013,21 @@ function parseValueAttr(attrName, knownIdentifiers) {
|
|
|
989
1013
|
const valueGuess = dash === -1 ? "" : rest.slice(dash + 1);
|
|
990
1014
|
return { identifier: null, valueToken: valueGuess || identifierGuess };
|
|
991
1015
|
}
|
|
992
|
-
|
|
1016
|
+
var DEFAULT_EVENT_NAMES = {
|
|
1017
|
+
a: "click",
|
|
1018
|
+
button: "click",
|
|
1019
|
+
details: "toggle",
|
|
1020
|
+
form: "submit",
|
|
1021
|
+
input: "input",
|
|
1022
|
+
select: "change",
|
|
1023
|
+
textarea: "input"
|
|
1024
|
+
};
|
|
1025
|
+
function defaultEventFor(host) {
|
|
1026
|
+
if (!host) return "";
|
|
1027
|
+
if (host.tag === "input" && host.inputType === "submit") return "click";
|
|
1028
|
+
return DEFAULT_EVENT_NAMES[host.tag] ?? "";
|
|
1029
|
+
}
|
|
1030
|
+
function actionDescriptors(dataActionValue, host) {
|
|
993
1031
|
const descriptors = [];
|
|
994
1032
|
for (const descriptor of dataActionValue.split(/\s+/)) {
|
|
995
1033
|
const hash = descriptor.indexOf("#");
|
|
@@ -1002,6 +1040,8 @@ function actionDescriptors(dataActionValue) {
|
|
|
1002
1040
|
lhs = lhs.slice(arrow + 2);
|
|
1003
1041
|
const at = eventType.indexOf("@");
|
|
1004
1042
|
if (at !== -1) eventType = eventType.slice(0, at);
|
|
1043
|
+
} else {
|
|
1044
|
+
eventType = defaultEventFor(host);
|
|
1005
1045
|
}
|
|
1006
1046
|
if (!lhs.startsWith(NAMESPACE_PREFIX)) continue;
|
|
1007
1047
|
const method = /^[a-zA-Z_$][\w$]*/.exec(descriptor.slice(hash + 1))?.[0] ?? "";
|
|
@@ -1026,6 +1066,7 @@ var DIAGNOSTIC_CODES = [
|
|
|
1026
1066
|
"missing-conditional-target",
|
|
1027
1067
|
"missing-required-action",
|
|
1028
1068
|
"missing-action-completion",
|
|
1069
|
+
"missing-action-event",
|
|
1029
1070
|
"missing-aria",
|
|
1030
1071
|
"invalid-aria-value",
|
|
1031
1072
|
"keyboard-inaccessible",
|
|
@@ -1370,9 +1411,7 @@ function checkSource(source, manifest) {
|
|
|
1370
1411
|
didYouMean(parsed.valueToken, (controller?.values ?? []).map(dasherize))
|
|
1371
1412
|
);
|
|
1372
1413
|
} else if (!isDynamicValue(attr)) {
|
|
1373
|
-
const constraint = controller
|
|
1374
|
-
(candidate) => dasherize(candidate.value) === parsed.valueToken
|
|
1375
|
-
);
|
|
1414
|
+
const constraint = declaredConstraint(controller, parsed.valueToken);
|
|
1376
1415
|
if (constraint && !valueSatisfiesConstraint(attr.value, constraint)) {
|
|
1377
1416
|
const literal = constraint.type === "string" ? attr.value : attr.value.trim();
|
|
1378
1417
|
report(
|
|
@@ -1390,12 +1429,26 @@ function checkSource(source, manifest) {
|
|
|
1390
1429
|
}
|
|
1391
1430
|
}
|
|
1392
1431
|
if (attr.name === "data-action") {
|
|
1393
|
-
|
|
1432
|
+
const host = {
|
|
1433
|
+
tag: node.tag,
|
|
1434
|
+
inputType: node.attrs.find((a) => a.name === "type")?.value
|
|
1435
|
+
};
|
|
1436
|
+
for (const { identifier, method, eventType } of actionDescriptors(attr.value, host)) {
|
|
1394
1437
|
const controller = known[identifier];
|
|
1395
1438
|
if (controller && method.length > 0) {
|
|
1396
1439
|
const owner = findOwner(node, identifier);
|
|
1397
1440
|
if (owner) recordAction(owner, identifier, node, method, eventType);
|
|
1398
1441
|
}
|
|
1442
|
+
if (controller && method.length > 0 && eventType === "" && node.origin === "markup" && !isDynamicValue(attr)) {
|
|
1443
|
+
report(
|
|
1444
|
+
node,
|
|
1445
|
+
"missing-action-event",
|
|
1446
|
+
"error",
|
|
1447
|
+
`"${identifier}#${method}" omits the event and <${node.tag}> has no default one, so Stimulus never binds it.`,
|
|
1448
|
+
attr,
|
|
1449
|
+
`Name the event: data-action="<event>->${identifier}#${method}".`
|
|
1450
|
+
);
|
|
1451
|
+
}
|
|
1399
1452
|
if (!controller) {
|
|
1400
1453
|
const best = nearestName(identifier, knownIdentifiers);
|
|
1401
1454
|
report(
|
|
@@ -1861,8 +1914,13 @@ function checkSource(source, manifest) {
|
|
|
1861
1914
|
diagnostics.sort((a, b) => a.line - b.line || a.column - b.column);
|
|
1862
1915
|
return diagnostics;
|
|
1863
1916
|
}
|
|
1917
|
+
function declaredConstraint(controller, valueToken) {
|
|
1918
|
+
const matches = (candidate) => dasherize(candidate.value) === valueToken;
|
|
1919
|
+
const syntax = controller?.valueSyntaxConstraints;
|
|
1920
|
+
return controller?.valueConstraints.find(matches) ?? (Array.isArray(syntax) ? syntax.find(matches) : void 0);
|
|
1921
|
+
}
|
|
1864
1922
|
function valueSatisfiesConstraint(raw, constraint) {
|
|
1865
|
-
if (constraint.type === "string") return
|
|
1923
|
+
if (constraint.type === "string") return stringValueSatisfies(raw, constraint);
|
|
1866
1924
|
const value = decodeNumericValue(raw);
|
|
1867
1925
|
if (Number.isNaN(value)) return false;
|
|
1868
1926
|
if (constraint.finite && !Number.isFinite(value)) return false;
|
|
@@ -1873,8 +1931,18 @@ function valueSatisfiesConstraint(raw, constraint) {
|
|
|
1873
1931
|
function decodeNumericValue(raw) {
|
|
1874
1932
|
return Number(raw.replace(/_/g, ""));
|
|
1875
1933
|
}
|
|
1934
|
+
function stringValueSatisfies(raw, constraint) {
|
|
1935
|
+
if (!("syntax" in constraint)) return constraint.allowedValues.includes(raw);
|
|
1936
|
+
if (constraint.syntax === "regexp") return compileRegExp(raw, "exact") !== null;
|
|
1937
|
+
if (raw === "") return true;
|
|
1938
|
+
const parsed = parseJsonObject(raw);
|
|
1939
|
+
if (parsed === null) return false;
|
|
1940
|
+
return Object.values(parsed).every(
|
|
1941
|
+
(source) => typeof source === "string" && (constraint.entries !== "regexp" || compileRegExp(source, "exact") !== null)
|
|
1942
|
+
);
|
|
1943
|
+
}
|
|
1876
1944
|
function describeValueConstraint(constraint) {
|
|
1877
|
-
if (constraint.type === "string") return
|
|
1945
|
+
if (constraint.type === "string") return describeStringConstraint(constraint);
|
|
1878
1946
|
const parts = [constraint.finite ? "a finite number" : "a number"];
|
|
1879
1947
|
if (constraint.greaterThan !== void 0) {
|
|
1880
1948
|
parts.push(`greater than ${constraint.greaterThan}`);
|
|
@@ -1882,6 +1950,11 @@ function describeValueConstraint(constraint) {
|
|
|
1882
1950
|
if (constraint.integer) parts.push("with no fractional part");
|
|
1883
1951
|
return parts.join(" ");
|
|
1884
1952
|
}
|
|
1953
|
+
function describeStringConstraint(constraint) {
|
|
1954
|
+
if (!("syntax" in constraint)) return `one of ${list(constraint.allowedValues)}`;
|
|
1955
|
+
if (constraint.syntax === "regexp") return "a valid regular expression";
|
|
1956
|
+
return constraint.entries === "regexp" ? "a JSON object whose values are valid regular expressions" : "a JSON object of strings";
|
|
1957
|
+
}
|
|
1885
1958
|
var UNRESOLVED_TARGET_HINT = "Part of this scope is rendered by a helper or a non-literal data: hash, so the target may exist at runtime.";
|
|
1886
1959
|
var UNRESOLVED_HOST_HINT = "An enclosing helper's data: option is not a literal hash, so the host controller may be declared at runtime.";
|
|
1887
1960
|
function hasReadableMarkup(el) {
|
|
@@ -2644,6 +2717,29 @@ var CONTROLLER_CONTRACT_SCHEMA = {
|
|
|
2644
2717
|
required: ["value", "type", "suggestion"]
|
|
2645
2718
|
}
|
|
2646
2719
|
},
|
|
2720
|
+
valueSyntaxConstraints: {
|
|
2721
|
+
type: "array",
|
|
2722
|
+
description: "Grammar contracts on String Values whose accepted set cannot be enumerated. Its own field so an engine that predates it skips these instead of reading them through allowedValues.",
|
|
2723
|
+
items: {
|
|
2724
|
+
type: "object",
|
|
2725
|
+
properties: {
|
|
2726
|
+
value: { type: "string", description: "Camel-case declared Value name." },
|
|
2727
|
+
type: { type: "string", enum: ["string"] },
|
|
2728
|
+
syntax: {
|
|
2729
|
+
type: "string",
|
|
2730
|
+
enum: ["regexp", "json-object"],
|
|
2731
|
+
description: "Grammar the whole literal must satisfy."
|
|
2732
|
+
},
|
|
2733
|
+
entries: {
|
|
2734
|
+
type: "string",
|
|
2735
|
+
enum: ["regexp"],
|
|
2736
|
+
description: "For a json-object syntax, the grammar every property value must satisfy."
|
|
2737
|
+
},
|
|
2738
|
+
suggestion: { type: "string" }
|
|
2739
|
+
},
|
|
2740
|
+
required: ["value", "type", "syntax", "suggestion"]
|
|
2741
|
+
}
|
|
2742
|
+
},
|
|
2647
2743
|
valueRelations: {
|
|
2648
2744
|
type: "array",
|
|
2649
2745
|
description: "Statically checkable relationships between authored Stimulus Values.",
|