[UI] CC-4031: change from Action, a and button to hds::Button (#16251)

This commit is contained in:
Valeriia Ruban 2023-02-22 13:05:15 -08:00 committed by GitHub
parent 2d75b88eb3
commit d01ee172ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
82 changed files with 1270 additions and 821 deletions

3
.changelog/16251.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:improvement
ui: update from <button> and <a> to design-system-components button <Hds::Button>
```

View File

@ -64,11 +64,11 @@
</AuthForm> </AuthForm>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<Action <Hds::Button
{{on "click" modal.close}} @color='secondary'
> @text='Continue without logging in'
Continue without logging in {{on 'click' modal.close}}
</Action> />
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
</:unauthorized> </:unauthorized>
@ -106,11 +106,11 @@
</AuthForm> </AuthForm>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<Action <Hds::Button
@color='secondary'
@text='Continue without logging in'
{{on 'click' modal.close}} {{on 'click' modal.close}}
> />
Continue without logging in
</Action>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
<Portal @target="app-before-skip-links"> <Portal @target="app-before-skip-links">

View File

@ -47,11 +47,14 @@
<dd>{{@item.ID}}</dd> <dd>{{@item.ID}}</dd>
<dt>Node</dt> <dt>Node</dt>
<dd> <dd>
<a <Hds::Button
href={{href-to 'dc.nodes.show' @item.Node}} @text={{@item.Node}}
> @icon='git-commit'
{{@item.Node}} @href={{href-to 'dc.nodes.show' @item.Node}}
</a> @isHrefExternal={{false}}
@size='small'
@color='tertiary'
/>
</dd> </dd>
<dt>Delay</dt> <dt>Delay</dt>
<dd>{{duration-from @item.LockDelay}}</dd> <dd>{{duration-from @item.LockDelay}}</dd>
@ -74,30 +77,30 @@
{{#if (can 'delete session' item=@item)}} {{#if (can 'delete session' item=@item)}}
<ConfirmationDialog @message="Are you sure you want to invalidate this Lock Session?"> <ConfirmationDialog @message="Are you sure you want to invalidate this Lock Session?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<Action <Hds::Button
@text='Invalidate Session'
@color='critical'
data-test-delete data-test-delete
class="type-delete"
{{on 'click' (fn confirm (fn writer.delete @item))}} {{on 'click' (fn confirm (fn writer.delete @item))}}
> />
Invalidate Session
</Action>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<p> <p>
{{message}} {{message}}
</p> </p>
<Action <Hds::ButtonSet>
class="type-delete" <Hds::Button
@text='Confirm Invalidation'
@color='critical'
data-test-delete
{{on 'click' (fn execute)}} {{on 'click' (fn execute)}}
> />
Confirm Invalidation <Hds::Button
</Action> @text='Cancel'
<Action @color='secondary'
class="type-cancel"
{{on 'click' (fn cancel)}} {{on 'click' (fn cancel)}}
> />
Cancel </Hds::ButtonSet>
</Action>
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}

View File

@ -81,30 +81,30 @@ as |item index|>
@message="Are you sure you want to invalidate this session?" @message="Are you sure you want to invalidate this session?"
> >
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<Action <Hds::Button
@text='Invalidate'
@color='critical'
data-test-delete data-test-delete
class="type-delete"
{{on 'click' (fn confirm (fn @ondelete item))}} {{on 'click' (fn confirm (fn @ondelete item))}}
> />
Invalidate
</Action>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<p> <p>
{{message}} {{message}}
</p> </p>
<Action <Hds::ButtonSet>
class="type-delete" <Hds::Button
@text='Confirm Invalidate'
@color='critical'
data-test-delete
{{on 'click' (fn execute)}} {{on 'click' (fn execute)}}
> />
Confirm Invalidate <Hds::Button
</Action> @text='Cancel'
<Action @color='secondary'
class="type-cancel"
{{on 'click' (fn cancel)}} {{on 'click' (fn cancel)}}
> />
Cancel </Hds::ButtonSet>
</Action>
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
</BlockSlot> </BlockSlot>

View File

@ -85,21 +85,23 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<Action <Hds::Link::Standalone
@text='Documentation on Lock Sessions'
@href="{{env 'CONSUL_DOCS_URL'}}/internals/sessions.html" @href="{{env 'CONSUL_DOCS_URL'}}/internals/sessions.html"
@external={{true}} @icon='docs-link'
> @iconPosition='trailing'
Documentation on Lock Sessions @size='small'
</Action> />
</li> </li>
<li class="learn-link"> <li>
<Action <Hds::Link::Standalone
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/tutorials/consul/distributed-semaphore" @text='Take the tutorial'
@external={{true}} @href='{{env 'CONSUL_DOCS_LEARN_URL'}}/tutorials/consul/distributed-semaphore'
> @icon='learn-link'
Take the tutorial @iconPosition='trailing'
</Action> @size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>

View File

@ -102,25 +102,29 @@
</fieldset> </fieldset>
{{/if}} {{/if}}
<div> <div>
<Hds::ButtonSet>
{{#if (and (is "new nspace" item=item) (can "create nspaces"))}} {{#if (and (is "new nspace" item=item) (can "create nspaces"))}}
<Action <Hds::Button
@type="submit" type="submit"
{{disabled disabled={{or
(or
(is "pristine nspace" item=item) (is "pristine nspace" item=item)
(state-matches state "error") (state-matches state "error")
)
}} }}
> @text='Save'
Save />
</Action>
{{else if (can "write nspace" item=item)}} {{else if (can "write nspace" item=item)}}
<Action @type="submit">Save</Action> <Hds::Button
type='submit'
@text='Save'
/>
{{/if}} {{/if}}
<Action @type="reset" {{on "click" (fn this.onCancel item)}}> <Hds::Button
Cancel type='reset'
</Action> @color='secondary'
@text='Cancel'
{{on 'click' (fn this.onCancel item)}}
/>
{{#if {{#if
(and (and
@ -132,13 +136,12 @@
@message="Are you sure you want to delete this Namespace?" @message="Are you sure you want to delete this Namespace?"
> >
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<Action <Hds::Button
data-test-delete data-test-delete
class="type-delete" @color='critical'
@text='Delete'
{{on "click" (fn confirm (fn writer.delete item))}} {{on "click" (fn confirm (fn writer.delete item))}}
> />
Delete
</Action>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<DeleteConfirmation <DeleteConfirmation
@ -149,7 +152,7 @@
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</StateChart> </StateChart>
</form> </form>

View File

@ -49,7 +49,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can "create nspaces")}} {{#if (can "create nspaces")}}
<a data-test-create href="{{href-to 'dc.nspaces.create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.nspaces.create'
data-test-create
/>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">
@ -117,11 +121,23 @@ as |route|>
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/namespace" rel="noopener noreferrer" target="_blank">Documentation on namespaces</a> <Hds::Link::Standalone
@text='Documentation on namespaces'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/namespace"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/namespaces/secure-namespaces" rel="noopener noreferrer" target="_blank">Read the guide</a> <Hds::Link::Standalone
@text='Read the guide'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/namespaces/secure-namespaces"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -84,34 +84,37 @@ as |State Guard ChartAction dispatch state|>
</fieldset> </fieldset>
<div> <div>
{{#if (and (is "new partition" item=item) (can "create partitions")) }} <Hds::ButtonSet>
<Action
@type="submit"
{{disabled (or (is "pristine partition" item=item) (state-matches state "error"))}}
>
Save
</Action>
{{else if (not readOnly)}}
<Action @type="submit">Save</Action>
{{/if}}
<Action
@type="reset" {{#if (and (is "new partition" item=item) (can "create partitions")) }}
{{on 'click' (if @oncancel (fn @oncancel item) (fn @onsubmit item))}} <Hds::Button
> @text='Save'
Cancel type='submit'
</Action> disabled={{or (is "pristine partition" item=item) (state-matches state "error")}}
/>
{{else if (not readOnly)}}
<Hds::Button
@text='Save'
type='submit'
/>
{{/if}}
<Hds::Button
@text='Cancel'
type='reset'
@color='secondary'
{{on 'click' (if @oncancel (fn (optional @oncancel item)) (fn (optional @onsubmit item)))}}
/>
{{#if (and (not (is "new partition" item=item)) (can "delete partition" item=item))}} {{#if (and (not (is "new partition" item=item)) (can "delete partition" item=item))}}
<ConfirmationDialog @message="Are you sure you want to delete this Partition?"> <ConfirmationDialog @message="Are you sure you want to delete this Partition?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<Action <Hds::Button
@text='Delete'
data-test-delete data-test-delete
class="type-delete" @color='critical'
{{on 'click' (fn confirm (fn writer.delete item))}} {{on 'click' (fn confirm (fn writer.delete item))}}
> />
Delete
</Action>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<DeleteConfirmation <DeleteConfirmation
@ -122,7 +125,7 @@ as |State Guard ChartAction dispatch state|>
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</StateChart> </StateChart>

View File

@ -49,13 +49,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can 'create partitions')}} {{#if (can 'create partitions')}}
<a <Hds::Button
@text='Create'
@route='dc.partitions.create'
data-test-create data-test-create
class="type-create" />
href="{{href-to 'dc.partitions.create'}}"
>
Create
</a>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">

View File

@ -8,7 +8,7 @@
as |address index| as |address index|
> >
<li <li
class="px-3 h-12 hds-border-primary border-t-0 border-l-0 border-r-0 flex items-center justify-between group" class="px-3 h-12 border-bottom-primary flex items-center justify-between group"
> >
<div <div
class="hds-typography-display-300 text-hds-foreground-strong hds-font-weight-semibold" class="hds-typography-display-300 text-hds-foreground-strong hds-font-weight-semibold"

View File

@ -0,0 +1,3 @@
.border-bottom-primary {
border-bottom: 1px solid var(--token-color-border-primary);
}

View File

@ -10,7 +10,7 @@
</div> </div>
<div class="shrink-0"> <div class="shrink-0">
<div <div
class="mb-2 hds-typography-body-200 hds-font-weight-semibold hds-foreground-primary" class="hds-typography-body-200 mb-2 hds-font-weight-semibold hds-foreground-primary"
>Latest heartbeat</div> >Latest heartbeat</div>
<div class="flex items-center"> <div class="flex items-center">
{{#if @peering.LastHeartbeat}} {{#if @peering.LastHeartbeat}}

View File

@ -1,10 +1,7 @@
<Action <Hds::Button
@text='Generate token'
form={{@id}} form={{@id}}
@type="submit" type='submit'
{{disabled (or disabled={{or (eq @item.Name.length 0)}}
(eq @item.Name.length 0)
)}}
...attributes ...attributes
> />
Generate token
</Action>

View File

@ -7,15 +7,6 @@
} }
} }
.consul-peer-form-token-actions {
button:first-of-type {
@extend %primary-button;
}
button:last-of-type {
@extend %secondary-button;
}
}
.consul-peer-form-generate { .consul-peer-form-generate {
& { & {
width: 416px; width: 416px;

View File

@ -1,7 +1,6 @@
<Action <Hds::Button
@text='Add peer'
form={{@id}} form={{@id}}
@type="submit" type='submit'
...attributes ...attributes
> />
Add peer
</Action>

View File

@ -1,18 +1,18 @@
<div <div
class={{class-map
'consul-peer-form-token-actions'
}}
...attributes ...attributes
> >
<Action <Hds::ButtonSet>
<Hds::Button
@text='Copy token'
@color='primary'
...attributes ...attributes
{{with-copyable @token}} {{with-copyable @token}}
> />
Copy token <Hds::Button
</Action> @text='Close'
<Action type='reset'
@color='secondary'
{{on 'click' @onclose}} {{on 'click' @onclose}}
> />
Close </Hds::ButtonSet>
</Action>
</div> </div>

View File

@ -27,11 +27,11 @@
</li> </li>
</ol> </ol>
{{#if (not @regenerate)}} {{#if (not @regenerate)}}
<Action <Hds::Button
@type="reset" @text='Generate another token'
type='reset'
@color='secondary'
{{on "click" @onclick}} {{on "click" @onclick}}
> />
Generate another token
</Action>
{{/if}} {{/if}}

View File

@ -3,4 +3,5 @@
@import './list'; @import './list';
@import './search-bar'; @import './search-bar';
@import './form'; @import './form';
@import './address/list';

View File

@ -90,13 +90,12 @@
<this.form.Actions @onclose={{this.create.close}} /> <this.form.Actions @onclose={{this.create.close}} />
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
<Action <Hds::Button
data-test-create @color='primary'
class="type-create" @text='Add peer connection'
{{on "click" (optional this.create.open)}} {{on "click" (optional this.create.open)}}
> data-test-create
Add peer connection />
</Action>
</BlockSlot> </BlockSlot>
<BlockSlot @name="content"> <BlockSlot @name="content">
@ -194,28 +193,28 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
{{! what's the docs for peering?}} {{! what's the docs for peering?}}
<a <Hds::Link::Standalone
href="{{env @text='Documentation on Peers'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering" }}/connect/cluster-peering"
rel="noopener noreferrer" @icon='docs-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Documentation on Peers />
</a>
</li> </li>
<li class="learn-link"> <li>
<a <Hds::Link::Standalone
href="{{env @text='Take the tutorial'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering/create-manage-peering" }}/connect/cluster-peering/create-manage-peering"
rel="noopener noreferrer" @icon='learn-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Take the tutorial />
</a>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -12,25 +12,27 @@
{{t "routes.dc.peers.show.addresses.empty.body" htmlSafe=true}} {{t "routes.dc.peers.show.addresses.empty.body" htmlSafe=true}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a <Hds::Link::Standalone
href="{{env 'CONSUL_DOCS_URL'}}/connect/cluster-peering" @text='Documentation on Peers'
rel="noopener noreferrer" @href="{{env
target="_blank" 'CONSUL_DOCS_URL'
> }}/connect/cluster-peering"
Documentation on Peers @icon='docs-link'
</a> @iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a <Hds::Link::Standalone
href="{{env @text='Take the tutorial'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering/create-manage-peering" }}/connect/cluster-peering/create-manage-peering"
rel="noopener noreferrer" @icon='learn-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Take the tutorial />
</a>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -54,7 +54,7 @@
as |service index| as |service index|
> >
<li <li
class="px-3 h-12 hds-border-primary border-t-0 border-l-0 border-r-0" class="px-3 h-12 border-bottom-primary"
> >
<a <a
data-test-service-name data-test-service-name
@ -99,27 +99,27 @@
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a <Hds::Link::Standalone
href="{{env @text='Documentation on Peers'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering" }}/connect/cluster-peering"
rel="noopener noreferrer" @icon='docs-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Documentation on Peers />
</a>
</li> </li>
<li class="learn-link"> <li>
<a <Hds::Link::Standalone
href="{{env @text='Take the tutorial'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering/create-manage-peering" }}/connect/cluster-peering/create-manage-peering"
rel="noopener noreferrer" @icon='learn-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Take the tutorial />
</a>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -103,25 +103,28 @@
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a {{! what's the docs for peering?}}
href="{{env 'CONSUL_DOCS_URL'}}/connect/cluster-peering" <Hds::Link::Standalone
rel="noopener noreferrer" @text='Documentation on Peers'
target="_blank" @href="{{env
> 'CONSUL_DOCS_URL'
Documentation on Peers }}/connect/cluster-peering"
</a> @icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a <Hds::Link::Standalone
href="{{env @text='Take the tutorial'
@href="{{env
'CONSUL_DOCS_URL' 'CONSUL_DOCS_URL'
}}/connect/cluster-peering/create-manage-peering" }}/connect/cluster-peering/create-manage-peering"
rel="noopener noreferrer" @icon='learn-link'
target="_blank" @iconPosition='trailing'
> @size='small'
Take the tutorial />
</a>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -20,8 +20,7 @@
@extend %app-view-content; @extend %app-view-content;
} }
%app-view-actions a, %app-view-actions a {
%app-view-actions button {
@extend %button-compact; @extend %button-compact;
} }

View File

@ -109,9 +109,11 @@
</State> </State>
</label> </label>
</fieldset> </fieldset>
<Action @type='submit' disabled={{state-matches state 'loading'}}> <Hds::Button
Log in type='submit'
</Action> @text='Log in'
disabled={{state-matches state 'loading'}}
/>
</form> </form>
</TabState> </TabState>

View File

@ -1,19 +1,2 @@
@import './skin'; @import './skin';
@import './layout'; @import './layout';
button[type='submit'],
button.type-submit,
button.type-create,
a.type-create {
@extend %primary-button;
}
// TODO: Once we move action-groups to use aria menu we can get rid of
// some of this and just use not(aria-haspopup)
button[type='reset'],
button.type-cancel {
@extend %secondary-button;
}
.with-confirmation .type-delete,
.modal-dialog .type-delete,
%app-view-content form button[type='button'].type-delete {
@extend %dangerous-button;
}

View File

@ -11,7 +11,6 @@
cursor: default; cursor: default;
box-shadow: none; box-shadow: none;
} }
%primary-button,
%secondary-button, %secondary-button,
%dangerous-button { %dangerous-button {
@extend %button; @extend %button;
@ -19,20 +18,6 @@
border-radius: var(--decor-radius-100); border-radius: var(--decor-radius-100);
box-shadow: var(--decor-elevation-300); box-shadow: var(--decor-elevation-300);
} }
/* color */
%primary-button {
@extend %frame-blue-800;
}
%primary-button:hover:not(:disabled):not(:active),
%primary-button:focus {
@extend %frame-blue-700;
}
%primary-button:disabled {
@extend %frame-blue-600;
}
%primary-button:hover:active {
@extend %frame-blue-900;
}
/**/ /**/
%secondary-button:hover:not(:disabled):not(:active), %secondary-button:hover:not(:disabled):not(:active),
%secondary-button:focus { %secondary-button:focus {

View File

@ -1,5 +1,6 @@
%confirmation-dialog { %confirmation-dialog {
float: right; justify-content: end;
width: 100%;
} }
%confirmation-dialog-inline p { %confirmation-dialog-inline p {
margin-right: 12px; margin-right: 12px;

View File

@ -15,11 +15,23 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/acl/index.html" rel="noopener noreferrer" target="_blank">Read the documentation</a> <Hds::Link::Standalone
@text='Read the documentation'
@href="{{env 'CONSUL_DOCS_URL'}}/acl/index.html"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/security-networking/production-acls" rel="noopener noreferrer" target="_blank">Follow the guide</a> <Hds::Link::Standalone
@text='Follow the guide'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/security-networking/production-acls"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -189,13 +189,14 @@
</fieldset> </fieldset>
{{#if (eq (or item.Action '') '')}} {{#if (eq (or item.Action '') '')}}
<fieldset class="permissions"> <fieldset class="permissions">
<button <Hds::Button
@text='Add permission'
@size='small'
@color='tertiary'
@icon='plus'
data-test-create-permission data-test-create-permission
type="button"
{{on "click" (action this.openModal)}} {{on "click" (action this.openModal)}}
> />
Add permission
</button>
<h2>Permissions</h2> <h2>Permissions</h2>
{{#if (gt item.Permissions.length 0) }} {{#if (gt item.Permissions.length 0) }}
<Consul::Intention::Notice::Permissions /> <Consul::Intention::Notice::Permissions />
@ -217,11 +218,23 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/intention" rel="noopener noreferrer" target="_blank">Documentation</a> <Hds::Link::Standalone
@text='Documentation'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/intention"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect" rel="noopener noreferrer" target="_blank">Read the guide</a> <Hds::Link::Standalone
@text='Read the guide'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>
@ -249,22 +262,20 @@
</Consul::Intention::Permission::Form> </Consul::Intention::Permission::Form>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<button <Hds::ButtonSet>
type="button" <Hds::Button
@text='Save'
data-test-intention-permission-submit data-test-intention-permission-submit
class="type-submit" @color='primary'
disabled={{if (not this.permissionForm.isDirty) 'disabled'}} disabled={{if (not this.permissionForm.isDirty) 'disabled'}}
onclick={{queue (action this.permissionForm.submit) (action modal.close)}} onclick={{queue (action this.permissionForm.submit) (action modal.close)}}
> />
Save <Hds::Button
</button> @text='Cancel'
<button @color='secondary'
type="button"
class="type-cancel"
onclick={{queue (action this.permissionForm.reset) (action modal.close)}} onclick={{queue (action this.permissionForm.reset) (action modal.close)}}
> />
Cancel </Hds::ButtonSet>
</button>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>

View File

@ -80,22 +80,20 @@ as |item readonly|}}
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions" as |close|> <BlockSlot @name="actions" as |close|>
<button <Hds::ButtonSet>
<Hds::Button
data-test-action-warning-confirm data-test-action-warning-confirm
type="button" @text='Set to {{capitalize newAction}}'
class="dangerous" @color='critical'
{{on 'click' api.submit}} {{on 'click' api.submit}}
> />
Set to {{capitalize newAction}} <Hds::Button
</button>
<button
data-test-action-warning-cancel data-test-action-warning-cancel
type="button" @text='No, Cancel'
class="type-cancel" @color='secondary'
onclick={{close}} onclick={{close}}
> />
No, Cancel </Hds::ButtonSet>
</button>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
{{/let}} {{/let}}
@ -174,32 +172,30 @@ as |item readonly|}}
@onchange={{api.change}} @onchange={{api.change}}
/> />
<div> <div>
<button <Hds::ButtonSet>
type="submit" <Hds::Button
@text='Save'
type='submit'
disabled={{or item.isInvalid api.disabled}} disabled={{or item.isInvalid api.disabled}}
> />
Save <Hds::Button
</button> @text='Cancel'
<button @color='secondary'
type="reset" type="reset"
disabled={{api.disabled}} disabled={{api.disabled}}
{{on 'click' (fn this.oncancel item)}} {{on 'click' (fn this.oncancel item)}}
> />
Cancel
</button>
{{#if (not api.isCreate)}} {{#if (not api.isCreate)}}
{{#if (not-eq item.ID 'anonymous') }} {{#if (not-eq item.ID 'anonymous') }}
<ConfirmationDialog @message="Are you sure you want to delete this Intention?"> <ConfirmationDialog @message="Are you sure you want to delete this Intention?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button <Hds::Button
data-test-delete @text='Delete'
type="button" @color='critical'
class="type-delete"
disabled={{api.disabled}} disabled={{api.disabled}}
{{on 'click' (fn confirm api.delete)}} {{on 'click' (fn confirm api.delete)}}
> data-test-delete
Delete />
</button>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<DeleteConfirmation <DeleteConfirmation
@ -211,6 +207,7 @@ as |item readonly|}}
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</form> </form>
{{else}} {{else}}
@ -231,9 +228,12 @@ as |item readonly|}}
</p> </p>
</notice.Body> </notice.Body>
<notice.Footer> <notice.Footer>
<p> <Hds::Link::Standalone
<a href="{{env 'CONSUL_DOCS_URL'}}/k8s/crds" target="_blank" rel="noopener noreferrer">Learn more about CRDs</a> @text='Learn more about CRDs'
</p> @href="{{env 'CONSUL_DOCS_URL'}}/k8s/crds"
@icon='docs-link'
@iconPosition='trailing'
/>
</notice.Footer> </notice.Footer>
</Notice> </Notice>
{{/if}} {{/if}}

View File

@ -15,7 +15,13 @@ as |notice|>
</notice.Body> </notice.Body>
<notice.Footer> <notice.Footer>
<p> <p>
<a href="{{env 'CONSUL_DOCS_URL'}}/k8s/crds" target="_blank" rel="noopener noreferrer">Learn more about CRDs</a> <Hds::Link::Standalone
@href="{{env 'CONSUL_DOCS_URL'}}/k8s/crds"
@text='Learn more about CRDs'
@icon="docs-link"
@iconPosition="trailing"
@size="small"
/>
</p> </p>
</notice.Footer> </notice.Footer>
</Notice> </Notice>

View File

@ -8,9 +8,13 @@ as |notice|>
</notice.Body> </notice.Body>
<notice.Footer> <notice.Footer>
<p> <p>
<a href="{{env 'CONSUL_DOCS_URL'}}/connect/intentions" target="_blank" rel="noopener noreferrer"> <Hds::Link::Standalone
{{t "components.consul.intention.notice.permissions.footer"}} @text={{t "components.consul.intention.notice.permissions.footer"}}
</a> @href="{{env 'CONSUL_DOCS_URL'}}/connect/intentions"
@icon="docs-link"
@iconPosition="trailing"
@size="small"
/>
</p> </p>
</notice.Footer> </notice.Footer>
</Notice> </Notice>

View File

@ -134,23 +134,20 @@ as |group|>
<Ref @target={{this}} @name="headerForm" @value={{headerForm}} /> <Ref @target={{this}} @name="headerForm" @value={{headerForm}} />
</Consul::Intention::Permission::Header::Form> </Consul::Intention::Permission::Header::Form>
<button <Hds::ButtonSet>
<Hds::Button
data-test-add-header data-test-add-header
type="button" @text='Add{{if (gt (get (changeset-get changeset 'HTTP.Header') 'length') 0) ' another' ''}} header'
class="type-submit" @color='primary'
disabled={{if (not this.headerForm.isDirty) 'disabled'}} disabled={{if (not this.headerForm.isDirty) 'disabled'}}
onclick={{action this.headerForm.submit}} onclick={{action this.headerForm.submit}}
> />
Add{{#if (gt (get (changeset-get changeset 'HTTP.Header') 'length') 0)}} another{{/if}} header <Hds::Button
</button> @text='Cancel'
<button @color='secondary'
type="button"
class="type-cancel"
onclick={{action this.headerForm.reset}} onclick={{action this.headerForm.reset}}
> />
Cancel </Hds::ButtonSet>
</button>
</fieldset> </fieldset>
</FormGroup> </FormGroup>
</div> </div>

View File

@ -61,27 +61,56 @@
</div> </div>
{{/if}} {{/if}}
</fieldset> </fieldset>
<Hds::ButtonSet>
{{#if api.isCreate}} {{#if api.isCreate}}
{{#if (not disabld)}} {{#if (not disabld)}}
<button type="submit" disabled={{or api.data.isPristine api.data.isInvalid api.disabled}}>Save</button> <Hds::Button
{{/if}} @text='Save'
<button type="reset" onclick={{action oncancel api.data}} disabled={{api.disabled}}>Cancel</button> type='submit'
disabled={{or api.data.isPristine api.data.isInvalid api.disabled}}
/>
{{/if}}
<Hds::Button
@text='Cancel'
@color='secondary'
type='reset'
disabled={{api.disabled}}
onclick={{action oncancel api.data}}
/>
{{else}} {{else}}
{{#if (not disabld)}} {{#if (not disabld)}}
<button type="submit" disabled={{or api.data.isInvalid api.disabled}}>Save</button> <Hds::Button
{{/if}} @text='Save'
<button type="reset" onclick={{action oncancel api.data}} disabled={{api.disabled}}>Cancel</button> type='submit'
{{#if (not disabld)}} disabled={{or api.data.isInvalid api.disabled}}
/>
{{/if}}
<Hds::Button
@text='Cancel'
@color='secondary'
type='reset'
disabled={{api.disabled}}
onclick={{action oncancel api.data}}
/>
{{#if (not disabld)}}
<ConfirmationDialog @message="Are you sure you want to delete this key?"> <ConfirmationDialog @message="Are you sure you want to delete this key?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button data-test-delete type="button" class="type-delete" {{action confirm api.delete}} disabled={{api.disabled}}>Delete</button> <Hds::Button
@text='Delete'
@color='critical'
data-test-delete
disabled={{api.disabled}}
{{on 'click' (action confirm api.delete)}}
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<DeleteConfirmation @message={{message}} @execute={{execute}} @cancel={{cancel}} /> <DeleteConfirmation @message={{message}} @execute={{execute}} @cancel={{cancel}} />
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
{{/if}} {{/if}}
</Hds::ButtonSet>
</form> </form>
{{/let}} {{/let}}
</BlockSlot> </BlockSlot>

View File

@ -4,9 +4,13 @@
<h3> <h3>
{{t 'routes.dc.nodes.index.agentless.notice.header'}} {{t 'routes.dc.nodes.index.agentless.notice.header'}}
</h3> </h3>
<button type='button' aria-label='Dismiss notice' {{on 'click' this.dismissAgentlessNotice}}> <Hds::Button
<FlightIcon @name='x' /> @color='secondary'
</button> @text='Dismiss notice'
{{on 'click' this.dismissAgentlessNotice}}
@icon='x'
@isIconOnly={{true}}
/>
</notice.Header> </notice.Header>
<notice.Body> <notice.Body>
<p> <p>
@ -14,15 +18,12 @@
</p> </p>
</notice.Body> </notice.Body>
<notice.Footer> <notice.Footer>
<p class='docs-link'> <Hds::Button
<a @color='tertiary'
href='{{env "CONSUL_DOCS_DEVELOPER_URL"}}/connect/dataplane' @href='{{env "CONSUL_DOCS_DEVELOPER_URL"}}/connect/dataplane'
target='_blank' @text={{t 'routes.dc.nodes.index.agentless.notice.footer'}}
rel='noopener noreferrer' @icon='docs-link'
> />
{{t 'routes.dc.nodes.index.agentless.notice.footer'}}
</a>
</p>
</notice.Footer> </notice.Footer>
</Notice> </Notice>
{{/if}} {{/if}}

View File

@ -1,7 +1,16 @@
<p> <p>
{{message}} {{message}}
</p> </p>
<button type="button" class="type-delete" onclick={{action execute}}> <Hds::ButtonSet>
Confirm Delete <Hds::Button
</button> @text='Confirm Delete'
<button type="button" class="type-cancel" onclick={{action cancel}}>Cancel</button> data-test-delete
@color='critical'
onclick={{action execute}}
/>
<Hds::Button
@text='Cancel'
@color='secondary'
onclick={{action cancel}}
/>
</Hds::ButtonSet>

View File

@ -44,23 +44,23 @@ function.
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a <Hds::Link::Standalone
href="{{env 'CONSUL_DOCS_URL'}}/agent/kv" @text='Documentation on namespaces'
rel="noopener noreferrer" @href="{{env 'CONSUL_DOCS_URL'}}/commands/namespace"
target="_blank" @icon='docs-link'
> @iconPosition='trailing'
Documentation on K/V @size='small'
</a> />
</li> </li>
<li class="learn-link"> <li>
<a <Hds::Link::Standalone
href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/kv" @text='Read the guide'
rel="noopener noreferrer" @href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/namespaces/secure-namespaces"
target="_blank" @icon='learn-link'
> @iconPosition='trailing'
Read the guide @size='small'
</a> />
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -17,7 +17,9 @@
<div> <div>
{{yield}} {{yield}}
{{#if login}} {{#if login}}
<Action <Hds::Button
@color='primary'
@text={{if token.AccessorID 'Log in with a different token' 'Log in'}}
data-test-empty-state-login data-test-empty-state-login
{{on "click" login}} {{on "click" login}}
> >
@ -25,12 +27,7 @@
@src={{uri 'settings://consul:token'}} @src={{uri 'settings://consul:token'}}
@onchange={{action (mut token) value="data"}} @onchange={{action (mut token) value="data"}}
/> />
{{#if token.AccessorID}} </Hds::Button>
Log in with a different token
{{else}}
Log in
{{/if}}
</Action>
{{/if}} {{/if}}
</div> </div>
{{/yield-slot}} {{/yield-slot}}

View File

@ -16,6 +16,3 @@
%empty-state > ul > li > label > button { %empty-state > ul > li > label > button {
@extend %empty-state-anchor; @extend %empty-state-anchor;
} }
%empty-state div > button {
@extend %primary-button;
}

View File

@ -27,21 +27,25 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="back-link"> <li>
<Action <Hds::Link::Standalone
data-test-home data-test-home
@href={{href-to 'index'}} @route='index'
> @text='Go back'
Go back @icon='chevron-left'
</Action> @iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="docs-link"> <li>
<Action <Hds::Link::Standalone
data-test-home
@text='Read the documentation'
@href="{{env 'CONSUL_DOCS_URL'}}" @href="{{env 'CONSUL_DOCS_URL'}}"
@external={{true}} @iconPosition='trailing'
> @icon='docs-link'
Read the documentation @size='small'
</Action> />
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>
@ -68,21 +72,23 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<Action <Hds::Link::Standalone
@text='Read the documentation'
@href="{{env 'CONSUL_DOCS_URL'}}/acl/index.html" @href="{{env 'CONSUL_DOCS_URL'}}/acl/index.html"
@external={{true}} @icon='docs-link'
> @iconPosition='trailing'
Read the documentation @size='small'
</Action> />
</li> </li>
<li class="learn-link"> <li>
<Action <Hds::Link::Standalone
@text='Follow the guide'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/security-networking/production-acls" @href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/security-networking/production-acls"
@external={{true}} @icon='learn-link'
> @iconPosition='trailing'
Follow the guide @size='small'
</Action> />
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -1,6 +1,7 @@
@import './skin'; @import './skin';
@import './layout'; @import './layout';
%form h2 { %form h2,
.modal-dialog-body h2 {
@extend %h200; @extend %h200;
} }
/* TODO: This is positioning the element */ /* TODO: This is positioning the element */
@ -41,9 +42,7 @@ label span {
@extend %form-element-error; @extend %form-element-error;
} }
// TODO: float right here is too specific, this is currently used just for the role/policy selectors // TODO: float right here is too specific, this is currently used just for the role/policy selectors
label.type-dialog { .type-dialog {
@extend %anchor;
cursor: pointer;
float: right; float: right;
} }
.type-toggle { .type-toggle {
@ -69,6 +68,11 @@ span.label {
%main-content .type-text { %main-content .type-text {
@extend %form-element; @extend %form-element;
} }
%main-content .type-select > span,
%main-content .type-password > span,
%main-content label.type-text > span {
line-height: 2.2em;
}
%app-view-content form:not(.filter-bar) [role='radiogroup'], %app-view-content form:not(.filter-bar) [role='radiogroup'],
%modal-window [role='radiogroup'] { %modal-window [role='radiogroup'] {
@extend %radio-group; @extend %radio-group;

View File

@ -20,12 +20,14 @@
role="document" role="document"
> >
<header class="modal-dialog-header"> <header class="modal-dialog-header">
<button <Hds::Button
type="button"
data-a11y-dialog-hide data-a11y-dialog-hide
aria-label="Close dialog" @text='Close dialog'
> @color='secondary'
</button> @icon='x'
@size='small'
@isIconOnly={{true}}
/>
<YieldSlot @name="header"> <YieldSlot @name="header">
{{yield (hash {{yield (hash
open=(action "open") open=(action "open")

View File

@ -63,7 +63,5 @@
} }
%modal-window > header button { %modal-window > header button {
float: right; float: right;
width: 24px;
height: 24px;
margin-top: -3px; margin-top: -3px;
} }

View File

@ -28,7 +28,7 @@
%modal-window > header { %modal-window > header {
@extend %frame-gray-800; @extend %frame-gray-800;
} }
%modal-window > header > * { %modal-window > header > *:not(button) {
@extend %h200; @extend %h200;
} }
@ -46,17 +46,3 @@
%modal-window > header { %modal-window > header {
border-width: 1px; border-width: 1px;
} }
%modal-window > header button {
cursor: pointer;
border: var(--decor-border-100);
/*%frame-gray-050??*/
background-color: rgb(var(--tone-gray-050));
border-color: rgb(var(--tone-gray-300));
border-radius: var(--decor-radius-100);
}
%modal-window > header button::before {
@extend %with-cancel-plain-icon, %as-pseudo;
margin-left: -7px;
margin-top: -3px;
}

View File

@ -49,12 +49,12 @@
{{! this belongs to the outer StateChart but we need }} {{! this belongs to the outer StateChart but we need }}
{{! to understand validation state }} {{! to understand validation state }}
<State @matches='idle'> <State @matches='idle'>
<Action <Hds::Button
{{disabled (or (lt this.partition.length 1) (state-matches state 'error'))}} type='submit'
@text='Choose provider'
disabled={{or (lt this.partition.length 1) (state-matches state 'error')}}
{{on 'click' (fn dispatch 'LOAD')}} {{on 'click' (fn dispatch 'LOAD')}}
> />
Choose provider
</Action>
</State> </State>
</StateChart> </StateChart>
@ -105,10 +105,12 @@
</:option> </:option>
</OptionInput> </OptionInput>
<Action @type='button' {{disabled @disabled}} {{on 'click' (fn @onchange item)}}> <Hds::Button
Log in @color='primary'
</Action> @text='Log in'
disabled={{@disabled}}
{{on 'click' (fn @onchange item)}}
/>
{{/let}} {{/let}}
{{/if}} {{/if}}
</State> </State>

View File

@ -3,9 +3,7 @@
%oidc-select label { %oidc-select label {
@extend %form-element; @extend %form-element;
} }
%oidc-select button:not(.reset) {
@extend %primary-button;
}
%oidc-select button.reset { %oidc-select button.reset {
@extend %anchor; @extend %anchor;
@extend %p3; @extend %p3;

View File

@ -10,20 +10,22 @@
...attributes ...attributes
> >
{{yield}} {{yield}}
<BlockSlot @name="label"> <BlockSlot @name="label" data-test-apply-policy>
Apply an existing policy Apply an existing policy
</BlockSlot> </BlockSlot>
<BlockSlot @name="create"> <BlockSlot @name="create">
{{#yield-slot name='trigger'}} {{#yield-slot name='trigger'}}
{{yield}} {{yield}}
{{else}} {{else}}
<label <Hds::Button
class="type-dialog" @text='Create new policy'
@size='small'
@color='tertiary'
@icon='plus'
class='type-dialog'
data-test-policy-create data-test-policy-create
{{on "click" (action this.openModal)}} {{on "click" (action this.openModal)}}
> />
<span>Create new policy</span>
</label>
{{!TODO: potentially call trigger something else}} {{!TODO: potentially call trigger something else}}
{{!the modal has to go here so that if you provide a slot to trigger it doesn't get rendered}} {{!the modal has to go here so that if you provide a slot to trigger it doesn't get rendered}}
<ModalDialog <ModalDialog
@ -48,16 +50,22 @@
/> />
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions" as |close|> <BlockSlot @name="actions" as |close|>
<button type="submit" <Hds::ButtonSet>
<Hds::Button
type="submit"
@isLoading={{item.isSaving}}
onclick={{perform this.save item items (queue (action close) (action 'reset'))}} onclick={{perform this.save item items (queue (action close) (action 'reset'))}}
disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}} disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}}
> @text='Create and apply'
{{#if item.isSaving }} />
<div class="progress indeterminate"></div> <Hds::Button
{{/if}} type="reset"
<span>Create and apply</span> @color="secondary"
</button> disabled={{if item.isSaving 'disabled'}}
<button type="reset" disabled={{if item.isSaving 'disabled'}} {{action (queue (action close) (action 'reset'))}}>Cancel</button> {{on 'click' (action (queue (action close) (action 'reset')))}}
@text='Cancel'
/>
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
{{/yield-slot}} {{/yield-slot}}
@ -161,15 +169,34 @@
<div> <div>
<ConfirmationDialog @message="Are you sure you want to remove this policy from this token?"> <ConfirmationDialog @message="Are you sure you want to remove this policy from this token?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button data-test-delete type="button" class="type-delete" {{action confirm 'remove' item items}}>Remove</button> <Hds::Button
@text='Remove'
@color='critical'
@size='small'
{{action confirm 'remove' item items}}
data-test-delete
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<p> <p>
{{message}} {{message}}
</p> </p>
<Hds::ButtonSet>
<button type="button" class="type-delete" {{action execute}}>Confirm remove</button> <Hds::Button
<button type="button" class="type-cancel" {{action cancel}}>Cancel</button> @text='Confirm remove'
@color='critical'
@size='small'
{{action execute}}
data-test-delete
/>
<Hds::Button
@text='Cancel'
@color='secondary'
@size='small'
{{action cancel}}
data-test-delete
/>
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
</div> </div>

View File

@ -34,9 +34,15 @@ as |modal|>
@items={{item.Policies}} @items={{item.Policies}}
> >
<BlockSlot @name="trigger"> <BlockSlot @name="trigger">
<label for="{{name}}_state_policy" data-test-create-policy class="type-dialog"> <Hds::Button
<span>Create new policy</span> @text='Create new policy'
</label> @size='small'
@color='tertiary'
@icon='plus'
class='type-dialog'
data-test-create-policy
{{action 'triggerStateCheckboxChange'}}
/>
</BlockSlot> </BlockSlot>
</PolicySelector> </PolicySelector>
@ -56,27 +62,40 @@ as |modal|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions" as |close|> <BlockSlot @name="actions" as |close|>
{{#if (eq state 'role')}} <Hds::ButtonSet>
<button type="submit" {{#if (eq state 'role')}}
<Hds::Button
type='submit'
@text='Create and apply'
@isLoading={{item.isSaving}}
onclick={{perform this.save item items (queue (action close) (action 'reset'))}} onclick={{perform this.save item items (queue (action close) (action 'reset'))}}
disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}} disabled={{if (or item.isSaving item.isPristine item.isInvalid) 'disabled'}}
> />
{{#if item.isSaving }} <Hds::Button
<div class="progress indeterminate"></div> @text='Cancel'
{{/if}} type='reset'
<span>Create and apply</span> @color='secondary'
</button> disabled={{if item.isSaving 'disabled'}}
<button type="reset" disabled={{if item.isSaving 'disabled'}} {{action (queue (action close) (action 'reset'))}}>Cancel</button> {{on 'click' (action (queue (action close) (action 'reset')))}}
{{else}} />
<button type="submit" {{action 'dispatch' 'save' (array policy item.Policies (action (mut state) 'role'))}} disabled={{if (or policy.isSaving policy.isPristine policy.isInvalid) 'disabled'}}>
{{#if policy.isSaving }}
<div class="progress indeterminate"></div>
{{/if}}
<span>Create and apply</span>
</button>
<button type="reset" disabled={{if policy.isSaving 'disabled'}} {{action (mut state) 'role'}}>Cancel</button>
{{/if}}
{{else}}
<Hds::Button
type='submit'
@text='Create and apply'
@isLoading={{policy.isSaving}}
{{action 'dispatch' 'save' (array policy item.Policies (action (mut state) 'role'))}}
disabled={{if (or policy.isSaving policy.isPristine policy.isInvalid) 'disabled'}}
/>
<Hds::Button
@text='Cancel'
type='reset'
@color='secondary'
disabled={{if policy.isSaving 'disabled'}}
{{on 'click' (action (mut state) 'role')}}
/>
{{/if}}
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
@ -94,12 +113,15 @@ as |modal|>
Apply an existing role Apply an existing role
</BlockSlot> </BlockSlot>
<BlockSlot @name="create"> <BlockSlot @name="create">
<label class="type-dialog" <Hds::Button
@text='Create new role'
@size='small'
@color='tertiary'
@icon='plus'
class='type-dialog'
data-test-role-create data-test-role-create
{{on "click" (optional this.modal.open)}} {{on "click" (optional this.modal.open)}}
> />
<span>Create new role</span>
</label>
</BlockSlot> </BlockSlot>
<BlockSlot @name="option" as |option|> <BlockSlot @name="option" as |option|>
{{option.Name}} {{option.Name}}

View File

@ -42,5 +42,11 @@ export default ChildSelectorComponent.extend({
this._super(...arguments); this._super(...arguments);
} }
}, },
triggerStateCheckboxChange() {
//Triggers click event on checkbox
//The function has to be added to change the logic from <label for=''> to Hds::Button
let element = document.getElementById(`${this.name}_state_policy`);
element && element.dispatchEvent(new Event('change'));
},
}, },
}); });

View File

@ -75,7 +75,9 @@ export default Mixin.create({
// do the same as an update, or override // do the same as an update, or override
return this.afterUpdate(...arguments); return this.afterUpdate(...arguments);
}, },
create: function (item) { create: function (item, event) {
event.preventDefault();
return this.feedback.execute( return this.feedback.execute(
() => { () => {
return this.repo.persist(item).then((item) => { return this.repo.persist(item).then((item) => {
@ -88,7 +90,9 @@ export default Mixin.create({
} }
); );
}, },
update: function (item) { update: function (item, event) {
event.preventDefault();
return this.feedback.execute( return this.feedback.execute(
() => { () => {
return this.repo.persist(item).then(() => { return this.repo.persist(item).then(() => {

View File

@ -1,11 +1,11 @@
@charset 'utf-8'; @charset 'utf-8';
/* css for hds */
@import '@hashicorp/design-system-components';
/* tailwind before all the customizations */ /* tailwind before all the customizations */
@import 'tailwind'; @import 'tailwind';
/* css for hds */
@import '@hashicorp/design-system-components';
/* all variables and custom queries including generic base variables */ /* all variables and custom queries including generic base variables */
@import 'variables'; @import 'variables';

View File

@ -1,8 +1,10 @@
a { a {
text-decoration: none; text-decoration: none;
} }
td, th, td,
span, strong { th,
span,
strong {
color: inherit; color: inherit;
} }
/* %typo-body */ /* %typo-body */
@ -19,9 +21,7 @@ html {
hr { hr {
background-color: rgb(var(--tone-gray-200)); background-color: rgb(var(--tone-gray-200));
} }
button {
background-color: var(--transparent);
}
html { html {
font-size: var(--typo-size-000); font-size: var(--typo-size-000);
} }
@ -30,7 +30,6 @@ body {
line-height: 1.5; line-height: 1.5;
} }
body, body,
button,
input, input,
select, select,
textarea { textarea {
@ -69,7 +68,9 @@ html {
html { html {
box-sizing: border-box; box-sizing: border-box;
} }
*, *::before, *::after { *,
*::before,
*::after {
box-sizing: inherit; box-sizing: inherit;
} }
fieldset { fieldset {
@ -85,8 +86,8 @@ hr {
border: none; border: none;
display: block; display: block;
} }
input[type="checkbox"], input[type='checkbox'],
input[type="radio"] { input[type='radio'] {
vertical-align: baseline; vertical-align: baseline;
} }
td, td,

View File

@ -8,9 +8,6 @@ html[data-route^='dc.acls.index'] .filter-bar {
html[data-route^='dc.acls.index'] .filter-bar [role='radiogroup'] { html[data-route^='dc.acls.index'] .filter-bar [role='radiogroup'] {
@extend %expanded-single-select; @extend %expanded-single-select;
} }
html[data-route^='dc.acls.tokens.edit'] header .actions button {
@extend %secondary-button;
}
@media #{$--lt-wide-form} { @media #{$--lt-wide-form} {
html[data-route^='dc.acls.create'] main header .actions, html[data-route^='dc.acls.create'] main header .actions,

View File

@ -53,11 +53,3 @@ section[data-route='dc.show.license'] {
%license-route-learn-more header { %license-route-learn-more header {
margin-bottom: 1rem; /* 16px */ margin-bottom: 1rem; /* 16px */
} }
%license-route-learn-more li {
margin-bottom: 0.25rem; /* 4px */
}
%license-route-learn-more a::before {
--icon-name: icon-docs-link;
content: '';
margin-right: 0.375rem; /* 6px */
}

View File

@ -28,16 +28,16 @@ section[data-route='dc.show.serverstatus'] {
} }
%server-failure-tolerance > header { %server-failure-tolerance > header {
width: 100%; width: 100%;
padding-bottom: 0.500rem; /* 8px */ display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
padding-bottom: 0.5rem; /* 8px */
margin-bottom: 1rem; /* 16px */ margin-bottom: 1rem; /* 16px */
border-bottom: var(--decor-border-100); border-bottom: var(--decor-border-100);
border-color: rgb(var(--tone-border)); border-color: rgb(var(--tone-border));
} }
%server-failure-tolerance > header a {
float: right;
margin-top: 4px;
font-weight: var(--typo-weight-semibold);
}
%server-failure-tolerance header em { %server-failure-tolerance header em {
@extend %pill-200; @extend %pill-200;
font-size: 0.812rem; /* 13px */ font-size: 0.812rem; /* 13px */
@ -45,7 +45,6 @@ section[data-route='dc.show.serverstatus'] {
text-transform: uppercase; text-transform: uppercase;
font-style: normal; font-style: normal;
} }
%server-failure-tolerance > section { %server-failure-tolerance > section {
width: 50%; width: 50%;
@ -68,10 +67,10 @@ section[data-route='dc.show.serverstatus'] {
--icon-size: icon-800; --icon-size: icon-800;
--icon-color: rgb(var(--tone-orange-400)); --icon-color: rgb(var(--tone-orange-400));
content: ''; content: '';
margin-right: 0.500rem; /* 8px */ margin-right: 0.5rem; /* 8px */
} }
%server-failure-tolerance section:first-of-type dl { %server-failure-tolerance section:first-of-type dl {
padding-right: 1.500rem; /* 24px */ padding-right: 1.5rem; /* 24px */
} }
%server-failure-tolerance dt { %server-failure-tolerance dt {
@extend %p2; @extend %p2;
@ -98,7 +97,6 @@ section[data-route='dc.show.serverstatus'] {
margin-bottom: 18px; margin-bottom: 18px;
} }
%redundancy-zones h3 { %redundancy-zones h3 {
@extend %h300; @extend %h300;
} }
@ -136,4 +134,3 @@ section[data-route='dc.show.serverstatus'] {
vertical-align: revert; vertical-align: revert;
background-color: var(--transparent); background-color: var(--transparent);
} }

View File

@ -35,7 +35,6 @@ pre code,
@extend %p1; @extend %p1;
} }
%empty-state-anchor, %empty-state-anchor,
.type-dialog,
%table td p, %table td p,
%table td, %table td,
%healthcheck-output dl > dd, %healthcheck-output dl > dd,

View File

@ -102,11 +102,23 @@ as |route|>
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/security/acl/auth-methods" rel="noopener noreferrer" target="_blank">Documentation on auth methods</a> <Hds::Link::Standalone
@text='Documentation on auth methods'
@href="{{env 'CONSUL_DOCS_URL'}}/security/acl/auth-methods"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_API_URL'}}/acl/auth-methods.html" rel="noopener noreferrer" target="_blank">Read the API Docs</a> <Hds::Link::Standalone
@text='Read the API Docs'
@href='{{env 'CONSUL_DOCS_API_URL'}}/acl/auth-methods.html'
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -28,20 +28,40 @@
{{/if}} {{/if}}
{{/if}} {{/if}}
<div> <div>
{{#if (and create (can "create tokens")) }} <Hds::ButtonSet>
{{#if (and create (can "create tokens")) }}
{{! we only need to check for an empty name here as ember munges autofocus, once we have autofocus back revisit this}} {{! we only need to check for an empty name here as ember munges autofocus, once we have autofocus back revisit this}}
<button type="submit" {{ action "create" item}} disabled={{if (or item.isPristine item.isInvalid (eq item.Name '')) 'disabled'}}>Save</button> <Hds::Button
{{ else }} @text='Save'
type='submit'
{{ on 'click' (route-action 'create' item)}}
disabled={{if (or item.isPristine item.isInvalid (eq item.Name '')) 'disabled'}}
/>
{{ else }}
{{#if (can "write policy" item=item)}} {{#if (can "write policy" item=item)}}
<button <Hds::Button
type="submit" {{ action "update" item}} disabled={{if item.isInvalid 'disabled'}}>Save</button> @text='Save'
type='submit'
{{ on 'click' (route-action 'update' item)}}
disabled={{if item.isInvalid 'disabled'}}
/>
{{/if}} {{/if}}
{{/if}} {{/if}}
<button type="reset" {{ action "cancel" item}}>Cancel</button> <Hds::Button
{{# if (and (not create) (can "delete policy" item=item) ) }} @text='Cancel'
@color='secondary'
type='reset'
{{ action "cancel" item}}
/>
{{# if (and (not create) (can "delete policy" item=item) ) }}
<ConfirmationDialog @message="Are you sure you want to delete this Policy?"> <ConfirmationDialog @message="Are you sure you want to delete this Policy?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button type="button" data-test-delete class="type-delete" {{action confirm 'delete' item}}>Delete</button> <Hds::Button
@text='Delete'
@color='critical'
{{action confirm 'delete' item}}
data-test-delete
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
{{#if (gt items.length 0)}} {{#if (gt items.length 0)}}
@ -58,7 +78,8 @@
</BlockSlot> </BlockSlot>
<BlockSlot @name="body"> <BlockSlot @name="body">
<p> <p>
This Policy is currently in use. If you choose to delete this Policy, it will be removed from the following <strong>{{items.length}} Tokens</strong>: This Policy is currently in use. If you choose to delete this Policy, it will be removed from the
following <strong>{{items.length}} Tokens</strong>:
</p> </p>
<TokenList @items={{items}} @target="_blank" /> <TokenList @items={{items}} @target="_blank" />
<p> <p>
@ -66,8 +87,19 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions" as |close|> <BlockSlot @name="actions" as |close|>
<button type="button" class="type-delete" {{action execute}}>Yes, Delete</button> <Hds::ButtonSet>
<button type="button" class="type-cancel" {{action close}}>Cancel</button> <Hds::Button
@text='Yes, Delete'
data-test-delete
@color='critical'
{{action execute}}
/>
<Hds::Button
@text='Cancel'
@color='secondary'
{{action close}}
/>
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
{{else}} {{else}}
@ -75,6 +107,7 @@
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</form> </form>

View File

@ -62,7 +62,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can "create policies")}} {{#if (can "create policies")}}
<a data-test-create href="{{href-to 'dc.acls.policies.create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.acls.policies.create'
data-test-create
/>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">
@ -111,11 +115,23 @@ as |route|>
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/acl/policy" rel="noopener noreferrer" target="_blank">Documentation on policies</a> <Hds::Link::Standalone
@text='Documentation on policies'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/acl/policy"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_LEARN_URL'}}/consul/security-networking/managing-acl-policies" rel="noopener noreferrer" target="_blank">Take the tutorial</a> <Hds::Link::Standalone
@text='Take the tutorial'
@href="{{env 'CONSUL_LEARN_URL'}}/consul/security-networking/managing-acl-policies"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -6,7 +6,7 @@
@nspace={{nspace}} @nspace={{nspace}}
@partition={{partition}} @partition={{partition}}
/> />
{{#if (not create)}} {{#if (not create)}}
<DataSource <DataSource
@src={{uri '/${partition}/${nspace}/${dc}/tokens/for-role/${id}' @src={{uri '/${partition}/${nspace}/${dc}/tokens/for-role/${id}'
(hash (hash
@ -20,26 +20,49 @@
{{#if (gt loader.data.length 0)}} {{#if (gt loader.data.length 0)}}
<h2>Where is this role used?</h2> <h2>Where is this role used?</h2>
<p> <p>
We're only able to show information for the primary datacenter and the current datacenter. This list may not show every case where this role is applied. We're only able to show information for the primary datacenter and the current datacenter. This list may not
show every case where this role is applied.
</p> </p>
<TokenList @caption="Tokens" @items={{loader.data}} /> <TokenList @caption="Tokens" @items={{loader.data}} />
{{/if}} {{/if}}
</DataSource> </DataSource>
{{/if}}
<div>
{{#if (and create (can "create roles")) }}
{{! we only need to check for an empty name here as ember munges autofocus, once we have autofocus back revisit this}}
<button type="submit" {{ action "create" item}} disabled={{if (or item.isPristine item.isInvalid (eq item.Name '')) 'disabled'}}>Save</button>
{{ else }}
{{#if (can "write role" item=item)}}
<button type="submit" {{ action "update" item}} disabled={{if item.isInvalid 'disabled'}}>Save</button>
{{/if}} {{/if}}
{{/if}} <div>
<button type="reset" {{ action "cancel" item}}>Cancel</button> <Hds::ButtonSet>
{{# if (and (not create) (can "delete role" item=item) ) }} {{#if (and create (can "create roles")) }}
{{! we only need to check for an empty name here as ember munges autofocus, once we have autofocus back revisit this}}
<Hds::Button
@text='Save'
type='submit'
{{ on 'click' (route-action 'create' item)}}
disabled={{or item.isPristine item.isInvalid (eq item.Name '')}}
/>
{{ else }}
{{#if (can "write role" item=item)}}
<Hds::Button
@text='Save'
type='submit'
{{ on 'click' (route-action 'update' item)}}
disabled={{item.isInvalid}}
/>
{{/if}}
{{/if}}
<Hds::Button
@text='Cancel'
@color='secondary'
type='reset'
{{ action "cancel" item}}
/>
{{# if (and (not create) (can "delete role" item=item) ) }}
<ConfirmationDialog @message="Are you sure you want to delete this Role?"> <ConfirmationDialog @message="Are you sure you want to delete this Role?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button type="button" data-test-delete class="type-delete" {{action confirm 'delete' item}}>Delete</button> <Hds::Button
@text='Delete'
@color='critical'
{{action confirm 'delete' item}}
data-test-delete
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
{{#if (gt items.length 0)}} {{#if (gt items.length 0)}}
@ -54,7 +77,8 @@
</BlockSlot> </BlockSlot>
<BlockSlot @name="body"> <BlockSlot @name="body">
<p> <p>
This Role is currently in use. If you choose to delete this Role, it will be removed from the following <strong>{{items.length}} Tokens</strong>: This Role is currently in use. If you choose to delete this Role, it will be removed from the
following <strong>{{items.length}} Tokens</strong>:
</p> </p>
<TokenList @items={{items}} @target="_blank" /> <TokenList @items={{items}} @target="_blank" />
<p> <p>
@ -62,8 +86,19 @@
</p> </p>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions" as |close|> <BlockSlot @name="actions" as |close|>
<button type="button" class="type-delete" {{action execute}}>Yes, Delete</button> <Hds::ButtonSet>
<button type="button" class="type-cancel" {{action close}}>Cancel</button> <Hds::Button
@text='Yes, Delete'
@color='critical'
data-test-delete
{{action execute}}
/>
<Hds::Button
@text='Cancel'
@color='secondary'
{{action close}}
/>
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ModalDialog> </ModalDialog>
{{else}} {{else}}
@ -71,6 +106,7 @@
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</form> </form>

View File

@ -56,7 +56,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can "create roles")}} {{#if (can "create roles")}}
<a data-test-create href="{{href-to 'dc.acls.roles.create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.acls.roles.create'
data-test-create
/>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">
@ -103,11 +107,23 @@ as |route|>
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/acl/role" rel="noopener noreferrer" target="_blank">Documentation on roles</a> <Hds::Link::Standalone
@text='Documentation on roles'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/acl/role"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_API_URL'}}/acl/roles.html" rel="noopener noreferrer" target="_blank">Read the API Docs</a> <Hds::Link::Standalone
@text='Read the API Docs'
@href="{{env 'CONSUL_DOCS_API_URL'}}/acl/roles.html"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -1,30 +1,51 @@
<form> <form>
{{#if (not (token/is-legacy item))}} {{#if (not (token/is-legacy item))}}
{{partial 'dc/acls/tokens/fieldsets'}} {{partial 'dc/acls/tokens/fieldsets'}}
{{else}} {{else}}
{{partial 'dc/acls/tokens/fieldsets-legacy'}} {{partial 'dc/acls/tokens/fieldsets-legacy'}}
{{/if}} {{/if}}
{{!TODO: Make this into a slotted component}} {{!TODO: Make this into a slotted component}}
<div> <div>
{{#if (and create (can "create tokens")) }} <Hds::ButtonSet>
{{#if (and create (can "create tokens")) }}
{{! new tokens can be saved without you filling anything in, old tokens remain using isPristine }} {{! new tokens can be saved without you filling anything in, old tokens remain using isPristine }}
<button type="submit" {{ action "create" item}} disabled={{if (or (and (token/is-legacy item) item.isPristine) item.isInvalid) 'disabled'}}>Save</button> <Hds::Button
{{ else }} @text='Save'
type='submit'
{{ on 'click' (route-action 'create' item)}}
disabled={{if (or (and (token/is-legacy item) item.isPristine) item.isInvalid) 'disabled'}}
/>
{{ else }}
{{#if (can "write token" item=item)}} {{#if (can "write token" item=item)}}
<button type="submit" {{ action "update" item}} disabled={{if item.isInvalid 'disabled'}}>Save</button> <Hds::Button
@text='Save'
type='submit'
{{ on 'click' (route-action 'update' item)}}
disabled={{if item.isInvalid 'disabled'}}
/>
{{/if}} {{/if}}
{{/if}} {{/if}}
<Hds::Button
<button type="reset" {{ action "cancel" item}}>Cancel</button> @text='Cancel'
{{# if (and (not create) (can "delete token" item=item token=token) ) }} @color='secondary'
type='reset'
{{ action "cancel" item}}
/>
{{# if (and (not create) (can "delete token" item=item token=token) ) }}
<ConfirmationDialog @message="Are you sure you want to delete this Token?"> <ConfirmationDialog @message="Are you sure you want to delete this Token?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button type="button" data-test-delete class="type-delete" {{action confirm 'delete' item}}>Delete</button> <Hds::Button
@text='Delete'
@color='critical'
{{action confirm 'delete' item}}
data-test-delete
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<DeleteConfirmation @message={{message}} @execute={{execute}} @cancel={{cancel}} /> <DeleteConfirmation @message={{message}} @execute={{execute}} @cancel={{cancel}} />
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
</Hds::ButtonSet>
</div> </div>
</form> </form>

View File

@ -52,23 +52,46 @@ as |dc partition nspace item create|}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (not create)}} {{#if (not create)}}
<Hds::ButtonSet>
{{#if (not-eq item.AccessorID token.AccessorID)}} {{#if (not-eq item.AccessorID token.AccessorID)}}
<ConfirmationDialog @message="Are you sure you want to use this ACL token?"> <ConfirmationDialog @message="Are you sure you want to use this ACL token?">
<BlockSlot @name="action" as |confirm|> <BlockSlot @name="action" as |confirm|>
<button data-test-use type="button" {{ action confirm 'use' item }}>Use</button> <Hds::Button
@text='Use'
@color='secondary'
data-test-use
{{ action confirm 'use' item }}
/>
</BlockSlot> </BlockSlot>
<BlockSlot @name="dialog" as |execute cancel message|> <BlockSlot @name="dialog" as |execute cancel message|>
<p> <p>
{{message}} {{message}}
</p> </p>
<button type="button" class="type-delete" {{action execute}}>Confirm Use</button> <Hds::ButtonSet>
<button type="button" class="type-cancel" {{action cancel}}>Cancel</button> <Hds::Button
@text='Confirm Use'
@color='critical'
data-test-confirm-use
{{action execute}}
/>
<Hds::Button
@text='Cancel'
@color='secondary'
{{action cancel}}
/>
</Hds::ButtonSet>
</BlockSlot> </BlockSlot>
</ConfirmationDialog> </ConfirmationDialog>
{{/if}} {{/if}}
{{#if (can "duplicate token" item=item)}} {{#if (can "duplicate token" item=item)}}
<button data-test-clone type="button" {{ action "clone" item }}>Duplicate</button> <Hds::Button
@text='Duplicate'
@color='secondary'
data-test-clone
{{ action "clone" item }}
/>
{{/if}} {{/if}}
</Hds::ButtonSet>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="content"> <BlockSlot @name="content">

View File

@ -59,7 +59,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can "create tokens")}} {{#if (can "create tokens")}}
<a data-test-create href="{{href-to 'dc.acls.tokens.create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.acls.tokens.create'
data-test-create
/>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">

View File

@ -54,7 +54,11 @@ as |route|>
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can 'create intentions')}} {{#if (can 'create intentions')}}
<a data-test-create href="{{href-to 'dc.intentions.create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.intentions.create'
data-test-create
/>
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
<BlockSlot @name="toolbar"> <BlockSlot @name="toolbar">
@ -119,11 +123,23 @@ as |route|>
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/intention" rel="noopener noreferrer" target="_blank">Documentation on intentions</a> <Hds::Link::Standalone
@text='Documentation on intentions'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/intention"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect" rel="noopener noreferrer" target="_blank">Take the tutorial</a> <Hds::Link::Standalone
@text='Take the tutorial'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -138,9 +138,18 @@ as |sort filters parent items|}}
<BlockSlot @name="actions"> <BlockSlot @name="actions">
{{#if (can 'create kvs')}} {{#if (can 'create kvs')}}
{{#if (not-eq parent.Key '/') }} {{#if (not-eq parent.Key '/') }}
<a data-test-create href="{{href-to 'dc.kv.create' parent.Key}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@isHrefExternal={{false}}
@href="{{href-to 'dc.kv.create' parent.Key}}"
data-test-create
/>
{{else}} {{else}}
<a data-test-create href="{{href-to 'dc.kv.root-create'}}" class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.kv.root-create'
data-test-create
/>
{{/if}} {{/if}}
{{/if}} {{/if}}
</BlockSlot> </BlockSlot>
@ -191,11 +200,23 @@ as |sort filters parent items|}}
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/agent/kv" rel="noopener noreferrer" target="_blank">Documentation on K/V</a> <Hds::Link::Standalone
@text='Documentation on K/V'
@href="{{env 'CONSUL_DOCS_URL'}}/agent/kv"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/kv" rel="noopener noreferrer" target="_blank">Take the tutorial</a> <Hds::Link::Standalone
@text='Take the tutorial'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/kv"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -88,25 +88,27 @@
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name='actions'> <BlockSlot @name='actions'>
<li class='docs-link'> <li>
<a <Hds::Button
href='{{env "CONSUL_DOCS_DEVELOPER_URL"}}/agent' @text={{t 'routes.dc.nodes.index.empty.documentation'}}
rel='noopener noreferrer' @href='{{env "CONSUL_DOCS_DEVELOPER_URL"}}/agent'
target='_blank' @color='tertiary'
> @icon='docs-link'
{{t 'routes.dc.nodes.index.empty.documentation'}} @iconPosition='trailing'
</a> @size='small'
/>
</li> </li>
<li class='learn-link'> <li>
<a <Hds::Button
href='{{env @text={{t 'routes.dc.nodes.index.empty.learn'}}
@href='{{env
"CONSUL_DOCS_LEARN_URL" "CONSUL_DOCS_LEARN_URL"
}}/tutorials/consul/deployment-guide?in=consul/production-deploy#configure-consul-agents' }}/tutorials/consul/deployment-guide?in=consul/production-deploy#configure-consul-agents'
rel='noopener noreferrer' @color='tertiary'
target='_blank' @icon='learn-link'
> @iconPosition='trailing'
{{t 'routes.dc.nodes.index.empty.learn'}} @size='small'
</a> />
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -118,21 +118,23 @@ as |sort filters items partition nspace|}}
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<Action <Hds::Link::Standalone
@text='Documentation on Services'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/services" @href="{{env 'CONSUL_DOCS_URL'}}/commands/services"
@external={{true}} @icon='docs-link'
> @iconPosition='trailing'
Documentation on Services @size='small'
</Action> />
</li> </li>
<li class="learn-link"> <li>
<Action <Hds::Link::Standalone
@text='Take the tutorial'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/services" @href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/services"
@external={{true}} @icon='learn-link'
> @iconPosition='trailing'
Take the tutorial @size='small'
</Action> />
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -58,9 +58,15 @@ as |route|>
}} }}
</notice.Body> </notice.Body>
<notice.Footer> <notice.Footer>
{{t "routes.dc.services.instance.upstreams.tproxy-mode.footer" <p>
htmlSafe=true <Hds::Link::Standalone
}} @text={{t "routes.dc.services.instance.upstreams.tproxy-mode.footer.text"}}
@href='{{concat (env 'CONSUL_DOCS_URL') (t "routes.dc.services.instance.upstreams.tproxy-mode.footer.link")}}'
@icon="docs-link"
@iconPosition="trailing"
@size="small"
/>
</p>
</notice.Footer> </notice.Footer>
</Notice> </Notice>
{{/if}} {{/if}}

View File

@ -44,7 +44,11 @@ as |route|>
<div class="tab-section"> <div class="tab-section">
{{#if (can 'create intention for service' item=item.Service)}} {{#if (can 'create intention for service' item=item.Service)}}
<Portal @target="app-view-actions"> <Portal @target="app-view-actions">
<a data-test-create href={{href-to 'dc.services.show.intentions.create'}} class="type-create">Create</a> <Hds::Button
@text='Create'
@route='dc.services.show.intentions.create'
data-test-create
/>
</Portal> </Portal>
{{/if}} {{/if}}
{{#if (gt items.length 0) }} {{#if (gt items.length 0) }}
@ -107,11 +111,23 @@ as |route|>
}} }}
</BlockSlot> </BlockSlot>
<BlockSlot @name="actions"> <BlockSlot @name="actions">
<li class="docs-link"> <li>
<a href="{{env 'CONSUL_DOCS_URL'}}/commands/intention" rel="noopener noreferrer" target="_blank">Documentation on intentions</a> <Hds::Link::Standalone
@text='Documentation on intentions'
@href="{{env 'CONSUL_DOCS_URL'}}/commands/intention"
@icon='docs-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
<li class="learn-link"> <li>
<a href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect" rel="noopener noreferrer" target="_blank">Take the tutorial</a> <Hds::Link::Standalone
@text='Take the tutorial'
@href="{{env 'CONSUL_DOCS_LEARN_URL'}}/consul/getting-started/connect"
@icon='learn-link'
@iconPosition='trailing'
@size='small'
/>
</li> </li>
</BlockSlot> </BlockSlot>
</EmptyState> </EmptyState>

View File

@ -137,11 +137,23 @@ as |item|}}
{{compute (fn route.t 'documentation.title')}} {{compute (fn route.t 'documentation.title')}}
</h3> </h3>
</header> </header>
{{compute (fn route.t 'documentation.body' <div class="flex gap-1.5 flex-col">
(hash <Hds::Link::Standalone
htmlSafe=true @text={{compute (fn route.t 'documentation.links.license-expiration.text')}}
) @href='{{concat (env 'CONSUL_DOCS_URL') (compute (fn route.t 'documentation.links.license-expiration.link'))}}'
)}} @icon='docs-link'
/>
<Hds::Link::Standalone
@text={{compute (fn route.t 'documentation.links.renewing-license.text')}}
@href='{{concat (env 'CONSUL_DOCS_URL') (compute (fn route.t 'documentation.links.renewing-license.link'))}}'
@icon='docs-link'
/>
<Hds::Link::Standalone
@text={{compute (fn route.t 'documentation.links.applying-new-license.text')}}
@href='{{concat (env 'CONSUL_DOCS_URL') (compute (fn route.t 'documentation.links.applying-new-license.link'))}}'
@icon='docs-link'
/>
</div>
</aside> </aside>
</section> </section>

View File

@ -87,12 +87,15 @@ as |item|}}
> >
<header> <header>
{{compute (fn route.t 'tolerance.link' (hash
htmlSafe=true
))}}
<h2> <h2>
{{compute (fn route.t 'tolerance.header')}} {{compute (fn route.t 'tolerance.header')}}
</h2> </h2>
<Hds::Link::Standalone
@icon='docs-link'
@iconPosition='trailing'
@text={{compute (fn route.t 'tolerance.link-text')}}
@href='{{concat (env 'CONSUL_DOCS_URL') (compute (fn route.t 'tolerance.link'))}}'
/>
</header> </header>
<section <section

View File

@ -67,10 +67,10 @@
"@ember/test-helpers": "^2.2.5", "@ember/test-helpers": "^2.2.5",
"@glimmer/component": "^1.0.4", "@glimmer/component": "^1.0.4",
"@glimmer/tracking": "^1.0.4", "@glimmer/tracking": "^1.0.4",
"@hashicorp/design-system-components": "^1.0.4", "@hashicorp/design-system-components": "^1.6.0",
"@hashicorp/design-system-tokens": "^1.0.0", "@hashicorp/design-system-tokens": "^1.0.0",
"@hashicorp/ember-cli-api-double": "^4.0.0", "@hashicorp/ember-cli-api-double": "^4.0.0",
"@hashicorp/ember-flight-icons": "^3.0.0", "@hashicorp/ember-flight-icons": "^3.0.2",
"@html-next/vertical-collection": "^4.0.0", "@html-next/vertical-collection": "^4.0.0",
"@lit/reactive-element": "^1.2.1", "@lit/reactive-element": "^1.2.1",
"@xstate/fsm": "^1.4.0", "@xstate/fsm": "^1.4.0",

View File

@ -21,7 +21,7 @@ Feature: dc / intentions / deleting: Deleting items with confirmations, success
--- ---
And I click actions on the intentionList.intentions And I click actions on the intentionList.intentions
And I click delete on the intentionList.intentions And I click delete on the intentionList.intentions
And I click confirmDelete on the intentionList.intentions And I click confirmInlineDelete on the intentionList.intentions
Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=datacenter" Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=datacenter"
And "[data-notification]" has the "notification-delete" class And "[data-notification]" has the "notification-delete" class
And "[data-notification]" has the "success" class And "[data-notification]" has the "success" class

View File

@ -13,7 +13,7 @@ Feature: dc / kvs / deleting: Deleting items with confirmations, success and err
--- ---
And I click actions on the kvs And I click actions on the kvs
And I click delete on the kvs And I click delete on the kvs
And I click confirmDelete on the kvs And I click confirmInlineDelete on the kvs
Then a DELETE request was made to "/v1/kv/key-name?dc=datacenter&ns=@!namespace" Then a DELETE request was made to "/v1/kv/key-name?dc=datacenter&ns=@!namespace"
And "[data-notification]" has the "notification-delete" class And "[data-notification]" has the "notification-delete" class
And "[data-notification]" has the "success" class And "[data-notification]" has the "success" class

View File

@ -48,7 +48,7 @@ Feature: dc / services / show / intentions / index: Intentions per service
Scenario: I can delete intentions Scenario: I can delete intentions
And I click actions on the intentionList.intentions component And I click actions on the intentionList.intentions component
And I click delete on the intentionList.intentions component And I click delete on the intentionList.intentions component
And I click confirmDelete on the intentionList.intentions And I click confirmInlineDelete on the intentionList.intentions
Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=dc1" Then a DELETE request was made to "/v1/connect/intentions/exact?source=default%2Fdefault%2Fname&destination=default%2Fdefault%2Fdestination&dc=dc1"
And "[data-notification]" has the "notification-delete" class And "[data-notification]" has the "notification-delete" class
And "[data-notification]" has the "success" class And "[data-notification]" has the "success" class

View File

@ -12,13 +12,13 @@ module('Integration | Component | delete confirmation', function (hooks) {
await render(hbs`{{delete-confirmation}}`); await render(hbs`{{delete-confirmation}}`);
assert.dom('.type-delete').exists({ count: 1 }); assert.dom('[data-test-delete]').exists({ count: 1 });
// Template block usage: // Template block usage:
await render(hbs` await render(hbs`
{{#delete-confirmation}}{{/delete-confirmation}} {{#delete-confirmation}}{{/delete-confirmation}}
`); `);
assert.dom('.type-delete').exists({ count: 1 }); assert.dom('[data-test-delete]').exists({ count: 1 });
}); });
}); });

View File

@ -7,7 +7,8 @@ export default function (clickable) {
...obj, ...obj,
...{ ...{
delete: clickable(scope + '[data-test-delete]'), delete: clickable(scope + '[data-test-delete]'),
confirmDelete: clickable(scope + 'button.type-delete'), confirmDelete: clickable(scope + '[data-test-delete]'),
confirmInlineDelete: clickable(scope + 'button.type-delete'),
}, },
}; };
}; };

View File

@ -4,7 +4,7 @@ export default function (visitable, submitable, deletable, cancelable, clickable
deletable({ deletable({
visit: visitable(['/:dc/acls/:acl', '/:dc/acls/create']), visit: visitable(['/:dc/acls/:acl', '/:dc/acls/create']),
use: clickable('[data-test-use]'), use: clickable('[data-test-use]'),
confirmUse: clickable('button.type-delete'), confirmUse: clickable('[data-test-confirm-use]'),
}) })
), ),
'main' 'main'

View File

@ -13,7 +13,7 @@ export default function (
...cancelable({}, 'main form > div'), ...cancelable({}, 'main form > div'),
...deletable({}, 'main form > div'), ...deletable({}, 'main form > div'),
use: clickable('[data-test-use]'), use: clickable('[data-test-use]'),
confirmUse: clickable('button.type-delete'), confirmUse: clickable('[data-test-confirm-use]'),
clone: clickable('[data-test-clone]'), clone: clickable('[data-test-clone]'),
policies: policySelector(), policies: policySelector(),
roles: roleSelector(), roles: roleSelector(),

View File

@ -5,8 +5,8 @@ dc:
title: Server status title: Server status
unassigned: Unassigned Zones unassigned: Unassigned Zones
tolerance: tolerance:
link: | link-text: Learn how to improve fault tolerance
<a href="{CONSUL_DOCS_URL}/architecture/improving-consul-resilience#strategies-to-increase-fault-tolerance" target="_blank" rel="noopener noreferrer">Learn how to improve fault tolerance</a> link: /architecture/improving-consul-resilience#strategies-to-increase-fault-tolerance
header: Server fault tolerance header: Server fault tolerance
immediate: immediate:
header: Immediate header: Immediate
@ -34,25 +34,16 @@ dc:
</p> </p>
documentation: documentation:
title: Learn More title: Learn More
body: | links:
<ul> license-expiration:
<li> text: License expiration
<a href="{CONSUL_DOCS_URL}/enterprise/license/faq#q-is-there-a-grace-period-when-licenses-expire" target="_blank" rel="noopener noreferrer"> link: '/enterprise/license/faq#q-is-there-a-grace-period-when-licenses-expire'
License expiration renewing-license:
</a> text: Renewing a license
</li> link: '/enterprise/license/faq#q-how-can-i-renew-a-license'
<li> applying-new-license:
<a href="{CONSUL_DOCS_URL}/enterprise/license/faq#q-how-can-i-renew-a-license" target="_blank" rel="noopener noreferrer"> text: Applying a new license
Renewing a license link: '/tutorials/nomad/hashicorp-enterprise-license?in=consul/enterprise'
</a>
</li>
<li>
<a href="{CONSUL_DOCS_LEARN_URL}/tutorials/nomad/hashicorp-enterprise-license?in=consul/enterprise" target="_blank" rel="noopener noreferrer">
Applying a new license
</a>
</li>
</ul>
nodes: nodes:
index: index:
agentless: agentless:
@ -265,10 +256,9 @@ dc:
<p> <p>
The upstreams listed on this page have been defined in a proxy registration. There may be more upstreams, though, as "transparent" mode is enabled on this proxy. The upstreams listed on this page have been defined in a proxy registration. There may be more upstreams, though, as "transparent" mode is enabled on this proxy.
</p> </p>
footer: | footer:
<p> link: "/connect/transparent-proxy"
<a href="{CONSUL_DOCS_URL}/connect/transparent-proxy" target="_blank" rel="noopener noreferrer">Read the documentation text: Read the documentation
</p>
empty: | empty: |
<p> <p>
This Service Instance has no Upstreams{items, select, This Service Instance has no Upstreams{items, select,

View File

@ -2927,6 +2927,15 @@
ember-cli-version-checker "^5.1.2" ember-cli-version-checker "^5.1.2"
semver "^7.3.5" semver "^7.3.5"
"@embroider/addon-shim@^1.0.0":
version "1.8.4"
resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.4.tgz#0e7f32c5506bf0f3eb0840506e31c36c7053763c"
integrity sha512-sFhfWC0vI18KxVenmswQ/ShIvBg4juL8ubI+Q3NTSdkCTeaPQ/DIOUF6oR5DCQ8eO/TkIaw+kdG3FkTY6yNJqA==
dependencies:
"@embroider/shared-internals" "^2.0.0"
broccoli-funnel "^3.0.8"
semver "^7.3.8"
"@embroider/addon-shim@^1.5.0": "@embroider/addon-shim@^1.5.0":
version "1.8.3" version "1.8.3"
resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.3.tgz#2368510b8ce42d50d02cb3289c32e260dfa34bd9" resolved "https://registry.yarnpkg.com/@embroider/addon-shim/-/addon-shim-1.8.3.tgz#2368510b8ce42d50d02cb3289c32e260dfa34bd9"
@ -3147,6 +3156,20 @@
semver "^7.3.5" semver "^7.3.5"
typescript-memoize "^1.0.1" typescript-memoize "^1.0.1"
"@embroider/shared-internals@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-2.0.0.tgz#d8205ec6944362aeecfbb51143db352430ced316"
integrity sha512-qZ2/xky9mWm5YC6noOa6AiAwgISEQ78YTZNv4SNu2PFgEK/H+Ha/3ddngzGSsnXkVnIHZyxIBzhxETonQYHY9g==
dependencies:
babel-import-util "^1.1.0"
ember-rfc176-data "^0.3.17"
fs-extra "^9.1.0"
js-string-escape "^1.0.1"
lodash "^4.17.21"
resolve-package-path "^4.0.1"
semver "^7.3.5"
typescript-memoize "^1.0.1"
"@embroider/util@^0.39.1 || ^0.40.0 || ^0.41.0": "@embroider/util@^0.39.1 || ^0.40.0 || ^0.41.0":
version "0.41.0" version "0.41.0"
resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.41.0.tgz#5324cb4742aa4ed8d613c4f88a466f73e4e6acc1" resolved "https://registry.yarnpkg.com/@embroider/util/-/util-0.41.0.tgz#5324cb4742aa4ed8d613c4f88a466f73e4e6acc1"
@ -3399,19 +3422,25 @@
faker "^4.1.0" faker "^4.1.0"
js-yaml "^3.13.1" js-yaml "^3.13.1"
"@hashicorp/design-system-components@^1.0.4": "@hashicorp/design-system-components@^1.6.0":
version "1.0.4" version "1.6.1"
resolved "https://registry.yarnpkg.com/@hashicorp/design-system-components/-/design-system-components-1.0.4.tgz#e258cad1a41b00db3363db25bfdafaa598326b98" resolved "https://registry.yarnpkg.com/@hashicorp/design-system-components/-/design-system-components-1.6.1.tgz#da04f1199cdce78dcf6591c3678377b87bd67424"
integrity sha512-aaOncgPH4yDEvQuFfOa/cwAOttxwbaEdaENEl+88EOi/HLUe0mdS2HgpC96w3sWhedE/xylCgSHz0DemIj5dJQ== integrity sha512-nfuY5KLK3kQWRfrFOIEEoSSca6LwZ9Zss13glHHyAIFt/gJ1pjSpcYj2XTukdjfAvx70qwQbHPPaAUXZ00vtoA==
dependencies: dependencies:
"@hashicorp/design-system-tokens" "^1.0.0" "@hashicorp/design-system-tokens" "^1.4.0"
"@hashicorp/ember-flight-icons" "^2.0.12" "@hashicorp/ember-flight-icons" "^3.0.2"
ember-auto-import "^2.4.1" dialog-polyfill "^0.5.6"
ember-auto-import "^2.4.2"
ember-cached-decorator-polyfill "^0.1.4"
ember-cli-babel "^7.26.11" ember-cli-babel "^7.26.11"
ember-cli-htmlbars "^6.0.1" ember-cli-htmlbars "^6.1.0"
ember-cli-sass "^10.0.1" ember-cli-sass "^10.0.1"
ember-composable-helpers "^4.4.1"
ember-focus-trap "^1.0.1"
ember-keyboard "^8.1.0" ember-keyboard "^8.1.0"
ember-named-blocks-polyfill "^0.2.5" ember-named-blocks-polyfill "^0.2.5"
ember-style-modifier "^0.8.0"
ember-truth-helpers "^3.0.0"
sass "^1.43.4" sass "^1.43.4"
"@hashicorp/design-system-tokens@^1.0.0": "@hashicorp/design-system-tokens@^1.0.0":
@ -3419,6 +3448,11 @@
resolved "https://registry.yarnpkg.com/@hashicorp/design-system-tokens/-/design-system-tokens-1.0.0.tgz#06ab55873ef444b0958a5192db310278c6501f0b" resolved "https://registry.yarnpkg.com/@hashicorp/design-system-tokens/-/design-system-tokens-1.0.0.tgz#06ab55873ef444b0958a5192db310278c6501f0b"
integrity sha512-akziX9jiHnQ8KfJA6s8l+98Ukz30C5Lw7BpSPeTduOmdOlJv1uP7w4TV0hC6VIDMDrJrxIF5Y/HnpSCdQGlxQA== integrity sha512-akziX9jiHnQ8KfJA6s8l+98Ukz30C5Lw7BpSPeTduOmdOlJv1uP7w4TV0hC6VIDMDrJrxIF5Y/HnpSCdQGlxQA==
"@hashicorp/design-system-tokens@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@hashicorp/design-system-tokens/-/design-system-tokens-1.4.0.tgz#2d42bd7d9250b01f77618663b3b92004be840af7"
integrity sha512-xZI5lom+qPi5B4qUDgXcuTc+A8/NQdXXBoIfB7NUnY/GRp4kOkxNkgScPj8fvAFvUuLdiCAQhpLU54z1A/Q3cA==
"@hashicorp/ember-cli-api-double@^4.0.0": "@hashicorp/ember-cli-api-double@^4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/@hashicorp/ember-cli-api-double/-/ember-cli-api-double-4.0.0.tgz#fd6181229c589b4db93f1784d022db064c61ec76" resolved "https://registry.yarnpkg.com/@hashicorp/ember-cli-api-double/-/ember-cli-api-double-4.0.0.tgz#fd6181229c589b4db93f1784d022db064c61ec76"
@ -3434,34 +3468,20 @@
pretender "^3.2.0" pretender "^3.2.0"
recursive-readdir-sync "^1.0.6" recursive-readdir-sync "^1.0.6"
"@hashicorp/ember-flight-icons@^2.0.12": "@hashicorp/ember-flight-icons@^3.0.2":
version "2.0.12" version "3.0.2"
resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-2.0.12.tgz#788adf7a4fedc468d612d35b604255df948f4012" resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-3.0.2.tgz#8d884c07842a6c88df18ca680d7883a59222a2ba"
integrity sha512-8fHPGaSpMkr5dLWaruwbq9INwZCi2EyTof/TR/dL8PN4UbCuY+KXNqG0lLIKNGFFTj09B1cO303m5GUfKKDGKQ== integrity sha512-WomQg1hw/IHA1N9hC77WbTNazVXqu2RdRoaVCGT99NTXQ4S7Bw7vhHheR4JAgt10ksMZFI3X/bJVHxFfjUCkSQ==
dependencies: dependencies:
"@hashicorp/flight-icons" "^2.10.0" "@hashicorp/flight-icons" "^2.12.0"
ember-auto-import "^2.4.2"
ember-cli-babel "^7.26.11" ember-cli-babel "^7.26.11"
ember-cli-htmlbars "^6.0.1" ember-cli-htmlbars "^6.1.0"
"@hashicorp/ember-flight-icons@^3.0.0": "@hashicorp/flight-icons@^2.12.0":
version "3.0.0" version "2.12.0"
resolved "https://registry.yarnpkg.com/@hashicorp/ember-flight-icons/-/ember-flight-icons-3.0.0.tgz#fddeb8adfb036aa3573c55b7236b34172b49cba9" resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.12.0.tgz#48bc21f21678668ffe9147b181a2991d8b151fc7"
integrity sha512-+QrV38Ix9dWLwMzdVcMcSmFfeSVGvWvB+3OVBq3ltOTmnoLPIAx8LT9UDZUZ1wa65ciO+a1YzLMmwWnQgX/r9Q== integrity sha512-PhjTTHCjoq4EJirifbxLxnxXnCRf1NUAYZ1WnFW8i0yOmmax6fgjsJRPlf0VIGsR8R7isFpjuy6gJ5c7mNhE0w==
dependencies:
"@hashicorp/flight-icons" "^2.11.0"
ember-auto-import "^2.4.1"
ember-cli-babel "^7.26.11"
ember-cli-htmlbars "^6.0.1"
"@hashicorp/flight-icons@^2.10.0":
version "2.10.0"
resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.10.0.tgz#24b03043bacda16e505200e6591dfef896ddacf1"
integrity sha512-jYUA0M6Tz+4RAudil+GW/fHbhZPcKCiIZZAguBDviqbLneMkMgPOBgbXWCGWsEQ1fJzP2cXbUaio8L0aQZPWQw==
"@hashicorp/flight-icons@^2.11.0":
version "2.11.0"
resolved "https://registry.yarnpkg.com/@hashicorp/flight-icons/-/flight-icons-2.11.0.tgz#1500be99a42ee8512e7caece4bdae60ce8790577"
integrity sha512-teFkUY2di63JZ2gsegQgS+3f5YEP+GPuycB1Z2O+weInIrL33Ds0/J+lxFCmi2vkPAeY5xOnsclHYnhU6xOSmA==
"@html-next/vertical-collection@^4.0.0": "@html-next/vertical-collection@^4.0.0":
version "4.0.0" version "4.0.0"
@ -4874,6 +4894,11 @@ babel-import-util@^1.1.0:
resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.2.2.tgz#1027560e143a4a68b1758e71d4fadc661614e495" resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.2.2.tgz#1027560e143a4a68b1758e71d4fadc661614e495"
integrity sha512-8HgkHWt5WawRFukO30TuaL9EiDUOdvyKtDwLma4uBNeUSDbOO0/hiPfavrOWxSS6J6TKXfukWHZ3wiqZhJ8ONQ== integrity sha512-8HgkHWt5WawRFukO30TuaL9EiDUOdvyKtDwLma4uBNeUSDbOO0/hiPfavrOWxSS6J6TKXfukWHZ3wiqZhJ8ONQ==
babel-import-util@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.3.0.tgz#dc9251ea39a7747bd586c1c13b8d785a42797f8e"
integrity sha512-PPzUT17eAI18zn6ek1R3sB4Krc/MbnmT1MkZQFmyhjoaEGBVwNABhfVU9+EKcDSKrrOm9OIpGhjxukx1GCiy1g==
babel-loader@^8.0.6, babel-loader@^8.1.0: babel-loader@^8.0.6, babel-loader@^8.1.0:
version "8.2.2" version "8.2.2"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
@ -4950,6 +4975,13 @@ babel-plugin-ember-template-compilation@^1.0.0:
magic-string "^0.25.7" magic-string "^0.25.7"
string.prototype.matchall "^4.0.5" string.prototype.matchall "^4.0.5"
babel-plugin-ember-template-compilation@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-ember-template-compilation/-/babel-plugin-ember-template-compilation-2.0.0.tgz#41d895874ba6119dd461f61993c16d1154bf8a57"
integrity sha512-d+4jaB2ik0rt9TH0K9kOlKJeRBHEb373FgFMcU9ZaJL2zYuVXe19bqy+cWlLpLf1tpOBcBG9QTlFBCoImlOt1g==
dependencies:
babel-import-util "^1.3.0"
babel-plugin-filter-imports@^4.0.0: babel-plugin-filter-imports@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4"
@ -7717,6 +7749,11 @@ dezalgo@^1.0.0:
asap "^2.0.0" asap "^2.0.0"
wrappy "1" wrappy "1"
dialog-polyfill@^0.5.6:
version "0.5.6"
resolved "https://registry.yarnpkg.com/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz#7507b4c745a82fcee0fa07ce64d835979719599a"
integrity sha512-ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w==
didyoumean@^1.2.2: didyoumean@^1.2.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
@ -7991,7 +8028,7 @@ ember-auto-import@^1.5.3, ember-auto-import@^1.6.0:
walk-sync "^0.3.3" walk-sync "^0.3.3"
webpack "^4.43.0" webpack "^4.43.0"
ember-auto-import@^2.2.3, ember-auto-import@^2.4.1, ember-auto-import@^2.4.2: ember-auto-import@^2.2.3, ember-auto-import@^2.4.2:
version "2.4.2" version "2.4.2"
resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.2.tgz#d4d3bc6885a11cf124f606f5c37169bdf76e37ae" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.2.tgz#d4d3bc6885a11cf124f606f5c37169bdf76e37ae"
integrity sha512-REh+1aJWpTkvN42a/ga41OuRpUsSW7UQfPr2wPtYx56o/xoSNhVBXejy7yV9ObrkN7gogz6fs2xZwih5cOwpYg== integrity sha512-REh+1aJWpTkvN42a/ga41OuRpUsSW7UQfPr2wPtYx56o/xoSNhVBXejy7yV9ObrkN7gogz6fs2xZwih5cOwpYg==
@ -8045,6 +8082,26 @@ ember-basic-dropdown@3.0.21, ember-basic-dropdown@^3.0.16:
ember-style-modifier "^0.6.0" ember-style-modifier "^0.6.0"
ember-truth-helpers "^2.1.0 || ^3.0.0" ember-truth-helpers "^2.1.0 || ^3.0.0"
ember-cache-primitive-polyfill@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ember-cache-primitive-polyfill/-/ember-cache-primitive-polyfill-1.0.1.tgz#a27075443bd87e5af286c1cd8a7df24e3b9f6715"
integrity sha512-hSPcvIKarA8wad2/b6jDd/eU+OtKmi6uP+iYQbzi5TQpjsqV6b4QdRqrLk7ClSRRKBAtdTuutx+m+X+WlEd2lw==
dependencies:
ember-cli-babel "^7.22.1"
ember-cli-version-checker "^5.1.1"
ember-compatibility-helpers "^1.2.1"
silent-error "^1.1.1"
ember-cached-decorator-polyfill@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/ember-cached-decorator-polyfill/-/ember-cached-decorator-polyfill-0.1.4.tgz#f1e2c65cc78d0d9c4ac0e047e643af477eb85ace"
integrity sha512-JOK7kBCWsTVCzmCefK4nr9BACDJk0owt9oIUaVt6Q0UtQ4XeAHmoK5kQ/YtDcxQF1ZevHQFdGhsTR3JLaHNJgA==
dependencies:
"@glimmer/tracking" "^1.0.4"
ember-cache-primitive-polyfill "^1.0.1"
ember-cli-babel "^7.21.0"
ember-cli-babel-plugin-helpers "^1.1.1"
ember-can@^4.2.0: ember-can@^4.2.0:
version "4.2.0" version "4.2.0"
resolved "https://registry.yarnpkg.com/ember-can/-/ember-can-4.2.0.tgz#08bfec3b2b57aad3dc6e4dc36fe9692bd1794dab" resolved "https://registry.yarnpkg.com/ember-can/-/ember-can-4.2.0.tgz#08bfec3b2b57aad3dc6e4dc36fe9692bd1794dab"
@ -8310,6 +8367,26 @@ ember-cli-htmlbars@^6.0.1:
silent-error "^1.1.1" silent-error "^1.1.1"
walk-sync "^2.2.0" walk-sync "^2.2.0"
ember-cli-htmlbars@^6.1.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.2.0.tgz#18ec48ee1c93f9eed862a64eb24a9d14604f1dfc"
integrity sha512-j5EGixjGau23HrqRiW/JjoAovg5UBHfjbyN7wX5ekE90knIEqUUj1z/Mo/cTx/J2VepQ2lE6HdXW9LWQ/WdMtw==
dependencies:
"@ember/edition-utils" "^1.2.0"
babel-plugin-ember-template-compilation "^2.0.0"
babel-plugin-htmlbars-inline-precompile "^5.3.0"
broccoli-debug "^0.6.5"
broccoli-persistent-filter "^3.1.2"
broccoli-plugin "^4.0.3"
ember-cli-version-checker "^5.1.2"
fs-tree-diff "^2.0.1"
hash-for-dep "^1.5.1"
heimdalljs-logger "^0.1.10"
js-string-escape "^1.0.1"
semver "^7.3.4"
silent-error "^1.1.1"
walk-sync "^2.2.0"
ember-cli-inject-live-reload@^2.0.2: ember-cli-inject-live-reload@^2.0.2:
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7"
@ -8730,6 +8807,16 @@ ember-compatibility-helpers@^1.2.5:
fs-extra "^9.1.0" fs-extra "^9.1.0"
semver "^5.4.1" semver "^5.4.1"
ember-composable-helpers@^4.4.1:
version "4.5.0"
resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-4.5.0.tgz#94febbdf4348e64f45f7a6f993f326e32540a61e"
integrity sha512-XjpDLyVPsLCy6kd5dIxZonOECCO6AA5sY5Hr6tYUbJg3s5ghFAiFWaNcYraYC+fL2yPJQAswwpfwGlQORUJZkw==
dependencies:
"@babel/core" "^7.0.0"
broccoli-funnel "2.0.1"
ember-cli-babel "^7.26.3"
resolve "^1.10.0"
ember-composable-helpers@^5.0.0: ember-composable-helpers@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-5.0.0.tgz#055bab3a3e234ab2917499b1465e968c253ca885" resolved "https://registry.yarnpkg.com/ember-composable-helpers/-/ember-composable-helpers-5.0.0.tgz#055bab3a3e234ab2917499b1465e968c253ca885"
@ -8862,6 +8949,14 @@ ember-factory-for-polyfill@^1.3.1:
dependencies: dependencies:
ember-cli-version-checker "^2.1.0" ember-cli-version-checker "^2.1.0"
ember-focus-trap@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/ember-focus-trap/-/ember-focus-trap-1.0.1.tgz#a99565f6ce55d500b92a0965e79e3ad04219f157"
integrity sha512-ZUyq5ZkIuXp+ng9rCMkqBh36/V95PltL7iljStkma4+651xlAy3Z84L9WOu/uOJyVpNUxii8RJBbAySHV6c+RQ==
dependencies:
"@embroider/addon-shim" "^1.0.0"
focus-trap "^6.7.1"
ember-get-config@^0.3.0: ember-get-config@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd" resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd"
@ -9286,6 +9381,14 @@ ember-style-modifier@^0.6.0:
ember-cli-babel "^7.21.0" ember-cli-babel "^7.21.0"
ember-modifier "^2.1.0" ember-modifier "^2.1.0"
ember-style-modifier@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/ember-style-modifier/-/ember-style-modifier-0.8.0.tgz#ef46b3f288e63e3d850418ea8dc6f7b12edde721"
integrity sha512-I7M+oZ+poYYOP7n521rYv7kkYZbxotL8VbtHYxLQ3tasRZYQJ21qfu3vVjydSjwyE3w7EZRgKngBoMhKSAEZnw==
dependencies:
ember-cli-babel "^7.26.6"
ember-modifier "^3.2.7"
ember-template-lint@^2.0.1: ember-template-lint@^2.0.1:
version "2.21.0" version "2.21.0"
resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b" resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b"
@ -10405,6 +10508,13 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3" inherits "^2.0.3"
readable-stream "^2.3.6" readable-stream "^2.3.6"
focus-trap@^6.7.1:
version "6.9.4"
resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-6.9.4.tgz#436da1a1d935c48b97da63cd8f361c6f3aa16444"
integrity sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==
dependencies:
tabbable "^5.3.3"
focusable-selectors@^0.3.0: focusable-selectors@^0.3.0:
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/focusable-selectors/-/focusable-selectors-0.3.0.tgz#0cf0c617c0f130b3d421be6787acb95b0b4936c4" resolved "https://registry.yarnpkg.com/focusable-selectors/-/focusable-selectors-0.3.0.tgz#0cf0c617c0f130b3d421be6787acb95b0b4936c4"
@ -15578,6 +15688,13 @@ semver@^7.3.5:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.3.8:
version "7.3.8"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
dependencies:
lru-cache "^6.0.0"
send@0.17.1: send@0.17.1:
version "0.17.1" version "0.17.1"
resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@ -16405,6 +16522,11 @@ sync-disk-cache@^2.0.0:
rimraf "^3.0.0" rimraf "^3.0.0"
username-sync "^1.0.2" username-sync "^1.0.2"
tabbable@^5.3.3:
version "5.3.3"
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-5.3.3.tgz#aac0ff88c73b22d6c3c5a50b1586310006b47fbf"
integrity sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==
table@^6.0.9: table@^6.0.9:
version "6.8.0" version "6.8.0"
resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"