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.
Files changed (143) hide show
  1. package/CHANGELOG.md +73 -5
  2. package/dist/cable/index.d.ts +1 -1
  3. package/dist/cable/index.js +60 -14
  4. package/dist/cable/index.js.map +1 -1
  5. package/dist/controllers/accordion_controller.d.ts +1 -1
  6. package/dist/controllers/accordion_controller.js.map +1 -1
  7. package/dist/controllers/announcer_controller.js +88 -61
  8. package/dist/controllers/announcer_controller.js.map +1 -1
  9. package/dist/controllers/auto_submit_controller.js +40 -5
  10. package/dist/controllers/auto_submit_controller.js.map +1 -1
  11. package/dist/controllers/breadcrumb_controller.js +29 -3
  12. package/dist/controllers/breadcrumb_controller.js.map +1 -1
  13. package/dist/controllers/calendar_controller.d.ts +20 -4
  14. package/dist/controllers/calendar_controller.js +51 -10
  15. package/dist/controllers/calendar_controller.js.map +1 -1
  16. package/dist/controllers/carousel_controller.js +8 -6
  17. package/dist/controllers/carousel_controller.js.map +1 -1
  18. package/dist/controllers/checkbox_controller.js +27 -2
  19. package/dist/controllers/checkbox_controller.js.map +1 -1
  20. package/dist/controllers/clipboard_controller.d.ts +1 -1
  21. package/dist/controllers/clipboard_controller.js.map +1 -1
  22. package/dist/controllers/collapsible_controller.d.ts +1 -1
  23. package/dist/controllers/collapsible_controller.js.map +1 -1
  24. package/dist/controllers/conditional_fields_controller.js +36 -7
  25. package/dist/controllers/conditional_fields_controller.js.map +1 -1
  26. package/dist/controllers/count_up_controller.js.map +1 -1
  27. package/dist/controllers/currency_input_controller.d.ts +4 -2
  28. package/dist/controllers/currency_input_controller.js +77 -25
  29. package/dist/controllers/currency_input_controller.js.map +1 -1
  30. package/dist/controllers/date_range_picker_controller.d.ts +10 -3
  31. package/dist/controllers/date_range_picker_controller.js +43 -10
  32. package/dist/controllers/date_range_picker_controller.js.map +1 -1
  33. package/dist/controllers/dialog_controller.d.ts +2 -2
  34. package/dist/controllers/dialog_controller.js.map +1 -1
  35. package/dist/controllers/direct_upload_controller.js +21 -10
  36. package/dist/controllers/direct_upload_controller.js.map +1 -1
  37. package/dist/controllers/dirty_form_controller.js +32 -12
  38. package/dist/controllers/dirty_form_controller.js.map +1 -1
  39. package/dist/controllers/dismissible_controller.d.ts +1 -1
  40. package/dist/controllers/dismissible_controller.js.map +1 -1
  41. package/dist/controllers/dropdown_controller.d.ts +1 -1
  42. package/dist/controllers/dropdown_controller.js.map +1 -1
  43. package/dist/controllers/flash_controller.js +145 -43
  44. package/dist/controllers/flash_controller.js.map +1 -1
  45. package/dist/controllers/form_field_controller.js +7 -1
  46. package/dist/controllers/form_field_controller.js.map +1 -1
  47. package/dist/controllers/frame_loading_controller.js +29 -6
  48. package/dist/controllers/frame_loading_controller.js.map +1 -1
  49. package/dist/controllers/highlight_controller.js +63 -23
  50. package/dist/controllers/highlight_controller.js.map +1 -1
  51. package/dist/controllers/input_mask_controller.d.ts +3 -2
  52. package/dist/controllers/input_mask_controller.js +33 -12
  53. package/dist/controllers/input_mask_controller.js.map +1 -1
  54. package/dist/controllers/intersection_controller.js +10 -5
  55. package/dist/controllers/intersection_controller.js.map +1 -1
  56. package/dist/controllers/lazy_frame_controller.js +10 -5
  57. package/dist/controllers/lazy_frame_controller.js.map +1 -1
  58. package/dist/controllers/local_time_controller.d.ts +3 -2
  59. package/dist/controllers/local_time_controller.js +43 -11
  60. package/dist/controllers/local_time_controller.js.map +1 -1
  61. package/dist/controllers/masonry_controller.d.ts +4 -4
  62. package/dist/controllers/masonry_controller.js +32 -14
  63. package/dist/controllers/masonry_controller.js.map +1 -1
  64. package/dist/controllers/menu_controller.js +10 -2
  65. package/dist/controllers/menu_controller.js.map +1 -1
  66. package/dist/controllers/menubar_controller.js +10 -2
  67. package/dist/controllers/menubar_controller.js.map +1 -1
  68. package/dist/controllers/navigation_menu_controller.js +8 -2
  69. package/dist/controllers/navigation_menu_controller.js.map +1 -1
  70. package/dist/controllers/optimistic_controller.js +28 -4
  71. package/dist/controllers/optimistic_controller.js.map +1 -1
  72. package/dist/controllers/otp_controller.js +23 -10
  73. package/dist/controllers/otp_controller.js.map +1 -1
  74. package/dist/controllers/overflow_indicator_controller.js +31 -8
  75. package/dist/controllers/overflow_indicator_controller.js.map +1 -1
  76. package/dist/controllers/overflow_menu_controller.js +39 -4
  77. package/dist/controllers/overflow_menu_controller.js.map +1 -1
  78. package/dist/controllers/password_reveal_controller.d.ts +1 -1
  79. package/dist/controllers/password_reveal_controller.js.map +1 -1
  80. package/dist/controllers/pointer_drag_controller.js +10 -3
  81. package/dist/controllers/pointer_drag_controller.js.map +1 -1
  82. package/dist/controllers/portal_controller.js +21 -10
  83. package/dist/controllers/portal_controller.js.map +1 -1
  84. package/dist/controllers/radio_group_controller.js +11 -3
  85. package/dist/controllers/radio_group_controller.js.map +1 -1
  86. package/dist/controllers/read_more_controller.d.ts +1 -1
  87. package/dist/controllers/read_more_controller.js +31 -5
  88. package/dist/controllers/read_more_controller.js.map +1 -1
  89. package/dist/controllers/reading_progress_controller.js +65 -19
  90. package/dist/controllers/reading_progress_controller.js.map +1 -1
  91. package/dist/controllers/relative_time_controller.js +40 -9
  92. package/dist/controllers/relative_time_controller.js.map +1 -1
  93. package/dist/controllers/reset_before_cache_controller.js +23 -10
  94. package/dist/controllers/reset_before_cache_controller.js.map +1 -1
  95. package/dist/controllers/resizable_controller.js +7 -2
  96. package/dist/controllers/resizable_controller.js.map +1 -1
  97. package/dist/controllers/roving_controller.js +7 -3
  98. package/dist/controllers/roving_controller.js.map +1 -1
  99. package/dist/controllers/scroll_area_controller.js +70 -26
  100. package/dist/controllers/scroll_area_controller.js.map +1 -1
  101. package/dist/controllers/scroll_restore_controller.js +37 -16
  102. package/dist/controllers/scroll_restore_controller.js.map +1 -1
  103. package/dist/controllers/scroll_visibility_controller.d.ts +1 -1
  104. package/dist/controllers/scroll_visibility_controller.js +71 -42
  105. package/dist/controllers/scroll_visibility_controller.js.map +1 -1
  106. package/dist/controllers/scrollspy_controller.d.ts +1 -1
  107. package/dist/controllers/scrollspy_controller.js +76 -32
  108. package/dist/controllers/scrollspy_controller.js.map +1 -1
  109. package/dist/controllers/smart_sticky_header_controller.js +72 -37
  110. package/dist/controllers/smart_sticky_header_controller.js.map +1 -1
  111. package/dist/controllers/stick_to_bottom_controller.js +29 -3
  112. package/dist/controllers/stick_to_bottom_controller.js.map +1 -1
  113. package/dist/controllers/sticky_observer_controller.js +10 -5
  114. package/dist/controllers/sticky_observer_controller.js.map +1 -1
  115. package/dist/controllers/submit_once_controller.js +29 -6
  116. package/dist/controllers/submit_once_controller.js.map +1 -1
  117. package/dist/controllers/switch_controller.d.ts +1 -1
  118. package/dist/controllers/switch_controller.js.map +1 -1
  119. package/dist/controllers/tabs_controller.d.ts +1 -1
  120. package/dist/controllers/tabs_controller.js.map +1 -1
  121. package/dist/controllers/textarea_autosize_controller.js +29 -3
  122. package/dist/controllers/textarea_autosize_controller.js.map +1 -1
  123. package/dist/controllers/theme_controller.d.ts +2 -3
  124. package/dist/controllers/theme_controller.js +23 -13
  125. package/dist/controllers/theme_controller.js.map +1 -1
  126. package/dist/controllers/toast_controller.d.ts +3 -0
  127. package/dist/controllers/toast_controller.js +136 -73
  128. package/dist/controllers/toast_controller.js.map +1 -1
  129. package/dist/controllers/toggle_group_controller.js +11 -3
  130. package/dist/controllers/toggle_group_controller.js.map +1 -1
  131. package/dist/controllers/toolbar_controller.js +7 -3
  132. package/dist/controllers/toolbar_controller.js.map +1 -1
  133. package/dist/controllers/transition_controller.js.map +1 -1
  134. package/dist/index.js +629 -597
  135. package/dist/index.js.map +1 -1
  136. package/dist/inspector/cli.d.ts +38 -1
  137. package/dist/inspector/cli.js +80 -7
  138. package/dist/inspector/cli.js.map +1 -1
  139. package/dist/inspector/cli_bin.js +103 -7
  140. package/dist/inspector/cli_bin.js.map +1 -1
  141. package/dist/inspector/examples.json +5 -5
  142. package/dist/inspector/manifest.json +131 -3
  143. 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
- function actionDescriptors(dataActionValue) {
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?.valueConstraints.find(
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
- for (const { identifier, method, eventType } of actionDescriptors(attr.value)) {
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 constraint.allowedValues.includes(raw);
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 `one of ${list(constraint.allowedValues)}`;
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.",