coveragebook_components 0.8.8 → 0.9.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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/build/coco/app.css +292 -245
  3. data/app/assets/build/coco/app.js +64 -34
  4. data/app/assets/build/coco/book.css +67 -18
  5. data/app/assets/build/coco/book.js +50 -21
  6. data/app/assets/js/libs/alpine/directives/dropdown.js +5 -2
  7. data/app/components/coco/app/elements/alert/alert.css +1 -1
  8. data/app/components/coco/app/elements/button/button.css +38 -58
  9. data/app/components/coco/app/elements/button/button.rb +2 -3
  10. data/app/components/coco/app/elements/button_group/button_group.css +7 -2
  11. data/app/components/coco/app/elements/button_group/button_group.html.erb +2 -1
  12. data/app/components/coco/app/elements/button_group/button_group.js +28 -14
  13. data/app/components/coco/app/elements/button_to/button_to.css +4 -8
  14. data/app/components/coco/app/elements/color_picker_button/color_picker_button.css +1 -2
  15. data/app/components/coco/app/elements/image_picker_button/image_picker_button.css +1 -2
  16. data/app/components/coco/app/elements/layout_picker_button/layout_picker_button.css +1 -2
  17. data/app/components/coco/app/elements/menu/menu.css +7 -5
  18. data/app/components/coco/app/elements/menu_button/menu_button.css +1 -2
  19. data/app/components/coco/app/elements/snackbar/snackbar.css +3 -3
  20. data/app/components/coco/base/button/button.css +9 -9
  21. data/app/components/coco/base/button/button.html.erb +16 -18
  22. data/app/components/coco/base/button/button.js +6 -18
  23. data/app/components/coco/base/button/button.rb +38 -58
  24. data/app/components/coco/base/button/button_dropdown.js +27 -0
  25. data/app/components/coco/base/modal/modal.css +12 -0
  26. data/app/components/coco/base/modal/modal.html.erb +11 -1
  27. data/app/components/coco/base/modal/modal.rb +4 -1
  28. data/app/components/coco/base/modal_dialog/modal_dialog.css +6 -2
  29. data/app/components/coco/base/panel/panel.css +19 -0
  30. data/app/components/coco/base/panel/panel.html.erb +5 -0
  31. data/app/components/coco/base/panel/panel.rb +4 -0
  32. data/app/helpers/coco/app_helper.rb +4 -0
  33. data/lib/coco.rb +1 -1
  34. metadata +6 -2
@@ -14044,7 +14044,7 @@
14044
14044
  var package_default = {
14045
14045
  name: "coveragebook-components",
14046
14046
  type: "module",
14047
- version: "0.8.8",
14047
+ version: "0.9.0",
14048
14048
  main: "index.js",
14049
14049
  repository: "git@github.com:coveragebook/coco.git",
14050
14050
  author: "Mark Perkins <mark@coveragebook.com>",
@@ -23835,10 +23835,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
23835
23835
  const settings = tippyModifiers(modifiers);
23836
23836
  const result = expression ? evaluate2(expression) : {};
23837
23837
  const directiveConfig = isObject2(result) ? result : {};
23838
- let _a = directiveConfig, { triggerTarget, contentTarget } = _a, config = __objRest(_a, ["triggerTarget", "contentTarget"]);
23838
+ let _a = directiveConfig, { triggerTarget, contentTarget, anchorTarget } = _a, config = __objRest(_a, ["triggerTarget", "contentTarget", "anchorTarget"]);
23839
23839
  contentTarget = contentTarget || el.querySelector("[x-dropdown\\:content]");
23840
23840
  content = isNode(contentTarget) ? contentTarget.firstElementChild : contentTarget;
23841
23841
  triggerTarget = triggerTarget || el.querySelector("[x-dropdown\\:trigger]") || el;
23842
+ anchorTarget = anchorTarget || el.querySelector("[x-dropdown\\:anchor]") || el;
23842
23843
  if (!el.__x_dropdown) {
23843
23844
  const mixin = Alpine3.reactive({
23844
23845
  dropdown: {
@@ -23854,7 +23855,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
23854
23855
  }
23855
23856
  });
23856
23857
  setData(el, mixin);
23857
- const dropdown = el.__x_dropdown = tippy_default(el, __spreadValues(__spreadValues({
23858
+ const dropdown = el.__x_dropdown = tippy_default(anchorTarget, __spreadValues(__spreadValues({
23858
23859
  theme: "coco-app-dropdown",
23859
23860
  placement: "bottom-start",
23860
23861
  offset: [0, 0],
@@ -24074,11 +24075,13 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
24074
24075
  confirmed: true,
24075
24076
  lastState: null,
24076
24077
  stateTooltips: data2.tooltips || {},
24077
- tooltipText: null,
24078
- dropdown: null
24078
+ tooltipText: null
24079
24079
  }, data2.props || {}), {
24080
24080
  init() {
24081
24081
  this.lastState = this.state;
24082
+ this.checkConfirmation = this.checkConfirmation.bind(this);
24083
+ this.approveAndRun = this.approveAndRun.bind(this);
24084
+ this.shouldShowTooltip = this.shouldShowTooltip.bind(this);
24082
24085
  this.$nextTick(() => {
24083
24086
  if (this.$options.confirm) {
24084
24087
  this.confirmed = false;
@@ -24106,7 +24109,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
24106
24109
  this.tooltipText = tooltipForState || defaultContent;
24107
24110
  }
24108
24111
  },
24109
- showTooltip() {
24112
+ shouldShowTooltip() {
24110
24113
  return !!this.tooltipText;
24111
24114
  },
24112
24115
  get disabled() {
@@ -24115,16 +24118,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
24115
24118
  set disabled(value) {
24116
24119
  this.$options.disabled = value;
24117
24120
  },
24118
- /* dropdown */
24119
- hideDropdown() {
24120
- if (this.dropdown) {
24121
- this.dropdown.hide();
24122
- }
24123
- },
24124
- showDropdown() {
24125
- if (this.dropdown) {
24126
- this.dropdown.show();
24127
- }
24121
+ get tippyInstance() {
24122
+ return this.$root.__x_tippy;
24128
24123
  },
24129
24124
  /* confirmation */
24130
24125
  checkConfirmation(event) {
@@ -24204,15 +24199,38 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
24204
24199
  root: {
24205
24200
  "x-options": "options",
24206
24201
  "x-tooltip": "tooltipText",
24207
- "x-effect": "setTooltipText",
24208
- "@confirmation:confirm": "approveAndRun",
24209
- "@confirmation:cancel": "cancelConfirmation",
24210
- "@dropdown:show": "setState('active')",
24211
- "@dropdown:hide": "resetState()"
24202
+ "x-effect": "setTooltipText"
24212
24203
  }
24213
24204
  });
24214
24205
  });
24215
24206
 
24207
+ // ../../components/coco/base/button/button_dropdown.js
24208
+ var button_dropdown_exports = {};
24209
+ __export(button_dropdown_exports, {
24210
+ default: () => button_dropdown_default
24211
+ });
24212
+ var button_dropdown_default = CocoComponent("buttonDropdown", (data2 = {}) => {
24213
+ return {
24214
+ dropdown: null,
24215
+ button: null,
24216
+ init() {
24217
+ this.$nextTick(() => {
24218
+ this.button = getComponent(this.$el.querySelector(".coco-button"));
24219
+ });
24220
+ },
24221
+ hideDropdown() {
24222
+ if (this.dropdown) {
24223
+ this.dropdown.hide();
24224
+ }
24225
+ },
24226
+ showDropdown() {
24227
+ if (this.dropdown) {
24228
+ this.dropdown.show();
24229
+ }
24230
+ }
24231
+ };
24232
+ });
24233
+
24216
24234
  // ../../components/coco/base/dropdown/dropdown.js
24217
24235
  var dropdown_exports = {};
24218
24236
  __export(dropdown_exports, {
@@ -24544,7 +24562,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
24544
24562
  }
24545
24563
 
24546
24564
  // import-glob:/Users/mark/Code/coveragebook/coco/app/assets/js/base|@baseComponents/**/*.js
24547
- var modules = [button_exports, dropdown_exports, icon_exports, image_uploader_exports, modal_exports, modal_dialog_exports, modal_lightbox_exports, poll_controller_exports];
24565
+ var modules = [button_exports, button_dropdown_exports, dropdown_exports, icon_exports, image_uploader_exports, modal_exports, modal_dialog_exports, modal_lightbox_exports, poll_controller_exports];
24548
24566
  var __default = modules;
24549
24567
 
24550
24568
  // base/components.js
@@ -25072,10 +25090,12 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
25072
25090
  var button_group_default = CocoComponent("appButtonGroup", () => {
25073
25091
  return {
25074
25092
  options: ["collapsible"],
25093
+ ready: false,
25075
25094
  containerWidth: 0,
25076
25095
  contentWidth: 0,
25077
25096
  collapsed: false,
25078
- tooltip: null,
25097
+ singletonTooltip: null,
25098
+ tooltipInstances: [],
25079
25099
  get collapsible() {
25080
25100
  return this.$options.collapsible !== false;
25081
25101
  },
@@ -25083,7 +25103,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
25083
25103
  const buttonElements = this.$el.querySelectorAll(
25084
25104
  "[data-component='app-button']"
25085
25105
  );
25086
- return Array.from(buttonElements).map((el) => getData(el));
25106
+ return Array.from(buttonElements).map((el) => getComponent(el));
25087
25107
  },
25088
25108
  get parent() {
25089
25109
  return this.$root.parentElement;
@@ -25092,24 +25112,34 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
25092
25112
  this.$nextTick(() => {
25093
25113
  if (!this.collapsible)
25094
25114
  return;
25095
- this.createTooltipsSingleton();
25115
+ this.ready = true;
25096
25116
  this.onResize();
25117
+ this.createSingletonTooltip();
25097
25118
  });
25098
25119
  this.$watch("collapsed", (value) => {
25099
25120
  this.buttons.forEach((button) => {
25100
25121
  button.isCollapsed = value;
25101
25122
  });
25123
+ this.$nextTick(() => this.createSingletonTooltip());
25102
25124
  });
25103
25125
  },
25104
- createTooltipsSingleton() {
25105
- const tippys = this.buttons.map((button) => {
25106
- return button.showTooltip() && button.$root.__x_tippy;
25107
- }).filter((t3) => t3);
25108
- this.tooltip = createSingleton(tippys, {
25126
+ createSingletonTooltip() {
25127
+ this.destroySingletonTooltip();
25128
+ this.tooltipInstances = this.buttons.map((button) => button.shouldShowTooltip() && button.tippyInstance).filter((t3) => t3);
25129
+ this.singletonTooltip = createSingleton(this.tooltipInstances, {
25109
25130
  theme: "coco-tooltip",
25110
- onShow: () => this.collapsed
25131
+ delay: 100,
25132
+ moveTransition: "transform 0.1s ease-out"
25111
25133
  });
25112
25134
  },
25135
+ destroySingletonTooltip() {
25136
+ if (this.singletonTooltip && this.singletonTooltip.destroy) {
25137
+ this.singletonTooltip.destroy();
25138
+ this.singletonTooltip = null;
25139
+ this.tooltipInstances.forEach((tooltip) => tooltip.destroy());
25140
+ this.tooltipInstances = [];
25141
+ }
25142
+ },
25113
25143
  onResize() {
25114
25144
  if (!this.collapsible)
25115
25145
  return;
@@ -25128,9 +25158,9 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
25128
25158
  }
25129
25159
  },
25130
25160
  destroy() {
25131
- if (this.tooltip) {
25132
- this.tooltip.destroy();
25133
- this.tooltip = null;
25161
+ if (this.singletonTooltip) {
25162
+ this.singletonTooltip.destroy();
25163
+ this.singletonTooltip = null;
25134
25164
  }
25135
25165
  }
25136
25166
  };
@@ -777,6 +777,9 @@ select {
777
777
  height: 2rem;
778
778
  width: 2rem;
779
779
  }
780
+ .coco-button-wrapper {
781
+ display: contents !important;
782
+ }
780
783
  [data-coco].coco-button {
781
784
  display: flex;
782
785
  width: auto;
@@ -788,22 +791,20 @@ select {
788
791
  border-color: transparent;
789
792
  background-color: transparent;
790
793
  color: currentColor;
791
- transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
792
- transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
793
- transition-duration: 150ms;
794
- width: -moz-min-content;
795
- width: min-content;
796
- }
797
- [data-coco].coco-button .button-element {
798
- display: inline-flex;
799
- width: 100%;
800
794
  text-decoration-line: none;
801
795
  outline: 2px solid transparent;
802
796
  outline-offset: 2px;
797
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
798
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
799
+ transition-duration: 150ms;
803
800
  }
804
- [data-coco].coco-button .button-element:focus-visible {
801
+ [data-coco].coco-button:focus-visible {
805
802
  outline-width: 0px;
806
803
  }
804
+ [data-coco].coco-button {
805
+ width: -moz-min-content;
806
+ width: min-content;
807
+ }
807
808
  [data-coco].coco-button .button-inner {
808
809
  margin-left: auto;
809
810
  margin-right: auto;
@@ -838,7 +839,7 @@ select {
838
839
  order: 3;
839
840
  }
840
841
  /* disabled */
841
- [data-coco].coco-button[data-disabled="true"] .button-element {
842
+ [data-coco].coco-button[data-disabled="true"] {
842
843
  pointer-events: none;
843
844
  cursor: not-allowed;
844
845
  }
@@ -849,7 +850,7 @@ select {
849
850
  transform: rotate(360deg);
850
851
  }
851
852
  }
852
- [data-coco].coco-button[data-state="loading"] > .button-element .button-icon {
853
+ [data-coco].coco-button[data-state="loading"] .button-icon {
853
854
  animation: spin 1.5s linear infinite;
854
855
  }
855
856
  /* Fit */
@@ -857,16 +858,16 @@ select {
857
858
  width: 100%;
858
859
  }
859
860
  /* Icons */
860
- [data-coco].coco-button[data-icon-position="end"] > .button-element .button-content {
861
+ [data-coco].coco-button[data-icon-position="end"] .button-content {
861
862
  order: 1;
862
863
  }
863
- [data-coco].coco-button[data-icon-position="end"] > .button-element .button-icon {
864
+ [data-coco].coco-button[data-icon-position="end"] .button-icon {
864
865
  order: 2;
865
866
  }
866
- [data-coco].coco-button[data-icon-position="end"] > .button-element .button-toggle {
867
+ [data-coco].coco-button[data-icon-position="end"] .button-toggle {
867
868
  order: 3;
868
869
  }
869
- [data-coco].coco-button.with-icon[data-collapsed="true"] > .button-element .button-content {
870
+ [data-coco].coco-button.with-icon[data-collapsed="true"] .button-content {
870
871
  display: none;
871
872
  }
872
873
  [data-coco][data-component="dropdown"] {
@@ -1128,15 +1129,34 @@ select {
1128
1129
  .modal-frame {
1129
1130
  display: contents;
1130
1131
  }
1132
+ /*
1133
+ Limit the size of modal content when rendered in the
1134
+ host page rather than displayed as a modal.
1135
+ */
1136
+ [data-role="inline-modal-content"] {
1137
+ margin-left: auto;
1138
+ margin-right: auto;
1139
+ max-width: 42rem;
1140
+ }
1141
+ [data-role="inline-modal-content"] [data-component="modal-dialog"] {
1142
+ border-radius: 0.75rem;
1143
+ border-width: 1px;
1144
+ --tw-border-opacity: 1;
1145
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
1146
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
1147
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
1148
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1149
+ }
1131
1150
  [data-coco][data-component="modal-dialog"] {
1132
1151
  width: 100%;
1133
1152
  border-radius: 0.75rem;
1153
+ }
1154
+ .modal-frame [data-coco][data-component="modal-dialog"] {
1134
1155
  --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
1135
1156
  --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);
1136
1157
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1137
- max-width: 42rem;
1158
+ max-width: 42rem; /* temp until sizes added */
1138
1159
  }
1139
- /* temp until sizes added */
1140
1160
  [data-coco][data-component="modal-dialog"] .modal-dialog-header {
1141
1161
  position: relative;
1142
1162
  display: flex;
@@ -1360,6 +1380,29 @@ select {
1360
1380
  [data-coco][data-component="pager-link"][data-direction="next"] .coco-icon {
1361
1381
  margin-right: -0.25rem;
1362
1382
  }
1383
+ [data-coco][data-component="panel"] {
1384
+ display: contents;
1385
+ }
1386
+ [data-coco][data-component="panel"] .panel-content {
1387
+ display: contents;
1388
+ }
1389
+ /* Only style Coco panels that are not rendered inside legacy panel components */
1390
+ [data-coco][data-component="panel"]:not([data-component="panel"] [data-component="panel"]) {
1391
+ display: block;
1392
+ border-radius: 0.75rem;
1393
+ border-width: 1px;
1394
+ --tw-border-opacity: 1;
1395
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
1396
+ --tw-bg-opacity: 1;
1397
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
1398
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
1399
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
1400
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
1401
+ }
1402
+ [data-coco][data-component="panel"]:not([data-component="panel"] [data-component="panel"]) .panel-content {
1403
+ display: block;
1404
+ padding: max(min(5%, 2rem), 1rem);
1405
+ }
1363
1406
  [data-coco][data-component="placeholder"] {
1364
1407
  padding: 1rem;
1365
1408
  }
@@ -1896,6 +1939,9 @@ select {
1896
1939
  .hidden {
1897
1940
  display: none;
1898
1941
  }
1942
+ .transform {
1943
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
1944
+ }
1899
1945
  .resize {
1900
1946
  resize: both;
1901
1947
  }
@@ -1924,6 +1970,9 @@ select {
1924
1970
  .filter {
1925
1971
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
1926
1972
  }
1973
+ .ease-out {
1974
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
1975
+ }
1927
1976
  /* Transparent gray blend-mode background utilities */
1928
1977
  .\!icon {
1929
1978
  }
@@ -11815,6 +11815,17 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
11815
11815
  });
11816
11816
  return components;
11817
11817
  }
11818
+ function getComponent(el, throwOnError = false) {
11819
+ try {
11820
+ return Alpine.$data(el);
11821
+ } catch (error2) {
11822
+ if (throwOnError) {
11823
+ throw error2;
11824
+ } else {
11825
+ return null;
11826
+ }
11827
+ }
11828
+ }
11818
11829
  function getData(el) {
11819
11830
  const root = Alpine.closestRoot(el);
11820
11831
  return root ? Alpine.$data(root) : null;
@@ -15061,10 +15072,11 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15061
15072
  const settings = tippyModifiers(modifiers);
15062
15073
  const result = expression ? evaluate2(expression) : {};
15063
15074
  const directiveConfig = isObject2(result) ? result : {};
15064
- let _a = directiveConfig, { triggerTarget, contentTarget } = _a, config = __objRest(_a, ["triggerTarget", "contentTarget"]);
15075
+ let _a = directiveConfig, { triggerTarget, contentTarget, anchorTarget } = _a, config = __objRest(_a, ["triggerTarget", "contentTarget", "anchorTarget"]);
15065
15076
  contentTarget = contentTarget || el.querySelector("[x-dropdown\\:content]");
15066
15077
  content = isNode(contentTarget) ? contentTarget.firstElementChild : contentTarget;
15067
15078
  triggerTarget = triggerTarget || el.querySelector("[x-dropdown\\:trigger]") || el;
15079
+ anchorTarget = anchorTarget || el.querySelector("[x-dropdown\\:anchor]") || el;
15068
15080
  if (!el.__x_dropdown) {
15069
15081
  const mixin = Alpine3.reactive({
15070
15082
  dropdown: {
@@ -15080,7 +15092,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15080
15092
  }
15081
15093
  });
15082
15094
  setData(el, mixin);
15083
- const dropdown = el.__x_dropdown = tippy_default(el, __spreadValues(__spreadValues({
15095
+ const dropdown = el.__x_dropdown = tippy_default(anchorTarget, __spreadValues(__spreadValues({
15084
15096
  theme: "coco-app-dropdown",
15085
15097
  placement: "bottom-start",
15086
15098
  offset: [0, 0],
@@ -15272,11 +15284,13 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15272
15284
  confirmed: true,
15273
15285
  lastState: null,
15274
15286
  stateTooltips: data2.tooltips || {},
15275
- tooltipText: null,
15276
- dropdown: null
15287
+ tooltipText: null
15277
15288
  }, data2.props || {}), {
15278
15289
  init() {
15279
15290
  this.lastState = this.state;
15291
+ this.checkConfirmation = this.checkConfirmation.bind(this);
15292
+ this.approveAndRun = this.approveAndRun.bind(this);
15293
+ this.shouldShowTooltip = this.shouldShowTooltip.bind(this);
15280
15294
  this.$nextTick(() => {
15281
15295
  if (this.$options.confirm) {
15282
15296
  this.confirmed = false;
@@ -15304,7 +15318,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15304
15318
  this.tooltipText = tooltipForState || defaultContent;
15305
15319
  }
15306
15320
  },
15307
- showTooltip() {
15321
+ shouldShowTooltip() {
15308
15322
  return !!this.tooltipText;
15309
15323
  },
15310
15324
  get disabled() {
@@ -15313,16 +15327,8 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15313
15327
  set disabled(value) {
15314
15328
  this.$options.disabled = value;
15315
15329
  },
15316
- /* dropdown */
15317
- hideDropdown() {
15318
- if (this.dropdown) {
15319
- this.dropdown.hide();
15320
- }
15321
- },
15322
- showDropdown() {
15323
- if (this.dropdown) {
15324
- this.dropdown.show();
15325
- }
15330
+ get tippyInstance() {
15331
+ return this.$root.__x_tippy;
15326
15332
  },
15327
15333
  /* confirmation */
15328
15334
  checkConfirmation(event) {
@@ -15402,15 +15408,38 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15402
15408
  root: {
15403
15409
  "x-options": "options",
15404
15410
  "x-tooltip": "tooltipText",
15405
- "x-effect": "setTooltipText",
15406
- "@confirmation:confirm": "approveAndRun",
15407
- "@confirmation:cancel": "cancelConfirmation",
15408
- "@dropdown:show": "setState('active')",
15409
- "@dropdown:hide": "resetState()"
15411
+ "x-effect": "setTooltipText"
15410
15412
  }
15411
15413
  });
15412
15414
  });
15413
15415
 
15416
+ // ../../components/coco/base/button/button_dropdown.js
15417
+ var button_dropdown_exports = {};
15418
+ __export(button_dropdown_exports, {
15419
+ default: () => button_dropdown_default
15420
+ });
15421
+ var button_dropdown_default = CocoComponent("buttonDropdown", (data2 = {}) => {
15422
+ return {
15423
+ dropdown: null,
15424
+ button: null,
15425
+ init() {
15426
+ this.$nextTick(() => {
15427
+ this.button = getComponent(this.$el.querySelector(".coco-button"));
15428
+ });
15429
+ },
15430
+ hideDropdown() {
15431
+ if (this.dropdown) {
15432
+ this.dropdown.hide();
15433
+ }
15434
+ },
15435
+ showDropdown() {
15436
+ if (this.dropdown) {
15437
+ this.dropdown.show();
15438
+ }
15439
+ }
15440
+ };
15441
+ });
15442
+
15414
15443
  // ../../components/coco/base/dropdown/dropdown.js
15415
15444
  var dropdown_exports = {};
15416
15445
  __export(dropdown_exports, {
@@ -15755,7 +15784,7 @@ ${expression ? 'Expression: "' + expression + '"\n\n' : ""}`, el);
15755
15784
  }
15756
15785
 
15757
15786
  // import-glob:/Users/mark/Code/coveragebook/coco/app/assets/js/base|@baseComponents/**/*.js
15758
- var modules = [button_exports, dropdown_exports, icon_exports, image_uploader_exports, modal_exports, modal_dialog_exports, modal_lightbox_exports, poll_controller_exports];
15787
+ var modules = [button_exports, button_dropdown_exports, dropdown_exports, icon_exports, image_uploader_exports, modal_exports, modal_dialog_exports, modal_lightbox_exports, poll_controller_exports];
15759
15788
  var __default = modules;
15760
15789
 
15761
15790
  // base/components.js
@@ -16,7 +16,8 @@ export default function (Alpine) {
16
16
  const settings = buildConfig(modifiers);
17
17
  const result = expression ? evaluate(expression) : {};
18
18
  const directiveConfig = isObject(result) ? result : {};
19
- let { triggerTarget, contentTarget, ...config } = directiveConfig;
19
+ let { triggerTarget, contentTarget, anchorTarget, ...config } =
20
+ directiveConfig;
20
21
 
21
22
  contentTarget =
22
23
  contentTarget || el.querySelector("[x-dropdown\\:content]");
@@ -25,6 +26,8 @@ export default function (Alpine) {
25
26
  : contentTarget;
26
27
  triggerTarget =
27
28
  triggerTarget || el.querySelector("[x-dropdown\\:trigger]") || el;
29
+ anchorTarget =
30
+ anchorTarget || el.querySelector("[x-dropdown\\:anchor]") || el;
28
31
 
29
32
  // Initialize the dropdown
30
33
 
@@ -50,7 +53,7 @@ export default function (Alpine) {
50
53
 
51
54
  setData(el, mixin);
52
55
 
53
- const dropdown = (el.__x_dropdown = tippy(el, {
56
+ const dropdown = (el.__x_dropdown = tippy(anchorTarget, {
54
57
  theme: "coco-app-dropdown",
55
58
  placement: "bottom-start",
56
59
  offset: [0, 0],
@@ -66,7 +66,7 @@
66
66
  .alert-dismiss {
67
67
  @apply flex-none;
68
68
 
69
- .coco-button .button-element {
69
+ .coco-button {
70
70
  @apply text-content-dark-2 hover:text-content-dark-1 bg-transparent hover:bg-white/10 transition;
71
71
  }
72
72
  }