@orianatech/pire 0.2.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 (154) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +7 -0
  3. package/README.md +114 -0
  4. package/dist/components/core/Avatar.d.cts +11 -0
  5. package/dist/components/core/Avatar.d.ts +12 -0
  6. package/dist/components/core/Avatar.d.ts.map +1 -0
  7. package/dist/components/core/Badge.d.cts +9 -0
  8. package/dist/components/core/Badge.d.ts +10 -0
  9. package/dist/components/core/Badge.d.ts.map +1 -0
  10. package/dist/components/core/Button.d.cts +17 -0
  11. package/dist/components/core/Button.d.ts +18 -0
  12. package/dist/components/core/Button.d.ts.map +1 -0
  13. package/dist/components/core/Card.d.cts +13 -0
  14. package/dist/components/core/Card.d.ts +14 -0
  15. package/dist/components/core/Card.d.ts.map +1 -0
  16. package/dist/components/core/Icon.d.cts +22 -0
  17. package/dist/components/core/Icon.d.ts +23 -0
  18. package/dist/components/core/Icon.d.ts.map +1 -0
  19. package/dist/components/core/IconButton.d.cts +15 -0
  20. package/dist/components/core/IconButton.d.ts +16 -0
  21. package/dist/components/core/IconButton.d.ts.map +1 -0
  22. package/dist/components/core/SegmentedControl.d.cts +23 -0
  23. package/dist/components/core/SegmentedControl.d.ts +24 -0
  24. package/dist/components/core/SegmentedControl.d.ts.map +1 -0
  25. package/dist/components/core/Tag.d.cts +8 -0
  26. package/dist/components/core/Tag.d.ts +9 -0
  27. package/dist/components/core/Tag.d.ts.map +1 -0
  28. package/dist/components/data/DataTable.d.cts +40 -0
  29. package/dist/components/data/DataTable.d.ts +41 -0
  30. package/dist/components/data/DataTable.d.ts.map +1 -0
  31. package/dist/components/data/DescriptionList.d.cts +21 -0
  32. package/dist/components/data/DescriptionList.d.ts +22 -0
  33. package/dist/components/data/DescriptionList.d.ts.map +1 -0
  34. package/dist/components/data/FilterBar.d.cts +19 -0
  35. package/dist/components/data/FilterBar.d.ts +20 -0
  36. package/dist/components/data/FilterBar.d.ts.map +1 -0
  37. package/dist/components/data/KpiTile.d.cts +23 -0
  38. package/dist/components/data/KpiTile.d.ts +24 -0
  39. package/dist/components/data/KpiTile.d.ts.map +1 -0
  40. package/dist/components/data/LinkList.d.cts +18 -0
  41. package/dist/components/data/LinkList.d.ts +19 -0
  42. package/dist/components/data/LinkList.d.ts.map +1 -0
  43. package/dist/components/data/ObjectHeader.d.cts +21 -0
  44. package/dist/components/data/ObjectHeader.d.ts +22 -0
  45. package/dist/components/data/ObjectHeader.d.ts.map +1 -0
  46. package/dist/components/data/Timeline.d.cts +16 -0
  47. package/dist/components/data/Timeline.d.ts +17 -0
  48. package/dist/components/data/Timeline.d.ts.map +1 -0
  49. package/dist/components/feedback/Dialog.d.cts +21 -0
  50. package/dist/components/feedback/Dialog.d.ts +22 -0
  51. package/dist/components/feedback/Dialog.d.ts.map +1 -0
  52. package/dist/components/feedback/InlineMessage.d.cts +13 -0
  53. package/dist/components/feedback/InlineMessage.d.ts +14 -0
  54. package/dist/components/feedback/InlineMessage.d.ts.map +1 -0
  55. package/dist/components/feedback/ProgressBar.d.cts +16 -0
  56. package/dist/components/feedback/ProgressBar.d.ts +17 -0
  57. package/dist/components/feedback/ProgressBar.d.ts.map +1 -0
  58. package/dist/components/feedback/Toast.d.cts +28 -0
  59. package/dist/components/feedback/Toast.d.ts +29 -0
  60. package/dist/components/feedback/Toast.d.ts.map +1 -0
  61. package/dist/components/feedback/Tooltip.d.cts +11 -0
  62. package/dist/components/feedback/Tooltip.d.ts +12 -0
  63. package/dist/components/feedback/Tooltip.d.ts.map +1 -0
  64. package/dist/components/forms/Checkbox.d.cts +9 -0
  65. package/dist/components/forms/Checkbox.d.ts +10 -0
  66. package/dist/components/forms/Checkbox.d.ts.map +1 -0
  67. package/dist/components/forms/ComboBox.d.cts +45 -0
  68. package/dist/components/forms/ComboBox.d.ts +46 -0
  69. package/dist/components/forms/ComboBox.d.ts.map +1 -0
  70. package/dist/components/forms/DatePicker.d.cts +27 -0
  71. package/dist/components/forms/DatePicker.d.ts +28 -0
  72. package/dist/components/forms/DatePicker.d.ts.map +1 -0
  73. package/dist/components/forms/FormField.d.cts +17 -0
  74. package/dist/components/forms/FormField.d.ts +18 -0
  75. package/dist/components/forms/FormField.d.ts.map +1 -0
  76. package/dist/components/forms/Input.d.cts +33 -0
  77. package/dist/components/forms/Input.d.ts +34 -0
  78. package/dist/components/forms/Input.d.ts.map +1 -0
  79. package/dist/components/forms/NumberField.d.cts +33 -0
  80. package/dist/components/forms/NumberField.d.ts +34 -0
  81. package/dist/components/forms/NumberField.d.ts.map +1 -0
  82. package/dist/components/forms/Radio.d.cts +18 -0
  83. package/dist/components/forms/Radio.d.ts +19 -0
  84. package/dist/components/forms/Radio.d.ts.map +1 -0
  85. package/dist/components/forms/Select.d.cts +28 -0
  86. package/dist/components/forms/Select.d.ts +29 -0
  87. package/dist/components/forms/Select.d.ts.map +1 -0
  88. package/dist/components/forms/Switch.d.cts +9 -0
  89. package/dist/components/forms/Switch.d.ts +10 -0
  90. package/dist/components/forms/Switch.d.ts.map +1 -0
  91. package/dist/components/forms/ValueHelpField.d.cts +31 -0
  92. package/dist/components/forms/ValueHelpField.d.ts +32 -0
  93. package/dist/components/forms/ValueHelpField.d.ts.map +1 -0
  94. package/dist/components/layout/FooterBar.d.cts +10 -0
  95. package/dist/components/layout/FooterBar.d.ts +11 -0
  96. package/dist/components/layout/FooterBar.d.ts.map +1 -0
  97. package/dist/components/layout/PageHeader.d.cts +10 -0
  98. package/dist/components/layout/PageHeader.d.ts +11 -0
  99. package/dist/components/layout/PageHeader.d.ts.map +1 -0
  100. package/dist/components/layout/SectionHeader.d.cts +11 -0
  101. package/dist/components/layout/SectionHeader.d.ts +12 -0
  102. package/dist/components/layout/SectionHeader.d.ts.map +1 -0
  103. package/dist/components/layout/SelectionBar.d.cts +14 -0
  104. package/dist/components/layout/SelectionBar.d.ts +15 -0
  105. package/dist/components/layout/SelectionBar.d.ts.map +1 -0
  106. package/dist/components/navigation/Breadcrumb.d.cts +14 -0
  107. package/dist/components/navigation/Breadcrumb.d.ts +15 -0
  108. package/dist/components/navigation/Breadcrumb.d.ts.map +1 -0
  109. package/dist/components/navigation/Pagination.d.cts +13 -0
  110. package/dist/components/navigation/Pagination.d.ts +14 -0
  111. package/dist/components/navigation/Pagination.d.ts.map +1 -0
  112. package/dist/components/navigation/ShellBar.d.cts +17 -0
  113. package/dist/components/navigation/ShellBar.d.ts +18 -0
  114. package/dist/components/navigation/ShellBar.d.ts.map +1 -0
  115. package/dist/components/navigation/SideNav.d.cts +22 -0
  116. package/dist/components/navigation/SideNav.d.ts +23 -0
  117. package/dist/components/navigation/SideNav.d.ts.map +1 -0
  118. package/dist/components/navigation/Tabs.d.cts +23 -0
  119. package/dist/components/navigation/Tabs.d.ts +24 -0
  120. package/dist/components/navigation/Tabs.d.ts.map +1 -0
  121. package/dist/components/patterns/ConfirmDialog.d.cts +21 -0
  122. package/dist/components/patterns/ConfirmDialog.d.ts +22 -0
  123. package/dist/components/patterns/ConfirmDialog.d.ts.map +1 -0
  124. package/dist/components/patterns/EmptyState.d.cts +13 -0
  125. package/dist/components/patterns/EmptyState.d.ts +14 -0
  126. package/dist/components/patterns/EmptyState.d.ts.map +1 -0
  127. package/dist/components/patterns/SidePanel.d.cts +14 -0
  128. package/dist/components/patterns/SidePanel.d.ts +15 -0
  129. package/dist/components/patterns/SidePanel.d.ts.map +1 -0
  130. package/dist/components/patterns/ValueHelpDialog.d.cts +20 -0
  131. package/dist/components/patterns/ValueHelpDialog.d.ts +21 -0
  132. package/dist/components/patterns/ValueHelpDialog.d.ts.map +1 -0
  133. package/dist/components/utils/cx.d.cts +2 -0
  134. package/dist/components/utils/cx.d.ts +3 -0
  135. package/dist/components/utils/cx.d.ts.map +1 -0
  136. package/dist/components.css +352 -0
  137. package/dist/index.cjs +1590 -0
  138. package/dist/index.cjs.map +1 -0
  139. package/dist/index.d.cts +46 -0
  140. package/dist/index.d.ts +47 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +1560 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/pire.css +11 -0
  145. package/dist/tokens/base.css +18 -0
  146. package/dist/tokens/colors.css +53 -0
  147. package/dist/tokens/elevation.css +21 -0
  148. package/dist/tokens/fonts.css +15 -0
  149. package/dist/tokens/motion.css +13 -0
  150. package/dist/tokens/spacing.css +18 -0
  151. package/dist/tokens/themes.css +23 -0
  152. package/dist/tokens/typography.css +39 -0
  153. package/dist/tokens.css +8 -0
  154. package/package.json +99 -0
@@ -0,0 +1,352 @@
1
+ /* Pire components — class contract.
2
+ Interactive state comes from React Aria data attributes ([data-hovered], [data-pressed],
3
+ [data-focus-visible], [data-selected], [data-disabled]), never from :hover alone, so touch
4
+ and keyboard behave identically. Every value is a token. */
5
+
6
+ /* ---- focus ---------------------------------------------------------- */
7
+ .pire [data-focus-visible],.pire[data-focus-visible],.pire-focusable[data-focus-visible]{outline:var(--focus-w) solid var(--focus-color);outline-offset:var(--focus-offset)}
8
+
9
+ /* ---- Button --------------------------------------------------------- */
10
+ .pire-btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);height:var(--control-h-md);padding:0 var(--control-pad-x);font:var(--type-body-strong);letter-spacing:var(--ls-body);border-radius:var(--radius-1);border:1px solid transparent;cursor:pointer;white-space:nowrap;transition:var(--transition-control);appearance:none}
11
+ .pire-btn[data-size="sm"]{height:var(--control-h-sm)}
12
+ .pire-btn[data-size="lg"]{height:var(--control-h-lg);padding:0 var(--control-pad-x-lg)}
13
+ .pire-btn[data-full-width="true"]{width:100%}
14
+ .pire-btn[data-variant="primary"]{background:var(--accent-bg);color:var(--accent-fg);border-color:var(--accent-bg)}
15
+ .pire-btn[data-variant="primary"][data-hovered]{background:var(--accent-bg-hover);border-color:var(--accent-bg-hover)}
16
+ .pire-btn[data-variant="primary"][data-pressed]{background:var(--accent-bg-active);border-color:var(--accent-bg-active)}
17
+ .pire-btn[data-variant="secondary"]{background:var(--surface-card);color:var(--accent-subtle-fg);border-color:var(--accent-bg)}
18
+ .pire-btn[data-variant="secondary"][data-hovered]{background:var(--accent-subtle-bg)}
19
+ .pire-btn[data-variant="secondary"][data-pressed]{background:var(--blue-20)}
20
+ .pire-btn[data-variant="tertiary"]{background:transparent;color:var(--text-link)}
21
+ .pire-btn[data-variant="tertiary"][data-hovered]{background:var(--surface-hover)}
22
+ .pire-btn[data-variant="tertiary"][data-pressed]{background:var(--surface-active)}
23
+ .pire-btn[data-variant="danger"]{background:var(--danger-bg);color:var(--accent-fg);border-color:var(--danger-bg)}
24
+ .pire-btn[data-variant="danger"][data-hovered]{background:var(--danger-bg-hover);border-color:var(--danger-bg-hover)}
25
+ .pire-btn[data-variant="emphasized"]{background:var(--surface-shell);color:var(--accent-fg);border-color:var(--surface-shell)}
26
+ .pire-btn[data-variant="emphasized"][data-hovered]{background:var(--blue-80);border-color:var(--blue-80)}
27
+ .pire-btn[data-disabled]{background:var(--surface-disabled);color:var(--text-disabled);border-color:var(--border-subtle);cursor:not-allowed}
28
+
29
+ /* ---- IconButton ------------------------------------------------------ */
30
+ .pire-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:var(--control-h-md);height:var(--control-h-md);border:1px solid transparent;border-radius:var(--radius-1);background:transparent;color:var(--text-secondary);cursor:pointer;transition:var(--transition-control)}
31
+ .pire-iconbtn[data-size="sm"]{width:var(--control-h-sm);height:var(--control-h-sm)}
32
+ .pire-iconbtn[data-size="lg"]{width:var(--control-h-lg);height:var(--control-h-lg)}
33
+ .pire-iconbtn[data-hovered]{background:var(--surface-hover);color:var(--text-primary)}
34
+ .pire-iconbtn[data-selected="true"]{background:var(--surface-selected);color:var(--accent-subtle-fg)}
35
+ .pire-iconbtn[data-variant="outlined"]{border-color:var(--border-field);background:var(--surface-card)}
36
+ .pire-iconbtn[data-variant="inverse"]{color:var(--text-inverse)}
37
+ .pire-iconbtn[data-variant="inverse"][data-hovered]{background:var(--surface-shell-hover);color:var(--text-inverse)}
38
+ .pire-iconbtn[data-disabled]{color:var(--text-disabled);cursor:not-allowed;background:transparent}
39
+
40
+ /* ---- Badge / Tag ----------------------------------------------------- */
41
+ .pire-badge{display:inline-flex;align-items:center;gap:var(--sp-1);height:20px;padding:0 var(--sp-2);border-radius:var(--radius-1);font:var(--type-label);white-space:nowrap;border:1px solid transparent}
42
+ .pire-badge[data-status="positive"]{background:var(--status-positive-bg);color:var(--status-positive-fg);border-color:var(--status-positive-border)}
43
+ .pire-badge[data-status="critical"]{background:var(--status-critical-bg);color:var(--status-critical-fg);border-color:var(--status-critical-border)}
44
+ .pire-badge[data-status="negative"]{background:var(--status-negative-bg);color:var(--status-negative-fg);border-color:var(--status-negative-border)}
45
+ .pire-badge[data-status="informative"]{background:var(--status-informative-bg);color:var(--status-informative-fg);border-color:var(--status-informative-border)}
46
+ .pire-badge[data-status="neutral"]{background:var(--status-neutral-bg);color:var(--status-neutral-fg);border-color:var(--status-neutral-border)}
47
+ .pire-tag{display:inline-flex;align-items:center;gap:var(--sp-1);height:24px;padding:0 var(--sp-1) 0 var(--sp-2);border:1px solid var(--border-default);border-radius:var(--radius-1);background:var(--surface-sunken);color:var(--text-primary);font:var(--type-caption);white-space:nowrap}
48
+ .pire-tag[data-disabled]{color:var(--text-disabled);background:var(--surface-disabled)}
49
+ .pire-tag-remove{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:0;border-radius:var(--radius-1);background:transparent;color:var(--text-secondary);cursor:pointer}
50
+ .pire-tag-remove[data-hovered]{background:var(--surface-active);color:var(--text-primary)}
51
+
52
+ /* ---- Card ------------------------------------------------------------ */
53
+ .pire-card{display:flex;flex-direction:column;background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-2);box-shadow:var(--shadow-1);transition:var(--transition-surface)}
54
+ .pire-card[data-interactive="true"]{cursor:pointer}
55
+ .pire-card[data-interactive="true"]:hover{box-shadow:var(--shadow-2)}
56
+ .pire-card-head{display:flex;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-4);border-bottom:1px solid var(--border-subtle)}
57
+ .pire-card-title{font:var(--type-h4);letter-spacing:var(--ls-heading)}
58
+ .pire-card-sub{font:var(--type-caption);color:var(--text-secondary)}
59
+ .pire-card-body{padding:var(--sp-4);flex:1}
60
+ .pire-card-foot{display:flex;justify-content:flex-end;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--border-subtle)}
61
+
62
+ /* ---- Field shell (Input, Select, ComboBox) --------------------------- */
63
+ .pire-field{display:flex;flex-direction:column;gap:var(--sp-1)}
64
+ .pire-field-label{font:var(--type-label);color:var(--text-label)}
65
+ .pire-field-req{color:var(--status-negative-fg);margin-left:var(--sp-0h)}
66
+ .pire-field-hint{font:var(--type-caption);color:var(--text-secondary)}
67
+ .pire-field-error{display:flex;align-items:center;gap:var(--sp-1);font:var(--type-caption);color:var(--status-negative-fg)}
68
+ .pire-field[data-layout="horizontal"]{display:grid;grid-template-columns:160px 1fr;column-gap:var(--sp-4);align-items:center}
69
+ .pire-field[data-layout="horizontal"] .pire-field-label{text-align:right}
70
+ .pire-field[data-layout="horizontal"] .pire-field-hint,.pire-field[data-layout="horizontal"] .pire-field-error{grid-column:2}
71
+
72
+ .pire-control{display:inline-flex;align-items:center;gap:var(--sp-2);height:var(--control-h-md);width:100%;padding:0 var(--control-pad-x);background:var(--surface-card);color:var(--text-primary);border:1px solid var(--border-field);border-radius:var(--radius-1);transition:var(--transition-control)}
73
+ .pire-control[data-size="sm"]{height:var(--control-h-sm)}
74
+ .pire-control[data-size="lg"]{height:var(--control-h-lg)}
75
+ .pire-control[data-full-width="false"]{width:auto}
76
+ .pire-control[data-hovered]{border-color:var(--border-strong)}
77
+ .pire-control[data-focus-within]{outline:var(--focus-w) solid var(--focus-color);outline-offset:var(--focus-offset)}
78
+ /* The shell above owns the focus ring for the whole control, so nested focusables must not
79
+ paint a second one. base.css gives every input/button/[tabindex] a :focus-visible outline at
80
+ specificity (0,1,1), which outranks the plain .pire-input/.pire-datesegment `outline:none`
81
+ (0,1,0) regardless of import order — hence the class+pseudo-class selector here.
82
+ The descendant combinator deliberately excludes .pire-control itself: on Select the control
83
+ IS the focusable button and must keep its own ring. */
84
+ .pire-control :focus-visible{outline:none}
85
+ .pire-control[data-invalid="true"]{border-color:var(--status-negative-fg);border-bottom-width:2px}
86
+ .pire-control[data-disabled]{background:var(--surface-disabled);color:var(--text-disabled);cursor:not-allowed}
87
+ .pire-control[data-readonly="true"]{background:var(--surface-sunken)}
88
+ .pire-input{flex:1;min-width:0;border:0;outline:none;background:transparent;color:inherit;font:var(--type-body)}
89
+ .pire-input[data-numeric="true"]{font:var(--type-numeric);text-align:right;font-variant-numeric:tabular-nums}
90
+ .pire-input::placeholder{color:var(--text-tertiary)}
91
+ .pire-affix{font:var(--type-caption);color:var(--text-secondary);flex:0 0 auto}
92
+ .pire-leading-icon{color:var(--text-tertiary);flex:0 0 auto}
93
+
94
+ /* ---- Select / ListBox popover ---------------------------------------- */
95
+ .pire-select-value{flex:1;min-width:0;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:var(--type-body)}
96
+ .pire-select-value[data-placeholder]{color:var(--text-tertiary)}
97
+ /* The viewport clamp is load-bearing, not cosmetic. Sized to its trigger alone, a
98
+ full-bleed trigger makes the popover exactly the viewport width, while React Aria
99
+ positions it no closer than 12px to either edge (`useOverlayPosition`'s default
100
+ `containerPadding`) — so it starts at left:12 and ends 12px past the right edge,
101
+ giving every Popover-backed overlay (ComboBox, Select, DatePicker, Menu) a horizontal
102
+ scrollbar, worst on narrow viewports.
103
+ Both bounds are needed: CSS resolves min-width *after* max-width, so a bare
104
+ `max-width` would be ignored whenever `--trigger-width` exceeded it. The min-width is
105
+ therefore clamped at source, and the max-width caps content-driven growth as well. */
106
+ .pire-popover{background:var(--surface-raised);border:1px solid var(--border-default);border-radius:var(--radius-2);box-shadow:var(--shadow-3);overflow:auto;max-height:min(320px,var(--trigger-height,320px));min-width:min(var(--trigger-width),calc(100vw - 24px));max-width:calc(100vw - 24px);animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
107
+ .pire-listbox{outline:none;padding:var(--sp-1) 0;display:flex;flex-direction:column}
108
+ .pire-option{display:flex;align-items:center;gap:var(--sp-2);min-height:var(--row-h-condensed);padding:0 var(--sp-3);font:var(--type-body);color:var(--text-primary);cursor:pointer;outline:none}
109
+ .pire-option[data-focused]{background:var(--surface-hover)}
110
+ .pire-option[data-selected]{background:var(--surface-selected);color:var(--accent-subtle-fg);font:var(--type-body-strong)}
111
+ .pire-option[data-disabled]{color:var(--text-disabled);cursor:not-allowed}
112
+
113
+ /* ---- Checkbox / Radio / Switch --------------------------------------- */
114
+ .pire-choice{display:inline-flex;align-items:flex-start;gap:var(--sp-2);font:var(--type-body);color:var(--text-primary);cursor:pointer}
115
+ .pire-choice[data-disabled]{color:var(--text-disabled);cursor:not-allowed}
116
+ .pire-choice-box{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin-top:2px;border:1px solid var(--border-field);border-radius:var(--radius-1);background:var(--surface-card);color:var(--accent-fg);transition:var(--transition-control)}
117
+ .pire-choice-box[data-radio="true"]{border-radius:var(--radius-pill)}
118
+ .pire-choice[data-hovered] .pire-choice-box{border-color:var(--text-primary)}
119
+ .pire-choice[data-selected] .pire-choice-box,.pire-choice[data-indeterminate] .pire-choice-box{background:var(--accent-bg);border-color:var(--accent-bg)}
120
+ .pire-choice[data-selected] .pire-choice-box[data-radio="true"]{background:var(--surface-card);border-width:5px;border-color:var(--accent-bg)}
121
+ .pire-choice[data-focus-visible] .pire-choice-box{outline:var(--focus-w) solid var(--focus-color);outline-offset:var(--focus-offset)}
122
+ .pire-choice[data-disabled] .pire-choice-box{background:var(--surface-disabled);border-color:var(--border-default)}
123
+ .pire-choice-hint{display:block;font:var(--type-caption);color:var(--text-secondary)}
124
+ .pire-switch-track{flex:0 0 auto;width:36px;height:20px;border-radius:var(--radius-pill);background:var(--gray-40);padding:2px;transition:background-color var(--dur-fast) var(--ease-standard)}
125
+ .pire-switch-thumb{width:16px;height:16px;border-radius:var(--radius-pill);background:var(--gray-0);box-shadow:var(--shadow-1);transition:transform var(--dur-fast) var(--ease-standard)}
126
+ .pire-choice[data-selected] .pire-switch-track{background:var(--accent-bg)}
127
+ .pire-choice[data-selected] .pire-switch-thumb{transform:translateX(16px)}
128
+ .pire-choice[data-focus-visible] .pire-switch-track{outline:var(--focus-w) solid var(--focus-color);outline-offset:var(--focus-offset)}
129
+ .pire-radiogroup{display:flex;flex-direction:column;gap:var(--sp-2)}
130
+
131
+ /* ---- Tabs ------------------------------------------------------------ */
132
+ .pire-tablist{display:flex;gap:var(--sp-5);border-bottom:1px solid var(--border-subtle);overflow-x:auto}
133
+ .pire-tab{display:inline-flex;align-items:center;gap:var(--sp-2);height:var(--shell-subheader-h);padding:0 var(--sp-0h);border-bottom:2px solid transparent;margin-bottom:-1px;font:var(--type-body);color:var(--text-secondary);cursor:pointer;white-space:nowrap;outline:none;transition:var(--transition-control)}
134
+ .pire-tab[data-hovered]{color:var(--text-primary)}
135
+ .pire-tab[data-selected]{color:var(--accent-subtle-fg);border-bottom-color:var(--accent-bg);font:var(--type-body-strong)}
136
+ .pire-tab[data-disabled]{color:var(--text-disabled);cursor:not-allowed}
137
+ .pire-tab-count{font:var(--type-code);color:var(--text-tertiary)}
138
+ .pire-tabpanel{padding-top:var(--sp-4);outline:none}
139
+
140
+ /* ---- Breadcrumb / Pagination ----------------------------------------- */
141
+ .pire-breadcrumbs{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-1);margin:0;padding:0;list-style:none;font:var(--type-caption)}
142
+ .pire-breadcrumb{display:inline-flex;align-items:center;gap:var(--sp-1);color:var(--text-secondary)}
143
+ .pire-breadcrumb[data-current]{color:var(--text-primary)}
144
+ .pire-breadcrumb a{color:var(--text-link);text-decoration:none;cursor:pointer}
145
+ .pire-breadcrumb a[data-hovered]{text-decoration:underline}
146
+ .pire-pagination{display:flex;align-items:center;gap:var(--sp-3);font:var(--type-caption);color:var(--text-secondary)}
147
+ .pire-pagination-count{font:var(--type-code);color:var(--text-secondary)}
148
+
149
+ /* ---- ShellBar / SideNav ---------------------------------------------- */
150
+ .pire-shellbar{display:flex;align-items:center;gap:var(--sp-3);height:var(--shell-header-h);padding:0 var(--sp-3);background:var(--surface-shell);color:var(--text-inverse)}
151
+ .pire-shellbar-mono{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--radius-1);background:var(--gray-0);color:var(--surface-shell);font:var(--type-label);letter-spacing:var(--ls-caps)}
152
+ .pire-shellbar-product{font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;opacity:.8}
153
+ .pire-shellbar-title{font:var(--type-body-strong)}
154
+ .pire-shellbar-spacer{flex:1}
155
+ .pire-avatar{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:var(--radius-pill);background:var(--blue-60);color:var(--text-inverse);font:var(--type-label)}
156
+ .pire-sidenav{display:flex;flex-direction:column;width:var(--sidenav-w);flex:0 0 auto;background:var(--surface-nav);border-right:1px solid var(--border-subtle);overflow:auto}
157
+ .pire-sidenav[data-collapsed="true"]{width:var(--sidenav-w-collapsed)}
158
+ .pire-sidenav-group{padding:var(--sp-3) 0}
159
+ .pire-sidenav-group + .pire-sidenav-group{border-top:1px solid var(--border-subtle)}
160
+ .pire-sidenav-label{padding:0 var(--sp-4) var(--sp-2);font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--text-tertiary)}
161
+ .pire-sidenav-item{display:flex;align-items:center;gap:var(--sp-3);width:100%;height:var(--row-h-regular);padding:0 var(--sp-4);border:0;border-left:3px solid transparent;background:transparent;color:var(--text-primary);font:var(--type-body);text-align:left;cursor:pointer;transition:var(--transition-control)}
162
+ .pire-sidenav-item[data-hovered]{background:var(--surface-hover)}
163
+ .pire-sidenav-item[data-selected="true"]{background:var(--surface-selected);border-left-color:var(--accent-bg);color:var(--accent-subtle-fg);font:var(--type-body-strong)}
164
+ .pire-sidenav-count{margin-left:auto;font:var(--type-code);color:var(--text-tertiary)}
165
+ .pire-sidenav-footer{margin-top:auto;padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--border-subtle)}
166
+
167
+ /* ---- Feedback -------------------------------------------------------- */
168
+ .pire-modal-overlay{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;padding:var(--sp-6);background:var(--surface-overlay);animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
169
+ .pire-modal{display:flex;flex-direction:column;width:100%;max-height:calc(100vh - var(--sp-16));background:var(--surface-raised);border-radius:var(--radius-2);box-shadow:var(--shadow-3);animation:pire-dialog-in var(--dur-base) var(--ease-entrance);outline:none}
170
+ .pire-modal[data-size="sm"]{max-width:420px}
171
+ .pire-modal[data-size="md"]{max-width:640px}
172
+ .pire-modal[data-size="lg"]{max-width:960px}
173
+ .pire-dialog{display:flex;flex-direction:column;min-height:0;outline:none}
174
+ .pire-dialog-head{display:flex;align-items:flex-start;gap:var(--sp-3);padding:var(--sp-4) var(--sp-5);border-bottom:1px solid var(--border-subtle)}
175
+ .pire-dialog-title{font:var(--type-h3);letter-spacing:var(--ls-heading)}
176
+ .pire-dialog-sub{font:var(--type-caption);color:var(--text-secondary)}
177
+ .pire-dialog-body{padding:var(--sp-5);overflow:auto;font:var(--type-body)}
178
+ .pire-dialog-foot{display:flex;justify-content:flex-end;gap:var(--sp-2);padding:var(--sp-4) var(--sp-5);border-top:1px solid var(--border-subtle);background:var(--surface-sunken);border-radius:0 0 var(--radius-2) var(--radius-2)}
179
+ .pire-sidepanel-overlay{position:fixed;inset:0;z-index:900;display:flex;justify-content:flex-end;background:var(--surface-overlay)}
180
+ .pire-sidepanel{display:flex;flex-direction:column;height:100%;max-width:100vw;background:var(--surface-raised);box-shadow:var(--shadow-3);outline:none}
181
+ .pire-sidepanel[data-entering]{animation:pire-panel-in var(--dur-moderate) var(--ease-entrance)}
182
+ @keyframes pire-panel-in{from{transform:translateX(24px);opacity:0}to{transform:none;opacity:1}}
183
+ .pire-msg{display:flex;align-items:flex-start;gap:var(--sp-2);padding:var(--sp-3);border:1px solid transparent;border-left-width:3px;border-radius:var(--radius-1);font:var(--type-body)}
184
+ .pire-msg[data-kind="info"]{background:var(--status-informative-bg);border-color:var(--status-informative-border);border-left-color:var(--status-informative-fg);color:var(--status-informative-fg)}
185
+ .pire-msg[data-kind="success"]{background:var(--status-positive-bg);border-color:var(--status-positive-border);border-left-color:var(--status-positive-fg);color:var(--status-positive-fg)}
186
+ .pire-msg[data-kind="warning"]{background:var(--status-critical-bg);border-color:var(--status-critical-border);border-left-color:var(--status-critical-fg);color:var(--status-critical-fg)}
187
+ .pire-msg[data-kind="error"]{background:var(--status-negative-bg);border-color:var(--status-negative-border);border-left-color:var(--status-negative-fg);color:var(--status-negative-fg)}
188
+ .pire-msg-title{font:var(--type-body-strong)}
189
+ .pire-msg-body{color:var(--text-primary)}
190
+ .pire-toast{position:fixed;z-index:1000;bottom:var(--sp-6);display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3) var(--sp-4);border-radius:var(--radius-2);background:var(--gray-90);color:var(--text-inverse);box-shadow:var(--shadow-3);font:var(--type-body);animation:pire-toast-in var(--dur-base) var(--ease-entrance)}
191
+ .pire-toast[data-position="bottom-center"]{left:50%;--pire-toast-tx:-50%;transform:translateX(-50%)}
192
+ .pire-toast[data-position="bottom-right"]{right:var(--sp-6);--pire-toast-tx:0}
193
+ .pire-toast-region{position:fixed;z-index:1000;bottom:var(--sp-6);left:50%;transform:translateX(-50%);display:flex;flex-direction:column;gap:var(--sp-2);outline:none}
194
+ .pire-progress{display:flex;flex-direction:column;gap:var(--sp-1)}
195
+ .pire-progress-head{display:flex;justify-content:space-between;gap:var(--sp-3);font:var(--type-caption);color:var(--text-secondary)}
196
+ .pire-progress-track{height:8px;border-radius:var(--radius-pill);background:var(--gray-20);overflow:hidden}
197
+ .pire-progress[data-size="sm"] .pire-progress-track{height:4px}
198
+ .pire-progress-fill{height:100%;background:var(--accent-bg);transition:width var(--dur-moderate) var(--ease-standard)}
199
+ .pire-progress[data-status="positive"] .pire-progress-fill{background:var(--status-positive-fg)}
200
+ .pire-progress[data-status="critical"] .pire-progress-fill{background:var(--status-critical-fg)}
201
+ .pire-progress[data-status="negative"] .pire-progress-fill{background:var(--status-negative-fg)}
202
+ .pire-tooltip{max-width:240px;padding:var(--sp-1) var(--sp-2);border-radius:var(--radius-1);background:var(--gray-90);color:var(--text-inverse);font:var(--type-caption);box-shadow:var(--shadow-2);animation:pire-fade-in var(--dur-fast) var(--ease-entrance)}
203
+
204
+ /* ---- Data ------------------------------------------------------------ */
205
+ .pire-table-wrap{overflow:auto;background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-2)}
206
+ .pire-table{width:100%;border-collapse:collapse;font:var(--type-body)}
207
+ .pire-table thead tr,.pire-table .pire-thead-row{height:var(--row-h-condensed);background:var(--surface-toolbar)}
208
+ .pire-table[data-sticky="true"] thead{position:sticky;top:0;z-index:1}
209
+ .pire-th{padding:0 var(--sp-3);font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--text-secondary);border-bottom:1px solid var(--border-default);white-space:nowrap;text-align:left;outline:none}
210
+ .pire-th[data-allows-sorting="true"]{cursor:pointer;user-select:none}
211
+ .pire-th[data-focus-visible]{outline:var(--focus-w) solid var(--focus-color);outline-offset:calc(var(--focus-offset) * -1)}
212
+ .pire-th-inner{display:inline-flex;align-items:center;gap:var(--sp-1);width:100%}
213
+ .pire-th[data-align="right"] .pire-th-inner{justify-content:flex-end}
214
+ .pire-tr{height:var(--row-h-regular);border-bottom:1px solid var(--border-subtle);outline:none}
215
+ .pire-table[data-density="condensed"] .pire-tr{height:var(--row-h-condensed)}
216
+ .pire-table[data-density="comfortable"] .pire-tr{height:var(--row-h-comfortable)}
217
+ .pire-tr[data-hovered]{background:var(--surface-hover)}
218
+ .pire-tr[data-selected]{background:var(--surface-selected)}
219
+ .pire-tr[data-focus-visible]{outline:var(--focus-w) solid var(--focus-color);outline-offset:calc(var(--focus-offset) * -1)}
220
+ .pire-tr[data-pressable="true"]{cursor:pointer}
221
+ .pire-td{padding:0 var(--sp-3);color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;outline:none}
222
+ .pire-td[data-numeric="true"]{font:var(--type-numeric);font-variant-numeric:tabular-nums;text-align:right}
223
+ /* Density overrides sit after the .pire-th/.pire-td bases they override, so the cascade reads
224
+ top-to-bottom in source order rather than relying on specificity alone. */
225
+ .pire-table[data-density="condensed"] .pire-th,.pire-table[data-density="condensed"] .pire-td{padding:0 var(--sp-2)}
226
+ .pire-table-empty{padding:var(--sp-10);text-align:center;color:var(--text-secondary)}
227
+ .pire-kpi{display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-4);background:var(--surface-card);border:1px solid var(--border-subtle);border-radius:var(--radius-2);text-align:left;min-width:0;transition:var(--transition-surface)}
228
+ .pire-kpi[data-pressable="true"]{cursor:pointer}
229
+ .pire-kpi[data-hovered]{box-shadow:var(--shadow-2)}
230
+ .pire-kpi-label{display:flex;align-items:center;gap:var(--sp-2);font:var(--type-label);color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
231
+ .pire-kpi-value{font:var(--fw-semibold) var(--fs-display)/var(--lh-tight) var(--font-mono);letter-spacing:var(--ls-numeric);font-variant-numeric:tabular-nums;color:var(--text-numeric)}
232
+ .pire-kpi[data-status="positive"] .pire-kpi-value{color:var(--status-positive-fg)}
233
+ .pire-kpi[data-status="critical"] .pire-kpi-value{color:var(--status-critical-fg)}
234
+ .pire-kpi[data-status="negative"] .pire-kpi-value{color:var(--status-negative-fg)}
235
+ .pire-kpi-unit{font:var(--type-caption);color:var(--text-secondary);margin-left:var(--sp-1)}
236
+ .pire-kpi-delta{display:inline-flex;align-items:center;gap:var(--sp-1);font:var(--type-caption)}
237
+ .pire-kpi-delta[data-tone="positive"]{color:var(--status-positive-fg)}
238
+ .pire-kpi-delta[data-tone="negative"]{color:var(--status-negative-fg)}
239
+ .pire-kpi-delta[data-tone="neutral"]{color:var(--text-secondary)}
240
+ .pire-kpi-foot{font:var(--type-caption);color:var(--text-tertiary)}
241
+ .pire-objheader{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-4) var(--page-pad-x);background:var(--surface-card);border-bottom:1px solid var(--border-subtle)}
242
+ .pire-objheader-row{display:flex;align-items:flex-start;gap:var(--sp-3);flex-wrap:wrap}
243
+ .pire-objheader-title{font:var(--type-h1);letter-spacing:var(--ls-heading)}
244
+ .pire-objheader-sub{display:flex;align-items:center;gap:var(--sp-2);font:var(--type-caption);color:var(--text-secondary)}
245
+ .pire-objheader-id{font:var(--type-code);color:var(--text-secondary)}
246
+ .pire-objheader-actions{margin-left:auto;display:flex;gap:var(--sp-2)}
247
+ .pire-facts{display:flex;flex-wrap:wrap;gap:var(--sp-6)}
248
+ .pire-fact-label{font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--text-tertiary)}
249
+ .pire-fact-value{font:var(--type-body-strong)}
250
+ .pire-fact-value[data-numeric="true"]{font:var(--type-numeric);font-variant-numeric:tabular-nums}
251
+ .pire-filterbar{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-3) var(--sp-4);background:var(--surface-toolbar);border:1px solid var(--border-subtle);border-radius:var(--radius-2)}
252
+ .pire-filterbar-controls{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--sp-3)}
253
+ .pire-filterbar-foot{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
254
+ .pire-filterbar-result{font:var(--type-caption);color:var(--text-secondary)}
255
+ .pire-filterbar-actions{margin-left:auto;display:flex;gap:var(--sp-2)}
256
+
257
+ /* ---- EmptyState ------------------------------------------------------ */
258
+ .pire-empty{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);padding:var(--sp-16) var(--sp-6);text-align:center;color:var(--text-secondary)}
259
+ .pire-empty[data-compact="true"]{padding:var(--sp-8) var(--sp-4)}
260
+ .pire-empty-icon{color:var(--text-tertiary)}
261
+ .pire-empty-title{font:var(--type-h4);color:var(--text-primary)}
262
+ .pire-empty-body{max-width:44ch;font:var(--type-body)}
263
+
264
+ /* ---- Avatar ----------------------------------------------------------- */
265
+ .pire-avatar[data-size="lg"]{width:40px;height:40px;font:var(--type-body-strong)}
266
+ .pire-avatar[data-size="sm"]{width:24px;height:24px;font:var(--type-micro,var(--type-label))}
267
+
268
+ /* ---- SegmentedControl -------------------------------------------------- */
269
+ .pire-segmented{display:inline-flex;padding:2px;gap:2px;background:var(--surface-sunken);border:1px solid var(--border-default);border-radius:var(--radius-1)}
270
+ .pire-segmented-item{display:inline-flex;align-items:center;justify-content:center;gap:var(--sp-2);height:28px;padding:0 var(--sp-3);border:0;border-radius:var(--radius-1);background:transparent;color:var(--text-secondary);font:var(--type-label);cursor:pointer;transition:var(--transition-control)}
271
+ .pire-segmented[data-size="md"] .pire-segmented-item{height:34px;font:var(--type-body)}
272
+ .pire-segmented-item[data-hovered]{background:var(--surface-hover);color:var(--text-primary)}
273
+ .pire-segmented-item[data-selected]{background:var(--surface-card);color:var(--accent-subtle-fg);box-shadow:var(--shadow-1)}
274
+ .pire-segmented-item[data-disabled]{color:var(--text-disabled);cursor:not-allowed}
275
+
276
+ /* ---- DescriptionList --------------------------------------------------- */
277
+ .pire-dl{display:flex;flex-direction:column;gap:var(--sp-2);margin:0}
278
+ .pire-dl[data-layout="grid"]{display:grid;grid-template-columns:repeat(var(--pire-dl-cols,3),minmax(0,1fr));gap:var(--sp-3) var(--sp-4)}
279
+ .pire-dl-row{display:flex;justify-content:space-between;gap:var(--sp-3);align-items:baseline}
280
+ .pire-dl[data-layout="grid"] .pire-dl-row{display:block}
281
+ .pire-dl-term{font:var(--type-caption);color:var(--text-secondary);display:inline-flex;align-items:center;gap:var(--sp-1)}
282
+ .pire-dl[data-layout="grid"] .pire-dl-term{font:var(--type-label);letter-spacing:var(--ls-caps);text-transform:uppercase;color:var(--text-tertiary)}
283
+ .pire-dl-value{margin:0;font:var(--type-body)}
284
+ .pire-dl-value[data-numeric="true"]{font:var(--type-numeric);font-variant-numeric:tabular-nums}
285
+ .pire-dl-row[data-emphasis="true"]{border-top:1px solid var(--border-default);padding-top:var(--sp-2)}
286
+ .pire-dl-row[data-emphasis="true"] .pire-dl-term{font:var(--type-body-strong);color:var(--text-primary)}
287
+ .pire-dl-row[data-emphasis="true"] .pire-dl-value{font:var(--fw-semibold) var(--fs-h4)/1.3 var(--font-sans)}
288
+ .pire-dl-row[data-emphasis="true"] .pire-dl-value[data-numeric="true"]{font:var(--fw-semibold) var(--fs-h4)/1.3 var(--font-mono)}
289
+
290
+ /* ---- Timeline ---------------------------------------------------------- */
291
+ .pire-timeline{display:flex;flex-direction:column;margin:0;padding:0;list-style:none}
292
+ .pire-timeline-item{display:flex;gap:var(--sp-4);align-items:baseline;padding:var(--sp-2) 0;border-bottom:1px solid var(--border-subtle)}
293
+ .pire-timeline-item:last-child{border-bottom:0}
294
+ .pire-timeline-time{flex:0 0 auto;width:132px;font:var(--type-code);color:var(--text-secondary)}
295
+ .pire-timeline-text{flex:1;font:var(--type-body)}
296
+ .pire-timeline-actor{font:var(--type-caption);color:var(--text-secondary)}
297
+
298
+ /* ---- LinkList ---------------------------------------------------------- */
299
+ .pire-linklist{display:flex;flex-direction:column}
300
+ .pire-linklist-item{display:flex;align-items:center;gap:var(--sp-2);width:100%;height:var(--row-h-regular);padding:0 var(--sp-1);border:0;border-bottom:1px solid var(--border-subtle);background:transparent;text-align:left;cursor:pointer;color:var(--text-primary);transition:var(--transition-control)}
301
+ .pire-linklist-item:last-child{border-bottom:0}
302
+ .pire-linklist-item[data-hovered]{background:var(--surface-hover)}
303
+ .pire-linklist-key{font:var(--type-code)}
304
+ .pire-linklist-text{flex:1;min-width:0;font:var(--type-caption);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
305
+
306
+ /* ---- PageHeader / SectionHeader ---------------------------------------- */
307
+ .pire-pageheader{display:flex;align-items:flex-start;gap:var(--sp-4);flex-wrap:wrap}
308
+ .pire-pageheader-title{font:var(--type-h1);letter-spacing:var(--ls-heading);margin:0}
309
+ .pire-pageheader-sub{margin:var(--sp-1) 0 0;font:var(--type-body);color:var(--text-secondary);max-width:80ch}
310
+ .pire-pageheader-actions{margin-left:auto;display:flex;gap:var(--sp-2)}
311
+ .pire-sectionhead{display:flex;align-items:baseline;gap:var(--sp-3)}
312
+ .pire-sectionhead-actions{margin-left:auto;display:flex;align-items:baseline;gap:var(--sp-2)}
313
+
314
+ /* ---- SelectionBar / FooterBar ------------------------------------------ */
315
+ .pire-selectionbar{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);background:var(--surface-selected);border:1px solid var(--status-informative-border);border-radius:var(--radius-1);font:var(--type-body)}
316
+ .pire-selectionbar-count{font:var(--type-body-strong);color:var(--accent-subtle-fg)}
317
+ .pire-selectionbar-actions{margin-left:auto;display:flex;gap:var(--sp-2)}
318
+ .pire-footerbar{position:sticky;bottom:0;z-index:50;display:flex;align-items:center;gap:var(--sp-3);height:var(--control-h-lg);padding:0 var(--page-pad-x);background:var(--surface-card);border-top:1px solid var(--border-subtle);box-shadow:0 -1px 2px rgba(13,19,25,.08)}
319
+ .pire-footerbar-actions{margin-left:auto;display:flex;gap:var(--sp-2)}
320
+ .pire-footerbar-note{font:var(--type-caption);color:var(--text-secondary)}
321
+
322
+ /* ---- NumberField ------------------------------------------------------- */
323
+ .pire-stepper{display:flex;flex-direction:column;flex:0 0 auto;margin-right:calc(var(--control-pad-x) * -1 + 2px)}
324
+ .pire-stepper-btn{display:flex;align-items:center;justify-content:center;width:24px;height:14px;border:0;background:transparent;color:var(--text-secondary);cursor:pointer;border-radius:var(--radius-1)}
325
+ .pire-stepper-btn[data-hovered]{background:var(--surface-hover);color:var(--text-primary)}
326
+ .pire-stepper-btn[data-disabled]{color:var(--text-disabled);cursor:not-allowed}
327
+
328
+ /* ---- DatePicker / Calendar --------------------------------------------- */
329
+ .pire-datefield{display:flex;align-items:center;flex:1;min-width:0;font:var(--type-numeric);font-variant-numeric:tabular-nums}
330
+ .pire-datesegment{padding:0 1px;border-radius:2px;outline:none;color:var(--text-primary)}
331
+ .pire-datesegment[data-type="literal"]{color:var(--text-tertiary)}
332
+ .pire-datesegment[data-placeholder]{color:var(--text-tertiary)}
333
+ .pire-datesegment[data-focused]{background:var(--accent-bg);color:var(--accent-fg)}
334
+ .pire-calendar{padding:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-2)}
335
+ .pire-calendar-head{display:flex;align-items:center;gap:var(--sp-2)}
336
+ .pire-calendar-title{flex:1;text-align:center;font:var(--type-body-strong)}
337
+ .pire-calendar-grid{border-collapse:collapse}
338
+ .pire-calendar-grid th{width:32px;height:24px;font:var(--type-label);color:var(--text-tertiary);font-weight:var(--fw-medium)}
339
+ .pire-calendar-cell{width:32px;height:32px;text-align:center;vertical-align:middle;font:var(--type-numeric);border-radius:var(--radius-1);cursor:pointer;outline:none;color:var(--text-primary)}
340
+ .pire-calendar-cell[data-outside-month]{visibility:hidden}
341
+ .pire-calendar-cell[data-hovered]{background:var(--surface-hover)}
342
+ .pire-calendar-cell[data-selected]{background:var(--accent-bg);color:var(--accent-fg)}
343
+ .pire-calendar-cell[data-today]::after{content:"";display:block;width:4px;height:2px;margin:-4px auto 0;background:currentColor}
344
+ .pire-calendar-cell[data-disabled],.pire-calendar-cell[data-unavailable]{color:var(--text-disabled);cursor:not-allowed;text-decoration:line-through}
345
+ .pire-calendar-cell[data-focus-visible]{outline:var(--focus-w) solid var(--focus-color);outline-offset:-1px}
346
+
347
+ /* ---- Reduced motion --------------------------------------------------- */
348
+ @media (prefers-reduced-motion: reduce){.pire-modal,.pire-toast,.pire-popover,.pire-tooltip,.pire-sidepanel{animation:none}
349
+ /* !important is the point here: this must beat every component transition, including any a
350
+ consuming app has layered on top. Honouring the OS motion preference outranks the style rule. */
351
+ /* biome-ignore lint/complexity/noImportantStyles: accessibility override must win unconditionally */
352
+ *,*::before,*::after{transition-duration:1ms!important}}