pulse_view_components 0.3.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 (221) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +88 -0
  3. data/LICENSE.txt +22 -0
  4. data/README.md +78 -0
  5. data/app/assets/builds/js/pulse_view_components.js +9543 -0
  6. data/app/assets/builds/js/pulse_view_components.js.map +7 -0
  7. data/app/assets/builds/pulse_view_components.css +1 -0
  8. data/app/assets/config/manifest.js +2 -0
  9. data/app/assets/images/pulse_view_components/icons/alert.svg +3 -0
  10. data/app/assets/images/pulse_view_components/icons/archive.svg +1 -0
  11. data/app/assets/images/pulse_view_components/icons/arrow-both.svg +1 -0
  12. data/app/assets/images/pulse_view_components/icons/arrow-down.svg +1 -0
  13. data/app/assets/images/pulse_view_components/icons/arrow-left.svg +1 -0
  14. data/app/assets/images/pulse_view_components/icons/arrow-right.svg +1 -0
  15. data/app/assets/images/pulse_view_components/icons/arrow-switch.svg +1 -0
  16. data/app/assets/images/pulse_view_components/icons/arrow-up.svg +1 -0
  17. data/app/assets/images/pulse_view_components/icons/beaker.svg +1 -0
  18. data/app/assets/images/pulse_view_components/icons/bell-slash.svg +1 -0
  19. data/app/assets/images/pulse_view_components/icons/bell.svg +1 -0
  20. data/app/assets/images/pulse_view_components/icons/bookmark-slash.svg +1 -0
  21. data/app/assets/images/pulse_view_components/icons/bookmark.svg +1 -0
  22. data/app/assets/images/pulse_view_components/icons/calendar.svg +1 -0
  23. data/app/assets/images/pulse_view_components/icons/check-circle.svg +1 -0
  24. data/app/assets/images/pulse_view_components/icons/check.svg +1 -0
  25. data/app/assets/images/pulse_view_components/icons/chevron-down.svg +1 -0
  26. data/app/assets/images/pulse_view_components/icons/circle.svg +1 -0
  27. data/app/assets/images/pulse_view_components/icons/clock.svg +1 -0
  28. data/app/assets/images/pulse_view_components/icons/close.svg +9 -0
  29. data/app/assets/images/pulse_view_components/icons/cloud.svg +1 -0
  30. data/app/assets/images/pulse_view_components/icons/comment-discussion.svg +1 -0
  31. data/app/assets/images/pulse_view_components/icons/comment.svg +1 -0
  32. data/app/assets/images/pulse_view_components/icons/copy.svg +1 -0
  33. data/app/assets/images/pulse_view_components/icons/database.svg +1 -0
  34. data/app/assets/images/pulse_view_components/icons/dot.svg +1 -0
  35. data/app/assets/images/pulse_view_components/icons/dots-outline.svg +1 -0
  36. data/app/assets/images/pulse_view_components/icons/download.svg +1 -0
  37. data/app/assets/images/pulse_view_components/icons/duplicate.svg +1 -0
  38. data/app/assets/images/pulse_view_components/icons/eye.svg +1 -0
  39. data/app/assets/images/pulse_view_components/icons/file-added.svg +1 -0
  40. data/app/assets/images/pulse_view_components/icons/file-directory.svg +1 -0
  41. data/app/assets/images/pulse_view_components/icons/file-media.svg +1 -0
  42. data/app/assets/images/pulse_view_components/icons/file.svg +1 -0
  43. data/app/assets/images/pulse_view_components/icons/filter.svg +1 -0
  44. data/app/assets/images/pulse_view_components/icons/flame.svg +1 -0
  45. data/app/assets/images/pulse_view_components/icons/gear.svg +1 -0
  46. data/app/assets/images/pulse_view_components/icons/gift.svg +1 -0
  47. data/app/assets/images/pulse_view_components/icons/globe.svg +1 -0
  48. data/app/assets/images/pulse_view_components/icons/goal.svg +1 -0
  49. data/app/assets/images/pulse_view_components/icons/graph.svg +1 -0
  50. data/app/assets/images/pulse_view_components/icons/heart-fill.svg +1 -0
  51. data/app/assets/images/pulse_view_components/icons/heart.svg +1 -0
  52. data/app/assets/images/pulse_view_components/icons/history.svg +1 -0
  53. data/app/assets/images/pulse_view_components/icons/home.svg +1 -0
  54. data/app/assets/images/pulse_view_components/icons/hourglass.svg +1 -0
  55. data/app/assets/images/pulse_view_components/icons/image.svg +1 -0
  56. data/app/assets/images/pulse_view_components/icons/inbox.svg +1 -0
  57. data/app/assets/images/pulse_view_components/icons/info.svg +1 -0
  58. data/app/assets/images/pulse_view_components/icons/issue.svg +3 -0
  59. data/app/assets/images/pulse_view_components/icons/key.svg +1 -0
  60. data/app/assets/images/pulse_view_components/icons/law.svg +1 -0
  61. data/app/assets/images/pulse_view_components/icons/link-external.svg +1 -0
  62. data/app/assets/images/pulse_view_components/icons/link.svg +1 -0
  63. data/app/assets/images/pulse_view_components/icons/location.svg +1 -0
  64. data/app/assets/images/pulse_view_components/icons/log.svg +1 -0
  65. data/app/assets/images/pulse_view_components/icons/mail.svg +1 -0
  66. data/app/assets/images/pulse_view_components/icons/mark-github.svg +1 -0
  67. data/app/assets/images/pulse_view_components/icons/mark-jira.svg +3 -0
  68. data/app/assets/images/pulse_view_components/icons/megaphone.svg +1 -0
  69. data/app/assets/images/pulse_view_components/icons/no-entry.svg +1 -0
  70. data/app/assets/images/pulse_view_components/icons/note.svg +1 -0
  71. data/app/assets/images/pulse_view_components/icons/organization.svg +1 -0
  72. data/app/assets/images/pulse_view_components/icons/package.svg +1 -0
  73. data/app/assets/images/pulse_view_components/icons/paintbrush.svg +1 -0
  74. data/app/assets/images/pulse_view_components/icons/paperclip.svg +1 -0
  75. data/app/assets/images/pulse_view_components/icons/paste.svg +1 -0
  76. data/app/assets/images/pulse_view_components/icons/pencil.svg +1 -0
  77. data/app/assets/images/pulse_view_components/icons/people.svg +1 -0
  78. data/app/assets/images/pulse_view_components/icons/person-add.svg +1 -0
  79. data/app/assets/images/pulse_view_components/icons/person.svg +1 -0
  80. data/app/assets/images/pulse_view_components/icons/pin-slash.svg +1 -0
  81. data/app/assets/images/pulse_view_components/icons/pin.svg +1 -0
  82. data/app/assets/images/pulse_view_components/icons/play.svg +1 -0
  83. data/app/assets/images/pulse_view_components/icons/plus-circle.svg +1 -0
  84. data/app/assets/images/pulse_view_components/icons/plus.svg +1 -0
  85. data/app/assets/images/pulse_view_components/icons/project.svg +1 -0
  86. data/app/assets/images/pulse_view_components/icons/pulse.svg +1 -0
  87. data/app/assets/images/pulse_view_components/icons/question.svg +1 -0
  88. data/app/assets/images/pulse_view_components/icons/redo.svg +1 -0
  89. data/app/assets/images/pulse_view_components/icons/reply.svg +1 -0
  90. data/app/assets/images/pulse_view_components/icons/report.svg +1 -0
  91. data/app/assets/images/pulse_view_components/icons/rss.svg +1 -0
  92. data/app/assets/images/pulse_view_components/icons/ruby.svg +1 -0
  93. data/app/assets/images/pulse_view_components/icons/search.svg +1 -0
  94. data/app/assets/images/pulse_view_components/icons/share.svg +1 -0
  95. data/app/assets/images/pulse_view_components/icons/shield.svg +1 -0
  96. data/app/assets/images/pulse_view_components/icons/sliders.svg +1 -0
  97. data/app/assets/images/pulse_view_components/icons/smiley.svg +1 -0
  98. data/app/assets/images/pulse_view_components/icons/sort.svg +1 -0
  99. data/app/assets/images/pulse_view_components/icons/sort_asc.svg +1 -0
  100. data/app/assets/images/pulse_view_components/icons/sort_desc.svg +1 -0
  101. data/app/assets/images/pulse_view_components/icons/stack.svg +1 -0
  102. data/app/assets/images/pulse_view_components/icons/star-fill.svg +1 -0
  103. data/app/assets/images/pulse_view_components/icons/star.svg +1 -0
  104. data/app/assets/images/pulse_view_components/icons/stopwatch.svg +1 -0
  105. data/app/assets/images/pulse_view_components/icons/sun.svg +1 -0
  106. data/app/assets/images/pulse_view_components/icons/sync.svg +1 -0
  107. data/app/assets/images/pulse_view_components/icons/table.svg +1 -0
  108. data/app/assets/images/pulse_view_components/icons/tag.svg +1 -0
  109. data/app/assets/images/pulse_view_components/icons/tasklist.svg +1 -0
  110. data/app/assets/images/pulse_view_components/icons/telescope.svg +1 -0
  111. data/app/assets/images/pulse_view_components/icons/three-bars.svg +1 -0
  112. data/app/assets/images/pulse_view_components/icons/thumbsdown.svg +1 -0
  113. data/app/assets/images/pulse_view_components/icons/thumbsup.svg +1 -0
  114. data/app/assets/images/pulse_view_components/icons/tools.svg +1 -0
  115. data/app/assets/images/pulse_view_components/icons/trash.svg +1 -0
  116. data/app/assets/images/pulse_view_components/icons/trophy.svg +1 -0
  117. data/app/assets/images/pulse_view_components/icons/undo.svg +1 -0
  118. data/app/assets/images/pulse_view_components/icons/unlink.svg +1 -0
  119. data/app/assets/images/pulse_view_components/icons/upload.svg +1 -0
  120. data/app/assets/images/pulse_view_components/icons/x-circle.svg +1 -0
  121. data/app/assets/images/pulse_view_components/icons/x.svg +1 -0
  122. data/app/assets/images/pulse_view_components/icons/zap.svg +1 -0
  123. data/app/assets/javascripts/pulse_view_components.js +0 -0
  124. data/app/assets/stylesheets/pulse_view_components/application.tailwind.css +10 -0
  125. data/app/components/pulse/action_list/divider.rb +35 -0
  126. data/app/components/pulse/action_list/form_wrapper.html.slim +9 -0
  127. data/app/components/pulse/action_list/form_wrapper.rb +63 -0
  128. data/app/components/pulse/action_list/heading.rb +52 -0
  129. data/app/components/pulse/action_list/item.html.slim +43 -0
  130. data/app/components/pulse/action_list/item.rb +319 -0
  131. data/app/components/pulse/action_list.css +568 -0
  132. data/app/components/pulse/action_list.rb +261 -0
  133. data/app/components/pulse/badge.rb +59 -0
  134. data/app/components/pulse/base_component.rb +36 -0
  135. data/app/components/pulse/blank_slate.html.slim +10 -0
  136. data/app/components/pulse/blank_slate.rb +19 -0
  137. data/app/components/pulse/blank_slate.yml +2 -0
  138. data/app/components/pulse/border_box/header.html.slim +4 -0
  139. data/app/components/pulse/border_box/header.rb +48 -0
  140. data/app/components/pulse/border_box.html.slim +10 -0
  141. data/app/components/pulse/border_box.rb +124 -0
  142. data/app/components/pulse/box.rb +17 -0
  143. data/app/components/pulse/breadcrumb_item.rb +40 -0
  144. data/app/components/pulse/breadcrumbs.html.slim +9 -0
  145. data/app/components/pulse/breadcrumbs.rb +17 -0
  146. data/app/components/pulse/button.rb +148 -0
  147. data/app/components/pulse/component.rb +99 -0
  148. data/app/components/pulse/conditional_wrapper.rb +21 -0
  149. data/app/components/pulse/content.rb +11 -0
  150. data/app/components/pulse/counter.css +10 -0
  151. data/app/components/pulse/counter.rb +107 -0
  152. data/app/components/pulse/flash.html.slim +9 -0
  153. data/app/components/pulse/flash.rb +52 -0
  154. data/app/components/pulse/forms/error_explanation.html.slim +8 -0
  155. data/app/components/pulse/forms/error_explanation.rb +36 -0
  156. data/app/components/pulse/icon.rb +30 -0
  157. data/app/components/pulse/label.html.slim +5 -0
  158. data/app/components/pulse/label.rb +42 -0
  159. data/app/components/pulse/layout.css +239 -0
  160. data/app/components/pulse/layout.html.slim +7 -0
  161. data/app/components/pulse/layout.rb +141 -0
  162. data/app/components/pulse/link.html.slim +7 -0
  163. data/app/components/pulse/link.rb +52 -0
  164. data/app/components/pulse/modal.html.slim +51 -0
  165. data/app/components/pulse/modal.rb +64 -0
  166. data/app/components/pulse/modal_controller.js +77 -0
  167. data/app/components/pulse/nav_link.html.slim +16 -0
  168. data/app/components/pulse/nav_link.rb +25 -0
  169. data/app/components/pulse/nav_list/divider.rb +13 -0
  170. data/app/components/pulse/nav_list/group.html.slim +6 -0
  171. data/app/components/pulse/nav_list/group.rb +110 -0
  172. data/app/components/pulse/nav_list/heading.rb +36 -0
  173. data/app/components/pulse/nav_list/item.rb +171 -0
  174. data/app/components/pulse/nav_list.html.slim +11 -0
  175. data/app/components/pulse/nav_list.rb +225 -0
  176. data/app/components/pulse/popover.html.slim +5 -0
  177. data/app/components/pulse/popover.rb +88 -0
  178. data/app/components/pulse/progress_bar.html.slim +5 -0
  179. data/app/components/pulse/progress_bar.rb +23 -0
  180. data/app/components/pulse/progress_bar.yml +2 -0
  181. data/app/components/pulse/table/cell.html.slim +10 -0
  182. data/app/components/pulse/table/cell.rb +90 -0
  183. data/app/components/pulse/table/cell.yml +5 -0
  184. data/app/components/pulse/table/column.rb +22 -0
  185. data/app/components/pulse/table.html.slim +50 -0
  186. data/app/components/pulse/table.rb +111 -0
  187. data/app/components/pulse/table.yml +2 -0
  188. data/app/components/pulse/text.rb +72 -0
  189. data/app/components/pulse/toast.html.slim +14 -0
  190. data/app/components/pulse/toast.rb +85 -0
  191. data/app/components/pulse/toast_controller.js +32 -0
  192. data/app/javascript/pulse_view_components/application.js +24 -0
  193. data/app/javascript/pulse_view_components.js +4 -0
  194. data/app/lib/pulse/attributes_helper.rb +107 -0
  195. data/app/lib/pulse/fetch_or_fallback_helper.rb +53 -0
  196. data/app/lib/pulse/svg_helper.rb +28 -0
  197. data/lib/pulse/view_components/engine.rb +74 -0
  198. data/lib/pulse/view_components/version.rb +17 -0
  199. data/lib/pulse/view_components.rb +14 -0
  200. data/lib/pulse_view_components.rb +3 -0
  201. data/lib/tasks/pulse_view_components_tasks.rake +8 -0
  202. data/previews/pulse/badge_preview.rb +51 -0
  203. data/previews/pulse/blank_slate_preview.rb +14 -0
  204. data/previews/pulse/border_box_preview.rb +48 -0
  205. data/previews/pulse/breadcrumbs_preview.rb +13 -0
  206. data/previews/pulse/button_preview.rb +137 -0
  207. data/previews/pulse/counter_preview.rb +14 -0
  208. data/previews/pulse/flash_preview.rb +85 -0
  209. data/previews/pulse/icon_preview.rb +12 -0
  210. data/previews/pulse/label_preview.rb +10 -0
  211. data/previews/pulse/layout_preview.rb +34 -0
  212. data/previews/pulse/link_preview.rb +55 -0
  213. data/previews/pulse/modal_preview.rb +48 -0
  214. data/previews/pulse/nav_link_preview.rb +48 -0
  215. data/previews/pulse/nav_list_preview.rb +138 -0
  216. data/previews/pulse/popover_preview.rb +77 -0
  217. data/previews/pulse/progress_bar_preview.rb +23 -0
  218. data/previews/pulse/table_preview.rb +168 -0
  219. data/previews/pulse/text_preview.rb +102 -0
  220. data/previews/pulse/toast_preview.rb +67 -0
  221. metadata +344 -0
@@ -0,0 +1,568 @@
1
+ /*
2
+ Based on TailwindCSS recommendations,
3
+ consider using classes instead of the `@apply` directive
4
+ @see https://tailwindcss.com/docs/reusing-styles#avoiding-premature-abstraction
5
+ */
6
+ :root {
7
+ --actionListContent-paddingBlock: var(--control-medium-paddingBlock);
8
+ }
9
+
10
+ /* ActionList */
11
+ .ActionListHeader {
12
+ @apply pulse-ml-[var(--base-size-8)] pulse-mb-[var(--base-size-16)];
13
+ }
14
+
15
+ /* <ul> */
16
+ .ActionListWrap {
17
+ list-style: none;
18
+ }
19
+ .ActionListWrap--inset {
20
+ @apply pulse-pt-[var(--base-size-8)] pulse-pr-[var(--base-size-8)] pulse-pb-[var(--base-size-8)] pulse-pl-[var(--base-size-8)];
21
+ }
22
+
23
+ /* list dividers */
24
+ .ActionListWrap--divided .ActionListItem-label::before {
25
+ @apply pulse-absolute pulse-top-[calc(-1_*_var(--actionListContent-paddingBlock))] pulse-block pulse-w-full pulse-h-px pulse-content-[''];
26
+ background: var(
27
+ --borderColor-muted,
28
+ var(--color-action-list-item-inline-divider)
29
+ );
30
+ }
31
+
32
+ /* if descriptionWrap--inline exists, move pseudo divider to wrapper */
33
+ .ActionListWrap--divided .ActionListItem-descriptionWrap--inline::before {
34
+ @apply pulse-absolute pulse-top-[calc(-1_*_var(--actionListContent-paddingBlock))] pulse-block pulse-w-full pulse-h-[var(--borderWidth-thin)] pulse-content-[''];
35
+ background: var(
36
+ --borderColor-muted,
37
+ var(--color-action-list-item-inline-divider)
38
+ );
39
+ }
40
+
41
+ /* unset the default label pseudo */
42
+ .ActionListWrap--divided
43
+ .ActionListItem-descriptionWrap--inline
44
+ .ActionListItem-label::before {
45
+ @apply pulse-content-[unset];
46
+ }
47
+
48
+ /* hide divider if item is active */
49
+ .ActionListWrap--divided
50
+ .ActionListItem--navActive
51
+ .ActionListItem-label::before,
52
+ .ActionListWrap--divided
53
+ .ActionListItem--navActive
54
+ + .ActionListItem
55
+ .ActionListItem-label::before {
56
+ @apply pulse-invisible;
57
+ }
58
+
59
+ /* hide if item is first of type with label::before, or is the first item after a sectionDivider */
60
+ .ActionListItem:first-of-type .ActionListItem-label::before,
61
+ .ActionList-sectionDivider + .ActionListItem .ActionListItem-label::before {
62
+ @apply pulse-invisible;
63
+ }
64
+
65
+ /* hide if item is first of type with label::before, or is the first item after a sectionDivider */
66
+ .ActionListItem:first-of-type .ActionListItem-descriptionWrap--inline::before,
67
+ .ActionList-sectionDivider
68
+ + .ActionListItem
69
+ .ActionListItem-descriptionWrap--inline::before {
70
+ @apply pulse-invisible;
71
+ }
72
+
73
+ /* ActionList::Item */
74
+ .ActionListItem {
75
+ @apply pulse-relative pulse-bg-[color:var(--control-transparent-bgColor-rest)] pulse-rounded-[var(--borderRadius-medium)] selected:pulse-font-[number:var(--base-text-weight-normal)];
76
+ list-style: none;
77
+ }
78
+
79
+ /* state */
80
+ .ActionListItem:hover,
81
+ .ActionListItem:active {
82
+ @apply pulse-cursor-pointer;
83
+ }
84
+
85
+ /* hide dividers */
86
+ @media (hover: hover) {
87
+ .ActionListItem:hover .ActionListItem-label::before,
88
+ .ActionListItem:hover + .ActionListItem .ActionListItem-label::before {
89
+ @apply pulse-invisible;
90
+ }
91
+ .ActionListItem:hover .ActionListItem-descriptionWrap--inline::before,
92
+ .ActionListItem:hover
93
+ + .ActionListItem
94
+ .ActionListItem-descriptionWrap--inline::before {
95
+ @apply pulse-invisible;
96
+ }
97
+ }
98
+
99
+ /* Make sure that the first visible item isn't a divider */
100
+ .ActionListItem[hidden] + .ActionList-sectionDivider {
101
+ @apply pulse-hidden;
102
+ }
103
+
104
+ /* collapse styles here */
105
+
106
+ /* first child */
107
+ .ActionListItem.ActionListItem--hasSubItem > .ActionListContent {
108
+ @apply pulse-z-[1] active:pulse-bg-[color:var(--control-transparent-bgColor-active)];
109
+ }
110
+ @media (hover: hover) {
111
+ .ActionListItem.ActionListItem--hasSubItem > .ActionListContent:hover {
112
+ @apply pulse-bg-[color:var(--control-transparent-bgColor-hover)];
113
+ }
114
+ }
115
+
116
+ /* only hover li without list as children */
117
+ @media (hover: hover) {
118
+ .ActionListItem:not(.ActionListItem--hasSubItem):hover,
119
+ .ActionListItem.ActionListItem--hasSubItem > .ActionListContent:hover {
120
+ @apply pulse-cursor-pointer pulse-bg-[color:var(--control-transparent-bgColor-hover)];
121
+ }
122
+ .ActionListItem:not(.ActionListItem--hasSubItem):hover:not(.ActionListItem--navActive, :focus-visible),
123
+ .ActionListItem.ActionListItem--hasSubItem
124
+ > .ActionListContent:hover:not(.ActionListItem--navActive, :focus-visible) {
125
+ @apply pulse-outline-offset-[calc(-1_*_var(--borderWidth-thin))] pulse-shadow-[var(--boxShadow-thin)_var(--control-transparent-borderColor-active)];
126
+
127
+ /* Support for "Windows high contrast mode" */
128
+ outline: solid var(--borderWidth-thin) transparent;
129
+ }
130
+ }
131
+ .ActionListItem:not(.ActionListItem--hasSubItem):active,
132
+ .ActionListItem.ActionListItem--hasSubItem > .ActionListContent:active {
133
+ background: var(--control-transparent-bgColor-active);
134
+ }
135
+ .ActionListItem:not(.ActionListItem--hasSubItem):active:not(.ActionListItem--navActive),
136
+ .ActionListItem.ActionListItem--hasSubItem
137
+ > .ActionListContent:active:not(.ActionListItem--navActive) {
138
+ @apply pulse-outline-offset-[calc(-1_*_var(--borderWidth-thin))] pulse-shadow-[var(--boxShadow-thin)_var(--control-transparent-borderColor-active)];
139
+
140
+ /* Support for "Windows high contrast mode" https:sarahmhigley.com/writing/whcm-quick-tips/ */
141
+ outline: solid var(--borderWidth-thin) transparent;
142
+ }
143
+ .ActionListItem:not(.ActionListItem--hasSubItem):active
144
+ .ActionListItem-label::before,
145
+ .ActionListItem:not(.ActionListItem--hasSubItem):active
146
+ + .ActionListItem
147
+ .ActionListItem-label::before,
148
+ .ActionListItem.ActionListItem--hasSubItem
149
+ > .ActionListContent:active
150
+ .ActionListItem-label::before,
151
+ .ActionListItem.ActionListItem--hasSubItem
152
+ > .ActionListContent:active
153
+ + .ActionListItem
154
+ .ActionListItem-label::before {
155
+ @apply pulse-invisible;
156
+ }
157
+
158
+ /* Autocomplete [aria-selected] items */
159
+ .ActionListItem[aria-selected="true"] {
160
+ background: var(--control-transparent-bgColor-selected);
161
+ }
162
+ @media (hover: hover) {
163
+ .ActionListItem[aria-selected="true"]:hover {
164
+ @apply pulse-bg-[color:var(--control-transparent-bgColor-hover)];
165
+ }
166
+ }
167
+ .ActionListItem[aria-selected="true"]::before,
168
+ .ActionListItem[aria-selected="true"] + .ActionListItem::before {
169
+ @apply pulse-invisible;
170
+ }
171
+
172
+ /* blue accent line */
173
+ .ActionListItem[aria-selected="true"]::after {
174
+ @mixin activeIndicatorLine calc(-1 * var(--base-size-4));
175
+ }
176
+
177
+ /* active state [aria-current] */
178
+ .ActionListItem.ActionListItem--navActive {
179
+ @apply pulse-outline-none;
180
+
181
+ /* provides a visual indication of the current item for Windows high-contrast mode */
182
+ }
183
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--subItem)
184
+ .ActionListItem-label {
185
+ @apply pulse-font-[number:var(--base-text-weight-semibold)];
186
+ }
187
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--danger) {
188
+ background: var(--control-transparent-bgColor-selected);
189
+ }
190
+ @media (hover: hover) {
191
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--danger):hover {
192
+ @apply pulse-bg-[color:var(--control-transparent-bgColor-hover)];
193
+ }
194
+ }
195
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--danger)::before,
196
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--danger)
197
+ + .ActionListItem::before {
198
+ @apply pulse-invisible;
199
+ }
200
+
201
+ /* blue accent line */
202
+ .ActionListItem.ActionListItem--navActive:not(.ActionListItem--danger)::after {
203
+ @mixin activeIndicatorLine;
204
+ }
205
+
206
+ /* disabled */
207
+ .ActionListItem.ActionListItem--disabled
208
+ .ActionListContent
209
+ .ActionListItem-label,
210
+ .ActionListItem.ActionListItem--disabled
211
+ .ActionListContent
212
+ .ActionListItem-description,
213
+ .ActionListItem[aria-disabled="true"] .ActionListContent .ActionListItem-label,
214
+ .ActionListItem[aria-disabled="true"]
215
+ .ActionListContent
216
+ .ActionListItem-description {
217
+ @apply pulse-text-[color:var(--control-fgColor-disabled)];
218
+ }
219
+ .ActionListItem.ActionListItem--disabled
220
+ .ActionListContent
221
+ .ActionListItem-visual,
222
+ .ActionListItem[aria-disabled="true"]
223
+ .ActionListContent
224
+ .ActionListItem-visual {
225
+ @apply pulse-fill-[var(--control-fgColor-disabled)];
226
+ }
227
+ @media (hover: hover) {
228
+ .ActionListItem.ActionListItem--disabled:hover,
229
+ .ActionListItem[aria-disabled="true"]:hover {
230
+ @apply pulse-cursor-not-allowed pulse-bg-transparent;
231
+ }
232
+ }
233
+
234
+ /* variants */
235
+
236
+ /* danger */
237
+ .ActionListItem.ActionListItem--danger .ActionListItem-label {
238
+ @apply pulse-text-[color:var(--control-danger-fgColor-rest)];
239
+ }
240
+ .ActionListItem.ActionListItem--danger .ActionListItem-visual {
241
+ @apply pulse-text-[color:var(--control-danger-fgColor-rest)];
242
+ }
243
+ @media (hover: hover) {
244
+ .ActionListItem.ActionListItem--danger:hover {
245
+ background: var(--control-danger-bgColor-hover);
246
+ }
247
+ .ActionListItem.ActionListItem--danger:hover .ActionListItem-label,
248
+ .ActionListItem.ActionListItem--danger:hover .ActionListItem-visual,
249
+ .ActionListItem.ActionListItem--danger:hover .ActionListItem-description {
250
+ @apply pulse-text-[color:var(--control-danger-fgColor-hover)];
251
+ }
252
+ }
253
+ .ActionListItem.ActionListItem--danger .ActionListContent:active {
254
+ background: var(--control-danger-bgColor-active);
255
+ }
256
+ .ActionListItem.ActionListItem--danger
257
+ .ActionListContent:active
258
+ .ActionListItem-label,
259
+ .ActionListItem.ActionListItem--danger
260
+ .ActionListContent:active
261
+ .ActionListItem-visual,
262
+ .ActionListItem.ActionListItem--danger
263
+ .ActionListContent:active
264
+ .ActionListItem-description {
265
+ @apply pulse-text-[color:var(--control-danger-fgColor-hover)];
266
+ }
267
+
268
+ /* button or a href */
269
+ .ActionListContent {
270
+ @apply pulse-relative pulse-grid pulse-w-full pulse-text-[color:var(--control-fgColor-rest)] pulse-text-left pulse-select-none pulse-bg-transparent pulse-rounded-[var(--borderRadius-medium)] pulse-transition-[background] pulse-duration-[33.333ms] pulse-ease-linear pulse-touch-manipulation pulse-grid-rows-[min-content] pulse-grid-cols-[min-content_min-content_minmax(0,auto)_min-content_min-content] pulse-border-[none] hover:pulse-no-underline;
271
+ padding-block: var(--actionListContent-paddingBlock);
272
+ padding-inline: var(--control-medium-paddingInline-condensed);
273
+ -webkit-tap-highlight-color: transparent;
274
+ grid-template-areas: "leadingAction leadingVisual label trailingVisual trailingAction";
275
+ align-items: start;
276
+ }
277
+ /* column-gap persists with empty grid-areas, margin applies only when children exist */
278
+ .ActionListContent > :not(:last-child) {
279
+ @apply pulse-mr-[var(--control-medium-gap)];
280
+ }
281
+ /* state */
282
+ /* disabled */
283
+ .ActionListContent[aria-disabled="true"] .ActionListItem-label,
284
+ .ActionListContent[aria-disabled="true"] .ActionListItem-description {
285
+ @apply pulse-text-[color:var(--control-fgColor-disabled)];
286
+ }
287
+ .ActionListContent[aria-disabled="true"] .ActionListItem-visual {
288
+ @apply pulse-fill-[var(--control-fgColor-disabled)];
289
+ }
290
+ @media (hover: hover) {
291
+ .ActionListContent[aria-disabled="true"]:hover {
292
+ @apply pulse-cursor-not-allowed pulse-bg-transparent;
293
+ }
294
+ }
295
+ /* collapsible item [aria-expanded] */
296
+ /* nesting (single level)
297
+ target items inside expanded subgroups */
298
+ @media screen and (prefers-reduced-motion: no-preference) {
299
+ .ActionListContent[aria-expanded] + .ActionList--subGroup {
300
+ transition: opacity 160ms cubic-bezier(0.25, 1, 0.5, 1),
301
+ transform 160ms cubic-bezier(0.25, 1, 0.5, 1);
302
+ }
303
+ }
304
+ .ActionListContent[aria-expanded] + .ActionList--subGroup .ActionListContent {
305
+ @apply pulse-pl-[var(--base-size-24)];
306
+ }
307
+ /* has 16px leading visual */
308
+ .ActionListContent[aria-expanded].ActionListContent--visual16
309
+ + .ActionList--subGroup
310
+ .ActionListContent {
311
+ @apply pulse-pl-[var(--base-size-32)];
312
+ }
313
+ /* has 20px leading visual */
314
+ .ActionListContent[aria-expanded].ActionListContent--visual20
315
+ + .ActionList--subGroup
316
+ .ActionListContent {
317
+ @apply pulse-pl-[var(--base-size-36)];
318
+ }
319
+ /* has 24px leading visual */
320
+ .ActionListContent[aria-expanded].ActionListContent--visual24
321
+ + .ActionList--subGroup
322
+ .ActionListContent {
323
+ @apply pulse-pl-[var(--base-size-40)];
324
+ }
325
+ .ActionListContent[aria-expanded="true"] .ActionListItem-collapseIcon {
326
+ @apply pulse-transition-transform pulse-duration-[120ms] pulse-ease-linear -pulse-scale-y-100;
327
+ }
328
+ .ActionListContent[aria-expanded="true"] + .ActionList--subGroup {
329
+ @apply pulse-h-auto pulse-overflow-visible pulse-visible pulse-opacity-100 pulse-translate-y-0;
330
+ }
331
+ .ActionListContent[aria-expanded="true"].ActionListContent--hasActiveSubItem
332
+ > .ActionListItem-label {
333
+ @apply pulse-font-[number:var(--base-text-weight-semibold)];
334
+ }
335
+ .ActionListContent[aria-expanded="false"] .ActionListItem-collapseIcon {
336
+ @apply pulse-transition-transform pulse-duration-[120ms] pulse-ease-linear pulse-scale-y-100;
337
+ }
338
+ .ActionListContent[aria-expanded="false"] + .ActionList--subGroup {
339
+ @apply pulse-h-0 pulse-overflow-hidden pulse-invisible pulse-opacity-0 pulse-translate-y-[calc(-1_*_var(--base-size-16];
340
+ }
341
+ /* show active indicator on parent collapse if child is active */
342
+ .ActionListContent[aria-expanded="false"].ActionListContent--hasActiveSubItem {
343
+ background: var(--control-transparent-bgColor-selected);
344
+ }
345
+ .ActionListContent[aria-expanded="false"].ActionListContent--hasActiveSubItem
346
+ .ActionListItem-label {
347
+ @apply pulse-font-[number:var(--base-text-weight-semibold)];
348
+ }
349
+ .ActionListContent[aria-expanded="false"].ActionListContent--hasActiveSubItem::before,
350
+ .ActionListContent[aria-expanded="false"].ActionListContent--hasActiveSubItem
351
+ + .ActionListItem::before {
352
+ @apply pulse-invisible;
353
+ }
354
+ /* blue accent line */
355
+ .ActionListContent[aria-expanded="false"].ActionListContent--hasActiveSubItem::after {
356
+ @mixin activeIndicatorLine;
357
+ }
358
+ /*
359
+ * checkbox item [aria-checked]
360
+ * listbox [aria-selected]
361
+ */
362
+ /* multiselect checkmark */
363
+ .ActionListContent[aria-checked="true"] .ActionListItem-multiSelectCheckmark,
364
+ .ActionListContent[aria-selected="true"] .ActionListItem-multiSelectCheckmark {
365
+ @apply pulse-visible pulse-opacity-100;
366
+ transition: visibility 0 linear 0, opacity 50ms;
367
+ }
368
+ /* singleselect checkmark */
369
+ .ActionListContent[aria-checked="true"] .ActionListItem-singleSelectCheckmark,
370
+ .ActionListContent[aria-selected="true"] .ActionListItem-singleSelectCheckmark {
371
+ @apply pulse-visible motion-safe:pulse-animate-[checkmarkIn_200ms_cubic-bezier(0.11,0,0.5,0)_forwards];
372
+ }
373
+ @media screen and (prefers-reduced-motion: no-preference) {
374
+ @keyframes checkmarkIn {
375
+ from {
376
+ clip-path: inset(16px 0 0 0);
377
+ }
378
+ to {
379
+ clip-path: inset(0 0 0 0);
380
+ }
381
+ }
382
+ }
383
+ /* checkbox */
384
+ .ActionListContent[aria-checked="true"]
385
+ .ActionListItem-multiSelectIcon
386
+ .ActionListItem-multiSelectIconRect,
387
+ .ActionListContent[aria-selected="true"]
388
+ .ActionListItem-multiSelectIcon
389
+ .ActionListItem-multiSelectIconRect {
390
+ @apply pulse-fill-[var(--control-checked-bgColor-rest)] pulse-stroke-[color:var(--control-checked-bgColor-rest)] pulse-stroke-[length:var(--borderWidth-thin,1px)];
391
+ }
392
+ .ActionListContent[aria-checked="true"]
393
+ .ActionListItem-multiSelectIcon
394
+ .ActionListItem-multiSelectCheckmark,
395
+ .ActionListContent[aria-selected="true"]
396
+ .ActionListItem-multiSelectIcon
397
+ .ActionListItem-multiSelectCheckmark {
398
+ @apply pulse-fill-[var(--pulse-fgColor-onEmphasis)];
399
+ }
400
+ /* multiselect checkmark */
401
+ .ActionListContent[aria-checked="false"] .ActionListItem-multiSelectCheckmark,
402
+ .ActionListContent[aria-selected="false"] .ActionListItem-multiSelectCheckmark {
403
+ @apply pulse-invisible pulse-opacity-0;
404
+ transition: visibility 0 linear 50ms, opacity 50ms;
405
+ }
406
+ /* singleselect checkmark */
407
+ .ActionListContent[aria-checked="false"] .ActionListItem-singleSelectCheckmark,
408
+ .ActionListContent[aria-selected="false"]
409
+ .ActionListItem-singleSelectCheckmark {
410
+ @apply pulse-invisible pulse-transition-[visibility] pulse-duration-[0s] pulse-ease-linear pulse-delay-200 motion-safe:pulse-animate-[checkmarkOut_200ms_cubic-bezier(0.11,0,0.5,0)_forwards];
411
+ clip-path: inset(16px 0 0 0);
412
+ }
413
+ @media screen and (prefers-reduced-motion: no-preference) {
414
+ @keyframes checkmarkOut {
415
+ from {
416
+ clip-path: inset(0 0 0 0);
417
+ }
418
+ to {
419
+ clip-path: inset(16px 0 0 0);
420
+ }
421
+ }
422
+ }
423
+ /* checkbox */
424
+ .ActionListContent[aria-checked="false"]
425
+ .ActionListItem-multiSelectIcon
426
+ .ActionListItem-multiSelectIconRect,
427
+ .ActionListContent[aria-selected="false"]
428
+ .ActionListItem-multiSelectIcon
429
+ .ActionListItem-multiSelectIconRect {
430
+ @apply pulse-fill-[var(--bgColor-default)] pulse-stroke-[color:var(--control-borderColor-rest)] pulse-stroke-[length:var(--borderWidth-thin,1px)];
431
+ }
432
+ .ActionListContent[aria-checked="false"] .ActionListItem-multiSelectIconRect,
433
+ .ActionListContent[aria-selected="false"] .ActionListItem-multiSelectIconRect {
434
+ @apply pulse-fill-[var(--bgColor-default)] pulse-border-[var(--borderWidth-thin,] pulse-border-[solid_var(--control-borderColor-rest)];
435
+ }
436
+ /* sizes */
437
+ .ActionListContent.ActionListContent--sizeLarge {
438
+ --actionListContent-paddingBlock: var(--control-large-paddingBlock);
439
+ }
440
+ .ActionListContent.ActionListContent--sizeXLarge {
441
+ --actionListContent-paddingBlock: var(--control-xlarge-paddingBlock);
442
+ }
443
+ /* On pointer:coarse (mobile), all list items are large */
444
+ @media (pointer: coarse) {
445
+ .ActionListContent {
446
+ --actionListContent-paddingBlock: var(--control-large-paddingBlock);
447
+ }
448
+ }
449
+ /* if leading/trailing visual, align with first line of content */
450
+ .ActionListContent.ActionListContent--blockDescription .ActionListItem-visual {
451
+ @apply pulse-place-self-start;
452
+ }
453
+
454
+ /* place children on grid */
455
+ .ActionListItem-action--leading {
456
+ grid-area: leadingAction;
457
+ }
458
+ /* .ActionListItem-visual--leading {
459
+ grid-area: leadingVisual;
460
+ } */
461
+ .ActionListItem-visual--trailing {
462
+ grid-area: trailingVisual;
463
+ }
464
+ .ActionListItem-action--trailing {
465
+ grid-area: trailingAction;
466
+ }
467
+
468
+ /* have leading visual svg filled with chosen color */
469
+ /* .ActionListItem-visual--leading svg {
470
+ @apply pulse-fill-[currentcolor];
471
+ } */
472
+
473
+ /* wrapper span
474
+ default block */
475
+ .ActionListItem-descriptionWrap {
476
+ @apply pulse-flex pulse-flex-col pulse-gap-[var(--base-size-4)];
477
+ grid-area: label;
478
+ }
479
+ .ActionListItem-descriptionWrap .ActionListItem-label {
480
+ @apply pulse-font-[number:var(--base-text-weight-semibold)];
481
+ }
482
+
483
+ /* inline */
484
+ .ActionListItem-descriptionWrap--inline {
485
+ @apply pulse-relative pulse-flex-row pulse-items-baseline pulse-gap-[var(--base-size-8)];
486
+ }
487
+
488
+ /* description */
489
+ .ActionListItem-description {
490
+ @apply pulse-text-[length:var(--text-body-size-small)] pulse-font-[number:var(--base-text-weight-normal)] pulse-leading-[var(--text-body-lineHeight-small)] pulse-text-[color:var(--fgColor-muted)];
491
+ }
492
+
493
+ /* helper for grid alignment with multi-line content
494
+ span wrapping svg or text */
495
+ .ActionListItem-visual,
496
+ .ActionListItem-action {
497
+ @apply pulse-flex pulse-min-h-[var(--control-medium-lineBoxHeight)] pulse-text-[color:var(--fgColor-muted)] pulse-pointer-events-none pulse-fill-[var(--fgColor-muted)] pulse-items-center;
498
+ }
499
+
500
+ /* text */
501
+ .ActionListItem-label {
502
+ @apply pulse-relative pulse-text-[length:var(--text-body-size-medium)] pulse-font-[number:var(--base-text-weight-normal)] pulse-leading-[var(--text-body-lineHeight-medium)] pulse-text-[color:var(--fgColor-default)];
503
+ grid-area: label;
504
+ }
505
+ .ActionListItem-label--truncate {
506
+ @apply pulse-overflow-hidden pulse-text-ellipsis pulse-whitespace-nowrap;
507
+ }
508
+
509
+ /* nested lists (only supports 1 level currently)
510
+ target ActionListItem--subItem for padding-left to maintain :active :after state */
511
+ .ActionListItem--subItem > .ActionListContent > .ActionListItem-label {
512
+ @apply pulse-text-[length:var(--text-body-size-small)] pulse-leading-[var(--text-body-lineHeight-small)];
513
+ }
514
+
515
+ /* trailing action icon button */
516
+ .ActionListItem--withActions {
517
+ @apply pulse-flex pulse-flex-nowrap pulse-items-center;
518
+ }
519
+ .ActionListItem-trailingAction {
520
+ @apply pulse-rounded-tl-none pulse-rounded-bl-none;
521
+ }
522
+
523
+ /* show trailing action button on hover */
524
+ .ActionListItem--trailingActionHover .ActionListItem-trailingAction {
525
+ @apply pulse-invisible;
526
+ }
527
+ .ActionListItem--trailingActionHover:hover .ActionListItem-trailingAction,
528
+ .ActionListItem--trailingActionHover:focus-within
529
+ .ActionListItem-trailingAction {
530
+ @apply pulse-visible;
531
+ }
532
+
533
+ /* ActionList::Divider */
534
+
535
+ /* with children */
536
+ .ActionList-sectionDivider:not(:empty) {
537
+ @apply pulse-flex pulse-text-[length:var(--text-body-size-small)] pulse-leading-[var(--text-body-lineHeight-small)] pulse-font-[number:var(--base-text-weight-semibold)] pulse-text-[color:var(--fgColor-muted)] pulse-flex-col;
538
+ padding-inline: var(--actionListContent-paddingBlock);
539
+ padding-block: var(--base-size-8);
540
+ }
541
+
542
+ /* no children */
543
+ .ActionList-sectionDivider:empty {
544
+ @apply pulse-block pulse-h-[var(--borderWidth-thin)] pulse-p-0 pulse-border-0;
545
+ margin-block-start: calc(var(--base-size-8) - var(--borderWidth-thin));
546
+ margin-block-end: var(--base-size-8);
547
+ margin-inline: calc(-1 * var(--base-size-8));
548
+ list-style: none;
549
+ background: var(
550
+ --borderColor-muted,
551
+ var(--color-action-list-item-inline-divider)
552
+ );
553
+ }
554
+ .ActionList-sectionDivider .ActionList-sectionDivider-title {
555
+ @apply pulse-text-[length:var(--text-body-size-small)] pulse-font-[number:var(--base-text-weight-semibold)] pulse-text-[color:var(--fgColor-muted)];
556
+ }
557
+ .ActionList-sectionDivider--filled {
558
+ @apply pulse-border-t-[color:var(--borderColor-muted,var(--color-action-list-item-inline-divider))] pulse-border-b-[color:var(--borderColor-muted,var(--color-action-list-item-inline-divider))] pulse-border-y-[solid] empty:pulse-h-[var(--base-size-8)] empty:pulse-box-border;
559
+ margin-block-start: calc(var(--base-size-8) - var(--borderWidth-thin));
560
+ margin-block-end: var(--base-size-8);
561
+ margin-inline: calc(-1 * var(--base-size-8));
562
+ background: var(--bgColor-muted);
563
+ }
564
+
565
+ /* if no children, treat as divider */
566
+ .ActionList-sectionDivider--filled:first-child {
567
+ margin-block-start: 0;
568
+ }