@panneau/ui 5.0.0-alpha.4 → 5.0.0-alpha.5

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 (69) hide show
  1. package/README.md +2 -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 +4 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +6 -2
  44. package/dist/segmented-control/SegmentedControl.css +83 -0
  45. package/dist/segmented-control/SegmentedControl.d.ts +35 -0
  46. package/dist/segmented-control/SegmentedControl.d.ts.map +1 -0
  47. package/dist/segmented-control/SegmentedControl.js +44 -0
  48. package/dist/segmented-control/SegmentedControl.js.map +1 -0
  49. package/dist/segmented-control/SegmentedControl.module.js +16 -0
  50. package/dist/segmented-control/SegmentedControl.module.js.map +1 -0
  51. package/dist/segmented-control/tokens.d.ts +3 -0
  52. package/dist/segmented-control/tokens.d.ts.map +1 -0
  53. package/dist/segmented-control/tokens.js +29 -0
  54. package/dist/segmented-control/tokens.js.map +1 -0
  55. package/dist/select/ListBox.css +8 -1
  56. package/dist/select/ListBox.module.js +2 -2
  57. package/dist/select/ListBox.module.js.map +1 -1
  58. package/dist/select/listBoxTokens.d.ts +1 -1
  59. package/dist/select/listBoxTokens.d.ts.map +1 -1
  60. package/dist/select/listBoxTokens.js +2 -0
  61. package/dist/select/listBoxTokens.js.map +1 -1
  62. package/dist/text-input/TextInput.d.ts.map +1 -1
  63. package/dist/text-input/TextInput.js +2 -0
  64. package/dist/text-input/TextInput.js.map +1 -1
  65. package/dist/theme/components.d.ts +4 -2
  66. package/dist/theme/components.d.ts.map +1 -1
  67. package/dist/theme/components.js +4 -0
  68. package/dist/theme/components.js.map +1 -1
  69. package/package.json +3 -3
@@ -11,9 +11,10 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
11
  /**
12
12
  * A modal dialog. Controlled with `isOpen` and `onOpenChange`, or inside a `DialogTrigger` with
13
13
  * its button as the first child. It traps focus, closes with Escape, and returns focus when it
14
- * closes. On phones, it opens as a sheet at the bottom of the screen.
14
+ * closes. On phones, it opens as a sheet at the bottom of the screen, or takes the whole screen with
15
+ * `fullScreenOnPhone`.
15
16
  */
16
- function Dialog$1({ title, children, footer, isDismissable = true, role = "dialog", size = "md", className, overlayClassName, headerClassName, bodyClassName, footerClassName, ...props }) {
17
+ function Dialog$1({ title, children, headerContent, footer, isDismissable = true, role = "dialog", size = "md", fullScreenOnPhone = false, className, overlayClassName, headerClassName, bodyClassName, footerClassName, ...props }) {
17
18
  const intl = usePanneauIntl();
18
19
  const container = usePortalContainer();
19
20
  if (container === null) return null;
@@ -23,24 +24,31 @@ function Dialog$1({ title, children, footer, isDismissable = true, role = "dialo
23
24
  className: cx(Dialog_module_default.overlay, overlayClassName),
24
25
  UNSTABLE_portalContainer: container,
25
26
  children: /* @__PURE__ */ jsx(Modal, {
26
- className: cx(Dialog_module_default.modal, Dialog_module_default[size]),
27
+ className: cx(Dialog_module_default.modal, Dialog_module_default[size], fullScreenOnPhone && Dialog_module_default.fullScreenOnPhone),
27
28
  children: /* @__PURE__ */ jsx(Dialog, {
28
29
  role,
29
30
  className: cx("panneau-dialog", Dialog_module_default.dialog, className),
30
31
  children: ({ close }) => /* @__PURE__ */ jsxs(Fragment, { children: [
31
32
  /* @__PURE__ */ jsxs("div", {
32
33
  className: cx(Dialog_module_default.header, headerClassName),
33
- children: [/* @__PURE__ */ jsx(Heading, {
34
- slot: "title",
35
- className: Dialog_module_default.title,
36
- children: title
37
- }), isDismissable ? /* @__PURE__ */ jsx(IconButton, {
38
- icon: X,
39
- size: "sm",
40
- label: intl.formatMessage(messages.close),
41
- showTooltip: false,
42
- onPress: close
43
- }) : null]
34
+ children: [
35
+ /* @__PURE__ */ jsx(Heading, {
36
+ slot: "title",
37
+ className: Dialog_module_default.title,
38
+ children: title
39
+ }),
40
+ headerContent !== void 0 && headerContent !== null ? /* @__PURE__ */ jsx("div", {
41
+ className: Dialog_module_default.headerContent,
42
+ children: typeof headerContent === "function" ? headerContent(close) : headerContent
43
+ }) : null,
44
+ isDismissable ? /* @__PURE__ */ jsx(IconButton, {
45
+ icon: X,
46
+ size: "sm",
47
+ label: intl.formatMessage(messages.close),
48
+ showTooltip: false,
49
+ onPress: close
50
+ }) : null
51
+ ]
44
52
  }),
45
53
  /* @__PURE__ */ jsx("div", {
46
54
  className: cx(Dialog_module_default.body, bodyClassName),
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","names":["Dialog","styles","AriaDialog","_Fragment"],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n Dialog as AriaDialog,\n Heading,\n Modal,\n ModalOverlay,\n type ModalOverlayProps,\n} from 'react-aria-components';\n\nimport { IconButton } from '../icon-button/IconButton';\nimport { messages } from '../intl/messages';\nimport { usePanneauIntl } from '../intl/usePanneauIntl';\nimport { usePortalContainer } from '../root/PanneauRoot';\nimport { cx } from '../utils/cx';\nimport styles from './Dialog.module.css';\n\nexport interface DialogProps extends Pick<\n ModalOverlayProps,\n 'isOpen' | 'defaultOpen' | 'onOpenChange' | 'isKeyboardDismissDisabled'\n> {\n /** Heading of the dialog, which also labels it. */\n title: ReactNode;\n /** Content, or a function that gets `close()`. */\n children?: ReactNode | ((close: () => void) => ReactNode);\n /** Buttons at the bottom, or a function that gets `close()`. */\n footer?: ReactNode | ((close: () => void) => ReactNode);\n /**\n * Closes on a click outside and shows a close button. Defaults to true. Turn it off for dialogs\n * that need an answer.\n */\n isDismissable?: boolean;\n /** `alertdialog` for confirmations and interruptions. Defaults to `dialog`. */\n role?: 'dialog' | 'alertdialog';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n overlayClassName?: string;\n headerClassName?: string;\n bodyClassName?: string;\n footerClassName?: string;\n}\n\n/**\n * A modal dialog. Controlled with `isOpen` and `onOpenChange`, or inside a `DialogTrigger` with\n * its button as the first child. It traps focus, closes with Escape, and returns focus when it\n * closes. On phones, it opens as a sheet at the bottom of the screen.\n */\nexport function Dialog({\n title,\n children,\n footer,\n isDismissable = true,\n role = 'dialog',\n size = 'md',\n className,\n overlayClassName,\n headerClassName,\n bodyClassName,\n footerClassName,\n ...props\n}: DialogProps) {\n const intl = usePanneauIntl();\n const container = usePortalContainer();\n if (container === null) {\n return null;\n }\n return (\n <ModalOverlay\n {...props}\n isDismissable={isDismissable}\n className={cx(styles.overlay, overlayClassName)}\n UNSTABLE_portalContainer={container}\n >\n <Modal className={cx(styles.modal, styles[size])}>\n <AriaDialog role={role} className={cx('panneau-dialog', styles.dialog, className)}>\n {({ close }) => (\n <>\n <div className={cx(styles.header, headerClassName)}>\n <Heading slot=\"title\" className={styles.title}>\n {title}\n </Heading>\n {isDismissable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.close)}\n showTooltip={false}\n onPress={close}\n />\n ) : null}\n </div>\n <div className={cx(styles.body, bodyClassName)}>\n {typeof children === 'function' ? children(close) : children}\n </div>\n {footer !== undefined && footer !== null ? (\n <div className={cx(styles.footer, footerClassName)}>\n {typeof footer === 'function' ? footer(close) : footer}\n </div>\n ) : null}\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n\nexport { DialogTrigger } from 'react-aria-components';\n"],"mappings":";;;;;;;;;;;;;;;AA+CA,SAAgBA,SAAO,EACnB,OACA,UACA,QACA,gBAAgB,MAChB,OAAO,UACP,OAAO,MACP,WACA,kBACA,iBACA,eACA,iBACA,GAAG,SACS;CACZ,MAAM,OAAO,eAAe;CAC5B,MAAM,YAAY,mBAAmB;CACrC,IAAI,cAAc,MACd,OAAO;CAEX,OACI,oBAAC,cAAD;EACI,GAAI;EACW;EACf,WAAW,GAAGC,sBAAO,SAAS,gBAAgB;EAC9C,0BAA0B;EAE1B,UAAA,oBAAC,OAAD;GAAO,WAAW,GAAGA,sBAAO,OAAOA,sBAAO,KAAK;GAC3C,UAAA,oBAACC,QAAD;IAAkB;IAAM,WAAW,GAAG,kBAAkBD,sBAAO,QAAQ,SAAS;IAC1E,WAAA,EAAE,YACA,qBAAAE,UAAA,EAAA,UAAA;KACI,qBAAC,OAAD;MAAK,WAAW,GAAGF,sBAAO,QAAQ,eAAe;MAAjD,UAAA,CACI,oBAAC,SAAD;OAAS,MAAK;OAAQ,WAAWA,sBAAO;OACnC,UAAA;MACI,CAAA,GACR,gBACG,oBAAC,YAAD;OACI,MAAM;OACN,MAAK;OACL,OAAO,KAAK,cAAc,SAAS,KAAK;OACxC,aAAa;OACb,SAAS;MAAM,CAAA,IAEnB,IACH;;KACL,oBAAC,OAAD;MAAK,WAAW,GAAGA,sBAAO,MAAM,aAAa;MACxC,UAAA,OAAO,aAAa,aAAa,SAAS,KAAK,IAAI;KACnD,CAAA;KACJ,WAAW,KAAA,KAAa,WAAW,OAChC,oBAAC,OAAD;MAAK,WAAW,GAAGA,sBAAO,QAAQ,eAAe;MAC5C,UAAA,OAAO,WAAW,aAAa,OAAO,KAAK,IAAI;KAC/C,CAAA,IACL;IACR,EAAA,CAAA;GAEI,CAAA;EACT,CAAA;CACG,CAAA;AAEtB"}
1
+ {"version":3,"file":"Dialog.js","names":["Dialog","styles","AriaDialog","_Fragment"],"sources":["../../src/dialog/Dialog.tsx"],"sourcesContent":["import { X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n Dialog as AriaDialog,\n Heading,\n Modal,\n ModalOverlay,\n type ModalOverlayProps,\n} from 'react-aria-components';\n\nimport { IconButton } from '../icon-button/IconButton';\nimport { messages } from '../intl/messages';\nimport { usePanneauIntl } from '../intl/usePanneauIntl';\nimport { usePortalContainer } from '../root/PanneauRoot';\nimport { cx } from '../utils/cx';\nimport styles from './Dialog.module.css';\n\nexport interface DialogProps extends Pick<\n ModalOverlayProps,\n 'isOpen' | 'defaultOpen' | 'onOpenChange' | 'isKeyboardDismissDisabled'\n> {\n /** Heading of the dialog, which also labels it. */\n title: ReactNode;\n /** Content, or a function that gets `close()`. */\n children?: ReactNode | ((close: () => void) => ReactNode);\n /**\n * More content in the header, between the title and the close button: a switcher, a few\n * actions. On phones, it goes under the title. A function gets `close()`.\n */\n headerContent?: ReactNode | ((close: () => void) => ReactNode);\n /** Buttons at the bottom, or a function that gets `close()`. */\n footer?: ReactNode | ((close: () => void) => ReactNode);\n /**\n * Closes on a click outside and shows a close button. Defaults to true. Turn it off for dialogs\n * that need an answer.\n */\n isDismissable?: boolean;\n /** `alertdialog` for confirmations and interruptions. Defaults to `dialog`. */\n role?: 'dialog' | 'alertdialog';\n /** Maximum width: `sm`, `md` (the default), `lg`, or `xl` for pickers and editors. */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * On phones, takes the whole screen instead of opening as a sheet at the bottom: for dialogs\n * that need all the room they can get, such as pickers.\n */\n fullScreenOnPhone?: boolean;\n className?: string;\n overlayClassName?: string;\n headerClassName?: string;\n bodyClassName?: string;\n footerClassName?: string;\n}\n\n/**\n * A modal dialog. Controlled with `isOpen` and `onOpenChange`, or inside a `DialogTrigger` with\n * its button as the first child. It traps focus, closes with Escape, and returns focus when it\n * closes. On phones, it opens as a sheet at the bottom of the screen, or takes the whole screen with\n * `fullScreenOnPhone`.\n */\nexport function Dialog({\n title,\n children,\n headerContent,\n footer,\n isDismissable = true,\n role = 'dialog',\n size = 'md',\n fullScreenOnPhone = false,\n className,\n overlayClassName,\n headerClassName,\n bodyClassName,\n footerClassName,\n ...props\n}: DialogProps) {\n const intl = usePanneauIntl();\n const container = usePortalContainer();\n if (container === null) {\n return null;\n }\n return (\n <ModalOverlay\n {...props}\n isDismissable={isDismissable}\n className={cx(styles.overlay, overlayClassName)}\n UNSTABLE_portalContainer={container}\n >\n <Modal\n className={cx(\n styles.modal,\n styles[size],\n fullScreenOnPhone && styles.fullScreenOnPhone,\n )}\n >\n <AriaDialog role={role} className={cx('panneau-dialog', styles.dialog, className)}>\n {({ close }) => (\n <>\n <div className={cx(styles.header, headerClassName)}>\n <Heading slot=\"title\" className={styles.title}>\n {title}\n </Heading>\n {headerContent !== undefined && headerContent !== null ? (\n <div className={styles.headerContent}>\n {typeof headerContent === 'function'\n ? headerContent(close)\n : headerContent}\n </div>\n ) : null}\n {isDismissable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.close)}\n showTooltip={false}\n onPress={close}\n />\n ) : null}\n </div>\n <div className={cx(styles.body, bodyClassName)}>\n {typeof children === 'function' ? children(close) : children}\n </div>\n {footer !== undefined && footer !== null ? (\n <div className={cx(styles.footer, footerClassName)}>\n {typeof footer === 'function' ? footer(close) : footer}\n </div>\n ) : null}\n </>\n )}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n\nexport { DialogTrigger } from 'react-aria-components';\n"],"mappings":";;;;;;;;;;;;;;;;AA2DA,SAAgBA,SAAO,EACnB,OACA,UACA,eACA,QACA,gBAAgB,MAChB,OAAO,UACP,OAAO,MACP,oBAAoB,OACpB,WACA,kBACA,iBACA,eACA,iBACA,GAAG,SACS;CACZ,MAAM,OAAO,eAAe;CAC5B,MAAM,YAAY,mBAAmB;CACrC,IAAI,cAAc,MACd,OAAO;CAEX,OACI,oBAAC,cAAD;EACI,GAAI;EACW;EACf,WAAW,GAAGC,sBAAO,SAAS,gBAAgB;EAC9C,0BAA0B;EAE1B,UAAA,oBAAC,OAAD;GACI,WAAW,GACPA,sBAAO,OACPA,sBAAO,OACP,qBAAqBA,sBAAO,iBAChC;GAEA,UAAA,oBAACC,QAAD;IAAkB;IAAM,WAAW,GAAG,kBAAkBD,sBAAO,QAAQ,SAAS;IAC1E,WAAA,EAAE,YACA,qBAAAE,UAAA,EAAA,UAAA;KACI,qBAAC,OAAD;MAAK,WAAW,GAAGF,sBAAO,QAAQ,eAAe;MAAjD,UAAA;OACI,oBAAC,SAAD;QAAS,MAAK;QAAQ,WAAWA,sBAAO;QACnC,UAAA;OACI,CAAA;OACR,kBAAkB,KAAA,KAAa,kBAAkB,OAC9C,oBAAC,OAAD;QAAK,WAAWA,sBAAO;QAClB,UAAA,OAAO,kBAAkB,aACpB,cAAc,KAAK,IACnB;OACL,CAAA,IACL;OACH,gBACG,oBAAC,YAAD;QACI,MAAM;QACN,MAAK;QACL,OAAO,KAAK,cAAc,SAAS,KAAK;QACxC,aAAa;QACb,SAAS;OAAM,CAAA,IAEnB;MACH;;KACL,oBAAC,OAAD;MAAK,WAAW,GAAGA,sBAAO,MAAM,aAAa;MACxC,UAAA,OAAO,aAAa,aAAa,SAAS,KAAK,IAAI;KACnD,CAAA;KACJ,WAAW,KAAA,KAAa,WAAW,OAChC,oBAAC,OAAD;MAAK,WAAW,GAAGA,sBAAO,QAAQ,eAAe;MAC5C,UAAA,OAAO,WAAW,aAAa,OAAO,KAAK,IAAI;KAC/C,CAAA,IACL;IACR,EAAA,CAAA;GAEI,CAAA;EACT,CAAA;CACG,CAAA;AAEtB"}
@@ -5,26 +5,32 @@ var fade = "panneau-dialog-fade";
5
5
  var modal = "panneau-dialog-modal";
6
6
  var sm = "panneau-dialog-sm";
7
7
  var lg = "panneau-dialog-lg";
8
+ var xl = "panneau-dialog-xl";
8
9
  var rise = "panneau-dialog-rise";
9
10
  var dialog = "panneau-dialog";
10
11
  var header = "panneau-dialog-header";
12
+ var headerContent = "panneau-dialog-header-content";
11
13
  var title = "panneau-dialog-title";
12
14
  var body = "panneau-dialog-body";
13
15
  var footer = "panneau-dialog-footer";
16
+ var fullScreenOnPhone = "panneau-dialog-full-screen-on-phone";
14
17
  var Dialog_module_default = {
15
18
  overlay,
16
19
  fade,
17
20
  modal,
18
21
  sm,
19
22
  lg,
23
+ xl,
20
24
  rise,
21
25
  dialog,
22
26
  header,
27
+ headerContent,
23
28
  title,
24
29
  body,
25
- footer
30
+ footer,
31
+ fullScreenOnPhone
26
32
  };
27
33
  //#endregion
28
- export { body, Dialog_module_default as default, dialog, fade, footer, header, lg, modal, overlay, rise, sm, title };
34
+ export { body, Dialog_module_default as default, dialog, fade, footer, fullScreenOnPhone, header, headerContent, lg, modal, overlay, rise, sm, title, xl };
29
35
 
30
36
  //# sourceMappingURL=Dialog.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.module.js","names":[],"sources":["../../src/dialog/Dialog.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n z-index: var(--panneau-z-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100dvh;\n padding: var(--panneau-space-4);\n background-color: var(--panneau-dialog-backdrop, var(--panneau-color-backdrop));\n}\n\n.overlay[data-entering] {\n animation: fade var(--panneau-duration) ease-out;\n}\n\n.overlay[data-exiting] {\n animation: fade var(--panneau-duration) ease-in reverse;\n}\n\n.modal {\n display: flex;\n width: 100%;\n max-width: var(--panneau-dialog-width, 32rem);\n max-height: calc(100dvh - 2 * var(--panneau-space-4));\n outline: none;\n}\n\n.sm {\n max-width: var(--panneau-dialog-width-sm, 24rem);\n}\n\n.lg {\n max-width: var(--panneau-dialog-width-lg, 48rem);\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 max-height: inherit;\n color: var(--panneau-color-text);\n background-color: var(--panneau-dialog-bg, var(--panneau-color-surface-raised));\n border-radius: var(--panneau-dialog-radius, var(--panneau-radius-lg));\n box-shadow: var(--panneau-dialog-shadow, var(--panneau-shadow-lg));\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-4) var(--panneau-space-4) 0\n var(--panneau-dialog-padding-x, var(--panneau-space-5));\n}\n\n.title {\n flex: 1 1 auto;\n min-width: 0;\n padding-top: var(--panneau-space-1);\n font-size: var(--panneau-dialog-title-font-size, var(--panneau-font-size-lg));\n font-weight: var(--panneau-dialog-title-font-weight, var(--panneau-font-weight-bold));\n line-height: var(--panneau-line-height-tight);\n overflow-wrap: anywhere;\n margin: 0;\n}\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--panneau-space-3) var(--panneau-dialog-padding-x, var(--panneau-space-5))\n var(--panneau-space-4);\n overflow-y: auto;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-3) var(--panneau-dialog-padding-x, var(--panneau-space-5))\n var(--panneau-space-4);\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n/* Phones: the dialog is a sheet at the bottom, with full-width buttons. */\n@media (max-width: 30rem) {\n .overlay {\n align-items: flex-end;\n padding: 0;\n }\n\n .modal,\n .sm,\n .lg {\n max-width: none;\n max-height: calc(100dvh - var(--panneau-space-8));\n }\n\n .dialog {\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n padding-bottom: env(safe-area-inset-bottom);\n }\n\n .footer {\n flex-direction: column-reverse;\n }\n\n .footer > * {\n width: 100%;\n }\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rise {\n from {\n opacity: 0;\n transform: translateY(0.5rem);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Dialog.module.js","names":[],"sources":["../../src/dialog/Dialog.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n z-index: var(--panneau-z-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100dvh;\n padding: var(--panneau-space-4);\n background-color: var(--panneau-dialog-backdrop, var(--panneau-color-backdrop));\n}\n\n.overlay[data-entering] {\n animation: fade var(--panneau-duration) ease-out;\n}\n\n.overlay[data-exiting] {\n animation: fade var(--panneau-duration) ease-in reverse;\n}\n\n.modal {\n display: flex;\n width: 100%;\n max-width: var(--panneau-dialog-width, 32rem);\n max-height: calc(100dvh - 2 * var(--panneau-space-4));\n outline: none;\n}\n\n.sm {\n max-width: var(--panneau-dialog-width-sm, 24rem);\n}\n\n.lg {\n max-width: var(--panneau-dialog-width-lg, 48rem);\n}\n\n.xl {\n max-width: var(--panneau-dialog-width-xl, 72rem);\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 max-height: inherit;\n color: var(--panneau-color-text);\n background-color: var(--panneau-dialog-bg, var(--panneau-color-surface-raised));\n border-radius: var(--panneau-dialog-radius, var(--panneau-radius-lg));\n box-shadow: var(--panneau-dialog-shadow, var(--panneau-shadow-lg));\n outline: none;\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-4) var(--panneau-space-4) 0\n var(--panneau-dialog-padding-x, var(--panneau-space-5));\n}\n\n.headerContent {\n display: flex;\n flex: 0 1 auto;\n align-items: center;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.title {\n flex: 1 1 12rem;\n min-width: 0;\n padding-top: var(--panneau-space-1);\n font-size: var(--panneau-dialog-title-font-size, var(--panneau-font-size-lg));\n font-weight: var(--panneau-dialog-title-font-weight, var(--panneau-font-weight-bold));\n line-height: var(--panneau-line-height-tight);\n overflow-wrap: anywhere;\n margin: 0;\n}\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--panneau-space-3) var(--panneau-dialog-padding-x, var(--panneau-space-5))\n var(--panneau-space-4);\n overflow-y: auto;\n}\n\n.footer {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n gap: var(--panneau-space-2);\n padding: var(--panneau-space-3) var(--panneau-dialog-padding-x, var(--panneau-space-5))\n var(--panneau-space-4);\n border-top: var(--panneau-border-width) solid var(--panneau-color-border);\n}\n\n/* Phones: the dialog is a sheet at the bottom, with full-width buttons. */\n@media (max-width: 30rem) {\n .overlay {\n align-items: flex-end;\n padding: 0;\n }\n\n .modal,\n .sm,\n .lg,\n .xl {\n max-width: none;\n max-height: calc(100dvh - var(--panneau-space-8));\n }\n\n .dialog {\n border-end-start-radius: 0;\n border-end-end-radius: 0;\n padding-bottom: env(safe-area-inset-bottom);\n }\n\n /* The whole screen, under the notch. */\n .fullScreenOnPhone {\n height: 100dvh;\n max-height: 100dvh;\n }\n\n .fullScreenOnPhone .dialog {\n border-radius: 0;\n padding-top: env(safe-area-inset-top);\n }\n\n /* The header's content goes under the title and the close button. */\n .header {\n flex-wrap: wrap;\n }\n\n .headerContent {\n flex: 1 1 100%;\n order: 1;\n }\n\n .footer {\n flex-direction: column-reverse;\n }\n\n .footer > * {\n width: 100%;\n }\n}\n\n@keyframes fade {\n from {\n opacity: 0;\n }\n}\n\n@keyframes rise {\n from {\n opacity: 0;\n transform: translateY(0.5rem);\n }\n}\n"],"mappings":""}
@@ -1,3 +1,3 @@
1
1
  /** Tokens of Dialog. */
2
- export declare const dialogTokens: import("..").ComponentTokens<"dialog", "panneau-dialog-width" | "panneau-dialog-radius" | "panneau-dialog-padding-x" | "panneau-dialog-title-font-weight" | "panneau-dialog-bg" | "panneau-dialog-shadow" | "panneau-dialog-title-font-size" | "panneau-dialog-width-sm" | "panneau-dialog-width-lg" | "panneau-dialog-backdrop">;
2
+ export declare const dialogTokens: import("..").ComponentTokens<"dialog", "panneau-dialog-width" | "panneau-dialog-radius" | "panneau-dialog-padding-x" | "panneau-dialog-title-font-weight" | "panneau-dialog-bg" | "panneau-dialog-shadow" | "panneau-dialog-title-font-size" | "panneau-dialog-width-sm" | "panneau-dialog-width-lg" | "panneau-dialog-width-xl" | "panneau-dialog-backdrop">;
3
3
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/dialog/tokens.ts"],"names":[],"mappings":"AAEA,wBAAwB;AACxB,eAAO,MAAM,YAAY,mUAqBvB,CAAC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/dialog/tokens.ts"],"names":[],"mappings":"AAEA,wBAAwB;AACxB,eAAO,MAAM,YAAY,+VAuBvB,CAAC"}
@@ -10,6 +10,8 @@ var dialogTokens = defineComponentTokens("dialog", {
10
10
  "width-sm": "24rem",
11
11
  /** Maximum width of the large size. */
12
12
  "width-lg": "48rem",
13
+ /** Maximum width of the extra large size, for pickers and editors. */
14
+ "width-xl": "72rem",
13
15
  /** Background. */
14
16
  bg: "var(--panneau-color-surface-raised)",
15
17
  /** Corner radius. */
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","names":[],"sources":["../../src/dialog/tokens.ts"],"sourcesContent":["import { defineComponentTokens } from '../theme/componentTokens';\n\n/** Tokens of Dialog. */\nexport const dialogTokens = defineComponentTokens('dialog', {\n /** Color of the backdrop. */\n backdrop: 'var(--panneau-color-backdrop)',\n /** Maximum width of the default size. */\n width: '32rem',\n /** Maximum width of the small size. */\n 'width-sm': '24rem',\n /** Maximum width of the large size. */\n 'width-lg': '48rem',\n /** Background. */\n bg: 'var(--panneau-color-surface-raised)',\n /** Corner radius. */\n radius: 'var(--panneau-radius-lg)',\n /** Shadow. */\n shadow: 'var(--panneau-shadow-lg)',\n /** Horizontal padding. */\n 'padding-x': 'var(--panneau-space-5)',\n /** Font size of the title. */\n 'title-font-size': 'var(--panneau-font-size-lg)',\n /** Font weight of the title. */\n 'title-font-weight': 'var(--panneau-font-weight-bold)',\n});\n"],"mappings":";;;AAGA,IAAa,eAAe,sBAAsB,UAAU;;CAExD,UAAU;;CAEV,OAAO;;CAEP,YAAY;;CAEZ,YAAY;;CAEZ,IAAI;;CAEJ,QAAQ;;CAER,QAAQ;;CAER,aAAa;;CAEb,mBAAmB;;CAEnB,qBAAqB;AACzB,CAAC"}
1
+ {"version":3,"file":"tokens.js","names":[],"sources":["../../src/dialog/tokens.ts"],"sourcesContent":["import { defineComponentTokens } from '../theme/componentTokens';\n\n/** Tokens of Dialog. */\nexport const dialogTokens = defineComponentTokens('dialog', {\n /** Color of the backdrop. */\n backdrop: 'var(--panneau-color-backdrop)',\n /** Maximum width of the default size. */\n width: '32rem',\n /** Maximum width of the small size. */\n 'width-sm': '24rem',\n /** Maximum width of the large size. */\n 'width-lg': '48rem',\n /** Maximum width of the extra large size, for pickers and editors. */\n 'width-xl': '72rem',\n /** Background. */\n bg: 'var(--panneau-color-surface-raised)',\n /** Corner radius. */\n radius: 'var(--panneau-radius-lg)',\n /** Shadow. */\n shadow: 'var(--panneau-shadow-lg)',\n /** Horizontal padding. */\n 'padding-x': 'var(--panneau-space-5)',\n /** Font size of the title. */\n 'title-font-size': 'var(--panneau-font-size-lg)',\n /** Font weight of the title. */\n 'title-font-weight': 'var(--panneau-font-weight-bold)',\n});\n"],"mappings":";;;AAGA,IAAa,eAAe,sBAAsB,UAAU;;CAExD,UAAU;;CAEV,OAAO;;CAEP,YAAY;;CAEZ,YAAY;;CAEZ,YAAY;;CAEZ,IAAI;;CAEJ,QAAQ;;CAER,QAAQ;;CAER,aAAa;;CAEb,mBAAmB;;CAEnB,qBAAqB;AACzB,CAAC"}
@@ -132,6 +132,15 @@
132
132
  margin-inline-start: var(--panneau-space-2);
133
133
  }
134
134
 
135
+ /* A text before or after the value reads with it, as one URL or one amount: `/pages/home`. */
136
+ .panneau-field-adornment[data-text]:first-child {
137
+ margin-inline-end: 0;
138
+ }
139
+
140
+ .panneau-field-adornment[data-text]:last-child {
141
+ margin-inline-start: 0;
142
+ }
143
+
135
144
  .panneau-field-fieldset {
136
145
  display: flex;
137
146
  flex-direction: column;
@@ -1 +1 @@
1
- {"version":3,"file":"Field.module.js","names":[],"sources":["../../src/field/Field.module.css"],"sourcesContent":["/* Shared look of labelled controls: label, description, errors and the control itself. */\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-field-gap, var(--panneau-space-1));\n min-width: 0;\n}\n\n.label {\n font-size: var(--panneau-field-label-font-size, var(--panneau-font-size-md));\n font-weight: var(--panneau-field-label-font-weight, var(--panneau-font-weight-medium));\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n overflow-wrap: anywhere;\n}\n\n.required {\n margin-inline-start: 0.2em;\n color: var(--panneau-color-danger);\n}\n\n.description {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.errors {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-danger);\n}\n\n.error {\n display: block;\n}\n\n.control {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-input-padding-x, var(--panneau-control-padding-x));\n font-size: var(--panneau-font-size-control);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n background-color: var(--panneau-input-bg, var(--panneau-color-surface));\n border: var(--panneau-input-border-width, var(--panneau-border-width)) solid\n var(--panneau-input-border-color, var(--panneau-color-border-control));\n border-radius: var(--panneau-input-radius, var(--panneau-radius-md));\n transition:\n border-color var(--panneau-duration),\n box-shadow var(--panneau-duration);\n}\n\n.control::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.control[data-hovered],\n.control:hover {\n border-color: var(--panneau-input-border-color-hover, var(--panneau-color-text-muted));\n}\n\n.control[data-focused],\n.control[data-focus-within],\n.control[data-focus-visible],\n.control:focus-within {\n border-color: var(--panneau-color-focus);\n outline: none;\n box-shadow: 0 0 0 1px var(--panneau-color-focus);\n}\n\n.control[data-invalid] {\n border-color: var(--panneau-color-danger);\n}\n\n.control[data-invalid][data-focused],\n.control[data-invalid][data-focus-within],\n.control[data-invalid]:focus-within {\n box-shadow: 0 0 0 1px var(--panneau-color-danger);\n}\n\n.control[data-disabled] {\n cursor: not-allowed;\n opacity: 0.6;\n background-color: var(--panneau-color-surface-sunken);\n}\n\n.control[data-readonly],\n.control[readonly] {\n background-color: var(--panneau-color-surface-sunken);\n}\n\n/* An input inside a control (with adornments, segments or buttons): the control draws the box. */\n.bare {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n min-height: calc(var(--panneau-control-height) - 2 * var(--panneau-border-width));\n padding: 0;\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n outline: none;\n}\n\n.bare::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.adornment {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--panneau-space-1);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n}\n\n.adornment:first-child {\n margin-inline-end: var(--panneau-space-2);\n}\n\n.adornment:last-child {\n margin-inline-start: var(--panneau-space-2);\n}\n\n.fieldset {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.legend {\n display: block;\n float: none;\n width: 100%;\n margin: 0 0 var(--panneau-space-1);\n padding: 0;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Field.module.js","names":[],"sources":["../../src/field/Field.module.css"],"sourcesContent":["/* Shared look of labelled controls: label, description, errors and the control itself. */\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-field-gap, var(--panneau-space-1));\n min-width: 0;\n}\n\n.label {\n font-size: var(--panneau-field-label-font-size, var(--panneau-font-size-md));\n font-weight: var(--panneau-field-label-font-weight, var(--panneau-font-weight-medium));\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n overflow-wrap: anywhere;\n}\n\n.required {\n margin-inline-start: 0.2em;\n color: var(--panneau-color-danger);\n}\n\n.description {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.errors {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-1);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-danger);\n}\n\n.error {\n display: block;\n}\n\n.control {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n min-height: var(--panneau-control-height);\n padding: 0 var(--panneau-input-padding-x, var(--panneau-control-padding-x));\n font-size: var(--panneau-font-size-control);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n background-color: var(--panneau-input-bg, var(--panneau-color-surface));\n border: var(--panneau-input-border-width, var(--panneau-border-width)) solid\n var(--panneau-input-border-color, var(--panneau-color-border-control));\n border-radius: var(--panneau-input-radius, var(--panneau-radius-md));\n transition:\n border-color var(--panneau-duration),\n box-shadow var(--panneau-duration);\n}\n\n.control::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.control[data-hovered],\n.control:hover {\n border-color: var(--panneau-input-border-color-hover, var(--panneau-color-text-muted));\n}\n\n.control[data-focused],\n.control[data-focus-within],\n.control[data-focus-visible],\n.control:focus-within {\n border-color: var(--panneau-color-focus);\n outline: none;\n box-shadow: 0 0 0 1px var(--panneau-color-focus);\n}\n\n.control[data-invalid] {\n border-color: var(--panneau-color-danger);\n}\n\n.control[data-invalid][data-focused],\n.control[data-invalid][data-focus-within],\n.control[data-invalid]:focus-within {\n box-shadow: 0 0 0 1px var(--panneau-color-danger);\n}\n\n.control[data-disabled] {\n cursor: not-allowed;\n opacity: 0.6;\n background-color: var(--panneau-color-surface-sunken);\n}\n\n.control[data-readonly],\n.control[readonly] {\n background-color: var(--panneau-color-surface-sunken);\n}\n\n/* An input inside a control (with adornments, segments or buttons): the control draws the box. */\n.bare {\n flex: 1 1 auto;\n min-width: 0;\n height: 100%;\n min-height: calc(var(--panneau-control-height) - 2 * var(--panneau-border-width));\n padding: 0;\n font: inherit;\n color: inherit;\n background: transparent;\n border: 0;\n outline: none;\n}\n\n.bare::placeholder {\n color: var(--panneau-color-text-muted);\n opacity: 1;\n}\n\n.adornment {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--panneau-space-1);\n color: var(--panneau-color-text-muted);\n white-space: nowrap;\n}\n\n.adornment:first-child {\n margin-inline-end: var(--panneau-space-2);\n}\n\n.adornment:last-child {\n margin-inline-start: var(--panneau-space-2);\n}\n\n/* A text before or after the value reads with it, as one URL or one amount: `/pages/home`. */\n.adornment[data-text]:first-child {\n margin-inline-end: 0;\n}\n\n.adornment[data-text]:last-child {\n margin-inline-start: 0;\n}\n\n.fieldset {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n min-width: 0;\n}\n\n.legend {\n display: block;\n float: none;\n width: 100%;\n margin: 0 0 var(--panneau-space-1);\n padding: 0;\n}\n"],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,9 @@ export { Alert, type AlertAppearance, type AlertProps, type AlertTone, type Aler
2
2
  export { Badge, type BadgeAppearance, type BadgeProps, type BadgeTone, type BadgeVariants, } from './badge/Badge';
3
3
  export { Button, type ButtonAppearance, type ButtonProps, type ButtonVariant, type ButtonVariants, } from './button/Button';
4
4
  export { Card, type CardProps } from './card/Card';
5
+ export { CommandPalette, type CommandPaletteProps } from './command-palette/CommandPalette';
6
+ export { type CommandPaletteGroup, type CommandPaletteItem, matchCommands, normalizeSearch, } from './command-palette/match';
7
+ export { isApplePlatform, useCommandShortcut } from './command-palette/useCommandShortcut';
5
8
  export { Container, type ContainerProps } from './container/Container';
6
9
  export { Divider, type DividerProps } from './divider/Divider';
7
10
  export { Grid, GridItem, type GridItemProps, type GridProps } from './grid/Grid';
@@ -24,6 +27,7 @@ export { Popover, type PopoverProps, PopoverTrigger } from './popover/Popover';
24
27
  export { RadioGroup, type RadioGroupProps } from './radio-group/RadioGroup';
25
28
  export { PanneauRoot, type PanneauRootProps, usePortalContainer } from './root/PanneauRoot';
26
29
  export { ThemeScope, type ThemeScopeProps } from './root/ThemeScope';
30
+ export { SegmentedControl, type SegmentedControlOption, type SegmentedControlProps, } from './segmented-control/SegmentedControl';
27
31
  export { type MultipleSelectProps, type OptionValue, Select, type SelectBaseProps, type SelectOption, type SelectProps, type SingleSelectProps, } from './select/Select';
28
32
  export { Inline, type InlineProps } from './inline/Inline';
29
33
  export { BREAKPOINTS, type Breakpoint, type Justification, type Responsive, type Space, } from './layout/responsive';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,6 +11,9 @@ import { IconButton } from "./icon-button/IconButton.js";
11
11
  import { Alert } from "./alert/Alert.js";
12
12
  import { Badge } from "./badge/Badge.js";
13
13
  import { Card } from "./card/Card.js";
14
+ import { matchCommands, normalizeSearch } from "./command-palette/match.js";
15
+ import { CommandPalette } from "./command-palette/CommandPalette.js";
16
+ import { isApplePlatform, useCommandShortcut } from "./command-palette/useCommandShortcut.js";
14
17
  import { Container } from "./container/Container.js";
15
18
  import { Divider } from "./divider/Divider.js";
16
19
  import { BREAKPOINTS } from "./layout/responsive.js";
@@ -19,6 +22,7 @@ import { Heading } from "./heading/Heading.js";
19
22
  import { Checkbox } from "./checkbox/Checkbox.js";
20
23
  import { Popover, PopoverTrigger } from "./popover/Popover.js";
21
24
  import { ComboBox } from "./combo-box/ComboBox.js";
25
+ import { TimeInput } from "./time-input/TimeInput.js";
22
26
  import { DatePicker } from "./date-picker/DatePicker.js";
23
27
  import { Dialog, DialogTrigger } from "./dialog/Dialog.js";
24
28
  import { Disclosure } from "./disclosure/Disclosure.js";
@@ -27,6 +31,7 @@ import { Menu, MenuItem, MenuSeparator, MenuTrigger } from "./menu/Menu.js";
27
31
  import { NumberInput } from "./number-input/NumberInput.js";
28
32
  import { RadioGroup } from "./radio-group/RadioGroup.js";
29
33
  import { ThemeScope } from "./root/ThemeScope.js";
34
+ import { SegmentedControl } from "./segmented-control/SegmentedControl.js";
30
35
  import { Select } from "./select/Select.js";
31
36
  import { Inline } from "./inline/Inline.js";
32
37
  import { Prose } from "./prose/Prose.js";
@@ -44,5 +49,4 @@ import { defineComponentTokens } from "./theme/componentTokens.js";
44
49
  import { componentTokens } from "./theme/components.js";
45
50
  import { SEMANTIC_TOKENS } from "./theme/semanticTokens.js";
46
51
  import { defineTheme, findUnknownTokens, mergeThemes } from "./theme/defineTheme.js";
47
- import { TimeInput } from "./time-input/TimeInput.js";
48
- export { Alert, BREAKPOINTS, BUILT_IN_TONES, Badge, Button, CHART_CATEGORICAL_COUNT, CHART_SEQUENTIAL_COUNT, Card, Checkbox, ComboBox, Container, DatePicker, Dialog, DialogTrigger, Disclosure, Divider, Fieldset, Grid, GridItem, Heading, Icon, IconButton, Inline, Menu, MenuItem, MenuSeparator, MenuTrigger, NumberInput, PanneauRoot, Popover, PopoverTrigger, Prose, RadioGroup, SEMANTIC_TOKENS, Select, Spinner, Stack, Switch, Tab, TabList, TabPanel, Tabs, Text, TextArea, TextInput, ThemeScope, TimeInput, Tooltip, bootstrapTheme, bootstrapTone, chartColors, checkColorDifferences, checkTheme, componentTokens, defineComponentTokens, defineTheme, deriveTone, findUnknownTokens, getNamedIcon, loadNamedIcon, mergeThemes, toneClassName, usePanneauIntl, usePortalContainer, useToast };
52
+ export { Alert, BREAKPOINTS, BUILT_IN_TONES, Badge, Button, CHART_CATEGORICAL_COUNT, CHART_SEQUENTIAL_COUNT, Card, Checkbox, ComboBox, CommandPalette, Container, DatePicker, Dialog, DialogTrigger, Disclosure, Divider, Fieldset, Grid, GridItem, Heading, Icon, IconButton, Inline, Menu, MenuItem, MenuSeparator, MenuTrigger, NumberInput, PanneauRoot, Popover, PopoverTrigger, Prose, RadioGroup, SEMANTIC_TOKENS, SegmentedControl, Select, Spinner, Stack, Switch, Tab, TabList, TabPanel, Tabs, Text, TextArea, TextInput, ThemeScope, TimeInput, Tooltip, bootstrapTheme, bootstrapTone, chartColors, checkColorDifferences, checkTheme, componentTokens, defineComponentTokens, defineTheme, deriveTone, findUnknownTokens, getNamedIcon, isApplePlatform, loadNamedIcon, matchCommands, mergeThemes, normalizeSearch, toneClassName, useCommandShortcut, usePanneauIntl, usePortalContainer, useToast };
@@ -0,0 +1,83 @@
1
+ .panneau-segmented-control-group {
2
+ --segmented-control-height: var(--panneau-control-height);
3
+
4
+ display: inline-flex;
5
+ gap: 2px;
6
+ max-width: 100%;
7
+ padding: var(--panneau-segmented-control-padding, 2px);
8
+ background-color: var(--panneau-segmented-control-bg, var(--panneau-color-surface-sunken));
9
+ border: var(--panneau-border-width) solid
10
+ var(--panneau-segmented-control-border-color, var(--panneau-color-border));
11
+ border-radius: var(--panneau-segmented-control-radius, var(--panneau-radius-md));
12
+ }
13
+
14
+ .panneau-segmented-control-sm {
15
+ --segmented-control-height: var(--panneau-control-height-sm);
16
+ }
17
+
18
+ .panneau-segmented-control-full-width {
19
+ display: flex;
20
+ width: 100%;
21
+ }
22
+
23
+ .panneau-segmented-control-segment {
24
+ display: inline-flex;
25
+ flex: 0 1 auto;
26
+ align-items: center;
27
+ justify-content: center;
28
+ gap: var(--panneau-space-2);
29
+ min-width: 0;
30
+ min-height: calc(
31
+ var(--segmented-control-height) - 2 * var(--panneau-segmented-control-padding, 2px) - 2 *
32
+ var(--panneau-border-width)
33
+ );
34
+ padding: 0 var(--panneau-segmented-control-segment-padding-x, var(--panneau-space-3));
35
+ font: inherit;
36
+ font-size: var(--panneau-font-size-control);
37
+ font-weight: var(
38
+ --panneau-segmented-control-segment-font-weight,
39
+ var(--panneau-font-weight-medium)
40
+ );
41
+ line-height: var(--panneau-line-height-tight);
42
+ color: var(--panneau-segmented-control-segment-color, var(--panneau-color-text-muted));
43
+ white-space: nowrap;
44
+ cursor: pointer;
45
+ background: transparent;
46
+ border: 0;
47
+ border-radius: calc(
48
+ var(--panneau-segmented-control-radius, var(--panneau-radius-md)) -
49
+ var(--panneau-segmented-control-padding, 2px)
50
+ );
51
+ outline: none;
52
+ transition:
53
+ background-color var(--panneau-duration),
54
+ color var(--panneau-duration);
55
+ -webkit-tap-highlight-color: transparent;
56
+ }
57
+
58
+ .panneau-segmented-control-full-width .panneau-segmented-control-segment {
59
+ flex: 1 1 0;
60
+ }
61
+
62
+ .panneau-segmented-control-segment[data-hovered],
63
+ .panneau-segmented-control-segment[data-selected] {
64
+ color: var(--panneau-segmented-control-segment-color-selected, var(--panneau-color-text));
65
+ }
66
+
67
+ .panneau-segmented-control-segment[data-selected] {
68
+ background-color: var(
69
+ --panneau-segmented-control-segment-bg-selected,
70
+ var(--panneau-color-surface-raised)
71
+ );
72
+ box-shadow: var(--panneau-segmented-control-segment-shadow-selected, var(--panneau-shadow-sm));
73
+ }
74
+
75
+ .panneau-segmented-control-segment[data-focus-visible] {
76
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
77
+ outline-offset: 1px;
78
+ }
79
+
80
+ .panneau-segmented-control-segment[data-disabled] {
81
+ cursor: not-allowed;
82
+ opacity: 0.5;
83
+ }
@@ -0,0 +1,35 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type IconComponent } from '../icon/Icon';
3
+ /** One choice of a segmented control. */
4
+ export interface SegmentedControlOption {
5
+ value: string;
6
+ label: ReactNode;
7
+ /** Text for typeahead and assistive technologies, when `label` isn't a string. */
8
+ textValue?: string;
9
+ icon?: IconComponent;
10
+ isDisabled?: boolean;
11
+ }
12
+ export interface SegmentedControlProps {
13
+ options: readonly SegmentedControlOption[];
14
+ /** The selected option. Controlled with `onChange`. */
15
+ value?: string;
16
+ /** The option selected first, when uncontrolled. Defaults to the first one. */
17
+ defaultValue?: string;
18
+ onChange?: (value: string) => void;
19
+ /** Accessible name of the group. Without a visible label, it is required. */
20
+ 'aria-label'?: string;
21
+ 'aria-labelledby'?: string;
22
+ size?: 'sm' | 'md';
23
+ /** Takes the width of its container, with segments of equal width. */
24
+ fullWidth?: boolean;
25
+ isDisabled?: boolean;
26
+ className?: string;
27
+ segmentClassName?: string;
28
+ }
29
+ /**
30
+ * A row of a few choices, one of which is always selected: a view, a mode, a library. For more
31
+ * than four or five choices, or long labels, use a `Select`. It is a radio group for assistive
32
+ * technologies, moved through with the arrow keys.
33
+ */
34
+ export declare function SegmentedControl({ options, value, defaultValue, onChange, size, fullWidth, isDisabled, className, segmentClassName, ...props }: SegmentedControlProps): import("react").JSX.Element;
35
+ //# sourceMappingURL=SegmentedControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.d.ts","sourceRoot":"","sources":["../../src/segmented-control/SegmentedControl.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAGjD,OAAO,EAAQ,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAIxD,yCAAyC;AACzC,MAAM,WAAW,sBAAsB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,OAAO,EACP,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,IAAW,EACX,SAAiB,EACjB,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,GAAG,KAAK,EACX,EAAE,qBAAqB,+BA6CvB"}
@@ -0,0 +1,44 @@
1
+ import { cx } from "../utils/cx.js";
2
+ import { Icon } from "../icon/Icon.js";
3
+ import SegmentedControl_module_default from "./SegmentedControl.module.js";
4
+ import { ToggleButton, ToggleButtonGroup } from "react-aria-components";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useState } from "react";
7
+ //#region src/segmented-control/SegmentedControl.tsx
8
+ /**
9
+ * A row of a few choices, one of which is always selected: a view, a mode, a library. For more
10
+ * than four or five choices, or long labels, use a `Select`. It is a radio group for assistive
11
+ * technologies, moved through with the arrow keys.
12
+ */
13
+ function SegmentedControl({ options, value, defaultValue, onChange, size = "md", fullWidth = false, isDisabled, className, segmentClassName, ...props }) {
14
+ const [uncontrolled, setUncontrolled] = useState(() => defaultValue ?? options.find((option) => option.isDisabled !== true)?.value);
15
+ const selected = value ?? uncontrolled;
16
+ return /* @__PURE__ */ jsx(ToggleButtonGroup, {
17
+ ...props,
18
+ selectionMode: "single",
19
+ disallowEmptySelection: true,
20
+ isDisabled,
21
+ selectedKeys: selected !== void 0 ? [selected] : [],
22
+ onSelectionChange: (keys) => {
23
+ const [key] = [...keys];
24
+ if (key === void 0 || String(key) === selected) return;
25
+ setUncontrolled(String(key));
26
+ onChange?.(String(key));
27
+ },
28
+ className: cx("panneau-segmented-control", SegmentedControl_module_default.group, SegmentedControl_module_default[size], fullWidth && SegmentedControl_module_default.fullWidth, className),
29
+ children: options.map((option_0) => /* @__PURE__ */ jsxs(ToggleButton, {
30
+ id: option_0.value,
31
+ isDisabled: option_0.isDisabled,
32
+ ...option_0.textValue !== void 0 ? { "aria-label": option_0.textValue } : {},
33
+ className: cx("panneau-segment", SegmentedControl_module_default.segment, segmentClassName),
34
+ children: [option_0.icon !== void 0 ? /* @__PURE__ */ jsx(Icon, {
35
+ icon: option_0.icon,
36
+ size: size === "sm" ? "sm" : "md"
37
+ }) : null, option_0.label]
38
+ }, option_0.value))
39
+ });
40
+ }
41
+ //#endregion
42
+ export { SegmentedControl };
43
+
44
+ //# sourceMappingURL=SegmentedControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.js","names":["option","styles"],"sources":["../../src/segmented-control/SegmentedControl.tsx"],"sourcesContent":["import { type ReactNode, useState } from 'react';\nimport { ToggleButton, ToggleButtonGroup } from 'react-aria-components';\n\nimport { Icon, type IconComponent } from '../icon/Icon';\nimport { cx } from '../utils/cx';\nimport styles from './SegmentedControl.module.css';\n\n/** One choice of a segmented control. */\nexport interface SegmentedControlOption {\n value: string;\n label: ReactNode;\n /** Text for typeahead and assistive technologies, when `label` isn't a string. */\n textValue?: string;\n icon?: IconComponent;\n isDisabled?: boolean;\n}\n\nexport interface SegmentedControlProps {\n options: readonly SegmentedControlOption[];\n /** The selected option. Controlled with `onChange`. */\n value?: string;\n /** The option selected first, when uncontrolled. Defaults to the first one. */\n defaultValue?: string;\n onChange?: (value: string) => void;\n /** Accessible name of the group. Without a visible label, it is required. */\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n size?: 'sm' | 'md';\n /** Takes the width of its container, with segments of equal width. */\n fullWidth?: boolean;\n isDisabled?: boolean;\n className?: string;\n segmentClassName?: string;\n}\n\n/**\n * A row of a few choices, one of which is always selected: a view, a mode, a library. For more\n * than four or five choices, or long labels, use a `Select`. It is a radio group for assistive\n * technologies, moved through with the arrow keys.\n */\nexport function SegmentedControl({\n options,\n value,\n defaultValue,\n onChange,\n size = 'md',\n fullWidth = false,\n isDisabled,\n className,\n segmentClassName,\n ...props\n}: SegmentedControlProps) {\n const [uncontrolled, setUncontrolled] = useState(\n () => defaultValue ?? options.find((option) => option.isDisabled !== true)?.value,\n );\n const selected = value ?? uncontrolled;\n return (\n <ToggleButtonGroup\n {...props}\n selectionMode=\"single\"\n disallowEmptySelection\n isDisabled={isDisabled}\n selectedKeys={selected !== undefined ? [selected] : []}\n onSelectionChange={(keys) => {\n const [key] = [...keys];\n // React Aria reports the selected segment again when it is pressed.\n if (key === undefined || String(key) === selected) {\n return;\n }\n setUncontrolled(String(key));\n onChange?.(String(key));\n }}\n className={cx(\n 'panneau-segmented-control',\n styles.group,\n styles[size],\n fullWidth && styles.fullWidth,\n className,\n )}\n >\n {options.map((option) => (\n <ToggleButton\n key={option.value}\n id={option.value}\n isDisabled={option.isDisabled}\n {...(option.textValue !== undefined ? { 'aria-label': option.textValue } : {})}\n className={cx('panneau-segment', styles.segment, segmentClassName)}\n >\n {option.icon !== undefined ? (\n <Icon icon={option.icon} size={size === 'sm' ? 'sm' : 'md'} />\n ) : null}\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAwCA,SAAgB,iBAAiB,EAC7B,SACA,OACA,cACA,UACA,OAAO,MACP,YAAY,OACZ,YACA,WACA,kBACA,GAAG,SACmB;CACtB,MAAM,CAAC,cAAc,mBAAmB,eAC9B,gBAAgB,QAAQ,MAAM,WAAW,OAAO,eAAe,IAAI,CAAC,EAAE,KAChF;CACA,MAAM,WAAW,SAAS;CAC1B,OACI,oBAAC,mBAAD;EACI,GAAI;EACJ,eAAc;EACd,wBAAA;EACY;EACZ,cAAc,aAAa,KAAA,IAAY,CAAC,QAAQ,IAAI,CAAA;EACpD,oBAAoB,SAAS;GACzB,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;GAEtB,IAAI,QAAQ,KAAA,KAAa,OAAO,GAAG,MAAM,UACrC;GAEJ,gBAAgB,OAAO,GAAG,CAAC;GAC3B,WAAW,OAAO,GAAG,CAAC;EAC1B;EACA,WAAW,GACP,6BACAC,gCAAO,OACPA,gCAAO,OACP,aAAaA,gCAAO,WACpB,SACJ;EAEC,UAAA,QAAQ,KAAKD,aACV,qBAAC,cAAD;GAEI,IAAIA,SAAO;GACX,YAAYA,SAAO;GACnB,GAAKA,SAAO,cAAc,KAAA,IAAY,EAAE,cAAcA,SAAO,UAAU,IAAI,CAAC;GAC5E,WAAW,GAAG,mBAAmBC,gCAAO,SAAS,gBAAgB;GALrE,UAAA,CAOKD,SAAO,SAAS,KAAA,IACb,oBAAC,MAAD;IAAM,MAAMA,SAAO;IAAM,MAAM,SAAS,OAAO,OAAO;GAAK,CAAA,IAC3D,MACHA,SAAO,KACE;EAVLA,GAAAA,SAAO,KAUF,CACjB;CACc,CAAA;AAE3B"}
@@ -0,0 +1,16 @@
1
+ import "./SegmentedControl.css";
2
+ //#region src/segmented-control/SegmentedControl.module.css
3
+ var group = "panneau-segmented-control-group";
4
+ var sm = "panneau-segmented-control-sm";
5
+ var fullWidth = "panneau-segmented-control-full-width";
6
+ var segment = "panneau-segmented-control-segment";
7
+ var SegmentedControl_module_default = {
8
+ group,
9
+ sm,
10
+ fullWidth,
11
+ segment
12
+ };
13
+ //#endregion
14
+ export { SegmentedControl_module_default as default, fullWidth, group, segment, sm };
15
+
16
+ //# sourceMappingURL=SegmentedControl.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentedControl.module.js","names":[],"sources":["../../src/segmented-control/SegmentedControl.module.css"],"sourcesContent":[".group {\n --segmented-control-height: var(--panneau-control-height);\n\n display: inline-flex;\n gap: 2px;\n max-width: 100%;\n padding: var(--panneau-segmented-control-padding, 2px);\n background-color: var(--panneau-segmented-control-bg, var(--panneau-color-surface-sunken));\n border: var(--panneau-border-width) solid\n var(--panneau-segmented-control-border-color, var(--panneau-color-border));\n border-radius: var(--panneau-segmented-control-radius, var(--panneau-radius-md));\n}\n\n.sm {\n --segmented-control-height: var(--panneau-control-height-sm);\n}\n\n.fullWidth {\n display: flex;\n width: 100%;\n}\n\n.segment {\n display: inline-flex;\n flex: 0 1 auto;\n align-items: center;\n justify-content: center;\n gap: var(--panneau-space-2);\n min-width: 0;\n min-height: calc(\n var(--segmented-control-height) - 2 * var(--panneau-segmented-control-padding, 2px) - 2 *\n var(--panneau-border-width)\n );\n padding: 0 var(--panneau-segmented-control-segment-padding-x, var(--panneau-space-3));\n font: inherit;\n font-size: var(--panneau-font-size-control);\n font-weight: var(\n --panneau-segmented-control-segment-font-weight,\n var(--panneau-font-weight-medium)\n );\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-segmented-control-segment-color, var(--panneau-color-text-muted));\n white-space: nowrap;\n cursor: pointer;\n background: transparent;\n border: 0;\n border-radius: calc(\n var(--panneau-segmented-control-radius, var(--panneau-radius-md)) -\n var(--panneau-segmented-control-padding, 2px)\n );\n outline: none;\n transition:\n background-color var(--panneau-duration),\n color var(--panneau-duration);\n -webkit-tap-highlight-color: transparent;\n}\n\n.fullWidth .segment {\n flex: 1 1 0;\n}\n\n.segment[data-hovered],\n.segment[data-selected] {\n color: var(--panneau-segmented-control-segment-color-selected, var(--panneau-color-text));\n}\n\n.segment[data-selected] {\n background-color: var(\n --panneau-segmented-control-segment-bg-selected,\n var(--panneau-color-surface-raised)\n );\n box-shadow: var(--panneau-segmented-control-segment-shadow-selected, var(--panneau-shadow-sm));\n}\n\n.segment[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.segment[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Tokens of SegmentedControl. */
2
+ export declare const segmentedControlTokens: import("..").ComponentTokens<"segmented-control", "panneau-segmented-control-radius" | "panneau-segmented-control-padding" | "panneau-segmented-control-bg" | "panneau-segmented-control-border-color" | "panneau-segmented-control-segment-padding-x" | "panneau-segmented-control-segment-font-weight" | "panneau-segmented-control-segment-color" | "panneau-segmented-control-segment-color-selected" | "panneau-segmented-control-segment-bg-selected" | "panneau-segmented-control-segment-shadow-selected">;
3
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/segmented-control/tokens.ts"],"names":[],"mappings":"AAEA,kCAAkC;AAClC,eAAO,MAAM,sBAAsB,ofAqBjC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { defineComponentTokens } from "../theme/componentTokens.js";
2
+ //#region src/segmented-control/tokens.ts
3
+ /** Tokens of SegmentedControl. */
4
+ var segmentedControlTokens = defineComponentTokens("segmented-control", {
5
+ /** Background of the group, behind the segments. */
6
+ bg: "var(--panneau-color-surface-sunken)",
7
+ /** Color of the border around the group. */
8
+ "border-color": "var(--panneau-color-border)",
9
+ /** Corner radius of the group. */
10
+ radius: "var(--panneau-radius-md)",
11
+ /** Space between the group's border and its segments. */
12
+ padding: "2px",
13
+ /** Horizontal padding of a segment. */
14
+ "segment-padding-x": "var(--panneau-space-3)",
15
+ /** Font weight of a segment. */
16
+ "segment-font-weight": "var(--panneau-font-weight-medium)",
17
+ /** Text color of a segment. */
18
+ "segment-color": "var(--panneau-color-text-muted)",
19
+ /** Text color of the selected segment, and of a hovered one. */
20
+ "segment-color-selected": "var(--panneau-color-text)",
21
+ /** Background of the selected segment. */
22
+ "segment-bg-selected": "var(--panneau-color-surface-raised)",
23
+ /** Shadow of the selected segment. */
24
+ "segment-shadow-selected": "var(--panneau-shadow-sm)"
25
+ });
26
+ //#endregion
27
+ export { segmentedControlTokens };
28
+
29
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","names":[],"sources":["../../src/segmented-control/tokens.ts"],"sourcesContent":["import { defineComponentTokens } from '../theme/componentTokens';\n\n/** Tokens of SegmentedControl. */\nexport const segmentedControlTokens = defineComponentTokens('segmented-control', {\n /** Background of the group, behind the segments. */\n bg: 'var(--panneau-color-surface-sunken)',\n /** Color of the border around the group. */\n 'border-color': 'var(--panneau-color-border)',\n /** Corner radius of the group. */\n radius: 'var(--panneau-radius-md)',\n /** Space between the group's border and its segments. */\n padding: '2px',\n /** Horizontal padding of a segment. */\n 'segment-padding-x': 'var(--panneau-space-3)',\n /** Font weight of a segment. */\n 'segment-font-weight': 'var(--panneau-font-weight-medium)',\n /** Text color of a segment. */\n 'segment-color': 'var(--panneau-color-text-muted)',\n /** Text color of the selected segment, and of a hovered one. */\n 'segment-color-selected': 'var(--panneau-color-text)',\n /** Background of the selected segment. */\n 'segment-bg-selected': 'var(--panneau-color-surface-raised)',\n /** Shadow of the selected segment. */\n 'segment-shadow-selected': 'var(--panneau-shadow-sm)',\n});\n"],"mappings":";;;AAGA,IAAa,yBAAyB,sBAAsB,qBAAqB;;CAE7E,IAAI;;CAEJ,gBAAgB;;CAEhB,QAAQ;;CAER,SAAS;;CAET,qBAAqB;;CAErB,uBAAuB;;CAEvB,iBAAiB;;CAEjB,0BAA0B;;CAE1B,uBAAuB;;CAEvB,2BAA2B;AAC/B,CAAC"}
@@ -47,15 +47,22 @@
47
47
  display: flex;
48
48
  flex: 1 1 auto;
49
49
  flex-direction: column;
50
+ gap: 0.125rem;
50
51
  min-width: 0;
51
52
  }
52
53
 
54
+ /* An option with a description has two lines: more room above and below them. */
55
+ .panneau-list-box-item:has(.panneau-list-box-item-description) {
56
+ padding-block: var(--panneau-list-box-item-padding-y-described, var(--panneau-space-2));
57
+ }
58
+
53
59
  .panneau-list-box-item-label {
54
60
  overflow-wrap: anywhere;
55
61
  }
56
62
 
57
63
  .panneau-list-box-item-description {
58
- font-size: var(--panneau-font-size-sm);
64
+ font-size: var(--panneau-font-size-xs);
65
+ line-height: var(--panneau-line-height-tight);
59
66
  color: var(--panneau-color-text-muted);
60
67
  }
61
68
 
@@ -3,8 +3,8 @@ import "./ListBox.css";
3
3
  var listBox = "panneau-list-box";
4
4
  var item = "panneau-list-box-item";
5
5
  var itemText = "panneau-list-box-item-text";
6
- var itemLabel = "panneau-list-box-item-label";
7
6
  var itemDescription = "panneau-list-box-item-description";
7
+ var itemLabel = "panneau-list-box-item-label";
8
8
  var check = "panneau-list-box-check";
9
9
  var placeholder = "panneau-list-box-placeholder";
10
10
  var empty = "panneau-list-box-empty";
@@ -16,8 +16,8 @@ var ListBox_module_default = {
16
16
  listBox,
17
17
  item,
18
18
  itemText,
19
- itemLabel,
20
19
  itemDescription,
20
+ itemLabel,
21
21
  check,
22
22
  placeholder,
23
23
  empty,
@@ -1 +1 @@
1
- {"version":3,"file":"ListBox.module.js","names":[],"sources":["../../src/select/ListBox.module.css"],"sourcesContent":["/* Options of selects, combo boxes and menus. */\n\n.listBox {\n display: flex;\n flex-direction: column;\n max-height: inherit;\n padding: var(--panneau-list-box-padding, var(--panneau-space-1));\n overflow: auto;\n outline: none;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n min-height: var(--panneau-control-height-sm);\n padding: var(--panneau-list-box-item-padding-y, calc(var(--panneau-row-padding-y) / 2))\n var(--panneau-list-box-item-padding-x, var(--panneau-space-2));\n font-size: var(--panneau-font-size-control);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n cursor: default;\n border-radius: var(--panneau-list-box-item-radius, var(--panneau-radius-sm));\n outline: none;\n}\n\n.item[data-focused],\n.item[data-hovered] {\n background-color: var(--panneau-list-box-item-bg-hover, var(--panneau-color-hover));\n}\n\n.item[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n}\n\n.item[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.item[data-danger] {\n color: var(--panneau-color-danger);\n}\n\n.itemText {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-width: 0;\n}\n\n.itemLabel {\n overflow-wrap: anywhere;\n}\n\n.itemDescription {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.check {\n flex: 0 0 auto;\n width: 1rem;\n color: var(--panneau-color-text);\n}\n\n.placeholder {\n color: var(--panneau-color-text-muted);\n}\n\n.empty {\n padding: var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.separator {\n height: 1px;\n margin: var(--panneau-space-1) 0;\n background-color: var(--panneau-color-border);\n}\n\n.trigger {\n justify-content: space-between;\n gap: var(--panneau-space-2);\n text-align: start;\n cursor: pointer;\n}\n\n.value {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.value[data-placeholder] {\n color: var(--panneau-color-text-muted);\n}\n\n.chevron {\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ListBox.module.js","names":[],"sources":["../../src/select/ListBox.module.css"],"sourcesContent":["/* Options of selects, combo boxes and menus. */\n\n.listBox {\n display: flex;\n flex-direction: column;\n max-height: inherit;\n padding: var(--panneau-list-box-padding, var(--panneau-space-1));\n overflow: auto;\n outline: none;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n min-height: var(--panneau-control-height-sm);\n padding: var(--panneau-list-box-item-padding-y, calc(var(--panneau-row-padding-y) / 2))\n var(--panneau-list-box-item-padding-x, var(--panneau-space-2));\n font-size: var(--panneau-font-size-control);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text);\n cursor: default;\n border-radius: var(--panneau-list-box-item-radius, var(--panneau-radius-sm));\n outline: none;\n}\n\n.item[data-focused],\n.item[data-hovered] {\n background-color: var(--panneau-list-box-item-bg-hover, var(--panneau-color-hover));\n}\n\n.item[data-focus-visible] {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: -2px;\n}\n\n.item[data-disabled] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.item[data-danger] {\n color: var(--panneau-color-danger);\n}\n\n.itemText {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n/* An option with a description has two lines: more room above and below them. */\n.item:has(.itemDescription) {\n padding-block: var(--panneau-list-box-item-padding-y-described, var(--panneau-space-2));\n}\n\n.itemLabel {\n overflow-wrap: anywhere;\n}\n\n.itemDescription {\n font-size: var(--panneau-font-size-xs);\n line-height: var(--panneau-line-height-tight);\n color: var(--panneau-color-text-muted);\n}\n\n.check {\n flex: 0 0 auto;\n width: 1rem;\n color: var(--panneau-color-text);\n}\n\n.placeholder {\n color: var(--panneau-color-text-muted);\n}\n\n.empty {\n padding: var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.separator {\n height: 1px;\n margin: var(--panneau-space-1) 0;\n background-color: var(--panneau-color-border);\n}\n\n.trigger {\n justify-content: space-between;\n gap: var(--panneau-space-2);\n text-align: start;\n cursor: pointer;\n}\n\n.value {\n flex: 1 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.value[data-placeholder] {\n color: var(--panneau-color-text-muted);\n}\n\n.chevron {\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}