@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.
Files changed (121) hide show
  1. package/README.md +55 -2
  2. package/dist/command-palette/CommandPalette.css +299 -0
  3. package/dist/command-palette/CommandPalette.d.ts +37 -0
  4. package/dist/command-palette/CommandPalette.d.ts.map +1 -0
  5. package/dist/command-palette/CommandPalette.js +194 -0
  6. package/dist/command-palette/CommandPalette.js.map +1 -0
  7. package/dist/command-palette/CommandPalette.module.js +62 -0
  8. package/dist/command-palette/CommandPalette.module.js.map +1 -0
  9. package/dist/command-palette/match.d.ts +39 -0
  10. package/dist/command-palette/match.d.ts.map +1 -0
  11. package/dist/command-palette/match.js +44 -0
  12. package/dist/command-palette/match.js.map +1 -0
  13. package/dist/command-palette/tokens.d.ts +3 -0
  14. package/dist/command-palette/tokens.d.ts.map +1 -0
  15. package/dist/command-palette/tokens.js +23 -0
  16. package/dist/command-palette/tokens.js.map +1 -0
  17. package/dist/command-palette/useCommandShortcut.d.ts +12 -0
  18. package/dist/command-palette/useCommandShortcut.d.ts.map +1 -0
  19. package/dist/command-palette/useCommandShortcut.js +29 -0
  20. package/dist/command-palette/useCommandShortcut.js.map +1 -0
  21. package/dist/date-picker/DatePicker.css +40 -0
  22. package/dist/date-picker/DatePicker.d.ts +2 -1
  23. package/dist/date-picker/DatePicker.d.ts.map +1 -1
  24. package/dist/date-picker/DatePicker.js +54 -8
  25. package/dist/date-picker/DatePicker.js.map +1 -1
  26. package/dist/date-picker/DatePicker.module.js +5 -1
  27. package/dist/date-picker/DatePicker.module.js.map +1 -1
  28. package/dist/dialog/Dialog.css +36 -2
  29. package/dist/dialog/Dialog.d.ts +15 -3
  30. package/dist/dialog/Dialog.d.ts.map +1 -1
  31. package/dist/dialog/Dialog.js +22 -14
  32. package/dist/dialog/Dialog.js.map +1 -1
  33. package/dist/dialog/Dialog.module.js +8 -2
  34. package/dist/dialog/Dialog.module.js.map +1 -1
  35. package/dist/dialog/tokens.d.ts +1 -1
  36. package/dist/dialog/tokens.d.ts.map +1 -1
  37. package/dist/dialog/tokens.js +2 -0
  38. package/dist/dialog/tokens.js.map +1 -1
  39. package/dist/field/Field.css +9 -0
  40. package/dist/field/Field.module.js.map +1 -1
  41. package/dist/index.d.ts +9 -2
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +10 -3
  44. package/dist/menu/Menu.css +84 -0
  45. package/dist/menu/Menu.d.ts +33 -6
  46. package/dist/menu/Menu.d.ts.map +1 -1
  47. package/dist/menu/Menu.js +110 -25
  48. package/dist/menu/Menu.js.map +1 -1
  49. package/dist/menu/Menu.module.js +22 -0
  50. package/dist/menu/Menu.module.js.map +1 -0
  51. package/dist/menu/tokens.d.ts +3 -0
  52. package/dist/menu/tokens.d.ts.map +1 -0
  53. package/dist/menu/tokens.js +31 -0
  54. package/dist/menu/tokens.js.map +1 -0
  55. package/dist/number-input/NumberInput.css +18 -0
  56. package/dist/number-input/NumberInput.js +1 -1
  57. package/dist/number-input/NumberInput.js.map +1 -1
  58. package/dist/number-input/NumberInput.module.js +3 -1
  59. package/dist/number-input/NumberInput.module.js.map +1 -1
  60. package/dist/pill-trigger/PillTrigger.css +104 -0
  61. package/dist/pill-trigger/PillTrigger.d.ts +20 -0
  62. package/dist/pill-trigger/PillTrigger.d.ts.map +1 -0
  63. package/dist/pill-trigger/PillTrigger.js +38 -0
  64. package/dist/pill-trigger/PillTrigger.js.map +1 -0
  65. package/dist/pill-trigger/PillTrigger.module.js +18 -0
  66. package/dist/pill-trigger/PillTrigger.module.js.map +1 -0
  67. package/dist/pill-trigger/tokens.d.ts +3 -0
  68. package/dist/pill-trigger/tokens.d.ts.map +1 -0
  69. package/dist/pill-trigger/tokens.js +37 -0
  70. package/dist/pill-trigger/tokens.js.map +1 -0
  71. package/dist/radio-group/RadioGroup.css +90 -0
  72. package/dist/radio-group/RadioGroup.d.ts +22 -3
  73. package/dist/radio-group/RadioGroup.d.ts.map +1 -1
  74. package/dist/radio-group/RadioGroup.js +42 -21
  75. package/dist/radio-group/RadioGroup.js.map +1 -1
  76. package/dist/radio-group/RadioGroup.module.js +12 -2
  77. package/dist/radio-group/RadioGroup.module.js.map +1 -1
  78. package/dist/radio-group/tokens.d.ts +2 -2
  79. package/dist/radio-group/tokens.d.ts.map +1 -1
  80. package/dist/radio-group/tokens.js +22 -2
  81. package/dist/radio-group/tokens.js.map +1 -1
  82. package/dist/segmented-control/SegmentedControl.css +83 -0
  83. package/dist/segmented-control/SegmentedControl.d.ts +35 -0
  84. package/dist/segmented-control/SegmentedControl.d.ts.map +1 -0
  85. package/dist/segmented-control/SegmentedControl.js +44 -0
  86. package/dist/segmented-control/SegmentedControl.js.map +1 -0
  87. package/dist/segmented-control/SegmentedControl.module.js +16 -0
  88. package/dist/segmented-control/SegmentedControl.module.js.map +1 -0
  89. package/dist/segmented-control/tokens.d.ts +3 -0
  90. package/dist/segmented-control/tokens.d.ts.map +1 -0
  91. package/dist/segmented-control/tokens.js +29 -0
  92. package/dist/segmented-control/tokens.js.map +1 -0
  93. package/dist/select/ListBox.css +23 -1
  94. package/dist/select/ListBox.module.js +2 -2
  95. package/dist/select/ListBox.module.js.map +1 -1
  96. package/dist/select/listBoxTokens.d.ts +1 -1
  97. package/dist/select/listBoxTokens.d.ts.map +1 -1
  98. package/dist/select/listBoxTokens.js +2 -0
  99. package/dist/select/listBoxTokens.js.map +1 -1
  100. package/dist/slider/Slider.css +84 -0
  101. package/dist/slider/Slider.d.ts +20 -0
  102. package/dist/slider/Slider.d.ts.map +1 -0
  103. package/dist/slider/Slider.js +70 -0
  104. package/dist/slider/Slider.js.map +1 -0
  105. package/dist/slider/Slider.module.js +20 -0
  106. package/dist/slider/Slider.module.js.map +1 -0
  107. package/dist/tags-input/TagsInput.css +60 -0
  108. package/dist/tags-input/TagsInput.d.ts +32 -0
  109. package/dist/tags-input/TagsInput.d.ts.map +1 -0
  110. package/dist/tags-input/TagsInput.js +160 -0
  111. package/dist/tags-input/TagsInput.js.map +1 -0
  112. package/dist/tags-input/TagsInput.module.js +20 -0
  113. package/dist/tags-input/TagsInput.module.js.map +1 -0
  114. package/dist/text-input/TextInput.d.ts.map +1 -1
  115. package/dist/text-input/TextInput.js +2 -0
  116. package/dist/text-input/TextInput.js.map +1 -1
  117. package/dist/theme/components.d.ts +7 -3
  118. package/dist/theme/components.d.ts.map +1 -1
  119. package/dist/theme/components.js +8 -0
  120. package/dist/theme/components.js.map +1 -1
  121. package/package.json +3 -3
package/dist/menu/Menu.js CHANGED
@@ -2,45 +2,130 @@ import { cx } from "../utils/cx.js";
2
2
  import { Icon } from "../icon/Icon.js";
3
3
  import { PopoverSurface } from "../popover/Popover.js";
4
4
  import ListBox_module_default from "../select/ListBox.module.js";
5
- import { Menu, MenuItem, MenuTrigger, Separator, Text } from "react-aria-components";
6
- import { jsx, jsxs } from "react/jsx-runtime";
5
+ import Menu_module_default from "./Menu.module.js";
6
+ import { Check } from "lucide-react";
7
+ import { Header, Menu, MenuItem, MenuSection, MenuTrigger, Separator, Text } from "react-aria-components";
8
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
+ import { useId } from "react";
7
10
  import { c } from "react/compiler-runtime";
8
11
  //#region src/menu/Menu.tsx
9
12
  /**
10
13
  * A menu of actions, inside a `MenuTrigger` with its button as the first child. Arrow keys move
11
- * between items, and typing a letter jumps to an item.
14
+ * between items, and typing a letter jumps to an item. With `selectionMode` (`single` or
15
+ * `multiple`) and `selectedKeys`, its items are choices, and the selected ones have a check.
12
16
  */
13
- function Menu$1({ className, popoverClassName, placement = "bottom start", ...props }) {
17
+ function Menu$1({ className, popoverClassName, placement = "bottom start", footer, footerClassName, ...props }) {
18
+ const footerId = useId();
19
+ const hasFooter = footer !== void 0 && footer !== null;
20
+ const menu = /* @__PURE__ */ jsx(Menu, {
21
+ ...props,
22
+ "aria-describedby": hasFooter ? [props["aria-describedby"], footerId].filter(Boolean).join(" ") : props["aria-describedby"],
23
+ className: cx("panneau-menu", ListBox_module_default.listBox, className)
24
+ });
14
25
  return /* @__PURE__ */ jsx(PopoverSurface, {
15
26
  placement,
16
27
  className: popoverClassName,
17
- children: /* @__PURE__ */ jsx(Menu, {
18
- ...props,
19
- className: cx("panneau-menu", ListBox_module_default.listBox, className)
20
- })
28
+ children: hasFooter ? /* @__PURE__ */ jsxs("div", {
29
+ className: Menu_module_default.layout,
30
+ children: [menu, /* @__PURE__ */ jsx("div", {
31
+ id: footerId,
32
+ className: cx(Menu_module_default.footer, footerClassName),
33
+ children: footer
34
+ })]
35
+ }) : menu
21
36
  });
22
37
  }
23
- /** An item of a `Menu`. */
24
- function MenuItem$1({ children, icon, description, isDanger = false, className, textValue, ...props }) {
25
- return /* @__PURE__ */ jsxs(MenuItem, {
38
+ /**
39
+ * An item of a `Menu`. In a menu with a `selectionMode`, a selected item has a check at its end,
40
+ * and the role of a radio (single) or a checkbox (multiple) item.
41
+ */
42
+ function MenuItem$1({ children, icon, media, description, isDanger = false, className, textValue, ...props }) {
43
+ return /* @__PURE__ */ jsx(MenuItem, {
26
44
  ...props,
27
45
  textValue: textValue ?? (typeof children === "string" ? children : void 0),
28
- className: cx("panneau-menu-item", ListBox_module_default.item, className),
46
+ className: cx("panneau-menu-item", ListBox_module_default.item, Menu_module_default.item, className),
29
47
  "data-danger": isDanger || void 0,
30
- children: [icon !== void 0 ? /* @__PURE__ */ jsx(Icon, { icon }) : null, /* @__PURE__ */ jsxs("span", {
31
- className: ListBox_module_default.itemText,
32
- children: [/* @__PURE__ */ jsx(Text, {
33
- slot: "label",
34
- className: ListBox_module_default.itemLabel,
35
- children
36
- }), description !== void 0 ? /* @__PURE__ */ jsx(Text, {
37
- slot: "description",
38
- className: ListBox_module_default.itemDescription,
39
- children: description
40
- }) : null]
41
- })]
48
+ children: ({ isSelected, selectionMode }) => /* @__PURE__ */ jsxs(Fragment, { children: [
49
+ media !== void 0 && media !== null ? /* @__PURE__ */ jsx("span", {
50
+ className: Menu_module_default.media,
51
+ children: media
52
+ }) : icon !== void 0 ? /* @__PURE__ */ jsx(Icon, { icon }) : null,
53
+ /* @__PURE__ */ jsxs("span", {
54
+ className: ListBox_module_default.itemText,
55
+ children: [/* @__PURE__ */ jsx(Text, {
56
+ slot: "label",
57
+ className: ListBox_module_default.itemLabel,
58
+ children
59
+ }), description !== void 0 ? /* @__PURE__ */ jsx(Text, {
60
+ slot: "description",
61
+ className: ListBox_module_default.itemDescription,
62
+ children: description
63
+ }) : null]
64
+ }),
65
+ selectionMode !== "none" ? /* @__PURE__ */ jsx("span", {
66
+ className: Menu_module_default.check,
67
+ children: isSelected ? /* @__PURE__ */ jsx(Icon, {
68
+ icon: Check,
69
+ size: "sm"
70
+ }) : null
71
+ }) : null
72
+ ] })
42
73
  });
43
74
  }
75
+ /** A group of items of a `Menu`, with a header. */
76
+ function MenuSection$1(t0) {
77
+ const $ = c(16);
78
+ let children;
79
+ let className;
80
+ let headerClassName;
81
+ let props;
82
+ let title;
83
+ if ($[0] !== t0) {
84
+ ({title, children, className, headerClassName, ...props} = t0);
85
+ $[0] = t0;
86
+ $[1] = children;
87
+ $[2] = className;
88
+ $[3] = headerClassName;
89
+ $[4] = props;
90
+ $[5] = title;
91
+ } else {
92
+ children = $[1];
93
+ className = $[2];
94
+ headerClassName = $[3];
95
+ props = $[4];
96
+ title = $[5];
97
+ }
98
+ let t1;
99
+ if ($[6] !== className) {
100
+ t1 = cx(Menu_module_default.section, className);
101
+ $[6] = className;
102
+ $[7] = t1;
103
+ } else t1 = $[7];
104
+ let t2;
105
+ if ($[8] !== headerClassName || $[9] !== title) {
106
+ t2 = title !== void 0 && title !== null ? /* @__PURE__ */ jsx(Header, {
107
+ className: cx(Menu_module_default.header, headerClassName),
108
+ children: title
109
+ }) : null;
110
+ $[8] = headerClassName;
111
+ $[9] = title;
112
+ $[10] = t2;
113
+ } else t2 = $[10];
114
+ let t3;
115
+ if ($[11] !== children || $[12] !== props || $[13] !== t1 || $[14] !== t2) {
116
+ t3 = /* @__PURE__ */ jsxs(MenuSection, {
117
+ ...props,
118
+ className: t1,
119
+ children: [t2, children]
120
+ });
121
+ $[11] = children;
122
+ $[12] = props;
123
+ $[13] = t1;
124
+ $[14] = t2;
125
+ $[15] = t3;
126
+ } else t3 = $[15];
127
+ return t3;
128
+ }
44
129
  /** A line between groups of menu items. */
45
130
  function MenuSeparator() {
46
131
  const $ = c(1);
@@ -52,6 +137,6 @@ function MenuSeparator() {
52
137
  return t0;
53
138
  }
54
139
  //#endregion
55
- export { Menu$1 as Menu, MenuItem$1 as MenuItem, MenuSeparator, MenuTrigger };
140
+ export { Menu$1 as Menu, MenuItem$1 as MenuItem, MenuSection$1 as MenuSection, MenuSeparator, MenuTrigger };
56
141
 
57
142
  //# sourceMappingURL=Menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.js","names":["Menu","AriaMenu","styles","MenuItem","AriaMenuItem","_c"],"sources":["../../src/menu/Menu.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n type MenuItemProps as AriaMenuItemProps,\n type MenuProps as AriaMenuProps,\n Separator,\n Text,\n} from 'react-aria-components';\n\nimport { Icon, type IconComponent } from '../icon/Icon';\nimport { PopoverSurface } from '../popover/Popover';\nimport styles from '../select/ListBox.module.css';\nimport { cx } from '../utils/cx';\n\nexport interface MenuProps<T extends object> extends Omit<AriaMenuProps<T>, 'className' | 'style'> {\n className?: string;\n popoverClassName?: string;\n placement?: 'bottom start' | 'bottom end' | 'top start' | 'top end';\n}\n\n/**\n * A menu of actions, inside a `MenuTrigger` with its button as the first child. Arrow keys move\n * between items, and typing a letter jumps to an item.\n */\nexport function Menu<T extends object>({\n className,\n popoverClassName,\n placement = 'bottom start',\n ...props\n}: MenuProps<T>) {\n return (\n <PopoverSurface placement={placement} className={popoverClassName}>\n <AriaMenu {...props} className={cx('panneau-menu', styles.listBox, className)} />\n </PopoverSurface>\n );\n}\n\nexport interface MenuItemProps extends Omit<AriaMenuItemProps, 'className' | 'style' | 'children'> {\n children?: ReactNode;\n icon?: IconComponent;\n description?: string;\n /** Styles the item as destructive. */\n isDanger?: boolean;\n className?: string;\n}\n\n/** An item of a `Menu`. */\nexport function MenuItem({\n children,\n icon,\n description,\n isDanger = false,\n className,\n textValue,\n ...props\n}: MenuItemProps) {\n return (\n <AriaMenuItem\n {...props}\n textValue={textValue ?? (typeof children === 'string' ? children : undefined)}\n className={cx('panneau-menu-item', styles.item, className)}\n data-danger={isDanger || undefined}\n >\n {icon !== undefined ? <Icon icon={icon} /> : null}\n <span className={styles.itemText}>\n <Text slot=\"label\" className={styles.itemLabel}>\n {children}\n </Text>\n {description !== undefined ? (\n <Text slot=\"description\" className={styles.itemDescription}>\n {description}\n </Text>\n ) : null}\n </span>\n </AriaMenuItem>\n );\n}\n\n/** A line between groups of menu items. */\nexport function MenuSeparator() {\n return <Separator className={styles.separator} />;\n}\n\nexport { MenuTrigger } from 'react-aria-components';\n"],"mappings":";;;;;;;;;;;;AAyBA,SAAgBA,OAAuB,EACnC,WACA,kBACA,YAAY,gBACZ,GAAG,SACU;CACb,OACI,oBAAC,gBAAD;EAA2B;EAAW,WAAW;EAC7C,UAAA,oBAACC,MAAD;GAAU,GAAI;GAAO,WAAW,GAAG,gBAAgBC,uBAAO,SAAS,SAAS;EAAE,CAAA;CAClE,CAAA;AAExB;;AAYA,SAAgBC,WAAS,EACrB,UACA,MACA,aACA,WAAW,OACX,WACA,WACA,GAAG,SACW;CACd,OACI,qBAACC,UAAD;EACI,GAAI;EACJ,WAAW,cAAc,OAAO,aAAa,WAAW,WAAW,KAAA;EACnE,WAAW,GAAG,qBAAqBF,uBAAO,MAAM,SAAS;EACzD,eAAa,YAAY,KAAA;EAJ7B,UAAA,CAMK,SAAS,KAAA,IAAY,oBAAC,MAAD,EAAY,KAAK,CAAA,IAAM,MAC7C,qBAAC,QAAD;GAAM,WAAWA,uBAAO;GAAxB,UAAA,CACI,oBAAC,MAAD;IAAM,MAAK;IAAQ,WAAWA,uBAAO;IAChC;GACC,CAAA,GACL,gBAAgB,KAAA,IACb,oBAAC,MAAD;IAAM,MAAK;IAAc,WAAWA,uBAAO;IACtC,UAAA;GACC,CAAA,IACN,IACF;EACI,CAAA,CAAA;;AAEtB;;AAGA,SAAO,gBAAA;CAAA,MAAA,IAAAG,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA,IAAA,2BAAA,GAAA;EACI,KAAA,oBAAC,WAAD,EAAsB,WAAAH,uBAAM,UAAU,CAAA;EAAI,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAA1C;AAA0C"}
1
+ {"version":3,"file":"Menu.js","names":["title","children","Menu","AriaMenu","listBoxStyles","styles","MenuItem","AriaMenuItem","_Fragment","MenuSection","_c","AriaMenuSection"],"sources":["../../src/menu/Menu.tsx"],"sourcesContent":["import { Check } from 'lucide-react';\nimport { type ReactNode, useId } from 'react';\nimport {\n Menu as AriaMenu,\n MenuItem as AriaMenuItem,\n type MenuItemProps as AriaMenuItemProps,\n type MenuProps as AriaMenuProps,\n MenuSection as AriaMenuSection,\n type MenuSectionProps as AriaMenuSectionProps,\n Header,\n Separator,\n Text,\n} from 'react-aria-components';\n\nimport { Icon, type IconComponent } from '../icon/Icon';\nimport { PopoverSurface } from '../popover/Popover';\nimport listBoxStyles from '../select/ListBox.module.css';\nimport { cx } from '../utils/cx';\nimport styles from './Menu.module.css';\n\nexport interface MenuProps<T extends object> extends Omit<AriaMenuProps<T>, 'className' | 'style'> {\n className?: string;\n popoverClassName?: string;\n placement?: 'bottom start' | 'bottom end' | 'top start' | 'top end';\n /**\n * A short note under the items, after a line, such as \"Only this step changes.\". It isn't an\n * item and can't be focused: the menu is described by it.\n */\n footer?: ReactNode;\n footerClassName?: string;\n}\n\n/**\n * A menu of actions, inside a `MenuTrigger` with its button as the first child. Arrow keys move\n * between items, and typing a letter jumps to an item. With `selectionMode` (`single` or\n * `multiple`) and `selectedKeys`, its items are choices, and the selected ones have a check.\n */\nexport function Menu<T extends object>({\n className,\n popoverClassName,\n placement = 'bottom start',\n footer,\n footerClassName,\n ...props\n}: MenuProps<T>) {\n const footerId = useId();\n const hasFooter = footer !== undefined && footer !== null;\n const menu = (\n <AriaMenu\n {...props}\n aria-describedby={\n hasFooter\n ? [props['aria-describedby'], footerId].filter(Boolean).join(' ')\n : props['aria-describedby']\n }\n className={cx('panneau-menu', listBoxStyles.listBox, className)}\n />\n );\n return (\n <PopoverSurface placement={placement} className={popoverClassName}>\n {hasFooter ? (\n <div className={styles.layout}>\n {menu}\n <div id={footerId} className={cx(styles.footer, footerClassName)}>\n {footer}\n </div>\n </div>\n ) : (\n menu\n )}\n </PopoverSurface>\n );\n}\n\nexport interface MenuItemProps extends Omit<AriaMenuItemProps, 'className' | 'style' | 'children'> {\n children?: ReactNode;\n icon?: IconComponent;\n /**\n * Leading media instead of an icon, such as an avatar or an image, sized with the item: larger\n * when the item has a description.\n */\n media?: ReactNode;\n description?: string;\n /** Styles the item as destructive. */\n isDanger?: boolean;\n className?: string;\n}\n\n/**\n * An item of a `Menu`. In a menu with a `selectionMode`, a selected item has a check at its end,\n * and the role of a radio (single) or a checkbox (multiple) item.\n */\nexport function MenuItem({\n children,\n icon,\n media,\n description,\n isDanger = false,\n className,\n textValue,\n ...props\n}: MenuItemProps) {\n return (\n <AriaMenuItem\n {...props}\n textValue={textValue ?? (typeof children === 'string' ? children : undefined)}\n className={cx('panneau-menu-item', listBoxStyles.item, styles.item, className)}\n data-danger={isDanger || undefined}\n >\n {({ isSelected, selectionMode }) => (\n <>\n {media !== undefined && media !== null ? (\n <span className={styles.media}>{media}</span>\n ) : icon !== undefined ? (\n <Icon icon={icon} />\n ) : null}\n <span className={listBoxStyles.itemText}>\n <Text slot=\"label\" className={listBoxStyles.itemLabel}>\n {children}\n </Text>\n {description !== undefined ? (\n <Text slot=\"description\" className={listBoxStyles.itemDescription}>\n {description}\n </Text>\n ) : null}\n </span>\n {selectionMode !== 'none' ? (\n <span className={styles.check}>\n {isSelected ? <Icon icon={Check} size=\"sm\" /> : null}\n </span>\n ) : null}\n </>\n )}\n </AriaMenuItem>\n );\n}\n\nexport interface MenuSectionProps<T extends object> extends Omit<\n AriaMenuSectionProps<T>,\n 'className' | 'style' | 'children' | 'items'\n> {\n /**\n * The header of the section, a small muted eyebrow above its items, such as \"Publish on\". It\n * labels the group. Without it, give the section an `aria-label`.\n */\n title?: ReactNode;\n children?: ReactNode;\n className?: string;\n headerClassName?: string;\n}\n\n/** A group of items of a `Menu`, with a header. */\nexport function MenuSection<T extends object>({\n title,\n children,\n className,\n headerClassName,\n ...props\n}: MenuSectionProps<T>) {\n return (\n <AriaMenuSection {...props} className={cx(styles.section, className)}>\n {title !== undefined && title !== null ? (\n <Header className={cx(styles.header, headerClassName)}>{title}</Header>\n ) : null}\n {children}\n </AriaMenuSection>\n );\n}\n\n/** A line between groups of menu items. */\nexport function MenuSeparator() {\n return <Separator className={listBoxStyles.separator} />;\n}\n\nexport { MenuTrigger } from 'react-aria-components';\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import "./Menu.css";
2
+ //#region src/menu/Menu.module.css
3
+ var layout = "panneau-menu-layout";
4
+ var section = "panneau-menu-section";
5
+ var header = "panneau-menu-header";
6
+ var footer = "panneau-menu-footer";
7
+ var media = "panneau-menu-media";
8
+ var item = "panneau-menu-item";
9
+ var check = "panneau-menu-check";
10
+ var Menu_module_default = {
11
+ layout,
12
+ section,
13
+ header,
14
+ footer,
15
+ media,
16
+ item,
17
+ check
18
+ };
19
+ //#endregion
20
+ export { check, Menu_module_default as default, footer, header, item, layout, media, section };
21
+
22
+ //# sourceMappingURL=Menu.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.module.js","names":[],"sources":["../../src/menu/Menu.module.css"],"sourcesContent":["/* Parts of menus on top of the options of ListBox.module.css: sections, footer, media, selection. */\n\n/* A menu with a footer: the items scroll, the footer stays under them. */\n.layout {\n display: flex;\n flex-direction: column;\n max-height: inherit;\n}\n\n.layout > [role='menu'] {\n flex: 1 1 auto;\n min-height: 0;\n}\n\n.section + .section {\n margin-top: var(--panneau-space-1);\n}\n\n.header {\n padding: var(--panneau-space-2) var(--panneau-list-box-item-padding-x, var(--panneau-space-2))\n var(--panneau-space-1);\n font-size: var(--panneau-menu-header-font-size, var(--panneau-font-size-xs));\n font-weight: var(--panneau-menu-header-font-weight, var(--panneau-font-weight-medium));\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-menu-header-color, var(--panneau-color-text-muted));\n text-transform: var(--panneau-menu-header-text-transform, uppercase);\n letter-spacing: var(--panneau-menu-header-letter-spacing, 0.04em);\n}\n\n.footer {\n flex: 0 0 auto;\n padding: var(--panneau-space-2)\n calc(\n var(--panneau-list-box-padding, var(--panneau-space-1)) +\n var(--panneau-list-box-item-padding-x, var(--panneau-space-2))\n );\n font-size: var(--panneau-menu-footer-font-size, var(--panneau-font-size-xs));\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-menu-footer-color, var(--panneau-color-text-muted));\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.media {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--panneau-menu-media-size, 1.5rem);\n height: var(--panneau-menu-media-size, 1.5rem);\n overflow: hidden;\n border-radius: var(--panneau-menu-media-radius, var(--panneau-radius-full));\n}\n\n.item:has([slot='description']) .media {\n width: var(--panneau-menu-media-size-described, 2rem);\n height: var(--panneau-menu-media-size-described, 2rem);\n}\n\n.media > :is(img, svg, video, picture) {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n/* The check of a selected item, at its end. */\n.check {\n display: inline-flex;\n flex: 0 0 auto;\n justify-content: flex-end;\n width: 1rem;\n color: var(--panneau-color-text);\n}\n\n.item[data-selected] {\n background-color: var(--panneau-menu-item-bg-selected, var(--panneau-color-surface-sunken));\n}\n\n/* A focused or hovered selected item: the hover color over the selected background. */\n.item[data-selected]:is([data-focused], [data-hovered]) {\n background-image: linear-gradient(\n var(--panneau-list-box-item-bg-hover, var(--panneau-color-hover)),\n var(--panneau-list-box-item-bg-hover, var(--panneau-color-hover))\n );\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Tokens of Menu: its sections, its footer, and the media and selection of its items. */
2
+ export declare const menuTokens: import("..").ComponentTokens<"menu", "panneau-menu-header-font-size" | "panneau-menu-header-font-weight" | "panneau-menu-header-color" | "panneau-menu-header-text-transform" | "panneau-menu-header-letter-spacing" | "panneau-menu-footer-font-size" | "panneau-menu-footer-color" | "panneau-menu-media-size" | "panneau-menu-media-size-described" | "panneau-menu-media-radius" | "panneau-menu-item-bg-selected">;
3
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/menu/tokens.ts"],"names":[],"mappings":"AAEA,0FAA0F;AAC1F,eAAO,MAAM,UAAU,yZAuBrB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { defineComponentTokens } from "../theme/componentTokens.js";
2
+ //#region src/menu/tokens.ts
3
+ /** Tokens of Menu: its sections, its footer, and the media and selection of its items. */
4
+ var menuTokens = defineComponentTokens("menu", {
5
+ /** Font size of the header of a section. */
6
+ "header-font-size": "var(--panneau-font-size-xs)",
7
+ /** Font weight of the header of a section. */
8
+ "header-font-weight": "var(--panneau-font-weight-medium)",
9
+ /** Color of the header of a section. */
10
+ "header-color": "var(--panneau-color-text-muted)",
11
+ /** Case of the header of a section: `uppercase` makes it an eyebrow, `none` keeps its text. */
12
+ "header-text-transform": "uppercase",
13
+ /** Letter spacing of the header of a section. */
14
+ "header-letter-spacing": "0.04em",
15
+ /** Font size of the footer note. */
16
+ "footer-font-size": "var(--panneau-font-size-xs)",
17
+ /** Color of the footer note. */
18
+ "footer-color": "var(--panneau-color-text-muted)",
19
+ /** Size of the leading media of an item. */
20
+ "media-size": "1.5rem",
21
+ /** Size of the leading media of an item with a description, on two lines. */
22
+ "media-size-described": "2rem",
23
+ /** Corner radius of the leading media of an item: its content is clipped to it. */
24
+ "media-radius": "var(--panneau-radius-full)",
25
+ /** Background of a selected item. */
26
+ "item-bg-selected": "var(--panneau-color-surface-sunken)"
27
+ });
28
+ //#endregion
29
+ export { menuTokens };
30
+
31
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","names":[],"sources":["../../src/menu/tokens.ts"],"sourcesContent":["import { defineComponentTokens } from '../theme/componentTokens';\n\n/** Tokens of Menu: its sections, its footer, and the media and selection of its items. */\nexport const menuTokens = defineComponentTokens('menu', {\n /** Font size of the header of a section. */\n 'header-font-size': 'var(--panneau-font-size-xs)',\n /** Font weight of the header of a section. */\n 'header-font-weight': 'var(--panneau-font-weight-medium)',\n /** Color of the header of a section. */\n 'header-color': 'var(--panneau-color-text-muted)',\n /** Case of the header of a section: `uppercase` makes it an eyebrow, `none` keeps its text. */\n 'header-text-transform': 'uppercase',\n /** Letter spacing of the header of a section. */\n 'header-letter-spacing': '0.04em',\n /** Font size of the footer note. */\n 'footer-font-size': 'var(--panneau-font-size-xs)',\n /** Color of the footer note. */\n 'footer-color': 'var(--panneau-color-text-muted)',\n /** Size of the leading media of an item. */\n 'media-size': '1.5rem',\n /** Size of the leading media of an item with a description, on two lines. */\n 'media-size-described': '2rem',\n /** Corner radius of the leading media of an item: its content is clipped to it. */\n 'media-radius': 'var(--panneau-radius-full)',\n /** Background of a selected item. */\n 'item-bg-selected': 'var(--panneau-color-surface-sunken)',\n});\n"],"mappings":";;;AAGA,IAAa,aAAa,sBAAsB,QAAQ;;CAEpD,oBAAoB;;CAEpB,sBAAsB;;CAEtB,gBAAgB;;CAEhB,yBAAyB;;CAEzB,yBAAyB;;CAEzB,oBAAoB;;CAEpB,gBAAgB;;CAEhB,cAAc;;CAEd,wBAAwB;;CAExB,gBAAgB;;CAEhB,oBAAoB;AACxB,CAAC"}
@@ -3,10 +3,24 @@
3
3
  overflow: hidden;
4
4
  }
5
5
 
6
+ /* Without steppers, the control has its padding back. */
7
+ .panneau-number-input-control.panneau-number-input-control[data-readonly] {
8
+ padding-inline-end: var(--panneau-input-padding-x, var(--panneau-control-padding-x));
9
+ }
10
+
6
11
  .panneau-number-input-input {
7
12
  font-variant-numeric: var(--panneau-font-numeric);
8
13
  }
9
14
 
15
+ /* The suffix sits between the value and the steppers, which have no padding of their own. */
16
+ .panneau-number-input-suffix.panneau-number-input-suffix {
17
+ margin-inline: var(--panneau-space-2);
18
+ }
19
+
20
+ .panneau-number-input-control[data-readonly] .panneau-number-input-suffix {
21
+ margin-inline-end: 0;
22
+ }
23
+
10
24
  .panneau-number-input-steppers {
11
25
  display: flex;
12
26
  flex-direction: column;
@@ -54,4 +68,8 @@
54
68
  .panneau-number-input-control.panneau-number-input-control {
55
69
  padding-inline-end: var(--panneau-space-3);
56
70
  }
71
+
72
+ .panneau-number-input-suffix.panneau-number-input-suffix {
73
+ margin-inline-end: 0;
74
+ }
57
75
  }
@@ -42,7 +42,7 @@ function NumberInput({ label, description, errors = [], value, defaultValue, onC
42
42
  className: cx(Field_module_default.bare, NumberInput_module_default.input, inputClassName)
43
43
  }),
44
44
  suffix !== void 0 ? /* @__PURE__ */ jsx("span", {
45
- className: Field_module_default.adornment,
45
+ className: cx(Field_module_default.adornment, NumberInput_module_default.suffix),
46
46
  children: suffix
47
47
  }) : null,
48
48
  isReadOnly !== true ? /* @__PURE__ */ jsxs("span", {
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.js","names":["fieldStyles","styles"],"sources":["../../src/number-input/NumberInput.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n type NumberFieldProps as AriaNumberFieldProps,\n Button,\n Group,\n Input,\n NumberField,\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 { cx } from '../utils/cx';\nimport styles from './NumberInput.module.css';\n\nexport interface NumberInputProps\n extends\n Omit<\n AriaNumberFieldProps,\n | 'className'\n | 'style'\n | 'children'\n | 'isInvalid'\n | 'validate'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n >,\n FieldChromeProps {\n /** The number, or `null` when empty. */\n value?: number | null;\n defaultValue?: number | null;\n /** Called with the number, or `null` when the input is cleared. */\n onChange?: (value: number | null) => void;\n placeholder?: string;\n /** Content after the number, inside the control: a unit. */\n suffix?: ReactNode;\n controlClassName?: string;\n inputClassName?: string;\n}\n\nfunction toAria(value: number | null | undefined): number | undefined {\n return value === null ? Number.NaN : value;\n}\n\n/**\n * A number input, formatted for the locale, with steppers and arrow keys. An empty input is\n * `null`, not `NaN`.\n */\nexport function NumberInput({\n label,\n description,\n errors = [],\n value,\n defaultValue,\n onChange,\n placeholder,\n suffix,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n inputClassName,\n isRequired,\n isReadOnly,\n ...props\n}: NumberInputProps) {\n const invalid = errors.length > 0;\n return (\n <NumberField\n {...props}\n value={toAria(value)}\n defaultValue={toAria(defaultValue)}\n onChange={(next) => onChange?.(Number.isNaN(next) ? null : next)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={invalid}\n validationBehavior=\"aria\"\n className={cx('panneau-number-input', 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-invalid={invalid || undefined}\n data-readonly={isReadOnly || undefined}\n >\n <Input\n placeholder={placeholder}\n className={cx(fieldStyles.bare, styles.input, inputClassName)}\n />\n {suffix !== undefined ? (\n <span className={fieldStyles.adornment}>{suffix}</span>\n ) : null}\n {isReadOnly !== true ? (\n <span className={styles.steppers}>\n <Button slot=\"increment\" className={styles.stepper}>\n <Icon icon={ChevronUp} size=\"xs\" />\n </Button>\n <Button slot=\"decrement\" className={styles.stepper}>\n <Icon icon={ChevronDown} size=\"xs\" />\n </Button>\n </span>\n ) : null}\n </Group>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </NumberField>\n );\n}\n"],"mappings":";;;;;;;;;AA+CA,SAAS,OAAO,OAAsD;CAClE,OAAO,UAAU,OAAO,MAAa;AACzC;;;;;AAMA,SAAgB,YAAY,EACxB,OACA,aACA,SAAS,CAAA,GACT,OACA,cACA,UACA,aACA,QACA,WACA,gBACA,sBACA,iBACA,kBACA,gBACA,YACA,YACA,GAAG,SACc;CACjB,MAAM,UAAU,OAAO,SAAS;CAChC,OACI,qBAAC,aAAD;EACI,GAAI;EACJ,OAAO,OAAO,KAAK;EACnB,cAAc,OAAO,YAAY;EACjC,WAAW,SAAS,WAAW,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI;EACnD;EACA;EACZ,WAAW;EACX,oBAAmB;EACnB,WAAW,GAAG,wBAAwBA,qBAAY,OAAO,SAAS;EATtE,UAAA;GAWI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,qBAAC,OAAD;IACI,WAAW,GAAGA,qBAAY,SAASC,2BAAO,SAAS,gBAAgB;IACnE,gBAAc,WAAW,KAAA;IACzB,iBAAe,cAAc,KAAA;IAHjC,UAAA;KAKI,oBAAC,OAAD;MACiB;MACb,WAAW,GAAGD,qBAAY,MAAMC,2BAAO,OAAO,cAAc;KAAE,CAAA;KAEjE,WAAW,KAAA,IACR,oBAAC,QAAD;MAAM,WAAWD,qBAAY;MAAY,UAAA;KAAa,CAAA,IACtD;KACH,eAAe,OACZ,qBAAC,QAAD;MAAM,WAAWC,2BAAO;MAAxB,UAAA,CACI,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAW,MAAK;OAAI,CAAA;MAC5B,CAAA,GACR,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAa,MAAK;OAAI,CAAA;MAC9B,CAAA,CACN;KACN,CAAA,IAAA;IACD;;GACP,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EAC/C;;AAErB"}
1
+ {"version":3,"file":"NumberInput.js","names":["fieldStyles","styles"],"sources":["../../src/number-input/NumberInput.tsx"],"sourcesContent":["import { ChevronDown, ChevronUp } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n type NumberFieldProps as AriaNumberFieldProps,\n Button,\n Group,\n Input,\n NumberField,\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 { cx } from '../utils/cx';\nimport styles from './NumberInput.module.css';\n\nexport interface NumberInputProps\n extends\n Omit<\n AriaNumberFieldProps,\n | 'className'\n | 'style'\n | 'children'\n | 'isInvalid'\n | 'validate'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n >,\n FieldChromeProps {\n /** The number, or `null` when empty. */\n value?: number | null;\n defaultValue?: number | null;\n /** Called with the number, or `null` when the input is cleared. */\n onChange?: (value: number | null) => void;\n placeholder?: string;\n /** Content after the number, inside the control: a unit. */\n suffix?: ReactNode;\n controlClassName?: string;\n inputClassName?: string;\n}\n\nfunction toAria(value: number | null | undefined): number | undefined {\n return value === null ? Number.NaN : value;\n}\n\n/**\n * A number input, formatted for the locale, with steppers and arrow keys. An empty input is\n * `null`, not `NaN`.\n */\nexport function NumberInput({\n label,\n description,\n errors = [],\n value,\n defaultValue,\n onChange,\n placeholder,\n suffix,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n controlClassName,\n inputClassName,\n isRequired,\n isReadOnly,\n ...props\n}: NumberInputProps) {\n const invalid = errors.length > 0;\n return (\n <NumberField\n {...props}\n value={toAria(value)}\n defaultValue={toAria(defaultValue)}\n onChange={(next) => onChange?.(Number.isNaN(next) ? null : next)}\n isRequired={isRequired}\n isReadOnly={isReadOnly}\n isInvalid={invalid}\n validationBehavior=\"aria\"\n className={cx('panneau-number-input', 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-invalid={invalid || undefined}\n data-readonly={isReadOnly || undefined}\n >\n <Input\n placeholder={placeholder}\n className={cx(fieldStyles.bare, styles.input, inputClassName)}\n />\n {suffix !== undefined ? (\n <span className={cx(fieldStyles.adornment, styles.suffix)}>{suffix}</span>\n ) : null}\n {isReadOnly !== true ? (\n <span className={styles.steppers}>\n <Button slot=\"increment\" className={styles.stepper}>\n <Icon icon={ChevronUp} size=\"xs\" />\n </Button>\n <Button slot=\"decrement\" className={styles.stepper}>\n <Icon icon={ChevronDown} size=\"xs\" />\n </Button>\n </span>\n ) : null}\n </Group>\n <FieldDescription className={descriptionClassName}>{description}</FieldDescription>\n <FieldErrors errors={errors} className={errorsClassName} />\n </NumberField>\n );\n}\n"],"mappings":";;;;;;;;;AA+CA,SAAS,OAAO,OAAsD;CAClE,OAAO,UAAU,OAAO,MAAa;AACzC;;;;;AAMA,SAAgB,YAAY,EACxB,OACA,aACA,SAAS,CAAA,GACT,OACA,cACA,UACA,aACA,QACA,WACA,gBACA,sBACA,iBACA,kBACA,gBACA,YACA,YACA,GAAG,SACc;CACjB,MAAM,UAAU,OAAO,SAAS;CAChC,OACI,qBAAC,aAAD;EACI,GAAI;EACJ,OAAO,OAAO,KAAK;EACnB,cAAc,OAAO,YAAY;EACjC,WAAW,SAAS,WAAW,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI;EACnD;EACA;EACZ,WAAW;EACX,oBAAmB;EACnB,WAAW,GAAG,wBAAwBA,qBAAY,OAAO,SAAS;EATtE,UAAA;GAWI,oBAAC,YAAD;IAAwB;IAAY,WAAW;IAC1C,UAAA;GACO,CAAA;GACZ,qBAAC,OAAD;IACI,WAAW,GAAGA,qBAAY,SAASC,2BAAO,SAAS,gBAAgB;IACnE,gBAAc,WAAW,KAAA;IACzB,iBAAe,cAAc,KAAA;IAHjC,UAAA;KAKI,oBAAC,OAAD;MACiB;MACb,WAAW,GAAGD,qBAAY,MAAMC,2BAAO,OAAO,cAAc;KAAE,CAAA;KAEjE,WAAW,KAAA,IACR,oBAAC,QAAD;MAAM,WAAW,GAAGD,qBAAY,WAAWC,2BAAO,MAAM;MAAI,UAAA;KAAa,CAAA,IACzE;KACH,eAAe,OACZ,qBAAC,QAAD;MAAM,WAAWA,2BAAO;MAAxB,UAAA,CACI,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAW,MAAK;OAAI,CAAA;MAC5B,CAAA,GACR,oBAAC,QAAD;OAAQ,MAAK;OAAY,WAAWA,2BAAO;OACvC,UAAA,oBAAC,MAAD;QAAM,MAAM;QAAa,MAAK;OAAI,CAAA;MAC9B,CAAA,CACN;KACN,CAAA,IAAA;IACD;;GACP,oBAAC,kBAAD;IAAkB,WAAW;IAAuB,UAAA;GAA8B,CAAA;GAClF,oBAAC,aAAD;IAAqB;IAAQ,WAAW;GAAgB,CAAA;EAC/C;;AAErB"}
@@ -2,15 +2,17 @@ import "./NumberInput.css";
2
2
  //#region src/number-input/NumberInput.module.css
3
3
  var control = "panneau-number-input-control";
4
4
  var input = "panneau-number-input-input";
5
+ var suffix = "panneau-number-input-suffix";
5
6
  var steppers = "panneau-number-input-steppers";
6
7
  var stepper = "panneau-number-input-stepper";
7
8
  var NumberInput_module_default = {
8
9
  control,
9
10
  input,
11
+ suffix,
10
12
  steppers,
11
13
  stepper
12
14
  };
13
15
  //#endregion
14
- export { control, NumberInput_module_default as default, input, stepper, steppers };
16
+ export { control, NumberInput_module_default as default, input, stepper, steppers, suffix };
15
17
 
16
18
  //# sourceMappingURL=NumberInput.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.module.js","names":[],"sources":["../../src/number-input/NumberInput.module.css"],"sourcesContent":[".control.control {\n padding-inline-end: 0;\n overflow: hidden;\n}\n\n.input {\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n.steppers {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper {\n display: flex;\n flex: 1 1 0;\n align-items: center;\n justify-content: center;\n width: var(--panneau-number-input-stepper-width, 1.75rem);\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.stepper + .stepper {\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.stepper[data-pressed] {\n background-color: var(--panneau-color-pressed);\n}\n\n.stepper[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Touch screens have their own keyboard for numbers: the steppers would be too small. */\n@media (pointer: coarse) {\n .steppers {\n display: none;\n }\n\n .control.control {\n padding-inline-end: var(--panneau-space-3);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"NumberInput.module.js","names":[],"sources":["../../src/number-input/NumberInput.module.css"],"sourcesContent":[".control.control {\n padding-inline-end: 0;\n overflow: hidden;\n}\n\n/* Without steppers, the control has its padding back. */\n.control.control[data-readonly] {\n padding-inline-end: var(--panneau-input-padding-x, var(--panneau-control-padding-x));\n}\n\n.input {\n font-variant-numeric: var(--panneau-font-numeric);\n}\n\n/* The suffix sits between the value and the steppers, which have no padding of their own. */\n.suffix.suffix {\n margin-inline: var(--panneau-space-2);\n}\n\n.control[data-readonly] .suffix {\n margin-inline-end: 0;\n}\n\n.steppers {\n display: flex;\n flex-direction: column;\n align-self: stretch;\n border-inline-start: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper {\n display: flex;\n flex: 1 1 0;\n align-items: center;\n justify-content: center;\n width: var(--panneau-number-input-stepper-width, 1.75rem);\n padding: 0;\n color: var(--panneau-color-text-muted);\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n\n.stepper + .stepper {\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n.stepper[data-hovered] {\n color: var(--panneau-color-text);\n background-color: var(--panneau-color-hover);\n}\n\n.stepper[data-pressed] {\n background-color: var(--panneau-color-pressed);\n}\n\n.stepper[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* Touch screens have their own keyboard for numbers: the steppers would be too small. */\n@media (pointer: coarse) {\n .steppers {\n display: none;\n }\n\n .control.control {\n padding-inline-end: var(--panneau-space-3);\n }\n\n .suffix.suffix {\n margin-inline-end: 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,104 @@
1
+ /* A compact rounded button that shows a current value: the trigger of a menu or a popover. */
2
+
3
+ .panneau-pill-trigger {
4
+ display: inline-flex;
5
+ flex: 0 1 auto;
6
+ align-items: center;
7
+ gap: var(--panneau-pill-trigger-gap, var(--panneau-space-2));
8
+ max-width: 100%;
9
+ min-height: var(--panneau-control-height);
10
+ padding: 0 var(--panneau-pill-trigger-padding-x, var(--panneau-space-3));
11
+ font-family: inherit;
12
+ font-size: var(--panneau-pill-trigger-font-size, var(--panneau-font-size-md));
13
+ font-weight: var(--panneau-pill-trigger-font-weight, var(--panneau-font-weight-medium));
14
+ line-height: var(--panneau-line-height-tight);
15
+ color: var(--panneau-pill-trigger-color, var(--panneau-color-text));
16
+ text-align: start;
17
+ white-space: nowrap;
18
+ cursor: pointer;
19
+ user-select: none;
20
+ background-color: var(--panneau-pill-trigger-bg, var(--panneau-color-surface-sunken));
21
+ border: var(--panneau-border-width) solid var(--panneau-pill-trigger-border-color, transparent);
22
+ border-radius: var(--panneau-pill-trigger-radius, var(--panneau-radius-full));
23
+ transition: background-color var(--panneau-duration);
24
+ -webkit-tap-highlight-color: transparent;
25
+ }
26
+
27
+ .panneau-pill-trigger[data-hovered],
28
+ .panneau-pill-trigger[data-pressed],
29
+ .panneau-pill-trigger[aria-expanded='true'] {
30
+ background-color: var(
31
+ --panneau-pill-trigger-bg-hover,
32
+ color-mix(in srgb, var(--panneau-color-text) 8%, var(--panneau-color-surface-sunken))
33
+ );
34
+ }
35
+
36
+ .panneau-pill-trigger[data-focus-visible] {
37
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
38
+ outline-offset: 2px;
39
+ }
40
+
41
+ .panneau-pill-trigger[data-disabled] {
42
+ cursor: not-allowed;
43
+ opacity: 0.55;
44
+ }
45
+
46
+ /* With media, the media sits as far from the start as from the top and the bottom. */
47
+ .panneau-pill-trigger:has(.panneau-pill-trigger-media) {
48
+ padding-inline-start: calc(
49
+ (var(--panneau-control-height) - var(--panneau-pill-trigger-media-size, 1.5rem)) / 2 -
50
+ var(--panneau-border-width)
51
+ );
52
+ }
53
+
54
+ .panneau-pill-trigger-sm {
55
+ min-height: var(--panneau-control-height-sm);
56
+ padding: 0 var(--panneau-pill-trigger-padding-x-sm, var(--panneau-space-2));
57
+ font-size: var(--panneau-pill-trigger-font-size-sm, var(--panneau-font-size-sm));
58
+ }
59
+
60
+ .panneau-pill-trigger-sm:has(.panneau-pill-trigger-media) {
61
+ padding-inline-start: calc(
62
+ (var(--panneau-control-height-sm) - var(--panneau-pill-trigger-media-size-sm, 1.25rem)) /
63
+ 2 - var(--panneau-border-width)
64
+ );
65
+ }
66
+
67
+ .panneau-pill-trigger-media {
68
+ display: inline-flex;
69
+ flex: 0 0 auto;
70
+ align-items: center;
71
+ justify-content: center;
72
+ width: var(--panneau-pill-trigger-media-size, 1.5rem);
73
+ height: var(--panneau-pill-trigger-media-size, 1.5rem);
74
+ overflow: hidden;
75
+ border-radius: var(--panneau-pill-trigger-media-radius, var(--panneau-radius-full));
76
+ }
77
+
78
+ .panneau-pill-trigger-sm .panneau-pill-trigger-media {
79
+ width: var(--panneau-pill-trigger-media-size-sm, 1.25rem);
80
+ height: var(--panneau-pill-trigger-media-size-sm, 1.25rem);
81
+ }
82
+
83
+ .panneau-pill-trigger-media > :is(img, svg, video, picture) {
84
+ width: 100%;
85
+ height: 100%;
86
+ object-fit: cover;
87
+ }
88
+
89
+ .panneau-pill-trigger-value {
90
+ flex: 0 1 auto;
91
+ min-width: 0;
92
+ overflow: hidden;
93
+ text-overflow: ellipsis;
94
+ }
95
+
96
+ .panneau-pill-trigger-chevron {
97
+ flex: 0 0 auto;
98
+ color: var(--panneau-color-text-muted);
99
+ transition: rotate var(--panneau-duration);
100
+ }
101
+
102
+ .panneau-pill-trigger[aria-expanded='true'] .panneau-pill-trigger-chevron {
103
+ rotate: 180deg;
104
+ }
@@ -0,0 +1,20 @@
1
+ import type { CSSProperties, ReactNode } from 'react';
2
+ import { type ButtonProps as AriaButtonProps } from 'react-aria-components';
3
+ export interface PillTriggerProps extends Omit<AriaButtonProps, 'className' | 'style' | 'children'> {
4
+ /** The current value, shown inline. */
5
+ children?: ReactNode;
6
+ /** Leading media, such as an avatar or an image, clipped to a circle by default. */
7
+ media?: ReactNode;
8
+ /** Defaults to `md`, the height of a control. */
9
+ size?: 'sm' | 'md';
10
+ className?: string;
11
+ style?: CSSProperties;
12
+ }
13
+ /**
14
+ * A compact rounded button that shows a current value, with an optional leading media and a
15
+ * chevron: the trigger of a `Menu` (in a `MenuTrigger`) or a `Popover` (in a `PopoverTrigger`).
16
+ * Its accessible name is its value: give it an `aria-label` that contains the value when the
17
+ * value alone doesn't say what it picks.
18
+ */
19
+ export declare function PillTrigger({ children, media, size, className, ...props }: PillTriggerProps): import("react").JSX.Element;
20
+ //# sourceMappingURL=PillTrigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PillTrigger.d.ts","sourceRoot":"","sources":["../../src/pill-trigger/PillTrigger.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAwB,KAAK,WAAW,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMlG,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC1C,eAAe,EACf,WAAW,GAAG,OAAO,GAAG,UAAU,CACrC;IACG,uCAAuC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,oFAAoF;IACpF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iDAAiD;IACjD,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EACxB,QAAQ,EACR,KAAK,EACL,IAAW,EACX,SAAS,EACT,GAAG,KAAK,EACX,EAAE,gBAAgB,+BAkBlB"}
@@ -0,0 +1,38 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Icon } from "../icon/Icon.js";
3
+ import PillTrigger_module_default from "./PillTrigger.module.js";
4
+ import { ChevronDown } from "lucide-react";
5
+ import { Button } from "react-aria-components";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/pill-trigger/PillTrigger.tsx
8
+ /**
9
+ * A compact rounded button that shows a current value, with an optional leading media and a
10
+ * chevron: the trigger of a `Menu` (in a `MenuTrigger`) or a `Popover` (in a `PopoverTrigger`).
11
+ * Its accessible name is its value: give it an `aria-label` that contains the value when the
12
+ * value alone doesn't say what it picks.
13
+ */
14
+ function PillTrigger({ children, media, size = "md", className, ...props }) {
15
+ return /* @__PURE__ */ jsxs(Button, {
16
+ ...props,
17
+ className: cx("panneau-pill-trigger", PillTrigger_module_default.pillTrigger, size === "sm" && PillTrigger_module_default.sm, className),
18
+ children: [
19
+ media !== void 0 && media !== null ? /* @__PURE__ */ jsx("span", {
20
+ className: PillTrigger_module_default.media,
21
+ children: media
22
+ }) : null,
23
+ /* @__PURE__ */ jsx("span", {
24
+ className: PillTrigger_module_default.value,
25
+ children
26
+ }),
27
+ /* @__PURE__ */ jsx(Icon, {
28
+ icon: ChevronDown,
29
+ size: "sm",
30
+ className: PillTrigger_module_default.chevron
31
+ })
32
+ ]
33
+ });
34
+ }
35
+ //#endregion
36
+ export { PillTrigger };
37
+
38
+ //# sourceMappingURL=PillTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PillTrigger.js","names":["AriaButton","styles"],"sources":["../../src/pill-trigger/PillTrigger.tsx"],"sourcesContent":["import { ChevronDown } from 'lucide-react';\nimport type { CSSProperties, ReactNode } from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\n\nimport { Icon } from '../icon/Icon';\nimport { cx } from '../utils/cx';\nimport styles from './PillTrigger.module.css';\n\nexport interface PillTriggerProps extends Omit<\n AriaButtonProps,\n 'className' | 'style' | 'children'\n> {\n /** The current value, shown inline. */\n children?: ReactNode;\n /** Leading media, such as an avatar or an image, clipped to a circle by default. */\n media?: ReactNode;\n /** Defaults to `md`, the height of a control. */\n size?: 'sm' | 'md';\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * A compact rounded button that shows a current value, with an optional leading media and a\n * chevron: the trigger of a `Menu` (in a `MenuTrigger`) or a `Popover` (in a `PopoverTrigger`).\n * Its accessible name is its value: give it an `aria-label` that contains the value when the\n * value alone doesn't say what it picks.\n */\nexport function PillTrigger({\n children,\n media,\n size = 'md',\n className,\n ...props\n}: PillTriggerProps) {\n return (\n <AriaButton\n {...props}\n className={cx(\n 'panneau-pill-trigger',\n styles.pillTrigger,\n size === 'sm' && styles.sm,\n className,\n )}\n >\n {media !== undefined && media !== null ? (\n <span className={styles.media}>{media}</span>\n ) : null}\n <span className={styles.value}>{children}</span>\n <Icon icon={ChevronDown} size=\"sm\" className={styles.chevron} />\n </AriaButton>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4BA,SAAgB,YAAY,EACxB,UACA,OACA,OAAO,MACP,WACA,GAAG,SACc;CACjB,OACI,qBAACA,QAAD;EACI,GAAI;EACJ,WAAW,GACP,wBACAC,2BAAO,aACP,SAAS,QAAQA,2BAAO,IACxB,SACJ;EAPJ,UAAA;GASK,UAAU,KAAA,KAAa,UAAU,OAC9B,oBAAC,QAAD;IAAM,WAAWA,2BAAO;IAAQ,UAAA;GAAY,CAAA,IAC5C;GACJ,oBAAC,QAAD;IAAM,WAAWA,2BAAO;IAAQ;GAAe,CAAA;GAC/C,oBAAC,MAAD;IAAM,MAAM;IAAa,MAAK;IAAK,WAAWA,2BAAO;GAAQ,CAAA;EACrD;;AAEpB"}
@@ -0,0 +1,18 @@
1
+ import "./PillTrigger.css";
2
+ //#region src/pill-trigger/PillTrigger.module.css
3
+ var pillTrigger = "panneau-pill-trigger";
4
+ var media = "panneau-pill-trigger-media";
5
+ var sm = "panneau-pill-trigger-sm";
6
+ var value = "panneau-pill-trigger-value";
7
+ var chevron = "panneau-pill-trigger-chevron";
8
+ var PillTrigger_module_default = {
9
+ pillTrigger,
10
+ media,
11
+ sm,
12
+ value,
13
+ chevron
14
+ };
15
+ //#endregion
16
+ export { chevron, PillTrigger_module_default as default, media, pillTrigger, sm, value };
17
+
18
+ //# sourceMappingURL=PillTrigger.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PillTrigger.module.js","names":[],"sources":["../../src/pill-trigger/PillTrigger.module.css"],"sourcesContent":["/* A compact rounded button that shows a current value: the trigger of a menu or a popover. */\n\n.pillTrigger {\n display: inline-flex;\n flex: 0 1 auto;\n align-items: center;\n gap: var(--panneau-pill-trigger-gap, var(--panneau-space-2));\n max-width: 100%;\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-pill-trigger-padding-x, var(--panneau-space-3));\n font-family: inherit;\n font-size: var(--panneau-pill-trigger-font-size, var(--panneau-font-size-md));\n font-weight: var(--panneau-pill-trigger-font-weight, var(--panneau-font-weight-medium));\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-pill-trigger-color, var(--panneau-color-text));\n text-align: start;\n white-space: nowrap;\n cursor: pointer;\n user-select: none;\n background-color: var(--panneau-pill-trigger-bg, var(--panneau-color-surface-sunken));\n border: var(--panneau-border-width) solid var(--panneau-pill-trigger-border-color, transparent);\n border-radius: var(--panneau-pill-trigger-radius, var(--panneau-radius-full));\n transition: background-color var(--panneau-duration);\n -webkit-tap-highlight-color: transparent;\n}\n\n.pillTrigger[data-hovered],\n.pillTrigger[data-pressed],\n.pillTrigger[aria-expanded='true'] {\n background-color: var(\n --panneau-pill-trigger-bg-hover,\n color-mix(in srgb, var(--panneau-color-text) 8%, var(--panneau-color-surface-sunken))\n );\n}\n\n.pillTrigger[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 2px;\n}\n\n.pillTrigger[data-disabled] {\n cursor: not-allowed;\n opacity: 0.55;\n}\n\n/* With media, the media sits as far from the start as from the top and the bottom. */\n.pillTrigger:has(.media) {\n padding-inline-start: calc(\n (var(--panneau-control-height) - var(--panneau-pill-trigger-media-size, 1.5rem)) / 2 -\n var(--panneau-border-width)\n );\n}\n\n.sm {\n min-height: var(--panneau-control-height-sm);\n padding: 0 var(--panneau-pill-trigger-padding-x-sm, var(--panneau-space-2));\n font-size: var(--panneau-pill-trigger-font-size-sm, var(--panneau-font-size-sm));\n}\n\n.sm:has(.media) {\n padding-inline-start: calc(\n (var(--panneau-control-height-sm) - var(--panneau-pill-trigger-media-size-sm, 1.25rem)) /\n 2 - var(--panneau-border-width)\n );\n}\n\n.media {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: var(--panneau-pill-trigger-media-size, 1.5rem);\n height: var(--panneau-pill-trigger-media-size, 1.5rem);\n overflow: hidden;\n border-radius: var(--panneau-pill-trigger-media-radius, var(--panneau-radius-full));\n}\n\n.sm .media {\n width: var(--panneau-pill-trigger-media-size-sm, 1.25rem);\n height: var(--panneau-pill-trigger-media-size-sm, 1.25rem);\n}\n\n.media > :is(img, svg, video, picture) {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.value {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.chevron {\n flex: 0 0 auto;\n color: var(--panneau-color-text-muted);\n transition: rotate var(--panneau-duration);\n}\n\n.pillTrigger[aria-expanded='true'] .chevron {\n rotate: 180deg;\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Tokens of PillTrigger. */
2
+ export declare const pillTriggerTokens: import("..").ComponentTokens<"pill-trigger", "panneau-pill-trigger-color" | "panneau-pill-trigger-radius" | "panneau-pill-trigger-gap" | "panneau-pill-trigger-padding-x" | "panneau-pill-trigger-font-size" | "panneau-pill-trigger-font-weight" | "panneau-pill-trigger-padding-x-sm" | "panneau-pill-trigger-font-size-sm" | "panneau-pill-trigger-bg" | "panneau-pill-trigger-border-color" | "panneau-pill-trigger-media-size" | "panneau-pill-trigger-media-radius" | "panneau-pill-trigger-bg-hover" | "panneau-pill-trigger-media-size-sm">;
3
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/pill-trigger/tokens.ts"],"names":[],"mappings":"AAEA,6BAA6B;AAC7B,eAAO,MAAM,iBAAiB,qhBA8B5B,CAAC"}