@openwarelabs/ui 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +5 -1
  2. package/dist/components/Avatar/Avatar.d.cts +2 -13
  3. package/dist/components/Avatar/Avatar.d.ts +2 -13
  4. package/dist/components/Avatar/Avatar.types.d.cts +13 -0
  5. package/dist/components/Avatar/Avatar.types.d.ts +13 -0
  6. package/dist/components/Calendar/DatePicker.d.cts +2 -19
  7. package/dist/components/Calendar/DatePicker.d.ts +2 -19
  8. package/dist/components/Calendar/DatePicker.types.d.cts +19 -0
  9. package/dist/components/Calendar/DatePicker.types.d.ts +19 -0
  10. package/dist/components/Calendar/DateRangePicker.d.cts +2 -34
  11. package/dist/components/Calendar/DateRangePicker.d.ts +2 -34
  12. package/dist/components/Calendar/DateRangePicker.types.d.cts +34 -0
  13. package/dist/components/Calendar/DateRangePicker.types.d.ts +34 -0
  14. package/dist/components/ColorPicker/ColorPicker.d.cts +2 -55
  15. package/dist/components/ColorPicker/ColorPicker.d.ts +2 -55
  16. package/dist/components/ColorPicker/ColorPicker.types.d.cts +54 -0
  17. package/dist/components/ColorPicker/ColorPicker.types.d.ts +54 -0
  18. package/dist/components/Container/Container.d.cts +7 -0
  19. package/dist/components/Container/Container.d.ts +7 -0
  20. package/dist/components/Container/Container.types.d.cts +12 -0
  21. package/dist/components/Container/Container.types.d.ts +12 -0
  22. package/dist/components/ListBox/ListBox.d.cts +3 -61
  23. package/dist/components/ListBox/ListBox.d.ts +3 -61
  24. package/dist/components/ListBox/ListBox.types.d.cts +61 -0
  25. package/dist/components/ListBox/ListBox.types.d.ts +61 -0
  26. package/dist/components/Prose/Prose.d.cts +2 -16
  27. package/dist/components/Prose/Prose.d.ts +2 -16
  28. package/dist/components/Prose/Prose.types.d.cts +16 -0
  29. package/dist/components/Prose/Prose.types.d.ts +16 -0
  30. package/dist/components/Section/Section.d.cts +7 -0
  31. package/dist/components/Section/Section.d.ts +7 -0
  32. package/dist/components/Section/Section.types.d.cts +16 -0
  33. package/dist/components/Section/Section.types.d.ts +16 -0
  34. package/dist/components.css +83 -0
  35. package/dist/index.cjs +333 -298
  36. package/dist/index.cjs.map +4 -4
  37. package/dist/index.d.cts +4 -0
  38. package/dist/index.d.ts +4 -0
  39. package/dist/index.js +320 -285
  40. package/dist/index.js.map +4 -4
  41. package/dist/openware-ui.iife.js +7 -7
  42. package/dist/styles.css +86 -0
  43. package/dist/tokens.css +3 -0
  44. package/dist/tokens.json +15 -0
  45. package/package.json +4 -4
@@ -1,64 +1,6 @@
1
- import { type ReactElement, type ReactNode, type RefAttributes } from "react";
2
- import type { SelectOption } from "../Select/Select.cjs";
3
- /** An option, shaped like Select's, with an optional icon. */
4
- export interface ListBoxOption extends SelectOption {
5
- /** A 16px icon between the checkmark and the label. */
6
- icon?: ReactNode;
7
- /** Plain text for type-to-find, when `label` isn't a string. */
8
- textValue?: string;
9
- }
10
- /** Options under a heading, like a Select's groups. */
11
- export interface ListBoxGroup {
12
- /** The heading, shown in uppercase above the options and read out as the group's name. */
13
- label: string;
14
- options: ListBoxOption[];
15
- }
16
- export type ListBoxItem = ListBoxOption | ListBoxGroup;
17
- export type ListBoxSelectionMode = "single" | "multiple";
18
- /** ListBox's props for one selection mode: `value` is a string in single mode and an array in multiple mode. */
19
- export interface ListBoxModeProps<Mode extends ListBoxSelectionMode> {
20
- /** The options, and groups of options under a heading. */
21
- options: ListBoxItem[];
22
- /** `single` chooses one option; `multiple` any number.
23
- * @default "single" */
24
- selectionMode?: Mode;
25
- /** The selected option's value in single mode ("" for none), or the selected values in multiple mode. */
26
- value?: Mode extends "multiple" ? string[] : string;
27
- /** The starting value when uncontrolled.
28
- * @default "" or [] */
29
- defaultValue?: Mode extends "multiple" ? string[] : string;
30
- /** Called with the new value: a string in single mode, the selected values in the options' order in multiple mode. */
31
- onChange?(value: Mode extends "multiple" ? string[] : string): void;
32
- /** Keeps at least one option selected: choosing the selected option again doesn't clear it.
33
- * @default false */
34
- disallowEmptySelection?: boolean;
35
- /** Shown in the list when there are no options.
36
- * @default "No options" */
37
- emptyMessage?: ReactNode;
38
- /** Scrolls the options past this height, e.g. 240 or "40vh". */
39
- maxHeight?: number | string;
40
- /** md rows are 36px; sm rows are 32px with 12px text, like a small Select's list.
41
- * @default "md" */
42
- size?: "sm" | "md";
43
- /** Shows the list as wrong: a red border, and a red halo when focused. Also sets aria-invalid. Field passes it.
44
- * @default false */
45
- isInvalid?: boolean;
46
- /** The options can be moved through and read, but the selection can't change.
47
- * @default false */
48
- isReadOnly?: boolean;
49
- /** Fades the list and takes it out of the tab order.
50
- * @default false */
51
- disabled?: boolean;
52
- id?: string;
53
- /** Names the list for screen readers when it isn't in a Field. */
54
- "aria-label"?: string;
55
- "aria-labelledby"?: string;
56
- "aria-describedby"?: string;
57
- className?: string;
58
- }
59
- /** ListBox's props. `value`, `defaultValue` and `onChange` take a string in single mode and an array in multiple mode. */
60
- export interface ListBoxProps extends ListBoxModeProps<ListBoxSelectionMode> {
61
- }
1
+ import { type ReactElement, type RefAttributes } from "react";
2
+ import type { ListBoxModeProps, ListBoxSelectionMode } from "./ListBox.types.cjs";
3
+ export type { ListBoxGroup, ListBoxItem, ListBoxModeProps, ListBoxOption, ListBoxProps, ListBoxSelectionMode } from "./ListBox.types.cjs";
62
4
  /**
63
5
  * Select's list of options on its own: a choice that stays on the page. `selectionMode="multiple"` makes `value` an array.
64
6
  */
@@ -1,64 +1,6 @@
1
- import { type ReactElement, type ReactNode, type RefAttributes } from "react";
2
- import type { SelectOption } from "../Select/Select.js";
3
- /** An option, shaped like Select's, with an optional icon. */
4
- export interface ListBoxOption extends SelectOption {
5
- /** A 16px icon between the checkmark and the label. */
6
- icon?: ReactNode;
7
- /** Plain text for type-to-find, when `label` isn't a string. */
8
- textValue?: string;
9
- }
10
- /** Options under a heading, like a Select's groups. */
11
- export interface ListBoxGroup {
12
- /** The heading, shown in uppercase above the options and read out as the group's name. */
13
- label: string;
14
- options: ListBoxOption[];
15
- }
16
- export type ListBoxItem = ListBoxOption | ListBoxGroup;
17
- export type ListBoxSelectionMode = "single" | "multiple";
18
- /** ListBox's props for one selection mode: `value` is a string in single mode and an array in multiple mode. */
19
- export interface ListBoxModeProps<Mode extends ListBoxSelectionMode> {
20
- /** The options, and groups of options under a heading. */
21
- options: ListBoxItem[];
22
- /** `single` chooses one option; `multiple` any number.
23
- * @default "single" */
24
- selectionMode?: Mode;
25
- /** The selected option's value in single mode ("" for none), or the selected values in multiple mode. */
26
- value?: Mode extends "multiple" ? string[] : string;
27
- /** The starting value when uncontrolled.
28
- * @default "" or [] */
29
- defaultValue?: Mode extends "multiple" ? string[] : string;
30
- /** Called with the new value: a string in single mode, the selected values in the options' order in multiple mode. */
31
- onChange?(value: Mode extends "multiple" ? string[] : string): void;
32
- /** Keeps at least one option selected: choosing the selected option again doesn't clear it.
33
- * @default false */
34
- disallowEmptySelection?: boolean;
35
- /** Shown in the list when there are no options.
36
- * @default "No options" */
37
- emptyMessage?: ReactNode;
38
- /** Scrolls the options past this height, e.g. 240 or "40vh". */
39
- maxHeight?: number | string;
40
- /** md rows are 36px; sm rows are 32px with 12px text, like a small Select's list.
41
- * @default "md" */
42
- size?: "sm" | "md";
43
- /** Shows the list as wrong: a red border, and a red halo when focused. Also sets aria-invalid. Field passes it.
44
- * @default false */
45
- isInvalid?: boolean;
46
- /** The options can be moved through and read, but the selection can't change.
47
- * @default false */
48
- isReadOnly?: boolean;
49
- /** Fades the list and takes it out of the tab order.
50
- * @default false */
51
- disabled?: boolean;
52
- id?: string;
53
- /** Names the list for screen readers when it isn't in a Field. */
54
- "aria-label"?: string;
55
- "aria-labelledby"?: string;
56
- "aria-describedby"?: string;
57
- className?: string;
58
- }
59
- /** ListBox's props. `value`, `defaultValue` and `onChange` take a string in single mode and an array in multiple mode. */
60
- export interface ListBoxProps extends ListBoxModeProps<ListBoxSelectionMode> {
61
- }
1
+ import { type ReactElement, type RefAttributes } from "react";
2
+ import type { ListBoxModeProps, ListBoxSelectionMode } from "./ListBox.types.js";
3
+ export type { ListBoxGroup, ListBoxItem, ListBoxModeProps, ListBoxOption, ListBoxProps, ListBoxSelectionMode } from "./ListBox.types.js";
62
4
  /**
63
5
  * Select's list of options on its own: a choice that stays on the page. `selectionMode="multiple"` makes `value` an array.
64
6
  */
@@ -0,0 +1,61 @@
1
+ import type { ReactNode } from "react";
2
+ import type { SelectOption } from "../Select/Select.cjs";
3
+ /** An option, shaped like Select's, with an optional icon. */
4
+ export interface ListBoxOption extends SelectOption {
5
+ /** A 16px icon between the checkmark and the label. */
6
+ icon?: ReactNode;
7
+ /** Plain text for type-to-find, when `label` isn't a string. */
8
+ textValue?: string;
9
+ }
10
+ /** Options under a heading, like a Select's groups. */
11
+ export interface ListBoxGroup {
12
+ /** The heading, shown in uppercase above the options and read out as the group's name. */
13
+ label: string;
14
+ options: ListBoxOption[];
15
+ }
16
+ export type ListBoxItem = ListBoxOption | ListBoxGroup;
17
+ export type ListBoxSelectionMode = "single" | "multiple";
18
+ /** ListBox's props for one selection mode: `value` is a string in single mode and an array in multiple mode. */
19
+ export interface ListBoxModeProps<Mode extends ListBoxSelectionMode> {
20
+ /** The options, and groups of options under a heading. */
21
+ options: ListBoxItem[];
22
+ /** `single` chooses one option; `multiple` any number.
23
+ * @default "single" */
24
+ selectionMode?: Mode;
25
+ /** The selected option's value in single mode ("" for none), or the selected values in multiple mode. */
26
+ value?: Mode extends "multiple" ? string[] : string;
27
+ /** The starting value when uncontrolled.
28
+ * @default "" or [] */
29
+ defaultValue?: Mode extends "multiple" ? string[] : string;
30
+ /** Called with the new value: a string in single mode, the selected values in the options' order in multiple mode. */
31
+ onChange?(value: Mode extends "multiple" ? string[] : string): void;
32
+ /** Keeps at least one option selected: choosing the selected option again doesn't clear it.
33
+ * @default false */
34
+ disallowEmptySelection?: boolean;
35
+ /** Shown in the list when there are no options.
36
+ * @default "No options" */
37
+ emptyMessage?: ReactNode;
38
+ /** Scrolls the options past this height, e.g. 240 or "40vh". */
39
+ maxHeight?: number | string;
40
+ /** md rows are 36px; sm rows are 32px with 12px text, like a small Select's list.
41
+ * @default "md" */
42
+ size?: "sm" | "md";
43
+ /** Shows the list as wrong: a red border, and a red halo when focused. Also sets aria-invalid. Field passes it.
44
+ * @default false */
45
+ isInvalid?: boolean;
46
+ /** The options can be moved through and read, but the selection can't change.
47
+ * @default false */
48
+ isReadOnly?: boolean;
49
+ /** Fades the list and takes it out of the tab order.
50
+ * @default false */
51
+ disabled?: boolean;
52
+ id?: string;
53
+ /** Names the list for screen readers when it isn't in a Field. */
54
+ "aria-label"?: string;
55
+ "aria-labelledby"?: string;
56
+ "aria-describedby"?: string;
57
+ className?: string;
58
+ }
59
+ /** ListBox's props. `value`, `defaultValue` and `onChange` take a string in single mode and an array in multiple mode. */
60
+ export interface ListBoxProps extends ListBoxModeProps<ListBoxSelectionMode> {
61
+ }
@@ -0,0 +1,61 @@
1
+ import type { ReactNode } from "react";
2
+ import type { SelectOption } from "../Select/Select.js";
3
+ /** An option, shaped like Select's, with an optional icon. */
4
+ export interface ListBoxOption extends SelectOption {
5
+ /** A 16px icon between the checkmark and the label. */
6
+ icon?: ReactNode;
7
+ /** Plain text for type-to-find, when `label` isn't a string. */
8
+ textValue?: string;
9
+ }
10
+ /** Options under a heading, like a Select's groups. */
11
+ export interface ListBoxGroup {
12
+ /** The heading, shown in uppercase above the options and read out as the group's name. */
13
+ label: string;
14
+ options: ListBoxOption[];
15
+ }
16
+ export type ListBoxItem = ListBoxOption | ListBoxGroup;
17
+ export type ListBoxSelectionMode = "single" | "multiple";
18
+ /** ListBox's props for one selection mode: `value` is a string in single mode and an array in multiple mode. */
19
+ export interface ListBoxModeProps<Mode extends ListBoxSelectionMode> {
20
+ /** The options, and groups of options under a heading. */
21
+ options: ListBoxItem[];
22
+ /** `single` chooses one option; `multiple` any number.
23
+ * @default "single" */
24
+ selectionMode?: Mode;
25
+ /** The selected option's value in single mode ("" for none), or the selected values in multiple mode. */
26
+ value?: Mode extends "multiple" ? string[] : string;
27
+ /** The starting value when uncontrolled.
28
+ * @default "" or [] */
29
+ defaultValue?: Mode extends "multiple" ? string[] : string;
30
+ /** Called with the new value: a string in single mode, the selected values in the options' order in multiple mode. */
31
+ onChange?(value: Mode extends "multiple" ? string[] : string): void;
32
+ /** Keeps at least one option selected: choosing the selected option again doesn't clear it.
33
+ * @default false */
34
+ disallowEmptySelection?: boolean;
35
+ /** Shown in the list when there are no options.
36
+ * @default "No options" */
37
+ emptyMessage?: ReactNode;
38
+ /** Scrolls the options past this height, e.g. 240 or "40vh". */
39
+ maxHeight?: number | string;
40
+ /** md rows are 36px; sm rows are 32px with 12px text, like a small Select's list.
41
+ * @default "md" */
42
+ size?: "sm" | "md";
43
+ /** Shows the list as wrong: a red border, and a red halo when focused. Also sets aria-invalid. Field passes it.
44
+ * @default false */
45
+ isInvalid?: boolean;
46
+ /** The options can be moved through and read, but the selection can't change.
47
+ * @default false */
48
+ isReadOnly?: boolean;
49
+ /** Fades the list and takes it out of the tab order.
50
+ * @default false */
51
+ disabled?: boolean;
52
+ id?: string;
53
+ /** Names the list for screen readers when it isn't in a Field. */
54
+ "aria-label"?: string;
55
+ "aria-labelledby"?: string;
56
+ "aria-describedby"?: string;
57
+ className?: string;
58
+ }
59
+ /** ListBox's props. `value`, `defaultValue` and `onChange` take a string in single mode and an array in multiple mode. */
60
+ export interface ListBoxProps extends ListBoxModeProps<ListBoxSelectionMode> {
61
+ }
@@ -1,19 +1,5 @@
1
- import { type HTMLAttributes, type ReactNode } from "react";
2
- export interface ProseProps extends HTMLAttributes<HTMLElement> {
3
- /** sm sets 14px interface text with a tight rhythm and modest headings, for chat answers and comments. md sets the prose
4
- * style (16.5px, 1.7 leading) with headings from the type scale, for articles and docs.
5
- * @default "md" */
6
- size?: "sm" | "md";
7
- /** Drops the readable width (about 68 characters a line at md) so the text runs the full width of its container. sm has no
8
- * maximum width to drop.
9
- * @default false */
10
- fullWidth?: boolean;
11
- /** The element: article for a post, section for part of a page.
12
- * @default "div" */
13
- as?: "div" | "article" | "section" | "main" | "aside";
14
- /** Plain HTML elements to style: what a Markdown renderer, a CMS or a server gives back. */
15
- children?: ReactNode;
16
- }
1
+ import type { ProseProps } from "./Prose.types.cjs";
2
+ export type { ProseProps } from "./Prose.types.cjs";
17
3
  /**
18
4
  * Styles content you don't write element by element: Markdown rendered to HTML, a CMS body, an agent's answer. It sets
19
5
  * the plain elements inside it (headings, paragraphs, lists, quotes, code, tables, images, details) in Openware's type
@@ -1,19 +1,5 @@
1
- import { type HTMLAttributes, type ReactNode } from "react";
2
- export interface ProseProps extends HTMLAttributes<HTMLElement> {
3
- /** sm sets 14px interface text with a tight rhythm and modest headings, for chat answers and comments. md sets the prose
4
- * style (16.5px, 1.7 leading) with headings from the type scale, for articles and docs.
5
- * @default "md" */
6
- size?: "sm" | "md";
7
- /** Drops the readable width (about 68 characters a line at md) so the text runs the full width of its container. sm has no
8
- * maximum width to drop.
9
- * @default false */
10
- fullWidth?: boolean;
11
- /** The element: article for a post, section for part of a page.
12
- * @default "div" */
13
- as?: "div" | "article" | "section" | "main" | "aside";
14
- /** Plain HTML elements to style: what a Markdown renderer, a CMS or a server gives back. */
15
- children?: ReactNode;
16
- }
1
+ import type { ProseProps } from "./Prose.types.js";
2
+ export type { ProseProps } from "./Prose.types.js";
17
3
  /**
18
4
  * Styles content you don't write element by element: Markdown rendered to HTML, a CMS body, an agent's answer. It sets
19
5
  * the plain elements inside it (headings, paragraphs, lists, quotes, code, tables, images, details) in Openware's type
@@ -0,0 +1,16 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ export interface ProseProps extends HTMLAttributes<HTMLElement> {
3
+ /** sm sets 14px interface text with a tight rhythm and modest headings, for chat answers and comments. md sets the prose
4
+ * style (16.5px, 1.7 leading) with headings from the type scale, for articles and docs.
5
+ * @default "md" */
6
+ size?: "sm" | "md";
7
+ /** Drops the readable width (about 68 characters a line at md) so the text runs the full width of its container. sm has no
8
+ * maximum width to drop.
9
+ * @default false */
10
+ fullWidth?: boolean;
11
+ /** The element: article for a post, section for part of a page.
12
+ * @default "div" */
13
+ as?: "div" | "article" | "section" | "main" | "aside";
14
+ /** Plain HTML elements to style: what a Markdown renderer, a CMS or a server gives back. */
15
+ children?: ReactNode;
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { HTMLAttributes, ReactNode } from "react";
2
+ export interface ProseProps extends HTMLAttributes<HTMLElement> {
3
+ /** sm sets 14px interface text with a tight rhythm and modest headings, for chat answers and comments. md sets the prose
4
+ * style (16.5px, 1.7 leading) with headings from the type scale, for articles and docs.
5
+ * @default "md" */
6
+ size?: "sm" | "md";
7
+ /** Drops the readable width (about 68 characters a line at md) so the text runs the full width of its container. sm has no
8
+ * maximum width to drop.
9
+ * @default false */
10
+ fullWidth?: boolean;
11
+ /** The element: article for a post, section for part of a page.
12
+ * @default "div" */
13
+ as?: "div" | "article" | "section" | "main" | "aside";
14
+ /** Plain HTML elements to style: what a Markdown renderer, a CMS or a server gives back. */
15
+ children?: ReactNode;
16
+ }
@@ -0,0 +1,7 @@
1
+ import type { SectionProps } from "./Section.types.cjs";
2
+ export type { SectionProps } from "./Section.types.cjs";
3
+ /**
4
+ * A full-width band of a page, with the blocks' space above and below and their width and side margins inside (a
5
+ * Container). Your own sections then sit in line with the blocks around them.
6
+ */
7
+ export declare function Section({ tone, spacing, size, as: Element, className, children, ...props }: SectionProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { SectionProps } from "./Section.types.js";
2
+ export type { SectionProps } from "./Section.types.js";
3
+ /**
4
+ * A full-width band of a page, with the blocks' space above and below and their width and side margins inside (a
5
+ * Container). Your own sections then sit in line with the blocks around them.
6
+ */
7
+ export declare function Section({ tone, spacing, size, as: Element, className, children, ...props }: SectionProps): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import type { ElementType, HTMLAttributes } from "react";
2
+ import type { ContainerSize } from "../Container/Container.types.cjs";
3
+ export interface SectionProps extends HTMLAttributes<HTMLElement> {
4
+ /**
5
+ * The band's ground: `paper` for marketing pages, as the blocks use; `canvas` for the app's grey; `surface` for a
6
+ * white band that stands out from the paper; `none` to show what's behind it.
7
+ * @default "paper"
8
+ */
9
+ tone?: "paper" | "canvas" | "surface" | "none";
10
+ /** The space above and below: `md` is a block's (96px, 72px on phones), `sm` half that. @default "md" */
11
+ spacing?: "sm" | "md" | "none";
12
+ /** How wide the content inside can get, as for Container. `false` leaves the content full width, without one. @default "page" */
13
+ size?: ContainerSize | false;
14
+ /** The element to render. @default "section" */
15
+ as?: ElementType;
16
+ }
@@ -0,0 +1,16 @@
1
+ import type { ElementType, HTMLAttributes } from "react";
2
+ import type { ContainerSize } from "../Container/Container.types.js";
3
+ export interface SectionProps extends HTMLAttributes<HTMLElement> {
4
+ /**
5
+ * The band's ground: `paper` for marketing pages, as the blocks use; `canvas` for the app's grey; `surface` for a
6
+ * white band that stands out from the paper; `none` to show what's behind it.
7
+ * @default "paper"
8
+ */
9
+ tone?: "paper" | "canvas" | "surface" | "none";
10
+ /** The space above and below: `md` is a block's (96px, 72px on phones), `sm` half that. @default "md" */
11
+ spacing?: "sm" | "md" | "none";
12
+ /** How wide the content inside can get, as for Container. `false` leaves the content full width, without one. @default "page" */
13
+ size?: ContainerSize | false;
14
+ /** The element to render. @default "section" */
15
+ as?: ElementType;
16
+ }
@@ -1221,7 +1221,14 @@
1221
1221
  }
1222
1222
 
1223
1223
  .ow-date-field__segment {
1224
+ /* At least 24px each way, the smallest a pointer target may be (WCAG 2.2, 2.5.8). */
1225
+ box-sizing: border-box;
1226
+ display: inline-flex;
1227
+ min-width: 24px;
1228
+ min-height: 24px;
1224
1229
  flex-shrink: 0;
1230
+ align-items: center;
1231
+ justify-content: center;
1225
1232
  border-radius: var(--ow-radius-sm);
1226
1233
  padding: 2px;
1227
1234
  color: var(--ow-text);
@@ -1233,6 +1240,11 @@
1233
1240
  transition-timing-function: var(--ow-ease-standard);
1234
1241
  }
1235
1242
 
1243
+ .ow-date-field__segment[data-segment="0"] {
1244
+ /* The first, often one digit ("6:12"), keeps to the separator after it; the spare width goes before it. */
1245
+ justify-content: flex-end;
1246
+ }
1247
+
1236
1248
  .ow-date-field__segment::selection {
1237
1249
  background: transparent;
1238
1250
  }
@@ -5080,6 +5092,10 @@
5080
5092
  line-height: 1;
5081
5093
  }
5082
5094
 
5095
+ .ow-avatar[data-initials]::before {
5096
+ content: attr(data-initials);
5097
+ }
5098
+
5083
5099
  .ow-avatar--empty {
5084
5100
  background: var(--ow-avatar-empty);
5085
5101
  color: var(--ow-on-avatar-empty);
@@ -6192,6 +6208,73 @@
6192
6208
  outline-offset: 2px;
6193
6209
  }
6194
6210
 
6211
+ /* components/Container/Container.css */
6212
+ /* The page's width and side margins, the same as every block's: the content is at most the size's width, inside a
6213
+ 32px gutter (the phone gutter under 760px). */
6214
+
6215
+ .ow-container {
6216
+ box-sizing: border-box;
6217
+ width: 100%;
6218
+ margin-inline: auto;
6219
+ padding-inline: var(--ow-page-gutter-wide);
6220
+ }
6221
+
6222
+ .ow-container--page {
6223
+ max-width: calc(var(--ow-page-max) + 2 * var(--ow-page-gutter-wide));
6224
+ }
6225
+
6226
+ .ow-container--narrow {
6227
+ max-width: calc(var(--ow-page-narrow) + 2 * var(--ow-page-gutter-wide));
6228
+ }
6229
+
6230
+ .ow-container--wide {
6231
+ max-width: calc(var(--ow-page-wide) + 2 * var(--ow-page-gutter-wide));
6232
+ }
6233
+
6234
+ @media (max-width: 760px) {
6235
+ .ow-container {
6236
+ padding-inline: var(--ow-page-gutter);
6237
+ }
6238
+ }
6239
+
6240
+ /* components/Section/Section.css */
6241
+ /* A band of the page: a block's vertical space and ground, full width. Its Container sets the width inside. */
6242
+
6243
+ .ow-section {
6244
+ box-sizing: border-box;
6245
+ width: 100%;
6246
+ color: var(--ow-text);
6247
+ }
6248
+
6249
+ .ow-section--paper {
6250
+ background: var(--ow-paper);
6251
+ }
6252
+
6253
+ .ow-section--canvas {
6254
+ background: var(--ow-canvas);
6255
+ }
6256
+
6257
+ .ow-section--surface {
6258
+ background: var(--ow-surface);
6259
+ }
6260
+
6261
+ .ow-section--space-md {
6262
+ padding-block: var(--ow-section-y);
6263
+ }
6264
+
6265
+ .ow-section--space-sm {
6266
+ padding-block: calc(var(--ow-section-y) / 2);
6267
+ }
6268
+
6269
+ @media (max-width: 760px) {
6270
+ .ow-section--space-md {
6271
+ padding-block: 72px;
6272
+ }
6273
+ .ow-section--space-sm {
6274
+ padding-block: 36px;
6275
+ }
6276
+ }
6277
+
6195
6278
  /* components/Marketing/Marketing.css */
6196
6279
  /* Marketing patterns from the site: Chip, SectionHeading, SiteHeader and the dot grid. */
6197
6280
  .ow-chip {