@kerfjs/ui 5.0.0-beta.106 → 5.0.0-beta.108
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/ai/application-ui-diagnostic-ids-v1.json +1 -0
- package/ai/application-ui-profile.defaults.json +6 -1
- package/ai/component-catalog.json +184 -39
- package/ai/component-composition-rules.json +20 -2
- package/ai/component-composition.d.ts +11 -0
- package/ai/component-composition.json +126 -21
- package/ai/component-composition.schema.json +32 -0
- package/ai/components/README.md +3 -2
- package/ai/components/button.md +9 -6
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +3 -2
- package/ai/components/chip.md +1 -0
- package/ai/components/color-picker.md +10 -7
- package/ai/components/disclosure.md +6 -1
- package/ai/components/foundation.md +1 -1
- package/ai/components/list-detail-dialog.md +1 -1
- package/ai/components/list.md +1 -1
- package/ai/components/message-composer.md +2 -1
- package/ai/components/radio-group.md +4 -3
- package/ai/components/segmented-control.md +1 -0
- package/ai/components/split-button.md +5 -2
- package/ai/components/surface-scaffold.md +3 -1
- package/ai/components/switch.md +1 -1
- package/ai/components/text-field.md +3 -1
- package/ai/components/text.md +2 -0
- package/ai/components/toolbar-control-group.md +1 -0
- package/ai/components/toolbar.md +1 -1
- package/ai/components/wa-checkbox-group.md +5 -5
- package/ai/components/workbench-dialog.md +1 -1
- package/ai/public-api-signatures-v1.md +258 -35
- package/ai/skill.md +82 -65
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/button.d.ts +18 -5
- package/dist/button.js +1 -1
- package/dist/catalog.js +11 -10
- package/dist/catalog.js.map +1 -1
- package/dist/checkbox-group.d.ts +70 -0
- package/dist/checkbox-group.js +7 -0
- package/dist/checkbox-group.js.map +1 -0
- package/dist/chip.d.ts +20 -2
- package/dist/chip.js +2 -1
- package/dist/{chunk-SQ2Q3OQI.js → chunk-2LM3PYHA.js} +2 -2
- package/dist/{chunk-SQ2Q3OQI.js.map → chunk-2LM3PYHA.js.map} +1 -1
- package/dist/{chunk-HYORKKYP.js → chunk-3VZ6SFD4.js} +1 -1
- package/dist/chunk-3VZ6SFD4.js.map +1 -0
- package/dist/{chunk-EKBMUXFV.js → chunk-3Z7N2NAZ.js} +141 -54
- package/dist/chunk-3Z7N2NAZ.js.map +1 -0
- package/dist/{chunk-23PPPNH6.js → chunk-4OV272LF.js} +2 -2
- package/dist/{chunk-23PPPNH6.js.map → chunk-4OV272LF.js.map} +1 -1
- package/dist/{chunk-2PXZBFEC.js → chunk-5J6Z4BWY.js} +1 -1
- package/dist/{chunk-2PXZBFEC.js.map → chunk-5J6Z4BWY.js.map} +1 -1
- package/dist/{chunk-TAHR457X.js → chunk-6CDILXF4.js} +5 -1
- package/dist/chunk-6CDILXF4.js.map +1 -0
- package/dist/{chunk-DDSCVEO5.js → chunk-CPSGUGAY.js} +6 -6
- package/dist/{chunk-DDSCVEO5.js.map → chunk-CPSGUGAY.js.map} +1 -1
- package/dist/{chunk-C3RLKKFQ.js → chunk-EYDXFOSH.js} +13 -8
- package/dist/chunk-EYDXFOSH.js.map +1 -0
- package/dist/{chunk-PE2KPZDW.js → chunk-HDXUHLTQ.js} +7 -2
- package/dist/chunk-HDXUHLTQ.js.map +1 -0
- package/dist/chunk-HU5IHXCI.js +73 -0
- package/dist/chunk-HU5IHXCI.js.map +1 -0
- package/dist/{chunk-DF2YKGIX.js → chunk-JCCN3U6X.js} +2 -2
- package/dist/{chunk-DF2YKGIX.js.map → chunk-JCCN3U6X.js.map} +1 -1
- package/dist/{chunk-UTCAOOXU.js → chunk-KPINJHIC.js} +8 -2
- package/dist/chunk-KPINJHIC.js.map +1 -0
- package/dist/{chunk-N7MBGONH.js → chunk-LMHN2TJL.js} +22 -2
- package/dist/chunk-LMHN2TJL.js.map +1 -0
- package/dist/{chunk-NS2TBYM4.js → chunk-LZUUUHNH.js} +7 -3
- package/dist/chunk-LZUUUHNH.js.map +1 -0
- package/dist/{chunk-GCAK23PU.js → chunk-MVKHSAKE.js} +2 -2
- package/dist/{chunk-GCAK23PU.js.map → chunk-MVKHSAKE.js.map} +1 -1
- package/dist/{chunk-OY2MXIBB.js → chunk-NB6POCFH.js} +3 -1
- package/dist/chunk-NB6POCFH.js.map +1 -0
- package/dist/{chunk-ECFCAKWE.js → chunk-NR6O74ST.js} +5 -1
- package/dist/chunk-NR6O74ST.js.map +1 -0
- package/dist/{chunk-7W3GKMN4.js → chunk-OQP3PFKQ.js} +7 -4
- package/dist/chunk-OQP3PFKQ.js.map +1 -0
- package/dist/{chunk-FKKJHGN5.js → chunk-P7EJ4CAD.js} +2 -2
- package/dist/{chunk-FKKJHGN5.js.map → chunk-P7EJ4CAD.js.map} +1 -1
- package/dist/{chunk-ZXZAECHZ.js → chunk-SOFPUW3O.js} +4 -4
- package/dist/{chunk-ZXZAECHZ.js.map → chunk-SOFPUW3O.js.map} +1 -1
- package/dist/{chunk-WJKHLOP5.js → chunk-TI2GV36S.js} +8 -2
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-QLA25V2K.js → chunk-WPNIKZMJ.js} +15 -1
- package/dist/chunk-WPNIKZMJ.js.map +1 -0
- package/dist/{chunk-FG6U7KQQ.js → chunk-WSEJ2FDE.js} +4 -4
- package/dist/{chunk-FG6U7KQQ.js.map → chunk-WSEJ2FDE.js.map} +1 -1
- package/dist/{chunk-ACUKTVS3.js → chunk-XWNXGFX3.js} +52 -42
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/{chunk-WU57BYYM.js → chunk-YVZCKXR3.js} +8 -2
- package/dist/chunk-YVZCKXR3.js.map +1 -0
- package/dist/{chunk-CMLPFIC5.js → chunk-ZN7KUMPY.js} +3 -1
- package/dist/chunk-ZN7KUMPY.js.map +1 -0
- package/dist/collapsible-panel.js +2 -2
- package/dist/color-picker.d.ts +30 -5
- package/dist/color-picker.js +1 -1
- package/dist/disclosure.d.ts +13 -4
- package/dist/disclosure.js.map +1 -1
- package/dist/help-tags-register.js +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +24 -23
- package/dist/list-action-row.js +1 -1
- package/dist/list-detail-dialog.d.ts +7 -1
- package/dist/list-detail-dialog.js +7 -5
- package/dist/list-detail-dialog.js.map +1 -1
- package/dist/list-header.d.ts +8 -1
- package/dist/list-header.js +1 -1
- package/dist/list.d.ts +7 -1
- package/dist/list.js +1 -1
- package/dist/message-composer.js +1 -1
- package/dist/nav-stack.js +1 -1
- package/dist/popup-menu-register.js +2 -2
- package/dist/popup-menu.d.ts +15 -5
- package/dist/popup-menu.js +1 -1
- package/dist/segmented-control.d.ts +3 -1
- package/dist/segmented-control.js +1 -1
- package/dist/select-register.js +3 -3
- package/dist/split-button.d.ts +14 -2
- package/dist/split-button.js +1 -1
- package/dist/split-view.js +1 -1
- package/dist/styles/anchored-surface.css +3 -0
- package/dist/styles/button.css +57 -2
- package/dist/styles/catalog/components/catalog-example.css +55 -18
- package/dist/styles/checkbox-group.css +63 -0
- package/dist/styles/checkbox.css +7 -6
- package/dist/styles/color-picker.css +69 -34
- package/dist/styles/components/actions/button/button.css +57 -2
- package/dist/styles/components/actions/split-button/split-button.css +51 -5
- package/dist/styles/components/actions/toolbar/toolbar.css +9 -0
- package/dist/styles/components/actions/toolbar-control-group/toolbar-control-group.css +29 -1
- package/dist/styles/components/collections/framed-list/framed-list.css +6 -0
- package/dist/styles/components/collections/list/list.css +6 -0
- package/dist/styles/components/collections/list-header/list-header.css +7 -0
- package/dist/styles/components/feedback/anchored-surface/anchored-surface.css +3 -0
- package/dist/styles/components/forms/checkbox/checkbox.css +7 -6
- package/dist/styles/components/forms/checkbox-group/checkbox-group.css +63 -0
- package/dist/styles/components/forms/color-picker/color-picker.css +69 -34
- package/dist/styles/components/forms/radio-group/radio-group.css +7 -5
- package/dist/styles/components/forms/select/select.css +6 -2
- package/dist/styles/components/forms/switch/switch.css +3 -3
- package/dist/styles/components/layout/pane/pane.css +24 -0
- package/dist/styles/components/layout/workbench/workbench.css +4 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +77 -1
- package/dist/styles/components/navigation/tab-bar/tab-bar.css +6 -0
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +17 -0
- package/dist/styles/components/surfaces/content-item/content-item.css +30 -0
- package/dist/styles/components/surfaces/disclosure/disclosure.css +38 -0
- package/dist/styles/components/surfaces/sunken-panel/sunken-panel.css +3 -0
- package/dist/styles/components/surfaces/surface-scaffold/surface-scaffold.css +8 -0
- package/dist/styles/components/typography/text/text.css +10 -0
- package/dist/styles/content-item.css +30 -0
- package/dist/styles/disclosure.css +38 -0
- package/dist/styles/foundation.css +78 -13
- package/dist/styles/framed-list.css +6 -0
- package/dist/styles/list-header.css +7 -0
- package/dist/styles/list.css +6 -0
- package/dist/styles/nav-stack.css +77 -1
- package/dist/styles/pane.css +24 -0
- package/dist/styles/radio-group.css +7 -5
- package/dist/styles/select.css +6 -2
- package/dist/styles/split-button.css +51 -5
- package/dist/styles/styles.css +1 -0
- package/dist/styles/sunken-panel.css +3 -0
- package/dist/styles/surface-scaffold.css +8 -0
- package/dist/styles/switch.css +3 -3
- package/dist/styles/tab-bar.css +6 -0
- package/dist/styles/tab-navigator.css +17 -0
- package/dist/styles/text.css +10 -0
- package/dist/styles/toolbar-control-group.css +29 -1
- package/dist/styles/toolbar.css +9 -0
- package/dist/styles/webawesome.css +56 -12
- package/dist/styles/workbench.css +4 -0
- package/dist/surface-scaffold.d.ts +15 -1
- package/dist/surface-scaffold.js +1 -1
- package/dist/text-field.d.ts +7 -1
- package/dist/text-field.js +1 -1
- package/dist/toolbar-control-group.d.ts +8 -2
- package/dist/toolbar-control-group.js +1 -1
- package/dist/toolbar.d.ts +6 -1
- package/dist/toolbar.js +1 -1
- package/dist/wire-catalog.js +1 -1
- package/dist/wire-color-fields.js +2 -2
- package/dist/wire-color-pickers.d.ts +4 -3
- package/dist/wire-color-pickers.js +1 -1
- package/dist/wire-comboboxes.js +1 -1
- package/dist/wire-workbench.js +1 -1
- package/dist/workbench-dialog.d.ts +11 -2
- package/dist/workbench-dialog.js +6 -3
- package/dist/workbench-dialog.js.map +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +58 -3
- package/docs/anchored-surface.md +6 -1
- package/docs/catalog.md +26 -1
- package/docs/color-picker.md +39 -8
- package/docs/component-contract.md +47 -3
- package/docs/component-selection.md +58 -21
- package/docs/design/templates/button/full-width-dark.svg +1 -0
- package/docs/design/templates/button/full-width.svg +1 -0
- package/docs/design/templates/button/tones-dark.svg +1 -1
- package/docs/design/templates/button/tones.svg +1 -1
- package/docs/design/templates/button-dark.svg +1 -1
- package/docs/design/templates/button.svg +1 -1
- package/docs/design/templates/checkbox/error-dark.svg +1 -1
- package/docs/design/templates/checkbox/error.svg +1 -1
- package/docs/design/templates/checkbox/states-dark.svg +1 -1
- package/docs/design/templates/checkbox/states.svg +1 -1
- package/docs/design/templates/checkbox-dark.svg +1 -1
- package/docs/design/templates/checkbox-group/horizontal-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/horizontal.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical-dark.svg +1 -0
- package/docs/design/templates/checkbox-group/vertical.svg +1 -0
- package/docs/design/templates/checkbox-group-dark.svg +1 -0
- package/docs/design/templates/checkbox-group.svg +1 -0
- package/docs/design/templates/checkbox.svg +1 -1
- package/docs/design/templates/color-picker/gray-dark.svg +1 -1
- package/docs/design/templates/color-picker/gray.svg +1 -1
- package/docs/design/templates/color-picker/hsb-dark.svg +1 -0
- package/docs/design/templates/color-picker/hsb.svg +1 -0
- package/docs/design/templates/color-picker/rgb-dark.svg +1 -1
- package/docs/design/templates/color-picker/rgb.svg +1 -1
- package/docs/design/templates/color-picker-dark.svg +1 -1
- package/docs/design/templates/color-picker.svg +1 -1
- package/docs/design/templates/disclosure/embedded-dark.svg +1 -0
- package/docs/design/templates/disclosure/embedded.svg +1 -0
- package/docs/design/templates/disclosure-dark.svg +1 -1
- package/docs/design/templates/disclosure.svg +1 -1
- package/docs/design/templates/radio-group/horizontal-dark.svg +1 -1
- package/docs/design/templates/radio-group/horizontal.svg +1 -1
- package/docs/design/templates/radio-group/vertical-dark.svg +1 -1
- package/docs/design/templates/radio-group/vertical.svg +1 -1
- package/docs/design/templates/radio-group-dark.svg +1 -1
- package/docs/design/templates/radio-group.svg +1 -1
- package/docs/design/templates/split-button/full-width-dark.svg +1 -0
- package/docs/design/templates/split-button/full-width.svg +1 -0
- package/docs/design/templates/split-button/pill-dark.svg +1 -0
- package/docs/design/templates/split-button/pill.svg +1 -0
- package/docs/design/templates/split-button/states-dark.svg +1 -0
- package/docs/design/templates/split-button/states.svg +1 -0
- package/docs/design/templates/split-button/tones-dark.svg +1 -0
- package/docs/design/templates/split-button/tones.svg +1 -0
- package/docs/design/templates/split-button-dark.svg +1 -0
- package/docs/design/templates/split-button.svg +1 -0
- package/docs/design/templates/switch/states-dark.svg +1 -1
- package/docs/design/templates/switch/states.svg +1 -1
- package/docs/design/templates/switch-dark.svg +1 -1
- package/docs/design/templates/switch.svg +1 -1
- package/docs/design/templates/text-field/number-dark.svg +1 -0
- package/docs/design/templates/text-field/number.svg +1 -0
- package/docs/design/templates/text-field-dark.svg +1 -1
- package/docs/design/templates/text-field.svg +1 -1
- package/docs/design/templates.md +10 -3
- package/docs/disclosure.md +34 -0
- package/docs/layout.md +16 -5
- package/docs/list-detail-dialog.md +4 -0
- package/docs/nav-stack.md +6 -2
- package/docs/surface-scaffold.md +6 -2
- package/docs/ui-doctor.md +16 -4
- package/docs/webawesome-migration.md +3 -1
- package/docs/webawesome-theme.md +56 -18
- package/docs/workbench-dialog.md +4 -1
- package/docs/workbench.md +7 -1
- package/docs/writing.md +3 -3
- package/doctor/copy-capitalization-checks.mjs +10 -7
- package/llms.txt +65 -23
- package/package.json +7 -1
- package/dist/chunk-7W3GKMN4.js.map +0 -1
- package/dist/chunk-ACUKTVS3.js.map +0 -1
- package/dist/chunk-C3RLKKFQ.js.map +0 -1
- package/dist/chunk-CMLPFIC5.js.map +0 -1
- package/dist/chunk-ECFCAKWE.js.map +0 -1
- package/dist/chunk-EKBMUXFV.js.map +0 -1
- package/dist/chunk-HYORKKYP.js.map +0 -1
- package/dist/chunk-N7MBGONH.js.map +0 -1
- package/dist/chunk-NS2TBYM4.js.map +0 -1
- package/dist/chunk-OY2MXIBB.js.map +0 -1
- package/dist/chunk-PE2KPZDW.js.map +0 -1
- package/dist/chunk-QLA25V2K.js.map +0 -1
- package/dist/chunk-TAHR457X.js.map +0 -1
- package/dist/chunk-UTCAOOXU.js.map +0 -1
- package/dist/chunk-WJKHLOP5.js.map +0 -1
- package/dist/chunk-WU57BYYM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wiring/help-tags.ts"],"names":[],"mappings":";;;AAiCO,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,oBAAA,GAAuB,GAAA;AAE7B,IAAM,wBAAA,GAA2B,CAAA;AAEjC,IAAM,YAAA,GAAe,CAAA;AAOrB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAwD/B,IAAM,SAAA,uBAAgB,OAAA,EAAkB;AAMxC,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,MAAM,OAAO,GAAA,CAAI,WAAA;AACjB,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,aAAA,EAAc;AACrC,EAAA,KAAA,CAAM,YAAY,eAAe,CAAA;AACjC,EAAA,GAAA,CAAI,kBAAA,GAAqB,CAAC,GAAG,GAAA,CAAI,oBAAoB,KAAK,CAAA;AAC5D;AAGA,IAAM,gBAAA,GAAmB,CAAC,OAAA,KACxB,OAAO,QAAQ,WAAA,KAAgB,UAAA;AAEjC,SAAS,eAAe,OAAA,EAA2B;AACjD,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,IAAM,UAAA,GAAa,4DAAA;AAGnB,IAAM,iBAAiB,CAAC,IAAA,KACtB,KAAK,SAAA,KAAc,QAAA,IAAY,KAAK,SAAA,KAAc,GAAA;AAGpD,IAAM,QAAA,GAAW,CAAC,IAAA,KAChB,IAAA,CAAK,QAAQ,SAAA,KAAc,QAAA;AAG7B,IAAM,YAAY,CAAC,IAAA,KACjB,QAAA,CAAS,IAAI,IACT,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,GACxB,KACG,aAAA,CAAc,mCAAmC,CAAA,EAChD,YAAA,CAAa,eAAe,CAAA,KAAM,MAAA;AAG5C,IAAM,KAAA,GAAQ,CAAC,IAAA,KACZ,IAAA,CAAK,YAAuB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AAGzD,IAAM,SAAA,GAAY,CAAC,OAAA,KAAA,CAChB,OAAA,CAAQ,YAAA,CAAa,YAAY,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK;AAQvE,SAAS,qBAAqB,MAAA,EAA8B;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,CAAQ,iBAAiB,GAAG,OAAO,KAAA;AAC/C,EAAA,IAAI,CAAC,UAAU,MAAM,CAAA,IAAK,OAAO,YAAA,CAAa,OAAO,CAAA,IAAK,KAAA,CAAM,MAAM,CAAA;AACpE,IAAA,OAAO,KAAA;AACT,EAAA,IACE,CAAC,MAAA,CAAO,OAAA,CAAQ,yDAAyD,CAAA;AAEzE,IAAA,OAAO,KAAA;AACT,EAAA,OAAO,EACL,MAAA,CAAO,EAAA,IACP,MAAA,CAAO,aAAA,CAAc,aAAA;AAAA,IACnB,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA;AAAA,GAC1C,CAAA;AAEJ;AAGA,SAAS,YAAY,IAAA,EAAkD;AACrE,EAAA,KAAA,MAAW,UAAU,IAAA,EAAM;AACzB,IAAA,IAAI,EAAE,kBAAkB,WAAA,CAAA,EAAc;AACtC,IAAA,IAAI,oBAAA,CAAqB,MAAM,CAAA,EAAG,OAAO,MAAA;AACzC,IAAA,MAAM,EAAE,SAAA,EAAW,oBAAA,EAAqB,GAAI,MAAA,CAAO,OAAA;AACnD,IAAA,IACE,SAAA,KAAc,QAAA,IACd,MAAA,CAAO,SAAA,KAAc,gBACrB,oBAAA,KAAyB,WAAA;AAEzB,MAAA,OAAO,MAAA;AAET,IAAA,IACE,SAAA,KAAc,gBACd,MAAA,CAAO,OAAA,CAAQ,YAAY,SAAA,IAC3B,MAAA,CAAO,cAAc,UAAU,CAAA;AAE/B,MAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,SAAS,IAAA,EAAmC;AACnD,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,OAAO,IAAA,CAAK,aAAA;AAAA,IACV,QAAA,CAAS,IAAI,CAAA,GACT,+BAAA,GACA;AAAA,GACN;AACF;AAGA,SAAS,SAAS,IAAA,EAA2B;AAC3C,EAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,OAAO,UAAU,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,SAAS,IAAI,CAAA,SAAU,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,UAAU,CAAE,CAAA;AAGjE,EAAA,MAAM,OAAA,GAAU,SAAS,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,UAAU,OAAO,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,aAAA,CAAc,oBAAoB,CAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,EAAA;AACtC,EAAA,OAAO,UAAU,MAAA,KAAW,IAAA,GAAO,GAAG,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,IAAA;AAC5D;AAKO,SAAS,eAAA,CACd,MAAgB,QAAA,EAChB,EAAE,eAAe,cAAA,EAAe,GAAoB,EAAC,EAC/C;AACN,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACxB,EAAA,SAAA,CAAU,IAAI,GAAG,CAAA;AACjB,EAAA,WAAA,CAAY,GAAG,CAAA;AACf,EAAA,IAAI,OAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,OAAA,GAA8B,IAAA;AAElC,EAAA,IAAI,KAAA,GAAwD,IAAA;AAE5D,EAAA,IAAI,SAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,KAAA,GAA4B,IAAA;AAEhC,EAAA,IAAI,GAAA,GAA0B,IAAA;AAK9B,EAAA,MAAM,YAAY,MAAmB;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,GAAA,CAAI,cAAc,KAAK,CAAA;AAC/B,MAAA,KAAA,CAAM,SAAA,GAAY,oBAAA;AAClB,MAAA,KAAA,CAAM,YAAA,CAAa,eAAe,MAAM,CAAA;AACxC,MAAA,KAAA,CAAM,YAAA,CAAa,mBAAmB,EAAE,CAAA;AACxC,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACzB,QAAA,EAAU,OAAA;AAAA,QACV,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,KAAA,EAAO,GAAA;AAAA,QACP,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AACA,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAa,GAAA,CAAI,IAAA,CAAK,OAAO,KAAK,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,aAAa,MAAmB;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM,GAAA,CAAI,cAAc,KAAK,CAAA;AAC7B,MAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,MAAA,GAAA,CAAI,YAAA,CAAa,WAAW,QAAQ,CAAA;AACpC,MAAA,GAAA,CAAI,YAAA,CAAa,eAAe,MAAM,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAsB;AAClC,IAAA,IAAI,KAAA,EAAO,SAAS,IAAA,EAAM;AAC1B,IAAA,KAAA,CAAM,IAAA,EAAK;AACX,IAAA,KAAA,GAAQ,IAAA;AAGR,IAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,IAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAA,EAAY;AACnD,IAAA,OAAA,CAAQ,MAAA,EAAO;AACf,IAAA,SAAA,GAAY,IAAA,CAAK,KAAI,GAAI,oBAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAsB;AAClC,IAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AACzB,IAAA,KAAA,GAAQ,MAAA;AACR,IAAA,IAAI,UAAU,IAAI,CAAA,IAAK,cAAc,IAAA,IAAQ,CAAC,KAAK,WAAA,EAAa;AAChE,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,IAAA,EAAM;AACtB,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC1B,IAAA,MAAM,UAAU,UAAA,EAAW;AAC3B,IAAA,SAAA,EAAU,CAAE,OAAO,OAAO,CAAA;AAG1B,IAAA,OAAA,CAAQ,KAAA,CAAM,WAAA,GAAc,MAAA,CAAO,gBAAA,CAAiB,MAAM,CAAA,CAAE,WAAA;AAC5D,IAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAGtB,IAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG,OAAA,CAAQ,WAAA,EAAY;AACnD,IAAA,MAAM,IAAA,GAAO,YAAA;AAAA,MACX,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MACE,KAAK,aAAA,CAAc,MAAA,EAAQ,OAAA,EAAS;AAAA,QAClC,SAAA,EAAW,QAAA;AAAA,QACX,GAAA,EAAK,YAAA;AAAA,QACL,OAAA,EAAS;AAAA,OACV;AAAA,KACL;AACA,IAAA,KAAA,GAAQ,EAAE,MAAM,IAAA,EAAK;AAAA,EACvB,CAAA;AAGA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAqC;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,EAAa;AAChC,IAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,MAAA,GAAS,SAAS,IAAI,CAAA;AAC5B,IAAA,OAAO,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,MAAM,IAAI,IAAA,GAAO,IAAA;AAAA,EAClD,CAAA;AAIA,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,KAAsB;AACnC,IAAA,IAAI,YAAY,IAAA,EAAM;AACpB,MAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AACzB,MAAA,KAAA,GAAQ,MAAA;AAAA,IACV;AACA,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,IAAA,OAAW,IAAI,CAAA;AAAA,EACrD,CAAA;AAKA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAA6B;AAC5C,IAAA,IAAI,SAAA,IAAa,SAAA,KAAc,IAAA,IAAQ,CAAC,UAAU,SAAS,CAAA;AACzD,MAAA,SAAA,GAAY,IAAA;AAAA,EAChB,CAAA;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,aAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,IAAK,KAAA,CAAuB,gBAAgB,OAAA,EAAS;AACrD,MAAA,MAAM,IAAA,GAAO,YAAY,KAAK,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,IAAI,SAAS,OAAA,EAAS;AACtB,MAAA,MAAM,QAAA,GAAW,OAAA;AACjB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,QAAA,QAAgB,QAAQ,CAAA;AAC5B,MAAA,IACE,CAAC,QACD,SAAA,CAAU,IAAI,KACd,SAAA,KAAc,IAAA,IACd,OAAO,IAAA,KAAS,IAAA;AAEhB,QAAA;AACF,MAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,OAAgB,IAAI,CAAA;AAAA,mBACxB,MAAA,CAAO,UAAA,CAAW,MAAM,IAAA,CAAK,IAAI,GAAG,mBAAmB,CAAA;AAAA,IACtE,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,YAAA;AAAA,IACA,CAAC,KAAA,KAAU;AAET,MAAA,IAAK,KAAA,CAAuB,aAAA,KAAkB,IAAA,IAAQ,CAAC,OAAA,EAAS;AAChE,MAAA,MAAM,QAAA,GAAW,OAAA;AACjB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,CAAM,QAAQ,CAAA;AAAA,IAChB,CAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAsB;AACrC,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAA,CAAK,IAAI,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,aAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,YAAA,EAAc,CAAA;AAC7C,MAAA,IAAI,IAAA,UAAc,IAAI,CAAA;AAAA,IACxB,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,SAAA;AAAA,IACA,CAAC,KAAA,KAAU;AAGT,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,YAAA,EAAa,CAAE,CAAC,CAAA;AACrC,MAAA,MAAM,IAAA,GACJ,kBAAkB,OAAA,IAAW,YAAA,CAAa,MAAM,CAAA,GAC5C,WAAA,CAAY,KAAK,CAAA,GACjB,IAAA;AACN,MAAA,IAAI,SAAS,OAAA,EAAS;AACtB,MAAA,MAAM,QAAA,GAAW,OAAA;AACjB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,IAAI,QAAA,QAAgB,QAAQ,CAAA;AAC5B,MAAA,IAAI,IAAA,IAAQ,SAAA,KAAc,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,UAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,YAAA,EAAc,CAAA;AAG7C,MAAA,MAAM,OAAQ,KAAA,CAAqB,aAAA;AACnC,MAAA,IAAI,CAAC,IAAA,IAAS,IAAA,YAAgB,QAAQ,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAI;AAC5D,MAAA,IAAI,SAAA,KAAc,MAAM,SAAA,GAAY,IAAA;AACpC,MAAA,IAAI,SAAS,OAAA,EAAS;AACtB,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,KAAA,CAAM,IAAI,CAAA;AAAA,IACZ,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,SAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,IAAI,MAAM,GAAA,KAAQ,QAAA,IAAY,KAAA,EAAO,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,IACA;AAAA,GACF;AAIA,EAAA,GAAA,CAAI,gBAAA;AAAA,IACF,cAAA;AAAA,IACA,CAAC,KAAA,KAAU;AACT,MAAA,MAAM,OAAO,KAAA,CAAM,MAAA;AACnB,MAAA,IACG,MAAsB,QAAA,KAAa,MAAA,IACpC,EAAE,IAAA,YAAgB,WAAA,CAAA,IAClB,CAAC,IAAA,CAAK,OAAA;AAAA,QACJ;AAAA,OACF;AAEA,QAAA;AACF,MAAA,MAAM,OAAO,IAAA,CAAK,aAAA;AAClB,MAAA,IAAI,YAAY,CAAC,IAAI,CAAC,CAAA,KAAM,IAAA,UAAc,IAAI,CAAA;AAAA,IAChD,CAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,KAAA,CAAM,YAAA,EAAc,CAAA;AAC7C,IAAA,IAAI,KAAA,IAAS,SAAS,KAAA,CAAM,IAAA,cAAiB,CAAE,WAAA,GAAc,SAAS,IAAI,CAAA;AAAA,EAC5E,CAAA;AACA,EAAA,GAAA,CAAI,gBAAA,CAAiB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAC5C,EAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA;AAC7C","file":"chunk-SQ2Q3OQI.js","sourcesContent":["// Hover and keyboard-focus help tags for icon-only controls.\n//\n// An icon-only `Select` (single `selectedPresentation=\"icon-only\"` or the\n// multiple `triggerIcon` filter), an icon-only `PopupMenu` (a `label` instead\n// of visible `text`), an icon-only `<button>` or link inside a\n// `ToolbarControlGroup` (named only by `aria-label`), and an icon-only\n// `Button` carry their purpose — and\n// a Select its current choice — only in the accessible name. Sighted pointer\n// and keyboard users see just the icon, so the registration boundary shows a\n// tag naming the control (Apple HIG \"help tag\"):\n//\n// - after a short hover delay, or immediately when a previous tag just closed\n// (moving along a toolbar), and at once on keyboard (`:focus-visible`) focus;\n// - never while the control's popup is open, and not again after a press or\n// Escape until the pointer or focus leaves and returns;\n// - with the same text the accessible name already announces, so the tag is\n// `aria-hidden` and never joins the control's `aria-labelledby` — assistive\n// technology hears the name once.\n//\n// One tag shows at a time: a `popover=\"manual\"` element in the top layer,\n// placed 8px below its trigger (flipping above when short, kept 8px clear of\n// the viewport edge) and following it while shown. It lives in a body-level\n// layer (re-attached if a body morph drops it, and removed again once\n// hidden), outside the control so the morph never sees it and `:has()`\n// selectors on the control ignore it, and copies its trigger's\n// `color-scheme`. Its look is a small stylesheet the install adopts, at zero\n// specificity so a theme can restyle it. A button that already has a native\n// `title`, or a Web Awesome tooltip `for` it, keeps that and gets no second\n// tag.\n\nimport { followAnchor, positionPopup } from '../shared/popup/position-popup.js';\n\n/** Hover delay before a help tag appears. */\nexport const HELP_TAG_SHOW_DELAY = 500;\n/** After a tag closes, a neighboring trigger shows its tag at once for this long. */\nexport const HELP_TAG_WARM_WINDOW = 400;\n/** A tag shifted inward stays this far from the viewport edge. */\nexport const HELP_TAG_VIEWPORT_MARGIN = 8;\n/** The gap between a tag and its trigger. */\nexport const HELP_TAG_GAP = 8;\n\n/**\n * The tag's look: the loud neutral fill and its on-loud text (14px), a 3px\n * radius, and a scale-and-fade entrance unless motion is reduced. Every\n * selector is wrapped in `:where()`, so any theme rule wins.\n */\nexport const HELP_TAG_STYLES = `\n:where(.kui-help-tag) {\n position: fixed;\n inset: auto;\n box-sizing: border-box;\n width: max-content;\n max-width: min(30ch, var(--_kui-popup-available-width, 100vw));\n margin: 0;\n padding: 0.25em 0.5em;\n overflow: hidden;\n color: var(--kui-color-neutral-on-loud, #fff);\n font: inherit;\n font-size: var(--kui-font-s, 0.875rem);\n line-height: 1.6;\n text-align: start;\n white-space: normal;\n border: 1px solid var(--kui-color-neutral-fill-loud, #48484a);\n border-radius: 3px;\n background: var(--kui-color-neutral-fill-loud, #48484a);\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n}\n@media (prefers-reduced-motion: no-preference) {\n :where(:root:not([data-kui-effects=\"static\"]) .kui-help-tag:popover-open) {\n animation: kui-help-tag-show 150ms ease;\n }\n :where(.kui-help-tag[data-placement^=\"top\"]) {\n transform-origin: bottom;\n }\n :where(.kui-help-tag[data-placement^=\"bottom\"]) {\n transform-origin: top;\n }\n}\n@keyframes kui-help-tag-show {\n from {\n opacity: 0;\n scale: 0.8;\n }\n}\n@media (forced-colors: active) {\n :where(.kui-help-tag) {\n color: CanvasText;\n border-color: CanvasText;\n background: Canvas;\n }\n}\n`;\n\ntype HelpTagHost = HTMLElement;\n\nexport interface HelpTagOptions {\n /** Whether a newly focused element shows keyboard focus. */\n focusVisible?: (element: Element) => boolean;\n}\n\nconst installed = new WeakSet<Document>();\n\n/**\n * Adopt the tag's stylesheet into `doc` once. A document without a window\n * (one built by `createHTMLDocument`) never renders, so it needs none.\n */\nfunction adoptStyles(doc: Document): void {\n const view = doc.defaultView;\n if (!view) return;\n const sheet = new view.CSSStyleSheet();\n sheet.replaceSync(HELP_TAG_STYLES);\n doc.adoptedStyleSheets = [...doc.adoptedStyleSheets, sheet];\n}\n\n/** Whether the engine implements the Popover API on `element`. */\nconst popoverSupported = (element: HTMLElement): boolean =>\n typeof element.showPopover === 'function';\n\nfunction isFocusVisible(element: Element): boolean {\n try {\n return element.matches(':focus-visible');\n } catch {\n return false;\n }\n}\n\nconst MENU_LABEL = ':scope > .kui-popup-menu__trigger > .kui-popup-menu__label';\n\n/** A plain control (not a Web Awesome popup host) gets a body-layer tag. */\nconst isPlainControl = (host: HelpTagHost): boolean =>\n host.localName === 'button' || host.localName === 'a';\n\n/** A Select root: its trigger, value, and listbox are light DOM. */\nconst isSelect = (host: HelpTagHost): boolean =>\n host.dataset.component === 'select';\n\n/** Whether the control's own popup is showing. */\nconst popupOpen = (host: HelpTagHost): boolean =>\n isSelect(host)\n ? host.hasAttribute('open')\n : host\n .querySelector(':scope > .kui-popup-menu__trigger')\n ?.getAttribute('aria-expanded') === 'true';\n\n/** An element's text with whitespace collapsed (an element's is never null). */\nconst words = (node: Element): string =>\n (node.textContent as string).replace(/\\s+/g, ' ').trim();\n\n/** The trimmed `aria-label` of a plain control. */\nconst ariaLabel = (control: Element): string =>\n (control.getAttribute('aria-label') ?? '').replace(/\\s+/g, ' ').trim();\n\n/**\n * An icon-only toolbar button or link (inside a `ToolbarControlGroup`) or an\n * icon-only `Button`: named by `aria-label`, with no visible text, and without\n * a native `title` or a Web Awesome tooltip of its own that a second tag would\n * duplicate.\n */\nfunction isToolbarIconControl(target: HTMLElement): boolean {\n if (!target.matches('button, a[href]')) return false;\n if (!ariaLabel(target) || target.hasAttribute('title') || words(target))\n return false;\n if (\n !target.closest('.kui-toolbar-control-group, .kui-button[data-icon-only]')\n )\n return false;\n return !(\n target.id &&\n target.ownerDocument.querySelector(\n `wa-tooltip[for=\"${CSS.escape(target.id)}\"]`,\n )\n );\n}\n\n/** The icon-only Kerf control on an event path, if any. */\nfunction helpTagHost(path: readonly EventTarget[]): HelpTagHost | null {\n for (const target of path) {\n if (!(target instanceof HTMLElement)) continue;\n if (isToolbarIconControl(target)) return target;\n const { component, selectedPresentation } = target.dataset;\n if (\n component === 'select' &&\n target.localName === 'kui-select' &&\n selectedPresentation === 'icon-only'\n )\n return target;\n // A content trigger (a Badge) shows its own meaning, so it gets no tag.\n if (\n component === 'popup-menu' &&\n target.dataset.trigger !== 'content' &&\n target.querySelector(MENU_LABEL)\n )\n return target;\n }\n return null;\n}\n\n/** The visible trigger the tag describes and anchors to. */\nfunction anchorOf(host: HelpTagHost): Element | null {\n if (isPlainControl(host)) return host;\n return host.querySelector(\n isSelect(host)\n ? ':scope > .kui-select__trigger'\n : ':scope > .kui-popup-menu__trigger',\n );\n}\n\n/** The tag text: the same words as the trigger's accessible name. */\nfunction helpText(host: HelpTagHost): string {\n if (isPlainControl(host)) return ariaLabel(host);\n if (!isSelect(host)) return words(host.querySelector(MENU_LABEL)!);\n // A Select's trigger name (a multiple icon trigger's already ends with the\n // chosen labels), then a single choice's visually hidden value.\n const trigger = anchorOf(host)!;\n const name = ariaLabel(trigger);\n const value = trigger.querySelector('.kui-select__value');\n const choice = value ? words(value) : '';\n return choice && choice !== name ? `${name}: ${choice}` : name;\n}\n\n/**\n * Install once at an explicit registration boundary. Idempotent per document.\n */\nexport function installHelpTags(\n doc: Document = document,\n { focusVisible = isFocusVisible }: HelpTagOptions = {},\n): void {\n if (installed.has(doc)) return;\n installed.add(doc);\n adoptStyles(doc);\n let hovered: HelpTagHost | null = null;\n let focused: HelpTagHost | null = null;\n // The trigger whose tag is open, and how to stop following it.\n let shown: { host: HelpTagHost; stop: () => void } | null = null;\n // A press, Escape, or an opened popup suppresses that trigger's tag.\n let dismissed: HelpTagHost | null = null;\n let timer: number | undefined;\n let warmUntil = 0;\n let layer: HTMLElement | null = null;\n // The one tag element, reused for every trigger.\n let tag: HTMLElement | null = null;\n\n // The body-level home of the tag. Its fixed, zero-size box keeps it out of\n // a grid or flex body's flow; a body morph that drops it is repaired on the\n // next show.\n const layerRoot = (): HTMLElement => {\n if (!layer) {\n layer = doc.createElement('div');\n layer.className = 'kui-help-tag-layer';\n layer.setAttribute('aria-hidden', 'true');\n layer.setAttribute('data-morph-skip', '');\n Object.assign(layer.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '0',\n height: '0',\n });\n }\n if (!layer.isConnected) doc.body.append(layer);\n return layer;\n };\n\n const tagElement = (): HTMLElement => {\n if (!tag) {\n tag = doc.createElement('div');\n tag.className = 'kui-help-tag';\n tag.setAttribute('popover', 'manual');\n tag.setAttribute('aria-hidden', 'true');\n }\n return tag;\n };\n\n const hide = (host: HelpTagHost) => {\n if (shown?.host !== host) return;\n shown.stop();\n shown = null;\n // A hidden tag leaves the layer. (Hiding a popover a morph already hid,\n // by dropping the layer, is a no-op.)\n const current = tagElement();\n if (popoverSupported(current)) current.hidePopover();\n current.remove();\n warmUntil = Date.now() + HELP_TAG_WARM_WINDOW;\n };\n\n const show = (host: HelpTagHost) => {\n window.clearTimeout(timer);\n timer = undefined;\n if (popupOpen(host) || dismissed === host || !host.isConnected) return;\n const anchor = anchorOf(host);\n const text = helpText(host);\n if (!anchor || !text) return;\n if (shown) hide(shown.host);\n const current = tagElement();\n layerRoot().append(current);\n // The tag takes its trigger's light or dark scheme, which a subtree\n // theme (`.wa-dark`) may set below the document root.\n current.style.colorScheme = window.getComputedStyle(anchor).colorScheme;\n current.textContent = text;\n // Without the Popover API (a test DOM), the fixed tag still shows, just\n // outside the top layer.\n if (popoverSupported(current)) current.showPopover();\n const stop = followAnchor(\n anchor,\n current,\n () =>\n void positionPopup(anchor, current, {\n placement: 'bottom',\n gap: HELP_TAG_GAP,\n padding: HELP_TAG_VIEWPORT_MARGIN,\n }),\n );\n shown = { host, stop };\n };\n\n /** The tagged host whose trigger (not its popup) is on the path. */\n const triggerHost = (event: Event): HelpTagHost | null => {\n const path = event.composedPath();\n const host = helpTagHost(path);\n if (!host) return null;\n const anchor = anchorOf(host);\n return anchor && path.includes(anchor) ? host : null;\n };\n\n // A pending hover belongs to the hovered trigger; a tag stays while either\n // the pointer or keyboard focus is still on its trigger.\n const leave = (host: HelpTagHost) => {\n if (hovered !== host) {\n window.clearTimeout(timer);\n timer = undefined;\n }\n if (hovered !== host && focused !== host) hide(host);\n };\n\n // A press, Escape, or an opened popup dismisses a trigger's tag until the\n // pointer moves onto something else while the popup is closed, or focus\n // leaves the control.\n const release = (host: HelpTagHost | null) => {\n if (dismissed && dismissed !== host && !popupOpen(dismissed))\n dismissed = null;\n };\n\n doc.addEventListener(\n 'pointerover',\n (event) => {\n if ((event as PointerEvent).pointerType === 'touch') return;\n const host = triggerHost(event);\n release(host);\n if (host === hovered) return;\n const previous = hovered;\n hovered = host;\n if (previous) leave(previous);\n if (\n !host ||\n popupOpen(host) ||\n dismissed === host ||\n shown?.host === host\n )\n return;\n window.clearTimeout(timer);\n if (Date.now() < warmUntil) show(host);\n else timer = window.setTimeout(() => show(host), HELP_TAG_SHOW_DELAY);\n },\n true,\n );\n\n doc.addEventListener(\n 'pointerout',\n (event) => {\n // Leaving the window: nothing new is hovered.\n if ((event as PointerEvent).relatedTarget !== null || !hovered) return;\n const previous = hovered;\n hovered = null;\n leave(previous);\n },\n true,\n );\n\n // A pending hover show for this host re-checks the dismissal and no-ops.\n const dismiss = (host: HelpTagHost) => {\n dismissed = host;\n hide(host);\n };\n\n doc.addEventListener(\n 'pointerdown',\n (event) => {\n const host = helpTagHost(event.composedPath());\n if (host) dismiss(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'focusin',\n (event) => {\n // Only keyboard focus (`:focus-visible`) shows a tag; a click focuses\n // the trigger without one.\n const target = event.composedPath()[0];\n const host =\n target instanceof Element && focusVisible(target)\n ? triggerHost(event)\n : null;\n if (host === focused) return;\n const previous = focused;\n focused = host;\n if (previous) leave(previous);\n if (host && dismissed !== host) show(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'focusout',\n (event) => {\n const host = helpTagHost(event.composedPath());\n // Focus moving within the control (into its popup and back) is handled\n // by focusin; only focus leaving the control ends a dismissal.\n const next = (event as FocusEvent).relatedTarget;\n if (!host || (next instanceof Node && host.contains(next))) return;\n if (dismissed === host) dismissed = null;\n if (host !== focused) return;\n focused = null;\n leave(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Escape' && shown) dismiss(shown.host);\n },\n true,\n );\n\n // Opening the popup (a native popover) hides the tag: the popup itself now\n // shows the choices.\n doc.addEventListener(\n 'beforetoggle',\n (event) => {\n const menu = event.target;\n if (\n (event as ToggleEvent).newState !== 'open' ||\n !(menu instanceof HTMLElement) ||\n !menu.matches(\n '.kui-popup-menu > .kui-popup-menu__menu, kui-select > .kui-select__popup',\n )\n )\n return;\n const host = menu.parentElement as HelpTagHost;\n if (helpTagHost([host]) === host) dismiss(host);\n },\n true,\n );\n\n // Keep a visible tag's text in step with the selection.\n const refresh = (event: Event) => {\n const host = helpTagHost(event.composedPath());\n if (shown && host === shown.host) tagElement().textContent = helpText(host);\n };\n doc.addEventListener('change', refresh, true);\n doc.addEventListener('input', refresh, true);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/wiring/help-tags.ts"],"names":[],"mappings":"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","file":"chunk-2LM3PYHA.js","sourcesContent":["// Hover and keyboard-focus help tags for icon-only controls.\n//\n// An icon-only `Select` (single `selectedPresentation=\"icon-only\"` or the\n// multiple `triggerIcon` filter), an icon-only `PopupMenu` (a `label` instead\n// of visible `text`), an icon-only `<button>` or link inside a\n// `ToolbarControlGroup` (named only by `aria-label`), and an icon-only\n// `Button` carry their purpose — and\n// a Select its current choice — only in the accessible name. Sighted pointer\n// and keyboard users see just the icon, so the registration boundary shows a\n// tag naming the control (Apple HIG \"help tag\"):\n//\n// - after a short hover delay, or immediately when a previous tag just closed\n// (moving along a toolbar), and at once on keyboard (`:focus-visible`) focus;\n// - never while the control's popup is open, and not again after a press or\n// Escape until the pointer or focus leaves and returns;\n// - with the same text the accessible name already announces, so the tag is\n// `aria-hidden` and never joins the control's `aria-labelledby` — assistive\n// technology hears the name once.\n//\n// One tag shows at a time: a `popover=\"manual\"` element in the top layer,\n// placed 8px below its trigger (flipping above when short, kept 8px clear of\n// the viewport edge) and following it while shown. It lives in a body-level\n// layer (re-attached if a body morph drops it, and removed again once\n// hidden), outside the control so the morph never sees it and `:has()`\n// selectors on the control ignore it, and copies its trigger's\n// `color-scheme`. Its look is a small stylesheet the install adopts, at zero\n// specificity so a theme can restyle it. A button that already has a native\n// `title`, or a Web Awesome tooltip `for` it, keeps that and gets no second\n// tag.\n\nimport { followAnchor, positionPopup } from '../shared/popup/position-popup.js';\n\n/** Hover delay before a help tag appears. */\nexport const HELP_TAG_SHOW_DELAY = 500;\n/** After a tag closes, a neighboring trigger shows its tag at once for this long. */\nexport const HELP_TAG_WARM_WINDOW = 400;\n/** A tag shifted inward stays this far from the viewport edge. */\nexport const HELP_TAG_VIEWPORT_MARGIN = 8;\n/** The gap between a tag and its trigger. */\nexport const HELP_TAG_GAP = 8;\n\n/**\n * The tag's look: the loud neutral fill and its on-loud text (14px), a 3px\n * radius, and a scale-and-fade entrance unless motion is reduced. Every\n * selector is wrapped in `:where()`, so any theme rule wins.\n */\nexport const HELP_TAG_STYLES = `\n:where(.kui-help-tag) {\n position: fixed;\n inset: auto;\n box-sizing: border-box;\n width: max-content;\n max-width: min(30ch, var(--_kui-popup-available-width, 100vw));\n margin: 0;\n padding: 0.25em 0.5em;\n overflow: hidden;\n color: var(--kui-color-neutral-on-loud, #fff);\n font: inherit;\n font-size: var(--kui-font-s, 0.875rem);\n line-height: 1.6;\n text-align: start;\n white-space: normal;\n border: 1px solid var(--kui-color-neutral-fill-loud, #48484a);\n border-radius: 3px;\n background: var(--kui-color-neutral-fill-loud, #48484a);\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n}\n@media (prefers-reduced-motion: no-preference) {\n :where(:root:not([data-kui-effects=\"static\"]) .kui-help-tag:popover-open) {\n animation: kui-help-tag-show 150ms ease;\n }\n :where(.kui-help-tag[data-placement^=\"top\"]) {\n transform-origin: bottom;\n }\n :where(.kui-help-tag[data-placement^=\"bottom\"]) {\n transform-origin: top;\n }\n}\n@keyframes kui-help-tag-show {\n from {\n opacity: 0;\n scale: 0.8;\n }\n}\n@media (forced-colors: active) {\n :where(.kui-help-tag) {\n color: CanvasText;\n border-color: CanvasText;\n background: Canvas;\n }\n}\n`;\n\ntype HelpTagHost = HTMLElement;\n\nexport interface HelpTagOptions {\n /** Whether a newly focused element shows keyboard focus. */\n focusVisible?: (element: Element) => boolean;\n}\n\nconst installed = new WeakSet<Document>();\n\n/**\n * Adopt the tag's stylesheet into `doc` once. A document without a window\n * (one built by `createHTMLDocument`) never renders, so it needs none.\n */\nfunction adoptStyles(doc: Document): void {\n const view = doc.defaultView;\n if (!view) return;\n const sheet = new view.CSSStyleSheet();\n sheet.replaceSync(HELP_TAG_STYLES);\n doc.adoptedStyleSheets = [...doc.adoptedStyleSheets, sheet];\n}\n\n/** Whether the engine implements the Popover API on `element`. */\nconst popoverSupported = (element: HTMLElement): boolean =>\n typeof element.showPopover === 'function';\n\nfunction isFocusVisible(element: Element): boolean {\n try {\n return element.matches(':focus-visible');\n } catch {\n return false;\n }\n}\n\nconst MENU_LABEL = ':scope > .kui-popup-menu__trigger > .kui-popup-menu__label';\n\n/** A plain control (not a Web Awesome popup host) gets a body-layer tag. */\nconst isPlainControl = (host: HelpTagHost): boolean =>\n host.localName === 'button' || host.localName === 'a';\n\n/** A Select root: its trigger, value, and listbox are light DOM. */\nconst isSelect = (host: HelpTagHost): boolean =>\n host.dataset.component === 'select';\n\n/** Whether the control's own popup is showing. */\nconst popupOpen = (host: HelpTagHost): boolean =>\n isSelect(host)\n ? host.hasAttribute('open')\n : host\n .querySelector(':scope > .kui-popup-menu__trigger')\n ?.getAttribute('aria-expanded') === 'true';\n\n/** An element's text with whitespace collapsed (an element's is never null). */\nconst words = (node: Element): string =>\n (node.textContent as string).replace(/\\s+/g, ' ').trim();\n\n/** The trimmed `aria-label` of a plain control. */\nconst ariaLabel = (control: Element): string =>\n (control.getAttribute('aria-label') ?? '').replace(/\\s+/g, ' ').trim();\n\n/**\n * An icon-only toolbar button or link (inside a `ToolbarControlGroup`) or an\n * icon-only `Button`: named by `aria-label`, with no visible text, and without\n * a native `title` or a Web Awesome tooltip of its own that a second tag would\n * duplicate.\n */\nfunction isToolbarIconControl(target: HTMLElement): boolean {\n if (!target.matches('button, a[href]')) return false;\n if (!ariaLabel(target) || target.hasAttribute('title') || words(target))\n return false;\n if (\n !target.closest('.kui-toolbar-control-group, .kui-button[data-icon-only]')\n )\n return false;\n return !(\n target.id &&\n target.ownerDocument.querySelector(\n `wa-tooltip[for=\"${CSS.escape(target.id)}\"]`,\n )\n );\n}\n\n/** The icon-only Kerf control on an event path, if any. */\nfunction helpTagHost(path: readonly EventTarget[]): HelpTagHost | null {\n for (const target of path) {\n if (!(target instanceof HTMLElement)) continue;\n if (isToolbarIconControl(target)) return target;\n const { component, selectedPresentation } = target.dataset;\n if (\n component === 'select' &&\n target.localName === 'kui-select' &&\n selectedPresentation === 'icon-only'\n )\n return target;\n // A content trigger (a Badge) shows its own meaning, so it gets no tag.\n if (\n component === 'popup-menu' &&\n target.dataset.trigger !== 'content' &&\n target.querySelector(MENU_LABEL)\n )\n return target;\n }\n return null;\n}\n\n/** The visible trigger the tag describes and anchors to. */\nfunction anchorOf(host: HelpTagHost): Element | null {\n if (isPlainControl(host)) return host;\n return host.querySelector(\n isSelect(host)\n ? ':scope > .kui-select__trigger'\n : ':scope > .kui-popup-menu__trigger',\n );\n}\n\n/** The tag text: the same words as the trigger's accessible name. */\nfunction helpText(host: HelpTagHost): string {\n if (isPlainControl(host)) return ariaLabel(host);\n if (!isSelect(host)) return words(host.querySelector(MENU_LABEL)!);\n // A Select's trigger name (a multiple icon trigger's already ends with the\n // chosen labels), then a single choice's visually hidden value.\n const trigger = anchorOf(host)!;\n const name = ariaLabel(trigger);\n const value = trigger.querySelector('.kui-select__value');\n const choice = value ? words(value) : '';\n return choice && choice !== name ? `${name}: ${choice}` : name;\n}\n\n/**\n * Install once at an explicit registration boundary. Idempotent per document.\n */\nexport function installHelpTags(\n doc: Document = document,\n { focusVisible = isFocusVisible }: HelpTagOptions = {},\n): void {\n if (installed.has(doc)) return;\n installed.add(doc);\n adoptStyles(doc);\n let hovered: HelpTagHost | null = null;\n let focused: HelpTagHost | null = null;\n // The trigger whose tag is open, and how to stop following it.\n let shown: { host: HelpTagHost; stop: () => void } | null = null;\n // A press, Escape, or an opened popup suppresses that trigger's tag.\n let dismissed: HelpTagHost | null = null;\n let timer: number | undefined;\n let warmUntil = 0;\n let layer: HTMLElement | null = null;\n // The one tag element, reused for every trigger.\n let tag: HTMLElement | null = null;\n\n // The body-level home of the tag. Its fixed, zero-size box keeps it out of\n // a grid or flex body's flow; a body morph that drops it is repaired on the\n // next show.\n const layerRoot = (): HTMLElement => {\n if (!layer) {\n layer = doc.createElement('div');\n layer.className = 'kui-help-tag-layer';\n layer.setAttribute('aria-hidden', 'true');\n layer.setAttribute('data-morph-skip', '');\n Object.assign(layer.style, {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '0',\n height: '0',\n });\n }\n if (!layer.isConnected) doc.body.append(layer);\n return layer;\n };\n\n const tagElement = (): HTMLElement => {\n if (!tag) {\n tag = doc.createElement('div');\n tag.className = 'kui-help-tag';\n tag.setAttribute('popover', 'manual');\n tag.setAttribute('aria-hidden', 'true');\n }\n return tag;\n };\n\n const hide = (host: HelpTagHost) => {\n if (shown?.host !== host) return;\n shown.stop();\n shown = null;\n // A hidden tag leaves the layer. (Hiding a popover a morph already hid,\n // by dropping the layer, is a no-op.)\n const current = tagElement();\n if (popoverSupported(current)) current.hidePopover();\n current.remove();\n warmUntil = Date.now() + HELP_TAG_WARM_WINDOW;\n };\n\n const show = (host: HelpTagHost) => {\n window.clearTimeout(timer);\n timer = undefined;\n if (popupOpen(host) || dismissed === host || !host.isConnected) return;\n const anchor = anchorOf(host);\n const text = helpText(host);\n if (!anchor || !text) return;\n if (shown) hide(shown.host);\n const current = tagElement();\n layerRoot().append(current);\n // The tag takes its trigger's light or dark scheme, which a subtree\n // theme (`.wa-dark`) may set below the document root.\n current.style.colorScheme = window.getComputedStyle(anchor).colorScheme;\n current.textContent = text;\n // Without the Popover API (a test DOM), the fixed tag still shows, just\n // outside the top layer.\n if (popoverSupported(current)) current.showPopover();\n const stop = followAnchor(\n anchor,\n current,\n () =>\n void positionPopup(anchor, current, {\n placement: 'bottom',\n gap: HELP_TAG_GAP,\n padding: HELP_TAG_VIEWPORT_MARGIN,\n }),\n );\n shown = { host, stop };\n };\n\n /** The tagged host whose trigger (not its popup) is on the path. */\n const triggerHost = (event: Event): HelpTagHost | null => {\n const path = event.composedPath();\n const host = helpTagHost(path);\n if (!host) return null;\n const anchor = anchorOf(host);\n return anchor && path.includes(anchor) ? host : null;\n };\n\n // A pending hover belongs to the hovered trigger; a tag stays while either\n // the pointer or keyboard focus is still on its trigger.\n const leave = (host: HelpTagHost) => {\n if (hovered !== host) {\n window.clearTimeout(timer);\n timer = undefined;\n }\n if (hovered !== host && focused !== host) hide(host);\n };\n\n // A press, Escape, or an opened popup dismisses a trigger's tag until the\n // pointer moves onto something else while the popup is closed, or focus\n // leaves the control.\n const release = (host: HelpTagHost | null) => {\n if (dismissed && dismissed !== host && !popupOpen(dismissed))\n dismissed = null;\n };\n\n doc.addEventListener(\n 'pointerover',\n (event) => {\n if ((event as PointerEvent).pointerType === 'touch') return;\n const host = triggerHost(event);\n release(host);\n if (host === hovered) return;\n const previous = hovered;\n hovered = host;\n if (previous) leave(previous);\n if (\n !host ||\n popupOpen(host) ||\n dismissed === host ||\n shown?.host === host\n )\n return;\n window.clearTimeout(timer);\n if (Date.now() < warmUntil) show(host);\n else timer = window.setTimeout(() => show(host), HELP_TAG_SHOW_DELAY);\n },\n true,\n );\n\n doc.addEventListener(\n 'pointerout',\n (event) => {\n // Leaving the window: nothing new is hovered.\n if ((event as PointerEvent).relatedTarget !== null || !hovered) return;\n const previous = hovered;\n hovered = null;\n leave(previous);\n },\n true,\n );\n\n // A pending hover show for this host re-checks the dismissal and no-ops.\n const dismiss = (host: HelpTagHost) => {\n dismissed = host;\n hide(host);\n };\n\n doc.addEventListener(\n 'pointerdown',\n (event) => {\n const host = helpTagHost(event.composedPath());\n if (host) dismiss(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'focusin',\n (event) => {\n // Only keyboard focus (`:focus-visible`) shows a tag; a click focuses\n // the trigger without one.\n const target = event.composedPath()[0];\n const host =\n target instanceof Element && focusVisible(target)\n ? triggerHost(event)\n : null;\n if (host === focused) return;\n const previous = focused;\n focused = host;\n if (previous) leave(previous);\n if (host && dismissed !== host) show(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'focusout',\n (event) => {\n const host = helpTagHost(event.composedPath());\n // Focus moving within the control (into its popup and back) is handled\n // by focusin; only focus leaving the control ends a dismissal.\n const next = (event as FocusEvent).relatedTarget;\n if (!host || (next instanceof Node && host.contains(next))) return;\n if (dismissed === host) dismissed = null;\n if (host !== focused) return;\n focused = null;\n leave(host);\n },\n true,\n );\n\n doc.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Escape' && shown) dismiss(shown.host);\n },\n true,\n );\n\n // Opening the popup (a native popover) hides the tag: the popup itself now\n // shows the choices.\n doc.addEventListener(\n 'beforetoggle',\n (event) => {\n const menu = event.target;\n if (\n (event as ToggleEvent).newState !== 'open' ||\n !(menu instanceof HTMLElement) ||\n !menu.matches(\n '.kui-popup-menu > .kui-popup-menu__menu, kui-select > .kui-select__popup',\n )\n )\n return;\n const host = menu.parentElement as HelpTagHost;\n if (helpTagHost([host]) === host) dismiss(host);\n },\n true,\n );\n\n // Keep a visible tag's text in step with the selection.\n const refresh = (event: Event) => {\n const host = helpTagHost(event.composedPath());\n if (shown && host === shown.host) tagElement().textContent = helpText(host);\n };\n doc.addEventListener('change', refresh, true);\n doc.addEventListener('input', refresh, true);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/actions/popup-menu/internal/popup-menu-events.ts"],"names":[],"mappings":";AAOO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,sBAAA,GAAyB;AAQ/B,IAAM,uBAAA,GAA0B","file":"chunk-3VZ6SFD4.js","sourcesContent":["/**\n * The requests `openPopupMenu`, `openPopupMenuAt`, and `closePopupMenu` send\n * to a PopupMenu root. The component module stays free of behavior code; the\n * `/register` entry's document listener carries them out.\n */\nimport type { PopupMenuPlacement } from '../popup-menu.js';\n\nexport const POPUP_MENU_OPEN_EVENT = 'kui-popup-menu-open-request';\nexport const POPUP_MENU_CLOSE_EVENT = 'kui-popup-menu-close-request';\n\n/**\n * The choice event a PopupMenu root dispatches before it closes: bubbling and\n * cancelable (canceling keeps the menu open). `detail.item` is the chosen\n * item element, `detail.value` its `value`, and `detail.checked` the state a\n * checkbox choice asks for; the application owns that state and renders it.\n */\nexport const POPUP_MENU_SELECT_EVENT = 'kui-menu-select';\n\nexport interface PopupMenuOpenDetail {\n /** Open from this viewport point for this opening only. */\n point?: { x: number; y: number };\n /**\n * The placement at `point` for this opening only. Omitted, a\n * button-triggered menu opens `bottom-start` and a context menu at its\n * `placement` prop.\n */\n placement?: PopupMenuPlacement;\n}\n\nexport interface PopupMenuSelectDetail {\n item: HTMLElement;\n value: string | undefined;\n checked: boolean | undefined;\n}\n"]}
|
|
@@ -1,10 +1,84 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { grayLevel, hsvToRgb, rgbToHsl, rgbToHsv, formatHex, parseColor, hslToRgb } from './chunk-TNJLNLVE.js';
|
|
2
2
|
import { ColorSwatches } from './chunk-IO27YTL3.js';
|
|
3
3
|
import { LucideIcon } from './chunk-HJXVVFBT.js';
|
|
4
4
|
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
5
5
|
import { ChevronsUpDown, Pipette, Plus } from 'lucide';
|
|
6
6
|
import { jsxs, jsx } from 'kerfjs/jsx-runtime';
|
|
7
7
|
|
|
8
|
+
// src/components/forms/color-picker/model/color-channels.ts
|
|
9
|
+
function colorChannelValues(mode, hsv) {
|
|
10
|
+
switch (mode) {
|
|
11
|
+
case "rgb": {
|
|
12
|
+
const { r, g, b } = hsvToRgb(hsv);
|
|
13
|
+
return [r, g, b].map(Math.round);
|
|
14
|
+
}
|
|
15
|
+
case "hsl": {
|
|
16
|
+
const hsl = rgbToHsl(hsvToRgb(hsv));
|
|
17
|
+
return [hsv.h, hsl.s * 100, hsl.l * 100];
|
|
18
|
+
}
|
|
19
|
+
case "hsb":
|
|
20
|
+
return [hsv.h, hsv.s * 100, hsv.v * 100];
|
|
21
|
+
case "gray":
|
|
22
|
+
return [grayLevel(hsvToRgb(hsv)) * 100];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function rgbOf(mode, values) {
|
|
26
|
+
const [first = 0, second = 0, third = 0] = values;
|
|
27
|
+
switch (mode) {
|
|
28
|
+
case "rgb":
|
|
29
|
+
return { r: first, g: second, b: third, a: 1 };
|
|
30
|
+
case "hsl":
|
|
31
|
+
return hslToRgb({ h: first, s: second / 100, l: third / 100, a: 1 });
|
|
32
|
+
case "hsb":
|
|
33
|
+
return hsvToRgb({ h: first, s: second / 100, v: third / 100, a: 1 });
|
|
34
|
+
case "gray": {
|
|
35
|
+
const level = first / 100 * 255;
|
|
36
|
+
return { r: level, g: level, b: level, a: 1 };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function hsvFromChannels(mode, values, current) {
|
|
41
|
+
const { a } = current;
|
|
42
|
+
switch (mode) {
|
|
43
|
+
case "hsb":
|
|
44
|
+
return { h: values[0], s: values[1] / 100, v: values[2] / 100, a };
|
|
45
|
+
case "gray":
|
|
46
|
+
return { h: current.h, s: 0, v: values[0] / 100, a };
|
|
47
|
+
case "rgb":
|
|
48
|
+
case "hsl": {
|
|
49
|
+
const hsv = { ...rgbToHsv(rgbOf(mode, values)), a };
|
|
50
|
+
if (mode === "hsl") hsv.h = values[0];
|
|
51
|
+
else if (hsv.s === 0) hsv.h = current.h;
|
|
52
|
+
if (hsv.v === 0) hsv.s = current.s;
|
|
53
|
+
return hsv;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function trackStops(mode, index) {
|
|
58
|
+
switch (mode) {
|
|
59
|
+
case "rgb":
|
|
60
|
+
return [0, 255];
|
|
61
|
+
case "gray":
|
|
62
|
+
return [0, 100];
|
|
63
|
+
case "hsl":
|
|
64
|
+
case "hsb":
|
|
65
|
+
if (index === 0) return [0, 60, 120, 180, 240, 300, 360];
|
|
66
|
+
return mode === "hsl" && index === 2 ? [0, 50, 100] : [0, 100];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function colorChannelColor(mode, values) {
|
|
70
|
+
return formatHex(rgbOf(mode, values));
|
|
71
|
+
}
|
|
72
|
+
function colorChannelTrack(mode, index, values) {
|
|
73
|
+
const hue = index === 0 && (mode === "hsl" || mode === "hsb");
|
|
74
|
+
const stops = trackStops(mode, index).map((stop) => {
|
|
75
|
+
if (hue) return formatHex(rgbOf("hsb", [stop, 100, 100]));
|
|
76
|
+
const next = [...values];
|
|
77
|
+
next[index] = stop;
|
|
78
|
+
return formatHex(rgbOf(mode, next));
|
|
79
|
+
});
|
|
80
|
+
return `linear-gradient(var(--_kui-color-picker-track-direction,to right),${stops.join(",")})`;
|
|
81
|
+
}
|
|
8
82
|
var COLOR_PICKER_PROTECTED = /* @__PURE__ */ new Set([
|
|
9
83
|
"data-component",
|
|
10
84
|
"data-value",
|
|
@@ -21,36 +95,39 @@ var MODE_LABELS = {
|
|
|
21
95
|
};
|
|
22
96
|
var COLOR_PICKER_CHANNELS = {
|
|
23
97
|
rgb: [
|
|
24
|
-
{ short: "R", name: "Red", max: 255 },
|
|
25
|
-
{ short: "G", name: "Green", max: 255 },
|
|
26
|
-
{ short: "B", name: "Blue", max: 255 }
|
|
98
|
+
{ short: "R", name: "Red", max: 255, unit: "" },
|
|
99
|
+
{ short: "G", name: "Green", max: 255, unit: "" },
|
|
100
|
+
{ short: "B", name: "Blue", max: 255, unit: "" }
|
|
27
101
|
],
|
|
28
102
|
hsl: [
|
|
29
|
-
{ short: "H", name: "Hue", max: 360 },
|
|
30
|
-
{ short: "S", name: "Saturation", max: 100 },
|
|
31
|
-
{ short: "L", name: "Lightness", max: 100 }
|
|
103
|
+
{ short: "H", name: "Hue", max: 360, unit: "\xB0" },
|
|
104
|
+
{ short: "S", name: "Saturation", max: 100, unit: "%" },
|
|
105
|
+
{ short: "L", name: "Lightness", max: 100, unit: "%" }
|
|
32
106
|
],
|
|
33
107
|
hsb: [
|
|
34
|
-
{ short: "H", name: "Hue", max: 360 },
|
|
35
|
-
{ short: "S", name: "Saturation", max: 100 },
|
|
36
|
-
{ short: "B", name: "Brightness", max: 100 }
|
|
108
|
+
{ short: "H", name: "Hue", max: 360, unit: "\xB0" },
|
|
109
|
+
{ short: "S", name: "Saturation", max: 100, unit: "%" },
|
|
110
|
+
{ short: "B", name: "Brightness", max: 100, unit: "%" }
|
|
37
111
|
],
|
|
38
|
-
gray: [{ short: "W", name: "Gray Level", max: 100 }]
|
|
112
|
+
gray: [{ short: "W", name: "Gray Level", max: 100, unit: "%" }]
|
|
39
113
|
};
|
|
40
114
|
function colorPickerChannels(mode, hsv) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
115
|
+
return colorChannelValues(mode, hsv).map(Math.round);
|
|
116
|
+
}
|
|
117
|
+
function colorPickerSlider(mode, index, values) {
|
|
118
|
+
const channel = COLOR_PICKER_CHANNELS[mode][index];
|
|
119
|
+
if (channel === void 0) return void 0;
|
|
120
|
+
const value = String(Math.round(values[index]));
|
|
121
|
+
return {
|
|
122
|
+
max: channel.max,
|
|
123
|
+
value,
|
|
124
|
+
label: channel.name,
|
|
125
|
+
valueText: `${value}${channel.unit}`,
|
|
126
|
+
style: [
|
|
127
|
+
`--_kui-color-picker-track:${colorChannelTrack(mode, index, values)}`,
|
|
128
|
+
`--_kui-color-picker-thumb-color:${colorChannelColor(mode, values)}`
|
|
129
|
+
].join(";")
|
|
130
|
+
};
|
|
54
131
|
}
|
|
55
132
|
function colorPickerAreaText(hsv) {
|
|
56
133
|
return `Saturation ${Math.round(hsv.s * 100)}%, brightness ${Math.round(hsv.v * 100)}%`;
|
|
@@ -87,7 +164,8 @@ function ColorPicker({
|
|
|
87
164
|
const hsv = rgbToHsv(rgba);
|
|
88
165
|
const hex = formatHex(rgba);
|
|
89
166
|
const channels = COLOR_PICKER_CHANNELS[mode];
|
|
90
|
-
const
|
|
167
|
+
const exact = colorChannelValues(mode, hsv);
|
|
168
|
+
const channelValues = exact.map(Math.round);
|
|
91
169
|
const opacity = `${Math.round(hsv.a * 100)}%`;
|
|
92
170
|
return /* @__PURE__ */ jsxs(
|
|
93
171
|
"div",
|
|
@@ -127,33 +205,42 @@ function ColorPicker({
|
|
|
127
205
|
children: /* @__PURE__ */ jsx("span", { class: "kui-color-picker__area-thumb" })
|
|
128
206
|
}
|
|
129
207
|
),
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
"
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
208
|
+
/* @__PURE__ */ jsxs("div", { class: "kui-color-picker__sliders", children: [
|
|
209
|
+
[0, 1, 2].map((index) => {
|
|
210
|
+
const slider = colorPickerSlider(mode, index, exact);
|
|
211
|
+
return /* @__PURE__ */ jsx(
|
|
212
|
+
"input",
|
|
213
|
+
{
|
|
214
|
+
class: "kui-color-picker__slider",
|
|
215
|
+
type: "range",
|
|
216
|
+
"data-slider": String(index),
|
|
217
|
+
min: "0",
|
|
218
|
+
max: String(slider?.max ?? 100),
|
|
219
|
+
step: "1",
|
|
220
|
+
value: slider?.value ?? "0",
|
|
221
|
+
"aria-label": slider?.label,
|
|
222
|
+
"aria-valuetext": slider?.valueText,
|
|
223
|
+
style: slider?.style,
|
|
224
|
+
hidden: slider === void 0,
|
|
225
|
+
disabled
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
}),
|
|
229
|
+
alpha ? /* @__PURE__ */ jsx(
|
|
230
|
+
"input",
|
|
231
|
+
{
|
|
232
|
+
class: "kui-color-picker__opacity",
|
|
233
|
+
type: "range",
|
|
234
|
+
min: "0",
|
|
235
|
+
max: "100",
|
|
236
|
+
step: "1",
|
|
237
|
+
value: String(Math.round(hsv.a * 100)),
|
|
238
|
+
"aria-label": "Opacity",
|
|
239
|
+
"aria-valuetext": opacity,
|
|
240
|
+
disabled
|
|
241
|
+
}
|
|
242
|
+
) : null
|
|
243
|
+
] }),
|
|
157
244
|
/* @__PURE__ */ jsxs("div", { class: "kui-color-picker__controls", children: [
|
|
158
245
|
/* @__PURE__ */ jsxs("span", { class: "kui-color-picker__mode-wrap", children: [
|
|
159
246
|
/* @__PURE__ */ jsx(
|
|
@@ -293,6 +380,6 @@ function ColorPicker({
|
|
|
293
380
|
);
|
|
294
381
|
}
|
|
295
382
|
|
|
296
|
-
export { COLOR_PICKER_CHANNELS, COLOR_PICKER_SWATCH_ACTION, ColorPicker, colorPickerAreaText, colorPickerChannels, colorPickerStyle };
|
|
383
|
+
export { COLOR_PICKER_CHANNELS, COLOR_PICKER_SWATCH_ACTION, ColorPicker, colorChannelValues, colorPickerAreaText, colorPickerChannels, colorPickerSlider, colorPickerStyle, hsvFromChannels };
|
|
297
384
|
|
|
298
|
-
//# sourceMappingURL=chunk-
|
|
385
|
+
//# sourceMappingURL=chunk-3Z7N2NAZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/color-picker/model/color-channels.ts","../src/components/forms/color-picker/color-picker.tsx"],"names":[],"mappings":"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","file":"chunk-3Z7N2NAZ.js","sourcesContent":["/**\n * Channel math for the ColorPicker's color models: the unrounded channel\n * values a model shows for the picker's HSV state, the HSV a set of channel\n * values produces, and the gradient each channel's slider track paints. The\n * model's sliders and fields both edit through these, so a channel change\n * replaces only that channel and every other one keeps its exact value.\n */\nimport type { ColorPickerMode } from '../color-picker.js';\nimport {\n formatHex,\n grayLevel,\n hslToRgb,\n type Hsva,\n hsvToRgb,\n type Rgba,\n rgbToHsl,\n rgbToHsv,\n} from './color-model.js';\n\n/**\n * The channel values a model shows for an HSV color, before rounding: RGB\n * 0–255 (rounded, since hex and the fields carry whole bytes), hue 0–360,\n * and every other channel 0–100.\n */\nexport function colorChannelValues(mode: ColorPickerMode, hsv: Hsva): number[] {\n switch (mode) {\n case 'rgb': {\n const { r, g, b } = hsvToRgb(hsv);\n return [r, g, b].map(Math.round);\n }\n case 'hsl': {\n const hsl = rgbToHsl(hsvToRgb(hsv));\n return [hsv.h, hsl.s * 100, hsl.l * 100];\n }\n case 'hsb':\n return [hsv.h, hsv.s * 100, hsv.v * 100];\n case 'gray':\n return [grayLevel(hsvToRgb(hsv)) * 100];\n }\n}\n\n/** The opaque color a model's channel values describe. */\nfunction rgbOf(mode: ColorPickerMode, values: readonly number[]): Rgba {\n const [first = 0, second = 0, third = 0] = values;\n switch (mode) {\n case 'rgb':\n return { r: first, g: second, b: third, a: 1 };\n case 'hsl':\n return hslToRgb({ h: first, s: second / 100, l: third / 100, a: 1 });\n case 'hsb':\n return hsvToRgb({ h: first, s: second / 100, v: third / 100, a: 1 });\n case 'gray': {\n const level = (first / 100) * 255;\n return { r: level, g: level, b: level, a: 1 };\n }\n }\n}\n\n/**\n * The HSV a model's channel values produce, keeping `current`'s alpha. Where\n * the result cannot carry a hue (a gray) or a saturation (black), `current`'s\n * is kept, so the area and the other models do not jump.\n */\nexport function hsvFromChannels(\n mode: ColorPickerMode,\n values: readonly number[],\n current: Hsva,\n): Hsva {\n const { a } = current;\n switch (mode) {\n case 'hsb':\n return { h: values[0]!, s: values[1]! / 100, v: values[2]! / 100, a };\n case 'gray':\n return { h: current.h, s: 0, v: values[0]! / 100, a };\n case 'rgb':\n case 'hsl': {\n const hsv = { ...rgbToHsv(rgbOf(mode, values)), a };\n if (mode === 'hsl') hsv.h = values[0]!;\n else if (hsv.s === 0) hsv.h = current.h;\n if (hsv.v === 0) hsv.s = current.s;\n return hsv;\n }\n }\n}\n\n/**\n * The evenly spaced stop values a channel's track needs to be exact: the\n * models are piecewise linear in RGB, so hue breaks every 60° and HSL\n * lightness at 50%.\n */\nfunction trackStops(mode: ColorPickerMode, index: number): number[] {\n switch (mode) {\n case 'rgb':\n return [0, 255];\n case 'gray':\n return [0, 100];\n case 'hsl':\n case 'hsb':\n if (index === 0) return [0, 60, 120, 180, 240, 300, 360];\n return mode === 'hsl' && index === 2 ? [0, 50, 100] : [0, 100];\n }\n}\n\n/**\n * The opaque `#rrggbb` a model's channel values describe: the color under\n * every channel slider's thumb (a gray level for the grayscale model, which\n * shows the gray its slider would set rather than the current color).\n */\nexport function colorChannelColor(\n mode: ColorPickerMode,\n values: readonly number[],\n): string {\n return formatHex(rgbOf(mode, values));\n}\n\n/**\n * The gradient a channel's slider track paints: the colors that channel\n * produces from its minimum to its maximum while every other channel keeps\n * its value. The HSL and HSB hue track is the exception: it is always the\n * full-saturation, full-brightness rainbow, so a dark or gray color still\n * shows which hue each position picks. The gradient runs in the slider's writing direction (its\n * `--_kui-color-picker-track-direction`, `to left` in right-to-left text),\n * so the minimum always sits where the native range puts it.\n */\nexport function colorChannelTrack(\n mode: ColorPickerMode,\n index: number,\n values: readonly number[],\n): string {\n const hue = index === 0 && (mode === 'hsl' || mode === 'hsb');\n const stops = trackStops(mode, index).map((stop) => {\n if (hue) return formatHex(rgbOf('hsb', [stop, 100, 100]));\n const next = [...values];\n next[index] = stop;\n return formatHex(rgbOf(mode, next));\n });\n return `linear-gradient(var(--_kui-color-picker-track-direction,to right),${stops.join(',')})`;\n}\n","import { ChevronsUpDown, Pipette, Plus } from 'lucide';\n\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\nimport {\n type ColorSwatch,\n ColorSwatches,\n} from '../color-swatches/color-swatches.js';\nimport {\n colorChannelColor,\n colorChannelTrack,\n colorChannelValues,\n} from './model/color-channels.js';\nimport {\n formatHex,\n type Hsva,\n hsvToRgb,\n parseColor,\n rgbToHsv,\n} from './model/color-model.js';\n\n/** The channel fields the picker shows: RGB, HSL, HSB (HSV), or one gray level. */\nexport type ColorPickerMode = 'rgb' | 'hsl' | 'hsb' | 'gray';\n\n/** A titled group of app-owned colors, such as \"Document Colors\". */\nexport interface ColorPickerSamples {\n title: string;\n swatches: readonly ColorSwatch[];\n}\n\n/** Application `data-*` metadata; the picker's own markers stay protected. */\nexport type ColorPickerRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nconst COLOR_PICKER_PROTECTED = new Set([\n 'data-component',\n 'data-value',\n 'data-mode',\n 'data-alpha',\n 'data-color-picker-id',\n]);\n\n/** The delegated action every preset and sample swatch carries. */\nexport const COLOR_PICKER_SWATCH_ACTION = 'kui-color-picker-swatch';\n\nexport interface ColorPickerProps {\n /** The picker's id; it also prefixes its inner ids. */\n id: string;\n /** The picker's accessible name. */\n label: string;\n /**\n * The color, as CSS color text (`#rrggbb[aa]`, `rgb()`, `hsl()`); invalid\n * text shows black. The picker reports `#rrggbb`, or `#rrggbbaa` below\n * full opacity.\n */\n value: string;\n /** The channel fields shown (default `rgb`). */\n mode?: ColorPickerMode;\n /** Offer opacity: an alpha slider and field (default true). */\n alpha?: boolean;\n /** A form field name the hex value submits under. */\n name?: string;\n /** Associate the hidden input with a form outside its ancestor chain. */\n form?: string;\n /**\n * Offer a button that samples a color from the screen, where the browser\n * provides the EyeDropper API (default true; hidden elsewhere).\n */\n eyedropper?: boolean;\n /** A preset row of swatches under the controls. */\n presets?: readonly ColorSwatch[];\n /** Titled groups of app-owned colors under the presets. */\n samples?: readonly ColorPickerSamples[];\n /**\n * A `data-action` for an \"Add to Samples\" button in the controls row; the\n * app reads the picker's current value and adds it to its samples.\n */\n addSampleAction?: string;\n disabled?: boolean;\n className?: string;\n rootAttributes?: ColorPickerRootAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nconst MODE_LABELS: Record<ColorPickerMode, [string, string]> = {\n rgb: ['RGB', 'RGBA'],\n hsl: ['HSL', 'HSLA'],\n hsb: ['HSB', 'HSBA'],\n gray: ['Grayscale', 'Grayscale'],\n};\n\n/**\n * The labels, accessible names, maximum, and spoken unit of each channel per\n * mode; the mode's sliders and fields both follow it.\n */\nexport const COLOR_PICKER_CHANNELS: Record<\n ColorPickerMode,\n readonly { short: string; name: string; max: number; unit: '' | '%' | '°' }[]\n> = {\n rgb: [\n { short: 'R', name: 'Red', max: 255, unit: '' },\n { short: 'G', name: 'Green', max: 255, unit: '' },\n { short: 'B', name: 'Blue', max: 255, unit: '' },\n ],\n hsl: [\n { short: 'H', name: 'Hue', max: 360, unit: '°' },\n { short: 'S', name: 'Saturation', max: 100, unit: '%' },\n { short: 'L', name: 'Lightness', max: 100, unit: '%' },\n ],\n hsb: [\n { short: 'H', name: 'Hue', max: 360, unit: '°' },\n { short: 'S', name: 'Saturation', max: 100, unit: '%' },\n { short: 'B', name: 'Brightness', max: 100, unit: '%' },\n ],\n gray: [{ short: 'W', name: 'Gray Level', max: 100, unit: '%' }],\n};\n\n/** The rounded channel values a mode shows for an HSV color. */\nexport function colorPickerChannels(\n mode: ColorPickerMode,\n hsv: Hsva,\n): number[] {\n return colorChannelValues(mode, hsv).map(Math.round);\n}\n\n/** One channel slider's attributes; see {@link colorPickerSlider}. */\nexport interface ColorPickerSliderState {\n max: number;\n value: string;\n label: string;\n valueText: string;\n style: string;\n}\n\n/**\n * The attributes of one channel slider for a mode's exact channel values:\n * its range, value, accessible name and spoken value, and an inline style\n * with the track gradient of the colors that channel produces while the\n * others hold (the full rainbow for the HSL and HSB hue) and the color under\n * the thumb.\n * `undefined` for a slot the mode does not use.\n */\nexport function colorPickerSlider(\n mode: ColorPickerMode,\n index: number,\n values: readonly number[],\n): ColorPickerSliderState | undefined {\n const channel = COLOR_PICKER_CHANNELS[mode][index];\n if (channel === undefined) return undefined;\n const value = String(Math.round(values[index]!));\n return {\n max: channel.max,\n value,\n label: channel.name,\n valueText: `${value}${channel.unit}`,\n style: [\n `--_kui-color-picker-track:${colorChannelTrack(mode, index, values)}`,\n `--_kui-color-picker-thumb-color:${colorChannelColor(mode, values)}`,\n ].join(';'),\n };\n}\n\n/** The area's spoken value. */\nexport function colorPickerAreaText(hsv: Hsva): string {\n return `Saturation ${Math.round(hsv.s * 100)}%, brightness ${Math.round(hsv.v * 100)}%`;\n}\n\n/** The CSS custom properties that place the thumbs and paint the tracks. */\nexport function colorPickerStyle(hsv: Hsva): string {\n const opaque = formatHex({ ...hsvToRgb(hsv), a: 1 });\n return [\n `--_kui-color-picker-h:${hsv.h.toFixed(2)}`,\n `--_kui-color-picker-s:${(hsv.s * 100).toFixed(2)}%`,\n `--_kui-color-picker-v:${(hsv.v * 100).toFixed(2)}%`,\n `--_kui-color-picker-a:${(hsv.a * 100).toFixed(2)}%`,\n `--_kui-color-picker-color:${opaque}`,\n ].join(';');\n}\n\n/**\n * A full color picker panel: a saturation and brightness area; a slider for\n * each channel of the color model (red, green, and blue; hue, saturation, and\n * lightness or brightness; or one gray level), each track painting the colors\n * that channel produces while the others hold (the hue track the full\n * rainbow); an optional opacity slider on\n * a checkerboard; a color-model menu (RGB, HSL, HSB, Grayscale) with its\n * channel fields, a hex field (8 digits below full\n * opacity) and an opacity field, an optional screen sampler (EyeDropper), and\n * optional preset and sample swatches. The controlled `value` renders it;\n * wire `wireColorPickers` from `@kerfjs/ui/wire-color-pickers` to make it\n * interactive. The interactive surface belongs to that wiring after the first\n * render, so a drag never fights a re-render; a new `value` from the app\n * resynchronizes it.\n */\nexport function ColorPicker({\n id,\n label,\n value,\n mode = 'rgb',\n alpha = true,\n name,\n form,\n eyedropper = true,\n presets,\n samples,\n addSampleAction,\n disabled = false,\n className = '',\n rootAttributes = {},\n slot,\n}: ColorPickerProps) {\n const parsed = parseColor(value) ?? { r: 0, g: 0, b: 0, a: 1 };\n const rgba = alpha ? parsed : { ...parsed, a: 1 };\n const hsv = rgbToHsv(rgba);\n const hex = formatHex(rgba);\n const channels = COLOR_PICKER_CHANNELS[mode];\n const exact = colorChannelValues(mode, hsv);\n const channelValues = exact.map(Math.round);\n const opacity = `${Math.round(hsv.a * 100)}%`;\n return (\n <div\n {...filterDataAttributes(rootAttributes, COLOR_PICKER_PROTECTED)}\n id={id}\n class={`kui-color-picker ${className}`.trim()}\n role=\"group\"\n aria-label={label}\n data-component=\"color-picker\"\n data-color-picker-id={id}\n data-value={hex}\n data-mode={mode}\n data-alpha={alpha ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n slot={slot}\n >\n <div\n class=\"kui-color-picker__surface\"\n data-morph-skip\n style={colorPickerStyle(hsv)}\n >\n <div\n class=\"kui-color-picker__area\"\n role=\"slider\"\n tabindex={disabled ? -1 : 0}\n aria-label=\"Saturation and Brightness\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n aria-valuenow={String(Math.round(hsv.s * 100))}\n aria-valuetext={colorPickerAreaText(hsv)}\n aria-disabled={disabled ? 'true' : undefined}\n >\n <span class=\"kui-color-picker__area-thumb\" />\n </div>\n <div class=\"kui-color-picker__sliders\">\n {[0, 1, 2].map((index) => {\n const slider = colorPickerSlider(mode, index, exact);\n return (\n <input\n class=\"kui-color-picker__slider\"\n type=\"range\"\n data-slider={String(index)}\n min=\"0\"\n max={String(slider?.max ?? 100)}\n step=\"1\"\n value={slider?.value ?? '0'}\n aria-label={slider?.label}\n aria-valuetext={slider?.valueText}\n style={slider?.style}\n hidden={slider === undefined}\n disabled={disabled}\n />\n );\n })}\n {alpha ? (\n <input\n class=\"kui-color-picker__opacity\"\n type=\"range\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n value={String(Math.round(hsv.a * 100))}\n aria-label=\"Opacity\"\n aria-valuetext={opacity}\n disabled={disabled}\n />\n ) : null}\n </div>\n <div class=\"kui-color-picker__controls\">\n <span class=\"kui-color-picker__mode-wrap\">\n <select\n class=\"kui-color-picker__mode\"\n aria-label=\"Color Model\"\n disabled={disabled}\n >\n {(Object.keys(MODE_LABELS) as ColorPickerMode[]).map((option) => (\n <option value={option} selected={option === mode}>\n {MODE_LABELS[option][alpha ? 1 : 0]}\n </option>\n ))}\n </select>\n <span class=\"kui-color-picker__mode-icon\" aria-hidden=\"true\">\n <LucideIcon\n icon={ChevronsUpDown}\n name=\"chevrons-up-down\"\n size=\"s\"\n />\n </span>\n </span>\n {eyedropper ? (\n <button\n type=\"button\"\n class=\"kui-color-picker__tool kui-color-picker__eyedropper\"\n aria-label=\"Pick a Color from the Screen\"\n title=\"Pick a Color from the Screen\"\n hidden\n disabled={disabled}\n >\n <LucideIcon icon={Pipette} name=\"pipette\" size=\"m\" />\n </button>\n ) : null}\n {addSampleAction === undefined ? null : (\n <button\n type=\"button\"\n class=\"kui-color-picker__tool\"\n data-action={addSampleAction}\n aria-label=\"Add to Samples\"\n title=\"Add to Samples\"\n disabled={disabled}\n >\n <LucideIcon icon={Plus} name=\"plus\" size=\"m\" />\n </button>\n )}\n </div>\n <div\n class=\"kui-color-picker__channels\"\n data-count={String(channels.length)}\n >\n {[0, 1, 2].map((index) => {\n const channel = channels[index];\n return (\n <label\n class=\"kui-color-picker__field\"\n hidden={channel === undefined}\n >\n <span class=\"kui-color-picker__field-label\" aria-hidden=\"true\">\n {channel?.short ?? ''}\n </span>\n <input\n class=\"kui-color-picker__channel\"\n data-channel={String(index)}\n inputMode=\"numeric\"\n value={channel ? String(channelValues[index]) : ''}\n aria-label={channel?.name}\n disabled={disabled}\n />\n </label>\n );\n })}\n </div>\n <div class=\"kui-color-picker__hex-row\">\n <label class=\"kui-color-picker__field kui-color-picker__field--hex\">\n <span class=\"kui-color-picker__field-label\" aria-hidden=\"true\">\n #\n </span>\n <input\n class=\"kui-color-picker__hex\"\n value={hex.slice(1).toUpperCase()}\n maxLength={8}\n spellcheck=\"false\"\n autocomplete=\"off\"\n aria-label=\"Hex Color\"\n disabled={disabled}\n />\n </label>\n {alpha ? (\n <label class=\"kui-color-picker__field\">\n <span class=\"kui-color-picker__field-label\" aria-hidden=\"true\">\n A\n </span>\n <input\n class=\"kui-color-picker__opacity-field\"\n inputMode=\"numeric\"\n value={opacity}\n aria-label=\"Opacity\"\n disabled={disabled}\n />\n </label>\n ) : null}\n </div>\n {name === undefined ? null : (\n <input type=\"hidden\" name={name} value={hex} form={form} />\n )}\n </div>\n {presets === undefined ? null : (\n <ColorSwatches\n name={`${id}-presets`}\n ariaLabel=\"Presets\"\n swatches={presets}\n value={presets.find((swatch) => swatch.value === hex)?.value}\n size=\"compact\"\n disabled={disabled}\n action={COLOR_PICKER_SWATCH_ACTION}\n />\n )}\n {(samples ?? []).map((group, index) => (\n <ColorSwatches\n name={`${id}-samples-${index}`}\n label={group.title}\n swatches={group.swatches}\n value={group.swatches.find((swatch) => swatch.value === hex)?.value}\n size=\"compact\"\n disabled={disabled}\n action={COLOR_PICKER_SWATCH_ACTION}\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Text } from './chunk-7K6U6FCN.js';
|
|
2
|
-
import { Toolbar } from './chunk-
|
|
2
|
+
import { Toolbar } from './chunk-ZN7KUMPY.js';
|
|
3
3
|
import { filterDataAttributes } from './chunk-KH4KEMSP.js';
|
|
4
4
|
import { jsxs, jsx, Fragment } from 'kerfjs/jsx-runtime';
|
|
5
5
|
|
|
@@ -90,4 +90,4 @@ function MessageComposer({
|
|
|
90
90
|
|
|
91
91
|
export { MessageComposer };
|
|
92
92
|
|
|
93
|
-
//# sourceMappingURL=chunk-
|
|
93
|
+
//# sourceMappingURL=chunk-4OV272LF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/message-composer/message-composer.tsx"],"names":[],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/forms/message-composer/message-composer.tsx"],"names":[],"mappings":"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","file":"chunk-4OV272LF.js","sourcesContent":["import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { filterDataAttributes } from '../../../shared/dom/extension-attributes.js';\nimport { Toolbar } from '../../actions/toolbar/toolbar.js';\nimport { Text } from '../../typography/text/text.js';\n\n/**\n * Application `data-*` identity on the MessageComposer root, such as `data-key`;\n * the composer's own configuration attributes stay protected.\n */\nexport type MessageComposerRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined>\n>;\n\nexport interface MessageComposerProps {\n /** The message field's accessible name, in title style (\"Message\"). */\n label: string;\n /** Native textarea `name`: the form field the message submits under. */\n name: string;\n /**\n * The textarea id. With a `hint`, the hint takes `<id>-hint` and becomes\n * the field's accessible description.\n */\n id?: string;\n /** The field's text: a draft to restore, or `''` after sending. */\n value?: string;\n /** Sentence-style example of what to write (\"Ask about this build\"). */\n placeholder?: string;\n /**\n * Visible lines while the field is empty or short (default 1). The field\n * grows with its content from here.\n */\n minRows?: number;\n /**\n * Lines the field grows to before it scrolls (default 8). At least\n * `minRows`.\n */\n maxRows?: number;\n /**\n * Quiet, sentence-style supporting copy in the action row's leading zone,\n * after any `leading` controls.\n */\n hint?: string;\n /**\n * Controls at the start of the action row, such as an attach button or a\n * model `Select`, normally in a `ToolbarControlGroup`.\n */\n leading?: KerfUiContent;\n /** Trailing controls in the action row, normally one brand Send button. */\n trailing: KerfUiContent;\n /** Disable the field; the app disables its own actions. */\n disabled?: boolean;\n /**\n * Opt in to Enter-to-send: with `wireMessageComposers` running over an ancestor,\n * Enter (or Cmd/Ctrl+Enter) in the field activates the first trailing\n * action, Shift+Enter inserts a newline, and an Enter that commits an IME\n * composition or meets an empty message does not send. The field announces\n * the shortcut with `aria-keyshortcuts`.\n */\n submitOnEnter?: boolean;\n /** Safe `data-*` identity on the root. */\n rootAttributes?: MessageComposerRootAttributes;\n className?: string;\n /** Native named-slot assignment, such as a `wa-dialog`'s `footer`. */\n slot?: string;\n}\n\nconst COMPOSER_PROTECTED = new Set([\n 'data-component',\n 'data-disabled',\n 'data-submit-on-enter',\n]);\n\nfunction rowCount(value: number, name: string): number {\n if (!Number.isInteger(value) || value < 1)\n throw new RangeError(`MessageComposer ${name} must be a positive integer.`);\n return value;\n}\n\n/**\n * A chat or prompt composer: a raised frame whose border turns brand while\n * focus is within, holding a borderless message field that grows with its\n * content between `minRows` and `maxRows` lines, above a compact `Toolbar`\n * action row: optional `leading` controls and `hint`, then `trailing` actions. The app owns the value and sending;\n * `submitOnEnter` with `wireMessageComposers` adds Enter-to-send.\n */\nexport function MessageComposer({\n label,\n name,\n id,\n value = '',\n placeholder,\n minRows = 1,\n maxRows = 8,\n hint,\n leading,\n trailing,\n disabled = false,\n submitOnEnter = false,\n rootAttributes = {},\n className = '',\n slot,\n}: MessageComposerProps) {\n const min = rowCount(minRows, 'minRows');\n const max = rowCount(maxRows, 'maxRows');\n if (max < min)\n throw new RangeError('MessageComposer maxRows must be at least minRows.');\n const hintId = hint !== undefined && id !== undefined ? `${id}-hint` : '';\n return (\n <div\n {...filterDataAttributes(rootAttributes, COMPOSER_PROTECTED)}\n class={`kui-message-composer ${className}`.trim()}\n data-component=\"message-composer\"\n data-disabled={disabled ? 'true' : undefined}\n data-submit-on-enter={submitOnEnter ? 'true' : undefined}\n style={`--_kui-message-composer-min-rows:${min};--_kui-message-composer-max-rows:${max}`}\n slot={slot}\n >\n <textarea\n class=\"kui-message-composer__field\"\n id={id}\n name={name}\n rows={min}\n aria-label={label}\n aria-describedby={hintId || undefined}\n aria-keyshortcuts={submitOnEnter ? 'Enter' : undefined}\n placeholder={placeholder}\n disabled={disabled}\n >\n {value}\n </textarea>\n <Toolbar\n position=\"footer\"\n density=\"compact\"\n label={`${label} Actions`}\n leading={\n leading === undefined && hint === undefined ? undefined : (\n <>\n {leading}\n {hint === undefined ? null : (\n <Text\n variant=\"span\"\n tone=\"quiet\"\n size=\"compact\"\n id={hintId || undefined}\n >\n {hint}\n </Text>\n )}\n </>\n )\n }\n trailing={trailing}\n />\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shared/panels/panel-toolbar-group.ts","../src/components/actions/toolbar-control-group/toolbar-control-group.tsx"],"names":[],"mappings":"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","file":"chunk-2PXZBFEC.js","sourcesContent":["import { isSafeHtml, type SafeHtml } from 'kerfjs';\n\n// A render-time annotation, shared across separately bundled UI subpaths.\n// It never appears in the DOM or changes the group's visual treatment.\nconst RELOCATE_ON_COLLAPSE = Symbol.for(\n '@kerfjs/ui.ToolbarControlGroup.relocateOnCollapse',\n);\n\nexport function markRelocatableGroup(group: SafeHtml): SafeHtml {\n Object.defineProperty(group, RELOCATE_ON_COLLAPSE, { value: true });\n return group;\n}\n\nexport function isRelocatableGroup(value: unknown): value is SafeHtml {\n return (\n isSafeHtml(value) &&\n (value as SafeHtml & { [RELOCATE_ON_COLLAPSE]?: boolean })[\n RELOCATE_ON_COLLAPSE\n ] === true\n );\n}\n","import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { markRelocatableGroup } from '../../../shared/panels/panel-toolbar-group.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\n\nexport type ToolbarControlGroupAppearance = 'contained' | 'borderless';\nexport type ToolbarControlGroupTone = 'default' | 'dark';\n/** Surface material: the opaque `solid` fill (default) or translucent `glass`. */\nexport type ToolbarControlGroupMaterial = 'solid' | 'glass';\n/** Quiet palette for a contained, single decorative icon tile. */\nexport type ToolbarControlGroupTileTone =\n 'neutral' | 'brand' | 'success' | 'warning' | 'danger';\nexport type ToolbarControlGroupButtonAppearance = 'plain' | 'push';\nexport type ToolbarControlGroupShape = 'pill' | 'rounded';\nexport type ToolbarControlGroupSize = 'default' | 'compact';\nexport type ToolbarControlGroupDensity = 'comfortable' | 'tight';\nexport type ToolbarControlGroupContent =\n 'icon' | 'text' | 'mixed' | 'avatar' | 'search';\nexport type ToolbarControlGroupFocusRing = 'control' | 'outline' | 'halo';\nexport type ToolbarControlGroupSelectedChrome =\n 'raised' | 'filled' | 'outline' | 'none';\nexport type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';\nexport type ToolbarControlGroupOverflow = 'visible' | 'scroll' | 'wrap';\nexport type ToolbarControlGroupExpandedOverflow = 'clip' | 'visible';\nexport type ToolbarControlGroupMenuInset = 'standard' | 'compact' | 'list-zero';\nexport type ToolbarControlGroupVisibility =\n | 'always'\n | 'compact-only'\n | 'hide-collapsed-tiny'\n | 'yield-to-expanded-sibling';\nexport type ToolbarControlGroupSizing = 'content' | 'grow' | 'fill';\nexport type ToolbarControlGroupPlacement = 'start' | 'end';\n\nexport interface ToolbarActionLinkProps {\n href: string;\n label: string;\n icon?: KerfUiContent;\n /** Optional machine-readable detail hidden visually but included in the default accessible name. */\n detail?: string;\n /** Override the accessible name when surrounding context is needed. */\n ariaLabel?: string;\n /** Open in a new tab with a safe rel and announce that behavior. */\n external?: boolean;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** A semantic anchor with ToolbarControlGroup-owned action geometry. */\nexport function ToolbarActionLink({\n href,\n label,\n icon,\n detail,\n ariaLabel,\n external = false,\n className = '',\n slot,\n}: ToolbarActionLinkProps) {\n const accessibleLabel =\n ariaLabel ??\n `${label}${detail ? `, ${detail}` : ''}${external ? ' (opens in new tab)' : ''}`;\n return (\n <a\n class={`kui-toolbar-action-link ${className}`.trim()}\n data-component=\"toolbar-action-link\"\n href={href}\n target={external ? '_blank' : undefined}\n rel={external ? 'noopener noreferrer' : undefined}\n aria-label={accessibleLabel}\n slot={slot}\n >\n {icon}\n <span>{label}</span>\n {detail ? <code aria-hidden=\"true\">{detail}</code> : null}\n </a>\n );\n}\n\nexport interface ToolbarControlGroupProps {\n children: KerfUiContent;\n label?: string;\n className?: string;\n expanded?: boolean;\n single?: boolean;\n appearance?: ToolbarControlGroupAppearance;\n tone?: ToolbarControlGroupTone;\n /**\n * `glass` paints the group on the translucent chrome material (backdrop\n * blur and saturation) with a specular edge and a soft shadow, for a group\n * floating over imagery or a clear toolbar. Controls take the normal text\n * color so they keep AA over any content; the fill turns opaque under\n * reduced transparency, increased contrast, static effects, or without\n * backdrop-filter support. A borderless group has no surface and ignores it.\n */\n material?: ToolbarControlGroupMaterial;\n /** Quiet fill, matching border and foreground for a contained single group whose only child is a decorative SVG. Ignored for interactive or mixed content. */\n tileTone?: ToolbarControlGroupTileTone;\n buttonAppearance?: ToolbarControlGroupButtonAppearance;\n /** Corner shape: fully round `pill` (default) or a softer `rounded` rectangle. */\n shape?: ToolbarControlGroupShape;\n size?: ToolbarControlGroupSize;\n density?: ToolbarControlGroupDensity;\n content?: ToolbarControlGroupContent;\n /** Whether controls paint focus individually or the group paints an outline/halo on focus-within. */\n focusRing?: ToolbarControlGroupFocusRing;\n /**\n * Chrome a pressed (`aria-pressed=\"true\"`) control paints. `none` keeps a\n * pressed control looking like its neighbors, for an icon-state toggle whose\n * glyph already shows the state (an empty or filled star); hover and the\n * focus ring are unchanged. One control can opt out alone with\n * `data-selected-chrome=\"none\"` on its own button.\n */\n selectedChrome?: ToolbarControlGroupSelectedChrome;\n selectedTone?: ToolbarControlGroupSelectedTone;\n /** Size a nested Web Awesome dropdown trigger as part of this group. */\n nestedDropdown?: boolean;\n /** Configure the nested dropdown menu inset without consumer ::part() CSS. */\n menuInset?: ToolbarControlGroupMenuInset;\n /** Keep an overlong row inside the available width by scrolling or wrapping. */\n overflow?: ToolbarControlGroupOverflow;\n /** Let app-owned anchored surfaces extend outside an expanded search group. Collapsed searches retain their clipping. */\n expandedOverflow?: ToolbarControlGroupExpandedOverflow;\n /** Responsive visibility owned by the enclosing Toolbar container. */\n visibility?: ToolbarControlGroupVisibility;\n /** Hide below this Toolbar content width; requires wireToolbarVisibility. */\n hideBelow?: CssLength;\n /** Show only below this Toolbar content width; requires wireToolbarVisibility. */\n showBelow?: CssLength;\n /** Intrinsic (default), grow from a basis, or occupy a full wrapping row. */\n sizing?: ToolbarControlGroupSizing;\n /** Place this group at the end of its flex row in a wrapping Toolbar zone. */\n placement?: ToolbarControlGroupPlacement;\n /** CSS length used as the minimum width and flex basis for `sizing=\"grow\"`; defaults to 19rem. */\n growBasis?: string;\n /** Move this group into the work-area toolbar when its panel collapses. */\n relocateOnCollapse?: boolean;\n /** Add contrast behind photo-backed avatar content. */\n scrim?: boolean;\n /** Block the group's controls and show a spinner without changing its dimensions. */\n busy?: boolean;\n /** Announced status while busy; defaults to “Working”. */\n busyLabel?: string;\n /**\n * Avatar image URL. A single-control group paints it on the group; a\n * multi-control group paints it only on the pressed selection highlight.\n */\n avatarImage?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function ToolbarControlGroup({\n children,\n label,\n className = '',\n expanded = false,\n single = false,\n appearance = 'contained',\n tone = 'default',\n material = 'solid',\n tileTone,\n buttonAppearance = 'plain',\n shape = 'pill',\n size = 'default',\n density = 'comfortable',\n content = 'icon',\n focusRing = 'control',\n selectedChrome = 'raised',\n selectedTone = 'brand',\n nestedDropdown = false,\n menuInset = 'standard',\n overflow = 'visible',\n expandedOverflow = 'clip',\n visibility = 'always',\n hideBelow,\n showBelow,\n sizing = 'content',\n placement = 'start',\n growBasis,\n relocateOnCollapse = false,\n scrim = false,\n busy = false,\n busyLabel = 'Working',\n avatarImage,\n slot,\n}: ToolbarControlGroupProps) {\n const inlineStyles = [\n avatarImage\n ? `--kui-toolbar-avatar-image:url(${JSON.stringify(avatarImage)})`\n : '',\n growBasis ? `--kui-toolbar-group-grow-basis:${growBasis}` : '',\n ].filter(Boolean);\n const group = (\n <div\n class={`kui-toolbar-control-group ${className}`.trim()}\n data-component=\"toolbar-control-group\"\n role={label ? 'group' : undefined}\n aria-label={label}\n data-appearance={appearance}\n data-tone={tone}\n data-material={material === 'glass' ? 'glass' : undefined}\n data-tile-tone={tileTone}\n data-button-appearance={buttonAppearance}\n data-expanded={String(expanded)}\n data-single={String(single)}\n data-shape={shape}\n data-size={size}\n data-density={density}\n data-content={content}\n data-focus-ring={focusRing}\n data-selected-chrome={selectedChrome}\n data-selected-tone={selectedTone}\n data-nested-dropdown={String(nestedDropdown)}\n data-menu-inset={menuInset}\n data-overflow={overflow}\n data-expanded-overflow={\n expandedOverflow === 'visible' ? 'visible' : undefined\n }\n data-visibility={visibility}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-sizing={sizing}\n data-placement={placement}\n data-scrim={String(scrim)}\n data-busy={String(busy)}\n aria-busy={busy ? 'true' : undefined}\n inert={busy}\n style={inlineStyles.length ? inlineStyles.join(';') : undefined}\n slot={slot}\n >\n {children}\n {busy ? (\n <span\n class=\"kui-toolbar-control-group__busy-spinner\"\n aria-hidden=\"true\"\n >\n <LoadingSpinner />\n </span>\n ) : null}\n </div>\n );\n const renderedGroup = busy ? (\n <>\n {group}\n <span class=\"kui-toolbar-control-group__busy-status\" role=\"status\">\n {busyLabel}\n </span>\n </>\n ) : (\n group\n );\n return relocateOnCollapse\n ? markRelocatableGroup(renderedGroup)\n : renderedGroup;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shared/panels/panel-toolbar-group.ts","../src/components/actions/toolbar-control-group/toolbar-control-group.tsx"],"names":[],"mappings":"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","file":"chunk-5J6Z4BWY.js","sourcesContent":["import { isSafeHtml, type SafeHtml } from 'kerfjs';\n\n// A render-time annotation, shared across separately bundled UI subpaths.\n// It never appears in the DOM or changes the group's visual treatment.\nconst RELOCATE_ON_COLLAPSE = Symbol.for(\n '@kerfjs/ui.ToolbarControlGroup.relocateOnCollapse',\n);\n\nexport function markRelocatableGroup(group: SafeHtml): SafeHtml {\n Object.defineProperty(group, RELOCATE_ON_COLLAPSE, { value: true });\n return group;\n}\n\nexport function isRelocatableGroup(value: unknown): value is SafeHtml {\n return (\n isSafeHtml(value) &&\n (value as SafeHtml & { [RELOCATE_ON_COLLAPSE]?: boolean })[\n RELOCATE_ON_COLLAPSE\n ] === true\n );\n}\n","import type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport { markRelocatableGroup } from '../../../shared/panels/panel-toolbar-group.js';\nimport type { CssLength } from '../../../shared/styles/css-values.js';\nimport { LoadingSpinner } from '../../feedback/loading-spinner/loading-spinner.js';\n\nexport type ToolbarControlGroupAppearance = 'contained' | 'borderless';\nexport type ToolbarControlGroupTone = 'default' | 'dark';\n/** Surface material: the opaque `solid` fill (default) or translucent `glass`. */\nexport type ToolbarControlGroupMaterial = 'solid' | 'glass';\n/** Quiet palette for a contained, single decorative icon tile. */\nexport type ToolbarControlGroupTileTone =\n 'neutral' | 'brand' | 'success' | 'warning' | 'danger';\nexport type ToolbarControlGroupButtonAppearance = 'plain' | 'push';\nexport type ToolbarControlGroupShape = 'pill' | 'rounded';\nexport type ToolbarControlGroupSize = 'default' | 'compact';\nexport type ToolbarControlGroupDensity = 'comfortable' | 'tight';\nexport type ToolbarControlGroupContent =\n 'icon' | 'text' | 'mixed' | 'avatar' | 'search';\nexport type ToolbarControlGroupFocusRing = 'control' | 'outline' | 'halo';\nexport type ToolbarControlGroupSelectedChrome =\n 'raised' | 'filled' | 'outline' | 'none';\nexport type ToolbarControlGroupSelectedTone = 'brand' | 'neutral' | 'pop';\nexport type ToolbarControlGroupOverflow = 'visible' | 'scroll' | 'wrap';\nexport type ToolbarControlGroupExpandedOverflow = 'clip' | 'visible';\nexport type ToolbarControlGroupMenuInset = 'standard' | 'compact' | 'list-zero';\nexport type ToolbarControlGroupVisibility =\n | 'always'\n | 'compact-only'\n | 'hide-collapsed-tiny'\n | 'yield-to-expanded-sibling'\n | 'yield-to-priority-row';\nexport type ToolbarControlGroupSizing = 'content' | 'grow' | 'fill';\nexport type ToolbarControlGroupPlacement = 'start' | 'end';\n\nexport interface ToolbarActionLinkProps {\n href: string;\n label: string;\n icon?: KerfUiContent;\n /** Optional machine-readable detail hidden visually but included in the default accessible name. */\n detail?: string;\n /** Override the accessible name when surrounding context is needed. */\n ariaLabel?: string;\n /** Open in a new tab with a safe rel and announce that behavior. */\n external?: boolean;\n className?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\n/** A semantic anchor with ToolbarControlGroup-owned action geometry. */\nexport function ToolbarActionLink({\n href,\n label,\n icon,\n detail,\n ariaLabel,\n external = false,\n className = '',\n slot,\n}: ToolbarActionLinkProps) {\n const accessibleLabel =\n ariaLabel ??\n `${label}${detail ? `, ${detail}` : ''}${external ? ' (opens in new tab)' : ''}`;\n return (\n <a\n class={`kui-toolbar-action-link ${className}`.trim()}\n data-component=\"toolbar-action-link\"\n href={href}\n target={external ? '_blank' : undefined}\n rel={external ? 'noopener noreferrer' : undefined}\n aria-label={accessibleLabel}\n slot={slot}\n >\n {icon}\n <span>{label}</span>\n {detail ? <code aria-hidden=\"true\">{detail}</code> : null}\n </a>\n );\n}\n\nexport interface ToolbarControlGroupProps {\n children: KerfUiContent;\n label?: string;\n className?: string;\n expanded?: boolean;\n single?: boolean;\n appearance?: ToolbarControlGroupAppearance;\n tone?: ToolbarControlGroupTone;\n /**\n * `glass` paints the group on the translucent chrome material (backdrop\n * blur and saturation) with a specular edge and a soft shadow, for a group\n * floating over imagery or a clear toolbar. Controls take the normal text\n * color so they keep AA over any content; the fill turns opaque under\n * reduced transparency, increased contrast, static effects, or without\n * backdrop-filter support. A borderless group has no surface and ignores it.\n */\n material?: ToolbarControlGroupMaterial;\n /** Quiet fill, matching border and foreground for a contained single group whose only child is a decorative SVG. Ignored for interactive or mixed content. */\n tileTone?: ToolbarControlGroupTileTone;\n buttonAppearance?: ToolbarControlGroupButtonAppearance;\n /** Corner shape: fully round `pill` (default) or a softer `rounded` rectangle. */\n shape?: ToolbarControlGroupShape;\n size?: ToolbarControlGroupSize;\n density?: ToolbarControlGroupDensity;\n content?: ToolbarControlGroupContent;\n /** Whether controls paint focus individually or the group paints an outline/halo on focus-within. */\n focusRing?: ToolbarControlGroupFocusRing;\n /**\n * Chrome a pressed (`aria-pressed=\"true\"`) control paints. `none` keeps a\n * pressed control looking like its neighbors, for an icon-state toggle whose\n * glyph already shows the state (an empty or filled star); hover and the\n * focus ring are unchanged. One control can opt out alone with\n * `data-selected-chrome=\"none\"` on its own button.\n */\n selectedChrome?: ToolbarControlGroupSelectedChrome;\n selectedTone?: ToolbarControlGroupSelectedTone;\n /** Size a nested Web Awesome dropdown trigger as part of this group. */\n nestedDropdown?: boolean;\n /** Configure the nested dropdown menu inset without consumer ::part() CSS. */\n menuInset?: ToolbarControlGroupMenuInset;\n /** Keep an overlong row inside the available width by scrolling or wrapping. */\n overflow?: ToolbarControlGroupOverflow;\n /** Let app-owned anchored surfaces extend outside an expanded search group. Collapsed searches retain their clipping. */\n expandedOverflow?: ToolbarControlGroupExpandedOverflow;\n /**\n * Responsive visibility owned by the enclosing Toolbar container.\n * `yield-to-priority-row` hides this trailing group exactly while its\n * Toolbar's `responsive=\"trailing-priority\"` row is active (an expanded\n * trailing sibling at the Toolbar's `responsiveAt` width), so the app never\n * restates that breakpoint with `hideBelow`.\n */\n visibility?: ToolbarControlGroupVisibility;\n /** Hide below this Toolbar content width; requires wireToolbarVisibility. */\n hideBelow?: CssLength;\n /** Show only below this Toolbar content width; requires wireToolbarVisibility. */\n showBelow?: CssLength;\n /** Intrinsic (default), grow from a basis, or occupy a full wrapping row. */\n sizing?: ToolbarControlGroupSizing;\n /** Place this group at the end of its flex row in a wrapping Toolbar zone. */\n placement?: ToolbarControlGroupPlacement;\n /** CSS length used as the minimum width and flex basis for `sizing=\"grow\"`; defaults to 19rem. */\n growBasis?: string;\n /** Move this group into the work-area toolbar when its panel collapses. */\n relocateOnCollapse?: boolean;\n /** Add contrast behind photo-backed avatar content. */\n scrim?: boolean;\n /** Block the group's controls and show a spinner without changing its dimensions. */\n busy?: boolean;\n /** Announced status while busy; defaults to “Working”. */\n busyLabel?: string;\n /**\n * Avatar image URL. A single-control group paints it on the group; a\n * multi-control group paints it only on the pressed selection highlight.\n */\n avatarImage?: string;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\nexport function ToolbarControlGroup({\n children,\n label,\n className = '',\n expanded = false,\n single = false,\n appearance = 'contained',\n tone = 'default',\n material = 'solid',\n tileTone,\n buttonAppearance = 'plain',\n shape = 'pill',\n size = 'default',\n density = 'comfortable',\n content = 'icon',\n focusRing = 'control',\n selectedChrome = 'raised',\n selectedTone = 'brand',\n nestedDropdown = false,\n menuInset = 'standard',\n overflow = 'visible',\n expandedOverflow = 'clip',\n visibility = 'always',\n hideBelow,\n showBelow,\n sizing = 'content',\n placement = 'start',\n growBasis,\n relocateOnCollapse = false,\n scrim = false,\n busy = false,\n busyLabel = 'Working',\n avatarImage,\n slot,\n}: ToolbarControlGroupProps) {\n const inlineStyles = [\n avatarImage\n ? `--kui-toolbar-avatar-image:url(${JSON.stringify(avatarImage)})`\n : '',\n growBasis ? `--kui-toolbar-group-grow-basis:${growBasis}` : '',\n ].filter(Boolean);\n const group = (\n <div\n class={`kui-toolbar-control-group ${className}`.trim()}\n data-component=\"toolbar-control-group\"\n role={label ? 'group' : undefined}\n aria-label={label}\n data-appearance={appearance}\n data-tone={tone}\n data-material={material === 'glass' ? 'glass' : undefined}\n data-tile-tone={tileTone}\n data-button-appearance={buttonAppearance}\n data-expanded={String(expanded)}\n data-single={String(single)}\n data-shape={shape}\n data-size={size}\n data-density={density}\n data-content={content}\n data-focus-ring={focusRing}\n data-selected-chrome={selectedChrome}\n data-selected-tone={selectedTone}\n data-nested-dropdown={String(nestedDropdown)}\n data-menu-inset={menuInset}\n data-overflow={overflow}\n data-expanded-overflow={\n expandedOverflow === 'visible' ? 'visible' : undefined\n }\n data-visibility={visibility}\n data-hide-below={hideBelow}\n data-show-below={showBelow}\n data-sizing={sizing}\n data-placement={placement}\n data-scrim={String(scrim)}\n data-busy={String(busy)}\n aria-busy={busy ? 'true' : undefined}\n inert={busy}\n style={inlineStyles.length ? inlineStyles.join(';') : undefined}\n slot={slot}\n >\n {children}\n {busy ? (\n <span\n class=\"kui-toolbar-control-group__busy-spinner\"\n aria-hidden=\"true\"\n >\n <LoadingSpinner />\n </span>\n ) : null}\n </div>\n );\n const renderedGroup = busy ? (\n <>\n {group}\n <span class=\"kui-toolbar-control-group__busy-status\" role=\"status\">\n {busyLabel}\n </span>\n </>\n ) : (\n group\n );\n return relocateOnCollapse\n ? markRelocatableGroup(renderedGroup)\n : renderedGroup;\n}\n"]}
|