Skip to content
Open
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
7cc0091
bump up "subtle" button opacity slightly based the "x" controls on ta…
JayGeorge Nov 24, 2025
5049d98
Start adding red delete controls
JayGeorge Nov 24, 2025
020e5ae
Add some default "red button states" for subtle buttons that have a d…
JayGeorge Nov 24, 2025
c6ba989
Adding red delete controls for the table fieldtype
JayGeorge Nov 24, 2025
9917262
Finish adding red delete controls for the table fieldtype
JayGeorge Nov 25, 2025
401283b
Add red delete controls for combobox tags fieldtype
JayGeorge Nov 25, 2025
8199108
Typo
JayGeorge Nov 25, 2025
86c8a35
Replace deletes reds with a variable to tidy things
JayGeorge Nov 25, 2025
3f9e38b
Dark mode adjustments
JayGeorge Nov 25, 2025
9e3b5bc
Use Tailwind good and proper
JayGeorge Nov 25, 2025
95cb02c
Delete buttons - Switch from transparent background values because so…
JayGeorge Nov 25, 2025
db81c05
Shift delete states to the utility layer so they override tailwind ut…
JayGeorge Nov 25, 2025
0660c65
Delete buttons - date pickers and comboboxes
JayGeorge Nov 25, 2025
2445dfd
Delete buttons - add switches as an exception
JayGeorge Nov 25, 2025
f78e734
Delete buttons - add background to dropdown
JayGeorge Nov 25, 2025
3557881
Delete buttons - clearable
JayGeorge Nov 25, 2025
2a31ac8
Delete states - use outline state instead so we don't have to worry a…
JayGeorge Nov 26, 2025
417d5a6
Delete states - time picker
JayGeorge Nov 26, 2025
08d9eb2
Delete states - change the way we handle badges to make this clearer
JayGeorge Nov 26, 2025
ec94405
Delete states - change the way we handle badges to make this clearer
JayGeorge Nov 26, 2025
96f64eb
Delete states - dim warning color for accessibility contrast
JayGeorge Nov 26, 2025
b695d70
Rename color-warning to color-danger
JayGeorge Nov 26, 2025
b182e90
Rename color-warning to color-danger
JayGeorge Nov 26, 2025
4c8d5cb
Delete states - Fix dropdown since I've changed this from "warning" t…
JayGeorge Nov 26, 2025
2ce41f7
Delete states - take danger and success from the theme variables instead
JayGeorge Nov 26, 2025
b3dc361
Delete states - fix ui badge focus states
JayGeorge Nov 26, 2025
082f033
Delete states - add condition for color fieldtype
JayGeorge Nov 26, 2025
db3c829
Fix the @theme inline color system
JayGeorge Nov 26, 2025
cdaa388
Delete states - Reorganise a little
JayGeorge Nov 26, 2025
263f2ca
Delete states - Tweak some values and add more
JayGeorge Nov 26, 2025
b0477d7
Correct gray-950 value
JayGeorge Nov 27, 2025
a324576
Delete states - get dark mode working
JayGeorge Nov 27, 2025
c4c05f4
Delete states - simplify configuration
JayGeorge Nov 27, 2025
bf403f1
Delete states - fix missing colors
JayGeorge Nov 27, 2025
c1ba9f0
Delete states - fix offset
JayGeorge Nov 27, 2025
a05eb79
Delete states - Remove @theme inline rule that won't work
JayGeorge Nov 27, 2025
6f37d2d
Delete states - Remove some unnecessary tw classes
JayGeorge Nov 27, 2025
de428d3
Delete states - make subtler
JayGeorge Nov 27, 2025
abbccb9
Delete states - more work including dark mode
JayGeorge Nov 27, 2025
a0ca318
Delete states - add a load of aria labels that will trigger the delet…
JayGeorge Nov 27, 2025
d2af2ba
Delete states - remove dark variants since we generate them automatic…
JayGeorge Nov 27, 2025
9b9c368
Reorganise file slightly
JayGeorge Nov 27, 2025
f2ed412
Whoops, we actually need the dark variants
JayGeorge Nov 27, 2025
228ccb2
Unify table delete states so both hover and focus are the same. I can…
JayGeorge Nov 27, 2025
12a88b2
Progress making delete states explicit rathen than relying on aria la…
JayGeorge Dec 1, 2025
78d5314
Try switching from @theme-inline to native CSS vars to get dark varia…
JayGeorge Dec 1, 2025
a61fb0f
Add additional dark selector to the theme variables. This is needed w…
JayGeorge Dec 1, 2025
0043cf1
Fix danger vars
JayGeorge Dec 1, 2025
7cc022b
Add explicit delete-action to other buttons
JayGeorge Dec 1, 2025
d6071fe
Remove border-radius override, decided against it
JayGeorge Dec 1, 2025
4d40718
Fix badges
JayGeorge Dec 1, 2025
f6ee583
Add dictionary fieldtype
JayGeorge Dec 1, 2025
4e9773b
Rename delete-action to destructive
JayGeorge Dec 1, 2025
226a4c6
Merge branch 'master' into improve-delete-hover-focus
JayGeorge Dec 2, 2025
74a0443
Fix previous conflicts
JayGeorge Dec 2, 2025
675512a
Merge branch 'master' into improve-delete-hover-focus
JayGeorge Dec 9, 2025
9843e6a
Fix previous conflict
JayGeorge Dec 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions config/cp.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@
// 'grays' => Color::Zinc,

// 'primary' => Color::Zinc[800],
// 'success' => Color::Green[400],
// 'danger' => Color::Red[600],

// 'ui-accent-bg' => Color::Zinc[800],
// 'ui-accent-text' => Color::Zinc[800],
Expand All @@ -134,6 +132,15 @@

// 'switch-bg' => Color::Green[500],
// 'dark-switch-bg' => Color::Green[600],

// 'success' => Color::Green[700],
// 'success-bg' => Color::Green[50],
// 'dark-success' => Color::Green[400],
// 'dark-success-bg' => Color::Green[950],
// 'danger' => Color::Red[700],
// 'danger-bg' => Color::Red[50],
// 'dark-danger' => Color::Red[400],
// 'dark-danger-bg' => Color::Red[950],
],

/*
Expand Down
22 changes: 17 additions & 5 deletions resources/css/components/fieldtypes/table.css
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
/* ==========================================================================
Table Fieldtype
========================================================================== */

/* TABLE FIELDTYPE
=================================================== */
.table-contained {
@apply relative mb-4 w-full rounded-lg border text-gray shadow-ui-sm outline-hidden dark:border-gray-700 dark:text-dark-150 text-start;
border-collapse: separate;
Expand Down Expand Up @@ -131,7 +129,21 @@ Table Fieldtype
&:focus-within {
@apply bg-gray-100 dark:bg-gray-700;
button {
@apply outline-hidden ring-0;
@apply ring-0;
}
}
}

/* TABLE FIELDTYPE / RED DELETE CONTROLS (RED)
=================================================== */
th,
.row-controls {
&:has([aria-label*="Delete"]:is(:hover, :focus)) {
--focus-outline-color: var(--color-danger);
background-color: var(--color-danger-bg);
svg {
color: var(--color-danger);
opacity: 1;
}
}
}
Expand Down
52 changes: 52 additions & 0 deletions resources/css/elements/base.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
--focus-within-outline-offset: 0px;
--focus-outline-color: var(--theme-color-focus-outline, var(--color-blue-400));
--focus-outline-style: solid;
--danger-outline-color: oklch(from var(--color-danger) l c h / 0.5);

/* The outline-offset value used for buttons */
--outline-offset-button: 6px;
Expand Down Expand Up @@ -100,6 +101,57 @@
}
}

/* DELETE STATES
=================================================== */
@layer utilities {
/* Delete buttons */
button:is(
/* Not Deselect because it's used for bulk actions e.g. selecting/deselecting entries */
/* [aria-label*="Deselect"], */
[aria-label*="Delete"],
[aria-label*="Clear"],
[aria-label*="Remove"],
[aria-label*="Reset"]
) {
/* For example, we don't want switches such as Select fieldtype > Clearable to get caught by this. For badges we'll do something different */
&:not([role="switch"], [data-ui-badge] &) {
--focus-outline-color: var(--danger-outline-color);
--focus-outline-width: 1px;
&:hover,
&:hover::before,
&:focus {
/* Delete states - use outline state instead so we don't have to worry about overriding borders, or adding borders to pseudo elements */
outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
outline-offset: var(--focus-outline-offset);
background: var(--color-danger-bg);
svg {
color: var(--color-danger);
/* Need !important to override dark mode */
opacity: 1!important;
}
}
&.bg-transparent {
border-radius: 100%;
}
}
}
/* DELETE STATES / BADGES
=================================================== */
/* When a badge "x" is hovered, the whole badge lights up red. */
[data-ui-badge]:has(button[aria-label*="Deselect"]:is(:hover, :focus)) {
--focus-outline-color: var(--danger-outline-color);
--focus-outline-width: 1px;
background: var(--color-danger-bg);
outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color);
outline-offset: var(--focus-outline-offset);
color: var(--color-danger);
/* Cancel the outline on the actual button since we're highlighting the entire badge */
button {
outline: none;
}
}
}

/* Prevent tailwind typography from adding backticks around code elements */
@utility prose {
code {
Expand Down
36 changes: 18 additions & 18 deletions resources/css/ui.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
--color-primary-border: color-mix(in oklch, var(--color-primary) 100%, black 20%);
--color-primary-hover: color-mix(in oklch, var(--color-primary) 100%, black 30%);
--color-primary-gap: color-mix(in oklch, var(--color-primary) 100%, black 50%);
--color-success: var(--theme-color-success);

--color-gray-50: var(--theme-color-gray-50);
--color-gray-100: var(--theme-color-gray-100);
--color-gray-150: var(--theme-color-gray-150);
Expand All @@ -17,7 +17,7 @@
--color-gray-850: var(--theme-color-gray-850);
--color-gray-900: var(--theme-color-gray-900);
--color-gray-925: var(--theme-color-gray-925);
--color-gray-950: var(--theme-color-zinc-950);
--color-gray-950: var(--theme-color-gray-950);
--color-volt: oklch(93.86% 0.2018 122.24);

--color-body-bg: var(--theme-color-body-bg);
Expand All @@ -30,6 +30,11 @@
--color-ui-accent-text: var(--theme-color-ui-accent-text);
--color-switch-bg: var(--theme-color-switch-bg);

--color-danger: var(--theme-color-danger);
--color-danger-bg: oklch(from var(--theme-color-danger-bg) l c h / var(--color-danger-bg-opacity, 1));
--color-success: var(--theme-color-success);
--color-success-bg: oklch(from var(--theme-color-success-bg) l c h / var(--color-success-bg-opacity, 1));

/* Temp */
--color-dark-100: #dfe1e5;
--color-dark-150: #bbbdc0;
Expand Down Expand Up @@ -83,11 +88,17 @@
--color-dark-gray: #404040;
}

.dark {
@theme inline {
--color-primary-hover: color-mix(in oklch, var(--color-primary) 100%, white 30%);
--color-success: var(--color-green-500);
--color-gray-950: hsl(240deg 7% 8%);
:root {
--animation-timing-function-fast-out-slow-in: cubic-bezier(.4,0,.2,1);

/* Custom value because gray-100 is too light and gray-200 is too dark, e.g. Bard active buttons */
--color-button-active: hsl(from var(--color-gray-300) h s l / 0.45);

&.dark {
--color-button-active: hsl(from var(--color-gray-700) h s l / 0.45);
/* Make the danger background slightly darker/more subtle in dark mode */
--color-danger-bg-opacity: 0.2;
--color-success-bg-opacity: 0.2;
}
}

Expand Down Expand Up @@ -122,16 +133,5 @@
}
}

:root {
--animation-timing-function-fast-out-slow-in: cubic-bezier(.4,0,.2,1);

/* Custom value because gray-100 is too light and gray-200 is too dark, e.g. Bard active buttons */
--color-button-active: hsl(from var(--color-gray-300) h s l / 0.45);
}

.dark {
--color-button-active: hsl(from var(--color-gray-700) h s l / 0.45);
}

@custom-variant with-contrast (&:where([data-contrast="increased"] *));

14 changes: 7 additions & 7 deletions resources/js/components/assets/Editor/Editor.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@
@completed="actionCompleted"
v-slot="{ actions }"
>
<ui-button inset size="sm" v-if="isImage && isFocalPointEditorEnabled" @click.prevent="openFocalPointEditor" icon="focus" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Focal Point')" />
<ui-button inset size="sm" v-if="canRunAction('rename_asset')" @click.prevent="runAction(actions, 'rename_asset')" icon="rename" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Rename')" />
<ui-button inset size="sm" v-if="canRunAction('move_asset')" @click.prevent="runAction(actions, 'move_asset')" icon="move-folder" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Move to Folder')" />
<ui-button inset size="sm" v-if="canRunAction('replace_asset')" @click.prevent="runAction(actions, 'replace_asset')" icon="replace" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Replace')" />
<ui-button inset size="sm" v-if="canRunAction('reupload_asset')" @click.prevent="runAction(actions, 'reupload_asset')" icon="upload-cloud" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Reupload')" />
<ui-button inset size="sm" @click="download" icon="download" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Download')" />
<ui-button inset size="sm" v-if="allowDeleting && canRunAction('delete')" @click="runAction(actions, 'delete')" icon="trash" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Delete')" />
<ui-button inset size="sm" v-if="isImage && isFocalPointEditorEnabled" @click.prevent="openFocalPointEditor" icon="focus" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Focal Point')" :aria-label="__('Focal Point')" />
<ui-button inset size="sm" v-if="canRunAction('rename_asset')" @click.prevent="runAction(actions, 'rename_asset')" icon="rename" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Rename')" :aria-label="__('Rename')" />
<ui-button inset size="sm" v-if="canRunAction('move_asset')" @click.prevent="runAction(actions, 'move_asset')" icon="move-folder" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Move to Folder')" :aria-label="__('Move to Folder')" />
<ui-button inset size="sm" v-if="canRunAction('replace_asset')" @click.prevent="runAction(actions, 'replace_asset')" icon="replace" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Replace')" :aria-label="__('Replace')" />
<ui-button inset size="sm" v-if="canRunAction('reupload_asset')" @click.prevent="runAction(actions, 'reupload_asset')" icon="upload-cloud" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Reupload')" :aria-label="__('Reupload')" />
<ui-button inset size="sm" @click="download" icon="download" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Download')" :aria-label="__('Download')" />
<ui-button inset size="sm" v-if="allowDeleting && canRunAction('delete')" @click="runAction(actions, 'delete')" icon="trash" variant="ghost" class="[&_svg]:!opacity-45" :text="__('Delete')" :aria-label="__('Delete')" />

<Dropdown class="me-4">
<DropdownMenu>
Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/blueprints/ImportField.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</div>
</div>
<div class="flex items-center gap-2">
<ui-button size="sm" icon="trash" variant="subtle" @click.prevent="$emit('deleted')" v-tooltip="__('Remove')" />
<ui-button size="sm" icon="trash" variant="subtle" @click.prevent="$emit('deleted')" :aria-label="__('Remove')" v-tooltip="__('Remove')" />
<stack name="field-settings" v-if="isEditing" @closed="editorClosed">
<field-settings
ref="settings"
Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/blueprints/RegularField.vue
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<div class="flex items-center">
<ui-button v-if="canDefineLocalizable" inset size="sm" icon="earth" :variant="localizable ? 'ghost-pressed' : 'subtle'" v-tooltip="__('Localizable')" @click="localizable = !localizable" />
<ui-button inset size="sm" icon="duplicate" variant="subtle" @click.prevent="$emit('duplicate')" v-tooltip="__('Duplicate')" />
<ui-button inset size="sm" icon="trash" variant="subtle" @click.prevent="$emit('deleted')" v-tooltip="__('Remove')" />
<ui-button inset size="sm" icon="trash" variant="subtle" @click.prevent="$emit('deleted')" :aria-label="__('Remove')" v-tooltip="__('Remove')" />
</div>

<stack name="field-settings" v-if="isEditing" @closed="editorClosed">
Expand Down
4 changes: 2 additions & 2 deletions resources/js/components/blueprints/Section.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<ui-icon :name="section.icon" :set="iconSet" v-if="section.icon" />
<ui-heading v-text="__(section.display ?? 'Section')" />
</div>
<ui-button icon="pencil-line" size="sm" variant="ghost" @click="edit" />
<ui-button icon="trash" size="sm" variant="ghost" @click.prevent="$emit('deleted')" />
<ui-button icon="pencil-line" size="sm" variant="ghost" @click="edit" :aria-label="__('Edit Section')" v-tooltip="__('Edit Section')" />
<ui-button icon="trash" size="sm" variant="ghost" @click.prevent="$emit('deleted')" :aria-label="__('Delete Section')" v-tooltip="__('Delete Section')" />
</ui-panel-header>

<Fields
Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/field-conditions/Condition.vue
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
@update:model-value="valueUpdated"
/>

<Button variant="ghost" size="sm" icon="trash" @click="remove" />
<Button variant="ghost" size="sm" icon="trash" :aria-label="__('Remove Condition')" @click="remove" />
</div>
</template>

Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/field-validation/Builder.vue
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@
<button
type="button"
class="opacity-75 hover:opacity-100 cursor-pointer"
:aria-label="__('Deselect option')"
:aria-label="__('Remove Validation Rule')"
@click="remove(rule)"
>
&times;
Expand Down
1 change: 1 addition & 0 deletions resources/js/components/fieldtypes/ListFieldtype.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<button
@click="deleteValue(index)"
class="inline text-lg antialiased opacity-25 hover:opacity-75 cursor-pointer"
:aria-label="__('Delete Value')"
>
&times;
</button>
Expand Down
2 changes: 1 addition & 1 deletion resources/js/components/fieldtypes/bard/Image.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
<Button v-if="src" size="sm" icon="edit" :text="__('Edit Image')" @click="edit" />
<Button v-if="src" size="sm" icon="rename" :text="__('Override Alt')" :class="{ active: showingAltEdit }" @click="toggleAltEditor" />
<Button v-if="src" size="sm" icon="replace" :text="__('Replace')" @click="openSelector" />
<Button v-if="src" size="sm" icon="trash" :text="__('Remove')" @click="deleteNode" />
<Button v-if="src" size="sm" icon="trash" :text="__('Remove')" :aria-label="__('Remove')" v-tooltip="__('Remove')" @click="deleteNode" />
</div>

<div
Expand Down
3 changes: 3 additions & 0 deletions resources/js/components/fieldtypes/bard/LinkToolbar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,21 @@
<ui-button
@click="$emit('canceled')"
:text="__('Cancel')"
:aria-label="__('Cancel')"
size="sm"
inset
variant="ghost"
/>
<ui-button
:text="__('Remove Link')"
:aria-label="__('Remove Link')"
@click="remove"
size="sm"
inset
/>
<ui-button
:text="__('Apply Link')"
:aria-label="__('Apply Link')"
:disabled="!canCommit"
@click="commit"
size="sm"
Expand Down
2 changes: 2 additions & 0 deletions resources/js/components/fieldtypes/grid/StackedRow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
<ui-button
v-if="canAddRows"
@click="$emit('duplicate', index)"
:aria-label="__('Duplicate Row')"
v-tooltip="__('Duplicate Row')"
icon="duplicate"
variant="ghost"
Expand All @@ -19,6 +20,7 @@
<ui-button
v-if="canDelete"
@click="$emit('removed', index)"
:aria-label="__('Delete Row')"
v-tooltip="__('Delete Row')"
icon="trash"
variant="ghost"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
>
<template #action-buttons-right>
<slot name="action-buttons-right" />
<Button icon="x" size="sm" variant="ghost" class="-me-2" @click="close" />
<Button icon="x" size="sm" variant="ghost" class="-me-2" :aria-label="__('Close')" @click="close" />
</template>
</component>
</div>
Expand All @@ -38,6 +38,7 @@
:body-text="__('Are you sure? Unsaved changes will be lost.')"
:button-text="__('Discard Changes')"
:danger="true"
:aria-label="__('Discard Changes')"
@confirm="confirmCloseWithChanges"
@cancel="closingWithChanges = false"
/>
Expand Down
2 changes: 2 additions & 0 deletions resources/js/components/inputs/relationship/Item.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,13 @@
v-if="editable"
:text="__('Edit')"
@click="edit"
:aria-label="__('Edit')"
/>
<DropdownItem
:text="__('Unlink')"
variant="destructive"
@click="$emit('removed')"
:aria-label="__('Unlink')"
/>
</DropdownMenu>
</Dropdown>
Expand Down
Loading
Loading