From 197281bb08dd4e3e1c5faae18da56c13878eae48 Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Wed, 1 Apr 2026 15:16:46 -0500 Subject: [PATCH 1/5] `.c-colorable` -> `.cp-colorable` for consistency --- .../craftcms-cp/scripts/generate-colors.js | 4 +- .../src/styles/shared/colorable.css | 60 +++++++++---------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/packages/craftcms-cp/scripts/generate-colors.js b/packages/craftcms-cp/scripts/generate-colors.js index 5533c2423f7..995c709da7c 100644 --- a/packages/craftcms-cp/scripts/generate-colors.js +++ b/packages/craftcms-cp/scripts/generate-colors.js @@ -136,7 +136,7 @@ function buildTokens(colors, scaleFn) { } function buildStyleBlock(color) { - return `.c-colorable--${color}, + return `.cp-colorable--${color}, [data-color='${color}'] { --c-color-fill-quiet: var(--c-color-${color}-fill-quiet); --c-color-border-quiet: var(--c-color-${color}-border-quiet); @@ -161,7 +161,7 @@ ${buildTokens(colors, lightScale)} ${buildTokens(colors, darkScale)} } -.c-colorable, +.cp-colorable, [data-color] { --c-color-fill-quiet: var(--c-color-neutral-fill-quiet); --c-color-fill-normal: var(--c-color-neutral-fill-normal); diff --git a/packages/craftcms-cp/src/styles/shared/colorable.css b/packages/craftcms-cp/src/styles/shared/colorable.css index 7e82e67bb61..e703dc37a71 100644 --- a/packages/craftcms-cp/src/styles/shared/colorable.css +++ b/packages/craftcms-cp/src/styles/shared/colorable.css @@ -1,4 +1,4 @@ -/* Auto-generated by scripts/generate-colors.ts — do not edit manually */ +/* Auto-generated by scripts/generate-colors.js — do not edit manually */ :root { /* red */ @@ -215,8 +215,8 @@ --c-color-black-fill-normal: var(--color-gray-900); --c-color-black-fill-loud: var(--color-gray-900); --c-color-black-border-quiet: var(--color-gray-800); - --c-color-black-border-normal: undefined; - --c-color-black-border-loud: undefined; + --c-color-black-border-normal: var(--color-gray-800); + --c-color-black-border-loud: var(--color-gray-800); --c-color-black-on-quiet: var(--color-gray-100); --c-color-black-on-normal: var(--color-gray-100); --c-color-black-on-loud: var(--color-gray-100); @@ -444,24 +444,24 @@ --c-color-black-on-loud: var(--color-gray-300); } -.c-colorable, +.cp-colorable, [data-color] { --c-color-fill-quiet: var(--c-color-neutral-fill-quiet); - --c-color-fill-normal: var(--c-color-neutral-fill-quiet); - --c-color-fill-loud: var(--c-color-neutral-fill-quiet); + --c-color-fill-normal: var(--c-color-neutral-fill-normal); + --c-color-fill-loud: var(--c-color-neutral-fill-loud); --c-color-border-quiet: var(--c-color-neutral-border-quiet); - --c-color-border-normal: var(--c-color-neutral-border-quiet); - --c-color-border-loud: var(--c-color-neutral-border-quiet); + --c-color-border-normal: var(--c-color-neutral-border-normal); + --c-color-border-loud: var(--c-color-neutral-border-loud); --c-color-on-quiet: var(--c-color-neutral-on-quiet); - --c-color-on-normal: var(--c-color-neutral-on-quiet); - --c-color-on-loud: var(--c-color-neutral-on-quiet); + --c-color-on-normal: var(--c-color-neutral-on-normal); + --c-color-on-loud: var(--c-color-neutral-on-loud); background-color: var(--c-color-fill-quiet); border-color: var(--c-color-border-quiet); color: var(--c-color-on-quiet); } -.c-colorable--red, +.cp-colorable--red, [data-color='red'] { --c-color-fill-quiet: var(--c-color-red-fill-quiet); --c-color-border-quiet: var(--c-color-red-border-quiet); @@ -473,7 +473,7 @@ --c-color-border-loud: var(--c-color-red-border-loud); --c-color-on-loud: var(--c-color-red-on-loud); } -.c-colorable--orange, +.cp-colorable--orange, [data-color='orange'] { --c-color-fill-quiet: var(--c-color-orange-fill-quiet); --c-color-border-quiet: var(--c-color-orange-border-quiet); @@ -485,7 +485,7 @@ --c-color-border-loud: var(--c-color-orange-border-loud); --c-color-on-loud: var(--c-color-orange-on-loud); } -.c-colorable--amber, +.cp-colorable--amber, [data-color='amber'] { --c-color-fill-quiet: var(--c-color-amber-fill-quiet); --c-color-border-quiet: var(--c-color-amber-border-quiet); @@ -497,7 +497,7 @@ --c-color-border-loud: var(--c-color-amber-border-loud); --c-color-on-loud: var(--c-color-amber-on-loud); } -.c-colorable--yellow, +.cp-colorable--yellow, [data-color='yellow'] { --c-color-fill-quiet: var(--c-color-yellow-fill-quiet); --c-color-border-quiet: var(--c-color-yellow-border-quiet); @@ -509,7 +509,7 @@ --c-color-border-loud: var(--c-color-yellow-border-loud); --c-color-on-loud: var(--c-color-yellow-on-loud); } -.c-colorable--lime, +.cp-colorable--lime, [data-color='lime'] { --c-color-fill-quiet: var(--c-color-lime-fill-quiet); --c-color-border-quiet: var(--c-color-lime-border-quiet); @@ -521,7 +521,7 @@ --c-color-border-loud: var(--c-color-lime-border-loud); --c-color-on-loud: var(--c-color-lime-on-loud); } -.c-colorable--green, +.cp-colorable--green, [data-color='green'] { --c-color-fill-quiet: var(--c-color-green-fill-quiet); --c-color-border-quiet: var(--c-color-green-border-quiet); @@ -533,7 +533,7 @@ --c-color-border-loud: var(--c-color-green-border-loud); --c-color-on-loud: var(--c-color-green-on-loud); } -.c-colorable--emerald, +.cp-colorable--emerald, [data-color='emerald'] { --c-color-fill-quiet: var(--c-color-emerald-fill-quiet); --c-color-border-quiet: var(--c-color-emerald-border-quiet); @@ -545,7 +545,7 @@ --c-color-border-loud: var(--c-color-emerald-border-loud); --c-color-on-loud: var(--c-color-emerald-on-loud); } -.c-colorable--teal, +.cp-colorable--teal, [data-color='teal'] { --c-color-fill-quiet: var(--c-color-teal-fill-quiet); --c-color-border-quiet: var(--c-color-teal-border-quiet); @@ -557,7 +557,7 @@ --c-color-border-loud: var(--c-color-teal-border-loud); --c-color-on-loud: var(--c-color-teal-on-loud); } -.c-colorable--cyan, +.cp-colorable--cyan, [data-color='cyan'] { --c-color-fill-quiet: var(--c-color-cyan-fill-quiet); --c-color-border-quiet: var(--c-color-cyan-border-quiet); @@ -569,7 +569,7 @@ --c-color-border-loud: var(--c-color-cyan-border-loud); --c-color-on-loud: var(--c-color-cyan-on-loud); } -.c-colorable--sky, +.cp-colorable--sky, [data-color='sky'] { --c-color-fill-quiet: var(--c-color-sky-fill-quiet); --c-color-border-quiet: var(--c-color-sky-border-quiet); @@ -581,7 +581,7 @@ --c-color-border-loud: var(--c-color-sky-border-loud); --c-color-on-loud: var(--c-color-sky-on-loud); } -.c-colorable--blue, +.cp-colorable--blue, [data-color='blue'] { --c-color-fill-quiet: var(--c-color-blue-fill-quiet); --c-color-border-quiet: var(--c-color-blue-border-quiet); @@ -593,7 +593,7 @@ --c-color-border-loud: var(--c-color-blue-border-loud); --c-color-on-loud: var(--c-color-blue-on-loud); } -.c-colorable--indigo, +.cp-colorable--indigo, [data-color='indigo'] { --c-color-fill-quiet: var(--c-color-indigo-fill-quiet); --c-color-border-quiet: var(--c-color-indigo-border-quiet); @@ -605,7 +605,7 @@ --c-color-border-loud: var(--c-color-indigo-border-loud); --c-color-on-loud: var(--c-color-indigo-on-loud); } -.c-colorable--violet, +.cp-colorable--violet, [data-color='violet'] { --c-color-fill-quiet: var(--c-color-violet-fill-quiet); --c-color-border-quiet: var(--c-color-violet-border-quiet); @@ -617,7 +617,7 @@ --c-color-border-loud: var(--c-color-violet-border-loud); --c-color-on-loud: var(--c-color-violet-on-loud); } -.c-colorable--purple, +.cp-colorable--purple, [data-color='purple'] { --c-color-fill-quiet: var(--c-color-purple-fill-quiet); --c-color-border-quiet: var(--c-color-purple-border-quiet); @@ -629,7 +629,7 @@ --c-color-border-loud: var(--c-color-purple-border-loud); --c-color-on-loud: var(--c-color-purple-on-loud); } -.c-colorable--fuchsia, +.cp-colorable--fuchsia, [data-color='fuchsia'] { --c-color-fill-quiet: var(--c-color-fuchsia-fill-quiet); --c-color-border-quiet: var(--c-color-fuchsia-border-quiet); @@ -641,7 +641,7 @@ --c-color-border-loud: var(--c-color-fuchsia-border-loud); --c-color-on-loud: var(--c-color-fuchsia-on-loud); } -.c-colorable--pink, +.cp-colorable--pink, [data-color='pink'] { --c-color-fill-quiet: var(--c-color-pink-fill-quiet); --c-color-border-quiet: var(--c-color-pink-border-quiet); @@ -653,7 +653,7 @@ --c-color-border-loud: var(--c-color-pink-border-loud); --c-color-on-loud: var(--c-color-pink-on-loud); } -.c-colorable--rose, +.cp-colorable--rose, [data-color='rose'] { --c-color-fill-quiet: var(--c-color-rose-fill-quiet); --c-color-border-quiet: var(--c-color-rose-border-quiet); @@ -665,7 +665,7 @@ --c-color-border-loud: var(--c-color-rose-border-loud); --c-color-on-loud: var(--c-color-rose-on-loud); } -.c-colorable--white, +.cp-colorable--white, [data-color='white'] { --c-color-fill-quiet: var(--c-color-white-fill-quiet); --c-color-border-quiet: var(--c-color-white-border-quiet); @@ -677,7 +677,7 @@ --c-color-border-loud: var(--c-color-white-border-loud); --c-color-on-loud: var(--c-color-white-on-loud); } -.c-colorable--gray, +.cp-colorable--gray, [data-color='gray'] { --c-color-fill-quiet: var(--c-color-gray-fill-quiet); --c-color-border-quiet: var(--c-color-gray-border-quiet); @@ -689,7 +689,7 @@ --c-color-border-loud: var(--c-color-gray-border-loud); --c-color-on-loud: var(--c-color-gray-on-loud); } -.c-colorable--black, +.cp-colorable--black, [data-color='black'] { --c-color-fill-quiet: var(--c-color-black-fill-quiet); --c-color-border-quiet: var(--c-color-black-border-quiet); From b1fd75feea3cc9a572bd954bb790d5f5ecbdd560 Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Wed, 1 Apr 2026 15:17:28 -0500 Subject: [PATCH 2/5] Inject `headHtml` and `bodyHtml` when present --- resources/js/composables/useAppendHtml.ts | 26 +++++++++++++++++++++++ resources/js/layout/AppLayout.vue | 4 ++++ 2 files changed, 30 insertions(+) create mode 100644 resources/js/composables/useAppendHtml.ts diff --git a/resources/js/composables/useAppendHtml.ts b/resources/js/composables/useAppendHtml.ts new file mode 100644 index 00000000000..af3799c484f --- /dev/null +++ b/resources/js/composables/useAppendHtml.ts @@ -0,0 +1,26 @@ +import {watch} from 'vue'; +import { + appendBodyHtml, + appendHeadHtml, +} from '../../../packages/craftcms-cp/src'; +import {usePage} from '@inertiajs/vue3'; + +export function useAppendHtml() { + const page = usePage<{ + headHtml?: string; + bodyHtml?: string; + }>(); + + watch( + () => [page.props.headHtml, page.props.bodyHtml], + async ([headHtml, bodyHtml]) => { + if (headHtml) { + await appendHeadHtml(headHtml); + } + + if (bodyHtml) { + await appendBodyHtml(bodyHtml); + } + } + ); +} diff --git a/resources/js/layout/AppLayout.vue b/resources/js/layout/AppLayout.vue index 5a0e7b2780f..f83d4927339 100644 --- a/resources/js/layout/AppLayout.vue +++ b/resources/js/layout/AppLayout.vue @@ -9,6 +9,7 @@ import Breadcrumbs from '@/components/Breadcrumbs.vue'; import {useAnnouncer} from '@/composables/useAnnouncer'; import LiveRegion from '@/components/LiveRegion.vue'; + import {useAppendHtml} from '@/composables/useAppendHtml'; withDefaults( defineProps<{ @@ -38,6 +39,9 @@ watch(successFlash, (newMessage) => announce(newMessage)); watch(errorFlash, (newMessage) => announce(newMessage)); + // Inject headHtml and bodyHtml when present + useAppendHtml(); + const state = reactive<{ sidebar: { mode: 'docked' | 'floating'; From 1d3e7db312e779861d1c461a4dbf47701bb05ee2 Mon Sep 17 00:00:00 2001 From: Brian Hanson Date: Wed, 1 Apr 2026 15:46:52 -0500 Subject: [PATCH 3/5] Rendering working chips --- .../src/components/chip/chip.styles.ts | 4 +- .../craftcms-cp/src/styles/shared/base.css | 13 +- .../js/components/form/ComponentSelect.vue | 217 ++++++++++++ .../js/components/form/EntryTypeSelect.vue | 309 ++---------------- .../js/pages/SettingsSectionsEditPage.vue | 5 +- .../templates/_includes/disclosuremenu.twig | 33 +- src/Cp/Html/ElementHtml.php | 76 +++-- src/Entry/Data/EntryType.php | 2 +- .../Settings/SectionsController.php | 3 +- src/Shared/Enums/Color.php | 4 +- yii2-adapter/.stylelintrc.json | 7 +- .../legacy/web/assets/cp/src/css/_cp.scss | 15 - .../legacy/web/assets/cp/src/css/craft.scss | 33 +- 13 files changed, 327 insertions(+), 394 deletions(-) create mode 100644 resources/js/components/form/ComponentSelect.vue diff --git a/packages/craftcms-cp/src/components/chip/chip.styles.ts b/packages/craftcms-cp/src/components/chip/chip.styles.ts index 0b23608dd77..7e44dfd6faa 100644 --- a/packages/craftcms-cp/src/components/chip/chip.styles.ts +++ b/packages/craftcms-cp/src/components/chip/chip.styles.ts @@ -37,13 +37,13 @@ export default css` .cp-chip[size='small'], .cp-chip--small { - padding-block: 0; + padding-block: var(--c-spacing-xs); min-height: var(--c-size-control-sm); } .cp-chip[size='medium'], .cp-chip--medium { - padding-block: 0; + padding-block: var(--c-spacing-sm); min-height: var(--c-size-control-md); } diff --git a/packages/craftcms-cp/src/styles/shared/base.css b/packages/craftcms-cp/src/styles/shared/base.css index fea2a124570..fdf8d305b3b 100644 --- a/packages/craftcms-cp/src/styles/shared/base.css +++ b/packages/craftcms-cp/src/styles/shared/base.css @@ -40,12 +40,17 @@ ul { list-style: none; } -.code { - font-size: 0.9em; +.cp-code { + font-size: 0.75em; + font-family: var(--c-font-mono); display: inline-flex; padding: 0 var(--c-spacing-sm); - border: 1px solid rgba(0, 0, 0, 0.2); - background-color: rgba(0, 0, 0, 0.05); + color: var(--c-color-on-quiet); + border: 1px solid var(--c-color-border-quiet); + background-color: color-mix( + var(--c-color-fill-loud) 10%, + var(--c-color-fill-quiet) + ); border-radius: var(--c-radius-sm); } diff --git a/resources/js/components/form/ComponentSelect.vue b/resources/js/components/form/ComponentSelect.vue new file mode 100644 index 00000000000..72324fc6be8 --- /dev/null +++ b/resources/js/components/form/ComponentSelect.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/resources/js/components/form/EntryTypeSelect.vue b/resources/js/components/form/EntryTypeSelect.vue index 2498ff8fd51..c78560ad24a 100644 --- a/resources/js/components/form/EntryTypeSelect.vue +++ b/resources/js/components/form/EntryTypeSelect.vue @@ -1,295 +1,32 @@