@ably/ui 7.10.0-dev.e980a00 → 8.0.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 (40) hide show
  1. package/core/Meganav/component.js +1 -1
  2. package/core/Meganav.jsx +158 -36
  3. package/core/MeganavControlMobileDropdown/component.js +1 -1
  4. package/core/MeganavItemsMobile.jsx +7 -6
  5. package/core/MeganavItemsSignedIn.jsx +9 -8
  6. package/core/MeganavSearch.jsx +9 -8
  7. package/core/MeganavSearchAutocomplete/component.js +1 -1
  8. package/core/MeganavSearchPanel.jsx +7 -6
  9. package/core/MeganavSearchSuggestions/component.js +1 -1
  10. package/core/MeganavSearchSuggestions.jsx +6 -6
  11. package/core/fonts/source-code-pro.css +3 -0
  12. package/core/styles.css +17 -22
  13. package/package.json +1 -1
  14. package/src/core/Code/component.css +1 -3
  15. package/src/core/Meganav/component.js +4 -0
  16. package/src/core/MeganavControlMobileDropdown/component.js +0 -31
  17. package/src/core/MeganavItemsMobile/component.html.erb +1 -0
  18. package/src/core/MeganavItemsMobile/component.jsx +1 -0
  19. package/src/core/MeganavSearch/component.html.erb +2 -2
  20. package/src/core/MeganavSearch/component.jsx +2 -2
  21. package/src/core/MeganavSearchAutocomplete/component.js +8 -7
  22. package/src/core/MeganavSearchPanel/component.html.erb +1 -1
  23. package/src/core/MeganavSearchPanel/component.jsx +1 -1
  24. package/src/core/MeganavSearchSuggestions/component.html.erb +4 -4
  25. package/src/core/MeganavSearchSuggestions/component.js +123 -0
  26. package/src/core/MeganavSearchSuggestions/component.jsx +6 -6
  27. package/src/core/fonts/source-code-pro.css +3 -0
  28. package/src/core/styles/properties.css +4 -3
  29. package/src/core/styles/text.css +12 -16
  30. package/tailwind.config.js +12 -4
  31. package/core/fonts/.DS_Store +0 -0
  32. package/core/images/.DS_Store +0 -0
  33. package/preview/vendor/bundle/ruby/3.0.0/bundler/gems/ably-ui-abffd210ec0f/preview/log/.keep +0 -0
  34. package/preview/vendor/bundle/ruby/3.0.0/bundler/gems/ably-ui-abffd210ec0f/preview/tmp/.keep +0 -0
  35. package/preview/vendor/bundle/ruby/3.0.0/bundler/gems/ably-ui-abffd210ec0f/preview/tmp/pids/.keep +0 -0
  36. package/src/.DS_Store +0 -0
  37. package/src/core/.DS_Store +0 -0
  38. package/src/core/fonts/.DS_Store +0 -0
  39. package/src/core/images/.DS_Store +0 -0
  40. package/src/reset/.DS_Store +0 -0
@@ -0,0 +1,123 @@
1
+ import { queryId } from "../dom-query";
2
+
3
+ const DRAG_BUFFER = 5;
4
+
5
+ const getTranslateX = (node) =>
6
+ new DOMMatrix(window.getComputedStyle(node).transform).e;
7
+
8
+ const updateTranslateX = (node, value) =>
9
+ (node.style.transform = `translateX(${value}px)`);
10
+
11
+ const dragLeftBoundary = (translateX, threshold) => translateX >= threshold;
12
+
13
+ const dragRightBoundary = (translateX, itemsWidth, windowWidth, threshold) =>
14
+ Math.abs(translateX - windowWidth + threshold) > itemsWidth;
15
+
16
+ const getDistance = (e, touchStartX) =>
17
+ e.changedTouches[0]?.clientX - touchStartX;
18
+
19
+ const withinBuffer = (distance) => Math.abs(distance) < DRAG_BUFFER;
20
+
21
+ const MeganavSearchSuggestions = () => {
22
+ const suggestionsToggle = queryId("meganav-mobile-search-input");
23
+ const suggestions = queryId("meganav-mobile-search-suggestions");
24
+ const list = suggestions.querySelector("ul");
25
+ const listItems = list.querySelectorAll("li");
26
+
27
+ const itemsTotalWidth = Array.from(listItems)
28
+ .map((item) => item.getBoundingClientRect().width)
29
+ .reduce((acc, val) => acc + val, 0);
30
+
31
+ const dragLeft = (distance, threshold) => {
32
+ const currentTranslateX = getTranslateX(list);
33
+ const translateX = Math.round(currentTranslateX + distance);
34
+ if (dragLeftBoundary(translateX, threshold)) return;
35
+ updateTranslateX(list, translateX);
36
+ };
37
+
38
+ const dragLeftEnd = (distance, threshold) => {
39
+ const currentTranslateX = getTranslateX(list);
40
+ let translateX = Math.round(currentTranslateX + distance);
41
+
42
+ if (dragLeftBoundary(translateX, threshold)) {
43
+ translateX = 0;
44
+ }
45
+
46
+ updateTranslateX(list, translateX);
47
+ };
48
+
49
+ const dragRight = (distance, threshold) => {
50
+ const listWidth = list.getBoundingClientRect().width;
51
+ const currentTranslateX = getTranslateX(list);
52
+ const translateX = Math.round(currentTranslateX + distance);
53
+
54
+ if (dragRightBoundary(translateX, itemsTotalWidth, listWidth, threshold)) {
55
+ return;
56
+ }
57
+
58
+ updateTranslateX(list, translateX);
59
+ };
60
+
61
+ const dragRightEnd = (distance, threshold) => {
62
+ const listWidth = list.getBoundingClientRect().width;
63
+ const currentTranslateX = getTranslateX(list);
64
+ let translateX = Math.round(currentTranslateX + distance);
65
+
66
+ if (dragRightBoundary(translateX, itemsTotalWidth, listWidth, threshold)) {
67
+ translateX = -(itemsTotalWidth - listWidth + threshold);
68
+ }
69
+
70
+ updateTranslateX(list, translateX);
71
+ };
72
+
73
+ let touchStartX;
74
+
75
+ const touchstartHandler = (e) => {
76
+ touchStartX = e.touches[0]?.clientX;
77
+ };
78
+
79
+ const touchmoveHandler = (e) => {
80
+ const distance = getDistance(e, touchStartX);
81
+ if (withinBuffer(distance)) return;
82
+ distance > 0 ? dragLeft(distance, 24) : dragRight(distance, 96);
83
+ };
84
+
85
+ const touchendHandler = (e) => {
86
+ const distance = getDistance(e, touchStartX);
87
+ if (withinBuffer(distance)) return;
88
+ distance > 0 ? dragLeftEnd(distance, 24) : dragRightEnd(distance, 48);
89
+ };
90
+
91
+ const focusSuggestionsHandler = () => {
92
+ suggestions.classList.add("max-h-96");
93
+ };
94
+
95
+ const blurSuggestionsHandler = (e) => {
96
+ if (e.relatedTarget === suggestions.querySelectorAll("a")[0]) {
97
+ return;
98
+ }
99
+ suggestions.classList.remove("max-h-96");
100
+ };
101
+
102
+ suggestionsToggle.addEventListener("focus", focusSuggestionsHandler);
103
+ suggestionsToggle.addEventListener("blur", blurSuggestionsHandler);
104
+ suggestions.addEventListener("touchstart", touchstartHandler);
105
+ suggestions.addEventListener("touchmove", touchmoveHandler);
106
+ suggestions.addEventListener("touchend", touchendHandler);
107
+
108
+ return {
109
+ teardown: () => {
110
+ suggestionsToggle.removeEventListener("focus", focusSuggestionsHandler);
111
+ suggestionsToggle.removeEventListener("blur", blurSuggestionsHandler);
112
+ suggestions.removeEventListener("touchstart", touchstartHandler);
113
+ suggestions.removeEventListener("touchmove", touchmoveHandler);
114
+ suggestions.removeEventListener("touchend", touchendHandler);
115
+ },
116
+ clear: () => {
117
+ suggestions.classList.remove("max-h-96");
118
+ list.style.transform = `translateX(0px)`;
119
+ },
120
+ };
121
+ };
122
+
123
+ export default MeganavSearchSuggestions;
@@ -8,25 +8,25 @@ const MeganavSearchSuggestions = ({ absUrl, displaySupportLink }) => {
8
8
  <>
9
9
  <p className="ui-text-overline2 text-cool-black py-12">Popular pages</p>
10
10
 
11
- <div className="flex justify-between items-center overflow-x-scroll md:overflow-auto">
12
- <ul className="flex">
11
+ <div className="flex justify-between items-center overflow-hidden">
12
+ <ul className="flex transition-transform">
13
13
  <li className="py-12 pr-8 flex-shrink-0">
14
- <a href={absUrl("/docs/how-ably-works")} className="ui-text-p2">
14
+ <a href={absUrl("/docs/how-ably-works")} className="ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus">
15
15
  How does Ably work?
16
16
  </a>
17
17
  </li>
18
18
  <li className="py-12 px-8 flex-shrink-0">
19
- <a href={absUrl("/docs/quick-start-guide")} className="ui-text-p2">
19
+ <a href={absUrl("/docs/quick-start-guide")} className="ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus">
20
20
  Quickstart guide
21
21
  </a>
22
22
  </li>
23
23
  <li className="py-12 px-8 flex-shrink-0">
24
- <a href={absUrl("/docs/core-features/pubsub")} className="ui-text-p2">
24
+ <a href={absUrl("/docs/core-features/pubsub")} className="ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus">
25
25
  Publish/Subscribe Messaging
26
26
  </a>
27
27
  </li>
28
28
  <li className="py-12 pl-8 flex-shrink-0">
29
- <a href={absUrl("/platform")} className="ui-text-p2">
29
+ <a href={absUrl("/platform")} className="ui-text-p2 hover:text-gui-hover active:text-gui-active focus:text-gui-focus">
30
30
  Platform
31
31
  </a>
32
32
  </li>
@@ -0,0 +1,3 @@
1
+ @layer base {
2
+ @import url("https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@600&display=swap");
3
+ }
@@ -15,9 +15,10 @@
15
15
  --color-charcoal-grey: #292831;
16
16
  --color-gui-default: #0073e6;
17
17
  --color-gui-hover: #0867c4;
18
- --color-gui-focus: #80b9f2;
18
+ --color-gui-focus: #0073e6;
19
+ --color-gui-focus-outline: #80b9f2;
19
20
  --color-gui-active: #074095;
20
- --color-gui-viewed: #4887c2;
21
+ --color-gui-visited: #4887c2;
21
22
  --color-gui-unavailable: #a8a8a8;
22
23
  --color-gui-error: #fb0c0c;
23
24
  --color-gui-success: #11cb24;
@@ -157,7 +158,7 @@
157
158
  /* In components, when looking at implementing viewport margin and spacing between elements,
158
159
  the values in the comments can be used as guide as they represent the grid the elements (should) sit on.
159
160
  alternatively, look for ui-grid-* helpers. */
160
- --bp-xs: 375px; /* gutters 8px, side-margin 24px */
161
+ --bp-xs: 428px; /* gutters 8px, side-margin 24px */
161
162
  --bp-sm: 768px; /* gutters 16px, side-margin 32px */
162
163
  --bp-md: 1040px; /* gutters 24px, side-margin 40px, meganav desktop */
163
164
  --bp-lg: 1280px; /* gutters 24px, side-margin 64px */
@@ -30,17 +30,17 @@
30
30
  }
31
31
 
32
32
  .ui-text-p1 {
33
- @apply font-sans font-light text-cool-black;
33
+ @apply font-sans font-light text-charcoal-grey;
34
34
  @apply text-p1;
35
35
  }
36
36
 
37
37
  .ui-text-p2 {
38
- @apply font-sans font-light text-cool-black;
38
+ @apply font-sans font-light text-charcoal-grey;
39
39
  @apply text-p2;
40
40
  }
41
41
 
42
42
  .ui-text-p3 {
43
- @apply font-sans font-light text-cool-black;
43
+ @apply font-sans font-light text-charcoal-grey;
44
44
  @apply text-p3;
45
45
  }
46
46
 
@@ -146,21 +146,17 @@
146
146
  @apply list-square;
147
147
  }
148
148
 
149
- /* visited needs to come before :hover et all else it overrides them */
150
- .ui-link:visited {
151
- @apply text-gui-viewed;
152
- }
153
-
154
149
  .ui-link {
155
- @apply hover:text-active-orange active:text-red-orange;
156
- text-decoration-color: var(--color-active-orange);
157
- text-underline-offset: 4px; /* px used here as behaves weird with rem's */
158
- text-decoration-line: underline;
159
- text-decoration-thickness: 0.125rem;
150
+ @apply visited:text-gui-visited;
151
+ @apply hover:text-gui-hover active:text-gui-active disabled:text-gui-unavailable;
152
+ @apply focus:text-gui-focus focus:outline-gui-focus;
153
+ @apply underline;
160
154
  }
161
155
 
162
- .ui-link:focus {
163
- @apply focus:text-white focus:bg-active-orange focus:outline-none;
164
- text-decoration: none;
156
+ .ui-link-neutral {
157
+ @apply visited:text-dark-grey;
158
+ @apply hover:text-dark-grey active:text-cool-black disabled:text-gui-unavailable;
159
+ @apply focus:text-gui-focus focus:outline-gui-focus-neutral;
160
+ @apply underline;
165
161
  }
166
162
  }
@@ -17,7 +17,7 @@ module.exports = {
17
17
  theme: {
18
18
  screens: {
19
19
  // CSS custom properties can't be used in media queries
20
- xs: "375px",
20
+ xs: "428px",
21
21
  sm: "768px",
22
22
  md: "1040px",
23
23
  lg: "1280px",
@@ -74,7 +74,7 @@ module.exports = {
74
74
  "gui-hover": "var(--color-gui-hover)",
75
75
  "gui-focus": "var(--color-gui-focus)",
76
76
  "gui-active": "var(--color-gui-active)",
77
- "gui-viewed": "var(--color-gui-viewed)",
77
+ "gui-visited": "var(--color-gui-visited)",
78
78
  "gui-unavailable": "var(--color-gui-unavailable)",
79
79
  "gui-error": "var(--color-gui-error)",
80
80
  "gui-success": "var(--color-gui-success)",
@@ -183,7 +183,8 @@ module.exports = {
183
183
  filter: "filter",
184
184
  },
185
185
  outline: {
186
- "gui-focus": "4px solid var(--color-gui-focus)",
186
+ "gui-focus": "1.5px solid var(--color-gui-focus-outline)",
187
+ "gui-focus-neutral": "2px solid var(--color-white)",
187
188
  },
188
189
  width: {
189
190
  "extend-8": "calc(100% + var(--spacing-8))",
@@ -210,7 +211,14 @@ module.exports = {
210
211
  variants: {
211
212
  extend: {
212
213
  borderColor: ["hover", "focus", "active", "group-focus", "disabled"],
213
- textColor: ["hover", "focus", "active", "group-focus", "disabled"],
214
+ textColor: [
215
+ "hover",
216
+ "focus",
217
+ "active",
218
+ "group-focus",
219
+ "disabled",
220
+ "visited",
221
+ ],
214
222
  display: ["group-focus"],
215
223
  backgroundColor: ["hover", "focus", "active", "group-focus", "disabled"],
216
224
  backgroundImage: ["hover", "active", "focus"],
Binary file
Binary file
package/src/.DS_Store DELETED
Binary file
Binary file
Binary file
Binary file
Binary file