@0001-labs/design-system-1 0.3.0-alpha.14 → 0.3.0-alpha.15

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 (175) hide show
  1. package/DS1/0-face/component-visibility.ts +1 -0
  2. package/DS1/0-face/toast-queue.ts +1 -1
  3. package/DS1/0-face/toaster.ts +2 -2
  4. package/DS1/1-root/cjk.css +1 -1
  5. package/DS1/1-root/controls.css +5 -1
  6. package/DS1/1-root/fonts.css +1 -1
  7. package/DS1/1-root/one.css +1 -1
  8. package/DS1/1-root/one.semantic.css +1 -1
  9. package/DS1/1-root/row.css +3 -0
  10. package/DS1/2-core/ds-cycle.ts +5 -5
  11. package/DS1/2-core/ds-message.ts +218 -0
  12. package/DS1/2-core/ds-notice.ts +7 -177
  13. package/DS1/2-core/ds-toast.ts +2 -2
  14. package/DS1/2-core/generated/ds-icon-map.ts +4 -0
  15. package/DS1/2-core/generated/icons-extra.ts +2 -0
  16. package/DS1/2-core/generated/icons-immediate.ts +1 -1
  17. package/DS1/2-core/styles/ds-cycle.css +0 -59
  18. package/DS1/2-core/styles/ds-notice.css +4 -2
  19. package/DS1/3-unit/ds-sidebar.ts +98 -12
  20. package/DS1/3-unit/styles/ds-sidebar.css +18 -1
  21. package/DS1/index.ts +1 -3
  22. package/DS1/react/message.ts +73 -0
  23. package/DS1/react/sidebar.ts +15 -4
  24. package/DS1/x-icon/chevron-down.svg +3 -0
  25. package/DS1/x-icon/chevron-up.svg +3 -0
  26. package/README.md +1 -1
  27. package/dist/0-face/component-visibility.d.ts.map +1 -1
  28. package/dist/0-face/component-visibility.js +1 -0
  29. package/dist/0-face/toast-queue.d.ts +1 -1
  30. package/dist/0-face/toast-queue.d.ts.map +1 -1
  31. package/dist/0-face/toast-queue.js +1 -1
  32. package/dist/0-face/toaster.d.ts +1 -1
  33. package/dist/0-face/toaster.d.ts.map +1 -1
  34. package/dist/0-face/toaster.js +1 -1
  35. package/dist/2-core/ds-cycle.d.ts +2 -2
  36. package/dist/2-core/ds-cycle.js +5 -5
  37. package/dist/2-core/ds-message.d.ts +154 -0
  38. package/dist/2-core/ds-message.d.ts.map +1 -0
  39. package/dist/2-core/ds-message.js +177 -0
  40. package/dist/2-core/ds-notice.d.ts +6 -96
  41. package/dist/2-core/ds-notice.d.ts.map +1 -1
  42. package/dist/2-core/ds-notice.js +6 -147
  43. package/dist/2-core/ds-toast.d.ts +1 -1
  44. package/dist/2-core/ds-toast.js +2 -2
  45. package/dist/2-core/generated/ds-icon-map.d.ts +3 -1
  46. package/dist/2-core/generated/ds-icon-map.d.ts.map +1 -1
  47. package/dist/2-core/generated/ds-icon-map.js +4 -0
  48. package/dist/2-core/generated/icons-extra.d.ts.map +1 -1
  49. package/dist/2-core/generated/icons-extra.js +2 -0
  50. package/dist/2-core/generated/icons-immediate.d.ts +1 -1
  51. package/dist/2-core/generated/icons-immediate.d.ts.map +1 -1
  52. package/dist/2-core/generated/icons-immediate.js +1 -1
  53. package/dist/3-unit/ds-sidebar.d.ts +41 -0
  54. package/dist/3-unit/ds-sidebar.d.ts.map +1 -1
  55. package/dist/3-unit/ds-sidebar.js +85 -11
  56. package/dist/design-system-1.bundle.js +1325 -1508
  57. package/dist/design-system-1.bundle.js.map +1 -1
  58. package/dist/design-system-1.bundle.min.js +2474 -2553
  59. package/dist/design-system-1.bundle.min.js.map +1 -1
  60. package/dist/feedback.js +8 -8
  61. package/dist/feedback.js.map +1 -1
  62. package/dist/{icons-extra-cfzoudMf.js → icons-extra-CiDDs7_-.js} +7 -1
  63. package/dist/{icons-extra-cfzoudMf.js.map → icons-extra-CiDDs7_-.js.map} +1 -1
  64. package/dist/{icons-extra-DSav6uTU.js → icons-extra-hauwCx07.js} +3 -1
  65. package/dist/{icons-extra-DSav6uTU.js.map → icons-extra-hauwCx07.js.map} +1 -1
  66. package/dist/index.d.ts +1 -3
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +1 -3
  69. package/dist/react/message.d.ts +66 -0
  70. package/dist/react/message.d.ts.map +1 -0
  71. package/dist/react/message.js +37 -0
  72. package/dist/react/sidebar.d.ts +12 -2
  73. package/dist/react/sidebar.d.ts.map +1 -1
  74. package/dist/react/sidebar.js +9 -2
  75. package/package.json +6 -4
  76. package/DS1/1-root/kbd.css +0 -46
  77. package/DS1/2-core/ds-kbd.ts +0 -78
  78. package/DS1/2-core/ds-loading.ts +0 -72
  79. package/DS1/2-core/ds-spacing-handle.ts +0 -22
  80. package/DS1/2-core/spacing-handle.ts +0 -95
  81. package/DS1/2-core/styles/ds-kbd.css +0 -12
  82. package/DS1/2-core/styles/ds-loading.css +0 -13
  83. package/DS1/2-core/styles/ds-spacing-handle.css +0 -8
  84. package/DS1/react/kbd.ts +0 -21
  85. package/DS1/react/loading.ts +0 -18
  86. package/DS1/react/spacing-handle.ts +0 -21
  87. package/dist/0-face/tree.d.ts +0 -69
  88. package/dist/0-face/tree.d.ts.map +0 -1
  89. package/dist/0-face/tree.js +0 -191
  90. package/dist/2-core/ds-banner.d.ts +0 -84
  91. package/dist/2-core/ds-banner.d.ts.map +0 -1
  92. package/dist/2-core/ds-banner.js +0 -134
  93. package/dist/2-core/ds-date.d.ts +0 -16
  94. package/dist/2-core/ds-date.d.ts.map +0 -1
  95. package/dist/2-core/ds-date.js +0 -15
  96. package/dist/2-core/ds-kbd.d.ts +0 -48
  97. package/dist/2-core/ds-kbd.d.ts.map +0 -1
  98. package/dist/2-core/ds-kbd.js +0 -65
  99. package/dist/2-core/ds-language.d.ts +0 -82
  100. package/dist/2-core/ds-language.d.ts.map +0 -1
  101. package/dist/2-core/ds-language.js +0 -74
  102. package/dist/2-core/ds-loading.d.ts +0 -40
  103. package/dist/2-core/ds-loading.d.ts.map +0 -1
  104. package/dist/2-core/ds-loading.js +0 -63
  105. package/dist/2-core/ds-meter.d.ts +0 -103
  106. package/dist/2-core/ds-meter.d.ts.map +0 -1
  107. package/dist/2-core/ds-meter.js +0 -124
  108. package/dist/2-core/ds-pagedots.d.ts +0 -89
  109. package/dist/2-core/ds-pagedots.d.ts.map +0 -1
  110. package/dist/2-core/ds-pagedots.js +0 -142
  111. package/dist/2-core/ds-spacing-handle.d.ts +0 -25
  112. package/dist/2-core/ds-spacing-handle.d.ts.map +0 -1
  113. package/dist/2-core/ds-spacing-handle.js +0 -25
  114. package/dist/2-core/ds-split.d.ts +0 -12
  115. package/dist/2-core/ds-split.d.ts.map +0 -1
  116. package/dist/2-core/ds-split.js +0 -7
  117. package/dist/2-core/ds-steps.d.ts +0 -72
  118. package/dist/2-core/ds-steps.d.ts.map +0 -1
  119. package/dist/2-core/ds-steps.js +0 -114
  120. package/dist/2-core/ds-textarea.d.ts +0 -46
  121. package/dist/2-core/ds-textarea.d.ts.map +0 -1
  122. package/dist/2-core/ds-textarea.js +0 -122
  123. package/dist/2-core/ds-toggle.d.ts +0 -11
  124. package/dist/2-core/ds-toggle.d.ts.map +0 -1
  125. package/dist/2-core/ds-toggle.js +0 -10
  126. package/dist/2-core/spacing-handle.d.ts +0 -28
  127. package/dist/2-core/spacing-handle.d.ts.map +0 -1
  128. package/dist/2-core/spacing-handle.js +0 -146
  129. package/dist/3-unit/ds-tree.d.ts +0 -69
  130. package/dist/3-unit/ds-tree.d.ts.map +0 -1
  131. package/dist/3-unit/ds-tree.js +0 -136
  132. package/dist/4-page/ds-layout.d.ts +0 -32
  133. package/dist/4-page/ds-layout.d.ts.map +0 -1
  134. package/dist/4-page/ds-layout.js +0 -930
  135. package/dist/icons-extra-B4Iotc7s.js +0 -298
  136. package/dist/icons-extra-B4Iotc7s.js.map +0 -1
  137. package/dist/icons-extra-BoAACA4X.js +0 -944
  138. package/dist/icons-extra-BoAACA4X.js.map +0 -1
  139. package/dist/icons-extra-C4sCgoUj.js +0 -185
  140. package/dist/icons-extra-C4sCgoUj.js.map +0 -1
  141. package/dist/icons-extra-Dc_yVWIz.js +0 -1024
  142. package/dist/icons-extra-Dc_yVWIz.js.map +0 -1
  143. package/dist/icons-extra-DlxTo_Y4.js +0 -247
  144. package/dist/icons-extra-DlxTo_Y4.js.map +0 -1
  145. package/dist/icons-extra-g_xpwZhZ.js +0 -631
  146. package/dist/icons-extra-g_xpwZhZ.js.map +0 -1
  147. package/dist/react/kbd.d.ts +0 -26
  148. package/dist/react/kbd.d.ts.map +0 -1
  149. package/dist/react/kbd.js +0 -8
  150. package/dist/react/loading.d.ts +0 -14
  151. package/dist/react/loading.d.ts.map +0 -1
  152. package/dist/react/loading.js +0 -14
  153. package/dist/react/meter.d.ts +0 -64
  154. package/dist/react/meter.d.ts.map +0 -1
  155. package/dist/react/meter.js +0 -15
  156. package/dist/react/spacing-handle.d.ts +0 -13
  157. package/dist/react/spacing-handle.d.ts.map +0 -1
  158. package/dist/react/spacing-handle.js +0 -18
  159. package/dist/react/split.d.ts +0 -7
  160. package/dist/react/split.d.ts.map +0 -1
  161. package/dist/react/split.js +0 -6
  162. package/dist/react/steps.d.ts +0 -36
  163. package/dist/react/steps.d.ts.map +0 -1
  164. package/dist/react/steps.js +0 -10
  165. package/dist/react/tree.d.ts +0 -31
  166. package/dist/react/tree.d.ts.map +0 -1
  167. package/dist/react/tree.js +0 -37
  168. package/dist/shared-words-BfnT24Fe.js +0 -1635
  169. package/dist/shared-words-BfnT24Fe.js.map +0 -1
  170. package/dist/shared-words-Cg6Phtx0.js +0 -915
  171. package/dist/shared-words-Cg6Phtx0.js.map +0 -1
  172. package/dist/shared-words-Ddz0yUEF.js +0 -933
  173. package/dist/shared-words-Ddz0yUEF.js.map +0 -1
  174. package/dist/shared-words-UCvnkctb.js +0 -1653
  175. package/dist/shared-words-UCvnkctb.js.map +0 -1
@@ -4,6 +4,7 @@ export type ComponentVisibility = "public" | "internal";
4
4
  export const COMPONENT_VISIBILITY: Readonly<Record<string, ComponentVisibility>> = {
5
5
  "spacing-handle": "internal",
6
6
  "loading": "internal",
7
+ "kbd": "internal",
7
8
  };
8
9
  export function componentVisibility(name: string): ComponentVisibility {
9
10
  return COMPONENT_VISIBILITY[name.replace(/^ds-/, "")] ?? "public";
@@ -62,7 +62,7 @@ export type ToastSignal = { toast: ToastData } | { dismiss: ToastId | undefined
62
62
  type Listener = (signal: ToastSignal) => void;
63
63
 
64
64
  /** Sonner's constants, shared by both toasters; its gap and offset are rounded to squares in the stylesheet. */
65
- export const TOAST_DURATION = 4000;
65
+ export const TOAST_DURATION = Infinity;
66
66
  export const VISIBLE_TOASTS = 3;
67
67
  export const TIME_BEFORE_UNMOUNT = 200;
68
68
  export const SWIPE_THRESHOLD = 45;
@@ -47,7 +47,7 @@ export interface ToasterOptions {
47
47
  expand?: boolean;
48
48
  /** How many show at once; three by default. */
49
49
  visibleToasts?: number;
50
- /** Milliseconds each toast stays; 4000 by default. */
50
+ /** Milliseconds each toast stays; Infinity by default, until dismissed. */
51
51
  duration?: number;
52
52
  /** A close button on every toast. */
53
53
  closeButton?: boolean;
@@ -234,7 +234,7 @@ class PageToaster {
234
234
  private draw(item: Item) {
235
235
  const { data } = item;
236
236
  const dismissible = data.dismissible !== false;
237
- const closeButton = (data.closeButton ?? settings.closeButton ?? false) && dismissible;
237
+ const closeButton = (data.closeButton ?? settings.closeButton ?? true) && dismissible;
238
238
  const closeLabel = settings.closeLabel ?? feedbackWord("Close");
239
239
  const key = JSON.stringify([data.title, data.description, data.type, data.icon, data.action?.label, data.action?.href, data.cancel?.label, data.cancel?.href, closeButton, closeLabel]);
240
240
  const previous = item.element?.querySelector<HTMLElement>(".body");
@@ -1,4 +1,4 @@
1
- /* version 0.3.0-alpha.14 */
1
+ /* version 0.3.0-alpha.15 */
2
2
 
3
3
  /* Noto Sans for Japanese and Chinese, for a product that shows them. Opt in:
4
4
  link it beside one.css or fonts.css, or ask Sync 1 for "cjk": true. Without
@@ -3,7 +3,6 @@
3
3
  @import "./text.css";
4
4
  @import "./empty.css";
5
5
  @import "./notice.css";
6
- @import "./kbd.css";
7
6
  @import "./dialog-placement.css";
8
7
  @import "./header.css";
9
8
  @import "./footer.css";
@@ -140,6 +139,11 @@ a.ds-button[aria-disabled="true"] {
140
139
  text-decoration-color: var(--ds-link-hover-line-color, currentColor);
141
140
  }
142
141
 
142
+ /* Quiet navigation and related-component lists: no underline in any state. */
143
+ .ds-link.ds-link--plain {
144
+ text-decoration: none;
145
+ }
146
+
143
147
  .ds-link:focus-visible {
144
148
  outline: 2px solid var(--ds-focus-ring);
145
149
  outline-offset: 1px;
@@ -1,4 +1,4 @@
1
- /* version 0.3.0-alpha.14 */
1
+ /* version 0.3.0-alpha.15 */
2
2
 
3
3
  /* Design system 1's faces and the typeface tokens that name them, on their
4
4
  own: a page that does not load one.css links this sheet (one.css imports
@@ -1,4 +1,4 @@
1
- /* version 0.3.0-alpha.14 */
1
+ /* version 0.3.0-alpha.15 */
2
2
 
3
3
  @import "./grid.css";
4
4
  @import "./component-tokens.css";
@@ -1,4 +1,4 @@
1
- /* DS1 — version 0.3.0-alpha.14 */
1
+ /* DS1 — version 0.3.0-alpha.15 */
2
2
  /* A classless stylesheet for native HTML. No JavaScript is required. */
3
3
 
4
4
  /* It draws on Design system 1's measures: the 20px square, 14px type on
@@ -89,10 +89,13 @@ button.ds-row,
89
89
  -webkit-tap-highlight-color: transparent;
90
90
  }
91
91
 
92
+ /* The font inherited above would bring the page's line into the row: the words go back on the
93
+ sixteen, as every row's (a stacked tile keeps its square lines below). */
92
94
  a.ds-row,
93
95
  button.ds-row {
94
96
  position: relative;
95
97
  width: 100%;
98
+ line-height: var(--ds-type-lineheight-default);
96
99
  padding: 0 var(--ds-row-padding, calc(4px * var(--ds-sf)));
97
100
  border-radius: var(--ds-row-radius, 0);
98
101
  }
@@ -74,7 +74,7 @@ export class Cycle extends LitElement {
74
74
  static get properties() {
75
75
  return {
76
76
  type: { type: String, reflect: true },
77
- // The language picker as a chip, the cycle's button, instead of an item.
77
+ // Compatibility attribute; every language picker now uses the normal button.
78
78
  chip: { type: Boolean, reflect: true },
79
79
  values: { type: Array },
80
80
  value: { type: String },
@@ -607,8 +607,8 @@ export class Cycle extends LitElement {
607
607
 
608
608
  /**
609
609
  * The language picker: a native button carrying the language's code as
610
- * `lang`, so each name is set in its own typeface. An item on its own, eight
611
- * squares wide (four with `compact`); with `chip`, the cycle's button around it.
610
+ * `lang`, so each name is set in its own typeface. Always uses the normal
611
+ * label-sized button; legacy `chip` and `compact` attributes do not change its width.
612
612
  */
613
613
  private renderLanguagePicker() {
614
614
  const code = this.currentValue || currentLanguage.value;
@@ -621,9 +621,9 @@ export class Cycle extends LitElement {
621
621
  >
622
622
  ${nativeLanguageName(code)}
623
623
  </button>`;
624
- return this.chip ? html`<ds-button fit control="slotted"
624
+ return html`<ds-button fit control="slotted"
625
625
  ?primary=${this.primary && !this.secondary} ?secondary=${this.secondary}
626
- ?disabled=${this.disabled || this._fieldsetDisabled}>${button}</ds-button>` : button;
626
+ ?disabled=${this.disabled || this._fieldsetDisabled}>${button}</ds-button>`;
627
627
  }
628
628
 
629
629
  render() {
@@ -0,0 +1,218 @@
1
+ // ds-message.ts
2
+ // An inline notice in the flow of the page: a tone, a title and/or text,
3
+ // actions and an optional dismiss; with `banner`, a strip across the top of
4
+ // its positioning context instead. Drawn by 1-root/notice.css, the same
5
+ // classes a page without scripts writes.
6
+
7
+ import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
8
+ import { getText } from "../0-face/i18n";
9
+ import { define } from "../0-face/define";
10
+ import "./ds-icon";
11
+ import "./ds-toast";
12
+ import type { ToastPosition } from "../0-face/toast-queue";
13
+ export { toast as message } from "../0-face/toast-queue";
14
+ export type { ToastOptions as MessageOptions, ToastId as MessageId } from "../0-face/toast-queue";
15
+ export type MessageForm = "inline" | "banner" | "toast" | "assistant";
16
+ import metrics from "../1-root/component-metrics.css?inline";
17
+ import controls from "../1-root/controls.css?inline";
18
+ import styles from "./styles/ds-notice.css?inline";
19
+
20
+ export type MessageTone = "neutral" | "success" | "warning" | "danger";
21
+ const TONES: readonly MessageTone[] = ["neutral", "success", "warning", "danger"];
22
+ /** The icon each tone's mark carries unless `icon` names another. */
23
+ export const MESSAGE_ICONS: Readonly<Record<MessageTone, string>> = {
24
+ neutral: "info",
25
+ success: "check",
26
+ warning: "warning",
27
+ danger: "warning",
28
+ };
29
+
30
+ /** Detail of `ds-message-dismiss`. Cancel the event to keep the notice and remove it yourself. */
31
+ export interface MessageDismissDetail { tone: MessageTone }
32
+
33
+ /**
34
+ * @element ds-message
35
+ * @prop {"neutral" | "success" | "warning" | "danger"} tone - The mark's colour
36
+ * and icon; danger also turns the words into the danger colour. Neutral by default.
37
+ * @prop {string} heading - A title: a translation key, or literal words.
38
+ * @prop {string} text - The text: a translation key, or literal words.
39
+ * @prop {boolean} literal - Show `heading` and `text` as written, never looked up.
40
+ * @prop {string} icon - An icon from the library in place of the tone's own.
41
+ * @prop {boolean} dismissible - Show a close button at the end of the first line.
42
+ * @prop {boolean} banner - A strip one square high across the top of its
43
+ * positioning context, filled in the tone's colour, its words, actions and
44
+ * close button on one line; it reserves no room in the flow.
45
+ *
46
+ * @slot - The text, when it needs more than words: a link, a strong word.
47
+ * @slot heading - The title, as inline content.
48
+ * @slot icon - An icon of the page's own inside the mark.
49
+ * @slot actions - Buttons or links on the row under the words.
50
+ *
51
+ * @fires ds-message-dismiss - The close button was pressed. Cancelable: unless
52
+ * it is cancelled, the notice hides itself.
53
+ *
54
+ * The element is a live region: `role="status"`, or `role="alert"` for danger,
55
+ * unless the page gives it a role of its own.
56
+ *
57
+ * @example
58
+ * <ds-message tone="danger" heading="Couldn't save" dismissible>
59
+ * Your changes are kept on this device.
60
+ * <ds-button slot="actions" secondary>Try again</ds-button>
61
+ * </ds-message>
62
+ */
63
+ export class Message extends LitElement {
64
+ static properties = {
65
+ expand: { type: Boolean },
66
+ visibleToasts: { type: Number, attribute: "visible-toasts" },
67
+ richColors: { type: Boolean, attribute: "rich-colors" },
68
+ contained: { type: Boolean },
69
+ label: { type: String },
70
+ closeLabel: { type: String, attribute: "close-label" },
71
+ form: { type: String, reflect: true },
72
+ position: { type: String },
73
+ duration: { type: Number },
74
+ closeButton: { type: Boolean, attribute: "close-button" },
75
+ tone: { type: String, reflect: true },
76
+ heading: { type: String },
77
+ text: { type: String },
78
+ literal: { type: Boolean, reflect: true },
79
+ icon: { type: String },
80
+ dismissible: { type: Boolean, reflect: true },
81
+ banner: { type: Boolean, reflect: true },
82
+ };
83
+
84
+ static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
85
+
86
+ declare expand: boolean;
87
+ declare visibleToasts: number;
88
+ declare richColors: boolean;
89
+ declare contained: boolean;
90
+ declare label: string;
91
+ declare closeLabel: string;
92
+ declare form: MessageForm;
93
+ declare position: ToastPosition;
94
+ declare duration: number;
95
+ declare closeButton: boolean;
96
+ protected dismissEvent = "ds-message-dismiss";
97
+
98
+ declare tone: MessageTone;
99
+ declare heading: string | undefined;
100
+ declare text: string | undefined;
101
+ declare literal: boolean;
102
+ declare icon: string | undefined;
103
+ declare dismissible: boolean;
104
+ declare banner: boolean;
105
+
106
+ /** The role this element last set, so a role the page wrote is left alone. */
107
+ private ownRole: string | null = null;
108
+ private readonly relabel = () => this.requestUpdate();
109
+
110
+ constructor() {
111
+ super();
112
+ this.expand = false;
113
+ this.visibleToasts = 3;
114
+ this.richColors = false;
115
+ this.contained = false;
116
+ this.label = "Messages";
117
+ this.closeLabel = "Close";
118
+ this.form = "inline";
119
+ this.position = "bottom-right";
120
+ this.duration = Infinity;
121
+ this.closeButton = true;
122
+ this.tone = "neutral";
123
+ this.literal = false;
124
+ this.dismissible = false;
125
+ this.banner = false;
126
+ }
127
+
128
+ /** The tone in effect: an unknown value reads as neutral. */
129
+ get resolvedTone(): MessageTone {
130
+ return TONES.includes(this.tone) ? this.tone : "neutral";
131
+ }
132
+
133
+ connectedCallback() {
134
+ super.connectedCallback();
135
+ window.addEventListener("language-changed", this.relabel);
136
+ window.addEventListener("translations-loaded", this.relabel);
137
+ this.syncRole();
138
+ }
139
+
140
+ disconnectedCallback() {
141
+ window.removeEventListener("language-changed", this.relabel);
142
+ window.removeEventListener("translations-loaded", this.relabel);
143
+ super.disconnectedCallback();
144
+ }
145
+
146
+ protected willUpdate(changed: PropertyValues<this>) {
147
+ super.willUpdate(changed);
148
+ if (changed.has("tone") || changed.has("form")) this.syncRole();
149
+ }
150
+
151
+ private syncRole() {
152
+ if (!this.isConnected) return;
153
+ const current = this.getAttribute("role");
154
+ if (current !== null && current !== this.ownRole) return;
155
+ this.ownRole = this.form === "toast" ? "presentation" : this.resolvedTone === "danger" ? "alert" : "status";
156
+ if (current !== this.ownRole) this.setAttribute("role", this.ownRole);
157
+ }
158
+
159
+ private words(value: string | undefined): string {
160
+ if (!value) return "";
161
+ return this.literal ? value : getText(value) || value;
162
+ }
163
+
164
+ /**
165
+ * Whether light-DOM content fills a slot: elements, or text that is not
166
+ * blank. The blank text between slotted children still counts as assigned
167
+ * to the default slot and hides its fallback, so `text` is drawn beside the
168
+ * slot rather than inside it.
169
+ */
170
+ private slotted(name: string): boolean {
171
+ return [...this.childNodes].some(node => name
172
+ ? node instanceof Element && node.getAttribute("slot") === name
173
+ : node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
174
+ }
175
+
176
+ /** Ask to close: hides the notice unless a listener cancels `ds-message-dismiss`. */
177
+ dismiss(): boolean {
178
+ const event = new CustomEvent<MessageDismissDetail>(this.dismissEvent, {
179
+ bubbles: true, composed: true, cancelable: true, detail: { tone: this.resolvedTone },
180
+ });
181
+ if (!this.dispatchEvent(event)) return false;
182
+ this.hidden = true;
183
+ return true;
184
+ }
185
+
186
+ render() {
187
+ if (this.form === "toast") return html`<ds-toast .expand=${this.expand} .visibleToasts=${this.visibleToasts} .richColors=${this.richColors} .contained=${this.contained} .label=${this.label} .closeLabel=${this.closeLabel} .position=${this.position} .duration=${this.duration} .closeButton=${this.closeButton}></ds-toast>`;
188
+ const tone = this.resolvedTone;
189
+ const heading = this.words(this.heading);
190
+ const text = this.words(this.text);
191
+ const hasHeading = Boolean(heading) || this.slotted("heading");
192
+ const slottedText = this.slotted("");
193
+ const hasText = Boolean(text) || slottedText;
194
+ const hasActions = this.slotted("actions");
195
+ const changed = () => this.requestUpdate();
196
+ return html`<div class="ds-notice${tone === "neutral" ? "" : ` ds-notice--${tone}`}${(this.banner || this.form === "banner") ? " ds-notice--banner" : ""}" part="message notice">
197
+ <span class="ds-notice__mark" part="mark" aria-hidden="true">
198
+ <slot name="icon" @slotchange=${changed}><ds-icon size="large" .type=${this.icon || MESSAGE_ICONS[tone]}></ds-icon></slot>
199
+ </span>
200
+ <div class="ds-notice__title" part="title" ?hidden=${!hasHeading}><slot name="heading" @slotchange=${changed}>${heading}</slot></div>
201
+ <div class="ds-notice__text" part="text" ?hidden=${!hasText}><slot @slotchange=${changed}></slot>${slottedText ? nothing : text}</div>
202
+ <div class="ds-notice__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${changed}></slot></div>
203
+ ${this.dismissible
204
+ ? html`<button class="ds-button ds-button--icon ds-notice__dismiss" part="dismiss" type="button" aria-label=${getText("Close") || "Close"} @click=${() => this.dismiss()}>
205
+ <ds-icon type="close" aria-hidden="true"></ds-icon>
206
+ </button>`
207
+ : nothing}
208
+ </div>`;
209
+ }
210
+ }
211
+
212
+ define("ds-message", Message);
213
+
214
+ declare global {
215
+ interface HTMLElementTagNameMap {
216
+ "ds-message": Message;
217
+ }
218
+ }
@@ -1,180 +1,10 @@
1
- // ds-notice.ts
2
- // An inline notice in the flow of the page: a tone, a title and/or text,
3
- // actions and an optional dismiss; with `banner`, a strip across the top of
4
- // its positioning context instead. Drawn by 1-root/notice.css, the same
5
- // classes a page without scripts writes.
6
-
7
- import { LitElement, html, nothing, unsafeCSS, type PropertyValues } from "lit";
8
- import { getText } from "../0-face/i18n";
1
+ /** Compatibility name. New surfaces use Message. */
2
+ import { Message, MESSAGE_ICONS } from "./ds-message";
9
3
  import { define } from "../0-face/define";
10
- import "./ds-icon";
11
- import metrics from "../1-root/component-metrics.css?inline";
12
- import controls from "../1-root/controls.css?inline";
13
- import styles from "./styles/ds-notice.css?inline";
14
-
15
- export type NoticeTone = "neutral" | "success" | "warning" | "danger";
16
- const TONES: readonly NoticeTone[] = ["neutral", "success", "warning", "danger"];
17
- /** The icon each tone's mark carries unless `icon` names another. */
18
- export const NOTICE_ICONS: Readonly<Record<NoticeTone, string>> = {
19
- neutral: "info",
20
- success: "check",
21
- warning: "warning",
22
- danger: "warning",
23
- };
24
-
25
- /** Detail of `ds-notice-dismiss`. Cancel the event to keep the notice and remove it yourself. */
26
- export interface NoticeDismissDetail { tone: NoticeTone }
27
-
28
- /**
29
- * @element ds-notice
30
- * @prop {"neutral" | "success" | "warning" | "danger"} tone - The mark's colour
31
- * and icon; danger also turns the words into the danger colour. Neutral by default.
32
- * @prop {string} heading - A title: a translation key, or literal words.
33
- * @prop {string} text - The text: a translation key, or literal words.
34
- * @prop {boolean} literal - Show `heading` and `text` as written, never looked up.
35
- * @prop {string} icon - An icon from the library in place of the tone's own.
36
- * @prop {boolean} dismissible - Show a close button at the end of the first line.
37
- * @prop {boolean} banner - A strip one square high across the top of its
38
- * positioning context, filled in the tone's colour, its words, actions and
39
- * close button on one line; it reserves no room in the flow.
40
- *
41
- * @slot - The text, when it needs more than words: a link, a strong word.
42
- * @slot heading - The title, as inline content.
43
- * @slot icon - An icon of the page's own inside the mark.
44
- * @slot actions - Buttons or links on the row under the words.
45
- *
46
- * @fires ds-notice-dismiss - The close button was pressed. Cancelable: unless
47
- * it is cancelled, the notice hides itself.
48
- *
49
- * The element is a live region: `role="status"`, or `role="alert"` for danger,
50
- * unless the page gives it a role of its own.
51
- *
52
- * @example
53
- * <ds-notice tone="danger" heading="Couldn't save" dismissible>
54
- * Your changes are kept on this device.
55
- * <ds-button slot="actions" secondary>Try again</ds-button>
56
- * </ds-notice>
57
- */
58
- export class Notice extends LitElement {
59
- static properties = {
60
- tone: { type: String, reflect: true },
61
- heading: { type: String },
62
- text: { type: String },
63
- literal: { type: Boolean, reflect: true },
64
- icon: { type: String },
65
- dismissible: { type: Boolean, reflect: true },
66
- banner: { type: Boolean, reflect: true },
67
- };
68
-
69
- static styles = [unsafeCSS(metrics), unsafeCSS(controls), unsafeCSS(styles)];
70
-
71
- declare tone: NoticeTone;
72
- declare heading: string | undefined;
73
- declare text: string | undefined;
74
- declare literal: boolean;
75
- declare icon: string | undefined;
76
- declare dismissible: boolean;
77
- declare banner: boolean;
78
-
79
- /** The role this element last set, so a role the page wrote is left alone. */
80
- private ownRole: string | null = null;
81
- private readonly relabel = () => this.requestUpdate();
82
-
83
- constructor() {
84
- super();
85
- this.tone = "neutral";
86
- this.literal = false;
87
- this.dismissible = false;
88
- this.banner = false;
89
- }
90
-
91
- /** The tone in effect: an unknown value reads as neutral. */
92
- get resolvedTone(): NoticeTone {
93
- return TONES.includes(this.tone) ? this.tone : "neutral";
94
- }
95
-
96
- connectedCallback() {
97
- super.connectedCallback();
98
- window.addEventListener("language-changed", this.relabel);
99
- window.addEventListener("translations-loaded", this.relabel);
100
- this.syncRole();
101
- }
102
-
103
- disconnectedCallback() {
104
- window.removeEventListener("language-changed", this.relabel);
105
- window.removeEventListener("translations-loaded", this.relabel);
106
- super.disconnectedCallback();
107
- }
108
-
109
- protected willUpdate(changed: PropertyValues<this>) {
110
- super.willUpdate(changed);
111
- if (changed.has("tone")) this.syncRole();
112
- }
113
-
114
- private syncRole() {
115
- if (!this.isConnected) return;
116
- const current = this.getAttribute("role");
117
- if (current !== null && current !== this.ownRole) return;
118
- this.ownRole = this.resolvedTone === "danger" ? "alert" : "status";
119
- if (current !== this.ownRole) this.setAttribute("role", this.ownRole);
120
- }
121
-
122
- private words(value: string | undefined): string {
123
- if (!value) return "";
124
- return this.literal ? value : getText(value) || value;
125
- }
126
-
127
- /**
128
- * Whether light-DOM content fills a slot: elements, or text that is not
129
- * blank. The blank text between slotted children still counts as assigned
130
- * to the default slot and hides its fallback, so `text` is drawn beside the
131
- * slot rather than inside it.
132
- */
133
- private slotted(name: string): boolean {
134
- return [...this.childNodes].some(node => name
135
- ? node instanceof Element && node.getAttribute("slot") === name
136
- : node instanceof Element ? !node.hasAttribute("slot") : node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim()));
137
- }
138
-
139
- /** Ask to close: hides the notice unless a listener cancels `ds-notice-dismiss`. */
140
- dismiss(): boolean {
141
- const event = new CustomEvent<NoticeDismissDetail>("ds-notice-dismiss", {
142
- bubbles: true, composed: true, cancelable: true, detail: { tone: this.resolvedTone },
143
- });
144
- if (!this.dispatchEvent(event)) return false;
145
- this.hidden = true;
146
- return true;
147
- }
148
-
149
- render() {
150
- const tone = this.resolvedTone;
151
- const heading = this.words(this.heading);
152
- const text = this.words(this.text);
153
- const hasHeading = Boolean(heading) || this.slotted("heading");
154
- const slottedText = this.slotted("");
155
- const hasText = Boolean(text) || slottedText;
156
- const hasActions = this.slotted("actions");
157
- const changed = () => this.requestUpdate();
158
- return html`<div class="ds-notice${tone === "neutral" ? "" : ` ds-notice--${tone}`}${this.banner ? " ds-notice--banner" : ""}" part="notice">
159
- <span class="ds-notice__mark" part="mark" aria-hidden="true">
160
- <slot name="icon" @slotchange=${changed}><ds-icon size="large" .type=${this.icon || NOTICE_ICONS[tone]}></ds-icon></slot>
161
- </span>
162
- <div class="ds-notice__title" part="title" ?hidden=${!hasHeading}><slot name="heading" @slotchange=${changed}>${heading}</slot></div>
163
- <div class="ds-notice__text" part="text" ?hidden=${!hasText}><slot @slotchange=${changed}></slot>${slottedText ? nothing : text}</div>
164
- <div class="ds-notice__actions" part="actions" ?hidden=${!hasActions}><slot name="actions" @slotchange=${changed}></slot></div>
165
- ${this.dismissible
166
- ? html`<button class="ds-button ds-button--icon ds-notice__dismiss" part="dismiss" type="button" aria-label=${getText("Close") || "Close"} @click=${() => this.dismiss()}>
167
- <ds-icon type="close" aria-hidden="true"></ds-icon>
168
- </button>`
169
- : nothing}
170
- </div>`;
171
- }
4
+ export type { MessageTone as NoticeTone, MessageDismissDetail as NoticeDismissDetail } from "./ds-message";
5
+ export const NOTICE_ICONS = MESSAGE_ICONS;
6
+ export class Notice extends Message {
7
+ protected dismissEvent = "ds-notice-dismiss";
172
8
  }
173
-
174
9
  define("ds-notice", Notice);
175
-
176
- declare global {
177
- interface HTMLElementTagNameMap {
178
- "ds-notice": Notice;
179
- }
180
- }
10
+ declare global { interface HTMLElementTagNameMap { "ds-notice": Notice } }
@@ -13,7 +13,7 @@
13
13
  * - `<ds-toast>` is Sonner's `<Toaster />`, with its `position`, `expand`,
14
14
  * `visible-toasts`, `duration`, `close-button` and `rich-colors`;
15
15
  * `contained` draws it inside its positioned parent instead of the window.
16
- * - A toast stays 4 seconds; its timer pauses while the stack is hovered,
16
+ * - A toast stays until dismissed; an explicitly timed toast pauses while the stack is hovered,
17
17
  * focused, held or the tab is hidden. Three show at once, stacked behind
18
18
  * one another and spread out on hover. A swipe towards the edge dismisses one,
19
19
  * Alt+T reaches them from the keyboard, and they come and go with Sonner's
@@ -101,7 +101,7 @@ export class Toaster extends LitElement {
101
101
  this.expand = false;
102
102
  this.visibleToasts = VISIBLE_TOASTS;
103
103
  this.duration = DURATION;
104
- this.closeButton = false;
104
+ this.closeButton = true;
105
105
  this.richColors = false;
106
106
  this.contained = false;
107
107
  this.label = "Notifications";
@@ -108,8 +108,10 @@ export const iconNameToSvgMap = {
108
108
  "categories": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#filter0_f_1265_1849)\">\n<circle cx=\"8\" cy=\"8\" r=\"3.00244\" fill=\"currentColor\"/>\n</g>\n<defs>\n<filter id=\"filter0_f_1265_1849\" x=\"3.99756\" y=\"3.99756\" width=\"8.00488\" height=\"8.00488\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feGaussianBlur stdDeviation=\"0.5\" result=\"effect1_foregroundBlur_1265_1849\"/>\n</filter>\n</defs>\n</svg>",
109
109
  "check": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.68649 11.884L12.443 6.13601L11.736 5.42715L6.68835 10.4827L4.26399 8.0501L3.55696 8.74525L6.68649 11.884Z\" fill=\"currentColor\"/>\n</svg>",
110
110
  "check-alt": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.68647 11.884L12.443 6.13601L11.736 5.42715L6.68834 10.4827L4.26398 8.0501L3.55695 8.74525L6.68647 11.884Z\" fill=\"currentColor\"/>\n</svg>",
111
+ "chevron-down": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.25 6.25L8 10L11.75 6.25\" stroke=\"currentColor\"/>\n</svg>",
111
112
  "chevron-left": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M9.75 4.25L6 8L9.75 11.75\" stroke=\"currentColor\"/>\n</svg>",
112
113
  "chevron-right": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.25 4.25L10 8L6.25 11.75\" stroke=\"currentColor\"/>\n</svg>",
114
+ "chevron-up": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.25 9.75L8 6L11.75 9.75\" stroke=\"currentColor\"/>\n</svg>",
113
115
  "close": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12.1215 4.58087L8.70453 7.99397L12.1176 11.4169L11.4106 12.112L7.99847 8.69108L4.58636 12.112L3.87836 11.4031L7.29535 7.99005L3.88226 4.56716L4.58929 3.87201L8.0014 7.29294L11.4145 3.87201L12.1215 4.58087Z\" fill=\"currentColor\"/>\n</svg>",
114
116
  "cloud": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke=\"currentColor\" stroke-width=\"0.92\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.75 12.25C3.09 12.25 1.75 10.91 1.75 9.25C1.75 7.75 2.85 6.5 4.29 6.29C4.86 4.36 6.65 3 8.75 3C11.35 3 13.25 5.06 13.25 7.5V7.6C13.84 8.1 14.25 8.8 14.25 9.75C14.25 11.13 13.13 12.25 11.75 12.25Z\"/></g>\n</svg>",
115
117
  "code": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.5 4.5L3 8L6.5 11.5M9.5 4.5L13 8L9.5 11.5\" stroke=\"currentColor\" stroke-width=\"1.1\"/>\n</svg>",
@@ -451,8 +453,10 @@ export const iconNames = [
451
453
  "categories",
452
454
  "check",
453
455
  "check-alt",
456
+ "chevron-down",
454
457
  "chevron-left",
455
458
  "chevron-right",
459
+ "chevron-up",
456
460
  "close",
457
461
  "cloud",
458
462
  "code",
@@ -96,8 +96,10 @@ export const icons: Readonly<Record<string, string>> = {
96
96
  "cart": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke=\"currentColor\" stroke-width=\"0.92\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1.75 2.75H3.25L4.75 10.25H12.25L13.5 5H4\"/><circle cx=\"5.5\" cy=\"12.75\" r=\"0.75\"/><circle cx=\"11.25\" cy=\"12.75\" r=\"0.75\"/></g>\n</svg>",
97
97
  "categories": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g filter=\"url(#filter0_f_1265_1849)\">\n<circle cx=\"8\" cy=\"8\" r=\"3.00244\" fill=\"currentColor\"/>\n</g>\n<defs>\n<filter id=\"filter0_f_1265_1849\" x=\"3.99756\" y=\"3.99756\" width=\"8.00488\" height=\"8.00488\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\n<feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\n<feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\"/>\n<feGaussianBlur stdDeviation=\"0.5\" result=\"effect1_foregroundBlur_1265_1849\"/>\n</filter>\n</defs>\n</svg>",
98
98
  "check-alt": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.68647 11.884L12.443 6.13601L11.736 5.42715L6.68834 10.4827L4.26398 8.0501L3.55695 8.74525L6.68647 11.884Z\" fill=\"currentColor\"/>\n</svg>",
99
+ "chevron-down": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.25 6.25L8 10L11.75 6.25\" stroke=\"currentColor\"/>\n</svg>",
99
100
  "chevron-left": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M9.75 4.25L6 8L9.75 11.75\" stroke=\"currentColor\"/>\n</svg>",
100
101
  "chevron-right": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.25 4.25L10 8L6.25 11.75\" stroke=\"currentColor\"/>\n</svg>",
102
+ "chevron-up": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M4.25 9.75L8 6L11.75 9.75\" stroke=\"currentColor\"/>\n</svg>",
101
103
  "cloud": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<g stroke=\"currentColor\" stroke-width=\"0.92\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4.75 12.25C3.09 12.25 1.75 10.91 1.75 9.25C1.75 7.75 2.85 6.5 4.29 6.29C4.86 4.36 6.65 3 8.75 3C11.35 3 13.25 5.06 13.25 7.5V7.6C13.84 8.1 14.25 8.8 14.25 9.75C14.25 11.13 13.13 12.25 11.75 12.25Z\"/></g>\n</svg>",
102
104
  "code": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.5 4.5L3 8L6.5 11.5M9.5 4.5L13 8L9.5 11.5\" stroke=\"currentColor\" stroke-width=\"1.1\"/>\n</svg>",
103
105
  "code-block": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M2.5 3H13.5V13H2.5Z\" stroke=\"currentColor\" stroke-width=\"1.1\"/>\n<path d=\"M6.5 6L4.5 8L6.5 10M9.5 6L11.5 8L9.5 10\" stroke=\"currentColor\" stroke-width=\"1.1\"/>\n</svg>",
@@ -46,4 +46,4 @@ export const icons: Readonly<Record<string, string>> = {
46
46
  "up": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M7.49645 3.48222V16H8.50702L8.50841 3.48259L11.4156 6.38982L12.1095 5.68299L8.00173 1.57524L3.8905 5.68647L4.59784 6.39381L7.49645 3.48222Z\" fill=\"currentColor\"/>\n</svg>",
47
47
  "views": "<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<circle cx=\"7\" cy=\"7\" r=\"4.5\" stroke=\"currentColor\" stroke-width=\"0.92\"/>\n<path d=\"M10.2 10.2L13.5 13.5\" stroke=\"currentColor\" stroke-width=\"0.92\"/>\n</svg>"
48
48
  }
49
- export const deferredIconNames = ["1x","1xdots","1xgrid","1xlines","2x","2xdots","2xgrid","2xgrid-alt","2xgrid-alt-2","2xgrid-alt-3","2xlines","4x4","airtable","archive-alt","arrange-archive","arrange-check","arrange-chevron","arrange-connect","arrange-draft","arrange-dropdown","arrange-home","arrange-link","arrange-menu","arrange-more","arrange-page","arrange-plus","arrange-site","attach","audio","avatar","badge-bands","badge-bands-3d","badge-blue-fan","badge-blue-fan-3d","badge-bricks","badge-bricks-3d","badge-broken-stripes","badge-broken-stripes-3d","badge-checker","badge-checker-3d","badge-diamond","badge-diamond-3d","badge-fan","badge-fan-3d","badge-fan-dark","badge-fan-dark-3d","badge-halves","badge-halves-3d","badge-halves-green","badge-halves-green-3d","badge-red","badge-red-3d","badge-red-blue-bricks","badge-red-blue-bricks-3d","badge-round-fan","badge-round-fan-3d","badge-shard","badge-shard-3d","badge-split-circle","badge-split-circle-3d","badge-tall-bricks","badge-tall-bricks-3d","badge-weave","badge-weave-3d","bag-alt","bank","banknote","block-accordion","block-banner","block-breadcrumbs","block-button","block-divider","block-forms","block-group","block-heading","block-image","block-logo-marquee","block-page-progress","block-section","block-table","block-tabs","block-text","bold","bolt","book","book-alt","box","briefcase","building","bullet","callout","car","card","cart","categories","check-alt","chevron-left","chevron-right","cloud","code","code-block","coffee","coins","color","column","comment","connect","content","cursor","curve","default","dictate","dislike","divider","dot-bank","dot-banknote","dot-banknotes","dot-card","dot-coin","dot-coins","dot-receipt","dot-safe","dot-transfer","dot-wallet","download","drive","drop","dropbox","dumbbell","equation","exercise","eye","eye-off","facebook","figma","flame","flip","food","form","fuel","gallery","game","gift","github","globe","group","group-alt","group-alt-2","h1","h2","h3","handle","head","heart","help","help-alt","history","home-alt","icon","image","in","income","indent","info","instagram","italic","item","jpbank","key","keyboard","life","like","link","linkedin","list-line","lock-filled","logo-marquee","loom","map","medical","mention","menu","minimize","minimize-alt","minus","money","moon","move","music","music-alt","navigation-check","note-alt","note-alt-2","note-lines","notifications","notion","numbered","offline","open-alt","open-source","outdent","page","page-18","page-alt","page-note","panel","password-see","password-unsee","pattern-call-to-action","pattern-card","pattern-feature","pattern-hero","pause","paw","pdf","people","percent","phone","pill","plane","play-alt","postal","present","quote","reaction","receipt","redo","refresh","refund","relationships","repeat","rewind","rewind-30","rewind-30-alt","rotate","row","safe","school","school-alt","search-30","see-30","settings","shield","shield-alt","shirt","shop","sign-in","sign-out","slack","slash","sparkle","star-alt","star-alt-2","start","status","status-alt","status-filled","stop","strike","sun","system","table","tag","templates","text","ticket","title","title-struck","titlestyle","todo","toggle","train","transfer","triangle","tv","underline","undo","ungroup","unhead","unicon","untitle","up-right","upload","video","vimeo","wallet","warning","wifi","window","work","wrench","x-brand","youtube"] as const
49
+ export const deferredIconNames = ["1x","1xdots","1xgrid","1xlines","2x","2xdots","2xgrid","2xgrid-alt","2xgrid-alt-2","2xgrid-alt-3","2xlines","4x4","airtable","archive-alt","arrange-archive","arrange-check","arrange-chevron","arrange-connect","arrange-draft","arrange-dropdown","arrange-home","arrange-link","arrange-menu","arrange-more","arrange-page","arrange-plus","arrange-site","attach","audio","avatar","badge-bands","badge-bands-3d","badge-blue-fan","badge-blue-fan-3d","badge-bricks","badge-bricks-3d","badge-broken-stripes","badge-broken-stripes-3d","badge-checker","badge-checker-3d","badge-diamond","badge-diamond-3d","badge-fan","badge-fan-3d","badge-fan-dark","badge-fan-dark-3d","badge-halves","badge-halves-3d","badge-halves-green","badge-halves-green-3d","badge-red","badge-red-3d","badge-red-blue-bricks","badge-red-blue-bricks-3d","badge-round-fan","badge-round-fan-3d","badge-shard","badge-shard-3d","badge-split-circle","badge-split-circle-3d","badge-tall-bricks","badge-tall-bricks-3d","badge-weave","badge-weave-3d","bag-alt","bank","banknote","block-accordion","block-banner","block-breadcrumbs","block-button","block-divider","block-forms","block-group","block-heading","block-image","block-logo-marquee","block-page-progress","block-section","block-table","block-tabs","block-text","bold","bolt","book","book-alt","box","briefcase","building","bullet","callout","car","card","cart","categories","check-alt","chevron-down","chevron-left","chevron-right","chevron-up","cloud","code","code-block","coffee","coins","color","column","comment","connect","content","cursor","curve","default","dictate","dislike","divider","dot-bank","dot-banknote","dot-banknotes","dot-card","dot-coin","dot-coins","dot-receipt","dot-safe","dot-transfer","dot-wallet","download","drive","drop","dropbox","dumbbell","equation","exercise","eye","eye-off","facebook","figma","flame","flip","food","form","fuel","gallery","game","gift","github","globe","group","group-alt","group-alt-2","h1","h2","h3","handle","head","heart","help","help-alt","history","home-alt","icon","image","in","income","indent","info","instagram","italic","item","jpbank","key","keyboard","life","like","link","linkedin","list-line","lock-filled","logo-marquee","loom","map","medical","mention","menu","minimize","minimize-alt","minus","money","moon","move","music","music-alt","navigation-check","note-alt","note-alt-2","note-lines","notifications","notion","numbered","offline","open-alt","open-source","outdent","page","page-18","page-alt","page-note","panel","password-see","password-unsee","pattern-call-to-action","pattern-card","pattern-feature","pattern-hero","pause","paw","pdf","people","percent","phone","pill","plane","play-alt","postal","present","quote","reaction","receipt","redo","refresh","refund","relationships","repeat","rewind","rewind-30","rewind-30-alt","rotate","row","safe","school","school-alt","search-30","see-30","settings","shield","shield-alt","shirt","shop","sign-in","sign-out","slack","slash","sparkle","star-alt","star-alt-2","start","status","status-alt","status-filled","stop","strike","sun","system","table","tag","templates","text","ticket","title","title-struck","titlestyle","todo","toggle","train","transfer","triangle","tv","underline","undo","ungroup","unhead","unicon","untitle","up-right","upload","video","vimeo","wallet","warning","wifi","window","work","wrench","x-brand","youtube"] as const