@panneau/ui 5.0.0-alpha.4 → 5.0.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -2
- package/dist/command-palette/CommandPalette.css +299 -0
- package/dist/command-palette/CommandPalette.d.ts +37 -0
- package/dist/command-palette/CommandPalette.d.ts.map +1 -0
- package/dist/command-palette/CommandPalette.js +194 -0
- package/dist/command-palette/CommandPalette.js.map +1 -0
- package/dist/command-palette/CommandPalette.module.js +62 -0
- package/dist/command-palette/CommandPalette.module.js.map +1 -0
- package/dist/command-palette/match.d.ts +39 -0
- package/dist/command-palette/match.d.ts.map +1 -0
- package/dist/command-palette/match.js +44 -0
- package/dist/command-palette/match.js.map +1 -0
- package/dist/command-palette/tokens.d.ts +3 -0
- package/dist/command-palette/tokens.d.ts.map +1 -0
- package/dist/command-palette/tokens.js +23 -0
- package/dist/command-palette/tokens.js.map +1 -0
- package/dist/command-palette/useCommandShortcut.d.ts +12 -0
- package/dist/command-palette/useCommandShortcut.d.ts.map +1 -0
- package/dist/command-palette/useCommandShortcut.js +29 -0
- package/dist/command-palette/useCommandShortcut.js.map +1 -0
- package/dist/date-picker/DatePicker.css +40 -0
- package/dist/date-picker/DatePicker.d.ts +2 -1
- package/dist/date-picker/DatePicker.d.ts.map +1 -1
- package/dist/date-picker/DatePicker.js +54 -8
- package/dist/date-picker/DatePicker.js.map +1 -1
- package/dist/date-picker/DatePicker.module.js +5 -1
- package/dist/date-picker/DatePicker.module.js.map +1 -1
- package/dist/dialog/Dialog.css +36 -2
- package/dist/dialog/Dialog.d.ts +15 -3
- package/dist/dialog/Dialog.d.ts.map +1 -1
- package/dist/dialog/Dialog.js +22 -14
- package/dist/dialog/Dialog.js.map +1 -1
- package/dist/dialog/Dialog.module.js +8 -2
- package/dist/dialog/Dialog.module.js.map +1 -1
- package/dist/dialog/tokens.d.ts +1 -1
- package/dist/dialog/tokens.d.ts.map +1 -1
- package/dist/dialog/tokens.js +2 -0
- package/dist/dialog/tokens.js.map +1 -1
- package/dist/field/Field.css +9 -0
- package/dist/field/Field.module.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/menu/Menu.css +84 -0
- package/dist/menu/Menu.d.ts +33 -6
- package/dist/menu/Menu.d.ts.map +1 -1
- package/dist/menu/Menu.js +110 -25
- package/dist/menu/Menu.js.map +1 -1
- package/dist/menu/Menu.module.js +22 -0
- package/dist/menu/Menu.module.js.map +1 -0
- package/dist/menu/tokens.d.ts +3 -0
- package/dist/menu/tokens.d.ts.map +1 -0
- package/dist/menu/tokens.js +31 -0
- package/dist/menu/tokens.js.map +1 -0
- package/dist/number-input/NumberInput.css +18 -0
- package/dist/number-input/NumberInput.js +1 -1
- package/dist/number-input/NumberInput.js.map +1 -1
- package/dist/number-input/NumberInput.module.js +3 -1
- package/dist/number-input/NumberInput.module.js.map +1 -1
- package/dist/pill-trigger/PillTrigger.css +104 -0
- package/dist/pill-trigger/PillTrigger.d.ts +20 -0
- package/dist/pill-trigger/PillTrigger.d.ts.map +1 -0
- package/dist/pill-trigger/PillTrigger.js +38 -0
- package/dist/pill-trigger/PillTrigger.js.map +1 -0
- package/dist/pill-trigger/PillTrigger.module.js +18 -0
- package/dist/pill-trigger/PillTrigger.module.js.map +1 -0
- package/dist/pill-trigger/tokens.d.ts +3 -0
- package/dist/pill-trigger/tokens.d.ts.map +1 -0
- package/dist/pill-trigger/tokens.js +37 -0
- package/dist/pill-trigger/tokens.js.map +1 -0
- package/dist/radio-group/RadioGroup.css +90 -0
- package/dist/radio-group/RadioGroup.d.ts +22 -3
- package/dist/radio-group/RadioGroup.d.ts.map +1 -1
- package/dist/radio-group/RadioGroup.js +42 -21
- package/dist/radio-group/RadioGroup.js.map +1 -1
- package/dist/radio-group/RadioGroup.module.js +12 -2
- package/dist/radio-group/RadioGroup.module.js.map +1 -1
- package/dist/radio-group/tokens.d.ts +2 -2
- package/dist/radio-group/tokens.d.ts.map +1 -1
- package/dist/radio-group/tokens.js +22 -2
- package/dist/radio-group/tokens.js.map +1 -1
- package/dist/segmented-control/SegmentedControl.css +83 -0
- package/dist/segmented-control/SegmentedControl.d.ts +35 -0
- package/dist/segmented-control/SegmentedControl.d.ts.map +1 -0
- package/dist/segmented-control/SegmentedControl.js +44 -0
- package/dist/segmented-control/SegmentedControl.js.map +1 -0
- package/dist/segmented-control/SegmentedControl.module.js +16 -0
- package/dist/segmented-control/SegmentedControl.module.js.map +1 -0
- package/dist/segmented-control/tokens.d.ts +3 -0
- package/dist/segmented-control/tokens.d.ts.map +1 -0
- package/dist/segmented-control/tokens.js +29 -0
- package/dist/segmented-control/tokens.js.map +1 -0
- package/dist/select/ListBox.css +23 -1
- package/dist/select/ListBox.module.js +2 -2
- package/dist/select/ListBox.module.js.map +1 -1
- package/dist/select/listBoxTokens.d.ts +1 -1
- package/dist/select/listBoxTokens.d.ts.map +1 -1
- package/dist/select/listBoxTokens.js +2 -0
- package/dist/select/listBoxTokens.js.map +1 -1
- package/dist/slider/Slider.css +84 -0
- package/dist/slider/Slider.d.ts +20 -0
- package/dist/slider/Slider.d.ts.map +1 -0
- package/dist/slider/Slider.js +70 -0
- package/dist/slider/Slider.js.map +1 -0
- package/dist/slider/Slider.module.js +20 -0
- package/dist/slider/Slider.module.js.map +1 -0
- package/dist/tags-input/TagsInput.css +60 -0
- package/dist/tags-input/TagsInput.d.ts +32 -0
- package/dist/tags-input/TagsInput.d.ts.map +1 -0
- package/dist/tags-input/TagsInput.js +160 -0
- package/dist/tags-input/TagsInput.js.map +1 -0
- package/dist/tags-input/TagsInput.module.js +20 -0
- package/dist/tags-input/TagsInput.module.js.map +1 -0
- package/dist/text-input/TextInput.d.ts.map +1 -1
- package/dist/text-input/TextInput.js +2 -0
- package/dist/text-input/TextInput.js.map +1 -1
- package/dist/theme/components.d.ts +7 -3
- package/dist/theme/components.d.ts.map +1 -1
- package/dist/theme/components.js +8 -0
- package/dist/theme/components.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import "./CommandPalette.css";
|
|
2
|
+
//#region src/command-palette/CommandPalette.module.css
|
|
3
|
+
var overlay = "panneau-command-palette-overlay";
|
|
4
|
+
var fade = "panneau-command-palette-fade";
|
|
5
|
+
var modal = "panneau-command-palette-modal";
|
|
6
|
+
var rise = "panneau-command-palette-rise";
|
|
7
|
+
var dialog = "panneau-command-palette-dialog";
|
|
8
|
+
var field = "panneau-command-palette-field";
|
|
9
|
+
var search = "panneau-command-palette-search";
|
|
10
|
+
var close = "panneau-command-palette-close";
|
|
11
|
+
var fieldIcon = "panneau-command-palette-field-icon";
|
|
12
|
+
var scope = "panneau-command-palette-scope";
|
|
13
|
+
var scopeLabel = "panneau-command-palette-scope-label";
|
|
14
|
+
var scopeRemove = "panneau-command-palette-scope-remove";
|
|
15
|
+
var input = "panneau-command-palette-input";
|
|
16
|
+
var list = "panneau-command-palette-list";
|
|
17
|
+
var group = "panneau-command-palette-group";
|
|
18
|
+
var groupLabel = "panneau-command-palette-group-label";
|
|
19
|
+
var item = "panneau-command-palette-item";
|
|
20
|
+
var icon = "panneau-command-palette-icon";
|
|
21
|
+
var image = "panneau-command-palette-image";
|
|
22
|
+
var text = "panneau-command-palette-text";
|
|
23
|
+
var label = "panneau-command-palette-label";
|
|
24
|
+
var description = "panneau-command-palette-description";
|
|
25
|
+
var empty = "panneau-command-palette-empty";
|
|
26
|
+
var footer = "panneau-command-palette-footer";
|
|
27
|
+
var hints = "panneau-command-palette-hints";
|
|
28
|
+
var hint = "panneau-command-palette-hint";
|
|
29
|
+
var key = "panneau-command-palette-key";
|
|
30
|
+
var CommandPalette_module_default = {
|
|
31
|
+
overlay,
|
|
32
|
+
fade,
|
|
33
|
+
modal,
|
|
34
|
+
rise,
|
|
35
|
+
dialog,
|
|
36
|
+
field,
|
|
37
|
+
search,
|
|
38
|
+
close,
|
|
39
|
+
fieldIcon,
|
|
40
|
+
scope,
|
|
41
|
+
scopeLabel,
|
|
42
|
+
scopeRemove,
|
|
43
|
+
input,
|
|
44
|
+
list,
|
|
45
|
+
group,
|
|
46
|
+
groupLabel,
|
|
47
|
+
item,
|
|
48
|
+
icon,
|
|
49
|
+
image,
|
|
50
|
+
text,
|
|
51
|
+
label,
|
|
52
|
+
description,
|
|
53
|
+
empty,
|
|
54
|
+
footer,
|
|
55
|
+
hints,
|
|
56
|
+
hint,
|
|
57
|
+
key
|
|
58
|
+
};
|
|
59
|
+
//#endregion
|
|
60
|
+
export { close, CommandPalette_module_default as default, description, dialog, empty, fade, field, fieldIcon, footer, group, groupLabel, hint, hints, icon, image, input, item, key, label, list, modal, overlay, rise, scope, scopeLabel, scopeRemove, search, text };
|
|
61
|
+
|
|
62
|
+
//# sourceMappingURL=CommandPalette.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette.module.js","names":[],"sources":["../../src/command-palette/CommandPalette.module.css"],"sourcesContent":["/* A dialog near the top of the screen: the search field over the results, and a footer with the\n * count and the keys. The whole screen on a phone. */\n\n.overlay {\n position: fixed;\n inset: 0;\n z-index: var(--panneau-z-overlay);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: var(--panneau-command-palette-offset-top, 12dvh) var(--panneau-space-4)\n var(--panneau-space-4);\n background-color: var(--panneau-color-backdrop);\n}\n\n.overlay[data-entering] {\n animation: fade var(--panneau-duration) ease-out;\n}\n\n.modal {\n display: flex;\n width: 100%;\n max-width: var(--panneau-command-palette-width, 40rem);\n outline: none;\n}\n\n.modal[data-entering] {\n animation: rise var(--panneau-duration) ease-out;\n}\n\n.dialog {\n display: flex;\n flex-direction: column;\n width: 100%;\n overflow: hidden;\n color: var(--panneau-color-text);\n background-color: var(--panneau-command-palette-bg, var(--panneau-color-surface-raised));\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-command-palette-radius, var(--panneau-radius-lg));\n box-shadow: var(--panneau-shadow-lg);\n outline: none;\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-3) var(--panneau-space-4);\n border-bottom: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.search {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.close {\n display: none;\n}\n\n.fieldIcon {\n flex: none;\n color: var(--panneau-color-text-muted);\n}\n\n/* What the search is narrowed to, before the field. */\n.scope {\n display: inline-flex;\n flex: none;\n align-items: center;\n gap: var(--panneau-space-1);\n max-width: 50%;\n padding: 0 var(--panneau-space-1) 0 var(--panneau-space-2);\n border-radius: var(--panneau-radius-full);\n background-color: var(--panneau-color-surface-sunken);\n font-size: var(--panneau-font-size-sm);\n font-weight: var(--panneau-font-weight-medium);\n}\n\n.scopeLabel {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.scopeRemove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--panneau-space-1);\n border: 0;\n border-radius: var(--panneau-radius-full);\n background: none;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n outline: none;\n}\n\n.scopeRemove[data-hovered] {\n color: var(--panneau-color-text);\n}\n\n.scopeRemove[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n}\n\n.input {\n flex: 1 1 auto;\n min-width: 0;\n padding: var(--panneau-space-1) 0;\n border: 0;\n background: none;\n color: inherit;\n font: inherit;\n font-size: var(--panneau-font-size-lg);\n outline: none;\n}\n\n.input::placeholder {\n color: var(--panneau-color-text-muted);\n}\n\n/* The browser's own clear button: Escape clears the field. */\n.input::-webkit-search-cancel-button {\n appearance: none;\n}\n\n.list {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n max-height: var(--panneau-command-palette-list-max-height, 60dvh);\n padding: var(--panneau-space-2);\n overflow-y: auto;\n outline: none;\n}\n\n.group {\n display: flex;\n flex-direction: column;\n}\n\n.groupLabel {\n padding: var(--panneau-space-1) var(--panneau-space-2);\n color: var(--panneau-color-text-muted);\n font-size: var(--panneau-font-size-xs);\n font-weight: var(--panneau-font-weight-medium);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n min-height: var(--panneau-control-height);\n padding: var(--panneau-space-1) var(--panneau-space-2);\n border-radius: var(--panneau-command-palette-item-radius, var(--panneau-radius-md));\n color: var(--panneau-color-text);\n text-decoration: none;\n cursor: pointer;\n outline: none;\n}\n\n.item[data-focused],\n.item[data-hovered] {\n background-color: var(--panneau-command-palette-item-active-bg, var(--panneau-color-hover));\n}\n\n.item[data-focus-visible] {\n box-shadow: inset 0 0 0 var(--panneau-focus-width) var(--panneau-color-focus);\n}\n\n.icon,\n.image {\n display: inline-grid;\n flex: none;\n place-items: center;\n width: 2rem;\n height: 2rem;\n border-radius: var(--panneau-radius-sm);\n color: var(--panneau-color-text-muted);\n background-color: var(--panneau-color-surface-sunken);\n object-fit: cover;\n}\n\n.text {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.label,\n.description {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.description {\n color: var(--panneau-color-text-muted);\n font-size: var(--panneau-font-size-sm);\n}\n\n.empty {\n margin: 0;\n padding: var(--panneau-space-6) var(--panneau-space-2);\n color: var(--panneau-color-text-muted);\n text-align: center;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-2) var(--panneau-space-4);\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n color: var(--panneau-color-text-muted);\n font-size: var(--panneau-font-size-xs);\n}\n\n.hints {\n display: flex;\n gap: var(--panneau-space-3);\n}\n\n.hint {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n}\n\n.key {\n display: inline-grid;\n place-items: center;\n min-width: 1.25rem;\n height: 1.25rem;\n padding: 0 var(--panneau-space-1);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-sm);\n background: var(--panneau-color-surface);\n font-family: inherit;\n font-size: var(--panneau-font-size-xs);\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rise {\n from {\n transform: translateY(-0.5rem);\n opacity: 0;\n }\n}\n\n/* A phone: the whole screen, without the keys, which a touch screen has no use for. */\n@container panneau-root (max-width: 40rem) {\n .overlay {\n padding: 0;\n }\n\n .modal {\n max-width: none;\n height: 100dvh;\n }\n\n .dialog {\n border: 0;\n border-radius: 0;\n }\n\n .list {\n flex: 1 1 auto;\n max-height: none;\n }\n\n .hints {\n display: none;\n }\n\n .close {\n display: inline-flex;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay[data-entering],\n .modal[data-entering] {\n animation: none;\n }\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { IconComponent } from '../icon/Icon';
|
|
2
|
+
/** An item of a `CommandPalette`: a link to follow, or an action to run. */
|
|
3
|
+
export interface CommandPaletteItem {
|
|
4
|
+
/** Unique in the palette. */
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
/** A second line, such as the subtitle of an item or what an action does. */
|
|
8
|
+
description?: string;
|
|
9
|
+
/** More words it is found by, never shown. */
|
|
10
|
+
keywords?: readonly string[];
|
|
11
|
+
icon?: IconComponent;
|
|
12
|
+
/** An image instead of an icon, such as the thumbnail of an item. */
|
|
13
|
+
imageUrl?: string;
|
|
14
|
+
/** A path or URL to go to, through the app's `RouterProvider`. */
|
|
15
|
+
href?: string;
|
|
16
|
+
/** Runs when the item is chosen, after which the palette closes. */
|
|
17
|
+
onAction?: () => void;
|
|
18
|
+
/** The palette stays open after `onAction`, such as an item that narrows the search. */
|
|
19
|
+
keepsOpen?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** A titled group of items. */
|
|
22
|
+
export interface CommandPaletteGroup {
|
|
23
|
+
id: string;
|
|
24
|
+
label: string;
|
|
25
|
+
items: readonly CommandPaletteItem[];
|
|
26
|
+
/**
|
|
27
|
+
* The items already match the query, such as results of a server: they are shown as they are,
|
|
28
|
+
* after the groups that the palette matches itself.
|
|
29
|
+
*/
|
|
30
|
+
matched?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** Lower case, without accents: `Été` and `ete` are the same. */
|
|
33
|
+
export declare function normalizeSearch(text: string, locale?: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* The groups of a palette for a query: the items that match it, ranked, in non-empty groups. Groups
|
|
36
|
+
* that are already `matched` keep their items, after the others. Without a query, every item.
|
|
37
|
+
*/
|
|
38
|
+
export declare function matchCommands(groups: readonly CommandPaletteGroup[], query: string, locale?: string): CommandPaletteGroup[];
|
|
39
|
+
//# sourceMappingURL=match.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/command-palette/match.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IAC/B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,wFAAwF;IACxF,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrE;AAyBD;;;GAGG;AACH,wBAAgB,aAAa,CACzB,MAAM,EAAE,SAAS,mBAAmB,EAAE,EACtC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GAChB,mBAAmB,EAAE,CAuBvB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/command-palette/match.ts
|
|
2
|
+
/** Lower case, without accents: `Été` and `ete` are the same. */
|
|
3
|
+
function normalizeSearch(text, locale) {
|
|
4
|
+
return text.normalize("NFD").replace(/\p{Diacritic}/gu, "").toLocaleLowerCase(locale).trim();
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* How well an item matches a query, lower being better, or `null` when it doesn't: every word of
|
|
8
|
+
* the query must be in its label, description or keywords. A label that starts with the query
|
|
9
|
+
* comes first, then a label with a word that starts with it, then a label that contains it.
|
|
10
|
+
*/
|
|
11
|
+
function score(item, query, words, locale) {
|
|
12
|
+
const label = normalizeSearch(item.label, locale);
|
|
13
|
+
const text = normalizeSearch([
|
|
14
|
+
item.label,
|
|
15
|
+
item.description ?? "",
|
|
16
|
+
...item.keywords ?? []
|
|
17
|
+
].join(" "), locale);
|
|
18
|
+
if (!words.every((word) => text.includes(word))) return null;
|
|
19
|
+
if (label.startsWith(query)) return 0;
|
|
20
|
+
if (label.split(/\s+/).some((word) => word.startsWith(query))) return 1;
|
|
21
|
+
return label.includes(query) ? 2 : 3;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The groups of a palette for a query: the items that match it, ranked, in non-empty groups. Groups
|
|
25
|
+
* that are already `matched` keep their items, after the others. Without a query, every item.
|
|
26
|
+
*/
|
|
27
|
+
function matchCommands(groups, query, locale) {
|
|
28
|
+
const normalized = normalizeSearch(query, locale);
|
|
29
|
+
const words = normalized.split(/\s+/).filter((word) => word !== "");
|
|
30
|
+
const local = groups.filter((group) => group.matched !== true);
|
|
31
|
+
const remote = groups.filter((group) => group.matched === true);
|
|
32
|
+
return [...words.length === 0 ? local : local.map((group) => ({
|
|
33
|
+
...group,
|
|
34
|
+
items: group.items.map((item, index) => ({
|
|
35
|
+
item,
|
|
36
|
+
index,
|
|
37
|
+
rank: score(item, normalized, words, locale)
|
|
38
|
+
})).filter((entry) => entry.rank !== null).sort((a, b) => a.rank - b.rank || a.index - b.index).map(({ item }) => item)
|
|
39
|
+
})), ...remote].filter((group) => group.items.length > 0);
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { matchCommands, normalizeSearch };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=match.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match.js","names":[],"sources":["../../src/command-palette/match.ts"],"sourcesContent":["import type { IconComponent } from '../icon/Icon';\n\n/** An item of a `CommandPalette`: a link to follow, or an action to run. */\nexport interface CommandPaletteItem {\n /** Unique in the palette. */\n id: string;\n label: string;\n /** A second line, such as the subtitle of an item or what an action does. */\n description?: string;\n /** More words it is found by, never shown. */\n keywords?: readonly string[];\n icon?: IconComponent;\n /** An image instead of an icon, such as the thumbnail of an item. */\n imageUrl?: string;\n /** A path or URL to go to, through the app's `RouterProvider`. */\n href?: string;\n /** Runs when the item is chosen, after which the palette closes. */\n onAction?: () => void;\n /** The palette stays open after `onAction`, such as an item that narrows the search. */\n keepsOpen?: boolean;\n}\n\n/** A titled group of items. */\nexport interface CommandPaletteGroup {\n id: string;\n label: string;\n items: readonly CommandPaletteItem[];\n /**\n * The items already match the query, such as results of a server: they are shown as they are,\n * after the groups that the palette matches itself.\n */\n matched?: boolean;\n}\n\n/** Lower case, without accents: `Été` and `ete` are the same. */\nexport function normalizeSearch(text: string, locale?: string): string {\n return text\n .normalize('NFD')\n .replace(/\\p{Diacritic}/gu, '')\n .toLocaleLowerCase(locale)\n .trim();\n}\n\n/**\n * How well an item matches a query, lower being better, or `null` when it doesn't: every word of\n * the query must be in its label, description or keywords. A label that starts with the query\n * comes first, then a label with a word that starts with it, then a label that contains it.\n */\nfunction score(item: CommandPaletteItem, query: string, words: string[], locale?: string) {\n const label = normalizeSearch(item.label, locale);\n const text = normalizeSearch(\n [item.label, item.description ?? '', ...(item.keywords ?? [])].join(' '),\n locale,\n );\n if (!words.every((word) => text.includes(word))) {\n return null;\n }\n if (label.startsWith(query)) {\n return 0;\n }\n if (label.split(/\\s+/).some((word) => word.startsWith(query))) {\n return 1;\n }\n return label.includes(query) ? 2 : 3;\n}\n\n/**\n * The groups of a palette for a query: the items that match it, ranked, in non-empty groups. Groups\n * that are already `matched` keep their items, after the others. Without a query, every item.\n */\nexport function matchCommands(\n groups: readonly CommandPaletteGroup[],\n query: string,\n locale?: string,\n): CommandPaletteGroup[] {\n const normalized = normalizeSearch(query, locale);\n const words = normalized.split(/\\s+/).filter((word) => word !== '');\n const local = groups.filter((group) => group.matched !== true);\n const remote = groups.filter((group) => group.matched === true);\n const matched =\n words.length === 0\n ? local\n : local.map((group) => ({\n ...group,\n items: group.items\n .map((item, index) => ({\n item,\n index,\n rank: score(item, normalized, words, locale),\n }))\n .filter(\n (entry): entry is typeof entry & { rank: number } => entry.rank !== null,\n )\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map(({ item }) => item),\n }));\n return [...matched, ...remote].filter((group) => group.items.length > 0);\n}\n"],"mappings":";;AAmCA,SAAgB,gBAAgB,MAAc,QAAyB;CACnE,OAAO,KACF,UAAU,KAAK,CAAC,CAChB,QAAQ,mBAAmB,EAAE,CAAC,CAC9B,kBAAkB,MAAM,CAAC,CACzB,KAAK;AACd;;;;;;AAOA,SAAS,MAAM,MAA0B,OAAe,OAAiB,QAAiB;CACtF,MAAM,QAAQ,gBAAgB,KAAK,OAAO,MAAM;CAChD,MAAM,OAAO,gBACT;EAAC,KAAK;EAAO,KAAK,eAAe;EAAI,GAAI,KAAK,YAAY,CAAA;CAAG,CAAC,CAAC,KAAK,GAAG,GACvE,MACJ;CACA,IAAI,CAAC,MAAM,OAAO,SAAS,KAAK,SAAS,IAAI,CAAC,GAC1C,OAAO;CAEX,IAAI,MAAM,WAAW,KAAK,GACtB,OAAO;CAEX,IAAI,MAAM,MAAM,KAAK,CAAC,CAAC,MAAM,SAAS,KAAK,WAAW,KAAK,CAAC,GACxD,OAAO;CAEX,OAAO,MAAM,SAAS,KAAK,IAAI,IAAI;AACvC;;;;;AAMA,SAAgB,cACZ,QACA,OACA,QACqB;CACrB,MAAM,aAAa,gBAAgB,OAAO,MAAM;CAChD,MAAM,QAAQ,WAAW,MAAM,KAAK,CAAC,CAAC,QAAQ,SAAS,SAAS,EAAE;CAClE,MAAM,QAAQ,OAAO,QAAQ,UAAU,MAAM,YAAY,IAAI;CAC7D,MAAM,SAAS,OAAO,QAAQ,UAAU,MAAM,YAAY,IAAI;CAkB9D,OAAO,CAAC,GAhBJ,MAAM,WAAW,IACX,QACA,MAAM,KAAK,WAAW;EAClB,GAAG;EACH,OAAO,MAAM,MACR,KAAK,MAAM,WAAW;GACnB;GACA;GACA,MAAM,MAAM,MAAM,YAAY,OAAO,MAAM;EAC/C,EAAE,CAAC,CACF,QACI,UAAoD,MAAM,SAAS,IACxE,CAAC,CACA,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CACpD,KAAK,EAAE,WAAW,IAAI;CAC/B,EAAE,GACQ,GAAG,MAAM,CAAC,CAAC,QAAQ,UAAU,MAAM,MAAM,SAAS,CAAC;AAC3E"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Tokens of CommandPalette. */
|
|
2
|
+
export declare const commandPaletteTokens: import("..").ComponentTokens<"command-palette", "panneau-command-palette-width" | "panneau-command-palette-radius" | "panneau-command-palette-bg" | "panneau-command-palette-offset-top" | "panneau-command-palette-list-max-height" | "panneau-command-palette-item-radius" | "panneau-command-palette-item-active-bg">;
|
|
3
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/command-palette/tokens.ts"],"names":[],"mappings":"AAEA,gCAAgC;AAChC,eAAO,MAAM,oBAAoB,0TAe/B,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineComponentTokens } from "../theme/componentTokens.js";
|
|
2
|
+
//#region src/command-palette/tokens.ts
|
|
3
|
+
/** Tokens of CommandPalette. */
|
|
4
|
+
var commandPaletteTokens = defineComponentTokens("command-palette", {
|
|
5
|
+
/** Maximum width. */
|
|
6
|
+
width: "40rem",
|
|
7
|
+
/** Space above the palette, which opens near the top of the screen. */
|
|
8
|
+
"offset-top": "12dvh",
|
|
9
|
+
/** Maximum height of the list of results. */
|
|
10
|
+
"list-max-height": "60dvh",
|
|
11
|
+
/** Background. */
|
|
12
|
+
bg: "var(--panneau-color-surface-raised)",
|
|
13
|
+
/** Corner radius. */
|
|
14
|
+
radius: "var(--panneau-radius-lg)",
|
|
15
|
+
/** Corner radius of the items. */
|
|
16
|
+
"item-radius": "var(--panneau-radius-md)",
|
|
17
|
+
/** Background of the item chosen with the keyboard or the pointer. */
|
|
18
|
+
"item-active-bg": "var(--panneau-color-hover)"
|
|
19
|
+
});
|
|
20
|
+
//#endregion
|
|
21
|
+
export { commandPaletteTokens };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","names":[],"sources":["../../src/command-palette/tokens.ts"],"sourcesContent":["import { defineComponentTokens } from '../theme/componentTokens';\n\n/** Tokens of CommandPalette. */\nexport const commandPaletteTokens = defineComponentTokens('command-palette', {\n /** Maximum width. */\n width: '40rem',\n /** Space above the palette, which opens near the top of the screen. */\n 'offset-top': '12dvh',\n /** Maximum height of the list of results. */\n 'list-max-height': '60dvh',\n /** Background. */\n bg: 'var(--panneau-color-surface-raised)',\n /** Corner radius. */\n radius: 'var(--panneau-radius-lg)',\n /** Corner radius of the items. */\n 'item-radius': 'var(--panneau-radius-md)',\n /** Background of the item chosen with the keyboard or the pointer. */\n 'item-active-bg': 'var(--panneau-color-hover)',\n});\n"],"mappings":";;;AAGA,IAAa,uBAAuB,sBAAsB,mBAAmB;;CAEzE,OAAO;;CAEP,cAAc;;CAEd,mBAAmB;;CAEnB,IAAI;;CAEJ,QAAQ;;CAER,eAAe;;CAEf,kBAAkB;AACtB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Whether the platform's shortcut key is ⌘ (Apple) rather than Ctrl. */
|
|
2
|
+
export declare function isApplePlatform(): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Calls `onToggle` on ⌘K (Apple) or Ctrl+K (elsewhere), to open or close a `CommandPalette`. The
|
|
5
|
+
* key is left alone when something already handled it (an editor that links with Mod-K), when it
|
|
6
|
+
* repeats, during a composition, or when another modal dialog is open while the palette is closed.
|
|
7
|
+
*/
|
|
8
|
+
export declare function useCommandShortcut(onToggle: () => void, { isOpen, enabled }?: {
|
|
9
|
+
isOpen?: boolean;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
}): void;
|
|
12
|
+
//# sourceMappingURL=useCommandShortcut.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommandShortcut.d.ts","sourceRoot":"","sources":["../../src/command-palette/useCommandShortcut.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,MAAM,IAAI,EACpB,EAAE,MAAc,EAAE,OAAc,EAAE,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACjF,IAAI,CA2BN"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
//#region src/command-palette/useCommandShortcut.ts
|
|
3
|
+
/** Whether the platform's shortcut key is ⌘ (Apple) rather than Ctrl. */
|
|
4
|
+
function isApplePlatform() {
|
|
5
|
+
return typeof navigator !== "undefined" && /mac|iphone|ipad|ipod/i.test(navigator.platform);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Calls `onToggle` on ⌘K (Apple) or Ctrl+K (elsewhere), to open or close a `CommandPalette`. The
|
|
9
|
+
* key is left alone when something already handled it (an editor that links with Mod-K), when it
|
|
10
|
+
* repeats, during a composition, or when another modal dialog is open while the palette is closed.
|
|
11
|
+
*/
|
|
12
|
+
function useCommandShortcut(onToggle, { isOpen = false, enabled = true } = {}) {
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
if (!enabled) return;
|
|
15
|
+
const onKeyDown = (event) => {
|
|
16
|
+
const modifier = isApplePlatform() ? event.metaKey : event.ctrlKey;
|
|
17
|
+
if (event.key.toLowerCase() !== "k" || !modifier || event.altKey || event.shiftKey || event.defaultPrevented || event.repeat || event.isComposing) return;
|
|
18
|
+
if (!isOpen && document.querySelector("[role=\"dialog\"][aria-modal=\"true\"]") !== null) return;
|
|
19
|
+
event.preventDefault();
|
|
20
|
+
onToggle();
|
|
21
|
+
};
|
|
22
|
+
window.addEventListener("keydown", onKeyDown);
|
|
23
|
+
return () => window.removeEventListener("keydown", onKeyDown);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { isApplePlatform, useCommandShortcut };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=useCommandShortcut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCommandShortcut.js","names":[],"sources":["../../src/command-palette/useCommandShortcut.ts"],"sourcesContent":["import { useEffect } from 'react';\n\n/** Whether the platform's shortcut key is ⌘ (Apple) rather than Ctrl. */\nexport function isApplePlatform(): boolean {\n return typeof navigator !== 'undefined' && /mac|iphone|ipad|ipod/i.test(navigator.platform);\n}\n\n/**\n * Calls `onToggle` on ⌘K (Apple) or Ctrl+K (elsewhere), to open or close a `CommandPalette`. The\n * key is left alone when something already handled it (an editor that links with Mod-K), when it\n * repeats, during a composition, or when another modal dialog is open while the palette is closed.\n */\nexport function useCommandShortcut(\n onToggle: () => void,\n { isOpen = false, enabled = true }: { isOpen?: boolean; enabled?: boolean } = {},\n): void {\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n const onKeyDown = (event: KeyboardEvent) => {\n const modifier = isApplePlatform() ? event.metaKey : event.ctrlKey;\n if (\n event.key.toLowerCase() !== 'k' ||\n !modifier ||\n event.altKey ||\n event.shiftKey ||\n event.defaultPrevented ||\n event.repeat ||\n event.isComposing\n ) {\n return;\n }\n if (!isOpen && document.querySelector('[role=\"dialog\"][aria-modal=\"true\"]') !== null) {\n return;\n }\n event.preventDefault();\n onToggle();\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n });\n}\n"],"mappings":";;;AAGA,SAAgB,kBAA2B;CACvC,OAAO,OAAO,cAAc,eAAe,wBAAwB,KAAK,UAAU,QAAQ;AAC9F;;;;;;AAOA,SAAgB,mBACZ,UACA,EAAE,SAAS,OAAO,UAAU,SAAkD,CAAC,GAC3E;CACJ,gBAAgB;EACZ,IAAI,CAAC,SACD;EAEJ,MAAM,aAAa,UAAyB;GACxC,MAAM,WAAW,gBAAgB,IAAI,MAAM,UAAU,MAAM;GAC3D,IACI,MAAM,IAAI,YAAY,MAAM,OAC5B,CAAC,YACD,MAAM,UACN,MAAM,YACN,MAAM,oBACN,MAAM,UACN,MAAM,aAEN;GAEJ,IAAI,CAAC,UAAU,SAAS,cAAc,wCAAoC,MAAM,MAC5E;GAEJ,MAAM,eAAe;GACrB,SAAS;EACb;EACA,OAAO,iBAAiB,WAAW,SAAS;EAC5C,aAAa,OAAO,oBAAoB,WAAW,SAAS;CAChE,CAAC;AACL"}
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
.panneau-date-picker-segment[data-type='literal'] {
|
|
23
23
|
padding: 0;
|
|
24
24
|
color: var(--panneau-color-text-muted);
|
|
25
|
+
/* The space of `10/15/2026, 9:30 AM`, which a flex item would drop */
|
|
26
|
+
white-space: pre;
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
.panneau-date-picker-segment[data-placeholder] {
|
|
@@ -57,6 +59,42 @@
|
|
|
57
59
|
outline-offset: -2px;
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
/* As wide as the calendar, not as the field. */
|
|
63
|
+
.panneau-date-picker-popover.panneau-date-picker-popover {
|
|
64
|
+
min-width: 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* The previous and next months. */
|
|
68
|
+
.panneau-date-picker-nav-button {
|
|
69
|
+
display: flex;
|
|
70
|
+
align-items: center;
|
|
71
|
+
justify-content: center;
|
|
72
|
+
width: var(--panneau-calendar-cell-size, 2.25rem);
|
|
73
|
+
height: var(--panneau-calendar-cell-size, 2.25rem);
|
|
74
|
+
padding: 0;
|
|
75
|
+
color: var(--panneau-color-text-muted);
|
|
76
|
+
cursor: pointer;
|
|
77
|
+
background: transparent;
|
|
78
|
+
border: 0;
|
|
79
|
+
border-radius: var(--panneau-calendar-cell-radius, var(--panneau-radius-md));
|
|
80
|
+
outline: none;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.panneau-date-picker-nav-button[data-hovered] {
|
|
84
|
+
color: var(--panneau-color-text);
|
|
85
|
+
background-color: var(--panneau-color-hover);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.panneau-date-picker-nav-button[data-focus-visible] {
|
|
89
|
+
outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
|
|
90
|
+
outline-offset: -2px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.panneau-date-picker-nav-button[data-disabled] {
|
|
94
|
+
cursor: not-allowed;
|
|
95
|
+
opacity: 0.4;
|
|
96
|
+
}
|
|
97
|
+
|
|
60
98
|
.panneau-date-picker-calendar {
|
|
61
99
|
width: max-content;
|
|
62
100
|
max-width: 100%;
|
|
@@ -132,4 +170,6 @@
|
|
|
132
170
|
|
|
133
171
|
.panneau-date-picker-time {
|
|
134
172
|
margin-top: var(--panneau-space-3);
|
|
173
|
+
padding-top: var(--panneau-space-3);
|
|
174
|
+
border-top: var(--panneau-border-width) solid var(--panneau-color-border);
|
|
135
175
|
}
|
|
@@ -6,7 +6,8 @@ export interface DatePickerProps extends Omit<AriaDatePickerProps<DateValue>, 'c
|
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* A date, or a date and time with `granularity="minute"`, typed segment by segment in the order of
|
|
9
|
-
* the locale, or picked in a calendar.
|
|
9
|
+
* the locale, or picked in a calendar. With a time, the calendar has a field for it, and stays
|
|
10
|
+
* open after a day is picked. Values are `@internationalized/date` objects.
|
|
10
11
|
*/
|
|
11
12
|
export declare function DatePicker({ label, description, errors, isRequired, isReadOnly, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, popoverClassName, ...props }: DatePickerProps): import("react").JSX.Element;
|
|
12
13
|
//# sourceMappingURL=DatePicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../src/date-picker/DatePicker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DatePicker.d.ts","sourceRoot":"","sources":["../../src/date-picker/DatePicker.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,eAAe,IAAI,mBAAmB,EAW3C,KAAK,SAAS,EAIjB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,KAAK,gBAAgB,EAKxB,MAAM,qBAAqB,CAAC;AAiC7B,MAAM,WAAW,eACb,SACI,IAAI,CACA,mBAAmB,CAAC,SAAS,CAAC,EAC9B,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAChE,EACD,gBAAgB;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,WAAW,EACX,MAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,GAAG,KAAK,EACX,EAAE,eAAe,+BAgEjB"}
|
|
@@ -1,21 +1,67 @@
|
|
|
1
1
|
import { cx } from "../utils/cx.js";
|
|
2
2
|
import { Icon } from "../icon/Icon.js";
|
|
3
|
+
import { messages } from "../intl/messages.js";
|
|
4
|
+
import { usePanneauIntl } from "../intl/usePanneauIntl.js";
|
|
3
5
|
import Field_module_default from "../field/Field.module.js";
|
|
4
6
|
import { FieldDescription, FieldErrors, FieldLabel } from "../field/FieldParts.js";
|
|
5
7
|
import Popover_module_default from "../popover/Popover.module.js";
|
|
6
8
|
import { PopoverSurface } from "../popover/Popover.js";
|
|
7
9
|
import DatePicker_module_default from "./DatePicker.module.js";
|
|
10
|
+
import { TimeInput } from "../time-input/TimeInput.js";
|
|
8
11
|
import { CalendarDays, ChevronLeft, ChevronRight } from "lucide-react";
|
|
9
|
-
import { Button, Calendar, CalendarCell, CalendarGrid, CalendarGridBody, CalendarGridHeader, CalendarHeaderCell, DateInput, DatePicker, DateSegment, Dialog, Group, Heading } from "react-aria-components";
|
|
12
|
+
import { Button, Calendar, CalendarCell, CalendarGrid, CalendarGridBody, CalendarGridHeader, CalendarHeaderCell, DateInput, DatePicker, DatePickerStateContext, DateSegment, Dialog, Group, Heading } from "react-aria-components";
|
|
10
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
14
|
+
import { use } from "react";
|
|
15
|
+
import { c } from "react/compiler-runtime";
|
|
11
16
|
//#region src/date-picker/DatePicker.tsx
|
|
17
|
+
/** The time of a date and time, under the calendar: the calendar alone can't set it. */
|
|
18
|
+
function CalendarTime() {
|
|
19
|
+
const $ = c(9);
|
|
20
|
+
const intl = usePanneauIntl();
|
|
21
|
+
const state = use(DatePickerStateContext);
|
|
22
|
+
if (state === null || !state.hasTime) return null;
|
|
23
|
+
const granularity = state.granularity === "day" ? "minute" : state.granularity;
|
|
24
|
+
let t0;
|
|
25
|
+
if ($[0] !== intl) {
|
|
26
|
+
t0 = intl.formatMessage(messages.time);
|
|
27
|
+
$[0] = intl;
|
|
28
|
+
$[1] = t0;
|
|
29
|
+
} else t0 = $[1];
|
|
30
|
+
let t1;
|
|
31
|
+
if ($[2] !== state) {
|
|
32
|
+
t1 = (value) => {
|
|
33
|
+
if (value !== null) state.setTimeValue(value);
|
|
34
|
+
};
|
|
35
|
+
$[2] = state;
|
|
36
|
+
$[3] = t1;
|
|
37
|
+
} else t1 = $[3];
|
|
38
|
+
let t2;
|
|
39
|
+
if ($[4] !== granularity || $[5] !== state.timeValue || $[6] !== t0 || $[7] !== t1) {
|
|
40
|
+
t2 = /* @__PURE__ */ jsx(TimeInput, {
|
|
41
|
+
label: t0,
|
|
42
|
+
value: state.timeValue,
|
|
43
|
+
onChange: t1,
|
|
44
|
+
granularity,
|
|
45
|
+
className: DatePicker_module_default.time
|
|
46
|
+
});
|
|
47
|
+
$[4] = granularity;
|
|
48
|
+
$[5] = state.timeValue;
|
|
49
|
+
$[6] = t0;
|
|
50
|
+
$[7] = t1;
|
|
51
|
+
$[8] = t2;
|
|
52
|
+
} else t2 = $[8];
|
|
53
|
+
return t2;
|
|
54
|
+
}
|
|
12
55
|
/**
|
|
13
56
|
* A date, or a date and time with `granularity="minute"`, typed segment by segment in the order of
|
|
14
|
-
* the locale, or picked in a calendar.
|
|
57
|
+
* the locale, or picked in a calendar. With a time, the calendar has a field for it, and stays
|
|
58
|
+
* open after a day is picked. Values are `@internationalized/date` objects.
|
|
15
59
|
*/
|
|
16
60
|
function DatePicker$1({ label, description, errors = [], isRequired, isReadOnly, className, labelClassName, descriptionClassName, errorsClassName, controlClassName, popoverClassName, ...props }) {
|
|
17
61
|
const invalid = errors.length > 0;
|
|
62
|
+
const hasTime = props.granularity === "hour" || props.granularity === "minute" || props.granularity === "second";
|
|
18
63
|
return /* @__PURE__ */ jsxs(DatePicker, {
|
|
64
|
+
shouldCloseOnSelect: !hasTime,
|
|
19
65
|
...props,
|
|
20
66
|
isRequired,
|
|
21
67
|
isReadOnly,
|
|
@@ -51,23 +97,23 @@ function DatePicker$1({ label, description, errors = [], isRequired, isReadOnly,
|
|
|
51
97
|
className: errorsClassName
|
|
52
98
|
}),
|
|
53
99
|
/* @__PURE__ */ jsx(PopoverSurface, {
|
|
54
|
-
className: popoverClassName,
|
|
55
|
-
children: /* @__PURE__ */
|
|
100
|
+
className: cx(DatePicker_module_default.popover, popoverClassName),
|
|
101
|
+
children: /* @__PURE__ */ jsxs(Dialog, {
|
|
56
102
|
className: Popover_module_default.dialog,
|
|
57
|
-
children: /* @__PURE__ */ jsxs(Calendar, {
|
|
103
|
+
children: [/* @__PURE__ */ jsxs(Calendar, {
|
|
58
104
|
className: DatePicker_module_default.calendar,
|
|
59
105
|
children: [/* @__PURE__ */ jsxs("header", {
|
|
60
106
|
className: DatePicker_module_default.header,
|
|
61
107
|
children: [
|
|
62
108
|
/* @__PURE__ */ jsx(Button, {
|
|
63
109
|
slot: "previous",
|
|
64
|
-
className: DatePicker_module_default.
|
|
110
|
+
className: DatePicker_module_default.navButton,
|
|
65
111
|
children: /* @__PURE__ */ jsx(Icon, { icon: ChevronLeft })
|
|
66
112
|
}),
|
|
67
113
|
/* @__PURE__ */ jsx(Heading, { className: DatePicker_module_default.heading }),
|
|
68
114
|
/* @__PURE__ */ jsx(Button, {
|
|
69
115
|
slot: "next",
|
|
70
|
-
className: DatePicker_module_default.
|
|
116
|
+
className: DatePicker_module_default.navButton,
|
|
71
117
|
children: /* @__PURE__ */ jsx(Icon, { icon: ChevronRight })
|
|
72
118
|
})
|
|
73
119
|
]
|
|
@@ -81,7 +127,7 @@ function DatePicker$1({ label, description, errors = [], isRequired, isReadOnly,
|
|
|
81
127
|
className: DatePicker_module_default.cell
|
|
82
128
|
}) })]
|
|
83
129
|
})]
|
|
84
|
-
})
|
|
130
|
+
}), /* @__PURE__ */ jsx(CalendarTime, {})]
|
|
85
131
|
})
|
|
86
132
|
})
|
|
87
133
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.js","names":["DatePicker","AriaDatePicker","fieldStyles","
|
|
1
|
+
{"version":3,"file":"DatePicker.js","names":["granularity","_c","styles","DatePicker","AriaDatePicker","fieldStyles","popoverStyles"],"sources":["../../src/date-picker/DatePicker.tsx"],"sourcesContent":["import { CalendarDays, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { use } from 'react';\nimport {\n DatePicker as AriaDatePicker,\n type DatePickerProps as AriaDatePickerProps,\n Button,\n Calendar,\n CalendarCell,\n CalendarGrid,\n CalendarGridBody,\n CalendarGridHeader,\n CalendarHeaderCell,\n DateInput,\n DatePickerStateContext,\n DateSegment,\n type DateValue,\n Dialog,\n Group,\n Heading,\n} from 'react-aria-components';\n\nimport {\n type FieldChromeProps,\n FieldDescription,\n FieldErrors,\n FieldLabel,\n fieldStyles,\n} from '../field/FieldParts';\nimport { Icon } from '../icon/Icon';\nimport { messages } from '../intl/messages';\nimport { usePanneauIntl } from '../intl/usePanneauIntl';\nimport { PopoverSurface } from '../popover/Popover';\nimport popoverStyles from '../popover/Popover.module.css';\nimport { TimeInput } from '../time-input/TimeInput';\nimport { cx } from '../utils/cx';\nimport styles from './DatePicker.module.css';\n\n/** The time of a date and time, under the calendar: the calendar alone can't set it. */\nfunction CalendarTime() {\n const intl = usePanneauIntl();\n const state = use(DatePickerStateContext);\n if (state === null || !state.hasTime) {\n return null;\n }\n const granularity = state.granularity === 'day' ? 'minute' : state.granularity;\n return (\n <TimeInput\n label={intl.formatMessage(messages.time)}\n value={state.timeValue}\n onChange={(value) => {\n if (value !== null) {\n state.setTimeValue(value);\n }\n }}\n granularity={granularity}\n className={styles.time}\n />\n );\n}\n\nexport interface DatePickerProps\n extends\n Omit<\n AriaDatePickerProps<DateValue>,\n 'className' | 'style' | 'children' | 'isInvalid' | 'validate'\n >,\n FieldChromeProps {\n controlClassName?: string;\n popoverClassName?: string;\n}\n\n/**\n * A date, or a date and time with `granularity=\"minute\"`, typed segment by segment in the order of\n * the locale, or picked in a calendar. With a time, the calendar has a field for it, and stays\n * open after a day is picked. Values are `@internationalized/date` objects.\n */\nexport function DatePicker({\n label,\n description,\n errors = [],\n isRequired,\n isReadOnly,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n popoverClassName,\n ...props\n}: DatePickerProps) {\n const invalid = errors.length > 0;\n const hasTime =\n props.granularity === 'hour' ||\n props.granularity === 'minute' ||\n props.granularity === 'second';\n return (\n <AriaDatePicker\n shouldCloseOnSelect={!hasTime}\n {...props}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={invalid}\n validationBehavior=\"aria\"\n className={cx('panneau-date-picker', fieldStyles.field, className)}\n >\n <FieldLabel isRequired={isRequired} className={labelClassName}>\n {label}\n </FieldLabel>\n <Group\n className={cx(fieldStyles.control, styles.control, controlClassName)}\n data-readonly={isReadOnly || undefined}\n >\n <DateInput className={styles.input}>\n {(segment) => <DateSegment segment={segment} className={styles.segment} />}\n </DateInput>\n {isReadOnly !== true ? (\n <Button className={styles.button}>\n <Icon icon={CalendarDays} />\n </Button>\n ) : null}\n </Group>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n <PopoverSurface className={cx(styles.popover, popoverClassName)}>\n <Dialog className={popoverStyles.dialog}>\n <Calendar className={styles.calendar}>\n <header className={styles.header}>\n <Button slot=\"previous\" className={styles.navButton}>\n <Icon icon={ChevronLeft} />\n </Button>\n <Heading className={styles.heading} />\n <Button slot=\"next\" className={styles.navButton}>\n <Icon icon={ChevronRight} />\n </Button>\n </header>\n <CalendarGrid className={styles.grid}>\n <CalendarGridHeader>\n {(day) => (\n <CalendarHeaderCell className={styles.weekday}>\n {day}\n </CalendarHeaderCell>\n )}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => <CalendarCell date={date} className={styles.cell} />}\n </CalendarGridBody>\n </CalendarGrid>\n </Calendar>\n <CalendarTime />\n </Dialog>\n </PopoverSurface>\n </AriaDatePicker>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAsCA,SAAA,eAAA;CAAA,MAAA,IAAAC,EAAA,CAAA;CACI,MAAA,OAAa,eAAe;CAC5B,MAAA,QAAc,IAAI,sBAAsB;CACxC,IAAI,UAAU,QAAV,CAAmB,MAAK,SAAQ,OACzB;CAEX,MAAA,cAAoB,MAAK,gBAAiB,QAAtB,WAAyC,MAAK;CAAa,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA;EAGhE,KAAA,KAAI,cAAe,SAAQ,IAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAE9B,MAAA,UAAA;GACN,IAAI,UAAU,MACV,MAAK,aAAc,KAAK;EAC3B;EACJ,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,eAAA,EAAA,OAAA,MAAA,aAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAPL,KAAA,oBAAC,WAAD;GACW,OAAA;GACA,OAAA,MAAK;GACF,UAAA;GAKG;GACF,WAAAC,0BAAM;EAAK,CAAA;EACxB,EAAA,KAAA;EAAA,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAVF;AAUE;;;;;;AAoBV,SAAgBC,aAAW,EACvB,OACA,aACA,SAAS,CAAA,GACT,YACA,YACA,WACA,gBACA,sBACA,iBACA,kBACA,kBACA,GAAG,SACa;CAChB,MAAM,UAAU,OAAO,SAAS;CAChC,MAAM,UACF,MAAM,gBAAgB,UACtB,MAAM,gBAAgB,YACtB,MAAM,gBAAgB;CAC1B,OACI,qBAACC,YAAD;EACI,qBAAqB,CAAC;EACtB,GAAI;EACQ;EACA;EACZ,WAAW;EACX,oBAAmB;EACnB,WAAW,GAAG,uBAAuBC,qBAAY,OAAO,SAAS;EAPrE,UAAA;GASI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,qBAAC,OAAD;IACI,WAAW,GAAGA,qBAAY,SAASH,0BAAO,SAAS,gBAAgB;IACnE,iBAAe,cAAc,KAAA;IAFjC,UAAA,CAII,oBAAC,WAAD;KAAW,WAAWA,0BAAO;KACvB,WAAA,YAAY,oBAAC,aAAD;MAAsB;MAAS,WAAWA,0BAAO;KAAQ,CAAA;IAChE,CAAA,GACV,eAAe,OACZ,oBAAC,QAAD;KAAQ,WAAWA,0BAAO;KACtB,UAAA,oBAAC,MAAD,EAAM,MAAM,aAAa,CAAA;IACrB,CAAA,IACR,IACD;;GACP,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;GACxD,oBAAC,gBAAD;IAAgB,WAAW,GAAGA,0BAAO,SAAS,gBAAgB;IAC1D,UAAA,qBAAC,QAAD;KAAQ,WAAWI,uBAAc;KAAjC,UAAA,CACI,qBAAC,UAAD;MAAU,WAAWJ,0BAAO;MAA5B,UAAA,CACI,qBAAC,UAAD;OAAQ,WAAWA,0BAAO;OAA1B,UAAA;QACI,oBAAC,QAAD;SAAQ,MAAK;SAAW,WAAWA,0BAAO;SACtC,UAAA,oBAAC,MAAD,EAAM,MAAM,YAAY,CAAA;QACpB,CAAA;QACR,oBAAC,SAAD,EAAS,WAAWA,0BAAO,QAAQ,CAAA;QACnC,oBAAC,QAAD;SAAQ,MAAK;SAAO,WAAWA,0BAAO;SAClC,UAAA,oBAAC,MAAD,EAAM,MAAM,aAAa,CAAA;QACrB,CAAA;OACJ;MACR,CAAA,GAAA,qBAAC,cAAD;OAAc,WAAWA,0BAAO;OAAhC,UAAA,CACI,oBAAC,oBAAD,EAAA,WACM,QACE,oBAAC,oBAAD;QAAoB,WAAWA,0BAAO;QACjC,UAAA;OACe,CAAA,EAER,CAAA,GACpB,oBAAC,kBAAD,EAAA,WACM,SAAS,oBAAC,cAAD;QAAoB;QAAM,WAAWA,0BAAO;OAAK,CAAA,EAC9C,CAAA,CACR;MACR,CAAA,CAAA;KACV,CAAA,GAAA,oBAAC,cAAD,CAAa,CAAA,CACT;;GACI,CAAA;EACJ;;AAExB"}
|
|
@@ -4,6 +4,8 @@ var control = "panneau-date-picker-control";
|
|
|
4
4
|
var input = "panneau-date-picker-input";
|
|
5
5
|
var segment = "panneau-date-picker-segment";
|
|
6
6
|
var button = "panneau-date-picker-button";
|
|
7
|
+
var popover = "panneau-date-picker-popover";
|
|
8
|
+
var navButton = "panneau-date-picker-nav-button";
|
|
7
9
|
var calendar = "panneau-date-picker-calendar";
|
|
8
10
|
var header = "panneau-date-picker-header";
|
|
9
11
|
var heading = "panneau-date-picker-heading";
|
|
@@ -16,6 +18,8 @@ var DatePicker_module_default = {
|
|
|
16
18
|
input,
|
|
17
19
|
segment,
|
|
18
20
|
button,
|
|
21
|
+
popover,
|
|
22
|
+
navButton,
|
|
19
23
|
calendar,
|
|
20
24
|
header,
|
|
21
25
|
heading,
|
|
@@ -25,6 +29,6 @@ var DatePicker_module_default = {
|
|
|
25
29
|
time
|
|
26
30
|
};
|
|
27
31
|
//#endregion
|
|
28
|
-
export { button, calendar, cell, control, DatePicker_module_default as default, grid, header, heading, input, segment, time, weekday };
|
|
32
|
+
export { button, calendar, cell, control, DatePicker_module_default as default, grid, header, heading, input, navButton, popover, segment, time, weekday };
|
|
29
33
|
|
|
30
34
|
//# sourceMappingURL=DatePicker.module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.module.js","names":[],"sources":["../../src/date-picker/DatePicker.module.css"],"sourcesContent":[".control.control {\n padding-inline-end: 0;\n}\n\n.input {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n.segment {\n padding: 0 0.0625rem;\n border-radius: var(--panneau-radius-sm);\n outline: none;\n caret-color: transparent;\n}\n\n.segment[data-type='literal'] {\n padding: 0;\n color: var(--panneau-color-text-muted);\n}\n\n.segment[data-placeholder] {\n color: var(--panneau-color-text-muted);\n}\n\n.segment[data-focused] {\n color: var(--panneau-color-accent-text);\n background-color: var(--panneau-color-accent);\n}\n\n.button {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: stretch;\n width: 2.25rem;\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.button[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.button[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n}\n\n.calendar {\n width: max-content;\n max-width: 100%;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--panneau-space-2);\n margin-bottom: var(--panneau-space-2);\n}\n\n.heading {\n margin: 0;\n font-size: var(--panneau-font-size-md);\n font-weight: var(--panneau-font-weight-bold);\n text-transform: capitalize;\n}\n\n.grid {\n border-collapse: collapse;\n}\n\n.weekday {\n padding-bottom: var(--panneau-space-1);\n font-size: var(--panneau-font-size-xs);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text-muted);\n}\n\n.cell {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--panneau-calendar-cell-size, 2.25rem);\n height: var(--panneau-calendar-cell-size, 2.25rem);\n font-size: var(--panneau-font-size-md);\n font-variant-numeric: var(--panneau-font-numeric);\n cursor: pointer;\n border-radius: var(--panneau-calendar-cell-radius, var(--panneau-radius-md));\n outline: none;\n}\n\n.cell[data-outside-month] {\n display: none;\n}\n\n.cell[data-hovered] {\n background-color: var(--panneau-color-hover);\n}\n\n.cell[data-selected] {\n color: var(--panneau-calendar-selected-color, var(--panneau-color-accent-text));\n background-color: var(--panneau-calendar-selected-bg, var(--panneau-color-accent));\n}\n\n.cell[data-today]:not([data-selected]) {\n font-weight: var(--panneau-font-weight-bold);\n box-shadow: inset 0 0 0 1px var(--panneau-color-border-control);\n}\n\n.cell[data-disabled],\n.cell[data-unavailable] {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.cell[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.time {\n margin-top: var(--panneau-space-3);\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"DatePicker.module.js","names":[],"sources":["../../src/date-picker/DatePicker.module.css"],"sourcesContent":[".control.control {\n padding-inline-end: 0;\n}\n\n.input {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n.segment {\n padding: 0 0.0625rem;\n border-radius: var(--panneau-radius-sm);\n outline: none;\n caret-color: transparent;\n}\n\n.segment[data-type='literal'] {\n padding: 0;\n color: var(--panneau-color-text-muted);\n /* The space of `10/15/2026, 9:30 AM`, which a flex item would drop */\n white-space: pre;\n}\n\n.segment[data-placeholder] {\n color: var(--panneau-color-text-muted);\n}\n\n.segment[data-focused] {\n color: var(--panneau-color-accent-text);\n background-color: var(--panneau-color-accent);\n}\n\n.button {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: stretch;\n width: 2.25rem;\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.button[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.button[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n}\n\n/* As wide as the calendar, not as the field. */\n.popover.popover {\n min-width: 0;\n}\n\n/* The previous and next months. */\n.navButton {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--panneau-calendar-cell-size, 2.25rem);\n height: var(--panneau-calendar-cell-size, 2.25rem);\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: var(--panneau-calendar-cell-radius, var(--panneau-radius-md));\n outline: none;\n}\n\n.navButton[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.navButton[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n}\n\n.navButton[data-disabled] {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.calendar {\n width: max-content;\n max-width: 100%;\n}\n\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--panneau-space-2);\n margin-bottom: var(--panneau-space-2);\n}\n\n.heading {\n margin: 0;\n font-size: var(--panneau-font-size-md);\n font-weight: var(--panneau-font-weight-bold);\n text-transform: capitalize;\n}\n\n.grid {\n border-collapse: collapse;\n}\n\n.weekday {\n padding-bottom: var(--panneau-space-1);\n font-size: var(--panneau-font-size-xs);\n font-weight: var(--panneau-font-weight-medium);\n color: var(--panneau-color-text-muted);\n}\n\n.cell {\n display: flex;\n align-items: center;\n justify-content: center;\n width: var(--panneau-calendar-cell-size, 2.25rem);\n height: var(--panneau-calendar-cell-size, 2.25rem);\n font-size: var(--panneau-font-size-md);\n font-variant-numeric: var(--panneau-font-numeric);\n cursor: pointer;\n border-radius: var(--panneau-calendar-cell-radius, var(--panneau-radius-md));\n outline: none;\n}\n\n.cell[data-outside-month] {\n display: none;\n}\n\n.cell[data-hovered] {\n background-color: var(--panneau-color-hover);\n}\n\n.cell[data-selected] {\n color: var(--panneau-calendar-selected-color, var(--panneau-color-accent-text));\n background-color: var(--panneau-calendar-selected-bg, var(--panneau-color-accent));\n}\n\n.cell[data-today]:not([data-selected]) {\n font-weight: var(--panneau-font-weight-bold);\n box-shadow: inset 0 0 0 1px var(--panneau-color-border-control);\n}\n\n.cell[data-disabled],\n.cell[data-unavailable] {\n cursor: not-allowed;\n opacity: 0.4;\n}\n\n.cell[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.time {\n margin-top: var(--panneau-space-3);\n padding-top: var(--panneau-space-3);\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n"],"mappings":""}
|
package/dist/dialog/Dialog.css
CHANGED
|
@@ -34,6 +34,10 @@
|
|
|
34
34
|
max-width: var(--panneau-dialog-width-lg, 48rem);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
.panneau-dialog-xl {
|
|
38
|
+
max-width: var(--panneau-dialog-width-xl, 72rem);
|
|
39
|
+
}
|
|
40
|
+
|
|
37
41
|
.panneau-dialog-modal[data-entering] {
|
|
38
42
|
animation: panneau-dialog-rise var(--panneau-duration) ease-out;
|
|
39
43
|
}
|
|
@@ -58,8 +62,16 @@
|
|
|
58
62
|
var(--panneau-dialog-padding-x, var(--panneau-space-5));
|
|
59
63
|
}
|
|
60
64
|
|
|
65
|
+
.panneau-dialog-header-content {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex: 0 1 auto;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: var(--panneau-space-2);
|
|
70
|
+
min-width: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
61
73
|
.panneau-dialog-title {
|
|
62
|
-
flex: 1 1
|
|
74
|
+
flex: 1 1 12rem;
|
|
63
75
|
min-width: 0;
|
|
64
76
|
padding-top: var(--panneau-space-1);
|
|
65
77
|
font-size: var(--panneau-dialog-title-font-size, var(--panneau-font-size-lg));
|
|
@@ -96,7 +108,8 @@
|
|
|
96
108
|
|
|
97
109
|
.panneau-dialog-modal,
|
|
98
110
|
.panneau-dialog-sm,
|
|
99
|
-
.panneau-dialog-lg
|
|
111
|
+
.panneau-dialog-lg,
|
|
112
|
+
.panneau-dialog-xl {
|
|
100
113
|
max-width: none;
|
|
101
114
|
max-height: calc(100dvh - var(--panneau-space-8));
|
|
102
115
|
}
|
|
@@ -107,6 +120,27 @@
|
|
|
107
120
|
padding-bottom: env(safe-area-inset-bottom);
|
|
108
121
|
}
|
|
109
122
|
|
|
123
|
+
/* The whole screen, under the notch. */
|
|
124
|
+
.panneau-dialog-full-screen-on-phone {
|
|
125
|
+
height: 100dvh;
|
|
126
|
+
max-height: 100dvh;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.panneau-dialog-full-screen-on-phone .panneau-dialog {
|
|
130
|
+
border-radius: 0;
|
|
131
|
+
padding-top: env(safe-area-inset-top);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* The header's content goes under the title and the close button. */
|
|
135
|
+
.panneau-dialog-header {
|
|
136
|
+
flex-wrap: wrap;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.panneau-dialog-header-content {
|
|
140
|
+
flex: 1 1 100%;
|
|
141
|
+
order: 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
110
144
|
.panneau-dialog-footer {
|
|
111
145
|
flex-direction: column-reverse;
|
|
112
146
|
}
|