@kanso-labs/react-native-kanso-ui 0.6.0 → 0.8.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/README.md +37 -0
  2. package/dist/badge/index.js +25 -23
  3. package/dist/badge/index.js.map +1 -1
  4. package/dist/button/index.d.ts +2 -1
  5. package/dist/button/index.js.map +1 -1
  6. package/dist/button/pending.js +17 -21
  7. package/dist/button/pending.js.map +1 -1
  8. package/dist/calendar/index.js +1182 -0
  9. package/dist/calendar/index.js.map +1 -0
  10. package/dist/calendar/styles.js +120 -0
  11. package/dist/calendar/styles.js.map +1 -0
  12. package/dist/components/autocomplete/index.js +28 -26
  13. package/dist/components/autocomplete/index.js.map +1 -1
  14. package/dist/components/avatar/index.d.ts +2 -2
  15. package/dist/components/avatar/index.js +2 -2
  16. package/dist/components/avatar/index.js.map +1 -1
  17. package/dist/components/calendar/index.d.ts +51 -0
  18. package/dist/components/calendar/index.js +121 -0
  19. package/dist/components/calendar/index.js.map +1 -0
  20. package/dist/components/chip-group/index.d.ts +4 -3
  21. package/dist/components/chip-group/index.js +47 -45
  22. package/dist/components/chip-group/index.js.map +1 -1
  23. package/dist/components/copy-field/index.d.ts +5 -5
  24. package/dist/components/copy-field/index.js +30 -28
  25. package/dist/components/copy-field/index.js.map +1 -1
  26. package/dist/components/currency/index.d.ts +2 -2
  27. package/dist/components/currency/index.js +3 -1
  28. package/dist/components/currency/index.js.map +1 -1
  29. package/dist/components/list/index.d.ts +6 -5
  30. package/dist/components/list/index.js +97 -106
  31. package/dist/components/list/index.js.map +1 -1
  32. package/dist/components/menu/index.d.ts +4 -3
  33. package/dist/components/menu/index.js +33 -40
  34. package/dist/components/menu/index.js.map +1 -1
  35. package/dist/components/meter/index.d.ts +2 -1
  36. package/dist/components/meter/index.js +9 -7
  37. package/dist/components/meter/index.js.map +1 -1
  38. package/dist/components/navigation-bar/index.d.ts +3 -9
  39. package/dist/components/navigation-bar/index.js +10 -34
  40. package/dist/components/navigation-bar/index.js.map +1 -1
  41. package/dist/components/navigation-rail/index.d.ts +68 -0
  42. package/dist/components/navigation-rail/index.js +294 -0
  43. package/dist/components/navigation-rail/index.js.map +1 -0
  44. package/dist/components/number-field/index.d.ts +7 -3
  45. package/dist/components/number-field/index.js +214 -192
  46. package/dist/components/number-field/index.js.map +1 -1
  47. package/dist/components/popover/index.js +1 -1
  48. package/dist/components/product-icon/index.d.ts +2 -2
  49. package/dist/components/product-icon/index.js +2 -2
  50. package/dist/components/product-icon/index.js.map +1 -1
  51. package/dist/components/progress-indicator/index.d.ts +2 -1
  52. package/dist/components/progress-indicator/index.js +15 -13
  53. package/dist/components/progress-indicator/index.js.map +1 -1
  54. package/dist/components/search-field/index.d.ts +3 -3
  55. package/dist/components/search-field/index.js +105 -104
  56. package/dist/components/search-field/index.js.map +1 -1
  57. package/dist/components/sheet/index.d.ts +2 -2
  58. package/dist/components/sheet/index.js +22 -26
  59. package/dist/components/sheet/index.js.map +1 -1
  60. package/dist/components/snackbar/index.d.ts +3 -3
  61. package/dist/components/snackbar/index.js +36 -34
  62. package/dist/components/snackbar/index.js.map +1 -1
  63. package/dist/components/tag/index.d.ts +58 -0
  64. package/dist/components/tag/index.js +205 -0
  65. package/dist/components/tag/index.js.map +1 -0
  66. package/dist/components/text-field/index.d.ts +6 -3
  67. package/dist/components/text-field/index.js +3 -0
  68. package/dist/components/text-field/index.js.map +1 -1
  69. package/dist/field/index.js +39 -36
  70. package/dist/field/index.js.map +1 -1
  71. package/dist/glyphs/index.js +19 -1
  72. package/dist/glyphs/index.js.map +1 -1
  73. package/dist/i18n/index.js +12 -1
  74. package/dist/i18n/index.js.map +1 -1
  75. package/dist/i18n/messages.js +741 -0
  76. package/dist/i18n/messages.js.map +1 -1
  77. package/dist/i18n/provider.d.ts +53 -0
  78. package/dist/i18n/provider.js +96 -0
  79. package/dist/i18n/provider.js.map +1 -0
  80. package/dist/index.d.ts +5 -1
  81. package/dist/index.js +6 -2
  82. package/dist/indicator/index.js +1 -2
  83. package/dist/indicator/index.js.map +1 -1
  84. package/dist/mark/index.js +77 -117
  85. package/dist/mark/index.js.map +1 -1
  86. package/dist/mark/initials.js.map +1 -1
  87. package/dist/navigation/index.d.ts +8 -1
  88. package/dist/navigation/index.js +113 -64
  89. package/dist/navigation/index.js.map +1 -1
  90. package/dist/navigation/styles.js +22 -0
  91. package/dist/navigation/styles.js.map +1 -1
  92. package/dist/number/count.js +15 -0
  93. package/dist/number/count.js.map +1 -0
  94. package/dist/number/locale.js.map +1 -1
  95. package/dist/overlay/host.js +30 -21
  96. package/dist/overlay/host.js.map +1 -1
  97. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ReactNode","ColorValue","StyleProp","ViewStyle","I18nManager","StyleSheet","Svg","Path","HIDDEN","useIconStyle","glyphStyles","GlyphProps","color","size","style","testID","ArrowBackGlyph","props","$","_c","t0","Symbol","for","t1","ArrowDownwardGlyph","ArrowDropDownGlyph","ArrowUpwardGlyph","CalendarGlyph","CheckGlyph","ChevronDownGlyph","ChevronEndGlyph","ClockGlyph","CloseGlyph","Glyph","children","mirrored","undefined","slot","side","t2","t3","compose","isRTL","t4","KeyboardGlyph","MinusGlyph","IndeterminateGlyph","PersonGlyph","PlusGlyph","SearchGlyph","_c"],"sources":["../../src/glyphs/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport type { ColorValue, StyleProp, ViewStyle } from 'react-native'\n\nimport { I18nManager, StyleSheet } from 'react-native'\nimport Svg, { Path } from 'react-native-svg'\n\nimport { HIDDEN } from './hidden'\nimport { useIconStyle } from './icon-style'\nimport { glyphStyles } from './styles'\n\n// The glyphs the library's own controls draw, the same set kanso-ui draws on\n// web: the check and the dash a checkbox shows, the plus and minus a number\n// field's steppers show, the magnifier and cross a search field shows, and the\n// rest named beside each one. Private to the library, as on web: a call site\n// with icons of its own passes them to the slots that take a node, and reads\n// the slot's colour and size through `useIconStyle()`.\n//\n// The paths are kanso-ui's, unchanged: Material Symbols on their 24-unit grid,\n// which is what the checkbox page draws at 18dp, the icon buttons page at 20\n// and the search, menus, date picker and time picker pages at 24.\n\ntype GlyphProps = {\n /** The fill. Defaults to the colour of the slot the glyph sits in. */\n readonly color?: ColorValue\n /** The square's side in dp. Defaults to the size of the slot. */\n readonly size?: number\n readonly style?: StyleProp<ViewStyle>\n readonly testID?: string\n}\n\n// What a search view's back button draws, pointing at the page it returns to.\n// It says \"back\" rather than \"to the left\", so it mirrors under a right-to-left\n// layout.\nfunction ArrowBackGlyph(props: GlyphProps) {\n return (\n <Glyph {...props} mirrored>\n <Path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n </Glyph>\n )\n}\n\n// Which way a sorted column is ordered. Up is ascending and down is\n// descending. Neither mirrors under a right-to-left layout: they say \"up\" and\n// \"down\" rather than \"onward\", and those do not flip.\nfunction ArrowDownwardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n </Glyph>\n )\n}\n\n// What a menu button draws after its label, pointing at the list it opens.\n// Down is down in either writing direction, so it does not mirror.\nfunction ArrowDropDownGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M7 10l5 5 5-5z\" />\n </Glyph>\n )\n}\n\nfunction ArrowUpwardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </Glyph>\n )\n}\n\n// What the date picker's trigger draws: the calendar a date is picked from.\nfunction CalendarGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 4h-1V2h-2v2H8V2H6v2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V10h14v10zm0-12H5V6h14v2z\" />\n </Glyph>\n )\n}\n\nfunction CheckGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </Glyph>\n )\n}\n\n// Points down at the menu a split button's second half opens.\nfunction ChevronDownGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\" />\n </Glyph>\n )\n}\n\n// Points at the submenu a menu item opens. It says \"further in\" rather than\n// \"to the right\", so it mirrors under a right-to-left layout.\nfunction ChevronEndGlyph(props: GlyphProps) {\n return (\n <Glyph {...props} mirrored>\n <Path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </Glyph>\n )\n}\n\n// What the time picker's trigger draws, and the button that takes its keyboard\n// entry back to the dial: the clock a time is picked from.\nfunction ClockGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z\" />\n </Glyph>\n )\n}\n\nfunction CloseGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </Glyph>\n )\n}\n\n/**\n * The svg every glyph draws: the 24-unit grid its path is on, a square of the\n * slot's size filled in the slot's colour, and nothing a screen reader\n * announces, since the control around a glyph carries the name. A glyph whose\n * direction means \"onward\" or \"back\" passes `mirrored`, which turns it over\n * under a right-to-left layout as `:dir(rtl)` does on web.\n */\nfunction Glyph({\n children,\n color,\n mirrored = false,\n size,\n style,\n testID,\n}: GlyphProps & { readonly children: ReactNode; readonly mirrored?: boolean }) {\n const slot = useIconStyle()\n const side = size ?? slot.size\n return (\n <Svg\n {...HIDDEN}\n color={color ?? slot.color}\n fill=\"currentColor\"\n height={side}\n style={StyleSheet.compose(\n mirrored && I18nManager.isRTL ? glyphStyles.mirrored : undefined,\n style,\n )}\n testID={testID}\n viewBox=\"0 0 24 24\"\n width={side}\n >\n {children}\n </Svg>\n )\n}\n\n// What the time picker's dial draws on the button that switches it to typed\n// entry.\nfunction KeyboardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H4V7h16v10zm-9-9h2v2h-2zm0 3h2v2h-2zM8 8h2v2H8zm0 3h2v2H8zm-3 0h2v2H5zm0-3h2v2H5zm3 6h8v2H8zm6-3h2v2h-2zm0-3h2v2h-2zm3 3h2v2h-2zm0-3h2v2h-2z\" />\n </Glyph>\n )\n}\n\n// The same rule stands for a partly selected checkbox and for a stepper's\n// decrement; the two names say which is meant at the call site.\nfunction MinusGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 13H5v-2h14v2z\" />\n </Glyph>\n )\n}\n\nconst IndeterminateGlyph = MinusGlyph\n\n// What an avatar with no name to take initials from draws: Material Design's\n// anonymous person, a head over shoulders.\nfunction PersonGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </Glyph>\n )\n}\n\nfunction PlusGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </Glyph>\n )\n}\n\nfunction SearchGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </Glyph>\n )\n}\n\nexport {\n ArrowBackGlyph,\n ArrowDownwardGlyph,\n ArrowDropDownGlyph,\n ArrowUpwardGlyph,\n CalendarGlyph,\n CheckGlyph,\n ChevronDownGlyph,\n ChevronEndGlyph,\n ClockGlyph,\n CloseGlyph,\n IndeterminateGlyph,\n KeyboardGlyph,\n MinusGlyph,\n PersonGlyph,\n PlusGlyph,\n SearchGlyph,\n}\nexport type { GlyphProps }\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["ReactNode","ColorValue","StyleProp","ViewStyle","I18nManager","StyleSheet","Svg","Path","HIDDEN","useIconStyle","glyphStyles","GlyphProps","color","size","style","testID","ArrowBackGlyph","props","$","_c","t0","Symbol","for","t1","ArrowDownwardGlyph","ArrowDropDownGlyph","ArrowUpwardGlyph","CalendarGlyph","CheckGlyph","ChevronDownGlyph","ChevronEndGlyph","ClockGlyph","CloseGlyph","Glyph","children","mirrored","undefined","slot","side","t2","t3","compose","isRTL","t4","KeyboardGlyph","MinusGlyph","IndeterminateGlyph","PersonGlyph","PlusGlyph","SearchGlyph","_c"],"sources":["../../src/glyphs/index.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport type { ColorValue, StyleProp, ViewStyle } from 'react-native'\n\nimport { I18nManager, StyleSheet } from 'react-native'\nimport Svg, { Path } from 'react-native-svg'\n\nimport { HIDDEN } from './hidden'\nimport { useIconStyle } from './icon-style'\nimport { glyphStyles } from './styles'\n\n// The glyphs the library's own controls draw, the same set kanso-ui draws on\n// web: the check and the dash a checkbox shows, the plus and minus a number\n// field's steppers show, the magnifier and cross a search field shows, and the\n// rest named beside each one. Private to the library, as on web: a call site\n// with icons of its own passes them to the slots that take a node, and reads\n// the slot's colour and size through `useIconStyle()`.\n//\n// The paths are kanso-ui's, unchanged: Material Symbols on their 24-unit grid,\n// which is what the checkbox page draws at 18dp, the icon buttons page at 20\n// and the search, menus, date picker and time picker pages at 24.\n\ntype GlyphProps = {\n /** The fill. Defaults to the colour of the slot the glyph sits in. */\n readonly color?: ColorValue\n /** The square's side in dp. Defaults to the size of the slot. */\n readonly size?: number\n readonly style?: StyleProp<ViewStyle>\n readonly testID?: string\n}\n\n// What a search view's back button draws, pointing at the page it returns to.\n// It says \"back\" rather than \"to the left\", so it mirrors under a right-to-left\n// layout.\nfunction ArrowBackGlyph(props: GlyphProps) {\n return (\n <Glyph {...props} mirrored>\n <Path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n </Glyph>\n )\n}\n\n// Which way a sorted column is ordered. Up is ascending and down is\n// descending. Neither mirrors under a right-to-left layout: they say \"up\" and\n// \"down\" rather than \"onward\", and those do not flip.\nfunction ArrowDownwardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M20 12l-1.41-1.41L13 16.17V4h-2v12.17l-5.58-5.59L4 12l8 8 8-8z\" />\n </Glyph>\n )\n}\n\n// What a menu button draws after its label, pointing at the list it opens.\n// Down is down in either writing direction, so it does not mirror.\nfunction ArrowDropDownGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M7 10l5 5 5-5z\" />\n </Glyph>\n )\n}\n\nfunction ArrowUpwardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M4 12l1.41 1.41L11 7.83V20h2V7.83l5.58 5.59L20 12l-8-8-8 8z\" />\n </Glyph>\n )\n}\n\n// What the date picker's trigger draws: the calendar a date is picked from.\nfunction CalendarGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 4h-1V2h-2v2H8V2H6v2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2zm0 16H5V10h14v10zm0-12H5V6h14v2z\" />\n </Glyph>\n )\n}\n\nfunction CheckGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M9 16.17 4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\n </Glyph>\n )\n}\n\n// Points down at the menu a split button's second half opens.\nfunction ChevronDownGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\" />\n </Glyph>\n )\n}\n\n// Points at the submenu a menu item opens. It says \"further in\" rather than\n// \"to the right\", so it mirrors under a right-to-left layout.\nfunction ChevronEndGlyph(props: GlyphProps) {\n return (\n <Glyph {...props} mirrored>\n <Path d=\"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" />\n </Glyph>\n )\n}\n\n// What the time picker's trigger draws, and the button that takes its keyboard\n// entry back to the dial: the clock a time is picked from.\nfunction ClockGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8zm.5-13H11v6l5.25 3.15.75-1.23-4.5-2.67z\" />\n </Glyph>\n )\n}\n\nfunction CloseGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </Glyph>\n )\n}\n\n/**\n * The svg every glyph draws: the 24-unit grid its path is on, a square of the\n * slot's size filled in the slot's colour, and nothing a screen reader\n * announces, since the control around a glyph carries the name. A glyph whose\n * direction means \"onward\" or \"back\" passes `mirrored`, which turns it over\n * under a right-to-left layout as `:dir(rtl)` does on web.\n */\nfunction Glyph({\n children,\n color,\n mirrored = false,\n size,\n style,\n testID,\n}: GlyphProps & { readonly children: ReactNode; readonly mirrored?: boolean }) {\n const slot = useIconStyle()\n const side = size ?? slot.size\n return (\n <Svg\n {...HIDDEN}\n color={color ?? slot.color}\n fill=\"currentColor\"\n height={side}\n style={StyleSheet.compose(\n mirrored && I18nManager.isRTL ? glyphStyles.mirrored : undefined,\n style,\n )}\n testID={testID}\n viewBox=\"0 0 24 24\"\n width={side}\n >\n {children}\n </Svg>\n )\n}\n\n// What the time picker's dial draws on the button that switches it to typed\n// entry.\nfunction KeyboardGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M20 5H4c-1.1 0-1.99.9-1.99 2L2 17c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 12H4V7h16v10zm-9-9h2v2h-2zm0 3h2v2h-2zM8 8h2v2H8zm0 3h2v2H8zm-3 0h2v2H5zm0-3h2v2H5zm3 6h8v2H8zm6-3h2v2h-2zm0-3h2v2h-2zm3 3h2v2h-2zm0-3h2v2h-2z\" />\n </Glyph>\n )\n}\n\n// The same rule stands for a partly selected checkbox and for a stepper's\n// decrement; the two names say which is meant at the call site.\nfunction MinusGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 13H5v-2h14v2z\" />\n </Glyph>\n )\n}\n\nconst IndeterminateGlyph = MinusGlyph\n\n// What an avatar with no name to take initials from draws: Material Design's\n// anonymous person, a head over shoulders.\nfunction PersonGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </Glyph>\n )\n}\n\nfunction PlusGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" />\n </Glyph>\n )\n}\n\nfunction SearchGlyph(props: GlyphProps) {\n return (\n <Glyph {...props}>\n <Path d=\"M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" />\n </Glyph>\n )\n}\n\nexport {\n ArrowBackGlyph,\n ArrowDownwardGlyph,\n ArrowDropDownGlyph,\n ArrowUpwardGlyph,\n CalendarGlyph,\n CheckGlyph,\n ChevronDownGlyph,\n ChevronEndGlyph,\n ClockGlyph,\n CloseGlyph,\n IndeterminateGlyph,\n KeyboardGlyph,\n MinusGlyph,\n PersonGlyph,\n PlusGlyph,\n SearchGlyph,\n}\nexport type { GlyphProps }\n"],"mappings":"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"}
@@ -1,8 +1,19 @@
1
+ import { formatCount } from "../number/count.js";
1
2
  import { localeOf } from "../number/locale.js";
2
3
  import { MESSAGES } from "./messages.js";
3
4
  //#region src/i18n/index.ts
4
5
  const TABLE = new Map(Object.entries(MESSAGES));
5
6
  const cache = /* @__PURE__ */ new Map();
7
+ /**
8
+ * A field's character limit in words, in `locale` or the device's, for a
9
+ * screen reader: the limit in the locale's digits, in the plural form its
10
+ * rules give it.
11
+ */
12
+ function limitFor(count, locale) {
13
+ const resolved = localeOf(locale);
14
+ const forms = messagesFor(resolved).characterLimit;
15
+ return (forms[pluralOf(resolved, count)] ?? forms.other).replace("{count}", formatCount(count, resolved));
16
+ }
6
17
  function lookUp(locale) {
7
18
  const tag = locale.split("-u-")[0];
8
19
  const language = tag.split("-")[0];
@@ -33,6 +44,6 @@ function resultsFor(count, locale) {
33
44
  return (pluralOf(resolved, count) === "one" ? messages.results.one : messages.results.other).replace("{count}", new Intl.NumberFormat(resolved).format(count));
34
45
  }
35
46
  //#endregion
36
- export { messagesFor, resultsFor };
47
+ export { limitFor, messagesFor, resultsFor };
37
48
 
38
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["LibraryMessages","localeOf","MESSAGES","TABLE","Map","Object","entries","cache","lookUp","locale","tag","split","language","get","find","key","startsWith","messagesFor","resolved","cached","undefined","messages","set","pluralOf","count","Intl","PluralRules","select","resultsFor","noResults","form","results","one","other","replace","NumberFormat","format"],"sources":["../../src/i18n/index.ts"],"sourcesContent":["import type { LibraryMessages } from './messages'\n\nimport { localeOf } from '../number/locale'\nimport { MESSAGES } from './messages'\n\n// The words the library writes itself, in the locale a component is given or\n// the device's. Web reads them through React Aria's dictionary, in the\n// I18nProvider's locale, and this falls back the way that dictionary does: the\n// table's entry for the locale, then the first for its language, then English,\n// so `fr-CA` reads French and a locale the table lacks reads English.\n\nconst TABLE = new Map(Object.entries(MESSAGES))\n\n// One set per locale an app renders in, looked up the first time a component\n// asks for it.\nconst cache = new Map<string, LibraryMessages>()\n\n// A device's locale can carry a Unicode extension, `pt-PT-u-nu-latn`, which\n// says how numbers are written rather than which words; it is set aside, or\n// `pt-PT` would match no entry and read the first Portuguese one, Brazil's.\nfunction lookUp(locale: string): LibraryMessages {\n const tag = locale.split('-u-')[0]\n const language = tag.split('-')[0]\n\n return (\n TABLE.get(tag) ??\n [...TABLE].find(([key]) => key.startsWith(`${language}-`))?.[1] ??\n MESSAGES['en-US']\n )\n}\n\n/** The library's words in `locale`, or in the device's when given none. */\nfunction messagesFor(locale?: string): LibraryMessages {\n const resolved = localeOf(locale)\n const cached = cache.get(resolved)\n\n if (cached !== undefined) {\n return cached\n }\n\n const messages = lookUp(resolved)\n cache.set(resolved, messages)\n return messages\n}\n\n// The plural form a count takes in `locale`. Hermes has not always shipped\n// `Intl.PluralRules`, and where it is missing a count of one takes the\n// singular and any other the plural, which is English's rule.\nfunction pluralOf(locale: string, count: number) {\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- typed as always there, which a runtime without it is not\n if (Intl.PluralRules === undefined) {\n return count === 1 ? 'one' : 'other'\n }\n\n return new Intl.PluralRules(locale).select(count)\n}\n\n/**\n * How many rows a search leaves, in `locale` or the device's, for a screen\n * reader: the count in the locale's plural form, or the empty row's words\n * when it is none.\n */\nfunction resultsFor(count: number, locale?: string): string {\n const resolved = localeOf(locale)\n const messages = messagesFor(resolved)\n\n if (count === 0) {\n return messages.noResults\n }\n\n const form =\n pluralOf(resolved, count) === 'one'\n ? messages.results.one\n : messages.results.other\n\n return form.replace('{count}', new Intl.NumberFormat(resolved).format(count))\n}\n\nexport { messagesFor, resultsFor }\nexport type { LibraryMessages }\n"],"mappings":";;;AAWA,MAAMG,QAAQ,IAAIC,IAAIC,OAAOC,QAAQJ,QAAQ,CAAC;AAI9C,MAAMK,wBAAQ,IAAIH,IAA6B;AAK/C,SAASI,OAAOC,QAAiC;CAC/C,MAAMC,MAAMD,OAAOE,MAAM,KAAK,CAAC,CAAC;CAChC,MAAMC,WAAWF,IAAIC,MAAM,GAAG,CAAC,CAAC;CAEhC,OACER,MAAMU,IAAIH,GAAG,KACb,CAAC,GAAGP,KAAK,CAAC,CAACW,MAAM,CAACC,SAASA,IAAIC,WAAW,GAAGJ,SAAQ,EAAG,CAAC,CAAC,GAAG,MAC7DV,SAAS;AAEb;;AAGA,SAASe,YAAYR,QAAkC;CACrD,MAAMS,WAAWjB,SAASQ,MAAM;CAChC,MAAMU,SAASZ,MAAMM,IAAIK,QAAQ;CAEjC,IAAIC,WAAWC,KAAAA,GACb,OAAOD;CAGT,MAAME,WAAWb,OAAOU,QAAQ;CAChCX,MAAMe,IAAIJ,UAAUG,QAAQ;CAC5B,OAAOA;AACT;AAKA,SAASE,SAASd,QAAgBe,OAAe;CAE/C,IAAIC,KAAKC,gBAAgBN,KAAAA,GACvB,OAAOI,UAAU,IAAI,QAAQ;CAG/B,OAAO,IAAIC,KAAKC,YAAYjB,MAAM,CAAC,CAACkB,OAAOH,KAAK;AAClD;;;;;;AAOA,SAASI,WAAWJ,OAAef,QAAyB;CAC1D,MAAMS,WAAWjB,SAASQ,MAAM;CAChC,MAAMY,WAAWJ,YAAYC,QAAQ;CAErC,IAAIM,UAAU,GACZ,OAAOH,SAASQ;CAQlB,QAJEN,SAASL,UAAUM,KAAK,MAAM,QAC1BH,SAASU,QAAQC,MACjBX,SAASU,QAAQE,MAAAA,CAEXC,QAAQ,WAAW,IAAIT,KAAKU,aAAajB,QAAQ,CAAC,CAACkB,OAAOZ,KAAK,CAAC;AAC9E"}
1
+ {"version":3,"file":"index.js","names":["LibraryMessages","formatCount","localeOf","MESSAGES","TABLE","Map","Object","entries","cache","limitFor","count","locale","resolved","forms","messagesFor","characterLimit","form","pluralOf","other","replace","lookUp","tag","split","language","get","find","key","startsWith","cached","undefined","messages","set","Intl","PluralRules","select","resultsFor","noResults","results","one","NumberFormat","format"],"sources":["../../src/i18n/index.ts"],"sourcesContent":["import type { LibraryMessages } from './messages'\n\nimport { formatCount } from '../number/count'\nimport { localeOf } from '../number/locale'\nimport { MESSAGES } from './messages'\n\n// The words the library writes itself, in the locale a component is given or\n// the device's. A component asks through `useMessages` in ./provider.tsx,\n// which gives it the `I18nProvider`'s locale, as web reads them through React\n// Aria's dictionary in its provider's. This falls back the way that dictionary\n// does: the table's entry for the locale, then the first for its language,\n// then English, so `fr-CA` reads French and a locale the table lacks reads\n// English.\n\nconst TABLE = new Map(Object.entries(MESSAGES))\n\n// One set per locale an app renders in, looked up the first time a component\n// asks for it.\nconst cache = new Map<string, LibraryMessages>()\n\n/**\n * A field's character limit in words, in `locale` or the device's, for a\n * screen reader: the limit in the locale's digits, in the plural form its\n * rules give it.\n */\nfunction limitFor(count: number, locale?: string): string {\n const resolved = localeOf(locale)\n const forms = messagesFor(resolved).characterLimit\n const form = forms[pluralOf(resolved, count)] ?? forms.other\n\n return form.replace('{count}', formatCount(count, resolved))\n}\n\n// A device's locale can carry a Unicode extension, `pt-PT-u-nu-latn`, which\n// says how numbers are written rather than which words; it is set aside, or\n// `pt-PT` would match no entry and read the first Portuguese one, Brazil's.\nfunction lookUp(locale: string): LibraryMessages {\n const tag = locale.split('-u-')[0]\n const language = tag.split('-')[0]\n\n return (\n TABLE.get(tag) ??\n [...TABLE].find(([key]) => key.startsWith(`${language}-`))?.[1] ??\n MESSAGES['en-US']\n )\n}\n\n/** The library's words in `locale`, or in the device's when given none. */\nfunction messagesFor(locale?: string): LibraryMessages {\n const resolved = localeOf(locale)\n const cached = cache.get(resolved)\n\n if (cached !== undefined) {\n return cached\n }\n\n const messages = lookUp(resolved)\n cache.set(resolved, messages)\n return messages\n}\n\n// The plural form a count takes in `locale`. Hermes has not always shipped\n// `Intl.PluralRules`, and where it is missing a count of one takes the\n// singular and any other the plural, which is English's rule.\nfunction pluralOf(locale: string, count: number) {\n // oxlint-disable-next-line typescript/no-unnecessary-condition -- typed as always there, which a runtime without it is not\n if (Intl.PluralRules === undefined) {\n return count === 1 ? 'one' : 'other'\n }\n\n return new Intl.PluralRules(locale).select(count)\n}\n\n/**\n * How many rows a search leaves, in `locale` or the device's, for a screen\n * reader: the count in the locale's plural form, or the empty row's words\n * when it is none.\n */\nfunction resultsFor(count: number, locale?: string): string {\n const resolved = localeOf(locale)\n const messages = messagesFor(resolved)\n\n if (count === 0) {\n return messages.noResults\n }\n\n const form =\n pluralOf(resolved, count) === 'one'\n ? messages.results.one\n : messages.results.other\n\n return form.replace('{count}', new Intl.NumberFormat(resolved).format(count))\n}\n\nexport { limitFor, messagesFor, resultsFor }\nexport type { LibraryMessages }\n"],"mappings":";;;;AAcA,MAAMI,QAAQ,IAAIC,IAAIC,OAAOC,QAAQJ,QAAQ,CAAC;AAI9C,MAAMK,wBAAQ,IAAIH,IAA6B;;;;;;AAO/C,SAASI,SAASC,OAAeC,QAAyB;CACxD,MAAMC,WAAWV,SAASS,MAAM;CAChC,MAAME,QAAQC,YAAYF,QAAQ,CAAC,CAACG;CAGpC,QAFaF,MAAMI,SAASL,UAAUF,KAAK,MAAMG,MAAMK,MAAAA,CAE3CC,QAAQ,WAAWlB,YAAYS,OAAOE,QAAQ,CAAC;AAC7D;AAKA,SAASQ,OAAOT,QAAiC;CAC/C,MAAMU,MAAMV,OAAOW,MAAM,KAAK,CAAC,CAAC;CAChC,MAAMC,WAAWF,IAAIC,MAAM,GAAG,CAAC,CAAC;CAEhC,OACElB,MAAMoB,IAAIH,GAAG,KACb,CAAC,GAAGjB,KAAK,CAAC,CAACqB,MAAM,CAACC,SAASA,IAAIC,WAAW,GAAGJ,SAAQ,EAAG,CAAC,CAAC,GAAG,MAC7DpB,SAAS;AAEb;;AAGA,SAASW,YAAYH,QAAkC;CACrD,MAAMC,WAAWV,SAASS,MAAM;CAChC,MAAMiB,SAASpB,MAAMgB,IAAIZ,QAAQ;CAEjC,IAAIgB,WAAWC,KAAAA,GACb,OAAOD;CAGT,MAAME,WAAWV,OAAOR,QAAQ;CAChCJ,MAAMuB,IAAInB,UAAUkB,QAAQ;CAC5B,OAAOA;AACT;AAKA,SAASb,SAASN,QAAgBD,OAAe;CAE/C,IAAIsB,KAAKC,gBAAgBJ,KAAAA,GACvB,OAAOnB,UAAU,IAAI,QAAQ;CAG/B,OAAO,IAAIsB,KAAKC,YAAYtB,MAAM,CAAC,CAACuB,OAAOxB,KAAK;AAClD;;;;;;AAOA,SAASyB,WAAWzB,OAAeC,QAAyB;CAC1D,MAAMC,WAAWV,SAASS,MAAM;CAChC,MAAMmB,WAAWhB,YAAYF,QAAQ;CAErC,IAAIF,UAAU,GACZ,OAAOoB,SAASM;CAQlB,QAJEnB,SAASL,UAAUF,KAAK,MAAM,QAC1BoB,SAASO,QAAQC,MACjBR,SAASO,QAAQnB,MAAAA,CAEXC,QAAQ,WAAW,IAAIa,KAAKO,aAAa3B,QAAQ,CAAC,CAAC4B,OAAO9B,KAAK,CAAC;AAC9E"}