@vielzeug/refine 1.5.4 → 1.8.0
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/dist/accordion.cjs +1 -1
- package/dist/accordion.cjs.map +1 -1
- package/dist/accordion.js +30 -28
- package/dist/accordion.js.map +1 -1
- package/dist/async.cjs +11 -11
- package/dist/async.cjs.map +1 -1
- package/dist/async.js +1 -2
- package/dist/async.js.map +1 -1
- package/dist/button-group.cjs.map +1 -1
- package/dist/button-group.js.map +1 -1
- package/dist/button.cjs +1 -1
- package/dist/button.cjs.map +1 -1
- package/dist/button.js +1 -0
- package/dist/button.js.map +1 -1
- package/dist/calendar.cjs +26 -26
- package/dist/calendar.cjs.map +1 -1
- package/dist/calendar.js +4 -5
- package/dist/calendar.js.map +1 -1
- package/dist/checkbox-group.cjs +9 -9
- package/dist/checkbox-group.cjs.map +1 -1
- package/dist/checkbox-group.js +50 -58
- package/dist/checkbox-group.js.map +1 -1
- package/dist/code-window.cjs +4 -4
- package/dist/code-window.cjs.map +1 -1
- package/dist/code-window.js +1 -2
- package/dist/code-window.js.map +1 -1
- package/dist/combobox.cjs +29 -28
- package/dist/combobox.cjs.map +1 -1
- package/dist/combobox.js +201 -195
- package/dist/combobox.js.map +1 -1
- package/dist/command-palette.cjs +6 -6
- package/dist/command-palette.cjs.map +1 -1
- package/dist/command-palette.js +46 -47
- package/dist/command-palette.js.map +1 -1
- package/dist/content/card/card.css.cjs +1 -1
- package/dist/content/card/card.css.cjs.map +1 -1
- package/dist/content/card/card.css.js +1 -1
- package/dist/content/card/card.css.js.map +1 -1
- package/dist/content/chat-message/chat-message.css.cjs +1 -1
- package/dist/content/chat-message/chat-message.css.cjs.map +1 -1
- package/dist/content/chat-message/chat-message.css.js +1 -1
- package/dist/content/chat-message/chat-message.css.js.map +1 -1
- package/dist/content/code-window/code-window.d.ts.map +1 -1
- package/dist/content/icon/icon.d.ts.map +1 -1
- package/dist/content/index.d.ts +4 -0
- package/dist/content/index.d.ts.map +1 -1
- package/dist/content/list/_list-item-reveal.cjs +2 -0
- package/dist/content/list/_list-item-reveal.cjs.map +1 -0
- package/dist/content/list/_list-item-reveal.d.ts +25 -0
- package/dist/content/list/_list-item-reveal.d.ts.map +1 -0
- package/dist/content/list/_list-item-reveal.js +33 -0
- package/dist/content/list/_list-item-reveal.js.map +1 -0
- package/dist/content/list/list-item.css.cjs +2 -0
- package/dist/content/list/list-item.css.cjs.map +1 -0
- package/dist/content/list/list-item.css.js +6 -0
- package/dist/content/list/list-item.css.js.map +1 -0
- package/dist/content/list/list-item.d.ts +111 -0
- package/dist/content/list/list-item.d.ts.map +1 -0
- package/dist/content/list/list.css.cjs +2 -0
- package/dist/content/list/list.css.cjs.map +1 -0
- package/dist/content/list/list.css.js +6 -0
- package/dist/content/list/list.css.js.map +1 -0
- package/dist/content/list/list.d.ts +93 -0
- package/dist/content/list/list.d.ts.map +1 -0
- package/dist/custom-elements.json +5693 -5090
- package/dist/datagrid.cjs +2 -2
- package/dist/datagrid.js +206 -206
- package/dist/datagrid.js.map +1 -1
- package/dist/date-picker.cjs +2 -1
- package/dist/date-picker.cjs.map +1 -1
- package/dist/date-picker.js +2 -0
- package/dist/date-picker.js.map +1 -1
- package/dist/disclosure/tab-item/tab-item.d.ts.map +1 -1
- package/dist/disclosure/tabs/tabs.d.ts.map +1 -1
- package/dist/drawer.cjs +1 -1
- package/dist/drawer.cjs.map +1 -1
- package/dist/drawer.js +47 -48
- package/dist/drawer.js.map +1 -1
- package/dist/feedback/async/async.d.ts.map +1 -1
- package/dist/feedback/progress/progress.d.ts.map +1 -1
- package/dist/file-input.cjs +108 -42
- package/dist/file-input.cjs.map +1 -1
- package/dist/file-input.js +215 -156
- package/dist/file-input.js.map +1 -1
- package/dist/headless/aria-reflection.cjs +2 -0
- package/dist/headless/aria-reflection.cjs.map +1 -0
- package/dist/headless/aria-reflection.d.ts +27 -0
- package/dist/headless/aria-reflection.d.ts.map +1 -0
- package/dist/headless/aria-reflection.js +18 -0
- package/dist/headless/aria-reflection.js.map +1 -0
- package/dist/headless/checkable.cjs +1 -1
- package/dist/headless/checkable.cjs.map +1 -1
- package/dist/headless/checkable.d.ts +2 -10
- package/dist/headless/checkable.d.ts.map +1 -1
- package/dist/headless/checkable.js +29 -29
- package/dist/headless/checkable.js.map +1 -1
- package/dist/headless/choice-field.cjs +1 -1
- package/dist/headless/choice-field.cjs.map +1 -1
- package/dist/headless/choice-field.d.ts +2 -7
- package/dist/headless/choice-field.d.ts.map +1 -1
- package/dist/headless/choice-field.js +37 -37
- package/dist/headless/choice-field.js.map +1 -1
- package/dist/headless/field-base.cjs +1 -1
- package/dist/headless/field-base.cjs.map +1 -1
- package/dist/headless/field-base.d.ts +17 -0
- package/dist/headless/field-base.d.ts.map +1 -1
- package/dist/headless/field-base.js +21 -6
- package/dist/headless/field-base.js.map +1 -1
- package/dist/headless/focus.cjs +1 -1
- package/dist/headless/focus.cjs.map +1 -1
- package/dist/headless/focus.d.ts +7 -0
- package/dist/headless/focus.d.ts.map +1 -1
- package/dist/headless/focus.js +6 -6
- package/dist/headless/focus.js.map +1 -1
- package/dist/headless/index.d.ts +4 -2
- package/dist/headless/index.d.ts.map +1 -1
- package/dist/headless/nav.cjs +1 -1
- package/dist/headless/nav.cjs.map +1 -1
- package/dist/headless/nav.d.ts +12 -0
- package/dist/headless/nav.d.ts.map +1 -1
- package/dist/headless/nav.js +68 -50
- package/dist/headless/nav.js.map +1 -1
- package/dist/headless/overlay.cjs +1 -1
- package/dist/headless/overlay.cjs.map +1 -1
- package/dist/headless/overlay.d.ts +2 -0
- package/dist/headless/overlay.d.ts.map +1 -1
- package/dist/headless/overlay.js +8 -5
- package/dist/headless/overlay.js.map +1 -1
- package/dist/headless/ref-callback.cjs +2 -0
- package/dist/headless/ref-callback.cjs.map +1 -0
- package/dist/headless/ref-callback.d.ts +26 -0
- package/dist/headless/ref-callback.d.ts.map +1 -0
- package/dist/headless/ref-callback.js +13 -0
- package/dist/headless/ref-callback.js.map +1 -0
- package/dist/headless/swipe.cjs +1 -1
- package/dist/headless/swipe.cjs.map +1 -1
- package/dist/headless/swipe.d.ts +2 -0
- package/dist/headless/swipe.d.ts.map +1 -1
- package/dist/headless/swipe.js +26 -21
- package/dist/headless/swipe.js.map +1 -1
- package/dist/headless.cjs +1 -1
- package/dist/headless.js +28 -26
- package/dist/icon.cjs +1 -1
- package/dist/icon.cjs.map +1 -1
- package/dist/icon.js +35 -38
- package/dist/icon.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +63 -61
- package/dist/input.cjs +29 -26
- package/dist/input.cjs.map +1 -1
- package/dist/input.js +91 -79
- package/dist/input.js.map +1 -1
- package/dist/inputs/button/button.css.cjs +1 -1
- package/dist/inputs/button/button.css.cjs.map +1 -1
- package/dist/inputs/button/button.css.js +1 -1
- package/dist/inputs/button/button.css.js.map +1 -1
- package/dist/inputs/button/button.d.ts +8 -0
- package/dist/inputs/button/button.d.ts.map +1 -1
- package/dist/inputs/calendar/calendar.d.ts.map +1 -1
- package/dist/inputs/checkbox/checkbox.css.cjs +1 -1
- package/dist/inputs/checkbox/checkbox.css.cjs.map +1 -1
- package/dist/inputs/checkbox/checkbox.css.js +1 -1
- package/dist/inputs/checkbox/checkbox.css.js.map +1 -1
- package/dist/inputs/combobox/combobox.d.ts +1 -0
- package/dist/inputs/combobox/combobox.d.ts.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs +1 -1
- package/dist/inputs/date-picker/date-picker.css.cjs.map +1 -1
- package/dist/inputs/date-picker/date-picker.css.js +1 -1
- package/dist/inputs/date-picker/date-picker.css.js.map +1 -1
- package/dist/inputs/date-picker/date-picker.d.ts +6 -0
- package/dist/inputs/date-picker/date-picker.d.ts.map +1 -1
- package/dist/inputs/file-input/file-input-upload.cjs +2 -0
- package/dist/inputs/file-input/file-input-upload.cjs.map +1 -0
- package/dist/inputs/file-input/file-input-upload.d.ts +76 -0
- package/dist/inputs/file-input/file-input-upload.d.ts.map +1 -0
- package/dist/inputs/file-input/file-input-upload.js +145 -0
- package/dist/inputs/file-input/file-input-upload.js.map +1 -0
- package/dist/inputs/file-input/file-input.css.cjs +1 -1
- package/dist/inputs/file-input/file-input.css.cjs.map +1 -1
- package/dist/inputs/file-input/file-input.css.js +1 -1
- package/dist/inputs/file-input/file-input.css.js.map +1 -1
- package/dist/inputs/file-input/file-input.d.ts +54 -1
- package/dist/inputs/file-input/file-input.d.ts.map +1 -1
- package/dist/inputs/input/input.css.cjs +1 -1
- package/dist/inputs/input/input.css.cjs.map +1 -1
- package/dist/inputs/input/input.css.js +1 -1
- package/dist/inputs/input/input.css.js.map +1 -1
- package/dist/inputs/input/input.d.ts +13 -0
- package/dist/inputs/input/input.d.ts.map +1 -1
- package/dist/inputs/message-composer/message-composer.css.cjs +1 -1
- package/dist/inputs/message-composer/message-composer.css.cjs.map +1 -1
- package/dist/inputs/message-composer/message-composer.css.js +1 -1
- package/dist/inputs/message-composer/message-composer.css.js.map +1 -1
- package/dist/inputs/message-composer/message-composer.d.ts +7 -0
- package/dist/inputs/message-composer/message-composer.d.ts.map +1 -1
- package/dist/inputs/number-input/number-input.css.cjs +1 -1
- package/dist/inputs/number-input/number-input.css.cjs.map +1 -1
- package/dist/inputs/number-input/number-input.css.js +1 -1
- package/dist/inputs/number-input/number-input.css.js.map +1 -1
- package/dist/inputs/number-input/number-input.d.ts +15 -0
- package/dist/inputs/number-input/number-input.d.ts.map +1 -1
- package/dist/inputs/otp-input/otp-input.css.cjs +1 -1
- package/dist/inputs/otp-input/otp-input.css.cjs.map +1 -1
- package/dist/inputs/otp-input/otp-input.css.js +1 -1
- package/dist/inputs/otp-input/otp-input.css.js.map +1 -1
- package/dist/inputs/radio/radio.d.ts.map +1 -1
- package/dist/inputs/select/select.d.ts +1 -0
- package/dist/inputs/select/select.d.ts.map +1 -1
- package/dist/inputs/shared/index.d.ts +1 -1
- package/dist/inputs/shared/index.d.ts.map +1 -1
- package/dist/inputs/shared/templates.cjs +26 -3
- package/dist/inputs/shared/templates.cjs.map +1 -1
- package/dist/inputs/shared/templates.d.ts +20 -0
- package/dist/inputs/shared/templates.d.ts.map +1 -1
- package/dist/inputs/shared/templates.js +29 -5
- package/dist/inputs/shared/templates.js.map +1 -1
- package/dist/inputs/switch/switch.css.cjs +1 -1
- package/dist/inputs/switch/switch.css.cjs.map +1 -1
- package/dist/inputs/switch/switch.css.js +1 -1
- package/dist/inputs/switch/switch.css.js.map +1 -1
- package/dist/inputs/switch/switch.d.ts.map +1 -1
- package/dist/inputs/textarea/textarea.css.cjs +1 -1
- package/dist/inputs/textarea/textarea.css.cjs.map +1 -1
- package/dist/inputs/textarea/textarea.css.js +1 -1
- package/dist/inputs/textarea/textarea.css.js.map +1 -1
- package/dist/inputs/textarea/textarea.d.ts +14 -0
- package/dist/inputs/textarea/textarea.d.ts.map +1 -1
- package/dist/inputs/time-picker/time-picker.css.cjs +1 -1
- package/dist/inputs/time-picker/time-picker.css.cjs.map +1 -1
- package/dist/inputs/time-picker/time-picker.css.js +1 -1
- package/dist/inputs/time-picker/time-picker.css.js.map +1 -1
- package/dist/inputs/time-picker/time-picker.d.ts +6 -0
- package/dist/inputs/time-picker/time-picker.d.ts.map +1 -1
- package/dist/list-item.cjs +22 -0
- package/dist/list-item.cjs.map +1 -0
- package/dist/list-item.js +91 -0
- package/dist/list-item.js.map +1 -0
- package/dist/list.cjs +2 -0
- package/dist/list.cjs.map +1 -0
- package/dist/list.js +64 -0
- package/dist/list.js.map +1 -0
- package/dist/menu.cjs +4 -4
- package/dist/menu.cjs.map +1 -1
- package/dist/menu.js +60 -59
- package/dist/menu.js.map +1 -1
- package/dist/message-composer.cjs +14 -20
- package/dist/message-composer.cjs.map +1 -1
- package/dist/message-composer.js +63 -64
- package/dist/message-composer.js.map +1 -1
- package/dist/number-input.cjs +5 -3
- package/dist/number-input.cjs.map +1 -1
- package/dist/number-input.js +8 -4
- package/dist/number-input.js.map +1 -1
- package/dist/otp-input.cjs +9 -9
- package/dist/otp-input.cjs.map +1 -1
- package/dist/otp-input.js +70 -62
- package/dist/otp-input.js.map +1 -1
- package/dist/overlay/menu/menu-item.css.cjs +1 -1
- package/dist/overlay/menu/menu-item.css.cjs.map +1 -1
- package/dist/overlay/menu/menu-item.css.js +1 -1
- package/dist/overlay/menu/menu-item.css.js.map +1 -1
- package/dist/overlay/menu/menu-separator.css.cjs +1 -1
- package/dist/overlay/menu/menu-separator.css.cjs.map +1 -1
- package/dist/overlay/menu/menu-separator.css.js +1 -1
- package/dist/overlay/menu/menu-separator.css.js.map +1 -1
- package/dist/overlay/menu/menu.css.cjs +1 -1
- package/dist/overlay/menu/menu.css.cjs.map +1 -1
- package/dist/overlay/menu/menu.css.js +1 -1
- package/dist/overlay/menu/menu.css.js.map +1 -1
- package/dist/overlay/shared/use-dialog.cjs +1 -1
- package/dist/overlay/shared/use-dialog.cjs.map +1 -1
- package/dist/overlay/shared/use-dialog.d.ts.map +1 -1
- package/dist/overlay/shared/use-dialog.js +7 -6
- package/dist/overlay/shared/use-dialog.js.map +1 -1
- package/dist/progress.cjs +13 -13
- package/dist/progress.cjs.map +1 -1
- package/dist/progress.js +3 -4
- package/dist/progress.js.map +1 -1
- package/dist/radio-group.cjs +11 -11
- package/dist/radio-group.cjs.map +1 -1
- package/dist/radio-group.js +63 -70
- package/dist/radio-group.js.map +1 -1
- package/dist/radio.cjs +4 -4
- package/dist/radio.cjs.map +1 -1
- package/dist/radio.js +58 -58
- package/dist/radio.js.map +1 -1
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.js.map +1 -1
- package/dist/refine.cjs +502 -309
- package/dist/refine.cjs.map +1 -1
- package/dist/refine.iife.js +562 -369
- package/dist/refine.iife.js.map +1 -1
- package/dist/refine.js +558 -365
- package/dist/refine.js.map +1 -1
- package/dist/select.cjs +21 -21
- package/dist/select.cjs.map +1 -1
- package/dist/select.js +135 -127
- package/dist/select.js.map +1 -1
- package/dist/shared/size-presets.cjs +1 -1
- package/dist/shared/size-presets.cjs.map +1 -1
- package/dist/shared/size-presets.d.ts +74 -0
- package/dist/shared/size-presets.d.ts.map +1 -1
- package/dist/shared/size-presets.js +48 -1
- package/dist/shared/size-presets.js.map +1 -1
- package/dist/shared/types.d.ts +5 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/styles/index.cjs +1 -1
- package/dist/styles/index.cjs.map +1 -1
- package/dist/styles/index.d.ts +1 -0
- package/dist/styles/index.d.ts.map +1 -1
- package/dist/styles/index.js +5 -4
- package/dist/styles/index.js.map +1 -1
- package/dist/styles/mixins/field-variants.css.cjs +85 -0
- package/dist/styles/mixins/field-variants.css.cjs.map +1 -0
- package/dist/styles/mixins/field-variants.css.d.ts +66 -0
- package/dist/styles/mixins/field-variants.css.d.ts.map +1 -0
- package/dist/styles/mixins/field-variants.css.js +90 -0
- package/dist/styles/mixins/field-variants.css.js.map +1 -0
- package/dist/switch.cjs +3 -3
- package/dist/switch.cjs.map +1 -1
- package/dist/switch.js +38 -36
- package/dist/switch.js.map +1 -1
- package/dist/tab-item.cjs +8 -8
- package/dist/tab-item.cjs.map +1 -1
- package/dist/tab-item.js +38 -28
- package/dist/tab-item.js.map +1 -1
- package/dist/tab-panel.cjs +7 -7
- package/dist/tab-panel.cjs.map +1 -1
- package/dist/tab-panel.js +33 -26
- package/dist/tab-panel.js.map +1 -1
- package/dist/tabs.cjs +4 -4
- package/dist/tabs.cjs.map +1 -1
- package/dist/tabs.js +64 -60
- package/dist/tabs.js.map +1 -1
- package/dist/testing/index.d.ts +15 -60
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing.cjs +1 -1
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.js +7 -24
- package/dist/testing.js.map +1 -1
- package/dist/textarea.cjs +15 -18
- package/dist/textarea.cjs.map +1 -1
- package/dist/textarea.js +83 -74
- package/dist/textarea.js.map +1 -1
- package/dist/time-picker.cjs +34 -31
- package/dist/time-picker.cjs.map +1 -1
- package/dist/time-picker.js +121 -109
- package/dist/time-picker.js.map +1 -1
- package/package.json +22 -9
- package/dist/headless/dialog-focus.cjs +0 -2
- package/dist/headless/dialog-focus.cjs.map +0 -1
- package/dist/headless/dialog-focus.d.ts +0 -40
- package/dist/headless/dialog-focus.d.ts.map +0 -1
- package/dist/headless/dialog-focus.js +0 -22
- package/dist/headless/dialog-focus.js.map +0 -1
- package/dist/headless/focus-trap.cjs +0 -2
- package/dist/headless/focus-trap.cjs.map +0 -1
- package/dist/headless/focus-trap.d.ts +0 -45
- package/dist/headless/focus-trap.d.ts.map +0 -1
- package/dist/headless/focus-trap.js +0 -51
- package/dist/headless/focus-trap.js.map +0 -1
- package/dist/keymap/dist/_dev.cjs +0 -2
- package/dist/keymap/dist/_dev.cjs.map +0 -1
- package/dist/keymap/dist/_dev.js +0 -4
- package/dist/keymap/dist/_dev.js.map +0 -1
- package/dist/keymap/dist/format.cjs +0 -1
- package/dist/keymap/dist/format.js +0 -1
- package/dist/keymap/dist/index.cjs +0 -1
- package/dist/keymap/dist/index.js +0 -4
- package/dist/keymap/dist/keymap.cjs +0 -2
- package/dist/keymap/dist/keymap.cjs.map +0 -1
- package/dist/keymap/dist/keymap.js +0 -221
- package/dist/keymap/dist/keymap.js.map +0 -1
- package/dist/keymap/dist/layer.cjs +0 -1
- package/dist/keymap/dist/layer.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-palette.js","names":[],"sources":["../src/overlay/command-palette/command-palette.ts"],"sourcesContent":["import { createKeymap } from '@vielzeug/keymap';\nimport { define, html, ref, prop, getHost, onCleanup, onEvent, onMounted, useEmit } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { CommandPaletteItem, OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\nimport { warn } from '../../_dev';\nimport { announce, lifecycleSignal, createListControl } from '../../headless';\nimport { reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport { buildRows, filterItems, normalizeItem, parseSlottedItems, splitShortcutKeys } from './command-palette-items';\nimport '../../content/icon/icon';\nimport componentStyles from './command-palette.css?inline';\n\nexport type { OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\n/**\n * A pure data node describing one command. Never rendered directly — `ore-command-palette`\n * reads its attributes/text content and renders the visible row itself.\n *\n * @element ore-command-palette-item\n *\n * @attr {string} value - Value emitted by the `select` event and matched against the search query\n * @attr {string} label - Explicit label text; falls back to the element's text content\n * @attr {string} group - Group heading the item is clustered under\n * @attr {string} shortcut - Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable — spell it out, e.g. `\"Ctrl+Plus\"`)\n * @attr {boolean} disabled - Excludes the item from keyboard navigation and selection\n *\n * @slot icon - Optional leading icon content\n *\n * @example\n * ```html\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * ```\n */\nexport const COMMAND_PALETTE_ITEM_TAG = 'ore-command-palette-item' as const;\ndefine(COMMAND_PALETTE_ITEM_TAG, {\n setup() {\n return html``;\n },\n});\n\n/**\n * A searchable, keyboard-driven list of commands presented in a centered modal —\n * the \"⌘K\" pattern popularized by editors and productivity apps. Built on the\n * native `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\n * and `@vielzeug/keymap` for the global shortcut that opens it.\n *\n * @element ore-command-palette\n * @element ore-command-palette-item - Slotted command definition (place in default slot)\n *\n * @attr {boolean} open - Controls the open state of the palette\n * @attr {string} label - Accessible label for the dialog (screen-reader-only heading)\n * @attr {string} placeholder - Placeholder text for the search input\n * @attr {string} shortcut - Global keyboard shortcut (keymap syntax) that toggles the palette. Default `\"mod+k\"`; set to `\"\"` to disable\n * @attr {boolean} no-filter - Disable built-in client-side filtering (for server-driven search)\n * @attr {boolean} loading - Shows a loading row below the search input\n * @attr {string} empty-text - Message shown when no item matches the query\n * @attr {boolean} keep-open-on-select - Keep the palette open after an item is selected\n *\n * @fires open - Fired when the palette opens. detail: `{ reason }`\n * @fires close - Fired when the palette closes. detail: `{ reason }`\n * @fires search - Fired on every keystroke in the search input. detail: `{ query }`\n * @fires select - Fired when a command is chosen (click or `Enter`). detail: `{ value, label, item }`\n *\n * @slot - `<ore-command-palette-item>` elements (alternative/supplement to the `items` prop)\n *\n * @cssprop --command-palette-bg - Panel background color\n * @cssprop --command-palette-border-color - Panel border color\n * @cssprop --command-palette-radius - Panel border radius\n * @cssprop --command-palette-shadow - Panel drop shadow\n * @cssprop --command-palette-max-width - Maximum panel width\n * @cssprop --command-palette-backdrop - Backdrop overlay color\n * @cssprop --command-palette-option-hover-bg - Item background on hover\n * @cssprop --command-palette-option-focus-bg - Item background when keyboard-focused\n *\n * @part dialog - Dialog root container\n * @part panel - Panel container\n * @part input - Search input\n * @part listbox - Listbox of matching commands\n *\n * @example\n * ```html\n * <ore-command-palette label=\"Command palette\" placeholder=\"Type a command…\">\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * <ore-command-palette-item value=\"open-file\" group=\"File\" shortcut=\"⌘+O\">Open File…</ore-command-palette-item>\n * <ore-command-palette-item value=\"toggle-theme\" group=\"View\">Toggle Theme</ore-command-palette-item>\n * </ore-command-palette>\n * ```\n */\nexport const COMMAND_PALETTE_TAG = 'ore-command-palette' as const;\ndefine<OreCommandPaletteProps>(COMMAND_PALETTE_TAG, {\n props: {\n 'empty-text': prop.string('No results found.'),\n items: prop.data<OreCommandPaletteProps['items']>(),\n 'keep-open-on-select': prop.bool(false),\n label: prop.string('Command palette'),\n loading: prop.bool(false),\n 'no-filter': prop.bool(false),\n open: prop.bool(false),\n placeholder: prop.string('Type a command or search…'),\n shortcut: prop.string('mod+k'),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCommandPaletteEvents>();\n const abortSignal = lifecycleSignal(onCleanup);\n\n const dialogRef = ref<HTMLDialogElement>();\n const searchInputRef = ref<HTMLInputElement>();\n const listboxId = 'cmdk-listbox';\n\n let listboxEl: HTMLElement | null = null;\n\n const query = signal('');\n\n // ── Items: slotted <ore-command-palette-item> elements, merged with the `items` prop ──\n // Items are pure data nodes (see `ore-command-palette-item`'s own doc comment) — they're\n // never projected through a `<slot>`, just read directly off the host's light DOM. That\n // sidesteps `useSlots()`/`slotchange` entirely: a plain MutationObserver on the host\n // already covers everything `slotchange` would (an item added or removed) *and* the case\n // it can't — an already-assigned item's own text/attributes changing. For items written\n // as static, inline HTML, the browser's parser can insert the last item before appending\n // its text-node child; without watching `characterData`, that would permanently cache an\n // empty label, since nothing else re-triggers once the element itself stops changing.\n const slottedItems = signal<CommandPaletteItem[]>([]);\n\n const reparseSlottedItems = (): void => {\n slottedItems.value = parseSlottedItems([...el.children]);\n };\n\n reparseSlottedItems();\n\n const lightDomObserver = new MutationObserver(reparseSlottedItems);\n\n lightDomObserver.observe(el, { characterData: true, childList: true, subtree: true });\n onCleanup(() => lightDomObserver.disconnect());\n\n const allItems = computed<CommandPaletteItem[]>(() => {\n const explicit = props.items.value;\n\n return Array.isArray(explicit) ? explicit.map(normalizeItem) : slottedItems.value;\n });\n\n const filteredItems = computed(() => filterItems(allItems.value, query.value, Boolean(props['no-filter'].value)));\n const rows = computed(() => buildRows(filteredItems.value));\n\n // ── Keyboard navigation over the filtered list (Up/Down/Home/End) ──\n const scrollFocusedIntoView = (): void => {\n listboxEl?.querySelector<HTMLElement>('[data-focused]')?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<CommandPaletteItem>({\n getItems: () => filteredItems.value,\n isItemDisabled: (item) => item.disabled,\n onNavigate: scrollFocusedIntoView,\n signal: abortSignal,\n });\n const { focusedIndex } = list;\n\n // ── Dialog chrome: native <dialog>, focus trap, Escape, backdrop click ──\n const resetSearch = (): void => {\n query.value = '';\n list.reset();\n };\n\n const { closeWithAnimation, overlay, requestClose, setupNativeListeners } = useDialogControl({\n dialogRef,\n getPanelEl: () => dialogRef.value?.querySelector<HTMLElement>('.panel'),\n host: el,\n initialFocus: computed(() => '.search-input'),\n isPersistent: () => false,\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n emit('close', { reason });\n resetSearch();\n },\n onOpen: (reason) => {\n emit('open', { reason });\n list.navigate('first');\n },\n openProp: props.open,\n performClose: () => closeWithAnimation(),\n returnFocus: computed(() => true),\n });\n\n // ── Global keyboard shortcut (opens/closes the palette from anywhere) ──\n const globalKeymap = createKeymap();\n\n globalKeymap.mount(window);\n onCleanup(() => globalKeymap.dispose());\n\n let unbindShortcut: (() => void) | null = null;\n\n watch(\n props.shortcut,\n (shortcutStr) => {\n unbindShortcut?.();\n unbindShortcut = null;\n\n const trimmed = (shortcutStr ?? '').trim();\n\n if (!trimmed) return;\n\n try {\n unbindShortcut = globalKeymap.bind(trimmed, () => {\n overlay.toggle('keyboard', 'trigger');\n });\n } catch (error) {\n warn(`invalid \"shortcut\" value \"${trimmed}\" — ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n { immediate: true },\n );\n\n onMounted(() => {\n setupNativeListeners();\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectItem(item: CommandPaletteItem): void {\n if (item.disabled) return;\n\n emit('select', { item, label: item.label, value: item.value });\n\n if (props['keep-open-on-select'].value) {\n searchInputRef.value?.focus();\n } else {\n requestClose('trigger');\n }\n }\n\n function handleInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n\n query.value = value;\n list.navigate('first');\n emit('search', { query: value });\n\n const count = filteredItems.value.length;\n\n announce(count === 0 ? props['empty-text'].value! : `${count} result${count === 1 ? '' : 's'} found`);\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (list.handleKeydown(e)) return;\n\n if (e.key === 'Enter') {\n // `list.navigate('first')` (called on open and on every keystroke) already keeps\n // the focused row off a disabled item, so this fallback is only ever reached when\n // nothing has been focused yet — but it mirrors `selectItem`'s own disabled guard\n // rather than blindly grabbing index 0, in case that navigate-on-open wiring ever\n // changes.\n const active = list.getActiveItem() ?? filteredItems.value.find((item) => !item.disabled);\n\n if (active) {\n e.preventDefault();\n selectItem(active);\n }\n }\n }\n\n return html`\n <dialog ref=\"${dialogRef}\" class=\"dialog\" part=\"dialog\" aria-label=\"${props.label}\" aria-modal=\"true\">\n <div class=\"panel\" part=\"panel\">\n <div class=\"search\" part=\"search\">\n <span class=\"search-icon\" aria-hidden=\"true\"><ore-icon name=\"search\" size=\"18\"></ore-icon></span>\n <input\n ref=\"${searchInputRef}\"\n class=\"search-input\"\n part=\"input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${() => (focusedIndex.value >= 0 ? `${listboxId}-opt-${focusedIndex.value}` : '')}\"\n placeholder=\"${props.placeholder}\"\n value=\"${query}\"\n @input=\"${handleInput}\"\n @keydown=\"${handleKeydown}\" />\n <span class=\"search-loader\" ?hidden=\"${() => !props.loading.value}\" aria-hidden=\"true\"></span>\n </div>\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Commands\"\n ref=\"${(listEl: HTMLElement) => {\n listboxEl = listEl;\n }}\">\n <div class=\"empty\" role=\"presentation\" ?hidden=\"${() => props.loading.value || rows.value.length > 0}\">\n ${() => props['empty-text'].value}\n </div>\n ${() =>\n rows.value.map((row) =>\n row.type === 'group'\n ? html`<div class=\"group-heading\" role=\"presentation\">${row.group}</div>`\n : html`<div\n class=\"item\"\n part=\"item\"\n role=\"option\"\n id=\"${`${listboxId}-opt-${row.idx}`}\"\n aria-selected=\"${() => String(focusedIndex.value === row.idx)}\"\n aria-disabled=\"${() => String(row.item.disabled)}\"\n ?data-focused=\"${() => focusedIndex.value === row.idx}\"\n ?data-disabled=\"${() => row.item.disabled}\"\n @click=\"${(e: MouseEvent) => {\n e.stopPropagation();\n selectItem(row.item);\n }}\"\n @pointerenter=\"${() => {\n list.set(row.idx);\n }}\">\n ${\n row.item.icon\n ? html`<span class=\"item-icon\" aria-hidden=\"true\"\n ><ore-icon name=\"${row.item.icon}\" size=\"16\"></ore-icon\n ></span>`\n : ''\n }\n <span class=\"item-label\">${row.item.label}</span>\n ${\n row.item.shortcut\n ? html`<span class=\"item-shortcut\"\n >${splitShortcutKeys(row.item.shortcut).map((key) => html`<kbd>${key}</kbd>`)}</span\n >`\n : ''\n }\n </div>`,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <span class=\"footer-hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"footer-hint\"><kbd>Enter</kbd> Select</span>\n <span class=\"footer-hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command-palette.js","names":[],"sources":["../src/overlay/command-palette/command-palette.ts"],"sourcesContent":["import { createKeymap } from '@vielzeug/keymap';\nimport { define, html, ref, prop, getHost, onCleanup, onEvent, onMounted, useEmit } from '@vielzeug/ore';\nimport { computed, signal, watch } from '@vielzeug/ripple';\n\nimport type { CommandPaletteItem, OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\nimport { warn } from '../../_dev';\nimport { announce, lifecycleSignal, createListControl } from '../../headless';\nimport { reducedMotionMixin } from '../../styles';\nimport { useDialogControl } from '../shared/use-dialog';\nimport { buildRows, filterItems, normalizeItem, parseSlottedItems, splitShortcutKeys } from './command-palette-items';\nimport '../../content/icon/icon';\nimport componentStyles from './command-palette.css?inline';\n\nexport type { OreCommandPaletteEvents, OreCommandPaletteProps } from './command-palette.types';\n\n/**\n * A pure data node describing one command. Never rendered directly — `ore-command-palette`\n * reads its attributes/text content and renders the visible row itself.\n *\n * @element ore-command-palette-item\n *\n * @attr {string} value - Value emitted by the `select` event and matched against the search query\n * @attr {string} label - Explicit label text; falls back to the element's text content\n * @attr {string} group - Group heading the item is clustered under\n * @attr {string} shortcut - Display-only keyboard hint rendered at the end of the row, one `<kbd>` per `+`-separated key (e.g. `\"⌘+S\"` renders two keycaps; a literal `+` key isn't representable — spell it out, e.g. `\"Ctrl+Plus\"`)\n * @attr {boolean} disabled - Excludes the item from keyboard navigation and selection\n *\n * @slot icon - Optional leading icon content\n *\n * @example\n * ```html\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * ```\n */\nexport const COMMAND_PALETTE_ITEM_TAG = 'ore-command-palette-item' as const;\ndefine(COMMAND_PALETTE_ITEM_TAG, {\n setup() {\n return html``;\n },\n});\n\n/**\n * A searchable, keyboard-driven list of commands presented in a centered modal —\n * the \"⌘K\" pattern popularized by editors and productivity apps. Built on the\n * native `<dialog>` element (focus trap, top-layer stacking, `Escape`-to-close)\n * and `@vielzeug/keymap` for the global shortcut that opens it.\n *\n * @element ore-command-palette\n * @element ore-command-palette-item - Slotted command definition (place in default slot)\n *\n * @attr {boolean} open - Controls the open state of the palette\n * @attr {string} label - Accessible label for the dialog (screen-reader-only heading)\n * @attr {string} placeholder - Placeholder text for the search input\n * @attr {string} shortcut - Global keyboard shortcut (keymap syntax) that toggles the palette. Default `\"mod+k\"`; set to `\"\"` to disable\n * @attr {boolean} no-filter - Disable built-in client-side filtering (for server-driven search)\n * @attr {boolean} loading - Shows a loading row below the search input\n * @attr {string} empty-text - Message shown when no item matches the query\n * @attr {boolean} keep-open-on-select - Keep the palette open after an item is selected\n *\n * @fires open - Fired when the palette opens. detail: `{ reason }`\n * @fires close - Fired when the palette closes. detail: `{ reason }`\n * @fires search - Fired on every keystroke in the search input. detail: `{ query }`\n * @fires select - Fired when a command is chosen (click or `Enter`). detail: `{ value, label, item }`\n *\n * @slot - `<ore-command-palette-item>` elements (alternative/supplement to the `items` prop)\n *\n * @cssprop --command-palette-bg - Panel background color\n * @cssprop --command-palette-border-color - Panel border color\n * @cssprop --command-palette-radius - Panel border radius\n * @cssprop --command-palette-shadow - Panel drop shadow\n * @cssprop --command-palette-max-width - Maximum panel width\n * @cssprop --command-palette-backdrop - Backdrop overlay color\n * @cssprop --command-palette-option-hover-bg - Item background on hover\n * @cssprop --command-palette-option-focus-bg - Item background when keyboard-focused\n *\n * @part dialog - Dialog root container\n * @part panel - Panel container\n * @part input - Search input\n * @part listbox - Listbox of matching commands\n *\n * @example\n * ```html\n * <ore-command-palette label=\"Command palette\" placeholder=\"Type a command…\">\n * <ore-command-palette-item value=\"new-file\" group=\"File\" shortcut=\"⌘+N\">New File</ore-command-palette-item>\n * <ore-command-palette-item value=\"open-file\" group=\"File\" shortcut=\"⌘+O\">Open File…</ore-command-palette-item>\n * <ore-command-palette-item value=\"toggle-theme\" group=\"View\">Toggle Theme</ore-command-palette-item>\n * </ore-command-palette>\n * ```\n */\nexport const COMMAND_PALETTE_TAG = 'ore-command-palette' as const;\ndefine<OreCommandPaletteProps>(COMMAND_PALETTE_TAG, {\n props: {\n 'empty-text': prop.string('No results found.'),\n items: prop.data<OreCommandPaletteProps['items']>(),\n 'keep-open-on-select': prop.bool(false),\n label: prop.string('Command palette'),\n loading: prop.bool(false),\n 'no-filter': prop.bool(false),\n open: prop.bool(false),\n placeholder: prop.string('Type a command or search…'),\n shortcut: prop.string('mod+k'),\n },\n setup(props) {\n const el = getHost();\n const emit = useEmit<OreCommandPaletteEvents>();\n const abortSignal = lifecycleSignal(onCleanup);\n\n const dialogRef = ref<HTMLDialogElement>();\n const searchInputRef = ref<HTMLInputElement>();\n const listboxId = 'cmdk-listbox';\n\n let listboxEl: HTMLElement | null = null;\n\n const query = signal('');\n\n // ── Items: slotted <ore-command-palette-item> elements, merged with the `items` prop ──\n // Items are pure data nodes (see `ore-command-palette-item`'s own doc comment) — they're\n // never projected through a `<slot>`, just read directly off the host's light DOM. That\n // sidesteps `useSlots()`/`slotchange` entirely: a plain MutationObserver on the host\n // already covers everything `slotchange` would (an item added or removed) *and* the case\n // it can't — an already-assigned item's own text/attributes changing. For items written\n // as static, inline HTML, the browser's parser can insert the last item before appending\n // its text-node child; without watching `characterData`, that would permanently cache an\n // empty label, since nothing else re-triggers once the element itself stops changing.\n const slottedItems = signal<CommandPaletteItem[]>([]);\n\n const reparseSlottedItems = (): void => {\n slottedItems.value = parseSlottedItems([...el.children]);\n };\n\n reparseSlottedItems();\n\n const lightDomObserver = new MutationObserver(reparseSlottedItems);\n\n lightDomObserver.observe(el, { characterData: true, childList: true, subtree: true });\n onCleanup(() => lightDomObserver.disconnect());\n\n const allItems = computed<CommandPaletteItem[]>(() => {\n const explicit = props.items.value;\n\n return Array.isArray(explicit) ? explicit.map(normalizeItem) : slottedItems.value;\n });\n\n const filteredItems = computed(() => filterItems(allItems.value, query.value, Boolean(props['no-filter'].value)));\n const rows = computed(() => buildRows(filteredItems.value));\n\n // ── Keyboard navigation over the filtered list (Up/Down/Home/End) ──\n const scrollFocusedIntoView = (): void => {\n listboxEl?.querySelector<HTMLElement>('[data-focused]')?.scrollIntoView({ block: 'nearest' });\n };\n\n const list = createListControl<CommandPaletteItem>({\n getItems: () => filteredItems.value,\n isItemDisabled: (item) => item.disabled,\n onNavigate: scrollFocusedIntoView,\n signal: abortSignal,\n });\n const { focusedIndex } = list;\n\n // ── Dialog chrome: native <dialog>, focus trap, Escape, backdrop click ──\n const resetSearch = (): void => {\n query.value = '';\n list.reset();\n };\n\n const { closeWithAnimation, overlay, requestClose, setupNativeListeners } = useDialogControl({\n dialogRef,\n getPanelEl: () => dialogRef.value?.querySelector<HTMLElement>('.panel'),\n host: el,\n initialFocus: computed(() => '.search-input'),\n isPersistent: () => false,\n onCleanup,\n onEvent,\n onNativeClose: (reason) => {\n emit('close', { reason });\n resetSearch();\n },\n onOpen: (reason) => {\n emit('open', { reason });\n list.navigate('first');\n },\n openProp: props.open,\n performClose: () => closeWithAnimation(),\n returnFocus: computed(() => true),\n });\n\n // ── Global keyboard shortcut (opens/closes the palette from anywhere) ──\n const globalKeymap = createKeymap();\n\n globalKeymap.mount(window);\n onCleanup(() => globalKeymap.dispose());\n\n let unbindShortcut: (() => void) | null = null;\n\n watch(\n props.shortcut,\n (shortcutStr) => {\n unbindShortcut?.();\n unbindShortcut = null;\n\n const trimmed = (shortcutStr ?? '').trim();\n\n if (!trimmed) return;\n\n try {\n unbindShortcut = globalKeymap.bind(trimmed, () => {\n overlay.toggle('keyboard', 'trigger');\n });\n } catch (error) {\n warn(`invalid \"shortcut\" value \"${trimmed}\" — ${error instanceof Error ? error.message : String(error)}`);\n }\n },\n { immediate: true },\n );\n\n onMounted(() => {\n setupNativeListeners();\n });\n\n // ── Selection ────────────────────────────────────────────────────────────\n function selectItem(item: CommandPaletteItem): void {\n if (item.disabled) return;\n\n emit('select', { item, label: item.label, value: item.value });\n\n if (props['keep-open-on-select'].value) {\n searchInputRef.value?.focus();\n } else {\n requestClose('trigger');\n }\n }\n\n function handleInput(e: Event): void {\n const value = (e.target as HTMLInputElement).value;\n\n query.value = value;\n list.navigate('first');\n emit('search', { query: value });\n\n const count = filteredItems.value.length;\n\n announce(count === 0 ? props['empty-text'].value! : `${count} result${count === 1 ? '' : 's'} found`);\n }\n\n function handleKeydown(e: KeyboardEvent): void {\n if (list.handleKeydown(e)) return;\n\n if (e.key === 'Enter') {\n // `list.navigate('first')` (called on open and on every keystroke) already keeps\n // the focused row off a disabled item, so this fallback is only ever reached when\n // nothing has been focused yet — but it mirrors `selectItem`'s own disabled guard\n // rather than blindly grabbing index 0, in case that navigate-on-open wiring ever\n // changes.\n const active = list.getActiveItem() ?? filteredItems.value.find((item) => !item.disabled);\n\n if (active) {\n e.preventDefault();\n selectItem(active);\n }\n }\n }\n\n return html`\n <dialog ref=\"${dialogRef}\" class=\"dialog\" part=\"dialog\" aria-label=\"${props.label}\" aria-modal=\"true\">\n <div class=\"panel\" part=\"panel\">\n <div class=\"search\" part=\"search\">\n <span class=\"search-icon\" aria-hidden=\"true\"><ore-icon name=\"search\" size=\"18\"></ore-icon></span>\n <input\n ref=\"${searchInputRef}\"\n class=\"search-input\"\n part=\"input\"\n type=\"text\"\n role=\"combobox\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-expanded=\"true\"\n aria-autocomplete=\"list\"\n aria-controls=\"${listboxId}\"\n aria-activedescendant=\"${() => (focusedIndex.value >= 0 ? `${listboxId}-opt-${focusedIndex.value}` : '')}\"\n placeholder=\"${props.placeholder}\"\n value=\"${query}\"\n @input=\"${handleInput}\"\n @keydown=\"${handleKeydown}\" />\n <span class=\"search-loader\" ?hidden=\"${() => !props.loading.value}\" aria-hidden=\"true\"></span>\n </div>\n <div\n class=\"listbox\"\n part=\"listbox\"\n role=\"listbox\"\n id=\"${listboxId}\"\n aria-label=\"Commands\"\n ref=\"${(listEl: HTMLElement) => {\n listboxEl = listEl;\n }}\">\n <div class=\"empty\" role=\"presentation\" ?hidden=\"${() => props.loading.value || rows.value.length > 0}\">\n ${() => props['empty-text'].value}\n </div>\n ${() =>\n rows.value.map((row) =>\n row.type === 'group'\n ? html`<div class=\"group-heading\" role=\"presentation\">${row.group}</div>`\n : html`<div\n class=\"item\"\n part=\"item\"\n role=\"option\"\n id=\"${`${listboxId}-opt-${row.idx}`}\"\n aria-selected=\"${() => String(focusedIndex.value === row.idx)}\"\n aria-disabled=\"${() => String(row.item.disabled)}\"\n ?data-focused=\"${() => focusedIndex.value === row.idx}\"\n ?data-disabled=\"${() => row.item.disabled}\"\n @click=\"${(e: MouseEvent) => {\n e.stopPropagation();\n selectItem(row.item);\n }}\"\n @pointerenter=\"${() => {\n list.set(row.idx);\n }}\">\n ${\n row.item.icon\n ? html`<span class=\"item-icon\" aria-hidden=\"true\"\n ><ore-icon name=\"${row.item.icon}\" size=\"16\"></ore-icon\n ></span>`\n : ''\n }\n <span class=\"item-label\">${row.item.label}</span>\n ${\n row.item.shortcut\n ? html`<span class=\"item-shortcut\"\n >${splitShortcutKeys(row.item.shortcut).map((key) => html`<kbd>${key}</kbd>`)}</span\n >`\n : ''\n }\n </div>`,\n )}\n </div>\n <div class=\"footer\" part=\"footer\">\n <span class=\"footer-hint\"><kbd>↑</kbd><kbd>↓</kbd> Navigate</span>\n <span class=\"footer-hint\"><kbd>Enter</kbd> Select</span>\n <span class=\"footer-hint\"><kbd>Esc</kbd> Close</span>\n </div>\n </div>\n </dialog>\n `;\n },\n styles: [reducedMotionMixin, componentStyles],\n});\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=`@layer refine.base{:host{--_bg:var(--card-bg,var(--color-canvas));--_color:var(--card-color,var(--color-contrast-900));--_border:var(--card-border,var(--border));--_border-color:var(--card-border-color,var(--color-
|
|
1
|
+
var e=`@layer refine.base{:host{--_bg:var(--card-bg,var(--color-canvas));--_color:var(--card-color,var(--color-contrast-900));--_border:var(--card-border,var(--border));--_border-color:var(--card-border-color,var(--color-divider));--_radius:var(--card-radius,var(--rounded-lg));--_padding:var(--card-padding,var(--size-4));--_shadow:var(--card-shadow,var(--shadow-sm));--_hover-shadow:var(--card-hover-shadow,var(--shadow-md));flex-direction:column;display:flex;position:relative}.card{color:var(--_color);background:var(--_bg);border-radius:var(--_radius);-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transition:box-shadow var(--transition-normal), transform var(--transition-normal), background var(--transition-normal), border-color var(--transition-normal);flex-direction:column;flex:1;display:flex;position:relative;overflow:hidden}.card-media{flex-shrink:0;overflow:hidden}.card-media img{object-fit:cover;width:100%;height:auto;display:block}.card-body{flex-direction:column;flex:1;min-height:0;display:flex}.card-header,.card-content,.card-footer{padding:var(--_padding)}.card-header{padding-bottom:calc(var(--_padding) / 2)}.card-footer{padding-top:calc(var(--_padding) / 2)}.card-content{flex:1}.card-actions{gap:var(--size-2);padding:var(--_padding);padding-top:calc(var(--_padding) / 2);flex-wrap:wrap;align-items:center;display:flex}[hidden]{display:none}}@layer refine.variants{:host(:not([variant],[color])){--_shadow:var(--card-shadow,var(--shadow-sm))}:host(:not([variant],[color])) .card{border:var(--_border) solid var(--_border-color);box-shadow:var(--_shadow)}:host(:not([variant])[color]){--_bg:var(--card-bg,var(--_theme-backdrop));--_border-color:var(--card-border-color,var(--_theme-border))}:host(:not([variant])[color]) .card{border:var(--_border) solid var(--_border-color)}:host(:not([variant])[color]:hover){--_bg:var(--card-bg,color-mix(in oklch, var(--_theme-base) 16%, var(--color-contrast-50)));--_border-color:var(--card-border-color,var(--_theme-focus))}:host([variant=solid]){--_bg:var(--card-bg,var(--_theme-base));--_color:var(--card-color,var(--_theme-contrast));--_border-color:var(--card-border-color,var(--_theme-base));--_shadow:var(--card-shadow,var(--shadow-sm))}:host([variant=solid]) .card{border:var(--_border) solid var(--_border-color);box-shadow:var(--_shadow)}:host([variant=flat]){--_border-color:var(--card-border-color,color-mix(in oklch, var(--_theme-border) 50%, transparent))}:host([variant=flat]) .card{border:var(--_border) solid var(--_border-color)}:host([variant=glass]) .card{text-shadow:var(--text-shadow-xs);border:var(--_border) solid var(--_border-color);box-shadow:var(--card-shadow,var(--shadow-md)), var(--inset-shadow-xs);-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%) brightness(1.05);backdrop-filter:blur(var(--blur-lg)) saturate(180%) brightness(1.05)}:host([variant=glass]:hover) .card{box-shadow:var(--card-hover-shadow,var(--shadow-xl)), var(--inset-shadow-sm);-webkit-backdrop-filter:blur(var(--blur-xl)) saturate(200%) brightness(1.1);backdrop-filter:blur(var(--blur-xl)) saturate(200%) brightness(1.1)}:host([variant=glass][interactive]:hover) .card{box-shadow:var(--card-hover-shadow,var(--shadow-2xl)), var(--inset-shadow-sm)}}@layer refine.overrides{.loading-bar{background:linear-gradient(90deg, transparent 0%, var(--_theme-base,var(--color-primary)) 50%, transparent 100%);width:65%;height:3px;display:none;position:absolute;top:0}.loading-bar:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){left:0}.loading-bar:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}:host([loading]) .loading-bar{animation:var(--_motion-animation,loading-bar 1.4s linear infinite);display:block}:host(:dir(rtl)[loading]) .loading-bar{animation-direction:reverse}:host([disabled]){pointer-events:none;opacity:.6}:host([disabled][interactive]) .card{cursor:not-allowed}:host([interactive]:not([disabled]):hover) .card{box-shadow:var(--_hover-shadow);transform:translateY(-2px)scale(1.01)}:host([interactive]) .card{cursor:pointer;will-change:transform}:host([interactive]:not([disabled]):active) .card{box-shadow:var(--_shadow);transition:box-shadow var(--transition-fast), transform .12s var(--ease-spring);transform:translateY(0)scale(.99)}:host([interactive]:focus-visible) .card{outline:var(--border-2) solid var(--_theme-focus,var(--color-primary));outline-offset:var(--border-2)}:host([orientation=horizontal]) .card{flex-direction:row}:host([orientation=horizontal]) .card-media{width:30%;min-width:192px;max-width:320px}:host([orientation=horizontal]) .card-media img{object-fit:cover;width:100%;height:100%}:host([orientation=horizontal]) .card-body{flex:1}}@keyframes loading-bar{0%{transform:translate(-100%)}to{transform:translate(200%)}}`;exports.default=e;
|
|
2
2
|
//# sourceMappingURL=card.css.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.css.cjs","names":[],"sources":["../../../src/content/card/card.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--card-bg, var(--color-canvas));\n --_color: var(--card-color, var(--color-contrast-900));\n --_border: var(--card-border, var(--border));\n --_border-color: var(--card-border-color, var(--color-
|
|
1
|
+
{"version":3,"file":"card.css.cjs","names":[],"sources":["../../../src/content/card/card.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--card-bg, var(--color-canvas));\n --_color: var(--card-color, var(--color-contrast-900));\n --_border: var(--card-border, var(--border));\n --_border-color: var(--card-border-color, var(--color-divider));\n --_radius: var(--card-radius, var(--rounded-lg));\n --_padding: var(--card-padding, var(--size-4));\n --_shadow: var(--card-shadow, var(--shadow-sm));\n --_hover-shadow: var(--card-hover-shadow, var(--shadow-md));\n\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n .card {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: hidden;\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n backdrop-filter: blur(var(--blur-md));\n transition:\n box-shadow var(--transition-normal),\n transform var(--transition-normal),\n background var(--transition-normal),\n border-color var(--transition-normal);\n }\n\n /* ── Card Structure ───────────────────────── */\n\n .card-media {\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .card-media img {\n display: block;\n width: 100%;\n height: auto;\n object-fit: cover;\n }\n\n .card-body {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n .card-header,\n .card-content,\n .card-footer {\n padding: var(--_padding);\n }\n\n .card-header {\n padding-bottom: calc(var(--_padding) / 2);\n }\n\n .card-footer {\n padding-top: calc(var(--_padding) / 2);\n }\n\n .card-content {\n flex: 1;\n }\n\n .card-actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2);\n align-items: center;\n padding: var(--_padding);\n padding-top: calc(var(--_padding) / 2);\n }\n\n [hidden] {\n display: none;\n }\n}\n\n@layer refine.variants {\n /* Default — bordered card with shadow */\n :host(:not([variant], [color])) {\n --_shadow: var(--card-shadow, var(--shadow-sm));\n }\n\n :host(:not([variant], [color])) .card {\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--_shadow);\n }\n\n /* Default + color — tinted backdrop */\n :host(:not([variant])[color]) {\n --_bg: var(--card-bg, var(--_theme-backdrop));\n --_border-color: var(--card-border-color, var(--_theme-border));\n }\n\n :host(:not([variant])[color]) .card {\n border: var(--_border) solid var(--_border-color);\n }\n\n :host(:not([variant])[color]:hover) {\n --_bg: var(--card-bg, color-mix(in oklch, var(--_theme-base) 16%, var(--color-contrast-50)));\n --_border-color: var(--card-border-color, var(--_theme-focus));\n }\n\n /* Solid — fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--card-bg, var(--_theme-base));\n --_color: var(--card-color, var(--_theme-contrast));\n --_border-color: var(--card-border-color, var(--_theme-base));\n --_shadow: var(--card-shadow, var(--shadow-sm));\n }\n\n :host([variant='solid']) .card {\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--_shadow);\n }\n\n /* Flat — tinted backdrop, subtle border */\n :host([variant='flat']) {\n --_border-color: var(--card-border-color, color-mix(in oklch, var(--_theme-border) 50%, transparent));\n }\n\n :host([variant='flat']) .card {\n border: var(--_border) solid var(--_border-color);\n }\n\n /* Glass — frosted blur panel */\n :host([variant='glass']) .card {\n text-shadow: var(--text-shadow-xs);\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--card-shadow, var(--shadow-md)), var(--inset-shadow-xs);\n backdrop-filter: blur(var(--blur-lg)) saturate(180%) brightness(1.05);\n }\n\n :host([variant='glass']:hover) .card {\n box-shadow: var(--card-hover-shadow, var(--shadow-xl)), var(--inset-shadow-sm);\n backdrop-filter: blur(var(--blur-xl)) saturate(200%) brightness(1.1);\n }\n\n :host([variant='glass'][interactive]:hover) .card {\n box-shadow: var(--card-hover-shadow, var(--shadow-2xl)), var(--inset-shadow-sm);\n }\n}\n\n@layer refine.overrides {\n /* ── Loading bar ──────────────────────────── */\n\n /* Bar lives inside .card which already has overflow:hidden,\n so translateX can sweep freely without any overflow. */\n .loading-bar {\n position: absolute;\n inset-inline-start: 0;\n top: 0;\n display: none;\n width: 65%;\n height: 3px;\n background: linear-gradient(90deg, transparent 0%, var(--_theme-base, var(--color-primary)) 50%, transparent 100%);\n }\n\n :host([loading]) .loading-bar {\n display: block;\n animation: var(--_motion-animation, loading-bar 1.4s linear infinite);\n }\n\n /* In RTL the loading bar sweeps right-to-left */\n :host(:dir(rtl)[loading]) .loading-bar {\n animation-direction: reverse;\n }\n\n /* ── Disabled ─────────────────────────────── */\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n :host([disabled][interactive]) .card {\n cursor: not-allowed;\n }\n\n /* ── Interactive hover/active ─────────────── */\n\n :host([interactive]:not([disabled]):hover) .card {\n box-shadow: var(--_hover-shadow);\n transform: translateY(-2px) scale(1.01);\n }\n\n :host([interactive]) .card {\n cursor: pointer;\n will-change: transform;\n }\n\n :host([interactive]:not([disabled]):active) .card {\n box-shadow: var(--_shadow);\n transform: translateY(0) scale(0.99);\n transition:\n box-shadow var(--transition-fast),\n transform 120ms var(--ease-spring);\n }\n\n :host([interactive]:focus-visible) .card {\n outline: var(--border-2) solid var(--_theme-focus, var(--color-primary));\n outline-offset: var(--border-2);\n }\n\n /* ── Horizontal orientation ───────────────── */\n\n :host([orientation='horizontal']) .card {\n flex-direction: row;\n }\n\n :host([orientation='horizontal']) .card-media {\n width: 30%;\n min-width: 192px;\n max-width: 320px;\n }\n\n :host([orientation='horizontal']) .card-media img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n :host([orientation='horizontal']) .card-body {\n flex: 1;\n }\n}\n\n@keyframes loading-bar {\n 0% {\n transform: translateX(-100%);\n }\n\n 100% {\n transform: translateX(200%);\n }\n}\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/content/card/card.css?inline
|
|
2
|
-
var e = "@layer refine.base{:host{--_bg:var(--card-bg,var(--color-canvas));--_color:var(--card-color,var(--color-contrast-900));--_border:var(--card-border,var(--border));--_border-color:var(--card-border-color,var(--color-
|
|
2
|
+
var e = "@layer refine.base{:host{--_bg:var(--card-bg,var(--color-canvas));--_color:var(--card-color,var(--color-contrast-900));--_border:var(--card-border,var(--border));--_border-color:var(--card-border-color,var(--color-divider));--_radius:var(--card-radius,var(--rounded-lg));--_padding:var(--card-padding,var(--size-4));--_shadow:var(--card-shadow,var(--shadow-sm));--_hover-shadow:var(--card-hover-shadow,var(--shadow-md));flex-direction:column;display:flex;position:relative}.card{color:var(--_color);background:var(--_bg);border-radius:var(--_radius);-webkit-backdrop-filter:blur(var(--blur-md));backdrop-filter:blur(var(--blur-md));transition:box-shadow var(--transition-normal), transform var(--transition-normal), background var(--transition-normal), border-color var(--transition-normal);flex-direction:column;flex:1;display:flex;position:relative;overflow:hidden}.card-media{flex-shrink:0;overflow:hidden}.card-media img{object-fit:cover;width:100%;height:auto;display:block}.card-body{flex-direction:column;flex:1;min-height:0;display:flex}.card-header,.card-content,.card-footer{padding:var(--_padding)}.card-header{padding-bottom:calc(var(--_padding) / 2)}.card-footer{padding-top:calc(var(--_padding) / 2)}.card-content{flex:1}.card-actions{gap:var(--size-2);padding:var(--_padding);padding-top:calc(var(--_padding) / 2);flex-wrap:wrap;align-items:center;display:flex}[hidden]{display:none}}@layer refine.variants{:host(:not([variant],[color])){--_shadow:var(--card-shadow,var(--shadow-sm))}:host(:not([variant],[color])) .card{border:var(--_border) solid var(--_border-color);box-shadow:var(--_shadow)}:host(:not([variant])[color]){--_bg:var(--card-bg,var(--_theme-backdrop));--_border-color:var(--card-border-color,var(--_theme-border))}:host(:not([variant])[color]) .card{border:var(--_border) solid var(--_border-color)}:host(:not([variant])[color]:hover){--_bg:var(--card-bg,color-mix(in oklch, var(--_theme-base) 16%, var(--color-contrast-50)));--_border-color:var(--card-border-color,var(--_theme-focus))}:host([variant=solid]){--_bg:var(--card-bg,var(--_theme-base));--_color:var(--card-color,var(--_theme-contrast));--_border-color:var(--card-border-color,var(--_theme-base));--_shadow:var(--card-shadow,var(--shadow-sm))}:host([variant=solid]) .card{border:var(--_border) solid var(--_border-color);box-shadow:var(--_shadow)}:host([variant=flat]){--_border-color:var(--card-border-color,color-mix(in oklch, var(--_theme-border) 50%, transparent))}:host([variant=flat]) .card{border:var(--_border) solid var(--_border-color)}:host([variant=glass]) .card{text-shadow:var(--text-shadow-xs);border:var(--_border) solid var(--_border-color);box-shadow:var(--card-shadow,var(--shadow-md)), var(--inset-shadow-xs);-webkit-backdrop-filter:blur(var(--blur-lg)) saturate(180%) brightness(1.05);backdrop-filter:blur(var(--blur-lg)) saturate(180%) brightness(1.05)}:host([variant=glass]:hover) .card{box-shadow:var(--card-hover-shadow,var(--shadow-xl)), var(--inset-shadow-sm);-webkit-backdrop-filter:blur(var(--blur-xl)) saturate(200%) brightness(1.1);backdrop-filter:blur(var(--blur-xl)) saturate(200%) brightness(1.1)}:host([variant=glass][interactive]:hover) .card{box-shadow:var(--card-hover-shadow,var(--shadow-2xl)), var(--inset-shadow-sm)}}@layer refine.overrides{.loading-bar{background:linear-gradient(90deg, transparent 0%, var(--_theme-base,var(--color-primary)) 50%, transparent 100%);width:65%;height:3px;display:none;position:absolute;top:0}.loading-bar:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){left:0}.loading-bar:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){right:0}:host([loading]) .loading-bar{animation:var(--_motion-animation,loading-bar 1.4s linear infinite);display:block}:host(:dir(rtl)[loading]) .loading-bar{animation-direction:reverse}:host([disabled]){pointer-events:none;opacity:.6}:host([disabled][interactive]) .card{cursor:not-allowed}:host([interactive]:not([disabled]):hover) .card{box-shadow:var(--_hover-shadow);transform:translateY(-2px)scale(1.01)}:host([interactive]) .card{cursor:pointer;will-change:transform}:host([interactive]:not([disabled]):active) .card{box-shadow:var(--_shadow);transition:box-shadow var(--transition-fast), transform .12s var(--ease-spring);transform:translateY(0)scale(.99)}:host([interactive]:focus-visible) .card{outline:var(--border-2) solid var(--_theme-focus,var(--color-primary));outline-offset:var(--border-2)}:host([orientation=horizontal]) .card{flex-direction:row}:host([orientation=horizontal]) .card-media{width:30%;min-width:192px;max-width:320px}:host([orientation=horizontal]) .card-media img{object-fit:cover;width:100%;height:100%}:host([orientation=horizontal]) .card-body{flex:1}}@keyframes loading-bar{0%{transform:translate(-100%)}to{transform:translate(200%)}}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.css.js","names":[],"sources":["../../../src/content/card/card.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--card-bg, var(--color-canvas));\n --_color: var(--card-color, var(--color-contrast-900));\n --_border: var(--card-border, var(--border));\n --_border-color: var(--card-border-color, var(--color-
|
|
1
|
+
{"version":3,"file":"card.css.js","names":[],"sources":["../../../src/content/card/card.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--card-bg, var(--color-canvas));\n --_color: var(--card-color, var(--color-contrast-900));\n --_border: var(--card-border, var(--border));\n --_border-color: var(--card-border-color, var(--color-divider));\n --_radius: var(--card-radius, var(--rounded-lg));\n --_padding: var(--card-padding, var(--size-4));\n --_shadow: var(--card-shadow, var(--shadow-sm));\n --_hover-shadow: var(--card-hover-shadow, var(--shadow-md));\n\n position: relative;\n display: flex;\n flex-direction: column;\n }\n\n .card {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: hidden;\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n backdrop-filter: blur(var(--blur-md));\n transition:\n box-shadow var(--transition-normal),\n transform var(--transition-normal),\n background var(--transition-normal),\n border-color var(--transition-normal);\n }\n\n /* ── Card Structure ───────────────────────── */\n\n .card-media {\n flex-shrink: 0;\n overflow: hidden;\n }\n\n .card-media img {\n display: block;\n width: 100%;\n height: auto;\n object-fit: cover;\n }\n\n .card-body {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-height: 0;\n }\n\n .card-header,\n .card-content,\n .card-footer {\n padding: var(--_padding);\n }\n\n .card-header {\n padding-bottom: calc(var(--_padding) / 2);\n }\n\n .card-footer {\n padding-top: calc(var(--_padding) / 2);\n }\n\n .card-content {\n flex: 1;\n }\n\n .card-actions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2);\n align-items: center;\n padding: var(--_padding);\n padding-top: calc(var(--_padding) / 2);\n }\n\n [hidden] {\n display: none;\n }\n}\n\n@layer refine.variants {\n /* Default — bordered card with shadow */\n :host(:not([variant], [color])) {\n --_shadow: var(--card-shadow, var(--shadow-sm));\n }\n\n :host(:not([variant], [color])) .card {\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--_shadow);\n }\n\n /* Default + color — tinted backdrop */\n :host(:not([variant])[color]) {\n --_bg: var(--card-bg, var(--_theme-backdrop));\n --_border-color: var(--card-border-color, var(--_theme-border));\n }\n\n :host(:not([variant])[color]) .card {\n border: var(--_border) solid var(--_border-color);\n }\n\n :host(:not([variant])[color]:hover) {\n --_bg: var(--card-bg, color-mix(in oklch, var(--_theme-base) 16%, var(--color-contrast-50)));\n --_border-color: var(--card-border-color, var(--_theme-focus));\n }\n\n /* Solid — fully filled with theme color */\n :host([variant='solid']) {\n --_bg: var(--card-bg, var(--_theme-base));\n --_color: var(--card-color, var(--_theme-contrast));\n --_border-color: var(--card-border-color, var(--_theme-base));\n --_shadow: var(--card-shadow, var(--shadow-sm));\n }\n\n :host([variant='solid']) .card {\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--_shadow);\n }\n\n /* Flat — tinted backdrop, subtle border */\n :host([variant='flat']) {\n --_border-color: var(--card-border-color, color-mix(in oklch, var(--_theme-border) 50%, transparent));\n }\n\n :host([variant='flat']) .card {\n border: var(--_border) solid var(--_border-color);\n }\n\n /* Glass — frosted blur panel */\n :host([variant='glass']) .card {\n text-shadow: var(--text-shadow-xs);\n border: var(--_border) solid var(--_border-color);\n box-shadow: var(--card-shadow, var(--shadow-md)), var(--inset-shadow-xs);\n backdrop-filter: blur(var(--blur-lg)) saturate(180%) brightness(1.05);\n }\n\n :host([variant='glass']:hover) .card {\n box-shadow: var(--card-hover-shadow, var(--shadow-xl)), var(--inset-shadow-sm);\n backdrop-filter: blur(var(--blur-xl)) saturate(200%) brightness(1.1);\n }\n\n :host([variant='glass'][interactive]:hover) .card {\n box-shadow: var(--card-hover-shadow, var(--shadow-2xl)), var(--inset-shadow-sm);\n }\n}\n\n@layer refine.overrides {\n /* ── Loading bar ──────────────────────────── */\n\n /* Bar lives inside .card which already has overflow:hidden,\n so translateX can sweep freely without any overflow. */\n .loading-bar {\n position: absolute;\n inset-inline-start: 0;\n top: 0;\n display: none;\n width: 65%;\n height: 3px;\n background: linear-gradient(90deg, transparent 0%, var(--_theme-base, var(--color-primary)) 50%, transparent 100%);\n }\n\n :host([loading]) .loading-bar {\n display: block;\n animation: var(--_motion-animation, loading-bar 1.4s linear infinite);\n }\n\n /* In RTL the loading bar sweeps right-to-left */\n :host(:dir(rtl)[loading]) .loading-bar {\n animation-direction: reverse;\n }\n\n /* ── Disabled ─────────────────────────────── */\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n :host([disabled][interactive]) .card {\n cursor: not-allowed;\n }\n\n /* ── Interactive hover/active ─────────────── */\n\n :host([interactive]:not([disabled]):hover) .card {\n box-shadow: var(--_hover-shadow);\n transform: translateY(-2px) scale(1.01);\n }\n\n :host([interactive]) .card {\n cursor: pointer;\n will-change: transform;\n }\n\n :host([interactive]:not([disabled]):active) .card {\n box-shadow: var(--_shadow);\n transform: translateY(0) scale(0.99);\n transition:\n box-shadow var(--transition-fast),\n transform 120ms var(--ease-spring);\n }\n\n :host([interactive]:focus-visible) .card {\n outline: var(--border-2) solid var(--_theme-focus, var(--color-primary));\n outline-offset: var(--border-2);\n }\n\n /* ── Horizontal orientation ───────────────── */\n\n :host([orientation='horizontal']) .card {\n flex-direction: row;\n }\n\n :host([orientation='horizontal']) .card-media {\n width: 30%;\n min-width: 192px;\n max-width: 320px;\n }\n\n :host([orientation='horizontal']) .card-media img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n :host([orientation='horizontal']) .card-body {\n flex: 1;\n }\n}\n\n@keyframes loading-bar {\n 0% {\n transform: translateX(-100%);\n }\n\n 100% {\n transform: translateX(200%);\n }\n}\n"],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=`@layer refine.base{:host{--_bg:var(--chat-message-bg,var(--color-contrast-100));--_color:var(--chat-message-color,var(--color-contrast-900));--_user-bg:var(--chat-message-user-bg,var(--color-primary));--_user-color:var(--chat-message-user-color,var(--color-primary-content));--_radius:var(--chat-message-radius,var(--rounded-lg));--_max-width:var(--chat-message-max-width,36rem);display:block}.row{gap:var(--size-2-5);align-items:flex-start;display:flex}:host([sender=user]) .row{flex-direction:row-reverse}.avatar{flex-shrink:0;display:flex}.avatar[hidden]{display:none}.column{gap:var(--size-1);flex-direction:column;flex:1;align-items:flex-start;min-width:0;display:flex}:host([sender=user]) .column{align-items:flex-end}.name{padding-inline:var(--size-3-5);font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-contrast-500)}.name[hidden]{display:none}.bubble{box-sizing:border-box;width:fit-content;max-width:var(--_max-width);padding:var(--size-2-5) var(--size-3-5);color:var(--_color);background:var(--_bg);border-radius:var(--_radius)}:host([sender=user]) .bubble{color:var(--_user-color);background:var(--_user-bg)}.content{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.content-slot{overflow-wrap:anywhere;white-space:pre-wrap}.cursor{vertical-align:text-bottom;width:.5em;height:1em;animation:var(--_motion-animation,chat-message-blink 1s step-end infinite);background:currentColor;display:inline-block}.cursor:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-0-5)}.cursor:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:var(--size-0-5)}.cursor[hidden]{display:none}@keyframes chat-message-blink{50%{opacity:0}}.meta{gap:var(--size-1-5);padding-inline:var(--size-3-5);font-size:var(--text-xs);color:var(--color-contrast-400);align-items:center;display:flex}.meta[hidden],.timestamp[hidden]{display:none}.status{align-items:center;display:inline-flex}.status[hidden]{display:none}.status[data-status=sent]{color:var(--color-success)}.status[data-status=error]{color:var(--color-error)}.spinner{border:2px solid var(--color-contrast-300);width:.75em;height:.75em;animation:var(--_motion-animation,chat-message-spin var(--transition-loader) infinite);border-radius:50%;display:inline-block}.spinner:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.spinner:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes chat-message-spin{to{transform:rotate(360deg)}}.error-text{color:var(--color-error)}.error-text[hidden]{display:none}.retry{font:inherit;font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--
|
|
1
|
+
var e=`@layer refine.base{:host{--_bg:var(--chat-message-bg,var(--color-contrast-100));--_color:var(--chat-message-color,var(--color-contrast-900));--_user-bg:var(--chat-message-user-bg,var(--color-primary));--_user-color:var(--chat-message-user-color,var(--color-primary-content));--_radius:var(--chat-message-radius,var(--rounded-lg));--_max-width:var(--chat-message-max-width,36rem);display:block}.row{gap:var(--size-2-5);align-items:flex-start;display:flex}:host([sender=user]) .row{flex-direction:row-reverse}.avatar{flex-shrink:0;display:flex}.avatar[hidden]{display:none}.column{gap:var(--size-1);flex-direction:column;flex:1;align-items:flex-start;min-width:0;display:flex}:host([sender=user]) .column{align-items:flex-end}.name{padding-inline:var(--size-3-5);font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-contrast-500)}.name[hidden]{display:none}.bubble{box-sizing:border-box;width:fit-content;max-width:var(--_max-width);padding:var(--size-2-5) var(--size-3-5);color:var(--_color);background:var(--_bg);border-radius:var(--_radius)}:host([sender=user]) .bubble{color:var(--_user-color);background:var(--_user-bg)}.content{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.content-slot{overflow-wrap:anywhere;white-space:pre-wrap}.cursor{vertical-align:text-bottom;width:.5em;height:1em;animation:var(--_motion-animation,chat-message-blink 1s step-end infinite);background:currentColor;display:inline-block}.cursor:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-0-5)}.cursor:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:var(--size-0-5)}.cursor[hidden]{display:none}@keyframes chat-message-blink{50%{opacity:0}}.meta{gap:var(--size-1-5);padding-inline:var(--size-3-5);font-size:var(--text-xs);color:var(--color-contrast-400);align-items:center;display:flex}.meta[hidden],.timestamp[hidden]{display:none}.status{align-items:center;display:inline-flex}.status[hidden]{display:none}.status[data-status=sent]{color:var(--color-success)}.status[data-status=error]{color:var(--color-error)}.spinner{border:2px solid var(--color-contrast-300);width:.75em;height:.75em;animation:var(--_motion-animation,chat-message-spin var(--transition-loader) infinite);border-radius:50%;display:inline-block}.spinner:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.spinner:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes chat-message-spin{to{transform:rotate(360deg)}}.error-text{color:var(--color-error)}.error-text[hidden]{display:none}.retry{font:inherit;font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-primary);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:0;text-decoration:underline}.retry[hidden]{display:none}.retry:focus-visible{outline:var(--border-2) solid var(--color-focus);outline-offset:var(--border-2)}.actions{gap:var(--size-1);padding-inline:var(--size-3-5);display:flex}.actions[hidden]{display:none}}`;exports.default=e;
|
|
2
2
|
//# sourceMappingURL=chat-message.css.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message.css.cjs","names":[],"sources":["../../../src/content/chat-message/chat-message.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chat-message-bg, var(--color-contrast-100));\n --_color: var(--chat-message-color, var(--color-contrast-900));\n --_user-bg: var(--chat-message-user-bg, var(--color-primary));\n --_user-color: var(--chat-message-user-color, var(--color-primary-content));\n --_radius: var(--chat-message-radius, var(--rounded-lg));\n --_max-width: var(--chat-message-max-width, 36rem);\n\n display: block;\n }\n\n .row {\n display: flex;\n gap: var(--size-2-5);\n align-items: flex-start;\n }\n\n :host([sender='user']) .row {\n flex-direction: row-reverse;\n }\n\n .avatar {\n display: flex;\n flex-shrink: 0;\n }\n\n .avatar[hidden] {\n display: none;\n }\n\n .column {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-1);\n align-items: flex-start;\n min-width: 0;\n }\n\n :host([sender='user']) .column {\n align-items: flex-end;\n }\n\n .name {\n /* Match `.bubble`'s inline padding so the name lines up with the bubble's own text\n instead of the bubble's outer box. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-contrast-500);\n }\n\n .name[hidden] {\n display: none;\n }\n\n /* =====================\n Bubble\n ===================== */\n\n .bubble {\n box-sizing: border-box;\n width: fit-content;\n max-width: var(--_max-width);\n padding: var(--size-2-5) var(--size-3-5);\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n :host([sender='user']) .bubble {\n color: var(--_user-color);\n background: var(--_user-bg);\n }\n\n .content {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n\n /*\n * `white-space`/`overflow-wrap` live on the slot itself, not `.content` — both are\n * inherited properties, and slotted nodes inherit from their point of use (the `<slot>`)\n * per the CSS Scoping spec, so this still reaches the projected text. Scoping it here\n * (instead of the parent `.content`) keeps `.content`'s own whitespace-only text nodes —\n * the newline + indentation between `<slot>` and the cursor `<span>` in this template —\n * under normal collapsing rules, so they don't render as extra blank lines. Putting\n * `pre-wrap` on `.content` directly did exactly that: real bug, caught by measuring\n * rendered box height in a real browser.\n */\n .content-slot {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n /* =====================\n Streaming cursor\n ===================== */\n\n .cursor {\n display: inline-block;\n width: 0.5em;\n height: 1em;\n margin-inline-start: var(--size-0-5);\n vertical-align: text-bottom;\n background: currentcolor;\n animation: var(--_motion-animation, chat-message-blink 1s step-end infinite);\n }\n\n .cursor[hidden] {\n display: none;\n }\n\n @keyframes chat-message-blink {\n 50% {\n opacity: 0;\n }\n }\n\n /* =====================\n Meta row (timestamp / status / error / retry)\n ===================== */\n\n .meta {\n display: flex;\n gap: var(--size-1-5);\n align-items: center;\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n }\n\n .meta[hidden] {\n display: none;\n }\n\n .timestamp[hidden] {\n display: none;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n }\n\n .status[hidden] {\n display: none;\n }\n\n .status[data-status='sent'] {\n color: var(--color-success);\n }\n\n .status[data-status='error'] {\n color: var(--color-error);\n }\n\n .spinner {\n display: inline-block;\n width: 0.75em;\n height: 0.75em;\n border: 2px solid var(--color-contrast-300);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, chat-message-spin var(--transition-loader) infinite);\n }\n\n @keyframes chat-message-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .error-text {\n color: var(--color-error);\n }\n\n .error-text[hidden] {\n display: none;\n }\n\n .retry {\n padding: 0;\n font: inherit;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--
|
|
1
|
+
{"version":3,"file":"chat-message.css.cjs","names":[],"sources":["../../../src/content/chat-message/chat-message.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chat-message-bg, var(--color-contrast-100));\n --_color: var(--chat-message-color, var(--color-contrast-900));\n --_user-bg: var(--chat-message-user-bg, var(--color-primary));\n --_user-color: var(--chat-message-user-color, var(--color-primary-content));\n --_radius: var(--chat-message-radius, var(--rounded-lg));\n --_max-width: var(--chat-message-max-width, 36rem);\n\n display: block;\n }\n\n .row {\n display: flex;\n gap: var(--size-2-5);\n align-items: flex-start;\n }\n\n :host([sender='user']) .row {\n flex-direction: row-reverse;\n }\n\n .avatar {\n display: flex;\n flex-shrink: 0;\n }\n\n .avatar[hidden] {\n display: none;\n }\n\n .column {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-1);\n align-items: flex-start;\n min-width: 0;\n }\n\n :host([sender='user']) .column {\n align-items: flex-end;\n }\n\n .name {\n /* Match `.bubble`'s inline padding so the name lines up with the bubble's own text\n instead of the bubble's outer box. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-contrast-500);\n }\n\n .name[hidden] {\n display: none;\n }\n\n /* =====================\n Bubble\n ===================== */\n\n .bubble {\n box-sizing: border-box;\n width: fit-content;\n max-width: var(--_max-width);\n padding: var(--size-2-5) var(--size-3-5);\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n :host([sender='user']) .bubble {\n color: var(--_user-color);\n background: var(--_user-bg);\n }\n\n .content {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n\n /*\n * `white-space`/`overflow-wrap` live on the slot itself, not `.content` — both are\n * inherited properties, and slotted nodes inherit from their point of use (the `<slot>`)\n * per the CSS Scoping spec, so this still reaches the projected text. Scoping it here\n * (instead of the parent `.content`) keeps `.content`'s own whitespace-only text nodes —\n * the newline + indentation between `<slot>` and the cursor `<span>` in this template —\n * under normal collapsing rules, so they don't render as extra blank lines. Putting\n * `pre-wrap` on `.content` directly did exactly that: real bug, caught by measuring\n * rendered box height in a real browser.\n */\n .content-slot {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n /* =====================\n Streaming cursor\n ===================== */\n\n .cursor {\n display: inline-block;\n width: 0.5em;\n height: 1em;\n margin-inline-start: var(--size-0-5);\n vertical-align: text-bottom;\n background: currentcolor;\n animation: var(--_motion-animation, chat-message-blink 1s step-end infinite);\n }\n\n .cursor[hidden] {\n display: none;\n }\n\n @keyframes chat-message-blink {\n 50% {\n opacity: 0;\n }\n }\n\n /* =====================\n Meta row (timestamp / status / error / retry)\n ===================== */\n\n .meta {\n display: flex;\n gap: var(--size-1-5);\n align-items: center;\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n }\n\n .meta[hidden] {\n display: none;\n }\n\n .timestamp[hidden] {\n display: none;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n }\n\n .status[hidden] {\n display: none;\n }\n\n .status[data-status='sent'] {\n color: var(--color-success);\n }\n\n .status[data-status='error'] {\n color: var(--color-error);\n }\n\n .spinner {\n display: inline-block;\n width: 0.75em;\n height: 0.75em;\n border: 2px solid var(--color-contrast-300);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, chat-message-spin var(--transition-loader) infinite);\n }\n\n @keyframes chat-message-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .error-text {\n color: var(--color-error);\n }\n\n .error-text[hidden] {\n display: none;\n }\n\n .retry {\n padding: 0;\n font: inherit;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-primary);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n background: none;\n border: none;\n }\n\n .retry[hidden] {\n display: none;\n }\n\n .retry:focus-visible {\n outline: var(--border-2) solid var(--color-focus);\n outline-offset: var(--border-2);\n }\n\n /* =====================\n Actions\n ===================== */\n\n .actions {\n display: flex;\n gap: var(--size-1);\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n }\n\n .actions[hidden] {\n display: none;\n }\n}\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/content/chat-message/chat-message.css?inline
|
|
2
|
-
var e = "@layer refine.base{:host{--_bg:var(--chat-message-bg,var(--color-contrast-100));--_color:var(--chat-message-color,var(--color-contrast-900));--_user-bg:var(--chat-message-user-bg,var(--color-primary));--_user-color:var(--chat-message-user-color,var(--color-primary-content));--_radius:var(--chat-message-radius,var(--rounded-lg));--_max-width:var(--chat-message-max-width,36rem);display:block}.row{gap:var(--size-2-5);align-items:flex-start;display:flex}:host([sender=user]) .row{flex-direction:row-reverse}.avatar{flex-shrink:0;display:flex}.avatar[hidden]{display:none}.column{gap:var(--size-1);flex-direction:column;flex:1;align-items:flex-start;min-width:0;display:flex}:host([sender=user]) .column{align-items:flex-end}.name{padding-inline:var(--size-3-5);font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-contrast-500)}.name[hidden]{display:none}.bubble{box-sizing:border-box;width:fit-content;max-width:var(--_max-width);padding:var(--size-2-5) var(--size-3-5);color:var(--_color);background:var(--_bg);border-radius:var(--_radius)}:host([sender=user]) .bubble{color:var(--_user-color);background:var(--_user-bg)}.content{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.content-slot{overflow-wrap:anywhere;white-space:pre-wrap}.cursor{vertical-align:text-bottom;width:.5em;height:1em;animation:var(--_motion-animation,chat-message-blink 1s step-end infinite);background:currentColor;display:inline-block}.cursor:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-0-5)}.cursor:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:var(--size-0-5)}.cursor[hidden]{display:none}@keyframes chat-message-blink{50%{opacity:0}}.meta{gap:var(--size-1-5);padding-inline:var(--size-3-5);font-size:var(--text-xs);color:var(--color-contrast-400);align-items:center;display:flex}.meta[hidden],.timestamp[hidden]{display:none}.status{align-items:center;display:inline-flex}.status[hidden]{display:none}.status[data-status=sent]{color:var(--color-success)}.status[data-status=error]{color:var(--color-error)}.spinner{border:2px solid var(--color-contrast-300);width:.75em;height:.75em;animation:var(--_motion-animation,chat-message-spin var(--transition-loader) infinite);border-radius:50%;display:inline-block}.spinner:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.spinner:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes chat-message-spin{to{transform:rotate(360deg)}}.error-text{color:var(--color-error)}.error-text[hidden]{display:none}.retry{font:inherit;font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--
|
|
2
|
+
var e = "@layer refine.base{:host{--_bg:var(--chat-message-bg,var(--color-contrast-100));--_color:var(--chat-message-color,var(--color-contrast-900));--_user-bg:var(--chat-message-user-bg,var(--color-primary));--_user-color:var(--chat-message-user-color,var(--color-primary-content));--_radius:var(--chat-message-radius,var(--rounded-lg));--_max-width:var(--chat-message-max-width,36rem);display:block}.row{gap:var(--size-2-5);align-items:flex-start;display:flex}:host([sender=user]) .row{flex-direction:row-reverse}.avatar{flex-shrink:0;display:flex}.avatar[hidden]{display:none}.column{gap:var(--size-1);flex-direction:column;flex:1;align-items:flex-start;min-width:0;display:flex}:host([sender=user]) .column{align-items:flex-end}.name{padding-inline:var(--size-3-5);font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-contrast-500)}.name[hidden]{display:none}.bubble{box-sizing:border-box;width:fit-content;max-width:var(--_max-width);padding:var(--size-2-5) var(--size-3-5);color:var(--_color);background:var(--_bg);border-radius:var(--_radius)}:host([sender=user]) .bubble{color:var(--_user-color);background:var(--_user-bg)}.content{font-size:var(--text-sm);line-height:var(--leading-relaxed)}.content-slot{overflow-wrap:anywhere;white-space:pre-wrap}.cursor{vertical-align:text-bottom;width:.5em;height:1em;animation:var(--_motion-animation,chat-message-blink 1s step-end infinite);background:currentColor;display:inline-block}.cursor:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-left:var(--size-0-5)}.cursor:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){margin-right:var(--size-0-5)}.cursor[hidden]{display:none}@keyframes chat-message-blink{50%{opacity:0}}.meta{gap:var(--size-1-5);padding-inline:var(--size-3-5);font-size:var(--text-xs);color:var(--color-contrast-400);align-items:center;display:flex}.meta[hidden],.timestamp[hidden]{display:none}.status{align-items:center;display:inline-flex}.status[hidden]{display:none}.status[data-status=sent]{color:var(--color-success)}.status[data-status=error]{color:var(--color-error)}.spinner{border:2px solid var(--color-contrast-300);width:.75em;height:.75em;animation:var(--_motion-animation,chat-message-spin var(--transition-loader) infinite);border-radius:50%;display:inline-block}.spinner:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-color:#0000}.spinner:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-left-color:#0000}@keyframes chat-message-spin{to{transform:rotate(360deg)}}.error-text{color:var(--color-error)}.error-text[hidden]{display:none}.retry{font:inherit;font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--color-primary);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:0;text-decoration:underline}.retry[hidden]{display:none}.retry:focus-visible{outline:var(--border-2) solid var(--color-focus);outline-offset:var(--border-2)}.actions{gap:var(--size-1);padding-inline:var(--size-3-5);display:flex}.actions[hidden]{display:none}}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message.css.js","names":[],"sources":["../../../src/content/chat-message/chat-message.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chat-message-bg, var(--color-contrast-100));\n --_color: var(--chat-message-color, var(--color-contrast-900));\n --_user-bg: var(--chat-message-user-bg, var(--color-primary));\n --_user-color: var(--chat-message-user-color, var(--color-primary-content));\n --_radius: var(--chat-message-radius, var(--rounded-lg));\n --_max-width: var(--chat-message-max-width, 36rem);\n\n display: block;\n }\n\n .row {\n display: flex;\n gap: var(--size-2-5);\n align-items: flex-start;\n }\n\n :host([sender='user']) .row {\n flex-direction: row-reverse;\n }\n\n .avatar {\n display: flex;\n flex-shrink: 0;\n }\n\n .avatar[hidden] {\n display: none;\n }\n\n .column {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-1);\n align-items: flex-start;\n min-width: 0;\n }\n\n :host([sender='user']) .column {\n align-items: flex-end;\n }\n\n .name {\n /* Match `.bubble`'s inline padding so the name lines up with the bubble's own text\n instead of the bubble's outer box. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-contrast-500);\n }\n\n .name[hidden] {\n display: none;\n }\n\n /* =====================\n Bubble\n ===================== */\n\n .bubble {\n box-sizing: border-box;\n width: fit-content;\n max-width: var(--_max-width);\n padding: var(--size-2-5) var(--size-3-5);\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n :host([sender='user']) .bubble {\n color: var(--_user-color);\n background: var(--_user-bg);\n }\n\n .content {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n\n /*\n * `white-space`/`overflow-wrap` live on the slot itself, not `.content` — both are\n * inherited properties, and slotted nodes inherit from their point of use (the `<slot>`)\n * per the CSS Scoping spec, so this still reaches the projected text. Scoping it here\n * (instead of the parent `.content`) keeps `.content`'s own whitespace-only text nodes —\n * the newline + indentation between `<slot>` and the cursor `<span>` in this template —\n * under normal collapsing rules, so they don't render as extra blank lines. Putting\n * `pre-wrap` on `.content` directly did exactly that: real bug, caught by measuring\n * rendered box height in a real browser.\n */\n .content-slot {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n /* =====================\n Streaming cursor\n ===================== */\n\n .cursor {\n display: inline-block;\n width: 0.5em;\n height: 1em;\n margin-inline-start: var(--size-0-5);\n vertical-align: text-bottom;\n background: currentcolor;\n animation: var(--_motion-animation, chat-message-blink 1s step-end infinite);\n }\n\n .cursor[hidden] {\n display: none;\n }\n\n @keyframes chat-message-blink {\n 50% {\n opacity: 0;\n }\n }\n\n /* =====================\n Meta row (timestamp / status / error / retry)\n ===================== */\n\n .meta {\n display: flex;\n gap: var(--size-1-5);\n align-items: center;\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n }\n\n .meta[hidden] {\n display: none;\n }\n\n .timestamp[hidden] {\n display: none;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n }\n\n .status[hidden] {\n display: none;\n }\n\n .status[data-status='sent'] {\n color: var(--color-success);\n }\n\n .status[data-status='error'] {\n color: var(--color-error);\n }\n\n .spinner {\n display: inline-block;\n width: 0.75em;\n height: 0.75em;\n border: 2px solid var(--color-contrast-300);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, chat-message-spin var(--transition-loader) infinite);\n }\n\n @keyframes chat-message-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .error-text {\n color: var(--color-error);\n }\n\n .error-text[hidden] {\n display: none;\n }\n\n .retry {\n padding: 0;\n font: inherit;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--
|
|
1
|
+
{"version":3,"file":"chat-message.css.js","names":[],"sources":["../../../src/content/chat-message/chat-message.css?inline"],"sourcesContent":["@layer refine.base {\n :host {\n --_bg: var(--chat-message-bg, var(--color-contrast-100));\n --_color: var(--chat-message-color, var(--color-contrast-900));\n --_user-bg: var(--chat-message-user-bg, var(--color-primary));\n --_user-color: var(--chat-message-user-color, var(--color-primary-content));\n --_radius: var(--chat-message-radius, var(--rounded-lg));\n --_max-width: var(--chat-message-max-width, 36rem);\n\n display: block;\n }\n\n .row {\n display: flex;\n gap: var(--size-2-5);\n align-items: flex-start;\n }\n\n :host([sender='user']) .row {\n flex-direction: row-reverse;\n }\n\n .avatar {\n display: flex;\n flex-shrink: 0;\n }\n\n .avatar[hidden] {\n display: none;\n }\n\n .column {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-1);\n align-items: flex-start;\n min-width: 0;\n }\n\n :host([sender='user']) .column {\n align-items: flex-end;\n }\n\n .name {\n /* Match `.bubble`'s inline padding so the name lines up with the bubble's own text\n instead of the bubble's outer box. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-contrast-500);\n }\n\n .name[hidden] {\n display: none;\n }\n\n /* =====================\n Bubble\n ===================== */\n\n .bubble {\n box-sizing: border-box;\n width: fit-content;\n max-width: var(--_max-width);\n padding: var(--size-2-5) var(--size-3-5);\n color: var(--_color);\n background: var(--_bg);\n border-radius: var(--_radius);\n }\n\n :host([sender='user']) .bubble {\n color: var(--_user-color);\n background: var(--_user-bg);\n }\n\n .content {\n font-size: var(--text-sm);\n line-height: var(--leading-relaxed);\n }\n\n /*\n * `white-space`/`overflow-wrap` live on the slot itself, not `.content` — both are\n * inherited properties, and slotted nodes inherit from their point of use (the `<slot>`)\n * per the CSS Scoping spec, so this still reaches the projected text. Scoping it here\n * (instead of the parent `.content`) keeps `.content`'s own whitespace-only text nodes —\n * the newline + indentation between `<slot>` and the cursor `<span>` in this template —\n * under normal collapsing rules, so they don't render as extra blank lines. Putting\n * `pre-wrap` on `.content` directly did exactly that: real bug, caught by measuring\n * rendered box height in a real browser.\n */\n .content-slot {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n /* =====================\n Streaming cursor\n ===================== */\n\n .cursor {\n display: inline-block;\n width: 0.5em;\n height: 1em;\n margin-inline-start: var(--size-0-5);\n vertical-align: text-bottom;\n background: currentcolor;\n animation: var(--_motion-animation, chat-message-blink 1s step-end infinite);\n }\n\n .cursor[hidden] {\n display: none;\n }\n\n @keyframes chat-message-blink {\n 50% {\n opacity: 0;\n }\n }\n\n /* =====================\n Meta row (timestamp / status / error / retry)\n ===================== */\n\n .meta {\n display: flex;\n gap: var(--size-1-5);\n align-items: center;\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n }\n\n .meta[hidden] {\n display: none;\n }\n\n .timestamp[hidden] {\n display: none;\n }\n\n .status {\n display: inline-flex;\n align-items: center;\n }\n\n .status[hidden] {\n display: none;\n }\n\n .status[data-status='sent'] {\n color: var(--color-success);\n }\n\n .status[data-status='error'] {\n color: var(--color-error);\n }\n\n .spinner {\n display: inline-block;\n width: 0.75em;\n height: 0.75em;\n border: 2px solid var(--color-contrast-300);\n border-inline-end-color: transparent;\n border-radius: 50%;\n animation: var(--_motion-animation, chat-message-spin var(--transition-loader) infinite);\n }\n\n @keyframes chat-message-spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .error-text {\n color: var(--color-error);\n }\n\n .error-text[hidden] {\n display: none;\n }\n\n .retry {\n padding: 0;\n font: inherit;\n font-size: var(--text-xs);\n font-weight: var(--font-medium);\n color: var(--color-primary);\n text-decoration: underline;\n text-underline-offset: 2px;\n cursor: pointer;\n background: none;\n border: none;\n }\n\n .retry[hidden] {\n display: none;\n }\n\n .retry:focus-visible {\n outline: var(--border-2) solid var(--color-focus);\n outline-offset: var(--border-2);\n }\n\n /* =====================\n Actions\n ===================== */\n\n .actions {\n display: flex;\n gap: var(--size-1);\n\n /* Match `.bubble`'s inline padding — see `.name` above. */\n padding-inline: var(--size-3-5);\n }\n\n .actions[hidden] {\n display: none;\n }\n}\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-window.d.ts","sourceRoot":"","sources":["../../../src/content/code-window/code-window.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"code-window.d.ts","sourceRoot":"","sources":["../../../src/content/code-window/code-window.ts"],"names":[],"mappings":"AAKA,gCAAgC;AAChC,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,6CAA6C;AAC7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,eAAe,EAAG,iBAA0B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../src/content/icon/icon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icon.d.ts","sourceRoot":"","sources":["../../../src/content/icon/icon.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AA2CpF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,IAAI,CAInE;AA2CD,gCAAgC;AAChC,MAAM,MAAM,YAAY,GAAG;IACzB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,QAAQ,EAAG,UAAmB,CAAC"}
|
package/dist/content/index.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export { CHAT_MESSAGE_TAG } from './chat-message/chat-message';
|
|
|
14
14
|
export type { ChatMessageSender, ChatMessageStatus, OreChatMessageEvents, OreChatMessageProps, } from './chat-message/chat-message';
|
|
15
15
|
export { ICON_TAG, registerIcons } from './icon/icon';
|
|
16
16
|
export type { OreIconProps, IconNode } from './icon/icon';
|
|
17
|
+
export { LIST_ITEM_TAG } from './list/list-item';
|
|
18
|
+
export type { ListItemRevealSide, OreListItemEvents, OreListItemProps } from './list/list-item';
|
|
19
|
+
export { LIST_CTX, LIST_TAG } from './list/list';
|
|
20
|
+
export type { ListContext, ListVariant, OreListEvents, OreListProps } from './list/list';
|
|
17
21
|
export { PAGINATION_TAG } from './pagination/pagination';
|
|
18
22
|
export type { OrePaginationEvents, OrePaginationProps } from './pagination/pagination';
|
|
19
23
|
export { SEPARATOR_TAG } from './separator/separator';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../../headless/swipe.cjs");var t=64,n=t*3,r=.85;function i(i,a){let o=e=>e.distance<0?`right`:`left`,s=()=>{i.removeAttribute(`data-dragging`),i.removeAttribute(`data-confirming`),i.style.removeProperty(`--_swipe-x`)};return e.createSwipeControl({axis:()=>`x`,captureTarget:()=>null,disabled:a.disabled,onCancel:s,onCommit:e=>{let t=o(e);s(),a.hasActions(t)&&(i.removeAttribute(`revealed`),a.onConfirm(t))},onMove:e=>{let n=o(e);if(!a.hasActions(n))return;let s=Math.min(Math.abs(e.distance)/t,1);i.setAttribute(`data-dragging`,``),i.toggleAttribute(`data-confirming`,e.progress>=r),i.style.setProperty(`--_swipe-x`,String((n===`left`?1:-1)*s))},onRelease:e=>{let n=o(e);s(),a.hasActions(n)&&Math.abs(e.distance)>=t&&i.setAttribute(`revealed`,n)},threshold:()=>n})}exports.createRevealState=i;
|
|
2
|
+
//# sourceMappingURL=_list-item-reveal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_list-item-reveal.cjs","names":[],"sources":["../../../src/content/list/_list-item-reveal.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nimport type { ListItemRevealSide } from './list-item';\n\nimport { createSwipeControl, type SwipeControl, type SwipeControlDetail } from '../../headless';\n\n/** Drag distance (px) past which the action panel snaps fully open on release. */\nconst REVEAL_THRESHOLD = 64;\n/** Drag distance (px) past which the swipe auto-confirms the action — \"swiped all the way\". */\nconst CONFIRM_THRESHOLD = REVEAL_THRESHOLD * 3;\n/** Fraction of CONFIRM_THRESHOLD past which `data-confirming` warns the drag is about to fire. */\nconst CONFIRM_WARNING_RATIO = 0.85;\n\nexport type RevealStateOptions = {\n disabled: Readable<boolean>;\n hasActions: (side: ListItemRevealSide) => boolean;\n /** The full-swipe-through gesture fired — emit `confirm` and click the slot's own action. */\n onConfirm: (side: ListItemRevealSide) => void;\n};\n\n/**\n * The swipe-reveal-confirm gesture behind `ore-list-item`'s `actions-left`/`actions-right` slots\n * — isolated here since it's the one genuinely tricky part of the component (three distance\n * thresholds, inline style/attribute choreography during an active drag). Deliberately *not* a\n * `headless/` primitive: `createSwipeControl` itself already is one (shared with `ore-toast`),\n * but this two-stage reveal/confirm layer on top of it has exactly one consumer today —\n * generalizing it further would be speculative, not reusable.\n *\n * Only sets/clears the `revealed`/`data-dragging`/`data-confirming` attributes and `--_swipe-x`\n * style — it does not itself emit `reveal`/`conceal`. `ore-list-item` already watches `revealed`\n * for transitions (to cover *both* this gesture and a directly-set attribute uniformly), so this\n * module setting the attribute is enough to drive both that watcher and `list.css`'s\n * `[revealed]` styling.\n */\nexport function createRevealState(el: HTMLElement, options: RevealStateOptions): SwipeControl {\n const resolveSide = (detail: SwipeControlDetail): ListItemRevealSide => (detail.distance < 0 ? 'right' : 'left');\n\n // Inline `--_swipe-x` override during an active drag lets the row (and both action panels,\n // which read the same variable) follow the pointer 1:1 with no transition lag. Clearing it\n // hands control back to the `[revealed]`/`:focus-within` CSS rules in list-item.css, which\n // then animate normally via the CSS `transition`.\n const resetInline = (): void => {\n el.removeAttribute('data-dragging');\n el.removeAttribute('data-confirming');\n el.style.removeProperty('--_swipe-x');\n };\n\n return createSwipeControl({\n axis: () => 'x',\n // Do not capture the pointer — capture would steal clicks from action buttons revealed\n // mid-gesture (same reasoning as ore-toast's swipe-to-dismiss).\n captureTarget: () => null,\n disabled: options.disabled,\n onCancel: resetInline,\n // `threshold`/`distance`/`progress` are all wired to CONFIRM_THRESHOLD (the outer, rarer\n // gesture) — onCommit only fires once the swipe has gone all the way through.\n onCommit: (detail) => {\n const side = resolveSide(detail);\n\n resetInline();\n\n if (!options.hasActions(side)) return;\n\n el.removeAttribute('revealed');\n options.onConfirm(side);\n },\n onMove: (detail) => {\n const side = resolveSide(detail);\n\n if (!options.hasActions(side)) return;\n\n // Reveal follows the pointer up to REVEAL_THRESHOLD, then holds fully open while the\n // drag continues on toward CONFIRM_THRESHOLD (still tracked by `detail`/onCommit above).\n const revealProgress = Math.min(Math.abs(detail.distance) / REVEAL_THRESHOLD, 1);\n\n el.setAttribute('data-dragging', '');\n el.toggleAttribute('data-confirming', detail.progress >= CONFIRM_WARNING_RATIO);\n el.style.setProperty('--_swipe-x', String((side === 'left' ? 1 : -1) * revealProgress));\n },\n onRelease: (detail) => {\n const side = resolveSide(detail);\n\n resetInline();\n\n if (options.hasActions(side) && Math.abs(detail.distance) >= REVEAL_THRESHOLD) el.setAttribute('revealed', side);\n },\n threshold: () => CONFIRM_THRESHOLD,\n });\n}\n"],"mappings":"4CAOA,IAAM,EAAmB,GAEnB,EAAoB,EAAmB,EAEvC,EAAwB,IAuB9B,SAAgB,EAAkB,EAAiB,EAA2C,CAC5F,IAAM,EAAe,GAAoD,EAAO,SAAW,EAAI,QAAU,OAMnG,MAA0B,CAC9B,EAAG,gBAAgB,eAAe,EAClC,EAAG,gBAAgB,iBAAiB,EACpC,EAAG,MAAM,eAAe,YAAY,CACtC,EAEA,OAAO,EAAA,mBAAmB,CACxB,SAAY,IAGZ,kBAAqB,KACrB,SAAU,EAAQ,SAClB,SAAU,EAGV,SAAW,GAAW,CACpB,IAAM,EAAO,EAAY,CAAM,EAE/B,EAAY,EAEP,EAAQ,WAAW,CAAI,IAE5B,EAAG,gBAAgB,UAAU,EAC7B,EAAQ,UAAU,CAAI,EACxB,EACA,OAAS,GAAW,CAClB,IAAM,EAAO,EAAY,CAAM,EAE/B,GAAI,CAAC,EAAQ,WAAW,CAAI,EAAG,OAI/B,IAAM,EAAiB,KAAK,IAAI,KAAK,IAAI,EAAO,QAAQ,EAAI,EAAkB,CAAC,EAE/E,EAAG,aAAa,gBAAiB,EAAE,EACnC,EAAG,gBAAgB,kBAAmB,EAAO,UAAY,CAAqB,EAC9E,EAAG,MAAM,YAAY,aAAc,QAAQ,IAAS,OAAS,EAAI,IAAM,CAAc,CAAC,CACxF,EACA,UAAY,GAAW,CACrB,IAAM,EAAO,EAAY,CAAM,EAE/B,EAAY,EAER,EAAQ,WAAW,CAAI,GAAK,KAAK,IAAI,EAAO,QAAQ,GAAK,GAAkB,EAAG,aAAa,WAAY,CAAI,CACjH,EACA,cAAiB,CACnB,CAAC,CACH"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Readable } from '@vielzeug/ripple';
|
|
2
|
+
import type { ListItemRevealSide } from './list-item';
|
|
3
|
+
import { type SwipeControl } from '../../headless';
|
|
4
|
+
export type RevealStateOptions = {
|
|
5
|
+
disabled: Readable<boolean>;
|
|
6
|
+
hasActions: (side: ListItemRevealSide) => boolean;
|
|
7
|
+
/** The full-swipe-through gesture fired — emit `confirm` and click the slot's own action. */
|
|
8
|
+
onConfirm: (side: ListItemRevealSide) => void;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The swipe-reveal-confirm gesture behind `ore-list-item`'s `actions-left`/`actions-right` slots
|
|
12
|
+
* — isolated here since it's the one genuinely tricky part of the component (three distance
|
|
13
|
+
* thresholds, inline style/attribute choreography during an active drag). Deliberately *not* a
|
|
14
|
+
* `headless/` primitive: `createSwipeControl` itself already is one (shared with `ore-toast`),
|
|
15
|
+
* but this two-stage reveal/confirm layer on top of it has exactly one consumer today —
|
|
16
|
+
* generalizing it further would be speculative, not reusable.
|
|
17
|
+
*
|
|
18
|
+
* Only sets/clears the `revealed`/`data-dragging`/`data-confirming` attributes and `--_swipe-x`
|
|
19
|
+
* style — it does not itself emit `reveal`/`conceal`. `ore-list-item` already watches `revealed`
|
|
20
|
+
* for transitions (to cover *both* this gesture and a directly-set attribute uniformly), so this
|
|
21
|
+
* module setting the attribute is enough to drive both that watcher and `list.css`'s
|
|
22
|
+
* `[revealed]` styling.
|
|
23
|
+
*/
|
|
24
|
+
export declare function createRevealState(el: HTMLElement, options: RevealStateOptions): SwipeControl;
|
|
25
|
+
//# sourceMappingURL=_list-item-reveal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_list-item-reveal.d.ts","sourceRoot":"","sources":["../../../src/content/list/_list-item-reveal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAsB,KAAK,YAAY,EAA2B,MAAM,gBAAgB,CAAC;AAShG,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAClD,6FAA6F;IAC7F,SAAS,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,kBAAkB,GAAG,YAAY,CAsD5F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createSwipeControl as e } from "../../headless/swipe.js";
|
|
2
|
+
//#region src/content/list/_list-item-reveal.ts
|
|
3
|
+
var t = 64, n = t * 3, r = .85;
|
|
4
|
+
function i(i, a) {
|
|
5
|
+
let o = (e) => e.distance < 0 ? "right" : "left", s = () => {
|
|
6
|
+
i.removeAttribute("data-dragging"), i.removeAttribute("data-confirming"), i.style.removeProperty("--_swipe-x");
|
|
7
|
+
};
|
|
8
|
+
return e({
|
|
9
|
+
axis: () => "x",
|
|
10
|
+
captureTarget: () => null,
|
|
11
|
+
disabled: a.disabled,
|
|
12
|
+
onCancel: s,
|
|
13
|
+
onCommit: (e) => {
|
|
14
|
+
let t = o(e);
|
|
15
|
+
s(), a.hasActions(t) && (i.removeAttribute("revealed"), a.onConfirm(t));
|
|
16
|
+
},
|
|
17
|
+
onMove: (e) => {
|
|
18
|
+
let n = o(e);
|
|
19
|
+
if (!a.hasActions(n)) return;
|
|
20
|
+
let s = Math.min(Math.abs(e.distance) / t, 1);
|
|
21
|
+
i.setAttribute("data-dragging", ""), i.toggleAttribute("data-confirming", e.progress >= r), i.style.setProperty("--_swipe-x", String((n === "left" ? 1 : -1) * s));
|
|
22
|
+
},
|
|
23
|
+
onRelease: (e) => {
|
|
24
|
+
let n = o(e);
|
|
25
|
+
s(), a.hasActions(n) && Math.abs(e.distance) >= t && i.setAttribute("revealed", n);
|
|
26
|
+
},
|
|
27
|
+
threshold: () => n
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//#endregion
|
|
31
|
+
export { i as createRevealState };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=_list-item-reveal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_list-item-reveal.js","names":[],"sources":["../../../src/content/list/_list-item-reveal.ts"],"sourcesContent":["import type { Readable } from '@vielzeug/ripple';\n\nimport type { ListItemRevealSide } from './list-item';\n\nimport { createSwipeControl, type SwipeControl, type SwipeControlDetail } from '../../headless';\n\n/** Drag distance (px) past which the action panel snaps fully open on release. */\nconst REVEAL_THRESHOLD = 64;\n/** Drag distance (px) past which the swipe auto-confirms the action — \"swiped all the way\". */\nconst CONFIRM_THRESHOLD = REVEAL_THRESHOLD * 3;\n/** Fraction of CONFIRM_THRESHOLD past which `data-confirming` warns the drag is about to fire. */\nconst CONFIRM_WARNING_RATIO = 0.85;\n\nexport type RevealStateOptions = {\n disabled: Readable<boolean>;\n hasActions: (side: ListItemRevealSide) => boolean;\n /** The full-swipe-through gesture fired — emit `confirm` and click the slot's own action. */\n onConfirm: (side: ListItemRevealSide) => void;\n};\n\n/**\n * The swipe-reveal-confirm gesture behind `ore-list-item`'s `actions-left`/`actions-right` slots\n * — isolated here since it's the one genuinely tricky part of the component (three distance\n * thresholds, inline style/attribute choreography during an active drag). Deliberately *not* a\n * `headless/` primitive: `createSwipeControl` itself already is one (shared with `ore-toast`),\n * but this two-stage reveal/confirm layer on top of it has exactly one consumer today —\n * generalizing it further would be speculative, not reusable.\n *\n * Only sets/clears the `revealed`/`data-dragging`/`data-confirming` attributes and `--_swipe-x`\n * style — it does not itself emit `reveal`/`conceal`. `ore-list-item` already watches `revealed`\n * for transitions (to cover *both* this gesture and a directly-set attribute uniformly), so this\n * module setting the attribute is enough to drive both that watcher and `list.css`'s\n * `[revealed]` styling.\n */\nexport function createRevealState(el: HTMLElement, options: RevealStateOptions): SwipeControl {\n const resolveSide = (detail: SwipeControlDetail): ListItemRevealSide => (detail.distance < 0 ? 'right' : 'left');\n\n // Inline `--_swipe-x` override during an active drag lets the row (and both action panels,\n // which read the same variable) follow the pointer 1:1 with no transition lag. Clearing it\n // hands control back to the `[revealed]`/`:focus-within` CSS rules in list-item.css, which\n // then animate normally via the CSS `transition`.\n const resetInline = (): void => {\n el.removeAttribute('data-dragging');\n el.removeAttribute('data-confirming');\n el.style.removeProperty('--_swipe-x');\n };\n\n return createSwipeControl({\n axis: () => 'x',\n // Do not capture the pointer — capture would steal clicks from action buttons revealed\n // mid-gesture (same reasoning as ore-toast's swipe-to-dismiss).\n captureTarget: () => null,\n disabled: options.disabled,\n onCancel: resetInline,\n // `threshold`/`distance`/`progress` are all wired to CONFIRM_THRESHOLD (the outer, rarer\n // gesture) — onCommit only fires once the swipe has gone all the way through.\n onCommit: (detail) => {\n const side = resolveSide(detail);\n\n resetInline();\n\n if (!options.hasActions(side)) return;\n\n el.removeAttribute('revealed');\n options.onConfirm(side);\n },\n onMove: (detail) => {\n const side = resolveSide(detail);\n\n if (!options.hasActions(side)) return;\n\n // Reveal follows the pointer up to REVEAL_THRESHOLD, then holds fully open while the\n // drag continues on toward CONFIRM_THRESHOLD (still tracked by `detail`/onCommit above).\n const revealProgress = Math.min(Math.abs(detail.distance) / REVEAL_THRESHOLD, 1);\n\n el.setAttribute('data-dragging', '');\n el.toggleAttribute('data-confirming', detail.progress >= CONFIRM_WARNING_RATIO);\n el.style.setProperty('--_swipe-x', String((side === 'left' ? 1 : -1) * revealProgress));\n },\n onRelease: (detail) => {\n const side = resolveSide(detail);\n\n resetInline();\n\n if (options.hasActions(side) && Math.abs(detail.distance) >= REVEAL_THRESHOLD) el.setAttribute('revealed', side);\n },\n threshold: () => CONFIRM_THRESHOLD,\n });\n}\n"],"mappings":";;AAOA,IAAM,IAAmB,IAEnB,IAAoB,IAAmB,GAEvC,IAAwB;AAuB9B,SAAgB,EAAkB,GAAiB,GAA2C;CAC5F,IAAM,KAAe,MAAoD,EAAO,WAAW,IAAI,UAAU,QAMnG,UAA0B;EAG9B,AAFA,EAAG,gBAAgB,eAAe,GAClC,EAAG,gBAAgB,iBAAiB,GACpC,EAAG,MAAM,eAAe,YAAY;CACtC;CAEA,OAAO,EAAmB;EACxB,YAAY;EAGZ,qBAAqB;EACrB,UAAU,EAAQ;EAClB,UAAU;EAGV,WAAW,MAAW;GACpB,IAAM,IAAO,EAAY,CAAM;GAE/B,EAAY,GAEP,EAAQ,WAAW,CAAI,MAE5B,EAAG,gBAAgB,UAAU,GAC7B,EAAQ,UAAU,CAAI;EACxB;EACA,SAAS,MAAW;GAClB,IAAM,IAAO,EAAY,CAAM;GAE/B,IAAI,CAAC,EAAQ,WAAW,CAAI,GAAG;GAI/B,IAAM,IAAiB,KAAK,IAAI,KAAK,IAAI,EAAO,QAAQ,IAAI,GAAkB,CAAC;GAI/E,AAFA,EAAG,aAAa,iBAAiB,EAAE,GACnC,EAAG,gBAAgB,mBAAmB,EAAO,YAAY,CAAqB,GAC9E,EAAG,MAAM,YAAY,cAAc,QAAQ,MAAS,SAAS,IAAI,MAAM,CAAc,CAAC;EACxF;EACA,YAAY,MAAW;GACrB,IAAM,IAAO,EAAY,CAAM;GAI/B,AAFA,EAAY,GAER,EAAQ,WAAW,CAAI,KAAK,KAAK,IAAI,EAAO,QAAQ,KAAK,KAAkB,EAAG,aAAa,YAAY,CAAI;EACjH;EACA,iBAAiB;CACnB,CAAC;AACH"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=`@layer refine.base{:host{color:var(--color-contrast-700);--_actions-width:var(--list-item-actions-width,var(--size-24));display:block;position:relative;overflow:hidden}.row{z-index:1;box-sizing:border-box;gap:var(--_gap,var(--size-4));width:100%;min-height:var(--_min-height,var(--size-4));padding:var(--_padding,var(--size-2-5) var(--size-4));font-size:var(--_font-size,var(--text-sm));text-align:start;touch-action:pan-y;cursor:default;background:var(--list-item-bg,var(--color-canvas));transform:translateX(calc(var(--_swipe-x,0) * var(--_actions-width)));transition:var(--_motion-transition,transform var(--transition-fast), background var(--transition-fast));border:none;outline:none;align-items:center;display:flex;position:relative}.row:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:var(--_padding-inline-end,var(--size-6))}.row:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-left:var(--_padding-inline-end,var(--size-6))}.leading,.trailing{flex-shrink:0;align-items:center;display:flex}.content{gap:var(--size-0-5);flex-direction:column;flex:1;min-width:0;display:flex}.title{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.description{text-overflow:ellipsis;font-size:var(--text-xs);color:var(--color-contrast-400);white-space:nowrap;display:block;overflow:hidden}.description:empty{display:none}.row:hover{background:var(--list-item-hover-bg,var(--color-contrast-100))}.row:focus-visible{outline:var(--focus-ring);outline-offset:-2px}:host([selected]) .row{color:var(--color-primary);background:var(--list-item-selected-bg,color-mix(in oklch, var(--color-primary) 10%, transparent))}:host([disabled]){pointer-events:none;opacity:.6}.actions{width:var(--_actions-width);transition:var(--_motion-transition,transform var(--transition-fast));align-items:stretch;display:flex;position:absolute;top:0;bottom:0}.actions ::slotted(*){flex:1;height:100%}.actions-left{transform:translateX(calc((var(--_swipe-x,0) - 1) * 100%));left:0}.actions-right{transform:translateX(calc((var(--_swipe-x,0) + 1) * 100%));right:0}:host([revealed=left]){--_swipe-x:1}:host([revealed=right]){--_swipe-x:-1}:host:has(.actions-left:focus-within){--_swipe-x:1}:host:has(.actions-right:focus-within){--_swipe-x:-1}:host([data-dragging]) .row,:host([data-dragging]) .actions-left,:host([data-dragging]) .actions-right{transition:none}:host([data-confirming]) .actions-left,:host([data-confirming]) .actions-right{filter:saturate(1.4)brightness(.94)}}`;exports.default=e;
|
|
2
|
+
//# sourceMappingURL=list-item.css.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-item.css.cjs","names":[],"sources":["../../../src/content/list/list-item.css?inline"],"sourcesContent":["@layer refine.base {\n /* `--_gap` / `--_padding` / `--_font-size` are intentionally not emitted by any mixin in this\n component's own `styles` array — they're inherited from the parent `ore-list`'s\n `sizeVariantMixin(LIST_SIZE_PRESET)` call the same way `ore-menu-item` inherits\n `--_gap`/`--_font-size` from `ore-menu` (see `LIST_SIZE_PRESET`'s doc comment). The\n `var(..., fallback)` defaults below cover standalone use outside an `ore-list`. */\n :host {\n position: relative;\n display: block;\n overflow: hidden;\n color: var(--color-contrast-700);\n\n --_actions-width: var(--list-item-actions-width, var(--size-24));\n }\n\n /* ========================================\n Row\n ======================================== */\n\n .row {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n display: flex;\n gap: var(--_gap, var(--size-4));\n align-items: center;\n width: 100%;\n min-height: var(--_min-height, var(--size-4));\n padding: var(--_padding, var(--size-2-5) var(--size-4));\n padding-inline-end: var(--_padding-inline-end, var(--size-6));\n font-size: var(--_font-size, var(--text-sm));\n text-align: start;\n touch-action: pan-y;\n cursor: default;\n outline: none;\n background: var(--list-item-bg, var(--color-canvas));\n border: none;\n transform: translateX(calc(var(--_swipe-x, 0) * var(--_actions-width)));\n transition: var(--_motion-transition, transform var(--transition-fast), background var(--transition-fast));\n }\n\n .leading,\n .trailing {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n }\n\n .content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-0-5);\n min-width: 0;\n }\n\n .title {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .description {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n white-space: nowrap;\n }\n\n .description:empty {\n display: none;\n }\n\n .row:hover {\n background: var(--list-item-hover-bg, var(--color-contrast-100));\n }\n\n .row:focus-visible {\n outline: var(--focus-ring);\n outline-offset: -2px;\n }\n\n /* ========================================\n Selected / Disabled States\n ======================================== */\n\n :host([selected]) .row {\n color: var(--color-primary);\n background: var(--list-item-selected-bg, color-mix(in oklch, var(--color-primary) 10%, transparent));\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n /* ========================================\n Swipe Action Panels\n ======================================== */\n\n .actions {\n position: absolute;\n inset-block: 0;\n display: flex;\n align-items: stretch;\n width: var(--_actions-width);\n transition: var(--_motion-transition, transform var(--transition-fast));\n }\n\n /* A single slotted action button fills the whole revealed panel — the common case (one big\n tappable target, e.g. a full-height \"Delete\" button) rather than a small icon-sized hit area.\n This stretches the slotted element's own light-DOM box, which is enough for plain elements\n (a native <button>, an <a>, ...). It is NOT enough on its own for `ore-button`: its visible\n surface is an inner `[part=\"button\"]` with a fixed height from its size preset, independent\n of its own host box size — pass `fullheight` on the `ore-button` itself too (see its own\n `fullheight` prop) to actually fill this panel edge-to-edge. */\n .actions ::slotted(*) {\n flex: 1;\n height: 100%;\n }\n\n .actions-left {\n left: 0;\n transform: translateX(calc((var(--_swipe-x, 0) - 1) * 100%));\n }\n\n .actions-right {\n right: 0;\n transform: translateX(calc((var(--_swipe-x, 0) + 1) * 100%));\n }\n\n /* `:host(:has(...))` (`:has()` as `:host()`'s functional argument) is invalid — `:host()`\n only accepts a compound selector and doesn't accept `:has()` inside it. The plain `:host`\n pseudo-class chained directly with `:has()` (no parentheses) is the valid form. Kept as\n separate rules (not grouped via a comma with the `[revealed]` rules) so a selector list\n doesn't silently drop the whole rule if either half were ever invalid again. */\n :host([revealed='left']) {\n --_swipe-x: 1;\n }\n\n :host([revealed='right']) {\n --_swipe-x: -1;\n }\n\n :host:has(.actions-left:focus-within) {\n --_swipe-x: 1;\n }\n\n :host:has(.actions-right:focus-within) {\n --_swipe-x: -1;\n }\n\n /* Suppress the transition while a drag is actively updating `--_swipe-x` inline so the row\n and action panels track the pointer 1:1 instead of lagging behind on every move event. */\n :host([data-dragging]) .row,\n :host([data-dragging]) .actions-left,\n :host([data-dragging]) .actions-right {\n transition: none;\n }\n\n /* Feedback that the drag has passed into \"swipe all the way through\" territory (close to\n CONFIRM_THRESHOLD) — set by list-item.ts's onMove once past ~85% of that distance, cleared\n on release/cancel/commit. Visual-only; the confirm itself fires from JS regardless of CSS. */\n :host([data-confirming]) .actions-left,\n :host([data-confirming]) .actions-right {\n filter: saturate(1.4) brightness(0.94);\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/content/list/list-item.css?inline
|
|
2
|
+
var e = "@layer refine.base{:host{color:var(--color-contrast-700);--_actions-width:var(--list-item-actions-width,var(--size-24));display:block;position:relative;overflow:hidden}.row{z-index:1;box-sizing:border-box;gap:var(--_gap,var(--size-4));width:100%;min-height:var(--_min-height,var(--size-4));padding:var(--_padding,var(--size-2-5) var(--size-4));font-size:var(--_font-size,var(--text-sm));text-align:start;touch-action:pan-y;cursor:default;background:var(--list-item-bg,var(--color-canvas));transform:translateX(calc(var(--_swipe-x,0) * var(--_actions-width)));transition:var(--_motion-transition,transform var(--transition-fast), background var(--transition-fast));border:none;outline:none;align-items:center;display:flex;position:relative}.row:not(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-right:var(--_padding-inline-end,var(--size-6))}.row:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){padding-left:var(--_padding-inline-end,var(--size-6))}.leading,.trailing{flex-shrink:0;align-items:center;display:flex}.content{gap:var(--size-0-5);flex-direction:column;flex:1;min-width:0;display:flex}.title{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.description{text-overflow:ellipsis;font-size:var(--text-xs);color:var(--color-contrast-400);white-space:nowrap;display:block;overflow:hidden}.description:empty{display:none}.row:hover{background:var(--list-item-hover-bg,var(--color-contrast-100))}.row:focus-visible{outline:var(--focus-ring);outline-offset:-2px}:host([selected]) .row{color:var(--color-primary);background:var(--list-item-selected-bg,color-mix(in oklch, var(--color-primary) 10%, transparent))}:host([disabled]){pointer-events:none;opacity:.6}.actions{width:var(--_actions-width);transition:var(--_motion-transition,transform var(--transition-fast));align-items:stretch;display:flex;position:absolute;top:0;bottom:0}.actions ::slotted(*){flex:1;height:100%}.actions-left{transform:translateX(calc((var(--_swipe-x,0) - 1) * 100%));left:0}.actions-right{transform:translateX(calc((var(--_swipe-x,0) + 1) * 100%));right:0}:host([revealed=left]){--_swipe-x:1}:host([revealed=right]){--_swipe-x:-1}:host:has(.actions-left:focus-within){--_swipe-x:1}:host:has(.actions-right:focus-within){--_swipe-x:-1}:host([data-dragging]) .row,:host([data-dragging]) .actions-left,:host([data-dragging]) .actions-right{transition:none}:host([data-confirming]) .actions-left,:host([data-confirming]) .actions-right{filter:saturate(1.4)brightness(.94)}}";
|
|
3
|
+
//#endregion
|
|
4
|
+
export { e as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=list-item.css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-item.css.js","names":[],"sources":["../../../src/content/list/list-item.css?inline"],"sourcesContent":["@layer refine.base {\n /* `--_gap` / `--_padding` / `--_font-size` are intentionally not emitted by any mixin in this\n component's own `styles` array — they're inherited from the parent `ore-list`'s\n `sizeVariantMixin(LIST_SIZE_PRESET)` call the same way `ore-menu-item` inherits\n `--_gap`/`--_font-size` from `ore-menu` (see `LIST_SIZE_PRESET`'s doc comment). The\n `var(..., fallback)` defaults below cover standalone use outside an `ore-list`. */\n :host {\n position: relative;\n display: block;\n overflow: hidden;\n color: var(--color-contrast-700);\n\n --_actions-width: var(--list-item-actions-width, var(--size-24));\n }\n\n /* ========================================\n Row\n ======================================== */\n\n .row {\n position: relative;\n z-index: 1;\n box-sizing: border-box;\n display: flex;\n gap: var(--_gap, var(--size-4));\n align-items: center;\n width: 100%;\n min-height: var(--_min-height, var(--size-4));\n padding: var(--_padding, var(--size-2-5) var(--size-4));\n padding-inline-end: var(--_padding-inline-end, var(--size-6));\n font-size: var(--_font-size, var(--text-sm));\n text-align: start;\n touch-action: pan-y;\n cursor: default;\n outline: none;\n background: var(--list-item-bg, var(--color-canvas));\n border: none;\n transform: translateX(calc(var(--_swipe-x, 0) * var(--_actions-width)));\n transition: var(--_motion-transition, transform var(--transition-fast), background var(--transition-fast));\n }\n\n .leading,\n .trailing {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n }\n\n .content {\n display: flex;\n flex: 1;\n flex-direction: column;\n gap: var(--size-0-5);\n min-width: 0;\n }\n\n .title {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .description {\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: var(--text-xs);\n color: var(--color-contrast-400);\n white-space: nowrap;\n }\n\n .description:empty {\n display: none;\n }\n\n .row:hover {\n background: var(--list-item-hover-bg, var(--color-contrast-100));\n }\n\n .row:focus-visible {\n outline: var(--focus-ring);\n outline-offset: -2px;\n }\n\n /* ========================================\n Selected / Disabled States\n ======================================== */\n\n :host([selected]) .row {\n color: var(--color-primary);\n background: var(--list-item-selected-bg, color-mix(in oklch, var(--color-primary) 10%, transparent));\n }\n\n :host([disabled]) {\n pointer-events: none;\n opacity: 0.6;\n }\n\n /* ========================================\n Swipe Action Panels\n ======================================== */\n\n .actions {\n position: absolute;\n inset-block: 0;\n display: flex;\n align-items: stretch;\n width: var(--_actions-width);\n transition: var(--_motion-transition, transform var(--transition-fast));\n }\n\n /* A single slotted action button fills the whole revealed panel — the common case (one big\n tappable target, e.g. a full-height \"Delete\" button) rather than a small icon-sized hit area.\n This stretches the slotted element's own light-DOM box, which is enough for plain elements\n (a native <button>, an <a>, ...). It is NOT enough on its own for `ore-button`: its visible\n surface is an inner `[part=\"button\"]` with a fixed height from its size preset, independent\n of its own host box size — pass `fullheight` on the `ore-button` itself too (see its own\n `fullheight` prop) to actually fill this panel edge-to-edge. */\n .actions ::slotted(*) {\n flex: 1;\n height: 100%;\n }\n\n .actions-left {\n left: 0;\n transform: translateX(calc((var(--_swipe-x, 0) - 1) * 100%));\n }\n\n .actions-right {\n right: 0;\n transform: translateX(calc((var(--_swipe-x, 0) + 1) * 100%));\n }\n\n /* `:host(:has(...))` (`:has()` as `:host()`'s functional argument) is invalid — `:host()`\n only accepts a compound selector and doesn't accept `:has()` inside it. The plain `:host`\n pseudo-class chained directly with `:has()` (no parentheses) is the valid form. Kept as\n separate rules (not grouped via a comma with the `[revealed]` rules) so a selector list\n doesn't silently drop the whole rule if either half were ever invalid again. */\n :host([revealed='left']) {\n --_swipe-x: 1;\n }\n\n :host([revealed='right']) {\n --_swipe-x: -1;\n }\n\n :host:has(.actions-left:focus-within) {\n --_swipe-x: 1;\n }\n\n :host:has(.actions-right:focus-within) {\n --_swipe-x: -1;\n }\n\n /* Suppress the transition while a drag is actively updating `--_swipe-x` inline so the row\n and action panels track the pointer 1:1 instead of lagging behind on every move event. */\n :host([data-dragging]) .row,\n :host([data-dragging]) .actions-left,\n :host([data-dragging]) .actions-right {\n transition: none;\n }\n\n /* Feedback that the drag has passed into \"swipe all the way through\" territory (close to\n CONFIRM_THRESHOLD) — set by list-item.ts's onMove once past ~85% of that distance, cleared\n on release/cancel/commit. Visual-only; the confirm itself fires from JS regardless of CSS. */\n :host([data-confirming]) .actions-left,\n :host([data-confirming]) .actions-right {\n filter: saturate(1.4) brightness(0.94);\n }\n}\n"],"mappings":""}
|