card-mod-layout 0.14.2 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/assets/script/layout.js.coffee +76 -0
- data/assets/script/modal.js.coffee +111 -0
- data/assets/script/overlay.js.coffee +54 -0
- data/assets/style/layout.scss +103 -0
- data/assets/style/modal.scss +42 -0
- data/assets/style/overlay.scss +51 -0
- data/data/files/mod_layout_script_asset_output/file.js +6 -0
- data/data/real.yml +143 -0
- data/data/test.yml +18 -0
- data/set/abstract/account_dropdown.rb +17 -4
- data/set/abstract/{pointer.rb → list.rb} +0 -0
- data/set/all/alert.rb +2 -4
- data/set/all/layouts.rb +2 -2
- data/set/all/modal/modal_dialog.haml +10 -4
- data/set/all/modal.rb +36 -31
- data/set/all/navbar_links.rb +1 -1
- data/set/all/overlay.rb +5 -5
- data/set/all/process_layout.rb +1 -1
- data/set/right/enabled_roles/role_checkbox.haml +2 -2
- data/set/right/enabled_roles.rb +2 -0
- data/set/right/layout.rb +1 -0
- data/set/self/account_links.rb +22 -22
- data/set/self/dropdown_divider.rb +2 -0
- data/set/self/layout_options.rb +3 -0
- data/set/type/html.rb +0 -4
- metadata +36 -12
- data/set/all/tabs.rb +0 -52
- data/set/self/navbox.rb +0 -33
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: eae60ab480a1985e43a70c077377a025e51d30b1b39a395b04c6907c3c57a41d
         | 
| 4 | 
            +
              data.tar.gz: 672b7bf9992a129a5ca1f5ff497fc19511b55b0ff5146226b25152a1d4e9d14c
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7b08ce988ef614da4dc3c4c675a1b717e0bdbb481c6c4b98b862dab1de79f951a446ecd6837ee49dcbea22c71c2758d7d6040c7415e7d7de2e79b964732788c5
         | 
| 7 | 
            +
              data.tar.gz: ec94cb6a8b07a78e54de66ef5145d13c0c607f338275a5b167f7ddc7a7688a6b57e6f05f7f01893ee76e7a46587dc064d3230e1cdb107a7ed766188e0fff6ee1
         | 
| @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            wrapDeckoLayout = ->
         | 
| 2 | 
            +
              $footer  = $('body > footer').first()
         | 
| 3 | 
            +
              $('body > article, body > aside').wrapAll("<div class='#{containerClass()}'/>")
         | 
| 4 | 
            +
              $('body > div > article, body > div > aside')
         | 
| 5 | 
            +
                .wrapAll('<div class="row row-offcanvas">')
         | 
| 6 | 
            +
              if $footer
         | 
| 7 | 
            +
                $('body').append $footer
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            wrapSidebarToggle = (toggle, flex) ->
         | 
| 10 | 
            +
              "<div class='container'><div class='row #{flex}'>#{toggle}</div></div>"
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            containerClass = ->
         | 
| 13 | 
            +
              if $('body').hasClass('fluid') then "container-fluid" else "container"
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            toggleButton = (side) ->
         | 
| 16 | 
            +
              icon_dir = if side == 'left' then 'right' else 'left'
         | 
| 17 | 
            +
              "<button class='offcanvas-toggle btn btn-secondary "+
         | 
| 18 | 
            +
                "d-sm-none' data-toggle='offcanvas-#{side}'>" +
         | 
| 19 | 
            +
                "<i class='material-icons'>chevron_#{icon_dir}</i></button>"
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            sidebarToggle = (side) ->
         | 
| 22 | 
            +
              if side == "both"
         | 
| 23 | 
            +
                wrapSidebarToggle(toggleButton("left") + toggleButton("right"), "flex-row justify-content-between")
         | 
| 24 | 
            +
              else if side == "left"
         | 
| 25 | 
            +
                wrapSidebarToggle(toggleButton("left"), "flex-row")
         | 
| 26 | 
            +
              else
         | 
| 27 | 
            +
                wrapSidebarToggle(toggleButton("right"), "flex-row-reverse")
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            singleSidebar = (side) ->
         | 
| 30 | 
            +
              $article = $('body > article').first()
         | 
| 31 | 
            +
              $aside   = $('body > aside').first()
         | 
| 32 | 
            +
              $article.addClass("col-xs-12 col-sm-9")
         | 
| 33 | 
            +
              $aside.addClass(
         | 
| 34 | 
            +
                "col-xs-6 col-sm-3 sidebar-offcanvas sidebar-offcanvas-#{side}"
         | 
| 35 | 
            +
              )
         | 
| 36 | 
            +
              if side == 'left'
         | 
| 37 | 
            +
                $('body').append($aside).append($article)
         | 
| 38 | 
            +
              else
         | 
| 39 | 
            +
                $('body').append($article).append($aside)
         | 
| 40 | 
            +
              wrapDeckoLayout()
         | 
| 41 | 
            +
              $article.prepend(sidebarToggle(side))
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            doubleSidebar = ->
         | 
| 44 | 
            +
              $article    = $('body > article').first()
         | 
| 45 | 
            +
              $asideLeft  = $('body > aside').first()
         | 
| 46 | 
            +
              $asideRight = $($('body > aside')[1])
         | 
| 47 | 
            +
              $article.addClass("col-xs-12 col-sm-6")
         | 
| 48 | 
            +
              sideClass = "col-xs-6 col-sm-3 sidebar-offcanvas"
         | 
| 49 | 
            +
              $asideLeft.addClass("#{sideClass} sidebar-offcanvas-left")
         | 
| 50 | 
            +
              $asideRight.addClass("#{sideClass} sidebar-offcanvas-right")
         | 
| 51 | 
            +
              $('body').append($asideLeft).append($article).append($asideRight)
         | 
| 52 | 
            +
              wrapDeckoLayout()
         | 
| 53 | 
            +
              toggles = sidebarToggle('both')
         | 
| 54 | 
            +
              $article.prepend(toggles)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            $.fn.extend toggleText: (a, b) ->
         | 
| 57 | 
            +
              @text(if @text() == b then a else b)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              this
         | 
| 60 | 
            +
            $(window).ready ->
         | 
| 61 | 
            +
              switch
         | 
| 62 | 
            +
                when $('body').hasClass('right-sidebar')
         | 
| 63 | 
            +
                  singleSidebar('right')
         | 
| 64 | 
            +
                when $('body').hasClass('left-sidebar')
         | 
| 65 | 
            +
                  singleSidebar('left')
         | 
| 66 | 
            +
                when $('body').hasClass('two-sidebar')
         | 
| 67 | 
            +
                  doubleSidebar()
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              $('[data-toggle="offcanvas-left"]').click ->
         | 
| 70 | 
            +
                $('.row-offcanvas').removeClass('right-active').toggleClass('left-active')
         | 
| 71 | 
            +
                $(this).find('i.material-icons')
         | 
| 72 | 
            +
                  .toggleText('chevron_left', 'chevron_right')
         | 
| 73 | 
            +
              $('[data-toggle="offcanvas-right"]').click ->
         | 
| 74 | 
            +
                $('.row-offcanvas').removeClass('left-active').toggleClass('right-active')
         | 
| 75 | 
            +
                $(this).find('i.material-icons')
         | 
| 76 | 
            +
                  .toggleText('chevron_left', 'chevron_right')
         | 
| @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            $(window).ready ->
         | 
| 2 | 
            +
              $('body').on 'hidden.bs.modal', (_event) ->
         | 
| 3 | 
            +
                decko.removeModal()
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              $('body').on "show.bs.modal", "._modal-slot", (event, slot) ->
         | 
| 6 | 
            +
                link = $(event.relatedTarget)
         | 
| 7 | 
            +
                addModalDialogClasses $(this), link
         | 
| 8 | 
            +
                $(this).modal("handleUpdate")
         | 
| 9 | 
            +
                decko.contentLoaded $(event.target), link
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              $('._modal-slot').each ->
         | 
| 12 | 
            +
                openModalIfPresent $(this)
         | 
| 13 | 
            +
                addModalDialogClasses $(this)
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              $('body').on 'click', '.submit-modal', ->
         | 
| 16 | 
            +
                $(this).closest('.modal-content').find('form').submit()
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            openModalIfPresent = (mslot) ->
         | 
| 19 | 
            +
              modal_content = mslot.find(".modal-content")
         | 
| 20 | 
            +
              if modal_content.length > 0 && modal_content.html().length > 0
         | 
| 21 | 
            +
                $("#main > .card-slot").registerAsOrigin("modal", mslot)
         | 
| 22 | 
            +
                mslot.modal("show")
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            addModalDialogClasses = ($modal_slot, $link) ->
         | 
| 25 | 
            +
              dialog = $modal_slot.find(".modal-dialog")
         | 
| 26 | 
            +
              classes_from_link =
         | 
| 27 | 
            +
                if $link? then $link.data("modal-class") else $modal_slot.data("modal-class")
         | 
| 28 | 
            +
              if classes_from_link? and dialog?
         | 
| 29 | 
            +
                dialog.addClass classes_from_link
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            jQuery.fn.extend {
         | 
| 32 | 
            +
              showAsModal: ($slotter) ->
         | 
| 33 | 
            +
                el = @modalify($slotter) if $slotter?
         | 
| 34 | 
            +
                if $("body > ._modal-slot").is(":visible")
         | 
| 35 | 
            +
                  @addModal el, $slotter
         | 
| 36 | 
            +
                else
         | 
| 37 | 
            +
                  if $("body > ._modal-slot")[0]
         | 
| 38 | 
            +
                    $("._modal-slot").trigger "decko.slot.destroy"
         | 
| 39 | 
            +
                    $("body > ._modal-slot").replaceWith el
         | 
| 40 | 
            +
                  else
         | 
| 41 | 
            +
                    $("body").append el
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  $slotter.registerAsOrigin("modal", el)
         | 
| 44 | 
            +
                  el.modal("show", $slotter)
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              addModal: (el, $slotter) ->
         | 
| 47 | 
            +
                if $slotter.data("slotter-mode") == "modal-replace"
         | 
| 48 | 
            +
                  addModalDialogClasses el, $slotter
         | 
| 49 | 
            +
                  dialog = el.find(".modal-dialog")
         | 
| 50 | 
            +
                  el.adoptModalOrigin()
         | 
| 51 | 
            +
                  $("._modal-slot").trigger "decko.slot.destroy"
         | 
| 52 | 
            +
                  $("body > ._modal-slot > .modal-dialog").replaceWith dialog
         | 
| 53 | 
            +
                  decko.contentLoaded dialog, $slotter
         | 
| 54 | 
            +
                else
         | 
| 55 | 
            +
                  decko.pushModal el
         | 
| 56 | 
            +
                  $slotter.registerAsOrigin("modal", el)
         | 
| 57 | 
            +
                  el.modal("show", $slotter)
         | 
| 58 | 
            +
             | 
| 59 | 
            +
              adoptModalOrigin: () ->
         | 
| 60 | 
            +
                origin_slot_id = $("body > ._modal-slot .card-slot[data-modal-origin-slot-id]")
         | 
| 61 | 
            +
                                    .data("modal-origin-slot-id")
         | 
| 62 | 
            +
                @find(".modal-body .card-slot").attr("data-modal-origin-slot-id", origin_slot_id)
         | 
| 63 | 
            +
             | 
| 64 | 
            +
              modalSlot: ->
         | 
| 65 | 
            +
                slot = $("#modal-container")
         | 
| 66 | 
            +
                if slot.length > 0 then slot else decko.createModalSlot()
         | 
| 67 | 
            +
             | 
| 68 | 
            +
              modalify: ($slotter) ->
         | 
| 69 | 
            +
                if $slotter.data("modal-body")?
         | 
| 70 | 
            +
                  @find(".modal-body").append($slotter.data("modal-body"))
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                if @hasClass("_modal-slot")
         | 
| 73 | 
            +
                  this
         | 
| 74 | 
            +
                else
         | 
| 75 | 
            +
                  modalSlot = $('<div/>', id: "modal-container", class: "modal fade _modal-slot")
         | 
| 76 | 
            +
                  modalSlot.append(
         | 
| 77 | 
            +
                    $('<div/>' , class: "modal-dialog").append(
         | 
| 78 | 
            +
                      $('<div/>', class: "modal-content").append(this)
         | 
| 79 | 
            +
                    )
         | 
| 80 | 
            +
                  )
         | 
| 81 | 
            +
                  modalSlot
         | 
| 82 | 
            +
            }
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            $.extend decko,
         | 
| 85 | 
            +
              createModalSlot: ->
         | 
| 86 | 
            +
                slot = $('<div/>', id: "modal-container", class: "modal fade _modal-slot")
         | 
| 87 | 
            +
                $("body").append(slot)
         | 
| 88 | 
            +
                slot
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              removeModal: ->
         | 
| 91 | 
            +
                if $("._modal-stack")[0]
         | 
| 92 | 
            +
                  decko.popModal()
         | 
| 93 | 
            +
                else
         | 
| 94 | 
            +
                  $("._modal-slot").trigger "decko.slot.destroy"
         | 
| 95 | 
            +
                  $(".modal-dialog").empty()
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              pushModal: (el) ->
         | 
| 98 | 
            +
                mslot = $("body > ._modal-slot")
         | 
| 99 | 
            +
                mslot.removeAttr("id")
         | 
| 100 | 
            +
                mslot.removeClass("_modal-slot").addClass("_modal-stack").removeClass("modal").addClass("background-modal")
         | 
| 101 | 
            +
                el.insertBefore mslot
         | 
| 102 | 
            +
                $(".modal-backdrop").removeClass("show")
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              popModal: ->
         | 
| 105 | 
            +
                $(".modal-backdrop").addClass("show")
         | 
| 106 | 
            +
                $("body > ._modal-slot").trigger "decko.slot.destroy"
         | 
| 107 | 
            +
                $("body > ._modal-slot").remove()
         | 
| 108 | 
            +
                modal = $($("._modal-stack")[0])
         | 
| 109 | 
            +
                modal.addClass("_modal-slot").removeClass("_modal-stack").attr("id", "modal-container").addClass("modal").removeClass("background-modal")
         | 
| 110 | 
            +
                $(document.body).addClass("modal-open")
         | 
| 111 | 
            +
             | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            jQuery.fn.extend
         | 
| 2 | 
            +
              overlaySlot: ->
         | 
| 3 | 
            +
                oslot = @closest(".card-slot._overlay")
         | 
| 4 | 
            +
                return oslot if oslot[0]?
         | 
| 5 | 
            +
                oslot = @closest(".overlay-container").find("._overlay")
         | 
| 6 | 
            +
                oslot[0]? && $(oslot[0])
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              addOverlay: (overlay, $slotter) ->
         | 
| 9 | 
            +
                if @parent().hasClass("overlay-container")
         | 
| 10 | 
            +
                  if $(overlay).hasClass("_stack-overlay")
         | 
| 11 | 
            +
                    @before overlay
         | 
| 12 | 
            +
                  else
         | 
| 13 | 
            +
                    $("._overlay-origin").removeClass("_overlay-origin")
         | 
| 14 | 
            +
                    @replaceOverlay(overlay)
         | 
| 15 | 
            +
                else
         | 
| 16 | 
            +
                  if @parent().hasClass("_overlay-container-placeholder")
         | 
| 17 | 
            +
                    @parent().addClass("overlay-container")
         | 
| 18 | 
            +
                  else
         | 
| 19 | 
            +
                    @wrapAll('<div class="overlay-container">')
         | 
| 20 | 
            +
                  @addClass("_bottomlay-slot")
         | 
| 21 | 
            +
                  @before overlay
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                $slotter.registerAsOrigin("overlay", overlay)
         | 
| 24 | 
            +
                decko.contentLoaded(overlay, $slotter)
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              replaceOverlay: (overlay) ->
         | 
| 27 | 
            +
                @overlaySlot().trigger "decko.slot.destroy"
         | 
| 28 | 
            +
                @overlaySlot().replaceWith overlay
         | 
| 29 | 
            +
                $(".bridge-sidebar .tab-pane:not(.active) .bridge-pills > .nav-item > .nav-link.active").removeClass("active")
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              isInOverlay: ->
         | 
| 32 | 
            +
                return @closest(".card-slot._overlay").length
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              removeOverlay: () ->
         | 
| 35 | 
            +
                  slot = @overlaySlot()
         | 
| 36 | 
            +
                  if slot
         | 
| 37 | 
            +
                    slot.removeOverlaySlot()
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              removeOverlaySlot: () ->
         | 
| 40 | 
            +
                @trigger "decko.slot.destroy"
         | 
| 41 | 
            +
                if @siblings().length == 1
         | 
| 42 | 
            +
                  bottomlay = $(@siblings()[0])
         | 
| 43 | 
            +
                  if bottomlay.hasClass("_bottomlay-slot")
         | 
| 44 | 
            +
                    if bottomlay.parent().hasClass("_overlay-container-placeholder")
         | 
| 45 | 
            +
                      bottomlay.parent().removeClass("overlay-container")
         | 
| 46 | 
            +
                    else
         | 
| 47 | 
            +
                      bottomlay.unwrap()
         | 
| 48 | 
            +
                    bottomlay.removeClass("_bottomlay-slot").updateBridge(true, bottomlay)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    #bottomlay.find(".tinymce-textarea").each ->
         | 
| 51 | 
            +
                    #  tinymce.EditorManager.execCommand('mceAddControl',true, editor_id);
         | 
| 52 | 
            +
                    #  decko.initTinyMCE($(this).attr("id"))
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                @remove()
         | 
| @@ -0,0 +1,103 @@ | |
| 1 | 
            +
            .d0-nav-container {
         | 
| 2 | 
            +
              flex-wrap: inherit;
         | 
| 3 | 
            +
              display: flex;
         | 
| 4 | 
            +
              width: 100%;
         | 
| 5 | 
            +
              justify-content: space-between;
         | 
| 6 | 
            +
            }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
             | 
| 9 | 
            +
            /*----------- Sidebar -------------*/
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            .row.row-offcanvas {
         | 
| 12 | 
            +
              > aside, article {
         | 
| 13 | 
            +
                margin: 0;
         | 
| 14 | 
            +
              }
         | 
| 15 | 
            +
            }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            /* collapsed sidebar styles */
         | 
| 18 | 
            +
            @media screen and (max-width: 576px) {
         | 
| 19 | 
            +
              .row-offcanvas {
         | 
| 20 | 
            +
                position: relative;
         | 
| 21 | 
            +
                -webkit-transition: all 0.25s ease-out;
         | 
| 22 | 
            +
                -moz-transition: all 0.25s ease-out;
         | 
| 23 | 
            +
                transition: all 0.25s ease-out;
         | 
| 24 | 
            +
              }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              .sidebar-offcanvas-right {
         | 
| 27 | 
            +
                right: -41.6%;
         | 
| 28 | 
            +
              }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              .sidebar-offcanvas-left {
         | 
| 31 | 
            +
                left: -41.6%;
         | 
| 32 | 
            +
              }
         | 
| 33 | 
            +
              .row-offcanvas.right-active {
         | 
| 34 | 
            +
                right: 41.6%;
         | 
| 35 | 
            +
              }
         | 
| 36 | 
            +
              .row-offcanvas.left-active {
         | 
| 37 | 
            +
                left: 41.6%;
         | 
| 38 | 
            +
              }
         | 
| 39 | 
            +
              .sidebar-offcanvas {
         | 
| 40 | 
            +
                position: absolute !important;
         | 
| 41 | 
            +
                top: 0 !important;
         | 
| 42 | 
            +
                width: 41.6% !important;
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
            }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            .offcanvas-toggle {
         | 
| 47 | 
            +
              font-size: 10px !important;
         | 
| 48 | 
            +
              padding: 5px !important;
         | 
| 49 | 
            +
              margin-bottom: 15px !important;
         | 
| 50 | 
            +
            }
         | 
| 51 | 
            +
             | 
| 52 | 
            +
            .act-summary {
         | 
| 53 | 
            +
              min-width: 27px;
         | 
| 54 | 
            +
            }
         | 
| 55 | 
            +
             | 
| 56 | 
            +
             | 
| 57 | 
            +
            footer .separator {
         | 
| 58 | 
            +
              padding-left: 2px;
         | 
| 59 | 
            +
              padding-right: 2px;
         | 
| 60 | 
            +
            }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            body.right-sidebar, body.left-sidebar, body.two-sidebar {
         | 
| 63 | 
            +
              article, #primary {
         | 
| 64 | 
            +
                margin: 0 1% 3em 1%;
         | 
| 65 | 
            +
                float: left;
         | 
| 66 | 
            +
                width: 67%;
         | 
| 67 | 
            +
              }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              aside, #secondary {
         | 
| 70 | 
            +
                margin: 0 1% 3em 1%;
         | 
| 71 | 
            +
                float: right;
         | 
| 72 | 
            +
                width: 28%;
         | 
| 73 | 
            +
              }
         | 
| 74 | 
            +
             | 
| 75 | 
            +
              footer {
         | 
| 76 | 
            +
                clear:both;
         | 
| 77 | 
            +
                text-align: center;
         | 
| 78 | 
            +
                padding: 1em;
         | 
| 79 | 
            +
              }
         | 
| 80 | 
            +
            }
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            @media print {
         | 
| 83 | 
            +
              article, #primary {
         | 
| 84 | 
            +
                width: 100%;
         | 
| 85 | 
            +
                float: none;
         | 
| 86 | 
            +
                margin: 0;
         | 
| 87 | 
            +
              }
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              aside, #secondary, footer {
         | 
| 90 | 
            +
                display: none;
         | 
| 91 | 
            +
              }
         | 
| 92 | 
            +
            }
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            .RIGHT-Xenabled_role.edit_inline-view {
         | 
| 95 | 
            +
              .pointer-checkbox-list {
         | 
| 96 | 
            +
                #pointer-checkbox-anyone_signed_in {
         | 
| 97 | 
            +
                  display: none;
         | 
| 98 | 
            +
                }
         | 
| 99 | 
            +
              }
         | 
| 100 | 
            +
              .card-editor {
         | 
| 101 | 
            +
                padding-bottom: 0;
         | 
| 102 | 
            +
              }
         | 
| 103 | 
            +
            }
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            .background-modal {
         | 
| 2 | 
            +
              position: fixed;
         | 
| 3 | 
            +
              top: 0;
         | 
| 4 | 
            +
              right: 0;
         | 
| 5 | 
            +
              bottom: 0;
         | 
| 6 | 
            +
              left: 0;
         | 
| 7 | 
            +
              z-index: 900;
         | 
| 8 | 
            +
              outline: 0;
         | 
| 9 | 
            +
              overflow-x: hidden;
         | 
| 10 | 
            +
              overflow-y: auto;
         | 
| 11 | 
            +
            }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            .modal-menu .close{
         | 
| 14 | 
            +
              font-size: 16px;
         | 
| 15 | 
            +
              // margin-left: 10px;
         | 
| 16 | 
            +
            }
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            .modal-dialog.modal-full {
         | 
| 19 | 
            +
              max-width: 99%;
         | 
| 20 | 
            +
              margin: 1%;
         | 
| 21 | 
            +
            }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
            .modal-backdrop.in {
         | 
| 25 | 
            +
              z-index: auto;
         | 
| 26 | 
            +
            }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            .modal-body > div {
         | 
| 29 | 
            +
              display: inline-block;
         | 
| 30 | 
            +
              width: 100%;
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              .menu-slot {
         | 
| 33 | 
            +
                z-index: 1;
         | 
| 34 | 
            +
              }
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
             | 
| 38 | 
            +
            /*------ bootstrap 5 --------*/
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            .modal-header .btn-close {
         | 
| 41 | 
            +
              background: none;
         | 
| 42 | 
            +
            }
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            /*-------------------------- */
         | 
| 2 | 
            +
            /*- Overlay                - */
         | 
| 3 | 
            +
            /*-------------------------- */
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            .overlay-container {
         | 
| 6 | 
            +
              position: relative;
         | 
| 7 | 
            +
              height: 100%;
         | 
| 8 | 
            +
              overflow: auto;
         | 
| 9 | 
            +
              .card-slot.overlay_rule-view {
         | 
| 10 | 
            +
                border-left: 5px solid $primary;
         | 
| 11 | 
            +
              }
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              .d0-card-overlay
         | 
| 14 | 
            +
              > .d0-card-frame
         | 
| 15 | 
            +
              > .d0-card-content {
         | 
| 16 | 
            +
                overflow-y: scroll;
         | 
| 17 | 
            +
                padding: 1rem 1.5rem; // px-4
         | 
| 18 | 
            +
              }
         | 
| 19 | 
            +
            }
         | 
| 20 | 
            +
             | 
| 21 | 
            +
             | 
| 22 | 
            +
            .d0-card-overlay {
         | 
| 23 | 
            +
              position: absolute;
         | 
| 24 | 
            +
              width: 100%;
         | 
| 25 | 
            +
              height: 100%;
         | 
| 26 | 
            +
              z-index: 10;
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              > .d0-card-frame {
         | 
| 29 | 
            +
                height: 100%;
         | 
| 30 | 
            +
                width: 100%;
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                > .d0-card-header {
         | 
| 33 | 
            +
                  border-bottom: 1px solid $border-color;
         | 
| 34 | 
            +
                  padding: 0.25rem 0.25rem 0.25rem 1.25rem;
         | 
| 35 | 
            +
                  .title {
         | 
| 36 | 
            +
                    font-weight: bold;
         | 
| 37 | 
            +
                    text-transform: capitalize;
         | 
| 38 | 
            +
                  }
         | 
| 39 | 
            +
                  .card-title {
         | 
| 40 | 
            +
                    margin-bottom: 0;
         | 
| 41 | 
            +
                  }
         | 
| 42 | 
            +
                }
         | 
| 43 | 
            +
              }
         | 
| 44 | 
            +
            }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            // FIXME: this directly overrides above rule.
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            .d0-card-overlay > .d0-card-frame > .d0-card-header {
         | 
| 49 | 
            +
              padding-left: -15px!important;
         | 
| 50 | 
            +
              padding-right: -15px!important;
         | 
| 51 | 
            +
            }
         | 
| @@ -0,0 +1,6 @@ | |
| 1 | 
            +
            // layout.js.coffee
         | 
| 2 | 
            +
            (function(){var a,e,t,s,o,i,n;i=function(){var e;if(e=$("body > footer").first(),$("body > article, body > aside").wrapAll("<div class='"+a()+"'/>"),$("body > div > article, body > div > aside").wrapAll('<div class="row row-offcanvas">'),e)return $("body").append(e)},n=function(a,e){return"<div class='container'><div class='row "+e+"'>"+a+"</div></div>"},a=function(){return $("body").hasClass("fluid")?"container-fluid":"container"},o=function(a){return"<button class='offcanvas-toggle btn btn-secondary d-sm-none' data-toggle='offcanvas-"+a+"'><i class='material-icons'>chevron_"+("left"===a?"right":"left")+"</i></button>"},t=function(a){return"both"===a?n(o("left")+o("right"),"flex-row justify-content-between"):"left"===a?n(o("left"),"flex-row"):n(o("right"),"flex-row-reverse")},s=function(a){var e,s;return e=$("body > article").first(),s=$("body > aside").first(),e.addClass("col-xs-12 col-sm-9"),s.addClass("col-xs-6 col-sm-3 sidebar-offcanvas sidebar-offcanvas-"+a),"left"===a?$("body").append(s).append(e):$("body").append(e).append(s),i(),e.prepend(t(a))},e=function(){var a,e,s,o,n;return a=$("body > article").first(),e=$("body > aside").first(),s=$($("body > aside")[1]),a.addClass("col-xs-12 col-sm-6"),o="col-xs-6 col-sm-3 sidebar-offcanvas",e.addClass(o+" sidebar-offcanvas-left"),s.addClass(o+" sidebar-offcanvas-right"),$("body").append(e).append(a).append(s),i(),n=t("both"),a.prepend(n)},$.fn.extend({toggleText:function(a,e){return this.text(this.text()===e?a:e),this}}),$(window).ready(function(){switch(!1){case!$("body").hasClass("right-sidebar"):s("right");break;case!$("body").hasClass("left-sidebar"):s("left");break;case!$("body").hasClass("two-sidebar"):e()}return $('[data-toggle="offcanvas-left"]').click(function(){return $(".row-offcanvas").removeClass("right-active").toggleClass("left-active"),$(this).find("i.material-icons").toggleText("chevron_left","chevron_right")}),$('[data-toggle="offcanvas-right"]').click(function(){return $(".row-offcanvas").removeClass("left-active").toggleClass("right-active"),$(this).find("i.material-icons").toggleText("chevron_left","chevron_right")})})}).call(this);
         | 
| 3 | 
            +
            // modal.js.coffee
         | 
| 4 | 
            +
            (function(){var o,d;$(window).ready(function(){return $("body").on("hidden.bs.modal",function(){return decko.removeModal()}),$("body").on("show.bs.modal","._modal-slot",function(d){var a;return a=$(d.relatedTarget),o($(this),a),$(this).modal("handleUpdate"),decko.contentLoaded($(d.target),a)}),$("._modal-slot").each(function(){return d($(this)),o($(this))}),$("body").on("click",".submit-modal",function(){return $(this).closest(".modal-content").find("form").submit()})}),d=function(o){var d;if((d=o.find(".modal-content")).length>0&&d.html().length>0)return $("#main > .card-slot").registerAsOrigin("modal",o),o.modal("show")},o=function(o,d){var a,l;if(l=o.find(".modal-dialog"),null!=(a=null!=d?d.data("modal-class"):o.data("modal-class"))&&null!=l)return l.addClass(a)},jQuery.fn.extend({showAsModal:function(o){var d;return null!=o&&(d=this.modalify(o)),$("body > ._modal-slot").is(":visible")?this.addModal(d,o):($("body > ._modal-slot")[0]?($("._modal-slot").trigger("decko.slot.destroy"),$("body > ._modal-slot").replaceWith(d)):$("body").append(d),o.registerAsOrigin("modal",d),d.modal("show",o))},addModal:function(d,a){var l;return"modal-replace"===a.data("slotter-mode")?(o(d,a),l=d.find(".modal-dialog"),d.adoptModalOrigin(),$("._modal-slot").trigger("decko.slot.destroy"),$("body > ._modal-slot > .modal-dialog").replaceWith(l),decko.contentLoaded(l,a)):(decko.pushModal(d),a.registerAsOrigin("modal",d),d.modal("show",a))},adoptModalOrigin:function(){var o;return o=$("body > ._modal-slot .card-slot[data-modal-origin-slot-id]").data("modal-origin-slot-id"),this.find(".modal-body .card-slot").attr("data-modal-origin-slot-id",o)},modalSlot:function(){var o;return(o=$("#modal-container")).length>0?o:decko.createModalSlot()},modalify:function(o){var d;return null!=o.data("modal-body")&&this.find(".modal-body").append(o.data("modal-body")),this.hasClass("_modal-slot")?this:((d=$("<div/>",{id:"modal-container","class":"modal fade _modal-slot"})).append($("<div/>",{"class":"modal-dialog"}).append($("<div/>",{"class":"modal-content"}).append(this))),d)}}),$.extend(decko,{createModalSlot:function(){var o;return o=$("<div/>",{id:"modal-container","class":"modal fade _modal-slot"}),$("body").append(o),o},removeModal:function(){return $("._modal-stack")[0]?decko.popModal():($("._modal-slot").trigger("decko.slot.destroy"),$(".modal-dialog").empty())},pushModal:function(o){var d;return(d=$("body > ._modal-slot")).removeAttr("id"),d.removeClass("_modal-slot").addClass("_modal-stack").removeClass("modal").addClass("background-modal"),o.insertBefore(d),$(".modal-backdrop").removeClass("show")},popModal:function(){return $(".modal-backdrop").addClass("show"),$("body > ._modal-slot").trigger("decko.slot.destroy"),$("body > ._modal-slot").remove(),$($("._modal-stack")[0]).addClass("_modal-slot").removeClass("_modal-stack").attr("id","modal-container").addClass("modal").removeClass("background-modal"),$(document.body).addClass("modal-open")}})}).call(this);
         | 
| 5 | 
            +
            // overlay.js.coffee
         | 
| 6 | 
            +
            (function(){jQuery.fn.extend({overlaySlot:function(){var e;return null!=(e=this.closest(".card-slot._overlay"))[0]?e:null!=(e=this.closest(".overlay-container").find("._overlay"))[0]&&$(e[0])},addOverlay:function(e,r){return this.parent().hasClass("overlay-container")?$(e).hasClass("_stack-overlay")?this.before(e):($("._overlay-origin").removeClass("_overlay-origin"),this.replaceOverlay(e)):(this.parent().hasClass("_overlay-container-placeholder")?this.parent().addClass("overlay-container"):this.wrapAll('<div class="overlay-container">'),this.addClass("_bottomlay-slot"),this.before(e)),r.registerAsOrigin("overlay",e),decko.contentLoaded(e,r)},replaceOverlay:function(e){return this.overlaySlot().trigger("decko.slot.destroy"),this.overlaySlot().replaceWith(e),$(".bridge-sidebar .tab-pane:not(.active) .bridge-pills > .nav-item > .nav-link.active").removeClass("active")},isInOverlay:function(){return this.closest(".card-slot._overlay").length},removeOverlay:function(){var e;if(e=this.overlaySlot())return e.removeOverlaySlot()},removeOverlaySlot:function(){var e;return this.trigger("decko.slot.destroy"),1===this.siblings().length&&(e=$(this.siblings()[0])).hasClass("_bottomlay-slot")&&(e.parent().hasClass("_overlay-container-placeholder")?e.parent().removeClass("overlay-container"):e.unwrap(),e.removeClass("_bottomlay-slot").updateBridge(!0,e)),this.remove()}})}).call(this);
         | 
    
        data/data/real.yml
    ADDED
    
    | @@ -0,0 +1,143 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            - :name: Layout
         | 
| 3 | 
            +
              :type: :cardtype
         | 
| 4 | 
            +
              :codename: layout_type
         | 
| 5 | 
            +
              :fields:
         | 
| 6 | 
            +
                :description: Organize webpages. [[http://decko.org/Layout|more]]
         | 
| 7 | 
            +
                :type:
         | 
| 8 | 
            +
                  :fields:
         | 
| 9 | 
            +
                    :create: Shark
         | 
| 10 | 
            +
                    :update: Shark
         | 
| 11 | 
            +
                    :delete: Shark
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            - :name: "*layout"
         | 
| 14 | 
            +
              :type: :setting
         | 
| 15 | 
            +
              :codename: layout
         | 
| 16 | 
            +
              :fields:
         | 
| 17 | 
            +
                :right:
         | 
| 18 | 
            +
                  :fields:
         | 
| 19 | 
            +
                    :input_type: select
         | 
| 20 | 
            +
                    :content_options:
         | 
| 21 | 
            +
                      :codename: layout_options
         | 
| 22 | 
            +
                      :type: :search_type
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            - :name:
         | 
| 25 | 
            +
                - :all
         | 
| 26 | 
            +
                - :layout
         | 
| 27 | 
            +
              :type: :pointer
         | 
| 28 | 
            +
              :content: Default Layout
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            - :name: "*main menu"
         | 
| 31 | 
            +
              :type: :link_list
         | 
| 32 | 
            +
              :content: "[[:recent|Recent Changes]]"
         | 
| 33 | 
            +
              :codename: main_menu
         | 
| 34 | 
            +
              :conflict: :defer
         | 
| 35 | 
            +
              :fields:
         | 
| 36 | 
            +
                :self:
         | 
| 37 | 
            +
                  :fields:
         | 
| 38 | 
            +
                    :read: Anyone
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            - :name: "*header"
         | 
| 41 | 
            +
              :type: :html
         | 
| 42 | 
            +
              :codename: header
         | 
| 43 | 
            +
              :fields:
         | 
| 44 | 
            +
                :self:
         | 
| 45 | 
            +
                  :fields:
         | 
| 46 | 
            +
                    :read: Anyone
         | 
| 47 | 
            +
              :content: |
         | 
| 48 | 
            +
                <nav class="navbar navbar-expand-lg navbar-dark bg-dark mb-3 nodblclick">
         | 
| 49 | 
            +
                  <div class="container">
         | 
| 50 | 
            +
                    <div class="d0-nav-container">
         | 
| 51 | 
            +
                      <div class="d-flex">
         | 
| 52 | 
            +
                        <a class="nav-logo navbar-brand" href="{{:home|home_path}}">
         | 
| 53 | 
            +
                          {{:logo|core;size:small}}
         | 
| 54 | 
            +
                        </a>
         | 
| 55 | 
            +
                        <a class="navbar-brand" href="{{:home|home_path}}">{{:title|core}}</a>
         | 
| 56 | 
            +
                      </div>
         | 
| 57 | 
            +
                      <button class="navbar-toggler" type="button" aria-label="Toggle navigation"
         | 
| 58 | 
            +
                              aria-controls="d0-navbar" aria-expanded="false"
         | 
| 59 | 
            +
                              data-bs-toggle="collapse" data-bs-target="#d0-navbar">
         | 
| 60 | 
            +
                        <span class="navbar-toggler-icon"></span>
         | 
| 61 | 
            +
                      </button>
         | 
| 62 | 
            +
                      <div class="collapse navbar-collapse" id="d0-navbar">
         | 
| 63 | 
            +
                        <ul class="navbar-nav mr-auto main-nav ms-2">{{:main_menu|navbar_links}}</ul>
         | 
| 64 | 
            +
                        <div class="navbar-nav search-box-nav mx-2">{{:search|search_box}}</div>
         | 
| 65 | 
            +
                        {{:account_links|navbar_links}}
         | 
| 66 | 
            +
                      </div>
         | 
| 67 | 
            +
                    </div>
         | 
| 68 | 
            +
                  </div>
         | 
| 69 | 
            +
                </nav>
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            - :name: "*footer"
         | 
| 72 | 
            +
              :codename: footer
         | 
| 73 | 
            +
              :type: :html
         | 
| 74 | 
            +
              :content: |-
         | 
| 75 | 
            +
                <div class="d-flex justify-content-center align-items-center">
         | 
| 76 | 
            +
                  {{:credit|core}}
         | 
| 77 | 
            +
                </div>
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            - :name: "*sidebar"
         | 
| 80 | 
            +
              :codename: sidebar
         | 
| 81 | 
            +
              :content: |-
         | 
| 82 | 
            +
                <div>[[/ | {{:logo|content_panel}}]]</div>
         | 
| 83 | 
            +
                <div>{{:sidebar_menu|titled}}</div>
         | 
| 84 | 
            +
              :fields:
         | 
| 85 | 
            +
                :right:
         | 
| 86 | 
            +
                  :fields:
         | 
| 87 | 
            +
                    :read: Anyone
         | 
| 88 | 
            +
             | 
| 89 | 
            +
            - :name: Menu
         | 
| 90 | 
            +
              :codename: sidebar_menu
         | 
| 91 | 
            +
              :content: "<p>[[/?view=new|Add a card]]</p>"
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            - :name: Default Layout
         | 
| 94 | 
            +
              :codename: default_layout
         | 
| 95 | 
            +
              :type: :layout_type
         | 
| 96 | 
            +
              :content: |-
         | 
| 97 | 
            +
                <body class="d-flex flex-column h-100">
         | 
| 98 | 
            +
                  <header>{{:header|core}}</header>
         | 
| 99 | 
            +
                  <article class="container flex-shrink-0" role="main">{{_main|titled}}</article>
         | 
| 100 | 
            +
                  <footer class="footer mt-auto py-3">{{:footer|content}}</footer>
         | 
| 101 | 
            +
                </body>
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            - :name: Full Width Layout
         | 
| 104 | 
            +
              :codename: full_layout
         | 
| 105 | 
            +
              :type: :layout_type
         | 
| 106 | 
            +
              :content: |-
         | 
| 107 | 
            +
                <body class="fluid d-flex flex-column h-100">
         | 
| 108 | 
            +
                  <header>{{:header|core}}</header>
         | 
| 109 | 
            +
                  <article class="container flex-shrink-0" role="main">{{_main|titled}}</article>
         | 
| 110 | 
            +
                  <footer class="footer mt-auto py-3">{{:footer|core}}</footer>
         | 
| 111 | 
            +
                </body>
         | 
| 112 | 
            +
             | 
| 113 | 
            +
            - :name: Home Layout
         | 
| 114 | 
            +
              :codename: home_layout
         | 
| 115 | 
            +
              :type: :layout_type
         | 
| 116 | 
            +
              :content: |-
         | 
| 117 | 
            +
                <body class="d-flex flex-column h-100">
         | 
| 118 | 
            +
                  <header>{{:header|core}}</header>
         | 
| 119 | 
            +
                  <article class="container flex-shrink-0" role="main">{{_main|content}}</article>
         | 
| 120 | 
            +
                  <footer class="footer mt-auto py-3">{{:footer|content}}</footer>
         | 
| 121 | 
            +
                </body>
         | 
| 122 | 
            +
             | 
| 123 | 
            +
            - :name: Right Thin Sidebar Layout
         | 
| 124 | 
            +
              :codename: right_thin_sidebar_layout
         | 
| 125 | 
            +
              :type: :layout_type
         | 
| 126 | 
            +
              :content: |-
         | 
| 127 | 
            +
                <body class="right-sidebar thin-sidebar d-flex flex-column h-100">
         | 
| 128 | 
            +
                  <header>{{:header|core}}</header>
         | 
| 129 | 
            +
                  <article class="container flex-shrink-0" role="main">{{_main|titled}}</article>
         | 
| 130 | 
            +
                  <aside>{{:sidebar|content}}</aside>
         | 
| 131 | 
            +
                  <footer class="footer mt-auto py-3">{{:footer|core}}</footer>
         | 
| 132 | 
            +
                </body>
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            - :name: Left Sidebar Layout
         | 
| 135 | 
            +
              :codename: left_sidebar_layout
         | 
| 136 | 
            +
              :type: :layout_type
         | 
| 137 | 
            +
              :content: |-
         | 
| 138 | 
            +
                <body class="left-sidebar">
         | 
| 139 | 
            +
                  <header>{{:header|core}}</header>
         | 
| 140 | 
            +
                  <article>{{_main|titled}}</article>
         | 
| 141 | 
            +
                  <aside>{{:sidebar|core}}</aside>
         | 
| 142 | 
            +
                  <footer>{{:footer|core}}</footer>
         | 
| 143 | 
            +
                </body>
         | 
    
        data/data/test.yml
    ADDED
    
    | @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            - :name: lay out
         | 
| 3 | 
            +
              :type: :layout_type
         | 
| 4 | 
            +
              :content: 'Greatest {{_main|title: Callahan!; view: labeled}}'
         | 
| 5 | 
            +
            - :name: stacks
         | 
| 6 | 
            +
              :type: :list
         | 
| 7 | 
            +
              :content: |-
         | 
| 8 | 
            +
                horizontal
         | 
| 9 | 
            +
                vertical
         | 
| 10 | 
            +
            - :name:
         | 
| 11 | 
            +
              - stacks
         | 
| 12 | 
            +
              - :self
         | 
| 13 | 
            +
              - :layout
         | 
| 14 | 
            +
              :type: :pointer
         | 
| 15 | 
            +
              :content: lay out
         | 
| 16 | 
            +
            - :name: horizontal
         | 
| 17 | 
            +
            - :name: vertical
         | 
| 18 | 
            +
              :type: :pointer
         | 
| @@ -5,14 +5,27 @@ format :html do | |
| 5 5 | 
             
              end
         | 
| 6 6 |  | 
| 7 7 | 
             
              def account_dropdown &render_role_item
         | 
| 8 | 
            -
                 | 
| 8 | 
            +
                class_up "dropdown-toggle-split", "nav-link"
         | 
| 9 | 
            +
                split_dropdown_button link_to_mycard do
         | 
| 9 10 | 
             
                  [
         | 
| 10 | 
            -
                     | 
| 11 | 
            -
                     | 
| 12 | 
            -
                  ]
         | 
| 11 | 
            +
                    [[Auth.current, :account_settings], "Account"],
         | 
| 12 | 
            +
                    [:signin, t("account_sign_out"), { path: { action: :delete } }]
         | 
| 13 | 
            +
                  ] + account_dropdown_roles(&render_role_item)
         | 
| 13 14 | 
             
                end
         | 
| 14 15 | 
             
              end
         | 
| 15 16 |  | 
| 17 | 
            +
              private
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              def account_dropdown_roles &block
         | 
| 20 | 
            +
                return [] unless special_roles?
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                [dropdown_header("Roles")] + account_dropdown_role_items(&block)
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              def account_dropdown_role_items
         | 
| 26 | 
            +
                Auth.current_roles.map { |role| block_given? ? yield(role) : [role] }
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 16 29 | 
             
              def special_roles?
         | 
| 17 30 | 
             
                Auth.current_roles.size > 1
         | 
| 18 31 | 
             
              end
         | 
| 
            File without changes
         | 
    
        data/set/all/alert.rb
    CHANGED
    
    | @@ -15,9 +15,7 @@ format :html do | |
| 15 15 | 
             
              end
         | 
| 16 16 |  | 
| 17 17 | 
             
              def alert_close_button
         | 
| 18 | 
            -
                wrap_with :button, type: "button", "data-dismiss": "alert",
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  wrap_with :span, "×", "aria-hidden" => true
         | 
| 21 | 
            -
                end
         | 
| 18 | 
            +
                wrap_with :button, "", type: "button", "data-bs-dismiss": "alert",
         | 
| 19 | 
            +
                                       class: "btn-close", "aria-label": "Close"
         | 
| 22 20 | 
             
              end
         | 
| 23 21 | 
             
            end
         | 
    
        data/set/all/layouts.rb
    CHANGED
    
    | @@ -22,7 +22,7 @@ format :html do | |
| 22 22 | 
             
                  <<-HTML.strip_heredoc
         | 
| 23 23 | 
             
                    <header>#{nest :header, view: :core}</header>
         | 
| 24 24 | 
             
                    <article>#{layout_nest}</article>
         | 
| 25 | 
            -
                    <footer | 
| 25 | 
            +
                    <footer>#{nest :footer, view: :core}</footer>
         | 
| 26 26 | 
             
                  HTML
         | 
| 27 27 | 
             
                end
         | 
| 28 28 | 
             
              end
         | 
| @@ -33,7 +33,7 @@ format :html do | |
| 33 33 | 
             
                    <header>#{nest :header, view: :core}</header>
         | 
| 34 34 | 
             
                    <article>#{layout_nest}</article>
         | 
| 35 35 | 
             
                    <aside>#{nest :sidebar, view: :core}</aside>
         | 
| 36 | 
            -
                    <footer | 
| 36 | 
            +
                    <footer>#{nest :footer, view: :core}</footer>
         | 
| 37 37 | 
             
                  HTML
         | 
| 38 38 | 
             
                end
         | 
| 39 39 | 
             
              end
         | 
| @@ -1,10 +1,16 @@ | |
| 1 | 
            -
            #modal-container.modal.fade._modal-slot{role: "dialog" | 
| 2 | 
            -
               | 
| 1 | 
            +
            #modal-container.modal.fade._modal-slot{ role: "dialog" }
         | 
| 2 | 
            +
              //, "data-backdrop": "static"}
         | 
| 3 3 | 
             
              %div{class: classes}
         | 
| 4 4 | 
             
                .modal-content
         | 
| 5 | 
            -
                  .modal-header | 
| 5 | 
            +
                  .modal-header
         | 
| 6 6 | 
             
                    = title
         | 
| 7 | 
            -
                     | 
| 7 | 
            +
                    - if voo.show? :modal_menu
         | 
| 8 | 
            +
                      = menu
         | 
| 9 | 
            +
                    -# - else
         | 
| 10 | 
            +
                    -#   else
         | 
| 11 | 
            +
                    -#   %button.btn-close{ type: "button",
         | 
| 12 | 
            +
                    -#                      "data-bs-dismiss": "modal",
         | 
| 13 | 
            +
                    -#                      "aria-label": "Close" }
         | 
| 8 14 | 
             
                  .modal-body
         | 
| 9 15 | 
             
                    = body
         | 
| 10 16 | 
             
                  - if footer.present?
         | 
    
        data/set/all/modal.rb
    CHANGED
    
    | @@ -1,6 +1,7 @@ | |
| 1 1 | 
             
            format :html do
         | 
| 2 | 
            -
              MODAL_SIZE = { small: "sm", medium: nil, large: "lg", | 
| 3 | 
            -
              MODAL_CLOSE_OPTS = {  | 
| 2 | 
            +
              MODAL_SIZE = { small: "sm", medium: nil, large: "lg",  full: "full", xl: "xl" }.freeze
         | 
| 3 | 
            +
              MODAL_CLOSE_OPTS = { type: "button",
         | 
| 4 | 
            +
                                   "data-bs-dismiss": "modal",
         | 
| 4 5 | 
             
                                   "data-cy": "close-modal" }.freeze
         | 
| 5 6 |  | 
| 6 7 | 
             
              wrapper :modal do |opts={}|
         | 
| @@ -11,28 +12,6 @@ format :html do | |
| 11 12 | 
             
                                    footer: normalize_modal_option(:footer, opts)
         | 
| 12 13 | 
             
              end
         | 
| 13 14 |  | 
| 14 | 
            -
              def normalize_modal_option key, opts
         | 
| 15 | 
            -
                val = opts[key]
         | 
| 16 | 
            -
                return render("modal_#{key}") unless val
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                cast_model_option val
         | 
| 19 | 
            -
              end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
              def cast_model_option val
         | 
| 22 | 
            -
                case val
         | 
| 23 | 
            -
                when Symbol
         | 
| 24 | 
            -
                  cast_model_option_symbol val
         | 
| 25 | 
            -
                when Proc
         | 
| 26 | 
            -
                  val.call(self)
         | 
| 27 | 
            -
                else
         | 
| 28 | 
            -
                  val
         | 
| 29 | 
            -
                end
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
              def cast_model_option_symbol val
         | 
| 33 | 
            -
                respond_to?(val) ? send(val) : val
         | 
| 34 | 
            -
              end
         | 
| 35 | 
            -
             | 
| 36 15 | 
             
              view :modal, wrap: :modal do
         | 
| 37 16 | 
             
                ""
         | 
| 38 17 | 
             
              end
         | 
| @@ -57,7 +36,7 @@ format :html do | |
| 57 36 | 
             
                [close_modal_window, pop_out_modal_window]
         | 
| 58 37 | 
             
              end
         | 
| 59 38 |  | 
| 60 | 
            -
              wrapper :modal_menu, :div, class: "modal-menu  | 
| 39 | 
            +
              wrapper :modal_menu, :div, class: "modal-menu _modal-menu ms-auto"
         | 
| 61 40 |  | 
| 62 41 | 
             
              view :modal_title, unknown: true do
         | 
| 63 42 | 
             
                ""
         | 
| @@ -65,8 +44,8 @@ format :html do | |
| 65 44 |  | 
| 66 45 | 
             
              view :modal_footer, unknown: true do
         | 
| 67 46 | 
             
                button_tag "Close",
         | 
| 68 | 
            -
                           class: "btn-xs _close-modal float- | 
| 69 | 
            -
                           "data-dismiss" => "modal"
         | 
| 47 | 
            +
                           class: "btn-xs _close-modal float-end",
         | 
| 48 | 
            +
                           "data-bs-dismiss" => "modal"
         | 
| 70 49 | 
             
              end
         | 
| 71 50 |  | 
| 72 51 | 
             
              view :modal_link do
         | 
| @@ -105,16 +84,42 @@ format :html do | |
| 105 84 | 
             
              end
         | 
| 106 85 |  | 
| 107 86 | 
             
              def normalize_modal_size_class size
         | 
| 108 | 
            -
                size.in?(MODAL_SIZE.keys) ? size :  | 
| 87 | 
            +
                size.in?(MODAL_SIZE.keys) ? size : cast_modal_option(size)
         | 
| 109 88 | 
             
              end
         | 
| 110 89 |  | 
| 111 90 | 
             
              def close_modal_window
         | 
| 112 91 | 
             
                link_to icon_tag(:close), path: "",
         | 
| 113 | 
            -
                                          class: "_close-modal close",
         | 
| 114 | 
            -
                                          "data-dismiss": "modal"
         | 
| 92 | 
            +
                                          class: "_close-modal btn-close",
         | 
| 93 | 
            +
                                          "data-bs-dismiss": "modal"
         | 
| 115 94 | 
             
              end
         | 
| 116 95 |  | 
| 117 96 | 
             
              def pop_out_modal_window
         | 
| 118 | 
            -
                 | 
| 97 | 
            +
                return unless card.known?
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                link_to icon_tag(:new_window), path: {}, class: "pop-out-modal btn-close"
         | 
| 100 | 
            +
              end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              private
         | 
| 103 | 
            +
             | 
| 104 | 
            +
              def normalize_modal_option key, opts
         | 
| 105 | 
            +
                val = opts[key]
         | 
| 106 | 
            +
                return render("modal_#{key}") unless val
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                cast_modal_option val
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
             | 
| 111 | 
            +
              def cast_modal_option val
         | 
| 112 | 
            +
                case val
         | 
| 113 | 
            +
                when Symbol
         | 
| 114 | 
            +
                  cast_modal_option_symbol val
         | 
| 115 | 
            +
                when Proc
         | 
| 116 | 
            +
                  val.call(self)
         | 
| 117 | 
            +
                else
         | 
| 118 | 
            +
                  val
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
             | 
| 122 | 
            +
              def cast_modal_option_symbol val
         | 
| 123 | 
            +
                respond_to?(val) ? send(val) : val
         | 
| 119 124 | 
             
              end
         | 
| 120 125 | 
             
            end
         | 
    
        data/set/all/navbar_links.rb
    CHANGED
    
    
    
        data/set/all/overlay.rb
    CHANGED
    
    | @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            format :html do
         | 
| 2 2 | 
             
              OVERLAY_CLOSE_OPTS = { class: "_close-overlay btn-sm",
         | 
| 3 | 
            -
                                     "data-dismiss": "overlay",
         | 
| 3 | 
            +
                                     "data-bs-dismiss": "overlay",
         | 
| 4 4 | 
             
                                     type: "button" }.freeze
         | 
| 5 5 |  | 
| 6 6 | 
             
              wrapper :overlay do |opts|
         | 
| 7 7 | 
             
                class_up "card-slot", "_overlay d0-card-overlay bg-body", :single_use
         | 
| 8 | 
            -
                @ | 
| 8 | 
            +
                @set_keys = true
         | 
| 9 9 | 
             
                voo.hide! :menu
         | 
| 10 10 | 
             
                overlay_frame true, overlay_header(opts[:title]), opts[:slot] do
         | 
| 11 11 | 
             
                  interior
         | 
| @@ -21,7 +21,7 @@ format :html do | |
| 21 21 | 
             
              end
         | 
| 22 22 |  | 
| 23 23 | 
             
              view :overlay_menu do
         | 
| 24 | 
            -
                wrap_with :div, class: "btn-group btn-group-sm align-self-start  | 
| 24 | 
            +
                wrap_with :div, class: "btn-group btn-group-sm align-self-start ms-auto" do
         | 
| 25 25 | 
             
                  [render_overlay_help_link, slotify_overlay_link, close_overlay_link]
         | 
| 26 26 | 
             
                end
         | 
| 27 27 | 
             
              end
         | 
| @@ -48,7 +48,7 @@ format :html do | |
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 50 | 
             
              def close_overlay_link
         | 
| 51 | 
            -
                overlay_menu_link :close, path: "#", "data-dismiss": "overlay"
         | 
| 51 | 
            +
                overlay_menu_link :close, path: "#", "data-bs-dismiss": "overlay"
         | 
| 52 52 | 
             
              end
         | 
| 53 53 |  | 
| 54 54 | 
             
              def overlay_close_button link_text="Close", opts={}
         | 
| @@ -68,7 +68,7 @@ format :html do | |
| 68 68 | 
             
              end
         | 
| 69 69 |  | 
| 70 70 | 
             
              def overlay_menu_link icon, args={}
         | 
| 71 | 
            -
                add_class args, "border-light text-dark p-1  | 
| 71 | 
            +
                add_class args, "border-light text-dark p-1 ms-1"
         | 
| 72 72 | 
             
                button_link fa_icon(icon, class: "fa-lg"), args.merge(btn_type: "outline-secondary")
         | 
| 73 73 | 
             
              end
         | 
| 74 74 |  | 
    
        data/set/all/process_layout.rb
    CHANGED
    
    
| @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            .pointer-checkbox
         | 
| 1 | 
            +
            .pointer-checkbox.dropdown-item
         | 
| 2 2 | 
             
              = check_box_tag "pointer_checkbox-#{unique_id}", option_name, checked,
         | 
| 3 | 
            -
                              id: id, class: "pointer-checkbox-button _submit-on-change"
         | 
| 3 | 
            +
                              id: id, class: "pointer-checkbox-button _submit-on-change me-2"
         | 
| 4 4 | 
             
              = link_to_card option_name
         | 
    
        data/set/right/enabled_roles.rb
    CHANGED
    
    
    
        data/set/right/layout.rb
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            assign_type :pointer
         | 
    
        data/set/self/account_links.rb
    CHANGED
    
    | @@ -5,6 +5,8 @@ def ok_to_read | |
| 5 5 | 
             
            end
         | 
| 6 6 |  | 
| 7 7 | 
             
            format :html do
         | 
| 8 | 
            +
              delegate :signed_in?, to: Card::Auth
         | 
| 9 | 
            +
             | 
| 8 10 | 
             
              view :core, cache: :never do
         | 
| 9 11 | 
             
                status_class = Auth.signed_in? ? "logged-in" : "logged-out"
         | 
| 10 12 | 
             
                wrap_with :div, id: "logging", class: status_class do
         | 
| @@ -14,47 +16,45 @@ format :html do | |
| 14 16 |  | 
| 15 17 | 
             
              def navbar_items
         | 
| 16 18 | 
             
                # removed invite for now
         | 
| 17 | 
            -
                 | 
| 18 | 
            -
                   | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 19 | 
            +
                navbar_item_views.map do |link_view|
         | 
| 20 | 
            +
                  rendered = render link_view
         | 
| 21 | 
            +
                  wrap_with_nav_item rendered if rendered
         | 
| 22 | 
            +
                end.compact
         | 
| 23 | 
            +
              end
         | 
| 21 24 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                end
         | 
| 25 | 
            +
              def navbar_item_views
         | 
| 26 | 
            +
                %i[my_card sign_out sign_up sign_in]
         | 
| 25 27 | 
             
              end
         | 
| 26 28 |  | 
| 27 | 
            -
              def self.link_options  | 
| 28 | 
            -
                 | 
| 29 | 
            -
                options[:perms] = block if block_given?
         | 
| 30 | 
            -
                options.clone
         | 
| 29 | 
            +
              def self.link_options perms
         | 
| 30 | 
            +
                { denial: :blank, cache: :never, perms: perms }
         | 
| 31 31 | 
             
              end
         | 
| 32 32 |  | 
| 33 | 
            -
              view :sign_up, link_options( | 
| 33 | 
            +
              view :sign_up, link_options(:show_signup_link?) do
         | 
| 34 34 | 
             
                link_to_card :signup, account_link_text(:sign_up),
         | 
| 35 35 | 
             
                             class: nav_link_class("signup-link"),
         | 
| 36 36 | 
             
                             path: { action: :new, mark: :signup }
         | 
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 | 
            -
              view | 
| 39 | 
            +
              view :sign_in, link_options(:not_signed_in?) do
         | 
| 40 40 | 
             
                link_to_card :signin, account_link_text(:sign_in),
         | 
| 41 41 | 
             
                             class: nav_link_class("signin-link")
         | 
| 42 42 | 
             
              end
         | 
| 43 43 |  | 
| 44 | 
            -
              view | 
| 44 | 
            +
              view :sign_out, link_options(:signed_in?) do
         | 
| 45 45 | 
             
                link_to_card :signin, account_link_text(:sign_out),
         | 
| 46 46 | 
             
                             class: nav_link_class("signout-link"),
         | 
| 47 47 | 
             
                             path: { action: :delete }
         | 
| 48 48 | 
             
              end
         | 
| 49 49 |  | 
| 50 | 
            -
              view :invite, link_options( | 
| 50 | 
            +
              view :invite, link_options(:show_invite_link?) do
         | 
| 51 51 | 
             
                link_to_card :signup, account_link_text(:invite),
         | 
| 52 52 | 
             
                             class: nav_link_class("invite-link"),
         | 
| 53 53 | 
             
                             path: { action: :new, mark: :signup }
         | 
| 54 54 | 
             
              end
         | 
| 55 55 |  | 
| 56 | 
            -
              view | 
| 57 | 
            -
                can_disable_roles? ? interactive_roles_dropdown :  | 
| 56 | 
            +
              view :my_card, link_options(:signed_in?) do
         | 
| 57 | 
            +
                can_disable_roles? ? interactive_roles_dropdown : account_dropdown
         | 
| 58 58 | 
             
              end
         | 
| 59 59 |  | 
| 60 60 | 
             
              def interactive_roles_dropdown
         | 
| @@ -62,10 +62,6 @@ format :html do | |
| 62 62 | 
             
                     view: :edit_inline, hide: %i[edit_inline_buttons name_formgroup]
         | 
| 63 63 | 
             
              end
         | 
| 64 64 |  | 
| 65 | 
            -
              def simple_roles_dropdown
         | 
| 66 | 
            -
                account_dropdown(&method(:link_to_card))
         | 
| 67 | 
            -
              end
         | 
| 68 | 
            -
             | 
| 69 65 | 
             
              def enabled_roles_card
         | 
| 70 66 | 
             
                Auth.current.fetch :enabled_roles, new: { type_id: SessionID }
         | 
| 71 67 | 
             
              end
         | 
| @@ -87,8 +83,12 @@ format :html do | |
| 87 83 | 
             
                "nav-link #{classy(type)}"
         | 
| 88 84 | 
             
              end
         | 
| 89 85 |  | 
| 86 | 
            +
              def not_signed_in?
         | 
| 87 | 
            +
                !Auth.signed_in?
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 90 | 
             
              def show_signup_link?
         | 
| 91 | 
            -
                 | 
| 91 | 
            +
                not_signed_in? && Card.new(type: :signup).ok?(:create)
         | 
| 92 92 | 
             
              end
         | 
| 93 93 |  | 
| 94 94 | 
             
              def show_invite_link?
         | 
    
        data/set/type/html.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: card-mod-layout
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.15.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ethan McCutchen
         | 
| @@ -10,7 +10,7 @@ authors: | |
| 10 10 | 
             
            autorequire:
         | 
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 | 
            -
            date:  | 
| 13 | 
            +
            date: 2023-01-04 00:00:00.000000000 Z
         | 
| 14 14 | 
             
            dependencies:
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 16 16 | 
             
              name: card
         | 
| @@ -18,42 +18,56 @@ dependencies: | |
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - '='
         | 
| 20 20 | 
             
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            -
                    version: 1. | 
| 21 | 
            +
                    version: 1.105.0
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 24 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 25 | 
             
                requirements:
         | 
| 26 26 | 
             
                - - '='
         | 
| 27 27 | 
             
                  - !ruby/object:Gem::Version
         | 
| 28 | 
            -
                    version: 1. | 
| 28 | 
            +
                    version: 1.105.0
         | 
| 29 29 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 30 30 | 
             
              name: card-mod-account
         | 
| 31 31 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 32 32 | 
             
                requirements:
         | 
| 33 33 | 
             
                - - '='
         | 
| 34 34 | 
             
                  - !ruby/object:Gem::Version
         | 
| 35 | 
            -
                    version: 0. | 
| 35 | 
            +
                    version: 0.15.0
         | 
| 36 36 | 
             
              type: :runtime
         | 
| 37 37 | 
             
              prerelease: false
         | 
| 38 38 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 39 39 | 
             
                requirements:
         | 
| 40 40 | 
             
                - - '='
         | 
| 41 41 | 
             
                  - !ruby/object:Gem::Version
         | 
| 42 | 
            -
                    version: 0. | 
| 42 | 
            +
                    version: 0.15.0
         | 
| 43 43 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 44 44 | 
             
              name: card-mod-session
         | 
| 45 45 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 46 46 | 
             
                requirements:
         | 
| 47 47 | 
             
                - - '='
         | 
| 48 48 | 
             
                  - !ruby/object:Gem::Version
         | 
| 49 | 
            -
                    version: 0. | 
| 49 | 
            +
                    version: 0.15.0
         | 
| 50 50 | 
             
              type: :runtime
         | 
| 51 51 | 
             
              prerelease: false
         | 
| 52 52 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 53 53 | 
             
                requirements:
         | 
| 54 54 | 
             
                - - '='
         | 
| 55 55 | 
             
                  - !ruby/object:Gem::Version
         | 
| 56 | 
            -
                    version: 0. | 
| 56 | 
            +
                    version: 0.15.0
         | 
| 57 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 58 | 
            +
              name: card-mod-tabs
         | 
| 59 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 60 | 
            +
                requirements:
         | 
| 61 | 
            +
                - - '='
         | 
| 62 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 63 | 
            +
                    version: 0.15.0
         | 
| 64 | 
            +
              type: :runtime
         | 
| 65 | 
            +
              prerelease: false
         | 
| 66 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 67 | 
            +
                requirements:
         | 
| 68 | 
            +
                - - '='
         | 
| 69 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 70 | 
            +
                    version: 0.15.0
         | 
| 57 71 | 
             
            description: ''
         | 
| 58 72 | 
             
            email:
         | 
| 59 73 | 
             
            - info@decko.org
         | 
| @@ -61,6 +75,15 @@ executables: [] | |
| 61 75 | 
             
            extensions: []
         | 
| 62 76 | 
             
            extra_rdoc_files: []
         | 
| 63 77 | 
             
            files:
         | 
| 78 | 
            +
            - assets/script/layout.js.coffee
         | 
| 79 | 
            +
            - assets/script/modal.js.coffee
         | 
| 80 | 
            +
            - assets/script/overlay.js.coffee
         | 
| 81 | 
            +
            - assets/style/layout.scss
         | 
| 82 | 
            +
            - assets/style/modal.scss
         | 
| 83 | 
            +
            - assets/style/overlay.scss
         | 
| 84 | 
            +
            - data/files/mod_layout_script_asset_output/file.js
         | 
| 85 | 
            +
            - data/real.yml
         | 
| 86 | 
            +
            - data/test.yml
         | 
| 64 87 | 
             
            - lib/card/layout.rb
         | 
| 65 88 | 
             
            - lib/card/layout/card_layout.rb
         | 
| 66 89 | 
             
            - lib/card/layout/code_layout.rb
         | 
| @@ -70,7 +93,7 @@ files: | |
| 70 93 | 
             
            - locales/en.yml
         | 
| 71 94 | 
             
            - set/abstract/account_dropdown.rb
         | 
| 72 95 | 
             
            - set/abstract/items.rb
         | 
| 73 | 
            -
            - set/abstract/ | 
| 96 | 
            +
            - set/abstract/list.rb
         | 
| 74 97 | 
             
            - set/all/alert.rb
         | 
| 75 98 | 
             
            - set/all/layouts.rb
         | 
| 76 99 | 
             
            - set/all/modal.rb
         | 
| @@ -79,17 +102,17 @@ files: | |
| 79 102 | 
             
            - set/all/overlay.rb
         | 
| 80 103 | 
             
            - set/all/overlay/overlay_header.haml
         | 
| 81 104 | 
             
            - set/all/process_layout.rb
         | 
| 82 | 
            -
            - set/all/tabs.rb
         | 
| 83 105 | 
             
            - set/right/enabled_roles.rb
         | 
| 84 106 | 
             
            - set/right/enabled_roles/role_checkbox.haml
         | 
| 85 107 | 
             
            - set/right/head.rb
         | 
| 108 | 
            +
            - set/right/layout.rb
         | 
| 86 109 | 
             
            - set/self/account_links.rb
         | 
| 87 110 | 
             
            - set/self/alerts.rb
         | 
| 88 111 | 
             
            - set/self/dropdown_divider.rb
         | 
| 89 112 | 
             
            - set/self/foot.rb
         | 
| 90 113 | 
             
            - set/self/head.rb
         | 
| 91 114 | 
             
            - set/self/layout.rb
         | 
| 92 | 
            -
            - set/self/ | 
| 115 | 
            +
            - set/self/layout_options.rb
         | 
| 93 116 | 
             
            - set/self/sidebar.rb
         | 
| 94 117 | 
             
            - set/type/html.rb
         | 
| 95 118 | 
             
            - set/type/layout_type.rb
         | 
| @@ -103,6 +126,7 @@ metadata: | |
| 103 126 | 
             
              wiki_uri: https://decko.org
         | 
| 104 127 | 
             
              documentation_url: http://docs.decko.org/
         | 
| 105 128 | 
             
              card-mod: layout
         | 
| 129 | 
            +
              card-mod-group: gem-defaults
         | 
| 106 130 | 
             
            post_install_message:
         | 
| 107 131 | 
             
            rdoc_options: []
         | 
| 108 132 | 
             
            require_paths:
         | 
| @@ -118,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 118 142 | 
             
                - !ruby/object:Gem::Version
         | 
| 119 143 | 
             
                  version: '0'
         | 
| 120 144 | 
             
            requirements: []
         | 
| 121 | 
            -
            rubygems_version: 3. | 
| 145 | 
            +
            rubygems_version: 3.3.11
         | 
| 122 146 | 
             
            signing_key:
         | 
| 123 147 | 
             
            specification_version: 4
         | 
| 124 148 | 
             
            summary: decko layouts
         | 
    
        data/set/all/tabs.rb
    DELETED
    
    | @@ -1,52 +0,0 @@ | |
| 1 | 
            -
            format :html do
         | 
| 2 | 
            -
              view :tabs do
         | 
| 3 | 
            -
                construct_tabs "tabs"
         | 
| 4 | 
            -
              end
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              def construct_tabs tab_type
         | 
| 7 | 
            -
                tabs = { active: {}, paths: {} }
         | 
| 8 | 
            -
                voo.items[:view] ||= :content
         | 
| 9 | 
            -
                card.each_item_name_with_options(_render_raw) do |name, options|
         | 
| 10 | 
            -
                  construct_tab tabs, name, options
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
                tabs tabs[:paths], tabs[:active][:name], tab_type: tab_type, load: :lazy do
         | 
| 13 | 
            -
                  tabs[:active][:content]
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              def construct_tab tabs, name, explicit_options
         | 
| 18 | 
            -
                tab_options = item_view_options explicit_options
         | 
| 19 | 
            -
                tabs[:paths][name] = {
         | 
| 20 | 
            -
                  title: nest(name, view: :title, title: tab_options[:title]),
         | 
| 21 | 
            -
                  path: nest_path(name, tab_options).html_safe
         | 
| 22 | 
            -
                }
         | 
| 23 | 
            -
                return unless tabs[:active].empty?
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                tabs[:active] = { name: name, content: nest(name, tab_options) }
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
              # def tab_title title, name
         | 
| 29 | 
            -
              #   return name unless title
         | 
| 30 | 
            -
              #   name.to_name.title title, @context_names
         | 
| 31 | 
            -
              # end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
              view :pills do
         | 
| 34 | 
            -
                construct_tabs "pills"
         | 
| 35 | 
            -
              end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
              view :tabs_static do
         | 
| 38 | 
            -
                construct_static_tabs "tabs"
         | 
| 39 | 
            -
              end
         | 
| 40 | 
            -
             | 
| 41 | 
            -
              view :pills_static do
         | 
| 42 | 
            -
                construct_static_tabs "pills"
         | 
| 43 | 
            -
              end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
              def construct_static_tabs tab_type
         | 
| 46 | 
            -
                tabs = {}
         | 
| 47 | 
            -
                card.item_cards.each do |item|
         | 
| 48 | 
            -
                  tabs[item.name] = nest item, item_view_options(args)
         | 
| 49 | 
            -
                end
         | 
| 50 | 
            -
                tabs tabs, nil, tab_type: tab_type
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
            end
         | 
    
        data/set/self/navbox.rb
    DELETED
    
    | @@ -1,33 +0,0 @@ | |
| 1 | 
            -
            format :html do
         | 
| 2 | 
            -
              view :navbox, cache: :never do
         | 
| 3 | 
            -
                select_tag "query[keyword]", "", class: "_navbox navbox form-control w-100",
         | 
| 4 | 
            -
                                                 placeholder: navbar_placeholder
         | 
| 5 | 
            -
              end
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              view :navbar do
         | 
| 8 | 
            -
                # FIXME: not bootstrap class here.
         | 
| 9 | 
            -
                class_up "navbox-form", "form-inline"
         | 
| 10 | 
            -
                render_core
         | 
| 11 | 
            -
              end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
              view :core do
         | 
| 14 | 
            -
                form_tag path(mark: :search), method: "get", role: "search",
         | 
| 15 | 
            -
                                              class: classy("navbox-form", "nodblclick") do
         | 
| 16 | 
            -
                  wrap_with :div, class: "form-group w-100" do
         | 
| 17 | 
            -
                    render_navbox
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
              # def initial_options
         | 
| 23 | 
            -
              #   return "" unless (keyword = params.dig :query, :keyword)
         | 
| 24 | 
            -
              #   options_for_select [keyword]
         | 
| 25 | 
            -
              # end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
              # TODO: the more natural placeholder would be the content of the navbox card, no?
         | 
| 28 | 
            -
              # Also, the forced division of "raw" and "core" should probably be replaced
         | 
| 29 | 
            -
              # with a single haml template (for core view)
         | 
| 30 | 
            -
              def navbar_placeholder
         | 
| 31 | 
            -
                @placeholder ||= Card[:navbox, "*placeholder"]&.content || "Search"
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
            end
         |