openproject-primer_view_components 0.59.2 → 0.61.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/app/assets/javascripts/components/primer/open_project/border_box/collapsible_header.d.ts +3 -9
  4. data/app/assets/javascripts/components/primer/open_project/collapsible.d.ts +11 -0
  5. data/app/assets/javascripts/components/primer/open_project/collapsible_section.d.ts +10 -0
  6. data/app/assets/javascripts/components/primer/primer.d.ts +2 -0
  7. data/app/assets/javascripts/primer_view_components.js +1 -1
  8. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  9. data/app/assets/styles/primer_view_components.css +1 -1
  10. data/app/assets/styles/primer_view_components.css.map +1 -1
  11. data/app/components/primer/alpha/auto_complete.css +1 -1
  12. data/app/components/primer/alpha/auto_complete.css.map +1 -1
  13. data/app/components/primer/alpha/banner.css +1 -1
  14. data/app/components/primer/alpha/banner.css.json +2 -0
  15. data/app/components/primer/alpha/banner.css.map +1 -1
  16. data/app/components/primer/alpha/banner.pcss +11 -1
  17. data/app/components/primer/alpha/banner.rb +5 -3
  18. data/app/components/primer/alpha/button_marketing.css +1 -1
  19. data/app/components/primer/alpha/button_marketing.css.map +1 -1
  20. data/app/components/primer/alpha/select.rb +1 -0
  21. data/app/components/primer/alpha/select_panel.rb +2 -3
  22. data/app/components/primer/alpha/text_area.rb +1 -0
  23. data/app/components/primer/alpha/text_field.css +1 -1
  24. data/app/components/primer/alpha/text_field.css.json +6 -4
  25. data/app/components/primer/alpha/text_field.css.map +1 -1
  26. data/app/components/primer/alpha/text_field.pcss +5 -1
  27. data/app/components/primer/alpha/text_field.rb +1 -0
  28. data/app/components/primer/alpha/toggle_switch.css +1 -1
  29. data/app/components/primer/alpha/toggle_switch.css.map +1 -1
  30. data/app/components/primer/beta/flash.css +1 -1
  31. data/app/components/primer/beta/flash.css.map +1 -1
  32. data/app/components/primer/open_project/border_box/collapsible_header.d.ts +3 -9
  33. data/app/components/primer/open_project/border_box/collapsible_header.html.erb +6 -6
  34. data/app/components/primer/open_project/border_box/collapsible_header.js +5 -46
  35. data/app/components/primer/open_project/border_box/collapsible_header.rb +41 -9
  36. data/app/components/primer/open_project/border_box/collapsible_header.ts +5 -47
  37. data/app/components/primer/open_project/collapsible.d.ts +11 -0
  38. data/app/components/primer/open_project/collapsible.js +56 -0
  39. data/app/components/primer/open_project/collapsible.ts +49 -0
  40. data/app/components/primer/open_project/collapsible_section.css +1 -0
  41. data/app/components/primer/open_project/collapsible_section.css.json +6 -0
  42. data/app/components/primer/open_project/collapsible_section.css.map +1 -0
  43. data/app/components/primer/open_project/collapsible_section.d.ts +10 -0
  44. data/app/components/primer/open_project/collapsible_section.html.erb +26 -0
  45. data/app/components/primer/open_project/collapsible_section.js +16 -0
  46. data/app/components/primer/open_project/collapsible_section.pcss +5 -0
  47. data/app/components/primer/open_project/collapsible_section.rb +77 -0
  48. data/app/components/primer/open_project/collapsible_section.ts +15 -0
  49. data/app/components/primer/open_project/input_group.css +1 -1
  50. data/app/components/primer/open_project/input_group.css.json +1 -0
  51. data/app/components/primer/open_project/input_group.css.map +1 -1
  52. data/app/components/primer/open_project/input_group.pcss +5 -1
  53. data/app/components/primer/open_project/input_group.rb +1 -0
  54. data/app/components/primer/primer.d.ts +2 -0
  55. data/app/components/primer/primer.js +2 -0
  56. data/app/components/primer/primer.pcss +1 -0
  57. data/app/components/primer/primer.ts +2 -0
  58. data/app/lib/primer/forms/dsl/input.rb +4 -0
  59. data/lib/primer/view_components/version.rb +2 -2
  60. data/previews/primer/alpha/banner_preview.rb +9 -3
  61. data/previews/primer/alpha/select_preview.rb +1 -1
  62. data/previews/primer/alpha/text_area_preview.rb +1 -1
  63. data/previews/primer/alpha/text_field_preview.rb +3 -3
  64. data/previews/primer/forms_preview/custom_width_fields_form.html.erb +9 -0
  65. data/previews/primer/open_project/border_box/collapsible_header_preview/playground.html.erb +5 -4
  66. data/previews/primer/open_project/collapsible_section_preview/collapsed.html.erb +9 -0
  67. data/previews/primer/open_project/collapsible_section_preview/default.html.erb +10 -0
  68. data/previews/primer/open_project/collapsible_section_preview/playground.html.erb +22 -0
  69. data/previews/primer/open_project/collapsible_section_preview/with_additional_information.html.erb +16 -0
  70. data/previews/primer/open_project/collapsible_section_preview/with_caption.html.erb +14 -0
  71. data/previews/primer/open_project/collapsible_section_preview.rb +57 -0
  72. data/previews/primer/open_project/input_group_preview.rb +1 -1
  73. data/static/arguments.json +132 -2
  74. data/static/audited_at.json +1 -0
  75. data/static/classes.json +3 -0
  76. data/static/constants.json +19 -2
  77. data/static/info_arch.json +316 -3
  78. data/static/previews.json +86 -0
  79. data/static/statuses.json +1 -0
  80. metadata +22 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["toggle_switch.pcss","<no source>"],"names":[],"mappings":"AAQA,yCAHE,mBAOF,CAJA,cACE,kBAAmB,CAEnB,4CACF,CAGE,8CACE,WAAY,CACZ,kBACF,CAEA,+CACE,QAAS,CACT,iBACF,CAGF,oBAgBE,uBAAgB,CAAhB,eAAgB,CANhB,iDAAkD,CAClD,yEAA0E,CAC1E,wCAAyC,CAJzC,cAAe,CANf,aAAc,CAEd,iCAAkC,CAElC,eAAgB,CADhB,SAAU,CAJV,iBAAkB,CAMlB,4BAAqB,CAArB,oBAAqB,CAOrB,wBAAyB,CACzB,iDAAmD,CAFnD,mDAAyD,CAJzD,wBAAiB,CAAjB,gBAAiB,CANjB,yBAyCF,CA1BE,4DAEE,kBACF,CAEA,0BACE,kDACF,CAEA,2BACE,mDACF,CAEA,wBAEI,gCC3DN,WAAA,YAAA,SAAA,gBAAA,kBAAA,QAAA,4CAAA,UD2DgC,CAE9B,CAEA,gCAGE,0CACE,eACF,CACF,CAGF,iDAEE,qDAAsD,CACtD,kBAAyB,CAFzB,6CAGF,CAEA,uCACE,oDAAqD,CACrD,2CAyBF,CAtBI,6DACE,qDACF,CAEA,8DACE,sDACF,CAGF,0DACE,mDAAoD,CACpD,mDAAoD,CACpD,0BACF,CAEA,8DACE,uBACF,CAEA,gEACE,0BACF,CAGF,8BAEE,qDAAsD,CACtD,kBAAyB,CAFzB,kBAAmB,CAGnB,wBAcF,CAZE,iDACE,uCAAwC,CACxC,eACF,CAMA,4GACE,0CACF,CAGF,oBAEE,kBAAmB,CADnB,YAAa,CAGb,WAAY,CACZ,eAAgB,CAFhB,UAGF,CAEA,uBAGE,yCAA0C,CAG1C,2BAEF,CAEA,gDAHE,YAAa,CALb,aAAc,CAEd,wBAAyB,CACzB,6BAaF,CARA,yBAGE,sCAAuC,CAGvC,uBAEF,CAEA,mBAME,gDAAiD,CACjD,wEAAyE,CACzE,wCAAyC,CALzC,QAAS,CAMT,0EAA4E,CAR5E,iBAAkB,CAClB,KAAM,CASN,wBAAyB,CACzB,6BAA8B,CAF9B,mDAAyD,CALzD,SAAU,CADV,SAaF,CAHE,gCAdF,mBAeI,eAEJ,CADE,CAGF,qBAIE,4BAA6B,CAF7B,sCAAuC,CACvC,8CAA+C,CAF/C,iBAAkB,CAIlB,gBACF,CAEA,yBACE,YAAa,CAGb,kBAAoB,CAFpB,yBAGF,CAGE,0CACE,qCACF,CAEA,yCAEE,iCAAkC,CADlC,yBAEF,CAIA,6CACE,0BACF,CAGF,uBACE,QAAS,CACT,iBACF,CAEA,wBACE,WAAY,CACZ,kBACF,CAEA,2BACE,0BAKF,CAHE,gDACE,eACF","file":"toggle_switch.css","sourcesContent":["/* ToggleSwitch */\n\n/* Catalyst in dotcom applies a display: block to all web component elements. This\n** rule overrides it so the status label and toggle switch are laid out correctly. */\n.ToggleSwitch.ToggleSwitch {\n display: inline-flex;\n}\n\n.ToggleSwitch {\n align-items: center;\n display: inline-flex;\n gap: var(--controlStack-medium-gap-condensed);\n}\n\n.ToggleSwitch--checked {\n & .ToggleSwitch-statusOn {\n height: auto;\n visibility: visible;\n }\n\n & .ToggleSwitch-statusOff {\n height: 0;\n visibility: hidden;\n }\n}\n\n.ToggleSwitch-track {\n position: relative;\n display: block;\n width: var(--base-size-64);\n height: var(--control-medium-size);\n padding: 0;\n overflow: hidden;\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n background-color: var(--controlTrack-bgColor-rest);\n border: var(--borderWidth-thin) solid var(--controlTrack-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);\n transition-duration: 80ms;\n transition-property: background-color, border-color;\n appearance: none;\n\n &:focus,\n &:focus-visible {\n outline-offset: 1px;\n }\n\n &:hover {\n background-color: var(--controlTrack-bgColor-hover);\n }\n\n &:active {\n background-color: var(--controlTrack-bgColor-active);\n }\n\n @media (pointer: coarse) {\n &::before {\n @mixin minTouchTarget 44px;\n }\n }\n\n @media (prefers-reduced-motion) {\n transition: none;\n\n & * {\n transition: none;\n }\n }\n}\n\n.ToggleSwitch-track[aria-pressed='true'][disabled] {\n color: var(--control-checked-fgColor-disabled);\n background-color: var(--controlTrack-bgColor-disabled);\n border-color: transparent;\n}\n\n.ToggleSwitch-track[aria-pressed='true'] {\n background-color: var(--control-checked-bgColor-rest);\n border-color: var(--borderColor-transparent);\n\n &:not([disabled]) {\n &:hover {\n background-color: var(--control-checked-bgColor-hover);\n }\n\n &:active {\n background-color: var(--control-checked-bgColor-active);\n }\n }\n\n & .ToggleSwitch-knob {\n background-color: var(--controlKnob-bgColor-checked);\n border-color: var(--controlKnob-borderColor-checked);\n transform: translateX(100%);\n }\n\n & .ToggleSwitch-lineIcon {\n transform: translateX(0%);\n }\n\n & .ToggleSwitch-circleIcon {\n transform: translateX(100%);\n }\n}\n\n.ToggleSwitch-track[disabled] {\n cursor: not-allowed;\n background-color: var(--controlTrack-bgColor-disabled);\n border-color: transparent;\n transition-property: none;\n\n & .ToggleSwitch-knob {\n border-color: var(--borderColor-default);\n box-shadow: none;\n }\n\n & .ToggleSwitch-lineIcon {\n color: var(--controlTrack-fgColor-disabled);\n }\n\n & .ToggleSwitch-circleIcon {\n color: var(--controlTrack-fgColor-disabled);\n }\n}\n\n.ToggleSwitch-icons {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.ToggleSwitch-lineIcon {\n /* stylelint-disable-next-line primer/typography */\n line-height: 0;\n color: var(--control-checked-fgColor-rest);\n transition-duration: 80ms;\n transition-property: transform;\n transform: translateX(-100%);\n flex: 1 0 50%;\n}\n\n.ToggleSwitch-circleIcon {\n /* stylelint-disable-next-line primer/typography */\n line-height: 0;\n color: var(--controlTrack-fgColor-rest);\n transition-duration: 80ms;\n transition-property: transform;\n transform: translateX(0);\n flex: 1 0 50%;\n}\n\n.ToggleSwitch-knob {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n width: 50%;\n background-color: var(--controlKnob-bgColor-rest);\n border: var(--borderWidth-thin) solid var(--controlKnob-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n box-shadow: var(--shadow-resting-medium), var(--button-default-shadow-inset);\n transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);\n transition-duration: 80ms;\n transition-property: transform;\n\n @media (prefers-reduced-motion) {\n transition: none;\n }\n}\n\n.ToggleSwitch-status {\n position: relative;\n font-size: var(--text-body-size-medium);\n line-height: var(--text-title-lineHeight-large);\n color: var(--fgColor-default);\n text-align: right;\n}\n\n.ToggleSwitch-statusIcon {\n display: flex;\n width: var(--base-size-16);\n /* stylelint-disable-next-line primer/spacing */\n margin-top: 0.063rem;\n}\n\n.ToggleSwitch--small {\n & .ToggleSwitch-status {\n font-size: var(--text-body-size-small);\n }\n\n & .ToggleSwitch-track {\n width: var(--base-size-48);\n height: var(--control-xsmall-size);\n }\n}\n\n.ToggleSwitch--disabled {\n & .ToggleSwitch-status {\n color: var(--fgColor-muted);\n }\n}\n\n.ToggleSwitch-statusOn {\n height: 0;\n visibility: hidden;\n}\n\n.ToggleSwitch-statusOff {\n height: auto;\n visibility: visible;\n}\n\n.ToggleSwitch--statusAtEnd {\n flex-direction: row-reverse;\n\n & .ToggleSwitch-status {\n text-align: left;\n }\n}\n",null]}
1
+ {"version":3,"sources":["toggle_switch.pcss","<no source>"],"names":[],"mappings":"AAQA,yCAHE,mBAOF,CAJA,cACE,kBAAmB,CAEnB,4CACF,CAGE,8CACE,WAAY,CACZ,kBACF,CAEA,+CACE,QAAS,CACT,iBACF,CAGF,oBAgBE,eAAgB,CANhB,iDAAkD,CAClD,yEAA0E,CAC1E,wCAAyC,CAJzC,cAAe,CANf,aAAc,CAEd,iCAAkC,CAElC,eAAgB,CADhB,SAAU,CAJV,iBAAkB,CAMlB,4BAAqB,CAArB,oBAAqB,CAOrB,wBAAyB,CACzB,iDAAmD,CAFnD,mDAAyD,CAJzD,wBAAiB,CAAjB,gBAAiB,CANjB,yBAyCF,CA1BE,4DAEE,kBACF,CAEA,0BACE,kDACF,CAEA,2BACE,mDACF,CAEA,wBAEI,gCC3DN,WAAA,YAAA,SAAA,gBAAA,kBAAA,QAAA,4CAAA,UD2DgC,CAE9B,CAEA,gCAGE,0CACE,eACF,CACF,CAGF,iDAEE,qDAAsD,CACtD,kBAAyB,CAFzB,6CAGF,CAEA,uCACE,oDAAqD,CACrD,2CAyBF,CAtBI,6DACE,qDACF,CAEA,8DACE,sDACF,CAGF,0DACE,mDAAoD,CACpD,mDAAoD,CACpD,0BACF,CAEA,8DACE,uBACF,CAEA,gEACE,0BACF,CAGF,8BAEE,qDAAsD,CACtD,kBAAyB,CAFzB,kBAAmB,CAGnB,wBAcF,CAZE,iDACE,uCAAwC,CACxC,eACF,CAMA,4GACE,0CACF,CAGF,oBAEE,kBAAmB,CADnB,YAAa,CAGb,WAAY,CACZ,eAAgB,CAFhB,UAGF,CAEA,uBAGE,yCAA0C,CAG1C,2BAEF,CAEA,gDAHE,YAAa,CALb,aAAc,CAEd,wBAAyB,CACzB,6BAaF,CARA,yBAGE,sCAAuC,CAGvC,uBAEF,CAEA,mBAME,gDAAiD,CACjD,wEAAyE,CACzE,wCAAyC,CALzC,QAAS,CAMT,0EAA4E,CAR5E,iBAAkB,CAClB,KAAM,CASN,wBAAyB,CACzB,6BAA8B,CAF9B,mDAAyD,CALzD,SAAU,CADV,SAaF,CAHE,gCAdF,mBAeI,eAEJ,CADE,CAGF,qBAIE,4BAA6B,CAF7B,sCAAuC,CACvC,8CAA+C,CAF/C,iBAAkB,CAIlB,gBACF,CAEA,yBACE,YAAa,CAGb,kBAAoB,CAFpB,yBAGF,CAGE,0CACE,qCACF,CAEA,yCAEE,iCAAkC,CADlC,yBAEF,CAIA,6CACE,0BACF,CAGF,uBACE,QAAS,CACT,iBACF,CAEA,wBACE,WAAY,CACZ,kBACF,CAEA,2BACE,0BAKF,CAHE,gDACE,eACF","file":"toggle_switch.css","sourcesContent":["/* ToggleSwitch */\n\n/* Catalyst in dotcom applies a display: block to all web component elements. This\n** rule overrides it so the status label and toggle switch are laid out correctly. */\n.ToggleSwitch.ToggleSwitch {\n display: inline-flex;\n}\n\n.ToggleSwitch {\n align-items: center;\n display: inline-flex;\n gap: var(--controlStack-medium-gap-condensed);\n}\n\n.ToggleSwitch--checked {\n & .ToggleSwitch-statusOn {\n height: auto;\n visibility: visible;\n }\n\n & .ToggleSwitch-statusOff {\n height: 0;\n visibility: hidden;\n }\n}\n\n.ToggleSwitch-track {\n position: relative;\n display: block;\n width: var(--base-size-64);\n height: var(--control-medium-size);\n padding: 0;\n overflow: hidden;\n text-decoration: none;\n cursor: pointer;\n user-select: none;\n background-color: var(--controlTrack-bgColor-rest);\n border: var(--borderWidth-thin) solid var(--controlTrack-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);\n transition-duration: 80ms;\n transition-property: background-color, border-color;\n appearance: none;\n\n &:focus,\n &:focus-visible {\n outline-offset: 1px;\n }\n\n &:hover {\n background-color: var(--controlTrack-bgColor-hover);\n }\n\n &:active {\n background-color: var(--controlTrack-bgColor-active);\n }\n\n @media (pointer: coarse) {\n &::before {\n @mixin minTouchTarget 44px;\n }\n }\n\n @media (prefers-reduced-motion) {\n transition: none;\n\n & * {\n transition: none;\n }\n }\n}\n\n.ToggleSwitch-track[aria-pressed='true'][disabled] {\n color: var(--control-checked-fgColor-disabled);\n background-color: var(--controlTrack-bgColor-disabled);\n border-color: transparent;\n}\n\n.ToggleSwitch-track[aria-pressed='true'] {\n background-color: var(--control-checked-bgColor-rest);\n border-color: var(--borderColor-transparent);\n\n &:not([disabled]) {\n &:hover {\n background-color: var(--control-checked-bgColor-hover);\n }\n\n &:active {\n background-color: var(--control-checked-bgColor-active);\n }\n }\n\n & .ToggleSwitch-knob {\n background-color: var(--controlKnob-bgColor-checked);\n border-color: var(--controlKnob-borderColor-checked);\n transform: translateX(100%);\n }\n\n & .ToggleSwitch-lineIcon {\n transform: translateX(0%);\n }\n\n & .ToggleSwitch-circleIcon {\n transform: translateX(100%);\n }\n}\n\n.ToggleSwitch-track[disabled] {\n cursor: not-allowed;\n background-color: var(--controlTrack-bgColor-disabled);\n border-color: transparent;\n transition-property: none;\n\n & .ToggleSwitch-knob {\n border-color: var(--borderColor-default);\n box-shadow: none;\n }\n\n & .ToggleSwitch-lineIcon {\n color: var(--controlTrack-fgColor-disabled);\n }\n\n & .ToggleSwitch-circleIcon {\n color: var(--controlTrack-fgColor-disabled);\n }\n}\n\n.ToggleSwitch-icons {\n display: flex;\n align-items: center;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.ToggleSwitch-lineIcon {\n /* stylelint-disable-next-line primer/typography */\n line-height: 0;\n color: var(--control-checked-fgColor-rest);\n transition-duration: 80ms;\n transition-property: transform;\n transform: translateX(-100%);\n flex: 1 0 50%;\n}\n\n.ToggleSwitch-circleIcon {\n /* stylelint-disable-next-line primer/typography */\n line-height: 0;\n color: var(--controlTrack-fgColor-rest);\n transition-duration: 80ms;\n transition-property: transform;\n transform: translateX(0);\n flex: 1 0 50%;\n}\n\n.ToggleSwitch-knob {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n width: 50%;\n background-color: var(--controlKnob-bgColor-rest);\n border: var(--borderWidth-thin) solid var(--controlKnob-borderColor-rest);\n border-radius: var(--borderRadius-medium);\n box-shadow: var(--shadow-resting-medium), var(--button-default-shadow-inset);\n transition-timing-function: cubic-bezier(0.5, 1, 0.89, 1);\n transition-duration: 80ms;\n transition-property: transform;\n\n @media (prefers-reduced-motion) {\n transition: none;\n }\n}\n\n.ToggleSwitch-status {\n position: relative;\n font-size: var(--text-body-size-medium);\n line-height: var(--text-title-lineHeight-large);\n color: var(--fgColor-default);\n text-align: right;\n}\n\n.ToggleSwitch-statusIcon {\n display: flex;\n width: var(--base-size-16);\n /* stylelint-disable-next-line primer/spacing */\n margin-top: 0.063rem;\n}\n\n.ToggleSwitch--small {\n & .ToggleSwitch-status {\n font-size: var(--text-body-size-small);\n }\n\n & .ToggleSwitch-track {\n width: var(--base-size-48);\n height: var(--control-xsmall-size);\n }\n}\n\n.ToggleSwitch--disabled {\n & .ToggleSwitch-status {\n color: var(--fgColor-muted);\n }\n}\n\n.ToggleSwitch-statusOn {\n height: 0;\n visibility: hidden;\n}\n\n.ToggleSwitch-statusOff {\n height: auto;\n visibility: visible;\n}\n\n.ToggleSwitch--statusAtEnd {\n flex-direction: row-reverse;\n\n & .ToggleSwitch-status {\n text-align: left;\n }\n}\n",null]}
@@ -1 +1 @@
1
- .flash:not(.Banner){background-image:linear-gradient(var(--bgColor-accent-muted),var(--bgColor-accent-muted));border-color:var(--borderColor-accent-muted);border-radius:var(--borderRadius-medium);border-style:solid;border-width:var(--borderWidth-thin);color:var(--fgColor-default);padding:var(--base-size-20) var(--control-medium-paddingInline-spacious);position:relative}.flash:not(.Banner) .octicon{color:var(--fgColor-accent);margin-right:var(--base-size-12)}.flash:not(.Banner) p:last-child{margin-bottom:0}.flash-messages{margin-bottom:var(--stack-gap-spacious)}.flash-close:not(.Banner-close){-webkit-appearance:none;appearance:none;background:none;border:0;cursor:pointer;float:right;margin-top:calc(var(--base-size-4)*-1);text-align:center}.flash-close:not(.Banner-close):hover{opacity:.7}.flash-close:not(.Banner-close):active{opacity:.5}.flash-close:not(.Banner-close) .octicon{margin-right:0}.flash-action:not(.Banner-actions){background-clip:padding-box;float:right;margin-left:var(--stack-gap-spacious);margin-top:-3px}.flash-action.btn:not(.Banner-actions) .octicon{color:var(--fgColor-muted);margin-right:var(--control-small-gap)}.flash-action.btn-primary:not(.Banner-actions){background-clip:initial}.flash-action.btn-primary:not(.Banner-actions) .octicon{color:inherit}.flash-warn:not(.Banner){background-image:linear-gradient(var(--bgColor-attention-muted),var(--bgColor-attention-muted));border-color:var(--borderColor-attention-muted);color:var(--fgColor-default)}.flash-warn:not(.Banner) .octicon{color:var(--fgColor-attention)}.flash-error:not(.Banner){background-image:linear-gradient(var(--bgColor-danger-muted),var(--bgColor-danger-muted));border-color:var(--borderColor-danger-muted);color:var(--fgColor-default)}.flash-error:not(.Banner) .octicon{color:var(--fgColor-danger)}.flash-success:not(.Banner){background-image:linear-gradient(var(--bgColor-success-muted),var(--bgColor-success-muted));border-color:var(--borderColor-success-muted);color:var(--fgColor-default)}.flash-success:not(.Banner) .octicon{color:var(--fgColor-success)}.flash-full:not(.Banner){border-radius:0;border-width:var(--borderWidth-thin) 0;margin-top:calc(var(--borderWidth-thin)*-1)}.flash-banner{border-left:0;border-radius:0;border-right:0;border-top:0;position:fixed;top:0;width:100%;z-index:90}.flash-banner,.flash-full{background-color:var(--bgColor-default)}.warning{background-color:var(--bgColor-attention-muted);font-weight:var(--base-text-weight-semibold);margin-bottom:.8em;padding:.5em}
1
+ .flash:not(.Banner){background-image:linear-gradient(var(--bgColor-accent-muted),var(--bgColor-accent-muted));border-color:var(--borderColor-accent-muted);border-radius:var(--borderRadius-medium);border-style:solid;border-width:var(--borderWidth-thin);color:var(--fgColor-default);padding:var(--base-size-20) var(--control-medium-paddingInline-spacious);position:relative}.flash:not(.Banner) .octicon{color:var(--fgColor-accent);margin-right:var(--base-size-12)}.flash:not(.Banner) p:last-child{margin-bottom:0}.flash-messages{margin-bottom:var(--stack-gap-spacious)}.flash-close:not(.Banner-close){appearance:none;background:none;border:0;cursor:pointer;float:right;margin-top:calc(var(--base-size-4)*-1);text-align:center}.flash-close:not(.Banner-close):hover{opacity:.7}.flash-close:not(.Banner-close):active{opacity:.5}.flash-close:not(.Banner-close) .octicon{margin-right:0}.flash-action:not(.Banner-actions){background-clip:padding-box;float:right;margin-left:var(--stack-gap-spacious);margin-top:-3px}.flash-action.btn:not(.Banner-actions) .octicon{color:var(--fgColor-muted);margin-right:var(--control-small-gap)}.flash-action.btn-primary:not(.Banner-actions){background-clip:initial}.flash-action.btn-primary:not(.Banner-actions) .octicon{color:inherit}.flash-warn:not(.Banner){background-image:linear-gradient(var(--bgColor-attention-muted),var(--bgColor-attention-muted));border-color:var(--borderColor-attention-muted);color:var(--fgColor-default)}.flash-warn:not(.Banner) .octicon{color:var(--fgColor-attention)}.flash-error:not(.Banner){background-image:linear-gradient(var(--bgColor-danger-muted),var(--bgColor-danger-muted));border-color:var(--borderColor-danger-muted);color:var(--fgColor-default)}.flash-error:not(.Banner) .octicon{color:var(--fgColor-danger)}.flash-success:not(.Banner){background-image:linear-gradient(var(--bgColor-success-muted),var(--bgColor-success-muted));border-color:var(--borderColor-success-muted);color:var(--fgColor-default)}.flash-success:not(.Banner) .octicon{color:var(--fgColor-success)}.flash-full:not(.Banner){border-radius:0;border-width:var(--borderWidth-thin) 0;margin-top:calc(var(--borderWidth-thin)*-1)}.flash-banner{border-left:0;border-radius:0;border-right:0;border-top:0;position:fixed;top:0;width:100%;z-index:90}.flash-banner,.flash-full{background-color:var(--bgColor-default)}.warning{background-color:var(--bgColor-attention-muted);font-weight:var(--base-text-weight-semibold);margin-bottom:.8em;padding:.5em}
@@ -1 +1 @@
1
- {"version":3,"sources":["flash.pcss"],"names":[],"mappings":"AAKA,oBAME,yFAA2F,CAC3F,4CAA6C,CAG7C,wCAAyC,CAFzC,kBAAmB,CACnB,oCAAqC,CAJrC,4BAA6B,CAH7B,wEAAyE,CADzE,iBAoBF,CATE,6BAEE,2BAA4B,CAD5B,gCAEF,CAGA,iCACE,eACF,CAIF,gBACE,uCACF,CAGA,gCASE,uBAAgB,CAAhB,eAAgB,CAFhB,eAAgB,CAChB,QAAS,CAJT,cAAe,CAHf,WAAY,CACZ,sCAAyC,CACzC,iBAmBF,CAXE,sCACE,UACF,CAEA,uCACE,UACF,CAEA,yCACE,cACF,CAIF,mCAIE,2BAA4B,CAH5B,WAAY,CAEZ,qCAAsC,CADtC,eAgBF,CAZE,gDAEE,0BAA2B,CAD3B,qCAEF,CAEA,+CACE,uBAKF,CAHE,wDACE,aACF,CAMJ,yBAEE,+FAAiG,CACjG,+CAAgD,CAFhD,4BAOF,CAHE,kCACE,8BACF,CAGF,0BAEE,yFAA2F,CAC3F,4CAA6C,CAF7C,4BAOF,CAHE,mCACE,2BACF,CAGF,4BAEE,2FAA6F,CAC7F,6CAA8C,CAF9C,4BAOF,CAHE,qCACE,4BACF,CAKF,yBAGE,eAAgB,CADhB,sCAAuC,CADvC,2CAGF,CAGA,cAOE,aAAc,CACd,eAAgB,CAFhB,cAAe,CADf,YAAa,CAJb,cAAe,CACf,KAAM,CAEN,UAAW,CADX,UAMF,CAGA,0BAEE,uCACF,CAGA,SAIE,+CAAgD,CADhD,4CAA6C,CAD7C,kBAAoB,CADpB,YAIF","file":"flash.css","sourcesContent":["/* stylelint-disable primer/spacing */\n\n/* flash */\n\n/* Default flash */\n.flash:not(.Banner) {\n position: relative;\n padding: var(--base-size-20) var(--control-medium-paddingInline-spacious);\n\n /* Default color */\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-accent-muted), var(--bgColor-accent-muted));\n border-color: var(--borderColor-accent-muted);\n border-style: solid;\n border-width: var(--borderWidth-thin);\n border-radius: var(--borderRadius-medium);\n\n & .octicon {\n margin-right: var(--base-size-12);\n color: var(--fgColor-accent);\n }\n\n /* stylelint-disable-next-line selector-max-type */\n & p:last-child {\n margin-bottom: 0;\n }\n}\n\n/* Contain the flash messages */\n.flash-messages {\n margin-bottom: var(--stack-gap-spacious);\n}\n\n/* Close button */\n.flash-close:not(.Banner-close) {\n float: right;\n margin-top: calc(var(--base-size-4) * -1);\n text-align: center;\n cursor: pointer;\n\n /* Undo `<button>` styles */\n background: none;\n border: 0;\n appearance: none;\n\n &:hover {\n opacity: 0.7;\n }\n\n &:active {\n opacity: 0.5;\n }\n\n & .octicon {\n margin-right: 0;\n }\n}\n\n/* Action button */\n.flash-action:not(.Banner-actions) {\n float: right;\n margin-top: -3px;\n margin-left: var(--stack-gap-spacious);\n background-clip: padding-box;\n\n &.btn .octicon {\n margin-right: var(--control-small-gap);\n color: var(--fgColor-muted);\n }\n\n &.btn-primary {\n background-clip: border-box;\n\n & .octicon {\n color: inherit;\n }\n }\n}\n\n/* Color variations */\n\n.flash-warn:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-attention-muted), var(--bgColor-attention-muted));\n border-color: var(--borderColor-attention-muted);\n\n & .octicon {\n color: var(--fgColor-attention);\n }\n}\n\n.flash-error:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-danger-muted), var(--bgColor-danger-muted));\n border-color: var(--borderColor-danger-muted);\n\n & .octicon {\n color: var(--fgColor-danger);\n }\n}\n\n.flash-success:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-success-muted), var(--bgColor-success-muted));\n border-color: var(--borderColor-success-muted);\n\n & .octicon {\n color: var(--fgColor-success);\n }\n}\n\n/* Layout variations */\n\n.flash-full:not(.Banner) {\n margin-top: calc(var(--borderWidth-thin) * -1);\n border-width: var(--borderWidth-thin) 0;\n border-radius: 0;\n}\n\n/* A banner rendered at the top of the page. */\n.flash-banner {\n position: fixed;\n top: 0;\n z-index: 90;\n width: 100%;\n border-top: 0;\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n/* Makes sure the background is opaque to cover any content underneath */\n.flash-full,\n.flash-banner {\n background-color: var(--bgColor-default);\n}\n\n/* FIXME deprecate this */\n.warning {\n padding: 0.5em;\n margin-bottom: 0.8em;\n font-weight: var(--base-text-weight-semibold);\n background-color: var(--bgColor-attention-muted);\n}\n"]}
1
+ {"version":3,"sources":["flash.pcss"],"names":[],"mappings":"AAKA,oBAME,yFAA2F,CAC3F,4CAA6C,CAG7C,wCAAyC,CAFzC,kBAAmB,CACnB,oCAAqC,CAJrC,4BAA6B,CAH7B,wEAAyE,CADzE,iBAoBF,CATE,6BAEE,2BAA4B,CAD5B,gCAEF,CAGA,iCACE,eACF,CAIF,gBACE,uCACF,CAGA,gCASE,eAAgB,CAFhB,eAAgB,CAChB,QAAS,CAJT,cAAe,CAHf,WAAY,CACZ,sCAAyC,CACzC,iBAmBF,CAXE,sCACE,UACF,CAEA,uCACE,UACF,CAEA,yCACE,cACF,CAIF,mCAIE,2BAA4B,CAH5B,WAAY,CAEZ,qCAAsC,CADtC,eAgBF,CAZE,gDAEE,0BAA2B,CAD3B,qCAEF,CAEA,+CACE,uBAKF,CAHE,wDACE,aACF,CAMJ,yBAEE,+FAAiG,CACjG,+CAAgD,CAFhD,4BAOF,CAHE,kCACE,8BACF,CAGF,0BAEE,yFAA2F,CAC3F,4CAA6C,CAF7C,4BAOF,CAHE,mCACE,2BACF,CAGF,4BAEE,2FAA6F,CAC7F,6CAA8C,CAF9C,4BAOF,CAHE,qCACE,4BACF,CAKF,yBAGE,eAAgB,CADhB,sCAAuC,CADvC,2CAGF,CAGA,cAOE,aAAc,CACd,eAAgB,CAFhB,cAAe,CADf,YAAa,CAJb,cAAe,CACf,KAAM,CAEN,UAAW,CADX,UAMF,CAGA,0BAEE,uCACF,CAGA,SAIE,+CAAgD,CADhD,4CAA6C,CAD7C,kBAAoB,CADpB,YAIF","file":"flash.css","sourcesContent":["/* stylelint-disable primer/spacing */\n\n/* flash */\n\n/* Default flash */\n.flash:not(.Banner) {\n position: relative;\n padding: var(--base-size-20) var(--control-medium-paddingInline-spacious);\n\n /* Default color */\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-accent-muted), var(--bgColor-accent-muted));\n border-color: var(--borderColor-accent-muted);\n border-style: solid;\n border-width: var(--borderWidth-thin);\n border-radius: var(--borderRadius-medium);\n\n & .octicon {\n margin-right: var(--base-size-12);\n color: var(--fgColor-accent);\n }\n\n /* stylelint-disable-next-line selector-max-type */\n & p:last-child {\n margin-bottom: 0;\n }\n}\n\n/* Contain the flash messages */\n.flash-messages {\n margin-bottom: var(--stack-gap-spacious);\n}\n\n/* Close button */\n.flash-close:not(.Banner-close) {\n float: right;\n margin-top: calc(var(--base-size-4) * -1);\n text-align: center;\n cursor: pointer;\n\n /* Undo `<button>` styles */\n background: none;\n border: 0;\n appearance: none;\n\n &:hover {\n opacity: 0.7;\n }\n\n &:active {\n opacity: 0.5;\n }\n\n & .octicon {\n margin-right: 0;\n }\n}\n\n/* Action button */\n.flash-action:not(.Banner-actions) {\n float: right;\n margin-top: -3px;\n margin-left: var(--stack-gap-spacious);\n background-clip: padding-box;\n\n &.btn .octicon {\n margin-right: var(--control-small-gap);\n color: var(--fgColor-muted);\n }\n\n &.btn-primary {\n background-clip: border-box;\n\n & .octicon {\n color: inherit;\n }\n }\n}\n\n/* Color variations */\n\n.flash-warn:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-attention-muted), var(--bgColor-attention-muted));\n border-color: var(--borderColor-attention-muted);\n\n & .octicon {\n color: var(--fgColor-attention);\n }\n}\n\n.flash-error:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-danger-muted), var(--bgColor-danger-muted));\n border-color: var(--borderColor-danger-muted);\n\n & .octicon {\n color: var(--fgColor-danger);\n }\n}\n\n.flash-success:not(.Banner) {\n color: var(--fgColor-default);\n background-image: linear-gradient(var(--bgColor-success-muted), var(--bgColor-success-muted));\n border-color: var(--borderColor-success-muted);\n\n & .octicon {\n color: var(--fgColor-success);\n }\n}\n\n/* Layout variations */\n\n.flash-full:not(.Banner) {\n margin-top: calc(var(--borderWidth-thin) * -1);\n border-width: var(--borderWidth-thin) 0;\n border-radius: 0;\n}\n\n/* A banner rendered at the top of the page. */\n.flash-banner {\n position: fixed;\n top: 0;\n z-index: 90;\n width: 100%;\n border-top: 0;\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n/* Makes sure the background is opaque to cover any content underneath */\n.flash-full,\n.flash-banner {\n background-color: var(--bgColor-default);\n}\n\n/* FIXME deprecate this */\n.warning {\n padding: 0.5em;\n margin-bottom: 0.8em;\n font-weight: var(--base-text-weight-semibold);\n background-color: var(--bgColor-attention-muted);\n}\n"]}
@@ -1,13 +1,7 @@
1
- declare class CollapsibleHeaderElement extends HTMLElement {
2
- arrowDown: HTMLElement;
3
- arrowUp: HTMLElement;
4
- description: HTMLElement | undefined;
5
- collapsed: string;
6
- private _collapsed;
1
+ import { CollapsibleElement } from '../collapsible';
2
+ declare class CollapsibleHeaderElement extends CollapsibleElement {
7
3
  connectedCallback(): void;
8
- toggle(): void;
9
- private hideAll;
10
- private expandAll;
4
+ get baseClass(): string;
11
5
  }
12
6
  declare global {
13
7
  interface Window {
@@ -1,16 +1,16 @@
1
1
  <%= render(Primer::BaseComponent.new(**@system_arguments)) do %>
2
2
  <%= render(Primer::OpenProject::FlexLayout.new) do |flex| %>
3
3
  <%= flex.with_row do %>
4
- <%= render(Primer::Beta::Text.new(mr: 2) ) { @title } %>
5
- <% if @count.present? %>
6
- <%= render(Primer::Beta::Counter.new(count: @count, mr: 2, scheme: :primary)) %>
4
+ <%= title %>
5
+ <% if count? %>
6
+ <%= count %>
7
7
  <% end %>
8
8
  <%= render(Primer::Beta::Octicon.new(icon: "chevron-up", data: { target: "collapsible-header.arrowUp" })) %>
9
- <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", display: :none, data: { target: "collapsible-header.arrowDown" })) %>
9
+ <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", hidden: true, data: { target: "collapsible-header.arrowDown" })) %>
10
10
  <% end %>
11
11
  <%= flex.with_row do %>
12
- <% if @description.present? %>
13
- <%= render(Primer::Beta::Text.new(color: :subtle, data: { target: "collapsible-header.description" }) ) { @description } %>
12
+ <% if description? %>
13
+ <%= description %>
14
14
  <% end %>
15
15
  <% end %>
16
16
  <% end %>
@@ -4,59 +4,18 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
4
4
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  };
7
- import { attr, controller, target } from '@github/catalyst';
8
- let CollapsibleHeaderElement = class CollapsibleHeaderElement extends HTMLElement {
7
+ import { controller } from '@github/catalyst';
8
+ import { CollapsibleElement } from '../collapsible';
9
+ let CollapsibleHeaderElement = class CollapsibleHeaderElement extends CollapsibleElement {
9
10
  connectedCallback() {
10
11
  if (!this.closest('.Box')) {
11
12
  throw new Error('No surrounding BorderBox found');
12
13
  }
13
- if (this.collapsed === 'true') {
14
- this._collapsed = true;
15
- this.hideAll();
16
- }
17
- else {
18
- this._collapsed = false;
19
- }
20
- }
21
- toggle() {
22
- if (this._collapsed) {
23
- this._collapsed = false;
24
- this.expandAll();
25
- }
26
- else {
27
- this._collapsed = true;
28
- this.hideAll();
29
- }
30
- }
31
- hideAll() {
32
- this.arrowDown?.classList.remove('d-none');
33
- this.arrowUp?.classList.add('d-none');
34
- this.description?.classList.add('d-none');
35
- this.classList.add('CollapsibleHeader--collapsed');
36
14
  }
37
- expandAll() {
38
- this.arrowDown?.classList.add('d-none');
39
- this.arrowUp?.classList.remove('d-none');
40
- this.description?.classList.remove('d-none');
41
- this.classList.remove('CollapsibleHeader--collapsed');
15
+ get baseClass() {
16
+ return 'CollapsibleHeader';
42
17
  }
43
18
  };
44
- __decorate([
45
- target
46
- ], CollapsibleHeaderElement.prototype, "arrowDown", void 0);
47
- __decorate([
48
- target
49
- ], CollapsibleHeaderElement.prototype, "arrowUp", void 0);
50
- __decorate([
51
- target
52
- ], CollapsibleHeaderElement.prototype, "description", void 0);
53
- __decorate([
54
- attr
55
- ], CollapsibleHeaderElement.prototype, "collapsed", void 0);
56
19
  CollapsibleHeaderElement = __decorate([
57
20
  controller
58
21
  ], CollapsibleHeaderElement);
59
- if (!window.customElements.get('collapsible-header')) {
60
- window.CollapsibleHeaderElement = CollapsibleHeaderElement;
61
- window.customElements.define('collapsible-header', CollapsibleHeaderElement);
62
- }
@@ -8,11 +8,45 @@ module Primer
8
8
  class CollapsibleHeader < Primer::Component
9
9
  status :open_project
10
10
 
11
+ # Required title
12
+ #
11
13
  # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
12
- def initialize(title:, count: nil, description: nil, collapsed: false, box:, **system_arguments)
13
- @title = title
14
- @count = count
15
- @description = description
14
+ renders_one :title, lambda { |**system_arguments, &block|
15
+ system_arguments[:mr] ||= 2
16
+
17
+ Primer::Beta::Text.new(**system_arguments, &block)
18
+ }
19
+
20
+ # Optional count
21
+ #
22
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
23
+ renders_one :count, lambda { |**system_arguments|
24
+ system_arguments[:mr] ||= 2
25
+ system_arguments[:scheme] ||= :primary
26
+
27
+ Primer::Beta::Counter.new(**system_arguments)
28
+ }
29
+
30
+ # Optional description
31
+ #
32
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
33
+ renders_one :description, lambda { |**system_arguments, &block|
34
+ system_arguments[:color] ||= :subtle
35
+ system_arguments[:data] = merge_data(
36
+ system_arguments, {
37
+ data: {
38
+ targets: "collapsible-header.collapsibleElements"
39
+ }
40
+ }
41
+ )
42
+
43
+ Primer::Beta::Text.new(**system_arguments, &block)
44
+ }
45
+
46
+
47
+ # @param collapsed [Boolean] Whether the header is collapsed on initial render.
48
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
49
+ def initialize(collapsed: false, box:, **system_arguments)
16
50
  @collapsed = collapsed
17
51
  @box = box
18
52
  @system_arguments = system_arguments
@@ -26,10 +60,10 @@ module Primer
26
60
  @system_arguments[:data] = merge_data(
27
61
  @system_arguments, {
28
62
  data: {
29
- action: "click:collapsible-header#toggle",
30
- collapsed: @collapsed
63
+ action: "click:collapsible-header#toggle"
31
64
  } }
32
65
  )
66
+ @system_arguments[:data][:collapsed] = true if @collapsed
33
67
  end
34
68
 
35
69
  private
@@ -39,9 +73,7 @@ module Primer
39
73
  end
40
74
 
41
75
  def render?
42
- raise ArgumentError, "Title must be present" unless @title.present?
43
- raise ArgumentError, "Description cannot be a blank string" unless @description.present? || @description.nil?
44
- raise ArgumentError, "Count cannot be a blank string" unless @count.present? || @count.nil?
76
+ raise ArgumentError, "Title must be present" unless title?
45
77
  raise ArgumentError, "This component must be called inside the header of a `Primer::Beta::BorderBox`" unless @box.present? && @box.is_a?(Primer::Beta::BorderBox)
46
78
 
47
79
  true
@@ -1,53 +1,16 @@
1
- import {attr, controller, target} from '@github/catalyst'
1
+ import {controller} from '@github/catalyst'
2
+ import {CollapsibleElement} from '../collapsible'
2
3
 
3
4
  @controller
4
- class CollapsibleHeaderElement extends HTMLElement {
5
- @target arrowDown: HTMLElement
6
- @target arrowUp: HTMLElement
7
- @target description: HTMLElement | undefined
8
-
9
- @attr collapsed: string
10
- private _collapsed: boolean
11
-
5
+ class CollapsibleHeaderElement extends CollapsibleElement {
12
6
  connectedCallback() {
13
7
  if (!this.closest('.Box')) {
14
8
  throw new Error('No surrounding BorderBox found')
15
9
  }
16
-
17
- if (this.collapsed === 'true') {
18
- this._collapsed = true
19
- this.hideAll()
20
- } else {
21
- this._collapsed = false
22
- }
23
10
  }
24
11
 
25
- public toggle() {
26
- if (this._collapsed) {
27
- this._collapsed = false
28
- this.expandAll()
29
- } else {
30
- this._collapsed = true
31
- this.hideAll()
32
- }
33
- }
34
-
35
- private hideAll() {
36
- this.arrowDown?.classList.remove('d-none')
37
- this.arrowUp?.classList.add('d-none')
38
-
39
- this.description?.classList.add('d-none')
40
-
41
- this.classList.add('CollapsibleHeader--collapsed')
42
- }
43
-
44
- private expandAll() {
45
- this.arrowDown?.classList.add('d-none')
46
- this.arrowUp?.classList.remove('d-none')
47
-
48
- this.description?.classList.remove('d-none')
49
-
50
- this.classList.remove('CollapsibleHeader--collapsed')
12
+ get baseClass(): string {
13
+ return 'CollapsibleHeader'
51
14
  }
52
15
  }
53
16
 
@@ -56,8 +19,3 @@ declare global {
56
19
  CollapsibleHeaderElement: typeof CollapsibleHeaderElement
57
20
  }
58
21
  }
59
-
60
- if (!window.customElements.get('collapsible-header')) {
61
- window.CollapsibleHeaderElement = CollapsibleHeaderElement
62
- window.customElements.define('collapsible-header', CollapsibleHeaderElement)
63
- }
@@ -0,0 +1,11 @@
1
+ export declare abstract class CollapsibleElement extends HTMLElement {
2
+ arrowDown: Element;
3
+ arrowUp: Element;
4
+ collapsibleElements: HTMLElement[];
5
+ collapsed: boolean;
6
+ toggle(): void;
7
+ attributeChangedCallback(name: string): void;
8
+ hideAll(): void;
9
+ expandAll(): void;
10
+ abstract get baseClass(): string;
11
+ }
@@ -0,0 +1,56 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { attr, target, targets } from '@github/catalyst';
8
+ // eslint-disable-next-line custom-elements/expose-class-on-global
9
+ export class CollapsibleElement extends HTMLElement {
10
+ constructor() {
11
+ super(...arguments);
12
+ this.collapsed = false;
13
+ }
14
+ toggle() {
15
+ this.collapsed = !this.collapsed;
16
+ }
17
+ attributeChangedCallback(name) {
18
+ if (name === 'data-collapsed') {
19
+ if (this.collapsed) {
20
+ this.hideAll();
21
+ }
22
+ else {
23
+ this.expandAll();
24
+ }
25
+ }
26
+ }
27
+ hideAll() {
28
+ // For whatever reason, setting `hidden` directly does not work on the SVGs
29
+ this.arrowDown.removeAttribute('hidden');
30
+ this.arrowUp.setAttribute('hidden', '');
31
+ for (const el of this.collapsibleElements) {
32
+ el.hidden = true;
33
+ }
34
+ this.classList.add(`${this.baseClass}--collapsed`);
35
+ }
36
+ expandAll() {
37
+ this.arrowUp.removeAttribute('hidden');
38
+ this.arrowDown.setAttribute('hidden', '');
39
+ for (const el of this.collapsibleElements) {
40
+ el.hidden = false;
41
+ }
42
+ this.classList.remove(`${this.baseClass}--collapsed`);
43
+ }
44
+ }
45
+ __decorate([
46
+ target
47
+ ], CollapsibleElement.prototype, "arrowDown", void 0);
48
+ __decorate([
49
+ target
50
+ ], CollapsibleElement.prototype, "arrowUp", void 0);
51
+ __decorate([
52
+ targets
53
+ ], CollapsibleElement.prototype, "collapsibleElements", void 0);
54
+ __decorate([
55
+ attr
56
+ ], CollapsibleElement.prototype, "collapsed", void 0);
@@ -0,0 +1,49 @@
1
+ import {attr, target, targets} from '@github/catalyst'
2
+
3
+ // eslint-disable-next-line custom-elements/expose-class-on-global
4
+ export abstract class CollapsibleElement extends HTMLElement {
5
+ @target arrowDown: Element
6
+ @target arrowUp: Element
7
+ @targets collapsibleElements: HTMLElement[]
8
+
9
+ @attr collapsed = false
10
+
11
+ toggle() {
12
+ this.collapsed = !this.collapsed
13
+ }
14
+
15
+ attributeChangedCallback(name: string) {
16
+ if (name === 'data-collapsed') {
17
+ if (this.collapsed) {
18
+ this.hideAll()
19
+ } else {
20
+ this.expandAll()
21
+ }
22
+ }
23
+ }
24
+
25
+ hideAll() {
26
+ // For whatever reason, setting `hidden` directly does not work on the SVGs
27
+ this.arrowDown.removeAttribute('hidden')
28
+ this.arrowUp.setAttribute('hidden', '')
29
+
30
+ for (const el of this.collapsibleElements) {
31
+ el.hidden = true
32
+ }
33
+
34
+ this.classList.add(`${this.baseClass}--collapsed`)
35
+ }
36
+
37
+ expandAll() {
38
+ this.arrowUp.removeAttribute('hidden')
39
+ this.arrowDown.setAttribute('hidden', '')
40
+
41
+ for (const el of this.collapsibleElements) {
42
+ el.hidden = false
43
+ }
44
+
45
+ this.classList.remove(`${this.baseClass}--collapsed`)
46
+ }
47
+
48
+ abstract get baseClass(): string
49
+ }
@@ -0,0 +1 @@
1
+ .CollapsibleSection--triggerArea{cursor:pointer}
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "open_project/collapsible_section",
3
+ "selectors": [
4
+ ".CollapsibleSection--triggerArea"
5
+ ]
6
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["collapsible_section.pcss"],"names":[],"mappings":"AAEA,iCACI,cACJ","file":"collapsible_section.css","sourcesContent":["/* CSS for CollapsibleSection */\n\n.CollapsibleSection--triggerArea {\n cursor: pointer;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { CollapsibleElement } from './collapsible';
2
+ declare class CollapsibleSectionElement extends CollapsibleElement {
3
+ get baseClass(): string;
4
+ }
5
+ declare global {
6
+ interface Window {
7
+ CollapsibleSectionElement: typeof CollapsibleSectionElement;
8
+ }
9
+ }
10
+ export {};
@@ -0,0 +1,26 @@
1
+ <%= render(Primer::BaseComponent.new(**@system_arguments)) do %>
2
+ <%= render(Primer::OpenProject::FlexLayout.new) do |flex| %>
3
+ <%= flex.with_row(mb: 3,
4
+ classes: "CollapsibleSection--triggerArea",
5
+ data: { action: "click:collapsible-section#toggle" }) do %>
6
+ <%= render(Primer::OpenProject::FlexLayout.new(display: :flex, align_items: :center)) do |header| %>
7
+ <%= header.with_column do %>
8
+ <%= title %>
9
+ <% end %>
10
+ <%= header.with_column do %>
11
+ <%= caption %>
12
+ <% end %>
13
+ <%= header.with_column do %>
14
+ <%= render(Primer::Beta::Octicon.new(icon: "chevron-up", data: { target: "collapsible-section.arrowUp" })) %>
15
+ <%= render(Primer::Beta::Octicon.new(icon: "chevron-down", hidden: true, data: { target: "collapsible-section.arrowDown" })) %>
16
+ <% end %>
17
+ <%= header.with_column(flex: 1, text_align: :right) do %>
18
+ <%= additional_information %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+ <%= flex.with_row(data: { targets: "collapsible-section.collapsibleElements" }) do %>
23
+ <%= collapsible_content %>
24
+ <% end %>
25
+ <% end %>
26
+ <% end %>
@@ -0,0 +1,16 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { controller } from '@github/catalyst';
8
+ import { CollapsibleElement } from './collapsible';
9
+ let CollapsibleSectionElement = class CollapsibleSectionElement extends CollapsibleElement {
10
+ get baseClass() {
11
+ return 'CollapsibleSection';
12
+ }
13
+ };
14
+ CollapsibleSectionElement = __decorate([
15
+ controller
16
+ ], CollapsibleSectionElement);
@@ -0,0 +1,5 @@
1
+ /* CSS for CollapsibleSection */
2
+
3
+ .CollapsibleSection--triggerArea {
4
+ cursor: pointer;
5
+ }
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module OpenProject
5
+ # A component consisting of a title and collapsible content.
6
+ # Clicking the title will hide the collapsible content
7
+ class CollapsibleSection < Primer::Component
8
+ status :open_project
9
+
10
+ TITLE_TAG_FALLBACK = :h2
11
+ TITLE_TAG_OPTIONS = [:h1, TITLE_TAG_FALLBACK, :h3, :h4, :h5, :h6, :span].freeze
12
+
13
+ # Required Title
14
+ #
15
+ # @param tag [Symbol] Customize the element type of the rendered title container.
16
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
17
+ renders_one :title, lambda { |tag: TITLE_TAG_FALLBACK, **system_arguments, &block|
18
+ system_arguments[:tag] = fetch_or_fallback(TITLE_TAG_OPTIONS, tag, TITLE_TAG_FALLBACK)
19
+ system_arguments[:font_size] ||= 3
20
+ system_arguments[:mr] ||= 2
21
+
22
+ Primer::OpenProject::Heading.new(**system_arguments, &block)
23
+ }
24
+
25
+ # Optional caption
26
+ #
27
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
28
+ renders_one :caption, lambda { |**system_arguments, &block|
29
+ system_arguments[:color] ||= :subtle
30
+ system_arguments[:mr] ||= 2
31
+ system_arguments[:display] ||= [:none, :block]
32
+
33
+ Primer::Beta::Text.new(**system_arguments, &block)
34
+ }
35
+
36
+ # Optional right-side content
37
+ #
38
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
39
+ renders_one :additional_information, lambda { |**system_arguments|
40
+ Primer::BaseComponent.new(tag: :div, **system_arguments)
41
+ }
42
+
43
+ # Required collapsible content
44
+ #
45
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
46
+ renders_one :collapsible_content, lambda { |**system_arguments|
47
+ Primer::BaseComponent.new(tag: :div, **system_arguments)
48
+ }
49
+
50
+ # @param collapsed [Boolean] Whether the section is collapsed on initial render.
51
+ # @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
52
+ def initialize(collapsed: false, **system_arguments)
53
+ @collapsed = collapsed
54
+
55
+ @system_arguments = deny_tag_argument(**system_arguments)
56
+ @system_arguments[:tag] = "collapsible-section"
57
+ @system_arguments[:classes] = class_names(
58
+ @system_arguments[:classes],
59
+ "CollapsibleSection",
60
+ "CollapsibleSection--collapsed" => @collapsed
61
+ )
62
+
63
+ @system_arguments[:data] ||= {}
64
+ @system_arguments[:data][:collapsed] = true if @collapsed
65
+ end
66
+
67
+ private
68
+
69
+ def render?
70
+ raise ArgumentError, "Title must be present" unless title.present?
71
+ raise ArgumentError, "Collapsible content must be present" unless collapsible_content.present?
72
+
73
+ true
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,15 @@
1
+ import {controller} from '@github/catalyst'
2
+ import {CollapsibleElement} from './collapsible'
3
+
4
+ @controller
5
+ class CollapsibleSectionElement extends CollapsibleElement {
6
+ get baseClass(): string {
7
+ return 'CollapsibleSection'
8
+ }
9
+ }
10
+
11
+ declare global {
12
+ interface Window {
13
+ CollapsibleSectionElement: typeof CollapsibleSectionElement
14
+ }
15
+ }
@@ -1 +1 @@
1
- .InputGroup.InputGroup-input-width--auto{width:auto}.InputGroup.InputGroup-input-width--small{max-width:min(256px,100vw - 2rem)}.InputGroup.InputGroup-input-width--medium{max-width:min(320px,100vw - 2rem)}.InputGroup.InputGroup-input-width--large{max-width:min(480px,100vw - 2rem)}.InputGroup.InputGroup-input-width--xlarge{max-width:min(640px,100vw - 2rem)}.InputGroup.InputGroup-input-width--xxlarge{max-width:min(960px,100vw - 2rem)}
1
+ .InputGroup.InputGroup-input-width--auto{width:auto}.InputGroup.InputGroup-input-width--xsmall{max-width:min(144px,100vw - 2rem)}.InputGroup.InputGroup-input-width--small{max-width:min(256px,100vw - 2rem)}.InputGroup.InputGroup-input-width--medium{max-width:min(320px,100vw - 2rem)}.InputGroup.InputGroup-input-width--large{max-width:min(480px,100vw - 2rem)}.InputGroup.InputGroup-input-width--xlarge{max-width:min(680px,100vw - 2rem)}.InputGroup.InputGroup-input-width--xxlarge{max-width:min(960px,100vw - 2rem)}
@@ -2,6 +2,7 @@
2
2
  "name": "open_project/input_group",
3
3
  "selectors": [
4
4
  ".InputGroup.InputGroup-input-width--auto",
5
+ ".InputGroup.InputGroup-input-width--xsmall",
5
6
  ".InputGroup.InputGroup-input-width--small",
6
7
  ".InputGroup.InputGroup-input-width--medium",
7
8
  ".InputGroup.InputGroup-input-width--large",
@@ -1 +1 @@
1
- {"version":3,"sources":["input_group.pcss"],"names":[],"mappings":"AACI,yCACI,UACJ,CAEA,0CACI,iCACJ,CAEA,2CACI,iCACJ,CAEA,0CACI,iCACJ,CAEA,2CACI,iCACJ,CAEA,4CACI,iCACJ","file":"input_group.css","sourcesContent":[".InputGroup {\n &.InputGroup-input-width--auto {\n width: auto;\n }\n\n &.InputGroup-input-width--small {\n max-width: min(256px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--medium {\n max-width: min(320px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--large {\n max-width: min(480px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--xlarge {\n max-width: min(640px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--xxlarge {\n max-width: min(960px, 100vw - 2rem);\n }\n}\n"]}
1
+ {"version":3,"sources":["input_group.pcss"],"names":[],"mappings":"AACI,yCACI,UACJ,CAEA,2CACI,iCACJ,CAEA,0CACI,iCACJ,CAEA,2CACI,iCACJ,CAEA,0CACI,iCACJ,CAEA,2CACI,iCACJ,CAEA,4CACI,iCACJ","file":"input_group.css","sourcesContent":[".InputGroup {\n &.InputGroup-input-width--auto {\n width: auto;\n }\n\n &.InputGroup-input-width--xsmall {\n max-width: min(144px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--small {\n max-width: min(256px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--medium {\n max-width: min(320px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--large {\n max-width: min(480px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--xlarge {\n max-width: min(680px, 100vw - 2rem);\n }\n\n &.InputGroup-input-width--xxlarge {\n max-width: min(960px, 100vw - 2rem);\n }\n}\n"]}
@@ -3,6 +3,10 @@
3
3
  width: auto;
4
4
  }
5
5
 
6
+ &.InputGroup-input-width--xsmall {
7
+ max-width: min(144px, 100vw - 2rem);
8
+ }
9
+
6
10
  &.InputGroup-input-width--small {
7
11
  max-width: min(256px, 100vw - 2rem);
8
12
  }
@@ -16,7 +20,7 @@
16
20
  }
17
21
 
18
22
  &.InputGroup-input-width--xlarge {
19
- max-width: min(640px, 100vw - 2rem);
23
+ max-width: min(680px, 100vw - 2rem);
20
24
  }
21
25
 
22
26
  &.InputGroup-input-width--xxlarge {