@common-origin/design-system 3.0.0 → 3.1.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 (97) hide show
  1. package/dist/client.js +2175 -687
  2. package/dist/client.js.map +1 -1
  3. package/dist/components/atoms/Tooltip/Tooltip.d.mts +41 -0
  4. package/dist/components/atoms/Tooltip/Tooltip.d.ts +41 -0
  5. package/dist/components/atoms/Tooltip/Tooltip.mjs +204 -0
  6. package/dist/components/atoms/Tooltip/Tooltip.mjs.map +1 -0
  7. package/dist/components/atoms/Tooltip/index.d.mts +2 -0
  8. package/dist/components/atoms/Tooltip/index.d.ts +2 -0
  9. package/dist/components/atoms/index.d.mts +1 -0
  10. package/dist/components/atoms/index.d.ts +1 -0
  11. package/dist/components/index.d.mts +1 -0
  12. package/dist/components/index.d.ts +1 -0
  13. package/dist/components/molecules/ActionSheet/ActionSheet.mjs +1 -0
  14. package/dist/components/molecules/Alert/Alert.mjs +1 -1
  15. package/dist/components/molecules/ChipGroup/ChipGroup.mjs +1 -0
  16. package/dist/components/molecules/List/List.d.mts +2 -0
  17. package/dist/components/molecules/List/List.d.ts +2 -0
  18. package/dist/components/molecules/List/ListItem.d.mts +2 -0
  19. package/dist/components/molecules/List/ListItem.d.ts +2 -0
  20. package/dist/components/molecules/List/ListItem.mjs +5 -5
  21. package/dist/components/molecules/Menu/Menu.d.mts +117 -0
  22. package/dist/components/molecules/Menu/Menu.d.ts +117 -0
  23. package/dist/components/molecules/Menu/Menu.mjs +473 -0
  24. package/dist/components/molecules/Menu/Menu.mjs.map +1 -0
  25. package/dist/components/molecules/Menu/index.d.mts +2 -0
  26. package/dist/components/molecules/Menu/index.d.ts +2 -0
  27. package/dist/components/molecules/SearchField/SearchField.mjs +2 -0
  28. package/dist/components/molecules/SidebarNavItem/SidebarNavContext.d.mts +13 -0
  29. package/dist/components/molecules/SidebarNavItem/SidebarNavContext.d.ts +13 -0
  30. package/dist/components/molecules/SidebarNavItem/SidebarNavContext.mjs +13 -0
  31. package/dist/components/molecules/SidebarNavItem/SidebarNavContext.mjs.map +1 -0
  32. package/dist/components/molecules/SidebarNavItem/SidebarNavItem.d.mts +43 -0
  33. package/dist/components/molecules/SidebarNavItem/SidebarNavItem.d.ts +43 -0
  34. package/dist/components/molecules/SidebarNavItem/SidebarNavItem.mjs +148 -0
  35. package/dist/components/molecules/SidebarNavItem/SidebarNavItem.mjs.map +1 -0
  36. package/dist/components/molecules/SidebarNavItem/index.d.mts +2 -0
  37. package/dist/components/molecules/SidebarNavItem/index.d.ts +2 -0
  38. package/dist/components/molecules/SidebarNavSection/SidebarNavSection.d.mts +36 -0
  39. package/dist/components/molecules/SidebarNavSection/SidebarNavSection.d.ts +36 -0
  40. package/dist/components/molecules/SidebarNavSection/SidebarNavSection.mjs +188 -0
  41. package/dist/components/molecules/SidebarNavSection/SidebarNavSection.mjs.map +1 -0
  42. package/dist/components/molecules/SidebarNavSection/index.d.mts +2 -0
  43. package/dist/components/molecules/SidebarNavSection/index.d.ts +2 -0
  44. package/dist/components/molecules/TransactionListItem/TransactionListItem.mjs +1 -1
  45. package/dist/components/molecules/WorkspaceSwitcher/WorkspaceSwitcher.d.mts +39 -0
  46. package/dist/components/molecules/WorkspaceSwitcher/WorkspaceSwitcher.d.ts +39 -0
  47. package/dist/components/molecules/WorkspaceSwitcher/WorkspaceSwitcher.mjs +131 -0
  48. package/dist/components/molecules/WorkspaceSwitcher/WorkspaceSwitcher.mjs.map +1 -0
  49. package/dist/components/molecules/WorkspaceSwitcher/index.d.mts +2 -0
  50. package/dist/components/molecules/WorkspaceSwitcher/index.d.ts +2 -0
  51. package/dist/components/molecules/index.d.mts +4 -0
  52. package/dist/components/molecules/index.d.ts +4 -0
  53. package/dist/components/organisms/SidebarNav/SidebarNav.d.mts +52 -0
  54. package/dist/components/organisms/SidebarNav/SidebarNav.d.ts +52 -0
  55. package/dist/components/organisms/SidebarNav/SidebarNav.mjs +235 -0
  56. package/dist/components/organisms/SidebarNav/SidebarNav.mjs.map +1 -0
  57. package/dist/components/organisms/SidebarNav/index.d.mts +2 -0
  58. package/dist/components/organisms/SidebarNav/index.d.ts +2 -0
  59. package/dist/components/organisms/index.d.mts +1 -0
  60. package/dist/components/organisms/index.d.ts +1 -0
  61. package/dist/data.js +59 -9
  62. package/dist/data.js.map +1 -1
  63. package/dist/index.js +11 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/index.mjs +6 -0
  66. package/dist/index.mjs.map +1 -1
  67. package/dist/lib/floatingPosition.d.mts +43 -0
  68. package/dist/lib/floatingPosition.d.ts +43 -0
  69. package/dist/lib/floatingPosition.mjs +86 -0
  70. package/dist/lib/floatingPosition.mjs.map +1 -0
  71. package/dist/lib/keyboardFocus.d.mts +6 -0
  72. package/dist/lib/keyboardFocus.d.ts +6 -0
  73. package/dist/lib/keyboardFocus.mjs +17 -0
  74. package/dist/lib/keyboardFocus.mjs.map +1 -0
  75. package/dist/lib/useFloatingLayer.d.mts +25 -0
  76. package/dist/lib/useFloatingLayer.d.ts +25 -0
  77. package/dist/lib/useFloatingLayer.mjs +86 -0
  78. package/dist/lib/useFloatingLayer.mjs.map +1 -0
  79. package/dist/styles/icons.json +30 -1
  80. package/dist/styles/icons.json.mjs +34 -3
  81. package/dist/styles/icons.json.mjs.map +1 -1
  82. package/dist/styles/tokens.d.mts +46 -8
  83. package/dist/styles/tokens.d.ts +46 -8
  84. package/dist/styles/tokens.json +26 -7
  85. package/dist/styles/tokens.json.mjs +26 -7
  86. package/dist/styles/tokens.json.mjs.map +1 -1
  87. package/dist/tokens/index.js +26 -7
  88. package/dist/tokens/index.js.map +1 -1
  89. package/dist/tokens/index.mjs +26 -7
  90. package/dist/tokens/index.mjs.map +1 -1
  91. package/dist/tokens/styles/tokens.d.mts +46 -8
  92. package/dist/tokens/styles/tokens.d.ts +46 -8
  93. package/dist/tokens.css +35 -15
  94. package/dist/types/icons.d.mts +1 -1
  95. package/dist/types/icons.d.ts +1 -1
  96. package/dist/types/icons.mjs.map +1 -1
  97. package/package.json +2 -2
package/dist/data.js CHANGED
@@ -787,7 +787,7 @@ var component = {
787
787
  }
788
788
  },
789
789
  title: {
790
- typography: "500 1.125rem/1.5rem 'Inter', sans-serif",
790
+ typography: "600 1.125rem/1.5rem 'Inter', sans-serif",
791
791
  fontWeight: "600",
792
792
  lineHeight: "1.25rem"
793
793
  },
@@ -831,6 +831,14 @@ var component = {
831
831
  fontSize: "0.75rem",
832
832
  lineHeight: "1.25rem"
833
833
  },
834
+ sidebarNav: {
835
+ width: {
836
+ rail: "3.5rem",
837
+ narrow: "14rem",
838
+ "default": "16rem",
839
+ wide: "18.75rem"
840
+ }
841
+ },
834
842
  slider: {
835
843
  thumb: {
836
844
  shadow: {
@@ -989,12 +997,15 @@ var semantic = {
989
997
  "600": "1.5rem",
990
998
  "800": "2rem",
991
999
  "1200": "3rem",
1000
+ "1400": "3.5rem",
992
1001
  "1500": "3.75rem",
993
1002
  "1800": "4.5rem",
994
1003
  "2000": "5rem",
995
1004
  "3000": "7.5rem",
996
1005
  "4500": "11.25rem",
997
1006
  "5000": "12.5rem",
1007
+ "5600": "14rem",
1008
+ "6400": "16rem",
998
1009
  "7500": "18.75rem",
999
1010
  "9000": "22.5rem",
1000
1011
  "10000": "25rem",
@@ -1006,6 +1017,11 @@ var semantic = {
1006
1017
  md: "2.5rem",
1007
1018
  lg: "3rem"
1008
1019
  },
1020
+ row: {
1021
+ sm: "2rem",
1022
+ md: "3rem",
1023
+ lg: "4.5rem"
1024
+ },
1009
1025
  overlay: {
1010
1026
  sm: "25rem",
1011
1027
  md: "35rem",
@@ -1162,12 +1178,12 @@ var semantic = {
1162
1178
  },
1163
1179
  typography: {
1164
1180
  display: "700 5rem/4.5rem 'Inter', sans-serif",
1165
- h1: "700 3rem/3rem 'Inter', sans-serif",
1166
- h2: "700 2rem/2.5rem 'Inter', sans-serif",
1167
- h3: "700 1.75rem/2.25rem 'Inter', sans-serif",
1168
- h4: "700 1.5rem/2rem 'Inter', sans-serif",
1169
- h5: "500 1.25rem/1.75rem 'Inter', sans-serif",
1170
- h6: "500 1.125rem/1.5rem 'Inter', sans-serif",
1181
+ h1: "600 3rem/3rem 'Inter', sans-serif",
1182
+ h2: "600 2rem/2.5rem 'Inter', sans-serif",
1183
+ h3: "600 1.75rem/2.25rem 'Inter', sans-serif",
1184
+ h4: "600 1.5rem/2rem 'Inter', sans-serif",
1185
+ h5: "600 1.25rem/1.75rem 'Inter', sans-serif",
1186
+ h6: "600 1.125rem/1.5rem 'Inter', sans-serif",
1171
1187
  subtitle: "500 1rem/1.5rem 'Inter', sans-serif",
1172
1188
  body: "400 1rem/1.5rem 'Inter', sans-serif",
1173
1189
  small: "400 0.875rem/1.25rem 'Inter', sans-serif",
@@ -1182,6 +1198,9 @@ var semantic = {
1182
1198
  instant: "0ms",
1183
1199
  moderate: "200ms"
1184
1200
  },
1201
+ delay: {
1202
+ hint: "500ms"
1203
+ },
1185
1204
  easing: {
1186
1205
  standard: "ease-in-out",
1187
1206
  decelerate: "ease-out",
@@ -1612,7 +1631,6 @@ var menu = {
1612
1631
  aliases: [
1613
1632
  "hamburger",
1614
1633
  "nav",
1615
- "sidebar",
1616
1634
  "navigation"
1617
1635
  ],
1618
1636
  intent: "Use to open a navigation menu or sidebar",
@@ -2147,6 +2165,36 @@ var statusCancelled = {
2147
2165
  decorativeDefault: false,
2148
2166
  ariaLabelDefault: "Cancelled"
2149
2167
  };
2168
+ var home = {
2169
+ path: "M12 2.7L21 10.3V21H3V10.3Z M12 5.32L5 11.23V19H19V11.23Z M9 13H15V19H13V15H11V19H9Z",
2170
+ name: "home",
2171
+ description: "House outline with a door",
2172
+ category: "navigation",
2173
+ aliases: [
2174
+ "house",
2175
+ "dashboard",
2176
+ "main",
2177
+ "homepage"
2178
+ ],
2179
+ intent: "Use for a link to the product's home or start page",
2180
+ decorativeDefault: false,
2181
+ ariaLabelDefault: "Home"
2182
+ };
2183
+ var sidebar = {
2184
+ path: "M14 2C17.7712 2 19.6566 2.0003 20.8281 3.17188C21.9997 4.34345 22 6.22876 22 10V14C22 17.7712 21.9997 19.6566 20.8281 20.8281C19.803 21.8533 18.2315 21.982 15.3281 21.998L14 22H10L8.67188 21.998C5.8719 21.9826 4.31033 21.8625 3.2832 20.9346L3.17188 20.8281C2.14675 19.803 2.01797 18.2315 2.00195 15.3281L2 14V10C2 6.34627 2 4.46248 3.06543 3.2832L3.17188 3.17188C4.34345 2.0003 6.22876 2 10 2H14Z M10 4C8.05784 4 6.80197 4.00454 5.87695 4.12891C5.00986 4.24554 4.73816 4.43372 4.58594 4.58594C4.43372 4.73816 4.24554 5.00986 4.12891 5.87695C4.00454 6.80197 4 8.05784 4 10V14C4 15.9422 4.00454 17.198 4.12891 18.123C4.24554 18.9901 4.43372 19.2618 4.58594 19.4141C4.73816 19.5663 5.00986 19.7545 5.87695 19.8711C6.80197 19.9955 8.05784 20 10 20H14C15.9422 20 17.198 19.9955 18.123 19.8711C18.9901 19.7545 19.2618 19.5663 19.4141 19.4141C19.5663 19.2618 19.7545 18.9901 19.8711 18.123C19.9955 17.198 20 15.9422 20 14V10C20 8.05784 19.9955 6.80197 19.8711 5.87695C19.7545 5.00986 19.5663 4.73816 19.4141 4.58594C19.2618 4.43372 18.9901 4.24554 18.123 4.12891C17.198 4.00454 15.9422 4 14 4Z M8 4H10V20H8Z",
2185
+ name: "sidebar",
2186
+ description: "Rounded square with a narrow column on the left",
2187
+ category: "navigation",
2188
+ aliases: [
2189
+ "panel",
2190
+ "side-panel",
2191
+ "drawer",
2192
+ "rail"
2193
+ ],
2194
+ intent: "Use for a button that collapses or expands a sidebar",
2195
+ decorativeDefault: false,
2196
+ ariaLabelDefault: "Toggle sidebar"
2197
+ };
2150
2198
  var iconsJson = {
2151
2199
  ai: ai,
2152
2200
  add: add,
@@ -2222,7 +2270,9 @@ var iconsJson = {
2222
2270
  statusPending: statusPending,
2223
2271
  statusScheduled: statusScheduled,
2224
2272
  statusNotStarted: statusNotStarted,
2225
- statusCancelled: statusCancelled
2273
+ statusCancelled: statusCancelled,
2274
+ home: home,
2275
+ sidebar: sidebar
2226
2276
  };
2227
2277
 
2228
2278
  // The published types come from the generated `src/styles/tokens.ts`, which carries each token's
package/dist/data.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sources":["../src/types/tokens.ts","../src/types/icons.ts"],"sourcesContent":["import tokensJson from '../styles/tokens.json'\nimport type { Tokens } from '../styles/tokens'\n\n// The published types come from the generated `src/styles/tokens.ts`, which carries each token's\n// description as JSDoc and `@deprecated` on deprecated tokens (decision 0033, #199). Declaring the\n// constant with that type also keeps emitted .d.ts files free of JSON imports, which consumers can\n// only resolve with `resolveJsonModule`.\nexport const tokens: Tokens = tokensJson\n\nexport type { Tokens }\nexport type TokensBase = Tokens['base']\nexport type TokensSemantic = Tokens['semantic']\nexport type TokensComponent = Tokens['component']\n","// Icon type definitions for external consumption\n// This is a self-contained type that doesn't depend on JSON imports\n// to ensure it works correctly in consuming projects\n\nimport iconsJson from '../styles/icons.json'\n\nexport type IconName =\n | 'add'\n | 'ai'\n | 'addRing'\n | 'arrowDown'\n | 'arrowLeft'\n | 'arrowRight'\n | 'arrowUp'\n | 'back'\n | 'bell'\n | 'cancel'\n | 'caret'\n | 'caretDown'\n | 'caretUp'\n | 'check'\n | 'checkRing'\n | 'close'\n | 'copy'\n | 'creditCard'\n | 'crossCircle'\n | 'directionRight'\n | 'directionUp'\n | 'edit'\n | 'export'\n | 'fileDocSearch'\n | 'filter'\n | 'info'\n | 'kebab'\n | 'lamp'\n | 'lineOut'\n | 'link'\n | 'meatballs'\n | 'menu'\n | 'message'\n | 'move'\n | 'mic'\n | 'order'\n | 'paper'\n | 'pause'\n | 'play'\n | 'playBack'\n | 'refresh'\n | 'remove'\n | 'search'\n | 'star'\n | 'starFilled'\n | 'statusCancelled'\n | 'statusError'\n | 'statusInProgress'\n | 'statusInfo'\n | 'statusNotStarted'\n | 'statusPending'\n | 'statusScheduled'\n | 'statusSerious'\n | 'statusSuccess'\n | 'statusWarning'\n | 'stop'\n | 'table'\n | 'trash'\n | 'userBox'\n | 'view'\n | 'viewHide'\n | 'wallet'\n\n/** Semantic category for grouping icons by purpose */\nexport type IconCategory =\n | 'action'\n | 'communication'\n | 'content'\n | 'feedback'\n | 'media'\n | 'navigation'\n | 'object'\n | 'status'\n | 'user'\n\n/** Enriched metadata for each icon entry in icons.json */\nexport interface IconMetadata {\n /** SVG path data */\n path: string\n /** Display name of the icon */\n name: string\n /** What the icon visually depicts */\n description: string\n /** Semantic category for grouping */\n category: IconCategory\n /** Alternative names and search terms */\n aliases: string[]\n /** When and why to use this icon */\n intent: string\n /** Whether the icon is typically decorative (true) or informative (false) */\n decorativeDefault: boolean\n /** Suggested accessible label when the icon conveys meaning */\n ariaLabelDefault: string\n}\n\n/** The full icon registry keyed by IconName */\nexport type IconRegistry = Record<IconName, IconMetadata>\n\n// Typed as IconRegistry so emitted .d.ts files don't import JSON (needs `resolveJsonModule` in consumers).\nexport const iconsData = iconsJson as IconRegistry\n"],"names":["tokens","tokensJson","iconsData","iconsJson"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACO,IAAMA,MAAM,GAAWC;;ACP9B;AACA;AACA;AAuGA;AACO,IAAMC,SAAS,GAAGC;;;;;;;"}
1
+ {"version":3,"file":"data.js","sources":["../src/types/tokens.ts","../src/types/icons.ts"],"sourcesContent":["import tokensJson from '../styles/tokens.json'\nimport type { Tokens } from '../styles/tokens'\n\n// The published types come from the generated `src/styles/tokens.ts`, which carries each token's\n// description as JSDoc and `@deprecated` on deprecated tokens (decision 0033, #199). Declaring the\n// constant with that type also keeps emitted .d.ts files free of JSON imports, which consumers can\n// only resolve with `resolveJsonModule`.\nexport const tokens: Tokens = tokensJson\n\nexport type { Tokens }\nexport type TokensBase = Tokens['base']\nexport type TokensSemantic = Tokens['semantic']\nexport type TokensComponent = Tokens['component']\n","// Icon type definitions for external consumption\n// This is a self-contained type that doesn't depend on JSON imports\n// to ensure it works correctly in consuming projects\n\nimport iconsJson from '../styles/icons.json'\n\nexport type IconName =\n | 'add'\n | 'ai'\n | 'addRing'\n | 'arrowDown'\n | 'arrowLeft'\n | 'arrowRight'\n | 'arrowUp'\n | 'back'\n | 'bell'\n | 'cancel'\n | 'caret'\n | 'caretDown'\n | 'caretUp'\n | 'check'\n | 'checkRing'\n | 'close'\n | 'copy'\n | 'creditCard'\n | 'crossCircle'\n | 'directionRight'\n | 'directionUp'\n | 'edit'\n | 'export'\n | 'fileDocSearch'\n | 'filter'\n | 'home'\n | 'info'\n | 'kebab'\n | 'lamp'\n | 'lineOut'\n | 'link'\n | 'meatballs'\n | 'menu'\n | 'message'\n | 'move'\n | 'mic'\n | 'order'\n | 'paper'\n | 'pause'\n | 'play'\n | 'playBack'\n | 'refresh'\n | 'remove'\n | 'search'\n | 'sidebar'\n | 'star'\n | 'starFilled'\n | 'statusCancelled'\n | 'statusError'\n | 'statusInProgress'\n | 'statusInfo'\n | 'statusNotStarted'\n | 'statusPending'\n | 'statusScheduled'\n | 'statusSerious'\n | 'statusSuccess'\n | 'statusWarning'\n | 'stop'\n | 'table'\n | 'trash'\n | 'userBox'\n | 'view'\n | 'viewHide'\n | 'wallet'\n\n/** Semantic category for grouping icons by purpose */\nexport type IconCategory =\n | 'action'\n | 'communication'\n | 'content'\n | 'feedback'\n | 'media'\n | 'navigation'\n | 'object'\n | 'status'\n | 'user'\n\n/** Enriched metadata for each icon entry in icons.json */\nexport interface IconMetadata {\n /** SVG path data */\n path: string\n /** Display name of the icon */\n name: string\n /** What the icon visually depicts */\n description: string\n /** Semantic category for grouping */\n category: IconCategory\n /** Alternative names and search terms */\n aliases: string[]\n /** When and why to use this icon */\n intent: string\n /** Whether the icon is typically decorative (true) or informative (false) */\n decorativeDefault: boolean\n /** Suggested accessible label when the icon conveys meaning */\n ariaLabelDefault: string\n}\n\n/** The full icon registry keyed by IconName */\nexport type IconRegistry = Record<IconName, IconMetadata>\n\n// Typed as IconRegistry so emitted .d.ts files don't import JSON (needs `resolveJsonModule` in consumers).\nexport const iconsData = iconsJson as IconRegistry\n"],"names":["tokens","tokensJson","iconsData","iconsJson"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACO,IAAMA,MAAM,GAAWC;;ACP9B;AACA;AACA;AAyGA;AACO,IAAMC,SAAS,GAAGC;;;;;;;"}
package/dist/index.js CHANGED
@@ -43,6 +43,12 @@ exports.InlineAlert = client.InlineAlert;
43
43
  exports.InputChip = client.InputChip;
44
44
  exports.List = client.List;
45
45
  exports.ListItem = client.ListItem;
46
+ exports.Menu = client.Menu;
47
+ exports.MenuDivider = client.MenuDivider;
48
+ exports.MenuGroup = client.MenuGroup;
49
+ exports.MenuItem = client.MenuItem;
50
+ exports.MenuItemCheckbox = client.MenuItemCheckbox;
51
+ exports.MenuItemRadio = client.MenuItemRadio;
46
52
  exports.Modal = client.Modal;
47
53
  exports.MoneyDisplay = client.MoneyDisplay;
48
54
  exports.NumberInput = client.NumberInput;
@@ -52,6 +58,9 @@ exports.ProgressBar = client.ProgressBar;
52
58
  exports.ResponsiveGrid = client.ResponsiveGrid;
53
59
  exports.SearchField = client.SearchField;
54
60
  exports.Sheet = client.Sheet;
61
+ exports.SidebarNav = client.SidebarNav;
62
+ exports.SidebarNavItem = client.SidebarNavItem;
63
+ exports.SidebarNavSection = client.SidebarNavSection;
55
64
  exports.Slider = client.Slider;
56
65
  exports.Stack = client.Stack;
57
66
  exports.StatusLabel = client.StatusLabel;
@@ -61,8 +70,10 @@ exports.SuggestionChip = client.SuggestionChip;
61
70
  exports.TabBar = client.TabBar;
62
71
  exports.Tag = client.Tag;
63
72
  exports.TextField = client.TextField;
73
+ exports.Tooltip = client.Tooltip;
64
74
  exports.TransactionListItem = client.TransactionListItem;
65
75
  exports.Typography = client.Typography;
76
+ exports.WorkspaceSwitcher = client.WorkspaceSwitcher;
66
77
  exports.iconsData = data.iconsData;
67
78
  exports.tokens = data.tokens;
68
79
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.mjs CHANGED
@@ -18,6 +18,7 @@ export { Divider } from './components/atoms/Divider/Divider.mjs';
18
18
  export { Stack } from './components/atoms/Stack/Stack.mjs';
19
19
  export { StatusLabel } from './components/atoms/StatusLabel/StatusLabel.mjs';
20
20
  export { Tag } from './components/atoms/Tag/Tag.mjs';
21
+ export { Tooltip } from './components/atoms/Tooltip/Tooltip.mjs';
21
22
  export { Typography } from './components/atoms/Typography/Typography.mjs';
22
23
  export { AILabel } from './components/atoms/AILabel/AILabel.mjs';
23
24
  export { AccountCard } from './components/molecules/AccountCard/AccountCard.mjs';
@@ -37,6 +38,9 @@ export { FeatureBlock } from './components/molecules/FeatureBlock/FeatureBlock.m
37
38
  export { Dropdown } from './components/molecules/Dropdown/Dropdown.mjs';
38
39
  export { List } from './components/molecules/List/List.mjs';
39
40
  export { ListItem } from './components/molecules/List/ListItem.mjs';
41
+ export { Menu, MenuDivider, MenuGroup, MenuItem, MenuItemCheckbox, MenuItemRadio } from './components/molecules/Menu/Menu.mjs';
42
+ export { SidebarNavItem } from './components/molecules/SidebarNavItem/SidebarNavItem.mjs';
43
+ export { SidebarNavSection } from './components/molecules/SidebarNavSection/SidebarNavSection.mjs';
40
44
  export { Modal } from './components/molecules/Modal/Modal.mjs';
41
45
  export { NumberInput } from './components/molecules/NumberInput/NumberInput.mjs';
42
46
  export { PasswordField } from './components/molecules/PasswordField/PasswordField.mjs';
@@ -47,6 +51,8 @@ export { TabBar } from './components/molecules/TabBar/TabBar.mjs';
47
51
  export { TextField } from './components/molecules/TextField/TextField.mjs';
48
52
  export { StyledInputBase, StyledTextAreaBase } from './components/molecules/TextField/InputBase.mjs';
49
53
  export { TransactionListItem } from './components/molecules/TransactionListItem/TransactionListItem.mjs';
54
+ export { WorkspaceSwitcher } from './components/molecules/WorkspaceSwitcher/WorkspaceSwitcher.mjs';
55
+ export { SidebarNav } from './components/organisms/SidebarNav/SidebarNav.mjs';
50
56
  export { Grid, GridCol, ResponsiveGrid } from './components/layout/GridSystem/GridSystem.mjs';
51
57
  export { tokens } from './types/tokens.mjs';
52
58
  export { iconsData } from './types/icons.mjs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,43 @@
1
+ export type FloatingSide = 'top' | 'right' | 'bottom' | 'left';
2
+ export type FloatingAlign = 'start' | 'center' | 'end';
3
+ export interface FloatingRect {
4
+ top: number;
5
+ left: number;
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface FloatingOptions {
10
+ /** The anchor's box, from getBoundingClientRect */
11
+ anchor: FloatingRect;
12
+ /** The floating element's size */
13
+ floating: {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ /** The side to place it on; it flips to the opposite side when that has more room */
18
+ side: FloatingSide;
19
+ /** Where it lines up along the anchor's edge */
20
+ align: FloatingAlign;
21
+ /** The gap between the anchor and the floating element, in px */
22
+ offset: number;
23
+ /** The viewport's size */
24
+ viewport: {
25
+ width: number;
26
+ height: number;
27
+ };
28
+ /** The smallest distance kept from the viewport's edges, in px */
29
+ margin: number;
30
+ }
31
+ export interface FloatingPosition {
32
+ top: number;
33
+ left: number;
34
+ /** The side it ended up on, after any flip */
35
+ side: FloatingSide;
36
+ }
37
+ export declare function placeFloating(options: FloatingOptions): FloatingPosition;
38
+ /**
39
+ * The element that actually has a box inside a wrapper: Tooltip and Menu wrap their trigger in a
40
+ * `display: contents` span, and a trigger can be nested in more than one (a Tooltip inside a Menu's
41
+ * trigger), so this steps down until it finds an element that lays out.
42
+ */
43
+ export declare function laidOutElement(wrapper: Element | null): Element | null;
@@ -0,0 +1,43 @@
1
+ export type FloatingSide = 'top' | 'right' | 'bottom' | 'left';
2
+ export type FloatingAlign = 'start' | 'center' | 'end';
3
+ export interface FloatingRect {
4
+ top: number;
5
+ left: number;
6
+ width: number;
7
+ height: number;
8
+ }
9
+ export interface FloatingOptions {
10
+ /** The anchor's box, from getBoundingClientRect */
11
+ anchor: FloatingRect;
12
+ /** The floating element's size */
13
+ floating: {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ /** The side to place it on; it flips to the opposite side when that has more room */
18
+ side: FloatingSide;
19
+ /** Where it lines up along the anchor's edge */
20
+ align: FloatingAlign;
21
+ /** The gap between the anchor and the floating element, in px */
22
+ offset: number;
23
+ /** The viewport's size */
24
+ viewport: {
25
+ width: number;
26
+ height: number;
27
+ };
28
+ /** The smallest distance kept from the viewport's edges, in px */
29
+ margin: number;
30
+ }
31
+ export interface FloatingPosition {
32
+ top: number;
33
+ left: number;
34
+ /** The side it ended up on, after any flip */
35
+ side: FloatingSide;
36
+ }
37
+ export declare function placeFloating(options: FloatingOptions): FloatingPosition;
38
+ /**
39
+ * The element that actually has a box inside a wrapper: Tooltip and Menu wrap their trigger in a
40
+ * `display: contents` span, and a trigger can be nested in more than one (a Tooltip inside a Menu's
41
+ * trigger), so this steps down until it finds an element that lays out.
42
+ */
43
+ export declare function laidOutElement(wrapper: Element | null): Element | null;
@@ -0,0 +1,86 @@
1
+ 'use client';
2
+ // Places a floating element (Tooltip, Menu) next to its anchor, without a positioning library
3
+ // (P8). Pure geometry, so it can be tested without a browser: the caller measures both elements
4
+ // and applies the result as `top` and `left` on a `position: fixed` element.
5
+ var opposite = {
6
+ top: 'bottom',
7
+ bottom: 'top',
8
+ left: 'right',
9
+ right: 'left'
10
+ };
11
+ // The room between the anchor and the viewport edge on each side
12
+ var room = function room(side, _a) {
13
+ var anchor = _a.anchor,
14
+ viewport = _a.viewport,
15
+ margin = _a.margin;
16
+ switch (side) {
17
+ case 'top':
18
+ return anchor.top - margin;
19
+ case 'bottom':
20
+ return viewport.height - (anchor.top + anchor.height) - margin;
21
+ case 'left':
22
+ return anchor.left - margin;
23
+ case 'right':
24
+ return viewport.width - (anchor.left + anchor.width) - margin;
25
+ }
26
+ };
27
+ var clamp = function clamp(value, min, max) {
28
+ return Math.max(min, Math.min(value, max));
29
+ };
30
+ function placeFloating(options) {
31
+ var anchor = options.anchor,
32
+ floating = options.floating,
33
+ align = options.align,
34
+ offset = options.offset,
35
+ viewport = options.viewport,
36
+ margin = options.margin;
37
+ var vertical = function vertical(s) {
38
+ return s === 'top' || s === 'bottom';
39
+ };
40
+ // Flip when the preferred side is too small and the opposite side has more room
41
+ var side = options.side;
42
+ var needed = (vertical(side) ? floating.height : floating.width) + offset;
43
+ if (room(side, options) < needed && room(opposite[side], options) > room(side, options)) {
44
+ side = opposite[side];
45
+ }
46
+ // Main axis: beside the anchor, `offset` away
47
+ var top = 0;
48
+ var left = 0;
49
+ if (side === 'top') top = anchor.top - offset - floating.height;
50
+ if (side === 'bottom') top = anchor.top + anchor.height + offset;
51
+ if (side === 'left') left = anchor.left - offset - floating.width;
52
+ if (side === 'right') left = anchor.left + anchor.width + offset;
53
+ // Cross axis: aligned to the anchor's start, centre or end, then kept inside the viewport
54
+ if (vertical(side)) {
55
+ if (align === 'start') left = anchor.left;
56
+ if (align === 'center') left = anchor.left + (anchor.width - floating.width) / 2;
57
+ if (align === 'end') left = anchor.left + anchor.width - floating.width;
58
+ left = clamp(left, margin, viewport.width - floating.width - margin);
59
+ } else {
60
+ if (align === 'start') top = anchor.top;
61
+ if (align === 'center') top = anchor.top + (anchor.height - floating.height) / 2;
62
+ if (align === 'end') top = anchor.top + anchor.height - floating.height;
63
+ top = clamp(top, margin, viewport.height - floating.height - margin);
64
+ }
65
+ return {
66
+ top: Math.round(top),
67
+ left: Math.round(left),
68
+ side: side
69
+ };
70
+ }
71
+ /**
72
+ * The element that actually has a box inside a wrapper: Tooltip and Menu wrap their trigger in a
73
+ * `display: contents` span, and a trigger can be nested in more than one (a Tooltip inside a Menu's
74
+ * trigger), so this steps down until it finds an element that lays out.
75
+ */
76
+ function laidOutElement(wrapper) {
77
+ var _a;
78
+ var element = (_a = wrapper === null || wrapper === void 0 ? void 0 : wrapper.firstElementChild) !== null && _a !== void 0 ? _a : null;
79
+ while (element && typeof getComputedStyle !== 'undefined' && getComputedStyle(element).display === 'contents') {
80
+ element = element.firstElementChild;
81
+ }
82
+ return element;
83
+ }
84
+
85
+ export { laidOutElement, placeFloating };
86
+ //# sourceMappingURL=floatingPosition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floatingPosition.mjs","sources":["../../src/lib/floatingPosition.ts"],"sourcesContent":["// Places a floating element (Tooltip, Menu) next to its anchor, without a positioning library\n// (P8). Pure geometry, so it can be tested without a browser: the caller measures both elements\n// and applies the result as `top` and `left` on a `position: fixed` element.\n\nexport type FloatingSide = 'top' | 'right' | 'bottom' | 'left'\nexport type FloatingAlign = 'start' | 'center' | 'end'\n\nexport interface FloatingRect {\n top: number\n left: number\n width: number\n height: number\n}\n\nexport interface FloatingOptions {\n /** The anchor's box, from getBoundingClientRect */\n anchor: FloatingRect\n /** The floating element's size */\n floating: { width: number; height: number }\n /** The side to place it on; it flips to the opposite side when that has more room */\n side: FloatingSide\n /** Where it lines up along the anchor's edge */\n align: FloatingAlign\n /** The gap between the anchor and the floating element, in px */\n offset: number\n /** The viewport's size */\n viewport: { width: number; height: number }\n /** The smallest distance kept from the viewport's edges, in px */\n margin: number\n}\n\nexport interface FloatingPosition {\n top: number\n left: number\n /** The side it ended up on, after any flip */\n side: FloatingSide\n}\n\nconst opposite: Record<FloatingSide, FloatingSide> = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' }\n\n// The room between the anchor and the viewport edge on each side\nconst room = (side: FloatingSide, { anchor, viewport, margin }: FloatingOptions) => {\n switch (side) {\n case 'top': return anchor.top - margin\n case 'bottom': return viewport.height - (anchor.top + anchor.height) - margin\n case 'left': return anchor.left - margin\n case 'right': return viewport.width - (anchor.left + anchor.width) - margin\n }\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(value, max))\n\nexport function placeFloating(options: FloatingOptions): FloatingPosition {\n const { anchor, floating, align, offset, viewport, margin } = options\n const vertical = (s: FloatingSide) => s === 'top' || s === 'bottom'\n\n // Flip when the preferred side is too small and the opposite side has more room\n let side = options.side\n const needed = (vertical(side) ? floating.height : floating.width) + offset\n if (room(side, options) < needed && room(opposite[side], options) > room(side, options)) {\n side = opposite[side]\n }\n\n // Main axis: beside the anchor, `offset` away\n let top = 0\n let left = 0\n if (side === 'top') top = anchor.top - offset - floating.height\n if (side === 'bottom') top = anchor.top + anchor.height + offset\n if (side === 'left') left = anchor.left - offset - floating.width\n if (side === 'right') left = anchor.left + anchor.width + offset\n\n // Cross axis: aligned to the anchor's start, centre or end, then kept inside the viewport\n if (vertical(side)) {\n if (align === 'start') left = anchor.left\n if (align === 'center') left = anchor.left + (anchor.width - floating.width) / 2\n if (align === 'end') left = anchor.left + anchor.width - floating.width\n left = clamp(left, margin, viewport.width - floating.width - margin)\n } else {\n if (align === 'start') top = anchor.top\n if (align === 'center') top = anchor.top + (anchor.height - floating.height) / 2\n if (align === 'end') top = anchor.top + anchor.height - floating.height\n top = clamp(top, margin, viewport.height - floating.height - margin)\n }\n\n return { top: Math.round(top), left: Math.round(left), side }\n}\n\n/**\n * The element that actually has a box inside a wrapper: Tooltip and Menu wrap their trigger in a\n * `display: contents` span, and a trigger can be nested in more than one (a Tooltip inside a Menu's\n * trigger), so this steps down until it finds an element that lays out.\n */\nexport function laidOutElement(wrapper: Element | null): Element | null {\n let element = wrapper?.firstElementChild ?? null\n while (element && typeof getComputedStyle !== 'undefined' && getComputedStyle(element).display === 'contents') {\n element = element.firstElementChild\n }\n return element\n}\n"],"names":["opposite","top","bottom","left","right","room","side","_a","anchor","viewport","margin","height","width","clamp","value","min","max","Math","placeFloating","options","floating","align","offset","vertical","s","needed","round","laidOutElement","wrapper","element","firstElementChild","getComputedStyle","display"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether focus arrived from the keyboard rather than a click or tap, so a component can show
3
+ * something on keyboard focus only (a Tooltip, SidebarNav's highlight). Browsers without
4
+ * `:focus-visible` treat every focus as keyboard focus.
5
+ */
6
+ export declare function isKeyboardFocus(target: EventTarget | null): boolean;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether focus arrived from the keyboard rather than a click or tap, so a component can show
3
+ * something on keyboard focus only (a Tooltip, SidebarNav's highlight). Browsers without
4
+ * `:focus-visible` treat every focus as keyboard focus.
5
+ */
6
+ export declare function isKeyboardFocus(target: EventTarget | null): boolean;
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ /**
3
+ * Whether focus arrived from the keyboard rather than a click or tap, so a component can show
4
+ * something on keyboard focus only (a Tooltip, SidebarNav's highlight). Browsers without
5
+ * `:focus-visible` treat every focus as keyboard focus.
6
+ */
7
+ function isKeyboardFocus(target) {
8
+ if (!(target instanceof Element)) return false;
9
+ try {
10
+ return target.matches(':focus-visible');
11
+ } catch (_a) {
12
+ return true;
13
+ }
14
+ }
15
+
16
+ export { isKeyboardFocus };
17
+ //# sourceMappingURL=keyboardFocus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboardFocus.mjs","sources":["../../src/lib/keyboardFocus.ts"],"sourcesContent":["/**\n * Whether focus arrived from the keyboard rather than a click or tap, so a component can show\n * something on keyboard focus only (a Tooltip, SidebarNav's highlight). Browsers without\n * `:focus-visible` treat every focus as keyboard focus.\n */\nexport function isKeyboardFocus(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false\n try {\n return target.matches(':focus-visible')\n } catch {\n return true\n }\n}\n"],"names":["isKeyboardFocus","target","Element","matches","_a"],"mappings":";AAAA;;;;AAIG;AACG,SAAUA,eAAeA,CAACC,MAA0B,EAAA;AACxD,EAAA,IAAI,EAAEA,MAAM,YAAYC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;EAC9C,IAAI;AACF,IAAA,OAAOD,MAAM,CAACE,OAAO,CAAC,gBAAgB,CAAC,CAAA;GACxC,CAAC,OAAAC,EAAA,EAAM;AACN,IAAA,OAAO,IAAI,CAAA;AACb,GAAA;AACF;;;;"}
@@ -0,0 +1,25 @@
1
+ import { useEffect, type RefObject } from 'react';
2
+ import { type FloatingAlign, type FloatingSide } from './floatingPosition.mjs';
3
+ export declare const useIsomorphicLayoutEffect: typeof useEffect;
4
+ interface FloatingLayerOptions {
5
+ /** Whether the floating element is rendered */
6
+ isPresent: boolean;
7
+ /** The floating element: `position: fixed`, placed with top and left */
8
+ floatingRef: RefObject<HTMLElement | null>;
9
+ /** The `display: contents` wrapper around the trigger */
10
+ anchorRef: RefObject<Element | null>;
11
+ side: FloatingSide;
12
+ align: FloatingAlign;
13
+ /**
14
+ * Called when the trigger may have moved away from the floating element: the page or a container
15
+ * scrolled (anything but the floating element itself), or the window resized
16
+ */
17
+ onDetach: () => void;
18
+ }
19
+ /**
20
+ * Shows a floating element (Tooltip, Menu) in the top layer beside its trigger, before the browser
21
+ * paints, and places it again whenever its size changes. A gap of `space.100` separates it from the
22
+ * trigger, and it keeps `space.200` from the viewport's edges.
23
+ */
24
+ export declare function useFloatingLayer({ isPresent, floatingRef, anchorRef, side, align, onDetach }: FloatingLayerOptions): void;
25
+ export {};
@@ -0,0 +1,25 @@
1
+ import { useEffect, type RefObject } from 'react';
2
+ import { type FloatingAlign, type FloatingSide } from './floatingPosition';
3
+ export declare const useIsomorphicLayoutEffect: typeof useEffect;
4
+ interface FloatingLayerOptions {
5
+ /** Whether the floating element is rendered */
6
+ isPresent: boolean;
7
+ /** The floating element: `position: fixed`, placed with top and left */
8
+ floatingRef: RefObject<HTMLElement | null>;
9
+ /** The `display: contents` wrapper around the trigger */
10
+ anchorRef: RefObject<Element | null>;
11
+ side: FloatingSide;
12
+ align: FloatingAlign;
13
+ /**
14
+ * Called when the trigger may have moved away from the floating element: the page or a container
15
+ * scrolled (anything but the floating element itself), or the window resized
16
+ */
17
+ onDetach: () => void;
18
+ }
19
+ /**
20
+ * Shows a floating element (Tooltip, Menu) in the top layer beside its trigger, before the browser
21
+ * paints, and places it again whenever its size changes. A gap of `space.100` separates it from the
22
+ * trigger, and it keeps `space.200` from the viewport's edges.
23
+ */
24
+ export declare function useFloatingLayer({ isPresent, floatingRef, anchorRef, side, align, onDetach }: FloatingLayerOptions): void;
25
+ export {};
@@ -0,0 +1,86 @@
1
+ 'use client';
2
+ import { useLayoutEffect, useEffect } from 'react';
3
+ import tokensJson from '../styles/tokens.json.mjs';
4
+ import { laidOutElement, placeFloating } from './floatingPosition.mjs';
5
+
6
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
7
+ // The Popover API puts a floating element in the top layer: above everything, Modal included,
8
+ // never clipped by a scroll container, with no z-index (#326). It's in every current browser;
9
+ // without it the element is still position: fixed, so it escapes overflow clipping.
10
+ var supportsPopover = function supportsPopover() {
11
+ return typeof HTMLElement !== 'undefined' && 'showPopover' in HTMLElement.prototype;
12
+ };
13
+ var remToPx = function remToPx(value) {
14
+ return parseFloat(value) * (parseFloat(getComputedStyle(document.documentElement).fontSize) || 16);
15
+ };
16
+ /**
17
+ * Shows a floating element (Tooltip, Menu) in the top layer beside its trigger, before the browser
18
+ * paints, and places it again whenever its size changes. A gap of `space.100` separates it from the
19
+ * trigger, and it keeps `space.200` from the viewport's edges.
20
+ */
21
+ function useFloatingLayer(_a) {
22
+ var isPresent = _a.isPresent,
23
+ floatingRef = _a.floatingRef,
24
+ anchorRef = _a.anchorRef,
25
+ side = _a.side,
26
+ align = _a.align,
27
+ onDetach = _a.onDetach;
28
+ useIsomorphicLayoutEffect(function () {
29
+ var floating = floatingRef.current;
30
+ if (!isPresent || !floating) return;
31
+ if (supportsPopover() && !floating.matches(':popover-open')) {
32
+ floating.setAttribute('popover', 'manual');
33
+ floating.showPopover();
34
+ }
35
+ var place = function place() {
36
+ var trigger = laidOutElement(anchorRef.current);
37
+ if (!trigger) return;
38
+ var anchor = trigger.getBoundingClientRect();
39
+ var _a = floating.getBoundingClientRect(),
40
+ width = _a.width,
41
+ height = _a.height;
42
+ var position = placeFloating({
43
+ anchor: anchor,
44
+ floating: {
45
+ width: width,
46
+ height: height
47
+ },
48
+ side: side,
49
+ align: align,
50
+ offset: remToPx(tokensJson.semantic.space[100]),
51
+ viewport: {
52
+ width: window.innerWidth,
53
+ height: window.innerHeight
54
+ },
55
+ margin: remToPx(tokensJson.semantic.space[200])
56
+ });
57
+ floating.style.top = "".concat(position.top, "px");
58
+ floating.style.left = "".concat(position.left, "px");
59
+ floating.dataset.side = position.side;
60
+ };
61
+ place();
62
+ if (typeof ResizeObserver === 'undefined') return;
63
+ var observer = new ResizeObserver(place);
64
+ observer.observe(floating);
65
+ return function () {
66
+ return observer.disconnect();
67
+ };
68
+ }, [isPresent, side, align, floatingRef, anchorRef]);
69
+ useEffect(function () {
70
+ if (!isPresent) return;
71
+ var onScroll = function onScroll(event) {
72
+ var _a;
73
+ if (event.target instanceof Node && ((_a = floatingRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) return;
74
+ onDetach();
75
+ };
76
+ window.addEventListener('scroll', onScroll, true);
77
+ window.addEventListener('resize', onDetach);
78
+ return function () {
79
+ window.removeEventListener('scroll', onScroll, true);
80
+ window.removeEventListener('resize', onDetach);
81
+ };
82
+ }, [isPresent, floatingRef, onDetach]);
83
+ }
84
+
85
+ export { useFloatingLayer, useIsomorphicLayoutEffect };
86
+ //# sourceMappingURL=useFloatingLayer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFloatingLayer.mjs","sources":["../../src/lib/useFloatingLayer.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, type RefObject } from 'react'\n// Placement needs resolved lengths, not CSS variables (decision 0041)\nimport tokenValues from '../styles/tokens.json'\nimport { laidOutElement, placeFloating, type FloatingAlign, type FloatingSide } from './floatingPosition'\n\nexport const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\n// The Popover API puts a floating element in the top layer: above everything, Modal included,\n// never clipped by a scroll container, with no z-index (#326). It's in every current browser;\n// without it the element is still position: fixed, so it escapes overflow clipping.\nconst supportsPopover = () => typeof HTMLElement !== 'undefined' && 'showPopover' in HTMLElement.prototype\n\nconst remToPx = (value: string) =>\n parseFloat(value) * (parseFloat(getComputedStyle(document.documentElement).fontSize) || 16)\n\ninterface FloatingLayerOptions {\n /** Whether the floating element is rendered */\n isPresent: boolean\n /** The floating element: `position: fixed`, placed with top and left */\n floatingRef: RefObject<HTMLElement | null>\n /** The `display: contents` wrapper around the trigger */\n anchorRef: RefObject<Element | null>\n side: FloatingSide\n align: FloatingAlign\n /**\n * Called when the trigger may have moved away from the floating element: the page or a container\n * scrolled (anything but the floating element itself), or the window resized\n */\n onDetach: () => void\n}\n\n/**\n * Shows a floating element (Tooltip, Menu) in the top layer beside its trigger, before the browser\n * paints, and places it again whenever its size changes. A gap of `space.100` separates it from the\n * trigger, and it keeps `space.200` from the viewport's edges.\n */\nexport function useFloatingLayer({ isPresent, floatingRef, anchorRef, side, align, onDetach }: FloatingLayerOptions) {\n useIsomorphicLayoutEffect(() => {\n const floating = floatingRef.current\n if (!isPresent || !floating) return\n if (supportsPopover() && !floating.matches(':popover-open')) {\n floating.setAttribute('popover', 'manual')\n floating.showPopover()\n }\n const place = () => {\n const trigger = laidOutElement(anchorRef.current)\n if (!trigger) return\n const anchor = trigger.getBoundingClientRect()\n const { width, height } = floating.getBoundingClientRect()\n const position = placeFloating({\n anchor,\n floating: { width, height },\n side,\n align,\n offset: remToPx(tokenValues.semantic.space[100]),\n viewport: { width: window.innerWidth, height: window.innerHeight },\n margin: remToPx(tokenValues.semantic.space[200]),\n })\n floating.style.top = `${position.top}px`\n floating.style.left = `${position.left}px`\n floating.dataset.side = position.side\n }\n place()\n if (typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(place)\n observer.observe(floating)\n return () => observer.disconnect()\n }, [isPresent, side, align, floatingRef, anchorRef])\n\n useEffect(() => {\n if (!isPresent) return\n const onScroll = (event: Event) => {\n if (event.target instanceof Node && floatingRef.current?.contains(event.target)) return\n onDetach()\n }\n window.addEventListener('scroll', onScroll, true)\n window.addEventListener('resize', onDetach)\n return () => {\n window.removeEventListener('scroll', onScroll, true)\n window.removeEventListener('resize', onDetach)\n }\n }, [isPresent, floatingRef, onDetach])\n}\n"],"names":["useIsomorphicLayoutEffect","window","useLayoutEffect","useEffect","supportsPopover","HTMLElement","prototype","remToPx","value","parseFloat","getComputedStyle","document","documentElement","fontSize","useFloatingLayer","_a","isPresent","floatingRef","anchorRef","side","align","onDetach","floating","current","matches","setAttribute","showPopover","place","trigger","laidOutElement","anchor","getBoundingClientRect","width","height","position","placeFloating","offset","tokenValues","semantic","space","viewport","innerWidth","innerHeight","margin","style","top","left","dataset","ResizeObserver","observer","observe","disconnect","onScroll","event","target","Node","contains","addEventListener","removeEventListener"],"mappings":"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"}