@kerfjs/ui 5.0.0-beta.105 → 5.0.0-beta.107
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 +160 -27
- package/ai/component-composition-rules.json +20 -2
- package/ai/component-composition.d.ts +11 -0
- package/ai/component-composition.json +118 -19
- package/ai/component-composition.schema.json +32 -0
- package/ai/components/README.md +3 -2
- package/ai/components/button.md +4 -1
- package/ai/components/checkbox-group.md +89 -0
- package/ai/components/checkbox.md +3 -2
- 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/message-composer.md +2 -1
- package/ai/components/radio-group.md +4 -3
- package/ai/components/split-button.md +5 -2
- package/ai/components/surface-scaffold.md +2 -1
- package/ai/components/switch.md +1 -1
- package/ai/components/text.md +2 -0
- package/ai/components/wa-checkbox-group.md +5 -5
- package/ai/components/workbench-dialog.md +1 -1
- package/ai/public-api-signatures-v1.md +198 -26
- package/ai/skill.md +73 -62
- package/ai/webawesome-jsx-signatures-v1.md +1 -1
- package/dist/browser/checkbox-group.js +5 -0
- package/dist/button.d.ts +15 -2
- package/dist/button.js +1 -1
- package/dist/catalog.js +9 -8
- 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/{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-FKKJHGN5.js → chunk-AZ3WT77F.js} +2 -2
- package/dist/{chunk-FKKJHGN5.js.map → chunk-AZ3WT77F.js.map} +1 -1
- package/dist/{chunk-FG6U7KQQ.js → chunk-DNWWF6UN.js} +2 -2
- package/dist/{chunk-FG6U7KQQ.js.map → chunk-DNWWF6UN.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-TAHR457X.js → chunk-G4DRH4A5.js} +3 -1
- package/dist/chunk-G4DRH4A5.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-GCAK23PU.js → chunk-MVKHSAKE.js} +2 -2
- package/dist/{chunk-GCAK23PU.js.map → chunk-MVKHSAKE.js.map} +1 -1
- package/dist/{chunk-DDSCVEO5.js → chunk-NLMEDZRM.js} +5 -5
- package/dist/{chunk-DDSCVEO5.js.map → chunk-NLMEDZRM.js.map} +1 -1
- 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-WJKHLOP5.js → chunk-TI2GV36S.js} +8 -2
- package/dist/chunk-TI2GV36S.js.map +1 -0
- package/dist/{chunk-UTCAOOXU.js → chunk-TXRKCGT3.js} +8 -2
- package/dist/chunk-TXRKCGT3.js.map +1 -0
- package/dist/{chunk-ACUKTVS3.js → chunk-XWNXGFX3.js} +52 -42
- package/dist/chunk-XWNXGFX3.js.map +1 -0
- package/dist/{chunk-ZXZAECHZ.js → chunk-Z4DS77U2.js} +2 -2
- package/dist/{chunk-ZXZAECHZ.js.map → chunk-Z4DS77U2.js.map} +1 -1
- 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 +1 -1
- 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 +20 -19
- package/dist/list-action-row.js +1 -1
- package/dist/list-detail-dialog.d.ts +7 -1
- package/dist/list-detail-dialog.js +6 -4
- 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/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/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 +29 -0
- 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 +29 -0
- package/dist/styles/components/actions/split-button/split-button.css +51 -5
- package/dist/styles/components/collections/framed-list/framed-list.css +4 -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 +9 -0
- package/dist/styles/components/layout/workbench/workbench.css +4 -0
- package/dist/styles/components/navigation/nav-stack/nav-stack.css +64 -1
- package/dist/styles/components/navigation/tab-navigator/tab-navigator.css +1 -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 +6 -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 +21 -0
- package/dist/styles/framed-list.css +4 -0
- package/dist/styles/list-header.css +7 -0
- package/dist/styles/list.css +6 -0
- package/dist/styles/nav-stack.css +64 -1
- package/dist/styles/pane.css +9 -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 +6 -0
- package/dist/styles/switch.css +3 -3
- package/dist/styles/tab-navigator.css +1 -0
- package/dist/styles/text.css +10 -0
- package/dist/styles/webawesome.css +45 -9
- package/dist/styles/workbench.css +4 -0
- package/dist/surface-scaffold.d.ts +7 -1
- package/dist/surface-scaffold.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/workbench-dialog.d.ts +11 -2
- package/dist/workbench-dialog.js +5 -2
- package/dist/workbench-dialog.js.map +1 -1
- package/dist/workbench.js +1 -1
- package/docs/accessibility.md +40 -1
- 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 +33 -2
- package/docs/component-selection.md +20 -9
- 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-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.md +10 -3
- package/docs/disclosure.md +34 -0
- 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 +1 -1
- package/docs/webawesome-theme.md +48 -16
- package/docs/workbench-dialog.md +4 -1
- package/docs/writing.md +3 -3
- package/doctor/copy-capitalization-checks.mjs +10 -7
- package/llms.txt +50 -20
- 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-ECFCAKWE.js.map +0 -1
- package/dist/chunk-EKBMUXFV.js.map +0 -1
- package/dist/chunk-HYORKKYP.js.map +0 -1
- package/dist/chunk-PE2KPZDW.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
|
@@ -14,7 +14,7 @@ import { isUiTraversalExcluded } from '../traversal-exclusions.mjs';
|
|
|
14
14
|
// to known title-style props are read (a template literal's static words, never
|
|
15
15
|
// its interpolated values), so prose, descriptions, placeholders, tooltips,
|
|
16
16
|
// checkbox/switch option text, status lines, LoadingSpinner and Skeleton
|
|
17
|
-
// labels, Checkbox/Switch labels and RadioGroup choice labels, and dynamic
|
|
17
|
+
// labels, Checkbox/Switch labels and CheckboxGroup/RadioGroup choice labels, and dynamic
|
|
18
18
|
// data are never judged. The check reports lowercase words title style capitalizes; it
|
|
19
19
|
// does not report capitalized short words, because Apple capitalizes a
|
|
20
20
|
// preposition of any length inside a phrasal verb ("Log In to the Server").
|
|
@@ -179,9 +179,11 @@ const titleStyleProps = new Map([
|
|
|
179
179
|
'Select',
|
|
180
180
|
{ props: ['label', 'ariaLabel'], entries: { choices: ['label'] } },
|
|
181
181
|
],
|
|
182
|
-
// Field and group labels. A Checkbox or Switch label and a
|
|
183
|
-
// choice label are option text, which is sentence style and not
|
|
182
|
+
// Field and group labels. A Checkbox or Switch label and a CheckboxGroup or
|
|
183
|
+
// RadioGroup choice label are option text, which is sentence style and not
|
|
184
|
+
// read.
|
|
184
185
|
['TextField', { props: ['label', 'ariaLabel', 'clearLabel'] }],
|
|
186
|
+
['CheckboxGroup', { props: ['label', 'ariaLabel'] }],
|
|
185
187
|
['RadioGroup', { props: ['label', 'ariaLabel'] }],
|
|
186
188
|
['TabNavigator', { entries: { tabs: ['label'] } }],
|
|
187
189
|
// Region and landmark names: the accessible name of a pane, toolbar,
|
|
@@ -243,14 +245,15 @@ const landmarkRoles = new Set([
|
|
|
243
245
|
'form',
|
|
244
246
|
'search',
|
|
245
247
|
]);
|
|
246
|
-
// A raw Web Awesome field's or radio group's `label` (in an
|
|
247
|
-
// the optional integration) is a field label. The option
|
|
248
|
-
// `wa-checkbox`, `wa-switch`, and `wa-radio` is sentence style and is
|
|
249
|
-
// read.
|
|
248
|
+
// A raw Web Awesome field's, checkbox group's, or radio group's `label` (in an
|
|
249
|
+
// application using the optional integration) is a field label. The option
|
|
250
|
+
// text of `wa-checkbox`, `wa-switch`, and `wa-radio` is sentence style and is
|
|
251
|
+
// not read.
|
|
250
252
|
const fieldLabelTags = new Set([
|
|
251
253
|
'wa-input',
|
|
252
254
|
'wa-select',
|
|
253
255
|
'wa-textarea',
|
|
256
|
+
'wa-checkbox-group',
|
|
254
257
|
'wa-radio-group',
|
|
255
258
|
]);
|
|
256
259
|
const titleToolbarTextSizes = new Set(['xlarge', 'xlarge-fixed', 'large']);
|
package/llms.txt
CHANGED
|
@@ -324,7 +324,9 @@ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
324
324
|
Public ListItem tokens set row, icon, label, and trailing geometry;
|
|
325
325
|
ListHeader `size="xs|sm|m|l|xl"` sets label scale independently of
|
|
326
326
|
`headingLevel` (`sm` keeps the current FieldLabel-sized uppercase style;
|
|
327
|
-
`m`/`l`/`xl` match themed h5/h4/h3).
|
|
327
|
+
`m`/`l`/`xl` match themed h5/h4/h3). The label is one ellipsized line;
|
|
328
|
+
set `wrap` where the whole label must stay readable in a narrow column
|
|
329
|
+
(it wraps instead of truncating). Its height, title padding, and border
|
|
328
330
|
tokens tune section density. A semantic `count` requires `countLabel` and
|
|
329
331
|
excludes other indicators; `badge` and `status` may render together, and
|
|
330
332
|
either may be explicitly `undefined` in conditional app state.
|
|
@@ -398,9 +400,14 @@ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
398
400
|
When a dialog provides another dismissal affordance, add `hide-actions` to
|
|
399
401
|
the `wa-dialog` host; the theme hides its directly exported `header-actions`
|
|
400
402
|
part without an unsupported chained `::part()` selector.
|
|
401
|
-
Checkbox and Radio Group option regions
|
|
402
|
-
|
|
403
|
-
|
|
403
|
+
Checkbox and Radio Group option regions and the Color Picker trigger stay
|
|
404
|
+
flush, so each box, circle, or swatch sits on the host's inline-start edge
|
|
405
|
+
like Kerf's `Checkbox`, `RadioGroup`, and `ColorField`, with the label and
|
|
406
|
+
hint on the 9px text column. Bordered fields and Switch draw their border or
|
|
407
|
+
track on that same edge like `TextField`, `Select`, and `Switch`, so place a
|
|
408
|
+
Web Awesome field exactly where the Kerf field would go.
|
|
409
|
+
Stacked radios sit 8px apart (`0.25em` block margins) for the same 28px
|
|
410
|
+
pitch as `RadioGroup`.
|
|
404
411
|
Slider's complete interactive region uses the shared 8px logical inline outer
|
|
405
412
|
inset without shifting its already-aligned label.
|
|
406
413
|
Known Date's Month/Day/Year captions and bordered text-like field hints align
|
|
@@ -470,9 +477,12 @@ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
470
477
|
`detail.checked` is the state a checkbox choice asks for (the app owns and
|
|
471
478
|
renders that state);
|
|
472
479
|
use `context` with `anchor` + `openPopupMenu` (or `openPopupMenuAt`) and
|
|
473
|
-
`closePopupMenu` for pointer-anchored row menus
|
|
480
|
+
`closePopupMenu` for pointer-anchored row menus, whose `placement` applies
|
|
481
|
+
at the point (`top-start` opens above it); the menu owns its
|
|
474
482
|
zero-footprint anchor host, so add no wrapper or CSS. `openPopupMenuAt`
|
|
475
|
-
also opens a button-triggered menu at the pointer for one opening
|
|
483
|
+
also opens a button-triggered menu at the pointer for one opening
|
|
484
|
+
(`bottom-start`, or `openPopupMenuAt(menu, x, y, { placement: 'top-start' })`
|
|
485
|
+
to open above the point). A row's
|
|
476
486
|
trailing "…" overflow menu is `ListActionRow`'s `trailingMenu` (`label`,
|
|
477
487
|
`icon`, `items`, optional `placement` and `disabled`), which renders a
|
|
478
488
|
`PopupMenu` as the row's sibling trailing control. Do not force a dropdown or button width. Nothing
|
|
@@ -676,8 +686,22 @@ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
676
686
|
the inset rounded card; never restyle a card into a strip.
|
|
677
687
|
- **Use `SplitButton` for a primary action with options.** One loud semantic
|
|
678
688
|
fill with a native primary button and an options trigger (`aria-expanded`,
|
|
679
|
-
`aria-haspopup`); `tone`, `fill`, `
|
|
680
|
-
|
|
689
|
+
`aria-haspopup`); `tone`, `fill`, `shape` (`rounded` or `pill`, as on
|
|
690
|
+
`Button`), `busy`, and `disabled` are props. Never build one from
|
|
691
|
+
`wa-button-group` or app CSS on native buttons.
|
|
692
|
+
- **Keep a Button's focus ring inside a clipping ancestor with
|
|
693
|
+
`focusRingInset`.** `Button` and `SplitButton` draw the ring 1px outside the
|
|
694
|
+
box; inside a container that clips overflow, set `focusRingInset` and the
|
|
695
|
+
ring moves inside the box with a surface-colored line inside it, so it keeps
|
|
696
|
+
3:1 contrast even on a loud fill of its own hue. The line follows the
|
|
697
|
+
surface context sunken, quiet, and raised surfaces publish
|
|
698
|
+
(`--kui-color-surface-current`, `-region`, `-tint`), so it never reads as a
|
|
699
|
+
halo there. Never re-offset the outline from app CSS.
|
|
700
|
+
- **Span a full-width primary action with `fill`.** `<Button tone="brand" fill action="create">Create Project</Button>`
|
|
701
|
+
spans the parent's available inline width instead of shrinking to its
|
|
702
|
+
label, with the label centered and ellipsized once it no longer fits; a
|
|
703
|
+
link (`href`) fills the same way. It is the same `fill` `SplitButton`
|
|
704
|
+
takes. Never set `width: 100%` on a Button from app CSS.
|
|
681
705
|
- **Make any `Button` a toggle with `pressed`.** In content or a pane footer,
|
|
682
706
|
`<Button icon={…} ariaLabel="Show Conversation" emphasis="plain" pressed={open} action="toggle-chat" />`
|
|
683
707
|
renders a native `aria-pressed` button whose pressed look draws on top of
|
|
@@ -725,13 +749,17 @@ headingLevel`, `SearchField clearIcon`, `ContentItem frame="framed"` for a
|
|
|
725
749
|
`showCount`, at the 44px height or `size="compact"`. Call
|
|
726
750
|
`wireTextFields(root)` (`@kerfjs/ui/wire-text-fields`) once for clearing and
|
|
727
751
|
counting. Never render `wa-input` or `wa-textarea` for a form field.
|
|
728
|
-
- **Use `Checkbox`, `RadioGroup`, and `Switch` for native
|
|
729
|
-
`@kerfjs/ui/checkbox` (with `indeterminate` and
|
|
730
|
-
`@kerfjs/ui/wire-checkboxes`),
|
|
731
|
-
`
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
`
|
|
752
|
+
- **Use `Checkbox`, `CheckboxGroup`, `RadioGroup`, and `Switch` for native
|
|
753
|
+
toggles.** `@kerfjs/ui/checkbox` (with `indeterminate` and
|
|
754
|
+
`wireCheckboxes(root)` from `@kerfjs/ui/wire-checkboxes`),
|
|
755
|
+
`@kerfjs/ui/checkbox-group` (`label`, `name`, `choices`, an array `value`;
|
|
756
|
+
a labeled set laid out like RadioGroup), `@kerfjs/ui/radio-group` (`label`,
|
|
757
|
+
`name`, `choices`, `value`; one Tab stop, arrow keys), and
|
|
758
|
+
`@kerfjs/ui/switch` (`role="switch"`, only for a setting that applies
|
|
759
|
+
immediately) draw Kerf boxes over native inputs with hint and error text.
|
|
760
|
+
Stack standalone Checkboxes in a `List gap="xs"`: 8px apart, the same 28px
|
|
761
|
+
pitch as `RadioGroup` and `CheckboxGroup` choices. Never render
|
|
762
|
+
`wa-checkbox`, `wa-checkbox-group`, `wa-radio-group`, or `wa-switch`.
|
|
735
763
|
- **Use `Combobox` to pick or create a value by typing.** A themed native
|
|
736
764
|
input on the ARIA combobox pattern with filtered suggestions and an optional
|
|
737
765
|
create option; `wireComboboxes(root, { onCommit })` reports `{ id, value,
|
|
@@ -770,8 +798,9 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
770
798
|
Never use `wa-tooltip`.
|
|
771
799
|
- **Show and hide content with `Disclosure`** (`@kerfjs/ui/disclosure`): a
|
|
772
800
|
native details element with a DisclosureArrow on content-item geometry,
|
|
773
|
-
`plain` / `framed` / `sunken
|
|
774
|
-
|
|
801
|
+
`plain` / `framed` / `sunken`, or `embedded` inside a `ContentItem` (no
|
|
802
|
+
margin, border, or padding of its own, a compact summary, `flush` `Text`
|
|
803
|
+
content); Disclosures sharing a `name` form an accordion. Never use `wa-details` or `wa-accordion`.
|
|
775
804
|
- **Show progress with `ProgressBar` or `ProgressRing`** (`@kerfjs/ui/progress-bar`,
|
|
776
805
|
`@kerfjs/ui/progress-ring`): `value` of `max` (omit `value` for
|
|
777
806
|
indeterminate), a `label`, `valueText`, tones. Never use `wa-progress-bar` or
|
|
@@ -786,7 +815,8 @@ created, input }`. Never use a hand-styled `<input list>` + `<datalist>`.
|
|
|
786
815
|
a native radio group of named round swatches, one Tab stop, a ring that
|
|
787
816
|
does not depend on hue, and a `'transparent'` no-color swatch.
|
|
788
817
|
- **Choose any color with `ColorPicker`** (`@kerfjs/ui/color-picker`): an area,
|
|
789
|
-
|
|
818
|
+
channel sliders that follow the color model (R/G/B, H/S/L, H/S/B, or gray)
|
|
819
|
+
plus opacity, RGB/HSL/HSB/Grayscale fields, hex, presets, and
|
|
790
820
|
samples; call `wireColorPickers(root, { onChange })` and re-render.
|
|
791
821
|
- **Put a color in a form with `ColorField`** (`@kerfjs/ui/color-field`): a
|
|
792
822
|
swatch-and-hex trigger that opens a ColorPicker below it; call
|
|
@@ -962,10 +992,10 @@ width policy. Keep primary actions visible and offer a complementary overflow
|
|
|
962
992
|
group. See `docs/component-contract.md` "Toolbar width visibility" for lifecycle
|
|
963
993
|
details.
|
|
964
994
|
|
|
965
|
-
Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. Keep popup sizing and position repairs out of consumer CSS.
|
|
995
|
+
Select menus use native viewport shifting with 10px gutters: default menus grow to content (up to 20rem), while `fitMenu` matches trigger width and long labels wrap. A listbox (like a PopupMenu menu) shifts only along its trigger's edge, never over the trigger: when neither side fits, it opens on the side with more room and scrolls inside its capped height, so a second press on the trigger still closes it. Keep popup sizing and position repairs out of consumer CSS.
|
|
966
996
|
|
|
967
997
|
Key sibling `DialogSurface`s that render conditionally with `rootAttributes={{ "data-key": "…" }}` so a re-render morphs each dialog into itself; never wrap one in a keyed app `div`. Modal `DialogSurface` bounds use typed `viewportGutter` and `maxHeight` (`CssLength` or `"viewport"`); explicit caps stay within the dynamic viewport minus both gutters. Omitted props keep the default caps (20px clear of each edge, 80% of the viewport height at 420px wide or narrower). Application render state chooses responsive values, and preview layout remains application-owned. `height` sets a definite bounded modal size and `bodyLayout="fill"` lets one child fill the body; `bodyLayout="fill-last"` keeps leading rows at their height above one filling last child, and `footerPresentation="floating"` (with a typed `footerOffset`) floats a chat composer over the body while the body reserves its measured height; give the transcript `scrollClearance="block-end"` (a `scrollable` `List` or a `Pane`) to let it scroll beneath the composer, with the last message still resting above it, through the published `--kui-scroll-clearance-block-end` context (overlaying chrome publishes `--kui-scroll-clearance-block-start` / `-end`; one scroller per covered edge opts in; a composed Pane opts in through `PaneConfig.scrollClearance` on a Workbench `mainPane` or panel `pane`, a `CollapsiblePanel` `pane`, or a `NavStack` view's `pane`). `headerPresentation="floating"` lays the title bar over the body on the translucent `--kui-chrome-material-raised` (opaque under reduced transparency, increased contrast, and forced colors); the register measures it and the body reserves it, and a `fill` body's only child with `scrollClearance="both"` scrolls beneath both the title bar and a floating composer through the published `--kui-scroll-clearance-block-start`. `presentation="bottom-sheet"` attaches the dialog to the bottom edge with square bottom corners, safe-area and virtual-keyboard clearance behind the panel, and a slide in/out (`enterMotion` / `exitMotion`); `resizable` adds a top grabber separator bounded by `minHeight` and `maxHeight`. `PopoverDialogSurface` is the non-modal, light-dismiss counterpart on the native Popover API, with the same size props and an `embedded` in-flow presentation; `describedBy` sets its `aria-describedby` (usually a title `ToolbarText`'s `descriptionId`).
|
|
968
998
|
|
|
969
|
-
Render a modal dialog as `DialogSurface` itself, a native `<dialog>`: `label` (or `labelledBy` with a `heading`, such as an xl `ToolbarText` with a description) names it, `children` is its body, `footer` holds its buttons, and `headerActions` sit before its close button (`withoutHeader` drops the header for content that owns its heading and close control). Open it with `openDialog(dialog)` and close it with `closeDialog(dialog)` from `@kerfjs/ui/surface-scaffold`; never toggle its `open` attribute. The close button, any `data-dialog-close` element inside (a Cancel button), Escape, and, with `lightDismiss`, a backdrop press dispatch a cancelable `kui-request-close` (`detail.source`: `close-button`, `escape`, or `backdrop`); cancel it to keep the dialog open (the panel pulses). The native `close` event fires once it closes. `openDialog` installs the listeners and, while the dialog is open, measures its floating header/footer, follows a bottom sheet's keyboard and grabber, and keeps that state across re-renders; import `@kerfjs/ui/surface-scaffold/register` only when a dialog may open some other way. Do not write `wa-dialog` inside a `DialogSurface`.
|
|
999
|
+
Render a modal dialog as `DialogSurface` itself, a native `<dialog>`: `label` (or `labelledBy` with a `heading`, such as an xl `ToolbarText` with a description) names it, `describedBy` (the heading ToolbarText's `descriptionId`, or app-owned summary copy) describes it as `aria-describedby`, `children` is its body, `footer` holds its buttons, and `headerActions` sit before its close button (`withoutHeader` drops the header for content that owns its heading and close control). Open it with `openDialog(dialog)` and close it with `closeDialog(dialog)` from `@kerfjs/ui/surface-scaffold`; never toggle its `open` attribute. The close button, any `data-dialog-close` element inside (a Cancel button), Escape, and, with `lightDismiss`, a backdrop press dispatch a cancelable `kui-request-close` (`detail.source`: `close-button`, `escape`, or `backdrop`); cancel it to keep the dialog open (the panel pulses). The native `close` event fires once it closes. `openDialog` installs the listeners and, while the dialog is open, measures its floating header/footer, follows a bottom sheet's keyboard and grabber, and keeps that state across re-renders; import `@kerfjs/ui/surface-scaffold/register` only when a dialog may open some other way. Do not write `wa-dialog` inside a `DialogSurface`.
|
|
970
1000
|
|
|
971
1001
|
Toolbar visibility measurement probes and invisible state children are helper-owned and survive Kerf rerenders through `data-morph-preserve`. Actual CSS visibility stays stable while rendering removes transient parent markers, preventing geometry-driven render feedback and repeated probe recreation. Toolbar replacement, explicit internal-node removal and disposal retain their existing behavior.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kerfjs/ui",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.107",
|
|
4
4
|
"description": "Accessible, composable UI primitives for kerf applications.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -495,6 +495,11 @@
|
|
|
495
495
|
"browser": "./dist/browser/checkbox.js",
|
|
496
496
|
"import": "./dist/checkbox.js"
|
|
497
497
|
},
|
|
498
|
+
"./checkbox-group": {
|
|
499
|
+
"types": "./dist/checkbox-group.d.ts",
|
|
500
|
+
"browser": "./dist/browser/checkbox-group.js",
|
|
501
|
+
"import": "./dist/checkbox-group.js"
|
|
502
|
+
},
|
|
498
503
|
"./radio-group": {
|
|
499
504
|
"types": "./dist/radio-group.d.ts",
|
|
500
505
|
"browser": "./dist/browser/radio-group.js",
|
|
@@ -626,6 +631,7 @@
|
|
|
626
631
|
"./file-picker.css": "./dist/styles/file-picker.css",
|
|
627
632
|
"./text-field.css": "./dist/styles/text-field.css",
|
|
628
633
|
"./checkbox.css": "./dist/styles/checkbox.css",
|
|
634
|
+
"./checkbox-group.css": "./dist/styles/checkbox-group.css",
|
|
629
635
|
"./slider.css": "./dist/styles/slider.css",
|
|
630
636
|
"./radio-group.css": "./dist/styles/radio-group.css",
|
|
631
637
|
"./switch.css": "./dist/styles/switch.css",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/popup-menu/internal/popup-menu-content-cache.ts","../src/components/actions/popup-menu/popup-menu.tsx"],"names":[],"mappings":"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","file":"chunk-7W3GKMN4.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport type { PopupMenuEntry } from '../popup-menu.js';\n\n/**\n * Streaming content hash: slot 0 is the FNV-1a digest that names\n * the menu's `data-key`; slot 1 is an independent check hash (a 31-multiplier\n * polynomial whose dependency chain runs in parallel with the digest's), so\n * the markup cache is keyed by about 64 bits and a digest collision cannot\n * serve another menu's markup. An `Int32Array` keeps both accumulators unboxed\n * between calls.\n */\nconst hashState = new Int32Array(2);\n\nfunction hashCode(code: number): void {\n hashState[0] = Math.imul(hashState[0]! ^ code, 0x01000193);\n hashState[1] = (Math.imul(hashState[1]!, 31) + code) | 0;\n}\n\n/**\n * Hash a string's code points. A surrogate pair is combined into one code\n * point, matching the former `for…of` iteration over the joined key, so the\n * digest, and with it the rendered `data-key`, is unchanged.\n */\nfunction hashText(text: string): void {\n let digest = hashState[0]!;\n let check = hashState[1]!;\n const length = text.length;\n for (let index = 0; index < length; index++) {\n let code = text.charCodeAt(index);\n if ((code & 0xfc00) === 0xd800 && index + 1 < length) {\n const low = text.charCodeAt(index + 1);\n if ((low & 0xfc00) === 0xdc00) {\n code = ((code - 0xd800) << 10) + (low - 0xdc00) + 0x10000;\n index++;\n }\n }\n digest = Math.imul(digest ^ code, 0x01000193);\n check = (Math.imul(check, 31) + code) | 0;\n }\n hashState[0] = digest;\n hashState[1] = check;\n}\n\n/**\n * Parts at least this long (icon and details markup) are hashed through\n * {@link hashLongText}: by a memoized digest of the whole string instead of\n * character by character, so a glyph repeated on every row costs a map lookup.\n */\nexport const LONG_PART_LENGTH = 64;\n\n/** Bound on memoized long-part digests; past it the oldest is evicted. */\nexport const PART_DIGEST_LIMIT = 4096;\nconst partDigests = new Map<string, readonly [number, number]>();\n\n/**\n * Feed a long part as its own two hashes. A Lucide SVG is a few hundred\n * characters and repeats across every row's menu, so hashing its characters\n * dominated an unchanged menu's cost; V8 hashes a string key natively (once\n * per string object) and compares equal strings quickly.\n */\nfunction hashLongText(text: string): void {\n let pair = partDigests.get(text);\n if (!pair) {\n const digest = hashState[0]!;\n const check = hashState[1]!;\n hashState[0] = 0x811c9dc5;\n hashState[1] = 0x9747b28c;\n hashText(text);\n pair = [hashState[0], hashState[1]];\n hashState[0] = digest;\n hashState[1] = check;\n if (partDigests.size >= PART_DIGEST_LIMIT)\n partDigests.delete(partDigests.keys().next().value!);\n partDigests.set(text, pair);\n }\n hashCode(pair[0]);\n hashCode(pair[1]);\n}\n\n/** Hash a part, through its memoized digest when it is long. */\nfunction hashPart(text: string): void {\n if (text.length >= LONG_PART_LENGTH) hashLongText(text);\n else hashText(text);\n}\n\nconst PART_SEPARATOR = 0x00;\nconst FIELD_SEPARATOR = 0x01;\n\n/**\n * Feed one entry's structure: the fields, in order, separated by U+0001, with\n * each submenu entry appended the same way.\n */\nfunction hashEntry(entry: PopupMenuEntry): void {\n if (entry.kind === 'divider') {\n hashCode(0x2d); // '-'\n return;\n }\n if (entry.kind === 'heading') {\n hashCode(0x23); // '#'\n hashText(entry.label);\n return;\n }\n hashText(entry.label);\n hashCode(FIELD_SEPARATOR);\n hashText(entry.action ?? '');\n hashCode(FIELD_SEPARATOR);\n hashText(entry.value ?? '');\n hashCode(FIELD_SEPARATOR);\n hashCode(entry.disabled ? 0x31 : 0x30);\n hashCode(FIELD_SEPARATOR);\n hashCode(entry.checked === undefined ? 0x2d : entry.checked ? 0x31 : 0x30);\n hashCode(FIELD_SEPARATOR);\n hashText(entry.tone ?? '');\n hashCode(FIELD_SEPARATOR);\n hashText(entry.disabledReason ?? '');\n hashCode(FIELD_SEPARATOR);\n // SafeHtml stringifies to its stored markup without copying, and the key\n // must change when an icon or details change.\n hashPart(String(entry.icon ?? ''));\n hashCode(FIELD_SEPARATOR);\n hashPart(String(entry.details ?? ''));\n hashCode(FIELD_SEPARATOR);\n hashText(entry.attributes ? JSON.stringify(entry.attributes) : '{}');\n for (const child of entry.submenu ?? []) {\n hashCode(FIELD_SEPARATOR);\n hashEntry(child);\n }\n}\n\n/**\n * Bounded, least-recently-used cache of each menu's trigger and entry markup,\n * keyed by its content hashes. A list that re-renders unchanged menus then\n * pays one hash pass per menu instead of rendering every entry again, which\n * the morph would discard under `data-morph-skip-children` anyway. Sized above\n * a large list's distinct menus; past it, renders fall back to fresh markup.\n */\nexport const MARKUP_CACHE_LIMIT = 1024;\nconst markupCache = new Map<string, SafeHtml>();\n\n/**\n * The menu's `data-key` and its cache key. The digest covers, in order and\n * separated by U+0000, the trigger parts and then each entry, whose fields are\n * separated by U+0001; it is the FNV-1a hash of that joined text, except that\n * a part of {@link LONG_PART_LENGTH} or more characters contributes its own\n * two hashes in place of its characters.\n */\nexport function popupMenuContentKey(\n triggerParts: readonly string[],\n items: readonly PopupMenuEntry[],\n): { key: string; cacheKey: string } {\n hashState[0] = 0x811c9dc5;\n hashState[1] = 0x9747b28c;\n for (let index = 0; index < triggerParts.length; index++) {\n if (index > 0) hashCode(PART_SEPARATOR);\n hashPart(triggerParts[index]!);\n }\n for (const entry of items) {\n hashCode(PART_SEPARATOR);\n hashEntry(entry);\n }\n const digest = (hashState[0]! >>> 0).toString(36);\n return {\n key: `kui-popup-menu-${digest}`,\n cacheKey: `${digest}:${(hashState[1]! >>> 0).toString(36)}`,\n };\n}\n\n/** Cached markup for a cache key, refreshed as most recently used. */\nexport function cachedPopupMenuContent(cacheKey: string): SafeHtml | undefined {\n const content = markupCache.get(cacheKey);\n if (content) {\n markupCache.delete(cacheKey);\n markupCache.set(cacheKey, content);\n }\n return content;\n}\n\n/**\n * Remember rendered markup, evicting the least recently used entry when full.\n * Only static markup is reusable: content that holds a keyed list must be\n * rendered in each pass for the list reconciler.\n */\nexport function cachePopupMenuContent(\n cacheKey: string,\n content: SafeHtml,\n): void {\n if (content.__segment.kind !== 'static') return;\n if (markupCache.size >= MARKUP_CACHE_LIMIT)\n markupCache.delete(markupCache.keys().next().value!);\n markupCache.set(cacheKey, content);\n}\n\n/** Test hook: drop cached menu markup and memoized part digests. */\nexport function _clearPopupMenuMarkupCache(): void {\n markupCache.clear();\n partDigests.clear();\n}\n\n/** Test hook: the number of memoized long-part digests. */\nexport function _popupMenuPartDigestCount(): number {\n return partDigests.size;\n}\n\n/** Test hook: the number of cached menu markups. */\nexport function _popupMenuMarkupCacheSize(): number {\n return markupCache.size;\n}\n","import type { SafeHtml } from 'kerfjs';\nimport { Check } from 'lucide';\n\nimport type { KerfUiContent } from '../../../shared/content/semantic-content.js';\nimport {\n PopupCaretGlyph,\n PopupSubmenuGlyph,\n} from '../../../shared/popup/popup-glyphs.js';\nimport { LucideIcon } from '../../media/lucide-icon/lucide-icon.js';\nimport {\n cachedPopupMenuContent,\n cachePopupMenuContent,\n popupMenuContentKey,\n} from './internal/popup-menu-content-cache.js';\nimport {\n POPUP_MENU_CLOSE_EVENT,\n POPUP_MENU_OPEN_EVENT,\n type PopupMenuOpenDetail,\n} from './internal/popup-menu-events.js';\n\nexport type PopupMenuPlacement =\n 'bottom-start' | 'bottom' | 'bottom-end' | 'top-start' | 'top' | 'top-end';\n\ntype PopupMenuDataAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-component'?: never;\n 'data-key'?: never;\n 'data-morph-skip-children'?: never;\n }\n>;\n\n/** One command in the menu. */\nexport interface PopupMenuItem {\n kind?: 'item';\n label: string;\n /** Delegated `data-action` the app handles when the item is chosen. */\n action?: string;\n /** The item's value, reported in the menu's `kui-menu-select` event. */\n value?: string;\n /** Leading icon, typically a `LucideIcon`, before the label. */\n icon?: SafeHtml;\n /** A checkbox choice, including nested choices; omit for a plain command. */\n checked?: boolean;\n /** Trailing safe content, such as secondary status. */\n details?: SafeHtml;\n /** Destructive command styling. */\n tone?: 'default' | 'danger';\n disabled?: boolean;\n /** Native tooltip text for a disabled command. */\n disabledReason?: string;\n /** Application `data-*` metadata such as a record id. */\n attributes?: PopupMenuDataAttributes;\n /** Child commands, headings, and dividers opened by hover or keyboard navigation. */\n submenu?: readonly PopupMenuEntry[];\n}\n\n/** A labeled group heading; items that follow it belong to the group. */\nexport interface PopupMenuHeading {\n kind: 'heading';\n label: string;\n}\n\n/** A separator between groups of items. */\nexport interface PopupMenuDivider {\n kind: 'divider';\n}\n\nexport type PopupMenuEntry =\n PopupMenuItem | PopupMenuHeading | PopupMenuDivider;\n\ntype PopupMenuTriggerName =\n | {\n /** Visible trigger text, which is also its accessible name. */\n text: string;\n label?: never;\n triggerContent?: never;\n }\n | {\n text?: never;\n /**\n * Accessible name of an icon-only trigger, rendered as visually hidden\n * text inside the trigger button.\n */\n label: string;\n triggerContent?: never;\n }\n | {\n text?: never;\n /**\n * The trigger's accessible name (\"Status: Started\"); the visible\n * content is hidden from assistive technology.\n */\n label: string;\n /**\n * Visible content that is the whole trigger, such as a `Badge` showing\n * the current status. Kerf owns the bare button around it (no chrome,\n * a pill focus ring, the pointer cursor, `aria-haspopup`), and the\n * caret is off unless `caret` is set.\n */\n triggerContent: KerfUiContent;\n icon?: never;\n };\n\n/** A context PopupMenu's viewport anchor point. */\nexport interface PopupMenuAnchor {\n x: number;\n y: number;\n}\n\ntype PopupMenuTrigger =\n | (PopupMenuTriggerName & { context?: false; anchor?: never })\n | {\n context: true;\n label: string;\n triggerContent?: never;\n /**\n * The viewport point (CSS pixels, as in `MouseEvent.clientX/Y`) the\n * menu opens from. Rendered into the menu itself, so it survives\n * re-renders and replacement; open it with `openPopupMenu`.\n */\n anchor?: PopupMenuAnchor;\n text?: never;\n icon?: never;\n caret?: never;\n disabled?: never;\n };\n\nexport type PopupMenuProps = PopupMenuTrigger & {\n /** Trigger icon, typically a `LucideIcon`, before any visible text. */\n icon?: KerfUiContent;\n items: readonly PopupMenuEntry[];\n /** Where the menu opens relative to its trigger. Defaults to `bottom-start`. */\n placement?: PopupMenuPlacement;\n /** Show the disclosure caret after the trigger content. Defaults to true. */\n caret?: boolean;\n disabled?: boolean;\n /** Application `data-*` metadata on the menu root. */\n rootAttributes?: PopupMenuDataAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n};\n\ntype PopupMenuCommand = PopupMenuItem & { kind?: 'item' };\n\nconst isCommand = (entry: PopupMenuEntry): entry is PopupMenuCommand =>\n entry.kind !== 'heading' && entry.kind !== 'divider';\n\n/** Whether a menu level holds a checkbox choice, so its plain items reserve the check column. */\nfunction hasChoice(entries: readonly PopupMenuEntry[]): boolean {\n return entries.some(\n (entry) => isCommand(entry) && entry.checked !== undefined,\n );\n}\n\nfunction renderItem(entry: PopupMenuCommand, levelHasChoice: boolean) {\n // A plain command beside checkbox choices keeps their check column, so its\n // icon and label line up with theirs.\n const choice = entry.checked !== undefined;\n const item = (\n <button\n {...(entry.attributes ?? {})}\n type=\"button\"\n class=\"kui-popup-menu__item\"\n role={choice ? 'menuitemcheckbox' : 'menuitem'}\n tabindex={-1}\n data-action={entry.action}\n value={entry.value}\n data-tone={entry.tone === 'danger' ? 'danger' : undefined}\n aria-checked={choice ? String(entry.checked) : undefined}\n aria-disabled={entry.disabled ? 'true' : undefined}\n aria-haspopup={entry.submenu ? 'menu' : undefined}\n aria-expanded={entry.submenu ? 'false' : undefined}\n title={entry.disabled ? entry.disabledReason : undefined}\n >\n {levelHasChoice ? (\n <span class=\"kui-popup-menu__check\" aria-hidden=\"true\">\n {choice ? <LucideIcon icon={Check} name=\"check\" /> : null}\n </span>\n ) : null}\n {entry.icon ? (\n <span class=\"kui-popup-menu__icon\" aria-hidden=\"true\">\n {entry.icon}\n </span>\n ) : null}\n <span class=\"kui-popup-menu__item-label\">{entry.label}</span>\n {entry.details ? (\n <span class=\"kui-popup-menu__details\">{entry.details}</span>\n ) : null}\n {entry.submenu ? (\n <span class=\"kui-popup-menu__submenu-icon\" aria-hidden=\"true\">\n <PopupSubmenuGlyph />\n </span>\n ) : null}\n </button>\n );\n if (!entry.submenu) return item;\n return (\n <div class=\"kui-popup-menu__submenu-host\" role=\"none\">\n {item}\n {renderMenu(entry.submenu, entry.label, true)}\n </div>\n );\n}\n\n/**\n * One menu level: its entries in order, with each heading opening a labeled\n * group that holds the items up to the next heading or divider.\n */\nfunction renderEntries(entries: readonly PopupMenuEntry[]): SafeHtml[] {\n const levelHasChoice = hasChoice(entries);\n const out: SafeHtml[] = [];\n let index = 0;\n while (index < entries.length) {\n const entry = entries[index]!;\n if (entry.kind === 'divider') {\n out.push(<div class=\"kui-popup-menu__divider\" role=\"separator\" />);\n index += 1;\n continue;\n }\n if (entry.kind === 'heading') {\n const members: SafeHtml[] = [];\n index += 1;\n while (index < entries.length) {\n const member = entries[index]!;\n if (!isCommand(member)) break;\n members.push(renderItem(member, levelHasChoice));\n index += 1;\n }\n out.push(\n <div\n class=\"kui-popup-menu__group\"\n role=\"group\"\n aria-label={entry.label}\n >\n <div class=\"kui-popup-menu__heading\" aria-hidden=\"true\">\n {entry.label}\n </div>\n {members}\n </div>,\n );\n continue;\n }\n out.push(renderItem(entry, levelHasChoice));\n index += 1;\n }\n return out;\n}\n\nfunction renderMenu(\n entries: readonly PopupMenuEntry[],\n name: string | undefined,\n submenu: boolean,\n) {\n return (\n <div\n class=\"kui-popup-menu__menu\"\n role=\"menu\"\n popover=\"manual\"\n tabindex={-1}\n aria-label={name}\n data-submenu={submenu ? '' : undefined}\n >\n {renderEntries(entries)}\n </div>\n );\n}\n\n/** A rendered PopupMenu root, the element the open and close helpers take. */\nexport type PopupMenuElement = HTMLElement;\n\nfunction requestOpen(menu: PopupMenuElement, detail: PopupMenuOpenDetail) {\n menu.dispatchEvent(\n new CustomEvent<PopupMenuOpenDetail>(POPUP_MENU_OPEN_EVENT, { detail }),\n );\n}\n\n/**\n * Open a PopupMenu at viewport pointer coordinates. A `context` menu rendered\n * without `anchor` moves its invisible anchor there (a menu rendered with\n * `anchor` opens with `openPopupMenu` instead). A button-triggered menu (such\n * as a `ListActionRow` trailing menu) opens `bottom-start` from the point,\n * like a context menu, for this opening only; its next opening returns to its\n * trigger and placement. Needs the `/register` entry.\n */\nexport function openPopupMenuAt(\n menu: PopupMenuElement,\n x: number,\n y: number,\n): void {\n menu.style.setProperty('--kui-popup-menu-context-x', `${x}px`);\n menu.style.setProperty('--kui-popup-menu-context-y', `${y}px`);\n requestOpen(menu, { point: { x, y } });\n}\n\n/**\n * Open a PopupMenu from its trigger, or a context PopupMenu at the `anchor`\n * it was rendered with (or the point a previous `openPopupMenuAt` set).\n * Needs the `/register` entry.\n */\nexport function openPopupMenu(menu: PopupMenuElement): void {\n requestOpen(menu, {});\n}\n\n/** Close an open PopupMenu, and any submenu it shows. */\nexport function closePopupMenu(menu: PopupMenuElement): void {\n menu.dispatchEvent(new CustomEvent(POPUP_MENU_CLOSE_EVENT));\n}\n\ninterface PopupMenuContentProps {\n context: boolean;\n label: string | undefined;\n icon: KerfUiContent;\n triggerContent: KerfUiContent;\n text: string | undefined;\n caret: boolean;\n disabled: boolean;\n items: readonly PopupMenuEntry[];\n}\n\n/** The trigger and the menu: everything inside the root. */\nfunction renderContent({\n context,\n label,\n icon,\n triggerContent,\n text,\n caret,\n disabled,\n items,\n}: PopupMenuContentProps): SafeHtml {\n return (\n <>\n {context ? (\n <button\n type=\"button\"\n class=\"kui-popup-menu__context-anchor\"\n aria-hidden=\"true\"\n tabindex={-1}\n />\n ) : (\n <button\n type=\"button\"\n class=\"kui-popup-menu__trigger\"\n aria-haspopup=\"menu\"\n aria-expanded=\"false\"\n disabled={disabled}\n >\n {icon}\n {triggerContent === undefined ? null : (\n <span class=\"kui-popup-menu__trigger-content\" aria-hidden=\"true\">\n {triggerContent}\n </span>\n )}\n {text ? (\n <span class=\"kui-popup-menu__text\">{text}</span>\n ) : (\n <span class=\"kui-popup-menu__label\">{label}</span>\n )}\n {caret ? (\n <span class=\"kui-popup-menu__caret\" aria-hidden=\"true\">\n <PopupCaretGlyph />\n </span>\n ) : null}\n </button>\n )}\n {renderMenu(items, text ?? label, false)}\n </>\n );\n}\n\n/**\n * An action menu: a trigger button that opens a list of commands in the top\n * layer. A `single` `ToolbarControlGroup` (with `nestedDropdown`) or a\n * `PopupSurface` sizes and insets it as usual. Items dispatch through\n * delegated `data-action`s, and the root reports each choice as a bubbling\n * `kui-menu-select` event; the app owns the commands and any open-state reaction.\n * Import `@kerfjs/ui/popup-menu/register` once to wire opening, keyboard\n * navigation, submenus, and dismissal. At viewport widths up to 480px,\n * submenus appear above or below their parent menu so their rows do not cover\n * the parent list.\n */\nexport function PopupMenu({\n text,\n label,\n icon,\n triggerContent,\n items,\n placement = 'bottom-start',\n caret = triggerContent === undefined,\n disabled = false,\n rootAttributes = {},\n slot,\n context = false,\n anchor,\n}: PopupMenuProps) {\n if (\n anchor !== undefined &&\n (!context || !Number.isFinite(anchor.x) || !Number.isFinite(anchor.y))\n )\n throw new RangeError(\n 'PopupMenu anchor requires context mode and finite x and y coordinates',\n );\n // The register owns the open menu's state (shown popovers, `aria-expanded`,\n // checked toggles, focus), so the morph skips the children; the content key\n // rebuilds the menu when they change. An unchanged menu reuses its cached\n // markup and costs one hash pass.\n const { key, cacheKey } = popupMenuContentKey(\n [\n text ?? '',\n label ?? '',\n String(icon ?? ''),\n String(caret),\n String(disabled),\n String(context),\n // Only a content trigger adds a part, so other menus keep their keys.\n ...(triggerContent === undefined ? [] : [String(triggerContent)]),\n ],\n items,\n );\n let content = cachedPopupMenuContent(cacheKey);\n if (!content) {\n content = renderContent({\n context,\n label,\n icon,\n triggerContent,\n text,\n caret,\n disabled,\n items,\n });\n cachePopupMenuContent(cacheKey, content);\n }\n return (\n <span\n {...rootAttributes}\n class=\"kui-popup-menu\"\n data-component=\"popup-menu\"\n data-key={key}\n data-morph-skip-children\n data-trigger={\n context\n ? 'context'\n : triggerContent === undefined\n ? 'button'\n : 'content'\n }\n data-placement={placement}\n style={\n anchor\n ? `--kui-popup-menu-context-x:${anchor.x}px;--kui-popup-menu-context-y:${anchor.y}px`\n : undefined\n }\n slot={slot}\n >\n {content}\n </span>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/color-picker/wiring/wire-color-pickers.ts"],"names":["next","number"],"mappings":"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","file":"chunk-ACUKTVS3.js","sourcesContent":["import {\n COLOR_PICKER_CHANNELS,\n COLOR_PICKER_SWATCH_ACTION,\n colorPickerAreaText,\n colorPickerChannels,\n type ColorPickerMode,\n colorPickerStyle,\n} from '../color-picker.js';\nimport {\n formatHex,\n hslToRgb,\n type Hsva,\n hsvForValue,\n hsvToRgb,\n rgbToHsv,\n} from '../model/color-model.js';\n\n/** Reported to {@link WireColorPickersOptions.onInput} and `onChange`. */\nexport interface ColorPickerChange {\n id: string;\n /** `#rrggbb`, or `#rrggbbaa` below full opacity. */\n value: string;\n mode: ColorPickerMode;\n element: HTMLElement;\n}\n\nexport interface WireColorPickersOptions {\n /** Every live change: a drag, an arrow key, a field edit. */\n onInput?: (change: ColorPickerChange) => void;\n /** A committed change: a drag or key run ending, a field or swatch commit, a mode switch. */\n onChange?: (change: ColorPickerChange) => void;\n}\n\n/** The live color each wired picker shows, keyed by its root element. */\ninterface PickerState {\n hsv: Hsva;\n mode: ColorPickerMode;\n /** The hex last reported or adopted, to tell an app re-render from an echo. */\n value: string;\n}\n\nconst clamp = (value: number, min: number, max: number) =>\n Math.min(max, Math.max(min, value));\n\nconst isMode = (value: string | undefined): value is ColorPickerMode =>\n value === 'rgb' || value === 'hsl' || value === 'hsb' || value === 'gray';\n\n/**\n * Make every ColorPicker under `root` interactive. The area takes pointer\n * drags and the arrow keys (Shift for steps of 10%); the hue and opacity\n * sliders are native ranges; channel, hex, and opacity fields commit on Enter\n * or blur; the model menu switches the channel fields; the screen sampler\n * opens the EyeDropper where the browser has it; preset and sample swatches\n * apply their color. Each change updates the picker at once, dispatches a\n * bubbling `kui-color-input` (or `kui-color-change` when committed) event\n * with `{ value, mode }`, and calls `onInput` / `onChange`. When the app\n * re-renders a picker with a different `value`, the picker adopts it.\n * Returns a disposer.\n */\nexport function wireColorPickers(\n root: HTMLElement,\n { onInput, onChange }: WireColorPickersOptions = {},\n): () => void {\n const states = new WeakMap<HTMLElement, PickerState>();\n\n const pickerOf = (element: Element | null) =>\n element?.closest<HTMLElement>('[data-component=\"color-picker\"]') ?? null;\n\n const alphaOn = (picker: HTMLElement) => picker.hasAttribute('data-alpha');\n\n const stateOf = (picker: HTMLElement): PickerState => {\n let state = states.get(picker);\n if (!state) {\n // The render always writes a formatted hex and a model.\n const value = picker.dataset.value!;\n state = {\n hsv: hsvForValue(value)!,\n mode: picker.dataset.mode as ColorPickerMode,\n value,\n };\n states.set(picker, state);\n }\n return state;\n };\n\n const hexOf = (picker: HTMLElement, hsv: Hsva) =>\n formatHex(hsvToRgb(alphaOn(picker) ? hsv : { ...hsv, a: 1 }));\n\n /** Repaint the wiring-owned surface from the state. */\n const paint = (picker: HTMLElement, skipField?: Element) => {\n const { hsv, mode } = stateOf(picker);\n const surface = picker.querySelector<HTMLElement>(\n '.kui-color-picker__surface',\n )!;\n surface.setAttribute('style', colorPickerStyle(hsv));\n const area = surface.querySelector<HTMLElement>('.kui-color-picker__area');\n area?.setAttribute('aria-valuenow', String(Math.round(hsv.s * 100)));\n area?.setAttribute('aria-valuetext', colorPickerAreaText(hsv));\n const hue = surface.querySelector<HTMLInputElement>(\n '.kui-color-picker__hue',\n );\n if (hue && hue !== skipField) hue.value = String(Math.round(hsv.h));\n const opacity = `${Math.round(hsv.a * 100)}%`;\n const slider = surface.querySelector<HTMLInputElement>(\n '.kui-color-picker__opacity',\n );\n if (slider && slider !== skipField) {\n slider.value = String(Math.round(hsv.a * 100));\n slider.setAttribute('aria-valuetext', opacity);\n }\n const channels = COLOR_PICKER_CHANNELS[mode];\n const values = colorPickerChannels(mode, hsv);\n surface\n .querySelector('.kui-color-picker__channels')\n ?.setAttribute('data-count', String(channels.length));\n for (const field of surface.querySelectorAll<HTMLInputElement>(\n '.kui-color-picker__channel',\n )) {\n const index = Number(field.dataset.channel);\n const channel = channels[index];\n const label = field.closest('label')!;\n label.hidden = channel === undefined;\n label.querySelector('.kui-color-picker__field-label')!.textContent =\n channel === undefined ? '' : channel.short;\n if (channel) field.setAttribute('aria-label', channel.name);\n if (field !== skipField)\n field.value = channel ? String(values[index]) : '';\n field.dataset.shown = field.value;\n }\n const hex = hexOf(picker, hsv);\n const hexField = surface.querySelector<HTMLInputElement>(\n '.kui-color-picker__hex',\n )!;\n if (hexField !== skipField) hexField.value = hex.slice(1).toUpperCase();\n hexField.dataset.shown = hexField.value;\n const opacityField = surface.querySelector<HTMLInputElement>(\n '.kui-color-picker__opacity-field',\n );\n if (opacityField && opacityField !== skipField)\n opacityField.value = opacity;\n if (opacityField) opacityField.dataset.shown = opacityField.value;\n const hidden = surface.querySelector<HTMLInputElement>(\n 'input[type=\"hidden\"]',\n );\n if (hidden) hidden.value = hex;\n surface.querySelector<HTMLSelectElement>('.kui-color-picker__mode')!.value =\n mode;\n };\n\n const report = (picker: HTMLElement, committed: boolean) => {\n const state = stateOf(picker);\n const value = hexOf(picker, state.hsv);\n state.value = value;\n const change: ColorPickerChange = {\n id: picker.dataset.colorPickerId!,\n value,\n mode: state.mode,\n element: picker,\n };\n picker.dispatchEvent(\n new CustomEvent(committed ? 'kui-color-change' : 'kui-color-input', {\n bubbles: true,\n detail: { value, mode: state.mode },\n }),\n );\n if (committed) onChange?.(change);\n else onInput?.(change);\n };\n\n const update = (\n picker: HTMLElement,\n next: Partial<Hsva>,\n committed: boolean,\n skipField?: Element,\n ) => {\n const state = stateOf(picker);\n state.hsv = { ...state.hsv, ...next };\n paint(picker, skipField);\n report(picker, committed);\n };\n\n const disabled = (picker: HTMLElement) =>\n picker.hasAttribute('data-disabled');\n\n // The area: pointer drags.\n let dragging: { picker: HTMLElement; area: HTMLElement } | undefined;\n const fromPointer = (event: PointerEvent, area: HTMLElement) => {\n const box = area.getBoundingClientRect();\n return {\n s: clamp((event.clientX - box.left) / box.width, 0, 1),\n v: clamp(1 - (event.clientY - box.top) / box.height, 0, 1),\n };\n };\n const onPointerDown = (event: PointerEvent) => {\n const area = (event.target as Element).closest<HTMLElement>(\n '.kui-color-picker__area',\n );\n const picker = pickerOf(area);\n if (!area || !picker || disabled(picker) || event.button !== 0) return;\n event.preventDefault();\n area.focus();\n area.setPointerCapture?.(event.pointerId);\n dragging = { picker, area };\n update(picker, fromPointer(event, area), false);\n };\n const onPointerMove = (event: PointerEvent) => {\n if (!dragging) return;\n update(dragging.picker, fromPointer(event, dragging.area), false);\n };\n const onPointerUp = () => {\n if (!dragging) return;\n const { picker } = dragging;\n dragging = undefined;\n report(picker, true);\n };\n\n // The area: the arrow keys, Home / End, and Page Up / Down.\n const onKeyDown = (event: KeyboardEvent) => {\n const area = (event.target as Element).closest<HTMLElement>(\n '.kui-color-picker__area',\n );\n const picker = pickerOf(area);\n if (!area || !picker || disabled(picker)) {\n onFieldKey(event);\n return;\n }\n const step = event.shiftKey ? 0.1 : 0.01;\n const { s, v } = stateOf(picker).hsv;\n const rtl = globalThis.getComputedStyle(area).direction === 'rtl';\n const moves: Record<string, Partial<Hsva>> = {\n ArrowRight: { s: clamp(s + (rtl ? -step : step), 0, 1) },\n ArrowLeft: { s: clamp(s - (rtl ? -step : step), 0, 1) },\n ArrowUp: { v: clamp(v + step, 0, 1) },\n ArrowDown: { v: clamp(v - step, 0, 1) },\n PageUp: { v: clamp(v + 0.1, 0, 1) },\n PageDown: { v: clamp(v - 0.1, 0, 1) },\n Home: { s: 0 },\n End: { s: 1 },\n };\n const move = moves[event.key];\n if (!move) return;\n event.preventDefault();\n update(picker, move, false);\n };\n const onKeyUp = (event: KeyboardEvent) => {\n const picker = pickerOf(\n (event.target as Element).closest('.kui-color-picker__area'),\n );\n if (\n picker &&\n /^(Arrow|Page|Home$|End$)/.test(event.key) &&\n !disabled(picker)\n )\n report(picker, true);\n };\n\n // Fields: Enter commits; Escape restores the shown value.\n const commitField = (field: HTMLInputElement) => {\n const picker = pickerOf(field);\n if (!picker) return;\n // Leaving a field the person did not edit commits nothing.\n if (field.value === (field.dataset.shown ?? field.getAttribute('value')))\n return;\n const state = stateOf(picker);\n if (field.classList.contains('kui-color-picker__hex')) {\n const raw = field.value.trim().replace(/^#/, '');\n const next = /^[\\da-f]{3,8}$/i.test(raw)\n ? hsvForValue(`#${raw}`, state.hsv)\n : undefined;\n if (next && [3, 4, 6, 8].includes(raw.length)) {\n update(picker, alphaOn(picker) ? next : { ...next, a: 1 }, true);\n return;\n }\n paint(picker);\n return;\n }\n if (field.classList.contains('kui-color-picker__opacity-field')) {\n const number = Number.parseFloat(field.value);\n if (Number.isFinite(number))\n update(picker, { a: clamp(number, 0, 100) / 100 }, true);\n else paint(picker);\n return;\n }\n const index = Number(field.dataset.channel);\n const channels = COLOR_PICKER_CHANNELS[state.mode];\n const channel = channels[index];\n const number = Number.parseFloat(field.value);\n if (!channel || !Number.isFinite(number)) {\n paint(picker);\n return;\n }\n const values = colorPickerChannels(state.mode, state.hsv);\n values[index] = clamp(number, 0, channel.max);\n const { a } = state.hsv;\n let next: Hsva;\n switch (state.mode) {\n case 'rgb':\n next = rgbToHsv({ r: values[0]!, g: values[1]!, b: values[2]!, a });\n if (next.s === 0) next.h = state.hsv.h;\n break;\n case 'hsl': {\n const rgba = hslToRgb({\n h: values[0]!,\n s: values[1]! / 100,\n l: values[2]! / 100,\n a,\n });\n next = { ...rgbToHsv(rgba), h: values[0]! };\n break;\n }\n case 'hsb':\n next = { h: values[0]!, s: values[1]! / 100, v: values[2]! / 100, a };\n break;\n case 'gray':\n next = { h: state.hsv.h, s: 0, v: values[0]! / 100, a };\n break;\n }\n update(picker, next, true);\n };\n const onFieldKey = (event: KeyboardEvent) => {\n const field = event.target;\n if (\n !(field instanceof HTMLInputElement) ||\n !field.matches(\n '.kui-color-picker__channel, .kui-color-picker__hex, .kui-color-picker__opacity-field',\n )\n )\n return;\n if (event.key === 'Enter') {\n event.preventDefault();\n commitField(field);\n } else if (event.key === 'Escape') {\n const picker = pickerOf(field);\n if (picker) paint(picker);\n }\n };\n const onFocusOut = (event: FocusEvent) => {\n const field = event.target;\n if (\n field instanceof HTMLInputElement &&\n field.matches(\n '.kui-color-picker__channel, .kui-color-picker__hex, .kui-color-picker__opacity-field',\n )\n )\n commitField(field);\n };\n\n // Sliders, the model menu, and swatches.\n const onInputEvent = (event: Event) => {\n const input = event.target;\n if (!(input instanceof HTMLInputElement)) return;\n const picker = pickerOf(input);\n if (!picker) return;\n if (input.classList.contains('kui-color-picker__hue')) {\n event.stopPropagation();\n update(picker, { h: Number(input.value) }, false, input);\n } else if (input.classList.contains('kui-color-picker__opacity')) {\n event.stopPropagation();\n update(picker, { a: Number(input.value) / 100 }, false, input);\n }\n };\n const onChangeEvent = (event: Event) => {\n const target = event.target;\n const picker = pickerOf(target as Element);\n if (!picker) return;\n if (\n target instanceof HTMLInputElement &&\n target.matches('.kui-color-picker__hue, .kui-color-picker__opacity')\n ) {\n event.stopPropagation();\n report(picker, true);\n return;\n }\n if (\n target instanceof HTMLSelectElement &&\n target.classList.contains('kui-color-picker__mode') &&\n isMode(target.value)\n ) {\n event.stopPropagation();\n stateOf(picker).mode = target.value;\n paint(picker);\n report(picker, true);\n return;\n }\n if (\n target instanceof HTMLInputElement &&\n target.dataset.action === COLOR_PICKER_SWATCH_ACTION\n ) {\n event.stopPropagation();\n const state = stateOf(picker);\n const next = hsvForValue(target.value, state.hsv);\n if (next) update(picker, next, true);\n }\n };\n\n // The screen sampler, where the browser has it.\n type EyeDropperConstructor = new () => {\n open(): Promise<{ sRGBHex: string }>;\n };\n const EyeDropperApi = (\n globalThis as typeof globalThis & { EyeDropper?: EyeDropperConstructor }\n ).EyeDropper;\n const revealSamplers = () => {\n if (!EyeDropperApi) return;\n for (const button of root.querySelectorAll<HTMLButtonElement>(\n '.kui-color-picker__eyedropper[hidden]',\n ))\n button.hidden = false;\n };\n const onClick = (event: MouseEvent) => {\n const button = (event.target as Element).closest<HTMLButtonElement>(\n '.kui-color-picker__eyedropper',\n );\n const picker = pickerOf(button);\n if (!button || !picker || !EyeDropperApi || disabled(picker)) return;\n new EyeDropperApi().open().then(\n ({ sRGBHex }) => {\n const state = stateOf(picker);\n const next = hsvForValue(sRGBHex, state.hsv);\n if (next) update(picker, { ...next, a: state.hsv.a }, true);\n },\n () => {\n // The person dismissed the sampler; nothing changes.\n },\n );\n };\n\n // Adopt a new controlled value or mode from an app re-render. Only the\n // attribute that actually changed is adopted, so a value-only re-render\n // keeps a model the person switched to.\n const adopt = (picker: HTMLElement, attribute: string | null) => {\n const state = stateOf(picker);\n if (attribute === 'data-mode') {\n const mode = picker.dataset.mode;\n if (isMode(mode) && mode !== state.mode) {\n state.mode = mode;\n paint(picker);\n }\n return;\n }\n const value = picker.dataset.value;\n if (value === undefined || value === state.value) return;\n const next = hsvForValue(value, state.hsv);\n if (!next) return;\n state.hsv = next;\n state.value = value;\n paint(picker);\n };\n const observer = new MutationObserver((records) => {\n revealSamplers();\n for (const record of records) {\n if (record.type !== 'attributes') continue;\n const picker = record.target as HTMLElement;\n if (picker.matches('[data-component=\"color-picker\"]'))\n adopt(picker, record.attributeName);\n }\n });\n observer.observe(root, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-value', 'data-mode'],\n });\n revealSamplers();\n\n root.addEventListener('pointerdown', onPointerDown);\n root.addEventListener('pointermove', onPointerMove);\n root.addEventListener('pointerup', onPointerUp);\n root.addEventListener('pointercancel', onPointerUp);\n root.addEventListener('keydown', onKeyDown);\n root.addEventListener('keyup', onKeyUp);\n root.addEventListener('focusout', onFocusOut);\n root.addEventListener('input', onInputEvent);\n root.addEventListener('change', onChangeEvent);\n root.addEventListener('click', onClick);\n return () => {\n observer.disconnect();\n root.removeEventListener('pointerdown', onPointerDown);\n root.removeEventListener('pointermove', onPointerMove);\n root.removeEventListener('pointerup', onPointerUp);\n root.removeEventListener('pointercancel', onPointerUp);\n root.removeEventListener('keydown', onKeyDown);\n root.removeEventListener('keyup', onKeyUp);\n root.removeEventListener('focusout', onFocusOut);\n root.removeEventListener('input', onInputEvent);\n root.removeEventListener('change', onChangeEvent);\n root.removeEventListener('click', onClick);\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/popup-menu/internal/reveal-in-menu.ts","../src/components/actions/popup-menu/internal/popup-menu-controller.ts"],"names":["root"],"mappings":"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","file":"chunk-C3RLKKFQ.js","sourcesContent":["/**\n * Scroll `item`'s own menu panel by the least amount that brings the item\n * fully inside it, leaving the page and every other scroller alone. Pairs\n * with `focus({ preventScroll: true })`: a menu in the top layer is fixed, so\n * the browser's own focus scrolling would move the page beneath it.\n */\nexport function revealInMenu(item: HTMLElement, menu: HTMLElement): void {\n if (menu.scrollHeight <= menu.clientHeight) return;\n const box = item.getBoundingClientRect();\n const top = menu.getBoundingClientRect().top + menu.clientTop;\n const bottom = top + menu.clientHeight;\n if (box.top < top) menu.scrollTop -= top - box.top;\n else if (box.bottom > bottom) menu.scrollTop += box.bottom - bottom;\n}\n","import {\n followAnchor,\n PHONE_SUBMENU_QUERY,\n phoneSubmenuPosition,\n pointAnchor,\n type PopupAnchor,\n type PopupPlacement,\n positionPopup,\n} from '../../../../shared/popup/position-popup.js';\nimport {\n POPUP_MENU_CLOSE_EVENT,\n POPUP_MENU_OPEN_EVENT,\n POPUP_MENU_SELECT_EVENT,\n type PopupMenuOpenDetail,\n type PopupMenuSelectDetail,\n} from './popup-menu-events.js';\nimport { revealInMenu } from './reveal-in-menu.js';\n\nconst ROOT = '.kui-popup-menu';\nconst MENU = '.kui-popup-menu__menu';\nconst ITEM = '.kui-popup-menu__item';\nconst TRIGGER = '.kui-popup-menu__trigger';\nconst ROOT_OPENER =\n ':scope > .kui-popup-menu__trigger, :scope > .kui-popup-menu__context-anchor';\n\n/** A typeahead query resets after this long without a keystroke. */\nexport const TYPEAHEAD_RESET = 1000;\n\n/** A submenu the pointer has left closes after this grace period. */\nexport const SUBMENU_CLOSE_DELAY = 100;\n\n/**\n * A submenu lifts by its own inset plus border, so its first row lines up\n * with the item that opened it.\n */\nconst SUBMENU_CROSS_OFFSET = -5;\n\n/** How far ahead of the pointer, toward the submenu, the safe triangle starts. */\nconst SAFE_TRIANGLE_LEAD = 2;\n\n/** The submenu attribute marking a pointer opening, which gets the safe triangle. */\nexport const POINTER_OPENED = 'data-pointer-opened';\n\ntype Focus = 'first' | 'last' | 'none';\n\nconst installed = new WeakSet<Document>();\n\nconst isOpen = (menu: Element): boolean => {\n try {\n return menu.matches(':popover-open');\n } catch {\n return false;\n }\n};\n\nconst isDisabled = (item: Element): boolean =>\n item.getAttribute('aria-disabled') === 'true';\n\nconst rootMenuOf = (root: Element): HTMLElement | null =>\n root.querySelector<HTMLElement>(`:scope > ${MENU}`);\n\nconst rootOpenerOf = (root: Element): HTMLElement | null =>\n root.querySelector<HTMLElement>(ROOT_OPENER);\n\n/** A submenu item's own menu, the sibling after it in its host. */\nconst submenuOf = (item: Element): HTMLElement | null =>\n item.parentElement?.classList.contains('kui-popup-menu__submenu-host') &&\n item.nextElementSibling?.matches(MENU)\n ? (item.nextElementSibling as HTMLElement)\n : null;\n\n/** The control a menu opened from: the root trigger, or a submenu's item. */\nfunction openerOf(menu: Element): HTMLElement | null {\n if (menu.hasAttribute('data-submenu')) {\n const item = menu.previousElementSibling;\n return item instanceof HTMLElement && item.matches(ITEM) ? item : null;\n }\n const root = menu.parentElement;\n return root?.matches(ROOT) ? rootOpenerOf(root) : null;\n}\n\n/** The items of one menu level, in order; disabled items are skipped by default. */\nfunction levelItems(menu: Element, includeDisabled = false): HTMLElement[] {\n return Array.from(menu.querySelectorAll<HTMLElement>(ITEM)).filter(\n (item) =>\n item.closest(MENU) === menu && (includeDisabled || !isDisabled(item)),\n );\n}\n\n/** The open submenus a menu level shows directly. */\nfunction openSubmenus(menu: Element): HTMLElement[] {\n return levelItems(menu, true)\n .map(submenuOf)\n .filter((submenu): submenu is HTMLElement => !!submenu && isOpen(submenu));\n}\n\nconst isRtl = (element: Element): boolean =>\n element.ownerDocument.defaultView!.getComputedStyle(element).direction ===\n 'rtl';\n\n// Every rendered item holds its label span.\nconst labelOf = (item: Element): string =>\n item.querySelector('.kui-popup-menu__item-label')!.textContent!.trim();\n\nfunction focusItem(menu: HTMLElement, focus: Focus): void {\n if (focus === 'none') return;\n const items = levelItems(menu);\n const target = focus === 'last' ? items[items.length - 1] : items[0];\n // A menu with nothing to focus still takes focus, so its keys work.\n (target ?? menu).focus({ preventScroll: true });\n if (target) revealInMenu(target, menu);\n}\n\ninterface Typeahead {\n query: string;\n timer: number | undefined;\n}\n\n/**\n * Wire every PopupMenu in `doc`: opening from its trigger (and from the\n * open/close requests the component helpers send), placement in the top\n * layer, keyboard navigation and typeahead, hover-opened submenus with a\n * pointer safe triangle, the `kui-menu-select` choice event, focus return, and\n * cleanup when a menu closes for any reason. Idempotent per document.\n */\nexport function installPopupMenus(doc: Document = document): void {\n if (installed.has(doc)) return;\n installed.add(doc);\n const win = doc.defaultView!;\n const following = new WeakMap<HTMLElement, () => void>();\n const pendingClose = new WeakMap<HTMLElement, number>();\n const typeahead = new WeakMap<HTMLElement, Typeahead>();\n // Open root menus, for dismissal by a press outside them.\n const openRoots = new Set<HTMLElement>();\n // Menus closing without returning focus (a press outside moves it).\n const quiet = new WeakSet<HTMLElement>();\n // Each menu's toggle count, so a deferred focus return from an earlier\n // close never acts after the menu has opened or closed again.\n const toggles = new WeakMap<HTMLElement, number>();\n\n const follow = (\n menu: HTMLElement,\n anchor: PopupAnchor,\n place: () => Promise<void> | void,\n ) => {\n following.get(menu)?.();\n // A placement can cap the menu after a key has already moved focus\n // inside it (End pressed as it opens): keep that item in view.\n const reveal = () => {\n const active = doc.activeElement;\n if (active instanceof HTMLElement && active.closest(MENU) === menu)\n revealInMenu(active, menu);\n };\n const stop = followAnchor(anchor, menu, () => {\n if (!menu.isConnected || !isOpen(menu)) {\n stopFollowing(menu);\n return;\n }\n void Promise.resolve(place()).then(reveal);\n });\n following.set(menu, stop);\n };\n\n const stopFollowing = (menu: HTMLElement) => {\n following.get(menu)?.();\n following.delete(menu);\n };\n\n const placeSubmenu = (item: HTMLElement, submenu: HTMLElement) => {\n const parent = item.closest<HTMLElement>(MENU);\n if (parent && win.matchMedia(PHONE_SUBMENU_QUERY).matches) {\n submenu.style.removeProperty('max-height');\n submenu.style.removeProperty('max-width');\n const size = submenu.getBoundingClientRect();\n const placement = phoneSubmenuPosition(\n parent.getBoundingClientRect(),\n size,\n {\n width: doc.documentElement.clientWidth || win.innerWidth,\n height: doc.documentElement.clientHeight || win.innerHeight,\n },\n isRtl(submenu),\n );\n submenu.style.left = `${placement.left}px`;\n submenu.style.top = `${placement.top}px`;\n submenu.style.maxHeight = `${placement.maxHeight}px`;\n submenu.style.maxWidth = `${placement.maxWidth}px`;\n submenu.setAttribute('data-placement', placement.placement);\n return;\n }\n return positionPopup(item, submenu, {\n placement: isRtl(submenu) ? 'left-start' : 'right-start',\n crossOffset: SUBMENU_CROSS_OFFSET,\n });\n };\n\n const openRoot = (\n root: HTMLElement,\n { point, focus }: { point?: { x: number; y: number }; focus: Focus },\n ) => {\n const opener = rootOpenerOf(root);\n const menu = rootMenuOf(root);\n if (!opener || !menu) return;\n if (opener instanceof HTMLButtonElement && opener.disabled) return;\n if (isOpen(menu)) closeMenu(menu, false);\n const context = root.getAttribute('data-trigger') === 'context';\n const anchor: PopupAnchor =\n point && !context ? pointAnchor(point.x, point.y) : opener;\n const placement = (\n point || context\n ? 'bottom-start'\n : (root.getAttribute('data-placement') ?? 'bottom-start')\n ) as PopupPlacement;\n try {\n menu.showPopover();\n } catch {\n return;\n }\n openRoots.add(menu);\n opener.setAttribute('aria-expanded', 'true');\n follow(menu, anchor, () => positionPopup(anchor, menu, { placement }));\n focusItem(menu, focus);\n };\n\n const openSubmenu = (\n item: HTMLElement,\n submenu: HTMLElement,\n focus: Focus,\n pointer: boolean,\n ) => {\n cancelClose(submenu);\n if (!isOpen(submenu)) {\n // One submenu per level: a sibling's (and its own submenus) close.\n for (const open of openSubmenus(item.closest(MENU)!))\n closeMenu(open, false);\n try {\n submenu.showPopover();\n } catch {\n return;\n }\n item.setAttribute('aria-expanded', 'true');\n submenu.toggleAttribute(POINTER_OPENED, pointer);\n follow(submenu, item, () => placeSubmenu(item, submenu));\n }\n focusItem(submenu, focus);\n };\n\n /**\n * Hide one menu (its open submenus follow, below), returning focus to its\n * opener if asked. A silent close leaves focus where the user is moving it.\n */\n const closeMenu = (\n menu: HTMLElement,\n restoreFocus: boolean,\n silent = false,\n ) => {\n if (!isOpen(menu)) return;\n const opener = openerOf(menu);\n const focusInside = menu.contains(doc.activeElement);\n if (silent) quiet.add(menu);\n try {\n menu.hidePopover();\n } catch {\n quiet.delete(menu);\n return;\n }\n if (restoreFocus && focusInside) opener?.focus({ preventScroll: true });\n };\n\n const closeRoot = (root: Element, restoreFocus: boolean) => {\n const menu = rootMenuOf(root);\n if (menu) closeMenu(menu, restoreFocus);\n };\n\n const cancelClose = (submenu: HTMLElement) => {\n const timer = pendingClose.get(submenu);\n if (timer !== undefined) win.clearTimeout(timer);\n pendingClose.delete(submenu);\n };\n\n /** Close a submenu the pointer left, unless it returns within the grace period. */\n const scheduleClose = (submenu: HTMLElement) => {\n if (pendingClose.has(submenu)) return;\n pendingClose.set(\n submenu,\n win.setTimeout(() => {\n pendingClose.delete(submenu);\n const opener = openerOf(submenu);\n if (submenu.matches(':hover') || opener?.matches(':hover')) return;\n closeMenu(submenu, false);\n }, SUBMENU_CLOSE_DELAY),\n );\n };\n\n // A checkbox choice reports the state it asks for; the application owns\n // the state and renders it, so the item itself is not toggled here.\n const choose = (root: HTMLElement, item: HTMLElement) => {\n const checked =\n item.getAttribute('role') === 'menuitemcheckbox'\n ? item.getAttribute('aria-checked') !== 'true'\n : undefined;\n const proceed = root.dispatchEvent(\n new CustomEvent<PopupMenuSelectDetail>(POPUP_MENU_SELECT_EVENT, {\n bubbles: true,\n cancelable: true,\n detail: {\n item,\n value: item.getAttribute('value') ?? undefined,\n checked,\n },\n }),\n );\n if (proceed) closeRoot(root, true);\n };\n\n const runTypeahead = (menu: HTMLElement, key: string): boolean => {\n const state = typeahead.get(menu) ?? { query: '', timer: undefined };\n typeahead.set(menu, state);\n win.clearTimeout(state.timer);\n state.timer = win.setTimeout(() => {\n state.query = '';\n }, TYPEAHEAD_RESET);\n state.query += key.toLowerCase();\n const match = levelItems(menu).find((item) =>\n labelOf(item).toLowerCase().startsWith(state.query.trim()),\n );\n if (!match) return false;\n match.focus({ preventScroll: true });\n revealInMenu(match, menu);\n return true;\n };\n\n // A press outside an open menu (and its trigger) closes it. Menus are\n // manual popovers so a context menu opened during a press (`contextmenu`\n // fires on press in some engines) is not light-dismissed on release.\n doc.addEventListener(\n 'pointerdown',\n (event) => {\n const path = event.composedPath();\n for (const menu of [...openRoots]) {\n if (!menu.isConnected || !isOpen(menu)) {\n openRoots.delete(menu);\n continue;\n }\n if (!path.includes(menu.parentElement!)) closeMenu(menu, false, true);\n }\n },\n true,\n );\n\n doc.addEventListener(\n 'click',\n (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest<HTMLElement>(TRIGGER);\n if (trigger?.parentElement?.matches(ROOT)) {\n const root = trigger.parentElement as HTMLElement;\n const menu = rootMenuOf(root);\n if (!menu) return;\n if (isOpen(menu)) closeMenu(menu, true);\n else openRoot(root, { focus: 'first' });\n return;\n }\n const item = target.closest<HTMLElement>(ITEM);\n const root = item?.closest<HTMLElement>(ROOT);\n if (!item || !root) return;\n // A disabled command does nothing, and its click never reaches the\n // application's delegated data-action.\n if (isDisabled(item)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n return;\n }\n const submenu = submenuOf(item);\n if (submenu) {\n // A keyboard click (Enter or Space) moves into the submenu.\n openSubmenu(\n item,\n submenu,\n event.detail === 0 ? 'first' : 'none',\n event.detail !== 0,\n );\n return;\n }\n choose(root, item);\n },\n true,\n );\n\n doc.addEventListener(\n 'keydown',\n (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const trigger = target.closest<HTMLElement>(TRIGGER);\n if (trigger?.parentElement?.matches(ROOT)) {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n openRoot(trigger.parentElement as HTMLElement, {\n focus: event.key === 'ArrowUp' ? 'last' : 'first',\n });\n return;\n }\n const menu = target.closest<HTMLElement>(MENU);\n const root = menu?.closest<HTMLElement>(ROOT);\n if (!menu || !root || !isOpen(menu)) return;\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n const items = levelItems(menu);\n const current =\n target.matches(ITEM) && target.closest(MENU) === menu\n ? (target as HTMLElement)\n : null;\n const index = current ? items.indexOf(current) : -1;\n const rtl = isRtl(menu);\n const forward = rtl ? 'ArrowLeft' : 'ArrowRight';\n const back = rtl ? 'ArrowRight' : 'ArrowLeft';\n const move = (next: HTMLElement | undefined) => {\n event.preventDefault();\n event.stopPropagation();\n if (!next) return;\n next.focus({ preventScroll: true });\n revealInMenu(next, menu);\n };\n const query = typeahead.get(menu)?.query ?? '';\n switch (event.key) {\n case 'ArrowDown':\n move(items[index >= 0 && index < items.length - 1 ? index + 1 : 0]);\n return;\n case 'ArrowUp':\n move(items[index > 0 ? index - 1 : items.length - 1]);\n return;\n case 'Home':\n move(items[0]);\n return;\n case 'End':\n move(items[items.length - 1]);\n return;\n case 'Escape':\n // The menu claims Escape, so an enclosing dialog stays open.\n event.preventDefault();\n event.stopPropagation();\n closeMenu(menu, true);\n return;\n case 'Tab':\n // Tab leaves the menu: close it and continue from the trigger.\n closeRoot(root, false);\n rootOpenerOf(root)?.focus({ preventScroll: true });\n return;\n case forward: {\n const submenu = current && submenuOf(current);\n if (submenu) {\n event.preventDefault();\n event.stopPropagation();\n openSubmenu(current, submenu, 'first', false);\n }\n return;\n }\n case back:\n if (menu.hasAttribute('data-submenu')) {\n event.preventDefault();\n event.stopPropagation();\n closeMenu(menu, true);\n }\n return;\n case ' ':\n // Space continues a typeahead query; otherwise it chooses.\n if (query) {\n event.preventDefault();\n runTypeahead(menu, ' ');\n }\n return;\n default:\n if (event.key.length === 1 && runTypeahead(menu, event.key)) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n },\n true,\n );\n\n // Hovering an item with a submenu opens it; moving onto another item of\n // the same level closes it after a short grace period.\n doc.addEventListener(\n 'pointerover',\n (event) => {\n if ((event as PointerEvent).pointerType === 'touch') return;\n const target = event.target;\n if (!(target instanceof Element)) return;\n const menu = target.closest<HTMLElement>(MENU);\n if (!menu || !isOpen(menu)) return;\n // Over a submenu (or its safe triangle): keep it and its ancestors open.\n // A submenu always sits inside its parent menu.\n for (\n let level = menu;\n level.hasAttribute('data-submenu');\n level = level.parentElement!.closest<HTMLElement>(MENU)!\n )\n cancelClose(level);\n const item = target.closest<HTMLElement>(ITEM);\n if (!item || item.closest(MENU) !== menu) return;\n const submenu = submenuOf(item);\n for (const open of openSubmenus(menu))\n if (open !== submenu) scheduleClose(open);\n if (submenu && !isDisabled(item))\n openSubmenu(item, submenu, 'none', true);\n },\n true,\n );\n\n // The safe triangle: while a pointer-opened submenu shows, its ::before\n // spans from the pointer to the submenu's near edge, so a diagonal move\n // toward the submenu stays over it instead of crossing sibling items.\n doc.addEventListener(\n 'pointermove',\n (event) => {\n const { clientX, clientY } = event as PointerEvent;\n for (const submenu of doc.querySelectorAll<HTMLElement>(\n `${MENU}[${POINTER_OPENED}]`,\n )) {\n if (!isOpen(submenu)) continue;\n const box = submenu.getBoundingClientRect();\n const edge = isRtl(submenu) ? box.right : box.left;\n // The apex sits just ahead of the pointer, toward the submenu: some\n // engines hit-test a polygon's edge as inside, so an apex under the\n // pointer would take the hover from the item beneath it.\n const x = isRtl(submenu)\n ? Math.max(clientX - SAFE_TRIANGLE_LEAD, edge)\n : Math.min(clientX + SAFE_TRIANGLE_LEAD, edge);\n const y = Math.max(box.top, Math.min(clientY, box.bottom));\n submenu.style.setProperty('--_kui-popup-menu-safe-x', `${x}px`);\n submenu.style.setProperty('--_kui-popup-menu-safe-y', `${y}px`);\n submenu.style.setProperty('--_kui-popup-menu-safe-edge', `${edge}px`);\n submenu.style.setProperty('--_kui-popup-menu-safe-top', `${box.top}px`);\n submenu.style.setProperty(\n '--_kui-popup-menu-safe-bottom',\n `${box.bottom}px`,\n );\n }\n },\n { capture: true, passive: true },\n );\n\n // Every close, however it happens (a choice, Escape, a press outside,\n // another menu opening), stops placement and resets the opener's state;\n // focus inside a closing menu returns to its opener unless focus has\n // already gone somewhere else.\n doc.addEventListener(\n 'beforetoggle',\n (event) => {\n const menu = event.target;\n if (!(menu instanceof HTMLElement) || !menu.matches(MENU)) return;\n const toggle = (toggles.get(menu) ?? 0) + 1;\n toggles.set(menu, toggle);\n if ((event as ToggleEvent).newState !== 'closed') return;\n stopFollowing(menu);\n cancelClose(menu);\n openRoots.delete(menu);\n menu.removeAttribute(POINTER_OPENED);\n const opener = openerOf(menu);\n opener?.setAttribute('aria-expanded', 'false');\n // Menus are manual popovers, so a closing menu hides the submenus it\n // shows itself; their focus is this menu's to return.\n for (const nested of menu.querySelectorAll<HTMLElement>(MENU))\n if (isOpen(nested)) {\n quiet.add(nested);\n nested.hidePopover();\n }\n const silent = quiet.has(menu);\n quiet.delete(menu);\n if (silent || !menu.contains(doc.activeElement)) return;\n win.queueMicrotask(() => {\n const active = doc.activeElement;\n // Toggled again in the meantime, or focus has moved on: leave it.\n if (toggles.get(menu) !== toggle) return;\n if (!active || active === doc.body || menu.contains(active))\n opener?.focus({ preventScroll: true });\n });\n },\n true,\n );\n\n doc.addEventListener(\n POPUP_MENU_OPEN_EVENT,\n (event) => {\n const root = event.target;\n if (!(root instanceof HTMLElement) || !root.matches(ROOT)) return;\n const { point } = (event as CustomEvent<PopupMenuOpenDetail>).detail;\n openRoot(root, { point, focus: 'first' });\n },\n true,\n );\n\n doc.addEventListener(\n POPUP_MENU_CLOSE_EVENT,\n (event) => {\n const root = event.target;\n if (root instanceof HTMLElement && root.matches(ROOT))\n closeRoot(root, true);\n },\n true,\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/collections/list-header/list-header.tsx"],"names":[],"mappings":";;;;;;;;AAcA,IAAM,8BAAA,uBAAqC,GAAA,CAAI;AAAA,EAC7C,gBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,iCAAA,uBAAwC,GAAA,CAAI;AAAA,EAChD,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AAyGM,SAAS,UAAA,CAAW;AAAA,EACzB,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,CAAA;AAAA,EACf,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,UAAA;AAAA,EACV,OAAA,GAAU,MAAA;AAAA,EACV,MAAA,GAAS,KAAA;AAAA,EACT,KAAA,GAAQ,MAAA;AAAA,EACR,aAAA,GAAgB,SAAA;AAAA,EAChB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA,GAAiB,KAAA;AAAA,EACjB,cAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,WAAA,GAAc,KAAA;AAAA,EACd,iBAAiB,EAAC;AAAA,EAClB,oBAAoB,EAAC;AAAA,EACrB;AACF,CAAA,EAAoB;AAClB,EAAA,MAAM,uBAAA,GAA0B,oBAAA;AAAA,IAC9B,cAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,0BAAA,GAA6B,uBAAA;AAAA,IACjC,iBAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,eAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,cAAc,KAAK,CAAA,IAAK,KAAA,IAAS,CAAA,GACjE,KAAA,GACA,MAAA;AACN,EAAA,MAAM,oBAAA,GACJ,eAAA,KAAoB,MAAA,GAChB,MAAA,GACA,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,IAAA,EAAK,GAChD,UAAA,GACA,MAAA,CAAO,eAAe,CAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,eAAA,KAAoB,MAAA,GAAY,KAAA,GAAQ,MAAA;AAC9D,EAAA,MAAM,cAAA,GAAiB,eAAA,KAAoB,MAAA,GAAY,MAAA,GAAS,MAAA;AAChE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,aAAA,IAAiB,cAAc,CAAA;AACxD,EAAA,MAAM,kBAAA,GACJ,eACC,MAAA,mBAAS,GAAA,CAAC,mBAAgB,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,GAAK,MAAA,CAAA;AAC3D,EAAA,MAAM,kBACJ,eAAA,KAAoB,MAAA,GAChB,SACA,CAAA,EAAG,KAAK,KAAK,oBAAoB,CAAA,CAAA;AACvC,EAAA,MAAM,SAAA,GACJ,aAAA,KAAkB,QAAA,GAAW,MAAA,GAAS,aAAA;AACxC,EAAA,MAAM,SAAA,GACJ,oBAAoB,MAAA,mBAClB,GAAA,CAAC,SAAM,IAAA,EAAK,SAAA,EAAU,IAAA,EAAM,SAAA,EAAW,UAAA,EAAY,CAAC,aACjD,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,CAAA,GAAK,eAAA,EACjD,CAAA,mBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,aAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,SAAA,EAAU,MAAM,SAAA,EACzB,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,IAAK,aAAA,EACjD,CAAA;AAAA,IAED,cAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAM,IAAA,EAAK,WAAU,IAAA,EAAM,SAAA,EACzB,QAAA,EAAA,WAAA,mBAAc,GAAA,CAAC,YAAS,KAAA,EAAO,EAAA,CAAG,IAAI,CAAA,EAAG,IAAK,cAAA,EACjD;AAAA,GAAA,EAEJ,CAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,cAAe,MAAA,GAAmB,MAAA;AAC/C,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBACE,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,uBAAA;AAAA,QACJ,KAAA,EAAM,iBAAA;AAAA,QACN,gBAAA,EAAe,aAAA;AAAA,QACf,gBAAA,EAAgB,OAAO,QAAQ,CAAA;AAAA,QAC/B,gBAAA,EAAgB,MAAA,CAAO,eAAA,KAAoB,MAAS,CAAA;AAAA,QACpD,cAAA,EAAc,OAAA;AAAA,QACd,WAAA,EAAW,IAAA;AAAA,QACX,cAAA,EAAc,OAAA;AAAA,QACd,aAAA,EAAa,OAAO,MAAM,CAAA;AAAA,QAC1B,YAAA,EAAY,KAAA;AAAA,QACZ,qBAAA,EAAqB,aAAA;AAAA,QACrB,aAAA,EAAY,MAAA;AAAA,QACZ,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,QACzC,WAAA,EAAW,IAAA;AAAA,QACX,IAAA;AAAA,QAEA,QAAA,kBAAA,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,0BAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,gDAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,KAAA,EAAO,iBAAiB,cAAA,GAAiB,MAAA;AAAA,YACzC,QAAA,EAAU,kBAAkB,WAAA,IAAe,MAAA;AAAA,YAC3C,mBAAA,EAAmB,iBAAiB,MAAA,GAAS,MAAA;AAAA,YAC7C,YAAA,EAAY,eAAA;AAAA,YACZ,eAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,YAEvC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EAAQ,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,cAC3B,SAAA;AAAA,cACA,kBAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAM,iCACT,QAAA,EAAA,kBAAA,EACH;AAAA;AAAA;AAAA;AAEJ;AAAA,KACF;AAAA,EAEJ;AACA,EAAA,uBACE,IAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,uBAAA;AAAA,MACJ,KAAA,EAAM,iBAAA;AAAA,MACN,gBAAA,EAAe,aAAA;AAAA,MACf,gBAAA,EAAgB,OAAO,QAAQ,CAAA;AAAA,MAC/B,gBAAA,EAAgB,MAAA,CAAO,eAAA,KAAoB,MAAS,CAAA;AAAA,MACpD,cAAA,EAAc,OAAA;AAAA,MACd,WAAA,EAAW,IAAA;AAAA,MACX,cAAA,EAAc,OAAA;AAAA,MACd,aAAA,EAAa,OAAO,MAAM,CAAA;AAAA,MAC1B,YAAA,EAAY,KAAA;AAAA,MACZ,qBAAA,EAAqB,aAAA;AAAA,MACrB,aAAA,EAAY,OAAA;AAAA,MACZ,kBAAA,EAAkB,cAAc,MAAA,GAAS,MAAA;AAAA,MACzC,WAAA,EAAW,IAAA;AAAA,MACX,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,OAAM,wBAAA,EACT,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,IAAI,YAAY,CAAA,CAAA;AAAA,cACzB,MAAA,EAAO,MAAA;AAAA,cACP,YAAA,EAAY,eAAA;AAAA,cAEX,QAAA,EAAA;AAAA;AAAA,WACH;AAAA,UACC;AAAA,SAAA,EACH,CAAA;AAAA,QACC,MAAA,oBACC,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACE,GAAG,0BAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAM,yBAAA;AAAA,YACN,aAAA,EAAa,cAAc,MAAA,GAAY,MAAA;AAAA,YACvC,YAAA,EAAY,WAAA;AAAA,YACZ,KAAA,EAAO,iBAAiB,cAAA,GAAiB,WAAA;AAAA,YACzC,QAAA,EAAU,kBAAkB,WAAA,IAAe,MAAA;AAAA,YAC3C,mBAAA,EAAmB,iBAAiB,MAAA,GAAS,MAAA;AAAA,YAE5C,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-ECFCAKWE.js","sourcesContent":["import type { SafeHtml } from 'kerfjs';\n\nimport {\n filterControlAttributes,\n filterDataAttributes,\n} from '../../../shared/dom/extension-attributes.js';\nimport { em } from '../../../shared/styles/css-values.js';\nimport type { SemanticTone } from '../../../shared/styles/semantic-tone.js';\nimport type { HeadingLevel } from '../../actions/toolbar-text/toolbar-text.js';\nimport { Badge } from '../../feedback/badge/badge.js';\nimport { Skeleton } from '../../feedback/skeleton/skeleton.js';\nimport { DisclosureArrow } from '../../navigation/disclosure-arrow/disclosure-arrow.js';\nimport { Text } from '../../typography/text/text.js';\n\nconst PROTECTED_ROOT_DATA_ATTRIBUTES = new Set([\n 'data-component',\n 'data-action',\n 'data-has-badge',\n 'data-has-count',\n 'data-density',\n 'data-size',\n 'data-divider',\n 'data-inline',\n 'data-width',\n 'data-indicator-tone',\n 'data-toggle',\n]);\nconst PROTECTED_TRIGGER_DATA_ATTRIBUTES = new Set([\n 'data-action',\n 'data-kui-disabled',\n]);\n\ntype ListHeaderRootAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-component'?: never;\n 'data-action'?: never;\n 'data-has-badge'?: never;\n 'data-has-count'?: never;\n 'data-density'?: never;\n 'data-size'?: never;\n 'data-divider'?: never;\n 'data-inline'?: never;\n 'data-width'?: never;\n 'data-indicator-tone'?: never;\n 'data-toggle'?: never;\n }\n>;\n\ntype ListHeaderTriggerAttributes = Readonly<\n Record<`data-${string}`, string | undefined> & {\n 'data-action'?: never;\n 'data-kui-disabled'?: never;\n popoverTarget?: string;\n popoverTargetAction?: 'toggle' | 'show' | 'hide';\n 'aria-controls'?: string;\n 'aria-haspopup'?: 'dialog' | 'menu' | 'listbox' | 'tree' | 'grid' | 'true';\n }\n>;\n\ninterface ListHeaderBaseProps {\n label: string;\n /** Visual label size, independent of the native heading level. Default `sm`. */\n size?: 'xs' | 'sm' | 'm' | 'l' | 'xl';\n density?: 'standard' | 'compact';\n divider?: 'none' | 'before' | 'after' | 'both';\n /** Shrink-wrap the header without its default outer margin, border, or padding. */\n inline?: boolean;\n /** Fill the available row or shrink-wrap while retaining normal header geometry. */\n width?: 'fill' | 'content';\n indicatorTone?: 'neutral' | 'accent' | 'pop' | 'danger';\n /** Render as an unanimated loading skeleton: keep the label and action affordance, disable interaction. */\n placeholder?: boolean;\n rootAttributes?: ListHeaderRootAttributes;\n triggerAttributes?: ListHeaderTriggerAttributes;\n /** Native named-slot assignment when composed inside a web component. */\n slot?: string;\n}\n\ntype ListHeaderModeProps =\n | {\n /** Render the title as a controlled disclosure trigger. */\n toggle: true;\n /** A toggle's label is its button text, not a heading. */\n headingLevel?: never;\n action: string;\n expanded: boolean;\n actionIcon?: SafeHtml;\n actionLabel?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a separately named trailing action. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action: string;\n actionLabel: string;\n actionIcon: SafeHtml;\n expanded?: never;\n actionDisabled?: boolean;\n disabledReason?: string;\n }\n | {\n /** Render a passive section heading. */\n toggle?: false;\n /**\n * Native heading level (`h1`–`h6`) of the label. Default `2`. Match the\n * document outline; the visual treatment does not change.\n */\n headingLevel?: HeadingLevel;\n action?: never;\n actionLabel?: never;\n actionIcon?: never;\n expanded?: never;\n actionDisabled?: never;\n disabledReason?: never;\n };\n\ntype ListHeaderIndicatorProps =\n | { count: number; countLabel: string; badge?: never; status?: never }\n | {\n count?: never;\n countLabel?: never;\n badge?: SafeHtml | undefined;\n status?: SafeHtml | undefined;\n };\n\nexport type ListHeaderProps = ListHeaderBaseProps &\n ListHeaderIndicatorProps &\n ListHeaderModeProps;\n\nexport function ListHeader({\n label,\n size = 'sm',\n headingLevel = 2,\n count,\n countLabel,\n badge,\n status,\n density = 'standard',\n divider = 'none',\n inline = false,\n width = 'fill',\n indicatorTone = 'neutral',\n action,\n actionLabel,\n actionIcon,\n actionDisabled = false,\n disabledReason,\n expanded,\n toggle = false,\n placeholder = false,\n rootAttributes = {},\n triggerAttributes = {},\n slot,\n}: ListHeaderProps) {\n const extensionRootAttributes = filterDataAttributes(\n rootAttributes,\n PROTECTED_ROOT_DATA_ATTRIBUTES,\n );\n const extensionTriggerAttributes = filterControlAttributes(\n triggerAttributes,\n PROTECTED_TRIGGER_DATA_ATTRIBUTES,\n );\n const normalizedCount =\n typeof count === 'number' && Number.isSafeInteger(count) && count >= 0\n ? count\n : undefined;\n const normalizedCountLabel =\n normalizedCount === undefined\n ? undefined\n : typeof countLabel === 'string' && countLabel.trim()\n ? countLabel\n : String(normalizedCount);\n const renderedBadge = normalizedCount === undefined ? badge : undefined;\n const renderedStatus = normalizedCount === undefined ? status : undefined;\n const hasBadge = Boolean(renderedBadge || renderedStatus);\n const renderedActionIcon =\n actionIcon ??\n (toggle ? <DisclosureArrow open={Boolean(expanded)} /> : undefined);\n const accessibleLabel =\n normalizedCount === undefined\n ? undefined\n : `${label}, ${normalizedCountLabel}`;\n const badgeTone: SemanticTone =\n indicatorTone === 'accent' ? 'info' : indicatorTone;\n const indicator =\n normalizedCount !== undefined ? (\n <Badge size=\"compact\" tone={badgeTone} ariaHidden={!placeholder}>\n {placeholder ? <Skeleton width={em(1.75)} /> : normalizedCount}\n </Badge>\n ) : (\n <>\n {renderedBadge && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedBadge}\n </Badge>\n )}\n {renderedStatus && (\n <Badge size=\"compact\" tone={badgeTone}>\n {placeholder ? <Skeleton width={em(1.75)} /> : renderedStatus}\n </Badge>\n )}\n </>\n );\n const busy = placeholder ? ('true' as const) : undefined;\n if (toggle) {\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"true\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__title kui-list-header__toggle\"\n data-action={placeholder ? undefined : action}\n title={actionDisabled ? disabledReason : undefined}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n aria-label={accessibleLabel}\n aria-expanded={String(Boolean(expanded))}\n >\n <Text variant=\"span\">{label}</Text>\n {indicator}\n {renderedActionIcon && (\n <span class=\"kui-list-header__action-layer\">\n {renderedActionIcon}\n </span>\n )}\n </button>\n </header>\n );\n }\n return (\n <header\n {...extensionRootAttributes}\n class=\"kui-list-header\"\n data-component=\"list-header\"\n data-has-badge={String(hasBadge)}\n data-has-count={String(normalizedCount !== undefined)}\n data-density={density}\n data-size={size}\n data-divider={divider}\n data-inline={String(inline)}\n data-width={width}\n data-indicator-tone={indicatorTone}\n data-toggle=\"false\"\n data-placeholder={placeholder ? 'true' : undefined}\n aria-busy={busy}\n slot={slot}\n >\n <div class=\"kui-list-header__title\">\n <Text\n variant={`h${headingLevel}`}\n border=\"none\"\n aria-label={accessibleLabel}\n >\n {label}\n </Text>\n {indicator}\n </div>\n {action && (\n <button\n {...extensionTriggerAttributes}\n type=\"button\"\n class=\"kui-list-header__action\"\n data-action={placeholder ? undefined : action}\n aria-label={actionLabel}\n title={actionDisabled ? disabledReason : actionLabel}\n disabled={actionDisabled || placeholder || undefined}\n data-kui-disabled={actionDisabled ? 'true' : undefined}\n >\n {renderedActionIcon}\n </button>\n )}\n </header>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/forms/color-picker/color-picker.tsx"],"names":[],"mappings":"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","file":"chunk-EKBMUXFV.js","sourcesContent":["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 formatHex,\n grayLevel,\n type Hsva,\n hsvToRgb,\n parseColor,\n rgbToHsl,\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/** The labels, accessible names, and maximum of each channel field per mode. */\nexport const COLOR_PICKER_CHANNELS: Record<\n ColorPickerMode,\n readonly { short: string; name: string; max: number }[]\n> = {\n rgb: [\n { short: 'R', name: 'Red', max: 255 },\n { short: 'G', name: 'Green', max: 255 },\n { short: 'B', name: 'Blue', max: 255 },\n ],\n hsl: [\n { short: 'H', name: 'Hue', max: 360 },\n { short: 'S', name: 'Saturation', max: 100 },\n { short: 'L', name: 'Lightness', max: 100 },\n ],\n hsb: [\n { short: 'H', name: 'Hue', max: 360 },\n { short: 'S', name: 'Saturation', max: 100 },\n { short: 'B', name: 'Brightness', max: 100 },\n ],\n gray: [{ short: 'W', name: 'Gray Level', max: 100 }],\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 const rgba = hsvToRgb(hsv);\n switch (mode) {\n case 'rgb':\n return [rgba.r, rgba.g, rgba.b].map(Math.round);\n case 'hsl': {\n const hsl = rgbToHsl(rgba);\n return [hsv.h, hsl.s * 100, hsl.l * 100].map(Math.round);\n }\n case 'hsb':\n return [hsv.h, hsv.s * 100, hsv.v * 100].map(Math.round);\n case 'gray':\n return [Math.round(grayLevel(rgba) * 100)];\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 hue slider,\n * an optional opacity slider on a checkerboard, a color-model menu (RGB, HSL,\n * HSB, Grayscale) with its 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 channelValues = colorPickerChannels(mode, hsv);\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 <input\n class=\"kui-color-picker__hue\"\n type=\"range\"\n min=\"0\"\n max=\"360\"\n step=\"1\"\n value={String(Math.round(hsv.h))}\n aria-label=\"Hue\"\n disabled={disabled}\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 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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/actions/popup-menu/internal/popup-menu-events.ts"],"names":[],"mappings":";AAKO,IAAM,qBAAA,GAAwB;AAC9B,IAAM,sBAAA,GAAyB;AAQ/B,IAAM,uBAAA,GAA0B","file":"chunk-HYORKKYP.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 */\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 (bottom-start) for this opening only. */\n point?: { x: number; y: number };\n}\n\nexport interface PopupMenuSelectDetail {\n item: HTMLElement;\n value: string | undefined;\n checked: boolean | undefined;\n}\n"]}
|